Easy Forms for MailChimp - Version 6.0.5

Version Description

Download this release

Release Info

Developer eherman24
Plugin Icon 128x128 Easy Forms for MailChimp
Version 6.0.5
Comparing to
See all releases

Code changes from version 6.0.4.7 to 6.0.5

Files changed (54) hide show
  1. admin/class-yikes-inc-easy-mailchimp-extender-admin.php +53 -29
  2. admin/css/yikes-inc-easy-mailchimp-extender-admin.min.css +1 -2
  3. admin/css/yikes-inc-easy-mailchimp-migrate-option-styles.min.css +1 -2
  4. admin/js/min/yikes-inc-easy-mailchimp-extender-edit-form.min.js +1 -1
  5. admin/partials/ajax/add_field_to_form.php +17 -7
  6. admin/partials/ajax/add_interest_group_to_form.php +19 -10
  7. admin/partials/ajax/class.ajax.php +34 -15
  8. admin/partials/ajax/process_ajax.php +17 -7
  9. admin/partials/dashboard-widgets/class.list-activity-widget.php +30 -11
  10. admin/partials/edit-form.php +48 -15
  11. admin/partials/menu/account-details.php +36 -9
  12. admin/partials/menu/lists.php +15 -7
  13. admin/partials/menu/manage-forms.php +14 -4
  14. admin/partials/menu/manage-lists.php +14 -4
  15. admin/partials/menu/options-sections/import-export-forms.php +1 -1
  16. admin/partials/menu/options-sections/integration-settings.php +15 -5
  17. admin/partials/menu/options-sections/templates/integration-interest-groups.php +2 -2
  18. admin/partials/menu/support.php +1 -1
  19. admin/partials/view-list.php +68 -19
  20. admin/partials/view-user.php +51 -20
  21. admin/partials/welcome-page/welcome-sections/whats-new-section.php +1 -1
  22. includes/MailChimp/Mailchimp.php +0 -1
  23. includes/MailChimp/Mailchimp/Campaigns.php +0 -1
  24. includes/MailChimp/Mailchimp/Conversations.php +0 -1
  25. includes/MailChimp/Mailchimp/Ecomm.php +0 -1
  26. includes/MailChimp/Mailchimp/Exceptions.php +0 -1
  27. includes/MailChimp/Mailchimp/Folders.php +0 -1
  28. includes/MailChimp/Mailchimp/Gallery.php +0 -1
  29. includes/MailChimp/Mailchimp/Goal.php +0 -1
  30. includes/MailChimp/Mailchimp/Helper.php +0 -1
  31. includes/MailChimp/Mailchimp/Lists.php +0 -1
  32. includes/MailChimp/Mailchimp/Mobile.php +0 -1
  33. includes/MailChimp/Mailchimp/Neapolitan.php +0 -1
  34. includes/MailChimp/Mailchimp/Reports.php +0 -1
  35. includes/MailChimp/Mailchimp/Templates.php +0 -1
  36. includes/MailChimp/Mailchimp/Users.php +0 -1
  37. includes/MailChimp/Mailchimp/Vip.php +0 -1
  38. includes/class-yikes-inc-easy-mailchimp-extender.php +1 -1
  39. includes/error_log/yikes-easy-mailchimp-error-log.php +0 -46
  40. includes/import-export/yikes-easy-mailchimp-import.class.php +1 -1
  41. public/classes/checkbox-integrations.php +46 -23
  42. public/css/yikes-inc-easy-mailchimp-checkbox-integration.min.css +1 -2
  43. public/css/yikes-inc-easy-mailchimp-datepicker-styles.min.css +1 -2
  44. public/css/yikes-inc-easy-mailchimp-extender-public.css +1 -1
  45. public/css/yikes-inc-easy-mailchimp-extender-public.min.css +1 -2
  46. public/js/yikes-mc-ajax-forms.js +1 -1
  47. public/js/yikes-mc-ajax-forms.min.js +1 -1
  48. public/partials/ajax/class.public_ajax.php +94 -57
  49. public/partials/shortcodes/process/process_form_submission.php +104 -90
  50. public/partials/shortcodes/process/process_form_submission_ajax.php +245 -210
  51. public/partials/shortcodes/process_form_shortcode.php +2 -3
  52. public/partials/shortcodes/yikes-mailchimp-subscriber-count.php +19 -10
  53. readme.txt +1 -9
  54. yikes-inc-easy-mailchimp-extender.php +1 -1
admin/class-yikes-inc-easy-mailchimp-extender-admin.php CHANGED
@@ -51,11 +51,6 @@ class Yikes_Inc_Easy_Mailchimp_Forms_Admin {
51
  add_action( 'admin_init', array( $this , 'yikes_easy_mc_settings_init' ) );
52
  // plugin redirect on activation
53
  add_action( 'admin_init' , array( $this , 'yikes_easy_mc_activation_redirect' ) );
54
- // ensure the MailChimp class wasn't previously declared in another plugin
55
- if( ! class_exists( 'Mailchimp' ) ) {
56
- // Include our MailChimp API Wrapper
57
- include_once( YIKES_MC_PATH . 'includes/MailChimp/Mailchimp.php' );
58
- }
59
  // Include Third Party Extensions
60
  include_once( YIKES_MC_PATH . 'includes/third-party-integrations/third-party-init.php' );
61
  // Include our dashboard widget class
@@ -139,7 +134,7 @@ class Yikes_Inc_Easy_Mailchimp_Forms_Admin {
139
  add_action( 'init' , array( $this , 'yikes_easy_mailchimp_clear_error_log' ) );
140
  }
141
  /*********************************************/
142
- /** Export MailChimp Optin Forms **/
143
  /*******************************************/
144
  if ( isset( $_REQUEST[ 'action' ] ) && $_REQUEST[ 'action' ] == 'yikes-easy-mc-export-forms' ) {
145
  add_action( 'init' , array( $this , 'yikes_easy_mailchimp_export_forms' ) );
@@ -1087,7 +1082,7 @@ class Yikes_Inc_Easy_Mailchimp_Forms_Admin {
1087
  register_setting( 'yikes_inc_easy_mc_recaptcha_settings_page' , 'yikes-mc-recaptcha-site-key' );
1088
  register_setting( 'yikes_inc_easy_mc_recaptcha_settings_page' , 'yikes-mc-recaptcha-secret-key' );
1089
 
1090
- /* Register reCaptcha Settings Section */
1091
  add_settings_section(
1092
  'yikes_easy_mc_settings_recpatcha_section',
1093
  '',
@@ -1097,14 +1092,14 @@ class Yikes_Inc_Easy_Mailchimp_Forms_Admin {
1097
 
1098
  add_settings_field(
1099
  'yikes-mc-recaptcha-site-key',
1100
- __( 'Enter reCaptcha Site Key', 'yikes-inc-easy-mailchimp-extender' ),
1101
  '', // callback + validation inside of admin/partials/menu/options.php
1102
  'yikes_easy_mc_settings_recpatcha_section'
1103
  );
1104
 
1105
  add_settings_field(
1106
  'yikes-mc-recaptcha-secret-key',
1107
- __( 'Enter reCaptcha Secret Key', 'yikes-inc-easy-mailchimp-extender' ),
1108
  '', // callback + validation inside of admin/partials/menu/options.php
1109
  'yikes_easy_mc_settings_recpatcha_section'
1110
  );
@@ -1735,7 +1730,7 @@ class Yikes_Inc_Easy_Mailchimp_Forms_Admin {
1735
  <input type="hidden" name="field[<?php echo $field['merge']; ?>][choices]" value='<?php echo esc_attr( json_encode( $choices ) ); ?>' />
1736
  <?php } ?>
1737
 
1738
- <!-- Single or Double Optin -->
1739
  <p class="type-container"><!-- necessary to prevent skipping on slideToggle(); -->
1740
 
1741
  <table class="form-table form-field-container">
@@ -2026,7 +2021,7 @@ class Yikes_Inc_Easy_Mailchimp_Forms_Admin {
2026
  <input type="hidden" name="field[<?php echo $field['group_id']; ?>][group_id]" value="<?php echo $field['group_id']; ?>" />
2027
  <input type="hidden" name="field[<?php echo $field['group_id']; ?>][groups]" value='<?php echo esc_attr( json_encode( json_decode( $field['groups'], true ) ) ); ?>' />
2028
 
2029
- <!-- Single or Double Optin -->
2030
  <p class="type-container"><!-- necessary to prevent skipping on slideToggle(); -->
2031
 
2032
  <table class="form-table form-field-container">
@@ -2348,7 +2343,7 @@ class Yikes_Inc_Easy_Mailchimp_Forms_Admin {
2348
  'hide_form_post_signup' => 0
2349
  )
2350
  );
2351
- // setup our default optin settings serialized array
2352
  $optin_settings = json_encode(
2353
  array(
2354
  'optin' => 1,
@@ -2588,7 +2583,7 @@ class Yikes_Inc_Easy_Mailchimp_Forms_Admin {
2588
  )
2589
  );
2590
 
2591
- // setup our optin settings serialized array
2592
  $optin_settings = json_encode(
2593
  array(
2594
  'optin' => $_POST['single-double-optin'],
@@ -2685,7 +2680,7 @@ class Yikes_Inc_Easy_Mailchimp_Forms_Admin {
2685
  '%s', // redirect user
2686
  '%s', // redirect page
2687
  '%s', // submission
2688
- '%s', // optin
2689
  '%s', // error
2690
  '%s', // custom notifications
2691
  '%s', // custom fields
@@ -2714,14 +2709,31 @@ class Yikes_Inc_Easy_Mailchimp_Forms_Admin {
2714
  // only re-run the API request if our API key has changed
2715
  // initialize MailChimp Class
2716
  try {
2717
- $MailChimp = new MailChimp( get_option( 'yikes-mc-api-key' , '' ) );
2718
- // retreive our list data
2719
- $unsubscribe_user = $MailChimp->call( 'lists/unsubscribe' , array( 'apikey' => get_option( 'yikes-mc-api-key' , '' ), 'id' => $list_id, 'email' => array( 'leid' => $email_id ), 'send_goodbye' => false, 'send_notify' => false ) );
2720
- wp_redirect( esc_url_raw( admin_url( 'admin.php?page=yikes-mailchimp-view-list&list-id=' . $list_id . '&user-unsubscribed=true' ) ) );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2721
  } catch ( Exception $e ) {
2722
  // an error was encountered.
2723
  // advanced debug should return the exception
2724
  wp_redirect( esc_url_raw( admin_url( 'admin.php?page=yikes-mailchimp-view-list&list-id=' . $list_id . '&user-unsubscribed=false' ) ) );
 
2725
  }
2726
  }
2727
 
@@ -2792,17 +2804,29 @@ class Yikes_Inc_Easy_Mailchimp_Forms_Admin {
2792
  return array();
2793
  }
2794
  try {
2795
- $MailChimp = new MailChimp( $api_key );
2796
- // retreive our list data
2797
- $mailchimp_lists = $MailChimp->call( 'lists/list' , array( 'apikey' => $api_key ) );
2798
- $mail_chimp_list_ids = array();
2799
- if( $mailchimp_lists ) {
2800
- foreach( $mailchimp_lists['data'] as $list ) {
2801
- $mail_chimp_list_ids[] = $list['id'];
2802
- }
2803
- return $mail_chimp_list_ids;
2804
- } else {
2805
- return array();
 
 
 
 
 
 
 
 
 
 
 
 
2806
  }
2807
  } catch ( Exception $e ) {
2808
  // log to our error log
51
  add_action( 'admin_init', array( $this , 'yikes_easy_mc_settings_init' ) );
52
  // plugin redirect on activation
53
  add_action( 'admin_init' , array( $this , 'yikes_easy_mc_activation_redirect' ) );
 
 
 
 
 
54
  // Include Third Party Extensions
55
  include_once( YIKES_MC_PATH . 'includes/third-party-integrations/third-party-init.php' );
56
  // Include our dashboard widget class
134
  add_action( 'init' , array( $this , 'yikes_easy_mailchimp_clear_error_log' ) );
135
  }
136
  /*********************************************/
137
+ /** Export MailChimp Opt-in Forms **/
138
  /*******************************************/
139
  if ( isset( $_REQUEST[ 'action' ] ) && $_REQUEST[ 'action' ] == 'yikes-easy-mc-export-forms' ) {
140
  add_action( 'init' , array( $this , 'yikes_easy_mailchimp_export_forms' ) );
1082
  register_setting( 'yikes_inc_easy_mc_recaptcha_settings_page' , 'yikes-mc-recaptcha-site-key' );
1083
  register_setting( 'yikes_inc_easy_mc_recaptcha_settings_page' , 'yikes-mc-recaptcha-secret-key' );
1084
 
1085
+ /* Register reCAPTCHA Settings Section */
1086
  add_settings_section(
1087
  'yikes_easy_mc_settings_recpatcha_section',
1088
  '',
1092
 
1093
  add_settings_field(
1094
  'yikes-mc-recaptcha-site-key',
1095
+ __( 'Enter reCAPTCHA Site Key', 'yikes-inc-easy-mailchimp-extender' ),
1096
  '', // callback + validation inside of admin/partials/menu/options.php
1097
  'yikes_easy_mc_settings_recpatcha_section'
1098
  );
1099
 
1100
  add_settings_field(
1101
  'yikes-mc-recaptcha-secret-key',
1102
+ __( 'Enter reCAPTCHA Secret Key', 'yikes-inc-easy-mailchimp-extender' ),
1103
  '', // callback + validation inside of admin/partials/menu/options.php
1104
  'yikes_easy_mc_settings_recpatcha_section'
1105
  );
1730
  <input type="hidden" name="field[<?php echo $field['merge']; ?>][choices]" value='<?php echo esc_attr( json_encode( $choices ) ); ?>' />
1731
  <?php } ?>
1732
 
1733
+ <!-- Single or Double Opt-in -->
1734
  <p class="type-container"><!-- necessary to prevent skipping on slideToggle(); -->
1735
 
1736
  <table class="form-table form-field-container">
2021
  <input type="hidden" name="field[<?php echo $field['group_id']; ?>][group_id]" value="<?php echo $field['group_id']; ?>" />
2022
  <input type="hidden" name="field[<?php echo $field['group_id']; ?>][groups]" value='<?php echo esc_attr( json_encode( json_decode( $field['groups'], true ) ) ); ?>' />
2023
 
2024
+ <!-- Single or Double Opt-in -->
2025
  <p class="type-container"><!-- necessary to prevent skipping on slideToggle(); -->
2026
 
2027
  <table class="form-table form-field-container">
2343
  'hide_form_post_signup' => 0
2344
  )
2345
  );
2346
+ // setup our default opt-in settings serialized array
2347
  $optin_settings = json_encode(
2348
  array(
2349
  'optin' => 1,
2583
  )
2584
  );
2585
 
2586
+ // setup our opt-in settings serialized array
2587
  $optin_settings = json_encode(
2588
  array(
2589
  'optin' => $_POST['single-double-optin'],
2680
  '%s', // redirect user
2681
  '%s', // redirect page
2682
  '%s', // submission
2683
+ '%s', // opt-in
2684
  '%s', // error
2685
  '%s', // custom notifications
2686
  '%s', // custom fields
2709
  // only re-run the API request if our API key has changed
2710
  // initialize MailChimp Class
2711
  try {
2712
+ $api_key = trim( get_option( 'yikes-mc-api-key' , '' ) );
2713
+ $dash_position = strpos( $api_key, '-' );
2714
+ if( $dash_position !== false ) {
2715
+ $api_endpoint = 'https://' . substr( $api_key, $dash_position + 1 ) . '.api.mailchimp.com/2.0/lists/unsubscribe.json';
2716
+ }
2717
+ $response = wp_remote_post( $api_endpoint, array(
2718
+ 'body' => array(
2719
+ 'apikey' => $api_key,
2720
+ 'id' => $list_id,
2721
+ 'email' => array( 'leid' => $email_id ),
2722
+ 'send_goodbye' => false,
2723
+ 'send_notify' => false
2724
+ ),
2725
+ 'timeout' => 10,
2726
+ 'sslverify' => apply_filters( 'yikes-mailchimp-sslverify', true )
2727
+ ) );
2728
+ if( ! is_wp_error( $response ) ) {
2729
+ wp_redirect( esc_url_raw( admin_url( 'admin.php?page=yikes-mailchimp-view-list&list-id=' . $list_id . '&user-unsubscribed=true' ) ) );
2730
+ exit;
2731
+ }
2732
  } catch ( Exception $e ) {
2733
  // an error was encountered.
2734
  // advanced debug should return the exception
2735
  wp_redirect( esc_url_raw( admin_url( 'admin.php?page=yikes-mailchimp-view-list&list-id=' . $list_id . '&user-unsubscribed=false' ) ) );
2736
+ exit;
2737
  }
2738
  }
2739
 
2804
  return array();
2805
  }
2806
  try {
2807
+ $dash_position = strpos( $api_key, '-' );
2808
+ if( $dash_position !== false ) {
2809
+ $api_endpoint = 'https://' . substr( $api_key, $dash_position + 1 ) . '.api.mailchimp.com/2.0/lists/list.json';
2810
+ }
2811
+ $mailchimp_lists = wp_remote_post( $api_endpoint, array(
2812
+ 'body' => array(
2813
+ 'apikey' => $api_key,
2814
+ 'limit' => 100
2815
+ ),
2816
+ 'timeout' => 10,
2817
+ 'sslverify' => apply_filters( 'yikes-mailchimp-sslverify', true )
2818
+ ) );
2819
+ if( ! is_wp_error( $mailchimp_lists ) ) {
2820
+ $list_data = json_decode( wp_remote_retrieve_body( $mailchimp_lists ), true );
2821
+ $mail_chimp_list_ids = array();
2822
+ if( $mailchimp_lists ) {
2823
+ foreach( $list_data as $list ) {
2824
+ $mail_chimp_list_ids[] = $list['id'];
2825
+ }
2826
+ return $mail_chimp_list_ids;
2827
+ } else {
2828
+ return array();
2829
+ }
2830
  }
2831
  } catch ( Exception $e ) {
2832
  // log to our error log
admin/css/yikes-inc-easy-mailchimp-extender-admin.min.css CHANGED
@@ -1,2 +1 @@
1
- #yikes-easy-mc-dashboard-widget-stats h3,.addon-image{text-align:center}.yikes-easy-mc-hidden{display:none}.shortcode-input-field{color:#333;background:rgba(216,216,216,.35)!important}.edit-form-field-container-span{display:block;margin:.5em 0}.no-forms-widget{margin:2em 0}.no-forms-found-icon{font-size:14px;line-height:1.4;width:14px;color:#e07d7d}.coming-soon-button{position:absolute}.coming-soon-button .dashicons{font-size:14px;line-height:1.8}.add-ons-about-text{margin-top:0}#add-ons{margin:3em 0}.addon-image{display:block}.no-mailchimp-lists-found{padding:25px 0 25px 25px}.add-new-subscriber-button{display:block;margin-top:2em}.add-new-subscriber-form-container{display:none;padding-top:1em}.add-new-subscriber-form-container h4{margin-top:0}#yikes-easy-mc-widget-stat-holder,.yikes-easy-mc-stats-table{margin-top:1em}#migration-buttons{display:inline-block;margin-bottom:.5em}#migration-buttons form:first-child{margin-right:10px}#migration-buttons form{float:left}#yikes_easy_mc_account_activity_widget h3 span,#yikes_easy_mc_list_stats_widget h3 span{background:url(../../includes/images/MailChimp_Assets/Freddie_original.png) 8px 4px/25px auto no-repeat;background-size:25px;display:block;height:30px;padding-left:3em;padding-top:5px}#yikes_easy_mc_account_activity_widget h3.hndle,#yikes_easy_mc_list_stats_widget .inside{padding:0}#yikes_easy_mc_list_stats_widget h3{padding:0;line-height:1.6em}.yikes-easy-mc-stats-table,.yikes-easy-mc-stats-table .yikes-easy-mc-table-stats-tr,.yikes-easy-mc-stats-table tbody{display:block;width:100%}.yikes-easy-mc-table-stats-tr td{display:inline-block;width:48%;text-align:center}.yikes-easy-mc-table-stats-tr td:hover{cursor:pointer}.yikes-easy-mc-table-stats-tr td:first-of-type{border-right:1px solid #ececec}.yikes-easy-mc-stats-table .yikes-easy-mc-table-stats-tr-first{border-bottom:1px solid #ececec;border-top:1px solid #ececec}.yikes-easy-mc-stats-table p.yikes-easy-mc-dashboard-stat{color:#00a0d2;font-weight:800;font-size:20px;margin-bottom:2px;margin-top:15px;line-height:1.2;max-height:80px}.yikes-easy-mc-stats-table p.yikes-easy-mc-stat-list-label{font-size:13px;margin-top:0;margin-bottom:15px;font-family:"Open Sans"}#yikes_easy_mc_account_activity_widget table th.row-title{padding-left:10px}#pre-defined-tag-interior-container{background:url(../../includes/images/tinyMCE/yikes-mailchimp-combo-faded.png) bottom right no-repeat #fff;background-size:40%}.qtip-default{background-color:transparent!important;border:transparent!important;z-index:9999999!important}.qtip-bootstrap{padding:10px!important;z-index:9999999!important;font-size:12px}.search-interest-group-preloader{display:block;margin:8px 0 0 55px;width:12px}.no-interest-groupings-enabled-message{display:block;margin-top:12px!important;width:100%}.tooltip-integration-banner{max-width:100%;margin:0 0 .25em}.tooltiptext.qtip-bootstrap{font-size:12px}.tooltip-title{margin:0}.dashicons-editor-help:hover{cursor:pointer}body.easy-forms_page_yikes-inc-easy-mailchimp-settings .interest-group-section{display:block;width:100%;margin:1.5em 0}body.easy-forms_page_yikes-inc-easy-mailchimp-settings .interest-group-section .interest-group-section-title{display:block;width:100%;margin:.5em 0;text-decoration:underline}.github-avatar-url,body.admin_page_yikes-mailchimp-welcome #kb-container .knowledge-base-listing li a,body.easy-forms_page_yikes-inc-easy-mailchimp-support .knowledge-base-articles .knowledge-base-listing li a{text-decoration:none}body.easy-forms_page_yikes-inc-easy-mailchimp-settings .interest-group-section input{margin-right:0}body.easy-forms_page_yikes-inc-easy-mailchimp-settings .interest-group-section label{margin-right:10px}i.mce-ico.mce-i-yks_mc_tinymce_button_key{background:url(../../includes/images/tinyMCE/Freddie_wink.png) no-repeat;background-size:18px;background-position-y:1px}#yikes_mailchimp_tinyMCE_modal-title{padding-left:42px;background:url(../../includes/images/MailChimp_Assets/Freddie_original.png) left no-repeat;background-size:25px;background-position-x:10px}#yikes_mailchimp_tinyMCE_modal{background:url(../../includes/images/tinyMCE/yikes-mailchimp-combo-faded.png) bottom left no-repeat #fff;background-size:40%;background-position-x:10px;background-position-y:95%}#yikes_mailchimp_tinyMCE_modal .mce-foot{border-top:none!important;background:0 0}[id*="_yikes_easy_mc_widget"]>div.widget-top>div.widget-title>h4{background:url(../../includes/images/MailChimp_Assets/Freddie_original.png) 2% 50%/25px auto no-repeat #FAFAFA;padding-left:40px}#review-yikes-easy-mailchimp-notice #yikes-mailchimp-logo,#yikes-mailchimp-logo{font-size:14px;background:url(../../includes/images/Welcome_Page/yikes-mailchimp-welcome-logo.png) no-repeat;text-align:center}#review-yikes-easy-mailchimp-notice #yikes-mailchimp-logo{background-size:60px;float:left;height:80px;width:80px}.yikes-easy-mc-feature-image-left{float:left;margin-right:30px;margin-left:0!important}.need-support-icon{line-height:1.5}ul.support-option-list{display:inline-block;width:100%}.support-option{float:left}.support-option-second{margin-left:10px}#yikes-mailchimp-logo.support-page{float:left;width:80pt}.yikes-easy-mc-whats-new-section-image{float:none;width:100%;margin-left:0!important}.welcome-page-tabs{margin-top:2em!important}.welcome-page-about-wrap .about-text,.welcome-page-about-wrap h2.welcome-title{margin-left:115px}.whats-new-wrap img.yikes-easy-mc-whats-new-section-image{margin-top:10px}.whats-new-wrap .feature-section:nth-child(1) img{float:left;width:500px;margin-left:0!important;margin-right:30px}.whats-new-wrap .feature-section:nth-child(3) img{float:right;width:250px;margin-right:0!important;margin-left:30px}.whats-new-wrap .feature-section:nth-child(4) img{margin-left:0!important}#yikes-mailchimp-logo{height:132px;width:132px}.about-wrap #yikes-mailchimp-logo{position:absolute;top:0;left:0}.edd-welcome-screenshots{float:right;margin-left:10px!important}.about-wrap .feature-section{margin-top:20px}.yikes-easy-mc-feature-image{float:right;margin-left:30px!important}#credit-container,#translators-container{display:inline-block;width:100%}#credit-container h2,#translators-container h2{margin:0 0 .5em 1em}#translators-container{margin-top:5em}#translators-container .translation-language{color:#333}#credit-container .team-member,#translators-container .translator{margin:1em 5% 1em 0;text-align:center}#credit-container .team-member img,#translators-container .translator img{border-radius:50%}.about-wrap div.error,.about-wrap div.updated{display:block!important;margin-left:115px!important}.github-avatar-image{width:100px}.github-avatar-url{display:inline-block;width:20%}github-avatar-url:focus{outline:0}body.admin_page_yikes-mailchimp-edit-form div.show-some-love-container img,div.show-some-love-container img.customizer-upsell-banner{max-width:100%}body.admin_page_yikes-mailchimp-edit-form div.show-some-love-container p:first-child{font-style:italic}body.admin_page_yikes-mailchimp-edit-form div.show-some-love-container hr{margin:1em 0}body.admin_page_yikes-mailchimp-welcome .nav-tab-wrapper .nav-tab .dashicons{font-size:17px;line-height:1.5}body.admin_page_yikes-mailchimp-welcome #kb-container,body.easy-forms_page_yikes-inc-easy-mailchimp-support .knowledge-base-articles{display:inline-block;margin-top:1em}body.admin_page_yikes-mailchimp-welcome #kb-container h1{font-size:20px;margin-top:-1em}body.admin_page_yikes-mailchimp-welcome #kb-container .knowledge-base-listing,body.easy-forms_page_yikes-inc-easy-mailchimp-support .knowledge-base-articles .knowledge-base-listing{width:45%;margin-right:2%;float:left;min-height:260px}body.admin_page_yikes-mailchimp-welcome #kb-container .knowledge-base-listing li,body.easy-forms_page_yikes-inc-easy-mailchimp-support .knowledge-base-articles .knowledge-base-listing li{margin:12px 0;text-decoration:none}body.admin_page_yikes-mailchimp-welcome #kb-container .knowledge-base-listing li:before,body.easy-forms_page_yikes-inc-easy-mailchimp-support .knowledge-base-articles .knowledge-base-listing li:before{font-family:dashicons;content:"\f123";vertical-align:middle;display:block;float:left;margin:0 5px 5px 0}body.admin_page_yikes-mailchimp-welcome #kb-container .knowledge-base-listing li.list-title,body.easy-forms_page_yikes-inc-easy-mailchimp-support .knowledge-base-articles .knowledge-base-listing li.list-title{font-size:17px;font-weight:200;text-decoration:underline}body.admin_page_yikes-mailchimp-welcome #kb-container .knowledge-base-listing li.list-title:before,body.easy-forms_page_yikes-inc-easy-mailchimp-support .knowledge-base-articles .knowledge-base-listing li.list-title:before{content:"";padding-left:12px}body.admin_page_yikes-mailchimp-welcome .new-feature-list{list-style:none;line-height:middle}body.admin_page_yikes-mailchimp-welcome .new-feature-list li{margin-bottom:10px}body.admin_page_yikes-mailchimp-welcome .new-feature-list li:before{font-family:dashicons;content:"\f139";padding-right:2px;font-size:20px;vertical-align:middle}#review-yikes-easy-mailchimp-notice .button-container{display:block;width:100%;margin:.75em 0 1.5em}#review-yikes-easy-mailchimp-notice .button-container .dashicons{font-size:14px;line-height:1.9;margin-left:-4px}#review-yikes-easy-mailchimp-notice .button-container .dashicons-star-filled{color:#E6B800}#review-yikes-easy-mailchimp-notice .button-container .dashicons-upload{color:#6E8841}#review-yikes-easy-mailchimp-notice .button-container .dashicons-no-alt{color:#dc3a3a;line-height:2}body.easy-mailchimp_page_yikes-inc-easy-mailchimp-settings .dashicons-no-alt{color:#dc3a3a}#review-yikes-easy-mailchimp-notice .button-container a{margin-right:10px}#review-yikes-easy-mailchimp-notice{border-left:4px solid #00a0d2;background:#fefefe;padding:10px 12px 1px;box-shadow:0 1px 1px 0 rgba(0,0,0,.1);-webkit-box-shadow:0 1px 1px 0 rgba(0,0,0,.1);margin:15px 25px 20px 5px}input.readonly,input[readonly],textarea.readonly,textarea[readonly]{background:#D8D8D8}.dashicons.yikes-love{color:pink}.field-description-input{resize:vertical;max-height:100px}.yikes-easy-mc-postbox h3{background:#00a0d2;font-weight:800;color:#fff}.yikes-easy-mc-postbox h3.bg-transparent{color:#333;font-weight:400;background:0 0}.yikes-mc-warning-message{padding-left:15px;margin-top:0;padding-top:10px;color:#da6e6e}.error-message-container label[for=yikes-easy-mc-success-message],.error-message-container label[for=yikes-easy-mc-general-error-message],.error-message-container label[for=yikes-easy-mc-invalid-email-message],.error-message-container label[for=yikes-easy-mc-user-subscribed-message]{padding:.5em 1em;background:rgba(241,241,241,.75);box-sizing:border-box;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;margin:0}.error-message-container label[for=yikes-easy-mc-user-subscribed-message]{padding-bottom:1em;margin-bottom:.5em}.error-message-container label,.form-settings-container label{display:block;margin:1em 0}.yikes-easy-forms-sidebar .yikes-mc-settings-expansion-section{padding:.5em .75em;-webkit-box-sizing:border-box;-moz-box-sizing:border-box}.yikes-mc-settings-expansion-section{display:none;background:rgba(241,241,241,.75)}.expansion-section-title{background:#fff}.expansion-section-title.settings-sidebar,.form-builder-section-title{text-decoration:none;display:block;border:1px solid rgba(177,177,177,.71);color:#333;padding:5px;margin:.5em 0 0}.expansion-section-title.settings-sidebar .dashicons,.form-builder-section-title .dashicons{content:"\f132";font-family:dashicons;font-size:15px;line-height:1.5}span.easy-mailchimp-add-on-valid-license-container{color:#44ba44;display:block;margin-top:1em}.easy-mailchimp-add-on-invalid-license-container{color:rgba(227,107,107,.86);display:block;margin-top:1em}.options-sidebar .yikes-easy-mc-postbox{overflow:visible}.options-sidebar .inside{padding:0 20px 12px}.yikes-easy-mc-about-text{margin-top:0}.add-on-settings-divider{margin:1em 0!important}#yks-mailchimp-double-optin-message,#yks-mailchimp-single-optin-message,.settings-page-input{width:50%}#yks-mailchimp-double-optin-message,#yks-mailchimp-single-optin-message{min-height:75px;max-height:200px;resize:vertical}#addon-settings-nav li a,#settings-nav li a{color:#333;text-decoration:none!important;transition:color .15s ease-out;-moz-transition:color .15s ease-out;-webkit-transition:color .15s ease-out;-o-transition:color .15s ease-out}#addon-settings-nav li a:hover,#settings-nav li a:hover,.option-menu-selected-arrow+a{color:#00a0d2!important}#addon-settings-nav{margin-bottom:0;margin-top:5px}.option-menu-selected-arrow{width:0;height:0;border-top:10px solid transparent;border-bottom:10px solid transparent;border-left:10px solid #a0a5aa;position:absolute;left:-.1em}label[for=yikes-mailchimp-debug-status]{display:inline-block;margin-bottom:1em;line-height:2.25}#yikes-mailchimp-debug-status{float:left;margin-top:.5em}label[for=yikes-mc-recaptcha-setting],label[for=yikes-mc-recaptcha-api-key]{display:block;margin-bottom:1em}.recaptcha-preview-link,input.recaptcha-setting-checkbox{display:block;margin-top:.5em}.recaptcha-preview-container{width:100%;display:none;margin:1em 0}#premium-support-form,.support-page-button,.support-page-logo{display:block;width:100%}.wrap #col-left,.wrap #col-right{width:49%}@media (max-width:800px){.wrap #col-left,.wrap #col-right{width:100%}}.support-page-logo{opacity:.7;max-width:100%}.support-page-button{min-height:40px;font-weight:700;text-align:center;line-height:3!important;margin-top:1em!important}.support-page-wordpress-font{font-size:1.3em;margin-right:13px}h2.premium-support-title{margin:1em 0 .5em}#premium-support-form input,#premium-support-form select{display:block;width:100%;min-width:200px;margin:.5em 0}#premium-support-form label{font-weight:800}#premium-support-form label input,#premium-support-form label select{font-weight:500}#premium-support-form p{font-weight:300;display:block;margin-bottom:1em}#wp-support-content-wrap{min-height:150px;width:100%}.support-form-hidden{display:none!important}#yikes-mailchimp-error-log .row-title{font-weight:400}.create-error-log-help:hover{cursor:pointer}.error-log-tr td{display:table;margin-bottom:1em;margin-top:.5em}p.error-log-missing-file em,p.to-start-logging-errors-notice em{margin:10px 0}.export-custom-forms-list{display:none;margin:1em 0 2em}.export-custom-forms-list p{margin-top:0}.list-rating-star{color:#E6B800}#chimp-chatter{text-align:center}#chimp-chatter .chimp-chatter-container{margin:1em .2em;background:#F8F8F8;border-radius:10px;float:left;height:220px;padding:10px;width:44%}.chimp-chatter-mailchimp-logo{width:100%;display:block;margin:0 auto}.chimp-chatter-sidebar h2.account-status{text-align:center}.mailchimp-affiliate-link{color:#333;display:none}.mailchimp-avatar{display:block;margin:0 auto;box-shadow:3px 3px 10px 0 rgba(214,214,214,.75)}#yikes_easy_mc_toolbar_links li a:focus,.merge-tag-text{box-shadow:none}.chimpchatter-button-container{clear:both;display:block}.chimp-chatter-postbox{float:left;width:49%;margin-right:1%}.circle-account-active,.circle-account-inactive{display:inline-block;vertical-align:middle;height:15px;width:15px;border-radius:50%}#account-details .chimp-chatter-postbox.even{margin-right:0}.circle-account-inactive{margin-top:-3px;margin-right:5px;background:rgba(250,138,138,.79)}.chatter-type{font-weight:600;font-family:"open sans";font-size:14px;margin:5px 5px 0}.chatter-message{margin:2px 2px 15px!important}.circle-account-active{margin-top:-3px;margin-right:5px;background:rgba(128,214,128,.77)}#account-details .mailchimp-avatar{width:120px;border-radius:10%;margin-top:.5em}.chimp-chatter-positive{border-left:4px solid #9ddf9d}.chimp-chatter-negative{border-left:4px solid #FBA2A2}.chimp-chatter-neutral{border-left:4px solid #b1b1b1}#import-list-to-site{margin-top:10px}#import-list-to-site .input-field{display:block;width:100%;margin-top:5px;margin-bottom:5px}.sidebar-container,.star-container{margin-top:5px;margin-bottom:1.5em}#import-list-to-site .form-description{resize:vertical;max-height:65px}#import-list-to-site .description{margin-top:5px}.star-container a{text-decoration:none}.star-container .dashicons-star-filled{font-size:1.75em}.sidebar-footer-text{margin:15px 0!important;text-align:center}.sidebar-twitter-icon{text-decoration:none;color:#55ACEE}.field-doesnt-exist-notice{position:absolute;margin-left:5px;width:18px}.field-type-text{float:right}.type-container{margin:0}.form-field-container{margin-top:0;margin-bottom:0}.field-no-longer-exists-warning{position:absolute;margin-left:5px;width:18px}.form-field-container td input[type=checkbox],.form-field-container td input[type=radio]{margin:0 5px}.form-field-container td input[type=checkbox]:first-child,.form-field-container td input[type=radio]:first-child{margin-left:0!important}.merge-tag-text{background:0 0;border:none}.pre-defined-tag-link{font-size:11px}.toggle-container{font-size:small;float:right}#pre-defined-tag-container{display:none}#pre-defined-tag-container h3{margin-bottom:0}#pre-defined-tag-container .tooltop-tag .dashicons-editor-help{font-size:13px;line-height:1.5}.no-fields-assigned-notice{margin:4em 0 2.25em;padding-bottom:6em;width:100%;text-align:center;background:url(../../includes/images/no-form-fields-assigned-arrow.jpg) bottom center no-repeat;background-size:105px}.yikes-easy-mc-widget-preloader{position:absolute;left:48%;margin-top:-96px}.yikes-dashboard-widget-section{padding:0 12px 12px}.select-list-title{padding-left:0}.yikes-dashboard-widget-section .description{margin:.5em 0 0}. error-descripion{padding-top:.5em}.yikes-mc-freddie-logo{float:left;margin-right:10px}.mv_ig_list{width:94%;margin-bottom:8px!important;border:none!important;background:0 0!important}.mv_ig_list .list-container{position:absolute}.mv_ig_list a{width:48%;padding:5px 0!important;text-align:center;margin:0}.mv_ig_list a:first-child{margin-right:0}.mv_ig_list a:last-child{float:right}.mv_ig_list .nav-tab{border:1px solid #ccc}.mv_ig_list .nav-tab-active{color:#fff;font-weight:700;background:#00a0d2}.mv_ig_list .arrow-down{position:absolute;margin-top:21px;margin-left:50px;width:0;height:0;border-left:12px solid transparent;border-right:12px solid transparent;border-top:12px solid #00a0d2}#container-container{display:inline-block;width:521px}#container-container .list-container{float:left;width:240px;position:relative}#container-container .list-container:last-child{margin-left:2em}#yikes_easy_mc_toolbar{margin-top:-.75em}#yikes_easy_mc_toolbar_links{display:inline-block;width:100%;margin:0;padding:10px 0}#yikes_easy_mc_toolbar_links li{float:left;margin:0 .5em}#yikes_easy_mc_toolbar_links li a{text-decoration:none;display:inline-block}#yikes_easy_mc_toolbar_links li a.selected_hidden_setting{color:#333;margin-bottom:3px}#yikes_easy_mc_toolbar_links li .selected_setting_triangle{width:0;height:0;border-left:13px solid transparent;border-right:13px solid transparent;border-top:13px solid rgba(206,206,206,1);margin:0 auto}.checkbox-settings-list-dropdown,.optin-checkbox-label-input{width:250px;display:block}#yikes_easy_mc_toolbar_links li a.form-builder:before{content:"\f116";font-family:dashicons}#yikes_easy_mc_toolbar_links li a.form-customizer:before{content:"\f100";font-family:dashicons}#yikes_easy_mc_toolbar_links li a.error-messages:before{content:"\f117";font-family:dashicons}#yikes_easy_mc_toolbar_links li a.form-settings:before{content:"\f111";font-family:dashicons}#checkbox-settings-form .dashicons-editor-help{font-size:15px;line-height:1.6}.no-lists-setup-notice{padding:.5em 0}.yikes-form-id-number{width:55px}span[title=Impressions]:hover,span[title=Submissions]:hover,span[title="Conversion Rate"]:hover{display:block;cursor:pointer}.form-id-container{padding:1px 8px;border-radius:5px;background:#49a9ec;font-weight:700;color:#fff}.manage-form-admin-notice{margin-top:1.75em!important}.remove-notification,.yikes-mc-settings-expansion-section a.remove-field,a.yikes-delete-mailchimp-form,a.yikes-delete-subscriber{color:#d96060!important}.yikes-delete-mailchimp-form{margin-top:6px}#postbox-container-1 .yikes-delete-mailchimp-form{float:right}.form-buttons-container{display:block;padding:11px 10px}.forms-buttons-container input[type=submit]{margin:0 0 .5em}.update-form-spinner{position:absolute;left:0;right:0;margin:0 auto;bottom:13px}.yikes-mc-shortcode-input{text-align:center;width:100%;color:#333}.hidden-class{display:none!important}.stat-container{width:10%;max-width:75px}.no-current-subscriber-notice em,.no-mailchimp-forms-found em{padding:25px 0 25px 25px}.column-columnname span.stats{display:block;width:100%;text-align:center}.column-columnname span.stats span{display:inline-block;width:20%}.column-columnname span.stats span:hover{cursor:pointer}#available-fields li,#available-interest-groups li{text-decoration:none;display:block;border:1px solid rgba(177,177,177,.71);color:#333;padding:5px;margin:.5em 0}#available-fields li.not-available,#available-interest-groups li.not-available{opacity:.6!important}#available-fields li.field-to-add-to-form,#available-interest-groups li.group-to-add-to-form{background:rgba(46,162,204,.25)}.add-field-to-editor .add-to-form-builder-arrow,.button-secondary .add-to-form-builder-arrow{width:15px;font-size:15px;line-height:1.8}.clear-form-fields{background:#e14d43;border-color:#d02c21;color:#fff;box-shadow:inset 0 1px 0 #ec8b85,0 1px 0 rgba(0,0,0,.15);text-decoration:none;display:inline-block;height:28px;padding:0 10px 1px;border-width:1px;-webkit-appearance:none;border-radius:3px;white-space:nowrap;font-size:13px;line-height:26px;box-sizing:border-box;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;float:right;margin:0 11px 10px 0}.clear-form-fields:active,.clear-form-fields:focus,.clear-form-fields:hover{background:#dd382d;border-color:#ba281e;color:#fff;box-shadow:inset 0 1px 0 #e8776f}.yikes-mc-view-list-breadcrumbs{padding:.8em;border:1px solid #D8D8D8;background:#ECECEC;margin:1.5em 0 .8em}.yikes-mc-member-rating-star{color:#daa520}#yikes-mc-subscriber-card-wrapper{background:#fefefe;min-height:200px;display:inline-block;box-shadow:0 1px 1px rgba(0,0,0,.04);webkit-box-shadow:0 1px 1px rgba(0,0,0,.04);border:1px solid #e5e5e5;padding:15px 20px;width:500px;float:left}#yikes-mc-subscriber-card-wrapper .subscriber-optin-ip{display:inline-block;margin:1em 0 0;font-style:italic}.view-user-data-wrap #customer-tab-wrapper-list{float:left;background:#fefefe;margin-top:0;padding:12px;margin-left:-1px;border-right:1px solid #e5e5e5;border-top:1px solid #e5e5e5;border-bottom:1px solid #e5e5e5}.view-user-data-wrap #customer-tab-wrapper-list .dashicons{font-size:23px;height:23px;width:23px;margin:3px 0}.view-user-data-wrap #customer-tab-wrapper-list li.inactive{color:rgba(51,51,51,.31);transition:color ease-out .1s}.view-user-data-wrap #customer-tab-wrapper-list li.active,.view-user-data-wrap #customer-tab-wrapper-list li.inactive:hover{color:rgba(51,51,51,1)}#yikes-mc-subscriber-card-wrapper .yikes-mc-card-top .member-star-rating-container,#yikes-mc-subscriber-card-wrapper .yikes-mc-card-top h2,#yikes-mc-subscriber-card-wrapper .yikes-mc-card-top img{float:left}#yikes-mc-subscriber-card-wrapper #delete-mailchimp-subscriber{display:block;margin:0 auto}#yikes-mc-subscriber-card-wrapper .yikes-mc-card-top img{border-radius:3px}#yikes-mc-subscriber-card-wrapper .merge-variable-section li{display:inline-block;list-style:none;float:left;width:50%;min-height:65px;border-bottom:1px dotted #ddd}#yikes-mc-subscriber-card-wrapper .merge-variable-section li p{margin:0 0 1em}#yikes-mc-subscriber-card-wrapper .yikes-mc-card-top h2{max-width:370px;width:75%;padding:0}#yikes-mc-subscriber-card-wrapper .member-star-rating-container{display:block;margin:.5em 0 .5em 10px}#yikes-mc-subscriber-card-wrapper h2{margin-left:10px;margin-top:0;padding-top:0}#yikes-mc-subscriber-card-wrapper .yikes-mc-card-body,#yikes-mc-subscriber-card-wrapper .yikes-mc-card-top{display:inline-block;width:100%}.member-location-data,.member-subscription-date{width:70%;max-width:370px;display:block;float:left}#yikes-mc-subscriber-card-wrapper .yikes-mc-card-body h4{margin-top:0;margin-left:5px}.yikes-mc-subscriber-hr{margin:1.5em 0}.member-subscription-date{margin:.5em 0 .5em 10px}.member-location-data{margin:.25em 0 .25em 10px}.addon-required-link{color:#333;opacity:.5}.view-list-sidebar-input{color:#333}.interest-group-ul,.merge-variable-ul,.segment-ul{padding-left:15px;font-size:14px}.interest-group-ul li .dashicons,.merge-variable-ul li .dashicons{line-height:1.8;font-size:9px}a.button-primary.edit-fields-button{margin:0 0 10px 15px}.interest-group-count,.merge-variable-count,.segment-group-count{text-decoration:underline;margin-bottom:.75em;padding-left:7px}body.admin_page_yikes-mailchimp-edit-form .ui-datepicker .ui-datepicker-calendar td a,body.admin_page_yikes-mailchimp-edit-form .ui-datepicker a,body.admin_page_yikes-mailchimp-edit-form .ui-datepicker a:hover{text-decoration:none}.interest-group-title{padding-left:5px}.edit-segments-button{margin:0 0 10px 15px}.edit-segment-description{padding:0 0 10px 15px}#credit-container{margin-top:1.5em}.yikes-easy-mailchimp-custom-content-icon{font-size:15px;line-height:1}.custom-field-section{display:block;margin:1em 0}#associated-list{width:100%;margin-top:5px}#redirect-user-to-selection{width:100%}#edit-yikes-mc-form label h3{margin-left:0;padding-left:0}#available-fields .field-required{color:#d96060!important}body.admin_page_yikes-mailchimp-edit-form #poststuff h2{padding:8px 12px;margin-top:0}.edit-form-form-description{width:100%;resize:vertical;min-height:65px;max-height:100px}.edit-form-title{padding-left:12px!important}#edit-form-description{padding:0 12px;margin:1em 0}.yikes-easy-mc-postbox{overflow:hidden}.no-interest-groups-found-message{opacity:.35}.upgrading-ellipse-one,.upgrading-ellipse-two{-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=0)";-moz-opacity:0;-webkit-animation:dot 1.3s infinite}#interest-groups-container .description,#merge-variables-container .description{padding-top:.5em}.inside-section-1{margin-top:0;margin-bottom:1.5em}.inside-section-2{margin-top:0;margin-bottom:2em}.form-field-container-span{display:block;margin:.5em 0}#style-list ul li{display:block;width:100%;margin:1em 0}.form-style-adjustment,.wp-picker-container{display:block!important;width:100%;margin:.5em 0}.dynamic-email-tag{display:inline-block;margin-right:5px}.dynamic-tag-description td{padding-top:0}#create-new-notification-button{margin-top:1em}.file-container{display:none}.yikes-mailchimp-file-field input[name*="custom-field[incentive-attachment]"]{margin-bottom:.5em}.yikes-mailchimp-file-field input[name*="custom-field[incentive-attachment]"]+.button-secondary{margin-left:4px}input#upload-btn[data-attr-position="1"]{margin-left:0}.remove-file-button{background:url(../partials/helpers/fields/img/icon-delete.png);height:16px;position:absolute;text-indent:-99999px;width:16px}a.add-new-incentive-attachment{display:block;width:40px;margin-right:100%!important;margin-top:.5em!important}a.add-new-incentive-attachment .dashicons{font-size:15px;line-height:1.8}.form-builder-placeholder{background:rgba(206,206,206,.2);height:30px}.admin_page_yikes-mailchimp-edit-form #form-settings .section-title{font-size:1em;border-bottom:1px solid rgba(187,187,187,.29);display:block;width:100%;padding-bottom:6px;margin-bottom:.5em;margin-top:1.5em}.admin_page_yikes-mailchimp-edit-form #form-settings .section-interior label,.admin_page_yikes-mailchimp-edit-form #form-settings .section-title.first{margin-top:0}.admin_page_yikes-mailchimp-edit-form #form-settings .section-interior{display:inline-block;width:100%;box-sizing:border-box;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;background:rgba(241,241,241,.75);padding:1em}label.login-restriction-center{display:block;width:100%}.admin_page_yikes-mailchimp-edit-form #form-settings .section-interior .date-restirction-section{display:inline-block}.admin_page_yikes-mailchimp-edit-form #form-settings .section-interior .date-restirction-section p.description.error{color:#F56060}.admin_page_yikes-mailchimp-edit-form #form-settings .section-interior .date-restirction-section label{float:left;margin-right:.5em;margin-top:0;margin-bottom:0}.admin_page_yikes-mailchimp-edit-form #form-settings .section-interior .nested-child .yikes-easy-mc-form-restriction-expired-message,.admin_page_yikes-mailchimp-edit-form #form-settings .section-interior .nested-child .yikes-easy-mc-form-restriction-login-message,.admin_page_yikes-mailchimp-edit-form #form-settings .section-interior .nested-child .yikes-easy-mc-form-restriction-pending-message{display:block;width:100%;min-height:50px}.admin_page_yikes-mailchimp-edit-form #form-settings .section-interior .nested-child{float:left;padding-left:2%;width:98%;border-left:1px dashed #BDBDBD;border-spacing:2px;margin:.5em 0 1em}.admin_page_yikes-mailchimp-edit-form #form-settings .section-interior .nested-child .yikes-easy-mc-submit-button-text{margin:0}.admin_page_yikes-mailchimp-edit-form #form-settings .section-interior .date-restirction-section{margin-bottom:0}.admin_page_yikes-mailchimp-edit-form #form-settings .section-interior .date-restirction-section.last{margin-bottom:.75em}.admin_page_yikes-mailchimp-edit-form #form-settings .section-interior .nested-child.hidden{display:none}.admin_page_yikes-mailchimp-edit-form #form-settings .section-interior .description+label{margin-top:1em;float:left;width:100%}.admin_page_yikes-mailchimp-edit-form #form-settings .section-interior label.inline-form-label{margin-bottom:0;margin-top:0}.admin_page_yikes-mailchimp-edit-form #form-settings .section-interior .description{display:block;width:100%;float:left}.admin_page_yikes-mailchimp-edit-form #form-settings .nested-child strong:first-child,.admin_page_yikes-mailchimp-edit-form #form-settings .section-interior strong:first-child{display:block;width:100%}.admin_page_yikes-mailchimp-edit-form #form-settings .inline-form-label{float:left;margin-right:10px}body.admin_page_yikes-mailchimp-edit-form .ui-timepicker-wrapper{overflow-y:auto;height:150px;width:170px;background:#fff;border:1px solid #ddd;box-shadow:0 5px 10px rgba(0,0,0,.2);outline:0;z-index:10001;margin:0}body.admin_page_yikes-mailchimp-edit-form .ui-timepicker-wrapper.ui-timepicker-with-duration{width:13em}body.admin_page_yikes-mailchimp-edit-form .ui-timepicker-wrapper.ui-timepicker-with-duration.ui-timepicker-step-30,body.admin_page_yikes-mailchimp-edit-form .ui-timepicker-wrapper.ui-timepicker-with-duration.ui-timepicker-step-60{width:11em}body.admin_page_yikes-mailchimp-edit-form .ui-timepicker-list{margin:0;padding:0;list-style:none}body.admin_page_yikes-mailchimp-edit-form .ui-timepicker-duration{margin-left:5px;color:#888}body.admin_page_yikes-mailchimp-edit-form .ui-timepicker-list:hover .ui-timepicker-duration{color:#888}body.admin_page_yikes-mailchimp-edit-form .ui-timepicker-list li{padding:3px 0 3px 5px;cursor:pointer;white-space:nowrap;color:#000;list-style:none;margin:0}body.admin_page_yikes-mailchimp-edit-form .ui-timepicker-list:hover .ui-timepicker-selected{background:#fff;color:#000}body.admin_page_yikes-mailchimp-edit-form .ui-timepicker-list .ui-timepicker-selected:hover,body.admin_page_yikes-mailchimp-edit-form .ui-timepicker-list li:hover,body.admin_page_yikes-mailchimp-edit-form li.ui-timepicker-selected{background:#1980EC;color:#fff}body.admin_page_yikes-mailchimp-edit-form .ui-timepicker-list li:hover .ui-timepicker-duration,body.admin_page_yikes-mailchimp-edit-form li.ui-timepicker-selected .ui-timepicker-duration{color:#ccc}body.admin_page_yikes-mailchimp-edit-form .ui-timepicker-list li.ui-timepicker-disabled,body.admin_page_yikes-mailchimp-edit-form .ui-timepicker-list li.ui-timepicker-disabled:hover,body.admin_page_yikes-mailchimp-edit-form .ui-timepicker-list li.ui-timepicker-selected.ui-timepicker-disabled{color:#888;cursor:default}body.admin_page_yikes-mailchimp-edit-form .ui-timepicker-list li.ui-timepicker-disabled:hover,body.admin_page_yikes-mailchimp-edit-form .ui-timepicker-list li.ui-timepicker-selected.ui-timepicker-disabled{background:#f2f2f2}body.admin_page_yikes-mailchimp-edit-form .ui-datepicker{background-color:#fff;border:1px solid #66AFE9;border-radius:4px;box-shadow:0 0 8px rgba(102,175,233,.6);display:none;margin-top:4px;padding:10px;width:240px}body.admin_page_yikes-mailchimp-edit-form .ui-datepicker a:hover,body.admin_page_yikes-mailchimp-edit-form .ui-datepicker td:hover a{color:#2A6496;transition:color .1s ease-in-out}body.admin_page_yikes-mailchimp-edit-form .ui-datepicker .ui-datepicker-header{margin-bottom:4px;text-align:center}body.admin_page_yikes-mailchimp-edit-form .ui-datepicker .ui-datepicker-title{font-weight:700}body.admin_page_yikes-mailchimp-edit-form .ui-datepicker .ui-datepicker-next,body.admin_page_yikes-mailchimp-edit-form .ui-datepicker .ui-datepicker-prev{cursor:default;font-family:'Glyphicons Halflings';-webkit-font-smoothing:antialiased;font-style:normal;font-weight:400;height:20px;line-height:1;margin-top:2px;width:30px}body.admin_page_yikes-mailchimp-edit-form .ui-datepicker .ui-datepicker-prev{float:left;text-align:left}body.admin_page_yikes-mailchimp-edit-form .ui-datepicker .ui-datepicker-next{float:right;text-align:right}body.admin_page_yikes-mailchimp-edit-form .ui-datepicker .ui-datepicker-prev:before{content:"\f141";font-family:dashicons}body.admin_page_yikes-mailchimp-edit-form .ui-datepicker .ui-datepicker-next:before{content:"\f139";font-family:dashicons}body.admin_page_yikes-mailchimp-edit-form .ui-datepicker-next:hover,body.admin_page_yikes-mailchimp-edit-form .ui-datepicker-prev:hover{cursor:pointer!important}body.admin_page_yikes-mailchimp-edit-form .ui-datepicker-close{display:none}body.admin_page_yikes-mailchimp-edit-form .ui-datepicker-current{color:#555!important;border-color:#ccc!important;background:#f7f7f7!important;box-shadow:0 1px 0 #ccc!important;vertical-align:top!important;display:inline-block;text-decoration:none;font-size:13px;line-height:26px;height:28px;padding:0 10px 1px;cursor:pointer;border-width:1px;border-style:solid;-webkit-appearance:none;border-radius:3px;white-space:nowrap;box-sizing:border-box;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;margin-top:10px}body.admin_page_yikes-mailchimp-edit-form .ui-datepicker .ui-datepicker-current-day a,body.admin_page_yikes-mailchimp-edit-form .ui-datepicker .ui-datepicker-today a{color:#fff}body.admin_page_yikes-mailchimp-edit-form .ui-datepicker .ui-icon{display:none}body.admin_page_yikes-mailchimp-edit-form .ui-datepicker .ui-datepicker-calendar{table-layout:fixed;width:100%}body.admin_page_yikes-mailchimp-edit-form .ui-datepicker .ui-datepicker-calendar td,body.admin_page_yikes-mailchimp-edit-form .ui-datepicker .ui-datepicker-calendar th{text-align:center;padding:4px 0}body.admin_page_yikes-mailchimp-edit-form .ui-datepicker .ui-datepicker-calendar td{border-radius:4px;transition:background-color .1s ease-in-out,color .1s ease-in-out}body.admin_page_yikes-mailchimp-edit-form .ui-datepicker .ui-datepicker-calendar td:hover{background-color:#EBEBEB;cursor:pointer}body.admin_page_yikes-mailchimp-edit-form .ui-datepicker .ui-datepicker-today{background-color:rgba(66,137,204,.65)}body.admin_page_yikes-mailchimp-edit-form .ui-datepicker .ui-datepicker-current-day{background-color:#4289cc}body.admin_page_yikes-mailchimp-edit-form .ui-datepicker .ui-datepicker-calendar .ui-datepicker-unselectable:hover{background-color:#fff;cursor:default}.custom-radio-holder{display:inline-block;width:100%;margin:.5em 0}.custom-radio-label{display:block;float:left;margin:0 5px}.custom-radio-label:first-child{margin-left:0!important}.custom-radio-label input[type=radio]{margin-right:0!important}.custom-select-field{display:block;width:100%;margin:.5em 0}#available-widgets [class*=yikes_easy] .widget-title:before{content:""!important;background:url(../../includes/images/MailChimp_Assets/Freddie_original.png) no-repeat #FAFAFA;background-size:contain}body.wp-customizer #available-widgets [id*="_yikes_easy_mc_widget"]>div.widget-top>div.widget-title>h4{background:0 0!important}#connection-container{float:right;color:#fff;padding:.25em .75em .25em .25em;margin-top:-4px}#connection-container.api-connected{background:#44ba44}#connection-container.api-not-connected{background:#b5b5b5}.yikes-mc-api-connected,.yikes-mc-api-not-connected{line-height:1}.show-some-love-container{transition:max-height .75s}#review-yikes-easy-mc{text-align:center}#review-yikes-easy-mc .dashicons-star-filled{color:#E6B800}.meta-box-sortables hr{margin:1.75em 0 0}#about-yikes-inc{display:none}#about-yikes-inc .about-sidebar-yikes-logo{float:left;width:95px;margin:5px 7px 0 0}#about-yikes-inc p{margin-top:0}.yikes-easy-mc-updated{display:block;border-left:4px solid #4EAEF0;margin:1em 20px 1em 0;padding:2px 10px;background:right bottom no-repeat #fff;background-size:120px;background-position-y:29px}.support-section{margin:1.5em 0;padding:1em 0}.github-octocat{background:url(../../includes/images/Support_Page/Octocat.png) left top no-repeat;background-size:100%;width:50px;height:45px;display:block;float:left;margin-top:-5px}@media screen and (max-width:1200px){.yikes-easy-mc-postbox #post-body.columns-2 #postbox-container-1{float:none}}@media screen and (max-width:850px){.option-menu-selected-arrow{display:none!important}}@media screen and (max-width:782px){#chimp-chatter .chimp-chatter-container{float:none;height:auto;width:100%}}.recaptcha-demo-gif{width:275px}.pro-version-only-notice{color:#d96060}.upgrading-ellipse-one{filter:alpha(opacity=0);-khtml-opacity:0;opacity:0;-webkit-animation:dot 1.3s infinite;animation:dot 1.3s infinite;-webkit-animation-delay:0ms;animation-delay:0ms}.upgrading-ellipse-two{filter:alpha(opacity=0);-khtml-opacity:0;opacity:0;-webkit-animation:dot 1.3s infinite;animation:dot 1.3s infinite;-webkit-animation-delay:.2s;animation-delay:.2s}.upgrading-ellipse-three{-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=0)";filter:alpha(opacity=0);-moz-opacity:0;-khtml-opacity:0;opacity:0;-webkit-animation:dot 1.3s infinite;animation:dot 1.3s infinite;-webkit-animation-delay:.3s;animation-delay:.3s}@-webkit-keyframes dot{0%,50%{opacity:0}100%{opacity:1}}@keyframes dot{0%,50%{opacity:0}100%{opacity:1}}
2
- /*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInlpa2VzLWluYy1lYXN5LW1haWxjaGltcC1leHRlbmRlci1hZG1pbi5taW4uY3NzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLHNEQUFzRCxpQkFBaUIsQ0FBQyxzQkFBc0IsWUFBWSxDQUFDLHVCQUF1QixXQUFXLDBDQUEwQyxDQUFDLGdDQUFnQyxjQUFjLGFBQWEsQ0FBQyxpQkFBaUIsWUFBWSxDQUFDLHFCQUFxQixlQUFlLGdCQUFnQixXQUFXLGFBQWEsQ0FBQyxvQkFBb0IsaUJBQWlCLENBQUMsK0JBQStCLGVBQWUsZUFBZSxDQUFDLG9CQUFvQixZQUFZLENBQUMsU0FBUyxZQUFZLENBQUMsYUFBYSxhQUFhLENBQUMsMEJBQTBCLHdCQUF3QixDQUFDLDJCQUEyQixjQUFjLGNBQWMsQ0FBQyxtQ0FBbUMsYUFBYSxlQUFlLENBQUMsc0NBQXNDLFlBQVksQ0FBQyw2REFBNkQsY0FBYyxDQUFDLG1CQUFtQixxQkFBcUIsa0JBQWtCLENBQUMsb0NBQW9DLGlCQUFpQixDQUFDLHdCQUF3QixVQUFVLENBQUMsd0ZBQXdGLHdHQUF3RyxxQkFBcUIsY0FBYyxZQUFZLGlCQUFpQixlQUFlLENBQUMseUZBQXlGLFNBQVMsQ0FBQyxvQ0FBb0MsVUFBVSxpQkFBaUIsQ0FBQyxxSEFBcUgsY0FBYyxVQUFVLENBQUMsaUNBQWlDLHFCQUFxQixVQUFVLGlCQUFpQixDQUFDLHVDQUF1QyxjQUFjLENBQUMsK0NBQStDLDhCQUE4QixDQUFDLCtEQUErRCxnQ0FBZ0MsNEJBQTRCLENBQUMsMERBQTBELGNBQWMsZ0JBQWdCLGVBQWUsa0JBQWtCLGdCQUFnQixnQkFBZ0IsZUFBZSxDQUFDLDJEQUEyRCxlQUFlLGFBQWEsbUJBQW1CLHVCQUF1QixDQUFDLDBEQUEwRCxpQkFBaUIsQ0FBQyxvQ0FBb0MsMEdBQTBHLG1CQUFtQixDQUFDLGNBQWMsdUNBQXVDLDZCQUE2Qix5QkFBeUIsQ0FBQyxnQkFBZ0IsdUJBQXVCLDBCQUEwQixjQUFjLENBQUMsaUNBQWlDLGNBQWMsb0JBQW9CLFVBQVUsQ0FBQyx1Q0FBdUMsY0FBYywwQkFBMEIsVUFBVSxDQUFDLDRCQUE0QixlQUFlLGdCQUFnQixDQUFDLDRCQUE0QixjQUFjLENBQUMsZUFBZSxRQUFRLENBQUMsNkJBQTZCLGNBQWMsQ0FBQywrRUFBK0UsY0FBYyxXQUFXLGNBQWMsQ0FBQyw2R0FBNkcsY0FBYyxXQUFXLGNBQWMseUJBQXlCLENBQUMsa05BQWtOLG9CQUFvQixDQUFDLHFGQUFxRixjQUFjLENBQUMscUZBQXFGLGlCQUFpQixDQUFDLDBDQUEwQyx5RUFBeUUscUJBQXFCLHlCQUF5QixDQUFDLHFDQUFxQyxrQkFBa0IsMkZBQTJGLHFCQUFxQiwwQkFBMEIsQ0FBQywrQkFBK0IseUdBQXlHLG9CQUFvQiwyQkFBMkIseUJBQXlCLENBQUMseUNBQXlDLDBCQUEwQixjQUFjLENBQUMsaUVBQWlFLCtHQUErRyxpQkFBaUIsQ0FBQyxnRkFBZ0YsZUFBZSw4RkFBOEYsaUJBQWlCLENBQUMsMERBQTBELHFCQUFxQixXQUFXLFlBQVksVUFBVSxDQUFDLGtDQUFrQyxXQUFXLGtCQUFrQix1QkFBdUIsQ0FBQyxtQkFBbUIsZUFBZSxDQUFDLHVCQUF1QixxQkFBcUIsVUFBVSxDQUFDLGdCQUFnQixVQUFVLENBQUMsdUJBQXVCLGdCQUFnQixDQUFDLG1DQUFtQyxXQUFXLFVBQVUsQ0FBQyx1Q0FBdUMsV0FBVyxXQUFXLHVCQUF1QixDQUFDLG1CQUFtQix3QkFBd0IsQ0FBQywrRUFBK0UsaUJBQWlCLENBQUMsMERBQTBELGVBQWUsQ0FBQyxrREFBa0QsV0FBVyxZQUFZLHdCQUF3QixpQkFBaUIsQ0FBQyxrREFBa0QsWUFBWSxZQUFZLHlCQUF5QixnQkFBZ0IsQ0FBQyxrREFBa0QsdUJBQXVCLENBQUMsc0JBQXNCLGFBQWEsV0FBVyxDQUFDLGtDQUFrQyxrQkFBa0IsTUFBTSxNQUFNLENBQUMseUJBQXlCLFlBQVksMEJBQTBCLENBQUMsNkJBQTZCLGVBQWUsQ0FBQyw2QkFBNkIsWUFBWSwwQkFBMEIsQ0FBQyx5Q0FBeUMscUJBQXFCLFVBQVUsQ0FBQywrQ0FBK0MsbUJBQW1CLENBQUMsdUJBQXVCLGNBQWMsQ0FBQyw2Q0FBNkMsVUFBVSxDQUFDLGtFQUFrRSxvQkFBb0IsaUJBQWlCLENBQUMsMEVBQTBFLGlCQUFpQixDQUFDLDhDQUE4Qyx3QkFBd0IsMkJBQTJCLENBQUMscUJBQXFCLFdBQVcsQ0FBQyxtQkFBbUIscUJBQXFCLFNBQVMsQ0FBQyx3QkFBd0IsU0FBUyxDQUFDLHFJQUFxSSxjQUFjLENBQUMscUZBQXFGLGlCQUFpQixDQUFDLDBFQUEwRSxZQUFZLENBQUMsNkVBQTZFLGVBQWUsZUFBZSxDQUFDLHFJQUFxSSxxQkFBcUIsY0FBYyxDQUFDLHlEQUF5RCxlQUFlLGVBQWUsQ0FBQyxxTEFBcUwsVUFBVSxnQkFBZ0IsV0FBVyxnQkFBZ0IsQ0FBQywyTEFBMkwsY0FBYyxvQkFBb0IsQ0FBQyx5TUFBeU0sc0JBQXNCLGdCQUFnQixzQkFBc0IsY0FBYyxXQUFXLGtCQUFrQixDQUFDLGlOQUFpTixlQUFlLGdCQUFnQix5QkFBeUIsQ0FBQywrTkFBK04sV0FBVyxpQkFBaUIsQ0FBQywwREFBMEQsZ0JBQWdCLGtCQUFrQixDQUFDLDZEQUE2RCxrQkFBa0IsQ0FBQyxvRUFBb0Usc0JBQXNCLGdCQUFnQixrQkFBa0IsZUFBZSxxQkFBcUIsQ0FBQyxzREFBc0QsY0FBYyxXQUFXLG9CQUFvQixDQUFDLGlFQUFpRSxlQUFlLGdCQUFnQixnQkFBZ0IsQ0FBQyw2RUFBNkUsYUFBYSxDQUFDLHdFQUF3RSxhQUFhLENBQUMsd0VBQXdFLGNBQWMsYUFBYSxDQUFDLDZFQUE2RSxhQUFhLENBQUMsd0RBQXdELGlCQUFpQixDQUFDLG9DQUFvQyw4QkFBOEIsbUJBQW1CLHNCQUFzQixzQ0FBc0MsOENBQThDLHlCQUF5QixDQUFDLG9FQUFvRSxrQkFBa0IsQ0FBQyxzQkFBc0IsVUFBVSxDQUFDLHlCQUF5QixnQkFBZ0IsZ0JBQWdCLENBQUMsMEJBQTBCLG1CQUFtQixnQkFBZ0IsVUFBVSxDQUFDLHlDQUF5QyxXQUFXLGdCQUFnQixjQUFjLENBQUMsMEJBQTBCLGtCQUFrQixhQUFhLGlCQUFpQixhQUFhLENBQUMsNFJBQTRSLGlCQUFpQixpQ0FBaUMsc0JBQXNCLDhCQUE4QiwyQkFBMkIsUUFBUSxDQUFDLDBFQUEwRSxtQkFBbUIsa0JBQWtCLENBQUMsOERBQThELGNBQWMsWUFBWSxDQUFDLCtEQUErRCxtQkFBbUIsOEJBQThCLDBCQUEwQixDQUFDLHFDQUFxQyxhQUFhLGdDQUFnQyxDQUFDLHlCQUF5QixlQUFlLENBQUMsc0VBQXNFLHFCQUFxQixjQUFjLHVDQUF1QyxXQUFXLFlBQVksZUFBZSxDQUFDLDRGQUE0RixnQkFBZ0Isc0JBQXNCLGVBQWUsZUFBZSxDQUFDLG1EQUFtRCxjQUFjLGNBQWMsY0FBYyxDQUFDLGlEQUFpRCw0QkFBNEIsY0FBYyxjQUFjLENBQUMsd0NBQXdDLGdCQUFnQixDQUFDLHlCQUF5QixtQkFBbUIsQ0FBQywwQkFBMEIsWUFBWSxDQUFDLHlCQUF5QixzQkFBc0IsQ0FBQyw2RkFBNkYsU0FBUyxDQUFDLHdFQUF3RSxnQkFBZ0IsaUJBQWlCLGVBQWUsQ0FBQyw0Q0FBNEMsV0FBVywrQkFBK0IsK0JBQStCLG9DQUFvQyx1Q0FBdUMsaUNBQWlDLENBQUMsc0ZBQXNGLHVCQUF1QixDQUFDLG9CQUFvQixnQkFBZ0IsY0FBYyxDQUFDLDRCQUE0QixRQUFRLFNBQVMsa0NBQWtDLHFDQUFxQywrQkFBK0Isa0JBQWtCLFVBQVUsQ0FBQyx3Q0FBd0MscUJBQXFCLGtCQUFrQixnQkFBZ0IsQ0FBQyw4QkFBOEIsV0FBVyxlQUFlLENBQUMsNEVBQTRFLGNBQWMsaUJBQWlCLENBQUMseURBQXlELGNBQWMsZUFBZSxDQUFDLDZCQUE2QixXQUFXLGFBQWEsWUFBWSxDQUFDLDhEQUE4RCxjQUFjLFVBQVUsQ0FBQyxpQ0FBaUMsU0FBUyxDQUFDLHlCQUF5QixpQ0FBaUMsVUFBVSxDQUFDLENBQUMsbUJBQW1CLFdBQVcsY0FBYyxDQUFDLHFCQUFxQixnQkFBZ0IsZ0JBQWdCLGtCQUFrQix3QkFBd0Isd0JBQXdCLENBQUMsNkJBQTZCLGdCQUFnQixpQkFBaUIsQ0FBQyx5QkFBeUIsaUJBQWlCLENBQUMseURBQXlELGNBQWMsV0FBVyxnQkFBZ0IsYUFBYSxDQUFDLDRCQUE0QixlQUFlLENBQUMscUVBQXFFLGVBQWUsQ0FBQyx3QkFBd0IsZ0JBQWdCLGNBQWMsaUJBQWlCLENBQUMseUJBQXlCLGlCQUFpQixVQUFVLENBQUMscUJBQXFCLHNCQUFzQixDQUFDLHNDQUFzQyxlQUFlLENBQUMsNkJBQTZCLGNBQWMsQ0FBQyxpQkFBaUIsY0FBYyxrQkFBa0IsZUFBZSxDQUFDLGdFQUFnRSxhQUFhLENBQUMsMEJBQTBCLGFBQWEsZ0JBQWdCLENBQUMsNEJBQTRCLFlBQVksQ0FBQyxrQkFBa0IsYUFBYSxDQUFDLGVBQWUsaUJBQWlCLENBQUMsd0NBQXdDLGdCQUFnQixtQkFBbUIsbUJBQW1CLFdBQVcsYUFBYSxhQUFhLFNBQVMsQ0FBQyw4QkFBOEIsV0FBVyxjQUFjLGFBQWEsQ0FBQyx5Q0FBeUMsaUJBQWlCLENBQUMsMEJBQTBCLFdBQVcsWUFBWSxDQUFDLGtCQUFrQixjQUFjLGNBQWMsK0NBQStDLENBQUMsd0RBQXdELGVBQWUsQ0FBQywrQkFBK0IsV0FBVyxhQUFhLENBQUMsdUJBQXVCLFdBQVcsVUFBVSxlQUFlLENBQUMsZ0RBQWdELHFCQUFxQixzQkFBc0IsWUFBWSxXQUFXLGlCQUFpQixDQUFDLDZDQUE2QyxjQUFjLENBQUMseUJBQXlCLGdCQUFnQixpQkFBaUIsZ0NBQWdDLENBQUMsY0FBYyxnQkFBZ0Isd0JBQXdCLGVBQWUsZ0JBQWdCLENBQUMsaUJBQWlCLDZCQUE2QixDQUFDLHVCQUF1QixnQkFBZ0IsaUJBQWlCLGdDQUFnQyxDQUFDLG1DQUFtQyxZQUFZLGtCQUFrQixlQUFlLENBQUMsd0JBQXdCLDZCQUE2QixDQUFDLHdCQUF3Qiw2QkFBNkIsQ0FBQyx1QkFBdUIsNkJBQTZCLENBQUMscUJBQXFCLGVBQWUsQ0FBQyxrQ0FBa0MsY0FBYyxXQUFXLGVBQWUsaUJBQWlCLENBQUMsbUNBQW1DLGVBQWUsbUJBQW1CLENBQUMsdUNBQXVDLGdCQUFnQixlQUFlLENBQUMsa0NBQWtDLGNBQWMsQ0FBQyxrQkFBa0Isb0JBQW9CLENBQUMsdUNBQXVDLGdCQUFnQixDQUFDLHFCQUFxQix3QkFBd0IsaUJBQWlCLENBQUMsc0JBQXNCLHFCQUFxQixhQUFhLENBQUMsMkJBQTJCLGtCQUFrQixnQkFBZ0IsVUFBVSxDQUFDLGlCQUFpQixXQUFXLENBQUMsZ0JBQWdCLFFBQVEsQ0FBQyxzQkFBc0IsYUFBYSxlQUFlLENBQUMsZ0NBQWdDLGtCQUFrQixnQkFBZ0IsVUFBVSxDQUFDLHlGQUF5RixZQUFZLENBQUMsaUhBQWlILHVCQUF1QixDQUFDLGdCQUFnQixlQUFlLFdBQVcsQ0FBQyxzQkFBc0IsY0FBYyxDQUFDLGtCQUFrQixnQkFBZ0IsV0FBVyxDQUFDLDJCQUEyQixZQUFZLENBQUMsOEJBQThCLGVBQWUsQ0FBQywrREFBK0QsZUFBZSxlQUFlLENBQUMsMkJBQTJCLG9CQUFvQixtQkFBbUIsV0FBVyxrQkFBa0IsZ0dBQWdHLHFCQUFxQixDQUFDLGdDQUFnQyxrQkFBa0IsU0FBUyxnQkFBZ0IsQ0FBQyxnQ0FBZ0MsbUJBQW1CLENBQUMsbUJBQW1CLGNBQWMsQ0FBQyw2Q0FBNkMsZUFBZSxDQUFDLG1CQUFtQixnQkFBZ0IsQ0FBQyx1QkFBdUIsV0FBVyxpQkFBaUIsQ0FBQyxZQUFZLFVBQVUsNEJBQTRCLHNCQUFzQix3QkFBd0IsQ0FBQyw0QkFBNEIsaUJBQWlCLENBQUMsY0FBYyxVQUFVLHdCQUF3QixrQkFBa0IsUUFBUSxDQUFDLDBCQUEwQixjQUFjLENBQUMseUJBQXlCLFdBQVcsQ0FBQyxxQkFBcUIscUJBQXFCLENBQUMsNEJBQTRCLFdBQVcsZ0JBQWdCLGtCQUFrQixDQUFDLHdCQUF3QixrQkFBa0IsZ0JBQWdCLGlCQUFpQixRQUFRLFNBQVMsbUNBQW1DLG9DQUFvQyw2QkFBNkIsQ0FBQyxxQkFBcUIscUJBQXFCLFdBQVcsQ0FBQyxxQ0FBcUMsV0FBVyxZQUFZLGlCQUFpQixDQUFDLGdEQUFnRCxlQUFlLENBQUMsdUJBQXVCLGlCQUFpQixDQUFDLDZCQUE2QixxQkFBcUIsV0FBVyxTQUFTLGNBQWMsQ0FBQyxnQ0FBZ0MsV0FBVyxhQUFhLENBQUMsa0NBQWtDLHFCQUFxQixvQkFBb0IsQ0FBQywwREFBMEQsV0FBVyxpQkFBaUIsQ0FBQywyREFBMkQsUUFBUSxTQUFTLG1DQUFtQyxvQ0FBb0MsMENBQTBDLGFBQWEsQ0FBQyw2REFBNkQsWUFBWSxhQUFhLENBQUMsc0RBQXNELGdCQUFnQixxQkFBcUIsQ0FBQyx5REFBeUQsZ0JBQWdCLHFCQUFxQixDQUFDLHdEQUF3RCxnQkFBZ0IscUJBQXFCLENBQUMsdURBQXVELGdCQUFnQixxQkFBcUIsQ0FBQywrQ0FBK0MsZUFBZSxlQUFlLENBQUMsdUJBQXVCLGNBQWMsQ0FBQyxzQkFBc0IsVUFBVSxDQUFDLGdHQUFnRyxjQUFjLGNBQWMsQ0FBQyxtQkFBbUIsZ0JBQWdCLGtCQUFrQixtQkFBbUIsZ0JBQWdCLFVBQVUsQ0FBQywwQkFBMEIsMkJBQTJCLENBQUMsaUlBQWlJLHVCQUF1QixDQUFDLDZCQUE2QixjQUFjLENBQUMsa0RBQWtELFdBQVcsQ0FBQyx3QkFBd0IsY0FBYyxpQkFBaUIsQ0FBQyw0Q0FBNEMsZUFBZSxDQUFDLHFCQUFxQixrQkFBa0IsT0FBTyxRQUFRLGNBQWMsV0FBVyxDQUFDLDBCQUEwQixrQkFBa0IsV0FBVyxVQUFVLENBQUMsY0FBYyxzQkFBc0IsQ0FBQyxnQkFBZ0IsVUFBVSxjQUFjLENBQUMsOERBQThELHdCQUF3QixDQUFDLDhCQUE4QixjQUFjLFdBQVcsaUJBQWlCLENBQUMsbUNBQW1DLHFCQUFxQixTQUFTLENBQUMseUNBQXlDLGNBQWMsQ0FBQyxtREFBbUQscUJBQXFCLGNBQWMsdUNBQXVDLFdBQVcsWUFBWSxhQUFhLENBQUMsK0VBQStFLG9CQUFvQixDQUFDLDZGQUE2RiwrQkFBK0IsQ0FBQyw2RkFBNkYsV0FBVyxlQUFlLGVBQWUsQ0FBQyxtQkFBbUIsbUJBQW1CLHFCQUFxQixXQUFXLHlEQUF5RCxxQkFBcUIscUJBQXFCLFlBQVksbUJBQW1CLGlCQUFpQix3QkFBd0Isa0JBQWtCLG1CQUFtQixlQUFlLGlCQUFpQixzQkFBc0IsOEJBQThCLDJCQUEyQixZQUFZLG9CQUFvQixDQUFDLDRFQUE0RSxtQkFBbUIscUJBQXFCLFdBQVcsZ0NBQWdDLENBQUMsZ0NBQWdDLGFBQWEseUJBQXlCLG1CQUFtQixtQkFBbUIsQ0FBQyw2QkFBNkIsYUFBYSxDQUFDLGtDQUFrQyxtQkFBbUIsaUJBQWlCLHFCQUFxQixxQ0FBcUMsNENBQTRDLHlCQUF5QixrQkFBa0IsWUFBWSxVQUFVLENBQUMsdURBQXVELHFCQUFxQixlQUFlLGlCQUFpQixDQUFDLGdEQUFnRCxXQUFXLG1CQUFtQixhQUFhLGFBQWEsaUJBQWlCLCtCQUErQiw2QkFBNkIsK0JBQStCLENBQUMsMkRBQTJELGVBQWUsWUFBWSxXQUFXLFlBQVksQ0FBQyw0REFBNEQseUJBQXlCLDZCQUE2QixDQUFDLDRIQUE0SCxzQkFBc0IsQ0FBQyxvTUFBb00sVUFBVSxDQUFDLCtEQUErRCxjQUFjLGFBQWEsQ0FBQyx5REFBeUQsaUJBQWlCLENBQUMsNkRBQTZELHFCQUFxQixnQkFBZ0IsV0FBVyxVQUFVLGdCQUFnQiw2QkFBNkIsQ0FBQywrREFBK0QsY0FBYyxDQUFDLHdEQUF3RCxnQkFBZ0IsVUFBVSxTQUFTLENBQUMsZ0VBQWdFLGNBQWMsdUJBQXVCLENBQUMscUNBQXFDLGlCQUFpQixhQUFhLGFBQWEsQ0FBQywyR0FBMkcscUJBQXFCLFVBQVUsQ0FBQyxnREFBZ0QsVUFBVSxnQkFBZ0IsY0FBYyxVQUFVLENBQUMseURBQXlELGFBQWEsZUFBZSxDQUFDLHdCQUF3QixjQUFjLENBQUMsMEJBQTBCLHVCQUF1QixDQUFDLHNCQUFzQix5QkFBeUIsQ0FBQyxxQkFBcUIsV0FBVyxVQUFVLENBQUMseUJBQXlCLFVBQVUsQ0FBQyxrREFBa0Qsa0JBQWtCLGNBQWMsQ0FBQyxrRUFBa0UsZ0JBQWdCLGFBQWEsQ0FBQyxvQ0FBb0Msb0JBQW9CLENBQUMsaUVBQWlFLDBCQUEwQixvQkFBb0IsZ0JBQWdCLENBQUMsa05BQWtOLG9CQUFvQixDQUFDLHNCQUFzQixnQkFBZ0IsQ0FBQyxzQkFBc0Isb0JBQW9CLENBQUMsMEJBQTBCLHFCQUFxQixDQUFDLGtCQUFrQixnQkFBZ0IsQ0FBQywwQ0FBMEMsZUFBZSxhQUFhLENBQUMsc0JBQXNCLGNBQWMsWUFBWSxDQUFDLGlCQUFpQixXQUFXLGNBQWMsQ0FBQyw0QkFBNEIsVUFBVSxDQUFDLDZCQUE2QixjQUFjLGNBQWMsQ0FBQyxrQ0FBa0MsdUJBQXVCLENBQUMsd0RBQXdELGlCQUFpQixZQUFZLENBQUMsNEJBQTRCLFdBQVcsZ0JBQWdCLGdCQUFnQixnQkFBZ0IsQ0FBQyxpQkFBaUIsMkJBQTJCLENBQUMsdUJBQXVCLGVBQWUsWUFBWSxDQUFDLHVCQUF1QixlQUFlLENBQUMsa0NBQWtDLFdBQVcsQ0FBQyw4Q0FBOEMsZ0VBQWdFLGVBQWUsbUNBQW1DLENBQUMsZ0ZBQWdGLGdCQUFnQixDQUFDLGtCQUFrQixhQUFhLG1CQUFtQixDQUFDLGtCQUFrQixhQUFhLGlCQUFpQixDQUFDLDJCQUEyQixjQUFjLGFBQWEsQ0FBQyxrQkFBa0IsY0FBYyxXQUFXLFlBQVksQ0FBQyw0Q0FBNEMsd0JBQXdCLFdBQVcsYUFBYSxDQUFDLG1CQUFtQixxQkFBcUIsZ0JBQWdCLENBQUMsNEJBQTRCLGFBQWEsQ0FBQyxnQ0FBZ0MsY0FBYyxDQUFDLGdCQUFnQixZQUFZLENBQUMsOEVBQThFLGtCQUFrQixDQUFDLGdHQUFnRyxlQUFlLENBQUMseUNBQXlDLGFBQWEsQ0FBQyxvQkFBb0IsK0RBQStELFlBQVksa0JBQWtCLHFCQUFxQixVQUFVLENBQUMsK0JBQStCLGNBQWMsV0FBVyw0QkFBNEIseUJBQXlCLENBQUMsMENBQTBDLGVBQWUsZUFBZSxDQUFDLDBCQUEwQixnQ0FBZ0MsV0FBVyxDQUFDLG9FQUFvRSxjQUFjLDhDQUE4QyxjQUFjLFdBQVcsbUJBQW1CLG1CQUFtQixnQkFBZ0IsQ0FBQyx1SkFBdUosWUFBWSxDQUFDLHVFQUF1RSxxQkFBcUIsV0FBVyxzQkFBc0IsOEJBQThCLDJCQUEyQixpQ0FBaUMsV0FBVyxDQUFDLCtCQUErQixjQUFjLFVBQVUsQ0FBQyxpR0FBaUcsb0JBQW9CLENBQUMscUhBQXFILGFBQWEsQ0FBQyx1R0FBdUcsV0FBVyxrQkFBa0IsYUFBYSxlQUFlLENBQUMsNllBQTZZLGNBQWMsV0FBVyxlQUFlLENBQUMscUZBQXFGLFdBQVcsZ0JBQWdCLFVBQVUsK0JBQStCLG1CQUFtQixpQkFBaUIsQ0FBQyx1SEFBdUgsUUFBUSxDQUFDLGlHQUFpRyxlQUFlLENBQUMsc0dBQXNHLG1CQUFtQixDQUFDLDRGQUE0RixZQUFZLENBQUMsMEZBQTBGLGVBQWUsV0FBVyxVQUFVLENBQUMsK0ZBQStGLGdCQUFnQixZQUFZLENBQUMsb0ZBQW9GLGNBQWMsV0FBVyxVQUFVLENBQUMsZ0xBQWdMLGNBQWMsVUFBVSxDQUFDLHdFQUF3RSxXQUFXLGlCQUFpQixDQUFDLGlFQUFpRSxnQkFBZ0IsYUFBYSxZQUFZLGdCQUFnQixzQkFBc0IscUNBQXFDLFVBQVUsY0FBYyxRQUFRLENBQUMsNkZBQTZGLFVBQVUsQ0FBQyxzT0FBc08sVUFBVSxDQUFDLDhEQUE4RCxTQUFTLFVBQVUsZUFBZSxDQUFDLGtFQUFrRSxnQkFBZ0IsVUFBVSxDQUFDLDRGQUE0RixVQUFVLENBQUMsaUVBQWlFLHNCQUFzQixlQUFlLG1CQUFtQixXQUFXLGdCQUFnQixRQUFRLENBQUMsNEZBQTRGLGdCQUFnQixVQUFVLENBQUMsdU9BQXVPLG1CQUFtQixVQUFVLENBQUMsMkxBQTJMLFVBQVUsQ0FBQyxxU0FBcVMsV0FBVyxjQUFjLENBQUMsNk1BQTZNLGtCQUFrQixDQUFDLHlEQUF5RCxzQkFBc0IseUJBQXlCLGtCQUFrQix3Q0FBd0MsYUFBYSxlQUFlLGFBQWEsV0FBVyxDQUFDLHFJQUFxSSxjQUFjLGdDQUFnQyxDQUFDLCtFQUErRSxrQkFBa0IsaUJBQWlCLENBQUMsOEVBQThFLGVBQWUsQ0FBQywwSkFBMEosZUFBZSxtQ0FBbUMsbUNBQW1DLGtCQUFrQixnQkFBZ0IsWUFBWSxjQUFjLGVBQWUsVUFBVSxDQUFDLDZFQUE2RSxXQUFXLGVBQWUsQ0FBQyw2RUFBNkUsWUFBWSxnQkFBZ0IsQ0FBQyxvRkFBb0YsZ0JBQWdCLHFCQUFxQixDQUFDLG9GQUFvRixnQkFBZ0IscUJBQXFCLENBQUMsd0lBQXdJLHdCQUF3QixDQUFDLCtEQUErRCxZQUFZLENBQUMsaUVBQWlFLHFCQUFxQiw0QkFBNEIsNkJBQTZCLGtDQUFrQyw2QkFBNkIscUJBQXFCLHFCQUFxQixlQUFlLGlCQUFpQixZQUFZLG1CQUFtQixlQUFlLGlCQUFpQixtQkFBbUIsd0JBQXdCLGtCQUFrQixtQkFBbUIsc0JBQXNCLDhCQUE4QiwyQkFBMkIsZUFBZSxDQUFDLHNLQUFzSyxVQUFVLENBQUMsa0VBQWtFLFlBQVksQ0FBQyxpRkFBaUYsbUJBQW1CLFVBQVUsQ0FBQyx3S0FBd0ssa0JBQWtCLGFBQWEsQ0FBQyxvRkFBb0Ysa0JBQWtCLGlFQUFpRSxDQUFDLDBGQUEwRix5QkFBeUIsY0FBYyxDQUFDLDhFQUE4RSxxQ0FBcUMsQ0FBQyxvRkFBb0Ysd0JBQXdCLENBQUMsbUhBQW1ILHNCQUFzQixjQUFjLENBQUMscUJBQXFCLHFCQUFxQixXQUFXLGFBQWEsQ0FBQyxvQkFBb0IsY0FBYyxXQUFXLFlBQVksQ0FBQyxnQ0FBZ0MsdUJBQXVCLENBQUMsc0NBQXNDLHdCQUF3QixDQUFDLHFCQUFxQixjQUFjLFdBQVcsYUFBYSxDQUFDLDREQUE0RCxxQkFBcUIsOEZBQThGLHVCQUF1QixDQUFDLHVHQUF1Ryx3QkFBd0IsQ0FBQyxzQkFBc0IsWUFBWSxXQUFXLGdDQUFnQyxlQUFlLENBQUMsb0NBQW9DLGtCQUFrQixDQUFDLHdDQUF3QyxrQkFBa0IsQ0FBQyxvREFBb0QsYUFBYSxDQUFDLDBCQUEwQiwwQkFBMEIsQ0FBQyxzQkFBc0IsaUJBQWlCLENBQUMsNkNBQTZDLGFBQWEsQ0FBQyx1QkFBdUIsaUJBQWlCLENBQUMsaUJBQWlCLFlBQVksQ0FBQywyQ0FBMkMsV0FBVyxXQUFXLGtCQUFrQixDQUFDLG1CQUFtQixZQUFZLENBQUMsdUJBQXVCLGNBQWMsOEJBQThCLHNCQUFzQixpQkFBaUIsdUNBQXVDLHNCQUFzQiwwQkFBMEIsQ0FBQyxpQkFBaUIsZUFBZSxhQUFhLENBQUMsZ0JBQWdCLGtGQUFrRixxQkFBcUIsV0FBVyxZQUFZLGNBQWMsV0FBVyxlQUFlLENBQUMscUNBQXFDLGlFQUFpRSxVQUFVLENBQUMsQ0FBQyxvQ0FBb0MsNEJBQTRCLHNCQUFzQixDQUFDLENBQUMsb0NBQW9DLHdDQUF3QyxXQUFXLFlBQVksVUFBVSxDQUFDLENBQUMsb0JBQW9CLFdBQVcsQ0FBQyx5QkFBeUIsYUFBYSxDQUFDLHVCQUF1Qix3QkFBd0IsaUJBQWlCLFVBQVUsb0NBQTRCLEFBQTVCLDRCQUE0Qiw0QkFBNEIsbUJBQW1CLENBQUMsdUJBQXVCLHdCQUF3QixpQkFBaUIsVUFBVSxvQ0FBNEIsQUFBNUIsNEJBQTRCLDRCQUE0QixtQkFBbUIsQ0FBQyx5QkFBeUIsZ0VBQWdFLHdCQUF3QixlQUFlLGlCQUFpQixVQUFVLG9DQUFvQyw0QkFBNEIsNEJBQTRCLG1CQUFtQixDQUFDLHVCQUF1QixPQUFPLFNBQVMsQ0FBQyxLQUFLLFNBQVMsQ0FBQyxDQUFDLGVBQWUsT0FBTyxTQUFTLENBQUMsS0FBSyxTQUFTLENBQUMsQ0FBQyIsImZpbGUiOiJ5aWtlcy1pbmMtZWFzeS1tYWlsY2hpbXAtZXh0ZW5kZXItYWRtaW4ubWluLmNzcyIsInNvdXJjZXNDb250ZW50IjpbIiN5aWtlcy1lYXN5LW1jLWRhc2hib2FyZC13aWRnZXQtc3RhdHMgaDMsLmFkZG9uLWltYWdle3RleHQtYWxpZ246Y2VudGVyfS55aWtlcy1lYXN5LW1jLWhpZGRlbntkaXNwbGF5Om5vbmV9LnNob3J0Y29kZS1pbnB1dC1maWVsZHtjb2xvcjojMzMzO2JhY2tncm91bmQ6cmdiYSgyMTYsMjE2LDIxNiwuMzUpIWltcG9ydGFudH0uZWRpdC1mb3JtLWZpZWxkLWNvbnRhaW5lci1zcGFue2Rpc3BsYXk6YmxvY2s7bWFyZ2luOi41ZW0gMH0ubm8tZm9ybXMtd2lkZ2V0e21hcmdpbjoyZW0gMH0ubm8tZm9ybXMtZm91bmQtaWNvbntmb250LXNpemU6MTRweDtsaW5lLWhlaWdodDoxLjQ7d2lkdGg6MTRweDtjb2xvcjojZTA3ZDdkfS5jb21pbmctc29vbi1idXR0b257cG9zaXRpb246YWJzb2x1dGV9LmNvbWluZy1zb29uLWJ1dHRvbiAuZGFzaGljb25ze2ZvbnQtc2l6ZToxNHB4O2xpbmUtaGVpZ2h0OjEuOH0uYWRkLW9ucy1hYm91dC10ZXh0e21hcmdpbi10b3A6MH0jYWRkLW9uc3ttYXJnaW46M2VtIDB9LmFkZG9uLWltYWdle2Rpc3BsYXk6YmxvY2t9Lm5vLW1haWxjaGltcC1saXN0cy1mb3VuZHtwYWRkaW5nOjI1cHggMCAyNXB4IDI1cHh9LmFkZC1uZXctc3Vic2NyaWJlci1idXR0b257ZGlzcGxheTpibG9jazttYXJnaW4tdG9wOjJlbX0uYWRkLW5ldy1zdWJzY3JpYmVyLWZvcm0tY29udGFpbmVye2Rpc3BsYXk6bm9uZTtwYWRkaW5nLXRvcDoxZW19LmFkZC1uZXctc3Vic2NyaWJlci1mb3JtLWNvbnRhaW5lciBoNHttYXJnaW4tdG9wOjB9I3lpa2VzLWVhc3ktbWMtd2lkZ2V0LXN0YXQtaG9sZGVyLC55aWtlcy1lYXN5LW1jLXN0YXRzLXRhYmxle21hcmdpbi10b3A6MWVtfSNtaWdyYXRpb24tYnV0dG9uc3tkaXNwbGF5OmlubGluZS1ibG9jazttYXJnaW4tYm90dG9tOi41ZW19I21pZ3JhdGlvbi1idXR0b25zIGZvcm06Zmlyc3QtY2hpbGR7bWFyZ2luLXJpZ2h0OjEwcHh9I21pZ3JhdGlvbi1idXR0b25zIGZvcm17ZmxvYXQ6bGVmdH0jeWlrZXNfZWFzeV9tY19hY2NvdW50X2FjdGl2aXR5X3dpZGdldCBoMyBzcGFuLCN5aWtlc19lYXN5X21jX2xpc3Rfc3RhdHNfd2lkZ2V0IGgzIHNwYW57YmFja2dyb3VuZDp1cmwoLi4vLi4vaW5jbHVkZXMvaW1hZ2VzL01haWxDaGltcF9Bc3NldHMvRnJlZGRpZV9vcmlnaW5hbC5wbmcpIDhweCA0cHgvMjVweCBhdXRvIG5vLXJlcGVhdDtiYWNrZ3JvdW5kLXNpemU6MjVweDtkaXNwbGF5OmJsb2NrO2hlaWdodDozMHB4O3BhZGRpbmctbGVmdDozZW07cGFkZGluZy10b3A6NXB4fSN5aWtlc19lYXN5X21jX2FjY291bnRfYWN0aXZpdHlfd2lkZ2V0IGgzLmhuZGxlLCN5aWtlc19lYXN5X21jX2xpc3Rfc3RhdHNfd2lkZ2V0IC5pbnNpZGV7cGFkZGluZzowfSN5aWtlc19lYXN5X21jX2xpc3Rfc3RhdHNfd2lkZ2V0IGgze3BhZGRpbmc6MDtsaW5lLWhlaWdodDoxLjZlbX0ueWlrZXMtZWFzeS1tYy1zdGF0cy10YWJsZSwueWlrZXMtZWFzeS1tYy1zdGF0cy10YWJsZSAueWlrZXMtZWFzeS1tYy10YWJsZS1zdGF0cy10ciwueWlrZXMtZWFzeS1tYy1zdGF0cy10YWJsZSB0Ym9keXtkaXNwbGF5OmJsb2NrO3dpZHRoOjEwMCV9Lnlpa2VzLWVhc3ktbWMtdGFibGUtc3RhdHMtdHIgdGR7ZGlzcGxheTppbmxpbmUtYmxvY2s7d2lkdGg6NDglO3RleHQtYWxpZ246Y2VudGVyfS55aWtlcy1lYXN5LW1jLXRhYmxlLXN0YXRzLXRyIHRkOmhvdmVye2N1cnNvcjpwb2ludGVyfS55aWtlcy1lYXN5LW1jLXRhYmxlLXN0YXRzLXRyIHRkOmZpcnN0LW9mLXR5cGV7Ym9yZGVyLXJpZ2h0OjFweCBzb2xpZCAjZWNlY2VjfS55aWtlcy1lYXN5LW1jLXN0YXRzLXRhYmxlIC55aWtlcy1lYXN5LW1jLXRhYmxlLXN0YXRzLXRyLWZpcnN0e2JvcmRlci1ib3R0b206MXB4IHNvbGlkICNlY2VjZWM7Ym9yZGVyLXRvcDoxcHggc29saWQgI2VjZWNlY30ueWlrZXMtZWFzeS1tYy1zdGF0cy10YWJsZSBwLnlpa2VzLWVhc3ktbWMtZGFzaGJvYXJkLXN0YXR7Y29sb3I6IzAwYTBkMjtmb250LXdlaWdodDo4MDA7Zm9udC1zaXplOjIwcHg7bWFyZ2luLWJvdHRvbToycHg7bWFyZ2luLXRvcDoxNXB4O2xpbmUtaGVpZ2h0OjEuMjttYXgtaGVpZ2h0OjgwcHh9Lnlpa2VzLWVhc3ktbWMtc3RhdHMtdGFibGUgcC55aWtlcy1lYXN5LW1jLXN0YXQtbGlzdC1sYWJlbHtmb250LXNpemU6MTNweDttYXJnaW4tdG9wOjA7bWFyZ2luLWJvdHRvbToxNXB4O2ZvbnQtZmFtaWx5OlwiT3BlbiBTYW5zXCJ9I3lpa2VzX2Vhc3lfbWNfYWNjb3VudF9hY3Rpdml0eV93aWRnZXQgdGFibGUgdGgucm93LXRpdGxle3BhZGRpbmctbGVmdDoxMHB4fSNwcmUtZGVmaW5lZC10YWctaW50ZXJpb3ItY29udGFpbmVye2JhY2tncm91bmQ6dXJsKC4uLy4uL2luY2x1ZGVzL2ltYWdlcy90aW55TUNFL3lpa2VzLW1haWxjaGltcC1jb21iby1mYWRlZC5wbmcpIGJvdHRvbSByaWdodCBuby1yZXBlYXQgI2ZmZjtiYWNrZ3JvdW5kLXNpemU6NDAlfS5xdGlwLWRlZmF1bHR7YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudCFpbXBvcnRhbnQ7Ym9yZGVyOnRyYW5zcGFyZW50IWltcG9ydGFudDt6LWluZGV4Ojk5OTk5OTkhaW1wb3J0YW50fS5xdGlwLWJvb3RzdHJhcHtwYWRkaW5nOjEwcHghaW1wb3J0YW50O3otaW5kZXg6OTk5OTk5OSFpbXBvcnRhbnQ7Zm9udC1zaXplOjEycHh9LnNlYXJjaC1pbnRlcmVzdC1ncm91cC1wcmVsb2FkZXJ7ZGlzcGxheTpibG9jazttYXJnaW46OHB4IDAgMCA1NXB4O3dpZHRoOjEycHh9Lm5vLWludGVyZXN0LWdyb3VwaW5ncy1lbmFibGVkLW1lc3NhZ2V7ZGlzcGxheTpibG9jazttYXJnaW4tdG9wOjEycHghaW1wb3J0YW50O3dpZHRoOjEwMCV9LnRvb2x0aXAtaW50ZWdyYXRpb24tYmFubmVye21heC13aWR0aDoxMDAlO21hcmdpbjowIDAgLjI1ZW19LnRvb2x0aXB0ZXh0LnF0aXAtYm9vdHN0cmFwe2ZvbnQtc2l6ZToxMnB4fS50b29sdGlwLXRpdGxle21hcmdpbjowfS5kYXNoaWNvbnMtZWRpdG9yLWhlbHA6aG92ZXJ7Y3Vyc29yOnBvaW50ZXJ9Ym9keS5lYXN5LWZvcm1zX3BhZ2VfeWlrZXMtaW5jLWVhc3ktbWFpbGNoaW1wLXNldHRpbmdzIC5pbnRlcmVzdC1ncm91cC1zZWN0aW9ue2Rpc3BsYXk6YmxvY2s7d2lkdGg6MTAwJTttYXJnaW46MS41ZW0gMH1ib2R5LmVhc3ktZm9ybXNfcGFnZV95aWtlcy1pbmMtZWFzeS1tYWlsY2hpbXAtc2V0dGluZ3MgLmludGVyZXN0LWdyb3VwLXNlY3Rpb24gLmludGVyZXN0LWdyb3VwLXNlY3Rpb24tdGl0bGV7ZGlzcGxheTpibG9jazt3aWR0aDoxMDAlO21hcmdpbjouNWVtIDA7dGV4dC1kZWNvcmF0aW9uOnVuZGVybGluZX0uZ2l0aHViLWF2YXRhci11cmwsYm9keS5hZG1pbl9wYWdlX3lpa2VzLW1haWxjaGltcC13ZWxjb21lICNrYi1jb250YWluZXIgLmtub3dsZWRnZS1iYXNlLWxpc3RpbmcgbGkgYSxib2R5LmVhc3ktZm9ybXNfcGFnZV95aWtlcy1pbmMtZWFzeS1tYWlsY2hpbXAtc3VwcG9ydCAua25vd2xlZGdlLWJhc2UtYXJ0aWNsZXMgLmtub3dsZWRnZS1iYXNlLWxpc3RpbmcgbGkgYXt0ZXh0LWRlY29yYXRpb246bm9uZX1ib2R5LmVhc3ktZm9ybXNfcGFnZV95aWtlcy1pbmMtZWFzeS1tYWlsY2hpbXAtc2V0dGluZ3MgLmludGVyZXN0LWdyb3VwLXNlY3Rpb24gaW5wdXR7bWFyZ2luLXJpZ2h0OjB9Ym9keS5lYXN5LWZvcm1zX3BhZ2VfeWlrZXMtaW5jLWVhc3ktbWFpbGNoaW1wLXNldHRpbmdzIC5pbnRlcmVzdC1ncm91cC1zZWN0aW9uIGxhYmVse21hcmdpbi1yaWdodDoxMHB4fWkubWNlLWljby5tY2UtaS15a3NfbWNfdGlueW1jZV9idXR0b25fa2V5e2JhY2tncm91bmQ6dXJsKC4uLy4uL2luY2x1ZGVzL2ltYWdlcy90aW55TUNFL0ZyZWRkaWVfd2luay5wbmcpIG5vLXJlcGVhdDtiYWNrZ3JvdW5kLXNpemU6MThweDtiYWNrZ3JvdW5kLXBvc2l0aW9uLXk6MXB4fSN5aWtlc19tYWlsY2hpbXBfdGlueU1DRV9tb2RhbC10aXRsZXtwYWRkaW5nLWxlZnQ6NDJweDtiYWNrZ3JvdW5kOnVybCguLi8uLi9pbmNsdWRlcy9pbWFnZXMvTWFpbENoaW1wX0Fzc2V0cy9GcmVkZGllX29yaWdpbmFsLnBuZykgbGVmdCBuby1yZXBlYXQ7YmFja2dyb3VuZC1zaXplOjI1cHg7YmFja2dyb3VuZC1wb3NpdGlvbi14OjEwcHh9I3lpa2VzX21haWxjaGltcF90aW55TUNFX21vZGFse2JhY2tncm91bmQ6dXJsKC4uLy4uL2luY2x1ZGVzL2ltYWdlcy90aW55TUNFL3lpa2VzLW1haWxjaGltcC1jb21iby1mYWRlZC5wbmcpIGJvdHRvbSBsZWZ0IG5vLXJlcGVhdCAjZmZmO2JhY2tncm91bmQtc2l6ZTo0MCU7YmFja2dyb3VuZC1wb3NpdGlvbi14OjEwcHg7YmFja2dyb3VuZC1wb3NpdGlvbi15Ojk1JX0jeWlrZXNfbWFpbGNoaW1wX3RpbnlNQ0VfbW9kYWwgLm1jZS1mb290e2JvcmRlci10b3A6bm9uZSFpbXBvcnRhbnQ7YmFja2dyb3VuZDowIDB9W2lkKj1cIl95aWtlc19lYXN5X21jX3dpZGdldFwiXT5kaXYud2lkZ2V0LXRvcD5kaXYud2lkZ2V0LXRpdGxlPmg0e2JhY2tncm91bmQ6dXJsKC4uLy4uL2luY2x1ZGVzL2ltYWdlcy9NYWlsQ2hpbXBfQXNzZXRzL0ZyZWRkaWVfb3JpZ2luYWwucG5nKSAyJSA1MCUvMjVweCBhdXRvIG5vLXJlcGVhdCAjRkFGQUZBO3BhZGRpbmctbGVmdDo0MHB4fSNyZXZpZXcteWlrZXMtZWFzeS1tYWlsY2hpbXAtbm90aWNlICN5aWtlcy1tYWlsY2hpbXAtbG9nbywjeWlrZXMtbWFpbGNoaW1wLWxvZ297Zm9udC1zaXplOjE0cHg7YmFja2dyb3VuZDp1cmwoLi4vLi4vaW5jbHVkZXMvaW1hZ2VzL1dlbGNvbWVfUGFnZS95aWtlcy1tYWlsY2hpbXAtd2VsY29tZS1sb2dvLnBuZykgbm8tcmVwZWF0O3RleHQtYWxpZ246Y2VudGVyfSNyZXZpZXcteWlrZXMtZWFzeS1tYWlsY2hpbXAtbm90aWNlICN5aWtlcy1tYWlsY2hpbXAtbG9nb3tiYWNrZ3JvdW5kLXNpemU6NjBweDtmbG9hdDpsZWZ0O2hlaWdodDo4MHB4O3dpZHRoOjgwcHh9Lnlpa2VzLWVhc3ktbWMtZmVhdHVyZS1pbWFnZS1sZWZ0e2Zsb2F0OmxlZnQ7bWFyZ2luLXJpZ2h0OjMwcHg7bWFyZ2luLWxlZnQ6MCFpbXBvcnRhbnR9Lm5lZWQtc3VwcG9ydC1pY29ue2xpbmUtaGVpZ2h0OjEuNX11bC5zdXBwb3J0LW9wdGlvbi1saXN0e2Rpc3BsYXk6aW5saW5lLWJsb2NrO3dpZHRoOjEwMCV9LnN1cHBvcnQtb3B0aW9ue2Zsb2F0OmxlZnR9LnN1cHBvcnQtb3B0aW9uLXNlY29uZHttYXJnaW4tbGVmdDoxMHB4fSN5aWtlcy1tYWlsY2hpbXAtbG9nby5zdXBwb3J0LXBhZ2V7ZmxvYXQ6bGVmdDt3aWR0aDo4MHB0fS55aWtlcy1lYXN5LW1jLXdoYXRzLW5ldy1zZWN0aW9uLWltYWdle2Zsb2F0Om5vbmU7d2lkdGg6MTAwJTttYXJnaW4tbGVmdDowIWltcG9ydGFudH0ud2VsY29tZS1wYWdlLXRhYnN7bWFyZ2luLXRvcDoyZW0haW1wb3J0YW50fS53ZWxjb21lLXBhZ2UtYWJvdXQtd3JhcCAuYWJvdXQtdGV4dCwud2VsY29tZS1wYWdlLWFib3V0LXdyYXAgaDIud2VsY29tZS10aXRsZXttYXJnaW4tbGVmdDoxMTVweH0ud2hhdHMtbmV3LXdyYXAgaW1nLnlpa2VzLWVhc3ktbWMtd2hhdHMtbmV3LXNlY3Rpb24taW1hZ2V7bWFyZ2luLXRvcDoxMHB4fS53aGF0cy1uZXctd3JhcCAuZmVhdHVyZS1zZWN0aW9uOm50aC1jaGlsZCgxKSBpbWd7ZmxvYXQ6bGVmdDt3aWR0aDo1MDBweDttYXJnaW4tbGVmdDowIWltcG9ydGFudDttYXJnaW4tcmlnaHQ6MzBweH0ud2hhdHMtbmV3LXdyYXAgLmZlYXR1cmUtc2VjdGlvbjpudGgtY2hpbGQoMykgaW1ne2Zsb2F0OnJpZ2h0O3dpZHRoOjI1MHB4O21hcmdpbi1yaWdodDowIWltcG9ydGFudDttYXJnaW4tbGVmdDozMHB4fS53aGF0cy1uZXctd3JhcCAuZmVhdHVyZS1zZWN0aW9uOm50aC1jaGlsZCg0KSBpbWd7bWFyZ2luLWxlZnQ6MCFpbXBvcnRhbnR9I3lpa2VzLW1haWxjaGltcC1sb2dve2hlaWdodDoxMzJweDt3aWR0aDoxMzJweH0uYWJvdXQtd3JhcCAjeWlrZXMtbWFpbGNoaW1wLWxvZ297cG9zaXRpb246YWJzb2x1dGU7dG9wOjA7bGVmdDowfS5lZGQtd2VsY29tZS1zY3JlZW5zaG90c3tmbG9hdDpyaWdodDttYXJnaW4tbGVmdDoxMHB4IWltcG9ydGFudH0uYWJvdXQtd3JhcCAuZmVhdHVyZS1zZWN0aW9ue21hcmdpbi10b3A6MjBweH0ueWlrZXMtZWFzeS1tYy1mZWF0dXJlLWltYWdle2Zsb2F0OnJpZ2h0O21hcmdpbi1sZWZ0OjMwcHghaW1wb3J0YW50fSNjcmVkaXQtY29udGFpbmVyLCN0cmFuc2xhdG9ycy1jb250YWluZXJ7ZGlzcGxheTppbmxpbmUtYmxvY2s7d2lkdGg6MTAwJX0jY3JlZGl0LWNvbnRhaW5lciBoMiwjdHJhbnNsYXRvcnMtY29udGFpbmVyIGgye21hcmdpbjowIDAgLjVlbSAxZW19I3RyYW5zbGF0b3JzLWNvbnRhaW5lcnttYXJnaW4tdG9wOjVlbX0jdHJhbnNsYXRvcnMtY29udGFpbmVyIC50cmFuc2xhdGlvbi1sYW5ndWFnZXtjb2xvcjojMzMzfSNjcmVkaXQtY29udGFpbmVyIC50ZWFtLW1lbWJlciwjdHJhbnNsYXRvcnMtY29udGFpbmVyIC50cmFuc2xhdG9ye21hcmdpbjoxZW0gNSUgMWVtIDA7dGV4dC1hbGlnbjpjZW50ZXJ9I2NyZWRpdC1jb250YWluZXIgLnRlYW0tbWVtYmVyIGltZywjdHJhbnNsYXRvcnMtY29udGFpbmVyIC50cmFuc2xhdG9yIGltZ3tib3JkZXItcmFkaXVzOjUwJX0uYWJvdXQtd3JhcCBkaXYuZXJyb3IsLmFib3V0LXdyYXAgZGl2LnVwZGF0ZWR7ZGlzcGxheTpibG9jayFpbXBvcnRhbnQ7bWFyZ2luLWxlZnQ6MTE1cHghaW1wb3J0YW50fS5naXRodWItYXZhdGFyLWltYWdle3dpZHRoOjEwMHB4fS5naXRodWItYXZhdGFyLXVybHtkaXNwbGF5OmlubGluZS1ibG9jazt3aWR0aDoyMCV9Z2l0aHViLWF2YXRhci11cmw6Zm9jdXN7b3V0bGluZTowfWJvZHkuYWRtaW5fcGFnZV95aWtlcy1tYWlsY2hpbXAtZWRpdC1mb3JtIGRpdi5zaG93LXNvbWUtbG92ZS1jb250YWluZXIgaW1nLGRpdi5zaG93LXNvbWUtbG92ZS1jb250YWluZXIgaW1nLmN1c3RvbWl6ZXItdXBzZWxsLWJhbm5lcnttYXgtd2lkdGg6MTAwJX1ib2R5LmFkbWluX3BhZ2VfeWlrZXMtbWFpbGNoaW1wLWVkaXQtZm9ybSBkaXYuc2hvdy1zb21lLWxvdmUtY29udGFpbmVyIHA6Zmlyc3QtY2hpbGR7Zm9udC1zdHlsZTppdGFsaWN9Ym9keS5hZG1pbl9wYWdlX3lpa2VzLW1haWxjaGltcC1lZGl0LWZvcm0gZGl2LnNob3ctc29tZS1sb3ZlLWNvbnRhaW5lciBocnttYXJnaW46MWVtIDB9Ym9keS5hZG1pbl9wYWdlX3lpa2VzLW1haWxjaGltcC13ZWxjb21lIC5uYXYtdGFiLXdyYXBwZXIgLm5hdi10YWIgLmRhc2hpY29uc3tmb250LXNpemU6MTdweDtsaW5lLWhlaWdodDoxLjV9Ym9keS5hZG1pbl9wYWdlX3lpa2VzLW1haWxjaGltcC13ZWxjb21lICNrYi1jb250YWluZXIsYm9keS5lYXN5LWZvcm1zX3BhZ2VfeWlrZXMtaW5jLWVhc3ktbWFpbGNoaW1wLXN1cHBvcnQgLmtub3dsZWRnZS1iYXNlLWFydGljbGVze2Rpc3BsYXk6aW5saW5lLWJsb2NrO21hcmdpbi10b3A6MWVtfWJvZHkuYWRtaW5fcGFnZV95aWtlcy1tYWlsY2hpbXAtd2VsY29tZSAja2ItY29udGFpbmVyIGgxe2ZvbnQtc2l6ZToyMHB4O21hcmdpbi10b3A6LTFlbX1ib2R5LmFkbWluX3BhZ2VfeWlrZXMtbWFpbGNoaW1wLXdlbGNvbWUgI2tiLWNvbnRhaW5lciAua25vd2xlZGdlLWJhc2UtbGlzdGluZyxib2R5LmVhc3ktZm9ybXNfcGFnZV95aWtlcy1pbmMtZWFzeS1tYWlsY2hpbXAtc3VwcG9ydCAua25vd2xlZGdlLWJhc2UtYXJ0aWNsZXMgLmtub3dsZWRnZS1iYXNlLWxpc3Rpbmd7d2lkdGg6NDUlO21hcmdpbi1yaWdodDoyJTtmbG9hdDpsZWZ0O21pbi1oZWlnaHQ6MjYwcHh9Ym9keS5hZG1pbl9wYWdlX3lpa2VzLW1haWxjaGltcC13ZWxjb21lICNrYi1jb250YWluZXIgLmtub3dsZWRnZS1iYXNlLWxpc3RpbmcgbGksYm9keS5lYXN5LWZvcm1zX3BhZ2VfeWlrZXMtaW5jLWVhc3ktbWFpbGNoaW1wLXN1cHBvcnQgLmtub3dsZWRnZS1iYXNlLWFydGljbGVzIC5rbm93bGVkZ2UtYmFzZS1saXN0aW5nIGxpe21hcmdpbjoxMnB4IDA7dGV4dC1kZWNvcmF0aW9uOm5vbmV9Ym9keS5hZG1pbl9wYWdlX3lpa2VzLW1haWxjaGltcC13ZWxjb21lICNrYi1jb250YWluZXIgLmtub3dsZWRnZS1iYXNlLWxpc3RpbmcgbGk6YmVmb3JlLGJvZHkuZWFzeS1mb3Jtc19wYWdlX3lpa2VzLWluYy1lYXN5LW1haWxjaGltcC1zdXBwb3J0IC5rbm93bGVkZ2UtYmFzZS1hcnRpY2xlcyAua25vd2xlZGdlLWJhc2UtbGlzdGluZyBsaTpiZWZvcmV7Zm9udC1mYW1pbHk6ZGFzaGljb25zO2NvbnRlbnQ6XCJcXGYxMjNcIjt2ZXJ0aWNhbC1hbGlnbjptaWRkbGU7ZGlzcGxheTpibG9jaztmbG9hdDpsZWZ0O21hcmdpbjowIDVweCA1cHggMH1ib2R5LmFkbWluX3BhZ2VfeWlrZXMtbWFpbGNoaW1wLXdlbGNvbWUgI2tiLWNvbnRhaW5lciAua25vd2xlZGdlLWJhc2UtbGlzdGluZyBsaS5saXN0LXRpdGxlLGJvZHkuZWFzeS1mb3Jtc19wYWdlX3lpa2VzLWluYy1lYXN5LW1haWxjaGltcC1zdXBwb3J0IC5rbm93bGVkZ2UtYmFzZS1hcnRpY2xlcyAua25vd2xlZGdlLWJhc2UtbGlzdGluZyBsaS5saXN0LXRpdGxle2ZvbnQtc2l6ZToxN3B4O2ZvbnQtd2VpZ2h0OjIwMDt0ZXh0LWRlY29yYXRpb246dW5kZXJsaW5lfWJvZHkuYWRtaW5fcGFnZV95aWtlcy1tYWlsY2hpbXAtd2VsY29tZSAja2ItY29udGFpbmVyIC5rbm93bGVkZ2UtYmFzZS1saXN0aW5nIGxpLmxpc3QtdGl0bGU6YmVmb3JlLGJvZHkuZWFzeS1mb3Jtc19wYWdlX3lpa2VzLWluYy1lYXN5LW1haWxjaGltcC1zdXBwb3J0IC5rbm93bGVkZ2UtYmFzZS1hcnRpY2xlcyAua25vd2xlZGdlLWJhc2UtbGlzdGluZyBsaS5saXN0LXRpdGxlOmJlZm9yZXtjb250ZW50OlwiXCI7cGFkZGluZy1sZWZ0OjEycHh9Ym9keS5hZG1pbl9wYWdlX3lpa2VzLW1haWxjaGltcC13ZWxjb21lIC5uZXctZmVhdHVyZS1saXN0e2xpc3Qtc3R5bGU6bm9uZTtsaW5lLWhlaWdodDptaWRkbGV9Ym9keS5hZG1pbl9wYWdlX3lpa2VzLW1haWxjaGltcC13ZWxjb21lIC5uZXctZmVhdHVyZS1saXN0IGxpe21hcmdpbi1ib3R0b206MTBweH1ib2R5LmFkbWluX3BhZ2VfeWlrZXMtbWFpbGNoaW1wLXdlbGNvbWUgLm5ldy1mZWF0dXJlLWxpc3QgbGk6YmVmb3Jle2ZvbnQtZmFtaWx5OmRhc2hpY29ucztjb250ZW50OlwiXFxmMTM5XCI7cGFkZGluZy1yaWdodDoycHg7Zm9udC1zaXplOjIwcHg7dmVydGljYWwtYWxpZ246bWlkZGxlfSNyZXZpZXcteWlrZXMtZWFzeS1tYWlsY2hpbXAtbm90aWNlIC5idXR0b24tY29udGFpbmVye2Rpc3BsYXk6YmxvY2s7d2lkdGg6MTAwJTttYXJnaW46Ljc1ZW0gMCAxLjVlbX0jcmV2aWV3LXlpa2VzLWVhc3ktbWFpbGNoaW1wLW5vdGljZSAuYnV0dG9uLWNvbnRhaW5lciAuZGFzaGljb25ze2ZvbnQtc2l6ZToxNHB4O2xpbmUtaGVpZ2h0OjEuOTttYXJnaW4tbGVmdDotNHB4fSNyZXZpZXcteWlrZXMtZWFzeS1tYWlsY2hpbXAtbm90aWNlIC5idXR0b24tY29udGFpbmVyIC5kYXNoaWNvbnMtc3Rhci1maWxsZWR7Y29sb3I6I0U2QjgwMH0jcmV2aWV3LXlpa2VzLWVhc3ktbWFpbGNoaW1wLW5vdGljZSAuYnV0dG9uLWNvbnRhaW5lciAuZGFzaGljb25zLXVwbG9hZHtjb2xvcjojNkU4ODQxfSNyZXZpZXcteWlrZXMtZWFzeS1tYWlsY2hpbXAtbm90aWNlIC5idXR0b24tY29udGFpbmVyIC5kYXNoaWNvbnMtbm8tYWx0e2NvbG9yOiNkYzNhM2E7bGluZS1oZWlnaHQ6Mn1ib2R5LmVhc3ktbWFpbGNoaW1wX3BhZ2VfeWlrZXMtaW5jLWVhc3ktbWFpbGNoaW1wLXNldHRpbmdzIC5kYXNoaWNvbnMtbm8tYWx0e2NvbG9yOiNkYzNhM2F9I3Jldmlldy15aWtlcy1lYXN5LW1haWxjaGltcC1ub3RpY2UgLmJ1dHRvbi1jb250YWluZXIgYXttYXJnaW4tcmlnaHQ6MTBweH0jcmV2aWV3LXlpa2VzLWVhc3ktbWFpbGNoaW1wLW5vdGljZXtib3JkZXItbGVmdDo0cHggc29saWQgIzAwYTBkMjtiYWNrZ3JvdW5kOiNmZWZlZmU7cGFkZGluZzoxMHB4IDEycHggMXB4O2JveC1zaGFkb3c6MCAxcHggMXB4IDAgcmdiYSgwLDAsMCwuMSk7LXdlYmtpdC1ib3gtc2hhZG93OjAgMXB4IDFweCAwIHJnYmEoMCwwLDAsLjEpO21hcmdpbjoxNXB4IDI1cHggMjBweCA1cHh9aW5wdXQucmVhZG9ubHksaW5wdXRbcmVhZG9ubHldLHRleHRhcmVhLnJlYWRvbmx5LHRleHRhcmVhW3JlYWRvbmx5XXtiYWNrZ3JvdW5kOiNEOEQ4RDh9LmRhc2hpY29ucy55aWtlcy1sb3Zle2NvbG9yOnBpbmt9LmZpZWxkLWRlc2NyaXB0aW9uLWlucHV0e3Jlc2l6ZTp2ZXJ0aWNhbDttYXgtaGVpZ2h0OjEwMHB4fS55aWtlcy1lYXN5LW1jLXBvc3Rib3ggaDN7YmFja2dyb3VuZDojMDBhMGQyO2ZvbnQtd2VpZ2h0OjgwMDtjb2xvcjojZmZmfS55aWtlcy1lYXN5LW1jLXBvc3Rib3ggaDMuYmctdHJhbnNwYXJlbnR7Y29sb3I6IzMzMztmb250LXdlaWdodDo0MDA7YmFja2dyb3VuZDowIDB9Lnlpa2VzLW1jLXdhcm5pbmctbWVzc2FnZXtwYWRkaW5nLWxlZnQ6MTVweDttYXJnaW4tdG9wOjA7cGFkZGluZy10b3A6MTBweDtjb2xvcjojZGE2ZTZlfS5lcnJvci1tZXNzYWdlLWNvbnRhaW5lciBsYWJlbFtmb3I9eWlrZXMtZWFzeS1tYy1zdWNjZXNzLW1lc3NhZ2VdLC5lcnJvci1tZXNzYWdlLWNvbnRhaW5lciBsYWJlbFtmb3I9eWlrZXMtZWFzeS1tYy1nZW5lcmFsLWVycm9yLW1lc3NhZ2VdLC5lcnJvci1tZXNzYWdlLWNvbnRhaW5lciBsYWJlbFtmb3I9eWlrZXMtZWFzeS1tYy1pbnZhbGlkLWVtYWlsLW1lc3NhZ2VdLC5lcnJvci1tZXNzYWdlLWNvbnRhaW5lciBsYWJlbFtmb3I9eWlrZXMtZWFzeS1tYy11c2VyLXN1YnNjcmliZWQtbWVzc2FnZV17cGFkZGluZzouNWVtIDFlbTtiYWNrZ3JvdW5kOnJnYmEoMjQxLDI0MSwyNDEsLjc1KTtib3gtc2l6aW5nOmJvcmRlci1ib3g7LXdlYmtpdC1ib3gtc2l6aW5nOmJvcmRlci1ib3g7LW1vei1ib3gtc2l6aW5nOmJvcmRlci1ib3g7bWFyZ2luOjB9LmVycm9yLW1lc3NhZ2UtY29udGFpbmVyIGxhYmVsW2Zvcj15aWtlcy1lYXN5LW1jLXVzZXItc3Vic2NyaWJlZC1tZXNzYWdlXXtwYWRkaW5nLWJvdHRvbToxZW07bWFyZ2luLWJvdHRvbTouNWVtfS5lcnJvci1tZXNzYWdlLWNvbnRhaW5lciBsYWJlbCwuZm9ybS1zZXR0aW5ncy1jb250YWluZXIgbGFiZWx7ZGlzcGxheTpibG9jazttYXJnaW46MWVtIDB9Lnlpa2VzLWVhc3ktZm9ybXMtc2lkZWJhciAueWlrZXMtbWMtc2V0dGluZ3MtZXhwYW5zaW9uLXNlY3Rpb257cGFkZGluZzouNWVtIC43NWVtOy13ZWJraXQtYm94LXNpemluZzpib3JkZXItYm94Oy1tb3otYm94LXNpemluZzpib3JkZXItYm94fS55aWtlcy1tYy1zZXR0aW5ncy1leHBhbnNpb24tc2VjdGlvbntkaXNwbGF5Om5vbmU7YmFja2dyb3VuZDpyZ2JhKDI0MSwyNDEsMjQxLC43NSl9LmV4cGFuc2lvbi1zZWN0aW9uLXRpdGxle2JhY2tncm91bmQ6I2ZmZn0uZXhwYW5zaW9uLXNlY3Rpb24tdGl0bGUuc2V0dGluZ3Mtc2lkZWJhciwuZm9ybS1idWlsZGVyLXNlY3Rpb24tdGl0bGV7dGV4dC1kZWNvcmF0aW9uOm5vbmU7ZGlzcGxheTpibG9jaztib3JkZXI6MXB4IHNvbGlkIHJnYmEoMTc3LDE3NywxNzcsLjcxKTtjb2xvcjojMzMzO3BhZGRpbmc6NXB4O21hcmdpbjouNWVtIDAgMH0uZXhwYW5zaW9uLXNlY3Rpb24tdGl0bGUuc2V0dGluZ3Mtc2lkZWJhciAuZGFzaGljb25zLC5mb3JtLWJ1aWxkZXItc2VjdGlvbi10aXRsZSAuZGFzaGljb25ze2NvbnRlbnQ6XCJcXGYxMzJcIjtmb250LWZhbWlseTpkYXNoaWNvbnM7Zm9udC1zaXplOjE1cHg7bGluZS1oZWlnaHQ6MS41fXNwYW4uZWFzeS1tYWlsY2hpbXAtYWRkLW9uLXZhbGlkLWxpY2Vuc2UtY29udGFpbmVye2NvbG9yOiM0NGJhNDQ7ZGlzcGxheTpibG9jazttYXJnaW4tdG9wOjFlbX0uZWFzeS1tYWlsY2hpbXAtYWRkLW9uLWludmFsaWQtbGljZW5zZS1jb250YWluZXJ7Y29sb3I6cmdiYSgyMjcsMTA3LDEwNywuODYpO2Rpc3BsYXk6YmxvY2s7bWFyZ2luLXRvcDoxZW19Lm9wdGlvbnMtc2lkZWJhciAueWlrZXMtZWFzeS1tYy1wb3N0Ym94e292ZXJmbG93OnZpc2libGV9Lm9wdGlvbnMtc2lkZWJhciAuaW5zaWRle3BhZGRpbmc6MCAyMHB4IDEycHh9Lnlpa2VzLWVhc3ktbWMtYWJvdXQtdGV4dHttYXJnaW4tdG9wOjB9LmFkZC1vbi1zZXR0aW5ncy1kaXZpZGVye21hcmdpbjoxZW0gMCFpbXBvcnRhbnR9I3lrcy1tYWlsY2hpbXAtZG91YmxlLW9wdGluLW1lc3NhZ2UsI3lrcy1tYWlsY2hpbXAtc2luZ2xlLW9wdGluLW1lc3NhZ2UsLnNldHRpbmdzLXBhZ2UtaW5wdXR7d2lkdGg6NTAlfSN5a3MtbWFpbGNoaW1wLWRvdWJsZS1vcHRpbi1tZXNzYWdlLCN5a3MtbWFpbGNoaW1wLXNpbmdsZS1vcHRpbi1tZXNzYWdle21pbi1oZWlnaHQ6NzVweDttYXgtaGVpZ2h0OjIwMHB4O3Jlc2l6ZTp2ZXJ0aWNhbH0jYWRkb24tc2V0dGluZ3MtbmF2IGxpIGEsI3NldHRpbmdzLW5hdiBsaSBhe2NvbG9yOiMzMzM7dGV4dC1kZWNvcmF0aW9uOm5vbmUhaW1wb3J0YW50O3RyYW5zaXRpb246Y29sb3IgLjE1cyBlYXNlLW91dDstbW96LXRyYW5zaXRpb246Y29sb3IgLjE1cyBlYXNlLW91dDstd2Via2l0LXRyYW5zaXRpb246Y29sb3IgLjE1cyBlYXNlLW91dDstby10cmFuc2l0aW9uOmNvbG9yIC4xNXMgZWFzZS1vdXR9I2FkZG9uLXNldHRpbmdzLW5hdiBsaSBhOmhvdmVyLCNzZXR0aW5ncy1uYXYgbGkgYTpob3Zlciwub3B0aW9uLW1lbnUtc2VsZWN0ZWQtYXJyb3crYXtjb2xvcjojMDBhMGQyIWltcG9ydGFudH0jYWRkb24tc2V0dGluZ3MtbmF2e21hcmdpbi1ib3R0b206MDttYXJnaW4tdG9wOjVweH0ub3B0aW9uLW1lbnUtc2VsZWN0ZWQtYXJyb3d7d2lkdGg6MDtoZWlnaHQ6MDtib3JkZXItdG9wOjEwcHggc29saWQgdHJhbnNwYXJlbnQ7Ym9yZGVyLWJvdHRvbToxMHB4IHNvbGlkIHRyYW5zcGFyZW50O2JvcmRlci1sZWZ0OjEwcHggc29saWQgI2EwYTVhYTtwb3NpdGlvbjphYnNvbHV0ZTtsZWZ0Oi0uMWVtfWxhYmVsW2Zvcj15aWtlcy1tYWlsY2hpbXAtZGVidWctc3RhdHVzXXtkaXNwbGF5OmlubGluZS1ibG9jazttYXJnaW4tYm90dG9tOjFlbTtsaW5lLWhlaWdodDoyLjI1fSN5aWtlcy1tYWlsY2hpbXAtZGVidWctc3RhdHVze2Zsb2F0OmxlZnQ7bWFyZ2luLXRvcDouNWVtfWxhYmVsW2Zvcj15aWtlcy1tYy1yZWNhcHRjaGEtc2V0dGluZ10sbGFiZWxbZm9yPXlpa2VzLW1jLXJlY2FwdGNoYS1hcGkta2V5XXtkaXNwbGF5OmJsb2NrO21hcmdpbi1ib3R0b206MWVtfS5yZWNhcHRjaGEtcHJldmlldy1saW5rLGlucHV0LnJlY2FwdGNoYS1zZXR0aW5nLWNoZWNrYm94e2Rpc3BsYXk6YmxvY2s7bWFyZ2luLXRvcDouNWVtfS5yZWNhcHRjaGEtcHJldmlldy1jb250YWluZXJ7d2lkdGg6MTAwJTtkaXNwbGF5Om5vbmU7bWFyZ2luOjFlbSAwfSNwcmVtaXVtLXN1cHBvcnQtZm9ybSwuc3VwcG9ydC1wYWdlLWJ1dHRvbiwuc3VwcG9ydC1wYWdlLWxvZ297ZGlzcGxheTpibG9jazt3aWR0aDoxMDAlfS53cmFwICNjb2wtbGVmdCwud3JhcCAjY29sLXJpZ2h0e3dpZHRoOjQ5JX1AbWVkaWEgKG1heC13aWR0aDo4MDBweCl7LndyYXAgI2NvbC1sZWZ0LC53cmFwICNjb2wtcmlnaHR7d2lkdGg6MTAwJX19LnN1cHBvcnQtcGFnZS1sb2dve29wYWNpdHk6Ljc7bWF4LXdpZHRoOjEwMCV9LnN1cHBvcnQtcGFnZS1idXR0b257bWluLWhlaWdodDo0MHB4O2ZvbnQtd2VpZ2h0OjcwMDt0ZXh0LWFsaWduOmNlbnRlcjtsaW5lLWhlaWdodDozIWltcG9ydGFudDttYXJnaW4tdG9wOjFlbSFpbXBvcnRhbnR9LnN1cHBvcnQtcGFnZS13b3JkcHJlc3MtZm9udHtmb250LXNpemU6MS4zZW07bWFyZ2luLXJpZ2h0OjEzcHh9aDIucHJlbWl1bS1zdXBwb3J0LXRpdGxle21hcmdpbjoxZW0gMCAuNWVtfSNwcmVtaXVtLXN1cHBvcnQtZm9ybSBpbnB1dCwjcHJlbWl1bS1zdXBwb3J0LWZvcm0gc2VsZWN0e2Rpc3BsYXk6YmxvY2s7d2lkdGg6MTAwJTttaW4td2lkdGg6MjAwcHg7bWFyZ2luOi41ZW0gMH0jcHJlbWl1bS1zdXBwb3J0LWZvcm0gbGFiZWx7Zm9udC13ZWlnaHQ6ODAwfSNwcmVtaXVtLXN1cHBvcnQtZm9ybSBsYWJlbCBpbnB1dCwjcHJlbWl1bS1zdXBwb3J0LWZvcm0gbGFiZWwgc2VsZWN0e2ZvbnQtd2VpZ2h0OjUwMH0jcHJlbWl1bS1zdXBwb3J0LWZvcm0gcHtmb250LXdlaWdodDozMDA7ZGlzcGxheTpibG9jazttYXJnaW4tYm90dG9tOjFlbX0jd3Atc3VwcG9ydC1jb250ZW50LXdyYXB7bWluLWhlaWdodDoxNTBweDt3aWR0aDoxMDAlfS5zdXBwb3J0LWZvcm0taGlkZGVue2Rpc3BsYXk6bm9uZSFpbXBvcnRhbnR9I3lpa2VzLW1haWxjaGltcC1lcnJvci1sb2cgLnJvdy10aXRsZXtmb250LXdlaWdodDo0MDB9LmNyZWF0ZS1lcnJvci1sb2ctaGVscDpob3ZlcntjdXJzb3I6cG9pbnRlcn0uZXJyb3ItbG9nLXRyIHRke2Rpc3BsYXk6dGFibGU7bWFyZ2luLWJvdHRvbToxZW07bWFyZ2luLXRvcDouNWVtfXAuZXJyb3ItbG9nLW1pc3NpbmctZmlsZSBlbSxwLnRvLXN0YXJ0LWxvZ2dpbmctZXJyb3JzLW5vdGljZSBlbXttYXJnaW46MTBweCAwfS5leHBvcnQtY3VzdG9tLWZvcm1zLWxpc3R7ZGlzcGxheTpub25lO21hcmdpbjoxZW0gMCAyZW19LmV4cG9ydC1jdXN0b20tZm9ybXMtbGlzdCBwe21hcmdpbi10b3A6MH0ubGlzdC1yYXRpbmctc3Rhcntjb2xvcjojRTZCODAwfSNjaGltcC1jaGF0dGVye3RleHQtYWxpZ246Y2VudGVyfSNjaGltcC1jaGF0dGVyIC5jaGltcC1jaGF0dGVyLWNvbnRhaW5lcnttYXJnaW46MWVtIC4yZW07YmFja2dyb3VuZDojRjhGOEY4O2JvcmRlci1yYWRpdXM6MTBweDtmbG9hdDpsZWZ0O2hlaWdodDoyMjBweDtwYWRkaW5nOjEwcHg7d2lkdGg6NDQlfS5jaGltcC1jaGF0dGVyLW1haWxjaGltcC1sb2dve3dpZHRoOjEwMCU7ZGlzcGxheTpibG9jazttYXJnaW46MCBhdXRvfS5jaGltcC1jaGF0dGVyLXNpZGViYXIgaDIuYWNjb3VudC1zdGF0dXN7dGV4dC1hbGlnbjpjZW50ZXJ9Lm1haWxjaGltcC1hZmZpbGlhdGUtbGlua3tjb2xvcjojMzMzO2Rpc3BsYXk6bm9uZX0ubWFpbGNoaW1wLWF2YXRhcntkaXNwbGF5OmJsb2NrO21hcmdpbjowIGF1dG87Ym94LXNoYWRvdzozcHggM3B4IDEwcHggMCByZ2JhKDIxNCwyMTQsMjE0LC43NSl9I3lpa2VzX2Vhc3lfbWNfdG9vbGJhcl9saW5rcyBsaSBhOmZvY3VzLC5tZXJnZS10YWctdGV4dHtib3gtc2hhZG93Om5vbmV9LmNoaW1wY2hhdHRlci1idXR0b24tY29udGFpbmVye2NsZWFyOmJvdGg7ZGlzcGxheTpibG9ja30uY2hpbXAtY2hhdHRlci1wb3N0Ym94e2Zsb2F0OmxlZnQ7d2lkdGg6NDklO21hcmdpbi1yaWdodDoxJX0uY2lyY2xlLWFjY291bnQtYWN0aXZlLC5jaXJjbGUtYWNjb3VudC1pbmFjdGl2ZXtkaXNwbGF5OmlubGluZS1ibG9jazt2ZXJ0aWNhbC1hbGlnbjptaWRkbGU7aGVpZ2h0OjE1cHg7d2lkdGg6MTVweDtib3JkZXItcmFkaXVzOjUwJX0jYWNjb3VudC1kZXRhaWxzIC5jaGltcC1jaGF0dGVyLXBvc3Rib3guZXZlbnttYXJnaW4tcmlnaHQ6MH0uY2lyY2xlLWFjY291bnQtaW5hY3RpdmV7bWFyZ2luLXRvcDotM3B4O21hcmdpbi1yaWdodDo1cHg7YmFja2dyb3VuZDpyZ2JhKDI1MCwxMzgsMTM4LC43OSl9LmNoYXR0ZXItdHlwZXtmb250LXdlaWdodDo2MDA7Zm9udC1mYW1pbHk6XCJvcGVuIHNhbnNcIjtmb250LXNpemU6MTRweDttYXJnaW46NXB4IDVweCAwfS5jaGF0dGVyLW1lc3NhZ2V7bWFyZ2luOjJweCAycHggMTVweCFpbXBvcnRhbnR9LmNpcmNsZS1hY2NvdW50LWFjdGl2ZXttYXJnaW4tdG9wOi0zcHg7bWFyZ2luLXJpZ2h0OjVweDtiYWNrZ3JvdW5kOnJnYmEoMTI4LDIxNCwxMjgsLjc3KX0jYWNjb3VudC1kZXRhaWxzIC5tYWlsY2hpbXAtYXZhdGFye3dpZHRoOjEyMHB4O2JvcmRlci1yYWRpdXM6MTAlO21hcmdpbi10b3A6LjVlbX0uY2hpbXAtY2hhdHRlci1wb3NpdGl2ZXtib3JkZXItbGVmdDo0cHggc29saWQgIzlkZGY5ZH0uY2hpbXAtY2hhdHRlci1uZWdhdGl2ZXtib3JkZXItbGVmdDo0cHggc29saWQgI0ZCQTJBMn0uY2hpbXAtY2hhdHRlci1uZXV0cmFse2JvcmRlci1sZWZ0OjRweCBzb2xpZCAjYjFiMWIxfSNpbXBvcnQtbGlzdC10by1zaXRle21hcmdpbi10b3A6MTBweH0jaW1wb3J0LWxpc3QtdG8tc2l0ZSAuaW5wdXQtZmllbGR7ZGlzcGxheTpibG9jazt3aWR0aDoxMDAlO21hcmdpbi10b3A6NXB4O21hcmdpbi1ib3R0b206NXB4fS5zaWRlYmFyLWNvbnRhaW5lciwuc3Rhci1jb250YWluZXJ7bWFyZ2luLXRvcDo1cHg7bWFyZ2luLWJvdHRvbToxLjVlbX0jaW1wb3J0LWxpc3QtdG8tc2l0ZSAuZm9ybS1kZXNjcmlwdGlvbntyZXNpemU6dmVydGljYWw7bWF4LWhlaWdodDo2NXB4fSNpbXBvcnQtbGlzdC10by1zaXRlIC5kZXNjcmlwdGlvbnttYXJnaW4tdG9wOjVweH0uc3Rhci1jb250YWluZXIgYXt0ZXh0LWRlY29yYXRpb246bm9uZX0uc3Rhci1jb250YWluZXIgLmRhc2hpY29ucy1zdGFyLWZpbGxlZHtmb250LXNpemU6MS43NWVtfS5zaWRlYmFyLWZvb3Rlci10ZXh0e21hcmdpbjoxNXB4IDAhaW1wb3J0YW50O3RleHQtYWxpZ246Y2VudGVyfS5zaWRlYmFyLXR3aXR0ZXItaWNvbnt0ZXh0LWRlY29yYXRpb246bm9uZTtjb2xvcjojNTVBQ0VFfS5maWVsZC1kb2VzbnQtZXhpc3Qtbm90aWNle3Bvc2l0aW9uOmFic29sdXRlO21hcmdpbi1sZWZ0OjVweDt3aWR0aDoxOHB4fS5maWVsZC10eXBlLXRleHR7ZmxvYXQ6cmlnaHR9LnR5cGUtY29udGFpbmVye21hcmdpbjowfS5mb3JtLWZpZWxkLWNvbnRhaW5lcnttYXJnaW4tdG9wOjA7bWFyZ2luLWJvdHRvbTowfS5maWVsZC1uby1sb25nZXItZXhpc3RzLXdhcm5pbmd7cG9zaXRpb246YWJzb2x1dGU7bWFyZ2luLWxlZnQ6NXB4O3dpZHRoOjE4cHh9LmZvcm0tZmllbGQtY29udGFpbmVyIHRkIGlucHV0W3R5cGU9Y2hlY2tib3hdLC5mb3JtLWZpZWxkLWNvbnRhaW5lciB0ZCBpbnB1dFt0eXBlPXJhZGlvXXttYXJnaW46MCA1cHh9LmZvcm0tZmllbGQtY29udGFpbmVyIHRkIGlucHV0W3R5cGU9Y2hlY2tib3hdOmZpcnN0LWNoaWxkLC5mb3JtLWZpZWxkLWNvbnRhaW5lciB0ZCBpbnB1dFt0eXBlPXJhZGlvXTpmaXJzdC1jaGlsZHttYXJnaW4tbGVmdDowIWltcG9ydGFudH0ubWVyZ2UtdGFnLXRleHR7YmFja2dyb3VuZDowIDA7Ym9yZGVyOm5vbmV9LnByZS1kZWZpbmVkLXRhZy1saW5re2ZvbnQtc2l6ZToxMXB4fS50b2dnbGUtY29udGFpbmVye2ZvbnQtc2l6ZTpzbWFsbDtmbG9hdDpyaWdodH0jcHJlLWRlZmluZWQtdGFnLWNvbnRhaW5lcntkaXNwbGF5Om5vbmV9I3ByZS1kZWZpbmVkLXRhZy1jb250YWluZXIgaDN7bWFyZ2luLWJvdHRvbTowfSNwcmUtZGVmaW5lZC10YWctY29udGFpbmVyIC50b29sdG9wLXRhZyAuZGFzaGljb25zLWVkaXRvci1oZWxwe2ZvbnQtc2l6ZToxM3B4O2xpbmUtaGVpZ2h0OjEuNX0ubm8tZmllbGRzLWFzc2lnbmVkLW5vdGljZXttYXJnaW46NGVtIDAgMi4yNWVtO3BhZGRpbmctYm90dG9tOjZlbTt3aWR0aDoxMDAlO3RleHQtYWxpZ246Y2VudGVyO2JhY2tncm91bmQ6dXJsKC4uLy4uL2luY2x1ZGVzL2ltYWdlcy9uby1mb3JtLWZpZWxkcy1hc3NpZ25lZC1hcnJvdy5qcGcpIGJvdHRvbSBjZW50ZXIgbm8tcmVwZWF0O2JhY2tncm91bmQtc2l6ZToxMDVweH0ueWlrZXMtZWFzeS1tYy13aWRnZXQtcHJlbG9hZGVye3Bvc2l0aW9uOmFic29sdXRlO2xlZnQ6NDglO21hcmdpbi10b3A6LTk2cHh9Lnlpa2VzLWRhc2hib2FyZC13aWRnZXQtc2VjdGlvbntwYWRkaW5nOjAgMTJweCAxMnB4fS5zZWxlY3QtbGlzdC10aXRsZXtwYWRkaW5nLWxlZnQ6MH0ueWlrZXMtZGFzaGJvYXJkLXdpZGdldC1zZWN0aW9uIC5kZXNjcmlwdGlvbnttYXJnaW46LjVlbSAwIDB9LiBlcnJvci1kZXNjcmlwaW9ue3BhZGRpbmctdG9wOi41ZW19Lnlpa2VzLW1jLWZyZWRkaWUtbG9nb3tmbG9hdDpsZWZ0O21hcmdpbi1yaWdodDoxMHB4fS5tdl9pZ19saXN0e3dpZHRoOjk0JTttYXJnaW4tYm90dG9tOjhweCFpbXBvcnRhbnQ7Ym9yZGVyOm5vbmUhaW1wb3J0YW50O2JhY2tncm91bmQ6MCAwIWltcG9ydGFudH0ubXZfaWdfbGlzdCAubGlzdC1jb250YWluZXJ7cG9zaXRpb246YWJzb2x1dGV9Lm12X2lnX2xpc3QgYXt3aWR0aDo0OCU7cGFkZGluZzo1cHggMCFpbXBvcnRhbnQ7dGV4dC1hbGlnbjpjZW50ZXI7bWFyZ2luOjB9Lm12X2lnX2xpc3QgYTpmaXJzdC1jaGlsZHttYXJnaW4tcmlnaHQ6MH0ubXZfaWdfbGlzdCBhOmxhc3QtY2hpbGR7ZmxvYXQ6cmlnaHR9Lm12X2lnX2xpc3QgLm5hdi10YWJ7Ym9yZGVyOjFweCBzb2xpZCAjY2NjfS5tdl9pZ19saXN0IC5uYXYtdGFiLWFjdGl2ZXtjb2xvcjojZmZmO2ZvbnQtd2VpZ2h0OjcwMDtiYWNrZ3JvdW5kOiMwMGEwZDJ9Lm12X2lnX2xpc3QgLmFycm93LWRvd257cG9zaXRpb246YWJzb2x1dGU7bWFyZ2luLXRvcDoyMXB4O21hcmdpbi1sZWZ0OjUwcHg7d2lkdGg6MDtoZWlnaHQ6MDtib3JkZXItbGVmdDoxMnB4IHNvbGlkIHRyYW5zcGFyZW50O2JvcmRlci1yaWdodDoxMnB4IHNvbGlkIHRyYW5zcGFyZW50O2JvcmRlci10b3A6MTJweCBzb2xpZCAjMDBhMGQyfSNjb250YWluZXItY29udGFpbmVye2Rpc3BsYXk6aW5saW5lLWJsb2NrO3dpZHRoOjUyMXB4fSNjb250YWluZXItY29udGFpbmVyIC5saXN0LWNvbnRhaW5lcntmbG9hdDpsZWZ0O3dpZHRoOjI0MHB4O3Bvc2l0aW9uOnJlbGF0aXZlfSNjb250YWluZXItY29udGFpbmVyIC5saXN0LWNvbnRhaW5lcjpsYXN0LWNoaWxke21hcmdpbi1sZWZ0OjJlbX0jeWlrZXNfZWFzeV9tY190b29sYmFye21hcmdpbi10b3A6LS43NWVtfSN5aWtlc19lYXN5X21jX3Rvb2xiYXJfbGlua3N7ZGlzcGxheTppbmxpbmUtYmxvY2s7d2lkdGg6MTAwJTttYXJnaW46MDtwYWRkaW5nOjEwcHggMH0jeWlrZXNfZWFzeV9tY190b29sYmFyX2xpbmtzIGxpe2Zsb2F0OmxlZnQ7bWFyZ2luOjAgLjVlbX0jeWlrZXNfZWFzeV9tY190b29sYmFyX2xpbmtzIGxpIGF7dGV4dC1kZWNvcmF0aW9uOm5vbmU7ZGlzcGxheTppbmxpbmUtYmxvY2t9I3lpa2VzX2Vhc3lfbWNfdG9vbGJhcl9saW5rcyBsaSBhLnNlbGVjdGVkX2hpZGRlbl9zZXR0aW5ne2NvbG9yOiMzMzM7bWFyZ2luLWJvdHRvbTozcHh9I3lpa2VzX2Vhc3lfbWNfdG9vbGJhcl9saW5rcyBsaSAuc2VsZWN0ZWRfc2V0dGluZ190cmlhbmdsZXt3aWR0aDowO2hlaWdodDowO2JvcmRlci1sZWZ0OjEzcHggc29saWQgdHJhbnNwYXJlbnQ7Ym9yZGVyLXJpZ2h0OjEzcHggc29saWQgdHJhbnNwYXJlbnQ7Ym9yZGVyLXRvcDoxM3B4IHNvbGlkIHJnYmEoMjA2LDIwNiwyMDYsMSk7bWFyZ2luOjAgYXV0b30uY2hlY2tib3gtc2V0dGluZ3MtbGlzdC1kcm9wZG93biwub3B0aW4tY2hlY2tib3gtbGFiZWwtaW5wdXR7d2lkdGg6MjUwcHg7ZGlzcGxheTpibG9ja30jeWlrZXNfZWFzeV9tY190b29sYmFyX2xpbmtzIGxpIGEuZm9ybS1idWlsZGVyOmJlZm9yZXtjb250ZW50OlwiXFxmMTE2XCI7Zm9udC1mYW1pbHk6ZGFzaGljb25zfSN5aWtlc19lYXN5X21jX3Rvb2xiYXJfbGlua3MgbGkgYS5mb3JtLWN1c3RvbWl6ZXI6YmVmb3Jle2NvbnRlbnQ6XCJcXGYxMDBcIjtmb250LWZhbWlseTpkYXNoaWNvbnN9I3lpa2VzX2Vhc3lfbWNfdG9vbGJhcl9saW5rcyBsaSBhLmVycm9yLW1lc3NhZ2VzOmJlZm9yZXtjb250ZW50OlwiXFxmMTE3XCI7Zm9udC1mYW1pbHk6ZGFzaGljb25zfSN5aWtlc19lYXN5X21jX3Rvb2xiYXJfbGlua3MgbGkgYS5mb3JtLXNldHRpbmdzOmJlZm9yZXtjb250ZW50OlwiXFxmMTExXCI7Zm9udC1mYW1pbHk6ZGFzaGljb25zfSNjaGVja2JveC1zZXR0aW5ncy1mb3JtIC5kYXNoaWNvbnMtZWRpdG9yLWhlbHB7Zm9udC1zaXplOjE1cHg7bGluZS1oZWlnaHQ6MS42fS5uby1saXN0cy1zZXR1cC1ub3RpY2V7cGFkZGluZzouNWVtIDB9Lnlpa2VzLWZvcm0taWQtbnVtYmVye3dpZHRoOjU1cHh9c3Bhblt0aXRsZT1JbXByZXNzaW9uc106aG92ZXIsc3Bhblt0aXRsZT1TdWJtaXNzaW9uc106aG92ZXIsc3Bhblt0aXRsZT1cIkNvbnZlcnNpb24gUmF0ZVwiXTpob3ZlcntkaXNwbGF5OmJsb2NrO2N1cnNvcjpwb2ludGVyfS5mb3JtLWlkLWNvbnRhaW5lcntwYWRkaW5nOjFweCA4cHg7Ym9yZGVyLXJhZGl1czo1cHg7YmFja2dyb3VuZDojNDlhOWVjO2ZvbnQtd2VpZ2h0OjcwMDtjb2xvcjojZmZmfS5tYW5hZ2UtZm9ybS1hZG1pbi1ub3RpY2V7bWFyZ2luLXRvcDoxLjc1ZW0haW1wb3J0YW50fS5yZW1vdmUtbm90aWZpY2F0aW9uLC55aWtlcy1tYy1zZXR0aW5ncy1leHBhbnNpb24tc2VjdGlvbiBhLnJlbW92ZS1maWVsZCxhLnlpa2VzLWRlbGV0ZS1tYWlsY2hpbXAtZm9ybSxhLnlpa2VzLWRlbGV0ZS1zdWJzY3JpYmVye2NvbG9yOiNkOTYwNjAhaW1wb3J0YW50fS55aWtlcy1kZWxldGUtbWFpbGNoaW1wLWZvcm17bWFyZ2luLXRvcDo2cHh9I3Bvc3Rib3gtY29udGFpbmVyLTEgLnlpa2VzLWRlbGV0ZS1tYWlsY2hpbXAtZm9ybXtmbG9hdDpyaWdodH0uZm9ybS1idXR0b25zLWNvbnRhaW5lcntkaXNwbGF5OmJsb2NrO3BhZGRpbmc6MTFweCAxMHB4fS5mb3Jtcy1idXR0b25zLWNvbnRhaW5lciBpbnB1dFt0eXBlPXN1Ym1pdF17bWFyZ2luOjAgMCAuNWVtfS51cGRhdGUtZm9ybS1zcGlubmVye3Bvc2l0aW9uOmFic29sdXRlO2xlZnQ6MDtyaWdodDowO21hcmdpbjowIGF1dG87Ym90dG9tOjEzcHh9Lnlpa2VzLW1jLXNob3J0Y29kZS1pbnB1dHt0ZXh0LWFsaWduOmNlbnRlcjt3aWR0aDoxMDAlO2NvbG9yOiMzMzN9LmhpZGRlbi1jbGFzc3tkaXNwbGF5Om5vbmUhaW1wb3J0YW50fS5zdGF0LWNvbnRhaW5lcnt3aWR0aDoxMCU7bWF4LXdpZHRoOjc1cHh9Lm5vLWN1cnJlbnQtc3Vic2NyaWJlci1ub3RpY2UgZW0sLm5vLW1haWxjaGltcC1mb3Jtcy1mb3VuZCBlbXtwYWRkaW5nOjI1cHggMCAyNXB4IDI1cHh9LmNvbHVtbi1jb2x1bW5uYW1lIHNwYW4uc3RhdHN7ZGlzcGxheTpibG9jazt3aWR0aDoxMDAlO3RleHQtYWxpZ246Y2VudGVyfS5jb2x1bW4tY29sdW1ubmFtZSBzcGFuLnN0YXRzIHNwYW57ZGlzcGxheTppbmxpbmUtYmxvY2s7d2lkdGg6MjAlfS5jb2x1bW4tY29sdW1ubmFtZSBzcGFuLnN0YXRzIHNwYW46aG92ZXJ7Y3Vyc29yOnBvaW50ZXJ9I2F2YWlsYWJsZS1maWVsZHMgbGksI2F2YWlsYWJsZS1pbnRlcmVzdC1ncm91cHMgbGl7dGV4dC1kZWNvcmF0aW9uOm5vbmU7ZGlzcGxheTpibG9jaztib3JkZXI6MXB4IHNvbGlkIHJnYmEoMTc3LDE3NywxNzcsLjcxKTtjb2xvcjojMzMzO3BhZGRpbmc6NXB4O21hcmdpbjouNWVtIDB9I2F2YWlsYWJsZS1maWVsZHMgbGkubm90LWF2YWlsYWJsZSwjYXZhaWxhYmxlLWludGVyZXN0LWdyb3VwcyBsaS5ub3QtYXZhaWxhYmxle29wYWNpdHk6LjYhaW1wb3J0YW50fSNhdmFpbGFibGUtZmllbGRzIGxpLmZpZWxkLXRvLWFkZC10by1mb3JtLCNhdmFpbGFibGUtaW50ZXJlc3QtZ3JvdXBzIGxpLmdyb3VwLXRvLWFkZC10by1mb3Jte2JhY2tncm91bmQ6cmdiYSg0NiwxNjIsMjA0LC4yNSl9LmFkZC1maWVsZC10by1lZGl0b3IgLmFkZC10by1mb3JtLWJ1aWxkZXItYXJyb3csLmJ1dHRvbi1zZWNvbmRhcnkgLmFkZC10by1mb3JtLWJ1aWxkZXItYXJyb3d7d2lkdGg6MTVweDtmb250LXNpemU6MTVweDtsaW5lLWhlaWdodDoxLjh9LmNsZWFyLWZvcm0tZmllbGRze2JhY2tncm91bmQ6I2UxNGQ0Mztib3JkZXItY29sb3I6I2QwMmMyMTtjb2xvcjojZmZmO2JveC1zaGFkb3c6aW5zZXQgMCAxcHggMCAjZWM4Yjg1LDAgMXB4IDAgcmdiYSgwLDAsMCwuMTUpO3RleHQtZGVjb3JhdGlvbjpub25lO2Rpc3BsYXk6aW5saW5lLWJsb2NrO2hlaWdodDoyOHB4O3BhZGRpbmc6MCAxMHB4IDFweDtib3JkZXItd2lkdGg6MXB4Oy13ZWJraXQtYXBwZWFyYW5jZTpub25lO2JvcmRlci1yYWRpdXM6M3B4O3doaXRlLXNwYWNlOm5vd3JhcDtmb250LXNpemU6MTNweDtsaW5lLWhlaWdodDoyNnB4O2JveC1zaXppbmc6Ym9yZGVyLWJveDstd2Via2l0LWJveC1zaXppbmc6Ym9yZGVyLWJveDstbW96LWJveC1zaXppbmc6Ym9yZGVyLWJveDtmbG9hdDpyaWdodDttYXJnaW46MCAxMXB4IDEwcHggMH0uY2xlYXItZm9ybS1maWVsZHM6YWN0aXZlLC5jbGVhci1mb3JtLWZpZWxkczpmb2N1cywuY2xlYXItZm9ybS1maWVsZHM6aG92ZXJ7YmFja2dyb3VuZDojZGQzODJkO2JvcmRlci1jb2xvcjojYmEyODFlO2NvbG9yOiNmZmY7Ym94LXNoYWRvdzppbnNldCAwIDFweCAwICNlODc3NmZ9Lnlpa2VzLW1jLXZpZXctbGlzdC1icmVhZGNydW1ic3twYWRkaW5nOi44ZW07Ym9yZGVyOjFweCBzb2xpZCAjRDhEOEQ4O2JhY2tncm91bmQ6I0VDRUNFQzttYXJnaW46MS41ZW0gMCAuOGVtfS55aWtlcy1tYy1tZW1iZXItcmF0aW5nLXN0YXJ7Y29sb3I6I2RhYTUyMH0jeWlrZXMtbWMtc3Vic2NyaWJlci1jYXJkLXdyYXBwZXJ7YmFja2dyb3VuZDojZmVmZWZlO21pbi1oZWlnaHQ6MjAwcHg7ZGlzcGxheTppbmxpbmUtYmxvY2s7Ym94LXNoYWRvdzowIDFweCAxcHggcmdiYSgwLDAsMCwuMDQpO3dlYmtpdC1ib3gtc2hhZG93OjAgMXB4IDFweCByZ2JhKDAsMCwwLC4wNCk7Ym9yZGVyOjFweCBzb2xpZCAjZTVlNWU1O3BhZGRpbmc6MTVweCAyMHB4O3dpZHRoOjUwMHB4O2Zsb2F0OmxlZnR9I3lpa2VzLW1jLXN1YnNjcmliZXItY2FyZC13cmFwcGVyIC5zdWJzY3JpYmVyLW9wdGluLWlwe2Rpc3BsYXk6aW5saW5lLWJsb2NrO21hcmdpbjoxZW0gMCAwO2ZvbnQtc3R5bGU6aXRhbGljfS52aWV3LXVzZXItZGF0YS13cmFwICNjdXN0b21lci10YWItd3JhcHBlci1saXN0e2Zsb2F0OmxlZnQ7YmFja2dyb3VuZDojZmVmZWZlO21hcmdpbi10b3A6MDtwYWRkaW5nOjEycHg7bWFyZ2luLWxlZnQ6LTFweDtib3JkZXItcmlnaHQ6MXB4IHNvbGlkICNlNWU1ZTU7Ym9yZGVyLXRvcDoxcHggc29saWQgI2U1ZTVlNTtib3JkZXItYm90dG9tOjFweCBzb2xpZCAjZTVlNWU1fS52aWV3LXVzZXItZGF0YS13cmFwICNjdXN0b21lci10YWItd3JhcHBlci1saXN0IC5kYXNoaWNvbnN7Zm9udC1zaXplOjIzcHg7aGVpZ2h0OjIzcHg7d2lkdGg6MjNweDttYXJnaW46M3B4IDB9LnZpZXctdXNlci1kYXRhLXdyYXAgI2N1c3RvbWVyLXRhYi13cmFwcGVyLWxpc3QgbGkuaW5hY3RpdmV7Y29sb3I6cmdiYSg1MSw1MSw1MSwuMzEpO3RyYW5zaXRpb246Y29sb3IgZWFzZS1vdXQgLjFzfS52aWV3LXVzZXItZGF0YS13cmFwICNjdXN0b21lci10YWItd3JhcHBlci1saXN0IGxpLmFjdGl2ZSwudmlldy11c2VyLWRhdGEtd3JhcCAjY3VzdG9tZXItdGFiLXdyYXBwZXItbGlzdCBsaS5pbmFjdGl2ZTpob3Zlcntjb2xvcjpyZ2JhKDUxLDUxLDUxLDEpfSN5aWtlcy1tYy1zdWJzY3JpYmVyLWNhcmQtd3JhcHBlciAueWlrZXMtbWMtY2FyZC10b3AgLm1lbWJlci1zdGFyLXJhdGluZy1jb250YWluZXIsI3lpa2VzLW1jLXN1YnNjcmliZXItY2FyZC13cmFwcGVyIC55aWtlcy1tYy1jYXJkLXRvcCBoMiwjeWlrZXMtbWMtc3Vic2NyaWJlci1jYXJkLXdyYXBwZXIgLnlpa2VzLW1jLWNhcmQtdG9wIGltZ3tmbG9hdDpsZWZ0fSN5aWtlcy1tYy1zdWJzY3JpYmVyLWNhcmQtd3JhcHBlciAjZGVsZXRlLW1haWxjaGltcC1zdWJzY3JpYmVye2Rpc3BsYXk6YmxvY2s7bWFyZ2luOjAgYXV0b30jeWlrZXMtbWMtc3Vic2NyaWJlci1jYXJkLXdyYXBwZXIgLnlpa2VzLW1jLWNhcmQtdG9wIGltZ3tib3JkZXItcmFkaXVzOjNweH0jeWlrZXMtbWMtc3Vic2NyaWJlci1jYXJkLXdyYXBwZXIgLm1lcmdlLXZhcmlhYmxlLXNlY3Rpb24gbGl7ZGlzcGxheTppbmxpbmUtYmxvY2s7bGlzdC1zdHlsZTpub25lO2Zsb2F0OmxlZnQ7d2lkdGg6NTAlO21pbi1oZWlnaHQ6NjVweDtib3JkZXItYm90dG9tOjFweCBkb3R0ZWQgI2RkZH0jeWlrZXMtbWMtc3Vic2NyaWJlci1jYXJkLXdyYXBwZXIgLm1lcmdlLXZhcmlhYmxlLXNlY3Rpb24gbGkgcHttYXJnaW46MCAwIDFlbX0jeWlrZXMtbWMtc3Vic2NyaWJlci1jYXJkLXdyYXBwZXIgLnlpa2VzLW1jLWNhcmQtdG9wIGgye21heC13aWR0aDozNzBweDt3aWR0aDo3NSU7cGFkZGluZzowfSN5aWtlcy1tYy1zdWJzY3JpYmVyLWNhcmQtd3JhcHBlciAubWVtYmVyLXN0YXItcmF0aW5nLWNvbnRhaW5lcntkaXNwbGF5OmJsb2NrO21hcmdpbjouNWVtIDAgLjVlbSAxMHB4fSN5aWtlcy1tYy1zdWJzY3JpYmVyLWNhcmQtd3JhcHBlciBoMnttYXJnaW4tbGVmdDoxMHB4O21hcmdpbi10b3A6MDtwYWRkaW5nLXRvcDowfSN5aWtlcy1tYy1zdWJzY3JpYmVyLWNhcmQtd3JhcHBlciAueWlrZXMtbWMtY2FyZC1ib2R5LCN5aWtlcy1tYy1zdWJzY3JpYmVyLWNhcmQtd3JhcHBlciAueWlrZXMtbWMtY2FyZC10b3B7ZGlzcGxheTppbmxpbmUtYmxvY2s7d2lkdGg6MTAwJX0ubWVtYmVyLWxvY2F0aW9uLWRhdGEsLm1lbWJlci1zdWJzY3JpcHRpb24tZGF0ZXt3aWR0aDo3MCU7bWF4LXdpZHRoOjM3MHB4O2Rpc3BsYXk6YmxvY2s7ZmxvYXQ6bGVmdH0jeWlrZXMtbWMtc3Vic2NyaWJlci1jYXJkLXdyYXBwZXIgLnlpa2VzLW1jLWNhcmQtYm9keSBoNHttYXJnaW4tdG9wOjA7bWFyZ2luLWxlZnQ6NXB4fS55aWtlcy1tYy1zdWJzY3JpYmVyLWhye21hcmdpbjoxLjVlbSAwfS5tZW1iZXItc3Vic2NyaXB0aW9uLWRhdGV7bWFyZ2luOi41ZW0gMCAuNWVtIDEwcHh9Lm1lbWJlci1sb2NhdGlvbi1kYXRhe21hcmdpbjouMjVlbSAwIC4yNWVtIDEwcHh9LmFkZG9uLXJlcXVpcmVkLWxpbmt7Y29sb3I6IzMzMztvcGFjaXR5Oi41fS52aWV3LWxpc3Qtc2lkZWJhci1pbnB1dHtjb2xvcjojMzMzfS5pbnRlcmVzdC1ncm91cC11bCwubWVyZ2UtdmFyaWFibGUtdWwsLnNlZ21lbnQtdWx7cGFkZGluZy1sZWZ0OjE1cHg7Zm9udC1zaXplOjE0cHh9LmludGVyZXN0LWdyb3VwLXVsIGxpIC5kYXNoaWNvbnMsLm1lcmdlLXZhcmlhYmxlLXVsIGxpIC5kYXNoaWNvbnN7bGluZS1oZWlnaHQ6MS44O2ZvbnQtc2l6ZTo5cHh9YS5idXR0b24tcHJpbWFyeS5lZGl0LWZpZWxkcy1idXR0b257bWFyZ2luOjAgMCAxMHB4IDE1cHh9LmludGVyZXN0LWdyb3VwLWNvdW50LC5tZXJnZS12YXJpYWJsZS1jb3VudCwuc2VnbWVudC1ncm91cC1jb3VudHt0ZXh0LWRlY29yYXRpb246dW5kZXJsaW5lO21hcmdpbi1ib3R0b206Ljc1ZW07cGFkZGluZy1sZWZ0OjdweH1ib2R5LmFkbWluX3BhZ2VfeWlrZXMtbWFpbGNoaW1wLWVkaXQtZm9ybSAudWktZGF0ZXBpY2tlciAudWktZGF0ZXBpY2tlci1jYWxlbmRhciB0ZCBhLGJvZHkuYWRtaW5fcGFnZV95aWtlcy1tYWlsY2hpbXAtZWRpdC1mb3JtIC51aS1kYXRlcGlja2VyIGEsYm9keS5hZG1pbl9wYWdlX3lpa2VzLW1haWxjaGltcC1lZGl0LWZvcm0gLnVpLWRhdGVwaWNrZXIgYTpob3Zlcnt0ZXh0LWRlY29yYXRpb246bm9uZX0uaW50ZXJlc3QtZ3JvdXAtdGl0bGV7cGFkZGluZy1sZWZ0OjVweH0uZWRpdC1zZWdtZW50cy1idXR0b257bWFyZ2luOjAgMCAxMHB4IDE1cHh9LmVkaXQtc2VnbWVudC1kZXNjcmlwdGlvbntwYWRkaW5nOjAgMCAxMHB4IDE1cHh9I2NyZWRpdC1jb250YWluZXJ7bWFyZ2luLXRvcDoxLjVlbX0ueWlrZXMtZWFzeS1tYWlsY2hpbXAtY3VzdG9tLWNvbnRlbnQtaWNvbntmb250LXNpemU6MTVweDtsaW5lLWhlaWdodDoxfS5jdXN0b20tZmllbGQtc2VjdGlvbntkaXNwbGF5OmJsb2NrO21hcmdpbjoxZW0gMH0jYXNzb2NpYXRlZC1saXN0e3dpZHRoOjEwMCU7bWFyZ2luLXRvcDo1cHh9I3JlZGlyZWN0LXVzZXItdG8tc2VsZWN0aW9ue3dpZHRoOjEwMCV9I2VkaXQteWlrZXMtbWMtZm9ybSBsYWJlbCBoM3ttYXJnaW4tbGVmdDowO3BhZGRpbmctbGVmdDowfSNhdmFpbGFibGUtZmllbGRzIC5maWVsZC1yZXF1aXJlZHtjb2xvcjojZDk2MDYwIWltcG9ydGFudH1ib2R5LmFkbWluX3BhZ2VfeWlrZXMtbWFpbGNoaW1wLWVkaXQtZm9ybSAjcG9zdHN0dWZmIGgye3BhZGRpbmc6OHB4IDEycHg7bWFyZ2luLXRvcDowfS5lZGl0LWZvcm0tZm9ybS1kZXNjcmlwdGlvbnt3aWR0aDoxMDAlO3Jlc2l6ZTp2ZXJ0aWNhbDttaW4taGVpZ2h0OjY1cHg7bWF4LWhlaWdodDoxMDBweH0uZWRpdC1mb3JtLXRpdGxle3BhZGRpbmctbGVmdDoxMnB4IWltcG9ydGFudH0jZWRpdC1mb3JtLWRlc2NyaXB0aW9ue3BhZGRpbmc6MCAxMnB4O21hcmdpbjoxZW0gMH0ueWlrZXMtZWFzeS1tYy1wb3N0Ym94e292ZXJmbG93OmhpZGRlbn0ubm8taW50ZXJlc3QtZ3JvdXBzLWZvdW5kLW1lc3NhZ2V7b3BhY2l0eTouMzV9LnVwZ3JhZGluZy1lbGxpcHNlLW9uZSwudXBncmFkaW5nLWVsbGlwc2UtdHdvey1tcy1maWx0ZXI6XCJwcm9naWQ6RFhJbWFnZVRyYW5zZm9ybS5NaWNyb3NvZnQuQWxwaGEoT3BhY2l0eT0wKVwiOy1tb3otb3BhY2l0eTowOy13ZWJraXQtYW5pbWF0aW9uOmRvdCAxLjNzIGluZmluaXRlfSNpbnRlcmVzdC1ncm91cHMtY29udGFpbmVyIC5kZXNjcmlwdGlvbiwjbWVyZ2UtdmFyaWFibGVzLWNvbnRhaW5lciAuZGVzY3JpcHRpb257cGFkZGluZy10b3A6LjVlbX0uaW5zaWRlLXNlY3Rpb24tMXttYXJnaW4tdG9wOjA7bWFyZ2luLWJvdHRvbToxLjVlbX0uaW5zaWRlLXNlY3Rpb24tMnttYXJnaW4tdG9wOjA7bWFyZ2luLWJvdHRvbToyZW19LmZvcm0tZmllbGQtY29udGFpbmVyLXNwYW57ZGlzcGxheTpibG9jazttYXJnaW46LjVlbSAwfSNzdHlsZS1saXN0IHVsIGxpe2Rpc3BsYXk6YmxvY2s7d2lkdGg6MTAwJTttYXJnaW46MWVtIDB9LmZvcm0tc3R5bGUtYWRqdXN0bWVudCwud3AtcGlja2VyLWNvbnRhaW5lcntkaXNwbGF5OmJsb2NrIWltcG9ydGFudDt3aWR0aDoxMDAlO21hcmdpbjouNWVtIDB9LmR5bmFtaWMtZW1haWwtdGFne2Rpc3BsYXk6aW5saW5lLWJsb2NrO21hcmdpbi1yaWdodDo1cHh9LmR5bmFtaWMtdGFnLWRlc2NyaXB0aW9uIHRke3BhZGRpbmctdG9wOjB9I2NyZWF0ZS1uZXctbm90aWZpY2F0aW9uLWJ1dHRvbnttYXJnaW4tdG9wOjFlbX0uZmlsZS1jb250YWluZXJ7ZGlzcGxheTpub25lfS55aWtlcy1tYWlsY2hpbXAtZmlsZS1maWVsZCBpbnB1dFtuYW1lKj1cImN1c3RvbS1maWVsZFtpbmNlbnRpdmUtYXR0YWNobWVudF1cIl17bWFyZ2luLWJvdHRvbTouNWVtfS55aWtlcy1tYWlsY2hpbXAtZmlsZS1maWVsZCBpbnB1dFtuYW1lKj1cImN1c3RvbS1maWVsZFtpbmNlbnRpdmUtYXR0YWNobWVudF1cIl0rLmJ1dHRvbi1zZWNvbmRhcnl7bWFyZ2luLWxlZnQ6NHB4fWlucHV0I3VwbG9hZC1idG5bZGF0YS1hdHRyLXBvc2l0aW9uPVwiMVwiXXttYXJnaW4tbGVmdDowfS5yZW1vdmUtZmlsZS1idXR0b257YmFja2dyb3VuZDp1cmwoLi4vcGFydGlhbHMvaGVscGVycy9maWVsZHMvaW1nL2ljb24tZGVsZXRlLnBuZyk7aGVpZ2h0OjE2cHg7cG9zaXRpb246YWJzb2x1dGU7dGV4dC1pbmRlbnQ6LTk5OTk5cHg7d2lkdGg6MTZweH1hLmFkZC1uZXctaW5jZW50aXZlLWF0dGFjaG1lbnR7ZGlzcGxheTpibG9jazt3aWR0aDo0MHB4O21hcmdpbi1yaWdodDoxMDAlIWltcG9ydGFudDttYXJnaW4tdG9wOi41ZW0haW1wb3J0YW50fWEuYWRkLW5ldy1pbmNlbnRpdmUtYXR0YWNobWVudCAuZGFzaGljb25ze2ZvbnQtc2l6ZToxNXB4O2xpbmUtaGVpZ2h0OjEuOH0uZm9ybS1idWlsZGVyLXBsYWNlaG9sZGVye2JhY2tncm91bmQ6cmdiYSgyMDYsMjA2LDIwNiwuMik7aGVpZ2h0OjMwcHh9LmFkbWluX3BhZ2VfeWlrZXMtbWFpbGNoaW1wLWVkaXQtZm9ybSAjZm9ybS1zZXR0aW5ncyAuc2VjdGlvbi10aXRsZXtmb250LXNpemU6MWVtO2JvcmRlci1ib3R0b206MXB4IHNvbGlkIHJnYmEoMTg3LDE4NywxODcsLjI5KTtkaXNwbGF5OmJsb2NrO3dpZHRoOjEwMCU7cGFkZGluZy1ib3R0b206NnB4O21hcmdpbi1ib3R0b206LjVlbTttYXJnaW4tdG9wOjEuNWVtfS5hZG1pbl9wYWdlX3lpa2VzLW1haWxjaGltcC1lZGl0LWZvcm0gI2Zvcm0tc2V0dGluZ3MgLnNlY3Rpb24taW50ZXJpb3IgbGFiZWwsLmFkbWluX3BhZ2VfeWlrZXMtbWFpbGNoaW1wLWVkaXQtZm9ybSAjZm9ybS1zZXR0aW5ncyAuc2VjdGlvbi10aXRsZS5maXJzdHttYXJnaW4tdG9wOjB9LmFkbWluX3BhZ2VfeWlrZXMtbWFpbGNoaW1wLWVkaXQtZm9ybSAjZm9ybS1zZXR0aW5ncyAuc2VjdGlvbi1pbnRlcmlvcntkaXNwbGF5OmlubGluZS1ibG9jazt3aWR0aDoxMDAlO2JveC1zaXppbmc6Ym9yZGVyLWJveDstd2Via2l0LWJveC1zaXppbmc6Ym9yZGVyLWJveDstbW96LWJveC1zaXppbmc6Ym9yZGVyLWJveDtiYWNrZ3JvdW5kOnJnYmEoMjQxLDI0MSwyNDEsLjc1KTtwYWRkaW5nOjFlbX1sYWJlbC5sb2dpbi1yZXN0cmljdGlvbi1jZW50ZXJ7ZGlzcGxheTpibG9jazt3aWR0aDoxMDAlfS5hZG1pbl9wYWdlX3lpa2VzLW1haWxjaGltcC1lZGl0LWZvcm0gI2Zvcm0tc2V0dGluZ3MgLnNlY3Rpb24taW50ZXJpb3IgLmRhdGUtcmVzdGlyY3Rpb24tc2VjdGlvbntkaXNwbGF5OmlubGluZS1ibG9ja30uYWRtaW5fcGFnZV95aWtlcy1tYWlsY2hpbXAtZWRpdC1mb3JtICNmb3JtLXNldHRpbmdzIC5zZWN0aW9uLWludGVyaW9yIC5kYXRlLXJlc3RpcmN0aW9uLXNlY3Rpb24gcC5kZXNjcmlwdGlvbi5lcnJvcntjb2xvcjojRjU2MDYwfS5hZG1pbl9wYWdlX3lpa2VzLW1haWxjaGltcC1lZGl0LWZvcm0gI2Zvcm0tc2V0dGluZ3MgLnNlY3Rpb24taW50ZXJpb3IgLmRhdGUtcmVzdGlyY3Rpb24tc2VjdGlvbiBsYWJlbHtmbG9hdDpsZWZ0O21hcmdpbi1yaWdodDouNWVtO21hcmdpbi10b3A6MDttYXJnaW4tYm90dG9tOjB9LmFkbWluX3BhZ2VfeWlrZXMtbWFpbGNoaW1wLWVkaXQtZm9ybSAjZm9ybS1zZXR0aW5ncyAuc2VjdGlvbi1pbnRlcmlvciAubmVzdGVkLWNoaWxkIC55aWtlcy1lYXN5LW1jLWZvcm0tcmVzdHJpY3Rpb24tZXhwaXJlZC1tZXNzYWdlLC5hZG1pbl9wYWdlX3lpa2VzLW1haWxjaGltcC1lZGl0LWZvcm0gI2Zvcm0tc2V0dGluZ3MgLnNlY3Rpb24taW50ZXJpb3IgLm5lc3RlZC1jaGlsZCAueWlrZXMtZWFzeS1tYy1mb3JtLXJlc3RyaWN0aW9uLWxvZ2luLW1lc3NhZ2UsLmFkbWluX3BhZ2VfeWlrZXMtbWFpbGNoaW1wLWVkaXQtZm9ybSAjZm9ybS1zZXR0aW5ncyAuc2VjdGlvbi1pbnRlcmlvciAubmVzdGVkLWNoaWxkIC55aWtlcy1lYXN5LW1jLWZvcm0tcmVzdHJpY3Rpb24tcGVuZGluZy1tZXNzYWdle2Rpc3BsYXk6YmxvY2s7d2lkdGg6MTAwJTttaW4taGVpZ2h0OjUwcHh9LmFkbWluX3BhZ2VfeWlrZXMtbWFpbGNoaW1wLWVkaXQtZm9ybSAjZm9ybS1zZXR0aW5ncyAuc2VjdGlvbi1pbnRlcmlvciAubmVzdGVkLWNoaWxke2Zsb2F0OmxlZnQ7cGFkZGluZy1sZWZ0OjIlO3dpZHRoOjk4JTtib3JkZXItbGVmdDoxcHggZGFzaGVkICNCREJEQkQ7Ym9yZGVyLXNwYWNpbmc6MnB4O21hcmdpbjouNWVtIDAgMWVtfS5hZG1pbl9wYWdlX3lpa2VzLW1haWxjaGltcC1lZGl0LWZvcm0gI2Zvcm0tc2V0dGluZ3MgLnNlY3Rpb24taW50ZXJpb3IgLm5lc3RlZC1jaGlsZCAueWlrZXMtZWFzeS1tYy1zdWJtaXQtYnV0dG9uLXRleHR7bWFyZ2luOjB9LmFkbWluX3BhZ2VfeWlrZXMtbWFpbGNoaW1wLWVkaXQtZm9ybSAjZm9ybS1zZXR0aW5ncyAuc2VjdGlvbi1pbnRlcmlvciAuZGF0ZS1yZXN0aXJjdGlvbi1zZWN0aW9ue21hcmdpbi1ib3R0b206MH0uYWRtaW5fcGFnZV95aWtlcy1tYWlsY2hpbXAtZWRpdC1mb3JtICNmb3JtLXNldHRpbmdzIC5zZWN0aW9uLWludGVyaW9yIC5kYXRlLXJlc3RpcmN0aW9uLXNlY3Rpb24ubGFzdHttYXJnaW4tYm90dG9tOi43NWVtfS5hZG1pbl9wYWdlX3lpa2VzLW1haWxjaGltcC1lZGl0LWZvcm0gI2Zvcm0tc2V0dGluZ3MgLnNlY3Rpb24taW50ZXJpb3IgLm5lc3RlZC1jaGlsZC5oaWRkZW57ZGlzcGxheTpub25lfS5hZG1pbl9wYWdlX3lpa2VzLW1haWxjaGltcC1lZGl0LWZvcm0gI2Zvcm0tc2V0dGluZ3MgLnNlY3Rpb24taW50ZXJpb3IgLmRlc2NyaXB0aW9uK2xhYmVse21hcmdpbi10b3A6MWVtO2Zsb2F0OmxlZnQ7d2lkdGg6MTAwJX0uYWRtaW5fcGFnZV95aWtlcy1tYWlsY2hpbXAtZWRpdC1mb3JtICNmb3JtLXNldHRpbmdzIC5zZWN0aW9uLWludGVyaW9yIGxhYmVsLmlubGluZS1mb3JtLWxhYmVse21hcmdpbi1ib3R0b206MDttYXJnaW4tdG9wOjB9LmFkbWluX3BhZ2VfeWlrZXMtbWFpbGNoaW1wLWVkaXQtZm9ybSAjZm9ybS1zZXR0aW5ncyAuc2VjdGlvbi1pbnRlcmlvciAuZGVzY3JpcHRpb257ZGlzcGxheTpibG9jazt3aWR0aDoxMDAlO2Zsb2F0OmxlZnR9LmFkbWluX3BhZ2VfeWlrZXMtbWFpbGNoaW1wLWVkaXQtZm9ybSAjZm9ybS1zZXR0aW5ncyAubmVzdGVkLWNoaWxkIHN0cm9uZzpmaXJzdC1jaGlsZCwuYWRtaW5fcGFnZV95aWtlcy1tYWlsY2hpbXAtZWRpdC1mb3JtICNmb3JtLXNldHRpbmdzIC5zZWN0aW9uLWludGVyaW9yIHN0cm9uZzpmaXJzdC1jaGlsZHtkaXNwbGF5OmJsb2NrO3dpZHRoOjEwMCV9LmFkbWluX3BhZ2VfeWlrZXMtbWFpbGNoaW1wLWVkaXQtZm9ybSAjZm9ybS1zZXR0aW5ncyAuaW5saW5lLWZvcm0tbGFiZWx7ZmxvYXQ6bGVmdDttYXJnaW4tcmlnaHQ6MTBweH1ib2R5LmFkbWluX3BhZ2VfeWlrZXMtbWFpbGNoaW1wLWVkaXQtZm9ybSAudWktdGltZXBpY2tlci13cmFwcGVye292ZXJmbG93LXk6YXV0bztoZWlnaHQ6MTUwcHg7d2lkdGg6MTcwcHg7YmFja2dyb3VuZDojZmZmO2JvcmRlcjoxcHggc29saWQgI2RkZDtib3gtc2hhZG93OjAgNXB4IDEwcHggcmdiYSgwLDAsMCwuMik7b3V0bGluZTowO3otaW5kZXg6MTAwMDE7bWFyZ2luOjB9Ym9keS5hZG1pbl9wYWdlX3lpa2VzLW1haWxjaGltcC1lZGl0LWZvcm0gLnVpLXRpbWVwaWNrZXItd3JhcHBlci51aS10aW1lcGlja2VyLXdpdGgtZHVyYXRpb257d2lkdGg6MTNlbX1ib2R5LmFkbWluX3BhZ2VfeWlrZXMtbWFpbGNoaW1wLWVkaXQtZm9ybSAudWktdGltZXBpY2tlci13cmFwcGVyLnVpLXRpbWVwaWNrZXItd2l0aC1kdXJhdGlvbi51aS10aW1lcGlja2VyLXN0ZXAtMzAsYm9keS5hZG1pbl9wYWdlX3lpa2VzLW1haWxjaGltcC1lZGl0LWZvcm0gLnVpLXRpbWVwaWNrZXItd3JhcHBlci51aS10aW1lcGlja2VyLXdpdGgtZHVyYXRpb24udWktdGltZXBpY2tlci1zdGVwLTYwe3dpZHRoOjExZW19Ym9keS5hZG1pbl9wYWdlX3lpa2VzLW1haWxjaGltcC1lZGl0LWZvcm0gLnVpLXRpbWVwaWNrZXItbGlzdHttYXJnaW46MDtwYWRkaW5nOjA7bGlzdC1zdHlsZTpub25lfWJvZHkuYWRtaW5fcGFnZV95aWtlcy1tYWlsY2hpbXAtZWRpdC1mb3JtIC51aS10aW1lcGlja2VyLWR1cmF0aW9ue21hcmdpbi1sZWZ0OjVweDtjb2xvcjojODg4fWJvZHkuYWRtaW5fcGFnZV95aWtlcy1tYWlsY2hpbXAtZWRpdC1mb3JtIC51aS10aW1lcGlja2VyLWxpc3Q6aG92ZXIgLnVpLXRpbWVwaWNrZXItZHVyYXRpb257Y29sb3I6Izg4OH1ib2R5LmFkbWluX3BhZ2VfeWlrZXMtbWFpbGNoaW1wLWVkaXQtZm9ybSAudWktdGltZXBpY2tlci1saXN0IGxpe3BhZGRpbmc6M3B4IDAgM3B4IDVweDtjdXJzb3I6cG9pbnRlcjt3aGl0ZS1zcGFjZTpub3dyYXA7Y29sb3I6IzAwMDtsaXN0LXN0eWxlOm5vbmU7bWFyZ2luOjB9Ym9keS5hZG1pbl9wYWdlX3lpa2VzLW1haWxjaGltcC1lZGl0LWZvcm0gLnVpLXRpbWVwaWNrZXItbGlzdDpob3ZlciAudWktdGltZXBpY2tlci1zZWxlY3RlZHtiYWNrZ3JvdW5kOiNmZmY7Y29sb3I6IzAwMH1ib2R5LmFkbWluX3BhZ2VfeWlrZXMtbWFpbGNoaW1wLWVkaXQtZm9ybSAudWktdGltZXBpY2tlci1saXN0IC51aS10aW1lcGlja2VyLXNlbGVjdGVkOmhvdmVyLGJvZHkuYWRtaW5fcGFnZV95aWtlcy1tYWlsY2hpbXAtZWRpdC1mb3JtIC51aS10aW1lcGlja2VyLWxpc3QgbGk6aG92ZXIsYm9keS5hZG1pbl9wYWdlX3lpa2VzLW1haWxjaGltcC1lZGl0LWZvcm0gbGkudWktdGltZXBpY2tlci1zZWxlY3RlZHtiYWNrZ3JvdW5kOiMxOTgwRUM7Y29sb3I6I2ZmZn1ib2R5LmFkbWluX3BhZ2VfeWlrZXMtbWFpbGNoaW1wLWVkaXQtZm9ybSAudWktdGltZXBpY2tlci1saXN0IGxpOmhvdmVyIC51aS10aW1lcGlja2VyLWR1cmF0aW9uLGJvZHkuYWRtaW5fcGFnZV95aWtlcy1tYWlsY2hpbXAtZWRpdC1mb3JtIGxpLnVpLXRpbWVwaWNrZXItc2VsZWN0ZWQgLnVpLXRpbWVwaWNrZXItZHVyYXRpb257Y29sb3I6I2NjY31ib2R5LmFkbWluX3BhZ2VfeWlrZXMtbWFpbGNoaW1wLWVkaXQtZm9ybSAudWktdGltZXBpY2tlci1saXN0IGxpLnVpLXRpbWVwaWNrZXItZGlzYWJsZWQsYm9keS5hZG1pbl9wYWdlX3lpa2VzLW1haWxjaGltcC1lZGl0LWZvcm0gLnVpLXRpbWVwaWNrZXItbGlzdCBsaS51aS10aW1lcGlja2VyLWRpc2FibGVkOmhvdmVyLGJvZHkuYWRtaW5fcGFnZV95aWtlcy1tYWlsY2hpbXAtZWRpdC1mb3JtIC51aS10aW1lcGlja2VyLWxpc3QgbGkudWktdGltZXBpY2tlci1zZWxlY3RlZC51aS10aW1lcGlja2VyLWRpc2FibGVke2NvbG9yOiM4ODg7Y3Vyc29yOmRlZmF1bHR9Ym9keS5hZG1pbl9wYWdlX3lpa2VzLW1haWxjaGltcC1lZGl0LWZvcm0gLnVpLXRpbWVwaWNrZXItbGlzdCBsaS51aS10aW1lcGlja2VyLWRpc2FibGVkOmhvdmVyLGJvZHkuYWRtaW5fcGFnZV95aWtlcy1tYWlsY2hpbXAtZWRpdC1mb3JtIC51aS10aW1lcGlja2VyLWxpc3QgbGkudWktdGltZXBpY2tlci1zZWxlY3RlZC51aS10aW1lcGlja2VyLWRpc2FibGVke2JhY2tncm91bmQ6I2YyZjJmMn1ib2R5LmFkbWluX3BhZ2VfeWlrZXMtbWFpbGNoaW1wLWVkaXQtZm9ybSAudWktZGF0ZXBpY2tlcntiYWNrZ3JvdW5kLWNvbG9yOiNmZmY7Ym9yZGVyOjFweCBzb2xpZCAjNjZBRkU5O2JvcmRlci1yYWRpdXM6NHB4O2JveC1zaGFkb3c6MCAwIDhweCByZ2JhKDEwMiwxNzUsMjMzLC42KTtkaXNwbGF5Om5vbmU7bWFyZ2luLXRvcDo0cHg7cGFkZGluZzoxMHB4O3dpZHRoOjI0MHB4fWJvZHkuYWRtaW5fcGFnZV95aWtlcy1tYWlsY2hpbXAtZWRpdC1mb3JtIC51aS1kYXRlcGlja2VyIGE6aG92ZXIsYm9keS5hZG1pbl9wYWdlX3lpa2VzLW1haWxjaGltcC1lZGl0LWZvcm0gLnVpLWRhdGVwaWNrZXIgdGQ6aG92ZXIgYXtjb2xvcjojMkE2NDk2O3RyYW5zaXRpb246Y29sb3IgLjFzIGVhc2UtaW4tb3V0fWJvZHkuYWRtaW5fcGFnZV95aWtlcy1tYWlsY2hpbXAtZWRpdC1mb3JtIC51aS1kYXRlcGlja2VyIC51aS1kYXRlcGlja2VyLWhlYWRlcnttYXJnaW4tYm90dG9tOjRweDt0ZXh0LWFsaWduOmNlbnRlcn1ib2R5LmFkbWluX3BhZ2VfeWlrZXMtbWFpbGNoaW1wLWVkaXQtZm9ybSAudWktZGF0ZXBpY2tlciAudWktZGF0ZXBpY2tlci10aXRsZXtmb250LXdlaWdodDo3MDB9Ym9keS5hZG1pbl9wYWdlX3lpa2VzLW1haWxjaGltcC1lZGl0LWZvcm0gLnVpLWRhdGVwaWNrZXIgLnVpLWRhdGVwaWNrZXItbmV4dCxib2R5LmFkbWluX3BhZ2VfeWlrZXMtbWFpbGNoaW1wLWVkaXQtZm9ybSAudWktZGF0ZXBpY2tlciAudWktZGF0ZXBpY2tlci1wcmV2e2N1cnNvcjpkZWZhdWx0O2ZvbnQtZmFtaWx5OidHbHlwaGljb25zIEhhbGZsaW5ncyc7LXdlYmtpdC1mb250LXNtb290aGluZzphbnRpYWxpYXNlZDtmb250LXN0eWxlOm5vcm1hbDtmb250LXdlaWdodDo0MDA7aGVpZ2h0OjIwcHg7bGluZS1oZWlnaHQ6MTttYXJnaW4tdG9wOjJweDt3aWR0aDozMHB4fWJvZHkuYWRtaW5fcGFnZV95aWtlcy1tYWlsY2hpbXAtZWRpdC1mb3JtIC51aS1kYXRlcGlja2VyIC51aS1kYXRlcGlja2VyLXByZXZ7ZmxvYXQ6bGVmdDt0ZXh0LWFsaWduOmxlZnR9Ym9keS5hZG1pbl9wYWdlX3lpa2VzLW1haWxjaGltcC1lZGl0LWZvcm0gLnVpLWRhdGVwaWNrZXIgLnVpLWRhdGVwaWNrZXItbmV4dHtmbG9hdDpyaWdodDt0ZXh0LWFsaWduOnJpZ2h0fWJvZHkuYWRtaW5fcGFnZV95aWtlcy1tYWlsY2hpbXAtZWRpdC1mb3JtIC51aS1kYXRlcGlja2VyIC51aS1kYXRlcGlja2VyLXByZXY6YmVmb3Jle2NvbnRlbnQ6XCJcXGYxNDFcIjtmb250LWZhbWlseTpkYXNoaWNvbnN9Ym9keS5hZG1pbl9wYWdlX3lpa2VzLW1haWxjaGltcC1lZGl0LWZvcm0gLnVpLWRhdGVwaWNrZXIgLnVpLWRhdGVwaWNrZXItbmV4dDpiZWZvcmV7Y29udGVudDpcIlxcZjEzOVwiO2ZvbnQtZmFtaWx5OmRhc2hpY29uc31ib2R5LmFkbWluX3BhZ2VfeWlrZXMtbWFpbGNoaW1wLWVkaXQtZm9ybSAudWktZGF0ZXBpY2tlci1uZXh0OmhvdmVyLGJvZHkuYWRtaW5fcGFnZV95aWtlcy1tYWlsY2hpbXAtZWRpdC1mb3JtIC51aS1kYXRlcGlja2VyLXByZXY6aG92ZXJ7Y3Vyc29yOnBvaW50ZXIhaW1wb3J0YW50fWJvZHkuYWRtaW5fcGFnZV95aWtlcy1tYWlsY2hpbXAtZWRpdC1mb3JtIC51aS1kYXRlcGlja2VyLWNsb3Nle2Rpc3BsYXk6bm9uZX1ib2R5LmFkbWluX3BhZ2VfeWlrZXMtbWFpbGNoaW1wLWVkaXQtZm9ybSAudWktZGF0ZXBpY2tlci1jdXJyZW50e2NvbG9yOiM1NTUhaW1wb3J0YW50O2JvcmRlci1jb2xvcjojY2NjIWltcG9ydGFudDtiYWNrZ3JvdW5kOiNmN2Y3ZjchaW1wb3J0YW50O2JveC1zaGFkb3c6MCAxcHggMCAjY2NjIWltcG9ydGFudDt2ZXJ0aWNhbC1hbGlnbjp0b3AhaW1wb3J0YW50O2Rpc3BsYXk6aW5saW5lLWJsb2NrO3RleHQtZGVjb3JhdGlvbjpub25lO2ZvbnQtc2l6ZToxM3B4O2xpbmUtaGVpZ2h0OjI2cHg7aGVpZ2h0OjI4cHg7cGFkZGluZzowIDEwcHggMXB4O2N1cnNvcjpwb2ludGVyO2JvcmRlci13aWR0aDoxcHg7Ym9yZGVyLXN0eWxlOnNvbGlkOy13ZWJraXQtYXBwZWFyYW5jZTpub25lO2JvcmRlci1yYWRpdXM6M3B4O3doaXRlLXNwYWNlOm5vd3JhcDtib3gtc2l6aW5nOmJvcmRlci1ib3g7LXdlYmtpdC1ib3gtc2l6aW5nOmJvcmRlci1ib3g7LW1vei1ib3gtc2l6aW5nOmJvcmRlci1ib3g7bWFyZ2luLXRvcDoxMHB4fWJvZHkuYWRtaW5fcGFnZV95aWtlcy1tYWlsY2hpbXAtZWRpdC1mb3JtIC51aS1kYXRlcGlja2VyIC51aS1kYXRlcGlja2VyLWN1cnJlbnQtZGF5IGEsYm9keS5hZG1pbl9wYWdlX3lpa2VzLW1haWxjaGltcC1lZGl0LWZvcm0gLnVpLWRhdGVwaWNrZXIgLnVpLWRhdGVwaWNrZXItdG9kYXkgYXtjb2xvcjojZmZmfWJvZHkuYWRtaW5fcGFnZV95aWtlcy1tYWlsY2hpbXAtZWRpdC1mb3JtIC51aS1kYXRlcGlja2VyIC51aS1pY29ue2Rpc3BsYXk6bm9uZX1ib2R5LmFkbWluX3BhZ2VfeWlrZXMtbWFpbGNoaW1wLWVkaXQtZm9ybSAudWktZGF0ZXBpY2tlciAudWktZGF0ZXBpY2tlci1jYWxlbmRhcnt0YWJsZS1sYXlvdXQ6Zml4ZWQ7d2lkdGg6MTAwJX1ib2R5LmFkbWluX3BhZ2VfeWlrZXMtbWFpbGNoaW1wLWVkaXQtZm9ybSAudWktZGF0ZXBpY2tlciAudWktZGF0ZXBpY2tlci1jYWxlbmRhciB0ZCxib2R5LmFkbWluX3BhZ2VfeWlrZXMtbWFpbGNoaW1wLWVkaXQtZm9ybSAudWktZGF0ZXBpY2tlciAudWktZGF0ZXBpY2tlci1jYWxlbmRhciB0aHt0ZXh0LWFsaWduOmNlbnRlcjtwYWRkaW5nOjRweCAwfWJvZHkuYWRtaW5fcGFnZV95aWtlcy1tYWlsY2hpbXAtZWRpdC1mb3JtIC51aS1kYXRlcGlja2VyIC51aS1kYXRlcGlja2VyLWNhbGVuZGFyIHRke2JvcmRlci1yYWRpdXM6NHB4O3RyYW5zaXRpb246YmFja2dyb3VuZC1jb2xvciAuMXMgZWFzZS1pbi1vdXQsY29sb3IgLjFzIGVhc2UtaW4tb3V0fWJvZHkuYWRtaW5fcGFnZV95aWtlcy1tYWlsY2hpbXAtZWRpdC1mb3JtIC51aS1kYXRlcGlja2VyIC51aS1kYXRlcGlja2VyLWNhbGVuZGFyIHRkOmhvdmVye2JhY2tncm91bmQtY29sb3I6I0VCRUJFQjtjdXJzb3I6cG9pbnRlcn1ib2R5LmFkbWluX3BhZ2VfeWlrZXMtbWFpbGNoaW1wLWVkaXQtZm9ybSAudWktZGF0ZXBpY2tlciAudWktZGF0ZXBpY2tlci10b2RheXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoNjYsMTM3LDIwNCwuNjUpfWJvZHkuYWRtaW5fcGFnZV95aWtlcy1tYWlsY2hpbXAtZWRpdC1mb3JtIC51aS1kYXRlcGlja2VyIC51aS1kYXRlcGlja2VyLWN1cnJlbnQtZGF5e2JhY2tncm91bmQtY29sb3I6IzQyODljY31ib2R5LmFkbWluX3BhZ2VfeWlrZXMtbWFpbGNoaW1wLWVkaXQtZm9ybSAudWktZGF0ZXBpY2tlciAudWktZGF0ZXBpY2tlci1jYWxlbmRhciAudWktZGF0ZXBpY2tlci11bnNlbGVjdGFibGU6aG92ZXJ7YmFja2dyb3VuZC1jb2xvcjojZmZmO2N1cnNvcjpkZWZhdWx0fS5jdXN0b20tcmFkaW8taG9sZGVye2Rpc3BsYXk6aW5saW5lLWJsb2NrO3dpZHRoOjEwMCU7bWFyZ2luOi41ZW0gMH0uY3VzdG9tLXJhZGlvLWxhYmVse2Rpc3BsYXk6YmxvY2s7ZmxvYXQ6bGVmdDttYXJnaW46MCA1cHh9LmN1c3RvbS1yYWRpby1sYWJlbDpmaXJzdC1jaGlsZHttYXJnaW4tbGVmdDowIWltcG9ydGFudH0uY3VzdG9tLXJhZGlvLWxhYmVsIGlucHV0W3R5cGU9cmFkaW9de21hcmdpbi1yaWdodDowIWltcG9ydGFudH0uY3VzdG9tLXNlbGVjdC1maWVsZHtkaXNwbGF5OmJsb2NrO3dpZHRoOjEwMCU7bWFyZ2luOi41ZW0gMH0jYXZhaWxhYmxlLXdpZGdldHMgW2NsYXNzKj15aWtlc19lYXN5XSAud2lkZ2V0LXRpdGxlOmJlZm9yZXtjb250ZW50OlwiXCIhaW1wb3J0YW50O2JhY2tncm91bmQ6dXJsKC4uLy4uL2luY2x1ZGVzL2ltYWdlcy9NYWlsQ2hpbXBfQXNzZXRzL0ZyZWRkaWVfb3JpZ2luYWwucG5nKSBuby1yZXBlYXQgI0ZBRkFGQTtiYWNrZ3JvdW5kLXNpemU6Y29udGFpbn1ib2R5LndwLWN1c3RvbWl6ZXIgI2F2YWlsYWJsZS13aWRnZXRzIFtpZCo9XCJfeWlrZXNfZWFzeV9tY193aWRnZXRcIl0+ZGl2LndpZGdldC10b3A+ZGl2LndpZGdldC10aXRsZT5oNHtiYWNrZ3JvdW5kOjAgMCFpbXBvcnRhbnR9I2Nvbm5lY3Rpb24tY29udGFpbmVye2Zsb2F0OnJpZ2h0O2NvbG9yOiNmZmY7cGFkZGluZzouMjVlbSAuNzVlbSAuMjVlbSAuMjVlbTttYXJnaW4tdG9wOi00cHh9I2Nvbm5lY3Rpb24tY29udGFpbmVyLmFwaS1jb25uZWN0ZWR7YmFja2dyb3VuZDojNDRiYTQ0fSNjb25uZWN0aW9uLWNvbnRhaW5lci5hcGktbm90LWNvbm5lY3RlZHtiYWNrZ3JvdW5kOiNiNWI1YjV9Lnlpa2VzLW1jLWFwaS1jb25uZWN0ZWQsLnlpa2VzLW1jLWFwaS1ub3QtY29ubmVjdGVke2xpbmUtaGVpZ2h0OjF9LnNob3ctc29tZS1sb3ZlLWNvbnRhaW5lcnt0cmFuc2l0aW9uOm1heC1oZWlnaHQgLjc1c30jcmV2aWV3LXlpa2VzLWVhc3ktbWN7dGV4dC1hbGlnbjpjZW50ZXJ9I3Jldmlldy15aWtlcy1lYXN5LW1jIC5kYXNoaWNvbnMtc3Rhci1maWxsZWR7Y29sb3I6I0U2QjgwMH0ubWV0YS1ib3gtc29ydGFibGVzIGhye21hcmdpbjoxLjc1ZW0gMCAwfSNhYm91dC15aWtlcy1pbmN7ZGlzcGxheTpub25lfSNhYm91dC15aWtlcy1pbmMgLmFib3V0LXNpZGViYXIteWlrZXMtbG9nb3tmbG9hdDpsZWZ0O3dpZHRoOjk1cHg7bWFyZ2luOjVweCA3cHggMCAwfSNhYm91dC15aWtlcy1pbmMgcHttYXJnaW4tdG9wOjB9Lnlpa2VzLWVhc3ktbWMtdXBkYXRlZHtkaXNwbGF5OmJsb2NrO2JvcmRlci1sZWZ0OjRweCBzb2xpZCAjNEVBRUYwO21hcmdpbjoxZW0gMjBweCAxZW0gMDtwYWRkaW5nOjJweCAxMHB4O2JhY2tncm91bmQ6cmlnaHQgYm90dG9tIG5vLXJlcGVhdCAjZmZmO2JhY2tncm91bmQtc2l6ZToxMjBweDtiYWNrZ3JvdW5kLXBvc2l0aW9uLXk6MjlweH0uc3VwcG9ydC1zZWN0aW9ue21hcmdpbjoxLjVlbSAwO3BhZGRpbmc6MWVtIDB9LmdpdGh1Yi1vY3RvY2F0e2JhY2tncm91bmQ6dXJsKC4uLy4uL2luY2x1ZGVzL2ltYWdlcy9TdXBwb3J0X1BhZ2UvT2N0b2NhdC5wbmcpIGxlZnQgdG9wIG5vLXJlcGVhdDtiYWNrZ3JvdW5kLXNpemU6MTAwJTt3aWR0aDo1MHB4O2hlaWdodDo0NXB4O2Rpc3BsYXk6YmxvY2s7ZmxvYXQ6bGVmdDttYXJnaW4tdG9wOi01cHh9QG1lZGlhIHNjcmVlbiBhbmQgKG1heC13aWR0aDoxMjAwcHgpey55aWtlcy1lYXN5LW1jLXBvc3Rib3ggI3Bvc3QtYm9keS5jb2x1bW5zLTIgI3Bvc3Rib3gtY29udGFpbmVyLTF7ZmxvYXQ6bm9uZX19QG1lZGlhIHNjcmVlbiBhbmQgKG1heC13aWR0aDo4NTBweCl7Lm9wdGlvbi1tZW51LXNlbGVjdGVkLWFycm93e2Rpc3BsYXk6bm9uZSFpbXBvcnRhbnR9fUBtZWRpYSBzY3JlZW4gYW5kIChtYXgtd2lkdGg6NzgycHgpeyNjaGltcC1jaGF0dGVyIC5jaGltcC1jaGF0dGVyLWNvbnRhaW5lcntmbG9hdDpub25lO2hlaWdodDphdXRvO3dpZHRoOjEwMCV9fS5yZWNhcHRjaGEtZGVtby1naWZ7d2lkdGg6Mjc1cHh9LnByby12ZXJzaW9uLW9ubHktbm90aWNle2NvbG9yOiNkOTYwNjB9LnVwZ3JhZGluZy1lbGxpcHNlLW9uZXtmaWx0ZXI6YWxwaGEob3BhY2l0eT0wKTsta2h0bWwtb3BhY2l0eTowO29wYWNpdHk6MDthbmltYXRpb246ZG90IDEuM3MgaW5maW5pdGU7LXdlYmtpdC1hbmltYXRpb24tZGVsYXk6MG1zO2FuaW1hdGlvbi1kZWxheTowbXN9LnVwZ3JhZGluZy1lbGxpcHNlLXR3b3tmaWx0ZXI6YWxwaGEob3BhY2l0eT0wKTsta2h0bWwtb3BhY2l0eTowO29wYWNpdHk6MDthbmltYXRpb246ZG90IDEuM3MgaW5maW5pdGU7LXdlYmtpdC1hbmltYXRpb24tZGVsYXk6LjJzO2FuaW1hdGlvbi1kZWxheTouMnN9LnVwZ3JhZGluZy1lbGxpcHNlLXRocmVley1tcy1maWx0ZXI6XCJwcm9naWQ6RFhJbWFnZVRyYW5zZm9ybS5NaWNyb3NvZnQuQWxwaGEoT3BhY2l0eT0wKVwiO2ZpbHRlcjphbHBoYShvcGFjaXR5PTApOy1tb3otb3BhY2l0eTowOy1raHRtbC1vcGFjaXR5OjA7b3BhY2l0eTowOy13ZWJraXQtYW5pbWF0aW9uOmRvdCAxLjNzIGluZmluaXRlO2FuaW1hdGlvbjpkb3QgMS4zcyBpbmZpbml0ZTstd2Via2l0LWFuaW1hdGlvbi1kZWxheTouM3M7YW5pbWF0aW9uLWRlbGF5Oi4zc31ALXdlYmtpdC1rZXlmcmFtZXMgZG90ezAlLDUwJXtvcGFjaXR5OjB9MTAwJXtvcGFjaXR5OjF9fUBrZXlmcmFtZXMgZG90ezAlLDUwJXtvcGFjaXR5OjB9MTAwJXtvcGFjaXR5OjF9fSJdfQ== */
1
+ #yikes-easy-mc-dashboard-widget-stats h3,.addon-image{text-align:center}.yikes-easy-mc-hidden{display:none}.shortcode-input-field{color:#333;background:rgba(216,216,216,.35)!important}.edit-form-field-container-span{display:block;margin:.5em 0}.no-forms-widget{margin:2em 0}.no-forms-found-icon{font-size:14px;line-height:1.4;width:14px;color:#e07d7d}.coming-soon-button{position:absolute}.coming-soon-button .dashicons{font-size:14px;line-height:1.8}.add-ons-about-text{margin-top:0}#add-ons{margin:3em 0}.addon-image{display:block}.no-mailchimp-lists-found{padding:25px 0 25px 25px}.add-new-subscriber-button{display:block;margin-top:2em}.add-new-subscriber-form-container{display:none;padding-top:1em}.add-new-subscriber-form-container h4{margin-top:0}#yikes-easy-mc-widget-stat-holder,.yikes-easy-mc-stats-table{margin-top:1em}#migration-buttons{display:inline-block;margin-bottom:.5em}#migration-buttons form:first-child{margin-right:10px}#migration-buttons form{float:left}#yikes_easy_mc_account_activity_widget h3 span,#yikes_easy_mc_list_stats_widget h3 span{background:url(../../includes/images/MailChimp_Assets/Freddie_original.png) 8px 4px/25px auto no-repeat;background-size:25px;display:block;height:30px;padding-left:3em;padding-top:5px}#yikes_easy_mc_account_activity_widget h3.hndle,#yikes_easy_mc_list_stats_widget .inside{padding:0}#yikes_easy_mc_list_stats_widget h3{padding:0;line-height:1.6em}.yikes-easy-mc-stats-table,.yikes-easy-mc-stats-table .yikes-easy-mc-table-stats-tr,.yikes-easy-mc-stats-table tbody{display:block;width:100%}.yikes-easy-mc-table-stats-tr td{display:inline-block;width:48%;text-align:center}.yikes-easy-mc-table-stats-tr td:hover{cursor:pointer}.yikes-easy-mc-table-stats-tr td:first-of-type{border-right:1px solid #ececec}.yikes-easy-mc-stats-table .yikes-easy-mc-table-stats-tr-first{border-bottom:1px solid #ececec;border-top:1px solid #ececec}.yikes-easy-mc-stats-table p.yikes-easy-mc-dashboard-stat{color:#00a0d2;font-weight:800;font-size:20px;margin-bottom:2px;margin-top:15px;line-height:1.2;max-height:80px}.yikes-easy-mc-stats-table p.yikes-easy-mc-stat-list-label{font-size:13px;margin-top:0;margin-bottom:15px;font-family:"Open Sans"}#yikes_easy_mc_account_activity_widget table th.row-title{padding-left:10px}#pre-defined-tag-interior-container{background:url(../../includes/images/tinyMCE/yikes-mailchimp-combo-faded.png) bottom right no-repeat #fff;background-size:40%}.qtip-default{background-color:transparent!important;border:transparent!important;z-index:9999999!important}.qtip-bootstrap{padding:10px!important;z-index:9999999!important;font-size:12px}.search-interest-group-preloader{display:block;margin:8px 0 0 55px;width:12px}.no-interest-groupings-enabled-message{display:block;margin-top:12px!important;width:100%}.tooltip-integration-banner{max-width:100%;margin:0 0 .25em}.tooltiptext.qtip-bootstrap{font-size:12px}.tooltip-title{margin:0}.dashicons-editor-help:hover{cursor:pointer}body.easy-forms_page_yikes-inc-easy-mailchimp-settings .interest-group-section{display:block;width:100%;margin:1.5em 0}body.easy-forms_page_yikes-inc-easy-mailchimp-settings .interest-group-section .interest-group-section-title{display:block;width:100%;margin:.5em 0;text-decoration:underline}.github-avatar-url,body.admin_page_yikes-mailchimp-welcome #kb-container .knowledge-base-listing li a,body.easy-forms_page_yikes-inc-easy-mailchimp-support .knowledge-base-articles .knowledge-base-listing li a{text-decoration:none}body.easy-forms_page_yikes-inc-easy-mailchimp-settings .interest-group-section input{margin-right:0}body.easy-forms_page_yikes-inc-easy-mailchimp-settings .interest-group-section label{margin-right:10px}i.mce-ico.mce-i-yks_mc_tinymce_button_key{background:url(../../includes/images/tinyMCE/Freddie_wink.png) no-repeat;background-size:18px;background-position-y:1px}#yikes_mailchimp_tinyMCE_modal-title{padding-left:42px;background:url(../../includes/images/MailChimp_Assets/Freddie_original.png) left no-repeat;background-size:25px;background-position-x:10px}#yikes_mailchimp_tinyMCE_modal{background:url(../../includes/images/tinyMCE/yikes-mailchimp-combo-faded.png) bottom left no-repeat #fff;background-size:40%;background-position-x:10px;background-position-y:95%}#yikes_mailchimp_tinyMCE_modal .mce-foot{border-top:none!important;background:0 0}[id*="_yikes_easy_mc_widget"]>div.widget-top>div.widget-title>h4{background:url(../../includes/images/MailChimp_Assets/Freddie_original.png) 2% 50%/25px auto no-repeat #FAFAFA;padding-left:40px}#review-yikes-easy-mailchimp-notice #yikes-mailchimp-logo,#yikes-mailchimp-logo{font-size:14px;background:url(../../includes/images/Welcome_Page/yikes-mailchimp-welcome-logo.png) no-repeat;text-align:center}#review-yikes-easy-mailchimp-notice #yikes-mailchimp-logo{background-size:60px;float:left;height:80px;width:80px}.yikes-easy-mc-feature-image-left{float:left;margin-right:30px;margin-left:0!important}.need-support-icon{line-height:1.5}ul.support-option-list{display:inline-block;width:100%}.support-option{float:left}.support-option-second{margin-left:10px}#yikes-mailchimp-logo.support-page{float:left;width:80pt}.yikes-easy-mc-whats-new-section-image{float:none;width:100%;margin-left:0!important}.welcome-page-tabs{margin-top:2em!important}.welcome-page-about-wrap .about-text,.welcome-page-about-wrap h2.welcome-title{margin-left:115px}.whats-new-wrap img.yikes-easy-mc-whats-new-section-image{margin-top:10px}.whats-new-wrap .feature-section:nth-child(1) img{float:left;width:500px;margin-left:0!important;margin-right:30px}.whats-new-wrap .feature-section:nth-child(3) img{float:right;width:250px;margin-right:0!important;margin-left:30px}.whats-new-wrap .feature-section:nth-child(4) img{margin-left:0!important}#yikes-mailchimp-logo{height:132px;width:132px}.about-wrap #yikes-mailchimp-logo{position:absolute;top:0;left:0}.edd-welcome-screenshots{float:right;margin-left:10px!important}.about-wrap .feature-section{margin-top:20px}.yikes-easy-mc-feature-image{float:right;margin-left:30px!important}#credit-container,#translators-container{display:inline-block;width:100%}#credit-container h2,#translators-container h2{margin:0 0 .5em 1em}#translators-container{margin-top:5em}#translators-container .translation-language{color:#333}#credit-container .team-member,#translators-container .translator{margin:1em 5% 1em 0;text-align:center}#credit-container .team-member img,#translators-container .translator img{border-radius:50%}.about-wrap div.error,.about-wrap div.updated{display:block!important;margin-left:115px!important}.github-avatar-image{width:100px}.github-avatar-url{display:inline-block;width:20%}github-avatar-url:focus{outline:0}body.admin_page_yikes-mailchimp-edit-form div.show-some-love-container img,div.show-some-love-container img.customizer-upsell-banner{max-width:100%}body.admin_page_yikes-mailchimp-edit-form div.show-some-love-container p:first-child{font-style:italic}body.admin_page_yikes-mailchimp-edit-form div.show-some-love-container hr{margin:1em 0}body.admin_page_yikes-mailchimp-welcome .nav-tab-wrapper .nav-tab .dashicons{font-size:17px;line-height:1.5}body.admin_page_yikes-mailchimp-welcome #kb-container,body.easy-forms_page_yikes-inc-easy-mailchimp-support .knowledge-base-articles{display:inline-block;margin-top:1em}body.admin_page_yikes-mailchimp-welcome #kb-container h1{font-size:20px;margin-top:-1em}body.admin_page_yikes-mailchimp-welcome #kb-container .knowledge-base-listing,body.easy-forms_page_yikes-inc-easy-mailchimp-support .knowledge-base-articles .knowledge-base-listing{width:45%;margin-right:2%;float:left;min-height:260px}body.admin_page_yikes-mailchimp-welcome #kb-container .knowledge-base-listing li,body.easy-forms_page_yikes-inc-easy-mailchimp-support .knowledge-base-articles .knowledge-base-listing li{margin:12px 0;text-decoration:none}body.admin_page_yikes-mailchimp-welcome #kb-container .knowledge-base-listing li:before,body.easy-forms_page_yikes-inc-easy-mailchimp-support .knowledge-base-articles .knowledge-base-listing li:before{font-family:dashicons;content:"\f123";vertical-align:middle;display:block;float:left;margin:0 5px 5px 0}body.admin_page_yikes-mailchimp-welcome #kb-container .knowledge-base-listing li.list-title,body.easy-forms_page_yikes-inc-easy-mailchimp-support .knowledge-base-articles .knowledge-base-listing li.list-title{font-size:17px;font-weight:200;text-decoration:underline}body.admin_page_yikes-mailchimp-welcome #kb-container .knowledge-base-listing li.list-title:before,body.easy-forms_page_yikes-inc-easy-mailchimp-support .knowledge-base-articles .knowledge-base-listing li.list-title:before{content:"";padding-left:12px}body.admin_page_yikes-mailchimp-welcome .new-feature-list{list-style:none;line-height:middle}body.admin_page_yikes-mailchimp-welcome .new-feature-list li{margin-bottom:10px}body.admin_page_yikes-mailchimp-welcome .new-feature-list li:before{font-family:dashicons;content:"\f139";padding-right:2px;font-size:20px;vertical-align:middle}#review-yikes-easy-mailchimp-notice .button-container{display:block;width:100%;margin:.75em 0 1.5em}#review-yikes-easy-mailchimp-notice .button-container .dashicons{font-size:14px;line-height:1.9;margin-left:-4px}#review-yikes-easy-mailchimp-notice .button-container .dashicons-star-filled{color:#E6B800}#review-yikes-easy-mailchimp-notice .button-container .dashicons-upload{color:#6E8841}#review-yikes-easy-mailchimp-notice .button-container .dashicons-no-alt{color:#dc3a3a;line-height:2}body.easy-mailchimp_page_yikes-inc-easy-mailchimp-settings .dashicons-no-alt{color:#dc3a3a}#review-yikes-easy-mailchimp-notice .button-container a{margin-right:10px}#review-yikes-easy-mailchimp-notice{border-left:4px solid #00a0d2;background:#fefefe;padding:10px 12px 1px;box-shadow:0 1px 1px 0 rgba(0,0,0,.1);-webkit-box-shadow:0 1px 1px 0 rgba(0,0,0,.1);margin:15px 25px 20px 5px}input.readonly,input[readonly],textarea.readonly,textarea[readonly]{background:#D8D8D8}.dashicons.yikes-love{color:pink}.field-description-input{resize:vertical;max-height:100px}.yikes-easy-mc-postbox h3{background:#00a0d2;font-weight:800;color:#fff}.yikes-easy-mc-postbox h3.bg-transparent{color:#333;font-weight:400;background:0 0}.yikes-mc-warning-message{padding-left:15px;margin-top:0;padding-top:10px;color:#da6e6e}.error-message-container label[for=yikes-easy-mc-success-message],.error-message-container label[for=yikes-easy-mc-general-error-message],.error-message-container label[for=yikes-easy-mc-invalid-email-message],.error-message-container label[for=yikes-easy-mc-user-subscribed-message]{padding:.5em 1em;background:rgba(241,241,241,.75);box-sizing:border-box;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;margin:0}.error-message-container label[for=yikes-easy-mc-user-subscribed-message]{padding-bottom:1em;margin-bottom:.5em}.error-message-container label,.form-settings-container label{display:block;margin:1em 0}.yikes-easy-forms-sidebar .yikes-mc-settings-expansion-section{padding:.5em .75em;-webkit-box-sizing:border-box;-moz-box-sizing:border-box}.yikes-mc-settings-expansion-section{display:none;background:rgba(241,241,241,.75)}.expansion-section-title{background:#fff}.expansion-section-title.settings-sidebar,.form-builder-section-title{text-decoration:none;display:block;border:1px solid rgba(177,177,177,.71);color:#333;padding:5px;margin:.5em 0 0}.expansion-section-title.settings-sidebar .dashicons,.form-builder-section-title .dashicons{content:"\f132";font-family:dashicons;font-size:15px;line-height:1.5}span.easy-mailchimp-add-on-valid-license-container{color:#44ba44;display:block;margin-top:1em}.easy-mailchimp-add-on-invalid-license-container{color:rgba(227,107,107,.86);display:block;margin-top:1em}.options-sidebar .yikes-easy-mc-postbox{overflow:visible}.options-sidebar .inside{padding:0 20px 12px}.yikes-easy-mc-about-text{margin-top:0}.add-on-settings-divider{margin:1em 0!important}#yks-mailchimp-double-optin-message,#yks-mailchimp-single-optin-message,.settings-page-input{width:50%}#yks-mailchimp-double-optin-message,#yks-mailchimp-single-optin-message{min-height:75px;max-height:200px;resize:vertical}#addon-settings-nav li a,#settings-nav li a{color:#333;text-decoration:none!important;transition:color .15s ease-out;-moz-transition:color .15s ease-out;-webkit-transition:color .15s ease-out;-o-transition:color .15s ease-out}#addon-settings-nav li a:hover,#settings-nav li a:hover,.option-menu-selected-arrow+a{color:#00a0d2!important}#addon-settings-nav{margin-bottom:0;margin-top:5px}.option-menu-selected-arrow{width:0;height:0;border-top:10px solid transparent;border-bottom:10px solid transparent;border-left:10px solid #a0a5aa;position:absolute;left:-.1em}label[for=yikes-mailchimp-debug-status]{display:inline-block;margin-bottom:1em;line-height:2.25}#yikes-mailchimp-debug-status{float:left;margin-top:.5em}label[for=yikes-mc-recaptcha-setting],label[for=yikes-mc-recaptcha-api-key]{display:block;margin-bottom:1em}.recaptcha-preview-link,input.recaptcha-setting-checkbox{display:block;margin-top:.5em}.recaptcha-preview-container{width:100%;display:none;margin:1em 0}#premium-support-form,.support-page-button,.support-page-logo{display:block;width:100%}.wrap #col-left,.wrap #col-right{width:49%}@media (max-width:800px){.wrap #col-left,.wrap #col-right{width:100%}}.support-page-logo{opacity:.7;max-width:100%}.support-page-button{min-height:40px;font-weight:700;text-align:center;line-height:3!important;margin-top:1em!important}.support-page-wordpress-font{font-size:1.3em;margin-right:13px}h2.premium-support-title{margin:1em 0 .5em}#premium-support-form input,#premium-support-form select{display:block;width:100%;min-width:200px;margin:.5em 0}#premium-support-form label{font-weight:800}#premium-support-form label input,#premium-support-form label select{font-weight:500}#premium-support-form p{font-weight:300;display:block;margin-bottom:1em}#wp-support-content-wrap{min-height:150px;width:100%}.support-form-hidden{display:none!important}#yikes-mailchimp-error-log .row-title{font-weight:400}.create-error-log-help:hover{cursor:pointer}.error-log-tr td{display:table;margin-bottom:1em;margin-top:.5em}p.error-log-missing-file em,p.to-start-logging-errors-notice em{margin:10px 0}.export-custom-forms-list{display:none;margin:1em 0 2em}.export-custom-forms-list p{margin-top:0}.list-rating-star{color:#E6B800}#chimp-chatter{text-align:center}#chimp-chatter .chimp-chatter-container{margin:1em .2em;background:#F8F8F8;border-radius:10px;float:left;height:220px;padding:10px;width:44%}.chimp-chatter-mailchimp-logo{width:100%;display:block;margin:0 auto}.chimp-chatter-sidebar h2.account-status{text-align:center}.mailchimp-affiliate-link{color:#333;display:none}.mailchimp-avatar{display:block;margin:0 auto;box-shadow:3px 3px 10px 0 rgba(214,214,214,.75)}#yikes_easy_mc_toolbar_links li a:focus,.merge-tag-text{box-shadow:none}.chimpchatter-button-container{clear:both;display:block}.chimp-chatter-postbox{float:left;width:49%;margin-right:1%}.circle-account-active,.circle-account-inactive{display:inline-block;vertical-align:middle;height:15px;width:15px;border-radius:50%}#account-details .chimp-chatter-postbox.even{margin-right:0}.circle-account-inactive{margin-top:-3px;margin-right:5px;background:rgba(250,138,138,.79)}.chatter-type{font-weight:600;font-family:"open sans";font-size:14px;margin:5px 5px 0}.chatter-message{margin:2px 2px 15px!important}.circle-account-active{margin-top:-3px;margin-right:5px;background:rgba(128,214,128,.77)}#account-details .mailchimp-avatar{width:120px;border-radius:10%;margin-top:.5em}.chimp-chatter-positive{border-left:4px solid #9ddf9d}.chimp-chatter-negative{border-left:4px solid #FBA2A2}.chimp-chatter-neutral{border-left:4px solid #b1b1b1}#import-list-to-site{margin-top:10px}#import-list-to-site .input-field{display:block;width:100%;margin-top:5px;margin-bottom:5px}.sidebar-container,.star-container{margin-top:5px;margin-bottom:1.5em}#import-list-to-site .form-description{resize:vertical;max-height:65px}#import-list-to-site .description{margin-top:5px}.star-container a{text-decoration:none}.star-container .dashicons-star-filled{font-size:1.75em}.sidebar-footer-text{margin:15px 0!important;text-align:center}.sidebar-twitter-icon{text-decoration:none;color:#55ACEE}.field-doesnt-exist-notice{position:absolute;margin-left:5px;width:18px}.field-type-text{float:right}.type-container{margin:0}.form-field-container{margin-top:0;margin-bottom:0}.field-no-longer-exists-warning{position:absolute;margin-left:5px;width:18px}.form-field-container td input[type=checkbox],.form-field-container td input[type=radio]{margin:0 5px}.form-field-container td input[type=checkbox]:first-child,.form-field-container td input[type=radio]:first-child{margin-left:0!important}.merge-tag-text{background:0 0;border:none}.pre-defined-tag-link{font-size:11px}.toggle-container{font-size:small;float:right}#pre-defined-tag-container{display:none}#pre-defined-tag-container h3{margin-bottom:0}#pre-defined-tag-container .tooltop-tag .dashicons-editor-help{font-size:13px;line-height:1.5}.no-fields-assigned-notice{margin:4em 0 2.25em;padding-bottom:6em;width:100%;text-align:center;background:url(../../includes/images/no-form-fields-assigned-arrow.jpg) bottom center no-repeat;background-size:105px}.yikes-easy-mc-widget-preloader{position:absolute;left:48%;margin-top:-96px}.yikes-dashboard-widget-section{padding:0 12px 12px}.select-list-title{padding-left:0}.yikes-dashboard-widget-section .description{margin:.5em 0 0}. error-descripion{padding-top:.5em}.yikes-mc-freddie-logo{float:left;margin-right:10px}.mv_ig_list{width:94%;margin-bottom:8px!important;border:none!important;background:0 0!important}.mv_ig_list .list-container{position:absolute}.mv_ig_list a{width:48%;padding:5px 0!important;text-align:center;margin:0}.mv_ig_list a:first-child{margin-right:0}.mv_ig_list a:last-child{float:right}.mv_ig_list .nav-tab{border:1px solid #ccc}.mv_ig_list .nav-tab-active{color:#fff;font-weight:700;background:#00a0d2}.mv_ig_list .arrow-down{position:absolute;margin-top:21px;margin-left:50px;width:0;height:0;border-left:12px solid transparent;border-right:12px solid transparent;border-top:12px solid #00a0d2}#container-container{display:inline-block;width:521px}#container-container .list-container{float:left;width:240px;position:relative}#container-container .list-container:last-child{margin-left:2em}#yikes_easy_mc_toolbar{margin-top:-.75em}#yikes_easy_mc_toolbar_links{display:inline-block;width:100%;margin:0;padding:10px 0}#yikes_easy_mc_toolbar_links li{float:left;margin:0 .5em}#yikes_easy_mc_toolbar_links li a{text-decoration:none;display:inline-block}#yikes_easy_mc_toolbar_links li a.selected_hidden_setting{color:#333;margin-bottom:3px}#yikes_easy_mc_toolbar_links li .selected_setting_triangle{width:0;height:0;border-left:13px solid transparent;border-right:13px solid transparent;border-top:13px solid rgba(206,206,206,1);margin:0 auto}.checkbox-settings-list-dropdown,.optin-checkbox-label-input{width:250px;display:block}#yikes_easy_mc_toolbar_links li a.form-builder:before{content:"\f116";font-family:dashicons}#yikes_easy_mc_toolbar_links li a.form-customizer:before{content:"\f100";font-family:dashicons}#yikes_easy_mc_toolbar_links li a.error-messages:before{content:"\f117";font-family:dashicons}#yikes_easy_mc_toolbar_links li a.form-settings:before{content:"\f111";font-family:dashicons}#checkbox-settings-form .dashicons-editor-help{font-size:15px;line-height:1.6}.no-lists-setup-notice{padding:.5em 0}.yikes-form-id-number{width:55px}span[title=Impressions]:hover,span[title=Submissions]:hover,span[title="Conversion Rate"]:hover{display:block;cursor:pointer}.form-id-container{padding:1px 8px;border-radius:5px;background:#49a9ec;font-weight:700;color:#fff}.manage-form-admin-notice{margin-top:1.75em!important}.remove-notification,.yikes-mc-settings-expansion-section a.remove-field,a.yikes-delete-mailchimp-form,a.yikes-delete-subscriber{color:#d96060!important}.yikes-delete-mailchimp-form{margin-top:6px}#postbox-container-1 .yikes-delete-mailchimp-form{float:right}.form-buttons-container{display:block;padding:11px 10px}.forms-buttons-container input[type=submit]{margin:0 0 .5em}.update-form-spinner{position:absolute;left:0;right:0;margin:0 auto;bottom:13px}.yikes-mc-shortcode-input{text-align:center;width:100%;color:#333}.hidden-class{display:none!important}.stat-container{width:10%;max-width:75px}.no-current-subscriber-notice em,.no-mailchimp-forms-found em{padding:25px 0 25px 25px}.column-columnname span.stats{display:block;width:100%;text-align:center}.column-columnname span.stats span{display:inline-block;width:20%}.column-columnname span.stats span:hover{cursor:pointer}#available-fields li,#available-interest-groups li{text-decoration:none;display:block;border:1px solid rgba(177,177,177,.71);color:#333;padding:5px;margin:.5em 0}#available-fields li.not-available,#available-interest-groups li.not-available{opacity:.6!important}#available-fields li.field-to-add-to-form,#available-interest-groups li.group-to-add-to-form{background:rgba(46,162,204,.25)}.add-field-to-editor .add-to-form-builder-arrow,.button-secondary .add-to-form-builder-arrow{width:15px;font-size:15px;line-height:1.8}.clear-form-fields{background:#e14d43;border-color:#d02c21;color:#fff;box-shadow:inset 0 1px 0 #ec8b85,0 1px 0 rgba(0,0,0,.15);text-decoration:none;display:inline-block;height:28px;padding:0 10px 1px;border-width:1px;-webkit-appearance:none;border-radius:3px;white-space:nowrap;font-size:13px;line-height:26px;box-sizing:border-box;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;float:right;margin:0 11px 10px 0}.clear-form-fields:active,.clear-form-fields:focus,.clear-form-fields:hover{background:#dd382d;border-color:#ba281e;color:#fff;box-shadow:inset 0 1px 0 #e8776f}.yikes-mc-view-list-breadcrumbs{padding:.8em;border:1px solid #D8D8D8;background:#ECECEC;margin:1.5em 0 .8em}.yikes-mc-member-rating-star{color:#daa520}#yikes-mc-subscriber-card-wrapper{background:#fefefe;min-height:200px;display:inline-block;box-shadow:0 1px 1px rgba(0,0,0,.04);webkit-box-shadow:0 1px 1px rgba(0,0,0,.04);border:1px solid #e5e5e5;padding:15px 20px;width:500px;float:left}#yikes-mc-subscriber-card-wrapper .subscriber-optin-ip{display:inline-block;margin:1em 0 0;font-style:italic}.view-user-data-wrap #customer-tab-wrapper-list{float:left;background:#fefefe;margin-top:0;padding:12px;margin-left:-1px;border-right:1px solid #e5e5e5;border-top:1px solid #e5e5e5;border-bottom:1px solid #e5e5e5}.view-user-data-wrap #customer-tab-wrapper-list .dashicons{font-size:23px;height:23px;width:23px;margin:3px 0}.view-user-data-wrap #customer-tab-wrapper-list li.inactive{color:rgba(51,51,51,.31);transition:color ease-out .1s}.view-user-data-wrap #customer-tab-wrapper-list li.active,.view-user-data-wrap #customer-tab-wrapper-list li.inactive:hover{color:rgba(51,51,51,1)}#yikes-mc-subscriber-card-wrapper .yikes-mc-card-top .member-star-rating-container,#yikes-mc-subscriber-card-wrapper .yikes-mc-card-top h2,#yikes-mc-subscriber-card-wrapper .yikes-mc-card-top img{float:left}#yikes-mc-subscriber-card-wrapper #delete-mailchimp-subscriber{display:block;margin:0 auto}#yikes-mc-subscriber-card-wrapper .yikes-mc-card-top img{border-radius:3px}#yikes-mc-subscriber-card-wrapper .merge-variable-section li{display:inline-block;list-style:none;float:left;width:50%;min-height:65px;border-bottom:1px dotted #ddd}#yikes-mc-subscriber-card-wrapper .merge-variable-section li p{margin:0 0 1em}#yikes-mc-subscriber-card-wrapper .yikes-mc-card-top h2{max-width:370px;width:75%;padding:0}#yikes-mc-subscriber-card-wrapper .member-star-rating-container{display:block;margin:.5em 0 .5em 10px}#yikes-mc-subscriber-card-wrapper h2{margin-left:10px;margin-top:0;padding-top:0}#yikes-mc-subscriber-card-wrapper .yikes-mc-card-body,#yikes-mc-subscriber-card-wrapper .yikes-mc-card-top{display:inline-block;width:100%}.member-location-data,.member-subscription-date{width:70%;max-width:370px;display:block;float:left}#yikes-mc-subscriber-card-wrapper .yikes-mc-card-body h4{margin-top:0;margin-left:5px}.yikes-mc-subscriber-hr{margin:1.5em 0}.member-subscription-date{margin:.5em 0 .5em 10px}.member-location-data{margin:.25em 0 .25em 10px}.addon-required-link{color:#333;opacity:.5}.view-list-sidebar-input{color:#333}.interest-group-ul,.merge-variable-ul,.segment-ul{padding-left:15px;font-size:14px}.interest-group-ul li .dashicons,.merge-variable-ul li .dashicons{line-height:1.8;font-size:9px}a.button-primary.edit-fields-button{margin:0 0 10px 15px}.interest-group-count,.merge-variable-count,.segment-group-count{text-decoration:underline;margin-bottom:.75em;padding-left:7px}body.admin_page_yikes-mailchimp-edit-form .ui-datepicker .ui-datepicker-calendar td a,body.admin_page_yikes-mailchimp-edit-form .ui-datepicker a,body.admin_page_yikes-mailchimp-edit-form .ui-datepicker a:hover{text-decoration:none}.interest-group-title{padding-left:5px}.edit-segments-button{margin:0 0 10px 15px}.edit-segment-description{padding:0 0 10px 15px}#credit-container{margin-top:1.5em}.yikes-easy-mailchimp-custom-content-icon{font-size:15px;line-height:1}.custom-field-section{display:block;margin:1em 0}#associated-list{width:100%;margin-top:5px}#redirect-user-to-selection{width:100%}#edit-yikes-mc-form label h3{margin-left:0;padding-left:0}#available-fields .field-required{color:#d96060!important}body.admin_page_yikes-mailchimp-edit-form #poststuff h2{padding:8px 12px;margin-top:0}.edit-form-form-description{width:100%;resize:vertical;min-height:65px;max-height:100px}.edit-form-title{padding-left:12px!important}#edit-form-description{padding:0 12px;margin:1em 0}.yikes-easy-mc-postbox{overflow:hidden}.no-interest-groups-found-message{opacity:.35}.upgrading-ellipse-one,.upgrading-ellipse-two{-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=0)";-moz-opacity:0;-webkit-animation:dot 1.3s infinite}#interest-groups-container .description,#merge-variables-container .description{padding-top:.5em}.inside-section-1{margin-top:0;margin-bottom:1.5em}.inside-section-2{margin-top:0;margin-bottom:2em}.form-field-container-span{display:block;margin:.5em 0}#style-list ul li{display:block;width:100%;margin:1em 0}.form-style-adjustment,.wp-picker-container{display:block!important;width:100%;margin:.5em 0}.dynamic-email-tag{display:inline-block;margin-right:5px}.dynamic-tag-description td{padding-top:0}#create-new-notification-button{margin-top:1em}.file-container{display:none}.yikes-mailchimp-file-field input[name*="custom-field[incentive-attachment]"]{margin-bottom:.5em}.yikes-mailchimp-file-field input[name*="custom-field[incentive-attachment]"]+.button-secondary{margin-left:4px}input#upload-btn[data-attr-position="1"]{margin-left:0}.remove-file-button{background:url(../partials/helpers/fields/img/icon-delete.png);height:16px;position:absolute;text-indent:-99999px;width:16px}a.add-new-incentive-attachment{display:block;width:40px;margin-right:100%!important;margin-top:.5em!important}a.add-new-incentive-attachment .dashicons{font-size:15px;line-height:1.8}.form-builder-placeholder{background:rgba(206,206,206,.2);height:30px}.admin_page_yikes-mailchimp-edit-form #form-settings .section-title{font-size:1em;border-bottom:1px solid rgba(187,187,187,.29);display:block;width:100%;padding-bottom:6px;margin-bottom:.5em;margin-top:1.5em}.admin_page_yikes-mailchimp-edit-form #form-settings .section-interior label,.admin_page_yikes-mailchimp-edit-form #form-settings .section-title.first{margin-top:0}.admin_page_yikes-mailchimp-edit-form #form-settings .section-interior{display:inline-block;width:100%;box-sizing:border-box;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;background:rgba(241,241,241,.75);padding:1em}label.login-restriction-center{display:block;width:100%}.admin_page_yikes-mailchimp-edit-form #form-settings .section-interior .date-restirction-section{display:inline-block}.admin_page_yikes-mailchimp-edit-form #form-settings .section-interior .date-restirction-section p.description.error{color:#F56060}.admin_page_yikes-mailchimp-edit-form #form-settings .section-interior .date-restirction-section label{float:left;margin-right:.5em;margin-top:0;margin-bottom:0}.admin_page_yikes-mailchimp-edit-form #form-settings .section-interior .nested-child .yikes-easy-mc-form-restriction-expired-message,.admin_page_yikes-mailchimp-edit-form #form-settings .section-interior .nested-child .yikes-easy-mc-form-restriction-login-message,.admin_page_yikes-mailchimp-edit-form #form-settings .section-interior .nested-child .yikes-easy-mc-form-restriction-pending-message{display:block;width:100%;min-height:50px}.admin_page_yikes-mailchimp-edit-form #form-settings .section-interior .nested-child{float:left;padding-left:2%;width:98%;border-left:1px dashed #BDBDBD;border-spacing:2px;margin:.5em 0 1em}.admin_page_yikes-mailchimp-edit-form #form-settings .section-interior .nested-child .yikes-easy-mc-submit-button-text{margin:0}.admin_page_yikes-mailchimp-edit-form #form-settings .section-interior .date-restirction-section{margin-bottom:0}.admin_page_yikes-mailchimp-edit-form #form-settings .section-interior .date-restirction-section.last{margin-bottom:.75em}.admin_page_yikes-mailchimp-edit-form #form-settings .section-interior .nested-child.hidden{display:none}.admin_page_yikes-mailchimp-edit-form #form-settings .section-interior .description+label{margin-top:1em;float:left;width:100%}.admin_page_yikes-mailchimp-edit-form #form-settings .section-interior label.inline-form-label{margin-bottom:0;margin-top:0}.admin_page_yikes-mailchimp-edit-form #form-settings .section-interior .description{display:block;width:100%;float:left}.admin_page_yikes-mailchimp-edit-form #form-settings .nested-child strong:first-child,.admin_page_yikes-mailchimp-edit-form #form-settings .section-interior strong:first-child{display:block;width:100%}.admin_page_yikes-mailchimp-edit-form #form-settings .inline-form-label{float:left;margin-right:10px}body.admin_page_yikes-mailchimp-edit-form .ui-timepicker-wrapper{overflow-y:auto;height:150px;width:170px;background:#fff;border:1px solid #ddd;box-shadow:0 5px 10px rgba(0,0,0,.2);outline:0;z-index:10001;margin:0}body.admin_page_yikes-mailchimp-edit-form .ui-timepicker-wrapper.ui-timepicker-with-duration{width:13em}body.admin_page_yikes-mailchimp-edit-form .ui-timepicker-wrapper.ui-timepicker-with-duration.ui-timepicker-step-30,body.admin_page_yikes-mailchimp-edit-form .ui-timepicker-wrapper.ui-timepicker-with-duration.ui-timepicker-step-60{width:11em}body.admin_page_yikes-mailchimp-edit-form .ui-timepicker-list{margin:0;padding:0;list-style:none}body.admin_page_yikes-mailchimp-edit-form .ui-timepicker-duration{margin-left:5px;color:#888}body.admin_page_yikes-mailchimp-edit-form .ui-timepicker-list:hover .ui-timepicker-duration{color:#888}body.admin_page_yikes-mailchimp-edit-form .ui-timepicker-list li{padding:3px 0 3px 5px;cursor:pointer;white-space:nowrap;color:#000;list-style:none;margin:0}body.admin_page_yikes-mailchimp-edit-form .ui-timepicker-list:hover .ui-timepicker-selected{background:#fff;color:#000}body.admin_page_yikes-mailchimp-edit-form .ui-timepicker-list .ui-timepicker-selected:hover,body.admin_page_yikes-mailchimp-edit-form .ui-timepicker-list li:hover,body.admin_page_yikes-mailchimp-edit-form li.ui-timepicker-selected{background:#1980EC;color:#fff}body.admin_page_yikes-mailchimp-edit-form .ui-timepicker-list li:hover .ui-timepicker-duration,body.admin_page_yikes-mailchimp-edit-form li.ui-timepicker-selected .ui-timepicker-duration{color:#ccc}body.admin_page_yikes-mailchimp-edit-form .ui-timepicker-list li.ui-timepicker-disabled,body.admin_page_yikes-mailchimp-edit-form .ui-timepicker-list li.ui-timepicker-disabled:hover,body.admin_page_yikes-mailchimp-edit-form .ui-timepicker-list li.ui-timepicker-selected.ui-timepicker-disabled{color:#888;cursor:default}body.admin_page_yikes-mailchimp-edit-form .ui-timepicker-list li.ui-timepicker-disabled:hover,body.admin_page_yikes-mailchimp-edit-form .ui-timepicker-list li.ui-timepicker-selected.ui-timepicker-disabled{background:#f2f2f2}body.admin_page_yikes-mailchimp-edit-form .ui-datepicker{background-color:#fff;border:1px solid #66AFE9;border-radius:4px;box-shadow:0 0 8px rgba(102,175,233,.6);display:none;margin-top:4px;padding:10px;width:240px}body.admin_page_yikes-mailchimp-edit-form .ui-datepicker a:hover,body.admin_page_yikes-mailchimp-edit-form .ui-datepicker td:hover a{color:#2A6496;transition:color .1s ease-in-out}body.admin_page_yikes-mailchimp-edit-form .ui-datepicker .ui-datepicker-header{margin-bottom:4px;text-align:center}body.admin_page_yikes-mailchimp-edit-form .ui-datepicker .ui-datepicker-title{font-weight:700}body.admin_page_yikes-mailchimp-edit-form .ui-datepicker .ui-datepicker-next,body.admin_page_yikes-mailchimp-edit-form .ui-datepicker .ui-datepicker-prev{cursor:default;font-family:'Glyphicons Halflings';-webkit-font-smoothing:antialiased;font-style:normal;font-weight:400;height:20px;line-height:1;margin-top:2px;width:30px}body.admin_page_yikes-mailchimp-edit-form .ui-datepicker .ui-datepicker-prev{float:left;text-align:left}body.admin_page_yikes-mailchimp-edit-form .ui-datepicker .ui-datepicker-next{float:right;text-align:right}body.admin_page_yikes-mailchimp-edit-form .ui-datepicker .ui-datepicker-prev:before{content:"\f141";font-family:dashicons}body.admin_page_yikes-mailchimp-edit-form .ui-datepicker .ui-datepicker-next:before{content:"\f139";font-family:dashicons}body.admin_page_yikes-mailchimp-edit-form .ui-datepicker-next:hover,body.admin_page_yikes-mailchimp-edit-form .ui-datepicker-prev:hover{cursor:pointer!important}body.admin_page_yikes-mailchimp-edit-form .ui-datepicker-close{display:none}body.admin_page_yikes-mailchimp-edit-form .ui-datepicker-current{color:#555!important;border-color:#ccc!important;background:#f7f7f7!important;box-shadow:0 1px 0 #ccc!important;vertical-align:top!important;display:inline-block;text-decoration:none;font-size:13px;line-height:26px;height:28px;padding:0 10px 1px;cursor:pointer;border-width:1px;border-style:solid;-webkit-appearance:none;border-radius:3px;white-space:nowrap;box-sizing:border-box;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;margin-top:10px}body.admin_page_yikes-mailchimp-edit-form .ui-datepicker .ui-datepicker-current-day a,body.admin_page_yikes-mailchimp-edit-form .ui-datepicker .ui-datepicker-today a{color:#fff}body.admin_page_yikes-mailchimp-edit-form .ui-datepicker .ui-icon{display:none}body.admin_page_yikes-mailchimp-edit-form .ui-datepicker .ui-datepicker-calendar{table-layout:fixed;width:100%}body.admin_page_yikes-mailchimp-edit-form .ui-datepicker .ui-datepicker-calendar td,body.admin_page_yikes-mailchimp-edit-form .ui-datepicker .ui-datepicker-calendar th{text-align:center;padding:4px 0}body.admin_page_yikes-mailchimp-edit-form .ui-datepicker .ui-datepicker-calendar td{border-radius:4px;transition:background-color .1s ease-in-out,color .1s ease-in-out}body.admin_page_yikes-mailchimp-edit-form .ui-datepicker .ui-datepicker-calendar td:hover{background-color:#EBEBEB;cursor:pointer}body.admin_page_yikes-mailchimp-edit-form .ui-datepicker .ui-datepicker-today{background-color:rgba(66,137,204,.65)}body.admin_page_yikes-mailchimp-edit-form .ui-datepicker .ui-datepicker-current-day{background-color:#4289cc}body.admin_page_yikes-mailchimp-edit-form .ui-datepicker .ui-datepicker-calendar .ui-datepicker-unselectable:hover{background-color:#fff;cursor:default}.custom-radio-holder{display:inline-block;width:100%;margin:.5em 0}.custom-radio-label{display:block;float:left;margin:0 5px}.custom-radio-label:first-child{margin-left:0!important}.custom-radio-label input[type=radio]{margin-right:0!important}.custom-select-field{display:block;width:100%;margin:.5em 0}#available-widgets [class*=yikes_easy] .widget-title:before{content:""!important;background:url(../../includes/images/MailChimp_Assets/Freddie_original.png) no-repeat #FAFAFA;background-size:contain}body.wp-customizer #available-widgets [id*="_yikes_easy_mc_widget"]>div.widget-top>div.widget-title>h4{background:0 0!important}#connection-container{float:right;color:#fff;padding:.25em .75em .25em .25em;margin-top:-4px}#connection-container.api-connected{background:#44ba44}#connection-container.api-not-connected{background:#b5b5b5}.yikes-mc-api-connected,.yikes-mc-api-not-connected{line-height:1}.show-some-love-container{transition:max-height .75s}#review-yikes-easy-mc{text-align:center}#review-yikes-easy-mc .dashicons-star-filled{color:#E6B800}.meta-box-sortables hr{margin:1.75em 0 0}#about-yikes-inc{display:none}#about-yikes-inc .about-sidebar-yikes-logo{float:left;width:95px;margin:5px 7px 0 0}#about-yikes-inc p{margin-top:0}.yikes-easy-mc-updated{display:block;border-left:4px solid #4EAEF0;margin:1em 20px 1em 0;padding:2px 10px;background:right bottom no-repeat #fff;background-size:120px;background-position-y:29px}.support-section{margin:1.5em 0;padding:1em 0}.github-octocat{background:url(../../includes/images/Support_Page/Octocat.png) left top no-repeat;background-size:100%;width:50px;height:45px;display:block;float:left;margin-top:-5px}@media screen and (max-width:1200px){.yikes-easy-mc-postbox #post-body.columns-2 #postbox-container-1{float:none}}@media screen and (max-width:850px){.option-menu-selected-arrow{display:none!important}}@media screen and (max-width:782px){#chimp-chatter .chimp-chatter-container{float:none;height:auto;width:100%}}.recaptcha-demo-gif{width:275px}.pro-version-only-notice{color:#d96060}.upgrading-ellipse-one{filter:alpha(opacity=0);-khtml-opacity:0;opacity:0;animation:dot 1.3s infinite;-webkit-animation-delay:0ms;animation-delay:0ms}.upgrading-ellipse-two{filter:alpha(opacity=0);-khtml-opacity:0;opacity:0;animation:dot 1.3s infinite;-webkit-animation-delay:.2s;animation-delay:.2s}.upgrading-ellipse-three{-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=0)";filter:alpha(opacity=0);-moz-opacity:0;-khtml-opacity:0;opacity:0;-webkit-animation:dot 1.3s infinite;animation:dot 1.3s infinite;-webkit-animation-delay:.3s;animation-delay:.3s}@-webkit-keyframes dot{0%,50%{opacity:0}100%{opacity:1}}@keyframes dot{0%,50%{opacity:0}100%{opacity:1}}
 
admin/css/yikes-inc-easy-mailchimp-migrate-option-styles.min.css CHANGED
@@ -1,2 +1 @@
1
- .upgrading-ellipse-one,.upgrading-ellipse-two{-webkit-animation:dot 1.3s infinite;opacity:0}.migrate-options-notice{display:none}.migration-complete-notification{margin-top:2em;font-size:18px;font-weight:200}#options-updated li:before{background:#FCFCFC;border-radius:50%;margin-right:5px;color:rgba(74,209,74,.69);font-family:Dashicons;content:"\f147"}#options-updated li:last-child:before{content:"";font-family:"";margin-left:15px;margin-top:2em!important}#options-updated li{margin:1em 0}.upgrading-ellipse-one{-webkit-animation:dot 1.3s infinite;animation:dot 1.3s infinite;-webkit-animation-delay:0ms;animation-delay:0ms}.upgrading-ellipse-two{-webkit-animation:dot 1.3s infinite;animation:dot 1.3s infinite;-webkit-animation-delay:.2s;animation-delay:.2s}.upgrading-ellipse-three{opacity:0;-webkit-animation:dot 1.3s infinite;animation:dot 1.3s infinite;-webkit-animation-delay:.3s;animation-delay:.3s}@-webkit-keyframes dot{0%,50%{opacity:0}100%{opacity:1}}@keyframes dot{0%,50%{opacity:0}100%{opacity:1}}
2
- /*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInlpa2VzLWluYy1lYXN5LW1haWxjaGltcC1taWdyYXRlLW9wdGlvbi1zdHlsZXMubWluLmNzcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSw4Q0FBOEMsb0NBQW9DLFNBQVMsQ0FBQyx3QkFBd0IsWUFBWSxDQUFDLGlDQUFpQyxlQUFlLGVBQWUsZUFBZSxDQUFDLDJCQUEyQixtQkFBbUIsa0JBQWtCLGlCQUFpQiwwQkFBMEIsc0JBQXNCLGVBQWUsQ0FBQyxzQ0FBc0MsV0FBVyxlQUFlLGlCQUFpQix3QkFBd0IsQ0FBQyxvQkFBb0IsWUFBWSxDQUFDLHVCQUF1QixvQ0FBNEIsQUFBNUIsNEJBQTRCLDRCQUE0QixtQkFBbUIsQ0FBQyx1QkFBdUIsb0NBQTRCLEFBQTVCLDRCQUE0Qiw0QkFBNEIsbUJBQW1CLENBQUMseUJBQXlCLFVBQVUsb0NBQW9DLDRCQUE0Qiw0QkFBNEIsbUJBQW1CLENBQUMsdUJBQXVCLE9BQU8sU0FBUyxDQUFDLEtBQUssU0FBUyxDQUFDLENBQUMsZUFBZSxPQUFPLFNBQVMsQ0FBQyxLQUFLLFNBQVMsQ0FBQyxDQUFDIiwiZmlsZSI6Inlpa2VzLWluYy1lYXN5LW1haWxjaGltcC1taWdyYXRlLW9wdGlvbi1zdHlsZXMubWluLmNzcyIsInNvdXJjZXNDb250ZW50IjpbIi51cGdyYWRpbmctZWxsaXBzZS1vbmUsLnVwZ3JhZGluZy1lbGxpcHNlLXR3b3std2Via2l0LWFuaW1hdGlvbjpkb3QgMS4zcyBpbmZpbml0ZTtvcGFjaXR5OjB9Lm1pZ3JhdGUtb3B0aW9ucy1ub3RpY2V7ZGlzcGxheTpub25lfS5taWdyYXRpb24tY29tcGxldGUtbm90aWZpY2F0aW9ue21hcmdpbi10b3A6MmVtO2ZvbnQtc2l6ZToxOHB4O2ZvbnQtd2VpZ2h0OjIwMH0jb3B0aW9ucy11cGRhdGVkIGxpOmJlZm9yZXtiYWNrZ3JvdW5kOiNGQ0ZDRkM7Ym9yZGVyLXJhZGl1czo1MCU7bWFyZ2luLXJpZ2h0OjVweDtjb2xvcjpyZ2JhKDc0LDIwOSw3NCwuNjkpO2ZvbnQtZmFtaWx5OkRhc2hpY29ucztjb250ZW50OlwiXFxmMTQ3XCJ9I29wdGlvbnMtdXBkYXRlZCBsaTpsYXN0LWNoaWxkOmJlZm9yZXtjb250ZW50OlwiXCI7Zm9udC1mYW1pbHk6XCJcIjttYXJnaW4tbGVmdDoxNXB4O21hcmdpbi10b3A6MmVtIWltcG9ydGFudH0jb3B0aW9ucy11cGRhdGVkIGxpe21hcmdpbjoxZW0gMH0udXBncmFkaW5nLWVsbGlwc2Utb25le2FuaW1hdGlvbjpkb3QgMS4zcyBpbmZpbml0ZTstd2Via2l0LWFuaW1hdGlvbi1kZWxheTowbXM7YW5pbWF0aW9uLWRlbGF5OjBtc30udXBncmFkaW5nLWVsbGlwc2UtdHdve2FuaW1hdGlvbjpkb3QgMS4zcyBpbmZpbml0ZTstd2Via2l0LWFuaW1hdGlvbi1kZWxheTouMnM7YW5pbWF0aW9uLWRlbGF5Oi4yc30udXBncmFkaW5nLWVsbGlwc2UtdGhyZWV7b3BhY2l0eTowOy13ZWJraXQtYW5pbWF0aW9uOmRvdCAxLjNzIGluZmluaXRlO2FuaW1hdGlvbjpkb3QgMS4zcyBpbmZpbml0ZTstd2Via2l0LWFuaW1hdGlvbi1kZWxheTouM3M7YW5pbWF0aW9uLWRlbGF5Oi4zc31ALXdlYmtpdC1rZXlmcmFtZXMgZG90ezAlLDUwJXtvcGFjaXR5OjB9MTAwJXtvcGFjaXR5OjF9fUBrZXlmcmFtZXMgZG90ezAlLDUwJXtvcGFjaXR5OjB9MTAwJXtvcGFjaXR5OjF9fSJdfQ== */
1
+ .upgrading-ellipse-one,.upgrading-ellipse-two{-webkit-animation:dot 1.3s infinite;opacity:0}.migrate-options-notice{display:none}.migration-complete-notification{margin-top:2em;font-size:18px;font-weight:200}#options-updated li:before{background:#FCFCFC;border-radius:50%;margin-right:5px;color:rgba(74,209,74,.69);font-family:Dashicons;content:"\f147"}#options-updated li:last-child:before{content:"";font-family:"";margin-left:15px;margin-top:2em!important}#options-updated li{margin:1em 0}.upgrading-ellipse-one{animation:dot 1.3s infinite;-webkit-animation-delay:0ms;animation-delay:0ms}.upgrading-ellipse-two{animation:dot 1.3s infinite;-webkit-animation-delay:.2s;animation-delay:.2s}.upgrading-ellipse-three{opacity:0;-webkit-animation:dot 1.3s infinite;animation:dot 1.3s infinite;-webkit-animation-delay:.3s;animation-delay:.3s}@-webkit-keyframes dot{0%,50%{opacity:0}100%{opacity:1}}@keyframes dot{0%,50%{opacity:0}100%{opacity:1}}
 
admin/js/min/yikes-inc-easy-mailchimp-extender-edit-form.min.js CHANGED
@@ -1 +1 @@
1
- function togglePageRedirection(a){1==a.value?jQuery("#redirect-user-to-selection-label").fadeIn():jQuery("#redirect-user-to-selection-label").fadeOut()}function storeGlobalClicked(a){var b=a.parents("td").find("input").attr("name");jQuery(".clicked-input").val(b)}function populateDefaultValue(a){var b=jQuery(".clicked-input").val();jQuery(".clicked-input").val(""),tb_remove(),jQuery('input[name="'+b+'"]').val(a)}function toggle_nested_section(a){var b=jQuery(a).val();switch(b){case"image":jQuery(".submit-button-type-text").fadeOut("fast",function(){jQuery(".submit-button-type-image").fadeIn("fast")});break;case"text":jQuery(".submit-button-type-image").fadeOut("fast",function(){jQuery(".submit-button-type-text").fadeIn("fast")});break;default:case"1":"yikes-easy-mc-form-schedule"==jQuery(a).attr("name")?jQuery(".date-restirction-section").fadeToggle():jQuery(".login-restirction-section").fadeToggle()}return!1}function initialize_form_schedule_time_pickers(){jQuery(".date-picker").datepicker({numberOfMonths:1,showButtonPanel:!0,closeText:object.closeText,currentText:object.currentText,monthNames:object.monthNames,monthNamesShort:object.monthNamesShort,dayNames:object.dayNames,dayNamesShort:object.dayNamesShort,dayNamesMin:object.dayNamesMin,dateFormat:object.dateFormat,firstDay:object.firstDay,isRTL:object.isRTL,onSelect:function(a,b){var c=b.lastVal,d=b.id;yikes_check_valid_date(a,c,d)}}),jQuery(".time-picker").timepicker({scrollDefault:"now",timeFormat:"h:i A"}),jQuery(".time-picker").on("changeTime",function(){var a=jQuery(this).attr("id"),b=jQuery("#yikes-easy-mc-form-restriction-start-date").val(),c=jQuery("#yikes-easy-mc-form-restriction-end-date").val();yikes_check_valid_date(b,c,a)})}function yikes_check_valid_date(a,b,c){var d=jQuery("#yikes-easy-mc-form-restriction-start-date").val(),e=jQuery("#yikes-easy-mc-form-restriction-end-date").val(),f=yikes_12_to_24_hour_time_conversion(jQuery("#yikes-easy-mc-form-restriction-start-time").val()),g=yikes_12_to_24_hour_time_conversion(jQuery("#yikes-easy-mc-form-restriction-end-time").val()),h=new Date(d+" "+f),i=new Date(e+" "+g);if(h>i){if(("yikes-easy-mc-form-restriction-start-date"==c||"yikes-easy-mc-form-restriction-end-date"==c)&&jQuery("#"+c).val(b),jQuery(".date-restirction-section").find("p.description.error").length)return;jQuery(".date-restirction-section").first().find("p.description").after('<p class="description error">'+object.start_date_exceeds_end_date_error+"</p>")}else jQuery(".date-restirction-section").find("p.description.error").remove()}function yikes_12_to_24_hour_time_conversion(a){var b=Number(a.match(/^(\d+)/)[1]),c=Number(a.match(/:(\d+)/)[1]),d=a.match(/\s(.*)$/)[1];"PM"==d&&12>b&&(b+=12),"AM"==d&&12==b&&(b-=12);var e=b.toString(),f=c.toString();return 10>b&&(e="0"+e),10>c&&(f="0"+f),e+":"+f}!function(a){"use strict";a(document).ready(function(){a("body").find("#form-builder-container").sortable({items:".draggable:not(.non-draggable-yikes)",axis:"y",placeholder:"form-builder-placeholder",update:function(){var a=1;jQuery("#form-builder-container").find(".draggable").each(function(){jQuery(this).find(".position-input").val(a),a++})}}),a("body").on("click",".remove-field",function(){var b=jQuery(this).attr("alt"),c=jQuery(this);return a(this).parents(".yikes-mc-settings-expansion-section").prev().find(".dashicons").toggleClass("dashicons-minus"),a(this).parents(".yikes-mc-settings-expansion-section").slideToggle(450,function(){c.parents(".draggable").find(".expansion-section-title").css("background","rgb(255, 134, 134)"),c.parents(".draggable").fadeOut("slow",function(){jQuery("#available-fields").find('li[alt="'+b+'"]').removeClass("not-available"),jQuery("#available-interest-groups").find('li[alt="'+b+'"]').removeClass("not-available"),jQuery(this).remove(),a("#form-builder-container").find(".draggable").length<1&&(a(".clear-form-fields").hide(),a(".clear-form-fields").next().hide(),a("#form-builder-container").html('<h4 class="no-fields-assigned-notice non-draggable-yikes"><em>'+object.no_fields_assigned+"</em></h4>"))})}),!1}),a("body").on("click",".hide-field",function(){return a(this).parents(".yikes-mc-settings-expansion-section").prev().find(".dashicons").toggleClass("dashicons-minus"),a(this).parents(".yikes-mc-settings-expansion-section").slideToggle(450),!1}),a("body").on("click",".add-field-to-editor",function(){var b=a("#form-builder-container").find(".draggable").length,c=a(".field-to-add-to-form").attr("alt");a("#available-fields").children("li").removeClass("available-form-field");var d=a(this);d.attr("disabled","disabled").attr("onclick","return false;").removeClass("add-field-to-editor");var e={action:"add_field_to_form",field_name:a(".field-to-add-to-form").attr("data-attr-field-name"),merge_tag:c,field_type:a(".field-to-add-to-form").attr("data-attr-field-type"),list_id:a(".field-to-add-to-form").attr("data-attr-form-id")};return a.ajax({url:object.ajax_url,type:"POST",data:e,dataType:"html",success:function(d,e,f){a(".field-to-add-to-form").removeClass("field-to-add-to-form").addClass("not-available"),a(".add-field-to-editor").hide(),1>b?(a("#form-builder-container").html("").append(d),a(".clear-form-fields").show(),a(".clear-form-fields").next().show()):a("#form-builder-container").append(d),a(".field-"+c+"-position").val(parseInt(b+1))},error:function(a,b,c){alert(b+a.status+a.responseText+"...")},complete:function(b,c){a("#available-fields").children("li").addClass("available-form-field"),d.removeAttr("disabled").removeAttr("onclick").addClass("add-field-to-editor"),a(".add-field-to-editor").hide()}}),!1}),a("body").on("click",".add-interest-group-to-editor",function(){var b=a("#form-builder-container").find(".draggable").length,c=a(".group-to-add-to-form").attr("alt");a("#available-interest-groups").children("li").removeClass("available-interest-group");var d=a(this);d.attr("disabled","disabled").attr("onclick","return false;").removeClass("add-interest-group-to-editor");var e={action:"add_interest_group_to_form",field_name:a(".group-to-add-to-form").attr("data-attr-field-name"),group_id:c,field_type:a(".group-to-add-to-form").attr("data-attr-field-type"),list_id:a(".group-to-add-to-form").attr("data-attr-form-id")};return a.ajax({url:object.ajax_url,type:"POST",data:e,dataType:"html",success:function(c,d,e){a(".group-to-add-to-form").removeClass("group-to-add-to-form").addClass("not-available"),a(".add-interest-group-to-editor").hide(),1>b?(a("#form-builder-container").html("").append(c),a(".clear-form-fields").show(),a(".clear-form-fields").next().show()):a("#form-builder-container").append(c)},error:function(a,b,c){alert(b+a.status+a.responseText+"...")},complete:function(b,c){a("#available-interest-groups").children("li").addClass("available-interest-group"),d.removeAttr("disabled").removeAttr("onclick").addClass("add-interest-group-to-editor"),a(".add-interest-group-to-editor").hide()}}),!1}),a(".color-picker").each(function(){a(this).wpColorPicker()}),a("body").on("click",".expansion-section-title",function(){return a(this).next().stop().slideToggle(),a(this).find(".dashicons").toggleClass("dashicons-minus"),!1}),a("body").on("click",".available-form-field",function(){return a(this).hasClass("not-available")?!1:void(a(this).hasClass("field-to-add-to-form")?(a(this).removeClass("field-to-add-to-form"),a(".add-field-to-editor").stop().fadeOut()):(a(".field-to-add-to-form").removeClass("field-to-add-to-form"),a(this).toggleClass("field-to-add-to-form"),a(".add-field-to-editor").stop().fadeIn()))}),a("body").on("click",".available-interest-group",function(){return a(this).hasClass("not-available")?!1:void(a(this).hasClass("group-to-add-to-form")?(a(this).removeClass("group-to-add-to-form"),a(".add-interest-group-to-editor").stop().fadeOut()):(a(".group-to-add-to-form").removeClass("group-to-add-to-form"),a(this).toggleClass("group-to-add-to-form"),a(".add-interest-group-to-editor").stop().fadeIn()))}),a("body").on("click",".hidden_setting",function(){a(".hidden_setting").removeClass("selected_hidden_setting"),a(".selected_setting_triangle").remove(),a(this).addClass("selected_hidden_setting").append('<div class="selected_setting_triangle"></div>');var b=a(this).attr("data-attr-container");a(".hidden-setting-label").hide(),a("#"+b).show()}),a("body").on("click",".close-form-expansion",function(){return a(this).parents(".yikes-mc-settings-expansion-section").slideToggle().prev().find(".dashicons").toggleClass("dashicons-minus"),!1}),a("body").on("click",".mv_ig_list .nav-tab",function(){if(a(this).hasClass("nav-tab-active"))return!1;if(a(this).hasClass("nav-tab-disabled"))return!1;a(".mv_ig_list .nav-tab").removeClass("nav-tab-active"),a(".arrow-down").remove(),a(this).addClass("nav-tab-active").prepend('<div class="arrow-down"></div>'),a(".mv_ig_list .nav-tab").addClass("nav-tab-disabled");var b=a(this).attr("alt");return"merge-variables"==b?(a("#merge-variables-container").stop().animate({left:"0px"},function(){a(".mv_ig_list .nav-tab").removeClass("nav-tab-disabled")}),a("#interest-groups-container").stop().animate({left:"+=268px"},function(){a(".mv_ig_list .nav-tab").removeClass("nav-tab-disabled")})):(a("#merge-variables-container").stop().animate({left:"-=278px"},function(){a(".mv_ig_list .nav-tab").removeClass("nav-tab-disabled")}),a("#interest-groups-container").stop().animate({left:"-=268px"},function(){a(".mv_ig_list .nav-tab").removeClass("nav-tab-disabled")})),!1}),a("body").on("click",".clear-form-fields",function(){return confirm(object.bulk_delete_alert)&&a("#form-builder").find(".draggable").find(".expansion-section-title").each(function(){a(this).css("background","rgb(255, 134, 134)");var b=a(this).parents(".draggable").find(".remove-field").attr("alt");a(this).fadeOut("slow",function(){a("#available-fields").find('li[alt="'+b+'"]').removeClass("not-available"),a("#available-interest-groups").find('li[alt="'+b+'"]').removeClass("not-available"),a(this).remove(),a(".clear-form-fields").hide(),a(".clear-form-fields").next().hide(),a(".available-form-field").each(function(){a(this).removeClass("not-available")}),a("#form-builder-container").html('<h4 class="no-fields-assigned-notice non-draggable-yikes"><em>'+object.no_fields_assigned+"</em></h4>")})}),!1}),initialize_form_schedule_time_pickers()})}(jQuery);
1
+ function togglePageRedirection(a){1==a.value?jQuery("#redirect-user-to-selection-label").fadeIn():jQuery("#redirect-user-to-selection-label").fadeOut()}function storeGlobalClicked(a){var b=a.parents("td").find("input").attr("name");jQuery(".clicked-input").val(b)}function populateDefaultValue(a){var b=jQuery(".clicked-input").val();jQuery(".clicked-input").val(""),tb_remove(),jQuery('input[name="'+b+'"]').val(a)}function toggle_nested_section(a){var b=jQuery(a).val();switch(b){case"image":jQuery(".submit-button-type-text").fadeOut("fast",function(){jQuery(".submit-button-type-image").fadeIn("fast")});break;case"text":jQuery(".submit-button-type-image").fadeOut("fast",function(){jQuery(".submit-button-type-text").fadeIn("fast")});break;default:case"1":"yikes-easy-mc-form-schedule"==jQuery(a).attr("name")?jQuery(".date-restirction-section").fadeToggle():jQuery(".login-restirction-section").fadeToggle()}return!1}function initialize_form_schedule_time_pickers(){jQuery(".date-picker").datepicker({numberOfMonths:1,showButtonPanel:!0,closeText:object.closeText,currentText:object.currentText,monthNames:object.monthNames,monthNamesShort:object.monthNamesShort,dayNames:object.dayNames,dayNamesShort:object.dayNamesShort,dayNamesMin:object.dayNamesMin,dateFormat:object.dateFormat,firstDay:object.firstDay,isRTL:object.isRTL,onSelect:function(a,b){var c=b.lastVal,d=b.id;yikes_check_valid_date(a,c,d)}}),jQuery(".time-picker").timepicker({scrollDefault:"now",timeFormat:"h:i A"}),jQuery(".time-picker").on("changeTime",function(){var a=jQuery(this).attr("id"),b=jQuery("#yikes-easy-mc-form-restriction-start-date").val(),c=jQuery("#yikes-easy-mc-form-restriction-end-date").val();yikes_check_valid_date(b,c,a)})}function yikes_check_valid_date(a,b,c){var d=jQuery("#yikes-easy-mc-form-restriction-start-date").val(),e=jQuery("#yikes-easy-mc-form-restriction-end-date").val(),f=yikes_12_to_24_hour_time_conversion(jQuery("#yikes-easy-mc-form-restriction-start-time").val()),g=yikes_12_to_24_hour_time_conversion(jQuery("#yikes-easy-mc-form-restriction-end-time").val()),h=new Date(d+" "+f),i=new Date(e+" "+g);if(h>i){if("yikes-easy-mc-form-restriction-start-date"!=c&&"yikes-easy-mc-form-restriction-end-date"!=c||jQuery("#"+c).val(b),jQuery(".date-restirction-section").find("p.description.error").length)return;jQuery(".date-restirction-section").first().find("p.description").after('<p class="description error">'+object.start_date_exceeds_end_date_error+"</p>")}else jQuery(".date-restirction-section").find("p.description.error").remove()}function yikes_12_to_24_hour_time_conversion(a){var b=Number(a.match(/^(\d+)/)[1]),c=Number(a.match(/:(\d+)/)[1]),d=a.match(/\s(.*)$/)[1];"PM"==d&&12>b&&(b+=12),"AM"==d&&12==b&&(b-=12);var e=b.toString(),f=c.toString();return 10>b&&(e="0"+e),10>c&&(f="0"+f),e+":"+f}!function(a){"use strict";a(document).ready(function(){a("body").find("#form-builder-container").sortable({items:".draggable:not(.non-draggable-yikes)",axis:"y",placeholder:"form-builder-placeholder",update:function(){var a=1;jQuery("#form-builder-container").find(".draggable").each(function(){jQuery(this).find(".position-input").val(a),a++})}}),a("body").on("click",".remove-field",function(){var b=jQuery(this).attr("alt"),c=jQuery(this);return a(this).parents(".yikes-mc-settings-expansion-section").prev().find(".dashicons").toggleClass("dashicons-minus"),a(this).parents(".yikes-mc-settings-expansion-section").slideToggle(450,function(){c.parents(".draggable").find(".expansion-section-title").css("background","rgb(255, 134, 134)"),c.parents(".draggable").fadeOut("slow",function(){jQuery("#available-fields").find('li[alt="'+b+'"]').removeClass("not-available"),jQuery("#available-interest-groups").find('li[alt="'+b+'"]').removeClass("not-available"),jQuery(this).remove(),a("#form-builder-container").find(".draggable").length<1&&(a(".clear-form-fields").hide(),a(".clear-form-fields").next().hide(),a("#form-builder-container").html('<h4 class="no-fields-assigned-notice non-draggable-yikes"><em>'+object.no_fields_assigned+"</em></h4>"))})}),!1}),a("body").on("click",".hide-field",function(){return a(this).parents(".yikes-mc-settings-expansion-section").prev().find(".dashicons").toggleClass("dashicons-minus"),a(this).parents(".yikes-mc-settings-expansion-section").slideToggle(450),!1}),a("body").on("click",".add-field-to-editor",function(){var b=a("#form-builder-container").find(".draggable").length,c=a(".field-to-add-to-form").attr("alt");a("#available-fields").children("li").removeClass("available-form-field");var d=a(this);d.attr("disabled","disabled").attr("onclick","return false;").removeClass("add-field-to-editor");var e={action:"add_field_to_form",field_name:a(".field-to-add-to-form").attr("data-attr-field-name"),merge_tag:c,field_type:a(".field-to-add-to-form").attr("data-attr-field-type"),list_id:a(".field-to-add-to-form").attr("data-attr-form-id")};return a.ajax({url:object.ajax_url,type:"POST",data:e,dataType:"html",success:function(d,e,f){a(".field-to-add-to-form").removeClass("field-to-add-to-form").addClass("not-available"),a(".add-field-to-editor").hide(),1>b?(a("#form-builder-container").html("").append(d),a(".clear-form-fields").show(),a(".clear-form-fields").next().show()):a("#form-builder-container").append(d),a(".field-"+c+"-position").val(parseInt(b+1))},error:function(a,b,c){alert(b+a.status+a.responseText+"...")},complete:function(b,c){a("#available-fields").children("li").addClass("available-form-field"),d.removeAttr("disabled").removeAttr("onclick").addClass("add-field-to-editor"),a(".add-field-to-editor").hide()}}),!1}),a("body").on("click",".add-interest-group-to-editor",function(){var b=a("#form-builder-container").find(".draggable").length,c=a(".group-to-add-to-form").attr("alt");a("#available-interest-groups").children("li").removeClass("available-interest-group");var d=a(this);d.attr("disabled","disabled").attr("onclick","return false;").removeClass("add-interest-group-to-editor");var e={action:"add_interest_group_to_form",field_name:a(".group-to-add-to-form").attr("data-attr-field-name"),group_id:c,field_type:a(".group-to-add-to-form").attr("data-attr-field-type"),list_id:a(".group-to-add-to-form").attr("data-attr-form-id")};return a.ajax({url:object.ajax_url,type:"POST",data:e,dataType:"html",success:function(c,d,e){a(".group-to-add-to-form").removeClass("group-to-add-to-form").addClass("not-available"),a(".add-interest-group-to-editor").hide(),1>b?(a("#form-builder-container").html("").append(c),a(".clear-form-fields").show(),a(".clear-form-fields").next().show()):a("#form-builder-container").append(c)},error:function(a,b,c){alert(b+a.status+a.responseText+"...")},complete:function(b,c){a("#available-interest-groups").children("li").addClass("available-interest-group"),d.removeAttr("disabled").removeAttr("onclick").addClass("add-interest-group-to-editor"),a(".add-interest-group-to-editor").hide()}}),!1}),a(".color-picker").each(function(){a(this).wpColorPicker()}),a("body").on("click",".expansion-section-title",function(){return a(this).next().stop().slideToggle(),a(this).find(".dashicons").toggleClass("dashicons-minus"),!1}),a("body").on("click",".available-form-field",function(){return a(this).hasClass("not-available")?!1:void(a(this).hasClass("field-to-add-to-form")?(a(this).removeClass("field-to-add-to-form"),a(".add-field-to-editor").stop().fadeOut()):(a(".field-to-add-to-form").removeClass("field-to-add-to-form"),a(this).toggleClass("field-to-add-to-form"),a(".add-field-to-editor").stop().fadeIn()))}),a("body").on("click",".available-interest-group",function(){return a(this).hasClass("not-available")?!1:void(a(this).hasClass("group-to-add-to-form")?(a(this).removeClass("group-to-add-to-form"),a(".add-interest-group-to-editor").stop().fadeOut()):(a(".group-to-add-to-form").removeClass("group-to-add-to-form"),a(this).toggleClass("group-to-add-to-form"),a(".add-interest-group-to-editor").stop().fadeIn()))}),a("body").on("click",".hidden_setting",function(){a(".hidden_setting").removeClass("selected_hidden_setting"),a(".selected_setting_triangle").remove(),a(this).addClass("selected_hidden_setting").append('<div class="selected_setting_triangle"></div>');var b=a(this).attr("data-attr-container");a(".hidden-setting-label").hide(),a("#"+b).show()}),a("body").on("click",".close-form-expansion",function(){return a(this).parents(".yikes-mc-settings-expansion-section").slideToggle().prev().find(".dashicons").toggleClass("dashicons-minus"),!1}),a("body").on("click",".mv_ig_list .nav-tab",function(){if(a(this).hasClass("nav-tab-active"))return!1;if(a(this).hasClass("nav-tab-disabled"))return!1;a(".mv_ig_list .nav-tab").removeClass("nav-tab-active"),a(".arrow-down").remove(),a(this).addClass("nav-tab-active").prepend('<div class="arrow-down"></div>'),a(".mv_ig_list .nav-tab").addClass("nav-tab-disabled");var b=a(this).attr("alt");return"merge-variables"==b?(a("#merge-variables-container").stop().animate({left:"0px"},function(){a(".mv_ig_list .nav-tab").removeClass("nav-tab-disabled")}),a("#interest-groups-container").stop().animate({left:"+=268px"},function(){a(".mv_ig_list .nav-tab").removeClass("nav-tab-disabled")})):(a("#merge-variables-container").stop().animate({left:"-=278px"},function(){a(".mv_ig_list .nav-tab").removeClass("nav-tab-disabled")}),a("#interest-groups-container").stop().animate({left:"-=268px"},function(){a(".mv_ig_list .nav-tab").removeClass("nav-tab-disabled")})),!1}),a("body").on("click",".clear-form-fields",function(){return confirm(object.bulk_delete_alert)&&a("#form-builder").find(".draggable").find(".expansion-section-title").each(function(){a(this).css("background","rgb(255, 134, 134)");var b=a(this).parents(".draggable").find(".remove-field").attr("alt");a(this).fadeOut("slow",function(){a("#available-fields").find('li[alt="'+b+'"]').removeClass("not-available"),a("#available-interest-groups").find('li[alt="'+b+'"]').removeClass("not-available"),a(this).remove(),a(".clear-form-fields").hide(),a(".clear-form-fields").next().hide(),a(".available-form-field").each(function(){a(this).removeClass("not-available")}),a("#form-builder-container").html('<h4 class="no-fields-assigned-notice non-draggable-yikes"><em>'+object.no_fields_assigned+"</em></h4>")})}),!1}),initialize_form_schedule_time_pickers()})}(jQuery);
admin/partials/ajax/add_field_to_form.php CHANGED
@@ -1,14 +1,24 @@
1
  <?php
2
  // lets run an ajax request to get all of our field data, to either prepopulate
3
  // or build our default selection arrays etc.
4
- $api_key = get_option( 'yikes-mc-api-key' , '' );
5
- $MailChimp = new MailChimp( $api_key );
6
- // retreive our list data
7
- $available_merge_variables = $MailChimp->call( 'lists/merge-vars' , array( 'apikey' => $api_key , 'id' => array( $form_data_array['list_id'] ) ) );
 
 
 
 
 
 
 
 
 
 
8
  // find and return the location of this merge field in the array
9
- $index = $this->findMCListIndex( $form_data_array['merge_tag'] , $available_merge_variables['data'][0]['merge_vars'] , 'tag' );
10
  // store it and use it to pre-populate field data (only on initial add to form)
11
- $merge_field_data = $available_merge_variables['data'][0]['merge_vars'][$index];
12
  ?>
13
  <section class="draggable" id="<?php echo $form_data_array['field_name']; ?>">
14
  <!-- top -->
@@ -19,7 +29,7 @@
19
  <!-- expansion section -->
20
  <div class="yikes-mc-settings-expansion-section">
21
 
22
- <!-- Single or Double Optin -->
23
  <p class="type-container form-field-container"><!-- necessary to prevent skipping on slideToggle(); -->
24
  <!-- store the label -->
25
  <input type="hidden" name="field[<?php echo $merge_field_data['tag']; ?>][label]" value="<?php echo $form_data_array['field_name']; ?>" />
1
  <?php
2
  // lets run an ajax request to get all of our field data, to either prepopulate
3
  // or build our default selection arrays etc.
4
+ $api_key = trim( get_option( 'yikes-mc-api-key' , '' ) );
5
+ $dash_position = strpos( $api_key, '-' );
6
+ if( $dash_position !== false ) {
7
+ $api_endpoint = 'https://' . substr( $api_key, $dash_position + 1 ) . '.api.mailchimp.com/2.0/lists/merge-vars.json';
8
+ }
9
+ $available_merge_variables = wp_remote_post( $api_endpoint, array(
10
+ 'body' => array(
11
+ 'apikey' => $api_key,
12
+ 'id' => array( $form_data_array['list_id'] ),
13
+ ),
14
+ 'timeout' => 10,
15
+ 'sslverify' => apply_filters( 'yikes-mailchimp-sslverify', true )
16
+ ) );
17
+ $body = json_decode( wp_remote_retrieve_body( $available_merge_variables ), true );
18
  // find and return the location of this merge field in the array
19
+ $index = $this->findMCListIndex( $form_data_array['merge_tag'] , $body['data'][0]['merge_vars'], 'tag' );
20
  // store it and use it to pre-populate field data (only on initial add to form)
21
+ $merge_field_data = $body['data'][0]['merge_vars'][$index];
22
  ?>
23
  <section class="draggable" id="<?php echo $form_data_array['field_name']; ?>">
24
  <!-- top -->
29
  <!-- expansion section -->
30
  <div class="yikes-mc-settings-expansion-section">
31
 
32
+ <!-- Single or Double Opt-in -->
33
  <p class="type-container form-field-container"><!-- necessary to prevent skipping on slideToggle(); -->
34
  <!-- store the label -->
35
  <input type="hidden" name="field[<?php echo $merge_field_data['tag']; ?>][label]" value="<?php echo $form_data_array['field_name']; ?>" />
admin/partials/ajax/add_interest_group_to_form.php CHANGED
@@ -1,20 +1,29 @@
1
  <?php
2
- // lets run an ajax request to get all of our field data, to either prepopulate
3
- // or build our default selection arrays etc.
4
- $api_key = get_option( 'yikes-mc-api-key' , '' );
5
- $MailChimp = new MailChimp( $api_key );
 
6
  // get the interest group data
7
  try {
8
- $interest_groupings = $MailChimp->call( 'lists/interest-groupings' , array( 'apikey' => $api_key , 'id' => $form_data_array['list_id'] ) );
9
- if( $interest_groupings ) {
 
 
 
 
 
 
 
 
10
  // find and return the location of this merge field in the array
11
- $index = $this->findMCListIndex( $form_data_array['group_id'] , $interest_groupings , 'id' );
12
  // check for our index...
13
  if( isset( $index) ) {
14
  // store it and use it to pre-populate field data (only on initial add to form)
15
- $merge_field_data = $interest_groupings[$index];
16
  }
17
- }
18
  } catch( Exception $error ) {
19
  $no_interest_groupings = $error->getMessage();
20
  }
@@ -28,7 +37,7 @@
28
  <!-- expansion section -->
29
  <div class="yikes-mc-settings-expansion-section">
30
 
31
- <!-- Single or Double Optin -->
32
  <p class="type-container"><!-- necessary to prevent skipping on slideToggle(); -->
33
  <!-- store the label -->
34
  <input type="hidden" name="field[<?php echo $form_data_array['group_id']; ?>][label]" value="<?php echo $form_data_array['field_name']; ?>" />
1
  <?php
2
+ $api_key = trim( get_option( 'yikes-mc-api-key' , '' ) );
3
+ $dash_position = strpos( $api_key, '-' );
4
+ if( $dash_position !== false ) {
5
+ $api_endpoint = 'https://' . substr( $api_key, $dash_position + 1 ) . '.api.mailchimp.com/2.0/lists/interest-groupings.json';
6
+ }
7
  // get the interest group data
8
  try {
9
+ $interest_groupings = wp_remote_post( $api_endpoint, array(
10
+ 'body' => array(
11
+ 'apikey' => $api_key,
12
+ 'id' => $form_data_array['list_id']
13
+ ),
14
+ 'timeout' => 10,
15
+ 'sslverify' => apply_filters( 'yikes-mailchimp-sslverify', true )
16
+ ) );
17
+ $interest_groupings_body = json_decode( wp_remote_retrieve_body( $interest_groupings ), true );
18
+ if( $interest_groupings_body ) {
19
  // find and return the location of this merge field in the array
20
+ $index = $this->findMCListIndex( $form_data_array['group_id'], $interest_groupings_body, 'id' );
21
  // check for our index...
22
  if( isset( $index) ) {
23
  // store it and use it to pre-populate field data (only on initial add to form)
24
+ $merge_field_data = $interest_groupings_body[$index];
25
  }
26
+ }
27
  } catch( Exception $error ) {
28
  $no_interest_groupings = $error->getMessage();
29
  }
37
  <!-- expansion section -->
38
  <div class="yikes-mc-settings-expansion-section">
39
 
40
+ <!-- Single or Double Opt-in -->
41
  <p class="type-container"><!-- necessary to prevent skipping on slideToggle(); -->
42
  <!-- store the label -->
43
  <input type="hidden" name="field[<?php echo $form_data_array['group_id']; ?>][label]" value="<?php echo $form_data_array['field_name']; ?>" />
admin/partials/ajax/class.ajax.php CHANGED
@@ -40,12 +40,21 @@
40
  // is displayed on the dashboard
41
  public function get_new_list_data() {
42
  $list_id = $_POST['list_id'];
43
- $api_key = get_option( 'yikes-mc-api-key' , '' );
44
- // initialize MailChimp Class
45
- $MailChimp = new MailChimp( $api_key );
46
- // retreive our list data
47
- $list_data = $MailChimp->call( 'lists/list' , array( 'apikey' => $api_key, 'filters' => array( 'list_id' => $list_id ) ) );
48
- if( !empty( $list_data['data'] ) ) {
 
 
 
 
 
 
 
 
 
49
  include_once( YIKES_MC_PATH . 'admin/partials/dashboard-widgets/templates/stats-list-template.php' );
50
  }
51
  exit();
@@ -53,7 +62,7 @@
53
  }
54
 
55
  // Process our AJAX request,
56
- // whent the user switches lists in the integration settings page
57
  // we want to return the interest groups associated with this list,
58
  // to allow users to pre-check anything they want to assign users appropriately
59
  /* note: this function is called statically from the integration settings page */
@@ -64,15 +73,25 @@
64
  if( ! $integration_type ) {
65
  $integration_type = $_POST['integration'];
66
  }
67
- $api_key = get_option( 'yikes-mc-api-key' , '' );
68
  // setup/check our transients
69
  if ( WP_DEBUG || false === ( $interest_groupings = get_transient( $list_id . '_interest_group' ) ) ) {
70
  // It wasn't there, so regenerate the data and save the transient
71
- try {
72
- // initialize MailChimp Class
73
- $MailChimp = new MailChimp( $api_key );
74
- // retreive our interest group data
75
- $interest_groupings = $MailChimp->call( 'lists/interest-groupings' , array( 'apikey' => $api_key , 'id' => $list_id , 'counts' => false ) );
 
 
 
 
 
 
 
 
 
 
76
  } catch( Exception $error ) {
77
  $interest_groupings = $error->getMessage();
78
  }
@@ -121,9 +140,9 @@
121
  * and return the index ( used to find the list name assigned to a form )
122
  * - http://stackoverflow.com/questions/6661530/php-multi-dimensional-array-search
123
  */
124
- public function findMCListIndex( $id, $array , $tag ) {
125
  if( $tag == 'tag' ) {
126
- foreach ( $array as $key => $val ) {
127
  if ( $val['tag'] === $id ) {
128
  return $key;
129
  }
40
  // is displayed on the dashboard
41
  public function get_new_list_data() {
42
  $list_id = $_POST['list_id'];
43
+ $api_key = trim( get_option( 'yikes-mc-api-key' , '' ) );
44
+ $dash_position = strpos( $api_key, '-' );
45
+ if( $dash_position !== false ) {
46
+ $api_endpoint = 'https://' . substr( $api_key, $dash_position + 1 ) . '.api.mailchimp.com/2.0/lists/list.json';
47
+ }
48
+ $list_data = wp_remote_post( $api_endpoint, array(
49
+ 'body' => array(
50
+ 'apikey' => $api_key,
51
+ 'filters' => array( 'list_id' => $list_id )
52
+ ),
53
+ 'timeout' => 10,
54
+ 'sslverify' => apply_filters( 'yikes-mailchimp-sslverify', true )
55
+ ) );
56
+ $list_data = json_decode( wp_remote_retrieve_body( $list_data ), true );
57
+ if( ! empty( $list_data['data'][0] ) ) {
58
  include_once( YIKES_MC_PATH . 'admin/partials/dashboard-widgets/templates/stats-list-template.php' );
59
  }
60
  exit();
62
  }
63
 
64
  // Process our AJAX request,
65
+ // when the user switches lists in the integration settings page
66
  // we want to return the interest groups associated with this list,
67
  // to allow users to pre-check anything they want to assign users appropriately
68
  /* note: this function is called statically from the integration settings page */
73
  if( ! $integration_type ) {
74
  $integration_type = $_POST['integration'];
75
  }
76
+ $api_key = trim( get_option( 'yikes-mc-api-key' , '' ) );
77
  // setup/check our transients
78
  if ( WP_DEBUG || false === ( $interest_groupings = get_transient( $list_id . '_interest_group' ) ) ) {
79
  // It wasn't there, so regenerate the data and save the transient
80
+ try {
81
+ $dash_position = strpos( $api_key, '-' );
82
+ if( $dash_position !== false ) {
83
+ $api_endpoint = 'https://' . substr( $api_key, $dash_position + 1 ) . '.api.mailchimp.com/2.0/lists/interest-groupings.json';
84
+ }
85
+ $interest_groupings = wp_remote_post( $api_endpoint, array(
86
+ 'body' => array(
87
+ 'apikey' => $api_key,
88
+ 'id' => $list_id,
89
+ 'counts' => false
90
+ ),
91
+ 'timeout' => 10,
92
+ 'sslverify' => apply_filters( 'yikes-mailchimp-sslverify', true )
93
+ ) );
94
+ $interest_groupings = json_decode( wp_remote_retrieve_body( $interest_groupings ), true );
95
  } catch( Exception $error ) {
96
  $interest_groupings = $error->getMessage();
97
  }
140
  * and return the index ( used to find the list name assigned to a form )
141
  * - http://stackoverflow.com/questions/6661530/php-multi-dimensional-array-search
142
  */
143
+ public function findMCListIndex( $id, $array, $tag ) {
144
  if( $tag == 'tag' ) {
145
+ foreach( $array as $key => $val ) {
146
  if ( $val['tag'] === $id ) {
147
  return $key;
148
  }
admin/partials/ajax/process_ajax.php CHANGED
@@ -8,14 +8,24 @@
8
  * @since 6.0.0
9
  * Author: Yikes Inc. | https://www.yikesinc.com
10
  */
11
- $api_key = get_option( 'yikes-mc-api-key' , '' );
12
- $MailChimp = new MailChimp( $api_key );
13
- // retreive our list data
14
- $available_merge_variables = $MailChimp->call( 'lists/merge-vars' , array( 'apikey' => $api_key , 'id' => array( $form_data_array['list_id'] ) ) );
 
 
 
 
 
 
 
 
 
 
15
  // find and return the location of this merge field in the array
16
- $index = $this->findMCListIndex( $form_data_array['merge_tag'] , $available_merge_variables['data'][0]['merge_vars'] , 'tag' );
17
  // store it and use it to pre-populate field data (only on initial add to form)
18
- $merge_field_data = $available_merge_variables['data'][0]['merge_vars'][$index];
19
  ?>
20
  <section class="draggable" id="<?php echo $form_data_array['field_name']; ?>">
21
  <!-- top -->
@@ -26,7 +36,7 @@
26
  <!-- expansion section -->
27
  <div class="yikes-mc-settings-expansion-section">
28
 
29
- <!-- Single or Double Optin -->
30
  <p class="type-container form-field-container"><!-- necessary to prevent skipping on slideToggle(); -->
31
  <!-- store the label -->
32
  <input type="hidden" name="field[<?php echo $merge_field_data['tag']; ?>][label]" value="<?php echo $form_data_array['field_name']; ?>" />
8
  * @since 6.0.0
9
  * Author: Yikes Inc. | https://www.yikesinc.com
10
  */
11
+ $api_key = trim( get_option( 'yikes-mc-api-key' , '' ) );
12
+ $dash_position = strpos( $api_key, '-' );
13
+ if( $dash_position !== false ) {
14
+ $api_endpoint = 'https://' . substr( $api_key, $dash_position + 1 ) . '.api.mailchimp.com/2.0/lists/merge-vars.json';
15
+ }
16
+ $available_merge_variables = wp_remote_post( $api_endpoint, array(
17
+ 'body' => array(
18
+ 'apikey' => $api_key,
19
+ 'id' => array( $form_data_array['list_id'] ),
20
+ ),
21
+ 'timeout' => 10,
22
+ 'sslverify' => apply_filters( 'yikes-mailchimp-sslverify', true )
23
+ ) );
24
+ $body = json_decode( wp_remote_retrieve_body( $available_merge_variables ), true );
25
  // find and return the location of this merge field in the array
26
+ $index = $this->findMCListIndex( $form_data_array['merge_tag'] , $body['data'][0]['merge_vars'], 'tag' );
27
  // store it and use it to pre-populate field data (only on initial add to form)
28
+ $merge_field_data = $body['data'][0]['merge_vars'][$index];
29
  ?>
30
  <section class="draggable" id="<?php echo $form_data_array['field_name']; ?>">
31
  <!-- top -->
36
  <!-- expansion section -->
37
  <div class="yikes-mc-settings-expansion-section">
38
 
39
+ <!-- Single or Double Opt-in -->
40
  <p class="type-container form-field-container"><!-- necessary to prevent skipping on slideToggle(); -->
41
  <!-- store the label -->
42
  <input type="hidden" name="field[<?php echo $merge_field_data['tag']; ?>][label]" value="<?php echo $form_data_array['field_name']; ?>" />
admin/partials/dashboard-widgets/class.list-activity-widget.php CHANGED
@@ -60,16 +60,26 @@
60
  // Get our list data!
61
  // Check for a transient, if not - set one up for one hour
62
  if ( false === ( $list_data = get_transient( 'yikes-easy-mailchimp-list-data' ) ) ) {
63
- // initialize MailChimp Class
64
- $MailChimp = new MailChimp( get_option( 'yikes-mc-api-key' , '' ) );
65
- // retreive our list data
66
- $list_data = $MailChimp->call( 'lists/list' , array( 'apikey' => get_option( 'yikes-mc-api-key' , '' ), 'limit' => 100 ) );
 
 
 
 
 
 
 
 
 
 
67
  // set our transient
68
  set_transient( 'yikes-easy-mailchimp-list-data', $list_data, 1 * HOUR_IN_SECONDS );
69
  }
70
  ?>
71
  <!-- Dropdown to Change the list -->
72
- <?php if( !empty( $list_data['data'] ) ) {
73
  ?><section class="inside-widget yikes-dashboard-widget-section">
74
  <strong class="select-list-title"><?php _e( 'Select a list' , 'yikes-inc-easy-mailchimp-extender' ) ?>:</strong>
75
  <select id="yikes-easy-mc-dashboard-change-list" class="widefat">
@@ -102,15 +112,24 @@
102
  function account_activity_dashboard_widget() {
103
  // Get our list data!
104
  // Check for a transient, if not - set one up for one hour
105
- if ( false === ( $account_activity = get_transient( 'yikes-easy-mailchimp-account-activity' ) ) ) {
106
- // initialize MailChimp Class
107
- $MailChimp = new MailChimp( get_option( 'yikes-mc-api-key' , '' ) );
108
- // retreive our list data
109
- $account_activity = $MailChimp->call('/helper/chimp-chatter', array( 'api_key' => get_option( 'yikes-mc-api-key' , '' ) ) );
 
 
 
 
 
 
 
 
 
110
  // set our transient for one hour
111
  set_transient( 'yikes-easy-mailchimp-account-activity', $account_activity, 1 * HOUR_IN_SECONDS );
112
  }
113
- if( !empty( $account_activity ) ) {
114
  include_once( YIKES_MC_PATH . 'admin/partials/dashboard-widgets/templates/account-activity-template.php' );
115
  }
116
  }
60
  // Get our list data!
61
  // Check for a transient, if not - set one up for one hour
62
  if ( false === ( $list_data = get_transient( 'yikes-easy-mailchimp-list-data' ) ) ) {
63
+ $api_key = trim( get_option( 'yikes-mc-api-key' , '' ) );
64
+ $dash_position = strpos( $api_key, '-' );
65
+ if( $dash_position !== false ) {
66
+ $api_endpoint = 'https://' . substr( $api_key, $dash_position + 1 ) . '.api.mailchimp.com/2.0/lists/list.json';
67
+ }
68
+ $list_data = wp_remote_post( $api_endpoint, array(
69
+ 'body' => array(
70
+ 'apikey' => $api_key,
71
+ 'limit' => 100
72
+ ),
73
+ 'timeout' => 10,
74
+ 'sslverify' => apply_filters( 'yikes-mailchimp-sslverify', true )
75
+ ) );
76
+ $list_data = json_decode( wp_remote_retrieve_body( $list_data ), true );
77
  // set our transient
78
  set_transient( 'yikes-easy-mailchimp-list-data', $list_data, 1 * HOUR_IN_SECONDS );
79
  }
80
  ?>
81
  <!-- Dropdown to Change the list -->
82
+ <?php if( ! empty( $list_data['data'] ) ) {
83
  ?><section class="inside-widget yikes-dashboard-widget-section">
84
  <strong class="select-list-title"><?php _e( 'Select a list' , 'yikes-inc-easy-mailchimp-extender' ) ?>:</strong>
85
  <select id="yikes-easy-mc-dashboard-change-list" class="widefat">
112
  function account_activity_dashboard_widget() {
113
  // Get our list data!
114
  // Check for a transient, if not - set one up for one hour
115
+ if ( false === ( $account_activity = get_transient( 'yikes-easy-mailchimp-account-activity' ) ) ) {
116
+ $api_key = trim( get_option( 'yikes-mc-api-key' , '' ) );
117
+ $dash_position = strpos( $api_key, '-' );
118
+ if( $dash_position !== false ) {
119
+ $api_endpoint = 'https://' . substr( $api_key, $dash_position + 1 ) . '.api.mailchimp.com/2.0/helper/chimp-chatter.json';
120
+ }
121
+ $account_activity = wp_remote_post( $api_endpoint, array(
122
+ 'body' => array(
123
+ 'apikey' => $api_key
124
+ ),
125
+ 'timeout' => 10,
126
+ 'sslverify' => apply_filters( 'yikes-mailchimp-sslverify', true )
127
+ ) );
128
+ $account_activity = json_decode( wp_remote_retrieve_body( $account_activity ), true );
129
  // set our transient for one hour
130
  set_transient( 'yikes-easy-mailchimp-account-activity', $account_activity, 1 * HOUR_IN_SECONDS );
131
  }
132
+ if( ! empty( $account_activity ) ) {
133
  include_once( YIKES_MC_PATH . 'admin/partials/dashboard-widgets/templates/account-activity-template.php' );
134
  }
135
  }
admin/partials/edit-form.php CHANGED
@@ -59,22 +59,41 @@
59
  );
60
  }
61
 
 
 
 
62
  // Check for a transient, if not - set one up for one hour
63
  if ( false === ( $list_data = get_transient( 'yikes-easy-mailchimp-list-data' ) ) ) {
64
- // initialize MailChimp Class
65
- $MailChimp = new MailChimp( get_option( 'yikes-mc-api-key' , '' ) );
66
- // retreive our list data
67
- $list_data = $MailChimp->call( 'lists/list' , array( 'apikey' => get_option( 'yikes-mc-api-key' , '' ), 'limit' => 100 ) );
 
 
 
 
 
 
 
 
68
  // set our transient
69
  set_transient( 'yikes-easy-mailchimp-list-data', $list_data, 1 * HOUR_IN_SECONDS );
70
  }
71
 
72
  // get the list data
73
  try {
74
- $api_key = get_option( 'yikes-mc-api-key' , '' );
75
- $MailChimp = new MailChimp( $api_key );
76
- // retreive our list data
77
- $available_merge_variables = $MailChimp->call( 'lists/merge-vars' , array( 'apikey' => $api_key , 'id' => array( $form['list_id'] ) ) );
 
 
 
 
 
 
 
 
78
  } catch ( Exception $e ) {
79
  $merge_variable_error = '<p class="description error-descripion">' . __( 'Error' , 'yikes-inc-easy-mailchimp-extender' ) . ' : ' . $e->getMessage() . '.</p>';
80
  wp_die( __( "Uh Oh...It looks like we ran into an error! Please reload the page and try again. If the error persists, please contact the YIKES Inc. support team.", 'yikes-inc-easy-mailchimp-extender' ) , 500 );
@@ -82,7 +101,18 @@
82
 
83
  // get the interest group data
84
  try {
85
- $interest_groupings = $MailChimp->call( 'lists/interest-groupings' , array( 'apikey' => $api_key , 'id' => $form['list_id'] ) );
 
 
 
 
 
 
 
 
 
 
 
86
  $no_interest_groupings = '<p class="description error-descripion">' . __( 'No Interest Groups Found' , 'yikes-inc-easy-mailchimp-extender' ) . '.</p>';
87
  } catch( Exception $error ) {
88
  $no_interest_groupings = '<p class="description error-descripion">' . $error->getMessage() . '.</p>';
@@ -452,7 +482,7 @@
452
  <label class="inline-form-label">
453
  <input type="checkbox" onclick="toggle_nested_section( jQuery(this) );" name="yikes-easy-mc-form-login-required" value="1" <?php checked( $form_settings['yikes-easy-mc-form-login-required'], '1' ); ?> /><?php _e( 'Require Login', 'yikes-inc-easy-mailchimp-extender' ); ?>
454
  </label>
455
- <p class="description"><?php _e( 'Require users to be logged in before they can view and submit this optin form.', 'yikes-inc-easy-mailchimp-extender' ); ?></p>
456
 
457
  <!-- Require Login Message -->
458
  <section class="login-restirction-section nested-child<?php if( $form_settings['yikes-easy-mc-form-login-required'] == '0' ) { echo ' hidden'; } ?>">
@@ -635,7 +665,7 @@
635
  <div class="yikes-mc-settings-expansion-section">
636
  <!-- Associated List -->
637
  <p class="form-field-container"><!-- necessary to prevent skipping on slideToggle(); --><label for="associated-list"><strong><?php _e( 'Associated List' , 'yikes-inc-easy-mailchimp-extender' ); ?></strong>
638
- <select name="associated-list" id="associated-list" <?php if( empty( $list_data['data'] ) ) { echo 'disabled="disabled"'; } ?>>
639
  <?php
640
  if( !empty( $list_data['data'] ) ) {
641
  foreach( $list_data['data'] as $mailing_list ) {
@@ -651,6 +681,9 @@
651
  ?>
652
  </select>
653
  <?php if( !empty( $list_data['data'] ) ) { ?>
 
 
 
654
  <p class="description">
655
  <?php _e( "Users who sign up via this form will be added to the list selected above." , 'yikes-inc-easy-mailchimp-extender' ); ?>
656
  </p>
@@ -663,11 +696,11 @@
663
  </div>
664
 
665
  <a href="#" class="expansion-section-title settings-sidebar">
666
- <span class="dashicons dashicons-plus"></span><?php _e( 'Optin Settings' , 'yikes-inc-easy-mailchimp-extender' ); ?>
667
  </a>
668
  <div class="yikes-mc-settings-expansion-section">
669
 
670
- <!-- Single or Double Optin -->
671
  <?php
672
  if( !isset( $optin_settings['optin'] ) ) {
673
  $optin_settings['optin'] = '1';
@@ -692,7 +725,7 @@
692
  <label for="send-welcome"><input id="send-welcome" type="radio" name="send-welcome-email" value="1" <?php checked( $optin_settings['send_welcome_email'] , '1' ); ?>><?php _e( 'Yes' , 'yikes-inc-easy-mailchimp-extender' ); ?></label>
693
  &nbsp;<label for="do-not-send-welcome"><input id="do-not-send-welcome" type="radio" name="send-welcome-email" value="0" <?php checked( $optin_settings['send_welcome_email'] , '0' ); ?>><?php _e( 'No' , 'yikes-inc-easy-mailchimp-extender' ); ?></label>
694
  </span>
695
- <p class="description"><?php _e( "When the user signs up, should they receive the default welcome email?" , 'yikes-inc-easy-mailchimp-extender' ); ?></p>
696
  </label></p>
697
 
698
  <!-- Update Existing Users -->
@@ -706,7 +739,7 @@
706
  <label for="update-user"><input type="radio" id="update-user" name="update-existing-user" value="1" <?php checked( $optin_settings['update_existing_user'] , '1' ); ?>><?php _e( 'Yes' , 'yikes-inc-easy-mailchimp-extender' ); ?></label>
707
  &nbsp;<label for="do-not-update-user"><input type="radio" id="do-not-update-user" name="update-existing-user" value="0" <?php checked( $optin_settings['update_existing_user'] , '0' ); ?>><?php _e( 'No' , 'yikes-inc-easy-mailchimp-extender' ); ?></label>
708
  </span>
709
- <p class="description"><?php printf( __( "Update an existing subscriber's info when they attempt to re-subscribe instead of displaying an %s message." , "yikes-inc-easy-mailchimp-extender" ), '<em>"already subscribed"</em>' ); ?></p>
710
  </label></p>
711
 
712
  </div>
59
  );
60
  }
61
 
62
+ $api_key = trim( get_option( 'yikes-mc-api-key' , '' ) );
63
+ $dash_position = strpos( $api_key, '-' );
64
+
65
  // Check for a transient, if not - set one up for one hour
66
  if ( false === ( $list_data = get_transient( 'yikes-easy-mailchimp-list-data' ) ) ) {
67
+ if( $dash_position !== false ) {
68
+ $api_endpoint = 'https://' . substr( $api_key, $dash_position + 1 ) . '.api.mailchimp.com/2.0/lists/list.json';
69
+ }
70
+ $list_data = wp_remote_post( $api_endpoint, array(
71
+ 'body' => array(
72
+ 'apikey' => $api_key,
73
+ 'limit' => 100
74
+ ),
75
+ 'timeout' => 10,
76
+ 'sslverify' => apply_filters( 'yikes-mailchimp-sslverify', true )
77
+ ) );
78
+ $list_data = json_decode( wp_remote_retrieve_body( $list_data ), true );
79
  // set our transient
80
  set_transient( 'yikes-easy-mailchimp-list-data', $list_data, 1 * HOUR_IN_SECONDS );
81
  }
82
 
83
  // get the list data
84
  try {
85
+ if( $dash_position !== false ) {
86
+ $api_endpoint = 'https://' . substr( $api_key, $dash_position + 1 ) . '.api.mailchimp.com/2.0/lists/merge-vars.json';
87
+ }
88
+ $available_merge_variables = wp_remote_post( $api_endpoint, array(
89
+ 'body' => array(
90
+ 'apikey' => $api_key,
91
+ 'id' => array( $form['list_id'] ),
92
+ ),
93
+ 'timeout' => 10,
94
+ 'sslverify' => apply_filters( 'yikes-mailchimp-sslverify', true )
95
+ ) );
96
+ $available_merge_variables = json_decode( wp_remote_retrieve_body( $available_merge_variables ), true );
97
  } catch ( Exception $e ) {
98
  $merge_variable_error = '<p class="description error-descripion">' . __( 'Error' , 'yikes-inc-easy-mailchimp-extender' ) . ' : ' . $e->getMessage() . '.</p>';
99
  wp_die( __( "Uh Oh...It looks like we ran into an error! Please reload the page and try again. If the error persists, please contact the YIKES Inc. support team.", 'yikes-inc-easy-mailchimp-extender' ) , 500 );
101
 
102
  // get the interest group data
103
  try {
104
+ if( $dash_position !== false ) {
105
+ $api_endpoint = 'https://' . substr( $api_key, $dash_position + 1 ) . '.api.mailchimp.com/2.0/lists/interest-groupings.json';
106
+ }
107
+ $interest_groupings = wp_remote_post( $api_endpoint, array(
108
+ 'body' => array(
109
+ 'apikey' => $api_key,
110
+ 'id' => $form['list_id']
111
+ ),
112
+ 'timeout' => 10,
113
+ 'sslverify' => apply_filters( 'yikes-mailchimp-sslverify', true )
114
+ ) );
115
+ $interest_groupings = json_decode( wp_remote_retrieve_body( $interest_groupings ), true );
116
  $no_interest_groupings = '<p class="description error-descripion">' . __( 'No Interest Groups Found' , 'yikes-inc-easy-mailchimp-extender' ) . '.</p>';
117
  } catch( Exception $error ) {
118
  $no_interest_groupings = '<p class="description error-descripion">' . $error->getMessage() . '.</p>';
482
  <label class="inline-form-label">
483
  <input type="checkbox" onclick="toggle_nested_section( jQuery(this) );" name="yikes-easy-mc-form-login-required" value="1" <?php checked( $form_settings['yikes-easy-mc-form-login-required'], '1' ); ?> /><?php _e( 'Require Login', 'yikes-inc-easy-mailchimp-extender' ); ?>
484
  </label>
485
+ <p class="description"><?php _e( 'Require users to be logged in before they can view and submit this opt-in form.', 'yikes-inc-easy-mailchimp-extender' ); ?></p>
486
 
487
  <!-- Require Login Message -->
488
  <section class="login-restirction-section nested-child<?php if( $form_settings['yikes-easy-mc-form-login-required'] == '0' ) { echo ' hidden'; } ?>">
665
  <div class="yikes-mc-settings-expansion-section">
666
  <!-- Associated List -->
667
  <p class="form-field-container"><!-- necessary to prevent skipping on slideToggle(); --><label for="associated-list"><strong><?php _e( 'Associated List' , 'yikes-inc-easy-mailchimp-extender' ); ?></strong>
668
+ <select name="associated-list" id="associated-list" <?php if( empty( $list_data['data'] ) ) { echo 'disabled="disabled"'; } ?> onchange="jQuery('.view-list-link').attr( 'href', '<?php echo esc_url( admin_url( 'admin.php?page=yikes-mailchimp-view-list&list-id=' ) ); ?>' + jQuery( this ).val() );">
669
  <?php
670
  if( !empty( $list_data['data'] ) ) {
671
  foreach( $list_data['data'] as $mailing_list ) {
681
  ?>
682
  </select>
683
  <?php if( !empty( $list_data['data'] ) ) { ?>
684
+ <p class="description view-list">
685
+ <a href="<?php echo esc_url( admin_url( 'admin.php?page=yikes-mailchimp-view-list&list-id=' . $form['list_id'] ) ); ?>" class="view-list-link"><?php _e( 'View List', 'yikes-inc-easy-mailchimp-extender' ); ?></a>
686
+ </p>
687
  <p class="description">
688
  <?php _e( "Users who sign up via this form will be added to the list selected above." , 'yikes-inc-easy-mailchimp-extender' ); ?>
689
  </p>
696
  </div>
697
 
698
  <a href="#" class="expansion-section-title settings-sidebar">
699
+ <span class="dashicons dashicons-plus"></span><?php _e( 'Opt-in Settings' , 'yikes-inc-easy-mailchimp-extender' ); ?>
700
  </a>
701
  <div class="yikes-mc-settings-expansion-section">
702
 
703
+ <!-- Single or Double Opt-in -->
704
  <?php
705
  if( !isset( $optin_settings['optin'] ) ) {
706
  $optin_settings['optin'] = '1';
725
  <label for="send-welcome"><input id="send-welcome" type="radio" name="send-welcome-email" value="1" <?php checked( $optin_settings['send_welcome_email'] , '1' ); ?>><?php _e( 'Yes' , 'yikes-inc-easy-mailchimp-extender' ); ?></label>
726
  &nbsp;<label for="do-not-send-welcome"><input id="do-not-send-welcome" type="radio" name="send-welcome-email" value="0" <?php checked( $optin_settings['send_welcome_email'] , '0' ); ?>><?php _e( 'No' , 'yikes-inc-easy-mailchimp-extender' ); ?></label>
727
  </span>
728
+ <p class="description"><?php _e( "When a user signs up, should they receive the default welcome email?" , 'yikes-inc-easy-mailchimp-extender' ); ?></p>
729
  </label></p>
730
 
731
  <!-- Update Existing Users -->
739
  <label for="update-user"><input type="radio" id="update-user" name="update-existing-user" value="1" <?php checked( $optin_settings['update_existing_user'] , '1' ); ?>><?php _e( 'Yes' , 'yikes-inc-easy-mailchimp-extender' ); ?></label>
740
  &nbsp;<label for="do-not-update-user"><input type="radio" id="do-not-update-user" name="update-existing-user" value="0" <?php checked( $optin_settings['update_existing_user'] , '0' ); ?>><?php _e( 'No' , 'yikes-inc-easy-mailchimp-extender' ); ?></label>
741
  </span>
742
+ <p class="description"><?php printf( __( "Display an update link when a user is already subscribed to the list, allowing them to generate an email where they can update their subscribtion info - instead of displaying a <em>%s</em> message." , "yikes-inc-easy-mailchimp-extender" ), __( '"user already subscribed"', 'yikes-inc-easy-mailchimp-extender' ) ); ?></p>
743
  </label></p>
744
 
745
  </div>
admin/partials/menu/account-details.php CHANGED
@@ -1,26 +1,53 @@
1
  <?php
2
  // lets confirm the user has a valid API key stored
3
  if( $this->is_user_mc_api_valid_form( false ) == 'valid' ) {
4
- // storethe API key
5
- $api_key = get_option( 'yikes-mc-api-key' , '' );
6
- // initialize MailChimp API
7
- $MailChimp = new MailChimp( $api_key );
8
  /// Check for a transients, if not - set them up
9
  if ( false === ( $profile_info = get_transient( 'yikes-easy-mailchimp-profile-data' ) ) ) {
10
- // retreive our list data
11
- $profile_info = $MailChimp->call('/users/profile', array( 'api_key' => $api_key ) );
 
 
 
 
 
 
 
 
 
12
  // set our transient for one week
13
  set_transient( 'yikes-easy-mailchimp-profile-data', $profile_info, 1 * WEEK_IN_SECONDS );
14
  }
15
  if ( false === ( $account_details = get_transient( 'yikes-easy-mailchimp-account-data' ) ) ) {
16
- // retreive our list data
17
- $account_details = $MailChimp->call('/helper/account-details', array( 'api_key' => $api_key ) );
 
 
 
 
 
 
 
 
 
18
  // set our transient for one hour
19
  set_transient( 'yikes-easy-mailchimp-account-data', $account_details, 1 * HOUR_IN_SECONDS );
20
  }
21
  if ( false === ( $account_activity = get_transient( 'yikes-easy-mailchimp-account-activity' ) ) ) {
22
  // retreive our list data
23
- $account_activity = $MailChimp->call('/helper/chimp-chatter', array( 'api_key' => $api_key ) );
 
 
 
 
 
 
 
 
 
 
24
  // set our transient for one hour
25
  set_transient( 'yikes-easy-mailchimp-account-activity', $account_activity, 1 * HOUR_IN_SECONDS );
26
  }
1
  <?php
2
  // lets confirm the user has a valid API key stored
3
  if( $this->is_user_mc_api_valid_form( false ) == 'valid' ) {
4
+ // store the API key
5
+ $api_key = trim( get_option( 'yikes-mc-api-key' , '' ) );
6
+ $dash_position = strpos( $api_key, '-' );
 
7
  /// Check for a transients, if not - set them up
8
  if ( false === ( $profile_info = get_transient( 'yikes-easy-mailchimp-profile-data' ) ) ) {
9
+ if( $dash_position !== false ) {
10
+ $api_endpoint = 'https://' . substr( $api_key, $dash_position + 1 ) . '.api.mailchimp.com/2.0/users/profile.json';
11
+ }
12
+ $profile_info = wp_remote_post( $api_endpoint, array(
13
+ 'body' => array(
14
+ 'apikey' => $api_key
15
+ ),
16
+ 'timeout' => 10,
17
+ 'sslverify' => apply_filters( 'yikes-mailchimp-sslverify', true )
18
+ ) );
19
+ $profile_info = json_decode( wp_remote_retrieve_body( $profile_info ), true );
20
  // set our transient for one week
21
  set_transient( 'yikes-easy-mailchimp-profile-data', $profile_info, 1 * WEEK_IN_SECONDS );
22
  }
23
  if ( false === ( $account_details = get_transient( 'yikes-easy-mailchimp-account-data' ) ) ) {
24
+ if( $dash_position !== false ) {
25
+ $api_endpoint = 'https://' . substr( $api_key, $dash_position + 1 ) . '.api.mailchimp.com/2.0/helper/account-details.json';
26
+ }
27
+ $account_details = wp_remote_post( $api_endpoint, array(
28
+ 'body' => array(
29
+ 'apikey' => $api_key
30
+ ),
31
+ 'timeout' => 10,
32
+ 'sslverify' => apply_filters( 'yikes-mailchimp-sslverify', true )
33
+ ) );
34
+ $account_details = json_decode( wp_remote_retrieve_body( $account_details ), true );
35
  // set our transient for one hour
36
  set_transient( 'yikes-easy-mailchimp-account-data', $account_details, 1 * HOUR_IN_SECONDS );
37
  }
38
  if ( false === ( $account_activity = get_transient( 'yikes-easy-mailchimp-account-activity' ) ) ) {
39
  // retreive our list data
40
+ if( $dash_position !== false ) {
41
+ $api_endpoint = 'https://' . substr( $api_key, $dash_position + 1 ) . '.api.mailchimp.com/2.0/helper/chimp-chatter.json';
42
+ }
43
+ $account_activity = wp_remote_post( $api_endpoint, array(
44
+ 'body' => array(
45
+ 'apikey' => $api_key
46
+ ),
47
+ 'timeout' => 10,
48
+ 'sslverify' => apply_filters( 'yikes-mailchimp-sslverify', true )
49
+ ) );
50
+ $account_activity = json_decode( wp_remote_retrieve_body( $account_activity ), true );
51
  // set our transient for one hour
52
  set_transient( 'yikes-easy-mailchimp-account-activity', $account_activity, 1 * HOUR_IN_SECONDS );
53
  }
admin/partials/menu/lists.php CHANGED
@@ -3,19 +3,27 @@
3
  if( $this->is_user_mc_api_valid_form( false ) == 'valid' ) {
4
  /// Check for a transient, if not - set one up for one hour
5
  if ( false === ( $list_data = get_transient( 'yikes-easy-mailchimp-list-data' ) ) ) {
6
- // initialize MailChimp Class
7
- $MailChimp = new MailChimp( get_option( 'yikes-mc-api-key' , '' ) );
8
- // retreive our list data
9
- $list_data = $MailChimp->call( 'lists/list' , array( 'apikey' => get_option( 'yikes-mc-api-key' , '' ), 'limit' => 100 ) );
 
 
 
 
 
 
 
 
 
 
10
  // set our transient
11
  set_transient( 'yikes-easy-mailchimp-list-data', $list_data, 1 * HOUR_IN_SECONDS );
12
  }
13
  } else {
14
  wp_die( __( 'It looks like you need to re-validate your MailChimp API key before you can continue.' , 'yikes-inc-easy-mailchimp-extender' ) , 500 );
15
  }
16
-
17
- // print_r($list_data);
18
-
19
  wp_register_script( 'yikes-easy-mc-manage-forms-script', YIKES_MC_URL . 'admin/js/yikes-inc-easy-mailchimp-manage-forms.js', array( 'jquery' ), $this->version, false );
20
  $localized_data = array(
21
  'ajax_url' => esc_url_raw( admin_url( 'admin-ajax.php' ) ),
3
  if( $this->is_user_mc_api_valid_form( false ) == 'valid' ) {
4
  /// Check for a transient, if not - set one up for one hour
5
  if ( false === ( $list_data = get_transient( 'yikes-easy-mailchimp-list-data' ) ) ) {
6
+ $api_key = trim( get_option( 'yikes-mc-api-key' , '' ) );
7
+ $dash_position = strpos( $api_key, '-' );
8
+ if( $dash_position !== false ) {
9
+ $api_endpoint = 'https://' . substr( $api_key, $dash_position + 1 ) . '.api.mailchimp.com/2.0/lists/list.json';
10
+ }
11
+ $list_data = wp_remote_post( $api_endpoint, array(
12
+ 'body' => array(
13
+ 'apikey' => $api_key,
14
+ 'limit' => 100
15
+ ),
16
+ 'timeout' => 10,
17
+ 'sslverify' => apply_filters( 'yikes-mailchimp-sslverify', true )
18
+ ) );
19
+ $list_data = json_decode( wp_remote_retrieve_body( $list_data ), true );
20
  // set our transient
21
  set_transient( 'yikes-easy-mailchimp-list-data', $list_data, 1 * HOUR_IN_SECONDS );
22
  }
23
  } else {
24
  wp_die( __( 'It looks like you need to re-validate your MailChimp API key before you can continue.' , 'yikes-inc-easy-mailchimp-extender' ) , 500 );
25
  }
26
+
 
 
27
  wp_register_script( 'yikes-easy-mc-manage-forms-script', YIKES_MC_URL . 'admin/js/yikes-inc-easy-mailchimp-manage-forms.js', array( 'jquery' ), $this->version, false );
28
  $localized_data = array(
29
  'ajax_url' => esc_url_raw( admin_url( 'admin-ajax.php' ) ),
admin/partials/menu/manage-forms.php CHANGED
@@ -13,10 +13,20 @@
13
  if( $this->is_user_mc_api_valid_form( false ) == 'valid' ) {
14
  /// Check for a transient, if not - set one up for one hour
15
  if ( false === ( $list_data = get_transient( 'yikes-easy-mailchimp-list-data' ) ) ) {
16
- // initialize MailChimp Class
17
- $MailChimp = new MailChimp( get_option( 'yikes-mc-api-key' , '' ) );
18
- // retreive our list data
19
- $list_data = $MailChimp->call( 'lists/list' , array( 'apikey' => get_option( 'yikes-mc-api-key' , '' ), 'limit' => 100 ) );
 
 
 
 
 
 
 
 
 
 
20
  // set our transient
21
  set_transient( 'yikes-easy-mailchimp-list-data', $list_data, 1 * HOUR_IN_SECONDS );
22
  }
13
  if( $this->is_user_mc_api_valid_form( false ) == 'valid' ) {
14
  /// Check for a transient, if not - set one up for one hour
15
  if ( false === ( $list_data = get_transient( 'yikes-easy-mailchimp-list-data' ) ) ) {
16
+ $api_key = trim( get_option( 'yikes-mc-api-key' , '' ) );
17
+ $dash_position = strpos( $api_key, '-' );
18
+ if( $dash_position !== false ) {
19
+ $api_endpoint = 'https://' . substr( $api_key, $dash_position + 1 ) . '.api.mailchimp.com/2.0/lists/list.json';
20
+ }
21
+ $list_data = wp_remote_post( $api_endpoint, array(
22
+ 'body' => array(
23
+ 'apikey' => $api_key,
24
+ 'limit' => 100
25
+ ),
26
+ 'timeout' => 10,
27
+ 'sslverify' => apply_filters( 'yikes-mailchimp-sslverify', true )
28
+ ) );
29
+ $list_data = json_decode( wp_remote_retrieve_body( $list_data ), true );
30
  // set our transient
31
  set_transient( 'yikes-easy-mailchimp-list-data', $list_data, 1 * HOUR_IN_SECONDS );
32
  }
admin/partials/menu/manage-lists.php CHANGED
@@ -3,10 +3,20 @@
3
  if( $this->is_user_mc_api_valid_form( false ) == 'valid' ) {
4
  /// Check for a transient, if not - set one up for one hour
5
  if ( false === ( $list_data = get_transient( 'yikes-easy-mailchimp-list-data' ) ) ) {
6
- // initialize MailChimp Class
7
- $MailChimp = new MailChimp( get_option( 'yikes-mc-api-key' , '' ) );
8
- // retreive our list data
9
- $list_data = $MailChimp->call( 'lists/list' , array( 'apikey' => get_option( 'yikes-mc-api-key' , '' ), 'limit' => 100 ) );
 
 
 
 
 
 
 
 
 
 
10
  // set our transient
11
  set_transient( 'yikes-easy-mailchimp-list-data', $list_data, 1 * HOUR_IN_SECONDS );
12
  }
3
  if( $this->is_user_mc_api_valid_form( false ) == 'valid' ) {
4
  /// Check for a transient, if not - set one up for one hour
5
  if ( false === ( $list_data = get_transient( 'yikes-easy-mailchimp-list-data' ) ) ) {
6
+ $api_key = trim( get_option( 'yikes-mc-api-key' , '' ) );
7
+ $dash_position = strpos( $api_key, '-' );
8
+ if( $dash_position !== false ) {
9
+ $api_endpoint = 'https://' . substr( $api_key, $dash_position + 1 ) . '.api.mailchimp.com/2.0/lists/list.json';
10
+ }
11
+ $list_data = wp_remote_post( $api_endpoint, array(
12
+ 'body' => array(
13
+ 'apikey' => $api_key,
14
+ 'limit' => 100
15
+ ),
16
+ 'timeout' => 10,
17
+ 'sslverify' => apply_filters( 'yikes-mailchimp-sslverify', true )
18
+ ) );
19
+ $list_data = json_decode( wp_remote_retrieve_body( $list_data ), true );
20
  // set our transient
21
  set_transient( 'yikes-easy-mailchimp-list-data', $list_data, 1 * HOUR_IN_SECONDS );
22
  }
admin/partials/menu/options-sections/import-export-forms.php CHANGED
@@ -56,7 +56,7 @@
56
 
57
  <p><strong><?php _e( "Import" , 'yikes-inc-easy-mailchimp-extender' ); ?></strong></p>
58
  <p class="description">
59
- <?php _e( "Select the Easy Forms for MailChimp export file you would like to import. You can use this field to import your optin forms or settings. " , "yikes-inc-easy-mailchimp-extender" ); ?>
60
  </p>
61
 
62
  <label>
56
 
57
  <p><strong><?php _e( "Import" , 'yikes-inc-easy-mailchimp-extender' ); ?></strong></p>
58
  <p class="description">
59
+ <?php _e( "Select the Easy Forms for MailChimp export file you would like to import. You can use this field to import your opt-in forms or settings. " , "yikes-inc-easy-mailchimp-extender" ); ?>
60
  </p>
61
 
62
  <label>
admin/partials/menu/options-sections/integration-settings.php CHANGED
@@ -84,10 +84,20 @@
84
  if( $this->is_user_mc_api_valid_form( false ) == 'valid' ) {
85
  /// Check for a transient, if not - set one up for one hour
86
  if ( false === ( $list_data = get_transient( 'yikes-easy-mailchimp-list-data' ) ) ) {
87
- // initialize MailChimp Class
88
- $MailChimp = new MailChimp( get_option( 'yikes-mc-api-key' , '' ) );
89
- // retreive our list data
90
- $list_data = $MailChimp->call( 'lists/list' , array( 'apikey' => get_option( 'yikes-mc-api-key' , '' ), 'limit' => 100 ) );
 
 
 
 
 
 
 
 
 
 
91
  // set our transient
92
  set_transient( 'yikes-easy-mailchimp-list-data', $list_data, 1 * HOUR_IN_SECONDS );
93
  }
@@ -106,7 +116,7 @@
106
  <div class="inside">
107
 
108
  <p>
109
- <?php _e( 'Select which plugins or features Easy Forms for MailChimp by Yikes Inc. should integrate with. Depending on which plugins or features you choose to integrate with, an optin checkbox will be generated. For example, the comment form checkbox will generate a checkbox below the standard WordPress comment form to add any new commenters to a pre-determined MailChimp mailing list.' , 'yikes-inc-easy-mailchimp-extender' ); ?>
110
  </p>
111
 
112
  <!-- Settings Form -->
84
  if( $this->is_user_mc_api_valid_form( false ) == 'valid' ) {
85
  /// Check for a transient, if not - set one up for one hour
86
  if ( false === ( $list_data = get_transient( 'yikes-easy-mailchimp-list-data' ) ) ) {
87
+ $api_key = trim( get_option( 'yikes-mc-api-key' , '' ) );
88
+ $dash_position = strpos( $api_key, '-' );
89
+ if( $dash_position !== false ) {
90
+ $api_endpoint = 'https://' . substr( $api_key, $dash_position + 1 ) . '.api.mailchimp.com/2.0/lists/list.json';
91
+ }
92
+ $list_data = wp_remote_post( $api_endpoint, array(
93
+ 'body' => array(
94
+ 'apikey' => $api_key,
95
+ 'limit' => 100
96
+ ),
97
+ 'timeout' => 10,
98
+ 'sslverify' => apply_filters( 'yikes-mailchimp-sslverify', true )
99
+ ) );
100
+ $list_data = json_decode( wp_remote_retrieve_body( $list_data ), true );
101
  // set our transient
102
  set_transient( 'yikes-easy-mailchimp-list-data', $list_data, 1 * HOUR_IN_SECONDS );
103
  }
116
  <div class="inside">
117
 
118
  <p>
119
+ <?php _e( 'Select which plugins or features Easy Forms for MailChimp by Yikes Inc. should integrate with. Depending on which plugins or features you choose to integrate with, an opt-in checkbox will be generated. For example, the comment form checkbox will generate a checkbox below the standard WordPress comment form to add any new commenters to a pre-determined MailChimp mailing list.' , 'yikes-inc-easy-mailchimp-extender' ); ?>
120
  </p>
121
 
122
  <!-- Settings Form -->
admin/partials/menu/options-sections/templates/integration-interest-groups.php CHANGED
@@ -11,8 +11,8 @@ $integration_options = get_option( 'optin-checkbox-init' , '' );
11
  /*
12
  * Confirm the interest groups is an array and not empty or else bail
13
  */
14
- if( ! is_array( $interest_groupings ) || empty( $interest_groupings ) ) {
15
- echo '<p class="description no-interest-groupings-enabled-message">' . $interest_groupings . '</p>';
16
  return;
17
  }
18
 
11
  /*
12
  * Confirm the interest groups is an array and not empty or else bail
13
  */
14
+ if( isset( $interest_groupings['error'] ) ) {
15
+ echo '<p class="description no-interest-groupings-enabled-message">' . $interest_groupings['error'] . '</p>';
16
  return;
17
  }
18
 
admin/partials/menu/support.php CHANGED
@@ -33,7 +33,7 @@
33
  <div class="inside">
34
  <p><?php _e( 'The fastest way to receive free support is to submit a new issue to our GitHub issue tracker. ', 'yikes-inc-easy-mailchimp-extender' ); ?></p>
35
  <img class="support-page-logo" src="<?php echo YIKES_MC_URL; ?>includes/images/Support_Page/github-issue-screenshot.png" title="<?php esc_attr_e( 'Github Issue Tracker Screenshot' , 'yikes-inc-easy-mailchimp-extender' ); ?>" >
36
- <a href="https://github.com/yikesinc/yikes-inc-easy-mailchimp-extender/issues" target="_blank" class="button-secondary support-page-button"><?php _e( 'Submit New Github.org Issue', 'yikes-inc-easy-mailchimp-extender' ); ?></a>
37
  </div>
38
  </div>
39
  <!-- /col-wrap -->
33
  <div class="inside">
34
  <p><?php _e( 'The fastest way to receive free support is to submit a new issue to our GitHub issue tracker. ', 'yikes-inc-easy-mailchimp-extender' ); ?></p>
35
  <img class="support-page-logo" src="<?php echo YIKES_MC_URL; ?>includes/images/Support_Page/github-issue-screenshot.png" title="<?php esc_attr_e( 'Github Issue Tracker Screenshot' , 'yikes-inc-easy-mailchimp-extender' ); ?>" >
36
+ <a href="https://github.com/yikesinc/yikes-inc-easy-mailchimp-extender/issues" target="_blank" class="button-secondary support-page-button"><?php _e( 'Submit New github.org Issue', 'yikes-inc-easy-mailchimp-extender' ); ?></a>
37
  </div>
38
  </div>
39
  <!-- /col-wrap -->
admin/partials/view-list.php CHANGED
@@ -1,30 +1,72 @@
1
  <?php
2
  if( isset( $_REQUEST['list-id'] ) ) {
3
  $list_id = sanitize_key( $_REQUEST['list-id'] );
4
- // run our API call, to get list data..
5
- $MailChimp = new Mailchimp( get_option( 'yikes-mc-api-key' , '' ) );
6
- $api_key = get_option( 'yikes-mc-api-key' , '' );
7
- // get this lists data
8
- $list_data = $MailChimp->call( 'lists/list' , array( 'apikey' => $api_key, 'filters' => array( 'list_id' => $list_id ) ) );
 
 
 
 
 
 
 
 
 
 
9
  // reset our data so we can easily use it
10
  $list_data = $list_data['data'][0];
11
 
12
- // get the merge_variables
13
- $merge_variables = $MailChimp->call( 'lists/merge-vars' , array( 'apikey' => $api_key , 'id' => array( $list_id ) ) );
 
 
 
 
 
 
 
 
 
 
14
  // re-store our data
15
  $merge_variables = $merge_variables['data'][0]['merge_vars'];
16
 
17
  // get the interest group data
18
- try {
19
- $interest_groupings = $MailChimp->call( 'lists/interest-groupings' , array( 'apikey' => $api_key , 'id' => $list_id , 'counts' => true ) );
20
- } catch( Exception $error ) {
21
- $no_interest_groupings = $error->getMessage();
22
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
23
 
24
  $no_segments = __( 'No segments set up for this list.' , 'yikes-inc-easy-mailchimp-extender' );
25
  // get the segment data
26
  try {
27
- $segments = $MailChimp->call( 'lists/segments' , array( 'apikey' => $api_key , 'id' => $list_id , 'type' => 'saved' ) );
 
 
 
 
 
 
 
 
 
 
 
28
  } catch( Exception $segment_error ) {
29
  $no_segments = $error->getMessage();
30
  }
@@ -50,8 +92,12 @@
50
  }
51
 
52
  // get all subscribed members
53
- $subscribers_list = $MailChimp->call('lists/members',
54
- array(
 
 
 
 
55
  'id' => $list_id,
56
  'opts' => array(
57
  'start' => $paged,
@@ -59,8 +105,11 @@
59
  'sort_field' => $column,
60
  'sort_dir' => $sort_dir
61
  )
62
- )
63
- );
 
 
 
64
 
65
  $total_pages = ceil( $subscribers_list['total'] / $limit );
66
  if( $total_pages == 0 ) {
@@ -164,7 +213,7 @@
164
  <?php $view_user_info_url = esc_url_raw( add_query_arg( array( 'mailchimp-list' => $list_id , 'email-id' => $user_id ), admin_url() . 'admin.php?page=yikes-mailchimp-view-user' ) ); ?>
165
  <span><a href="<?php echo $view_user_info_url; ?>"><?php _e( "View Info." , 'yikes-inc-easy-mailchimp-extender' ); ?></a> |</span>
166
  <?php $url = esc_url_raw( add_query_arg( array( 'action' => 'yikes-easy-mc-unsubscribe-user', 'mailchimp-list' => $list_id , 'nonce' => wp_create_nonce( 'unsubscribe-user-'.$user_id ), 'email_id' => $user_id ) ) ); ?>
167
- <span><a href="<?php echo $url; ?>" onclick="return confirm('<?php _e( "Are you sure you want to unsubscribe" , 'yikes-inc-easy-mailchimp-extender' ); ?> ' + jQuery(this).parents('.row-actions').parent().find('.user-email').text() + ' <?php _e( 'from this mailing list?' , 'yikes-inc-easy-mailchimp-extender' ); ?>');" class="yikes-delete-subscriber"><?php _e( "Unsubscribe" , 'yikes-inc-easy-mailchimp-extender' ); ?></a>
168
  </div>
169
  </td>
170
  <td class="column-columnname num"><?php echo $user_email_client_icon; ?></td>
@@ -296,7 +345,7 @@
296
 
297
  <h3><?php _e( 'Interest Groups Overview' , 'yikes-inc-easy-mailchimp-extender' ); ?></h3>
298
  <?php
299
- if( isset( $interest_groupings ) && count( $interest_groupings ) >= 1 ) {
300
  ?><ul class="interest-group-ul"><?php
301
  echo '<li class="interest-group-count">' . sprintf( _n( '%d Interest Group', '%d Interest Groups', intval( count( $interest_groupings ) ), 'yikes-inc-easy-mailchimp-extender' ), intval( count( $interest_groupings ) ) ) . '</li>';
302
  foreach( $interest_groupings as $interest_group ) {
@@ -306,7 +355,7 @@
306
  } else {
307
  ?>
308
  <ul class="interest-group-ul">
309
- <li><?php echo $no_interest_groupings . '.'; ?></li>
310
  </ul>
311
  <?php
312
  }
1
  <?php
2
  if( isset( $_REQUEST['list-id'] ) ) {
3
  $list_id = sanitize_key( $_REQUEST['list-id'] );
4
+ $api_key = trim( get_option( 'yikes-mc-api-key' , '' ) );
5
+ $dash_position = strpos( $api_key, '-' );
6
+ if( $dash_position !== false ) {
7
+ $api_endpoint = 'https://' . substr( $api_key, $dash_position + 1 ) . '.api.mailchimp.com/2.0/lists/list.json';
8
+ }
9
+ $list_data = wp_remote_post( $api_endpoint, array(
10
+ 'body' => array(
11
+ 'apikey' => $api_key,
12
+ 'filters' => array( 'list_id' => $list_id ),
13
+ ),
14
+ 'timeout' => 10,
15
+ 'sslverify' => apply_filters( 'yikes-mailchimp-sslverify', true ),
16
+ ) );
17
+ $list_data = json_decode( wp_remote_retrieve_body( $list_data ), true );
18
+
19
  // reset our data so we can easily use it
20
  $list_data = $list_data['data'][0];
21
 
22
+ if( $dash_position !== false ) {
23
+ $api_endpoint = 'https://' . substr( $api_key, $dash_position + 1 ) . '.api.mailchimp.com/2.0/lists/merge-vars.json';
24
+ }
25
+ $merge_variables = wp_remote_post( $api_endpoint, array(
26
+ 'body' => array(
27
+ 'apikey' => $api_key,
28
+ 'id' => array( $list_id ) ,
29
+ ),
30
+ 'timeout' => 10,
31
+ 'sslverify' => apply_filters( 'yikes-mailchimp-sslverify', true ),
32
+ ) );
33
+ $merge_variables = json_decode( wp_remote_retrieve_body( $merge_variables ), true );
34
  // re-store our data
35
  $merge_variables = $merge_variables['data'][0]['merge_vars'];
36
 
37
  // get the interest group data
38
+ if( $dash_position !== false ) {
39
+ $api_endpoint = 'https://' . substr( $api_key, $dash_position + 1 ) . '.api.mailchimp.com/2.0/lists/interest-groupings.json';
 
 
40
  }
41
+ $interest_groupings = wp_remote_post( $api_endpoint, array(
42
+ 'body' => array(
43
+ 'apikey' => $api_key,
44
+ 'id' => $list_id,
45
+ 'counts' => true
46
+ ),
47
+ 'timeout' => 10,
48
+ 'sslverify' => apply_filters( 'yikes-mailchimp-sslverify', true ),
49
+ ) );
50
+ $interest_groupings = json_decode( wp_remote_retrieve_body( $interest_groupings ), true );
51
+
52
+ $no_interest_groupings = '<p class="description">' . __( 'Interest groups are not enabled for this list.', 'yikes-inc-easy-mailchimp-extender' ) . '</p>';
53
+
54
 
55
  $no_segments = __( 'No segments set up for this list.' , 'yikes-inc-easy-mailchimp-extender' );
56
  // get the segment data
57
  try {
58
+ if( $dash_position !== false ) {
59
+ $api_endpoint = 'https://' . substr( $api_key, $dash_position + 1 ) . '.api.mailchimp.com/2.0/lists/segments.json';
60
+ }
61
+ $segments = wp_remote_post( $api_endpoint, array(
62
+ 'body' => array(
63
+ 'apikey' => $api_key,
64
+ 'id' => $list_id,
65
+ 'type' => 'saved'
66
+ ),
67
+ 'timeout' => 10,
68
+ 'sslverify' => apply_filters( 'yikes-mailchimp-sslverify', true ),
69
+ ) );
70
  } catch( Exception $segment_error ) {
71
  $no_segments = $error->getMessage();
72
  }
92
  }
93
 
94
  // get all subscribed members
95
+ if( $dash_position !== false ) {
96
+ $api_endpoint = 'https://' . substr( $api_key, $dash_position + 1 ) . '.api.mailchimp.com/2.0/lists/members.json';
97
+ }
98
+ $subscribers_list = wp_remote_post( $api_endpoint, array(
99
+ 'body' => array(
100
+ 'apikey' => $api_key,
101
  'id' => $list_id,
102
  'opts' => array(
103
  'start' => $paged,
105
  'sort_field' => $column,
106
  'sort_dir' => $sort_dir
107
  )
108
+ ),
109
+ 'timeout' => 10,
110
+ 'sslverify' => apply_filters( 'yikes-mailchimp-sslverify', true ),
111
+ ) );
112
+ $subscribers_list = json_decode( wp_remote_retrieve_body( $subscribers_list ), true );
113
 
114
  $total_pages = ceil( $subscribers_list['total'] / $limit );
115
  if( $total_pages == 0 ) {
213
  <?php $view_user_info_url = esc_url_raw( add_query_arg( array( 'mailchimp-list' => $list_id , 'email-id' => $user_id ), admin_url() . 'admin.php?page=yikes-mailchimp-view-user' ) ); ?>
214
  <span><a href="<?php echo $view_user_info_url; ?>"><?php _e( "View Info." , 'yikes-inc-easy-mailchimp-extender' ); ?></a> |</span>
215
  <?php $url = esc_url_raw( add_query_arg( array( 'action' => 'yikes-easy-mc-unsubscribe-user', 'mailchimp-list' => $list_id , 'nonce' => wp_create_nonce( 'unsubscribe-user-'.$user_id ), 'email_id' => $user_id ) ) ); ?>
216
+ <span><a href="<?php echo $url; ?>" onclick="return confirm('<?php printf( __( "Are you sure you want to unsubscribe %s from this mailing list?" , 'yikes-inc-easy-mailchimp-extender' ), sanitize_email( $subscriber['email'] ) ); ?>');" class="yikes-delete-subscriber"><?php _e( "Unsubscribe" , 'yikes-inc-easy-mailchimp-extender' ); ?></a>
217
  </div>
218
  </td>
219
  <td class="column-columnname num"><?php echo $user_email_client_icon; ?></td>
345
 
346
  <h3><?php _e( 'Interest Groups Overview' , 'yikes-inc-easy-mailchimp-extender' ); ?></h3>
347
  <?php
348
+ if( isset( $interest_groupings ) && ! isset( $interest_groupings['error'] ) ) {
349
  ?><ul class="interest-group-ul"><?php
350
  echo '<li class="interest-group-count">' . sprintf( _n( '%d Interest Group', '%d Interest Groups', intval( count( $interest_groupings ) ), 'yikes-inc-easy-mailchimp-extender' ), intval( count( $interest_groupings ) ) ) . '</li>';
351
  foreach( $interest_groupings as $interest_group ) {
355
  } else {
356
  ?>
357
  <ul class="interest-group-ul">
358
+ <li><?php echo $no_interest_groupings; ?></li>
359
  </ul>
360
  <?php
361
  }
admin/partials/view-user.php CHANGED
@@ -16,34 +16,41 @@
16
  }
17
 
18
  // run our API call, to get list data..
19
- $MailChimp = new Mailchimp( get_option( 'yikes-mc-api-key' , '' ) );
20
- $api_key = get_option( 'yikes-mc-api-key' , '' );
 
21
  // get this lists data
22
- try {
23
- $user_data = $MailChimp->call( 'lists/member-info' , array( 'apikey' => $api_key, 'id' => $list_id, 'emails' => array( array( 'leid' => $email_id ) ) ) );
24
- } catch (Exception $e) {
25
- echo '<h4>Error</h4>';
26
- echo __( 'We encountered an error:', 'yikes-inc-easy-mailchimp-extender' ) . ' ' . $e->getMessage() . ".\n";
27
- return;
28
  }
29
-
 
 
 
 
 
 
 
 
 
 
 
 
30
  /*
31
  * Check for MailChimp returned errors
32
  */
33
- if( isset( $user_data ) && $user_data['error_count'] >= 1 ) {
34
  echo '<h4>Error</h4>';
35
- echo $user_data['errors'][0]['error'] . '.';
36
  return;
37
- }
38
-
39
-
40
 
41
  if( isset( $user_data['data'][0] ) ) {
42
  // reset our data so we can easily use it
43
  $user_data = $user_data['data'][0];
44
 
45
  $other_lists = ( isset( $user_data['lists'] ) && ! empty( $user_data['lists'] ) ) ? $user_data['lists'] : array();
46
- $merge_variables = ( $user_data['merges'] && ! empty( $user_data['merges'] ) ) ? $user_data['merges'] : array();
47
 
48
  // print_r( $user_data );
49
 
@@ -56,8 +63,20 @@
56
  if( isset( $other_lists ) && count( $other_lists ) >= 1 ) {
57
  foreach( $other_lists as $list ) {
58
  if( $list['status'] == 'subscribed' ) {
59
- // get the list by name
60
- $list_data = $MailChimp->call( 'lists/list' , array( 'apikey' => $api_key, 'filters' => array( 'list_id' => $list['id'] ) ) );
 
 
 
 
 
 
 
 
 
 
 
 
61
  if( $list_data && isset( $list_data['data'][0] ) ) {
62
  $additional_lists[$list_data['data'][0]['id']] = $list_data['data'][0]['name'];
63
  }
@@ -66,12 +85,24 @@
66
  }
67
 
68
  /* Build the array of merge variables => value */
69
- if( isset( $merge_variables ) && count( $merge_variables ) >= 1 ) {
70
- $merge_variables = $MailChimp->call( 'lists/merge-vars' , array( 'apikey' => $api_key, 'id' => array( $list_id ) ) );
 
 
 
 
 
 
 
 
 
 
 
 
71
  if( $merge_variables ) {
72
  foreach( $merge_variables['data'][0]['merge_vars'] as $merge_variable ) {
73
  if( $merge_variable['tag'] != 'EMAIL' ) {
74
- $merge_variable_fields[$merge_variable['name']] = ( isset( $merge_variables[$merge_variable['tag']] ) ) ? $merge_variables[$merge_variable['tag']] : '';
75
  }
76
  }
77
  }
16
  }
17
 
18
  // run our API call, to get list data..
19
+ $api_key = trim( get_option( 'yikes-mc-api-key' , '' ) );
20
+ $dash_position = strpos( $api_key, '-' );
21
+
22
  // get this lists data
23
+ if( $dash_position !== false ) {
24
+ $api_endpoint = 'https://' . substr( $api_key, $dash_position + 1 ) . '.api.mailchimp.com/2.0/lists/member-info.json';
 
 
 
 
25
  }
26
+ $user_data = wp_remote_post( $api_endpoint, array(
27
+ 'body' => array(
28
+ 'apikey' => $api_key,
29
+ 'id' => $list_id,
30
+ 'emails' => array(
31
+ array( 'leid' => $email_id )
32
+ ),
33
+ ),
34
+ 'timeout' => 10,
35
+ 'sslverify' => apply_filters( 'yikes-mailchimp-sslverify', true ),
36
+ ) );
37
+ $user_data = json_decode( wp_remote_retrieve_body( $user_data ), true );
38
+
39
  /*
40
  * Check for MailChimp returned errors
41
  */
42
+ if( isset( $user_data['error'] ) ) {
43
  echo '<h4>Error</h4>';
44
+ echo $user_data['error'] . '.';
45
  return;
46
+ }
 
 
47
 
48
  if( isset( $user_data['data'][0] ) ) {
49
  // reset our data so we can easily use it
50
  $user_data = $user_data['data'][0];
51
 
52
  $other_lists = ( isset( $user_data['lists'] ) && ! empty( $user_data['lists'] ) ) ? $user_data['lists'] : array();
53
+ $merge_data_array = ( $user_data['merges'] && ! empty( $user_data['merges'] ) ) ? $user_data['merges'] : array();
54
 
55
  // print_r( $user_data );
56
 
63
  if( isset( $other_lists ) && count( $other_lists ) >= 1 ) {
64
  foreach( $other_lists as $list ) {
65
  if( $list['status'] == 'subscribed' ) {
66
+ if( $dash_position !== false ) {
67
+ $api_endpoint = 'https://' . substr( $api_key, $dash_position + 1 ) . '.api.mailchimp.com/2.0/lists/list.json';
68
+ }
69
+ $list_data = wp_remote_post( $api_endpoint, array(
70
+ 'body' => array(
71
+ 'apikey' => $api_key,
72
+ 'filters' => array(
73
+ 'list_id' => $list['id']
74
+ )
75
+ ),
76
+ 'timeout' => 10,
77
+ 'sslverify' => apply_filters( 'yikes-mailchimp-sslverify', true )
78
+ ) );
79
+ $list_data = json_decode( wp_remote_retrieve_body( $list_data ), true );
80
  if( $list_data && isset( $list_data['data'][0] ) ) {
81
  $additional_lists[$list_data['data'][0]['id']] = $list_data['data'][0]['name'];
82
  }
85
  }
86
 
87
  /* Build the array of merge variables => value */
88
+ if( isset( $merge_data_array ) && count( $merge_data_array ) >= 1 ) {
89
+ if( $dash_position !== false ) {
90
+ $api_endpoint = 'https://' . substr( $api_key, $dash_position + 1 ) . '.api.mailchimp.com/2.0/lists/merge-vars.json';
91
+ }
92
+ $merge_variables = wp_remote_post( $api_endpoint, array(
93
+ 'body' => array(
94
+ 'apikey' => $api_key,
95
+ 'id' => array( $list_id ),
96
+ ),
97
+ 'timeout' => 10,
98
+ 'sslverify' => apply_filters( 'yikes-mailchimp-sslverify', true )
99
+ ) );
100
+ $merge_variables = json_decode( wp_remote_retrieve_body( $merge_variables ), true );
101
+ // loop and display
102
  if( $merge_variables ) {
103
  foreach( $merge_variables['data'][0]['merge_vars'] as $merge_variable ) {
104
  if( $merge_variable['tag'] != 'EMAIL' ) {
105
+ $merge_variable_fields[$merge_variable['name']] = ( isset( $merge_data_array[$merge_variable['tag']] ) ) ? $merge_data_array[$merge_variable['tag']] : '';
106
  }
107
  }
108
  }
admin/partials/welcome-page/welcome-sections/whats-new-section.php CHANGED
@@ -8,7 +8,7 @@
8
 
9
  <img src="<?php echo YIKES_MC_URL . 'includes/images/Welcome_Page/inline-form-frontend.png'; ?>" style="margin-top:2em;padding-bottom: 2em;" alt="<?php _e( 'New Form Settings', 'yikes-inc-easy-mailchimp-extender' ); ?>" class="yikes-easy-mc-feature-image yikes-easy-mc-whats-new-section-image">
10
 
11
- <p><?php _e( "In version 6.0.3.8 of Easy Forms for MailChimp by YIKES we've added an additional layer of customization. You now have a whole new set of options to tweak on the edit form page - allowing an additional depth of customization.'", 'yikes-inc-easy-mailchimp-extender' ); ?></p>
12
  <hr />
13
  <ul class="new-feature-list">
14
  <li><?php _e( 'Additional Form Classes', 'yikes-inc-easy-mailchimp-extender' ); ?></li>
8
 
9
  <img src="<?php echo YIKES_MC_URL . 'includes/images/Welcome_Page/inline-form-frontend.png'; ?>" style="margin-top:2em;padding-bottom: 2em;" alt="<?php _e( 'New Form Settings', 'yikes-inc-easy-mailchimp-extender' ); ?>" class="yikes-easy-mc-feature-image yikes-easy-mc-whats-new-section-image">
10
 
11
+ <p><?php _e( "In version 6.0.3.8 of Easy Forms for MailChimp by YIKES we've added an additional layer of customization. You now have a whole new set of options to tweak on the edit form page - allowing an additional depth of customization.", 'yikes-inc-easy-mailchimp-extender' ); ?></p>
12
  <hr />
13
  <ul class="new-feature-list">
14
  <li><?php _e( 'Additional Form Classes', 'yikes-inc-easy-mailchimp-extender' ); ?></li>
includes/MailChimp/Mailchimp.php DELETED
@@ -1 +0,0 @@
1
- <?php
2
 
3
  public $apikey;
4
  public $ch;
5
  public $root = 'https://api.mailchimp.com/2.0';
6
  public $debug = false;
7
  public static $error_map = array(
8
  "ValidationError" => "Mailchimp_ValidationError",
9
  "ServerError_MethodUnknown" => "Mailchimp_ServerError_MethodUnknown",
10
  "ServerError_InvalidParameters" => "Mailchimp_ServerError_InvalidParameters",
11
  "Unknown_Exception" => "Mailchimp_Unknown_Exception",
12
  "Request_TimedOut" => "Mailchimp_Request_TimedOut",
13
  "Zend_Uri_Exception" => "Mailchimp_Zend_Uri_Exception",
14
  "PDOException" => "Mailchimp_PDOException",
15
  "Avesta_Db_Exception" => "Mailchimp_Avesta_Db_Exception",
16
  "XML_RPC2_Exception" => "Mailchimp_XML_RPC2_Exception",
17
  "XML_RPC2_FaultException" => "Mailchimp_XML_RPC2_FaultException",
18
  "Too_Many_Connections" => "Mailchimp_Too_Many_Connections",
19
  "Parse_Exception" => "Mailchimp_Parse_Exception",
20
  "User_Unknown" => "Mailchimp_User_Unknown",
21
  "User_Disabled" => "Mailchimp_User_Disabled",
22
  "User_DoesNotExist" => "Mailchimp_User_DoesNotExist",
23
  "User_NotApproved" => "Mailchimp_User_NotApproved",
24
  "Invalid_ApiKey" => "Mailchimp_Invalid_ApiKey",
25
  "User_UnderMaintenance" => "Mailchimp_User_UnderMaintenance",
26
  "Invalid_AppKey" => "Mailchimp_Invalid_AppKey",
27
  "Invalid_IP" => "Mailchimp_Invalid_IP",
28
  "User_DoesExist" => "Mailchimp_User_DoesExist",
29
  "User_InvalidRole" => "Mailchimp_User_InvalidRole",
30
  "User_InvalidAction" => "Mailchimp_User_InvalidAction",
31
  "User_MissingEmail" => "Mailchimp_User_MissingEmail",
32
  "User_CannotSendCampaign" => "Mailchimp_User_CannotSendCampaign",
33
  "User_MissingModuleOutbox" => "Mailchimp_User_MissingModuleOutbox",
34
  "User_ModuleAlreadyPurchased" => "Mailchimp_User_ModuleAlreadyPurchased",
35
  "User_ModuleNotPurchased" => "Mailchimp_User_ModuleNotPurchased",
36
  "User_NotEnoughCredit" => "Mailchimp_User_NotEnoughCredit",
37
  "MC_InvalidPayment" => "Mailchimp_MC_InvalidPayment",
38
  "List_DoesNotExist" => "Mailchimp_List_DoesNotExist",
39
  "List_InvalidInterestFieldType" => "Mailchimp_List_InvalidInterestFieldType",
40
  "List_InvalidOption" => "Mailchimp_List_InvalidOption",
41
  "List_InvalidUnsubMember" => "Mailchimp_List_InvalidUnsubMember",
42
  "List_InvalidBounceMember" => "Mailchimp_List_InvalidBounceMember",
43
  "List_AlreadySubscribed" => "Mailchimp_List_AlreadySubscribed",
44
  "List_NotSubscribed" => "Mailchimp_List_NotSubscribed",
45
  "List_InvalidImport" => "Mailchimp_List_InvalidImport",
46
  "MC_PastedList_Duplicate" => "Mailchimp_MC_PastedList_Duplicate",
47
  "MC_PastedList_InvalidImport" => "Mailchimp_MC_PastedList_InvalidImport",
48
  "Email_AlreadySubscribed" => "Mailchimp_Email_AlreadySubscribed",
49
  "Email_AlreadyUnsubscribed" => "Mailchimp_Email_AlreadyUnsubscribed",
50
  "Email_NotExists" => "Mailchimp_Email_NotExists",
51
  "Email_NotSubscribed" => "Mailchimp_Email_NotSubscribed",
52
  "List_MergeFieldRequired" => "Mailchimp_List_MergeFieldRequired",
53
  "List_CannotRemoveEmailMerge" => "Mailchimp_List_CannotRemoveEmailMerge",
54
  "List_Merge_InvalidMergeID" => "Mailchimp_List_Merge_InvalidMergeID",
55
  "List_TooManyMergeFields" => "Mailchimp_List_TooManyMergeFields",
56
  "List_InvalidMergeField" => "Mailchimp_List_InvalidMergeField",
57
  "List_InvalidInterestGroup" => "Mailchimp_List_InvalidInterestGroup",
58
  "List_TooManyInterestGroups" => "Mailchimp_List_TooManyInterestGroups",
59
  "Campaign_DoesNotExist" => "Mailchimp_Campaign_DoesNotExist",
60
  "Campaign_StatsNotAvailable" => "Mailchimp_Campaign_StatsNotAvailable",
61
  "Campaign_InvalidAbsplit" => "Mailchimp_Campaign_InvalidAbsplit",
62
  "Campaign_InvalidContent" => "Mailchimp_Campaign_InvalidContent",
63
  "Campaign_InvalidOption" => "Mailchimp_Campaign_InvalidOption",
64
  "Campaign_InvalidStatus" => "Mailchimp_Campaign_InvalidStatus",
65
  "Campaign_NotSaved" => "Mailchimp_Campaign_NotSaved",
66
  "Campaign_InvalidSegment" => "Mailchimp_Campaign_InvalidSegment",
67
  "Campaign_InvalidRss" => "Mailchimp_Campaign_InvalidRss",
68
  "Campaign_InvalidAuto" => "Mailchimp_Campaign_InvalidAuto",
69
  "MC_ContentImport_InvalidArchive" => "Mailchimp_MC_ContentImport_InvalidArchive",
70
  "Campaign_BounceMissing" => "Mailchimp_Campaign_BounceMissing",
71
  "Campaign_InvalidTemplate" => "Mailchimp_Campaign_InvalidTemplate",
72
  "Invalid_EcommOrder" => "Mailchimp_Invalid_EcommOrder",
73
  "Absplit_UnknownError" => "Mailchimp_Absplit_UnknownError",
74
  "Absplit_UnknownSplitTest" => "Mailchimp_Absplit_UnknownSplitTest",
75
  "Absplit_UnknownTestType" => "Mailchimp_Absplit_UnknownTestType",
76
  "Absplit_UnknownWaitUnit" => "Mailchimp_Absplit_UnknownWaitUnit",
77
  "Absplit_UnknownWinnerType" => "Mailchimp_Absplit_UnknownWinnerType",
78
  "Absplit_WinnerNotSelected" => "Mailchimp_Absplit_WinnerNotSelected",
79
  "Invalid_Analytics" => "Mailchimp_Invalid_Analytics",
80
  "Invalid_DateTime" => "Mailchimp_Invalid_DateTime",
81
  "Invalid_Email" => "Mailchimp_Invalid_Email",
82
  "Invalid_SendType" => "Mailchimp_Invalid_SendType",
83
  "Invalid_Template" => "Mailchimp_Invalid_Template",
84
  "Invalid_TrackingOptions" => "Mailchimp_Invalid_TrackingOptions",
85
  "Invalid_Options" => "Mailchimp_Invalid_Options",
86
  "Invalid_Folder" => "Mailchimp_Invalid_Folder",
87
  "Invalid_URL" => "Mailchimp_Invalid_URL",
88
  "Module_Unknown" => "Mailchimp_Module_Unknown",
89
  "MonthlyPlan_Unknown" => "Mailchimp_MonthlyPlan_Unknown",
90
  "Order_TypeUnknown" => "Mailchimp_Order_TypeUnknown",
91
  "Invalid_PagingLimit" => "Mailchimp_Invalid_PagingLimit",
92
  "Invalid_PagingStart" => "Mailchimp_Invalid_PagingStart",
93
  "Max_Size_Reached" => "Mailchimp_Max_Size_Reached",
94
  "MC_SearchException" => "Mailchimp_MC_SearchException",
95
  "Goal_SaveFailed" => "Mailchimp_Goal_SaveFailed",
96
  "Conversation_DoesNotExist" => "Mailchimp_Conversation_DoesNotExist",
97
  "Conversation_ReplySaveFailed" => "Mailchimp_Conversation_ReplySaveFailed",
98
  "File_Not_Found_Exception" => "Mailchimp_File_Not_Found_Exception",
99
  "Folder_Not_Found_Exception" => "Mailchimp_Folder_Not_Found_Exception",
100
  "Folder_Exists_Exception" => "Mailchimp_Folder_Exists_Exception"
101
  );
102
  public function __construct($apikey=null, $opts=array()) {
103
  if (!$apikey) {
104
  $apikey = getenv('MAILCHIMP_APIKEY');
105
  }
106
  if (!$apikey) {
107
  $apikey = $this->readConfigs();
108
  }
109
  if (!$apikey) {
110
  throw new Mailchimp_Error('You must provide a MailChimp API key');
111
  }
112
  $this->apikey = $apikey;
113
  $dc = "us1";
114
  if (strstr($this->apikey, "-")){
115
  list($key, $dc) = explode("-", $this->apikey, 2);
116
  if (!$dc) {
117
  $dc = "us1";
118
  }
119
  }
120
  $this->root = str_replace('https://api', 'https://' . $dc . '.api', $this->root);
121
  $this->root = rtrim($this->root, '/') . '/';
122
  if (!isset($opts['timeout']) || !is_int($opts['timeout'])){
123
  $opts['timeout'] = 600;
124
  }
125
  if (isset($opts['debug'])){
126
  $this->debug = true;
127
  }
128
  $this->ch = curl_init();
129
  if (isset($opts['CURLOPT_FOLLOWLOCATION']) && $opts['CURLOPT_FOLLOWLOCATION'] === true) {
130
  curl_setopt($this->ch, CURLOPT_FOLLOWLOCATION, true);
131
  }
132
  curl_setopt($this->ch, CURLOPT_USERAGENT, 'MailChimp-PHP/2.0.6');
133
  curl_setopt($this->ch, CURLOPT_POST, true);
134
  curl_setopt($this->ch, CURLOPT_HEADER, false);
135
  curl_setopt($this->ch, CURLOPT_RETURNTRANSFER, true);
136
  curl_setopt($this->ch, CURLOPT_CONNECTTIMEOUT, 30);
137
  curl_setopt($this->ch, CURLOPT_TIMEOUT, $opts['timeout']);
138
  $this->folders = new Mailchimp_Folders($this);
139
  $this->templates = new Mailchimp_Templates($this);
140
  $this->users = new Mailchimp_Users($this);
141
  $this->helper = new Mailchimp_Helper($this);
142
  $this->mobile = new Mailchimp_Mobile($this);
143
  $this->conversations = new Mailchimp_Conversations($this);
144
  $this->ecomm = new Mailchimp_Ecomm($this);
145
  $this->neapolitan = new Mailchimp_Neapolitan($this);
146
  $this->lists = new Mailchimp_Lists($this);
147
  $this->campaigns = new Mailchimp_Campaigns($this);
148
  $this->vip = new Mailchimp_Vip($this);
149
  $this->reports = new Mailchimp_Reports($this);
150
  $this->gallery = new Mailchimp_Gallery($this);
151
  $this->goal = new Mailchimp_Goal($this);
152
  }
153
  public function __destruct() {
154
  if(is_resource($this->ch)) {
155
  curl_close($this->ch);
156
  }
157
  }
158
  public function call($url, $params) {
159
  $params['apikey'] = $this->apikey;
160
 
161
  $params = json_encode($params);
162
  $ch = $this->ch;
163
  curl_setopt($ch, CURLOPT_URL, $this->root . $url . '.json');
164
  curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/json'));
165
  curl_setopt($ch, CURLOPT_POSTFIELDS, $params);
166
  curl_setopt($ch, CURLOPT_VERBOSE, $this->debug);
167
  $start = microtime(true);
168
  $this->log('Call to ' . $this->root . $url . '.json: ' . $params);
169
  if($this->debug) {
170
  $curl_buffer = fopen('php://memory', 'w+');
171
  curl_setopt($ch, CURLOPT_STDERR, $curl_buffer);
172
  }
173
  $response_body = curl_exec($ch);
174
  $info = curl_getinfo($ch);
175
  $time = microtime(true) - $start;
176
  if($this->debug) {
177
  rewind($curl_buffer);
178
  $this->log(stream_get_contents($curl_buffer));
179
  fclose($curl_buffer);
180
  }
181
  $this->log('Completed in ' . number_format($time * 1000, 2) . 'ms');
182
  $this->log('Got response: ' . $response_body);
183
  if(curl_error($ch)) {
184
  throw new Mailchimp_HttpError("API call to $url failed: " . curl_error($ch));
185
  }
186
  $result = json_decode($response_body, true);
187
  if( defined( 'YIKES_MAILCHIMP_NULL_DEBUG' ) && YIKES_MAILCHIMP_NULL_DEBUG == '1' ) {
188
  if(floor($info['http_code'] / 100) >= 4) {
189
  throw $this->castError($result);
190
  }
191
  return $result;
192
  }
193
  public function readConfigs() {
194
  $paths = array('~/.mailchimp.key', '/etc/mailchimp.key');
195
  foreach($paths as $path) {
196
  if(file_exists($path)) {
197
  $apikey = trim(file_get_contents($path));
198
  if ($apikey) {
199
  return $apikey;
200
  }
201
  }
202
  }
203
  return false;
204
  }
205
  public function castError($result) {
206
  if ($result['status'] !== 'error' || !$result['name']) {
207
  throw new Mailchimp_Error('We received an unexpected error: ' . json_encode($result));
208
  }
209
  $class = (isset(self::$error_map[$result['name']])) ? self::$error_map[$result['name']] : 'Mailchimp_Error';
210
  return new $class($result['error'], $result['code']);
211
  }
212
  public function log($msg) {
213
  if ($this->debug) {
214
  error_log($msg);
215
  }
216
  }
 
0
 
1
  public $apikey;
2
  public $ch;
3
  public $root = 'https://api.mailchimp.com/2.0';
4
  public $debug = false;
5
  public static $error_map = array(
6
  "ValidationError" => "Mailchimp_ValidationError",
7
  "ServerError_MethodUnknown" => "Mailchimp_ServerError_MethodUnknown",
8
  "ServerError_InvalidParameters" => "Mailchimp_ServerError_InvalidParameters",
9
  "Unknown_Exception" => "Mailchimp_Unknown_Exception",
10
  "Request_TimedOut" => "Mailchimp_Request_TimedOut",
11
  "Zend_Uri_Exception" => "Mailchimp_Zend_Uri_Exception",
12
  "PDOException" => "Mailchimp_PDOException",
13
  "Avesta_Db_Exception" => "Mailchimp_Avesta_Db_Exception",
14
  "XML_RPC2_Exception" => "Mailchimp_XML_RPC2_Exception",
15
  "XML_RPC2_FaultException" => "Mailchimp_XML_RPC2_FaultException",
16
  "Too_Many_Connections" => "Mailchimp_Too_Many_Connections",
17
  "Parse_Exception" => "Mailchimp_Parse_Exception",
18
  "User_Unknown" => "Mailchimp_User_Unknown",
19
  "User_Disabled" => "Mailchimp_User_Disabled",
20
  "User_DoesNotExist" => "Mailchimp_User_DoesNotExist",
21
  "User_NotApproved" => "Mailchimp_User_NotApproved",
22
  "Invalid_ApiKey" => "Mailchimp_Invalid_ApiKey",
23
  "User_UnderMaintenance" => "Mailchimp_User_UnderMaintenance",
24
  "Invalid_AppKey" => "Mailchimp_Invalid_AppKey",
25
  "Invalid_IP" => "Mailchimp_Invalid_IP",
26
  "User_DoesExist" => "Mailchimp_User_DoesExist",
27
  "User_InvalidRole" => "Mailchimp_User_InvalidRole",
28
  "User_InvalidAction" => "Mailchimp_User_InvalidAction",
29
  "User_MissingEmail" => "Mailchimp_User_MissingEmail",
30
  "User_CannotSendCampaign" => "Mailchimp_User_CannotSendCampaign",
31
  "User_MissingModuleOutbox" => "Mailchimp_User_MissingModuleOutbox",
32
  "User_ModuleAlreadyPurchased" => "Mailchimp_User_ModuleAlreadyPurchased",
33
  "User_ModuleNotPurchased" => "Mailchimp_User_ModuleNotPurchased",
34
  "User_NotEnoughCredit" => "Mailchimp_User_NotEnoughCredit",
35
  "MC_InvalidPayment" => "Mailchimp_MC_InvalidPayment",
36
  "List_DoesNotExist" => "Mailchimp_List_DoesNotExist",
37
  "List_InvalidInterestFieldType" => "Mailchimp_List_InvalidInterestFieldType",
38
  "List_InvalidOption" => "Mailchimp_List_InvalidOption",
39
  "List_InvalidUnsubMember" => "Mailchimp_List_InvalidUnsubMember",
40
  "List_InvalidBounceMember" => "Mailchimp_List_InvalidBounceMember",
41
  "List_AlreadySubscribed" => "Mailchimp_List_AlreadySubscribed",
42
  "List_NotSubscribed" => "Mailchimp_List_NotSubscribed",
43
  "List_InvalidImport" => "Mailchimp_List_InvalidImport",
44
  "MC_PastedList_Duplicate" => "Mailchimp_MC_PastedList_Duplicate",
45
  "MC_PastedList_InvalidImport" => "Mailchimp_MC_PastedList_InvalidImport",
46
  "Email_AlreadySubscribed" => "Mailchimp_Email_AlreadySubscribed",
47
  "Email_AlreadyUnsubscribed" => "Mailchimp_Email_AlreadyUnsubscribed",
48
  "Email_NotExists" => "Mailchimp_Email_NotExists",
49
  "Email_NotSubscribed" => "Mailchimp_Email_NotSubscribed",
50
  "List_MergeFieldRequired" => "Mailchimp_List_MergeFieldRequired",
51
  "List_CannotRemoveEmailMerge" => "Mailchimp_List_CannotRemoveEmailMerge",
52
  "List_Merge_InvalidMergeID" => "Mailchimp_List_Merge_InvalidMergeID",
53
  "List_TooManyMergeFields" => "Mailchimp_List_TooManyMergeFields",
54
  "List_InvalidMergeField" => "Mailchimp_List_InvalidMergeField",
55
  "List_InvalidInterestGroup" => "Mailchimp_List_InvalidInterestGroup",
56
  "List_TooManyInterestGroups" => "Mailchimp_List_TooManyInterestGroups",
57
  "Campaign_DoesNotExist" => "Mailchimp_Campaign_DoesNotExist",
58
  "Campaign_StatsNotAvailable" => "Mailchimp_Campaign_StatsNotAvailable",
59
  "Campaign_InvalidAbsplit" => "Mailchimp_Campaign_InvalidAbsplit",
60
  "Campaign_InvalidContent" => "Mailchimp_Campaign_InvalidContent",
61
  "Campaign_InvalidOption" => "Mailchimp_Campaign_InvalidOption",
62
  "Campaign_InvalidStatus" => "Mailchimp_Campaign_InvalidStatus",
63
  "Campaign_NotSaved" => "Mailchimp_Campaign_NotSaved",
64
  "Campaign_InvalidSegment" => "Mailchimp_Campaign_InvalidSegment",
65
  "Campaign_InvalidRss" => "Mailchimp_Campaign_InvalidRss",
66
  "Campaign_InvalidAuto" => "Mailchimp_Campaign_InvalidAuto",
67
  "MC_ContentImport_InvalidArchive" => "Mailchimp_MC_ContentImport_InvalidArchive",
68
  "Campaign_BounceMissing" => "Mailchimp_Campaign_BounceMissing",
69
  "Campaign_InvalidTemplate" => "Mailchimp_Campaign_InvalidTemplate",
70
  "Invalid_EcommOrder" => "Mailchimp_Invalid_EcommOrder",
71
  "Absplit_UnknownError" => "Mailchimp_Absplit_UnknownError",
72
  "Absplit_UnknownSplitTest" => "Mailchimp_Absplit_UnknownSplitTest",
73
  "Absplit_UnknownTestType" => "Mailchimp_Absplit_UnknownTestType",
74
  "Absplit_UnknownWaitUnit" => "Mailchimp_Absplit_UnknownWaitUnit",
75
  "Absplit_UnknownWinnerType" => "Mailchimp_Absplit_UnknownWinnerType",
76
  "Absplit_WinnerNotSelected" => "Mailchimp_Absplit_WinnerNotSelected",
77
  "Invalid_Analytics" => "Mailchimp_Invalid_Analytics",
78
  "Invalid_DateTime" => "Mailchimp_Invalid_DateTime",
79
  "Invalid_Email" => "Mailchimp_Invalid_Email",
80
  "Invalid_SendType" => "Mailchimp_Invalid_SendType",
81
  "Invalid_Template" => "Mailchimp_Invalid_Template",
82
  "Invalid_TrackingOptions" => "Mailchimp_Invalid_TrackingOptions",
83
  "Invalid_Options" => "Mailchimp_Invalid_Options",
84
  "Invalid_Folder" => "Mailchimp_Invalid_Folder",
85
  "Invalid_URL" => "Mailchimp_Invalid_URL",
86
  "Module_Unknown" => "Mailchimp_Module_Unknown",
87
  "MonthlyPlan_Unknown" => "Mailchimp_MonthlyPlan_Unknown",
88
  "Order_TypeUnknown" => "Mailchimp_Order_TypeUnknown",
89
  "Invalid_PagingLimit" => "Mailchimp_Invalid_PagingLimit",
90
  "Invalid_PagingStart" => "Mailchimp_Invalid_PagingStart",
91
  "Max_Size_Reached" => "Mailchimp_Max_Size_Reached",
92
  "MC_SearchException" => "Mailchimp_MC_SearchException",
93
  "Goal_SaveFailed" => "Mailchimp_Goal_SaveFailed",
94
  "Conversation_DoesNotExist" => "Mailchimp_Conversation_DoesNotExist",
95
  "Conversation_ReplySaveFailed" => "Mailchimp_Conversation_ReplySaveFailed",
96
  "File_Not_Found_Exception" => "Mailchimp_File_Not_Found_Exception",
97
  "Folder_Not_Found_Exception" => "Mailchimp_Folder_Not_Found_Exception",
98
  "Folder_Exists_Exception" => "Mailchimp_Folder_Exists_Exception"
99
  );
100
  public function __construct($apikey=null, $opts=array()) {
101
  if (!$apikey) {
102
  $apikey = getenv('MAILCHIMP_APIKEY');
103
  }
104
  if (!$apikey) {
105
  $apikey = $this->readConfigs();
106
  }
107
  if (!$apikey) {
108
  throw new Mailchimp_Error('You must provide a MailChimp API key');
109
  }
110
  $this->apikey = $apikey;
111
  $dc = "us1";
112
  if (strstr($this->apikey, "-")){
113
  list($key, $dc) = explode("-", $this->apikey, 2);
114
  if (!$dc) {
115
  $dc = "us1";
116
  }
117
  }
118
  $this->root = str_replace('https://api', 'https://' . $dc . '.api', $this->root);
119
  $this->root = rtrim($this->root, '/') . '/';
120
  if (!isset($opts['timeout']) || !is_int($opts['timeout'])){
121
  $opts['timeout'] = 600;
122
  }
123
  if (isset($opts['debug'])){
124
  $this->debug = true;
125
  }
126
  $this->ch = curl_init();
127
  if (isset($opts['CURLOPT_FOLLOWLOCATION']) && $opts['CURLOPT_FOLLOWLOCATION'] === true) {
128
  curl_setopt($this->ch, CURLOPT_FOLLOWLOCATION, true);
129
  }
130
  curl_setopt($this->ch, CURLOPT_USERAGENT, 'MailChimp-PHP/2.0.6');
131
  curl_setopt($this->ch, CURLOPT_POST, true);
132
  curl_setopt($this->ch, CURLOPT_HEADER, false);
133
  curl_setopt($this->ch, CURLOPT_RETURNTRANSFER, true);
134
  curl_setopt($this->ch, CURLOPT_CONNECTTIMEOUT, 30);
135
  curl_setopt($this->ch, CURLOPT_TIMEOUT, $opts['timeout']);
136
  $this->folders = new Mailchimp_Folders($this);
137
  $this->templates = new Mailchimp_Templates($this);
138
  $this->users = new Mailchimp_Users($this);
139
  $this->helper = new Mailchimp_Helper($this);
140
  $this->mobile = new Mailchimp_Mobile($this);
141
  $this->conversations = new Mailchimp_Conversations($this);
142
  $this->ecomm = new Mailchimp_Ecomm($this);
143
  $this->neapolitan = new Mailchimp_Neapolitan($this);
144
  $this->lists = new Mailchimp_Lists($this);
145
  $this->campaigns = new Mailchimp_Campaigns($this);
146
  $this->vip = new Mailchimp_Vip($this);
147
  $this->reports = new Mailchimp_Reports($this);
148
  $this->gallery = new Mailchimp_Gallery($this);
149
  $this->goal = new Mailchimp_Goal($this);
150
  }
151
  public function __destruct() {
152
  if(is_resource($this->ch)) {
153
  curl_close($this->ch);
154
  }
155
  }
156
  public function call($url, $params) {
157
  $params['apikey'] = $this->apikey;
158
 
159
  $params = json_encode($params);
160
  $ch = $this->ch;
161
  curl_setopt($ch, CURLOPT_URL, $this->root . $url . '.json');
162
  curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/json'));
163
  curl_setopt($ch, CURLOPT_POSTFIELDS, $params);
164
  curl_setopt($ch, CURLOPT_VERBOSE, $this->debug);
165
  $start = microtime(true);
166
  $this->log('Call to ' . $this->root . $url . '.json: ' . $params);
167
  if($this->debug) {
168
  $curl_buffer = fopen('php://memory', 'w+');
169
  curl_setopt($ch, CURLOPT_STDERR, $curl_buffer);
170
  }
171
  $response_body = curl_exec($ch);
172
  $info = curl_getinfo($ch);
173
  $time = microtime(true) - $start;
174
  if($this->debug) {
175
  rewind($curl_buffer);
176
  $this->log(stream_get_contents($curl_buffer));
177
  fclose($curl_buffer);
178
  }
179
  $this->log('Completed in ' . number_format($time * 1000, 2) . 'ms');
180
  $this->log('Got response: ' . $response_body);
181
  if(curl_error($ch)) {
182
  throw new Mailchimp_HttpError("API call to $url failed: " . curl_error($ch));
183
  }
184
  $result = json_decode($response_body, true);
185
  if( defined( 'YIKES_MAILCHIMP_NULL_DEBUG' ) && YIKES_MAILCHIMP_NULL_DEBUG == '1' ) {
186
  if(floor($info['http_code'] / 100) >= 4) {
187
  throw $this->castError($result);
188
  }
189
  return $result;
190
  }
191
  public function readConfigs() {
192
  $paths = array('~/.mailchimp.key', '/etc/mailchimp.key');
193
  foreach($paths as $path) {
194
  if(file_exists($path)) {
195
  $apikey = trim(file_get_contents($path));
196
  if ($apikey) {
197
  return $apikey;
198
  }
199
  }
200
  }
201
  return false;
202
  }
203
  public function castError($result) {
204
  if ($result['status'] !== 'error' || !$result['name']) {
205
  throw new Mailchimp_Error('We received an unexpected error: ' . json_encode($result));
206
  }
207
  $class = (isset(self::$error_map[$result['name']])) ? self::$error_map[$result['name']] : 'Mailchimp_Error';
208
  return new $class($result['error'], $result['code']);
209
  }
210
  public function log($msg) {
211
  if ($this->debug) {
212
  error_log($msg);
213
  }
214
  }
includes/MailChimp/Mailchimp/Campaigns.php DELETED
@@ -1 +0,0 @@
1
- <?php
2
  public function __construct(Mailchimp $master) {
3
  $this->master = $master;
4
  }
5
  /**
6
  * Get the content (both html and text) for a campaign either as it would appear in the campaign archive or as the raw, original content
7
  * @param string $cid
8
  * @param associative_array $options
9
  * - view string optional one of "archive" (default), "preview" (like our popup-preview) or "raw"
10
  * - email associative_array optional if provided, view is "archive" or "preview", the campaign's list still exists, and the requested record is subscribed to the list. the returned content will be populated with member data populated. a struct with one of the following keys - failing to provide anything will produce an error relating to the email address. If multiple keys are provided, the first one from the following list that we find will be used, the rest will be ignored.
11
  * - email string an email address
12
  * - euid string the unique id for an email address (not list related) - the email "id" returned from listMemberInfo, Webhooks, Campaigns, etc.
13
  * - leid string the list email id (previously called web_id) for a list-member-info type call. this doesn't change when the email address changes
14
  * @return associative_array containing all content for the campaign
15
  * - html string The HTML content used for the campaign with merge tags intact
16
  * - text string The Text content used for the campaign with merge tags intact
17
  */
18
  public function content($cid, $options=array()) {
19
  $_params = array("cid" => $cid, "options" => $options);
20
  return $this->master->call('campaigns/content', $_params);
21
  }
22
  /**
23
  * Create a new draft campaign to send. You <strong>can not</strong> have more than 32,000 campaigns in your account.
24
  * @param string $type
25
  * @param associative_array $options
26
  * - list_id string the list to send this campaign to- get lists using lists/list()
27
  * - subject string the subject line for your campaign message
28
  * - from_email string the From: email address for your campaign message
29
  * - from_name string the From: name for your campaign message (not an email address)
30
  * - to_name string the To: name recipients will see (not email address)
31
  * - template_id int optional - use this user-created template to generate the HTML content of the campaign (takes precendence over other template options)
32
  * - gallery_template_id int optional - use a template from the public gallery to generate the HTML content of the campaign (takes precendence over base template options)
33
  * - base_template_id int optional - use this a base/start-from-scratch template to generate the HTML content of the campaign
34
  * - folder_id int optional - automatically file the new campaign in the folder_id passed. Get using folders/list() - note that Campaigns and Autoresponders have separate folder setups
35
  * - tracking associative_array optional - set which recipient actions will be tracked. Click tracking can not be disabled for Free accounts.
36
  * - opens bool whether to track opens, defaults to true
37
  * - html_clicks bool whether to track clicks in HTML content, defaults to true
38
  * - text_clicks bool whether to track clicks in Text content, defaults to false
39
  * - title string optional - an internal name to use for this campaign. By default, the campaign subject will be used.
40
  * - authenticate boolean optional - set to true to enable SenderID, DomainKeys, and DKIM authentication, defaults to false.
41
  * - analytics associative_array optional - one or more of these keys set to the tag to use - that can be any custom text (up to 50 bytes)
42
  * - google string for Google Analytics tracking
43
  * - clicktale string for ClickTale tracking
44
  * - gooal string for Goal tracking (the extra 'o' in the param name is not a typo)
45
  * - auto_footer boolean optional Whether or not we should auto-generate the footer for your content. Mostly useful for content from URLs or Imports
46
  * - inline_css boolean optional Whether or not css should be automatically inlined when this campaign is sent, defaults to false.
47
  * - generate_text boolean optional Whether of not to auto-generate your Text content from the HTML content. Note that this will be ignored if the Text part of the content passed is not empty, defaults to false.
48
  * - auto_tweet boolean optional If set, this campaign will be auto-tweeted when it is sent - defaults to false. Note that if a Twitter account isn't linked, this will be silently ignored.
49
  * - auto_fb_post array optional If set, this campaign will be auto-posted to the page_ids contained in the array. If a Facebook account isn't linked or the account does not have permission to post to the page_ids requested, those failures will be silently ignored.
50
  * - fb_comments boolean optional If true, the Facebook comments (and thus the <a href="http://kb.mailchimp.com/article/i-dont-want-an-archiave-of-my-campaign-can-i-turn-it-off/" target="_blank">archive bar</a> will be displayed. If false, Facebook comments will not be enabled (does not imply no archive bar, see previous link). Defaults to "true".
51
  * - timewarp boolean optional If set, this campaign must be scheduled 24 hours in advance of sending - default to false. Only valid for "regular" campaigns and "absplit" campaigns that split on schedule_time.
52
  * - ecomm360 boolean optional If set, our <a href="http://www.mailchimp.com/blog/ecommerce-tracking-plugin/" target="_blank">Ecommerce360 tracking</a> will be enabled for links in the campaign
53
  * - crm_tracking associative_array optional If set, a struct to enable CRM tracking for:
54
  * - salesforce associative_array optional Enable SalesForce push back
55
  * - campaign bool optional - if true, create a Campaign object and update it with aggregate stats
56
  * - notes bool optional - if true, attempt to update Contact notes based on email address
57
  * - highrise associative_array optional Enable Highrise push back
58
  * - campaign bool optional - if true, create a Kase object and update it with aggregate stats
59
  * - notes bool optional - if true, attempt to update Contact notes based on email address
60
  * - capsule associative_array optional Enable Capsule push back (only notes are supported)
61
  * - notes bool optional - if true, attempt to update Contact notes based on email address
62
  * @param associative_array $content
63
  * - html string for raw/pasted HTML content
64
  * - sections associative_array when using a template instead of raw HTML, each key should be the unique mc:edit area name from the template.
65
  * - text string for the plain-text version
66
  * - url string to have us pull in content from a URL. Note, this will override any other content options - for lists with Email Format options, you'll need to turn on generate_text as well
67
  * - archive string to send a Base64 encoded archive file for us to import all media from. Note, this will override any other content options - for lists with Email Format options, you'll need to turn on generate_text as well
68
  * - archive_type string optional - only necessary for the "archive" option. Supported formats are: zip, tar.gz, tar.bz2, tar, tgz, tbz . If not included, we will default to zip
69
  * @param associative_array $segment_opts
70
  * @param associative_array $type_opts
71
  * - rss associative_array For RSS Campaigns this, struct should contain:
72
  * - url string the URL to pull RSS content from - it will be verified and must exist
73
  * - schedule string optional one of "daily", "weekly", "monthly" - defaults to "daily"
74
  * - schedule_hour string optional an hour between 0 and 24 - default to 4 (4am <em>local time</em>) - applies to all schedule types
75
  * - schedule_weekday string optional for "weekly" only, a number specifying the day of the week to send: 0 (Sunday) - 6 (Saturday) - defaults to 1 (Monday)
76
  * - schedule_monthday string optional for "monthly" only, a number specifying the day of the month to send (1 - 28) or "last" for the last day of a given month. Defaults to the 1st day of the month
77
  * - days associative_array optional used for "daily" schedules only, an array of the <a href="http://en.wikipedia.org/wiki/ISO-8601#Week_dates" target="_blank">ISO-8601 weekday numbers</a> to send on
78
  * - 1 bool optional Monday, defaults to true
79
  * - 2 bool optional Tuesday, defaults to true
80
  * - 3 bool optional Wednesday, defaults to true
81
  * - 4 bool optional Thursday, defaults to true
82
  * - 5 bool optional Friday, defaults to true
83
  * - 6 bool optional Saturday, defaults to true
84
  * - 7 bool optional Sunday, defaults to true
85
  * - absplit associative_array For A/B Split campaigns, this struct should contain:
86
  * - split_test string The values to segment based on. Currently, one of: "subject", "from_name", "schedule". NOTE, for "schedule", you will need to call campaigns/schedule() separately!
87
  * - pick_winner string How the winner will be picked, one of: "opens" (by the open_rate), "clicks" (by the click rate), "manual" (you pick manually)
88
  * - wait_units int optional the default time unit to wait before auto-selecting a winner - use "3600" for hours, "86400" for days. Defaults to 86400.
89
  * - wait_time int optional the number of units to wait before auto-selecting a winner - defaults to 1, so if not set, a winner will be selected after 1 Day.
90
  * - split_size int optional this is a percentage of what size the Campaign's List plus any segmentation options results in. "schedule" type forces 50%, all others default to 10%
91
  * - from_name_a string optional sort of, required when split_test is "from_name"
92
  * - from_name_b string optional sort of, required when split_test is "from_name"
93
  * - from_email_a string optional sort of, required when split_test is "from_name"
94
  * - from_email_b string optional sort of, required when split_test is "from_name"
95
  * - subject_a string optional sort of, required when split_test is "subject"
96
  * - subject_b string optional sort of, required when split_test is "subject"
97
  * - auto associative_array For AutoResponder campaigns, this struct should contain:
98
  * - offset-units string one of "hourly", "day", "week", "month", "year" - required
99
  * - offset-time string optional, sort of - the number of units must be a number greater than 0 for signup based autoresponders, ignored for "hourly"
100
  * - offset-dir string either "before" or "after", ignored for "hourly"
101
  * - event string optional "signup" (default) to base this members added to a list, "date", "annual", or "birthday" to base this on merge field in the list, "campaignOpen" or "campaignClicka" to base this on any activity for a campaign, "campaignClicko" to base this on clicks on a specific URL in a campaign, "mergeChanged" to base this on a specific merge field being changed to a specific value
102
  * - event-datemerge string optional sort of, this is required if the event is "date", "annual", "birthday", or "mergeChanged"
103
  * - campaign_id string optional sort of, required for "campaignOpen", "campaignClicka", or "campaignClicko"
104
  * - campaign_url string optional sort of, required for "campaignClicko"
105
  * - schedule_hour int The hour of the day - 24 hour format in GMT - the autoresponder should be triggered, ignored for "hourly"
106
  * - use_import_time boolean whether or not imported subscribers (ie, <em>any</em> non-double optin subscribers) will receive
107
  * - days associative_array optional used for "daily" schedules only, an array of the <a href="http://en.wikipedia.org/wiki/ISO-8601#Week_dates" target="_blank">ISO-8601 weekday numbers</a> to send on<
108
  * - 1 bool optional Monday, defaults to true
109
  * - 2 bool optional Tuesday, defaults to true
110
  * - 3 bool optional Wednesday, defaults to true
111
  * - 4 bool optional Thursday, defaults to true
112
  * - 5 bool optional Friday, defaults to true
113
  * - 6 bool optional Saturday, defaults to true
114
  * - 7 bool optional Sunday, defaults to true
115
  * @return associative_array the new campaign's details - will return same data as single campaign from campaigns/list()
116
  */
117
  public function create($type, $options, $content, $segment_opts=null, $type_opts=null) {
118
  $_params = array("type" => $type, "options" => $options, "content" => $content, "segment_opts" => $segment_opts, "type_opts" => $type_opts);
119
  return $this->master->call('campaigns/create', $_params);
120
  }
121
  /**
122
  * Delete a campaign. Seriously, "poof, gone!" - be careful! Seriously, no one can undelete these.
123
  * @param string $cid
124
  * @return associative_array with a single entry:
125
  * - complete bool whether the call worked. reallistically this will always be true as errors will be thrown otherwise.
126
  */
127
  public function delete($cid) {
128
  $_params = array("cid" => $cid);
129
  return $this->master->call('campaigns/delete', $_params);
130
  }
131
  /**
132
  * Get the list of campaigns and their details matching the specified filters
133
  * @param associative_array $filters
134
  * - campaign_id string optional - return the campaign using a know campaign_id. Accepts multiples separated by commas when not using exact matching.
135
  * - parent_id string optional - return the child campaigns using a known parent campaign_id. Accepts multiples separated by commas when not using exact matching.
136
  * - list_id string optional - the list to send this campaign to - get lists using lists/list(). Accepts multiples separated by commas when not using exact matching.
137
  * - folder_id int optional - only show campaigns from this folder id - get folders using folders/list(). Accepts multiples separated by commas when not using exact matching.
138
  * - template_id int optional - only show campaigns using this template id - get templates using templates/list(). Accepts multiples separated by commas when not using exact matching.
139
  * - status string optional - return campaigns of a specific status - one of "sent", "save", "paused", "schedule", "sending". Accepts multiples separated by commas when not using exact matching.
140
  * - type string optional - return campaigns of a specific type - one of "regular", "plaintext", "absplit", "rss", "auto". Accepts multiples separated by commas when not using exact matching.
141
  * - from_name string optional - only show campaigns that have this "From Name"
142
  * - from_email string optional - only show campaigns that have this "Reply-to Email"
143
  * - title string optional - only show campaigns that have this title
144
  * - subject string optional - only show campaigns that have this subject
145
  * - sendtime_start string optional - only show campaigns that have been sent since this date/time (in GMT) - - 24 hour format in <strong>GMT</strong>, eg "2013-12-30 20:30:00" - if this is invalid the whole call fails
146
  * - sendtime_end string optional - only show campaigns that have been sent before this date/time (in GMT) - - 24 hour format in <strong>GMT</strong>, eg "2013-12-30 20:30:00" - if this is invalid the whole call fails
147
  * - uses_segment boolean - whether to return just campaigns with or without segments
148
  * - exact boolean optional - flag for whether to filter on exact values when filtering, or search within content for filter values - defaults to true. Using this disables the use of any filters that accept multiples.
149
  * @param int $start
150
  * @param int $limit
151
  * @param string $sort_field
152
  * @param string $sort_dir
153
  * @return associative_array containing a count of all matching campaigns, the specific ones for the current page, and any errors from the filters provided
154
  * - total int the total number of campaigns matching the filters passed in
155
  * - data array structs for each campaign being returned
156
  * - id string Campaign Id (used for all other campaign functions)
157
  * - web_id int The Campaign id used in our web app, allows you to create a link directly to it
158
  * - list_id string The List used for this campaign
159
  * - folder_id int The Folder this campaign is in
160
  * - template_id int The Template this campaign uses
161
  * - content_type string How the campaign's content is put together - one of 'template', 'html', 'url'
162
  * - title string Title of the campaign
163
  * - type string The type of campaign this is (regular,plaintext,absplit,rss,inspection,auto)
164
  * - create_time string Creation time for the campaign
165
  * - send_time string Send time for the campaign - also the scheduled time for scheduled campaigns.
166
  * - emails_sent int Number of emails email was sent to
167
  * - status string Status of the given campaign (save,paused,schedule,sending,sent)
168
  * - from_name string From name of the given campaign
169
  * - from_email string Reply-to email of the given campaign
170
  * - subject string Subject of the given campaign
171
  * - to_name string Custom "To:" email string using merge variables
172
  * - archive_url string Archive link for the given campaign
173
  * - inline_css boolean Whether or not the campaign content's css was auto-inlined
174
  * - analytics string Either "google" if enabled or "N" if disabled
175
  * - analytics_tag string The name/tag the campaign's links were tagged with if analytics were enabled.
176
  * - authenticate boolean Whether or not the campaign was authenticated
177
  * - ecomm360 boolean Whether or not ecomm360 tracking was appended to links
178
  * - auto_tweet boolean Whether or not the campaign was auto tweeted after sending
179
  * - auto_fb_post string A comma delimited list of Facebook Profile/Page Ids the campaign was posted to after sending. If not used, blank.
180
  * - auto_footer boolean Whether or not the auto_footer was manually turned on
181
  * - timewarp boolean Whether or not the campaign used Timewarp
182
  * - timewarp_schedule string The time, in GMT, that the Timewarp campaign is being sent. For A/B Split campaigns, this is blank and is instead in their schedule_a and schedule_b in the type_opts array
183
  * - parent_id string the unique id of the parent campaign (currently only valid for rss children). Will be blank for non-rss child campaigns or parent campaign has been deleted.
184
  * - is_child boolean true if this is an RSS child campaign. Will return true even if the parent campaign has been deleted.
185
  * - tests_sent string tests sent
186
  * - tests_remain int test sends remaining
187
  * - tracking associative_array the various tracking options used
188
  * - html_clicks boolean whether or not tracking for html clicks was enabled.
189
  * - text_clicks boolean whether or not tracking for text clicks was enabled.
190
  * - opens boolean whether or not opens tracking was enabled.
191
  * - segment_text string a string marked-up with HTML explaining the segment used for the campaign in plain English
192
  * - segment_opts array the segment used for the campaign - can be passed to campaigns/segment-test or campaigns/create()
193
  * - saved_segment associative_array if a saved segment was used (match+conditions returned above):
194
  * - id int the saved segment id
195
  * - type string the saved segment type
196
  * - name string the saved segment name
197
  * - type_opts associative_array the type-specific options for the campaign - can be passed to campaigns/create()
198
  * - comments_total int total number of comments left on this campaign
199
  * - comments_unread int total number of unread comments for this campaign based on the login the apikey belongs to
200
  * - summary associative_array if available, the basic aggregate stats returned by reports/summary
201
  * - social_card associative_array If a social card has been attached to this campaign:
202
  * - title string The title of the campaign used with the card
203
  * - description string The description used with the card
204
  * - image_url string The URL of the image used with the card
205
  * - enabled string Whether or not the social card is enabled for this campaign.
206
  * - errors array structs of any errors found while loading lists - usually just from providing invalid list ids
207
  * - filter string the filter that caused the failure
208
  * - value string the filter value that caused the failure
209
  * - code int the error code
210
  * - error string the error message
211
  */
212
  public function getList($filters=array(), $start=0, $limit=25, $sort_field='create_time', $sort_dir='DESC') {
213
  $_params = array("filters" => $filters, "start" => $start, "limit" => $limit, "sort_field" => $sort_field, "sort_dir" => $sort_dir);
214
  return $this->master->call('campaigns/list', $_params);
215
  }
216
  /**
217
  * Pause an AutoResponder or RSS campaign from sending
218
  * @param string $cid
219
  * @return associative_array with a single entry:
220
  * - complete bool whether the call worked. reallistically this will always be true as errors will be thrown otherwise.
221
  */
222
  public function pause($cid) {
223
  $_params = array("cid" => $cid);
224
  return $this->master->call('campaigns/pause', $_params);
225
  }
226
  /**
227
  * Returns information on whether a campaign is ready to send and possible issues we may have detected with it - very similar to the confirmation step in the app.
228
  * @param string $cid
229
  * @return associative_array containing:
230
  * - is_ready bool whether or not you're going to be able to send this campaign
231
  * - items array an array of structs explaining basically what the app's confirmation step would
232
  * - type string the item type - generally success, warning, or error
233
  * - heading string the item's heading in the app
234
  * - details string the item's details from the app, sans any html tags/links
235
  */
236
  public function ready($cid) {
237
  $_params = array("cid" => $cid);
238
  return $this->master->call('campaigns/ready', $_params);
239
  }
240
  /**
241
  * Replicate a campaign.
242
  * @param string $cid
243
  * @return associative_array the matching campaign's details - will return same data as single campaign from campaigns/list()
244
  */
245
  public function replicate($cid) {
246
  $_params = array("cid" => $cid);
247
  return $this->master->call('campaigns/replicate', $_params);
248
  }
249
  /**
250
  * Resume sending an AutoResponder or RSS campaign
251
  * @param string $cid
252
  * @return associative_array with a single entry:
253
  * - complete bool whether the call worked. reallistically this will always be true as errors will be thrown otherwise.
254
  */
255
  public function resume($cid) {
256
  $_params = array("cid" => $cid);
257
  return $this->master->call('campaigns/resume', $_params);
258
  }
259
  /**
260
  * Schedule a campaign to be sent in the future
261
  * @param string $cid
262
  * @param string $schedule_time
263
  * @param string $schedule_time_b
264
  * @return associative_array with a single entry:
265
  * - complete bool whether the call worked. reallistically this will always be true as errors will be thrown otherwise.
266
  */
267
  public function schedule($cid, $schedule_time, $schedule_time_b=null) {
268
  $_params = array("cid" => $cid, "schedule_time" => $schedule_time, "schedule_time_b" => $schedule_time_b);
269
  return $this->master->call('campaigns/schedule', $_params);
270
  }
271
  /**
272
  * Schedule a campaign to be sent in batches sometime in the future. Only valid for "regular" campaigns
273
  * @param string $cid
274
  * @param string $schedule_time
275
  * @param int $num_batches
276
  * @param int $stagger_mins
277
  * @return associative_array with a single entry:
278
  * - complete bool whether the call worked. reallistically this will always be true as errors will be thrown otherwise.
279
  */
280
  public function scheduleBatch($cid, $schedule_time, $num_batches=2, $stagger_mins=5) {
281
  $_params = array("cid" => $cid, "schedule_time" => $schedule_time, "num_batches" => $num_batches, "stagger_mins" => $stagger_mins);
282
  return $this->master->call('campaigns/schedule-batch', $_params);
283
  }
284
  /**
285
  * Allows one to test their segmentation rules before creating a campaign using them.
286
  * @param string $list_id
287
  * @param associative_array $options
288
  * - saved_segment_id string a saved segment id from lists/segments() - this will take precendence, otherwise the match+conditions are required.
289
  * - match string controls whether to use AND or OR when applying your options - expects "<strong>any</strong>" (for OR) or "<strong>all</strong>" (for AND)
290
  * - conditions array of up to 5 structs for different criteria to apply while segmenting. Each criteria row must contain 3 keys - "<strong>field</strong>", "<strong>op</strong>", and "<strong>value</strong>" - and possibly a fourth, "<strong>extra</strong>", based on these definitions:
291
  * @return associative_array with a single entry:
292
  * - total int The total number of subscribers matching your segmentation options
293
  */
294
  public function segmentTest($list_id, $options) {
295
  $_params = array("list_id" => $list_id, "options" => $options);
296
  return $this->master->call('campaigns/segment-test', $_params);
297
  }
298
  /**
299
  * Send a given campaign immediately. For RSS campaigns, this will "start" them.
300
  * @param string $cid
301
  * @return associative_array with a single entry:
302
  * - complete bool whether the call worked. reallistically this will always be true as errors will be thrown otherwise.
303
  */
304
  public function send($cid) {
305
  $_params = array("cid" => $cid);
306
  return $this->master->call('campaigns/send', $_params);
307
  }
308
  /**
309
  * Send a test of this campaign to the provided email addresses
310
  * @param string $cid
311
  * @param array $test_emails
312
  * @param string $send_type
313
  * @return associative_array with a single entry:
314
  * - complete bool whether the call worked. reallistically this will always be true as errors will be thrown otherwise.
315
  */
316
  public function sendTest($cid, $test_emails=array(), $send_type='html') {
317
  $_params = array("cid" => $cid, "test_emails" => $test_emails, "send_type" => $send_type);
318
  return $this->master->call('campaigns/send-test', $_params);
319
  }
320
  /**
321
  * Get the HTML template content sections for a campaign. Note that this <strong>will</strong> return very jagged, non-standard results based on the template
322
  * @param string $cid
323
  * @return associative_array content containing all content section for the campaign - section name are dependent upon the template used and thus can't be documented
324
  */
325
  public function templateContent($cid) {
326
  $_params = array("cid" => $cid);
327
  return $this->master->call('campaigns/template-content', $_params);
328
  }
329
  /**
330
  * Unschedule a campaign that is scheduled to be sent in the future
331
  * @param string $cid
332
  * @return associative_array with a single entry:
333
  * - complete bool whether the call worked. reallistically this will always be true as errors will be thrown otherwise.
334
  */
335
  public function unschedule($cid) {
336
  $_params = array("cid" => $cid);
337
  return $this->master->call('campaigns/unschedule', $_params);
338
  }
339
  /**
340
  * Update just about any setting besides type for a campaign that has <em>not</em> been sent. See campaigns/create() for details.
341
  * @param string $cid
342
  * @param string $name
343
  * @param array $value
344
  * @return associative_array updated campaign details and any errors
345
  * - data associative_array the update campaign details - will return same data as single campaign from campaigns/list()
346
  * - errors array for "options" only - structs containing:
347
  * - code int the error code
348
  * - message string the full error message
349
  * - name string the parameter name that failed
350
  */
351
  public function update($cid, $name, $value) {
352
  $_params = array("cid" => $cid, "name" => $name, "value" => $value);
353
  return $this->master->call('campaigns/update', $_params);
354
  }
 
0
  public function __construct(Mailchimp $master) {
1
  $this->master = $master;
2
  }
3
  /**
4
  * Get the content (both html and text) for a campaign either as it would appear in the campaign archive or as the raw, original content
5
  * @param string $cid
6
  * @param associative_array $options
7
  * - view string optional one of "archive" (default), "preview" (like our popup-preview) or "raw"
8
  * - email associative_array optional if provided, view is "archive" or "preview", the campaign's list still exists, and the requested record is subscribed to the list. the returned content will be populated with member data populated. a struct with one of the following keys - failing to provide anything will produce an error relating to the email address. If multiple keys are provided, the first one from the following list that we find will be used, the rest will be ignored.
9
  * - email string an email address
10
  * - euid string the unique id for an email address (not list related) - the email "id" returned from listMemberInfo, Webhooks, Campaigns, etc.
11
  * - leid string the list email id (previously called web_id) for a list-member-info type call. this doesn't change when the email address changes
12
  * @return associative_array containing all content for the campaign
13
  * - html string The HTML content used for the campaign with merge tags intact
14
  * - text string The Text content used for the campaign with merge tags intact
15
  */
16
  public function content($cid, $options=array()) {
17
  $_params = array("cid" => $cid, "options" => $options);
18
  return $this->master->call('campaigns/content', $_params);
19
  }
20
  /**
21
  * Create a new draft campaign to send. You <strong>can not</strong> have more than 32,000 campaigns in your account.
22
  * @param string $type
23
  * @param associative_array $options
24
  * - list_id string the list to send this campaign to- get lists using lists/list()
25
  * - subject string the subject line for your campaign message
26
  * - from_email string the From: email address for your campaign message
27
  * - from_name string the From: name for your campaign message (not an email address)
28
  * - to_name string the To: name recipients will see (not email address)
29
  * - template_id int optional - use this user-created template to generate the HTML content of the campaign (takes precendence over other template options)
30
  * - gallery_template_id int optional - use a template from the public gallery to generate the HTML content of the campaign (takes precendence over base template options)
31
  * - base_template_id int optional - use this a base/start-from-scratch template to generate the HTML content of the campaign
32
  * - folder_id int optional - automatically file the new campaign in the folder_id passed. Get using folders/list() - note that Campaigns and Autoresponders have separate folder setups
33
  * - tracking associative_array optional - set which recipient actions will be tracked. Click tracking can not be disabled for Free accounts.
34
  * - opens bool whether to track opens, defaults to true
35
  * - html_clicks bool whether to track clicks in HTML content, defaults to true
36
  * - text_clicks bool whether to track clicks in Text content, defaults to false
37
  * - title string optional - an internal name to use for this campaign. By default, the campaign subject will be used.
38
  * - authenticate boolean optional - set to true to enable SenderID, DomainKeys, and DKIM authentication, defaults to false.
39
  * - analytics associative_array optional - one or more of these keys set to the tag to use - that can be any custom text (up to 50 bytes)
40
  * - google string for Google Analytics tracking
41
  * - clicktale string for ClickTale tracking
42
  * - gooal string for Goal tracking (the extra 'o' in the param name is not a typo)
43
  * - auto_footer boolean optional Whether or not we should auto-generate the footer for your content. Mostly useful for content from URLs or Imports
44
  * - inline_css boolean optional Whether or not css should be automatically inlined when this campaign is sent, defaults to false.
45
  * - generate_text boolean optional Whether of not to auto-generate your Text content from the HTML content. Note that this will be ignored if the Text part of the content passed is not empty, defaults to false.
46
  * - auto_tweet boolean optional If set, this campaign will be auto-tweeted when it is sent - defaults to false. Note that if a Twitter account isn't linked, this will be silently ignored.
47
  * - auto_fb_post array optional If set, this campaign will be auto-posted to the page_ids contained in the array. If a Facebook account isn't linked or the account does not have permission to post to the page_ids requested, those failures will be silently ignored.
48
  * - fb_comments boolean optional If true, the Facebook comments (and thus the <a href="http://kb.mailchimp.com/article/i-dont-want-an-archiave-of-my-campaign-can-i-turn-it-off/" target="_blank">archive bar</a> will be displayed. If false, Facebook comments will not be enabled (does not imply no archive bar, see previous link). Defaults to "true".
49
  * - timewarp boolean optional If set, this campaign must be scheduled 24 hours in advance of sending - default to false. Only valid for "regular" campaigns and "absplit" campaigns that split on schedule_time.
50
  * - ecomm360 boolean optional If set, our <a href="http://www.mailchimp.com/blog/ecommerce-tracking-plugin/" target="_blank">Ecommerce360 tracking</a> will be enabled for links in the campaign
51
  * - crm_tracking associative_array optional If set, a struct to enable CRM tracking for:
52
  * - salesforce associative_array optional Enable SalesForce push back
53
  * - campaign bool optional - if true, create a Campaign object and update it with aggregate stats
54
  * - notes bool optional - if true, attempt to update Contact notes based on email address
55
  * - highrise associative_array optional Enable Highrise push back
56
  * - campaign bool optional - if true, create a Kase object and update it with aggregate stats
57
  * - notes bool optional - if true, attempt to update Contact notes based on email address
58
  * - capsule associative_array optional Enable Capsule push back (only notes are supported)
59
  * - notes bool optional - if true, attempt to update Contact notes based on email address
60
  * @param associative_array $content
61
  * - html string for raw/pasted HTML content
62
  * - sections associative_array when using a template instead of raw HTML, each key should be the unique mc:edit area name from the template.
63
  * - text string for the plain-text version
64
  * - url string to have us pull in content from a URL. Note, this will override any other content options - for lists with Email Format options, you'll need to turn on generate_text as well
65
  * - archive string to send a Base64 encoded archive file for us to import all media from. Note, this will override any other content options - for lists with Email Format options, you'll need to turn on generate_text as well
66
  * - archive_type string optional - only necessary for the "archive" option. Supported formats are: zip, tar.gz, tar.bz2, tar, tgz, tbz . If not included, we will default to zip
67
  * @param associative_array $segment_opts
68
  * @param associative_array $type_opts
69
  * - rss associative_array For RSS Campaigns this, struct should contain:
70
  * - url string the URL to pull RSS content from - it will be verified and must exist
71
  * - schedule string optional one of "daily", "weekly", "monthly" - defaults to "daily"
72
  * - schedule_hour string optional an hour between 0 and 24 - default to 4 (4am <em>local time</em>) - applies to all schedule types
73
  * - schedule_weekday string optional for "weekly" only, a number specifying the day of the week to send: 0 (Sunday) - 6 (Saturday) - defaults to 1 (Monday)
74
  * - schedule_monthday string optional for "monthly" only, a number specifying the day of the month to send (1 - 28) or "last" for the last day of a given month. Defaults to the 1st day of the month
75
  * - days associative_array optional used for "daily" schedules only, an array of the <a href="http://en.wikipedia.org/wiki/ISO-8601#Week_dates" target="_blank">ISO-8601 weekday numbers</a> to send on
76
  * - 1 bool optional Monday, defaults to true
77
  * - 2 bool optional Tuesday, defaults to true
78
  * - 3 bool optional Wednesday, defaults to true
79
  * - 4 bool optional Thursday, defaults to true
80
  * - 5 bool optional Friday, defaults to true
81
  * - 6 bool optional Saturday, defaults to true
82
  * - 7 bool optional Sunday, defaults to true
83
  * - absplit associative_array For A/B Split campaigns, this struct should contain:
84
  * - split_test string The values to segment based on. Currently, one of: "subject", "from_name", "schedule". NOTE, for "schedule", you will need to call campaigns/schedule() separately!
85
  * - pick_winner string How the winner will be picked, one of: "opens" (by the open_rate), "clicks" (by the click rate), "manual" (you pick manually)
86
  * - wait_units int optional the default time unit to wait before auto-selecting a winner - use "3600" for hours, "86400" for days. Defaults to 86400.
87
  * - wait_time int optional the number of units to wait before auto-selecting a winner - defaults to 1, so if not set, a winner will be selected after 1 Day.
88
  * - split_size int optional this is a percentage of what size the Campaign's List plus any segmentation options results in. "schedule" type forces 50%, all others default to 10%
89
  * - from_name_a string optional sort of, required when split_test is "from_name"
90
  * - from_name_b string optional sort of, required when split_test is "from_name"
91
  * - from_email_a string optional sort of, required when split_test is "from_name"
92
  * - from_email_b string optional sort of, required when split_test is "from_name"
93
  * - subject_a string optional sort of, required when split_test is "subject"
94
  * - subject_b string optional sort of, required when split_test is "subject"
95
  * - auto associative_array For AutoResponder campaigns, this struct should contain:
96
  * - offset-units string one of "hourly", "day", "week", "month", "year" - required
97
  * - offset-time string optional, sort of - the number of units must be a number greater than 0 for signup based autoresponders, ignored for "hourly"
98
  * - offset-dir string either "before" or "after", ignored for "hourly"
99
  * - event string optional "signup" (default) to base this members added to a list, "date", "annual", or "birthday" to base this on merge field in the list, "campaignOpen" or "campaignClicka" to base this on any activity for a campaign, "campaignClicko" to base this on clicks on a specific URL in a campaign, "mergeChanged" to base this on a specific merge field being changed to a specific value
100
  * - event-datemerge string optional sort of, this is required if the event is "date", "annual", "birthday", or "mergeChanged"
101
  * - campaign_id string optional sort of, required for "campaignOpen", "campaignClicka", or "campaignClicko"
102
  * - campaign_url string optional sort of, required for "campaignClicko"
103
  * - schedule_hour int The hour of the day - 24 hour format in GMT - the autoresponder should be triggered, ignored for "hourly"
104
  * - use_import_time boolean whether or not imported subscribers (ie, <em>any</em> non-double optin subscribers) will receive
105
  * - days associative_array optional used for "daily" schedules only, an array of the <a href="http://en.wikipedia.org/wiki/ISO-8601#Week_dates" target="_blank">ISO-8601 weekday numbers</a> to send on<
106
  * - 1 bool optional Monday, defaults to true
107
  * - 2 bool optional Tuesday, defaults to true
108
  * - 3 bool optional Wednesday, defaults to true
109
  * - 4 bool optional Thursday, defaults to true
110
  * - 5 bool optional Friday, defaults to true
111
  * - 6 bool optional Saturday, defaults to true
112
  * - 7 bool optional Sunday, defaults to true
113
  * @return associative_array the new campaign's details - will return same data as single campaign from campaigns/list()
114
  */
115
  public function create($type, $options, $content, $segment_opts=null, $type_opts=null) {
116
  $_params = array("type" => $type, "options" => $options, "content" => $content, "segment_opts" => $segment_opts, "type_opts" => $type_opts);
117
  return $this->master->call('campaigns/create', $_params);
118
  }
119
  /**
120
  * Delete a campaign. Seriously, "poof, gone!" - be careful! Seriously, no one can undelete these.
121
  * @param string $cid
122
  * @return associative_array with a single entry:
123
  * - complete bool whether the call worked. reallistically this will always be true as errors will be thrown otherwise.
124
  */
125
  public function delete($cid) {
126
  $_params = array("cid" => $cid);
127
  return $this->master->call('campaigns/delete', $_params);
128
  }
129
  /**
130
  * Get the list of campaigns and their details matching the specified filters
131
  * @param associative_array $filters
132
  * - campaign_id string optional - return the campaign using a know campaign_id. Accepts multiples separated by commas when not using exact matching.
133
  * - parent_id string optional - return the child campaigns using a known parent campaign_id. Accepts multiples separated by commas when not using exact matching.
134
  * - list_id string optional - the list to send this campaign to - get lists using lists/list(). Accepts multiples separated by commas when not using exact matching.
135
  * - folder_id int optional - only show campaigns from this folder id - get folders using folders/list(). Accepts multiples separated by commas when not using exact matching.
136
  * - template_id int optional - only show campaigns using this template id - get templates using templates/list(). Accepts multiples separated by commas when not using exact matching.
137
  * - status string optional - return campaigns of a specific status - one of "sent", "save", "paused", "schedule", "sending". Accepts multiples separated by commas when not using exact matching.
138
  * - type string optional - return campaigns of a specific type - one of "regular", "plaintext", "absplit", "rss", "auto". Accepts multiples separated by commas when not using exact matching.
139
  * - from_name string optional - only show campaigns that have this "From Name"
140
  * - from_email string optional - only show campaigns that have this "Reply-to Email"
141
  * - title string optional - only show campaigns that have this title
142
  * - subject string optional - only show campaigns that have this subject
143
  * - sendtime_start string optional - only show campaigns that have been sent since this date/time (in GMT) - - 24 hour format in <strong>GMT</strong>, eg "2013-12-30 20:30:00" - if this is invalid the whole call fails
144
  * - sendtime_end string optional - only show campaigns that have been sent before this date/time (in GMT) - - 24 hour format in <strong>GMT</strong>, eg "2013-12-30 20:30:00" - if this is invalid the whole call fails
145
  * - uses_segment boolean - whether to return just campaigns with or without segments
146
  * - exact boolean optional - flag for whether to filter on exact values when filtering, or search within content for filter values - defaults to true. Using this disables the use of any filters that accept multiples.
147
  * @param int $start
148
  * @param int $limit
149
  * @param string $sort_field
150
  * @param string $sort_dir
151
  * @return associative_array containing a count of all matching campaigns, the specific ones for the current page, and any errors from the filters provided
152
  * - total int the total number of campaigns matching the filters passed in
153
  * - data array structs for each campaign being returned
154
  * - id string Campaign Id (used for all other campaign functions)
155
  * - web_id int The Campaign id used in our web app, allows you to create a link directly to it
156
  * - list_id string The List used for this campaign
157
  * - folder_id int The Folder this campaign is in
158
  * - template_id int The Template this campaign uses
159
  * - content_type string How the campaign's content is put together - one of 'template', 'html', 'url'
160
  * - title string Title of the campaign
161
  * - type string The type of campaign this is (regular,plaintext,absplit,rss,inspection,auto)
162
  * - create_time string Creation time for the campaign
163
  * - send_time string Send time for the campaign - also the scheduled time for scheduled campaigns.
164
  * - emails_sent int Number of emails email was sent to
165
  * - status string Status of the given campaign (save,paused,schedule,sending,sent)
166
  * - from_name string From name of the given campaign
167
  * - from_email string Reply-to email of the given campaign
168
  * - subject string Subject of the given campaign
169
  * - to_name string Custom "To:" email string using merge variables
170
  * - archive_url string Archive link for the given campaign
171
  * - inline_css boolean Whether or not the campaign content's css was auto-inlined
172
  * - analytics string Either "google" if enabled or "N" if disabled
173
  * - analytics_tag string The name/tag the campaign's links were tagged with if analytics were enabled.
174
  * - authenticate boolean Whether or not the campaign was authenticated
175
  * - ecomm360 boolean Whether or not ecomm360 tracking was appended to links
176
  * - auto_tweet boolean Whether or not the campaign was auto tweeted after sending
177
  * - auto_fb_post string A comma delimited list of Facebook Profile/Page Ids the campaign was posted to after sending. If not used, blank.
178
  * - auto_footer boolean Whether or not the auto_footer was manually turned on
179
  * - timewarp boolean Whether or not the campaign used Timewarp
180
  * - timewarp_schedule string The time, in GMT, that the Timewarp campaign is being sent. For A/B Split campaigns, this is blank and is instead in their schedule_a and schedule_b in the type_opts array
181
  * - parent_id string the unique id of the parent campaign (currently only valid for rss children). Will be blank for non-rss child campaigns or parent campaign has been deleted.
182
  * - is_child boolean true if this is an RSS child campaign. Will return true even if the parent campaign has been deleted.
183
  * - tests_sent string tests sent
184
  * - tests_remain int test sends remaining
185
  * - tracking associative_array the various tracking options used
186
  * - html_clicks boolean whether or not tracking for html clicks was enabled.
187
  * - text_clicks boolean whether or not tracking for text clicks was enabled.
188
  * - opens boolean whether or not opens tracking was enabled.
189
  * - segment_text string a string marked-up with HTML explaining the segment used for the campaign in plain English
190
  * - segment_opts array the segment used for the campaign - can be passed to campaigns/segment-test or campaigns/create()
191
  * - saved_segment associative_array if a saved segment was used (match+conditions returned above):
192
  * - id int the saved segment id
193
  * - type string the saved segment type
194
  * - name string the saved segment name
195
  * - type_opts associative_array the type-specific options for the campaign - can be passed to campaigns/create()
196
  * - comments_total int total number of comments left on this campaign
197
  * - comments_unread int total number of unread comments for this campaign based on the login the apikey belongs to
198
  * - summary associative_array if available, the basic aggregate stats returned by reports/summary
199
  * - social_card associative_array If a social card has been attached to this campaign:
200
  * - title string The title of the campaign used with the card
201
  * - description string The description used with the card
202
  * - image_url string The URL of the image used with the card
203
  * - enabled string Whether or not the social card is enabled for this campaign.
204
  * - errors array structs of any errors found while loading lists - usually just from providing invalid list ids
205
  * - filter string the filter that caused the failure
206
  * - value string the filter value that caused the failure
207
  * - code int the error code
208
  * - error string the error message
209
  */
210
  public function getList($filters=array(), $start=0, $limit=25, $sort_field='create_time', $sort_dir='DESC') {
211
  $_params = array("filters" => $filters, "start" => $start, "limit" => $limit, "sort_field" => $sort_field, "sort_dir" => $sort_dir);
212
  return $this->master->call('campaigns/list', $_params);
213
  }
214
  /**
215
  * Pause an AutoResponder or RSS campaign from sending
216
  * @param string $cid
217
  * @return associative_array with a single entry:
218
  * - complete bool whether the call worked. reallistically this will always be true as errors will be thrown otherwise.
219
  */
220
  public function pause($cid) {
221
  $_params = array("cid" => $cid);
222
  return $this->master->call('campaigns/pause', $_params);
223
  }
224
  /**
225
  * Returns information on whether a campaign is ready to send and possible issues we may have detected with it - very similar to the confirmation step in the app.
226
  * @param string $cid
227
  * @return associative_array containing:
228
  * - is_ready bool whether or not you're going to be able to send this campaign
229
  * - items array an array of structs explaining basically what the app's confirmation step would
230
  * - type string the item type - generally success, warning, or error
231
  * - heading string the item's heading in the app
232
  * - details string the item's details from the app, sans any html tags/links
233
  */
234
  public function ready($cid) {
235
  $_params = array("cid" => $cid);
236
  return $this->master->call('campaigns/ready', $_params);
237
  }
238
  /**
239
  * Replicate a campaign.
240
  * @param string $cid
241
  * @return associative_array the matching campaign's details - will return same data as single campaign from campaigns/list()
242
  */
243
  public function replicate($cid) {
244
  $_params = array("cid" => $cid);
245
  return $this->master->call('campaigns/replicate', $_params);
246
  }
247
  /**
248
  * Resume sending an AutoResponder or RSS campaign
249
  * @param string $cid
250
  * @return associative_array with a single entry:
251
  * - complete bool whether the call worked. reallistically this will always be true as errors will be thrown otherwise.
252
  */
253
  public function resume($cid) {
254
  $_params = array("cid" => $cid);
255
  return $this->master->call('campaigns/resume', $_params);
256
  }
257
  /**
258
  * Schedule a campaign to be sent in the future
259
  * @param string $cid
260
  * @param string $schedule_time
261
  * @param string $schedule_time_b
262
  * @return associative_array with a single entry:
263
  * - complete bool whether the call worked. reallistically this will always be true as errors will be thrown otherwise.
264
  */
265
  public function schedule($cid, $schedule_time, $schedule_time_b=null) {
266
  $_params = array("cid" => $cid, "schedule_time" => $schedule_time, "schedule_time_b" => $schedule_time_b);
267
  return $this->master->call('campaigns/schedule', $_params);
268
  }
269
  /**
270
  * Schedule a campaign to be sent in batches sometime in the future. Only valid for "regular" campaigns
271
  * @param string $cid
272
  * @param string $schedule_time
273
  * @param int $num_batches
274
  * @param int $stagger_mins
275
  * @return associative_array with a single entry:
276
  * - complete bool whether the call worked. reallistically this will always be true as errors will be thrown otherwise.
277
  */
278
  public function scheduleBatch($cid, $schedule_time, $num_batches=2, $stagger_mins=5) {
279
  $_params = array("cid" => $cid, "schedule_time" => $schedule_time, "num_batches" => $num_batches, "stagger_mins" => $stagger_mins);
280
  return $this->master->call('campaigns/schedule-batch', $_params);
281
  }
282
  /**
283
  * Allows one to test their segmentation rules before creating a campaign using them.
284
  * @param string $list_id
285
  * @param associative_array $options
286
  * - saved_segment_id string a saved segment id from lists/segments() - this will take precendence, otherwise the match+conditions are required.
287
  * - match string controls whether to use AND or OR when applying your options - expects "<strong>any</strong>" (for OR) or "<strong>all</strong>" (for AND)
288
  * - conditions array of up to 5 structs for different criteria to apply while segmenting. Each criteria row must contain 3 keys - "<strong>field</strong>", "<strong>op</strong>", and "<strong>value</strong>" - and possibly a fourth, "<strong>extra</strong>", based on these definitions:
289
  * @return associative_array with a single entry:
290
  * - total int The total number of subscribers matching your segmentation options
291
  */
292
  public function segmentTest($list_id, $options) {
293
  $_params = array("list_id" => $list_id, "options" => $options);
294
  return $this->master->call('campaigns/segment-test', $_params);
295
  }
296
  /**
297
  * Send a given campaign immediately. For RSS campaigns, this will "start" them.
298
  * @param string $cid
299
  * @return associative_array with a single entry:
300
  * - complete bool whether the call worked. reallistically this will always be true as errors will be thrown otherwise.
301
  */
302
  public function send($cid) {
303
  $_params = array("cid" => $cid);
304
  return $this->master->call('campaigns/send', $_params);
305
  }
306
  /**
307
  * Send a test of this campaign to the provided email addresses
308
  * @param string $cid
309
  * @param array $test_emails
310
  * @param string $send_type
311
  * @return associative_array with a single entry:
312
  * - complete bool whether the call worked. reallistically this will always be true as errors will be thrown otherwise.
313
  */
314
  public function sendTest($cid, $test_emails=array(), $send_type='html') {
315
  $_params = array("cid" => $cid, "test_emails" => $test_emails, "send_type" => $send_type);
316
  return $this->master->call('campaigns/send-test', $_params);
317
  }
318
  /**
319
  * Get the HTML template content sections for a campaign. Note that this <strong>will</strong> return very jagged, non-standard results based on the template
320
  * @param string $cid
321
  * @return associative_array content containing all content section for the campaign - section name are dependent upon the template used and thus can't be documented
322
  */
323
  public function templateContent($cid) {
324
  $_params = array("cid" => $cid);
325
  return $this->master->call('campaigns/template-content', $_params);
326
  }
327
  /**
328
  * Unschedule a campaign that is scheduled to be sent in the future
329
  * @param string $cid
330
  * @return associative_array with a single entry:
331
  * - complete bool whether the call worked. reallistically this will always be true as errors will be thrown otherwise.
332
  */
333
  public function unschedule($cid) {
334
  $_params = array("cid" => $cid);
335
  return $this->master->call('campaigns/unschedule', $_params);
336
  }
337
  /**
338
  * Update just about any setting besides type for a campaign that has <em>not</em> been sent. See campaigns/create() for details.
339
  * @param string $cid
340
  * @param string $name
341
  * @param array $value
342
  * @return associative_array updated campaign details and any errors
343
  * - data associative_array the update campaign details - will return same data as single campaign from campaigns/list()
344
  * - errors array for "options" only - structs containing:
345
  * - code int the error code
346
  * - message string the full error message
347
  * - name string the parameter name that failed
348
  */
349
  public function update($cid, $name, $value) {
350
  $_params = array("cid" => $cid, "name" => $name, "value" => $value);
351
  return $this->master->call('campaigns/update', $_params);
352
  }
includes/MailChimp/Mailchimp/Conversations.php DELETED
@@ -1 +0,0 @@
1
- <?php
2
  public function __construct(Mailchimp $master) {
3
  $this->master = $master;
4
  }
5
  /**
6
  * Retrieve conversation metadata, includes message data for the most recent message in the conversation
7
  * @param string $list_id
8
  * @param string $leid
9
  * @param string $campaign_id
10
  * @param int $start
11
  * @param int $limit
12
  * @return associative_array Conversation data and metadata
13
  * - count int Total number of conversations, irrespective of pagination.
14
  * - data array An array of structs representing individual conversations
15
  * - unique_id string A string identifying this particular conversation
16
  * - message_count int The total number of messages in this conversation
17
  * - campaign_id string The unique identifier of the campaign this conversation is associated with (will be null if the campaign has been deleted)
18
  * - list_id string The unique identifier of the list this conversation is associated with
19
  * - unread_messages int The number of messages in this conversation which have not yet been read.
20
  * - from_label string A label representing the sender of this message.
21
  * - from_email string The email address of the sender of this message.
22
  * - subject string The subject of the message.
23
  * - timestamp string Date the message was either sent or received.
24
  * - last_message associative_array The most recent message in the conversation
25
  * - from_label string A label representing the sender of this message.
26
  * - from_email string The email address of the sender of this message.
27
  * - subject string The subject of the message.
28
  * - message string The plain-text content of the message.
29
  * - read boolean Whether or not this message has been marked as read.
30
  * - timestamp string Date the message was either sent or received.
31
  */
32
  public function getList($list_id=null, $leid=null, $campaign_id=null, $start=0, $limit=25) {
33
  $_params = array("list_id" => $list_id, "leid" => $leid, "campaign_id" => $campaign_id, "start" => $start, "limit" => $limit);
34
  return $this->master->call('conversations/list', $_params);
35
  }
36
  /**
37
  * Retrieve conversation messages
38
  * @param string $conversation_id
39
  * @param boolean $mark_as_read
40
  * @param int $start
41
  * @param int $limit
42
  * @return associative_array Message data and metadata
43
  * - count int The number of messages in this conversation, irrespective of paging.
44
  * - data array An array of structs representing each message in a conversation
45
  * - from_label string A label representing the sender of this message.
46
  * - from_email string The email address of the sender of this message.
47
  * - subject string The subject of the message.
48
  * - message string The plain-text content of the message.
49
  * - read boolean Whether or not this message has been marked as read.
50
  * - timestamp string Date the message was either sent or received.
51
  */
52
  public function messages($conversation_id, $mark_as_read=false, $start=0, $limit=25) {
53
  $_params = array("conversation_id" => $conversation_id, "mark_as_read" => $mark_as_read, "start" => $start, "limit" => $limit);
54
  return $this->master->call('conversations/messages', $_params);
55
  }
56
  /**
57
  * Reply to a conversation
58
  * @param string $conversation_id
59
  * @param string $message
60
  * @return associative_array Message data from the created message
61
  * - from_label string A label representing the sender of this message.
62
  * - from_email string The email address of the sender of this message.
63
  * - subject string The subject of the message.
64
  * - message string The plain-text content of the message.
65
  * - read boolean Whether or not this message has been marked as read.
66
  * - timestamp string Date the message was either sent or received.
67
  */
68
  public function reply($conversation_id, $message) {
69
  $_params = array("conversation_id" => $conversation_id, "message" => $message);
70
  return $this->master->call('conversations/reply', $_params);
71
  }
 
0
  public function __construct(Mailchimp $master) {
1
  $this->master = $master;
2
  }
3
  /**
4
  * Retrieve conversation metadata, includes message data for the most recent message in the conversation
5
  * @param string $list_id
6
  * @param string $leid
7
  * @param string $campaign_id
8
  * @param int $start
9
  * @param int $limit
10
  * @return associative_array Conversation data and metadata
11
  * - count int Total number of conversations, irrespective of pagination.
12
  * - data array An array of structs representing individual conversations
13
  * - unique_id string A string identifying this particular conversation
14
  * - message_count int The total number of messages in this conversation
15
  * - campaign_id string The unique identifier of the campaign this conversation is associated with (will be null if the campaign has been deleted)
16
  * - list_id string The unique identifier of the list this conversation is associated with
17
  * - unread_messages int The number of messages in this conversation which have not yet been read.
18
  * - from_label string A label representing the sender of this message.
19
  * - from_email string The email address of the sender of this message.
20
  * - subject string The subject of the message.
21
  * - timestamp string Date the message was either sent or received.
22
  * - last_message associative_array The most recent message in the conversation
23
  * - from_label string A label representing the sender of this message.
24
  * - from_email string The email address of the sender of this message.
25
  * - subject string The subject of the message.
26
  * - message string The plain-text content of the message.
27
  * - read boolean Whether or not this message has been marked as read.
28
  * - timestamp string Date the message was either sent or received.
29
  */
30
  public function getList($list_id=null, $leid=null, $campaign_id=null, $start=0, $limit=25) {
31
  $_params = array("list_id" => $list_id, "leid" => $leid, "campaign_id" => $campaign_id, "start" => $start, "limit" => $limit);
32
  return $this->master->call('conversations/list', $_params);
33
  }
34
  /**
35
  * Retrieve conversation messages
36
  * @param string $conversation_id
37
  * @param boolean $mark_as_read
38
  * @param int $start
39
  * @param int $limit
40
  * @return associative_array Message data and metadata
41
  * - count int The number of messages in this conversation, irrespective of paging.
42
  * - data array An array of structs representing each message in a conversation
43
  * - from_label string A label representing the sender of this message.
44
  * - from_email string The email address of the sender of this message.
45
  * - subject string The subject of the message.
46
  * - message string The plain-text content of the message.
47
  * - read boolean Whether or not this message has been marked as read.
48
  * - timestamp string Date the message was either sent or received.
49
  */
50
  public function messages($conversation_id, $mark_as_read=false, $start=0, $limit=25) {
51
  $_params = array("conversation_id" => $conversation_id, "mark_as_read" => $mark_as_read, "start" => $start, "limit" => $limit);
52
  return $this->master->call('conversations/messages', $_params);
53
  }
54
  /**
55
  * Reply to a conversation
56
  * @param string $conversation_id
57
  * @param string $message
58
  * @return associative_array Message data from the created message
59
  * - from_label string A label representing the sender of this message.
60
  * - from_email string The email address of the sender of this message.
61
  * - subject string The subject of the message.
62
  * - message string The plain-text content of the message.
63
  * - read boolean Whether or not this message has been marked as read.
64
  * - timestamp string Date the message was either sent or received.
65
  */
66
  public function reply($conversation_id, $message) {
67
  $_params = array("conversation_id" => $conversation_id, "message" => $message);
68
  return $this->master->call('conversations/reply', $_params);
69
  }
includes/MailChimp/Mailchimp/Ecomm.php DELETED
@@ -1 +0,0 @@
1
- <?php
2
  public function __construct(Mailchimp $master) {
3
  $this->master = $master;
4
  }
5
  /**
6
  * Import Ecommerce Order Information to be used for Segmentation. This will generally be used by ecommerce package plugins
7
  * @param associative_array $order
8
  * - id string the Order Id
9
  * - campaign_id string optional the Campaign Id to track this order against (see the "mc_cid" query string variable a campaign passes)
10
  * - email_id string optional (kind of) the Email Id of the subscriber we should attach this order to (see the "mc_eid" query string variable a campaign passes) - required if campaign_id is passed, otherwise either this or <strong>email</strong> is required. If both are provided, email_id takes precedence
11
  * - email string optional (kind of) the Email Address we should attach this order to - either this or <strong>email_id</strong> is required. If both are provided, email_id takes precedence
12
  * - total double The Order Total (ie, the full amount the customer ends up paying)
13
  * - order_date string optional the date of the order - if this is not provided, we will default the date to now. Should be in the format of 2012-12-30
14
  * - shipping double optional the total paid for Shipping Fees
15
  * - tax double optional the total tax paid
16
  * - store_id string a unique id for the store sending the order in (32 bytes max)
17
  * - store_name string optional a "nice" name for the store - typically the base web address (ie, "store.mailchimp.com"). We will automatically update this if it changes (based on store_id)
18
  * - items array structs for each individual line item including:
19
  * - line_num int optional the line number of the item on the order. We will generate these if they are not passed
20
  * - product_id int the store's internal Id for the product. Lines that do no contain this will be skipped
21
  * - sku string optional the store's internal SKU for the product. (max 30 bytes)
22
  * - product_name string the product name for the product_id associated with this item. We will auto update these as they change (based on product_id) (max 500 bytes)
23
  * - category_id int (required) the store's internal Id for the (main) category associated with this product. Our testing has found this to be a "best guess" scenario
24
  * - category_name string (required) the category name for the category_id this product is in. Our testing has found this to be a "best guess" scenario. Our plugins walk the category heirarchy up and send "Root - SubCat1 - SubCat4", etc.
25
  * - qty double optional the quantity of the item ordered - defaults to 1
26
  * - cost double optional the cost of a single item (ie, not the extended cost of the line) - defaults to 0
27
  * @return associative_array with a single entry:
28
  * - complete bool whether the call worked. reallistically this will always be true as errors will be thrown otherwise.
29
  */
30
  public function orderAdd($order) {
31
  $_params = array("order" => $order);
32
  return $this->master->call('ecomm/order-add', $_params);
33
  }
34
  /**
35
  * Delete Ecommerce Order Information used for segmentation. This will generally be used by ecommerce package plugins
36
  * @param string $store_id
37
  * @param string $order_id
38
  * @return associative_array with a single entry:
39
  * - complete bool whether the call worked. reallistically this will always be true as errors will be thrown otherwise.
40
  */
41
  public function orderDel($store_id, $order_id) {
42
  $_params = array("store_id" => $store_id, "order_id" => $order_id);
43
  return $this->master->call('ecomm/order-del', $_params);
44
  }
45
  /**
46
  * Retrieve the Ecommerce Orders for an account
47
  * @param string $cid
48
  * @param int $start
49
  * @param int $limit
50
  * @param string $since
51
  * @return associative_array the total matching orders and the specific orders for the requested page
52
  * - total int the total matching orders
53
  * - data array structs for each order being returned
54
  * - store_id string the store id generated by the plugin used to uniquely identify a store
55
  * - store_name string the store name collected by the plugin - often the domain name
56
  * - order_id string the internal order id the store tracked this order by
57
  * - email string the email address that received this campaign and is associated with this order
58
  * - order_total double the order total
59
  * - tax_total double the total tax for the order (if collected)
60
  * - ship_total double the shipping total for the order (if collected)
61
  * - order_date string the date the order was tracked - from the store if possible, otherwise the GMT time we received it
62
  * - items array structs for each line item on this order.:
63
  * - line_num int the line number
64
  * - product_id int the product id
65
  * - product_name string the product name
66
  * - product_sku string the sku for the product
67
  * - product_category_id int the category id for the product
68
  * - product_category_name string the category name for the product
69
  * - qty int the quantity ordered
70
  * - cost double the cost of the item
71
  */
72
  public function orders($cid=null, $start=0, $limit=100, $since=null) {
73
  $_params = array("cid" => $cid, "start" => $start, "limit" => $limit, "since" => $since);
74
  return $this->master->call('ecomm/orders', $_params);
75
  }
 
0
  public function __construct(Mailchimp $master) {
1
  $this->master = $master;
2
  }
3
  /**
4
  * Import Ecommerce Order Information to be used for Segmentation. This will generally be used by ecommerce package plugins
5
  * @param associative_array $order
6
  * - id string the Order Id
7
  * - campaign_id string optional the Campaign Id to track this order against (see the "mc_cid" query string variable a campaign passes)
8
  * - email_id string optional (kind of) the Email Id of the subscriber we should attach this order to (see the "mc_eid" query string variable a campaign passes) - required if campaign_id is passed, otherwise either this or <strong>email</strong> is required. If both are provided, email_id takes precedence
9
  * - email string optional (kind of) the Email Address we should attach this order to - either this or <strong>email_id</strong> is required. If both are provided, email_id takes precedence
10
  * - total double The Order Total (ie, the full amount the customer ends up paying)
11
  * - order_date string optional the date of the order - if this is not provided, we will default the date to now. Should be in the format of 2012-12-30
12
  * - shipping double optional the total paid for Shipping Fees
13
  * - tax double optional the total tax paid
14
  * - store_id string a unique id for the store sending the order in (32 bytes max)
15
  * - store_name string optional a "nice" name for the store - typically the base web address (ie, "store.mailchimp.com"). We will automatically update this if it changes (based on store_id)
16
  * - items array structs for each individual line item including:
17
  * - line_num int optional the line number of the item on the order. We will generate these if they are not passed
18
  * - product_id int the store's internal Id for the product. Lines that do no contain this will be skipped
19
  * - sku string optional the store's internal SKU for the product. (max 30 bytes)
20
  * - product_name string the product name for the product_id associated with this item. We will auto update these as they change (based on product_id) (max 500 bytes)
21
  * - category_id int (required) the store's internal Id for the (main) category associated with this product. Our testing has found this to be a "best guess" scenario
22
  * - category_name string (required) the category name for the category_id this product is in. Our testing has found this to be a "best guess" scenario. Our plugins walk the category heirarchy up and send "Root - SubCat1 - SubCat4", etc.
23
  * - qty double optional the quantity of the item ordered - defaults to 1
24
  * - cost double optional the cost of a single item (ie, not the extended cost of the line) - defaults to 0
25
  * @return associative_array with a single entry:
26
  * - complete bool whether the call worked. reallistically this will always be true as errors will be thrown otherwise.
27
  */
28
  public function orderAdd($order) {
29
  $_params = array("order" => $order);
30
  return $this->master->call('ecomm/order-add', $_params);
31
  }
32
  /**
33
  * Delete Ecommerce Order Information used for segmentation. This will generally be used by ecommerce package plugins
34
  * @param string $store_id
35
  * @param string $order_id
36
  * @return associative_array with a single entry:
37
  * - complete bool whether the call worked. reallistically this will always be true as errors will be thrown otherwise.
38
  */
39
  public function orderDel($store_id, $order_id) {
40
  $_params = array("store_id" => $store_id, "order_id" => $order_id);
41
  return $this->master->call('ecomm/order-del', $_params);
42
  }
43
  /**
44
  * Retrieve the Ecommerce Orders for an account
45
  * @param string $cid
46
  * @param int $start
47
  * @param int $limit
48
  * @param string $since
49
  * @return associative_array the total matching orders and the specific orders for the requested page
50
  * - total int the total matching orders
51
  * - data array structs for each order being returned
52
  * - store_id string the store id generated by the plugin used to uniquely identify a store
53
  * - store_name string the store name collected by the plugin - often the domain name
54
  * - order_id string the internal order id the store tracked this order by
55
  * - email string the email address that received this campaign and is associated with this order
56
  * - order_total double the order total
57
  * - tax_total double the total tax for the order (if collected)
58
  * - ship_total double the shipping total for the order (if collected)
59
  * - order_date string the date the order was tracked - from the store if possible, otherwise the GMT time we received it
60
  * - items array structs for each line item on this order.:
61
  * - line_num int the line number
62
  * - product_id int the product id
63
  * - product_name string the product name
64
  * - product_sku string the sku for the product
65
  * - product_category_id int the category id for the product
66
  * - product_category_name string the category name for the product
67
  * - qty int the quantity ordered
68
  * - cost double the cost of the item
69
  */
70
  public function orders($cid=null, $start=0, $limit=100, $since=null) {
71
  $_params = array("cid" => $cid, "start" => $start, "limit" => $limit, "since" => $since);
72
  return $this->master->call('ecomm/orders', $_params);
73
  }
includes/MailChimp/Mailchimp/Exceptions.php DELETED
@@ -1 +0,0 @@
1
- <?php
2
  * The parameters passed to the API call are invalid or not provided when required
3
  */
4
  * None
5
  */
6
  * None
7
  */
8
  * None
9
  */
10
  * None
11
  */
12
  * None
13
  */
14
  * None
15
  */
16
  * None
17
  */
18
  * None
19
  */
20
  * None
21
  */
22
  * None
23
  */
24
  * None
25
  */
26
  * None
27
  */
28
  * None
29
  */
30
  * None
31
  */
32
  * None
33
  */
34
  * None
35
  */
36
  * None
37
  */
38
  * None
39
  */
40
  * None
41
  */
42
  * None
43
  */
44
  * None
45
  */
46
  * None
47
  */
48
  * None
49
  */
50
  * None
51
  */
52
  * None
53
  */
54
  * None
55
  */
56
  * None
57
  */
58
  * None
59
  */
60
  * None
61
  */
62
  * None
63
  */
64
  * None
65
  */
66
  * None
67
  */
68
  * None
69
  */
70
  * None
71
  */
72
  * None
73
  */
74
  * None
75
  */
76
  * None
77
  */
78
  * None
79
  */
80
  * None
81
  */
82
  * None
83
  */
84
  * None
85
  */
86
  * None
87
  */
88
  * None
89
  */
90
  * None
91
  */
92
  * None
93
  */
94
  * None
95
  */
96
  * None
97
  */
98
  * None
99
  */
100
  * None
101
  */
102
  * None
103
  */
104
  * None
105
  */
106
  * None
107
  */
108
  * None
109
  */
110
  * None
111
  */
112
  * None
113
  */
114
  * None
115
  */
116
  * None
117
  */
118
  * None
119
  */
120
  * None
121
  */
122
  * None
123
  */
124
  * None
125
  */
126
  * None
127
  */
128
  * None
129
  */
130
  * None
131
  */
132
  * None
133
  */
134
  * None
135
  */
136
  * None
137
  */
138
  * None
139
  */
140
  * None
141
  */
142
  * None
143
  */
144
  * None
145
  */
146
  * None
147
  */
148
  * None
149
  */
150
  * None
151
  */
152
  * None
153
  */
154
  * None
155
  */
156
  * None
157
  */
158
  * None
159
  */
160
  * None
161
  */
162
  * None
163
  */
164
  * None
165
  */
166
  * None
167
  */
168
  * None
169
  */
170
  * None
171
  */
172
  * None
173
  */
174
  * None
175
  */
176
  * None
177
  */
178
  * None
179
  */
180
  * None
181
  */
182
  * None
183
  */
184
  * None
185
  */
186
  * None
187
  */
 
0
  * The parameters passed to the API call are invalid or not provided when required
1
  */
2
  * None
3
  */
4
  * None
5
  */
6
  * None
7
  */
8
  * None
9
  */
10
  * None
11
  */
12
  * None
13
  */
14
  * None
15
  */
16
  * None
17
  */
18
  * None
19
  */
20
  * None
21
  */
22
  * None
23
  */
24
  * None
25
  */
26
  * None
27
  */
28
  * None
29
  */
30
  * None
31
  */
32
  * None
33
  */
34
  * None
35
  */
36
  * None
37
  */
38
  * None
39
  */
40
  * None
41
  */
42
  * None
43
  */
44
  * None
45
  */
46
  * None
47
  */
48
  * None
49
  */
50
  * None
51
  */
52
  * None
53
  */
54
  * None
55
  */
56
  * None
57
  */
58
  * None
59
  */
60
  * None
61
  */
62
  * None
63
  */
64
  * None
65
  */
66
  * None
67
  */
68
  * None
69
  */
70
  * None
71
  */
72
  * None
73
  */
74
  * None
75
  */
76
  * None
77
  */
78
  * None
79
  */
80
  * None
81
  */
82
  * None
83
  */
84
  * None
85
  */
86
  * None
87
  */
88
  * None
89
  */
90
  * None
91
  */
92
  * None
93
  */
94
  * None
95
  */
96
  * None
97
  */
98
  * None
99
  */
100
  * None
101
  */
102
  * None
103
  */
104
  * None
105
  */
106
  * None
107
  */
108
  * None
109
  */
110
  * None
111
  */
112
  * None
113
  */
114
  * None
115
  */
116
  * None
117
  */
118
  * None
119
  */
120
  * None
121
  */
122
  * None
123
  */
124
  * None
125
  */
126
  * None
127
  */
128
  * None
129
  */
130
  * None
131
  */
132
  * None
133
  */
134
  * None
135
  */
136
  * None
137
  */
138
  * None
139
  */
140
  * None
141
  */
142
  * None
143
  */
144
  * None
145
  */
146
  * None
147
  */
148
  * None
149
  */
150
  * None
151
  */
152
  * None
153
  */
154
  * None
155
  */
156
  * None
157
  */
158
  * None
159
  */
160
  * None
161
  */
162
  * None
163
  */
164
  * None
165
  */
166
  * None
167
  */
168
  * None
169
  */
170
  * None
171
  */
172
  * None
173
  */
174
  * None
175
  */
176
  * None
177
  */
178
  * None
179
  */
180
  * None
181
  */
182
  * None
183
  */
184
  * None
185
  */
includes/MailChimp/Mailchimp/Folders.php DELETED
@@ -1 +0,0 @@
1
- <?php
2
  public function __construct(Mailchimp $master) {
3
  $this->master = $master;
4
  }
5
  /**
6
  * Add a new folder to file campaigns, autoresponders, or templates in
7
  * @param string $name
8
  * @param string $type
9
  * @return associative_array with a single value:
10
  * - folder_id int the folder_id of the newly created folder.
11
  */
12
  public function add($name, $type) {
13
  $_params = array("name" => $name, "type" => $type);
14
  return $this->master->call('folders/add', $_params);
15
  }
16
  /**
17
  * Delete a campaign, autoresponder, or template folder. Note that this will simply make whatever was in the folder appear unfiled, no other data is removed
18
  * @param int $fid
19
  * @param string $type
20
  * @return associative_array with a single entry:
21
  * - complete bool whether the call worked. reallistically this will always be true as errors will be thrown otherwise.
22
  */
23
  public function del($fid, $type) {
24
  $_params = array("fid" => $fid, "type" => $type);
25
  return $this->master->call('folders/del', $_params);
26
  }
27
  /**
28
  * List all the folders of a certain type
29
  * @param string $type
30
  * @return array structs for each folder, including:
31
  * - folder_id int Folder Id for the given folder, this can be used in the campaigns/list() function to filter on.
32
  * - name string Name of the given folder
33
  * - date_created string The date/time the folder was created
34
  * - type string The type of the folders being returned, just to make sure you know.
35
  * - cnt int number of items in the folder.
36
  */
37
  public function getList($type) {
38
  $_params = array("type" => $type);
39
  return $this->master->call('folders/list', $_params);
40
  }
41
  /**
42
  * Update the name of a folder for campaigns, autoresponders, or templates
43
  * @param int $fid
44
  * @param string $name
45
  * @param string $type
46
  * @return associative_array with a single entry:
47
  * - complete bool whether the call worked. reallistically this will always be true as errors will be thrown otherwise.
48
  */
49
  public function update($fid, $name, $type) {
50
  $_params = array("fid" => $fid, "name" => $name, "type" => $type);
51
  return $this->master->call('folders/update', $_params);
52
  }
 
0
  public function __construct(Mailchimp $master) {
1
  $this->master = $master;
2
  }
3
  /**
4
  * Add a new folder to file campaigns, autoresponders, or templates in
5
  * @param string $name
6
  * @param string $type
7
  * @return associative_array with a single value:
8
  * - folder_id int the folder_id of the newly created folder.
9
  */
10
  public function add($name, $type) {
11
  $_params = array("name" => $name, "type" => $type);
12
  return $this->master->call('folders/add', $_params);
13
  }
14
  /**
15
  * Delete a campaign, autoresponder, or template folder. Note that this will simply make whatever was in the folder appear unfiled, no other data is removed
16
  * @param int $fid
17
  * @param string $type
18
  * @return associative_array with a single entry:
19
  * - complete bool whether the call worked. reallistically this will always be true as errors will be thrown otherwise.
20
  */
21
  public function del($fid, $type) {
22
  $_params = array("fid" => $fid, "type" => $type);
23
  return $this->master->call('folders/del', $_params);
24
  }
25
  /**
26
  * List all the folders of a certain type
27
  * @param string $type
28
  * @return array structs for each folder, including:
29
  * - folder_id int Folder Id for the given folder, this can be used in the campaigns/list() function to filter on.
30
  * - name string Name of the given folder
31
  * - date_created string The date/time the folder was created
32
  * - type string The type of the folders being returned, just to make sure you know.
33
  * - cnt int number of items in the folder.
34
  */
35
  public function getList($type) {
36
  $_params = array("type" => $type);
37
  return $this->master->call('folders/list', $_params);
38
  }
39
  /**
40
  * Update the name of a folder for campaigns, autoresponders, or templates
41
  * @param int $fid
42
  * @param string $name
43
  * @param string $type
44
  * @return associative_array with a single entry:
45
  * - complete bool whether the call worked. reallistically this will always be true as errors will be thrown otherwise.
46
  */
47
  public function update($fid, $name, $type) {
48
  $_params = array("fid" => $fid, "name" => $name, "type" => $type);
49
  return $this->master->call('folders/update', $_params);
50
  }
includes/MailChimp/Mailchimp/Gallery.php DELETED
@@ -1 +0,0 @@
1
- <?php
2
  public function __construct(Mailchimp $master) {
3
  $this->master = $master;
4
  }
5
  /**
6
  * Return a section of the image gallery
7
  * @param associative_array $opts
8
  * - type string optional the gallery type to return - images or files - default to images
9
  * - start int optional for large data sets, the page number to start at - defaults to 1st page of data (page 0)
10
  * - limit int optional for large data sets, the number of results to return - defaults to 25, upper limit set at 100
11
  * - sort_by string optional field to sort by - one of size, time, name - defaults to time
12
  * - sort_dir string optional field to sort by - one of asc, desc - defaults to desc
13
  * - search_term string optional a term to search for in names
14
  * - folder_id int optional to return files that are in a specific folder. id returned by the list-folders call
15
  * @return associative_array the matching gallery items
16
  * - total int the total matching items
17
  * - data array structs for each item included in the set, including:
18
  * - id int the id of the file
19
  * - name string the file name
20
  * - time string the creation date for the item
21
  * - size int the file size in bytes
22
  * - full string the url to the actual item in the gallery
23
  * - thumb string a url for a thumbnail that can be used to represent the item, generally an image thumbnail or an icon for a file type
24
  */
25
  public function getList($opts=array()) {
26
  $_params = array("opts" => $opts);
27
  return $this->master->call('gallery/list', $_params);
28
  }
29
  /**
30
  * Return a list of the folders available to the file gallery
31
  * @param associative_array $opts
32
  * - start int optional for large data sets, the page number to start at - defaults to 1st page of data (page 0)
33
  * - limit int optional for large data sets, the number of results to return - defaults to 25, upper limit set at 100
34
  * - search_term string optional a term to search for in names
35
  * @return associative_array the matching gallery folders
36
  * - total int the total matching folders
37
  * - data array structs for each folder included in the set, including:
38
  * - id int the id of the folder
39
  * - name string the file name
40
  * - file_count int the number of files in the folder
41
  */
42
  public function listFolders($opts=array()) {
43
  $_params = array("opts" => $opts);
44
  return $this->master->call('gallery/list-folders', $_params);
45
  }
46
  /**
47
  * Adds a folder to the file gallery
48
  * @param string $name
49
  * @return associative_array the new data for the created folder
50
  * - data.id int the id of the new folder
51
  */
52
  public function addFolder($name) {
53
  $_params = array("name" => $name);
54
  return $this->master->call('gallery/add-folder', $_params);
55
  }
56
  /**
57
  * Remove a folder
58
  * @param int $folder_id
59
  * @return boolean true/false for success/failure
60
  */
61
  public function removeFolder($folder_id) {
62
  $_params = array("folder_id" => $folder_id);
63
  return $this->master->call('gallery/remove-folder', $_params);
64
  }
65
  /**
66
  * Add a file to a folder
67
  * @param int $file_id
68
  * @param int $folder_id
69
  * @return boolean true/false for success/failure
70
  */
71
  public function addFileToFolder($file_id, $folder_id) {
72
  $_params = array("file_id" => $file_id, "folder_id" => $folder_id);
73
  return $this->master->call('gallery/add-file-to-folder', $_params);
74
  }
75
  /**
76
  * Remove a file from a folder
77
  * @param int $file_id
78
  * @param int $folder_id
79
  * @return boolean true/false for success/failure
80
  */
81
  public function removeFileFromFolder($file_id, $folder_id) {
82
  $_params = array("file_id" => $file_id, "folder_id" => $folder_id);
83
  return $this->master->call('gallery/remove-file-from-folder', $_params);
84
  }
85
  /**
86
  * Remove all files from a folder (Note that the files are not deleted, they are only removed from the folder)
87
  * @param int $folder_id
88
  * @return boolean true/false for success/failure
89
  */
90
  public function removeAllFilesFromFolder($folder_id) {
91
  $_params = array("folder_id" => $folder_id);
92
  return $this->master->call('gallery/remove-all-files-from-folder', $_params);
93
  }
 
0
  public function __construct(Mailchimp $master) {
1
  $this->master = $master;
2
  }
3
  /**
4
  * Return a section of the image gallery
5
  * @param associative_array $opts
6
  * - type string optional the gallery type to return - images or files - default to images
7
  * - start int optional for large data sets, the page number to start at - defaults to 1st page of data (page 0)
8
  * - limit int optional for large data sets, the number of results to return - defaults to 25, upper limit set at 100
9
  * - sort_by string optional field to sort by - one of size, time, name - defaults to time
10
  * - sort_dir string optional field to sort by - one of asc, desc - defaults to desc
11
  * - search_term string optional a term to search for in names
12
  * - folder_id int optional to return files that are in a specific folder. id returned by the list-folders call
13
  * @return associative_array the matching gallery items
14
  * - total int the total matching items
15
  * - data array structs for each item included in the set, including:
16
  * - id int the id of the file
17
  * - name string the file name
18
  * - time string the creation date for the item
19
  * - size int the file size in bytes
20
  * - full string the url to the actual item in the gallery
21
  * - thumb string a url for a thumbnail that can be used to represent the item, generally an image thumbnail or an icon for a file type
22
  */
23
  public function getList($opts=array()) {
24
  $_params = array("opts" => $opts);
25
  return $this->master->call('gallery/list', $_params);
26
  }
27
  /**
28
  * Return a list of the folders available to the file gallery
29
  * @param associative_array $opts
30
  * - start int optional for large data sets, the page number to start at - defaults to 1st page of data (page 0)
31
  * - limit int optional for large data sets, the number of results to return - defaults to 25, upper limit set at 100
32
  * - search_term string optional a term to search for in names
33
  * @return associative_array the matching gallery folders
34
  * - total int the total matching folders
35
  * - data array structs for each folder included in the set, including:
36
  * - id int the id of the folder
37
  * - name string the file name
38
  * - file_count int the number of files in the folder
39
  */
40
  public function listFolders($opts=array()) {
41
  $_params = array("opts" => $opts);
42
  return $this->master->call('gallery/list-folders', $_params);
43
  }
44
  /**
45
  * Adds a folder to the file gallery
46
  * @param string $name
47
  * @return associative_array the new data for the created folder
48
  * - data.id int the id of the new folder
49
  */
50
  public function addFolder($name) {
51
  $_params = array("name" => $name);
52
  return $this->master->call('gallery/add-folder', $_params);
53
  }
54
  /**
55
  * Remove a folder
56
  * @param int $folder_id
57
  * @return boolean true/false for success/failure
58
  */
59
  public function removeFolder($folder_id) {
60
  $_params = array("folder_id" => $folder_id);
61
  return $this->master->call('gallery/remove-folder', $_params);
62
  }
63
  /**
64
  * Add a file to a folder
65
  * @param int $file_id
66
  * @param int $folder_id
67
  * @return boolean true/false for success/failure
68
  */
69
  public function addFileToFolder($file_id, $folder_id) {
70
  $_params = array("file_id" => $file_id, "folder_id" => $folder_id);
71
  return $this->master->call('gallery/add-file-to-folder', $_params);
72
  }
73
  /**
74
  * Remove a file from a folder
75
  * @param int $file_id
76
  * @param int $folder_id
77
  * @return boolean true/false for success/failure
78
  */
79
  public function removeFileFromFolder($file_id, $folder_id) {
80
  $_params = array("file_id" => $file_id, "folder_id" => $folder_id);
81
  return $this->master->call('gallery/remove-file-from-folder', $_params);
82
  }
83
  /**
84
  * Remove all files from a folder (Note that the files are not deleted, they are only removed from the folder)
85
  * @param int $folder_id
86
  * @return boolean true/false for success/failure
87
  */
88
  public function removeAllFilesFromFolder($folder_id) {
89
  $_params = array("folder_id" => $folder_id);
90
  return $this->master->call('gallery/remove-all-files-from-folder', $_params);
91
  }
includes/MailChimp/Mailchimp/Goal.php DELETED
@@ -1 +0,0 @@
1
- <?php
2
  public function __construct(Mailchimp $master) {
3
  $this->master = $master;
4
  }
5
  /**
6
  * Retrieve goal event data for a particular list member. Note: only unique events are returned. If a user triggers
7
  * @param string $list_id
8
  * @param associative_array $email
9
  * - email string an email address
10
  * - euid string the unique id for an email address (not list related) - the email "id" returned from listMemberInfo, Webhooks, Campaigns, etc.
11
  * - leid string the list email id (previously called web_id) for a list-member-info type call. this doesn't change when the email address changes
12
  * @param int $start
13
  * @param int $limit
14
  * @return associative_array Event data and metadata
15
  * - data array An array of goal data structs for the specified list member in the following format
16
  * - event string The URL or name of the event that was triggered
17
  * - last_visited_at string A timestamp in the format 'YYYY-MM-DD HH:MM:SS' that represents the last time this event was seen.
18
  * - total int The total number of events that match your criteria.
19
  */
20
  public function events($list_id, $email, $start=0, $limit=25) {
21
  $_params = array("list_id" => $list_id, "email" => $email, "start" => $start, "limit" => $limit);
22
  return $this->master->call('goal/events', $_params);
23
  }
24
  /**
25
  * This allows programmatically trigger goal event collection without the use of front-end code.
26
  * @param string $list_id
27
  * @param associative_array $email
28
  * - email string an email address
29
  * - euid string the unique id for an email address (not list related) - the email "id" returned from listMemberInfo, Webhooks, Campaigns, etc.
30
  * - leid string the list email id (previously called web_id) for a list-member-info type call. this doesn't change when the email address changes
31
  * @param string $campaign_id
32
  * @param string $event
33
  * @return associative_array Event data for the submitted event
34
  * - event string The URL or name of the event that was triggered
35
  * - last_visited_at string A timestamp in the format 'YYYY-MM-DD HH:MM:SS' that represents the last time this event was seen.
36
  */
37
  public function recordEvent($list_id, $email, $campaign_id, $event) {
38
  $_params = array("list_id" => $list_id, "email" => $email, "campaign_id" => $campaign_id, "event" => $event);
39
  return $this->master->call('goal/record-event', $_params);
40
  }
 
0
  public function __construct(Mailchimp $master) {
1
  $this->master = $master;
2
  }
3
  /**
4
  * Retrieve goal event data for a particular list member. Note: only unique events are returned. If a user triggers
5
  * @param string $list_id
6
  * @param associative_array $email
7
  * - email string an email address
8
  * - euid string the unique id for an email address (not list related) - the email "id" returned from listMemberInfo, Webhooks, Campaigns, etc.
9
  * - leid string the list email id (previously called web_id) for a list-member-info type call. this doesn't change when the email address changes
10
  * @param int $start
11
  * @param int $limit
12
  * @return associative_array Event data and metadata
13
  * - data array An array of goal data structs for the specified list member in the following format
14
  * - event string The URL or name of the event that was triggered
15
  * - last_visited_at string A timestamp in the format 'YYYY-MM-DD HH:MM:SS' that represents the last time this event was seen.
16
  * - total int The total number of events that match your criteria.
17
  */
18
  public function events($list_id, $email, $start=0, $limit=25) {
19
  $_params = array("list_id" => $list_id, "email" => $email, "start" => $start, "limit" => $limit);
20
  return $this->master->call('goal/events', $_params);
21
  }
22
  /**
23
  * This allows programmatically trigger goal event collection without the use of front-end code.
24
  * @param string $list_id
25
  * @param associative_array $email
26
  * - email string an email address
27
  * - euid string the unique id for an email address (not list related) - the email "id" returned from listMemberInfo, Webhooks, Campaigns, etc.
28
  * - leid string the list email id (previously called web_id) for a list-member-info type call. this doesn't change when the email address changes
29
  * @param string $campaign_id
30
  * @param string $event
31
  * @return associative_array Event data for the submitted event
32
  * - event string The URL or name of the event that was triggered
33
  * - last_visited_at string A timestamp in the format 'YYYY-MM-DD HH:MM:SS' that represents the last time this event was seen.
34
  */
35
  public function recordEvent($list_id, $email, $campaign_id, $event) {
36
  $_params = array("list_id" => $list_id, "email" => $email, "campaign_id" => $campaign_id, "event" => $event);
37
  return $this->master->call('goal/record-event', $_params);
38
  }
includes/MailChimp/Mailchimp/Helper.php DELETED
@@ -1 +0,0 @@
1
- <?php
2
  public function __construct(Mailchimp $master) {
3
  $this->master = $master;
4
  }
5
  /**
6
  * Retrieve lots of account information including payments made, plan info, some account stats, installed modules,
7
  * @param array $exclude
8
  * @return associative_array containing the details for the account tied to this API Key
9
  * - username string The company name associated with the account
10
  * - user_id string The Account user unique id (for building some links)
11
  * - is_trial bool Whether the Account is in Trial mode (can only send campaigns to less than 100 emails)
12
  * - is_approved bool Whether the Account has been approved for purchases
13
  * - has_activated bool Whether the Account has been activated
14
  * - timezone string The timezone for the Account - default is "US/Eastern"
15
  * - plan_type string Plan Type - "monthly", "payasyougo", or "free"
16
  * - plan_low int <em>only for Monthly plans</em> - the lower tier for list size
17
  * - plan_high int <em>only for Monthly plans</em> - the upper tier for list size
18
  * - plan_start_date string <em>only for Monthly plans</em> - the start date for a monthly plan
19
  * - emails_left int <em>only for Free and Pay-as-you-go plans</em> emails credits left for the account
20
  * - pending_monthly bool Whether the account is finishing Pay As You Go credits before switching to a Monthly plan
21
  * - first_payment string date of first payment
22
  * - last_payment string date of most recent payment
23
  * - times_logged_in int total number of times the account has been logged into via the web
24
  * - last_login string date/time of last login via the web
25
  * - affiliate_link string Monkey Rewards link for our Affiliate program
26
  * - industry string the user's selected industry
27
  * - contact associative_array Contact details for the account
28
  * - fname string First Name
29
  * - lname string Last Name
30
  * - email string Email Address
31
  * - company string Company Name
32
  * - address1 string Address Line 1
33
  * - address2 string Address Line 2
34
  * - city string City
35
  * - state string State or Province
36
  * - zip string Zip or Postal Code
37
  * - country string Country name
38
  * - url string Website URL
39
  * - phone string Phone number
40
  * - fax string Fax number
41
  * - modules array a struct for each addon module installed in the account
42
  * - id string An internal module id
43
  * - name string The module name
44
  * - added string The date the module was added
45
  * - data associative_array Any extra data associated with this module as key=>value pairs
46
  * - orders array a struct for each order for the account
47
  * - order_id int The order id
48
  * - type string The order type - either "monthly" or "credits"
49
  * - amount double The order amount
50
  * - date string The order date
51
  * - credits_used double The total credits used
52
  * - rewards associative_array Rewards details for the account including credits & inspections earned, number of referrals, referral details, and rewards used
53
  * - referrals_this_month int the total number of referrals this month
54
  * - notify_on string whether or not we notify the user when rewards are earned
55
  * - notify_email string the email address address used for rewards notifications
56
  * - credits associative_array Email credits earned:
57
  * - this_month int credits earned this month
58
  * - total_earned int credits earned all time
59
  * - remaining int credits remaining
60
  * - inspections associative_array Inbox Inspections earned:
61
  * - this_month int credits earned this month
62
  * - total_earned int credits earned all time
63
  * - remaining int credits remaining
64
  * - referrals array a struct for each referral, including:
65
  * - name string the name of the account
66
  * - email string the email address associated with the account
67
  * - signup_date string the signup date for the account
68
  * - type string the source for the referral
69
  * - applied array a struct for each applied rewards, including:
70
  * - value int the number of credits user
71
  * - date string the date applied
72
  * - order_id int the order number credits were applied to
73
  * - order_desc string the order description
74
  * - integrations array a struct for each connected integrations that can be used with campaigns, including:
75
  * - id int an internal id for the integration
76
  * - name string the integration name
77
  * - list_id string either "_any_" when globally accessible or the list id it's valid for use against
78
  * - user_id string if applicable, the user id for the integrated system
79
  * - account string if applicable, the user/account name for the integrated system
80
  * - profiles array For Facebook, users/page that can be posted to.
81
  * - id string the user or page id
82
  * - name string the user or page name
83
  * - is_page bool whether this is a user or a page
84
  */
85
  public function accountDetails($exclude=array()) {
86
  $_params = array("exclude" => $exclude);
87
  return $this->master->call('helper/account-details', $_params);
88
  }
89
  /**
90
  * Retrieve minimal data for all Campaigns a member was sent
91
  * @param associative_array $email
92
  * - email string an email address
93
  * - euid string the unique id for an email address (not list related) - the email "id" returned from listMemberInfo, Webhooks, Campaigns, etc.
94
  * - leid string the list email id (previously called web_id) for a list-member-info type call. this doesn't change when the email address changes
95
  * @param associative_array $options
96
  * - list_id string optional A list_id to limit the campaigns to
97
  * @return array an array of structs containing campaign data for each matching campaign (ordered by send time ascending), including:
98
  * - id string the campaign unique id
99
  * - title string the campaign's title
100
  * - subject string the campaign's subject
101
  * - send_time string the time the campaign was sent
102
  * - type string the campaign type
103
  */
104
  public function campaignsForEmail($email, $options=null) {
105
  $_params = array("email" => $email, "options" => $options);
106
  return $this->master->call('helper/campaigns-for-email', $_params);
107
  }
108
  /**
109
  * Return the current Chimp Chatter messages for an account.
110
  * @return array An array of structs containing data for each chatter message
111
  * - message string The chatter message
112
  * - type string The type of the message - one of lists:new-subscriber, lists:unsubscribes, lists:profile-updates, campaigns:facebook-likes, campaigns:facebook-comments, campaigns:forward-to-friend, lists:imports, or campaigns:inbox-inspections
113
  * - url string a url into the web app that the message could link to, if applicable
114
  * - list_id string the list_id a message relates to, if applicable. Deleted lists will return -DELETED-
115
  * - campaign_id string the list_id a message relates to, if applicable. Deleted campaigns will return -DELETED-
116
  * - update_time string The date/time the message was last updated
117
  */
118
  public function chimpChatter() {
119
  $_params = array();
120
  return $this->master->call('helper/chimp-chatter', $_params);
121
  }
122
  /**
123
  * Have HTML content auto-converted to a text-only format. You can send: plain HTML, an existing Campaign Id, or an existing Template Id. Note that this will <strong>not</strong> save anything to or update any of your lists, campaigns, or templates.
124
  * @param string $type
125
  * @param associative_array $content
126
  * - html string optional a single string value,
127
  * - cid string a valid Campaign Id
128
  * - user_template_id string the id of a user template
129
  * - base_template_id string the id of a built in base/basic template
130
  * - gallery_template_id string the id of a built in gallery template
131
  * - url string a valid & public URL to pull html content from
132
  * @return associative_array the content pass in converted to text.
133
  * - text string the converted html
134
  */
135
  public function generateText($type, $content) {
136
  $_params = array("type" => $type, "content" => $content);
137
  return $this->master->call('helper/generate-text', $_params);
138
  }
139
  /**
140
  * Send your HTML content to have the CSS inlined and optionally remove the original styles.
141
  * @param string $html
142
  * @param bool $strip_css
143
  * @return associative_array with a "html" key
144
  * - html string Your HTML content with all CSS inlined, just like if we sent it.
145
  */
146
  public function inlineCss($html, $strip_css=false) {
147
  $_params = array("html" => $html, "strip_css" => $strip_css);
148
  return $this->master->call('helper/inline-css', $_params);
149
  }
150
  /**
151
  * Retrieve minimal List data for all lists a member is subscribed to.
152
  * @param associative_array $email
153
  * - email string an email address
154
  * - euid string the unique id for an email address (not list related) - the email "id" returned from listMemberInfo, Webhooks, Campaigns, etc.
155
  * - leid string the list email id (previously called web_id) for a list-member-info type call. this doesn't change when the email address changes
156
  * @return array An array of structs with info on the list_id the member is subscribed to.
157
  * - id string the list unique id
158
  * - web_id int the id referenced in web interface urls
159
  * - name string the list name
160
  */
161
  public function listsForEmail($email) {
162
  $_params = array("email" => $email);
163
  return $this->master->call('helper/lists-for-email', $_params);
164
  }
165
  /**
166
  * "Ping" the MailChimp API - a simple method you can call that will return a constant value as long as everything is good. Note
167
  * @return associative_array a with a "msg" key
168
  * - msg string containing "Everything's Chimpy!" if everything is chimpy, otherwise returns an error message
169
  */
170
  public function ping() {
171
  $_params = array();
172
  return $this->master->call('helper/ping', $_params);
173
  }
174
  /**
175
  * Search all campaigns for the specified query terms
176
  * @param string $query
177
  * @param int $offset
178
  * @param string $snip_start
179
  * @param string $snip_end
180
  * @return associative_array containing the total matches and current results
181
  * - total int total campaigns matching
182
  * - results array matching campaigns and snippets
183
  * - snippet string the matching snippet for the campaign
184
  * - campaign associative_array the matching campaign's details - will return same data as single campaign from campaigns/list()
185
  */
186
  public function searchCampaigns($query, $offset=0, $snip_start=null, $snip_end=null) {
187
  $_params = array("query" => $query, "offset" => $offset, "snip_start" => $snip_start, "snip_end" => $snip_end);
188
  return $this->master->call('helper/search-campaigns', $_params);
189
  }
190
  /**
191
  * Search account wide or on a specific list using the specified query terms
192
  * @param string $query
193
  * @param string $id
194
  * @param int $offset
195
  * @return associative_array An array of both exact matches and partial matches over a full search
196
  * - exact_matches associative_array containing the exact email address matches and current results
197
  * - total int total members matching
198
  * - members array each entry will be struct matching the data format for a single member as returned by lists/member-info()
199
  * - full_search associative_array containing the total matches and current results
200
  * - total int total members matching
201
  * - members array each entry will be struct matching the data format for a single member as returned by lists/member-info()
202
  */
203
  public function searchMembers($query, $id=null, $offset=0) {
204
  $_params = array("query" => $query, "id" => $id, "offset" => $offset);
205
  return $this->master->call('helper/search-members', $_params);
206
  }
207
  /**
208
  * Retrieve all domain verification records for an account
209
  * @return array structs for each domain verification has been attempted for
210
  * - domain string the verified domain
211
  * - status string the status of the verification - either "verified" or "pending"
212
  * - email string the email address used for verification - "pre-existing" if we automatically backfilled it at some point
213
  */
214
  public function verifiedDomains() {
215
  $_params = array();
216
  return $this->master->call('helper/verified-domains', $_params);
217
  }
 
0
  public function __construct(Mailchimp $master) {
1
  $this->master = $master;
2
  }
3
  /**
4
  * Retrieve lots of account information including payments made, plan info, some account stats, installed modules,
5
  * @param array $exclude
6
  * @return associative_array containing the details for the account tied to this API Key
7
  * - username string The company name associated with the account
8
  * - user_id string The Account user unique id (for building some links)
9
  * - is_trial bool Whether the Account is in Trial mode (can only send campaigns to less than 100 emails)
10
  * - is_approved bool Whether the Account has been approved for purchases
11
  * - has_activated bool Whether the Account has been activated
12
  * - timezone string The timezone for the Account - default is "US/Eastern"
13
  * - plan_type string Plan Type - "monthly", "payasyougo", or "free"
14
  * - plan_low int <em>only for Monthly plans</em> - the lower tier for list size
15
  * - plan_high int <em>only for Monthly plans</em> - the upper tier for list size
16
  * - plan_start_date string <em>only for Monthly plans</em> - the start date for a monthly plan
17
  * - emails_left int <em>only for Free and Pay-as-you-go plans</em> emails credits left for the account
18
  * - pending_monthly bool Whether the account is finishing Pay As You Go credits before switching to a Monthly plan
19
  * - first_payment string date of first payment
20
  * - last_payment string date of most recent payment
21
  * - times_logged_in int total number of times the account has been logged into via the web
22
  * - last_login string date/time of last login via the web
23
  * - affiliate_link string Monkey Rewards link for our Affiliate program
24
  * - industry string the user's selected industry
25
  * - contact associative_array Contact details for the account
26
  * - fname string First Name
27
  * - lname string Last Name
28
  * - email string Email Address
29
  * - company string Company Name
30
  * - address1 string Address Line 1
31
  * - address2 string Address Line 2
32
  * - city string City
33
  * - state string State or Province
34
  * - zip string Zip or Postal Code
35
  * - country string Country name
36
  * - url string Website URL
37
  * - phone string Phone number
38
  * - fax string Fax number
39
  * - modules array a struct for each addon module installed in the account
40
  * - id string An internal module id
41
  * - name string The module name
42
  * - added string The date the module was added
43
  * - data associative_array Any extra data associated with this module as key=>value pairs
44
  * - orders array a struct for each order for the account
45
  * - order_id int The order id
46
  * - type string The order type - either "monthly" or "credits"
47
  * - amount double The order amount
48
  * - date string The order date
49
  * - credits_used double The total credits used
50
  * - rewards associative_array Rewards details for the account including credits & inspections earned, number of referrals, referral details, and rewards used
51
  * - referrals_this_month int the total number of referrals this month
52
  * - notify_on string whether or not we notify the user when rewards are earned
53
  * - notify_email string the email address address used for rewards notifications
54
  * - credits associative_array Email credits earned:
55
  * - this_month int credits earned this month
56
  * - total_earned int credits earned all time
57
  * - remaining int credits remaining
58
  * - inspections associative_array Inbox Inspections earned:
59
  * - this_month int credits earned this month
60
  * - total_earned int credits earned all time
61
  * - remaining int credits remaining
62
  * - referrals array a struct for each referral, including:
63
  * - name string the name of the account
64
  * - email string the email address associated with the account
65
  * - signup_date string the signup date for the account
66
  * - type string the source for the referral
67
  * - applied array a struct for each applied rewards, including:
68
  * - value int the number of credits user
69
  * - date string the date applied
70
  * - order_id int the order number credits were applied to
71
  * - order_desc string the order description
72
  * - integrations array a struct for each connected integrations that can be used with campaigns, including:
73
  * - id int an internal id for the integration
74
  * - name string the integration name
75
  * - list_id string either "_any_" when globally accessible or the list id it's valid for use against
76
  * - user_id string if applicable, the user id for the integrated system
77
  * - account string if applicable, the user/account name for the integrated system
78
  * - profiles array For Facebook, users/page that can be posted to.
79
  * - id string the user or page id
80
  * - name string the user or page name
81
  * - is_page bool whether this is a user or a page
82
  */
83
  public function accountDetails($exclude=array()) {
84
  $_params = array("exclude" => $exclude);
85
  return $this->master->call('helper/account-details', $_params);
86
  }
87
  /**
88
  * Retrieve minimal data for all Campaigns a member was sent
89
  * @param associative_array $email
90
  * - email string an email address
91
  * - euid string the unique id for an email address (not list related) - the email "id" returned from listMemberInfo, Webhooks, Campaigns, etc.
92
  * - leid string the list email id (previously called web_id) for a list-member-info type call. this doesn't change when the email address changes
93
  * @param associative_array $options
94
  * - list_id string optional A list_id to limit the campaigns to
95
  * @return array an array of structs containing campaign data for each matching campaign (ordered by send time ascending), including:
96
  * - id string the campaign unique id
97
  * - title string the campaign's title
98
  * - subject string the campaign's subject
99
  * - send_time string the time the campaign was sent
100
  * - type string the campaign type
101
  */
102
  public function campaignsForEmail($email, $options=null) {
103
  $_params = array("email" => $email, "options" => $options);
104
  return $this->master->call('helper/campaigns-for-email', $_params);
105
  }
106
  /**
107
  * Return the current Chimp Chatter messages for an account.
108
  * @return array An array of structs containing data for each chatter message
109
  * - message string The chatter message
110
  * - type string The type of the message - one of lists:new-subscriber, lists:unsubscribes, lists:profile-updates, campaigns:facebook-likes, campaigns:facebook-comments, campaigns:forward-to-friend, lists:imports, or campaigns:inbox-inspections
111
  * - url string a url into the web app that the message could link to, if applicable
112
  * - list_id string the list_id a message relates to, if applicable. Deleted lists will return -DELETED-
113
  * - campaign_id string the list_id a message relates to, if applicable. Deleted campaigns will return -DELETED-
114
  * - update_time string The date/time the message was last updated
115
  */
116
  public function chimpChatter() {
117
  $_params = array();
118
  return $this->master->call('helper/chimp-chatter', $_params);
119
  }
120
  /**
121
  * Have HTML content auto-converted to a text-only format. You can send: plain HTML, an existing Campaign Id, or an existing Template Id. Note that this will <strong>not</strong> save anything to or update any of your lists, campaigns, or templates.
122
  * @param string $type
123
  * @param associative_array $content
124
  * - html string optional a single string value,
125
  * - cid string a valid Campaign Id
126
  * - user_template_id string the id of a user template
127
  * - base_template_id string the id of a built in base/basic template
128
  * - gallery_template_id string the id of a built in gallery template
129
  * - url string a valid & public URL to pull html content from
130
  * @return associative_array the content pass in converted to text.
131
  * - text string the converted html
132
  */
133
  public function generateText($type, $content) {
134
  $_params = array("type" => $type, "content" => $content);
135
  return $this->master->call('helper/generate-text', $_params);
136
  }
137
  /**
138
  * Send your HTML content to have the CSS inlined and optionally remove the original styles.
139
  * @param string $html
140
  * @param bool $strip_css
141
  * @return associative_array with a "html" key
142
  * - html string Your HTML content with all CSS inlined, just like if we sent it.
143
  */
144
  public function inlineCss($html, $strip_css=false) {
145
  $_params = array("html" => $html, "strip_css" => $strip_css);
146
  return $this->master->call('helper/inline-css', $_params);
147
  }
148
  /**
149
  * Retrieve minimal List data for all lists a member is subscribed to.
150
  * @param associative_array $email
151
  * - email string an email address
152
  * - euid string the unique id for an email address (not list related) - the email "id" returned from listMemberInfo, Webhooks, Campaigns, etc.
153
  * - leid string the list email id (previously called web_id) for a list-member-info type call. this doesn't change when the email address changes
154
  * @return array An array of structs with info on the list_id the member is subscribed to.
155
  * - id string the list unique id
156
  * - web_id int the id referenced in web interface urls
157
  * - name string the list name
158
  */
159
  public function listsForEmail($email) {
160
  $_params = array("email" => $email);
161
  return $this->master->call('helper/lists-for-email', $_params);
162
  }
163
  /**
164
  * "Ping" the MailChimp API - a simple method you can call that will return a constant value as long as everything is good. Note
165
  * @return associative_array a with a "msg" key
166
  * - msg string containing "Everything's Chimpy!" if everything is chimpy, otherwise returns an error message
167
  */
168
  public function ping() {
169
  $_params = array();
170
  return $this->master->call('helper/ping', $_params);
171
  }
172
  /**
173
  * Search all campaigns for the specified query terms
174
  * @param string $query
175
  * @param int $offset
176
  * @param string $snip_start
177
  * @param string $snip_end
178
  * @return associative_array containing the total matches and current results
179
  * - total int total campaigns matching
180
  * - results array matching campaigns and snippets
181
  * - snippet string the matching snippet for the campaign
182
  * - campaign associative_array the matching campaign's details - will return same data as single campaign from campaigns/list()
183
  */
184
  public function searchCampaigns($query, $offset=0, $snip_start=null, $snip_end=null) {
185
  $_params = array("query" => $query, "offset" => $offset, "snip_start" => $snip_start, "snip_end" => $snip_end);
186
  return $this->master->call('helper/search-campaigns', $_params);
187
  }
188
  /**
189
  * Search account wide or on a specific list using the specified query terms
190
  * @param string $query
191
  * @param string $id
192
  * @param int $offset
193
  * @return associative_array An array of both exact matches and partial matches over a full search
194
  * - exact_matches associative_array containing the exact email address matches and current results
195
  * - total int total members matching
196
  * - members array each entry will be struct matching the data format for a single member as returned by lists/member-info()
197
  * - full_search associative_array containing the total matches and current results
198
  * - total int total members matching
199
  * - members array each entry will be struct matching the data format for a single member as returned by lists/member-info()
200
  */
201
  public function searchMembers($query, $id=null, $offset=0) {
202
  $_params = array("query" => $query, "id" => $id, "offset" => $offset);
203
  return $this->master->call('helper/search-members', $_params);
204
  }
205
  /**
206
  * Retrieve all domain verification records for an account
207
  * @return array structs for each domain verification has been attempted for
208
  * - domain string the verified domain
209
  * - status string the status of the verification - either "verified" or "pending"
210
  * - email string the email address used for verification - "pre-existing" if we automatically backfilled it at some point
211
  */
212
  public function verifiedDomains() {
213
  $_params = array();
214
  return $this->master->call('helper/verified-domains', $_params);
215
  }
includes/MailChimp/Mailchimp/Lists.php DELETED
@@ -1 +0,0 @@
1
- <?php
2
  public function __construct(Mailchimp $master) {
3
  $this->master = $master;
4
  }
5
  /**
6
  * Get all email addresses that complained about a campaign sent to a list
7
  * @param string $id
8
  * @param int $start
9
  * @param int $limit
10
  * @param string $since
11
  * @return associative_array the total of all reports and the specific reports reports this page
12
  * - total int the total number of matching abuse reports
13
  * - data array structs for the actual data for each reports, including:
14
  * - date string date+time the abuse report was received and processed
15
  * - email string the email address that reported abuse
16
  * - campaign_id string the unique id for the campaign that report was made against
17
  * - type string an internal type generally specifying the originating mail provider - may not be useful outside of filling report views
18
  */
19
  public function abuseReports($id, $start=0, $limit=500, $since=null) {
20
  $_params = array("id" => $id, "start" => $start, "limit" => $limit, "since" => $since);
21
  return $this->master->call('lists/abuse-reports', $_params);
22
  }
23
  /**
24
  * Access up to the previous 180 days of daily detailed aggregated activity stats for a given list. Does not include AutoResponder activity.
25
  * @param string $id
26
  * @return array of structs containing daily values, each containing:
27
  */
28
  public function activity($id) {
29
  $_params = array("id" => $id);
30
  return $this->master->call('lists/activity', $_params);
31
  }
32
  /**
33
  * Subscribe a batch of email addresses to a list at once. If you are using a serialized version of the API, we strongly suggest that you
34
  * @param string $id
35
  * @param array $batch
36
  * - email associative_array a struct with one of the following keys - failing to provide anything will produce an error relating to the email address. Provide multiples and we'll use the first we see in this same order.
37
  * - email string an email address
38
  * - euid string the unique id for an email address (not list related) - the email "id" returned from listMemberInfo, Webhooks, Campaigns, etc.
39
  * - leid string the list email id (previously called web_id) for a list-member-info type call. this doesn't change when the email address changes
40
  * - email_type string for the email type option (html or text)
41
  * - merge_vars associative_array data for the various list specific and special merge vars documented in lists/subscribe
42
  * @param boolean $double_optin
43
  * @param boolean $update_existing
44
  * @param boolean $replace_interests
45
  * @return associative_array struct of result counts and associated data
46
  * - add_count int Number of email addresses that were successfully added
47
  * - adds array array of structs for each add
48
  * - email string the email address added
49
  * - euid string the email unique id
50
  * - leid string the list member's truly unique id
51
  * - update_count int Number of email addresses that were successfully updated
52
  * - updates array array of structs for each update
53
  * - email string the email address added
54
  * - euid string the email unique id
55
  * - leid string the list member's truly unique id
56
  * - error_count int Number of email addresses that failed during addition/updating
57
  * - errors array array of error structs including:
58
  * - email string whatever was passed in the batch record's email parameter
59
  * - email string the email address added
60
  * - euid string the email unique id
61
  * - leid string the list member's truly unique id
62
  * - code int the error code
63
  * - error string the full error message
64
  * - row associative_array the row from the batch that caused the error
65
  */
66
  public function batchSubscribe($id, $batch, $double_optin=true, $update_existing=false, $replace_interests=true) {
67
  $_params = array("id" => $id, "batch" => $batch, "double_optin" => $double_optin, "update_existing" => $update_existing, "replace_interests" => $replace_interests);
68
  return $this->master->call('lists/batch-subscribe', $_params);
69
  }
70
  /**
71
  * Unsubscribe a batch of email addresses from a list
72
  * @param string $id
73
  * @param array $batch
74
  * - email string an email address
75
  * - euid string the unique id for an email address (not list related) - the email "id" returned from listMemberInfo, Webhooks, Campaigns, etc.
76
  * - leid string the list email id (previously called web_id) for a list-member-info type call. this doesn't change when the email address changes
77
  * @param boolean $delete_member
78
  * @param boolean $send_goodbye
79
  * @param boolean $send_notify
80
  * @return array Array of structs containing results and any errors that occurred
81
  * - success_count int Number of email addresses that were successfully removed
82
  * - error_count int Number of email addresses that failed during addition/updating
83
  * - errors array array of error structs including:
84
  * - email string whatever was passed in the batch record's email parameter
85
  * - email string the email address added
86
  * - euid string the email unique id
87
  * - leid string the list member's truly unique id
88
  * - code int the error code
89
  * - error string the full error message
90
  */
91
  public function batchUnsubscribe($id, $batch, $delete_member=false, $send_goodbye=true, $send_notify=false) {
92
  $_params = array("id" => $id, "batch" => $batch, "delete_member" => $delete_member, "send_goodbye" => $send_goodbye, "send_notify" => $send_notify);
93
  return $this->master->call('lists/batch-unsubscribe', $_params);
94
  }
95
  /**
96
  * Retrieve the clients that the list's subscribers have been tagged as being used based on user agents seen. Made possible by <a href="http://user-agent-string.info" target="_blank">user-agent-string.info</a>
97
  * @param string $id
98
  * @return associative_array the desktop and mobile user agents in use on the list
99
  * - desktop associative_array desktop user agents and percentages
100
  * - penetration double the percent of desktop clients in use
101
  * - clients array array of structs for each client including:
102
  * - client string the common name for the client
103
  * - icon string a url to an image representing this client
104
  * - percent string percent of list using the client
105
  * - members string total members using the client
106
  * - mobile associative_array mobile user agents and percentages
107
  * - penetration double the percent of mobile clients in use
108
  * - clients array array of structs for each client including:
109
  * - client string the common name for the client
110
  * - icon string a url to an image representing this client
111
  * - percent string percent of list using the client
112
  * - members string total members using the client
113
  */
114
  public function clients($id) {
115
  $_params = array("id" => $id);
116
  return $this->master->call('lists/clients', $_params);
117
  }
118
  /**
119
  * Access the Growth History by Month in aggregate or for a given list.
120
  * @param string $id
121
  * @return array array of structs containing months and growth data
122
  * - month string The Year and Month in question using YYYY-MM format
123
  * - existing int number of existing subscribers to start the month
124
  * - imports int number of subscribers imported during the month
125
  * - optins int number of subscribers who opted-in during the month
126
  */
127
  public function growthHistory($id=null) {
128
  $_params = array("id" => $id);
129
  return $this->master->call('lists/growth-history', $_params);
130
  }
131
  /**
132
  * Get the list of interest groupings for a given list, including the label, form information, and included groups for each
133
  * @param string $id
134
  * @param bool $counts
135
  * @return array array of structs of the interest groupings for the list
136
  * - id int The id for the Grouping
137
  * - name string Name for the Interest groups
138
  * - form_field string Gives the type of interest group: checkbox,radio,select
139
  * - groups array Array structs of the grouping options (interest groups) including:
140
  * - bit string the bit value - not really anything to be done with this
141
  * - name string the name of the group
142
  * - display_order string the display order of the group, if set
143
  * - subscribers int total number of subscribers who have this group if "counts" is true. otherwise empty
144
  */
145
  public function interestGroupings($id, $counts=false) {
146
  $_params = array("id" => $id, "counts" => $counts);
147
  return $this->master->call('lists/interest-groupings', $_params);
148
  }
149
  /**
150
  * Add a single Interest Group - if interest groups for the List are not yet enabled, adding the first
151
  * @param string $id
152
  * @param string $group_name
153
  * @param int $grouping_id
154
  * @return associative_array with a single entry:
155
  * - complete bool whether the call worked. reallistically this will always be true as errors will be thrown otherwise.
156
  */
157
  public function interestGroupAdd($id, $group_name, $grouping_id=null) {
158
  $_params = array("id" => $id, "group_name" => $group_name, "grouping_id" => $grouping_id);
159
  return $this->master->call('lists/interest-group-add', $_params);
160
  }
161
  /**
162
  * Delete a single Interest Group - if the last group for a list is deleted, this will also turn groups for the list off.
163
  * @param string $id
164
  * @param string $group_name
165
  * @param int $grouping_id
166
  * @return associative_array with a single entry:
167
  * - complete bool whether the call worked. reallistically this will always be true as errors will be thrown otherwise.
168
  */
169
  public function interestGroupDel($id, $group_name, $grouping_id=null) {
170
  $_params = array("id" => $id, "group_name" => $group_name, "grouping_id" => $grouping_id);
171
  return $this->master->call('lists/interest-group-del', $_params);
172
  }
173
  /**
174
  * Change the name of an Interest Group
175
  * @param string $id
176
  * @param string $old_name
177
  * @param string $new_name
178
  * @param int $grouping_id
179
  * @return associative_array with a single entry:
180
  * - complete bool whether the call worked. reallistically this will always be true as errors will be thrown otherwise.
181
  */
182
  public function interestGroupUpdate($id, $old_name, $new_name, $grouping_id=null) {
183
  $_params = array("id" => $id, "old_name" => $old_name, "new_name" => $new_name, "grouping_id" => $grouping_id);
184
  return $this->master->call('lists/interest-group-update', $_params);
185
  }
186
  /**
187
  * Add a new Interest Grouping - if interest groups for the List are not yet enabled, adding the first
188
  * @param string $id
189
  * @param string $name
190
  * @param string $type
191
  * @param array $groups
192
  * @return associative_array with a single entry:
193
  * - id int the new grouping id if the request succeeds, otherwise an error will be thrown
194
  */
195
  public function interestGroupingAdd($id, $name, $type, $groups) {
196
  $_params = array("id" => $id, "name" => $name, "type" => $type, "groups" => $groups);
197
  return $this->master->call('lists/interest-grouping-add', $_params);
198
  }
199
  /**
200
  * Delete an existing Interest Grouping - this will permanently delete all contained interest groups and will remove those selections from all list members
201
  * @param int $grouping_id
202
  * @return associative_array with a single entry:
203
  * - complete bool whether the call worked. reallistically this will always be true as errors will be thrown otherwise.
204
  */
205
  public function interestGroupingDel($grouping_id) {
206
  $_params = array("grouping_id" => $grouping_id);
207
  return $this->master->call('lists/interest-grouping-del', $_params);
208
  }
209
  /**
210
  * Update an existing Interest Grouping
211
  * @param int $grouping_id
212
  * @param string $name
213
  * @param string $value
214
  * @return associative_array with a single entry:
215
  * - complete bool whether the call worked. reallistically this will always be true as errors will be thrown otherwise.
216
  */
217
  public function interestGroupingUpdate($grouping_id, $name, $value) {
218
  $_params = array("grouping_id" => $grouping_id, "name" => $name, "value" => $value);
219
  return $this->master->call('lists/interest-grouping-update', $_params);
220
  }
221
  /**
222
  * Retrieve the locations (countries) that the list's subscribers have been tagged to based on geocoding their IP address
223
  * @param string $id
224
  * @return array array of locations
225
  * - country string the country name
226
  * - cc string the ISO 3166 2 digit country code
227
  * - percent double the percent of subscribers in the country
228
  * - total double the total number of subscribers in the country
229
  */
230
  public function locations($id) {
231
  $_params = array("id" => $id);
232
  return $this->master->call('lists/locations', $_params);
233
  }
234
  /**
235
  * Get the most recent 100 activities for particular list members (open, click, bounce, unsub, abuse, sent to, etc.)
236
  * @param string $id
237
  * @param array $emails
238
  * - email string an email address - for new subscribers obviously this should be used
239
  * - euid string the unique id for an email address (not list related) - the email "id" returned from listMemberInfo, Webhooks, Campaigns, etc.
240
  * - leid string the list email id (previously called web_id) for a list-member-info type call. this doesn't change when the email address changes
241
  * @return associative_array of data and success/error counts
242
  * - success_count int the number of subscribers successfully found on the list
243
  * - error_count int the number of subscribers who were not found on the list
244
  * - errors array array of error structs including:
245
  * - email string whatever was passed in the email parameter
246
  * - email string the email address added
247
  * - euid string the email unique id
248
  * - leid string the list member's truly unique id
249
  * - error string the error message
250
  * - code string the error code
251
  * - data array an array of structs where each activity record has:
252
  * - email string whatever was passed in the email parameter
253
  * - email string the email address added
254
  * - euid string the email unique id
255
  * - leid string the list member's truly unique id
256
  * - activity array an array of structs containing the activity, including:
257
  * - action string The action name, one of: open, click, bounce, unsub, abuse, sent, queued, ecomm, mandrill_send, mandrill_hard_bounce, mandrill_soft_bounce, mandrill_open, mandrill_click, mandrill_spam, mandrill_unsub, mandrill_reject
258
  * - timestamp string The date+time of the action (GMT)
259
  * - url string For click actions, the url clicked, otherwise this is empty
260
  * - type string If there's extra bounce, unsub, etc data it will show up here.
261
  * - campaign_id string The campaign id the action was related to, if it exists - otherwise empty (ie, direct unsub from list)
262
  * - campaign_data associative_array If not deleted, the campaigns/list data for the campaign
263
  */
264
  public function memberActivity($id, $emails) {
265
  $_params = array("id" => $id, "emails" => $emails);
266
  return $this->master->call('lists/member-activity', $_params);
267
  }
268
  /**
269
  * Get all the information for particular members of a list
270
  * @param string $id
271
  * @param array $emails
272
  * - email string an email address - for new subscribers obviously this should be used
273
  * - euid string the unique id for an email address (not list related) - the email "id" returned from listMemberInfo, Webhooks, Campaigns, etc.
274
  * - leid string the list email id (previously called web_id) for a list-member-info type call. this doesn't change when the email address changes
275
  * @return associative_array of data and success/error counts
276
  * - success_count int the number of subscribers successfully found on the list
277
  * - error_count int the number of subscribers who were not found on the list
278
  * - errors array array of error structs including:
279
  * - email associative_array whatever was passed in the email parameter
280
  * - email string the email address added
281
  * - euid string the email unique id
282
  * - leid string the list member's truly unique id
283
  * - error string the error message
284
  * - data array array of structs for each valid list member
285
  * - id string The unique id (euid) for this email address on an account
286
  * - email string The email address associated with this record
287
  * - email_type string The type of emails this customer asked to get: html or text
288
  * - merges associative_array a struct containing a key for each merge tags and the data for those tags for this email address, plus:
289
  * - GROUPINGS array if Interest groupings are enabled, this will exist with structs for each grouping:
290
  * - id int the grouping id
291
  * - name string the interest group name
292
  * - groups array structs for each group in the grouping
293
  * - name string the group name
294
  * - interested bool whether the member has this group selected
295
  * - status string The subscription status for this email address, either pending, subscribed, unsubscribed, or cleaned
296
  * - ip_signup string IP Address this address signed up from. This may be blank if single optin is used.
297
  * - timestamp_signup string The date+time the double optin was initiated. This may be blank if single optin is used.
298
  * - ip_opt string IP Address this address opted in from.
299
  * - timestamp_opt string The date+time the optin completed
300
  * - member_rating int the rating of the subscriber. This will be 1 - 5 as described <a href="http://eepurl.com/f-2P" target="_blank">here</a>
301
  * - campaign_id string If the user is unsubscribed and they unsubscribed from a specific campaign, that campaign_id will be listed, otherwise this is not returned.
302
  * - lists array An array of structs for the other lists this member belongs to
303
  * - id string the list id
304
  * - status string the members status on that list
305
  * - timestamp string The date+time this email address entered it's current status
306
  * - info_changed string The last time this record was changed. If the record is old enough, this may be blank.
307
  * - web_id int The Member id used in our web app, allows you to create a link directly to it
308
  * - leid int The Member id used in our web app, allows you to create a link directly to it
309
  * - list_id string The list id the for the member record being returned
310
  * - list_name string The list name the for the member record being returned
311
  * - language string if set/detected, a language code from <a href="http://kb.mailchimp.com/article/can-i-see-what-languages-my-subscribers-use#code" target="_blank">here</a>
312
  * - is_gmonkey bool Whether the member is a <a href="http://mailchimp.com/features/golden-monkeys/" target="_blank">Golden Monkey</a> or not.
313
  * - geo associative_array the geographic information if we have it. including:
314
  * - latitude string the latitude
315
  * - longitude string the longitude
316
  * - gmtoff string GMT offset
317
  * - dstoff string GMT offset during daylight savings (if DST not observered, will be same as gmtoff)
318
  * - timezone string the timezone we've place them in
319
  * - cc string 2 digit ISO-3166 country code
320
  * - region string generally state, province, or similar
321
  * - clients associative_array the client we've tracked the address as using with two keys:
322
  * - name string the common name of the client
323
  * - icon_url string a url representing a path to an icon representing this client
324
  * - static_segments array structs for each static segments the member is a part of including:
325
  * - id int the segment id
326
  * - name string the name given to the segment
327
  * - added string the date the member was added
328
  * - notes array structs for each note entered for this member. For each note:
329
  * - id int the note id
330
  * - note string the text entered
331
  * - created string the date the note was created
332
  * - updated string the date the note was last updated
333
  * - created_by_name string the name of the user who created the note. This can change as users update their profile.
334
  */
335
  public function memberInfo($id, $emails) {
336
  $_params = array("id" => $id, "emails" => $emails);
337
  return $this->master->call('lists/member-info', $_params);
338
  }
339
  /**
340
  * Get all of the list members for a list that are of a particular status and potentially matching a segment. This will cause locking, so don't run multiples at once. Are you trying to get a dump including lots of merge
341
  * @param string $id
342
  * @param string $status
343
  * @param associative_array $opts
344
  * - start int optional for large data sets, the page number to start at - defaults to 1st page of data (page 0)
345
  * - limit int optional for large data sets, the number of results to return - defaults to 25, upper limit set at 100
346
  * - sort_field string optional the data field to sort by - mergeX (1-30), your custom merge tags, "email", "rating","last_update_time", or "optin_time" - invalid fields will be ignored
347
  * - sort_dir string optional the direct - ASC or DESC. defaults to ASC (case insensitive)
348
  * - segment associative_array a properly formatted segment that works with campaigns/segment-test
349
  * @return associative_array of the total records matched and limited list member data for this page
350
  * - total int the total matching records
351
  * - data array structs for each member as returned by member-info
352
  */
353
  public function members($id, $status='subscribed', $opts=array()) {
354
  $_params = array("id" => $id, "status" => $status, "opts" => $opts);
355
  return $this->master->call('lists/members', $_params);
356
  }
357
  /**
358
  * Add a new merge tag to a given list
359
  * @param string $id
360
  * @param string $tag
361
  * @param string $name
362
  * @param associative_array $options
363
  * - field_type string optional one of: text, number, radio, dropdown, date, address, phone, url, imageurl, zip, birthday - defaults to text
364
  * - req boolean optional indicates whether the field is required - defaults to false
365
  * - public boolean optional indicates whether the field is displayed in public - defaults to true
366
  * - show boolean optional indicates whether the field is displayed in the app's list member view - defaults to true
367
  * - order int The order this merge tag should be displayed in - this will cause existing values to be reset so this fits
368
  * - default_value string optional the default value for the field. See lists/subscribe() for formatting info. Defaults to blank - max 255 bytes
369
  * - helptext string optional the help text to be used with some newer forms. Defaults to blank - max 255 bytes
370
  * - choices array optional kind of - an array of strings to use as the choices for radio and dropdown type fields
371
  * - dateformat string optional only valid for birthday and date fields. For birthday type, must be "MM/DD" (default) or "DD/MM". For date type, must be "MM/DD/YYYY" (default) or "DD/MM/YYYY". Any other values will be converted to the default.
372
  * - phoneformat string optional "US" is the default - any other value will cause them to be unformatted (international)
373
  * - defaultcountry string optional the <a href="http://www.iso.org/iso/english_country_names_and_code_elements" target="_blank">ISO 3166 2 digit character code</a> for the default country. Defaults to "US". Anything unrecognized will be converted to the default.
374
  * @return associative_array the full data for the new merge var, just like merge-vars returns
375
  * - name string Name/description of the merge field
376
  * - req bool Denotes whether the field is required (true) or not (false)
377
  * - field_type string The "data type" of this merge var. One of: email, text, number, radio, dropdown, date, address, phone, url, imageurl
378
  * - public bool Whether or not this field is visible to list subscribers
379
  * - show bool Whether the field is displayed in thelist dashboard
380
  * - order string The order this field displays in on forms
381
  * - default string The default value for this field
382
  * - helptext string The helptext for this field
383
  * - size string The width of the field to be used
384
  * - tag string The merge tag that's used for forms and lists/subscribe() and lists/update-member()
385
  * - choices array the options available for radio and dropdown field types
386
  * - id int an unchanging id for the merge var
387
  */
388
  public function mergeVarAdd($id, $tag, $name, $options=array()) {
389
  $_params = array("id" => $id, "tag" => $tag, "name" => $name, "options" => $options);
390
  return $this->master->call('lists/merge-var-add', $_params);
391
  }
392
  /**
393
  * Delete a merge tag from a given list and all its members. Seriously - the data is removed from all members as well!
394
  * @param string $id
395
  * @param string $tag
396
  * @return associative_array with a single entry:
397
  * - complete bool whether the call worked. reallistically this will always be true as errors will be thrown otherwise.
398
  */
399
  public function mergeVarDel($id, $tag) {
400
  $_params = array("id" => $id, "tag" => $tag);
401
  return $this->master->call('lists/merge-var-del', $_params);
402
  }
403
  /**
404
  * Completely resets all data stored in a merge var on a list. All data is removed and this action can not be undone.
405
  * @param string $id
406
  * @param string $tag
407
  * @return associative_array with a single entry:
408
  * - complete bool whether the call worked. reallistically this will always be true as errors will be thrown otherwise.
409
  */
410
  public function mergeVarReset($id, $tag) {
411
  $_params = array("id" => $id, "tag" => $tag);
412
  return $this->master->call('lists/merge-var-reset', $_params);
413
  }
414
  /**
415
  * Sets a particular merge var to the specified value for every list member. Only merge var ids 1 - 30 may be modified this way. This is generally a dirty method
416
  * @param string $id
417
  * @param string $tag
418
  * @param string $value
419
  * @return associative_array with a single entry:
420
  * - complete bool whether the call worked. reallistically this will always be true as errors will be thrown otherwise.
421
  */
422
  public function mergeVarSet($id, $tag, $value) {
423
  $_params = array("id" => $id, "tag" => $tag, "value" => $value);
424
  return $this->master->call('lists/merge-var-set', $_params);
425
  }
426
  /**
427
  * Update most parameters for a merge tag on a given list. You cannot currently change the merge type
428
  * @param string $id
429
  * @param string $tag
430
  * @param associative_array $options
431
  * @return associative_array the full data for the new merge var, just like merge-vars returns
432
  * - name string Name/description of the merge field
433
  * - req bool Denotes whether the field is required (true) or not (false)
434
  * - field_type string The "data type" of this merge var. One of: email, text, number, radio, dropdown, date, address, phone, url, imageurl
435
  * - public bool Whether or not this field is visible to list subscribers
436
  * - show bool Whether the field is displayed in thelist dashboard
437
  * - order string The order this field to displays in on forms
438
  * - default string The default value for this field
439
  * - helptext string The helptext for this field
440
  * - size string The width of the field to be used
441
  * - tag string The merge tag that's used for forms and lists/subscribe() and lists/update-member()
442
  * - choices array the options available for radio and dropdown field types
443
  * - id int an unchanging id for the merge var
444
  */
445
  public function mergeVarUpdate($id, $tag, $options) {
446
  $_params = array("id" => $id, "tag" => $tag, "options" => $options);
447
  return $this->master->call('lists/merge-var-update', $_params);
448
  }
449
  /**
450
  * Get the list of merge tags for a given list, including their name, tag, and required setting
451
  * @param array $id
452
  * @return associative_array of data and success/error counts
453
  * - success_count int the number of subscribers successfully found on the list
454
  * - error_count int the number of subscribers who were not found on the list
455
  * - data array of structs for the merge tags on each list
456
  * - id string the list id
457
  * - name string the list name
458
  * - merge_vars array of structs for each merge var
459
  * - name string Name of the merge field
460
  * - req bool Denotes whether the field is required (true) or not (false)
461
  * - field_type string The "data type" of this merge var. One of the options accepted by field_type in lists/merge-var-add
462
  * - public bool Whether or not this field is visible to list subscribers
463
  * - show bool Whether the list owner has this field displayed on their list dashboard
464
  * - order string The order the list owner has set this field to display in
465
  * - default string The default value the list owner has set for this field
466
  * - helptext string The helptext for this field
467
  * - size string The width of the field to be used
468
  * - tag string The merge tag that's used for forms and lists/subscribe() and listUpdateMember()
469
  * - choices array For radio and dropdown field types, an array of the options available
470
  * - id int an unchanging id for the merge var
471
  * - errors array of error structs
472
  * - id string the passed list id that failed
473
  * - code int the resulting error code
474
  * - msg string the resulting error message
475
  */
476
  public function mergeVars($id) {
477
  $_params = array("id" => $id);
478
  return $this->master->call('lists/merge-vars', $_params);
479
  }
480
  /**
481
  * Retrieve all of Segments for a list.
482
  * @param string $id
483
  * @param string $type
484
  * @return associative_array with 2 keys:
485
  * - static array of structs with data for each segment
486
  * - id int the id of the segment
487
  * - name string the name for the segment
488
  * - created_date string the date+time the segment was created
489
  * - last_update string the date+time the segment was last updated (add or del)
490
  * - last_reset string the date+time the segment was last reset (ie had all members cleared from it)
491
  * - saved array of structs with data for each segment
492
  * - id int the id of the segment
493
  * - name string the name for the segment
494
  * - segment_opts string same match+conditions struct typically used
495
  * - segment_text string a textual description of the segment match/conditions
496
  * - created_date string the date+time the segment was created
497
  * - last_update string the date+time the segment was last updated (add or del)
498
  */
499
  public function segments($id, $type=null) {
500
  $_params = array("id" => $id, "type" => $type);
501
  return $this->master->call('lists/segments', $_params);
502
  }
503
  /**
504
  * Save a segment against a list for later use. There is no limit to the number of segments which can be saved. Static Segments <strong>are not</strong> tied
505
  * @param string $id
506
  * @param associative_array $opts
507
  * - type string either "static" or "saved"
508
  * - name string a unique name per list for the segment - 100 byte maximum length, anything longer will throw an error
509
  * - segment_opts associative_array for "saved" only, the standard segment match+conditions, just like campaigns/segment-test
510
  * - match string "any" or "all"
511
  * - conditions array structs for each condition, just like campaigns/segment-test
512
  * @return associative_array with a single entry:
513
  * - id int the id of the new segment, otherwise an error will be thrown.
514
  */
515
  public function segmentAdd($id, $opts) {
516
  $_params = array("id" => $id, "opts" => $opts);
517
  return $this->master->call('lists/segment-add', $_params);
518
  }
519
  /**
520
  * Delete a segment. Note that this will, of course, remove any member affiliations with any static segments deleted
521
  * @param string $id
522
  * @param int $seg_id
523
  * @return associative_array with a single entry:
524
  * - complete bool whether the call worked. reallistically this will always be true as errors will be thrown otherwise.
525
  */
526
  public function segmentDel($id, $seg_id) {
527
  $_params = array("id" => $id, "seg_id" => $seg_id);
528
  return $this->master->call('lists/segment-del', $_params);
529
  }
530
  /**
531
  * Allows one to test their segmentation rules before creating a campaign using them - this is no different from campaigns/segment-test() and will eventually replace it.
532
  * @param string $list_id
533
  * @param associative_array $options
534
  * @return associative_array with a single entry:
535
  * - total int The total number of subscribers matching your segmentation options
536
  */
537
  public function segmentTest($list_id, $options) {
538
  $_params = array("list_id" => $list_id, "options" => $options);
539
  return $this->master->call('lists/segment-test', $_params);
540
  }
541
  /**
542
  * Update an existing segment. The list and type can not be changed.
543
  * @param string $id
544
  * @param int $seg_id
545
  * @param associative_array $opts
546
  * - name string a unique name per list for the segment - 100 byte maximum length, anything longer will throw an error
547
  * - segment_opts associative_array for "saved" only, the standard segment match+conditions, just like campaigns/segment-test
548
  * - match string "any" or "all"
549
  * - conditions array structs for each condition, just like campaigns/segment-test
550
  * @return associative_array with a single entry:
551
  * - complete bool whether the call worked. reallistically this will always be true as errors will be thrown otherwise.
552
  */
553
  public function segmentUpdate($id, $seg_id, $opts) {
554
  $_params = array("id" => $id, "seg_id" => $seg_id, "opts" => $opts);
555
  return $this->master->call('lists/segment-update', $_params);
556
  }
557
  /**
558
  * Save a segment against a list for later use. There is no limit to the number of segments which can be saved. Static Segments <strong>are not</strong> tied
559
  * @param string $id
560
  * @param string $name
561
  * @return associative_array with a single entry:
562
  * - id int the id of the new segment, otherwise an error will be thrown.
563
  */
564
  public function staticSegmentAdd($id, $name) {
565
  $_params = array("id" => $id, "name" => $name);
566
  return $this->master->call('lists/static-segment-add', $_params);
567
  }
568
  /**
569
  * Delete a static segment. Note that this will, of course, remove any member affiliations with the segment
570
  * @param string $id
571
  * @param int $seg_id
572
  * @return associative_array with a single entry:
573
  * - complete bool whether the call worked. reallistically this will always be true as errors will be thrown otherwise.
574
  */
575
  public function staticSegmentDel($id, $seg_id) {
576
  $_params = array("id" => $id, "seg_id" => $seg_id);
577
  return $this->master->call('lists/static-segment-del', $_params);
578
  }
579
  /**
580
  * Add list members to a static segment. It is suggested that you limit batch size to no more than 10,000 addresses per call. Email addresses must exist on the list
581
  * @param string $id
582
  * @param int $seg_id
583
  * @param array $batch
584
  * - email string an email address
585
  * - euid string the unique id for an email address (not list related) - the email "id" returned from lists/member-info(), Webhooks, Campaigns, etc.
586
  * - leid string the list email id (previously called web_id) for a list-member-info type call. this doesn't change when the email address changes
587
  * @return associative_array an array with the results of the operation
588
  * - success_count int the total number of successful updates (will include members already in the segment)
589
  * - error_count int the total number of errors
590
  * - errors array structs for each error including:
591
  * - email string whatever was passed in the email parameter
592
  * - email string the email address added
593
  * - euid string the email unique id
594
  * - leid string the list member's truly unique id
595
  * - code string the error code
596
  * - error string the full error message
597
  */
598
  public function staticSegmentMembersAdd($id, $seg_id, $batch) {
599
  $_params = array("id" => $id, "seg_id" => $seg_id, "batch" => $batch);
600
  return $this->master->call('lists/static-segment-members-add', $_params);
601
  }
602
  /**
603
  * Remove list members from a static segment. It is suggested that you limit batch size to no more than 10,000 addresses per call. Email addresses must exist on the list
604
  * @param string $id
605
  * @param int $seg_id
606
  * @param array $batch
607
  * - email string an email address
608
  * - euid string the unique id for an email address (not list related) - the email "id" returned from listMemberInfo, Webhooks, Campaigns, etc.
609
  * - leid string the list email id (previously called web_id) for a list-member-info type call. this doesn't change when the email address changes
610
  * @return associative_array an array with the results of the operation
611
  * - success_count int the total number of successful removals
612
  * - error_count int the total number of unsuccessful removals
613
  * - errors array structs for each error including:
614
  * - email string whatever was passed in the email parameter
615
  * - email string the email address added
616
  * - euid string the email unique id
617
  * - leid string the list member's truly unique id
618
  * - code string the error code
619
  * - error string the full error message
620
  */
621
  public function staticSegmentMembersDel($id, $seg_id, $batch) {
622
  $_params = array("id" => $id, "seg_id" => $seg_id, "batch" => $batch);
623
  return $this->master->call('lists/static-segment-members-del', $_params);
624
  }
625
  /**
626
  * Resets a static segment - removes <strong>all</strong> members from the static segment. Note: does not actually affect list member data
627
  * @param string $id
628
  * @param int $seg_id
629
  * @return associative_array with a single entry:
630
  * - complete bool whether the call worked. reallistically this will always be true as errors will be thrown otherwise.
631
  */
632
  public function staticSegmentReset($id, $seg_id) {
633
  $_params = array("id" => $id, "seg_id" => $seg_id);
634
  return $this->master->call('lists/static-segment-reset', $_params);
635
  }
636
  /**
637
  * Retrieve all of the Static Segments for a list.
638
  * @param string $id
639
  * @param boolean $get_counts
640
  * @param int $start
641
  * @param int $limit
642
  * @return array an of structs with data for each static segment
643
  * - id int the id of the segment
644
  * - name string the name for the segment
645
  * - member_count int the total number of subscribed members currently in a segment
646
  * - created_date string the date+time the segment was created
647
  * - last_update string the date+time the segment was last updated (add or del)
648
  * - last_reset string the date+time the segment was last reset (ie had all members cleared from it)
649
  */
650
  public function staticSegments($id, $get_counts=true, $start=0, $limit=null) {
651
  $_params = array("id" => $id, "get_counts" => $get_counts, "start" => $start, "limit" => $limit);
652
  return $this->master->call('lists/static-segments', $_params);
653
  }
654
  /**
655
  * Subscribe the provided email to a list. By default this sends a confirmation email - you will not see new members until the link contained in it is clicked!
656
  * @param string $id
657
  * @param associative_array $email
658
  * - email string an email address - for new subscribers obviously this should be used
659
  * - euid string the unique id for an email address (not list related) - the email "id" returned from listMemberInfo, Webhooks, Campaigns, etc.
660
  * - leid string the list email id (previously called web_id) for a list-member-info type call. this doesn't change when the email address changes
661
  * @param associative_array $merge_vars
662
  * - new-email string set this to change the email address. This is only respected on calls using update_existing or when passed to lists/update.
663
  * - groupings array of Interest Grouping structs. Each should contain:
664
  * - id int Grouping "id" from lists/interest-groupings (either this or name must be present) - this id takes precedence and can't change (unlike the name)
665
  * - name string Grouping "name" from lists/interest-groupings (either this or id must be present)
666
  * - groups array an array of valid group names for this grouping.
667
  * - optin_ip string Set the Opt-in IP field. <em>Abusing this may cause your account to be suspended.</em> We do validate this and it must not be a private IP address.
668
  * - optin_time string Set the Opt-in Time field. <em>Abusing this may cause your account to be suspended.</em> We do validate this and it must be a valid date. Use - 24 hour format in <strong>GMT</strong>, eg "2013-12-30 20:30:00" to be safe. Generally, though, anything strtotime() understands we'll understand - <a href="http://us2.php.net/strtotime" target="_blank">http://us2.php.net/strtotime</a>
669
  * - mc_location associative_array Set the member's geographic location either by optin_ip or geo data.
670
  * - latitude string use the specified latitude (longitude must exist for this to work)
671
  * - longitude string use the specified longitude (latitude must exist for this to work)
672
  * - anything string if this (or any other key exists here) we'll try to use the optin ip. NOTE - this will slow down each subscribe call a bit, especially for lat/lng pairs in sparsely populated areas. Currently our automated background processes can and will overwrite this based on opens and clicks.
673
  * - mc_language string Set the member's language preference. Supported codes are fully case-sensitive and can be found <a href="http://kb.mailchimp.com/article/can-i-see-what-languages-my-subscribers-use#code" target="_new">here</a>.
674
  * - mc_notes array of structs for managing notes - it may contain:
675
  * - note string the note to set. this is required unless you're deleting a note
676
  * - id int the note id to operate on. not including this (or using an invalid id) causes a new note to be added
677
  * - action string if the "id" key exists and is valid, an "update" key may be set to "append" (default), "prepend", "replace", or "delete" to handle how we should update existing notes. "delete", obviously, will only work with a valid "id" - passing that along with "note" and an invalid "id" is wrong and will be ignored.
678
  * @param string $email_type
679
  * @param bool $double_optin
680
  * @param bool $update_existing
681
  * @param bool $replace_interests
682
  * @param bool $send_welcome
683
  * @return associative_array the ids for this subscriber
684
  * - email string the email address added
685
  * - euid string the email unique id
686
  * - leid string the list member's truly unique id
687
  */
688
  public function subscribe($id, $email, $merge_vars=null, $email_type='html', $double_optin=true, $update_existing=false, $replace_interests=true, $send_welcome=false) {
689
  $_params = array("id" => $id, "email" => $email, "merge_vars" => $merge_vars, "email_type" => $email_type, "double_optin" => $double_optin, "update_existing" => $update_existing, "replace_interests" => $replace_interests, "send_welcome" => $send_welcome);
690
  return $this->master->call('lists/subscribe', $_params);
691
  }
692
  /**
693
  * Unsubscribe the given email address from the list
694
  * @param string $id
695
  * @param associative_array $email
696
  * - email string an email address
697
  * - euid string the unique id for an email address (not list related) - the email "id" returned from listMemberInfo, Webhooks, Campaigns, etc.
698
  * - leid string the list email id (previously called web_id) for a list-member-info type call. this doesn't change when the email address changes
699
  * @param boolean $delete_member
700
  * @param boolean $send_goodbye
701
  * @param boolean $send_notify
702
  * @return associative_array with a single entry:
703
  * - complete bool whether the call worked. reallistically this will always be true as errors will be thrown otherwise.
704
  */
705
  public function unsubscribe($id, $email, $delete_member=false, $send_goodbye=true, $send_notify=true) {
706
  $_params = array("id" => $id, "email" => $email, "delete_member" => $delete_member, "send_goodbye" => $send_goodbye, "send_notify" => $send_notify);
707
  return $this->master->call('lists/unsubscribe', $_params);
708
  }
709
  /**
710
  * Edit the email address, merge fields, and interest groups for a list member. If you are doing a batch update on lots of users,
711
  * @param string $id
712
  * @param associative_array $email
713
  * - email string an email address
714
  * - euid string the unique id for an email address (not list related) - the email "id" returned from listMemberInfo, Webhooks, Campaigns, etc.
715
  * - leid string the list email id (previously called web_id) for a list-member-info type call. this doesn't change when the email address changes
716
  * @param associative_array $merge_vars
717
  * @param string $email_type
718
  * @param boolean $replace_interests
719
  * @return associative_array the ids for this subscriber
720
  * - email string the email address added
721
  * - euid string the email unique id
722
  * - leid string the list member's truly unique id
723
  */
724
  public function updateMember($id, $email, $merge_vars, $email_type='', $replace_interests=true) {
725
  $_params = array("id" => $id, "email" => $email, "merge_vars" => $merge_vars, "email_type" => $email_type, "replace_interests" => $replace_interests);
726
  return $this->master->call('lists/update-member', $_params);
727
  }
728
  /**
729
  * Add a new Webhook URL for the given list
730
  * @param string $id
731
  * @param string $url
732
  * @param associative_array $actions
733
  * - subscribe bool optional as subscribes occur, defaults to true
734
  * - unsubscribe bool optional as subscribes occur, defaults to true
735
  * - profile bool optional as profile updates occur, defaults to true
736
  * - cleaned bool optional as emails are cleaned from the list, defaults to true
737
  * - upemail bool optional when subscribers change their email address, defaults to true
738
  * - campaign bool option when a campaign is sent or canceled, defaults to true
739
  * @param associative_array $sources
740
  * - user bool optional user/subscriber initiated actions, defaults to true
741
  * - admin bool optional admin actions in our web app, defaults to true
742
  * - api bool optional actions that happen via API calls, defaults to false
743
  * @return associative_array with a single entry:
744
  * - id int the id of the new webhook, otherwise an error will be thrown.
745
  */
746
  public function webhookAdd($id, $url, $actions=array(), $sources=array()) {
747
  $_params = array("id" => $id, "url" => $url, "actions" => $actions, "sources" => $sources);
748
  return $this->master->call('lists/webhook-add', $_params);
749
  }
750
  /**
751
  * Delete an existing Webhook URL from a given list
752
  * @param string $id
753
  * @param string $url
754
  * @return associative_array with a single entry:
755
  * - complete bool whether the call worked. reallistically this will always be true as errors will be thrown otherwise.
756
  */
757
  public function webhookDel($id, $url) {
758
  $_params = array("id" => $id, "url" => $url);
759
  return $this->master->call('lists/webhook-del', $_params);
760
  }
761
  /**
762
  * Return the Webhooks configured for the given list
763
  * @param string $id
764
  * @return array of structs for each webhook
765
  * - url string the URL for this Webhook
766
  * - actions associative_array the possible actions and whether they are enabled
767
  * - subscribe bool triggered when subscribes happen
768
  * - unsubscribe bool triggered when unsubscribes happen
769
  * - profile bool triggered when profile updates happen
770
  * - cleaned bool triggered when a subscriber is cleaned (bounced) from a list
771
  * - upemail bool triggered when a subscriber's email address is changed
772
  * - campaign bool triggered when a campaign is sent or canceled
773
  * - sources associative_array the possible sources and whether they are enabled
774
  * - user bool whether user/subscriber triggered actions are returned
775
  * - admin bool whether admin (manual, in-app) triggered actions are returned
776
  * - api bool whether api triggered actions are returned
777
  */
778
  public function webhooks($id) {
779
  $_params = array("id" => $id);
780
  return $this->master->call('lists/webhooks', $_params);
781
  }
782
  /**
783
  * Retrieve all of the lists defined for your user account
784
  * @param associative_array $filters
785
  * - list_id string optional - return a single list using a known list_id. Accepts multiples separated by commas when not using exact matching
786
  * - list_name string optional - only lists that match this name
787
  * - from_name string optional - only lists that have a default from name matching this
788
  * - from_email string optional - only lists that have a default from email matching this
789
  * - from_subject string optional - only lists that have a default from email matching this
790
  * - created_before string optional - only show lists that were created before this date+time - 24 hour format in <strong>GMT</strong>, eg "2013-12-30 20:30:00"
791
  * - created_after string optional - only show lists that were created since this date+time - 24 hour format in <strong>GMT</strong>, eg "2013-12-30 20:30:00"
792
  * - exact boolean optional - flag for whether to filter on exact values when filtering, or search within content for filter values - defaults to false
793
  * @param int $start
794
  * @param int $limit
795
  * @param string $sort_field
796
  * @param string $sort_dir
797
  * @return associative_array result of the operation including valid data and any errors
798
  * - total int the total number of lists which matched the provided filters
799
  * - data array structs for the lists which matched the provided filters, including the following
800
  * - id string The list id for this list. This will be used for all other list management functions.
801
  * - web_id int The list id used in our web app, allows you to create a link directly to it
802
  * - name string The name of the list.
803
  * - date_created string The date that this list was created.
804
  * - email_type_option boolean Whether or not the List supports multiple formats for emails or just HTML
805
  * - use_awesomebar boolean Whether or not campaigns for this list use the Awesome Bar in archives by default
806
  * - default_from_name string Default From Name for campaigns using this list
807
  * - default_from_email string Default From Email for campaigns using this list
808
  * - default_subject string Default Subject Line for campaigns using this list
809
  * - default_language string Default Language for this list's forms
810
  * - list_rating double An auto-generated activity score for the list (0 - 5)
811
  * - subscribe_url_short string Our eepurl shortened version of this list's subscribe form (will not change)
812
  * - subscribe_url_long string The full version of this list's subscribe form (host will vary)
813
  * - beamer_address string The email address to use for this list's <a href="http://kb.mailchimp.com/article/how-do-i-import-a-campaign-via-email-email-beamer/">Email Beamer</a>
814
  * - visibility string Whether this list is Public (pub) or Private (prv). Used internally for projects like <a href="http://blog.mailchimp.com/introducing-wavelength/" target="_blank">Wavelength</a>
815
  * - stats associative_array various stats and counts for the list - many of these are cached for at least 5 minutes
816
  * - member_count double The number of active members in the given list.
817
  * - unsubscribe_count double The number of members who have unsubscribed from the given list.
818
  * - cleaned_count double The number of members cleaned from the given list.
819
  * - member_count_since_send double The number of active members in the given list since the last campaign was sent
820
  * - unsubscribe_count_since_send double The number of members who have unsubscribed from the given list since the last campaign was sent
821
  * - cleaned_count_since_send double The number of members cleaned from the given list since the last campaign was sent
822
  * - campaign_count double The number of campaigns in any status that use this list
823
  * - grouping_count double The number of Interest Groupings for this list
824
  * - group_count double The number of Interest Groups (regardless of grouping) for this list
825
  * - merge_var_count double The number of merge vars for this list (not including the required EMAIL one)
826
  * - avg_sub_rate double the average number of subscribe per month for the list (empty value if we haven't calculated this yet)
827
  * - avg_unsub_rate double the average number of unsubscribe per month for the list (empty value if we haven't calculated this yet)
828
  * - target_sub_rate double the target subscription rate for the list to keep it growing (empty value if we haven't calculated this yet)
829
  * - open_rate double the average open rate per campaign for the list (empty value if we haven't calculated this yet)
830
  * - click_rate double the average click rate per campaign for the list (empty value if we haven't calculated this yet)
831
  * - modules array Any list specific modules installed for this list (example is SocialPro)
832
  * - errors array structs of any errors found while loading lists - usually just from providing invalid list ids
833
  * - param string the data that caused the failure
834
  * - code int the error code
835
  * - error string the error message
836
  */
837
  public function getList($filters=array(), $start=0, $limit=25, $sort_field='created', $sort_dir='DESC') {
838
  $_params = array("filters" => $filters, "start" => $start, "limit" => $limit, "sort_field" => $sort_field, "sort_dir" => $sort_dir);
839
  return $this->master->call('lists/list', $_params);
840
  }
 
0
  public function __construct(Mailchimp $master) {
1
  $this->master = $master;
2
  }
3
  /**
4
  * Get all email addresses that complained about a campaign sent to a list
5
  * @param string $id
6
  * @param int $start
7
  * @param int $limit
8
  * @param string $since
9
  * @return associative_array the total of all reports and the specific reports reports this page
10
  * - total int the total number of matching abuse reports
11
  * - data array structs for the actual data for each reports, including:
12
  * - date string date+time the abuse report was received and processed
13
  * - email string the email address that reported abuse
14
  * - campaign_id string the unique id for the campaign that report was made against
15
  * - type string an internal type generally specifying the originating mail provider - may not be useful outside of filling report views
16
  */
17
  public function abuseReports($id, $start=0, $limit=500, $since=null) {
18
  $_params = array("id" => $id, "start" => $start, "limit" => $limit, "since" => $since);
19
  return $this->master->call('lists/abuse-reports', $_params);
20
  }
21
  /**
22
  * Access up to the previous 180 days of daily detailed aggregated activity stats for a given list. Does not include AutoResponder activity.
23
  * @param string $id
24
  * @return array of structs containing daily values, each containing:
25
  */
26
  public function activity($id) {
27
  $_params = array("id" => $id);
28
  return $this->master->call('lists/activity', $_params);
29
  }
30
  /**
31
  * Subscribe a batch of email addresses to a list at once. If you are using a serialized version of the API, we strongly suggest that you
32
  * @param string $id
33
  * @param array $batch
34
  * - email associative_array a struct with one of the following keys - failing to provide anything will produce an error relating to the email address. Provide multiples and we'll use the first we see in this same order.
35
  * - email string an email address
36
  * - euid string the unique id for an email address (not list related) - the email "id" returned from listMemberInfo, Webhooks, Campaigns, etc.
37
  * - leid string the list email id (previously called web_id) for a list-member-info type call. this doesn't change when the email address changes
38
  * - email_type string for the email type option (html or text)
39
  * - merge_vars associative_array data for the various list specific and special merge vars documented in lists/subscribe
40
  * @param boolean $double_optin
41
  * @param boolean $update_existing
42
  * @param boolean $replace_interests
43
  * @return associative_array struct of result counts and associated data
44
  * - add_count int Number of email addresses that were successfully added
45
  * - adds array array of structs for each add
46
  * - email string the email address added
47
  * - euid string the email unique id
48
  * - leid string the list member's truly unique id
49
  * - update_count int Number of email addresses that were successfully updated
50
  * - updates array array of structs for each update
51
  * - email string the email address added
52
  * - euid string the email unique id
53
  * - leid string the list member's truly unique id
54
  * - error_count int Number of email addresses that failed during addition/updating
55
  * - errors array array of error structs including:
56
  * - email string whatever was passed in the batch record's email parameter
57
  * - email string the email address added
58
  * - euid string the email unique id
59
  * - leid string the list member's truly unique id
60
  * - code int the error code
61
  * - error string the full error message
62
  * - row associative_array the row from the batch that caused the error
63
  */
64
  public function batchSubscribe($id, $batch, $double_optin=true, $update_existing=false, $replace_interests=true) {
65
  $_params = array("id" => $id, "batch" => $batch, "double_optin" => $double_optin, "update_existing" => $update_existing, "replace_interests" => $replace_interests);
66
  return $this->master->call('lists/batch-subscribe', $_params);
67
  }
68
  /**
69
  * Unsubscribe a batch of email addresses from a list
70
  * @param string $id
71
  * @param array $batch
72
  * - email string an email address
73
  * - euid string the unique id for an email address (not list related) - the email "id" returned from listMemberInfo, Webhooks, Campaigns, etc.
74
  * - leid string the list email id (previously called web_id) for a list-member-info type call. this doesn't change when the email address changes
75
  * @param boolean $delete_member
76
  * @param boolean $send_goodbye
77
  * @param boolean $send_notify
78
  * @return array Array of structs containing results and any errors that occurred
79
  * - success_count int Number of email addresses that were successfully removed
80
  * - error_count int Number of email addresses that failed during addition/updating
81
  * - errors array array of error structs including:
82
  * - email string whatever was passed in the batch record's email parameter
83
  * - email string the email address added
84
  * - euid string the email unique id
85
  * - leid string the list member's truly unique id
86
  * - code int the error code
87
  * - error string the full error message
88
  */
89
  public function batchUnsubscribe($id, $batch, $delete_member=false, $send_goodbye=true, $send_notify=false) {
90
  $_params = array("id" => $id, "batch" => $batch, "delete_member" => $delete_member, "send_goodbye" => $send_goodbye, "send_notify" => $send_notify);
91
  return $this->master->call('lists/batch-unsubscribe', $_params);
92
  }
93
  /**
94
  * Retrieve the clients that the list's subscribers have been tagged as being used based on user agents seen. Made possible by <a href="http://user-agent-string.info" target="_blank">user-agent-string.info</a>
95
  * @param string $id
96
  * @return associative_array the desktop and mobile user agents in use on the list
97
  * - desktop associative_array desktop user agents and percentages
98
  * - penetration double the percent of desktop clients in use
99
  * - clients array array of structs for each client including:
100
  * - client string the common name for the client
101
  * - icon string a url to an image representing this client
102
  * - percent string percent of list using the client
103
  * - members string total members using the client
104
  * - mobile associative_array mobile user agents and percentages
105
  * - penetration double the percent of mobile clients in use
106
  * - clients array array of structs for each client including:
107
  * - client string the common name for the client
108
  * - icon string a url to an image representing this client
109
  * - percent string percent of list using the client
110
  * - members string total members using the client
111
  */
112
  public function clients($id) {
113
  $_params = array("id" => $id);
114
  return $this->master->call('lists/clients', $_params);
115
  }
116
  /**
117
  * Access the Growth History by Month in aggregate or for a given list.
118
  * @param string $id
119
  * @return array array of structs containing months and growth data
120
  * - month string The Year and Month in question using YYYY-MM format
121
  * - existing int number of existing subscribers to start the month
122
  * - imports int number of subscribers imported during the month
123
  * - optins int number of subscribers who opted-in during the month
124
  */
125
  public function growthHistory($id=null) {
126
  $_params = array("id" => $id);
127
  return $this->master->call('lists/growth-history', $_params);
128
  }
129
  /**
130
  * Get the list of interest groupings for a given list, including the label, form information, and included groups for each
131
  * @param string $id
132
  * @param bool $counts
133
  * @return array array of structs of the interest groupings for the list
134
  * - id int The id for the Grouping
135
  * - name string Name for the Interest groups
136
  * - form_field string Gives the type of interest group: checkbox,radio,select
137
  * - groups array Array structs of the grouping options (interest groups) including:
138
  * - bit string the bit value - not really anything to be done with this
139
  * - name string the name of the group
140
  * - display_order string the display order of the group, if set
141
  * - subscribers int total number of subscribers who have this group if "counts" is true. otherwise empty
142
  */
143
  public function interestGroupings($id, $counts=false) {
144
  $_params = array("id" => $id, "counts" => $counts);
145
  return $this->master->call('lists/interest-groupings', $_params);
146
  }
147
  /**
148
  * Add a single Interest Group - if interest groups for the List are not yet enabled, adding the first
149
  * @param string $id
150
  * @param string $group_name
151
  * @param int $grouping_id
152
  * @return associative_array with a single entry:
153
  * - complete bool whether the call worked. reallistically this will always be true as errors will be thrown otherwise.
154
  */
155
  public function interestGroupAdd($id, $group_name, $grouping_id=null) {
156
  $_params = array("id" => $id, "group_name" => $group_name, "grouping_id" => $grouping_id);
157
  return $this->master->call('lists/interest-group-add', $_params);
158
  }
159
  /**
160
  * Delete a single Interest Group - if the last group for a list is deleted, this will also turn groups for the list off.
161
  * @param string $id
162
  * @param string $group_name
163
  * @param int $grouping_id
164
  * @return associative_array with a single entry:
165
  * - complete bool whether the call worked. reallistically this will always be true as errors will be thrown otherwise.
166
  */
167
  public function interestGroupDel($id, $group_name, $grouping_id=null) {
168
  $_params = array("id" => $id, "group_name" => $group_name, "grouping_id" => $grouping_id);
169
  return $this->master->call('lists/interest-group-del', $_params);
170
  }
171
  /**
172
  * Change the name of an Interest Group
173
  * @param string $id
174
  * @param string $old_name
175
  * @param string $new_name
176
  * @param int $grouping_id
177
  * @return associative_array with a single entry:
178
  * - complete bool whether the call worked. reallistically this will always be true as errors will be thrown otherwise.
179
  */
180
  public function interestGroupUpdate($id, $old_name, $new_name, $grouping_id=null) {
181
  $_params = array("id" => $id, "old_name" => $old_name, "new_name" => $new_name, "grouping_id" => $grouping_id);
182
  return $this->master->call('lists/interest-group-update', $_params);
183
  }
184
  /**
185
  * Add a new Interest Grouping - if interest groups for the List are not yet enabled, adding the first
186
  * @param string $id
187
  * @param string $name
188
  * @param string $type
189
  * @param array $groups
190
  * @return associative_array with a single entry:
191
  * - id int the new grouping id if the request succeeds, otherwise an error will be thrown
192
  */
193
  public function interestGroupingAdd($id, $name, $type, $groups) {
194
  $_params = array("id" => $id, "name" => $name, "type" => $type, "groups" => $groups);
195
  return $this->master->call('lists/interest-grouping-add', $_params);
196
  }
197
  /**
198
  * Delete an existing Interest Grouping - this will permanently delete all contained interest groups and will remove those selections from all list members
199
  * @param int $grouping_id
200
  * @return associative_array with a single entry:
201
  * - complete bool whether the call worked. reallistically this will always be true as errors will be thrown otherwise.
202
  */
203
  public function interestGroupingDel($grouping_id) {
204
  $_params = array("grouping_id" => $grouping_id);
205
  return $this->master->call('lists/interest-grouping-del', $_params);
206
  }
207
  /**
208
  * Update an existing Interest Grouping
209
  * @param int $grouping_id
210
  * @param string $name
211
  * @param string $value
212
  * @return associative_array with a single entry:
213
  * - complete bool whether the call worked. reallistically this will always be true as errors will be thrown otherwise.
214
  */
215
  public function interestGroupingUpdate($grouping_id, $name, $value) {
216
  $_params = array("grouping_id" => $grouping_id, "name" => $name, "value" => $value);
217
  return $this->master->call('lists/interest-grouping-update', $_params);
218
  }
219
  /**
220
  * Retrieve the locations (countries) that the list's subscribers have been tagged to based on geocoding their IP address
221
  * @param string $id
222
  * @return array array of locations
223
  * - country string the country name
224
  * - cc string the ISO 3166 2 digit country code
225
  * - percent double the percent of subscribers in the country
226
  * - total double the total number of subscribers in the country
227
  */
228
  public function locations($id) {
229
  $_params = array("id" => $id);
230
  return $this->master->call('lists/locations', $_params);
231
  }
232
  /**
233
  * Get the most recent 100 activities for particular list members (open, click, bounce, unsub, abuse, sent to, etc.)
234
  * @param string $id
235
  * @param array $emails
236
  * - email string an email address - for new subscribers obviously this should be used
237
  * - euid string the unique id for an email address (not list related) - the email "id" returned from listMemberInfo, Webhooks, Campaigns, etc.
238
  * - leid string the list email id (previously called web_id) for a list-member-info type call. this doesn't change when the email address changes
239
  * @return associative_array of data and success/error counts
240
  * - success_count int the number of subscribers successfully found on the list
241
  * - error_count int the number of subscribers who were not found on the list
242
  * - errors array array of error structs including:
243
  * - email string whatever was passed in the email parameter
244
  * - email string the email address added
245
  * - euid string the email unique id
246
  * - leid string the list member's truly unique id
247
  * - error string the error message
248
  * - code string the error code
249
  * - data array an array of structs where each activity record has:
250
  * - email string whatever was passed in the email parameter
251
  * - email string the email address added
252
  * - euid string the email unique id
253
  * - leid string the list member's truly unique id
254
  * - activity array an array of structs containing the activity, including:
255
  * - action string The action name, one of: open, click, bounce, unsub, abuse, sent, queued, ecomm, mandrill_send, mandrill_hard_bounce, mandrill_soft_bounce, mandrill_open, mandrill_click, mandrill_spam, mandrill_unsub, mandrill_reject
256
  * - timestamp string The date+time of the action (GMT)
257
  * - url string For click actions, the url clicked, otherwise this is empty
258
  * - type string If there's extra bounce, unsub, etc data it will show up here.
259
  * - campaign_id string The campaign id the action was related to, if it exists - otherwise empty (ie, direct unsub from list)
260
  * - campaign_data associative_array If not deleted, the campaigns/list data for the campaign
261
  */
262
  public function memberActivity($id, $emails) {
263
  $_params = array("id" => $id, "emails" => $emails);
264
  return $this->master->call('lists/member-activity', $_params);
265
  }
266
  /**
267
  * Get all the information for particular members of a list
268
  * @param string $id
269
  * @param array $emails
270
  * - email string an email address - for new subscribers obviously this should be used
271
  * - euid string the unique id for an email address (not list related) - the email "id" returned from listMemberInfo, Webhooks, Campaigns, etc.
272
  * - leid string the list email id (previously called web_id) for a list-member-info type call. this doesn't change when the email address changes
273
  * @return associative_array of data and success/error counts
274
  * - success_count int the number of subscribers successfully found on the list
275
  * - error_count int the number of subscribers who were not found on the list
276
  * - errors array array of error structs including:
277
  * - email associative_array whatever was passed in the email parameter
278
  * - email string the email address added
279
  * - euid string the email unique id
280
  * - leid string the list member's truly unique id
281
  * - error string the error message
282
  * - data array array of structs for each valid list member
283
  * - id string The unique id (euid) for this email address on an account
284
  * - email string The email address associated with this record
285
  * - email_type string The type of emails this customer asked to get: html or text
286
  * - merges associative_array a struct containing a key for each merge tags and the data for those tags for this email address, plus:
287
  * - GROUPINGS array if Interest groupings are enabled, this will exist with structs for each grouping:
288
  * - id int the grouping id
289
  * - name string the interest group name
290
  * - groups array structs for each group in the grouping
291
  * - name string the group name
292
  * - interested bool whether the member has this group selected
293
  * - status string The subscription status for this email address, either pending, subscribed, unsubscribed, or cleaned
294
  * - ip_signup string IP Address this address signed up from. This may be blank if single optin is used.
295
  * - timestamp_signup string The date+time the double optin was initiated. This may be blank if single optin is used.
296
  * - ip_opt string IP Address this address opted in from.
297
  * - timestamp_opt string The date+time the optin completed
298
  * - member_rating int the rating of the subscriber. This will be 1 - 5 as described <a href="http://eepurl.com/f-2P" target="_blank">here</a>
299
  * - campaign_id string If the user is unsubscribed and they unsubscribed from a specific campaign, that campaign_id will be listed, otherwise this is not returned.
300
  * - lists array An array of structs for the other lists this member belongs to
301
  * - id string the list id
302
  * - status string the members status on that list
303
  * - timestamp string The date+time this email address entered it's current status
304
  * - info_changed string The last time this record was changed. If the record is old enough, this may be blank.
305
  * - web_id int The Member id used in our web app, allows you to create a link directly to it
306
  * - leid int The Member id used in our web app, allows you to create a link directly to it
307
  * - list_id string The list id the for the member record being returned
308
  * - list_name string The list name the for the member record being returned
309
  * - language string if set/detected, a language code from <a href="http://kb.mailchimp.com/article/can-i-see-what-languages-my-subscribers-use#code" target="_blank">here</a>
310
  * - is_gmonkey bool Whether the member is a <a href="http://mailchimp.com/features/golden-monkeys/" target="_blank">Golden Monkey</a> or not.
311
  * - geo associative_array the geographic information if we have it. including:
312
  * - latitude string the latitude
313
  * - longitude string the longitude
314
  * - gmtoff string GMT offset
315
  * - dstoff string GMT offset during daylight savings (if DST not observered, will be same as gmtoff)
316
  * - timezone string the timezone we've place them in
317
  * - cc string 2 digit ISO-3166 country code
318
  * - region string generally state, province, or similar
319
  * - clients associative_array the client we've tracked the address as using with two keys:
320
  * - name string the common name of the client
321
  * - icon_url string a url representing a path to an icon representing this client
322
  * - static_segments array structs for each static segments the member is a part of including:
323
  * - id int the segment id
324
  * - name string the name given to the segment
325
  * - added string the date the member was added
326
  * - notes array structs for each note entered for this member. For each note:
327
  * - id int the note id
328
  * - note string the text entered
329
  * - created string the date the note was created
330
  * - updated string the date the note was last updated
331
  * - created_by_name string the name of the user who created the note. This can change as users update their profile.
332
  */
333
  public function memberInfo($id, $emails) {
334
  $_params = array("id" => $id, "emails" => $emails);
335
  return $this->master->call('lists/member-info', $_params);
336
  }
337
  /**
338
  * Get all of the list members for a list that are of a particular status and potentially matching a segment. This will cause locking, so don't run multiples at once. Are you trying to get a dump including lots of merge
339
  * @param string $id
340
  * @param string $status
341
  * @param associative_array $opts
342
  * - start int optional for large data sets, the page number to start at - defaults to 1st page of data (page 0)
343
  * - limit int optional for large data sets, the number of results to return - defaults to 25, upper limit set at 100
344
  * - sort_field string optional the data field to sort by - mergeX (1-30), your custom merge tags, "email", "rating","last_update_time", or "optin_time" - invalid fields will be ignored
345
  * - sort_dir string optional the direct - ASC or DESC. defaults to ASC (case insensitive)
346
  * - segment associative_array a properly formatted segment that works with campaigns/segment-test
347
  * @return associative_array of the total records matched and limited list member data for this page
348
  * - total int the total matching records
349
  * - data array structs for each member as returned by member-info
350
  */
351
  public function members($id, $status='subscribed', $opts=array()) {
352
  $_params = array("id" => $id, "status" => $status, "opts" => $opts);
353
  return $this->master->call('lists/members', $_params);
354
  }
355
  /**
356
  * Add a new merge tag to a given list
357
  * @param string $id
358
  * @param string $tag
359
  * @param string $name
360
  * @param associative_array $options
361
  * - field_type string optional one of: text, number, radio, dropdown, date, address, phone, url, imageurl, zip, birthday - defaults to text
362
  * - req boolean optional indicates whether the field is required - defaults to false
363
  * - public boolean optional indicates whether the field is displayed in public - defaults to true
364
  * - show boolean optional indicates whether the field is displayed in the app's list member view - defaults to true
365
  * - order int The order this merge tag should be displayed in - this will cause existing values to be reset so this fits
366
  * - default_value string optional the default value for the field. See lists/subscribe() for formatting info. Defaults to blank - max 255 bytes
367
  * - helptext string optional the help text to be used with some newer forms. Defaults to blank - max 255 bytes
368
  * - choices array optional kind of - an array of strings to use as the choices for radio and dropdown type fields
369
  * - dateformat string optional only valid for birthday and date fields. For birthday type, must be "MM/DD" (default) or "DD/MM". For date type, must be "MM/DD/YYYY" (default) or "DD/MM/YYYY". Any other values will be converted to the default.
370
  * - phoneformat string optional "US" is the default - any other value will cause them to be unformatted (international)
371
  * - defaultcountry string optional the <a href="http://www.iso.org/iso/english_country_names_and_code_elements" target="_blank">ISO 3166 2 digit character code</a> for the default country. Defaults to "US". Anything unrecognized will be converted to the default.
372
  * @return associative_array the full data for the new merge var, just like merge-vars returns
373
  * - name string Name/description of the merge field
374
  * - req bool Denotes whether the field is required (true) or not (false)
375
  * - field_type string The "data type" of this merge var. One of: email, text, number, radio, dropdown, date, address, phone, url, imageurl
376
  * - public bool Whether or not this field is visible to list subscribers
377
  * - show bool Whether the field is displayed in thelist dashboard
378
  * - order string The order this field displays in on forms
379
  * - default string The default value for this field
380
  * - helptext string The helptext for this field
381
  * - size string The width of the field to be used
382
  * - tag string The merge tag that's used for forms and lists/subscribe() and lists/update-member()
383
  * - choices array the options available for radio and dropdown field types
384
  * - id int an unchanging id for the merge var
385
  */
386
  public function mergeVarAdd($id, $tag, $name, $options=array()) {
387
  $_params = array("id" => $id, "tag" => $tag, "name" => $name, "options" => $options);
388
  return $this->master->call('lists/merge-var-add', $_params);
389
  }
390
  /**
391
  * Delete a merge tag from a given list and all its members. Seriously - the data is removed from all members as well!
392
  * @param string $id
393
  * @param string $tag
394
  * @return associative_array with a single entry:
395
  * - complete bool whether the call worked. reallistically this will always be true as errors will be thrown otherwise.
396
  */
397
  public function mergeVarDel($id, $tag) {
398
  $_params = array("id" => $id, "tag" => $tag);
399
  return $this->master->call('lists/merge-var-del', $_params);
400
  }
401
  /**
402
  * Completely resets all data stored in a merge var on a list. All data is removed and this action can not be undone.
403
  * @param string $id
404
  * @param string $tag
405
  * @return associative_array with a single entry:
406
  * - complete bool whether the call worked. reallistically this will always be true as errors will be thrown otherwise.
407
  */
408
  public function mergeVarReset($id, $tag) {
409
  $_params = array("id" => $id, "tag" => $tag);
410
  return $this->master->call('lists/merge-var-reset', $_params);
411
  }
412
  /**
413
  * Sets a particular merge var to the specified value for every list member. Only merge var ids 1 - 30 may be modified this way. This is generally a dirty method
414
  * @param string $id
415
  * @param string $tag
416
  * @param string $value
417
  * @return associative_array with a single entry:
418
  * - complete bool whether the call worked. reallistically this will always be true as errors will be thrown otherwise.
419
  */
420
  public function mergeVarSet($id, $tag, $value) {
421
  $_params = array("id" => $id, "tag" => $tag, "value" => $value);
422
  return $this->master->call('lists/merge-var-set', $_params);
423
  }
424
  /**
425
  * Update most parameters for a merge tag on a given list. You cannot currently change the merge type
426
  * @param string $id
427
  * @param string $tag
428
  * @param associative_array $options
429
  * @return associative_array the full data for the new merge var, just like merge-vars returns
430
  * - name string Name/description of the merge field
431
  * - req bool Denotes whether the field is required (true) or not (false)
432
  * - field_type string The "data type" of this merge var. One of: email, text, number, radio, dropdown, date, address, phone, url, imageurl
433
  * - public bool Whether or not this field is visible to list subscribers
434
  * - show bool Whether the field is displayed in thelist dashboard
435
  * - order string The order this field to displays in on forms
436
  * - default string The default value for this field
437
  * - helptext string The helptext for this field
438
  * - size string The width of the field to be used
439
  * - tag string The merge tag that's used for forms and lists/subscribe() and lists/update-member()
440
  * - choices array the options available for radio and dropdown field types
441
  * - id int an unchanging id for the merge var
442
  */
443
  public function mergeVarUpdate($id, $tag, $options) {
444
  $_params = array("id" => $id, "tag" => $tag, "options" => $options);
445
  return $this->master->call('lists/merge-var-update', $_params);
446
  }
447
  /**
448
  * Get the list of merge tags for a given list, including their name, tag, and required setting
449
  * @param array $id
450
  * @return associative_array of data and success/error counts
451
  * - success_count int the number of subscribers successfully found on the list
452
  * - error_count int the number of subscribers who were not found on the list
453
  * - data array of structs for the merge tags on each list
454
  * - id string the list id
455
  * - name string the list name
456
  * - merge_vars array of structs for each merge var
457
  * - name string Name of the merge field
458
  * - req bool Denotes whether the field is required (true) or not (false)
459
  * - field_type string The "data type" of this merge var. One of the options accepted by field_type in lists/merge-var-add
460
  * - public bool Whether or not this field is visible to list subscribers
461
  * - show bool Whether the list owner has this field displayed on their list dashboard
462
  * - order string The order the list owner has set this field to display in
463
  * - default string The default value the list owner has set for this field
464
  * - helptext string The helptext for this field
465
  * - size string The width of the field to be used
466
  * - tag string The merge tag that's used for forms and lists/subscribe() and listUpdateMember()
467
  * - choices array For radio and dropdown field types, an array of the options available
468
  * - id int an unchanging id for the merge var
469
  * - errors array of error structs
470
  * - id string the passed list id that failed
471
  * - code int the resulting error code
472
  * - msg string the resulting error message
473
  */
474
  public function mergeVars($id) {
475
  $_params = array("id" => $id);
476
  return $this->master->call('lists/merge-vars', $_params);
477
  }
478
  /**
479
  * Retrieve all of Segments for a list.
480
  * @param string $id
481
  * @param string $type
482
  * @return associative_array with 2 keys:
483
  * - static array of structs with data for each segment
484
  * - id int the id of the segment
485
  * - name string the name for the segment
486
  * - created_date string the date+time the segment was created
487
  * - last_update string the date+time the segment was last updated (add or del)
488
  * - last_reset string the date+time the segment was last reset (ie had all members cleared from it)
489
  * - saved array of structs with data for each segment
490
  * - id int the id of the segment
491
  * - name string the name for the segment
492
  * - segment_opts string same match+conditions struct typically used
493
  * - segment_text string a textual description of the segment match/conditions
494
  * - created_date string the date+time the segment was created
495
  * - last_update string the date+time the segment was last updated (add or del)
496
  */
497
  public function segments($id, $type=null) {
498
  $_params = array("id" => $id, "type" => $type);
499
  return $this->master->call('lists/segments', $_params);
500
  }
501
  /**
502
  * Save a segment against a list for later use. There is no limit to the number of segments which can be saved. Static Segments <strong>are not</strong> tied
503
  * @param string $id
504
  * @param associative_array $opts
505
  * - type string either "static" or "saved"
506
  * - name string a unique name per list for the segment - 100 byte maximum length, anything longer will throw an error
507
  * - segment_opts associative_array for "saved" only, the standard segment match+conditions, just like campaigns/segment-test
508
  * - match string "any" or "all"
509
  * - conditions array structs for each condition, just like campaigns/segment-test
510
  * @return associative_array with a single entry:
511
  * - id int the id of the new segment, otherwise an error will be thrown.
512
  */
513
  public function segmentAdd($id, $opts) {
514
  $_params = array("id" => $id, "opts" => $opts);
515
  return $this->master->call('lists/segment-add', $_params);
516
  }
517
  /**
518
  * Delete a segment. Note that this will, of course, remove any member affiliations with any static segments deleted
519
  * @param string $id
520
  * @param int $seg_id
521
  * @return associative_array with a single entry:
522
  * - complete bool whether the call worked. reallistically this will always be true as errors will be thrown otherwise.
523
  */
524
  public function segmentDel($id, $seg_id) {
525
  $_params = array("id" => $id, "seg_id" => $seg_id);
526
  return $this->master->call('lists/segment-del', $_params);
527
  }
528
  /**
529
  * Allows one to test their segmentation rules before creating a campaign using them - this is no different from campaigns/segment-test() and will eventually replace it.
530
  * @param string $list_id
531
  * @param associative_array $options
532
  * @return associative_array with a single entry:
533
  * - total int The total number of subscribers matching your segmentation options
534
  */
535
  public function segmentTest($list_id, $options) {
536
  $_params = array("list_id" => $list_id, "options" => $options);
537
  return $this->master->call('lists/segment-test', $_params);
538
  }
539
  /**
540
  * Update an existing segment. The list and type can not be changed.
541
  * @param string $id
542
  * @param int $seg_id
543
  * @param associative_array $opts
544
  * - name string a unique name per list for the segment - 100 byte maximum length, anything longer will throw an error
545
  * - segment_opts associative_array for "saved" only, the standard segment match+conditions, just like campaigns/segment-test
546
  * - match string "any" or "all"
547
  * - conditions array structs for each condition, just like campaigns/segment-test
548
  * @return associative_array with a single entry:
549
  * - complete bool whether the call worked. reallistically this will always be true as errors will be thrown otherwise.
550
  */
551
  public function segmentUpdate($id, $seg_id, $opts) {
552
  $_params = array("id" => $id, "seg_id" => $seg_id, "opts" => $opts);
553
  return $this->master->call('lists/segment-update', $_params);
554
  }
555
  /**
556
  * Save a segment against a list for later use. There is no limit to the number of segments which can be saved. Static Segments <strong>are not</strong> tied
557
  * @param string $id
558
  * @param string $name
559
  * @return associative_array with a single entry:
560
  * - id int the id of the new segment, otherwise an error will be thrown.
561
  */
562
  public function staticSegmentAdd($id, $name) {
563
  $_params = array("id" => $id, "name" => $name);
564
  return $this->master->call('lists/static-segment-add', $_params);
565
  }
566
  /**
567
  * Delete a static segment. Note that this will, of course, remove any member affiliations with the segment
568
  * @param string $id
569
  * @param int $seg_id
570
  * @return associative_array with a single entry:
571
  * - complete bool whether the call worked. reallistically this will always be true as errors will be thrown otherwise.
572
  */
573
  public function staticSegmentDel($id, $seg_id) {
574
  $_params = array("id" => $id, "seg_id" => $seg_id);
575
  return $this->master->call('lists/static-segment-del', $_params);
576
  }
577
  /**
578
  * Add list members to a static segment. It is suggested that you limit batch size to no more than 10,000 addresses per call. Email addresses must exist on the list
579
  * @param string $id
580
  * @param int $seg_id
581
  * @param array $batch
582
  * - email string an email address
583
  * - euid string the unique id for an email address (not list related) - the email "id" returned from lists/member-info(), Webhooks, Campaigns, etc.
584
  * - leid string the list email id (previously called web_id) for a list-member-info type call. this doesn't change when the email address changes
585
  * @return associative_array an array with the results of the operation
586
  * - success_count int the total number of successful updates (will include members already in the segment)
587
  * - error_count int the total number of errors
588
  * - errors array structs for each error including:
589
  * - email string whatever was passed in the email parameter
590
  * - email string the email address added
591
  * - euid string the email unique id
592
  * - leid string the list member's truly unique id
593
  * - code string the error code
594
  * - error string the full error message
595
  */
596
  public function staticSegmentMembersAdd($id, $seg_id, $batch) {
597
  $_params = array("id" => $id, "seg_id" => $seg_id, "batch" => $batch);
598
  return $this->master->call('lists/static-segment-members-add', $_params);
599
  }
600
  /**
601
  * Remove list members from a static segment. It is suggested that you limit batch size to no more than 10,000 addresses per call. Email addresses must exist on the list
602
  * @param string $id
603
  * @param int $seg_id
604
  * @param array $batch
605
  * - email string an email address
606
  * - euid string the unique id for an email address (not list related) - the email "id" returned from listMemberInfo, Webhooks, Campaigns, etc.
607
  * - leid string the list email id (previously called web_id) for a list-member-info type call. this doesn't change when the email address changes
608
  * @return associative_array an array with the results of the operation
609
  * - success_count int the total number of successful removals
610
  * - error_count int the total number of unsuccessful removals
611
  * - errors array structs for each error including:
612
  * - email string whatever was passed in the email parameter
613
  * - email string the email address added
614
  * - euid string the email unique id
615
  * - leid string the list member's truly unique id
616
  * - code string the error code
617
  * - error string the full error message
618
  */
619
  public function staticSegmentMembersDel($id, $seg_id, $batch) {
620
  $_params = array("id" => $id, "seg_id" => $seg_id, "batch" => $batch);
621
  return $this->master->call('lists/static-segment-members-del', $_params);
622
  }
623
  /**
624
  * Resets a static segment - removes <strong>all</strong> members from the static segment. Note: does not actually affect list member data
625
  * @param string $id
626
  * @param int $seg_id
627
  * @return associative_array with a single entry:
628
  * - complete bool whether the call worked. reallistically this will always be true as errors will be thrown otherwise.
629
  */
630
  public function staticSegmentReset($id, $seg_id) {
631
  $_params = array("id" => $id, "seg_id" => $seg_id);
632
  return $this->master->call('lists/static-segment-reset', $_params);
633
  }
634
  /**
635
  * Retrieve all of the Static Segments for a list.
636
  * @param string $id
637
  * @param boolean $get_counts
638
  * @param int $start
639
  * @param int $limit
640
  * @return array an of structs with data for each static segment
641
  * - id int the id of the segment
642
  * - name string the name for the segment
643
  * - member_count int the total number of subscribed members currently in a segment
644
  * - created_date string the date+time the segment was created
645
  * - last_update string the date+time the segment was last updated (add or del)
646
  * - last_reset string the date+time the segment was last reset (ie had all members cleared from it)
647
  */
648
  public function staticSegments($id, $get_counts=true, $start=0, $limit=null) {
649
  $_params = array("id" => $id, "get_counts" => $get_counts, "start" => $start, "limit" => $limit);
650
  return $this->master->call('lists/static-segments', $_params);
651
  }
652
  /**
653
  * Subscribe the provided email to a list. By default this sends a confirmation email - you will not see new members until the link contained in it is clicked!
654
  * @param string $id
655
  * @param associative_array $email
656
  * - email string an email address - for new subscribers obviously this should be used
657
  * - euid string the unique id for an email address (not list related) - the email "id" returned from listMemberInfo, Webhooks, Campaigns, etc.
658
  * - leid string the list email id (previously called web_id) for a list-member-info type call. this doesn't change when the email address changes
659
  * @param associative_array $merge_vars
660
  * - new-email string set this to change the email address. This is only respected on calls using update_existing or when passed to lists/update.
661
  * - groupings array of Interest Grouping structs. Each should contain:
662
  * - id int Grouping "id" from lists/interest-groupings (either this or name must be present) - this id takes precedence and can't change (unlike the name)
663
  * - name string Grouping "name" from lists/interest-groupings (either this or id must be present)
664
  * - groups array an array of valid group names for this grouping.
665
  * - optin_ip string Set the Opt-in IP field. <em>Abusing this may cause your account to be suspended.</em> We do validate this and it must not be a private IP address.
666
  * - optin_time string Set the Opt-in Time field. <em>Abusing this may cause your account to be suspended.</em> We do validate this and it must be a valid date. Use - 24 hour format in <strong>GMT</strong>, eg "2013-12-30 20:30:00" to be safe. Generally, though, anything strtotime() understands we'll understand - <a href="http://us2.php.net/strtotime" target="_blank">http://us2.php.net/strtotime</a>
667
  * - mc_location associative_array Set the member's geographic location either by optin_ip or geo data.
668
  * - latitude string use the specified latitude (longitude must exist for this to work)
669
  * - longitude string use the specified longitude (latitude must exist for this to work)
670
  * - anything string if this (or any other key exists here) we'll try to use the optin ip. NOTE - this will slow down each subscribe call a bit, especially for lat/lng pairs in sparsely populated areas. Currently our automated background processes can and will overwrite this based on opens and clicks.
671
  * - mc_language string Set the member's language preference. Supported codes are fully case-sensitive and can be found <a href="http://kb.mailchimp.com/article/can-i-see-what-languages-my-subscribers-use#code" target="_new">here</a>.
672
  * - mc_notes array of structs for managing notes - it may contain:
673
  * - note string the note to set. this is required unless you're deleting a note
674
  * - id int the note id to operate on. not including this (or using an invalid id) causes a new note to be added
675
  * - action string if the "id" key exists and is valid, an "update" key may be set to "append" (default), "prepend", "replace", or "delete" to handle how we should update existing notes. "delete", obviously, will only work with a valid "id" - passing that along with "note" and an invalid "id" is wrong and will be ignored.
676
  * @param string $email_type
677
  * @param bool $double_optin
678
  * @param bool $update_existing
679
  * @param bool $replace_interests
680
  * @param bool $send_welcome
681
  * @return associative_array the ids for this subscriber
682
  * - email string the email address added
683
  * - euid string the email unique id
684
  * - leid string the list member's truly unique id
685
  */
686
  public function subscribe($id, $email, $merge_vars=null, $email_type='html', $double_optin=true, $update_existing=false, $replace_interests=true, $send_welcome=false) {
687
  $_params = array("id" => $id, "email" => $email, "merge_vars" => $merge_vars, "email_type" => $email_type, "double_optin" => $double_optin, "update_existing" => $update_existing, "replace_interests" => $replace_interests, "send_welcome" => $send_welcome);
688
  return $this->master->call('lists/subscribe', $_params);
689
  }
690
  /**
691
  * Unsubscribe the given email address from the list
692
  * @param string $id
693
  * @param associative_array $email
694
  * - email string an email address
695
  * - euid string the unique id for an email address (not list related) - the email "id" returned from listMemberInfo, Webhooks, Campaigns, etc.
696
  * - leid string the list email id (previously called web_id) for a list-member-info type call. this doesn't change when the email address changes
697
  * @param boolean $delete_member
698
  * @param boolean $send_goodbye
699
  * @param boolean $send_notify
700
  * @return associative_array with a single entry:
701
  * - complete bool whether the call worked. reallistically this will always be true as errors will be thrown otherwise.
702
  */
703
  public function unsubscribe($id, $email, $delete_member=false, $send_goodbye=true, $send_notify=true) {
704
  $_params = array("id" => $id, "email" => $email, "delete_member" => $delete_member, "send_goodbye" => $send_goodbye, "send_notify" => $send_notify);
705
  return $this->master->call('lists/unsubscribe', $_params);
706
  }
707
  /**
708
  * Edit the email address, merge fields, and interest groups for a list member. If you are doing a batch update on lots of users,
709
  * @param string $id
710
  * @param associative_array $email
711
  * - email string an email address
712
  * - euid string the unique id for an email address (not list related) - the email "id" returned from listMemberInfo, Webhooks, Campaigns, etc.
713
  * - leid string the list email id (previously called web_id) for a list-member-info type call. this doesn't change when the email address changes
714
  * @param associative_array $merge_vars
715
  * @param string $email_type
716
  * @param boolean $replace_interests
717
  * @return associative_array the ids for this subscriber
718
  * - email string the email address added
719
  * - euid string the email unique id
720
  * - leid string the list member's truly unique id
721
  */
722
  public function updateMember($id, $email, $merge_vars, $email_type='', $replace_interests=true) {
723
  $_params = array("id" => $id, "email" => $email, "merge_vars" => $merge_vars, "email_type" => $email_type, "replace_interests" => $replace_interests);
724
  return $this->master->call('lists/update-member', $_params);
725
  }
726
  /**
727
  * Add a new Webhook URL for the given list
728
  * @param string $id
729
  * @param string $url
730
  * @param associative_array $actions
731
  * - subscribe bool optional as subscribes occur, defaults to true
732
  * - unsubscribe bool optional as subscribes occur, defaults to true
733
  * - profile bool optional as profile updates occur, defaults to true
734
  * - cleaned bool optional as emails are cleaned from the list, defaults to true
735
  * - upemail bool optional when subscribers change their email address, defaults to true
736
  * - campaign bool option when a campaign is sent or canceled, defaults to true
737
  * @param associative_array $sources
738
  * - user bool optional user/subscriber initiated actions, defaults to true
739
  * - admin bool optional admin actions in our web app, defaults to true
740
  * - api bool optional actions that happen via API calls, defaults to false
741
  * @return associative_array with a single entry:
742
  * - id int the id of the new webhook, otherwise an error will be thrown.
743
  */
744
  public function webhookAdd($id, $url, $actions=array(), $sources=array()) {
745
  $_params = array("id" => $id, "url" => $url, "actions" => $actions, "sources" => $sources);
746
  return $this->master->call('lists/webhook-add', $_params);
747
  }
748
  /**
749
  * Delete an existing Webhook URL from a given list
750
  * @param string $id
751
  * @param string $url
752
  * @return associative_array with a single entry:
753
  * - complete bool whether the call worked. reallistically this will always be true as errors will be thrown otherwise.
754
  */
755
  public function webhookDel($id, $url) {
756
  $_params = array("id" => $id, "url" => $url);
757
  return $this->master->call('lists/webhook-del', $_params);
758
  }
759
  /**
760
  * Return the Webhooks configured for the given list
761
  * @param string $id
762
  * @return array of structs for each webhook
763
  * - url string the URL for this Webhook
764
  * - actions associative_array the possible actions and whether they are enabled
765
  * - subscribe bool triggered when subscribes happen
766
  * - unsubscribe bool triggered when unsubscribes happen
767
  * - profile bool triggered when profile updates happen
768
  * - cleaned bool triggered when a subscriber is cleaned (bounced) from a list
769
  * - upemail bool triggered when a subscriber's email address is changed
770
  * - campaign bool triggered when a campaign is sent or canceled
771
  * - sources associative_array the possible sources and whether they are enabled
772
  * - user bool whether user/subscriber triggered actions are returned
773
  * - admin bool whether admin (manual, in-app) triggered actions are returned
774
  * - api bool whether api triggered actions are returned
775
  */
776
  public function webhooks($id) {
777
  $_params = array("id" => $id);
778
  return $this->master->call('lists/webhooks', $_params);
779
  }
780
  /**
781
  * Retrieve all of the lists defined for your user account
782
  * @param associative_array $filters
783
  * - list_id string optional - return a single list using a known list_id. Accepts multiples separated by commas when not using exact matching
784
  * - list_name string optional - only lists that match this name
785
  * - from_name string optional - only lists that have a default from name matching this
786
  * - from_email string optional - only lists that have a default from email matching this
787
  * - from_subject string optional - only lists that have a default from email matching this
788
  * - created_before string optional - only show lists that were created before this date+time - 24 hour format in <strong>GMT</strong>, eg "2013-12-30 20:30:00"
789
  * - created_after string optional - only show lists that were created since this date+time - 24 hour format in <strong>GMT</strong>, eg "2013-12-30 20:30:00"
790
  * - exact boolean optional - flag for whether to filter on exact values when filtering, or search within content for filter values - defaults to false
791
  * @param int $start
792
  * @param int $limit
793
  * @param string $sort_field
794
  * @param string $sort_dir
795
  * @return associative_array result of the operation including valid data and any errors
796
  * - total int the total number of lists which matched the provided filters
797
  * - data array structs for the lists which matched the provided filters, including the following
798
  * - id string The list id for this list. This will be used for all other list management functions.
799
  * - web_id int The list id used in our web app, allows you to create a link directly to it
800
  * - name string The name of the list.
801
  * - date_created string The date that this list was created.
802
  * - email_type_option boolean Whether or not the List supports multiple formats for emails or just HTML
803
  * - use_awesomebar boolean Whether or not campaigns for this list use the Awesome Bar in archives by default
804
  * - default_from_name string Default From Name for campaigns using this list
805
  * - default_from_email string Default From Email for campaigns using this list
806
  * - default_subject string Default Subject Line for campaigns using this list
807
  * - default_language string Default Language for this list's forms
808
  * - list_rating double An auto-generated activity score for the list (0 - 5)
809
  * - subscribe_url_short string Our eepurl shortened version of this list's subscribe form (will not change)
810
  * - subscribe_url_long string The full version of this list's subscribe form (host will vary)
811
  * - beamer_address string The email address to use for this list's <a href="http://kb.mailchimp.com/article/how-do-i-import-a-campaign-via-email-email-beamer/">Email Beamer</a>
812
  * - visibility string Whether this list is Public (pub) or Private (prv). Used internally for projects like <a href="http://blog.mailchimp.com/introducing-wavelength/" target="_blank">Wavelength</a>
813
  * - stats associative_array various stats and counts for the list - many of these are cached for at least 5 minutes
814
  * - member_count double The number of active members in the given list.
815
  * - unsubscribe_count double The number of members who have unsubscribed from the given list.
816
  * - cleaned_count double The number of members cleaned from the given list.
817
  * - member_count_since_send double The number of active members in the given list since the last campaign was sent
818
  * - unsubscribe_count_since_send double The number of members who have unsubscribed from the given list since the last campaign was sent
819
  * - cleaned_count_since_send double The number of members cleaned from the given list since the last campaign was sent
820
  * - campaign_count double The number of campaigns in any status that use this list
821
  * - grouping_count double The number of Interest Groupings for this list
822
  * - group_count double The number of Interest Groups (regardless of grouping) for this list
823
  * - merge_var_count double The number of merge vars for this list (not including the required EMAIL one)
824
  * - avg_sub_rate double the average number of subscribe per month for the list (empty value if we haven't calculated this yet)
825
  * - avg_unsub_rate double the average number of unsubscribe per month for the list (empty value if we haven't calculated this yet)
826
  * - target_sub_rate double the target subscription rate for the list to keep it growing (empty value if we haven't calculated this yet)
827
  * - open_rate double the average open rate per campaign for the list (empty value if we haven't calculated this yet)
828
  * - click_rate double the average click rate per campaign for the list (empty value if we haven't calculated this yet)
829
  * - modules array Any list specific modules installed for this list (example is SocialPro)
830
  * - errors array structs of any errors found while loading lists - usually just from providing invalid list ids
831
  * - param string the data that caused the failure
832
  * - code int the error code
833
  * - error string the error message
834
  */
835
  public function getList($filters=array(), $start=0, $limit=25, $sort_field='created', $sort_dir='DESC') {
836
  $_params = array("filters" => $filters, "start" => $start, "limit" => $limit, "sort_field" => $sort_field, "sort_dir" => $sort_dir);
837
  return $this->master->call('lists/list', $_params);
838
  }
includes/MailChimp/Mailchimp/Mobile.php DELETED
@@ -1 +0,0 @@
1
- <?php
2
  public function __construct(Mailchimp $master) {
3
  $this->master = $master;
4
  }
 
0
  public function __construct(Mailchimp $master) {
1
  $this->master = $master;
2
  }
includes/MailChimp/Mailchimp/Neapolitan.php DELETED
@@ -1 +0,0 @@
1
- <?php
2
  public function __construct(Mailchimp $master) {
3
  $this->master = $master;
4
  }
 
0
  public function __construct(Mailchimp $master) {
1
  $this->master = $master;
2
  }
includes/MailChimp/Mailchimp/Reports.php DELETED
@@ -1 +0,0 @@
1
- <?php
2
  public function __construct(Mailchimp $master) {
3
  $this->master = $master;
4
  }
5
  /**
6
  * Get all email addresses that complained about a given campaign
7
  * @param string $cid
8
  * @param associative_array $opts
9
  * - start int optional for large data sets, the page number to start at - defaults to 1st page of data (page 0)
10
  * - limit int optional for large data sets, the number of results to return - defaults to 25, upper limit set at 100
11
  * - since string optional pull only messages since this time - 24 hour format in <strong>GMT</strong>, eg "2013-12-30 20:30:00"
12
  * @return associative_array abuse report data for this campaign
13
  * - total int the total reports matched
14
  * - data array a struct for the each report, including:
15
  * - date string date/time the abuse report was received and processed
16
  * - member string the email address that reported abuse - will only contain email if the list or member has been removed
17
  * - type string an internal type generally specifying the originating mail provider - may not be useful outside of filling report views
18
  */
19
  public function abuse($cid, $opts=array()) {
20
  $_params = array("cid" => $cid, "opts" => $opts);
21
  return $this->master->call('reports/abuse', $_params);
22
  }
23
  /**
24
  * Retrieve the text presented in our app for how a campaign performed and any advice we may have for you - best
25
  * @param string $cid
26
  * @return array of structs for advice on the campaign's performance, each containing:
27
  * - msg string the advice message
28
  * - type string the "type" of the message. one of: negative, positive, or neutral
29
  */
30
  public function advice($cid) {
31
  $_params = array("cid" => $cid);
32
  return $this->master->call('reports/advice', $_params);
33
  }
34
  /**
35
  * Retrieve the most recent full bounce message for a specific email address on the given campaign.
36
  * @param string $cid
37
  * @param associative_array $email
38
  * - email string an email address - this is recommended for this method
39
  * - euid string the unique id for an email address (not list related) - the email "id" returned from listMemberInfo, Webhooks, Campaigns, etc.
40
  * - leid string the list email id (previously called web_id) for a list-member-info type call. this doesn't change when the email address changes
41
  * @return associative_array the full bounce message for this email+campaign along with some extra data.
42
  * - date string date the bounce was received and processed
43
  * - member associative_array the member record as returned by lists/member-info()
44
  * - message string the entire bounce message received
45
  */
46
  public function bounceMessage($cid, $email) {
47
  $_params = array("cid" => $cid, "email" => $email);
48
  return $this->master->call('reports/bounce-message', $_params);
49
  }
50
  /**
51
  * Retrieve the full bounce messages for the given campaign. Note that this can return very large amounts
52
  * @param string $cid
53
  * @param associative_array $opts
54
  * - start int optional for large data sets, the page number to start at - defaults to 1st page of data (page 0)
55
  * - limit int optional for large data sets, the number of results to return - defaults to 25, upper limit set at 100
56
  * - since string optional pull only messages since this time - 24 hour format in <strong>GMT</strong>, eg "2013-12-30 20:30:00"
57
  * @return associative_array data for the full bounce messages for this campaign
58
  * - total int that total number of bounce messages for the campaign
59
  * - data array structs containing the data for this page
60
  * - date string date the bounce was received and processed
61
  * - member associative_array the member record as returned by lists/member-info()
62
  * - message string the entire bounce message received
63
  */
64
  public function bounceMessages($cid, $opts=array()) {
65
  $_params = array("cid" => $cid, "opts" => $opts);
66
  return $this->master->call('reports/bounce-messages', $_params);
67
  }
68
  /**
69
  * Return the list of email addresses that clicked on a given url, and how many times they clicked
70
  * @param string $cid
71
  * @param int $tid
72
  * @param associative_array $opts
73
  * - start int optional for large data sets, the page number to start at - defaults to 1st page of data (page 0)
74
  * - limit int optional for large data sets, the number of results to return - defaults to 25, upper limit set at 100
75
  * - sort_field string optional the data to sort by - "clicked" (order clicks occurred, default) or "clicks" (total number of opens). Invalid fields will fall back on the default.
76
  * - sort_dir string optional the direct - ASC or DESC. defaults to ASC (case insensitive)
77
  * @return associative_array containing the total records matched and the specific records for this page
78
  * - total int the total number of records matched
79
  * - data array structs for each email addresses that click the requested url
80
  * - member associative_array the member record as returned by lists/member-info()
81
  * - clicks int Total number of times the URL was clicked by this email address
82
  */
83
  public function clickDetail($cid, $tid, $opts=array()) {
84
  $_params = array("cid" => $cid, "tid" => $tid, "opts" => $opts);
85
  return $this->master->call('reports/click-detail', $_params);
86
  }
87
  /**
88
  * The urls tracked and their click counts for a given campaign.
89
  * @param string $cid
90
  * @return associative_array including:
91
  * - total array structs for each url tracked for the full campaign
92
  * - url string the url being tracked - urls are tracked individually, so duplicates can exist with vastly different stats
93
  * - clicks int Number of times the specific link was clicked
94
  * - clicks_percent double the percentage of total clicks "clicks" represents
95
  * - unique int Number of unique people who clicked on the specific link
96
  * - unique_percent double the percentage of unique clicks "unique" represents
97
  * - tid int the tracking id used in campaign links - used primarily for reports/click-activity. also can be used to order urls by the order they appeared in the campaign to recreate our heat map.
98
  * - a array if this was an absplit campaign, stat structs for the a group
99
  * - url string the url being tracked - urls are tracked individually, so duplicates can exist with vastly different stats
100
  * - clicks int Number of times the specific link was clicked
101
  * - clicks_percent double the percentage of total clicks "clicks" represents
102
  * - unique int Number of unique people who clicked on the specific link
103
  * - unique_percent double the percentage of unique clicks "unique" represents
104
  * - tid int the tracking id used in campaign links - used primarily for reports/click-activity. also can be used to order urls by the order they appeared in the campaign to recreate our heat map.
105
  * - b array if this was an absplit campaign, stat structs for the b group
106
  * - url string the url being tracked - urls are tracked individually, so duplicates can exist with vastly different stats
107
  * - clicks int Number of times the specific link was clicked
108
  * - clicks_percent double the percentage of total clicks "clicks" represents
109
  * - unique int Number of unique people who clicked on the specific link
110
  * - unique_percent double the percentage of unique clicks "unique" represents
111
  * - tid int the tracking id used in campaign links - used primarily for reports/click-activity. also can be used to order urls by the order they appeared in the campaign to recreate our heat map.
112
  */
113
  public function clicks($cid) {
114
  $_params = array("cid" => $cid);
115
  return $this->master->call('reports/clicks', $_params);
116
  }
117
  /**
118
  * Retrieve the Ecommerce Orders tracked by ecomm/order-add()
119
  * @param string $cid
120
  * @param associative_array $opts
121
  * - start int optional for large data sets, the page number to start at - defaults to 1st page of data (page 0)
122
  * - limit int optional for large data sets, the number of results to return - defaults to 25, upper limit set at 100
123
  * - since string optional pull only messages since this time - 24 hour format in <strong>GMT</strong>, eg "2013-12-30 20:30:00"
124
  * @return associative_array the total matching orders and the specific orders for the requested page
125
  * - total int the total matching orders
126
  * - data array structs for the actual data for each order being returned
127
  * - store_id string the store id generated by the plugin used to uniquely identify a store
128
  * - store_name string the store name collected by the plugin - often the domain name
129
  * - order_id string the internal order id the store tracked this order by
130
  * - member associative_array the member record as returned by lists/member-info() that received this campaign and is associated with this order
131
  * - order_total double the order total
132
  * - tax_total double the total tax for the order (if collected)
133
  * - ship_total double the shipping total for the order (if collected)
134
  * - order_date string the date the order was tracked - from the store if possible, otherwise the GMT time we received it
135
  * - lines array structs containing details of the order:
136
  * - line_num int the line number assigned to this line
137
  * - product_id int the product id assigned to this item
138
  * - product_name string the product name
139
  * - product_sku string the sku for the product
140
  * - product_category_id int the id for the product category
141
  * - product_category_name string the product category name
142
  * - qty double optional the quantity of the item ordered - defaults to 1
143
  * - cost double optional the cost of a single item (ie, not the extended cost of the line) - defaults to 0
144
  */
145
  public function ecommOrders($cid, $opts=array()) {
146
  $_params = array("cid" => $cid, "opts" => $opts);
147
  return $this->master->call('reports/ecomm-orders', $_params);
148
  }
149
  /**
150
  * Retrieve the eepurl stats from the web/Twitter mentions for this campaign
151
  * @param string $cid
152
  * @return associative_array containing tweets, retweets, clicks, and referrer related to using the campaign's eepurl
153
  * - twitter associative_array various Twitter related stats
154
  * - tweets int Total number of tweets seen
155
  * - first_tweet string date and time of the first tweet seen
156
  * - last_tweet string date and time of the last tweet seen
157
  * - retweets int Total number of retweets seen
158
  * - first_retweet string date and time of the first retweet seen
159
  * - last_retweet string date and time of the last retweet seen
160
  * - statuses array an structs for statuses recorded including:
161
  * - status string the text of the tweet/update
162
  * - screen_name string the screen name as recorded when first seen
163
  * - status_id string the status id of the tweet (they are really unsigned 64 bit ints)
164
  * - datetime string the date/time of the tweet
165
  * - is_retweet bool whether or not this was a retweet
166
  * - clicks associative_array stats related to click-throughs on the eepurl
167
  * - clicks int Total number of clicks seen
168
  * - first_click string date and time of the first click seen
169
  * - last_click string date and time of the first click seen
170
  * - locations array structs for geographic locations including:
171
  * - country string the country name the click was tracked to
172
  * - region string the region in the country the click was tracked to (if available)
173
  * - referrers array structs for referrers, including
174
  * - referrer string the referrer, truncated to 100 bytes
175
  * - clicks int Total number of clicks seen from this referrer
176
  * - first_click string date and time of the first click seen from this referrer
177
  * - last_click string date and time of the first click seen from this referrer
178
  */
179
  public function eepurl($cid) {
180
  $_params = array("cid" => $cid);
181
  return $this->master->call('reports/eepurl', $_params);
182
  }
183
  /**
184
  * Given a campaign and email address, return the entire click and open history with timestamps, ordered by time. If you need to dump the full activity for a campaign
185
  * @param string $cid
186
  * @param array $emails
187
  * - email string an email address
188
  * - euid string the unique id for an email address (not list related) - the email "id" returned from listMemberInfo, Webhooks, Campaigns, etc.
189
  * - leid string the list email id (previously called web_id) for a list-member-info type call. this doesn't change when the email address changes
190
  * @return associative_array of data and success/error counts
191
  * - success_count int the number of subscribers successfully found on the list
192
  * - error_count int the number of subscribers who were not found on the list
193
  * - errors array array of error structs including:
194
  * - email string whatever was passed in the email parameter
195
  * - email string the email address added
196
  * - euid string the email unique id
197
  * - leid string the list member's truly unique id
198
  * - msg string the error message
199
  * - data array an array of structs where each activity record has:
200
  * - email string whatever was passed in the email parameter
201
  * - email string the email address added
202
  * - euid string the email unique id
203
  * - leid string the list member's truly unique id
204
  * - member associative_array the member record as returned by lists/member-info()
205
  * - activity array an array of structs containing the activity, including:
206
  * - action string The action name - either open or click
207
  * - timestamp string The date/time of the action (GMT)
208
  * - url string For click actions, the url clicked, otherwise this is empty
209
  * - ip string The IP address the activity came from
210
  */
211
  public function memberActivity($cid, $emails) {
212
  $_params = array("cid" => $cid, "emails" => $emails);
213
  return $this->master->call('reports/member-activity', $_params);
214
  }
215
  /**
216
  * Retrieve the list of email addresses that did not open a given campaign
217
  * @param string $cid
218
  * @param associative_array $opts
219
  * - start int optional for large data sets, the page number to start at - defaults to 1st page of data (page 0)
220
  * - limit int optional for large data sets, the number of results to return - defaults to 25, upper limit set at 100
221
  * @return associative_array a total of all matching emails and the specific emails for this page
222
  * - total int the total number of members who didn't open the campaign
223
  * - data array structs for each campaign member matching as returned by lists/member-info()
224
  */
225
  public function notOpened($cid, $opts=array()) {
226
  $_params = array("cid" => $cid, "opts" => $opts);
227
  return $this->master->call('reports/not-opened', $_params);
228
  }
229
  /**
230
  * Retrieve the list of email addresses that opened a given campaign with how many times they opened
231
  * @param string $cid
232
  * @param associative_array $opts
233
  * - start int optional for large data sets, the page number to start at - defaults to 1st page of data (page 0)
234
  * - limit int optional for large data sets, the number of results to return - defaults to 25, upper limit set at 100
235
  * - sort_field string optional the data to sort by - "opened" (order opens occurred, default) or "opens" (total number of opens). Invalid fields will fall back on the default.
236
  * - sort_dir string optional the direct - ASC or DESC. defaults to ASC (case insensitive)
237
  * @return associative_array containing the total records matched and the specific records for this page
238
  * - total int the total number of records matched
239
  * - data array structs for the actual opens data, including:
240
  * - member associative_array the member record as returned by lists/member-info()
241
  * - opens int Total number of times the campaign was opened by this email address
242
  */
243
  public function opened($cid, $opts=array()) {
244
  $_params = array("cid" => $cid, "opts" => $opts);
245
  return $this->master->call('reports/opened', $_params);
246
  }
247
  /**
248
  * Get the top 5 performing email domains for this campaign. Users wanting more than 5 should use campaign reports/member-activity()
249
  * @param string $cid
250
  * @return array domains structs for each email domains and their associated stats
251
  * - domain string Domain name or special "Other" to roll-up stats past 5 domains
252
  * - total_sent int Total Email across all domains - this will be the same in every row
253
  * - emails int Number of emails sent to this domain
254
  * - bounces int Number of bounces
255
  * - opens int Number of opens
256
  * - clicks int Number of clicks
257
  * - unsubs int Number of unsubs
258
  * - delivered int Number of deliveries
259
  * - emails_pct int Percentage of emails that went to this domain (whole number)
260
  * - bounces_pct int Percentage of bounces from this domain (whole number)
261
  * - opens_pct int Percentage of opens from this domain (whole number)
262
  * - clicks_pct int Percentage of clicks from this domain (whole number)
263
  * - unsubs_pct int Percentage of unsubs from this domain (whole number)
264
  */
265
  public function domainPerformance($cid) {
266
  $_params = array("cid" => $cid);
267
  return $this->master->call('reports/domain-performance', $_params);
268
  }
269
  /**
270
  * Retrieve the countries/regions and number of opens tracked for each. Email address are not returned.
271
  * @param string $cid
272
  * @return array an array of country structs where opens occurred
273
  * - code string The ISO3166 2 digit country code
274
  * - name string A version of the country name, if we have it
275
  * - opens int The total number of opens that occurred in the country
276
  * - regions array structs of data for each sub-region in the country
277
  * - code string An internal code for the region. When this is blank, it indicates we know the country, but not the region
278
  * - name string The name of the region, if we have one. For blank "code" values, this will be "Rest of Country"
279
  * - opens int The total number of opens that occurred in the country
280
  */
281
  public function geoOpens($cid) {
282
  $_params = array("cid" => $cid);
283
  return $this->master->call('reports/geo-opens', $_params);
284
  }
285
  /**
286
  * Retrieve the Google Analytics data we've collected for this campaign. Note, requires Google Analytics Add-on to be installed and configured.
287
  * @param string $cid
288
  * @return array of structs for analytics we've collected for the passed campaign.
289
  * - visits int number of visits
290
  * - pages int number of page views
291
  * - new_visits int new visits recorded
292
  * - bounces int vistors who "bounced" from your site
293
  * - time_on_site double the total time visitors spent on your sites
294
  * - goal_conversions int number of goals converted
295
  * - goal_value double value of conversion in dollars
296
  * - revenue double revenue generated by campaign
297
  * - transactions int number of transactions tracked
298
  * - ecomm_conversions int number Ecommerce transactions tracked
299
  * - goals array structs containing goal names and number of conversions
300
  * - name string the name of the goal
301
  * - conversions int the number of conversions for the goal
302
  */
303
  public function googleAnalytics($cid) {
304
  $_params = array("cid" => $cid);
305
  return $this->master->call('reports/google-analytics', $_params);
306
  }
307
  /**
308
  * Get email addresses the campaign was sent to
309
  * @param string $cid
310
  * @param associative_array $opts
311
  * - status string optional the status to pull - one of 'sent', 'hard' (bounce), or 'soft' (bounce). By default, all records are returned
312
  * - start int optional for large data sets, the page number to start at - defaults to 1st page of data (page 0)
313
  * - limit int optional for large data sets, the number of results to return - defaults to 25, upper limit set at 100
314
  * @return associative_array a total of all matching emails and the specific emails for this page
315
  * - total int the total number of members for the campaign and status
316
  * - data array structs for each campaign member matching
317
  * - member associative_array the member record as returned by lists/member-info()
318
  * - status string the status of the send - one of 'sent', 'hard', 'soft'
319
  * - absplit_group string if this was an absplit campaign, one of 'a','b', or 'winner'
320
  * - tz_group string if this was an timewarp campaign the timezone GMT offset the member was included in
321
  */
322
  public function sentTo($cid, $opts=array()) {
323
  $_params = array("cid" => $cid, "opts" => $opts);
324
  return $this->master->call('reports/sent-to', $_params);
325
  }
326
  /**
327
  * Get the URL to a customized <a href="http://eepurl.com/gKmL" target="_blank">VIP Report</a> for the specified campaign and optionally send an email to someone with links to it. Note subsequent calls will overwrite anything already set for the same campign (eg, the password)
328
  * @param string $cid
329
  * @param array $opts
330
  * - to_email string optional - optional, comma delimited list of email addresses to share the report with - no value means an email will not be sent
331
  * - theme_id int optional - either a global or a user-specific theme id. Currently this needs to be pulled out of either the Share Report or Cobranding web views by grabbing the "theme" attribute from the list presented.
332
  * - css_url string optional - a link to an external CSS file to be included after our default CSS (http://vip-reports.net/css/vip.css) <strong>only if</strong> loaded via the "secure_url" - max 255 bytes
333
  * @return associative_array details for the shared report, including:
334
  * - title string The Title of the Campaign being shared
335
  * - url string The URL to the shared report
336
  * - secure_url string The URL to the shared report, including the password (good for loading in an IFRAME). For non-secure reports, this will not be returned
337
  * - password string If secured, the password for the report, otherwise this field will not be returned
338
  */
339
  public function share($cid, $opts=array()) {
340
  $_params = array("cid" => $cid, "opts" => $opts);
341
  return $this->master->call('reports/share', $_params);
342
  }
343
  /**
344
  * Retrieve relevant aggregate campaign statistics (opens, bounces, clicks, etc.)
345
  * @param string $cid
346
  * @return associative_array the statistics for this campaign
347
  * - syntax_errors int Number of email addresses in campaign that had syntactical errors.
348
  * - hard_bounces int Number of email addresses in campaign that hard bounced.
349
  * - soft_bounces int Number of email addresses in campaign that soft bounced.
350
  * - unsubscribes int Number of email addresses in campaign that unsubscribed.
351
  * - abuse_reports int Number of email addresses in campaign that reported campaign for abuse.
352
  * - forwards int Number of times email was forwarded to a friend.
353
  * - forwards_opens int Number of times a forwarded email was opened.
354
  * - opens int Number of times the campaign was opened.
355
  * - last_open string Date of the last time the email was opened.
356
  * - unique_opens int Number of people who opened the campaign.
357
  * - clicks int Number of times a link in the campaign was clicked.
358
  * - unique_clicks int Number of unique recipient/click pairs for the campaign.
359
  * - last_click string Date of the last time a link in the email was clicked.
360
  * - users_who_clicked int Number of unique recipients who clicked on a link in the campaign.
361
  * - emails_sent int Number of email addresses campaign was sent to.
362
  * - unique_likes int total number of unique likes (Facebook)
363
  * - recipient_likes int total number of recipients who liked (Facebook) the campaign
364
  * - facebook_likes int total number of likes (Facebook) that came from Facebook
365
  * - industry associative_array Various rates/percentages for the account's selected industry - empty otherwise. These will vary across calls, do not use them for anything important.
366
  * - type string the selected industry
367
  * - open_rate float industry open rate
368
  * - click_rate float industry click rate
369
  * - bounce_rate float industry bounce rate
370
  * - unopen_rate float industry unopen rate
371
  * - unsub_rate float industry unsub rate
372
  * - abuse_rate float industry abuse rate
373
  * - absplit associative_array If this was an absplit campaign, stats for the A and B groups will be returned - otherwise this is empty
374
  * - bounces_a int bounces for the A group
375
  * - bounces_b int bounces for the B group
376
  * - forwards_a int forwards for the A group
377
  * - forwards_b int forwards for the B group
378
  * - abuse_reports_a int abuse reports for the A group
379
  * - abuse_reports_b int abuse reports for the B group
380
  * - unsubs_a int unsubs for the A group
381
  * - unsubs_b int unsubs for the B group
382
  * - recipients_click_a int clicks for the A group
383
  * - recipients_click_b int clicks for the B group
384
  * - forwards_opens_a int opened forwards for the A group
385
  * - forwards_opens_b int opened forwards for the B group
386
  * - opens_a int total opens for the A group
387
  * - opens_b int total opens for the B group
388
  * - last_open_a string date/time of last open for the A group
389
  * - last_open_b string date/time of last open for the BG group
390
  * - unique_opens_a int unique opens for the A group
391
  * - unique_opens_b int unique opens for the B group
392
  * - timewarp array If this campaign was a Timewarp campaign, an array of structs from each timezone stats exist for. Each will contain:
393
  * - opens int opens for this timezone
394
  * - last_open string the date/time of the last open for this timezone
395
  * - unique_opens int the unique opens for this timezone
396
  * - clicks int the total clicks for this timezone
397
  * - last_click string the date/time of the last click for this timezone
398
  * - unique_clicks int the unique clicks for this timezone
399
  * - bounces int the total bounces for this timezone
400
  * - total int the total number of members sent to in this timezone
401
  * - sent int the total number of members delivered to in this timezone
402
  * - timeseries array structs for the first 24 hours of the campaign, per-hour stats:
403
  * - timestamp string The timestemp in Y-m-d H:00:00 format
404
  * - emails_sent int the total emails sent during the hour
405
  * - unique_opens int unique opens seen during the hour
406
  * - recipients_click int unique clicks seen during the hour
407
  */
408
  public function summary($cid) {
409
  $_params = array("cid" => $cid);
410
  return $this->master->call('reports/summary', $_params);
411
  }
412
  /**
413
  * Get all unsubscribed email addresses for a given campaign
414
  * @param string $cid
415
  * @param associative_array $opts
416
  * - start int optional for large data sets, the page number to start at - defaults to 1st page of data (page 0)
417
  * - limit int optional for large data sets, the number of results to return - defaults to 25, upper limit set at 100
418
  * @return associative_array a total of all unsubscribed emails and the specific members for this page
419
  * - total int the total number of unsubscribes for the campaign
420
  * - data array structs for the email addresses that unsubscribed
421
  * - member string the member that unsubscribed as returned by lists/member-info()
422
  * - reason string the reason collected for the unsubscribe. If populated, one of 'NORMAL','NOSIGNUP','INAPPROPRIATE','SPAM','OTHER'
423
  * - reason_text string if the reason is OTHER, the text entered.
424
  */
425
  public function unsubscribes($cid, $opts=array()) {
426
  $_params = array("cid" => $cid, "opts" => $opts);
427
  return $this->master->call('reports/unsubscribes', $_params);
428
  }
 
0
  public function __construct(Mailchimp $master) {
1
  $this->master = $master;
2
  }
3
  /**
4
  * Get all email addresses that complained about a given campaign
5
  * @param string $cid
6
  * @param associative_array $opts
7
  * - start int optional for large data sets, the page number to start at - defaults to 1st page of data (page 0)
8
  * - limit int optional for large data sets, the number of results to return - defaults to 25, upper limit set at 100
9
  * - since string optional pull only messages since this time - 24 hour format in <strong>GMT</strong>, eg "2013-12-30 20:30:00"
10
  * @return associative_array abuse report data for this campaign
11
  * - total int the total reports matched
12
  * - data array a struct for the each report, including:
13
  * - date string date/time the abuse report was received and processed
14
  * - member string the email address that reported abuse - will only contain email if the list or member has been removed
15
  * - type string an internal type generally specifying the originating mail provider - may not be useful outside of filling report views
16
  */
17
  public function abuse($cid, $opts=array()) {
18
  $_params = array("cid" => $cid, "opts" => $opts);
19
  return $this->master->call('reports/abuse', $_params);
20
  }
21
  /**
22
  * Retrieve the text presented in our app for how a campaign performed and any advice we may have for you - best
23
  * @param string $cid
24
  * @return array of structs for advice on the campaign's performance, each containing:
25
  * - msg string the advice message
26
  * - type string the "type" of the message. one of: negative, positive, or neutral
27
  */
28
  public function advice($cid) {
29
  $_params = array("cid" => $cid);
30
  return $this->master->call('reports/advice', $_params);
31
  }
32
  /**
33
  * Retrieve the most recent full bounce message for a specific email address on the given campaign.
34
  * @param string $cid
35
  * @param associative_array $email
36
  * - email string an email address - this is recommended for this method
37
  * - euid string the unique id for an email address (not list related) - the email "id" returned from listMemberInfo, Webhooks, Campaigns, etc.
38
  * - leid string the list email id (previously called web_id) for a list-member-info type call. this doesn't change when the email address changes
39
  * @return associative_array the full bounce message for this email+campaign along with some extra data.
40
  * - date string date the bounce was received and processed
41
  * - member associative_array the member record as returned by lists/member-info()
42
  * - message string the entire bounce message received
43
  */
44
  public function bounceMessage($cid, $email) {
45
  $_params = array("cid" => $cid, "email" => $email);
46
  return $this->master->call('reports/bounce-message', $_params);
47
  }
48
  /**
49
  * Retrieve the full bounce messages for the given campaign. Note that this can return very large amounts
50
  * @param string $cid
51
  * @param associative_array $opts
52
  * - start int optional for large data sets, the page number to start at - defaults to 1st page of data (page 0)
53
  * - limit int optional for large data sets, the number of results to return - defaults to 25, upper limit set at 100
54
  * - since string optional pull only messages since this time - 24 hour format in <strong>GMT</strong>, eg "2013-12-30 20:30:00"
55
  * @return associative_array data for the full bounce messages for this campaign
56
  * - total int that total number of bounce messages for the campaign
57
  * - data array structs containing the data for this page
58
  * - date string date the bounce was received and processed
59
  * - member associative_array the member record as returned by lists/member-info()
60
  * - message string the entire bounce message received
61
  */
62
  public function bounceMessages($cid, $opts=array()) {
63
  $_params = array("cid" => $cid, "opts" => $opts);
64
  return $this->master->call('reports/bounce-messages', $_params);
65
  }
66
  /**
67
  * Return the list of email addresses that clicked on a given url, and how many times they clicked
68
  * @param string $cid
69
  * @param int $tid
70
  * @param associative_array $opts
71
  * - start int optional for large data sets, the page number to start at - defaults to 1st page of data (page 0)
72
  * - limit int optional for large data sets, the number of results to return - defaults to 25, upper limit set at 100
73
  * - sort_field string optional the data to sort by - "clicked" (order clicks occurred, default) or "clicks" (total number of opens). Invalid fields will fall back on the default.
74
  * - sort_dir string optional the direct - ASC or DESC. defaults to ASC (case insensitive)
75
  * @return associative_array containing the total records matched and the specific records for this page
76
  * - total int the total number of records matched
77
  * - data array structs for each email addresses that click the requested url
78
  * - member associative_array the member record as returned by lists/member-info()
79
  * - clicks int Total number of times the URL was clicked by this email address
80
  */
81
  public function clickDetail($cid, $tid, $opts=array()) {
82
  $_params = array("cid" => $cid, "tid" => $tid, "opts" => $opts);
83
  return $this->master->call('reports/click-detail', $_params);
84
  }
85
  /**
86
  * The urls tracked and their click counts for a given campaign.
87
  * @param string $cid
88
  * @return associative_array including:
89
  * - total array structs for each url tracked for the full campaign
90
  * - url string the url being tracked - urls are tracked individually, so duplicates can exist with vastly different stats
91
  * - clicks int Number of times the specific link was clicked
92
  * - clicks_percent double the percentage of total clicks "clicks" represents
93
  * - unique int Number of unique people who clicked on the specific link
94
  * - unique_percent double the percentage of unique clicks "unique" represents
95
  * - tid int the tracking id used in campaign links - used primarily for reports/click-activity. also can be used to order urls by the order they appeared in the campaign to recreate our heat map.
96
  * - a array if this was an absplit campaign, stat structs for the a group
97
  * - url string the url being tracked - urls are tracked individually, so duplicates can exist with vastly different stats
98
  * - clicks int Number of times the specific link was clicked
99
  * - clicks_percent double the percentage of total clicks "clicks" represents
100
  * - unique int Number of unique people who clicked on the specific link
101
  * - unique_percent double the percentage of unique clicks "unique" represents
102
  * - tid int the tracking id used in campaign links - used primarily for reports/click-activity. also can be used to order urls by the order they appeared in the campaign to recreate our heat map.
103
  * - b array if this was an absplit campaign, stat structs for the b group
104
  * - url string the url being tracked - urls are tracked individually, so duplicates can exist with vastly different stats
105
  * - clicks int Number of times the specific link was clicked
106
  * - clicks_percent double the percentage of total clicks "clicks" represents
107
  * - unique int Number of unique people who clicked on the specific link
108
  * - unique_percent double the percentage of unique clicks "unique" represents
109
  * - tid int the tracking id used in campaign links - used primarily for reports/click-activity. also can be used to order urls by the order they appeared in the campaign to recreate our heat map.
110
  */
111
  public function clicks($cid) {
112
  $_params = array("cid" => $cid);
113
  return $this->master->call('reports/clicks', $_params);
114
  }
115
  /**
116
  * Retrieve the Ecommerce Orders tracked by ecomm/order-add()
117
  * @param string $cid
118
  * @param associative_array $opts
119
  * - start int optional for large data sets, the page number to start at - defaults to 1st page of data (page 0)
120
  * - limit int optional for large data sets, the number of results to return - defaults to 25, upper limit set at 100
121
  * - since string optional pull only messages since this time - 24 hour format in <strong>GMT</strong>, eg "2013-12-30 20:30:00"
122
  * @return associative_array the total matching orders and the specific orders for the requested page
123
  * - total int the total matching orders
124
  * - data array structs for the actual data for each order being returned
125
  * - store_id string the store id generated by the plugin used to uniquely identify a store
126
  * - store_name string the store name collected by the plugin - often the domain name
127
  * - order_id string the internal order id the store tracked this order by
128
  * - member associative_array the member record as returned by lists/member-info() that received this campaign and is associated with this order
129
  * - order_total double the order total
130
  * - tax_total double the total tax for the order (if collected)
131
  * - ship_total double the shipping total for the order (if collected)
132
  * - order_date string the date the order was tracked - from the store if possible, otherwise the GMT time we received it
133
  * - lines array structs containing details of the order:
134
  * - line_num int the line number assigned to this line
135
  * - product_id int the product id assigned to this item
136
  * - product_name string the product name
137
  * - product_sku string the sku for the product
138
  * - product_category_id int the id for the product category
139
  * - product_category_name string the product category name
140
  * - qty double optional the quantity of the item ordered - defaults to 1
141
  * - cost double optional the cost of a single item (ie, not the extended cost of the line) - defaults to 0
142
  */
143
  public function ecommOrders($cid, $opts=array()) {
144
  $_params = array("cid" => $cid, "opts" => $opts);
145
  return $this->master->call('reports/ecomm-orders', $_params);
146
  }
147
  /**
148
  * Retrieve the eepurl stats from the web/Twitter mentions for this campaign
149
  * @param string $cid
150
  * @return associative_array containing tweets, retweets, clicks, and referrer related to using the campaign's eepurl
151
  * - twitter associative_array various Twitter related stats
152
  * - tweets int Total number of tweets seen
153
  * - first_tweet string date and time of the first tweet seen
154
  * - last_tweet string date and time of the last tweet seen
155
  * - retweets int Total number of retweets seen
156
  * - first_retweet string date and time of the first retweet seen
157
  * - last_retweet string date and time of the last retweet seen
158
  * - statuses array an structs for statuses recorded including:
159
  * - status string the text of the tweet/update
160
  * - screen_name string the screen name as recorded when first seen
161
  * - status_id string the status id of the tweet (they are really unsigned 64 bit ints)
162
  * - datetime string the date/time of the tweet
163
  * - is_retweet bool whether or not this was a retweet
164
  * - clicks associative_array stats related to click-throughs on the eepurl
165
  * - clicks int Total number of clicks seen
166
  * - first_click string date and time of the first click seen
167
  * - last_click string date and time of the first click seen
168
  * - locations array structs for geographic locations including:
169
  * - country string the country name the click was tracked to
170
  * - region string the region in the country the click was tracked to (if available)
171
  * - referrers array structs for referrers, including
172
  * - referrer string the referrer, truncated to 100 bytes
173
  * - clicks int Total number of clicks seen from this referrer
174
  * - first_click string date and time of the first click seen from this referrer
175
  * - last_click string date and time of the first click seen from this referrer
176
  */
177
  public function eepurl($cid) {
178
  $_params = array("cid" => $cid);
179
  return $this->master->call('reports/eepurl', $_params);
180
  }
181
  /**
182
  * Given a campaign and email address, return the entire click and open history with timestamps, ordered by time. If you need to dump the full activity for a campaign
183
  * @param string $cid
184
  * @param array $emails
185
  * - email string an email address
186
  * - euid string the unique id for an email address (not list related) - the email "id" returned from listMemberInfo, Webhooks, Campaigns, etc.
187
  * - leid string the list email id (previously called web_id) for a list-member-info type call. this doesn't change when the email address changes
188
  * @return associative_array of data and success/error counts
189
  * - success_count int the number of subscribers successfully found on the list
190
  * - error_count int the number of subscribers who were not found on the list
191
  * - errors array array of error structs including:
192
  * - email string whatever was passed in the email parameter
193
  * - email string the email address added
194
  * - euid string the email unique id
195
  * - leid string the list member's truly unique id
196
  * - msg string the error message
197
  * - data array an array of structs where each activity record has:
198
  * - email string whatever was passed in the email parameter
199
  * - email string the email address added
200
  * - euid string the email unique id
201
  * - leid string the list member's truly unique id
202
  * - member associative_array the member record as returned by lists/member-info()
203
  * - activity array an array of structs containing the activity, including:
204
  * - action string The action name - either open or click
205
  * - timestamp string The date/time of the action (GMT)
206
  * - url string For click actions, the url clicked, otherwise this is empty
207
  * - ip string The IP address the activity came from
208
  */
209
  public function memberActivity($cid, $emails) {
210
  $_params = array("cid" => $cid, "emails" => $emails);
211
  return $this->master->call('reports/member-activity', $_params);
212
  }
213
  /**
214
  * Retrieve the list of email addresses that did not open a given campaign
215
  * @param string $cid
216
  * @param associative_array $opts
217
  * - start int optional for large data sets, the page number to start at - defaults to 1st page of data (page 0)
218
  * - limit int optional for large data sets, the number of results to return - defaults to 25, upper limit set at 100
219
  * @return associative_array a total of all matching emails and the specific emails for this page
220
  * - total int the total number of members who didn't open the campaign
221
  * - data array structs for each campaign member matching as returned by lists/member-info()
222
  */
223
  public function notOpened($cid, $opts=array()) {
224
  $_params = array("cid" => $cid, "opts" => $opts);
225
  return $this->master->call('reports/not-opened', $_params);
226
  }
227
  /**
228
  * Retrieve the list of email addresses that opened a given campaign with how many times they opened
229
  * @param string $cid
230
  * @param associative_array $opts
231
  * - start int optional for large data sets, the page number to start at - defaults to 1st page of data (page 0)
232
  * - limit int optional for large data sets, the number of results to return - defaults to 25, upper limit set at 100
233
  * - sort_field string optional the data to sort by - "opened" (order opens occurred, default) or "opens" (total number of opens). Invalid fields will fall back on the default.
234
  * - sort_dir string optional the direct - ASC or DESC. defaults to ASC (case insensitive)
235
  * @return associative_array containing the total records matched and the specific records for this page
236
  * - total int the total number of records matched
237
  * - data array structs for the actual opens data, including:
238
  * - member associative_array the member record as returned by lists/member-info()
239
  * - opens int Total number of times the campaign was opened by this email address
240
  */
241
  public function opened($cid, $opts=array()) {
242
  $_params = array("cid" => $cid, "opts" => $opts);
243
  return $this->master->call('reports/opened', $_params);
244
  }
245
  /**
246
  * Get the top 5 performing email domains for this campaign. Users wanting more than 5 should use campaign reports/member-activity()
247
  * @param string $cid
248
  * @return array domains structs for each email domains and their associated stats
249
  * - domain string Domain name or special "Other" to roll-up stats past 5 domains
250
  * - total_sent int Total Email across all domains - this will be the same in every row
251
  * - emails int Number of emails sent to this domain
252
  * - bounces int Number of bounces
253
  * - opens int Number of opens
254
  * - clicks int Number of clicks
255
  * - unsubs int Number of unsubs
256
  * - delivered int Number of deliveries
257
  * - emails_pct int Percentage of emails that went to this domain (whole number)
258
  * - bounces_pct int Percentage of bounces from this domain (whole number)
259
  * - opens_pct int Percentage of opens from this domain (whole number)
260
  * - clicks_pct int Percentage of clicks from this domain (whole number)
261
  * - unsubs_pct int Percentage of unsubs from this domain (whole number)
262
  */
263
  public function domainPerformance($cid) {
264
  $_params = array("cid" => $cid);
265
  return $this->master->call('reports/domain-performance', $_params);
266
  }
267
  /**
268
  * Retrieve the countries/regions and number of opens tracked for each. Email address are not returned.
269
  * @param string $cid
270
  * @return array an array of country structs where opens occurred
271
  * - code string The ISO3166 2 digit country code
272
  * - name string A version of the country name, if we have it
273
  * - opens int The total number of opens that occurred in the country
274
  * - regions array structs of data for each sub-region in the country
275
  * - code string An internal code for the region. When this is blank, it indicates we know the country, but not the region
276
  * - name string The name of the region, if we have one. For blank "code" values, this will be "Rest of Country"
277
  * - opens int The total number of opens that occurred in the country
278
  */
279
  public function geoOpens($cid) {
280
  $_params = array("cid" => $cid);
281
  return $this->master->call('reports/geo-opens', $_params);
282
  }
283
  /**
284
  * Retrieve the Google Analytics data we've collected for this campaign. Note, requires Google Analytics Add-on to be installed and configured.
285
  * @param string $cid
286
  * @return array of structs for analytics we've collected for the passed campaign.
287
  * - visits int number of visits
288
  * - pages int number of page views
289
  * - new_visits int new visits recorded
290
  * - bounces int vistors who "bounced" from your site
291
  * - time_on_site double the total time visitors spent on your sites
292
  * - goal_conversions int number of goals converted
293
  * - goal_value double value of conversion in dollars
294
  * - revenue double revenue generated by campaign
295
  * - transactions int number of transactions tracked
296
  * - ecomm_conversions int number Ecommerce transactions tracked
297
  * - goals array structs containing goal names and number of conversions
298
  * - name string the name of the goal
299
  * - conversions int the number of conversions for the goal
300
  */
301
  public function googleAnalytics($cid) {
302
  $_params = array("cid" => $cid);
303
  return $this->master->call('reports/google-analytics', $_params);
304
  }
305
  /**
306
  * Get email addresses the campaign was sent to
307
  * @param string $cid
308
  * @param associative_array $opts
309
  * - status string optional the status to pull - one of 'sent', 'hard' (bounce), or 'soft' (bounce). By default, all records are returned
310
  * - start int optional for large data sets, the page number to start at - defaults to 1st page of data (page 0)
311
  * - limit int optional for large data sets, the number of results to return - defaults to 25, upper limit set at 100
312
  * @return associative_array a total of all matching emails and the specific emails for this page
313
  * - total int the total number of members for the campaign and status
314
  * - data array structs for each campaign member matching
315
  * - member associative_array the member record as returned by lists/member-info()
316
  * - status string the status of the send - one of 'sent', 'hard', 'soft'
317
  * - absplit_group string if this was an absplit campaign, one of 'a','b', or 'winner'
318
  * - tz_group string if this was an timewarp campaign the timezone GMT offset the member was included in
319
  */
320
  public function sentTo($cid, $opts=array()) {
321
  $_params = array("cid" => $cid, "opts" => $opts);
322
  return $this->master->call('reports/sent-to', $_params);
323
  }
324
  /**
325
  * Get the URL to a customized <a href="http://eepurl.com/gKmL" target="_blank">VIP Report</a> for the specified campaign and optionally send an email to someone with links to it. Note subsequent calls will overwrite anything already set for the same campign (eg, the password)
326
  * @param string $cid
327
  * @param array $opts
328
  * - to_email string optional - optional, comma delimited list of email addresses to share the report with - no value means an email will not be sent
329
  * - theme_id int optional - either a global or a user-specific theme id. Currently this needs to be pulled out of either the Share Report or Cobranding web views by grabbing the "theme" attribute from the list presented.
330
  * - css_url string optional - a link to an external CSS file to be included after our default CSS (http://vip-reports.net/css/vip.css) <strong>only if</strong> loaded via the "secure_url" - max 255 bytes
331
  * @return associative_array details for the shared report, including:
332
  * - title string The Title of the Campaign being shared
333
  * - url string The URL to the shared report
334
  * - secure_url string The URL to the shared report, including the password (good for loading in an IFRAME). For non-secure reports, this will not be returned
335
  * - password string If secured, the password for the report, otherwise this field will not be returned
336
  */
337
  public function share($cid, $opts=array()) {
338
  $_params = array("cid" => $cid, "opts" => $opts);
339
  return $this->master->call('reports/share', $_params);
340
  }
341
  /**
342
  * Retrieve relevant aggregate campaign statistics (opens, bounces, clicks, etc.)
343
  * @param string $cid
344
  * @return associative_array the statistics for this campaign
345
  * - syntax_errors int Number of email addresses in campaign that had syntactical errors.
346
  * - hard_bounces int Number of email addresses in campaign that hard bounced.
347
  * - soft_bounces int Number of email addresses in campaign that soft bounced.
348
  * - unsubscribes int Number of email addresses in campaign that unsubscribed.
349
  * - abuse_reports int Number of email addresses in campaign that reported campaign for abuse.
350
  * - forwards int Number of times email was forwarded to a friend.
351
  * - forwards_opens int Number of times a forwarded email was opened.
352
  * - opens int Number of times the campaign was opened.
353
  * - last_open string Date of the last time the email was opened.
354
  * - unique_opens int Number of people who opened the campaign.
355
  * - clicks int Number of times a link in the campaign was clicked.
356
  * - unique_clicks int Number of unique recipient/click pairs for the campaign.
357
  * - last_click string Date of the last time a link in the email was clicked.
358
  * - users_who_clicked int Number of unique recipients who clicked on a link in the campaign.
359
  * - emails_sent int Number of email addresses campaign was sent to.
360
  * - unique_likes int total number of unique likes (Facebook)
361
  * - recipient_likes int total number of recipients who liked (Facebook) the campaign
362
  * - facebook_likes int total number of likes (Facebook) that came from Facebook
363
  * - industry associative_array Various rates/percentages for the account's selected industry - empty otherwise. These will vary across calls, do not use them for anything important.
364
  * - type string the selected industry
365
  * - open_rate float industry open rate
366
  * - click_rate float industry click rate
367
  * - bounce_rate float industry bounce rate
368
  * - unopen_rate float industry unopen rate
369
  * - unsub_rate float industry unsub rate
370
  * - abuse_rate float industry abuse rate
371
  * - absplit associative_array If this was an absplit campaign, stats for the A and B groups will be returned - otherwise this is empty
372
  * - bounces_a int bounces for the A group
373
  * - bounces_b int bounces for the B group
374
  * - forwards_a int forwards for the A group
375
  * - forwards_b int forwards for the B group
376
  * - abuse_reports_a int abuse reports for the A group
377
  * - abuse_reports_b int abuse reports for the B group
378
  * - unsubs_a int unsubs for the A group
379
  * - unsubs_b int unsubs for the B group
380
  * - recipients_click_a int clicks for the A group
381
  * - recipients_click_b int clicks for the B group
382
  * - forwards_opens_a int opened forwards for the A group
383
  * - forwards_opens_b int opened forwards for the B group
384
  * - opens_a int total opens for the A group
385
  * - opens_b int total opens for the B group
386
  * - last_open_a string date/time of last open for the A group
387
  * - last_open_b string date/time of last open for the BG group
388
  * - unique_opens_a int unique opens for the A group
389
  * - unique_opens_b int unique opens for the B group
390
  * - timewarp array If this campaign was a Timewarp campaign, an array of structs from each timezone stats exist for. Each will contain:
391
  * - opens int opens for this timezone
392
  * - last_open string the date/time of the last open for this timezone
393
  * - unique_opens int the unique opens for this timezone
394
  * - clicks int the total clicks for this timezone
395
  * - last_click string the date/time of the last click for this timezone
396
  * - unique_clicks int the unique clicks for this timezone
397
  * - bounces int the total bounces for this timezone
398
  * - total int the total number of members sent to in this timezone
399
  * - sent int the total number of members delivered to in this timezone
400
  * - timeseries array structs for the first 24 hours of the campaign, per-hour stats:
401
  * - timestamp string The timestemp in Y-m-d H:00:00 format
402
  * - emails_sent int the total emails sent during the hour
403
  * - unique_opens int unique opens seen during the hour
404
  * - recipients_click int unique clicks seen during the hour
405
  */
406
  public function summary($cid) {
407
  $_params = array("cid" => $cid);
408
  return $this->master->call('reports/summary', $_params);
409
  }
410
  /**
411
  * Get all unsubscribed email addresses for a given campaign
412
  * @param string $cid
413
  * @param associative_array $opts
414
  * - start int optional for large data sets, the page number to start at - defaults to 1st page of data (page 0)
415
  * - limit int optional for large data sets, the number of results to return - defaults to 25, upper limit set at 100
416
  * @return associative_array a total of all unsubscribed emails and the specific members for this page
417
  * - total int the total number of unsubscribes for the campaign
418
  * - data array structs for the email addresses that unsubscribed
419
  * - member string the member that unsubscribed as returned by lists/member-info()
420
  * - reason string the reason collected for the unsubscribe. If populated, one of 'NORMAL','NOSIGNUP','INAPPROPRIATE','SPAM','OTHER'
421
  * - reason_text string if the reason is OTHER, the text entered.
422
  */
423
  public function unsubscribes($cid, $opts=array()) {
424
  $_params = array("cid" => $cid, "opts" => $opts);
425
  return $this->master->call('reports/unsubscribes', $_params);
426
  }
includes/MailChimp/Mailchimp/Templates.php DELETED
@@ -1 +0,0 @@
1
- <?php
2
  public function __construct(Mailchimp $master) {
3
  $this->master = $master;
4
  }
5
  /**
6
  * Create a new user template, <strong>NOT</strong> campaign content. These templates can then be applied while creating campaigns.
7
  * @param string $name
8
  * @param string $html
9
  * @param int $folder_id
10
  * @return associative_array with a single element:
11
  * - template_id int the new template id, otherwise an error is thrown.
12
  */
13
  public function add($name, $html, $folder_id=null) {
14
  $_params = array("name" => $name, "html" => $html, "folder_id" => $folder_id);
15
  return $this->master->call('templates/add', $_params);
16
  }
17
  /**
18
  * Delete (deactivate) a user template
19
  * @param int $template_id
20
  * @return associative_array with a single entry:
21
  * - complete bool whether the call worked. reallistically this will always be true as errors will be thrown otherwise.
22
  */
23
  public function del($template_id) {
24
  $_params = array("template_id" => $template_id);
25
  return $this->master->call('templates/del', $_params);
26
  }
27
  /**
28
  * Pull details for a specific template to help support editing
29
  * @param int $template_id
30
  * @param string $type
31
  * @return associative_array info to be used when editing
32
  * - default_content associative_array the default content broken down into the named editable sections for the template - dependant upon template, so not documented
33
  * - sections associative_array the valid editable section names - dependant upon template, so not documented
34
  * - source string the full source of the template as if you exported it via our template editor
35
  * - preview string similar to the source, but the rendered version of the source from our popup preview
36
  */
37
  public function info($template_id, $type='user') {
38
  $_params = array("template_id" => $template_id, "type" => $type);
39
  return $this->master->call('templates/info', $_params);
40
  }
41
  /**
42
  * Retrieve various templates available in the system, allowing some thing similar to our template gallery to be created.
43
  * @param associative_array $types
44
  * - user boolean Custom templates for this user account. Defaults to true.
45
  * - gallery boolean Templates from our Gallery. Note that some templates that require extra configuration are withheld. (eg, the Etsy template). Defaults to false.
46
  * - base boolean Our "start from scratch" extremely basic templates. Defaults to false. As of the 9.0 update, "base" templates are no longer available via the API because they are now all saved Drag & Drop templates.
47
  * @param associative_array $filters
48
  * - category string optional for Gallery templates only, limit to a specific template category
49
  * - folder_id string user templates, limit to this folder_id
50
  * - include_inactive boolean user templates are not deleted, only set inactive. defaults to false.
51
  * - inactive_only boolean only include inactive user templates. defaults to false.
52
  * - include_drag_and_drop boolean Include templates created and saved using the new Drag & Drop editor. <strong>Note:</strong> You will not be able to edit or create new drag & drop templates via this API. This is useful only for creating a new campaign based on a drag & drop template.
53
  * @return associative_array for each type
54
  * - user array matching user templates, if requested.
55
  * - id int Id of the template
56
  * - name string Name of the template
57
  * - layout string General description of the layout of the template
58
  * - category string The category for the template, if there is one.
59
  * - preview_image string If we've generated it, the url of the preview image for the template. We do out best to keep these up to date, but Preview image urls are not guaranteed to be available
60
  * - date_created string The date/time the template was created
61
  * - active boolean whether or not the template is active and available for use.
62
  * - edit_source boolean Whether or not you are able to edit the source of a template.
63
  * - folder_id boolean if it's in one, the folder id
64
  * - gallery array matching gallery templates, if requested.
65
  * - id int Id of the template
66
  * - name string Name of the template
67
  * - layout string General description of the layout of the template
68
  * - category string The category for the template, if there is one.
69
  * - preview_image string If we've generated it, the url of the preview image for the template. We do out best to keep these up to date, but Preview image urls are not guaranteed to be available
70
  * - date_created string The date/time the template was created
71
  * - active boolean whether or not the template is active and available for use.
72
  * - edit_source boolean Whether or not you are able to edit the source of a template.
73
  * - base array matching base templates, if requested. (Will always be empty as of 9.0)
74
  */
75
  public function getList($types=array(), $filters=array()) {
76
  $_params = array("types" => $types, "filters" => $filters);
77
  return $this->master->call('templates/list', $_params);
78
  }
79
  /**
80
  * Undelete (reactivate) a user template
81
  * @param int $template_id
82
  * @return associative_array with a single entry:
83
  * - complete bool whether the call worked. reallistically this will always be true as errors will be thrown otherwise.
84
  */
85
  public function undel($template_id) {
86
  $_params = array("template_id" => $template_id);
87
  return $this->master->call('templates/undel', $_params);
88
  }
89
  /**
90
  * Replace the content of a user template, <strong>NOT</strong> campaign content.
91
  * @param int $template_id
92
  * @param associative_array $values
93
  * - name string the name for the template - names must be unique and a max of 50 bytes
94
  * - html string a string specifying the entire template to be created. This is <strong>NOT</strong> campaign content. They are intended to utilize our <a href="http://www.mailchimp.com/resources/email-template-language/" target="_blank">template language</a>.
95
  * - folder_id int the folder to put this template in - 0 or a blank values will remove it from a folder.
96
  * @return associative_array with a single entry:
97
  * - complete bool whether the call worked. reallistically this will always be true as errors will be thrown otherwise.
98
  */
99
  public function update($template_id, $values) {
100
  $_params = array("template_id" => $template_id, "values" => $values);
101
  return $this->master->call('templates/update', $_params);
102
  }
 
0
  public function __construct(Mailchimp $master) {
1
  $this->master = $master;
2
  }
3
  /**
4
  * Create a new user template, <strong>NOT</strong> campaign content. These templates can then be applied while creating campaigns.
5
  * @param string $name
6
  * @param string $html
7
  * @param int $folder_id
8
  * @return associative_array with a single element:
9
  * - template_id int the new template id, otherwise an error is thrown.
10
  */
11
  public function add($name, $html, $folder_id=null) {
12
  $_params = array("name" => $name, "html" => $html, "folder_id" => $folder_id);
13
  return $this->master->call('templates/add', $_params);
14
  }
15
  /**
16
  * Delete (deactivate) a user template
17
  * @param int $template_id
18
  * @return associative_array with a single entry:
19
  * - complete bool whether the call worked. reallistically this will always be true as errors will be thrown otherwise.
20
  */
21
  public function del($template_id) {
22
  $_params = array("template_id" => $template_id);
23
  return $this->master->call('templates/del', $_params);
24
  }
25
  /**
26
  * Pull details for a specific template to help support editing
27
  * @param int $template_id
28
  * @param string $type
29
  * @return associative_array info to be used when editing
30
  * - default_content associative_array the default content broken down into the named editable sections for the template - dependant upon template, so not documented
31
  * - sections associative_array the valid editable section names - dependant upon template, so not documented
32
  * - source string the full source of the template as if you exported it via our template editor
33
  * - preview string similar to the source, but the rendered version of the source from our popup preview
34
  */
35
  public function info($template_id, $type='user') {
36
  $_params = array("template_id" => $template_id, "type" => $type);
37
  return $this->master->call('templates/info', $_params);
38
  }
39
  /**
40
  * Retrieve various templates available in the system, allowing some thing similar to our template gallery to be created.
41
  * @param associative_array $types
42
  * - user boolean Custom templates for this user account. Defaults to true.
43
  * - gallery boolean Templates from our Gallery. Note that some templates that require extra configuration are withheld. (eg, the Etsy template). Defaults to false.
44
  * - base boolean Our "start from scratch" extremely basic templates. Defaults to false. As of the 9.0 update, "base" templates are no longer available via the API because they are now all saved Drag & Drop templates.
45
  * @param associative_array $filters
46
  * - category string optional for Gallery templates only, limit to a specific template category
47
  * - folder_id string user templates, limit to this folder_id
48
  * - include_inactive boolean user templates are not deleted, only set inactive. defaults to false.
49
  * - inactive_only boolean only include inactive user templates. defaults to false.
50
  * - include_drag_and_drop boolean Include templates created and saved using the new Drag & Drop editor. <strong>Note:</strong> You will not be able to edit or create new drag & drop templates via this API. This is useful only for creating a new campaign based on a drag & drop template.
51
  * @return associative_array for each type
52
  * - user array matching user templates, if requested.
53
  * - id int Id of the template
54
  * - name string Name of the template
55
  * - layout string General description of the layout of the template
56
  * - category string The category for the template, if there is one.
57
  * - preview_image string If we've generated it, the url of the preview image for the template. We do out best to keep these up to date, but Preview image urls are not guaranteed to be available
58
  * - date_created string The date/time the template was created
59
  * - active boolean whether or not the template is active and available for use.
60
  * - edit_source boolean Whether or not you are able to edit the source of a template.
61
  * - folder_id boolean if it's in one, the folder id
62
  * - gallery array matching gallery templates, if requested.
63
  * - id int Id of the template
64
  * - name string Name of the template
65
  * - layout string General description of the layout of the template
66
  * - category string The category for the template, if there is one.
67
  * - preview_image string If we've generated it, the url of the preview image for the template. We do out best to keep these up to date, but Preview image urls are not guaranteed to be available
68
  * - date_created string The date/time the template was created
69
  * - active boolean whether or not the template is active and available for use.
70
  * - edit_source boolean Whether or not you are able to edit the source of a template.
71
  * - base array matching base templates, if requested. (Will always be empty as of 9.0)
72
  */
73
  public function getList($types=array(), $filters=array()) {
74
  $_params = array("types" => $types, "filters" => $filters);
75
  return $this->master->call('templates/list', $_params);
76
  }
77
  /**
78
  * Undelete (reactivate) a user template
79
  * @param int $template_id
80
  * @return associative_array with a single entry:
81
  * - complete bool whether the call worked. reallistically this will always be true as errors will be thrown otherwise.
82
  */
83
  public function undel($template_id) {
84
  $_params = array("template_id" => $template_id);
85
  return $this->master->call('templates/undel', $_params);
86
  }
87
  /**
88
  * Replace the content of a user template, <strong>NOT</strong> campaign content.
89
  * @param int $template_id
90
  * @param associative_array $values
91
  * - name string the name for the template - names must be unique and a max of 50 bytes
92
  * - html string a string specifying the entire template to be created. This is <strong>NOT</strong> campaign content. They are intended to utilize our <a href="http://www.mailchimp.com/resources/email-template-language/" target="_blank">template language</a>.
93
  * - folder_id int the folder to put this template in - 0 or a blank values will remove it from a folder.
94
  * @return associative_array with a single entry:
95
  * - complete bool whether the call worked. reallistically this will always be true as errors will be thrown otherwise.
96
  */
97
  public function update($template_id, $values) {
98
  $_params = array("template_id" => $template_id, "values" => $values);
99
  return $this->master->call('templates/update', $_params);
100
  }
includes/MailChimp/Mailchimp/Users.php DELETED
@@ -1 +0,0 @@
1
- <?php
2
  public function __construct(Mailchimp $master) {
3
  $this->master = $master;
4
  }
5
  /**
6
  * Invite a user to your account
7
  * @param string $email
8
  * @param string $role
9
  * @param string $msg
10
  * @return associative_array the method completion status
11
  * - status string The status (success) of the call if it completed. Otherwise an error is thrown.
12
  */
13
  public function invite($email, $role='viewer', $msg='') {
14
  $_params = array("email" => $email, "role" => $role, "msg" => $msg);
15
  return $this->master->call('users/invite', $_params);
16
  }
17
  /**
18
  * Resend an invite a user to your account. Note, if the same address has been invited multiple times, this will simpy re-send the most recent invite
19
  * @param string $email
20
  * @return associative_array the method completion status
21
  * - status string The status (success) of the call if it completed. Otherwise an error is thrown.
22
  */
23
  public function inviteResend($email) {
24
  $_params = array("email" => $email);
25
  return $this->master->call('users/invite-resend', $_params);
26
  }
27
  /**
28
  * Revoke an invitation sent to a user to your account. Note, if the same address has been invited multiple times, this will simpy revoke the most recent invite
29
  * @param string $email
30
  * @return associative_array the method completion status
31
  * - status string The status (success) of the call if it completed. Otherwise an error is thrown.
32
  */
33
  public function inviteRevoke($email) {
34
  $_params = array("email" => $email);
35
  return $this->master->call('users/invite-revoke', $_params);
36
  }
37
  /**
38
  * Retrieve the list of pending users invitations have been sent for.
39
  * @return array structs for each invitation, including:
40
  * - email string the email address the invitation was sent to
41
  * - role string the role that will be assigned if they accept
42
  * - sent_at string the time the invitation was sent. this will change if it's resent.
43
  * - expiration string the expiration time for the invitation. this will change if it's resent.
44
  * - msg string the welcome message included with the invitation
45
  */
46
  public function invites() {
47
  $_params = array();
48
  return $this->master->call('users/invites', $_params);
49
  }
50
  /**
51
  * Revoke access for a specified login
52
  * @param string $username
53
  * @return associative_array the method completion status
54
  * - status string The status (success) of the call if it completed. Otherwise an error is thrown.
55
  */
56
  public function loginRevoke($username) {
57
  $_params = array("username" => $username);
58
  return $this->master->call('users/login-revoke', $_params);
59
  }
60
  /**
61
  * Retrieve the list of active logins.
62
  * @return array structs for each user, including:
63
  * - id int the login id for this login
64
  * - username string the username used to log in
65
  * - name string a display name for the account - empty first/last names will return the username
66
  * - email string the email tied to the account used for passwords resets and the ilk
67
  * - role string the role assigned to the account
68
  * - avatar string if available, the url for the login's avatar
69
  * - global_user_id int the globally unique user id for the user account connected to
70
  * - dc_unique_id string the datacenter unique id for the user account connected to, like helper/account-details
71
  */
72
  public function logins() {
73
  $_params = array();
74
  return $this->master->call('users/logins', $_params);
75
  }
76
  /**
77
  * Retrieve the profile for the login owning the provided API Key
78
  * @return associative_array the current user's details, including:
79
  * - id int the login id for this login
80
  * - username string the username used to log in
81
  * - name string a display name for the account - empty first/last names will return the username
82
  * - email string the email tied to the account used for passwords resets and the ilk
83
  * - role string the role assigned to the account
84
  * - avatar string if available, the url for the login's avatar
85
  * - global_user_id int the globally unique user id for the user account connected to
86
  * - dc_unique_id string the datacenter unique id for the user account connected to, like helper/account-details
87
  * - account_name string The name of the account to which the API key belongs
88
  */
89
  public function profile() {
90
  $_params = array();
91
  return $this->master->call('users/profile', $_params);
92
  }
 
0
  public function __construct(Mailchimp $master) {
1
  $this->master = $master;
2
  }
3
  /**
4
  * Invite a user to your account
5
  * @param string $email
6
  * @param string $role
7
  * @param string $msg
8
  * @return associative_array the method completion status
9
  * - status string The status (success) of the call if it completed. Otherwise an error is thrown.
10
  */
11
  public function invite($email, $role='viewer', $msg='') {
12
  $_params = array("email" => $email, "role" => $role, "msg" => $msg);
13
  return $this->master->call('users/invite', $_params);
14
  }
15
  /**
16
  * Resend an invite a user to your account. Note, if the same address has been invited multiple times, this will simpy re-send the most recent invite
17
  * @param string $email
18
  * @return associative_array the method completion status
19
  * - status string The status (success) of the call if it completed. Otherwise an error is thrown.
20
  */
21
  public function inviteResend($email) {
22
  $_params = array("email" => $email);
23
  return $this->master->call('users/invite-resend', $_params);
24
  }
25
  /**
26
  * Revoke an invitation sent to a user to your account. Note, if the same address has been invited multiple times, this will simpy revoke the most recent invite
27
  * @param string $email
28
  * @return associative_array the method completion status
29
  * - status string The status (success) of the call if it completed. Otherwise an error is thrown.
30
  */
31
  public function inviteRevoke($email) {
32
  $_params = array("email" => $email);
33
  return $this->master->call('users/invite-revoke', $_params);
34
  }
35
  /**
36
  * Retrieve the list of pending users invitations have been sent for.
37
  * @return array structs for each invitation, including:
38
  * - email string the email address the invitation was sent to
39
  * - role string the role that will be assigned if they accept
40
  * - sent_at string the time the invitation was sent. this will change if it's resent.
41
  * - expiration string the expiration time for the invitation. this will change if it's resent.
42
  * - msg string the welcome message included with the invitation
43
  */
44
  public function invites() {
45
  $_params = array();
46
  return $this->master->call('users/invites', $_params);
47
  }
48
  /**
49
  * Revoke access for a specified login
50
  * @param string $username
51
  * @return associative_array the method completion status
52
  * - status string The status (success) of the call if it completed. Otherwise an error is thrown.
53
  */
54
  public function loginRevoke($username) {
55
  $_params = array("username" => $username);
56
  return $this->master->call('users/login-revoke', $_params);
57
  }
58
  /**
59
  * Retrieve the list of active logins.
60
  * @return array structs for each user, including:
61
  * - id int the login id for this login
62
  * - username string the username used to log in
63
  * - name string a display name for the account - empty first/last names will return the username
64
  * - email string the email tied to the account used for passwords resets and the ilk
65
  * - role string the role assigned to the account
66
  * - avatar string if available, the url for the login's avatar
67
  * - global_user_id int the globally unique user id for the user account connected to
68
  * - dc_unique_id string the datacenter unique id for the user account connected to, like helper/account-details
69
  */
70
  public function logins() {
71
  $_params = array();
72
  return $this->master->call('users/logins', $_params);
73
  }
74
  /**
75
  * Retrieve the profile for the login owning the provided API Key
76
  * @return associative_array the current user's details, including:
77
  * - id int the login id for this login
78
  * - username string the username used to log in
79
  * - name string a display name for the account - empty first/last names will return the username
80
  * - email string the email tied to the account used for passwords resets and the ilk
81
  * - role string the role assigned to the account
82
  * - avatar string if available, the url for the login's avatar
83
  * - global_user_id int the globally unique user id for the user account connected to
84
  * - dc_unique_id string the datacenter unique id for the user account connected to, like helper/account-details
85
  * - account_name string The name of the account to which the API key belongs
86
  */
87
  public function profile() {
88
  $_params = array();
89
  return $this->master->call('users/profile', $_params);
90
  }
includes/MailChimp/Mailchimp/Vip.php DELETED
@@ -1 +0,0 @@
1
- <?php
2
  public function __construct(Mailchimp $master) {
3
  $this->master = $master;
4
  }
5
  /**
6
  * Retrieve all Activity (opens/clicks) for VIPs over the past 10 days
7
  * @return array structs for each activity recorded.
8
  * - action string The action taken - either "open" or "click"
9
  * - timestamp string The datetime the action occurred in GMT
10
  * - url string IF the action is a click, the url that was clicked
11
  * - unique_id string The campaign_id of the List the Member appears on
12
  * - title string The campaign title
13
  * - list_name string The name of the List the Member appears on
14
  * - list_id string The id of the List the Member appears on
15
  * - email string The email address of the member
16
  * - fname string IF a FNAME merge field exists on the list, that value for the member
17
  * - lname string IF a LNAME merge field exists on the list, that value for the member
18
  * - member_rating int the rating of the subscriber. This will be 1 - 5 as described <a href="http://eepurl.com/f-2P" target="_blank">here</a>
19
  * - member_since string the datetime the member was added and/or confirmed
20
  * - geo associative_array the geographic information if we have it. including:
21
  * - latitude string the latitude
22
  * - longitude string the longitude
23
  * - gmtoff string GMT offset
24
  * - dstoff string GMT offset during daylight savings (if DST not observered, will be same as gmtoff
25
  * - timezone string the timezone we've place them in
26
  * - cc string 2 digit ISO-3166 country code
27
  * - region string generally state, province, or similar
28
  */
29
  public function activity() {
30
  $_params = array();
31
  return $this->master->call('vip/activity', $_params);
32
  }
33
  /**
34
  * Add VIPs (previously called Golden Monkeys)
35
  * @param string $id
36
  * @param array $emails
37
  * - email string an email address - for new subscribers obviously this should be used
38
  * - euid string the unique id for an email address (not list related) - the email "id" returned from listMemberInfo, Webhooks, Campaigns, etc.
39
  * - leid string the list email id (previously called web_id) for a list-member-info type call. this doesn't change when the email address changes
40
  * @return associative_array of data and success/error counts
41
  * - success_count int the number of successful adds
42
  * - error_count int the number of unsuccessful adds
43
  * - errors array array of error structs including:
44
  * - email associative_array whatever was passed in the email parameter
45
  * - email string the email address added
46
  * - euid string the email unique id
47
  * - leid string the list member's truly unique id
48
  * - code string the error code
49
  * - error string the error message
50
  * - data array array of structs for each member added
51
  * - email associative_array whatever was passed in the email parameter
52
  * - email string the email address added
53
  * - euid string the email unique id
54
  * - leid string the list member's truly unique id
55
  */
56
  public function add($id, $emails) {
57
  $_params = array("id" => $id, "emails" => $emails);
58
  return $this->master->call('vip/add', $_params);
59
  }
60
  /**
61
  * Remove VIPs - this does not affect list membership
62
  * @param string $id
63
  * @param array $emails
64
  * - email string an email address - for new subscribers obviously this should be used
65
  * - euid string the unique id for an email address (not list related) - the email "id" returned from listMemberInfo, Webhooks, Campaigns, etc.
66
  * - leid string the list email id (previously called web_id) for a list-member-info type call. this doesn't change when the email address changes
67
  * @return associative_array of data and success/error counts
68
  * - success_count int the number of successful deletions
69
  * - error_count int the number of unsuccessful deletions
70
  * - errors array array of error structs including:
71
  * - email associative_array whatever was passed in the email parameter
72
  * - email string the email address
73
  * - euid string the email unique id
74
  * - leid string the list member's truly unique id
75
  * - code string the error code
76
  * - msg string the error message
77
  * - data array array of structs for each member deleted
78
  * - email associative_array whatever was passed in the email parameter
79
  * - email string the email address
80
  * - euid string the email unique id
81
  * - leid string the list member's truly unique id
82
  */
83
  public function del($id, $emails) {
84
  $_params = array("id" => $id, "emails" => $emails);
85
  return $this->master->call('vip/del', $_params);
86
  }
87
  /**
88
  * Retrieve all Golden Monkey(s) for an account
89
  * @return array structs for each Golden Monkey, including:
90
  * - list_id string The id of the List the Member appears on
91
  * - list_name string The name of the List the Member appears on
92
  * - email string The email address of the member
93
  * - fname string IF a FNAME merge field exists on the list, that value for the member
94
  * - lname string IF a LNAME merge field exists on the list, that value for the member
95
  * - member_rating int the rating of the subscriber. This will be 1 - 5 as described <a href="http://eepurl.com/f-2P" target="_blank">here</a>
96
  * - member_since string the datetime the member was added and/or confirmed
97
  */
98
  public function members() {
99
  $_params = array();
100
  return $this->master->call('vip/members', $_params);
101
  }
 
0
  public function __construct(Mailchimp $master) {
1
  $this->master = $master;
2
  }
3
  /**
4
  * Retrieve all Activity (opens/clicks) for VIPs over the past 10 days
5
  * @return array structs for each activity recorded.
6
  * - action string The action taken - either "open" or "click"
7
  * - timestamp string The datetime the action occurred in GMT
8
  * - url string IF the action is a click, the url that was clicked
9
  * - unique_id string The campaign_id of the List the Member appears on
10
  * - title string The campaign title
11
  * - list_name string The name of the List the Member appears on
12
  * - list_id string The id of the List the Member appears on
13
  * - email string The email address of the member
14
  * - fname string IF a FNAME merge field exists on the list, that value for the member
15
  * - lname string IF a LNAME merge field exists on the list, that value for the member
16
  * - member_rating int the rating of the subscriber. This will be 1 - 5 as described <a href="http://eepurl.com/f-2P" target="_blank">here</a>
17
  * - member_since string the datetime the member was added and/or confirmed
18
  * - geo associative_array the geographic information if we have it. including:
19
  * - latitude string the latitude
20
  * - longitude string the longitude
21
  * - gmtoff string GMT offset
22
  * - dstoff string GMT offset during daylight savings (if DST not observered, will be same as gmtoff
23
  * - timezone string the timezone we've place them in
24
  * - cc string 2 digit ISO-3166 country code
25
  * - region string generally state, province, or similar
26
  */
27
  public function activity() {
28
  $_params = array();
29
  return $this->master->call('vip/activity', $_params);
30
  }
31
  /**
32
  * Add VIPs (previously called Golden Monkeys)
33
  * @param string $id
34
  * @param array $emails
35
  * - email string an email address - for new subscribers obviously this should be used
36
  * - euid string the unique id for an email address (not list related) - the email "id" returned from listMemberInfo, Webhooks, Campaigns, etc.
37
  * - leid string the list email id (previously called web_id) for a list-member-info type call. this doesn't change when the email address changes
38
  * @return associative_array of data and success/error counts
39
  * - success_count int the number of successful adds
40
  * - error_count int the number of unsuccessful adds
41
  * - errors array array of error structs including:
42
  * - email associative_array whatever was passed in the email parameter
43
  * - email string the email address added
44
  * - euid string the email unique id
45
  * - leid string the list member's truly unique id
46
  * - code string the error code
47
  * - error string the error message
48
  * - data array array of structs for each member added
49
  * - email associative_array whatever was passed in the email parameter
50
  * - email string the email address added
51
  * - euid string the email unique id
52
  * - leid string the list member's truly unique id
53
  */
54
  public function add($id, $emails) {
55
  $_params = array("id" => $id, "emails" => $emails);
56
  return $this->master->call('vip/add', $_params);
57
  }
58
  /**
59
  * Remove VIPs - this does not affect list membership
60
  * @param string $id
61
  * @param array $emails
62
  * - email string an email address - for new subscribers obviously this should be used
63
  * - euid string the unique id for an email address (not list related) - the email "id" returned from listMemberInfo, Webhooks, Campaigns, etc.
64
  * - leid string the list email id (previously called web_id) for a list-member-info type call. this doesn't change when the email address changes
65
  * @return associative_array of data and success/error counts
66
  * - success_count int the number of successful deletions
67
  * - error_count int the number of unsuccessful deletions
68
  * - errors array array of error structs including:
69
  * - email associative_array whatever was passed in the email parameter
70
  * - email string the email address
71
  * - euid string the email unique id
72
  * - leid string the list member's truly unique id
73
  * - code string the error code
74
  * - msg string the error message
75
  * - data array array of structs for each member deleted
76
  * - email associative_array whatever was passed in the email parameter
77
  * - email string the email address
78
  * - euid string the email unique id
79
  * - leid string the list member's truly unique id
80
  */
81
  public function del($id, $emails) {
82
  $_params = array("id" => $id, "emails" => $emails);
83
  return $this->master->call('vip/del', $_params);
84
  }
85
  /**
86
  * Retrieve all Golden Monkey(s) for an account
87
  * @return array structs for each Golden Monkey, including:
88
  * - list_id string The id of the List the Member appears on
89
  * - list_name string The name of the List the Member appears on
90
  * - email string The email address of the member
91
  * - fname string IF a FNAME merge field exists on the list, that value for the member
92
  * - lname string IF a LNAME merge field exists on the list, that value for the member
93
  * - member_rating int the rating of the subscriber. This will be 1 - 5 as described <a href="http://eepurl.com/f-2P" target="_blank">here</a>
94
  * - member_since string the datetime the member was added and/or confirmed
95
  */
96
  public function members() {
97
  $_params = array();
98
  return $this->master->call('vip/members', $_params);
99
  }
includes/class-yikes-inc-easy-mailchimp-extender.php CHANGED
@@ -62,7 +62,7 @@ class Yikes_Inc_Easy_Mailchimp_Extender {
62
  */
63
  public function __construct() {
64
  $this->yikes_inc_easy_mailchimp_extender = 'yikes-inc-easy-mailchimp-extender';
65
- $this->version = '6.0.4.7';
66
  $this->load_dependencies();
67
  $this->define_admin_hooks();
68
  $this->define_public_hooks();
62
  */
63
  public function __construct() {
64
  $this->yikes_inc_easy_mailchimp_extender = 'yikes-inc-easy-mailchimp-extender';
65
+ $this->version = '6.0.5';
66
  $this->load_dependencies();
67
  $this->define_admin_hooks();
68
  $this->define_public_hooks();
includes/error_log/yikes-easy-mailchimp-error-log.php CHANGED
@@ -1,46 +0,0 @@
1
- <tr>
2
- <td class="row-title">
3
- <label for="tablecell">
4
- <em>API Call To Helper/ping Failed: Could Not Resolve Host: Us32.api.mailchimp.com</em>
5
- </label>
6
- </td>
7
- <td>
8
- Page: Settings Page/General Settings || Type: Connecting to MailChimp || Time: November 9, 2015 4:29 pm </td>
9
- </tr>
10
- <tr>
11
- <td class="row-title">
12
- <label for="tablecell">
13
- <em>API Call To Helper/ping Failed: Could Not Resolve Host: Us32.api.mailchimp.com</em>
14
- </label>
15
- </td>
16
- <td>
17
- Page: Settings Page/General Settings || Type: Connecting to MailChimp || Time: November 9, 2015 4:28 pm </td>
18
- </tr>
19
- <tr>
20
- <td class="row-title">
21
- <label for="tablecell">
22
- <em>API Call To Helper/ping Failed: Could Not Resolve Host: Us32.api.mailchimp.com</em>
23
- </label>
24
- </td>
25
- <td>
26
- Page: Settings Page/General Settings || Type: Connecting to MailChimp || Time: November 9, 2015 3:43 pm </td>
27
- </tr>
28
- <tr>
29
- <td class="row-title">
30
- <label for="tablecell">
31
- <em>You Must Provide A MailChimp API Key</em>
32
- </label>
33
- </td>
34
- <td>
35
- Page: Settings Page/General Settings || Type: Connecting to MailChimp || Time: November 9, 2015 3:39 pm </td>
36
- </tr>
37
- <tr>
38
- <td class="row-title">
39
- <label for="tablecell">
40
- <em>You Must Provide A MailChimp API Key</em>
41
- </label>
42
- </td>
43
- <td>
44
- Page: Settings Page/General Settings || Type: Connecting to MailChimp || Time: November 9, 2015 3:37 pm </td>
45
- </tr>
46
-
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
includes/import-export/yikes-easy-mailchimp-import.class.php CHANGED
@@ -70,7 +70,7 @@ class Yikes_Inc_Easy_MailChimp_Import_Class {
70
  '%s', // redirect user
71
  '%s', // redirect page
72
  '%s', // submission
73
- '%s', // optin
74
  '%s', // error
75
  '%s', // custom notifications
76
  '%d', // impressions #
70
  '%s', // redirect user
71
  '%s', // redirect page
72
  '%s', // submission
73
+ '%s', // opt-in
74
  '%s', // error
75
  '%s', // custom notifications
76
  '%d', // impressions #
public/classes/checkbox-integrations.php CHANGED
@@ -30,13 +30,21 @@
30
  $current_user = wp_get_current_user();
31
  $email = $current_user->user_email;
32
  try {
33
- $MailChimp = new MailChimp( get_option( 'yikes-mc-api-key' , '' ) );
34
- // subscribe the user
35
- $already_subscribed = $MailChimp->call('/lists/member-info', array(
36
- 'api_key' => get_option( 'yikes-mc-api-key' , '' ),
37
- 'id' => $checkbox_options[$integration_type]['associated-list'],
38
- 'emails' => array( array( 'email' => sanitize_email( $email ) ) ),
 
 
 
 
 
 
 
39
  ) );
 
40
  return $already_subscribed['success_count'];
41
  } catch ( Exception $error ) {
42
  return $error->getMessage();
@@ -59,13 +67,21 @@
59
  // first check if the user is logged in
60
  $checkbox_options = get_option( 'optin-checkbox-init' , '' );
61
  try {
62
- $MailChimp = new MailChimp( get_option( 'yikes-mc-api-key' , '' ) );
63
- // subscribe the user
64
- $already_subscribed = $MailChimp->call('/lists/member-info', array(
65
- 'api_key' => get_option( 'yikes-mc-api-key' , '' ),
66
- 'id' => $checkbox_options[$integration_type]['associated-list'],
67
- 'emails' => array( array( 'email' => sanitize_email( $email ) ) ),
 
 
 
 
 
 
 
68
  ) );
 
69
  return $already_subscribed['success_count'];
70
  } catch ( Exception $error ) {
71
  return $error->getMessage();
@@ -138,17 +154,24 @@
138
  }
139
  // initialize MailChimp API
140
  try {
141
- $MailChimp = new MailChimp( get_option( 'yikes-mc-api-key' , '' ) );
142
- // subscribe the user
143
- $subscribe_response = $MailChimp->call( '/lists/subscribe', apply_filters( 'yikes-mailchimp-checkbox-integration-subscribe-api-request', array(
144
- 'api_key' => get_option( 'yikes-mc-api-key' , '' ),
145
- 'id' => $checkbox_options[$type]['associated-list'],
146
- 'email' => array( 'email' => sanitize_email( $email ) ),
147
- 'merge_vars' => apply_filters( 'yikes-mailchimp-checkbox-integration-merge-variables', $merge_vars, $type ), // filter merge variables
148
- 'double_optin' => 1,
149
- 'update_existing' => $update,
150
- 'send_welcome' => 1
151
- ), $type ) );
 
 
 
 
 
 
 
152
  } catch( Exception $e ) {
153
  $e->getMessage();
154
  }
30
  $current_user = wp_get_current_user();
31
  $email = $current_user->user_email;
32
  try {
33
+ $api_key = trim( get_option( 'yikes-mc-api-key' , '' ) );
34
+ $dash_position = strpos( $api_key, '-' );
35
+ if( $dash_position !== false ) {
36
+ $api_endpoint = 'https://' . substr( $api_key, $dash_position + 1 ) . '.api.mailchimp.com/2.0/lists/member-info.json';
37
+ }
38
+ $already_subscribed = wp_remote_post( $api_endpoint, array(
39
+ 'body' => array(
40
+ 'apikey' => $api_key,
41
+ 'id' => $checkbox_options[$integration_type]['associated-list'],
42
+ 'emails' => array( array( 'email' => sanitize_email( $email ) ) )
43
+ ),
44
+ 'timeout' => 10,
45
+ 'sslverify' => apply_filters( 'yikes-mailchimp-sslverify', true )
46
  ) );
47
+ $already_subscribed = json_decode( wp_remote_retrieve_body( $already_subscribed ), true );
48
  return $already_subscribed['success_count'];
49
  } catch ( Exception $error ) {
50
  return $error->getMessage();
67
  // first check if the user is logged in
68
  $checkbox_options = get_option( 'optin-checkbox-init' , '' );
69
  try {
70
+ $api_key = trim( get_option( 'yikes-mc-api-key' , '' ) );
71
+ $dash_position = strpos( $api_key, '-' );
72
+ if( $dash_position !== false ) {
73
+ $api_endpoint = 'https://' . substr( $api_key, $dash_position + 1 ) . '.api.mailchimp.com/2.0/lists/member-info.json';
74
+ }
75
+ $already_subscribed = wp_remote_post( $api_endpoint, array(
76
+ 'body' => array(
77
+ 'apikey' => $api_key,
78
+ 'id' => $checkbox_options[$integration_type]['associated-list'],
79
+ 'emails' => array( array( 'email' => sanitize_email( $email ) ) )
80
+ ),
81
+ 'timeout' => 10,
82
+ 'sslverify' => apply_filters( 'yikes-mailchimp-sslverify', true )
83
  ) );
84
+ $already_subscribed = json_decode( wp_remote_retrieve_body( $already_subscribed ), true );
85
  return $already_subscribed['success_count'];
86
  } catch ( Exception $error ) {
87
  return $error->getMessage();
154
  }
155
  // initialize MailChimp API
156
  try {
157
+ $api_key = trim( get_option( 'yikes-mc-api-key' , '' ) );
158
+ $dash_position = strpos( $api_key, '-' );
159
+ if( $dash_position !== false ) {
160
+ $api_endpoint = 'https://' . substr( $api_key, $dash_position + 1 ) . '.api.mailchimp.com/2.0/lists/subscribe.json';
161
+ }
162
+ $subscribe_response = wp_remote_post( $api_endpoint, array(
163
+ 'body' => apply_filters( 'yikes-mailchimp-checkbox-integration-subscribe-api-request', array(
164
+ 'api_key' => get_option( 'yikes-mc-api-key' , '' ),
165
+ 'id' => $checkbox_options[$type]['associated-list'],
166
+ 'email' => array( 'email' => sanitize_email( $email ) ),
167
+ 'merge_vars' => apply_filters( 'yikes-mailchimp-checkbox-integration-merge-variables', $merge_vars, $type ), // filter merge variables
168
+ 'double_optin' => 1,
169
+ 'update_existing' => $update,
170
+ 'send_welcome' => 1
171
+ ), $type ),
172
+ 'timeout' => 10,
173
+ 'sslverify' => apply_filters( 'yikes-mailchimp-sslverify', true )
174
+ ) );
175
  } catch( Exception $e ) {
176
  $e->getMessage();
177
  }
public/css/yikes-inc-easy-mailchimp-checkbox-integration.min.css CHANGED
@@ -1,2 +1 @@
1
- input[name=yikes_mailchimp_checkbox_easy_digital_downloads_checkout_form]{margin-top:3px!important}.yikes-easy-mailchimp-registration_form-checkbox{margin-bottom:.8em!important}#yikes-easy-mailchimp-buddypress_form-checkbox{display:inline-block}#yikes-mailchimp-checkbox-section{width:48%;float:right}
2
- /*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInlpa2VzLWluYy1lYXN5LW1haWxjaGltcC1jaGVja2JveC1pbnRlZ3JhdGlvbi5taW4uY3NzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLDBFQUEwRSx3QkFBd0IsQ0FBQyxpREFBaUQsNEJBQTRCLENBQUMsK0NBQStDLG9CQUFvQixDQUFDLGtDQUFrQyxVQUFVLFdBQVcsQ0FBQyIsImZpbGUiOiJ5aWtlcy1pbmMtZWFzeS1tYWlsY2hpbXAtY2hlY2tib3gtaW50ZWdyYXRpb24ubWluLmNzcyIsInNvdXJjZXNDb250ZW50IjpbImlucHV0W25hbWU9eWlrZXNfbWFpbGNoaW1wX2NoZWNrYm94X2Vhc3lfZGlnaXRhbF9kb3dubG9hZHNfY2hlY2tvdXRfZm9ybV17bWFyZ2luLXRvcDozcHghaW1wb3J0YW50fS55aWtlcy1lYXN5LW1haWxjaGltcC1yZWdpc3RyYXRpb25fZm9ybS1jaGVja2JveHttYXJnaW4tYm90dG9tOi44ZW0haW1wb3J0YW50fSN5aWtlcy1lYXN5LW1haWxjaGltcC1idWRkeXByZXNzX2Zvcm0tY2hlY2tib3h7ZGlzcGxheTppbmxpbmUtYmxvY2t9I3lpa2VzLW1haWxjaGltcC1jaGVja2JveC1zZWN0aW9ue3dpZHRoOjQ4JTtmbG9hdDpyaWdodH0iXX0= */
1
+ input[name=yikes_mailchimp_checkbox_easy_digital_downloads_checkout_form]{margin-top:3px!important}.yikes-easy-mailchimp-registration_form-checkbox{margin-bottom:.8em!important}#yikes-easy-mailchimp-buddypress_form-checkbox{display:inline-block}#yikes-mailchimp-checkbox-section{width:48%;float:right}
 
public/css/yikes-inc-easy-mailchimp-datepicker-styles.min.css CHANGED
@@ -4,5 +4,4 @@
4
  * Copyright 2012 Stefan Petre
5
  * Improvements by Andrew Rowls
6
  * Licensed under the Apache License v2.0 (http://www.apache.org/licenses/LICENSE-2.0)
7
- */.datepicker-dropdown:after,.datepicker-dropdown:before{content:'';display:inline-block;border-top:0;position:absolute}.datepicker{padding:4px;border-radius:4px;direction:ltr}.datepicker-inline{width:220px}.datepicker.datepicker-rtl{direction:rtl}.datepicker.datepicker-rtl table tr td span{float:right}.datepicker-dropdown{top:0;left:0}.datepicker-dropdown:before{border-left:7px solid transparent;border-right:7px solid transparent;border-bottom:7px solid #ccc;border-bottom-color:rgba(0,0,0,.2)}.datepicker-dropdown:after{border-left:6px solid transparent;border-right:6px solid transparent;border-bottom:6px solid #fff}.datepicker-dropdown.datepicker-orient-left:before{left:6px}.datepicker-dropdown.datepicker-orient-left:after{left:7px}.datepicker-dropdown.datepicker-orient-right:before{right:6px}.datepicker-dropdown.datepicker-orient-right:after{right:7px}.datepicker-dropdown.datepicker-orient-top:before{top:-7px}.datepicker-dropdown.datepicker-orient-top:after{top:-6px}.datepicker-dropdown.datepicker-orient-bottom:before{bottom:-7px;border-bottom:0;border-top:7px solid #999}.datepicker-dropdown.datepicker-orient-bottom:after{bottom:-6px;border-bottom:0;border-top:6px solid #fff}.datepicker>div{display:none}.datepicker.days .datepicker-days,.datepicker.months .datepicker-months,.datepicker.years .datepicker-years{display:block}.datepicker table{margin:0;-webkit-touch-callout:none;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.datepicker table tr td,.datepicker table tr th{text-align:center;width:30px;height:30px;border-radius:4px;border:none}.table-striped .datepicker table tr td,.table-striped .datepicker table tr th{background-color:transparent}.datepicker table tr td.day.focused,.datepicker table tr td.day:hover{background:#eee;cursor:pointer}.datepicker table tr td.new,.datepicker table tr td.old{color:#999}.datepicker table tr td.disabled,.datepicker table tr td.disabled:hover{background:0 0;color:#999;cursor:default}.datepicker table tr td.today,.datepicker table tr td.today.disabled,.datepicker table tr td.today.disabled:hover,.datepicker table tr td.today:hover{color:#000;background-color:#ffdb99;border-color:#ffb733}.datepicker table tr td.today.active,.datepicker table tr td.today.disabled.active,.datepicker table tr td.today.disabled:active,.datepicker table tr td.today.disabled:focus,.datepicker table tr td.today.disabled:hover,.datepicker table tr td.today.disabled:hover.active,.datepicker table tr td.today.disabled:hover:active,.datepicker table tr td.today.disabled:hover:focus,.datepicker table tr td.today.disabled:hover:hover,.datepicker table tr td.today:active,.datepicker table tr td.today:focus,.datepicker table tr td.today:hover,.datepicker table tr td.today:hover.active,.datepicker table tr td.today:hover:active,.datepicker table tr td.today:hover:focus,.datepicker table tr td.today:hover:hover,.open .dropdown-toggle.datepicker table tr td.today,.open .dropdown-toggle.datepicker table tr td.today.disabled,.open .dropdown-toggle.datepicker table tr td.today.disabled:hover,.open .dropdown-toggle.datepicker table tr td.today:hover{color:#000;background-color:#ffcd70;border-color:#f59e00}.datepicker table tr td.today.active,.datepicker table tr td.today.disabled.active,.datepicker table tr td.today.disabled:active,.datepicker table tr td.today.disabled:hover.active,.datepicker table tr td.today.disabled:hover:active,.datepicker table tr td.today:active,.datepicker table tr td.today:hover.active,.datepicker table tr td.today:hover:active,.open .dropdown-toggle.datepicker table tr td.today,.open .dropdown-toggle.datepicker table tr td.today.disabled,.open .dropdown-toggle.datepicker table tr td.today.disabled:hover,.open .dropdown-toggle.datepicker table tr td.today:hover{background-image:none}.datepicker table tr td.today.disabled,.datepicker table tr td.today.disabled.active,.datepicker table tr td.today.disabled.disabled,.datepicker table tr td.today.disabled.disabled.active,.datepicker table tr td.today.disabled.disabled:active,.datepicker table tr td.today.disabled.disabled:focus,.datepicker table tr td.today.disabled.disabled:hover,.datepicker table tr td.today.disabled:active,.datepicker table tr td.today.disabled:focus,.datepicker table tr td.today.disabled:hover,.datepicker table tr td.today.disabled:hover.disabled,.datepicker table tr td.today.disabled:hover.disabled.active,.datepicker table tr td.today.disabled:hover.disabled:active,.datepicker table tr td.today.disabled:hover.disabled:focus,.datepicker table tr td.today.disabled:hover.disabled:hover,.datepicker table tr td.today.disabled:hover[disabled],.datepicker table tr td.today.disabled:hover[disabled].active,.datepicker table tr td.today.disabled:hover[disabled]:active,.datepicker table tr td.today.disabled:hover[disabled]:focus,.datepicker table tr td.today.disabled:hover[disabled]:hover,.datepicker table tr td.today.disabled[disabled],.datepicker table tr td.today.disabled[disabled].active,.datepicker table tr td.today.disabled[disabled]:active,.datepicker table tr td.today.disabled[disabled]:focus,.datepicker table tr td.today.disabled[disabled]:hover,.datepicker table tr td.today:hover.disabled,.datepicker table tr td.today:hover.disabled.active,.datepicker table tr td.today:hover.disabled:active,.datepicker table tr td.today:hover.disabled:focus,.datepicker table tr td.today:hover.disabled:hover,.datepicker table tr td.today:hover[disabled],.datepicker table tr td.today:hover[disabled].active,.datepicker table tr td.today:hover[disabled]:active,.datepicker table tr td.today:hover[disabled]:focus,.datepicker table tr td.today:hover[disabled]:hover,.datepicker table tr td.today[disabled],.datepicker table tr td.today[disabled].active,.datepicker table tr td.today[disabled]:active,.datepicker table tr td.today[disabled]:focus,.datepicker table tr td.today[disabled]:hover,fieldset[disabled] .datepicker table tr td.today,fieldset[disabled] .datepicker table tr td.today.active,fieldset[disabled] .datepicker table tr td.today.disabled,fieldset[disabled] .datepicker table tr td.today.disabled.active,fieldset[disabled] .datepicker table tr td.today.disabled:active,fieldset[disabled] .datepicker table tr td.today.disabled:focus,fieldset[disabled] .datepicker table tr td.today.disabled:hover,fieldset[disabled] .datepicker table tr td.today.disabled:hover.active,fieldset[disabled] .datepicker table tr td.today.disabled:hover:active,fieldset[disabled] .datepicker table tr td.today.disabled:hover:focus,fieldset[disabled] .datepicker table tr td.today.disabled:hover:hover,fieldset[disabled] .datepicker table tr td.today:active,fieldset[disabled] .datepicker table tr td.today:focus,fieldset[disabled] .datepicker table tr td.today:hover,fieldset[disabled] .datepicker table tr td.today:hover.active,fieldset[disabled] .datepicker table tr td.today:hover:active,fieldset[disabled] .datepicker table tr td.today:hover:focus,fieldset[disabled] .datepicker table tr td.today:hover:hover{background-color:#ffdb99;border-color:#ffb733}.datepicker table tr td.today:hover:hover{color:#000}.datepicker table tr td.today.active:hover{color:#fff}.datepicker table tr td.range,.datepicker table tr td.range.disabled,.datepicker table tr td.range.disabled:hover,.datepicker table tr td.range:hover{background:#eee;border-radius:0}.datepicker table tr td.active.active,.datepicker table tr td.active.disabled.active,.datepicker table tr td.active.disabled:active,.datepicker table tr td.active.disabled:hover.active,.datepicker table tr td.active.disabled:hover:active,.datepicker table tr td.active:active,.datepicker table tr td.active:hover.active,.datepicker table tr td.active:hover:active,.datepicker table tr td.range.today.active,.datepicker table tr td.range.today.disabled.active,.datepicker table tr td.range.today.disabled:active,.datepicker table tr td.range.today.disabled:hover.active,.datepicker table tr td.range.today.disabled:hover:active,.datepicker table tr td.range.today:active,.datepicker table tr td.range.today:hover.active,.datepicker table tr td.range.today:hover:active,.datepicker table tr td.selected.active,.datepicker table tr td.selected.disabled.active,.datepicker table tr td.selected.disabled:active,.datepicker table tr td.selected.disabled:hover.active,.datepicker table tr td.selected.disabled:hover:active,.datepicker table tr td.selected:active,.datepicker table tr td.selected:hover.active,.datepicker table tr td.selected:hover:active,.open .dropdown-toggle.datepicker table tr td.active,.open .dropdown-toggle.datepicker table tr td.active.disabled,.open .dropdown-toggle.datepicker table tr td.active.disabled:hover,.open .dropdown-toggle.datepicker table tr td.active:hover,.open .dropdown-toggle.datepicker table tr td.range.today,.open .dropdown-toggle.datepicker table tr td.range.today.disabled,.open .dropdown-toggle.datepicker table tr td.range.today.disabled:hover,.open .dropdown-toggle.datepicker table tr td.range.today:hover,.open .dropdown-toggle.datepicker table tr td.selected,.open .dropdown-toggle.datepicker table tr td.selected.disabled,.open .dropdown-toggle.datepicker table tr td.selected.disabled:hover,.open .dropdown-toggle.datepicker table tr td.selected:hover{background-image:none}.datepicker table tr td.range.today,.datepicker table tr td.range.today.disabled,.datepicker table tr td.range.today.disabled:hover,.datepicker table tr td.range.today:hover{color:#000;background-color:#f7ca77;border-color:#f1a417;border-radius:0}.datepicker table tr td.range.today.active,.datepicker table tr td.range.today.disabled.active,.datepicker table tr td.range.today.disabled:active,.datepicker table tr td.range.today.disabled:focus,.datepicker table tr td.range.today.disabled:hover,.datepicker table tr td.range.today.disabled:hover.active,.datepicker table tr td.range.today.disabled:hover:active,.datepicker table tr td.range.today.disabled:hover:focus,.datepicker table tr td.range.today.disabled:hover:hover,.datepicker table tr td.range.today:active,.datepicker table tr td.range.today:focus,.datepicker table tr td.range.today:hover,.datepicker table tr td.range.today:hover.active,.datepicker table tr td.range.today:hover:active,.datepicker table tr td.range.today:hover:focus,.datepicker table tr td.range.today:hover:hover,.open .dropdown-toggle.datepicker table tr td.range.today,.open .dropdown-toggle.datepicker table tr td.range.today.disabled,.open .dropdown-toggle.datepicker table tr td.range.today.disabled:hover,.open .dropdown-toggle.datepicker table tr td.range.today:hover{color:#000;background-color:#f4bb51;border-color:#bf800c}.datepicker table tr td.range.today.disabled,.datepicker table tr td.range.today.disabled.active,.datepicker table tr td.range.today.disabled.disabled,.datepicker table tr td.range.today.disabled.disabled.active,.datepicker table tr td.range.today.disabled.disabled:active,.datepicker table tr td.range.today.disabled.disabled:focus,.datepicker table tr td.range.today.disabled.disabled:hover,.datepicker table tr td.range.today.disabled:active,.datepicker table tr td.range.today.disabled:focus,.datepicker table tr td.range.today.disabled:hover,.datepicker table tr td.range.today.disabled:hover.disabled,.datepicker table tr td.range.today.disabled:hover.disabled.active,.datepicker table tr td.range.today.disabled:hover.disabled:active,.datepicker table tr td.range.today.disabled:hover.disabled:focus,.datepicker table tr td.range.today.disabled:hover.disabled:hover,.datepicker table tr td.range.today.disabled:hover[disabled],.datepicker table tr td.range.today.disabled:hover[disabled].active,.datepicker table tr td.range.today.disabled:hover[disabled]:active,.datepicker table tr td.range.today.disabled:hover[disabled]:focus,.datepicker table tr td.range.today.disabled:hover[disabled]:hover,.datepicker table tr td.range.today.disabled[disabled],.datepicker table tr td.range.today.disabled[disabled].active,.datepicker table tr td.range.today.disabled[disabled]:active,.datepicker table tr td.range.today.disabled[disabled]:focus,.datepicker table tr td.range.today.disabled[disabled]:hover,.datepicker table tr td.range.today:hover.disabled,.datepicker table tr td.range.today:hover.disabled.active,.datepicker table tr td.range.today:hover.disabled:active,.datepicker table tr td.range.today:hover.disabled:focus,.datepicker table tr td.range.today:hover.disabled:hover,.datepicker table tr td.range.today:hover[disabled],.datepicker table tr td.range.today:hover[disabled].active,.datepicker table tr td.range.today:hover[disabled]:active,.datepicker table tr td.range.today:hover[disabled]:focus,.datepicker table tr td.range.today:hover[disabled]:hover,.datepicker table tr td.range.today[disabled],.datepicker table tr td.range.today[disabled].active,.datepicker table tr td.range.today[disabled]:active,.datepicker table tr td.range.today[disabled]:focus,.datepicker table tr td.range.today[disabled]:hover,fieldset[disabled] .datepicker table tr td.range.today,fieldset[disabled] .datepicker table tr td.range.today.active,fieldset[disabled] .datepicker table tr td.range.today.disabled,fieldset[disabled] .datepicker table tr td.range.today.disabled.active,fieldset[disabled] .datepicker table tr td.range.today.disabled:active,fieldset[disabled] .datepicker table tr td.range.today.disabled:focus,fieldset[disabled] .datepicker table tr td.range.today.disabled:hover,fieldset[disabled] .datepicker table tr td.range.today.disabled:hover.active,fieldset[disabled] .datepicker table tr td.range.today.disabled:hover:active,fieldset[disabled] .datepicker table tr td.range.today.disabled:hover:focus,fieldset[disabled] .datepicker table tr td.range.today.disabled:hover:hover,fieldset[disabled] .datepicker table tr td.range.today:active,fieldset[disabled] .datepicker table tr td.range.today:focus,fieldset[disabled] .datepicker table tr td.range.today:hover,fieldset[disabled] .datepicker table tr td.range.today:hover.active,fieldset[disabled] .datepicker table tr td.range.today:hover:active,fieldset[disabled] .datepicker table tr td.range.today:hover:focus,fieldset[disabled] .datepicker table tr td.range.today:hover:hover{background-color:#f7ca77;border-color:#f1a417}.datepicker table tr td.selected,.datepicker table tr td.selected.disabled,.datepicker table tr td.selected.disabled:hover,.datepicker table tr td.selected:hover{color:#fff;background-color:#999;border-color:#555;text-shadow:0 -1px 0 rgba(0,0,0,.25)}.datepicker table tr td.selected.active,.datepicker table tr td.selected.disabled.active,.datepicker table tr td.selected.disabled:active,.datepicker table tr td.selected.disabled:focus,.datepicker table tr td.selected.disabled:hover,.datepicker table tr td.selected.disabled:hover.active,.datepicker table tr td.selected.disabled:hover:active,.datepicker table tr td.selected.disabled:hover:focus,.datepicker table tr td.selected.disabled:hover:hover,.datepicker table tr td.selected:active,.datepicker table tr td.selected:focus,.datepicker table tr td.selected:hover,.datepicker table tr td.selected:hover.active,.datepicker table tr td.selected:hover:active,.datepicker table tr td.selected:hover:focus,.datepicker table tr td.selected:hover:hover,.open .dropdown-toggle.datepicker table tr td.selected,.open .dropdown-toggle.datepicker table tr td.selected.disabled,.open .dropdown-toggle.datepicker table tr td.selected.disabled:hover,.open .dropdown-toggle.datepicker table tr td.selected:hover{color:#fff;background-color:#858585;border-color:#373737}.datepicker table tr td.selected.disabled,.datepicker table tr td.selected.disabled.active,.datepicker table tr td.selected.disabled.disabled,.datepicker table tr td.selected.disabled.disabled.active,.datepicker table tr td.selected.disabled.disabled:active,.datepicker table tr td.selected.disabled.disabled:focus,.datepicker table tr td.selected.disabled.disabled:hover,.datepicker table tr td.selected.disabled:active,.datepicker table tr td.selected.disabled:focus,.datepicker table tr td.selected.disabled:hover,.datepicker table tr td.selected.disabled:hover.disabled,.datepicker table tr td.selected.disabled:hover.disabled.active,.datepicker table tr td.selected.disabled:hover.disabled:active,.datepicker table tr td.selected.disabled:hover.disabled:focus,.datepicker table tr td.selected.disabled:hover.disabled:hover,.datepicker table tr td.selected.disabled:hover[disabled],.datepicker table tr td.selected.disabled:hover[disabled].active,.datepicker table tr td.selected.disabled:hover[disabled]:active,.datepicker table tr td.selected.disabled:hover[disabled]:focus,.datepicker table tr td.selected.disabled:hover[disabled]:hover,.datepicker table tr td.selected.disabled[disabled],.datepicker table tr td.selected.disabled[disabled].active,.datepicker table tr td.selected.disabled[disabled]:active,.datepicker table tr td.selected.disabled[disabled]:focus,.datepicker table tr td.selected.disabled[disabled]:hover,.datepicker table tr td.selected:hover.disabled,.datepicker table tr td.selected:hover.disabled.active,.datepicker table tr td.selected:hover.disabled:active,.datepicker table tr td.selected:hover.disabled:focus,.datepicker table tr td.selected:hover.disabled:hover,.datepicker table tr td.selected:hover[disabled],.datepicker table tr td.selected:hover[disabled].active,.datepicker table tr td.selected:hover[disabled]:active,.datepicker table tr td.selected:hover[disabled]:focus,.datepicker table tr td.selected:hover[disabled]:hover,.datepicker table tr td.selected[disabled],.datepicker table tr td.selected[disabled].active,.datepicker table tr td.selected[disabled]:active,.datepicker table tr td.selected[disabled]:focus,.datepicker table tr td.selected[disabled]:hover,fieldset[disabled] .datepicker table tr td.selected,fieldset[disabled] .datepicker table tr td.selected.active,fieldset[disabled] .datepicker table tr td.selected.disabled,fieldset[disabled] .datepicker table tr td.selected.disabled.active,fieldset[disabled] .datepicker table tr td.selected.disabled:active,fieldset[disabled] .datepicker table tr td.selected.disabled:focus,fieldset[disabled] .datepicker table tr td.selected.disabled:hover,fieldset[disabled] .datepicker table tr td.selected.disabled:hover.active,fieldset[disabled] .datepicker table tr td.selected.disabled:hover:active,fieldset[disabled] .datepicker table tr td.selected.disabled:hover:focus,fieldset[disabled] .datepicker table tr td.selected.disabled:hover:hover,fieldset[disabled] .datepicker table tr td.selected:active,fieldset[disabled] .datepicker table tr td.selected:focus,fieldset[disabled] .datepicker table tr td.selected:hover,fieldset[disabled] .datepicker table tr td.selected:hover.active,fieldset[disabled] .datepicker table tr td.selected:hover:active,fieldset[disabled] .datepicker table tr td.selected:hover:focus,fieldset[disabled] .datepicker table tr td.selected:hover:hover{background-color:#999;border-color:#555}.datepicker table tr td.active,.datepicker table tr td.active.disabled,.datepicker table tr td.active.disabled:hover,.datepicker table tr td.active:hover{color:#fff;background-color:#428bca;border-color:#357ebd;text-shadow:0 -1px 0 rgba(0,0,0,.25)}.datepicker table tr td.active.active,.datepicker table tr td.active.disabled.active,.datepicker table tr td.active.disabled:active,.datepicker table tr td.active.disabled:focus,.datepicker table tr td.active.disabled:hover,.datepicker table tr td.active.disabled:hover.active,.datepicker table tr td.active.disabled:hover:active,.datepicker table tr td.active.disabled:hover:focus,.datepicker table tr td.active.disabled:hover:hover,.datepicker table tr td.active:active,.datepicker table tr td.active:focus,.datepicker table tr td.active:hover,.datepicker table tr td.active:hover.active,.datepicker table tr td.active:hover:active,.datepicker table tr td.active:hover:focus,.datepicker table tr td.active:hover:hover,.open .dropdown-toggle.datepicker table tr td.active,.open .dropdown-toggle.datepicker table tr td.active.disabled,.open .dropdown-toggle.datepicker table tr td.active.disabled:hover,.open .dropdown-toggle.datepicker table tr td.active:hover{color:#fff;background-color:rgba(190,190,190,.76);border-color:rgba(190,190,190,.76)}.datepicker table tr td.active.disabled,.datepicker table tr td.active.disabled.active,.datepicker table tr td.active.disabled.disabled,.datepicker table tr td.active.disabled.disabled.active,.datepicker table tr td.active.disabled.disabled:active,.datepicker table tr td.active.disabled.disabled:focus,.datepicker table tr td.active.disabled.disabled:hover,.datepicker table tr td.active.disabled:active,.datepicker table tr td.active.disabled:focus,.datepicker table tr td.active.disabled:hover,.datepicker table tr td.active.disabled:hover.disabled,.datepicker table tr td.active.disabled:hover.disabled.active,.datepicker table tr td.active.disabled:hover.disabled:active,.datepicker table tr td.active.disabled:hover.disabled:focus,.datepicker table tr td.active.disabled:hover.disabled:hover,.datepicker table tr td.active.disabled:hover[disabled],.datepicker table tr td.active.disabled:hover[disabled].active,.datepicker table tr td.active.disabled:hover[disabled]:active,.datepicker table tr td.active.disabled:hover[disabled]:focus,.datepicker table tr td.active.disabled:hover[disabled]:hover,.datepicker table tr td.active.disabled[disabled],.datepicker table tr td.active.disabled[disabled].active,.datepicker table tr td.active.disabled[disabled]:active,.datepicker table tr td.active.disabled[disabled]:focus,.datepicker table tr td.active.disabled[disabled]:hover,.datepicker table tr td.active:hover.disabled,.datepicker table tr td.active:hover.disabled.active,.datepicker table tr td.active:hover.disabled:active,.datepicker table tr td.active:hover.disabled:focus,.datepicker table tr td.active:hover.disabled:hover,.datepicker table tr td.active:hover[disabled],.datepicker table tr td.active:hover[disabled].active,.datepicker table tr td.active:hover[disabled]:active,.datepicker table tr td.active:hover[disabled]:focus,.datepicker table tr td.active:hover[disabled]:hover,.datepicker table tr td.active[disabled],.datepicker table tr td.active[disabled].active,.datepicker table tr td.active[disabled]:active,.datepicker table tr td.active[disabled]:focus,.datepicker table tr td.active[disabled]:hover,fieldset[disabled] .datepicker table tr td.active,fieldset[disabled] .datepicker table tr td.active.active,fieldset[disabled] .datepicker table tr td.active.disabled,fieldset[disabled] .datepicker table tr td.active.disabled.active,fieldset[disabled] .datepicker table tr td.active.disabled:active,fieldset[disabled] .datepicker table tr td.active.disabled:focus,fieldset[disabled] .datepicker table tr td.active.disabled:hover,fieldset[disabled] .datepicker table tr td.active.disabled:hover.active,fieldset[disabled] .datepicker table tr td.active.disabled:hover:active,fieldset[disabled] .datepicker table tr td.active.disabled:hover:focus,fieldset[disabled] .datepicker table tr td.active.disabled:hover:hover,fieldset[disabled] .datepicker table tr td.active:active,fieldset[disabled] .datepicker table tr td.active:focus,fieldset[disabled] .datepicker table tr td.active:hover,fieldset[disabled] .datepicker table tr td.active:hover.active,fieldset[disabled] .datepicker table tr td.active:hover:active,fieldset[disabled] .datepicker table tr td.active:hover:focus,fieldset[disabled] .datepicker table tr td.active:hover:hover{background-color:#428bca;border-color:#357ebd}.datepicker table tr td span{display:block;width:23%;height:54px;line-height:54px;float:left;margin:1%;cursor:pointer;border-radius:4px}.datepicker table tr td span:hover{background:#eee}.datepicker table tr td span.disabled,.datepicker table tr td span.disabled:hover{background:0 0;color:#999;cursor:default}.datepicker table tr td span.active,.datepicker table tr td span.active.disabled,.datepicker table tr td span.active.disabled:hover,.datepicker table tr td span.active:hover{color:#fff;background-color:#428bca;border-color:#357ebd;text-shadow:0 -1px 0 rgba(0,0,0,.25)}.datepicker table tr td span.active.active,.datepicker table tr td span.active.disabled.active,.datepicker table tr td span.active.disabled:active,.datepicker table tr td span.active.disabled:focus,.datepicker table tr td span.active.disabled:hover,.datepicker table tr td span.active.disabled:hover.active,.datepicker table tr td span.active.disabled:hover:active,.datepicker table tr td span.active.disabled:hover:focus,.datepicker table tr td span.active.disabled:hover:hover,.datepicker table tr td span.active:active,.datepicker table tr td span.active:focus,.datepicker table tr td span.active:hover,.datepicker table tr td span.active:hover.active,.datepicker table tr td span.active:hover:active,.datepicker table tr td span.active:hover:focus,.datepicker table tr td span.active:hover:hover,.open .dropdown-toggle.datepicker table tr td span.active,.open .dropdown-toggle.datepicker table tr td span.active.disabled,.open .dropdown-toggle.datepicker table tr td span.active.disabled:hover,.open .dropdown-toggle.datepicker table tr td span.active:hover{color:#fff;background-color:rgba(190,190,190,.76);border-color:rgba(190,190,190,.76)}.datepicker table tr td span.active.active,.datepicker table tr td span.active.disabled.active,.datepicker table tr td span.active.disabled:active,.datepicker table tr td span.active.disabled:hover.active,.datepicker table tr td span.active.disabled:hover:active,.datepicker table tr td span.active:active,.datepicker table tr td span.active:hover.active,.datepicker table tr td span.active:hover:active,.open .dropdown-toggle.datepicker table tr td span.active,.open .dropdown-toggle.datepicker table tr td span.active.disabled,.open .dropdown-toggle.datepicker table tr td span.active.disabled:hover,.open .dropdown-toggle.datepicker table tr td span.active:hover{background-image:none}.datepicker table tr td span.active.disabled,.datepicker table tr td span.active.disabled.active,.datepicker table tr td span.active.disabled.disabled,.datepicker table tr td span.active.disabled.disabled.active,.datepicker table tr td span.active.disabled.disabled:active,.datepicker table tr td span.active.disabled.disabled:focus,.datepicker table tr td span.active.disabled.disabled:hover,.datepicker table tr td span.active.disabled:active,.datepicker table tr td span.active.disabled:focus,.datepicker table tr td span.active.disabled:hover,.datepicker table tr td span.active.disabled:hover.disabled,.datepicker table tr td span.active.disabled:hover.disabled.active,.datepicker table tr td span.active.disabled:hover.disabled:active,.datepicker table tr td span.active.disabled:hover.disabled:focus,.datepicker table tr td span.active.disabled:hover.disabled:hover,.datepicker table tr td span.active.disabled:hover[disabled],.datepicker table tr td span.active.disabled:hover[disabled].active,.datepicker table tr td span.active.disabled:hover[disabled]:active,.datepicker table tr td span.active.disabled:hover[disabled]:focus,.datepicker table tr td span.active.disabled:hover[disabled]:hover,.datepicker table tr td span.active.disabled[disabled],.datepicker table tr td span.active.disabled[disabled].active,.datepicker table tr td span.active.disabled[disabled]:active,.datepicker table tr td span.active.disabled[disabled]:focus,.datepicker table tr td span.active.disabled[disabled]:hover,.datepicker table tr td span.active:hover.disabled,.datepicker table tr td span.active:hover.disabled.active,.datepicker table tr td span.active:hover.disabled:active,.datepicker table tr td span.active:hover.disabled:focus,.datepicker table tr td span.active:hover.disabled:hover,.datepicker table tr td span.active:hover[disabled],.datepicker table tr td span.active:hover[disabled].active,.datepicker table tr td span.active:hover[disabled]:active,.datepicker table tr td span.active:hover[disabled]:focus,.datepicker table tr td span.active:hover[disabled]:hover,.datepicker table tr td span.active[disabled],.datepicker table tr td span.active[disabled].active,.datepicker table tr td span.active[disabled]:active,.datepicker table tr td span.active[disabled]:focus,.datepicker table tr td span.active[disabled]:hover,fieldset[disabled] .datepicker table tr td span.active,fieldset[disabled] .datepicker table tr td span.active.active,fieldset[disabled] .datepicker table tr td span.active.disabled,fieldset[disabled] .datepicker table tr td span.active.disabled.active,fieldset[disabled] .datepicker table tr td span.active.disabled:active,fieldset[disabled] .datepicker table tr td span.active.disabled:focus,fieldset[disabled] .datepicker table tr td span.active.disabled:hover,fieldset[disabled] .datepicker table tr td span.active.disabled:hover.active,fieldset[disabled] .datepicker table tr td span.active.disabled:hover:active,fieldset[disabled] .datepicker table tr td span.active.disabled:hover:focus,fieldset[disabled] .datepicker table tr td span.active.disabled:hover:hover,fieldset[disabled] .datepicker table tr td span.active:active,fieldset[disabled] .datepicker table tr td span.active:focus,fieldset[disabled] .datepicker table tr td span.active:hover,fieldset[disabled] .datepicker table tr td span.active:hover.active,fieldset[disabled] .datepicker table tr td span.active:hover:active,fieldset[disabled] .datepicker table tr td span.active:hover:focus,fieldset[disabled] .datepicker table tr td span.active:hover:hover{background-color:#428bca;border-color:#357ebd}.datepicker table tr td span.new,.datepicker table tr td span.old{color:#999}.datepicker .datepicker-switch{width:145px}.datepicker tfoot tr th,.datepicker thead tr:first-child th{cursor:pointer}.datepicker tfoot tr th:hover,.datepicker thead tr:first-child th:hover{background:#eee}.datepicker .cw{font-size:10px;width:12px;padding:0 2px 0 5px;vertical-align:middle}.datepicker thead tr:first-child .cw{cursor:default;background-color:transparent}.input-group.date .input-group-addon{cursor:pointer}.input-daterange{width:100%}.input-daterange input{text-align:center}.input-daterange input:first-child{border-radius:3px 0 0 3px}.input-daterange input:last-child{border-radius:0 3px 3px 0}.input-daterange .input-group-addon{width:auto;min-width:16px;padding:4px 5px;font-weight:400;line-height:1.42857143;text-align:center;text-shadow:0 1px 0 #fff;vertical-align:middle;background-color:#eee;border:solid #ccc;border-width:1px 0;margin-left:-5px;margin-right:-5px}.datepicker td.day{padding:5px!important}.datepicker thead{line-height:2.2;font-size:15px}.datepicker .table-condensed{border:none;width:100%}
8
- /*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInlpa2VzLWluYy1lYXN5LW1haWxjaGltcC1kYXRlcGlja2VyLXN0eWxlcy5taW4uY3NzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7R0FNRyx1REFBdUQsV0FBVyxxQkFBcUIsYUFBYSxpQkFBaUIsQ0FBQyxZQUFZLFlBQVksa0JBQWtCLGFBQWEsQ0FBQyxtQkFBbUIsV0FBVyxDQUFDLDJCQUEyQixhQUFhLENBQUMsNENBQTRDLFdBQVcsQ0FBQyxxQkFBcUIsTUFBTSxNQUFNLENBQUMsNEJBQTRCLGtDQUFrQyxtQ0FBbUMsNkJBQTZCLGtDQUFrQyxDQUFDLDJCQUEyQixrQ0FBa0MsbUNBQW1DLDRCQUE0QixDQUFDLG1EQUFtRCxRQUFRLENBQUMsa0RBQWtELFFBQVEsQ0FBQyxvREFBb0QsU0FBUyxDQUFDLG1EQUFtRCxTQUFTLENBQUMsa0RBQWtELFFBQVEsQ0FBQyxpREFBaUQsUUFBUSxDQUFDLHFEQUFxRCxZQUFZLGdCQUFnQix5QkFBeUIsQ0FBQyxvREFBb0QsWUFBWSxnQkFBZ0IseUJBQXlCLENBQUMsZ0JBQWdCLFlBQVksQ0FBQyw0R0FBNEcsYUFBYSxDQUFDLGtCQUFrQixTQUFTLDJCQUEyQix5QkFBeUIsd0JBQXdCLHNCQUFzQixxQkFBcUIsZ0JBQWdCLENBQUMsZ0RBQWdELGtCQUFrQixXQUFXLFlBQVksa0JBQWtCLFdBQVcsQ0FBQyw4RUFBOEUsNEJBQTRCLENBQUMsc0VBQXNFLGdCQUFnQixjQUFjLENBQUMsd0RBQXdELFVBQVUsQ0FBQyx3RUFBd0UsZUFBZSxXQUFXLGNBQWMsQ0FBQyxzSkFBc0osV0FBVyx5QkFBeUIsb0JBQW9CLENBQUMsODZCQUE4NkIsV0FBVyx5QkFBeUIsb0JBQW9CLENBQUMsa2xCQUFrbEIscUJBQXFCLENBQUMsbW9HQUFtb0cseUJBQXlCLG9CQUFvQixDQUFDLDBDQUEwQyxVQUFVLENBQUMsMkNBQTJDLFVBQVUsQ0FBQyxzSkFBc0osZ0JBQWdCLGVBQWUsQ0FBQyw4MkRBQTgyRCxxQkFBcUIsQ0FBQyw4S0FBOEssV0FBVyx5QkFBeUIscUJBQXFCLGVBQWUsQ0FBQyxzaUNBQXNpQyxXQUFXLHlCQUF5QixvQkFBb0IsQ0FBQywrOUdBQSs5Ryx5QkFBeUIsb0JBQW9CLENBQUMsa0tBQWtLLFdBQVcsc0JBQXNCLGtCQUFrQixvQ0FBb0MsQ0FBQywwK0JBQTArQixXQUFXLHlCQUF5QixvQkFBb0IsQ0FBQyxpekdBQWl6RyxzQkFBc0IsaUJBQWlCLENBQUMsMEpBQTBKLFdBQVcseUJBQXlCLHFCQUFxQixvQ0FBb0MsQ0FBQyxrOEJBQWs4QixXQUFXLHVDQUF1QyxrQ0FBa0MsQ0FBQyw2ckdBQTZyRyx5QkFBeUIsb0JBQW9CLENBQUMsNkJBQTZCLGNBQWMsVUFBVSxZQUFZLGlCQUFpQixXQUFXLFVBQVUsZUFBZSxpQkFBaUIsQ0FBQyxtQ0FBbUMsZUFBZSxDQUFDLGtGQUFrRixlQUFlLFdBQVcsY0FBYyxDQUFDLDhLQUE4SyxXQUFXLHlCQUF5QixxQkFBcUIsb0NBQW9DLENBQUMsc2lDQUFzaUMsV0FBVyx1Q0FBdUMsa0NBQWtDLENBQUMsMHBCQUEwcEIscUJBQXFCLENBQUMsKzlHQUErOUcseUJBQXlCLG9CQUFvQixDQUFDLGtFQUFrRSxVQUFVLENBQUMsK0JBQStCLFdBQVcsQ0FBQyw0REFBNEQsY0FBYyxDQUFDLHdFQUF3RSxlQUFlLENBQUMsZ0JBQWdCLGVBQWUsV0FBVyxvQkFBb0IscUJBQXFCLENBQUMscUNBQXFDLGVBQWUsNEJBQTRCLENBQUMscUNBQXFDLGNBQWMsQ0FBQyxpQkFBaUIsVUFBVSxDQUFDLHVCQUF1QixpQkFBaUIsQ0FBQyxtQ0FBbUMseUJBQXlCLENBQUMsa0NBQWtDLHlCQUF5QixDQUFDLG9DQUFvQyxXQUFXLGVBQWUsZ0JBQWdCLGdCQUFnQix1QkFBdUIsa0JBQWtCLHlCQUF5QixzQkFBc0Isc0JBQXNCLGtCQUFrQixtQkFBbUIsaUJBQWlCLGlCQUFpQixDQUFDLG1CQUFtQixxQkFBcUIsQ0FBQyxrQkFBa0IsZ0JBQWdCLGNBQWMsQ0FBQyw2QkFBNkIsWUFBWSxVQUFVLENBQUMiLCJmaWxlIjoieWlrZXMtaW5jLWVhc3ktbWFpbGNoaW1wLWRhdGVwaWNrZXItc3R5bGVzLm1pbi5jc3MiLCJzb3VyY2VzQ29udGVudCI6WyIvKiFcclxuICogRGF0ZXBpY2tlciBmb3IgQm9vdHN0cmFwIHYxLjQuMCAoaHR0cHM6Ly9naXRodWIuY29tL2V0ZXJuaWNvZGUvYm9vdHN0cmFwLWRhdGVwaWNrZXIpXHJcbiAqXHJcbiAqIENvcHlyaWdodCAyMDEyIFN0ZWZhbiBQZXRyZVxyXG4gKiBJbXByb3ZlbWVudHMgYnkgQW5kcmV3IFJvd2xzXHJcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSB2Mi4wIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjApXHJcbiAqLy5kYXRlcGlja2VyLWRyb3Bkb3duOmFmdGVyLC5kYXRlcGlja2VyLWRyb3Bkb3duOmJlZm9yZXtjb250ZW50OicnO2Rpc3BsYXk6aW5saW5lLWJsb2NrO2JvcmRlci10b3A6MDtwb3NpdGlvbjphYnNvbHV0ZX0uZGF0ZXBpY2tlcntwYWRkaW5nOjRweDtib3JkZXItcmFkaXVzOjRweDtkaXJlY3Rpb246bHRyfS5kYXRlcGlja2VyLWlubGluZXt3aWR0aDoyMjBweH0uZGF0ZXBpY2tlci5kYXRlcGlja2VyLXJ0bHtkaXJlY3Rpb246cnRsfS5kYXRlcGlja2VyLmRhdGVwaWNrZXItcnRsIHRhYmxlIHRyIHRkIHNwYW57ZmxvYXQ6cmlnaHR9LmRhdGVwaWNrZXItZHJvcGRvd257dG9wOjA7bGVmdDowfS5kYXRlcGlja2VyLWRyb3Bkb3duOmJlZm9yZXtib3JkZXItbGVmdDo3cHggc29saWQgdHJhbnNwYXJlbnQ7Ym9yZGVyLXJpZ2h0OjdweCBzb2xpZCB0cmFuc3BhcmVudDtib3JkZXItYm90dG9tOjdweCBzb2xpZCAjY2NjO2JvcmRlci1ib3R0b20tY29sb3I6cmdiYSgwLDAsMCwuMil9LmRhdGVwaWNrZXItZHJvcGRvd246YWZ0ZXJ7Ym9yZGVyLWxlZnQ6NnB4IHNvbGlkIHRyYW5zcGFyZW50O2JvcmRlci1yaWdodDo2cHggc29saWQgdHJhbnNwYXJlbnQ7Ym9yZGVyLWJvdHRvbTo2cHggc29saWQgI2ZmZn0uZGF0ZXBpY2tlci1kcm9wZG93bi5kYXRlcGlja2VyLW9yaWVudC1sZWZ0OmJlZm9yZXtsZWZ0OjZweH0uZGF0ZXBpY2tlci1kcm9wZG93bi5kYXRlcGlja2VyLW9yaWVudC1sZWZ0OmFmdGVye2xlZnQ6N3B4fS5kYXRlcGlja2VyLWRyb3Bkb3duLmRhdGVwaWNrZXItb3JpZW50LXJpZ2h0OmJlZm9yZXtyaWdodDo2cHh9LmRhdGVwaWNrZXItZHJvcGRvd24uZGF0ZXBpY2tlci1vcmllbnQtcmlnaHQ6YWZ0ZXJ7cmlnaHQ6N3B4fS5kYXRlcGlja2VyLWRyb3Bkb3duLmRhdGVwaWNrZXItb3JpZW50LXRvcDpiZWZvcmV7dG9wOi03cHh9LmRhdGVwaWNrZXItZHJvcGRvd24uZGF0ZXBpY2tlci1vcmllbnQtdG9wOmFmdGVye3RvcDotNnB4fS5kYXRlcGlja2VyLWRyb3Bkb3duLmRhdGVwaWNrZXItb3JpZW50LWJvdHRvbTpiZWZvcmV7Ym90dG9tOi03cHg7Ym9yZGVyLWJvdHRvbTowO2JvcmRlci10b3A6N3B4IHNvbGlkICM5OTl9LmRhdGVwaWNrZXItZHJvcGRvd24uZGF0ZXBpY2tlci1vcmllbnQtYm90dG9tOmFmdGVye2JvdHRvbTotNnB4O2JvcmRlci1ib3R0b206MDtib3JkZXItdG9wOjZweCBzb2xpZCAjZmZmfS5kYXRlcGlja2VyPmRpdntkaXNwbGF5Om5vbmV9LmRhdGVwaWNrZXIuZGF5cyAuZGF0ZXBpY2tlci1kYXlzLC5kYXRlcGlja2VyLm1vbnRocyAuZGF0ZXBpY2tlci1tb250aHMsLmRhdGVwaWNrZXIueWVhcnMgLmRhdGVwaWNrZXIteWVhcnN7ZGlzcGxheTpibG9ja30uZGF0ZXBpY2tlciB0YWJsZXttYXJnaW46MDstd2Via2l0LXRvdWNoLWNhbGxvdXQ6bm9uZTstd2Via2l0LXVzZXItc2VsZWN0Om5vbmU7LWtodG1sLXVzZXItc2VsZWN0Om5vbmU7LW1vei11c2VyLXNlbGVjdDpub25lOy1tcy11c2VyLXNlbGVjdDpub25lO3VzZXItc2VsZWN0Om5vbmV9LmRhdGVwaWNrZXIgdGFibGUgdHIgdGQsLmRhdGVwaWNrZXIgdGFibGUgdHIgdGh7dGV4dC1hbGlnbjpjZW50ZXI7d2lkdGg6MzBweDtoZWlnaHQ6MzBweDtib3JkZXItcmFkaXVzOjRweDtib3JkZXI6bm9uZX0udGFibGUtc3RyaXBlZCAuZGF0ZXBpY2tlciB0YWJsZSB0ciB0ZCwudGFibGUtc3RyaXBlZCAuZGF0ZXBpY2tlciB0YWJsZSB0ciB0aHtiYWNrZ3JvdW5kLWNvbG9yOnRyYW5zcGFyZW50fS5kYXRlcGlja2VyIHRhYmxlIHRyIHRkLmRheS5mb2N1c2VkLC5kYXRlcGlja2VyIHRhYmxlIHRyIHRkLmRheTpob3ZlcntiYWNrZ3JvdW5kOiNlZWU7Y3Vyc29yOnBvaW50ZXJ9LmRhdGVwaWNrZXIgdGFibGUgdHIgdGQubmV3LC5kYXRlcGlja2VyIHRhYmxlIHRyIHRkLm9sZHtjb2xvcjojOTk5fS5kYXRlcGlja2VyIHRhYmxlIHRyIHRkLmRpc2FibGVkLC5kYXRlcGlja2VyIHRhYmxlIHRyIHRkLmRpc2FibGVkOmhvdmVye2JhY2tncm91bmQ6MCAwO2NvbG9yOiM5OTk7Y3Vyc29yOmRlZmF1bHR9LmRhdGVwaWNrZXIgdGFibGUgdHIgdGQudG9kYXksLmRhdGVwaWNrZXIgdGFibGUgdHIgdGQudG9kYXkuZGlzYWJsZWQsLmRhdGVwaWNrZXIgdGFibGUgdHIgdGQudG9kYXkuZGlzYWJsZWQ6aG92ZXIsLmRhdGVwaWNrZXIgdGFibGUgdHIgdGQudG9kYXk6aG92ZXJ7Y29sb3I6IzAwMDtiYWNrZ3JvdW5kLWNvbG9yOiNmZmRiOTk7Ym9yZGVyLWNvbG9yOiNmZmI3MzN9LmRhdGVwaWNrZXIgdGFibGUgdHIgdGQudG9kYXkuYWN0aXZlLC5kYXRlcGlja2VyIHRhYmxlIHRyIHRkLnRvZGF5LmRpc2FibGVkLmFjdGl2ZSwuZGF0ZXBpY2tlciB0YWJsZSB0ciB0ZC50b2RheS5kaXNhYmxlZDphY3RpdmUsLmRhdGVwaWNrZXIgdGFibGUgdHIgdGQudG9kYXkuZGlzYWJsZWQ6Zm9jdXMsLmRhdGVwaWNrZXIgdGFibGUgdHIgdGQudG9kYXkuZGlzYWJsZWQ6aG92ZXIsLmRhdGVwaWNrZXIgdGFibGUgdHIgdGQudG9kYXkuZGlzYWJsZWQ6aG92ZXIuYWN0aXZlLC5kYXRlcGlja2VyIHRhYmxlIHRyIHRkLnRvZGF5LmRpc2FibGVkOmhvdmVyOmFjdGl2ZSwuZGF0ZXBpY2tlciB0YWJsZSB0ciB0ZC50b2RheS5kaXNhYmxlZDpob3Zlcjpmb2N1cywuZGF0ZXBpY2tlciB0YWJsZSB0ciB0ZC50b2RheS5kaXNhYmxlZDpob3Zlcjpob3ZlciwuZGF0ZXBpY2tlciB0YWJsZSB0ciB0ZC50b2RheTphY3RpdmUsLmRhdGVwaWNrZXIgdGFibGUgdHIgdGQudG9kYXk6Zm9jdXMsLmRhdGVwaWNrZXIgdGFibGUgdHIgdGQudG9kYXk6aG92ZXIsLmRhdGVwaWNrZXIgdGFibGUgdHIgdGQudG9kYXk6aG92ZXIuYWN0aXZlLC5kYXRlcGlja2VyIHRhYmxlIHRyIHRkLnRvZGF5OmhvdmVyOmFjdGl2ZSwuZGF0ZXBpY2tlciB0YWJsZSB0ciB0ZC50b2RheTpob3Zlcjpmb2N1cywuZGF0ZXBpY2tlciB0YWJsZSB0ciB0ZC50b2RheTpob3Zlcjpob3Zlciwub3BlbiAuZHJvcGRvd24tdG9nZ2xlLmRhdGVwaWNrZXIgdGFibGUgdHIgdGQudG9kYXksLm9wZW4gLmRyb3Bkb3duLXRvZ2dsZS5kYXRlcGlja2VyIHRhYmxlIHRyIHRkLnRvZGF5LmRpc2FibGVkLC5vcGVuIC5kcm9wZG93bi10b2dnbGUuZGF0ZXBpY2tlciB0YWJsZSB0ciB0ZC50b2RheS5kaXNhYmxlZDpob3Zlciwub3BlbiAuZHJvcGRvd24tdG9nZ2xlLmRhdGVwaWNrZXIgdGFibGUgdHIgdGQudG9kYXk6aG92ZXJ7Y29sb3I6IzAwMDtiYWNrZ3JvdW5kLWNvbG9yOiNmZmNkNzA7Ym9yZGVyLWNvbG9yOiNmNTllMDB9LmRhdGVwaWNrZXIgdGFibGUgdHIgdGQudG9kYXkuYWN0aXZlLC5kYXRlcGlja2VyIHRhYmxlIHRyIHRkLnRvZGF5LmRpc2FibGVkLmFjdGl2ZSwuZGF0ZXBpY2tlciB0YWJsZSB0ciB0ZC50b2RheS5kaXNhYmxlZDphY3RpdmUsLmRhdGVwaWNrZXIgdGFibGUgdHIgdGQudG9kYXkuZGlzYWJsZWQ6aG92ZXIuYWN0aXZlLC5kYXRlcGlja2VyIHRhYmxlIHRyIHRkLnRvZGF5LmRpc2FibGVkOmhvdmVyOmFjdGl2ZSwuZGF0ZXBpY2tlciB0YWJsZSB0ciB0ZC50b2RheTphY3RpdmUsLmRhdGVwaWNrZXIgdGFibGUgdHIgdGQudG9kYXk6aG92ZXIuYWN0aXZlLC5kYXRlcGlja2VyIHRhYmxlIHRyIHRkLnRvZGF5OmhvdmVyOmFjdGl2ZSwub3BlbiAuZHJvcGRvd24tdG9nZ2xlLmRhdGVwaWNrZXIgdGFibGUgdHIgdGQudG9kYXksLm9wZW4gLmRyb3Bkb3duLXRvZ2dsZS5kYXRlcGlja2VyIHRhYmxlIHRyIHRkLnRvZGF5LmRpc2FibGVkLC5vcGVuIC5kcm9wZG93bi10b2dnbGUuZGF0ZXBpY2tlciB0YWJsZSB0ciB0ZC50b2RheS5kaXNhYmxlZDpob3Zlciwub3BlbiAuZHJvcGRvd24tdG9nZ2xlLmRhdGVwaWNrZXIgdGFibGUgdHIgdGQudG9kYXk6aG92ZXJ7YmFja2dyb3VuZC1pbWFnZTpub25lfS5kYXRlcGlja2VyIHRhYmxlIHRyIHRkLnRvZGF5LmRpc2FibGVkLC5kYXRlcGlja2VyIHRhYmxlIHRyIHRkLnRvZGF5LmRpc2FibGVkLmFjdGl2ZSwuZGF0ZXBpY2tlciB0YWJsZSB0ciB0ZC50b2RheS5kaXNhYmxlZC5kaXNhYmxlZCwuZGF0ZXBpY2tlciB0YWJsZSB0ciB0ZC50b2RheS5kaXNhYmxlZC5kaXNhYmxlZC5hY3RpdmUsLmRhdGVwaWNrZXIgdGFibGUgdHIgdGQudG9kYXkuZGlzYWJsZWQuZGlzYWJsZWQ6YWN0aXZlLC5kYXRlcGlja2VyIHRhYmxlIHRyIHRkLnRvZGF5LmRpc2FibGVkLmRpc2FibGVkOmZvY3VzLC5kYXRlcGlja2VyIHRhYmxlIHRyIHRkLnRvZGF5LmRpc2FibGVkLmRpc2FibGVkOmhvdmVyLC5kYXRlcGlja2VyIHRhYmxlIHRyIHRkLnRvZGF5LmRpc2FibGVkOmFjdGl2ZSwuZGF0ZXBpY2tlciB0YWJsZSB0ciB0ZC50b2RheS5kaXNhYmxlZDpmb2N1cywuZGF0ZXBpY2tlciB0YWJsZSB0ciB0ZC50b2RheS5kaXNhYmxlZDpob3ZlciwuZGF0ZXBpY2tlciB0YWJsZSB0ciB0ZC50b2RheS5kaXNhYmxlZDpob3Zlci5kaXNhYmxlZCwuZGF0ZXBpY2tlciB0YWJsZSB0ciB0ZC50b2RheS5kaXNhYmxlZDpob3Zlci5kaXNhYmxlZC5hY3RpdmUsLmRhdGVwaWNrZXIgdGFibGUgdHIgdGQudG9kYXkuZGlzYWJsZWQ6aG92ZXIuZGlzYWJsZWQ6YWN0aXZlLC5kYXRlcGlja2VyIHRhYmxlIHRyIHRkLnRvZGF5LmRpc2FibGVkOmhvdmVyLmRpc2FibGVkOmZvY3VzLC5kYXRlcGlja2VyIHRhYmxlIHRyIHRkLnRvZGF5LmRpc2FibGVkOmhvdmVyLmRpc2FibGVkOmhvdmVyLC5kYXRlcGlja2VyIHRhYmxlIHRyIHRkLnRvZGF5LmRpc2FibGVkOmhvdmVyW2Rpc2FibGVkXSwuZGF0ZXBpY2tlciB0YWJsZSB0ciB0ZC50b2RheS5kaXNhYmxlZDpob3ZlcltkaXNhYmxlZF0uYWN0aXZlLC5kYXRlcGlja2VyIHRhYmxlIHRyIHRkLnRvZGF5LmRpc2FibGVkOmhvdmVyW2Rpc2FibGVkXTphY3RpdmUsLmRhdGVwaWNrZXIgdGFibGUgdHIgdGQudG9kYXkuZGlzYWJsZWQ6aG92ZXJbZGlzYWJsZWRdOmZvY3VzLC5kYXRlcGlja2VyIHRhYmxlIHRyIHRkLnRvZGF5LmRpc2FibGVkOmhvdmVyW2Rpc2FibGVkXTpob3ZlciwuZGF0ZXBpY2tlciB0YWJsZSB0ciB0ZC50b2RheS5kaXNhYmxlZFtkaXNhYmxlZF0sLmRhdGVwaWNrZXIgdGFibGUgdHIgdGQudG9kYXkuZGlzYWJsZWRbZGlzYWJsZWRdLmFjdGl2ZSwuZGF0ZXBpY2tlciB0YWJsZSB0ciB0ZC50b2RheS5kaXNhYmxlZFtkaXNhYmxlZF06YWN0aXZlLC5kYXRlcGlja2VyIHRhYmxlIHRyIHRkLnRvZGF5LmRpc2FibGVkW2Rpc2FibGVkXTpmb2N1cywuZGF0ZXBpY2tlciB0YWJsZSB0ciB0ZC50b2RheS5kaXNhYmxlZFtkaXNhYmxlZF06aG92ZXIsLmRhdGVwaWNrZXIgdGFibGUgdHIgdGQudG9kYXk6aG92ZXIuZGlzYWJsZWQsLmRhdGVwaWNrZXIgdGFibGUgdHIgdGQudG9kYXk6aG92ZXIuZGlzYWJsZWQuYWN0aXZlLC5kYXRlcGlja2VyIHRhYmxlIHRyIHRkLnRvZGF5OmhvdmVyLmRpc2FibGVkOmFjdGl2ZSwuZGF0ZXBpY2tlciB0YWJsZSB0ciB0ZC50b2RheTpob3Zlci5kaXNhYmxlZDpmb2N1cywuZGF0ZXBpY2tlciB0YWJsZSB0ciB0ZC50b2RheTpob3Zlci5kaXNhYmxlZDpob3ZlciwuZGF0ZXBpY2tlciB0YWJsZSB0ciB0ZC50b2RheTpob3ZlcltkaXNhYmxlZF0sLmRhdGVwaWNrZXIgdGFibGUgdHIgdGQudG9kYXk6aG92ZXJbZGlzYWJsZWRdLmFjdGl2ZSwuZGF0ZXBpY2tlciB0YWJsZSB0ciB0ZC50b2RheTpob3ZlcltkaXNhYmxlZF06YWN0aXZlLC5kYXRlcGlja2VyIHRhYmxlIHRyIHRkLnRvZGF5OmhvdmVyW2Rpc2FibGVkXTpmb2N1cywuZGF0ZXBpY2tlciB0YWJsZSB0ciB0ZC50b2RheTpob3ZlcltkaXNhYmxlZF06aG92ZXIsLmRhdGVwaWNrZXIgdGFibGUgdHIgdGQudG9kYXlbZGlzYWJsZWRdLC5kYXRlcGlja2VyIHRhYmxlIHRyIHRkLnRvZGF5W2Rpc2FibGVkXS5hY3RpdmUsLmRhdGVwaWNrZXIgdGFibGUgdHIgdGQudG9kYXlbZGlzYWJsZWRdOmFjdGl2ZSwuZGF0ZXBpY2tlciB0YWJsZSB0ciB0ZC50b2RheVtkaXNhYmxlZF06Zm9jdXMsLmRhdGVwaWNrZXIgdGFibGUgdHIgdGQudG9kYXlbZGlzYWJsZWRdOmhvdmVyLGZpZWxkc2V0W2Rpc2FibGVkXSAuZGF0ZXBpY2tlciB0YWJsZSB0ciB0ZC50b2RheSxmaWVsZHNldFtkaXNhYmxlZF0gLmRhdGVwaWNrZXIgdGFibGUgdHIgdGQudG9kYXkuYWN0aXZlLGZpZWxkc2V0W2Rpc2FibGVkXSAuZGF0ZXBpY2tlciB0YWJsZSB0ciB0ZC50b2RheS5kaXNhYmxlZCxmaWVsZHNldFtkaXNhYmxlZF0gLmRhdGVwaWNrZXIgdGFibGUgdHIgdGQudG9kYXkuZGlzYWJsZWQuYWN0aXZlLGZpZWxkc2V0W2Rpc2FibGVkXSAuZGF0ZXBpY2tlciB0YWJsZSB0ciB0ZC50b2RheS5kaXNhYmxlZDphY3RpdmUsZmllbGRzZXRbZGlzYWJsZWRdIC5kYXRlcGlja2VyIHRhYmxlIHRyIHRkLnRvZGF5LmRpc2FibGVkOmZvY3VzLGZpZWxkc2V0W2Rpc2FibGVkXSAuZGF0ZXBpY2tlciB0YWJsZSB0ciB0ZC50b2RheS5kaXNhYmxlZDpob3ZlcixmaWVsZHNldFtkaXNhYmxlZF0gLmRhdGVwaWNrZXIgdGFibGUgdHIgdGQudG9kYXkuZGlzYWJsZWQ6aG92ZXIuYWN0aXZlLGZpZWxkc2V0W2Rpc2FibGVkXSAuZGF0ZXBpY2tlciB0YWJsZSB0ciB0ZC50b2RheS5kaXNhYmxlZDpob3ZlcjphY3RpdmUsZmllbGRzZXRbZGlzYWJsZWRdIC5kYXRlcGlja2VyIHRhYmxlIHRyIHRkLnRvZGF5LmRpc2FibGVkOmhvdmVyOmZvY3VzLGZpZWxkc2V0W2Rpc2FibGVkXSAuZGF0ZXBpY2tlciB0YWJsZSB0ciB0ZC50b2RheS5kaXNhYmxlZDpob3Zlcjpob3ZlcixmaWVsZHNldFtkaXNhYmxlZF0gLmRhdGVwaWNrZXIgdGFibGUgdHIgdGQudG9kYXk6YWN0aXZlLGZpZWxkc2V0W2Rpc2FibGVkXSAuZGF0ZXBpY2tlciB0YWJsZSB0ciB0ZC50b2RheTpmb2N1cyxmaWVsZHNldFtkaXNhYmxlZF0gLmRhdGVwaWNrZXIgdGFibGUgdHIgdGQudG9kYXk6aG92ZXIsZmllbGRzZXRbZGlzYWJsZWRdIC5kYXRlcGlja2VyIHRhYmxlIHRyIHRkLnRvZGF5OmhvdmVyLmFjdGl2ZSxmaWVsZHNldFtkaXNhYmxlZF0gLmRhdGVwaWNrZXIgdGFibGUgdHIgdGQudG9kYXk6aG92ZXI6YWN0aXZlLGZpZWxkc2V0W2Rpc2FibGVkXSAuZGF0ZXBpY2tlciB0YWJsZSB0ciB0ZC50b2RheTpob3Zlcjpmb2N1cyxmaWVsZHNldFtkaXNhYmxlZF0gLmRhdGVwaWNrZXIgdGFibGUgdHIgdGQudG9kYXk6aG92ZXI6aG92ZXJ7YmFja2dyb3VuZC1jb2xvcjojZmZkYjk5O2JvcmRlci1jb2xvcjojZmZiNzMzfS5kYXRlcGlja2VyIHRhYmxlIHRyIHRkLnRvZGF5OmhvdmVyOmhvdmVye2NvbG9yOiMwMDB9LmRhdGVwaWNrZXIgdGFibGUgdHIgdGQudG9kYXkuYWN0aXZlOmhvdmVye2NvbG9yOiNmZmZ9LmRhdGVwaWNrZXIgdGFibGUgdHIgdGQucmFuZ2UsLmRhdGVwaWNrZXIgdGFibGUgdHIgdGQucmFuZ2UuZGlzYWJsZWQsLmRhdGVwaWNrZXIgdGFibGUgdHIgdGQucmFuZ2UuZGlzYWJsZWQ6aG92ZXIsLmRhdGVwaWNrZXIgdGFibGUgdHIgdGQucmFuZ2U6aG92ZXJ7YmFja2dyb3VuZDojZWVlO2JvcmRlci1yYWRpdXM6MH0uZGF0ZXBpY2tlciB0YWJsZSB0ciB0ZC5hY3RpdmUuYWN0aXZlLC5kYXRlcGlja2VyIHRhYmxlIHRyIHRkLmFjdGl2ZS5kaXNhYmxlZC5hY3RpdmUsLmRhdGVwaWNrZXIgdGFibGUgdHIgdGQuYWN0aXZlLmRpc2FibGVkOmFjdGl2ZSwuZGF0ZXBpY2tlciB0YWJsZSB0ciB0ZC5hY3RpdmUuZGlzYWJsZWQ6aG92ZXIuYWN0aXZlLC5kYXRlcGlja2VyIHRhYmxlIHRyIHRkLmFjdGl2ZS5kaXNhYmxlZDpob3ZlcjphY3RpdmUsLmRhdGVwaWNrZXIgdGFibGUgdHIgdGQuYWN0aXZlOmFjdGl2ZSwuZGF0ZXBpY2tlciB0YWJsZSB0ciB0ZC5hY3RpdmU6aG92ZXIuYWN0aXZlLC5kYXRlcGlja2VyIHRhYmxlIHRyIHRkLmFjdGl2ZTpob3ZlcjphY3RpdmUsLmRhdGVwaWNrZXIgdGFibGUgdHIgdGQucmFuZ2UudG9kYXkuYWN0aXZlLC5kYXRlcGlja2VyIHRhYmxlIHRyIHRkLnJhbmdlLnRvZGF5LmRpc2FibGVkLmFjdGl2ZSwuZGF0ZXBpY2tlciB0YWJsZSB0ciB0ZC5yYW5nZS50b2RheS5kaXNhYmxlZDphY3RpdmUsLmRhdGVwaWNrZXIgdGFibGUgdHIgdGQucmFuZ2UudG9kYXkuZGlzYWJsZWQ6aG92ZXIuYWN0aXZlLC5kYXRlcGlja2VyIHRhYmxlIHRyIHRkLnJhbmdlLnRvZGF5LmRpc2FibGVkOmhvdmVyOmFjdGl2ZSwuZGF0ZXBpY2tlciB0YWJsZSB0ciB0ZC5yYW5nZS50b2RheTphY3RpdmUsLmRhdGVwaWNrZXIgdGFibGUgdHIgdGQucmFuZ2UudG9kYXk6aG92ZXIuYWN0aXZlLC5kYXRlcGlja2VyIHRhYmxlIHRyIHRkLnJhbmdlLnRvZGF5OmhvdmVyOmFjdGl2ZSwuZGF0ZXBpY2tlciB0YWJsZSB0ciB0ZC5zZWxlY3RlZC5hY3RpdmUsLmRhdGVwaWNrZXIgdGFibGUgdHIgdGQuc2VsZWN0ZWQuZGlzYWJsZWQuYWN0aXZlLC5kYXRlcGlja2VyIHRhYmxlIHRyIHRkLnNlbGVjdGVkLmRpc2FibGVkOmFjdGl2ZSwuZGF0ZXBpY2tlciB0YWJsZSB0ciB0ZC5zZWxlY3RlZC5kaXNhYmxlZDpob3Zlci5hY3RpdmUsLmRhdGVwaWNrZXIgdGFibGUgdHIgdGQuc2VsZWN0ZWQuZGlzYWJsZWQ6aG92ZXI6YWN0aXZlLC5kYXRlcGlja2VyIHRhYmxlIHRyIHRkLnNlbGVjdGVkOmFjdGl2ZSwuZGF0ZXBpY2tlciB0YWJsZSB0ciB0ZC5zZWxlY3RlZDpob3Zlci5hY3RpdmUsLmRhdGVwaWNrZXIgdGFibGUgdHIgdGQuc2VsZWN0ZWQ6aG92ZXI6YWN0aXZlLC5vcGVuIC5kcm9wZG93bi10b2dnbGUuZGF0ZXBpY2tlciB0YWJsZSB0ciB0ZC5hY3RpdmUsLm9wZW4gLmRyb3Bkb3duLXRvZ2dsZS5kYXRlcGlja2VyIHRhYmxlIHRyIHRkLmFjdGl2ZS5kaXNhYmxlZCwub3BlbiAuZHJvcGRvd24tdG9nZ2xlLmRhdGVwaWNrZXIgdGFibGUgdHIgdGQuYWN0aXZlLmRpc2FibGVkOmhvdmVyLC5vcGVuIC5kcm9wZG93bi10b2dnbGUuZGF0ZXBpY2tlciB0YWJsZSB0ciB0ZC5hY3RpdmU6aG92ZXIsLm9wZW4gLmRyb3Bkb3duLXRvZ2dsZS5kYXRlcGlja2VyIHRhYmxlIHRyIHRkLnJhbmdlLnRvZGF5LC5vcGVuIC5kcm9wZG93bi10b2dnbGUuZGF0ZXBpY2tlciB0YWJsZSB0ciB0ZC5yYW5nZS50b2RheS5kaXNhYmxlZCwub3BlbiAuZHJvcGRvd24tdG9nZ2xlLmRhdGVwaWNrZXIgdGFibGUgdHIgdGQucmFuZ2UudG9kYXkuZGlzYWJsZWQ6aG92ZXIsLm9wZW4gLmRyb3Bkb3duLXRvZ2dsZS5kYXRlcGlja2VyIHRhYmxlIHRyIHRkLnJhbmdlLnRvZGF5OmhvdmVyLC5vcGVuIC5kcm9wZG93bi10b2dnbGUuZGF0ZXBpY2tlciB0YWJsZSB0ciB0ZC5zZWxlY3RlZCwub3BlbiAuZHJvcGRvd24tdG9nZ2xlLmRhdGVwaWNrZXIgdGFibGUgdHIgdGQuc2VsZWN0ZWQuZGlzYWJsZWQsLm9wZW4gLmRyb3Bkb3duLXRvZ2dsZS5kYXRlcGlja2VyIHRhYmxlIHRyIHRkLnNlbGVjdGVkLmRpc2FibGVkOmhvdmVyLC5vcGVuIC5kcm9wZG93bi10b2dnbGUuZGF0ZXBpY2tlciB0YWJsZSB0ciB0ZC5zZWxlY3RlZDpob3ZlcntiYWNrZ3JvdW5kLWltYWdlOm5vbmV9LmRhdGVwaWNrZXIgdGFibGUgdHIgdGQucmFuZ2UudG9kYXksLmRhdGVwaWNrZXIgdGFibGUgdHIgdGQucmFuZ2UudG9kYXkuZGlzYWJsZWQsLmRhdGVwaWNrZXIgdGFibGUgdHIgdGQucmFuZ2UudG9kYXkuZGlzYWJsZWQ6aG92ZXIsLmRhdGVwaWNrZXIgdGFibGUgdHIgdGQucmFuZ2UudG9kYXk6aG92ZXJ7Y29sb3I6IzAwMDtiYWNrZ3JvdW5kLWNvbG9yOiNmN2NhNzc7Ym9yZGVyLWNvbG9yOiNmMWE0MTc7Ym9yZGVyLXJhZGl1czowfS5kYXRlcGlja2VyIHRhYmxlIHRyIHRkLnJhbmdlLnRvZGF5LmFjdGl2ZSwuZGF0ZXBpY2tlciB0YWJsZSB0ciB0ZC5yYW5nZS50b2RheS5kaXNhYmxlZC5hY3RpdmUsLmRhdGVwaWNrZXIgdGFibGUgdHIgdGQucmFuZ2UudG9kYXkuZGlzYWJsZWQ6YWN0aXZlLC5kYXRlcGlja2VyIHRhYmxlIHRyIHRkLnJhbmdlLnRvZGF5LmRpc2FibGVkOmZvY3VzLC5kYXRlcGlja2VyIHRhYmxlIHRyIHRkLnJhbmdlLnRvZGF5LmRpc2FibGVkOmhvdmVyLC5kYXRlcGlja2VyIHRhYmxlIHRyIHRkLnJhbmdlLnRvZGF5LmRpc2FibGVkOmhvdmVyLmFjdGl2ZSwuZGF0ZXBpY2tlciB0YWJsZSB0ciB0ZC5yYW5nZS50b2RheS5kaXNhYmxlZDpob3ZlcjphY3RpdmUsLmRhdGVwaWNrZXIgdGFibGUgdHIgdGQucmFuZ2UudG9kYXkuZGlzYWJsZWQ6aG92ZXI6Zm9jdXMsLmRhdGVwaWNrZXIgdGFibGUgdHIgdGQucmFuZ2UudG9kYXkuZGlzYWJsZWQ6aG92ZXI6aG92ZXIsLmRhdGVwaWNrZXIgdGFibGUgdHIgdGQucmFuZ2UudG9kYXk6YWN0aXZlLC5kYXRlcGlja2VyIHRhYmxlIHRyIHRkLnJhbmdlLnRvZGF5OmZvY3VzLC5kYXRlcGlja2VyIHRhYmxlIHRyIHRkLnJhbmdlLnRvZGF5OmhvdmVyLC5kYXRlcGlja2VyIHRhYmxlIHRyIHRkLnJhbmdlLnRvZGF5OmhvdmVyLmFjdGl2ZSwuZGF0ZXBpY2tlciB0YWJsZSB0ciB0ZC5yYW5nZS50b2RheTpob3ZlcjphY3RpdmUsLmRhdGVwaWNrZXIgdGFibGUgdHIgdGQucmFuZ2UudG9kYXk6aG92ZXI6Zm9jdXMsLmRhdGVwaWNrZXIgdGFibGUgdHIgdGQucmFuZ2UudG9kYXk6aG92ZXI6aG92ZXIsLm9wZW4gLmRyb3Bkb3duLXRvZ2dsZS5kYXRlcGlja2VyIHRhYmxlIHRyIHRkLnJhbmdlLnRvZGF5LC5vcGVuIC5kcm9wZG93bi10b2dnbGUuZGF0ZXBpY2tlciB0YWJsZSB0ciB0ZC5yYW5nZS50b2RheS5kaXNhYmxlZCwub3BlbiAuZHJvcGRvd24tdG9nZ2xlLmRhdGVwaWNrZXIgdGFibGUgdHIgdGQucmFuZ2UudG9kYXkuZGlzYWJsZWQ6aG92ZXIsLm9wZW4gLmRyb3Bkb3duLXRvZ2dsZS5kYXRlcGlja2VyIHRhYmxlIHRyIHRkLnJhbmdlLnRvZGF5OmhvdmVye2NvbG9yOiMwMDA7YmFja2dyb3VuZC1jb2xvcjojZjRiYjUxO2JvcmRlci1jb2xvcjojYmY4MDBjfS5kYXRlcGlja2VyIHRhYmxlIHRyIHRkLnJhbmdlLnRvZGF5LmRpc2FibGVkLC5kYXRlcGlja2VyIHRhYmxlIHRyIHRkLnJhbmdlLnRvZGF5LmRpc2FibGVkLmFjdGl2ZSwuZGF0ZXBpY2tlciB0YWJsZSB0ciB0ZC5yYW5nZS50b2RheS5kaXNhYmxlZC5kaXNhYmxlZCwuZGF0ZXBpY2tlciB0YWJsZSB0ciB0ZC5yYW5nZS50b2RheS5kaXNhYmxlZC5kaXNhYmxlZC5hY3RpdmUsLmRhdGVwaWNrZXIgdGFibGUgdHIgdGQucmFuZ2UudG9kYXkuZGlzYWJsZWQuZGlzYWJsZWQ6YWN0aXZlLC5kYXRlcGlja2VyIHRhYmxlIHRyIHRkLnJhbmdlLnRvZGF5LmRpc2FibGVkLmRpc2FibGVkOmZvY3VzLC5kYXRlcGlja2VyIHRhYmxlIHRyIHRkLnJhbmdlLnRvZGF5LmRpc2FibGVkLmRpc2FibGVkOmhvdmVyLC5kYXRlcGlja2VyIHRhYmxlIHRyIHRkLnJhbmdlLnRvZGF5LmRpc2FibGVkOmFjdGl2ZSwuZGF0ZXBpY2tlciB0YWJsZSB0ciB0ZC5yYW5nZS50b2RheS5kaXNhYmxlZDpmb2N1cywuZGF0ZXBpY2tlciB0YWJsZSB0ciB0ZC5yYW5nZS50b2RheS5kaXNhYmxlZDpob3ZlciwuZGF0ZXBpY2tlciB0YWJsZSB0ciB0ZC5yYW5nZS50b2RheS5kaXNhYmxlZDpob3Zlci5kaXNhYmxlZCwuZGF0ZXBpY2tlciB0YWJsZSB0ciB0ZC5yYW5nZS50b2RheS5kaXNhYmxlZDpob3Zlci5kaXNhYmxlZC5hY3RpdmUsLmRhdGVwaWNrZXIgdGFibGUgdHIgdGQucmFuZ2UudG9kYXkuZGlzYWJsZWQ6aG92ZXIuZGlzYWJsZWQ6YWN0aXZlLC5kYXRlcGlja2VyIHRhYmxlIHRyIHRkLnJhbmdlLnRvZGF5LmRpc2FibGVkOmhvdmVyLmRpc2FibGVkOmZvY3VzLC5kYXRlcGlja2VyIHRhYmxlIHRyIHRkLnJhbmdlLnRvZGF5LmRpc2FibGVkOmhvdmVyLmRpc2FibGVkOmhvdmVyLC5kYXRlcGlja2VyIHRhYmxlIHRyIHRkLnJhbmdlLnRvZGF5LmRpc2FibGVkOmhvdmVyW2Rpc2FibGVkXSwuZGF0ZXBpY2tlciB0YWJsZSB0ciB0ZC5yYW5nZS50b2RheS5kaXNhYmxlZDpob3ZlcltkaXNhYmxlZF0uYWN0aXZlLC5kYXRlcGlja2VyIHRhYmxlIHRyIHRkLnJhbmdlLnRvZGF5LmRpc2FibGVkOmhvdmVyW2Rpc2FibGVkXTphY3RpdmUsLmRhdGVwaWNrZXIgdGFibGUgdHIgdGQucmFuZ2UudG9kYXkuZGlzYWJsZWQ6aG92ZXJbZGlzYWJsZWRdOmZvY3VzLC5kYXRlcGlja2VyIHRhYmxlIHRyIHRkLnJhbmdlLnRvZGF5LmRpc2FibGVkOmhvdmVyW2Rpc2FibGVkXTpob3ZlciwuZGF0ZXBpY2tlciB0YWJsZSB0ciB0ZC5yYW5nZS50b2RheS5kaXNhYmxlZFtkaXNhYmxlZF0sLmRhdGVwaWNrZXIgdGFibGUgdHIgdGQucmFuZ2UudG9kYXkuZGlzYWJsZWRbZGlzYWJsZWRdLmFjdGl2ZSwuZGF0ZXBpY2tlciB0YWJsZSB0ciB0ZC5yYW5nZS50b2RheS5kaXNhYmxlZFtkaXNhYmxlZF06YWN0aXZlLC5kYXRlcGlja2VyIHRhYmxlIHRyIHRkLnJhbmdlLnRvZGF5LmRpc2FibGVkW2Rpc2FibGVkXTpmb2N1cywuZGF0ZXBpY2tlciB0YWJsZSB0ciB0ZC5yYW5nZS50b2RheS5kaXNhYmxlZFtkaXNhYmxlZF06aG92ZXIsLmRhdGVwaWNrZXIgdGFibGUgdHIgdGQucmFuZ2UudG9kYXk6aG92ZXIuZGlzYWJsZWQsLmRhdGVwaWNrZXIgdGFibGUgdHIgdGQucmFuZ2UudG9kYXk6aG92ZXIuZGlzYWJsZWQuYWN0aXZlLC5kYXRlcGlja2VyIHRhYmxlIHRyIHRkLnJhbmdlLnRvZGF5OmhvdmVyLmRpc2FibGVkOmFjdGl2ZSwuZGF0ZXBpY2tlciB0YWJsZSB0ciB0ZC5yYW5nZS50b2RheTpob3Zlci5kaXNhYmxlZDpmb2N1cywuZGF0ZXBpY2tlciB0YWJsZSB0ciB0ZC5yYW5nZS50b2RheTpob3Zlci5kaXNhYmxlZDpob3ZlciwuZGF0ZXBpY2tlciB0YWJsZSB0ciB0ZC5yYW5nZS50b2RheTpob3ZlcltkaXNhYmxlZF0sLmRhdGVwaWNrZXIgdGFibGUgdHIgdGQucmFuZ2UudG9kYXk6aG92ZXJbZGlzYWJsZWRdLmFjdGl2ZSwuZGF0ZXBpY2tlciB0YWJsZSB0ciB0ZC5yYW5nZS50b2RheTpob3ZlcltkaXNhYmxlZF06YWN0aXZlLC5kYXRlcGlja2VyIHRhYmxlIHRyIHRkLnJhbmdlLnRvZGF5OmhvdmVyW2Rpc2FibGVkXTpmb2N1cywuZGF0ZXBpY2tlciB0YWJsZSB0ciB0ZC5yYW5nZS50b2RheTpob3ZlcltkaXNhYmxlZF06aG92ZXIsLmRhdGVwaWNrZXIgdGFibGUgdHIgdGQucmFuZ2UudG9kYXlbZGlzYWJsZWRdLC5kYXRlcGlja2VyIHRhYmxlIHRyIHRkLnJhbmdlLnRvZGF5W2Rpc2FibGVkXS5hY3RpdmUsLmRhdGVwaWNrZXIgdGFibGUgdHIgdGQucmFuZ2UudG9kYXlbZGlzYWJsZWRdOmFjdGl2ZSwuZGF0ZXBpY2tlciB0YWJsZSB0ciB0ZC5yYW5nZS50b2RheVtkaXNhYmxlZF06Zm9jdXMsLmRhdGVwaWNrZXIgdGFibGUgdHIgdGQucmFuZ2UudG9kYXlbZGlzYWJsZWRdOmhvdmVyLGZpZWxkc2V0W2Rpc2FibGVkXSAuZGF0ZXBpY2tlciB0YWJsZSB0ciB0ZC5yYW5nZS50b2RheSxmaWVsZHNldFtkaXNhYmxlZF0gLmRhdGVwaWNrZXIgdGFibGUgdHIgdGQucmFuZ2UudG9kYXkuYWN0aXZlLGZpZWxkc2V0W2Rpc2FibGVkXSAuZGF0ZXBpY2tlciB0YWJsZSB0ciB0ZC5yYW5nZS50b2RheS5kaXNhYmxlZCxmaWVsZHNldFtkaXNhYmxlZF0gLmRhdGVwaWNrZXIgdGFibGUgdHIgdGQucmFuZ2UudG9kYXkuZGlzYWJsZWQuYWN0aXZlLGZpZWxkc2V0W2Rpc2FibGVkXSAuZGF0ZXBpY2tlciB0YWJsZSB0ciB0ZC5yYW5nZS50b2RheS5kaXNhYmxlZDphY3RpdmUsZmllbGRzZXRbZGlzYWJsZWRdIC5kYXRlcGlja2VyIHRhYmxlIHRyIHRkLnJhbmdlLnRvZGF5LmRpc2FibGVkOmZvY3VzLGZpZWxkc2V0W2Rpc2FibGVkXSAuZGF0ZXBpY2tlciB0YWJsZSB0ciB0ZC5yYW5nZS50b2RheS5kaXNhYmxlZDpob3ZlcixmaWVsZHNldFtkaXNhYmxlZF0gLmRhdGVwaWNrZXIgdGFibGUgdHIgdGQucmFuZ2UudG9kYXkuZGlzYWJsZWQ6aG92ZXIuYWN0aXZlLGZpZWxkc2V0W2Rpc2FibGVkXSAuZGF0ZXBpY2tlciB0YWJsZSB0ciB0ZC5yYW5nZS50b2RheS5kaXNhYmxlZDpob3ZlcjphY3RpdmUsZmllbGRzZXRbZGlzYWJsZWRdIC5kYXRlcGlja2VyIHRhYmxlIHRyIHRkLnJhbmdlLnRvZGF5LmRpc2FibGVkOmhvdmVyOmZvY3VzLGZpZWxkc2V0W2Rpc2FibGVkXSAuZGF0ZXBpY2tlciB0YWJsZSB0ciB0ZC5yYW5nZS50b2RheS5kaXNhYmxlZDpob3Zlcjpob3ZlcixmaWVsZHNldFtkaXNhYmxlZF0gLmRhdGVwaWNrZXIgdGFibGUgdHIgdGQucmFuZ2UudG9kYXk6YWN0aXZlLGZpZWxkc2V0W2Rpc2FibGVkXSAuZGF0ZXBpY2tlciB0YWJsZSB0ciB0ZC5yYW5nZS50b2RheTpmb2N1cyxmaWVsZHNldFtkaXNhYmxlZF0gLmRhdGVwaWNrZXIgdGFibGUgdHIgdGQucmFuZ2UudG9kYXk6aG92ZXIsZmllbGRzZXRbZGlzYWJsZWRdIC5kYXRlcGlja2VyIHRhYmxlIHRyIHRkLnJhbmdlLnRvZGF5OmhvdmVyLmFjdGl2ZSxmaWVsZHNldFtkaXNhYmxlZF0gLmRhdGVwaWNrZXIgdGFibGUgdHIgdGQucmFuZ2UudG9kYXk6aG92ZXI6YWN0aXZlLGZpZWxkc2V0W2Rpc2FibGVkXSAuZGF0ZXBpY2tlciB0YWJsZSB0ciB0ZC5yYW5nZS50b2RheTpob3Zlcjpmb2N1cyxmaWVsZHNldFtkaXNhYmxlZF0gLmRhdGVwaWNrZXIgdGFibGUgdHIgdGQucmFuZ2UudG9kYXk6aG92ZXI6aG92ZXJ7YmFja2dyb3VuZC1jb2xvcjojZjdjYTc3O2JvcmRlci1jb2xvcjojZjFhNDE3fS5kYXRlcGlja2VyIHRhYmxlIHRyIHRkLnNlbGVjdGVkLC5kYXRlcGlja2VyIHRhYmxlIHRyIHRkLnNlbGVjdGVkLmRpc2FibGVkLC5kYXRlcGlja2VyIHRhYmxlIHRyIHRkLnNlbGVjdGVkLmRpc2FibGVkOmhvdmVyLC5kYXRlcGlja2VyIHRhYmxlIHRyIHRkLnNlbGVjdGVkOmhvdmVye2NvbG9yOiNmZmY7YmFja2dyb3VuZC1jb2xvcjojOTk5O2JvcmRlci1jb2xvcjojNTU1O3RleHQtc2hhZG93OjAgLTFweCAwIHJnYmEoMCwwLDAsLjI1KX0uZGF0ZXBpY2tlciB0YWJsZSB0ciB0ZC5zZWxlY3RlZC5hY3RpdmUsLmRhdGVwaWNrZXIgdGFibGUgdHIgdGQuc2VsZWN0ZWQuZGlzYWJsZWQuYWN0aXZlLC5kYXRlcGlja2VyIHRhYmxlIHRyIHRkLnNlbGVjdGVkLmRpc2FibGVkOmFjdGl2ZSwuZGF0ZXBpY2tlciB0YWJsZSB0ciB0ZC5zZWxlY3RlZC5kaXNhYmxlZDpmb2N1cywuZGF0ZXBpY2tlciB0YWJsZSB0ciB0ZC5zZWxlY3RlZC5kaXNhYmxlZDpob3ZlciwuZGF0ZXBpY2tlciB0YWJsZSB0ciB0ZC5zZWxlY3RlZC5kaXNhYmxlZDpob3Zlci5hY3RpdmUsLmRhdGVwaWNrZXIgdGFibGUgdHIgdGQuc2VsZWN0ZWQuZGlzYWJsZWQ6aG92ZXI6YWN0aXZlLC5kYXRlcGlja2VyIHRhYmxlIHRyIHRkLnNlbGVjdGVkLmRpc2FibGVkOmhvdmVyOmZvY3VzLC5kYXRlcGlja2VyIHRhYmxlIHRyIHRkLnNlbGVjdGVkLmRpc2FibGVkOmhvdmVyOmhvdmVyLC5kYXRlcGlja2VyIHRhYmxlIHRyIHRkLnNlbGVjdGVkOmFjdGl2ZSwuZGF0ZXBpY2tlciB0YWJsZSB0ciB0ZC5zZWxlY3RlZDpmb2N1cywuZGF0ZXBpY2tlciB0YWJsZSB0ciB0ZC5zZWxlY3RlZDpob3ZlciwuZGF0ZXBpY2tlciB0YWJsZSB0ciB0ZC5zZWxlY3RlZDpob3Zlci5hY3RpdmUsLmRhdGVwaWNrZXIgdGFibGUgdHIgdGQuc2VsZWN0ZWQ6aG92ZXI6YWN0aXZlLC5kYXRlcGlja2VyIHRhYmxlIHRyIHRkLnNlbGVjdGVkOmhvdmVyOmZvY3VzLC5kYXRlcGlja2VyIHRhYmxlIHRyIHRkLnNlbGVjdGVkOmhvdmVyOmhvdmVyLC5vcGVuIC5kcm9wZG93bi10b2dnbGUuZGF0ZXBpY2tlciB0YWJsZSB0ciB0ZC5zZWxlY3RlZCwub3BlbiAuZHJvcGRvd24tdG9nZ2xlLmRhdGVwaWNrZXIgdGFibGUgdHIgdGQuc2VsZWN0ZWQuZGlzYWJsZWQsLm9wZW4gLmRyb3Bkb3duLXRvZ2dsZS5kYXRlcGlja2VyIHRhYmxlIHRyIHRkLnNlbGVjdGVkLmRpc2FibGVkOmhvdmVyLC5vcGVuIC5kcm9wZG93bi10b2dnbGUuZGF0ZXBpY2tlciB0YWJsZSB0ciB0ZC5zZWxlY3RlZDpob3Zlcntjb2xvcjojZmZmO2JhY2tncm91bmQtY29sb3I6Izg1ODU4NTtib3JkZXItY29sb3I6IzM3MzczN30uZGF0ZXBpY2tlciB0YWJsZSB0ciB0ZC5zZWxlY3RlZC5kaXNhYmxlZCwuZGF0ZXBpY2tlciB0YWJsZSB0ciB0ZC5zZWxlY3RlZC5kaXNhYmxlZC5hY3RpdmUsLmRhdGVwaWNrZXIgdGFibGUgdHIgdGQuc2VsZWN0ZWQuZGlzYWJsZWQuZGlzYWJsZWQsLmRhdGVwaWNrZXIgdGFibGUgdHIgdGQuc2VsZWN0ZWQuZGlzYWJsZWQuZGlzYWJsZWQuYWN0aXZlLC5kYXRlcGlja2VyIHRhYmxlIHRyIHRkLnNlbGVjdGVkLmRpc2FibGVkLmRpc2FibGVkOmFjdGl2ZSwuZGF0ZXBpY2tlciB0YWJsZSB0ciB0ZC5zZWxlY3RlZC5kaXNhYmxlZC5kaXNhYmxlZDpmb2N1cywuZGF0ZXBpY2tlciB0YWJsZSB0ciB0ZC5zZWxlY3RlZC5kaXNhYmxlZC5kaXNhYmxlZDpob3ZlciwuZGF0ZXBpY2tlciB0YWJsZSB0ciB0ZC5zZWxlY3RlZC5kaXNhYmxlZDphY3RpdmUsLmRhdGVwaWNrZXIgdGFibGUgdHIgdGQuc2VsZWN0ZWQuZGlzYWJsZWQ6Zm9jdXMsLmRhdGVwaWNrZXIgdGFibGUgdHIgdGQuc2VsZWN0ZWQuZGlzYWJsZWQ6aG92ZXIsLmRhdGVwaWNrZXIgdGFibGUgdHIgdGQuc2VsZWN0ZWQuZGlzYWJsZWQ6aG92ZXIuZGlzYWJsZWQsLmRhdGVwaWNrZXIgdGFibGUgdHIgdGQuc2VsZWN0ZWQuZGlzYWJsZWQ6aG92ZXIuZGlzYWJsZWQuYWN0aXZlLC5kYXRlcGlja2VyIHRhYmxlIHRyIHRkLnNlbGVjdGVkLmRpc2FibGVkOmhvdmVyLmRpc2FibGVkOmFjdGl2ZSwuZGF0ZXBpY2tlciB0YWJsZSB0ciB0ZC5zZWxlY3RlZC5kaXNhYmxlZDpob3Zlci5kaXNhYmxlZDpmb2N1cywuZGF0ZXBpY2tlciB0YWJsZSB0ciB0ZC5zZWxlY3RlZC5kaXNhYmxlZDpob3Zlci5kaXNhYmxlZDpob3ZlciwuZGF0ZXBpY2tlciB0YWJsZSB0ciB0ZC5zZWxlY3RlZC5kaXNhYmxlZDpob3ZlcltkaXNhYmxlZF0sLmRhdGVwaWNrZXIgdGFibGUgdHIgdGQuc2VsZWN0ZWQuZGlzYWJsZWQ6aG92ZXJbZGlzYWJsZWRdLmFjdGl2ZSwuZGF0ZXBpY2tlciB0YWJsZSB0ciB0ZC5zZWxlY3RlZC5kaXNhYmxlZDpob3ZlcltkaXNhYmxlZF06YWN0aXZlLC5kYXRlcGlja2VyIHRhYmxlIHRyIHRkLnNlbGVjdGVkLmRpc2FibGVkOmhvdmVyW2Rpc2FibGVkXTpmb2N1cywuZGF0ZXBpY2tlciB0YWJsZSB0ciB0ZC5zZWxlY3RlZC5kaXNhYmxlZDpob3ZlcltkaXNhYmxlZF06aG92ZXIsLmRhdGVwaWNrZXIgdGFibGUgdHIgdGQuc2VsZWN0ZWQuZGlzYWJsZWRbZGlzYWJsZWRdLC5kYXRlcGlja2VyIHRhYmxlIHRyIHRkLnNlbGVjdGVkLmRpc2FibGVkW2Rpc2FibGVkXS5hY3RpdmUsLmRhdGVwaWNrZXIgdGFibGUgdHIgdGQuc2VsZWN0ZWQuZGlzYWJsZWRbZGlzYWJsZWRdOmFjdGl2ZSwuZGF0ZXBpY2tlciB0YWJsZSB0ciB0ZC5zZWxlY3RlZC5kaXNhYmxlZFtkaXNhYmxlZF06Zm9jdXMsLmRhdGVwaWNrZXIgdGFibGUgdHIgdGQuc2VsZWN0ZWQuZGlzYWJsZWRbZGlzYWJsZWRdOmhvdmVyLC5kYXRlcGlja2VyIHRhYmxlIHRyIHRkLnNlbGVjdGVkOmhvdmVyLmRpc2FibGVkLC5kYXRlcGlja2VyIHRhYmxlIHRyIHRkLnNlbGVjdGVkOmhvdmVyLmRpc2FibGVkLmFjdGl2ZSwuZGF0ZXBpY2tlciB0YWJsZSB0ciB0ZC5zZWxlY3RlZDpob3Zlci5kaXNhYmxlZDphY3RpdmUsLmRhdGVwaWNrZXIgdGFibGUgdHIgdGQuc2VsZWN0ZWQ6aG92ZXIuZGlzYWJsZWQ6Zm9jdXMsLmRhdGVwaWNrZXIgdGFibGUgdHIgdGQuc2VsZWN0ZWQ6aG92ZXIuZGlzYWJsZWQ6aG92ZXIsLmRhdGVwaWNrZXIgdGFibGUgdHIgdGQuc2VsZWN0ZWQ6aG92ZXJbZGlzYWJsZWRdLC5kYXRlcGlja2VyIHRhYmxlIHRyIHRkLnNlbGVjdGVkOmhvdmVyW2Rpc2FibGVkXS5hY3RpdmUsLmRhdGVwaWNrZXIgdGFibGUgdHIgdGQuc2VsZWN0ZWQ6aG92ZXJbZGlzYWJsZWRdOmFjdGl2ZSwuZGF0ZXBpY2tlciB0YWJsZSB0ciB0ZC5zZWxlY3RlZDpob3ZlcltkaXNhYmxlZF06Zm9jdXMsLmRhdGVwaWNrZXIgdGFibGUgdHIgdGQuc2VsZWN0ZWQ6aG92ZXJbZGlzYWJsZWRdOmhvdmVyLC5kYXRlcGlja2VyIHRhYmxlIHRyIHRkLnNlbGVjdGVkW2Rpc2FibGVkXSwuZGF0ZXBpY2tlciB0YWJsZSB0ciB0ZC5zZWxlY3RlZFtkaXNhYmxlZF0uYWN0aXZlLC5kYXRlcGlja2VyIHRhYmxlIHRyIHRkLnNlbGVjdGVkW2Rpc2FibGVkXTphY3RpdmUsLmRhdGVwaWNrZXIgdGFibGUgdHIgdGQuc2VsZWN0ZWRbZGlzYWJsZWRdOmZvY3VzLC5kYXRlcGlja2VyIHRhYmxlIHRyIHRkLnNlbGVjdGVkW2Rpc2FibGVkXTpob3ZlcixmaWVsZHNldFtkaXNhYmxlZF0gLmRhdGVwaWNrZXIgdGFibGUgdHIgdGQuc2VsZWN0ZWQsZmllbGRzZXRbZGlzYWJsZWRdIC5kYXRlcGlja2VyIHRhYmxlIHRyIHRkLnNlbGVjdGVkLmFjdGl2ZSxmaWVsZHNldFtkaXNhYmxlZF0gLmRhdGVwaWNrZXIgdGFibGUgdHIgdGQuc2VsZWN0ZWQuZGlzYWJsZWQsZmllbGRzZXRbZGlzYWJsZWRdIC5kYXRlcGlja2VyIHRhYmxlIHRyIHRkLnNlbGVjdGVkLmRpc2FibGVkLmFjdGl2ZSxmaWVsZHNldFtkaXNhYmxlZF0gLmRhdGVwaWNrZXIgdGFibGUgdHIgdGQuc2VsZWN0ZWQuZGlzYWJsZWQ6YWN0aXZlLGZpZWxkc2V0W2Rpc2FibGVkXSAuZGF0ZXBpY2tlciB0YWJsZSB0ciB0ZC5zZWxlY3RlZC5kaXNhYmxlZDpmb2N1cyxmaWVsZHNldFtkaXNhYmxlZF0gLmRhdGVwaWNrZXIgdGFibGUgdHIgdGQuc2VsZWN0ZWQuZGlzYWJsZWQ6aG92ZXIsZmllbGRzZXRbZGlzYWJsZWRdIC5kYXRlcGlja2VyIHRhYmxlIHRyIHRkLnNlbGVjdGVkLmRpc2FibGVkOmhvdmVyLmFjdGl2ZSxmaWVsZHNldFtkaXNhYmxlZF0gLmRhdGVwaWNrZXIgdGFibGUgdHIgdGQuc2VsZWN0ZWQuZGlzYWJsZWQ6aG92ZXI6YWN0aXZlLGZpZWxkc2V0W2Rpc2FibGVkXSAuZGF0ZXBpY2tlciB0YWJsZSB0ciB0ZC5zZWxlY3RlZC5kaXNhYmxlZDpob3Zlcjpmb2N1cyxmaWVsZHNldFtkaXNhYmxlZF0gLmRhdGVwaWNrZXIgdGFibGUgdHIgdGQuc2VsZWN0ZWQuZGlzYWJsZWQ6aG92ZXI6aG92ZXIsZmllbGRzZXRbZGlzYWJsZWRdIC5kYXRlcGlja2VyIHRhYmxlIHRyIHRkLnNlbGVjdGVkOmFjdGl2ZSxmaWVsZHNldFtkaXNhYmxlZF0gLmRhdGVwaWNrZXIgdGFibGUgdHIgdGQuc2VsZWN0ZWQ6Zm9jdXMsZmllbGRzZXRbZGlzYWJsZWRdIC5kYXRlcGlja2VyIHRhYmxlIHRyIHRkLnNlbGVjdGVkOmhvdmVyLGZpZWxkc2V0W2Rpc2FibGVkXSAuZGF0ZXBpY2tlciB0YWJsZSB0ciB0ZC5zZWxlY3RlZDpob3Zlci5hY3RpdmUsZmllbGRzZXRbZGlzYWJsZWRdIC5kYXRlcGlja2VyIHRhYmxlIHRyIHRkLnNlbGVjdGVkOmhvdmVyOmFjdGl2ZSxmaWVsZHNldFtkaXNhYmxlZF0gLmRhdGVwaWNrZXIgdGFibGUgdHIgdGQuc2VsZWN0ZWQ6aG92ZXI6Zm9jdXMsZmllbGRzZXRbZGlzYWJsZWRdIC5kYXRlcGlja2VyIHRhYmxlIHRyIHRkLnNlbGVjdGVkOmhvdmVyOmhvdmVye2JhY2tncm91bmQtY29sb3I6Izk5OTtib3JkZXItY29sb3I6IzU1NX0uZGF0ZXBpY2tlciB0YWJsZSB0ciB0ZC5hY3RpdmUsLmRhdGVwaWNrZXIgdGFibGUgdHIgdGQuYWN0aXZlLmRpc2FibGVkLC5kYXRlcGlja2VyIHRhYmxlIHRyIHRkLmFjdGl2ZS5kaXNhYmxlZDpob3ZlciwuZGF0ZXBpY2tlciB0YWJsZSB0ciB0ZC5hY3RpdmU6aG92ZXJ7Y29sb3I6I2ZmZjtiYWNrZ3JvdW5kLWNvbG9yOiM0MjhiY2E7Ym9yZGVyLWNvbG9yOiMzNTdlYmQ7dGV4dC1zaGFkb3c6MCAtMXB4IDAgcmdiYSgwLDAsMCwuMjUpfS5kYXRlcGlja2VyIHRhYmxlIHRyIHRkLmFjdGl2ZS5hY3RpdmUsLmRhdGVwaWNrZXIgdGFibGUgdHIgdGQuYWN0aXZlLmRpc2FibGVkLmFjdGl2ZSwuZGF0ZXBpY2tlciB0YWJsZSB0ciB0ZC5hY3RpdmUuZGlzYWJsZWQ6YWN0aXZlLC5kYXRlcGlja2VyIHRhYmxlIHRyIHRkLmFjdGl2ZS5kaXNhYmxlZDpmb2N1cywuZGF0ZXBpY2tlciB0YWJsZSB0ciB0ZC5hY3RpdmUuZGlzYWJsZWQ6aG92ZXIsLmRhdGVwaWNrZXIgdGFibGUgdHIgdGQuYWN0aXZlLmRpc2FibGVkOmhvdmVyLmFjdGl2ZSwuZGF0ZXBpY2tlciB0YWJsZSB0ciB0ZC5hY3RpdmUuZGlzYWJsZWQ6aG92ZXI6YWN0aXZlLC5kYXRlcGlja2VyIHRhYmxlIHRyIHRkLmFjdGl2ZS5kaXNhYmxlZDpob3Zlcjpmb2N1cywuZGF0ZXBpY2tlciB0YWJsZSB0ciB0ZC5hY3RpdmUuZGlzYWJsZWQ6aG92ZXI6aG92ZXIsLmRhdGVwaWNrZXIgdGFibGUgdHIgdGQuYWN0aXZlOmFjdGl2ZSwuZGF0ZXBpY2tlciB0YWJsZSB0ciB0ZC5hY3RpdmU6Zm9jdXMsLmRhdGVwaWNrZXIgdGFibGUgdHIgdGQuYWN0aXZlOmhvdmVyLC5kYXRlcGlja2VyIHRhYmxlIHRyIHRkLmFjdGl2ZTpob3Zlci5hY3RpdmUsLmRhdGVwaWNrZXIgdGFibGUgdHIgdGQuYWN0aXZlOmhvdmVyOmFjdGl2ZSwuZGF0ZXBpY2tlciB0YWJsZSB0ciB0ZC5hY3RpdmU6aG92ZXI6Zm9jdXMsLmRhdGVwaWNrZXIgdGFibGUgdHIgdGQuYWN0aXZlOmhvdmVyOmhvdmVyLC5vcGVuIC5kcm9wZG93bi10b2dnbGUuZGF0ZXBpY2tlciB0YWJsZSB0ciB0ZC5hY3RpdmUsLm9wZW4gLmRyb3Bkb3duLXRvZ2dsZS5kYXRlcGlja2VyIHRhYmxlIHRyIHRkLmFjdGl2ZS5kaXNhYmxlZCwub3BlbiAuZHJvcGRvd24tdG9nZ2xlLmRhdGVwaWNrZXIgdGFibGUgdHIgdGQuYWN0aXZlLmRpc2FibGVkOmhvdmVyLC5vcGVuIC5kcm9wZG93bi10b2dnbGUuZGF0ZXBpY2tlciB0YWJsZSB0ciB0ZC5hY3RpdmU6aG92ZXJ7Y29sb3I6I2ZmZjtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMTkwLDE5MCwxOTAsLjc2KTtib3JkZXItY29sb3I6cmdiYSgxOTAsMTkwLDE5MCwuNzYpfS5kYXRlcGlja2VyIHRhYmxlIHRyIHRkLmFjdGl2ZS5kaXNhYmxlZCwuZGF0ZXBpY2tlciB0YWJsZSB0ciB0ZC5hY3RpdmUuZGlzYWJsZWQuYWN0aXZlLC5kYXRlcGlja2VyIHRhYmxlIHRyIHRkLmFjdGl2ZS5kaXNhYmxlZC5kaXNhYmxlZCwuZGF0ZXBpY2tlciB0YWJsZSB0ciB0ZC5hY3RpdmUuZGlzYWJsZWQuZGlzYWJsZWQuYWN0aXZlLC5kYXRlcGlja2VyIHRhYmxlIHRyIHRkLmFjdGl2ZS5kaXNhYmxlZC5kaXNhYmxlZDphY3RpdmUsLmRhdGVwaWNrZXIgdGFibGUgdHIgdGQuYWN0aXZlLmRpc2FibGVkLmRpc2FibGVkOmZvY3VzLC5kYXRlcGlja2VyIHRhYmxlIHRyIHRkLmFjdGl2ZS5kaXNhYmxlZC5kaXNhYmxlZDpob3ZlciwuZGF0ZXBpY2tlciB0YWJsZSB0ciB0ZC5hY3RpdmUuZGlzYWJsZWQ6YWN0aXZlLC5kYXRlcGlja2VyIHRhYmxlIHRyIHRkLmFjdGl2ZS5kaXNhYmxlZDpmb2N1cywuZGF0ZXBpY2tlciB0YWJsZSB0ciB0ZC5hY3RpdmUuZGlzYWJsZWQ6aG92ZXIsLmRhdGVwaWNrZXIgdGFibGUgdHIgdGQuYWN0aXZlLmRpc2FibGVkOmhvdmVyLmRpc2FibGVkLC5kYXRlcGlja2VyIHRhYmxlIHRyIHRkLmFjdGl2ZS5kaXNhYmxlZDpob3Zlci5kaXNhYmxlZC5hY3RpdmUsLmRhdGVwaWNrZXIgdGFibGUgdHIgdGQuYWN0aXZlLmRpc2FibGVkOmhvdmVyLmRpc2FibGVkOmFjdGl2ZSwuZGF0ZXBpY2tlciB0YWJsZSB0ciB0ZC5hY3RpdmUuZGlzYWJsZWQ6aG92ZXIuZGlzYWJsZWQ6Zm9jdXMsLmRhdGVwaWNrZXIgdGFibGUgdHIgdGQuYWN0aXZlLmRpc2FibGVkOmhvdmVyLmRpc2FibGVkOmhvdmVyLC5kYXRlcGlja2VyIHRhYmxlIHRyIHRkLmFjdGl2ZS5kaXNhYmxlZDpob3ZlcltkaXNhYmxlZF0sLmRhdGVwaWNrZXIgdGFibGUgdHIgdGQuYWN0aXZlLmRpc2FibGVkOmhvdmVyW2Rpc2FibGVkXS5hY3RpdmUsLmRhdGVwaWNrZXIgdGFibGUgdHIgdGQuYWN0aXZlLmRpc2FibGVkOmhvdmVyW2Rpc2FibGVkXTphY3RpdmUsLmRhdGVwaWNrZXIgdGFibGUgdHIgdGQuYWN0aXZlLmRpc2FibGVkOmhvdmVyW2Rpc2FibGVkXTpmb2N1cywuZGF0ZXBpY2tlciB0YWJsZSB0ciB0ZC5hY3RpdmUuZGlzYWJsZWQ6aG92ZXJbZGlzYWJsZWRdOmhvdmVyLC5kYXRlcGlja2VyIHRhYmxlIHRyIHRkLmFjdGl2ZS5kaXNhYmxlZFtkaXNhYmxlZF0sLmRhdGVwaWNrZXIgdGFibGUgdHIgdGQuYWN0aXZlLmRpc2FibGVkW2Rpc2FibGVkXS5hY3RpdmUsLmRhdGVwaWNrZXIgdGFibGUgdHIgdGQuYWN0aXZlLmRpc2FibGVkW2Rpc2FibGVkXTphY3RpdmUsLmRhdGVwaWNrZXIgdGFibGUgdHIgdGQuYWN0aXZlLmRpc2FibGVkW2Rpc2FibGVkXTpmb2N1cywuZGF0ZXBpY2tlciB0YWJsZSB0ciB0ZC5hY3RpdmUuZGlzYWJsZWRbZGlzYWJsZWRdOmhvdmVyLC5kYXRlcGlja2VyIHRhYmxlIHRyIHRkLmFjdGl2ZTpob3Zlci5kaXNhYmxlZCwuZGF0ZXBpY2tlciB0YWJsZSB0ciB0ZC5hY3RpdmU6aG92ZXIuZGlzYWJsZWQuYWN0aXZlLC5kYXRlcGlja2VyIHRhYmxlIHRyIHRkLmFjdGl2ZTpob3Zlci5kaXNhYmxlZDphY3RpdmUsLmRhdGVwaWNrZXIgdGFibGUgdHIgdGQuYWN0aXZlOmhvdmVyLmRpc2FibGVkOmZvY3VzLC5kYXRlcGlja2VyIHRhYmxlIHRyIHRkLmFjdGl2ZTpob3Zlci5kaXNhYmxlZDpob3ZlciwuZGF0ZXBpY2tlciB0YWJsZSB0ciB0ZC5hY3RpdmU6aG92ZXJbZGlzYWJsZWRdLC5kYXRlcGlja2VyIHRhYmxlIHRyIHRkLmFjdGl2ZTpob3ZlcltkaXNhYmxlZF0uYWN0aXZlLC5kYXRlcGlja2VyIHRhYmxlIHRyIHRkLmFjdGl2ZTpob3ZlcltkaXNhYmxlZF06YWN0aXZlLC5kYXRlcGlja2VyIHRhYmxlIHRyIHRkLmFjdGl2ZTpob3ZlcltkaXNhYmxlZF06Zm9jdXMsLmRhdGVwaWNrZXIgdGFibGUgdHIgdGQuYWN0aXZlOmhvdmVyW2Rpc2FibGVkXTpob3ZlciwuZGF0ZXBpY2tlciB0YWJsZSB0ciB0ZC5hY3RpdmVbZGlzYWJsZWRdLC5kYXRlcGlja2VyIHRhYmxlIHRyIHRkLmFjdGl2ZVtkaXNhYmxlZF0uYWN0aXZlLC5kYXRlcGlja2VyIHRhYmxlIHRyIHRkLmFjdGl2ZVtkaXNhYmxlZF06YWN0aXZlLC5kYXRlcGlja2VyIHRhYmxlIHRyIHRkLmFjdGl2ZVtkaXNhYmxlZF06Zm9jdXMsLmRhdGVwaWNrZXIgdGFibGUgdHIgdGQuYWN0aXZlW2Rpc2FibGVkXTpob3ZlcixmaWVsZHNldFtkaXNhYmxlZF0gLmRhdGVwaWNrZXIgdGFibGUgdHIgdGQuYWN0aXZlLGZpZWxkc2V0W2Rpc2FibGVkXSAuZGF0ZXBpY2tlciB0YWJsZSB0ciB0ZC5hY3RpdmUuYWN0aXZlLGZpZWxkc2V0W2Rpc2FibGVkXSAuZGF0ZXBpY2tlciB0YWJsZSB0ciB0ZC5hY3RpdmUuZGlzYWJsZWQsZmllbGRzZXRbZGlzYWJsZWRdIC5kYXRlcGlja2VyIHRhYmxlIHRyIHRkLmFjdGl2ZS5kaXNhYmxlZC5hY3RpdmUsZmllbGRzZXRbZGlzYWJsZWRdIC5kYXRlcGlja2VyIHRhYmxlIHRyIHRkLmFjdGl2ZS5kaXNhYmxlZDphY3RpdmUsZmllbGRzZXRbZGlzYWJsZWRdIC5kYXRlcGlja2VyIHRhYmxlIHRyIHRkLmFjdGl2ZS5kaXNhYmxlZDpmb2N1cyxmaWVsZHNldFtkaXNhYmxlZF0gLmRhdGVwaWNrZXIgdGFibGUgdHIgdGQuYWN0aXZlLmRpc2FibGVkOmhvdmVyLGZpZWxkc2V0W2Rpc2FibGVkXSAuZGF0ZXBpY2tlciB0YWJsZSB0ciB0ZC5hY3RpdmUuZGlzYWJsZWQ6aG92ZXIuYWN0aXZlLGZpZWxkc2V0W2Rpc2FibGVkXSAuZGF0ZXBpY2tlciB0YWJsZSB0ciB0ZC5hY3RpdmUuZGlzYWJsZWQ6aG92ZXI6YWN0aXZlLGZpZWxkc2V0W2Rpc2FibGVkXSAuZGF0ZXBpY2tlciB0YWJsZSB0ciB0ZC5hY3RpdmUuZGlzYWJsZWQ6aG92ZXI6Zm9jdXMsZmllbGRzZXRbZGlzYWJsZWRdIC5kYXRlcGlja2VyIHRhYmxlIHRyIHRkLmFjdGl2ZS5kaXNhYmxlZDpob3Zlcjpob3ZlcixmaWVsZHNldFtkaXNhYmxlZF0gLmRhdGVwaWNrZXIgdGFibGUgdHIgdGQuYWN0aXZlOmFjdGl2ZSxmaWVsZHNldFtkaXNhYmxlZF0gLmRhdGVwaWNrZXIgdGFibGUgdHIgdGQuYWN0aXZlOmZvY3VzLGZpZWxkc2V0W2Rpc2FibGVkXSAuZGF0ZXBpY2tlciB0YWJsZSB0ciB0ZC5hY3RpdmU6aG92ZXIsZmllbGRzZXRbZGlzYWJsZWRdIC5kYXRlcGlja2VyIHRhYmxlIHRyIHRkLmFjdGl2ZTpob3Zlci5hY3RpdmUsZmllbGRzZXRbZGlzYWJsZWRdIC5kYXRlcGlja2VyIHRhYmxlIHRyIHRkLmFjdGl2ZTpob3ZlcjphY3RpdmUsZmllbGRzZXRbZGlzYWJsZWRdIC5kYXRlcGlja2VyIHRhYmxlIHRyIHRkLmFjdGl2ZTpob3Zlcjpmb2N1cyxmaWVsZHNldFtkaXNhYmxlZF0gLmRhdGVwaWNrZXIgdGFibGUgdHIgdGQuYWN0aXZlOmhvdmVyOmhvdmVye2JhY2tncm91bmQtY29sb3I6IzQyOGJjYTtib3JkZXItY29sb3I6IzM1N2ViZH0uZGF0ZXBpY2tlciB0YWJsZSB0ciB0ZCBzcGFue2Rpc3BsYXk6YmxvY2s7d2lkdGg6MjMlO2hlaWdodDo1NHB4O2xpbmUtaGVpZ2h0OjU0cHg7ZmxvYXQ6bGVmdDttYXJnaW46MSU7Y3Vyc29yOnBvaW50ZXI7Ym9yZGVyLXJhZGl1czo0cHh9LmRhdGVwaWNrZXIgdGFibGUgdHIgdGQgc3Bhbjpob3ZlcntiYWNrZ3JvdW5kOiNlZWV9LmRhdGVwaWNrZXIgdGFibGUgdHIgdGQgc3Bhbi5kaXNhYmxlZCwuZGF0ZXBpY2tlciB0YWJsZSB0ciB0ZCBzcGFuLmRpc2FibGVkOmhvdmVye2JhY2tncm91bmQ6MCAwO2NvbG9yOiM5OTk7Y3Vyc29yOmRlZmF1bHR9LmRhdGVwaWNrZXIgdGFibGUgdHIgdGQgc3Bhbi5hY3RpdmUsLmRhdGVwaWNrZXIgdGFibGUgdHIgdGQgc3Bhbi5hY3RpdmUuZGlzYWJsZWQsLmRhdGVwaWNrZXIgdGFibGUgdHIgdGQgc3Bhbi5hY3RpdmUuZGlzYWJsZWQ6aG92ZXIsLmRhdGVwaWNrZXIgdGFibGUgdHIgdGQgc3Bhbi5hY3RpdmU6aG92ZXJ7Y29sb3I6I2ZmZjtiYWNrZ3JvdW5kLWNvbG9yOiM0MjhiY2E7Ym9yZGVyLWNvbG9yOiMzNTdlYmQ7dGV4dC1zaGFkb3c6MCAtMXB4IDAgcmdiYSgwLDAsMCwuMjUpfS5kYXRlcGlja2VyIHRhYmxlIHRyIHRkIHNwYW4uYWN0aXZlLmFjdGl2ZSwuZGF0ZXBpY2tlciB0YWJsZSB0ciB0ZCBzcGFuLmFjdGl2ZS5kaXNhYmxlZC5hY3RpdmUsLmRhdGVwaWNrZXIgdGFibGUgdHIgdGQgc3Bhbi5hY3RpdmUuZGlzYWJsZWQ6YWN0aXZlLC5kYXRlcGlja2VyIHRhYmxlIHRyIHRkIHNwYW4uYWN0aXZlLmRpc2FibGVkOmZvY3VzLC5kYXRlcGlja2VyIHRhYmxlIHRyIHRkIHNwYW4uYWN0aXZlLmRpc2FibGVkOmhvdmVyLC5kYXRlcGlja2VyIHRhYmxlIHRyIHRkIHNwYW4uYWN0aXZlLmRpc2FibGVkOmhvdmVyLmFjdGl2ZSwuZGF0ZXBpY2tlciB0YWJsZSB0ciB0ZCBzcGFuLmFjdGl2ZS5kaXNhYmxlZDpob3ZlcjphY3RpdmUsLmRhdGVwaWNrZXIgdGFibGUgdHIgdGQgc3Bhbi5hY3RpdmUuZGlzYWJsZWQ6aG92ZXI6Zm9jdXMsLmRhdGVwaWNrZXIgdGFibGUgdHIgdGQgc3Bhbi5hY3RpdmUuZGlzYWJsZWQ6aG92ZXI6aG92ZXIsLmRhdGVwaWNrZXIgdGFibGUgdHIgdGQgc3Bhbi5hY3RpdmU6YWN0aXZlLC5kYXRlcGlja2VyIHRhYmxlIHRyIHRkIHNwYW4uYWN0aXZlOmZvY3VzLC5kYXRlcGlja2VyIHRhYmxlIHRyIHRkIHNwYW4uYWN0aXZlOmhvdmVyLC5kYXRlcGlja2VyIHRhYmxlIHRyIHRkIHNwYW4uYWN0aXZlOmhvdmVyLmFjdGl2ZSwuZGF0ZXBpY2tlciB0YWJsZSB0ciB0ZCBzcGFuLmFjdGl2ZTpob3ZlcjphY3RpdmUsLmRhdGVwaWNrZXIgdGFibGUgdHIgdGQgc3Bhbi5hY3RpdmU6aG92ZXI6Zm9jdXMsLmRhdGVwaWNrZXIgdGFibGUgdHIgdGQgc3Bhbi5hY3RpdmU6aG92ZXI6aG92ZXIsLm9wZW4gLmRyb3Bkb3duLXRvZ2dsZS5kYXRlcGlja2VyIHRhYmxlIHRyIHRkIHNwYW4uYWN0aXZlLC5vcGVuIC5kcm9wZG93bi10b2dnbGUuZGF0ZXBpY2tlciB0YWJsZSB0ciB0ZCBzcGFuLmFjdGl2ZS5kaXNhYmxlZCwub3BlbiAuZHJvcGRvd24tdG9nZ2xlLmRhdGVwaWNrZXIgdGFibGUgdHIgdGQgc3Bhbi5hY3RpdmUuZGlzYWJsZWQ6aG92ZXIsLm9wZW4gLmRyb3Bkb3duLXRvZ2dsZS5kYXRlcGlja2VyIHRhYmxlIHRyIHRkIHNwYW4uYWN0aXZlOmhvdmVye2NvbG9yOiNmZmY7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDE5MCwxOTAsMTkwLC43Nik7Ym9yZGVyLWNvbG9yOnJnYmEoMTkwLDE5MCwxOTAsLjc2KX0uZGF0ZXBpY2tlciB0YWJsZSB0ciB0ZCBzcGFuLmFjdGl2ZS5hY3RpdmUsLmRhdGVwaWNrZXIgdGFibGUgdHIgdGQgc3Bhbi5hY3RpdmUuZGlzYWJsZWQuYWN0aXZlLC5kYXRlcGlja2VyIHRhYmxlIHRyIHRkIHNwYW4uYWN0aXZlLmRpc2FibGVkOmFjdGl2ZSwuZGF0ZXBpY2tlciB0YWJsZSB0ciB0ZCBzcGFuLmFjdGl2ZS5kaXNhYmxlZDpob3Zlci5hY3RpdmUsLmRhdGVwaWNrZXIgdGFibGUgdHIgdGQgc3Bhbi5hY3RpdmUuZGlzYWJsZWQ6aG92ZXI6YWN0aXZlLC5kYXRlcGlja2VyIHRhYmxlIHRyIHRkIHNwYW4uYWN0aXZlOmFjdGl2ZSwuZGF0ZXBpY2tlciB0YWJsZSB0ciB0ZCBzcGFuLmFjdGl2ZTpob3Zlci5hY3RpdmUsLmRhdGVwaWNrZXIgdGFibGUgdHIgdGQgc3Bhbi5hY3RpdmU6aG92ZXI6YWN0aXZlLC5vcGVuIC5kcm9wZG93bi10b2dnbGUuZGF0ZXBpY2tlciB0YWJsZSB0ciB0ZCBzcGFuLmFjdGl2ZSwub3BlbiAuZHJvcGRvd24tdG9nZ2xlLmRhdGVwaWNrZXIgdGFibGUgdHIgdGQgc3Bhbi5hY3RpdmUuZGlzYWJsZWQsLm9wZW4gLmRyb3Bkb3duLXRvZ2dsZS5kYXRlcGlja2VyIHRhYmxlIHRyIHRkIHNwYW4uYWN0aXZlLmRpc2FibGVkOmhvdmVyLC5vcGVuIC5kcm9wZG93bi10b2dnbGUuZGF0ZXBpY2tlciB0YWJsZSB0ciB0ZCBzcGFuLmFjdGl2ZTpob3ZlcntiYWNrZ3JvdW5kLWltYWdlOm5vbmV9LmRhdGVwaWNrZXIgdGFibGUgdHIgdGQgc3Bhbi5hY3RpdmUuZGlzYWJsZWQsLmRhdGVwaWNrZXIgdGFibGUgdHIgdGQgc3Bhbi5hY3RpdmUuZGlzYWJsZWQuYWN0aXZlLC5kYXRlcGlja2VyIHRhYmxlIHRyIHRkIHNwYW4uYWN0aXZlLmRpc2FibGVkLmRpc2FibGVkLC5kYXRlcGlja2VyIHRhYmxlIHRyIHRkIHNwYW4uYWN0aXZlLmRpc2FibGVkLmRpc2FibGVkLmFjdGl2ZSwuZGF0ZXBpY2tlciB0YWJsZSB0ciB0ZCBzcGFuLmFjdGl2ZS5kaXNhYmxlZC5kaXNhYmxlZDphY3RpdmUsLmRhdGVwaWNrZXIgdGFibGUgdHIgdGQgc3Bhbi5hY3RpdmUuZGlzYWJsZWQuZGlzYWJsZWQ6Zm9jdXMsLmRhdGVwaWNrZXIgdGFibGUgdHIgdGQgc3Bhbi5hY3RpdmUuZGlzYWJsZWQuZGlzYWJsZWQ6aG92ZXIsLmRhdGVwaWNrZXIgdGFibGUgdHIgdGQgc3Bhbi5hY3RpdmUuZGlzYWJsZWQ6YWN0aXZlLC5kYXRlcGlja2VyIHRhYmxlIHRyIHRkIHNwYW4uYWN0aXZlLmRpc2FibGVkOmZvY3VzLC5kYXRlcGlja2VyIHRhYmxlIHRyIHRkIHNwYW4uYWN0aXZlLmRpc2FibGVkOmhvdmVyLC5kYXRlcGlja2VyIHRhYmxlIHRyIHRkIHNwYW4uYWN0aXZlLmRpc2FibGVkOmhvdmVyLmRpc2FibGVkLC5kYXRlcGlja2VyIHRhYmxlIHRyIHRkIHNwYW4uYWN0aXZlLmRpc2FibGVkOmhvdmVyLmRpc2FibGVkLmFjdGl2ZSwuZGF0ZXBpY2tlciB0YWJsZSB0ciB0ZCBzcGFuLmFjdGl2ZS5kaXNhYmxlZDpob3Zlci5kaXNhYmxlZDphY3RpdmUsLmRhdGVwaWNrZXIgdGFibGUgdHIgdGQgc3Bhbi5hY3RpdmUuZGlzYWJsZWQ6aG92ZXIuZGlzYWJsZWQ6Zm9jdXMsLmRhdGVwaWNrZXIgdGFibGUgdHIgdGQgc3Bhbi5hY3RpdmUuZGlzYWJsZWQ6aG92ZXIuZGlzYWJsZWQ6aG92ZXIsLmRhdGVwaWNrZXIgdGFibGUgdHIgdGQgc3Bhbi5hY3RpdmUuZGlzYWJsZWQ6aG92ZXJbZGlzYWJsZWRdLC5kYXRlcGlja2VyIHRhYmxlIHRyIHRkIHNwYW4uYWN0aXZlLmRpc2FibGVkOmhvdmVyW2Rpc2FibGVkXS5hY3RpdmUsLmRhdGVwaWNrZXIgdGFibGUgdHIgdGQgc3Bhbi5hY3RpdmUuZGlzYWJsZWQ6aG92ZXJbZGlzYWJsZWRdOmFjdGl2ZSwuZGF0ZXBpY2tlciB0YWJsZSB0ciB0ZCBzcGFuLmFjdGl2ZS5kaXNhYmxlZDpob3ZlcltkaXNhYmxlZF06Zm9jdXMsLmRhdGVwaWNrZXIgdGFibGUgdHIgdGQgc3Bhbi5hY3RpdmUuZGlzYWJsZWQ6aG92ZXJbZGlzYWJsZWRdOmhvdmVyLC5kYXRlcGlja2VyIHRhYmxlIHRyIHRkIHNwYW4uYWN0aXZlLmRpc2FibGVkW2Rpc2FibGVkXSwuZGF0ZXBpY2tlciB0YWJsZSB0ciB0ZCBzcGFuLmFjdGl2ZS5kaXNhYmxlZFtkaXNhYmxlZF0uYWN0aXZlLC5kYXRlcGlja2VyIHRhYmxlIHRyIHRkIHNwYW4uYWN0aXZlLmRpc2FibGVkW2Rpc2FibGVkXTphY3RpdmUsLmRhdGVwaWNrZXIgdGFibGUgdHIgdGQgc3Bhbi5hY3RpdmUuZGlzYWJsZWRbZGlzYWJsZWRdOmZvY3VzLC5kYXRlcGlja2VyIHRhYmxlIHRyIHRkIHNwYW4uYWN0aXZlLmRpc2FibGVkW2Rpc2FibGVkXTpob3ZlciwuZGF0ZXBpY2tlciB0YWJsZSB0ciB0ZCBzcGFuLmFjdGl2ZTpob3Zlci5kaXNhYmxlZCwuZGF0ZXBpY2tlciB0YWJsZSB0ciB0ZCBzcGFuLmFjdGl2ZTpob3Zlci5kaXNhYmxlZC5hY3RpdmUsLmRhdGVwaWNrZXIgdGFibGUgdHIgdGQgc3Bhbi5hY3RpdmU6aG92ZXIuZGlzYWJsZWQ6YWN0aXZlLC5kYXRlcGlja2VyIHRhYmxlIHRyIHRkIHNwYW4uYWN0aXZlOmhvdmVyLmRpc2FibGVkOmZvY3VzLC5kYXRlcGlja2VyIHRhYmxlIHRyIHRkIHNwYW4uYWN0aXZlOmhvdmVyLmRpc2FibGVkOmhvdmVyLC5kYXRlcGlja2VyIHRhYmxlIHRyIHRkIHNwYW4uYWN0aXZlOmhvdmVyW2Rpc2FibGVkXSwuZGF0ZXBpY2tlciB0YWJsZSB0ciB0ZCBzcGFuLmFjdGl2ZTpob3ZlcltkaXNhYmxlZF0uYWN0aXZlLC5kYXRlcGlja2VyIHRhYmxlIHRyIHRkIHNwYW4uYWN0aXZlOmhvdmVyW2Rpc2FibGVkXTphY3RpdmUsLmRhdGVwaWNrZXIgdGFibGUgdHIgdGQgc3Bhbi5hY3RpdmU6aG92ZXJbZGlzYWJsZWRdOmZvY3VzLC5kYXRlcGlja2VyIHRhYmxlIHRyIHRkIHNwYW4uYWN0aXZlOmhvdmVyW2Rpc2FibGVkXTpob3ZlciwuZGF0ZXBpY2tlciB0YWJsZSB0ciB0ZCBzcGFuLmFjdGl2ZVtkaXNhYmxlZF0sLmRhdGVwaWNrZXIgdGFibGUgdHIgdGQgc3Bhbi5hY3RpdmVbZGlzYWJsZWRdLmFjdGl2ZSwuZGF0ZXBpY2tlciB0YWJsZSB0ciB0ZCBzcGFuLmFjdGl2ZVtkaXNhYmxlZF06YWN0aXZlLC5kYXRlcGlja2VyIHRhYmxlIHRyIHRkIHNwYW4uYWN0aXZlW2Rpc2FibGVkXTpmb2N1cywuZGF0ZXBpY2tlciB0YWJsZSB0ciB0ZCBzcGFuLmFjdGl2ZVtkaXNhYmxlZF06aG92ZXIsZmllbGRzZXRbZGlzYWJsZWRdIC5kYXRlcGlja2VyIHRhYmxlIHRyIHRkIHNwYW4uYWN0aXZlLGZpZWxkc2V0W2Rpc2FibGVkXSAuZGF0ZXBpY2tlciB0YWJsZSB0ciB0ZCBzcGFuLmFjdGl2ZS5hY3RpdmUsZmllbGRzZXRbZGlzYWJsZWRdIC5kYXRlcGlja2VyIHRhYmxlIHRyIHRkIHNwYW4uYWN0aXZlLmRpc2FibGVkLGZpZWxkc2V0W2Rpc2FibGVkXSAuZGF0ZXBpY2tlciB0YWJsZSB0ciB0ZCBzcGFuLmFjdGl2ZS5kaXNhYmxlZC5hY3RpdmUsZmllbGRzZXRbZGlzYWJsZWRdIC5kYXRlcGlja2VyIHRhYmxlIHRyIHRkIHNwYW4uYWN0aXZlLmRpc2FibGVkOmFjdGl2ZSxmaWVsZHNldFtkaXNhYmxlZF0gLmRhdGVwaWNrZXIgdGFibGUgdHIgdGQgc3Bhbi5hY3RpdmUuZGlzYWJsZWQ6Zm9jdXMsZmllbGRzZXRbZGlzYWJsZWRdIC5kYXRlcGlja2VyIHRhYmxlIHRyIHRkIHNwYW4uYWN0aXZlLmRpc2FibGVkOmhvdmVyLGZpZWxkc2V0W2Rpc2FibGVkXSAuZGF0ZXBpY2tlciB0YWJsZSB0ciB0ZCBzcGFuLmFjdGl2ZS5kaXNhYmxlZDpob3Zlci5hY3RpdmUsZmllbGRzZXRbZGlzYWJsZWRdIC5kYXRlcGlja2VyIHRhYmxlIHRyIHRkIHNwYW4uYWN0aXZlLmRpc2FibGVkOmhvdmVyOmFjdGl2ZSxmaWVsZHNldFtkaXNhYmxlZF0gLmRhdGVwaWNrZXIgdGFibGUgdHIgdGQgc3Bhbi5hY3RpdmUuZGlzYWJsZWQ6aG92ZXI6Zm9jdXMsZmllbGRzZXRbZGlzYWJsZWRdIC5kYXRlcGlja2VyIHRhYmxlIHRyIHRkIHNwYW4uYWN0aXZlLmRpc2FibGVkOmhvdmVyOmhvdmVyLGZpZWxkc2V0W2Rpc2FibGVkXSAuZGF0ZXBpY2tlciB0YWJsZSB0ciB0ZCBzcGFuLmFjdGl2ZTphY3RpdmUsZmllbGRzZXRbZGlzYWJsZWRdIC5kYXRlcGlja2VyIHRhYmxlIHRyIHRkIHNwYW4uYWN0aXZlOmZvY3VzLGZpZWxkc2V0W2Rpc2FibGVkXSAuZGF0ZXBpY2tlciB0YWJsZSB0ciB0ZCBzcGFuLmFjdGl2ZTpob3ZlcixmaWVsZHNldFtkaXNhYmxlZF0gLmRhdGVwaWNrZXIgdGFibGUgdHIgdGQgc3Bhbi5hY3RpdmU6aG92ZXIuYWN0aXZlLGZpZWxkc2V0W2Rpc2FibGVkXSAuZGF0ZXBpY2tlciB0YWJsZSB0ciB0ZCBzcGFuLmFjdGl2ZTpob3ZlcjphY3RpdmUsZmllbGRzZXRbZGlzYWJsZWRdIC5kYXRlcGlja2VyIHRhYmxlIHRyIHRkIHNwYW4uYWN0aXZlOmhvdmVyOmZvY3VzLGZpZWxkc2V0W2Rpc2FibGVkXSAuZGF0ZXBpY2tlciB0YWJsZSB0ciB0ZCBzcGFuLmFjdGl2ZTpob3Zlcjpob3ZlcntiYWNrZ3JvdW5kLWNvbG9yOiM0MjhiY2E7Ym9yZGVyLWNvbG9yOiMzNTdlYmR9LmRhdGVwaWNrZXIgdGFibGUgdHIgdGQgc3Bhbi5uZXcsLmRhdGVwaWNrZXIgdGFibGUgdHIgdGQgc3Bhbi5vbGR7Y29sb3I6Izk5OX0uZGF0ZXBpY2tlciAuZGF0ZXBpY2tlci1zd2l0Y2h7d2lkdGg6MTQ1cHh9LmRhdGVwaWNrZXIgdGZvb3QgdHIgdGgsLmRhdGVwaWNrZXIgdGhlYWQgdHI6Zmlyc3QtY2hpbGQgdGh7Y3Vyc29yOnBvaW50ZXJ9LmRhdGVwaWNrZXIgdGZvb3QgdHIgdGg6aG92ZXIsLmRhdGVwaWNrZXIgdGhlYWQgdHI6Zmlyc3QtY2hpbGQgdGg6aG92ZXJ7YmFja2dyb3VuZDojZWVlfS5kYXRlcGlja2VyIC5jd3tmb250LXNpemU6MTBweDt3aWR0aDoxMnB4O3BhZGRpbmc6MCAycHggMCA1cHg7dmVydGljYWwtYWxpZ246bWlkZGxlfS5kYXRlcGlja2VyIHRoZWFkIHRyOmZpcnN0LWNoaWxkIC5jd3tjdXJzb3I6ZGVmYXVsdDtiYWNrZ3JvdW5kLWNvbG9yOnRyYW5zcGFyZW50fS5pbnB1dC1ncm91cC5kYXRlIC5pbnB1dC1ncm91cC1hZGRvbntjdXJzb3I6cG9pbnRlcn0uaW5wdXQtZGF0ZXJhbmdle3dpZHRoOjEwMCV9LmlucHV0LWRhdGVyYW5nZSBpbnB1dHt0ZXh0LWFsaWduOmNlbnRlcn0uaW5wdXQtZGF0ZXJhbmdlIGlucHV0OmZpcnN0LWNoaWxke2JvcmRlci1yYWRpdXM6M3B4IDAgMCAzcHh9LmlucHV0LWRhdGVyYW5nZSBpbnB1dDpsYXN0LWNoaWxke2JvcmRlci1yYWRpdXM6MCAzcHggM3B4IDB9LmlucHV0LWRhdGVyYW5nZSAuaW5wdXQtZ3JvdXAtYWRkb257d2lkdGg6YXV0bzttaW4td2lkdGg6MTZweDtwYWRkaW5nOjRweCA1cHg7Zm9udC13ZWlnaHQ6NDAwO2xpbmUtaGVpZ2h0OjEuNDI4NTcxNDM7dGV4dC1hbGlnbjpjZW50ZXI7dGV4dC1zaGFkb3c6MCAxcHggMCAjZmZmO3ZlcnRpY2FsLWFsaWduOm1pZGRsZTtiYWNrZ3JvdW5kLWNvbG9yOiNlZWU7Ym9yZGVyOnNvbGlkICNjY2M7Ym9yZGVyLXdpZHRoOjFweCAwO21hcmdpbi1sZWZ0Oi01cHg7bWFyZ2luLXJpZ2h0Oi01cHh9LmRhdGVwaWNrZXIgdGQuZGF5e3BhZGRpbmc6NXB4IWltcG9ydGFudH0uZGF0ZXBpY2tlciB0aGVhZHtsaW5lLWhlaWdodDoyLjI7Zm9udC1zaXplOjE1cHh9LmRhdGVwaWNrZXIgLnRhYmxlLWNvbmRlbnNlZHtib3JkZXI6bm9uZTt3aWR0aDoxMDAlfSJdfQ== */
4
  * Copyright 2012 Stefan Petre
5
  * Improvements by Andrew Rowls
6
  * Licensed under the Apache License v2.0 (http://www.apache.org/licenses/LICENSE-2.0)
7
+ */.datepicker-dropdown:after,.datepicker-dropdown:before{content:'';display:inline-block;border-top:0;position:absolute}.datepicker{padding:4px;border-radius:4px;direction:ltr}.datepicker-inline{width:220px}.datepicker.datepicker-rtl{direction:rtl}.datepicker.datepicker-rtl table tr td span{float:right}.datepicker-dropdown{top:0;left:0}.datepicker-dropdown:before{border-left:7px solid transparent;border-right:7px solid transparent;border-bottom:7px solid #ccc;border-bottom-color:rgba(0,0,0,.2)}.datepicker-dropdown:after{border-left:6px solid transparent;border-right:6px solid transparent;border-bottom:6px solid #fff}.datepicker-dropdown.datepicker-orient-left:before{left:6px}.datepicker-dropdown.datepicker-orient-left:after{left:7px}.datepicker-dropdown.datepicker-orient-right:before{right:6px}.datepicker-dropdown.datepicker-orient-right:after{right:7px}.datepicker-dropdown.datepicker-orient-top:before{top:-7px}.datepicker-dropdown.datepicker-orient-top:after{top:-6px}.datepicker-dropdown.datepicker-orient-bottom:before{bottom:-7px;border-bottom:0;border-top:7px solid #999}.datepicker-dropdown.datepicker-orient-bottom:after{bottom:-6px;border-bottom:0;border-top:6px solid #fff}.datepicker>div{display:none}.datepicker.days .datepicker-days,.datepicker.months .datepicker-months,.datepicker.years .datepicker-years{display:block}.datepicker table{margin:0;-webkit-touch-callout:none;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.datepicker table tr td,.datepicker table tr th{text-align:center;width:30px;height:30px;border-radius:4px;border:none}.table-striped .datepicker table tr td,.table-striped .datepicker table tr th{background-color:transparent}.datepicker table tr td.day.focused,.datepicker table tr td.day:hover{background:#eee;cursor:pointer}.datepicker table tr td.new,.datepicker table tr td.old{color:#999}.datepicker table tr td.disabled,.datepicker table tr td.disabled:hover{background:0 0;color:#999;cursor:default}.datepicker table tr td.today,.datepicker table tr td.today.disabled,.datepicker table tr td.today.disabled:hover,.datepicker table tr td.today:hover{color:#000;background-color:#ffdb99;border-color:#ffb733}.datepicker table tr td.today.active,.datepicker table tr td.today.disabled.active,.datepicker table tr td.today.disabled:active,.datepicker table tr td.today.disabled:focus,.datepicker table tr td.today.disabled:hover,.datepicker table tr td.today.disabled:hover.active,.datepicker table tr td.today.disabled:hover:active,.datepicker table tr td.today.disabled:hover:focus,.datepicker table tr td.today.disabled:hover:hover,.datepicker table tr td.today:active,.datepicker table tr td.today:focus,.datepicker table tr td.today:hover,.datepicker table tr td.today:hover.active,.datepicker table tr td.today:hover:active,.datepicker table tr td.today:hover:focus,.datepicker table tr td.today:hover:hover,.open .dropdown-toggle.datepicker table tr td.today,.open .dropdown-toggle.datepicker table tr td.today.disabled,.open .dropdown-toggle.datepicker table tr td.today.disabled:hover,.open .dropdown-toggle.datepicker table tr td.today:hover{color:#000;background-color:#ffcd70;border-color:#f59e00}.datepicker table tr td.today.active,.datepicker table tr td.today.disabled.active,.datepicker table tr td.today.disabled:active,.datepicker table tr td.today.disabled:hover.active,.datepicker table tr td.today.disabled:hover:active,.datepicker table tr td.today:active,.datepicker table tr td.today:hover.active,.datepicker table tr td.today:hover:active,.open .dropdown-toggle.datepicker table tr td.today,.open .dropdown-toggle.datepicker table tr td.today.disabled,.open .dropdown-toggle.datepicker table tr td.today.disabled:hover,.open .dropdown-toggle.datepicker table tr td.today:hover{background-image:none}.datepicker table tr td.today.disabled,.datepicker table tr td.today.disabled.active,.datepicker table tr td.today.disabled.disabled,.datepicker table tr td.today.disabled.disabled.active,.datepicker table tr td.today.disabled.disabled:active,.datepicker table tr td.today.disabled.disabled:focus,.datepicker table tr td.today.disabled.disabled:hover,.datepicker table tr td.today.disabled:active,.datepicker table tr td.today.disabled:focus,.datepicker table tr td.today.disabled:hover,.datepicker table tr td.today.disabled:hover.disabled,.datepicker table tr td.today.disabled:hover.disabled.active,.datepicker table tr td.today.disabled:hover.disabled:active,.datepicker table tr td.today.disabled:hover.disabled:focus,.datepicker table tr td.today.disabled:hover.disabled:hover,.datepicker table tr td.today.disabled:hover[disabled],.datepicker table tr td.today.disabled:hover[disabled].active,.datepicker table tr td.today.disabled:hover[disabled]:active,.datepicker table tr td.today.disabled:hover[disabled]:focus,.datepicker table tr td.today.disabled:hover[disabled]:hover,.datepicker table tr td.today.disabled[disabled],.datepicker table tr td.today.disabled[disabled].active,.datepicker table tr td.today.disabled[disabled]:active,.datepicker table tr td.today.disabled[disabled]:focus,.datepicker table tr td.today.disabled[disabled]:hover,.datepicker table tr td.today:hover.disabled,.datepicker table tr td.today:hover.disabled.active,.datepicker table tr td.today:hover.disabled:active,.datepicker table tr td.today:hover.disabled:focus,.datepicker table tr td.today:hover.disabled:hover,.datepicker table tr td.today:hover[disabled],.datepicker table tr td.today:hover[disabled].active,.datepicker table tr td.today:hover[disabled]:active,.datepicker table tr td.today:hover[disabled]:focus,.datepicker table tr td.today:hover[disabled]:hover,.datepicker table tr td.today[disabled],.datepicker table tr td.today[disabled].active,.datepicker table tr td.today[disabled]:active,.datepicker table tr td.today[disabled]:focus,.datepicker table tr td.today[disabled]:hover,fieldset[disabled] .datepicker table tr td.today,fieldset[disabled] .datepicker table tr td.today.active,fieldset[disabled] .datepicker table tr td.today.disabled,fieldset[disabled] .datepicker table tr td.today.disabled.active,fieldset[disabled] .datepicker table tr td.today.disabled:active,fieldset[disabled] .datepicker table tr td.today.disabled:focus,fieldset[disabled] .datepicker table tr td.today.disabled:hover,fieldset[disabled] .datepicker table tr td.today.disabled:hover.active,fieldset[disabled] .datepicker table tr td.today.disabled:hover:active,fieldset[disabled] .datepicker table tr td.today.disabled:hover:focus,fieldset[disabled] .datepicker table tr td.today.disabled:hover:hover,fieldset[disabled] .datepicker table tr td.today:active,fieldset[disabled] .datepicker table tr td.today:focus,fieldset[disabled] .datepicker table tr td.today:hover,fieldset[disabled] .datepicker table tr td.today:hover.active,fieldset[disabled] .datepicker table tr td.today:hover:active,fieldset[disabled] .datepicker table tr td.today:hover:focus,fieldset[disabled] .datepicker table tr td.today:hover:hover{background-color:#ffdb99;border-color:#ffb733}.datepicker table tr td.today:hover:hover{color:#000}.datepicker table tr td.today.active:hover{color:#fff}.datepicker table tr td.range,.datepicker table tr td.range.disabled,.datepicker table tr td.range.disabled:hover,.datepicker table tr td.range:hover{background:#eee;border-radius:0}.datepicker table tr td.active.active,.datepicker table tr td.active.disabled.active,.datepicker table tr td.active.disabled:active,.datepicker table tr td.active.disabled:hover.active,.datepicker table tr td.active.disabled:hover:active,.datepicker table tr td.active:active,.datepicker table tr td.active:hover.active,.datepicker table tr td.active:hover:active,.datepicker table tr td.range.today.active,.datepicker table tr td.range.today.disabled.active,.datepicker table tr td.range.today.disabled:active,.datepicker table tr td.range.today.disabled:hover.active,.datepicker table tr td.range.today.disabled:hover:active,.datepicker table tr td.range.today:active,.datepicker table tr td.range.today:hover.active,.datepicker table tr td.range.today:hover:active,.datepicker table tr td.selected.active,.datepicker table tr td.selected.disabled.active,.datepicker table tr td.selected.disabled:active,.datepicker table tr td.selected.disabled:hover.active,.datepicker table tr td.selected.disabled:hover:active,.datepicker table tr td.selected:active,.datepicker table tr td.selected:hover.active,.datepicker table tr td.selected:hover:active,.open .dropdown-toggle.datepicker table tr td.active,.open .dropdown-toggle.datepicker table tr td.active.disabled,.open .dropdown-toggle.datepicker table tr td.active.disabled:hover,.open .dropdown-toggle.datepicker table tr td.active:hover,.open .dropdown-toggle.datepicker table tr td.range.today,.open .dropdown-toggle.datepicker table tr td.range.today.disabled,.open .dropdown-toggle.datepicker table tr td.range.today.disabled:hover,.open .dropdown-toggle.datepicker table tr td.range.today:hover,.open .dropdown-toggle.datepicker table tr td.selected,.open .dropdown-toggle.datepicker table tr td.selected.disabled,.open .dropdown-toggle.datepicker table tr td.selected.disabled:hover,.open .dropdown-toggle.datepicker table tr td.selected:hover{background-image:none}.datepicker table tr td.range.today,.datepicker table tr td.range.today.disabled,.datepicker table tr td.range.today.disabled:hover,.datepicker table tr td.range.today:hover{color:#000;background-color:#f7ca77;border-color:#f1a417;border-radius:0}.datepicker table tr td.range.today.active,.datepicker table tr td.range.today.disabled.active,.datepicker table tr td.range.today.disabled:active,.datepicker table tr td.range.today.disabled:focus,.datepicker table tr td.range.today.disabled:hover,.datepicker table tr td.range.today.disabled:hover.active,.datepicker table tr td.range.today.disabled:hover:active,.datepicker table tr td.range.today.disabled:hover:focus,.datepicker table tr td.range.today.disabled:hover:hover,.datepicker table tr td.range.today:active,.datepicker table tr td.range.today:focus,.datepicker table tr td.range.today:hover,.datepicker table tr td.range.today:hover.active,.datepicker table tr td.range.today:hover:active,.datepicker table tr td.range.today:hover:focus,.datepicker table tr td.range.today:hover:hover,.open .dropdown-toggle.datepicker table tr td.range.today,.open .dropdown-toggle.datepicker table tr td.range.today.disabled,.open .dropdown-toggle.datepicker table tr td.range.today.disabled:hover,.open .dropdown-toggle.datepicker table tr td.range.today:hover{color:#000;background-color:#f4bb51;border-color:#bf800c}.datepicker table tr td.range.today.disabled,.datepicker table tr td.range.today.disabled.active,.datepicker table tr td.range.today.disabled.disabled,.datepicker table tr td.range.today.disabled.disabled.active,.datepicker table tr td.range.today.disabled.disabled:active,.datepicker table tr td.range.today.disabled.disabled:focus,.datepicker table tr td.range.today.disabled.disabled:hover,.datepicker table tr td.range.today.disabled:active,.datepicker table tr td.range.today.disabled:focus,.datepicker table tr td.range.today.disabled:hover,.datepicker table tr td.range.today.disabled:hover.disabled,.datepicker table tr td.range.today.disabled:hover.disabled.active,.datepicker table tr td.range.today.disabled:hover.disabled:active,.datepicker table tr td.range.today.disabled:hover.disabled:focus,.datepicker table tr td.range.today.disabled:hover.disabled:hover,.datepicker table tr td.range.today.disabled:hover[disabled],.datepicker table tr td.range.today.disabled:hover[disabled].active,.datepicker table tr td.range.today.disabled:hover[disabled]:active,.datepicker table tr td.range.today.disabled:hover[disabled]:focus,.datepicker table tr td.range.today.disabled:hover[disabled]:hover,.datepicker table tr td.range.today.disabled[disabled],.datepicker table tr td.range.today.disabled[disabled].active,.datepicker table tr td.range.today.disabled[disabled]:active,.datepicker table tr td.range.today.disabled[disabled]:focus,.datepicker table tr td.range.today.disabled[disabled]:hover,.datepicker table tr td.range.today:hover.disabled,.datepicker table tr td.range.today:hover.disabled.active,.datepicker table tr td.range.today:hover.disabled:active,.datepicker table tr td.range.today:hover.disabled:focus,.datepicker table tr td.range.today:hover.disabled:hover,.datepicker table tr td.range.today:hover[disabled],.datepicker table tr td.range.today:hover[disabled].active,.datepicker table tr td.range.today:hover[disabled]:active,.datepicker table tr td.range.today:hover[disabled]:focus,.datepicker table tr td.range.today:hover[disabled]:hover,.datepicker table tr td.range.today[disabled],.datepicker table tr td.range.today[disabled].active,.datepicker table tr td.range.today[disabled]:active,.datepicker table tr td.range.today[disabled]:focus,.datepicker table tr td.range.today[disabled]:hover,fieldset[disabled] .datepicker table tr td.range.today,fieldset[disabled] .datepicker table tr td.range.today.active,fieldset[disabled] .datepicker table tr td.range.today.disabled,fieldset[disabled] .datepicker table tr td.range.today.disabled.active,fieldset[disabled] .datepicker table tr td.range.today.disabled:active,fieldset[disabled] .datepicker table tr td.range.today.disabled:focus,fieldset[disabled] .datepicker table tr td.range.today.disabled:hover,fieldset[disabled] .datepicker table tr td.range.today.disabled:hover.active,fieldset[disabled] .datepicker table tr td.range.today.disabled:hover:active,fieldset[disabled] .datepicker table tr td.range.today.disabled:hover:focus,fieldset[disabled] .datepicker table tr td.range.today.disabled:hover:hover,fieldset[disabled] .datepicker table tr td.range.today:active,fieldset[disabled] .datepicker table tr td.range.today:focus,fieldset[disabled] .datepicker table tr td.range.today:hover,fieldset[disabled] .datepicker table tr td.range.today:hover.active,fieldset[disabled] .datepicker table tr td.range.today:hover:active,fieldset[disabled] .datepicker table tr td.range.today:hover:focus,fieldset[disabled] .datepicker table tr td.range.today:hover:hover{background-color:#f7ca77;border-color:#f1a417}.datepicker table tr td.selected,.datepicker table tr td.selected.disabled,.datepicker table tr td.selected.disabled:hover,.datepicker table tr td.selected:hover{color:#fff;background-color:#999;border-color:#555;text-shadow:0 -1px 0 rgba(0,0,0,.25)}.datepicker table tr td.selected.active,.datepicker table tr td.selected.disabled.active,.datepicker table tr td.selected.disabled:active,.datepicker table tr td.selected.disabled:focus,.datepicker table tr td.selected.disabled:hover,.datepicker table tr td.selected.disabled:hover.active,.datepicker table tr td.selected.disabled:hover:active,.datepicker table tr td.selected.disabled:hover:focus,.datepicker table tr td.selected.disabled:hover:hover,.datepicker table tr td.selected:active,.datepicker table tr td.selected:focus,.datepicker table tr td.selected:hover,.datepicker table tr td.selected:hover.active,.datepicker table tr td.selected:hover:active,.datepicker table tr td.selected:hover:focus,.datepicker table tr td.selected:hover:hover,.open .dropdown-toggle.datepicker table tr td.selected,.open .dropdown-toggle.datepicker table tr td.selected.disabled,.open .dropdown-toggle.datepicker table tr td.selected.disabled:hover,.open .dropdown-toggle.datepicker table tr td.selected:hover{color:#fff;background-color:#858585;border-color:#373737}.datepicker table tr td.selected.disabled,.datepicker table tr td.selected.disabled.active,.datepicker table tr td.selected.disabled.disabled,.datepicker table tr td.selected.disabled.disabled.active,.datepicker table tr td.selected.disabled.disabled:active,.datepicker table tr td.selected.disabled.disabled:focus,.datepicker table tr td.selected.disabled.disabled:hover,.datepicker table tr td.selected.disabled:active,.datepicker table tr td.selected.disabled:focus,.datepicker table tr td.selected.disabled:hover,.datepicker table tr td.selected.disabled:hover.disabled,.datepicker table tr td.selected.disabled:hover.disabled.active,.datepicker table tr td.selected.disabled:hover.disabled:active,.datepicker table tr td.selected.disabled:hover.disabled:focus,.datepicker table tr td.selected.disabled:hover.disabled:hover,.datepicker table tr td.selected.disabled:hover[disabled],.datepicker table tr td.selected.disabled:hover[disabled].active,.datepicker table tr td.selected.disabled:hover[disabled]:active,.datepicker table tr td.selected.disabled:hover[disabled]:focus,.datepicker table tr td.selected.disabled:hover[disabled]:hover,.datepicker table tr td.selected.disabled[disabled],.datepicker table tr td.selected.disabled[disabled].active,.datepicker table tr td.selected.disabled[disabled]:active,.datepicker table tr td.selected.disabled[disabled]:focus,.datepicker table tr td.selected.disabled[disabled]:hover,.datepicker table tr td.selected:hover.disabled,.datepicker table tr td.selected:hover.disabled.active,.datepicker table tr td.selected:hover.disabled:active,.datepicker table tr td.selected:hover.disabled:focus,.datepicker table tr td.selected:hover.disabled:hover,.datepicker table tr td.selected:hover[disabled],.datepicker table tr td.selected:hover[disabled].active,.datepicker table tr td.selected:hover[disabled]:active,.datepicker table tr td.selected:hover[disabled]:focus,.datepicker table tr td.selected:hover[disabled]:hover,.datepicker table tr td.selected[disabled],.datepicker table tr td.selected[disabled].active,.datepicker table tr td.selected[disabled]:active,.datepicker table tr td.selected[disabled]:focus,.datepicker table tr td.selected[disabled]:hover,fieldset[disabled] .datepicker table tr td.selected,fieldset[disabled] .datepicker table tr td.selected.active,fieldset[disabled] .datepicker table tr td.selected.disabled,fieldset[disabled] .datepicker table tr td.selected.disabled.active,fieldset[disabled] .datepicker table tr td.selected.disabled:active,fieldset[disabled] .datepicker table tr td.selected.disabled:focus,fieldset[disabled] .datepicker table tr td.selected.disabled:hover,fieldset[disabled] .datepicker table tr td.selected.disabled:hover.active,fieldset[disabled] .datepicker table tr td.selected.disabled:hover:active,fieldset[disabled] .datepicker table tr td.selected.disabled:hover:focus,fieldset[disabled] .datepicker table tr td.selected.disabled:hover:hover,fieldset[disabled] .datepicker table tr td.selected:active,fieldset[disabled] .datepicker table tr td.selected:focus,fieldset[disabled] .datepicker table tr td.selected:hover,fieldset[disabled] .datepicker table tr td.selected:hover.active,fieldset[disabled] .datepicker table tr td.selected:hover:active,fieldset[disabled] .datepicker table tr td.selected:hover:focus,fieldset[disabled] .datepicker table tr td.selected:hover:hover{background-color:#999;border-color:#555}.datepicker table tr td.active,.datepicker table tr td.active.disabled,.datepicker table tr td.active.disabled:hover,.datepicker table tr td.active:hover{color:#fff;background-color:#428bca;border-color:#357ebd;text-shadow:0 -1px 0 rgba(0,0,0,.25)}.datepicker table tr td.active.active,.datepicker table tr td.active.disabled.active,.datepicker table tr td.active.disabled:active,.datepicker table tr td.active.disabled:focus,.datepicker table tr td.active.disabled:hover,.datepicker table tr td.active.disabled:hover.active,.datepicker table tr td.active.disabled:hover:active,.datepicker table tr td.active.disabled:hover:focus,.datepicker table tr td.active.disabled:hover:hover,.datepicker table tr td.active:active,.datepicker table tr td.active:focus,.datepicker table tr td.active:hover,.datepicker table tr td.active:hover.active,.datepicker table tr td.active:hover:active,.datepicker table tr td.active:hover:focus,.datepicker table tr td.active:hover:hover,.open .dropdown-toggle.datepicker table tr td.active,.open .dropdown-toggle.datepicker table tr td.active.disabled,.open .dropdown-toggle.datepicker table tr td.active.disabled:hover,.open .dropdown-toggle.datepicker table tr td.active:hover{color:#fff;background-color:rgba(190,190,190,.76);border-color:rgba(190,190,190,.76)}.datepicker table tr td.active.disabled,.datepicker table tr td.active.disabled.active,.datepicker table tr td.active.disabled.disabled,.datepicker table tr td.active.disabled.disabled.active,.datepicker table tr td.active.disabled.disabled:active,.datepicker table tr td.active.disabled.disabled:focus,.datepicker table tr td.active.disabled.disabled:hover,.datepicker table tr td.active.disabled:active,.datepicker table tr td.active.disabled:focus,.datepicker table tr td.active.disabled:hover,.datepicker table tr td.active.disabled:hover.disabled,.datepicker table tr td.active.disabled:hover.disabled.active,.datepicker table tr td.active.disabled:hover.disabled:active,.datepicker table tr td.active.disabled:hover.disabled:focus,.datepicker table tr td.active.disabled:hover.disabled:hover,.datepicker table tr td.active.disabled:hover[disabled],.datepicker table tr td.active.disabled:hover[disabled].active,.datepicker table tr td.active.disabled:hover[disabled]:active,.datepicker table tr td.active.disabled:hover[disabled]:focus,.datepicker table tr td.active.disabled:hover[disabled]:hover,.datepicker table tr td.active.disabled[disabled],.datepicker table tr td.active.disabled[disabled].active,.datepicker table tr td.active.disabled[disabled]:active,.datepicker table tr td.active.disabled[disabled]:focus,.datepicker table tr td.active.disabled[disabled]:hover,.datepicker table tr td.active:hover.disabled,.datepicker table tr td.active:hover.disabled.active,.datepicker table tr td.active:hover.disabled:active,.datepicker table tr td.active:hover.disabled:focus,.datepicker table tr td.active:hover.disabled:hover,.datepicker table tr td.active:hover[disabled],.datepicker table tr td.active:hover[disabled].active,.datepicker table tr td.active:hover[disabled]:active,.datepicker table tr td.active:hover[disabled]:focus,.datepicker table tr td.active:hover[disabled]:hover,.datepicker table tr td.active[disabled],.datepicker table tr td.active[disabled].active,.datepicker table tr td.active[disabled]:active,.datepicker table tr td.active[disabled]:focus,.datepicker table tr td.active[disabled]:hover,fieldset[disabled] .datepicker table tr td.active,fieldset[disabled] .datepicker table tr td.active.active,fieldset[disabled] .datepicker table tr td.active.disabled,fieldset[disabled] .datepicker table tr td.active.disabled.active,fieldset[disabled] .datepicker table tr td.active.disabled:active,fieldset[disabled] .datepicker table tr td.active.disabled:focus,fieldset[disabled] .datepicker table tr td.active.disabled:hover,fieldset[disabled] .datepicker table tr td.active.disabled:hover.active,fieldset[disabled] .datepicker table tr td.active.disabled:hover:active,fieldset[disabled] .datepicker table tr td.active.disabled:hover:focus,fieldset[disabled] .datepicker table tr td.active.disabled:hover:hover,fieldset[disabled] .datepicker table tr td.active:active,fieldset[disabled] .datepicker table tr td.active:focus,fieldset[disabled] .datepicker table tr td.active:hover,fieldset[disabled] .datepicker table tr td.active:hover.active,fieldset[disabled] .datepicker table tr td.active:hover:active,fieldset[disabled] .datepicker table tr td.active:hover:focus,fieldset[disabled] .datepicker table tr td.active:hover:hover{background-color:#428bca;border-color:#357ebd}.datepicker table tr td span{display:block;width:23%;height:54px;line-height:54px;float:left;margin:1%;cursor:pointer;border-radius:4px}.datepicker table tr td span:hover{background:#eee}.datepicker table tr td span.disabled,.datepicker table tr td span.disabled:hover{background:0 0;color:#999;cursor:default}.datepicker table tr td span.active,.datepicker table tr td span.active.disabled,.datepicker table tr td span.active.disabled:hover,.datepicker table tr td span.active:hover{color:#fff;background-color:#428bca;border-color:#357ebd;text-shadow:0 -1px 0 rgba(0,0,0,.25)}.datepicker table tr td span.active.active,.datepicker table tr td span.active.disabled.active,.datepicker table tr td span.active.disabled:active,.datepicker table tr td span.active.disabled:focus,.datepicker table tr td span.active.disabled:hover,.datepicker table tr td span.active.disabled:hover.active,.datepicker table tr td span.active.disabled:hover:active,.datepicker table tr td span.active.disabled:hover:focus,.datepicker table tr td span.active.disabled:hover:hover,.datepicker table tr td span.active:active,.datepicker table tr td span.active:focus,.datepicker table tr td span.active:hover,.datepicker table tr td span.active:hover.active,.datepicker table tr td span.active:hover:active,.datepicker table tr td span.active:hover:focus,.datepicker table tr td span.active:hover:hover,.open .dropdown-toggle.datepicker table tr td span.active,.open .dropdown-toggle.datepicker table tr td span.active.disabled,.open .dropdown-toggle.datepicker table tr td span.active.disabled:hover,.open .dropdown-toggle.datepicker table tr td span.active:hover{color:#fff;background-color:rgba(190,190,190,.76);border-color:rgba(190,190,190,.76)}.datepicker table tr td span.active.active,.datepicker table tr td span.active.disabled.active,.datepicker table tr td span.active.disabled:active,.datepicker table tr td span.active.disabled:hover.active,.datepicker table tr td span.active.disabled:hover:active,.datepicker table tr td span.active:active,.datepicker table tr td span.active:hover.active,.datepicker table tr td span.active:hover:active,.open .dropdown-toggle.datepicker table tr td span.active,.open .dropdown-toggle.datepicker table tr td span.active.disabled,.open .dropdown-toggle.datepicker table tr td span.active.disabled:hover,.open .dropdown-toggle.datepicker table tr td span.active:hover{background-image:none}.datepicker table tr td span.active.disabled,.datepicker table tr td span.active.disabled.active,.datepicker table tr td span.active.disabled.disabled,.datepicker table tr td span.active.disabled.disabled.active,.datepicker table tr td span.active.disabled.disabled:active,.datepicker table tr td span.active.disabled.disabled:focus,.datepicker table tr td span.active.disabled.disabled:hover,.datepicker table tr td span.active.disabled:active,.datepicker table tr td span.active.disabled:focus,.datepicker table tr td span.active.disabled:hover,.datepicker table tr td span.active.disabled:hover.disabled,.datepicker table tr td span.active.disabled:hover.disabled.active,.datepicker table tr td span.active.disabled:hover.disabled:active,.datepicker table tr td span.active.disabled:hover.disabled:focus,.datepicker table tr td span.active.disabled:hover.disabled:hover,.datepicker table tr td span.active.disabled:hover[disabled],.datepicker table tr td span.active.disabled:hover[disabled].active,.datepicker table tr td span.active.disabled:hover[disabled]:active,.datepicker table tr td span.active.disabled:hover[disabled]:focus,.datepicker table tr td span.active.disabled:hover[disabled]:hover,.datepicker table tr td span.active.disabled[disabled],.datepicker table tr td span.active.disabled[disabled].active,.datepicker table tr td span.active.disabled[disabled]:active,.datepicker table tr td span.active.disabled[disabled]:focus,.datepicker table tr td span.active.disabled[disabled]:hover,.datepicker table tr td span.active:hover.disabled,.datepicker table tr td span.active:hover.disabled.active,.datepicker table tr td span.active:hover.disabled:active,.datepicker table tr td span.active:hover.disabled:focus,.datepicker table tr td span.active:hover.disabled:hover,.datepicker table tr td span.active:hover[disabled],.datepicker table tr td span.active:hover[disabled].active,.datepicker table tr td span.active:hover[disabled]:active,.datepicker table tr td span.active:hover[disabled]:focus,.datepicker table tr td span.active:hover[disabled]:hover,.datepicker table tr td span.active[disabled],.datepicker table tr td span.active[disabled].active,.datepicker table tr td span.active[disabled]:active,.datepicker table tr td span.active[disabled]:focus,.datepicker table tr td span.active[disabled]:hover,fieldset[disabled] .datepicker table tr td span.active,fieldset[disabled] .datepicker table tr td span.active.active,fieldset[disabled] .datepicker table tr td span.active.disabled,fieldset[disabled] .datepicker table tr td span.active.disabled.active,fieldset[disabled] .datepicker table tr td span.active.disabled:active,fieldset[disabled] .datepicker table tr td span.active.disabled:focus,fieldset[disabled] .datepicker table tr td span.active.disabled:hover,fieldset[disabled] .datepicker table tr td span.active.disabled:hover.active,fieldset[disabled] .datepicker table tr td span.active.disabled:hover:active,fieldset[disabled] .datepicker table tr td span.active.disabled:hover:focus,fieldset[disabled] .datepicker table tr td span.active.disabled:hover:hover,fieldset[disabled] .datepicker table tr td span.active:active,fieldset[disabled] .datepicker table tr td span.active:focus,fieldset[disabled] .datepicker table tr td span.active:hover,fieldset[disabled] .datepicker table tr td span.active:hover.active,fieldset[disabled] .datepicker table tr td span.active:hover:active,fieldset[disabled] .datepicker table tr td span.active:hover:focus,fieldset[disabled] .datepicker table tr td span.active:hover:hover{background-color:#428bca;border-color:#357ebd}.datepicker table tr td span.new,.datepicker table tr td span.old{color:#999}.datepicker .datepicker-switch{width:145px}.datepicker tfoot tr th,.datepicker thead tr:first-child th{cursor:pointer}.datepicker tfoot tr th:hover,.datepicker thead tr:first-child th:hover{background:#eee}.datepicker .cw{font-size:10px;width:12px;padding:0 2px 0 5px;vertical-align:middle}.datepicker thead tr:first-child .cw{cursor:default;background-color:transparent}.input-group.date .input-group-addon{cursor:pointer}.input-daterange{width:100%}.input-daterange input{text-align:center}.input-daterange input:first-child{border-radius:3px 0 0 3px}.input-daterange input:last-child{border-radius:0 3px 3px 0}.input-daterange .input-group-addon{width:auto;min-width:16px;padding:4px 5px;font-weight:400;line-height:1.42857143;text-align:center;text-shadow:0 1px 0 #fff;vertical-align:middle;background-color:#eee;border:solid #ccc;border-width:1px 0;margin-left:-5px;margin-right:-5px}.datepicker td.day{padding:5px!important}.datepicker thead{line-height:2.2;font-size:15px}.datepicker .table-condensed{border:none;width:100%}
 
public/css/yikes-inc-easy-mailchimp-extender-public.css CHANGED
@@ -1,2 +1,2 @@
1
- /**
2
  * All of the CSS for your public-facing functionality should be
3
  * included in this file.
4
  */
5
 
6
  .yikes-easy-mc-form {
7
  }
8
  /* Input heights */
9
  .yikes-easy-mc-form select,
10
  .yikes-easy-mc-form input[type="text"],
11
  .yikes-easy-mc-form input[type="url"],
12
  .yikes-easy-mc-form input[type="email"],
13
  .yikes-easy-mc-form input[type="number"] {
14
  }
15
 
16
  .yikes-easy-mc-form select:focus,
17
  .yikes-easy-mc-form input[type="text"]:focus,
18
  .yikes-easy-mc-form input[type="url"]:focus,
19
  .yikes-easy-mc-form input[type="email"]:focus,
20
  .yikes-easy-mc-form input[type="number"]:focus {
21
  }
22
 
23
  /* Datepicker */
24
  }
25
 
26
  /* Submit Button */
27
  .yikes-easy-mc-form .yikes-easy-mc-submit-button {
28
  }
29
  /* Form Description */
30
  .yikes-easy-mc-form .form-field-description {
31
 
32
 
33
  /* Labels & Descriptions */
34
  .yikes-easy-mc-form label,
35
  .yikes-easy-mc-form .field-no-label {
36
  }
37
 
38
  /* Interest Group Required Error Notice */
39
  p.yikes-mailchimp-required-interest-group-error {
40
  }
41
 
42
  /* No Label Descriptions */
43
 
44
  .yikes-easy-mc-form select,
45
  .yikes-easy-mc-form input[type="number"],
46
  .yikes-easy-mc-form input[type="text"],
47
  .yikes-easy-mc-form input[type="email"],
48
  .yikes-easy-mc-form input[type="url"],
49
  .yikes-easy-mc-form input[type="password"],
50
  .yikes-easy-mc-form textarea {
51
  }
52
 
53
 
54
  /** Radio Form Buttons **/
55
  .checkbox-parent-label {
56
  }
57
  .yikes-easy-mc-form .yikes-easy-mc-checkbox-label {
58
  }
59
 
60
  .yikes-easy-mc-display-none,
61
  .mailchimp-field-hidden {
62
  }
63
 
64
  .yikes-easy-mc-text-align-right {
65
  }
66
 
67
 
68
 
69
 
70
  /******************************************/
71
  /* Front End Pre-defined Classes */
72
  /******************************************/
73
 
 
74
  * All of the CSS for your public-facing functionality should be
75
  * included in this file.
76
  */
77
 
78
  .yikes-easy-mc-form {
79
  }
80
  /* Input heights */
81
  .yikes-easy-mc-form select,
82
  .yikes-easy-mc-form input[type="text"],
83
  .yikes-easy-mc-form input[type="url"],
84
  .yikes-easy-mc-form input[type="email"],
85
  .yikes-easy-mc-form input[type="number"] {
86
  }
87
 
88
  .yikes-easy-mc-form select:focus,
89
  .yikes-easy-mc-form input[type="text"]:focus,
90
  .yikes-easy-mc-form input[type="url"]:focus,
91
  .yikes-easy-mc-form input[type="email"]:focus,
92
  .yikes-easy-mc-form input[type="number"]:focus {
93
  }
94
 
95
  /* Datepicker */
96
  }
97
 
98
  /* Submit Button */
99
  .yikes-easy-mc-form .yikes-easy-mc-submit-button {
100
  }
101
  /* Form Description */
102
  .yikes-easy-mc-form .form-field-description {
103
 
104
 
105
  /* Labels & Descriptions */
106
  .yikes-easy-mc-form label,
107
  .yikes-easy-mc-form .field-no-label {
108
  }
109
 
110
  /* Interest Group Required Error Notice */
111
  p.yikes-mailchimp-required-interest-group-error {
112
  }
113
 
114
  /* No Label Descriptions */
115
 
116
  .yikes-easy-mc-form select,
117
  .yikes-easy-mc-form input[type="number"],
118
  .yikes-easy-mc-form input[type="text"],
119
  .yikes-easy-mc-form input[type="email"],
120
  .yikes-easy-mc-form input[type="url"],
121
  .yikes-easy-mc-form input[type="password"],
122
  .yikes-easy-mc-form textarea {
123
  }
124
 
125
 
126
  /** Radio Form Buttons **/
127
  .checkbox-parent-label {
128
  }
129
  .yikes-easy-mc-form .yikes-easy-mc-checkbox-label {
130
  }
131
 
132
  .yikes-easy-mc-display-none,
133
  .mailchimp-field-hidden {
134
  }
135
 
136
  .yikes-easy-mc-text-align-right {
137
  }
138
 
139
 
140
 
141
 
142
  /******************************************/
143
  /* Front End Pre-defined Classes */
144
  /******************************************/
145
 
146
  /*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInlpa2VzLWluYy1lYXN5LW1haWxjaGltcC1leHRlbmRlci1wdWJsaWMuY3NzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLG1HQUFrRyxJQUFJLHVCQUFBLGVBQUEsRUFBQSxZQUFBLEdBQUEsSUFBd0MseUNBQW1CLGVBQXlDLEdBQUEsbUJBQUEsR0FBQSxJQUFBLDhDQUE0QyxFQUFBLG9EQUFBLHNCQUFBLEdBQUEsWUFBQSxHQUFBLEtBQUEsbUJBQUEsRUFBQSxvTUFBcUIsa0JBQUEsRUFBQSwwQkFBQSxFQUFBLHdDQUFBLEVBQUEsZUFBQSxFQUFBLDRCQUFBLEVBQUEsbUJBQUEsR0FBQSxJQUFBLGtPQUFBLDBDQUE0UyxFQUFBLDBDQUFBLEdBQUEsSUFBQSxnQkFBd1QsQ0FBQSw4RkFBQSxpQkFBOEwsR0FBQSxJQUFBLG1CQUFBLEVBQUEsb0RBQUEsZUFBQSxDQUFBLGtGQUFBLEVBQUEsWUFBQSxFQUE2SSxpQkFBMEUsRUFBQSxpQkFBQSxFQUFBLGNBQUEsRUFBQSxnQkFBQSxHQUFBLEVBQUEscUVBQUEsbUJBQWlHLEdBQUEsSUFBQSx3REFBc0ksRUFBQSxvREFBQSxXQUFBLEdBQUEsZ0JBQStCLEdBQUEsWUFBQSxHQUFBLE1BQUEsa0ZBQUEsY0FBQSxJQUFBLG9CQUFBLElBQUEsS0FBQSxzQkFBQSxJQUFBLGdEQUFBLGVBQUEsR0FBQSxtQkFBQSxHQUFBLHFCQUFBLEdBQUEsbUJBQUEsSUFBQSxNQUFBLHdEQUFBLGVBQUEsR0FBQSxtQkFBQSxHQUFBLG1CQUFBLElBQUEsSUFBQSxpQ0FBQSwrQkFBQSxHQUFBLG9CQUFBLEdBQUEsY0FBQSxHQUFBLGVBQUEsR0FBQSxtQkFBQSxHQUFBLElBQUEsbUNBQUEsZUFBQSxHQUFBLG9CQUFBLEdBQUEsY0FBQSxHQUFBLGVBQUEsR0FBQSxtQkFBQSxHQUFBLElBQUEsMkJBQUEsRUFBQSxtRUFBQSxzQkFBQSxFQUFBLG9CQUFBLEVBQUEsWUFBQSxHQUFBLElBQUEsMENBQUEsRUFBQSxtREFBQSwrQkFBNDdCLEVBQUEsY0FBQSxHQUFBLElBQUEsMkJBQTBGLElBQUEsb1JBQUEsdUJBQUEsRUFBQSxlQUFBLEVBQUEsWUFBQSxFQUFBLGdCQUFBLEdBQUEsSUFBQSw0REFBQSxXQUFBLEdBQUEsV0FBQSxHQUFBLGlCQUFBLEdBQUEsaUJBQUEsR0FBQSxJQUFBLHVGQUFBLFlBQUEsR0FBQSxnQkFBQSxHQUFBLElBQUEsMEJBQUEsRUFBQSwwQkFBQSxZQUFBLEVBQUEsZUFBQSxHQUFBLEVBQUEscURBQUEsc0JBQUEsR0FBQSxJQUFBLHlEQUFBLHlCQUFBLEdBQUEsSUFBQSxtQ0FBQSxrQkFBaXVCLEdBQUEsSUFBQSwyQ0FBMEosRUFBQSxpREFBQSxjQUFBLEdBQUEsSUFBQSx1QkFBQSxFQUFBLHFDQUFBLGVBQUEsR0FBQSxnQkFBQSxHQUFBLEVBQUEsd0VBQUEsQ0FBQSwyQkFBdVEsbUJBQUEsRUFBQSxTQUFBLEVBQUEsUUFBQSxFQUFBLFNBQTBCLEVBQUEsVUFBQSxFQUFBLGVBQUEsRUFBQSxFQUFBLHdDQUFBLENBQUEsZ0JBQThNLHVCQUFBLEVBQUEsK0JBQUEsRUFBQSxzQkFBQSxFQUFBLDhCQUE0RyxFQUFBLHFCQUFBLEVBQUEsS0FBQSx5Q0FBQSxrQ0FBcUMsdUJBQUEsR0FBQSwrQkFBQSxHQUFBLHNCQUEyQyxHQUFBLDhCQUFBLEdBQUEsRUFBQSxFQUFBLG1CQUFBLEdBQUEsNENBQUEsRUFBQSx1Q0FBQSxFQUFBLDRDQUFBLElBQUEsdU1BQTZFLEVBQUEsNENBQUEsRUFBQSwwQ0FBQSxFQUFBLG9EQUFBLHNCQUFBLEdBQUEsWUFBQSxHQUFBLHVCQUFBLEdBQUEsbUJBQUEsR0FBQSxNQUFBLHdEQUFBLEdBQUEsa0RBQUEsR0FBQSx1REFBQSxLQUFBLGlCQUFBLElBQUEsaURBQUEsYUFBQSxLQUFBLElBQUEsaUJBQUEsSUFBQSxpREFBQSxhQUFBLEtBQUEsSUFBQSxpQkFBQSxJQUFBLGlEQUFBLGFBQUEsS0FBQSxJQUFBLGtCQUFBLElBQUEsa0RBQUEsY0FBQSxLQUFBLElBQUEsa0JBQUEsSUFBQSxrREFBQSxjQUFBLEtBQUEsSUFBQSxrQkFBQSxJQUFBLGtEQUFBLGNBQUEsS0FBQSxLQUFBLDJDQUFBLEVBQUEscUNBQUEsRUFBQSwwQ0FBQSxFQUFBLG1EQUFBLHNCQUFBLEdBQUEsWUFBQSxHQUFBLFdBQUEsR0FBQSxJQUFBLDJDQUFBLEVBQUEscUNBQUEsRUFBQSwwQ0FBQSxFQUFBLG1EQUFBLHNCQUFBLEdBQUEsWUFBQSxHQUFBLFdBQUEsR0FBQSxJQUFBLDJDQUFBLEVBQUEscUNBQUEsRUFBQSwwQ0FBQSxFQUFBLG1EQUFBLHNCQUFBLEdBQUEsWUFBQSxHQUFBLFdBQUEsR0FBQSxJQUFBLDJDQUFBLEVBQUEscUNBQUEsRUFBQSwwQ0FBQSxFQUFBLDBGQUFBLFdBQUEsR0FBQSxZQUFBLEdBQUEsaUJBQUEsSUFBQSxLQUFBLDhGQUFBLFdBQUEsR0FBQSxhQUFBLEdBQUEsZ0JBQUEsSUFBQSxNQUFBLDJDQUFBLEVBQUEscUNBQUEsRUFBQSwwQ0FBQSxJQUFBLGtGQUFBLFdBQUEsR0FBQSxZQUFBLEdBQUEsdUJBQUEsSUFBQSxRQUFBLDBDQUFBLEVBQUEsNEJBQUEsRUFBQSx5Q0FBQSxLQUFBLGdEQUFBLEdBQUEsZ0RBQUEsNExBQUEsWUFBQSxLQUFBLElBQUEsTUFBQSwwREFBQSxHQUFBLGdEQUFBLG9IQUFBLFdBQUEsS0FBQSxZQUFBLEtBQUEsaUJBQUEsS0FBQSxJQUFBLHNIQUFBLFdBQUEsS0FBQSxhQUFBLEtBQUEsZUFBQSxLQUFBLElBQUEsR0FBQSxnREFBQSxzRkFBQSx1QkFBQSxLQUFBLGdCQUFBLEtBQUEsZUFBQSxLQUFBLFlBQUEsS0FBQSxJQUFBLEtBQUEseUNBQUEsRUFBQSw2QkFBQSxFQUFBLHlDQUFBLEVBQUEsK0NBQUEsZ0dBQUEsZUFBQSxJQUFBLEdBQUEiLCJmaWxlIjoieWlrZXMtaW5jLWVhc3ktbWFpbGNoaW1wLWV4dGVuZGVyLXB1YmxpYy5jc3MiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcciAqIEFsbCBvZiB0aGUgQ1NTIGZvciB5b3VyIHB1YmxpYy1mYWNpbmcgZnVuY3Rpb25hbGl0eSBzaG91bGQgYmVcciAqIGluY2x1ZGVkIGluIHRoaXMgZmlsZS5cciAqL1xyIFxyIC55aWtlcy1lYXN5LW1jLWZvcm0ge1xyXHRkaXNwbGF5OiBibG9jaztcclx0d2lkdGg6IDEwMCU7XHIgfVxyXHRcclx0Lnlpa2VzLWVhc3ktbWFpbGNoaW1wLWVkaXQtZm9ybS1saW5rIHtcclx0XHRkaXNwbGF5OiBibG9jaztcclx0XHRtYXJnaW4tYm90dG9tOiAxZW07XHJcdH1cciBcciAvKiBJbnB1dCBoZWlnaHRzICovXHIgLnlpa2VzLWVhc3ktbWMtZm9ybSBzZWxlY3QsXHIgLnlpa2VzLWVhc3ktbWMtZm9ybSBpbnB1dFt0eXBlPVwidGV4dFwiXSxcciAueWlrZXMtZWFzeS1tYy1mb3JtIGlucHV0W3R5cGU9XCJ1cmxcIl0sXHIgLnlpa2VzLWVhc3ktbWMtZm9ybSBpbnB1dFt0eXBlPVwiZW1haWxcIl0sXHIgLnlpa2VzLWVhc3ktbWMtZm9ybSBpbnB1dFt0eXBlPVwibnVtYmVyXCJdIHtcclx0bWluLWhlaWdodDogNDBweDtcclx0cGFkZGluZzogMTBweDtcclx0YmFja2dyb3VuZDogI0YxRjFGMTtcclx0Ym9yZGVyOiAycHggc29saWQgcmdiYSg1MSwgNTEsIDUxLCAwLjEpO1xyIH1cciBcciAueWlrZXMtZWFzeS1tYy1mb3JtIHNlbGVjdDpmb2N1cyxcciAueWlrZXMtZWFzeS1tYy1mb3JtIGlucHV0W3R5cGU9XCJ0ZXh0XCJdOmZvY3VzLFxyIC55aWtlcy1lYXN5LW1jLWZvcm0gaW5wdXRbdHlwZT1cInVybFwiXTpmb2N1cyxcciAueWlrZXMtZWFzeS1tYy1mb3JtIGlucHV0W3R5cGU9XCJlbWFpbFwiXTpmb2N1cyxcciAueWlrZXMtZWFzeS1tYy1mb3JtIGlucHV0W3R5cGU9XCJudW1iZXJcIl06Zm9jdXMge1xyXHRvdXRsaW5lOiAycHggc29saWQgcmdiYSg1MSwgNTEsIDUxLCAwLjMwKTtcclx0b3V0bGluZTogMnB4IHNvbGlkIHJnYmEoNTEsIDUxLCA1MSwgMC4zMCk7XHIgfVxyIFxyIC8qIFN1Ym1pdCBCdXR0b24gKi9cciAueWlrZXMtZWFzeS1tYy1mb3JtIC55aWtlcy1lYXN5LW1jLXN1Ym1pdC1idXR0b24ge1xyXHRkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XHJcdHdpZHRoOiAxMDAlO1xyXHRtYXJnaW4tdG9wOiAxZW07XHJcdG1hcmdpbi1ib3R0b206IDFlbTtcciB9XHIgIFxyICAvKiBGb3JtIERlc2NyaXB0aW9uICovXHIgICAueWlrZXMtZWFzeS1tYy1mb3JtIC5mb3JtLWZpZWxkLWRlc2NyaXB0aW9uIHtcclx0XHRkaXNwbGF5OiBibG9jaztcclx0XHRtYXJnaW4tdG9wOiAtLjI1ZW07XHJcdFx0bWFyZ2luLWJvdHRvbTogLjc1ZW07XHJcdFx0Zm9udC1zdHlsZTogaXRhbGljO1xyXHQgfVxyXHQgXHJcdCAueWlrZXMtZWFzeS1tYy1mb3JtIGxhYmVsID4gLmZvcm0tZmllbGQtZGVzY3JpcHRpb24ge1xyXHRcdGRpc3BsYXk6IGJsb2NrO1xyXHRcdG1hcmdpbi10b3A6IC4yNWVtO1xyXHRcdG1hcmdpbi1ib3R0b206IDA7XHJcdFx0Zm9udC1zdHlsZTogaXRhbGljO1xyXHQgfVxyIFxyIFxyIC8qIExhYmVscyBEZXNjcmlwdGlvbnMgKi9cciAueWlrZXMtZWFzeS1tYy1mb3JtIGxhYmVsLFxyIC55aWtlcy1lYXN5LW1jLWZvcm0gLmZpZWxkLW5vLWxhYmVsIHtcclx0ZGlzcGxheTogaW5saW5lLWJsb2NrO1xyXHRtYXJnaW4tYm90dG9tOiAuNWVtO1xyXHR3aWR0aDogMTAwJTtcciB9XHIgXHIgXHIgLyogTm8gTGFiZWwgRGVzY3JpcHRpb25zICovXHIgXHIgLnlpa2VzLWVhc3ktbWMtZm9ybSBzZWxlY3QsXHIgLnlpa2VzLWVhc3ktbWMtZm9ybSBpbnB1dFt0eXBlPVwibnVtYmVyXCJdLFxyIC55aWtlcy1lYXN5LW1jLWZvcm0gaW5wdXRbdHlwZT1cInRleHRcIl0sIFxyIC55aWtlcy1lYXN5LW1jLWZvcm0gaW5wdXRbdHlwZT1cImVtYWlsXCJdLCBcciAueWlrZXMtZWFzeS1tYy1mb3JtIGlucHV0W3R5cGU9XCJ1cmxcIl0sIFxyIC55aWtlcy1lYXN5LW1jLWZvcm0gaW5wdXRbdHlwZT1cInBhc3N3b3JkXCJdLCBcciAueWlrZXMtZWFzeS1tYy1mb3JtIHRleHRhcmVhIHtcclx0Ym94LXNpemluZzogYm9yZGVyLWJveDtcclx0ZGlzcGxheTogaW5saW5lLWJsb2NrO1xyXHR3aWR0aDogMTAwJTtcciB9XHIgXHIgLyoqIFJhZGlvIEZvcm0gQnV0dG9ucyAqKi9cciAuY2hlY2tib3gtcGFyZW50LWxhYmVsIHtcclx0d2lkdGg6IDEwMCU7XHJcdGRpc3BsYXk6IGJsb2NrO1xyIH1cciAueWlrZXMtZWFzeS1tYy1mb3JtIC55aWtlcy1lYXN5LW1jLWNoZWNrYm94LWxhYmVsIHtcclx0ZGlzcGxheTogaW5saW5lLWJsb2NrO1xyIH1cciAueWlrZXMtZWFzeS1tYy1mb3JtIC55aWtlcy1lYXN5LW1jLWNoZWNrYm94LWxhYmVsLmxhc3Qtc2VsZWN0aW9uIHtcclx0bWFyZ2luLWJvdHRvbTogMDtcciB9XHIgXHIgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cciAvKiAgICBGcm9udCBFbmQgUHJlLWRlZmluZWQgQ2xhc3NlcyAgKi9cciAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xyIFxyXHQvKiBcclx0XHRUbyBEb1xyXHRcdC0gSW5saW5lIExpc3Rcclx0XHQtIGxpc3QgaGVpZ2h0XHJcdFx0LSBzY3JvbGwgdGV4dCBmb3IgYmxvY2tzIG9mIGh0bWwgdGV4dCAoZGlzY2xhaW1lciBldGMuKVxyXHRcdGh0dHA6Ly93d3cuZ3Jhdml0eWhlbHAuY29tL2Nzcy1yZWFkeS1jbGFzc2VzLWZvci1ncmF2aXR5LWZvcm1zL1xyXHRcdFxyXHQvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXHJcdC8qICAgICAgICBJbmxpbmUgUmFkaW8gJiBDaGVja2JveGVzICAgICAgICovXHJcdC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xyXHQueWlrZXMtZWFzeS1tYy1mb3JtIGxhYmVsLm9wdGlvbi1pbmxpbmUgPiBsYWJlbCB7XHJcdFx0ZGlzcGxheTogaW5saW5lLWJsb2NrO1xyXHRcdGZsb2F0OiBsZWZ0O1xyXHRcdHdpZHRoOiBhdXRvO1xyXHRcdG1hcmdpbi1yaWdodDogMTVweDtcclx0fVx0XHJcdFx0XHJcdC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cclx0LyogICBcdCAgXHRcdDItQ29sdW1uIFJhZGlvICAgICAgICAgICAqL1xyXHQvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cclx0Lnlpa2VzLWVhc3ktbWMtZm9ybSBsYWJlbC5vcHRpb24tMi1jb2wgPiBsYWJlbCB7XHJcdFx0ZGlzcGxheTogaW5saW5lLWJsb2NrO1xyXHRcdGZsb2F0OiBsZWZ0O1xyXHRcdHdpZHRoOiA1MCU7XHJcdH1cclx0XHJcdC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cclx0LyogICBcdCAgXHRcdDMtQ29sdW1uIFJhZGlvICAgICAgICAgICAqL1xyXHQvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cclx0Lnlpa2VzLWVhc3ktbWMtZm9ybSBsYWJlbC5vcHRpb24tMy1jb2wgPiBsYWJlbCB7XHJcdFx0ZGlzcGxheTogaW5saW5lLWJsb2NrO1xyXHRcdGZsb2F0OiBsZWZ0O1xyXHRcdHdpZHRoOiAzMyU7XHJcdH1cclx0XHJcdC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cclx0LyogICBcdCAgXHRcdDQtQ29sdW1uIFJhZGlvICAgICAgICAgICAqL1xyXHQvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cclx0Lnlpa2VzLWVhc3ktbWMtZm9ybSBsYWJlbC5vcHRpb24tMy1jb2wgPiBsYWJlbCB7XHJcdFx0ZGlzcGxheTogaW5saW5lLWJsb2NrO1xyXHRcdGZsb2F0OiBsZWZ0O1xyXHRcdHdpZHRoOiAyNSU7XHJcdH1cclx0XHJcdC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cclx0LyogICBcdCAgXHRcdDItQ29sdW1uIEZvcm0gICAgICAgICAgICAqL1xyXHQvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cclx0IC55aWtlcy1lYXN5LW1jLWZvcm0gbGFiZWwuZmllbGQtbGVmdC1oYWxmIHtcclx0XHR3aWR0aDogNDglO1xyXHRcdGZsb2F0OiBsZWZ0O1xyXHRcdG1hcmdpbi1yaWdodDogMiU7XHJcdCB9XHJcdCBcclx0IC55aWtlcy1lYXN5LW1jLWZvcm0gbGFiZWwuZmllbGQtcmlnaHQtaGFsZiB7XHJcdFx0d2lkdGg6IDQ4JTtcclx0XHRmbG9hdDogcmlnaHQ7XHJcdFx0bWFyZ2luLWxlZnQ6IDIlO1xyXHQgfVxyXHQgXHJcdCAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXHJcdC8qICAgXHQgIFx0XHQzLUNvbHVtbiBGb3JtICAgICAgICAgICAgKi9cclx0LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXHJcdFxyXHQueWlrZXMtZWFzeS1tYy1mb3JtIGxhYmVsLmZpZWxkLWxlZnQtdGhpcmQge1xyXHRcdHdpZHRoOiAzMiU7XHJcdFx0ZmxvYXQ6IGxlZnQ7XHJcdFx0bWFyZ2luLXJpZ2h0OiAxLjMzMzMzJTtcclx0IH1cclx0IFxyXHQgLnlpa2VzLWVhc3ktbWMtZm9ybSBsYWJlbC5maWVsZC1yaWdodC10aGlyZCB7XHJcdFx0d2lkdGg6IDMyJTtcclx0XHRmbG9hdDogcmlnaHQ7XHJcdFx0bWFyZ2luLWxlZnQ6IDEuMzMzMzMlO1xyXHQgfVxyXHQgXHJcdCBcclx0LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cclx0LypcdFx0Q2hlY2tib3ggSW50ZWdyYXRpb24gU3R5bGVzXHQgKi9cclx0LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xyXHQiXX0= */
 
1
  * All of the CSS for your public-facing functionality should be
2
  * included in this file.
3
  */
4
 
5
  .yikes-easy-mc-form {
6
  }
7
  /* Input heights */
8
  .yikes-easy-mc-form select,
9
  .yikes-easy-mc-form input[type="text"],
10
  .yikes-easy-mc-form input[type="url"],
11
  .yikes-easy-mc-form input[type="email"],
12
  .yikes-easy-mc-form input[type="number"] {
13
  }
14
 
15
  .yikes-easy-mc-form select:focus,
16
  .yikes-easy-mc-form input[type="text"]:focus,
17
  .yikes-easy-mc-form input[type="url"]:focus,
18
  .yikes-easy-mc-form input[type="email"]:focus,
19
  .yikes-easy-mc-form input[type="number"]:focus {
20
  }
21
 
22
  /* Datepicker */
23
  }
24
 
25
  /* Submit Button */
26
  .yikes-easy-mc-form .yikes-easy-mc-submit-button {
27
  }
28
  /* Form Description */
29
  .yikes-easy-mc-form .form-field-description {
30
 
31
 
32
  /* Labels & Descriptions */
33
  .yikes-easy-mc-form label,
34
  .yikes-easy-mc-form .field-no-label {
35
  }
36
 
37
  /* Interest Group Required Error Notice */
38
  p.yikes-mailchimp-required-interest-group-error {
39
  }
40
 
41
  /* No Label Descriptions */
42
 
43
  .yikes-easy-mc-form select,
44
  .yikes-easy-mc-form input[type="number"],
45
  .yikes-easy-mc-form input[type="text"],
46
  .yikes-easy-mc-form input[type="email"],
47
  .yikes-easy-mc-form input[type="url"],
48
  .yikes-easy-mc-form input[type="password"],
49
  .yikes-easy-mc-form textarea {
50
  }
51
 
52
 
53
  /** Radio Form Buttons **/
54
  .checkbox-parent-label {
55
  }
56
  .yikes-easy-mc-form .yikes-easy-mc-checkbox-label {
57
  }
58
 
59
  .yikes-easy-mc-display-none,
60
  .mailchimp-field-hidden {
61
  }
62
 
63
  .yikes-easy-mc-text-align-right {
64
  }
65
 
66
 
67
 
68
 
69
  /******************************************/
70
  /* Front End Pre-defined Classes */
71
  /******************************************/
72
 
73
+ /**
74
  * All of the CSS for your public-facing functionality should be
75
  * included in this file.
76
  */
77
 
78
  .yikes-easy-mc-form {
79
  }
80
  /* Input heights */
81
  .yikes-easy-mc-form select,
82
  .yikes-easy-mc-form input[type="text"],
83
  .yikes-easy-mc-form input[type="url"],
84
  .yikes-easy-mc-form input[type="email"],
85
  .yikes-easy-mc-form input[type="number"] {
86
  }
87
 
88
  .yikes-easy-mc-form select:focus,
89
  .yikes-easy-mc-form input[type="text"]:focus,
90
  .yikes-easy-mc-form input[type="url"]:focus,
91
  .yikes-easy-mc-form input[type="email"]:focus,
92
  .yikes-easy-mc-form input[type="number"]:focus {
93
  }
94
 
95
  /* Datepicker */
96
  }
97
 
98
  /* Submit Button */
99
  .yikes-easy-mc-form .yikes-easy-mc-submit-button {
100
  }
101
  /* Form Description */
102
  .yikes-easy-mc-form .form-field-description {
103
 
104
 
105
  /* Labels & Descriptions */
106
  .yikes-easy-mc-form label,
107
  .yikes-easy-mc-form .field-no-label {
108
  }
109
 
110
  /* Interest Group Required Error Notice */
111
  p.yikes-mailchimp-required-interest-group-error {
112
  }
113
 
114
  /* No Label Descriptions */
115
 
116
  .yikes-easy-mc-form select,
117
  .yikes-easy-mc-form input[type="number"],
118
  .yikes-easy-mc-form input[type="text"],
119
  .yikes-easy-mc-form input[type="email"],
120
  .yikes-easy-mc-form input[type="url"],
121
  .yikes-easy-mc-form input[type="password"],
122
  .yikes-easy-mc-form textarea {
123
  }
124
 
125
 
126
  /** Radio Form Buttons **/
127
  .checkbox-parent-label {
128
  }
129
  .yikes-easy-mc-form .yikes-easy-mc-checkbox-label {
130
  }
131
 
132
  .yikes-easy-mc-display-none,
133
  .mailchimp-field-hidden {
134
  }
135
 
136
  .yikes-easy-mc-text-align-right {
137
  }
138
 
139
 
140
 
141
 
142
  /******************************************/
143
  /* Front End Pre-defined Classes */
144
  /******************************************/
145
 
146
  /*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInlpa2VzLWluYy1lYXN5LW1haWxjaGltcC1leHRlbmRlci1wdWJsaWMuY3NzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLG1HQUFrRyxJQUFJLHVCQUFBLGVBQUEsRUFBQSxZQUFBLEdBQUEsSUFBd0MseUNBQW1CLGVBQXlDLEdBQUEsbUJBQUEsR0FBQSxJQUFBLDhDQUE0QyxFQUFBLG9EQUFBLHNCQUFBLEdBQUEsWUFBQSxHQUFBLEtBQUEsbUJBQUEsRUFBQSxvTUFBcUIsa0JBQUEsRUFBQSwwQkFBQSxFQUFBLHdDQUFBLEVBQUEsZUFBQSxFQUFBLDRCQUFBLEVBQUEsbUJBQUEsR0FBQSxJQUFBLGtPQUFBLDBDQUE0UyxFQUFBLDBDQUFBLEdBQUEsSUFBQSxnQkFBd1QsQ0FBQSw4RkFBQSxpQkFBOEwsR0FBQSxJQUFBLG1CQUFBLEVBQUEsb0RBQUEsZUFBQSxDQUFBLGtGQUFBLEVBQUEsWUFBQSxFQUE2SSxpQkFBMEUsRUFBQSxpQkFBQSxFQUFBLGNBQUEsRUFBQSxnQkFBQSxHQUFBLEVBQUEscUVBQUEsbUJBQWlHLEdBQUEsSUFBQSx3REFBc0ksRUFBQSxvREFBQSxXQUFBLEdBQUEsZ0JBQStCLEdBQUEsWUFBQSxHQUFBLE1BQUEsa0ZBQUEsY0FBQSxJQUFBLG9CQUFBLElBQUEsS0FBQSxzQkFBQSxJQUFBLGdEQUFBLGVBQUEsR0FBQSxtQkFBQSxHQUFBLHFCQUFBLEdBQUEsbUJBQUEsSUFBQSxNQUFBLHdEQUFBLGVBQUEsR0FBQSxtQkFBQSxHQUFBLG1CQUFBLElBQUEsSUFBQSxpQ0FBQSwrQkFBQSxHQUFBLG9CQUFBLEdBQUEsY0FBQSxHQUFBLGVBQUEsR0FBQSxtQkFBQSxHQUFBLElBQUEsbUNBQUEsZUFBQSxHQUFBLG9CQUFBLEdBQUEsY0FBQSxHQUFBLGVBQUEsR0FBQSxtQkFBQSxHQUFBLElBQUEsMkJBQUEsRUFBQSxtRUFBQSxzQkFBQSxFQUFBLG9CQUFBLEVBQUEsWUFBQSxHQUFBLElBQUEsMENBQUEsRUFBQSxtREFBQSwrQkFBNDdCLEVBQUEsY0FBQSxHQUFBLElBQUEsMkJBQTBGLElBQUEsb1JBQUEsdUJBQUEsRUFBQSxlQUFBLEVBQUEsWUFBQSxFQUFBLGdCQUFBLEdBQUEsSUFBQSw0REFBQSxXQUFBLEdBQUEsV0FBQSxHQUFBLGlCQUFBLEdBQUEsaUJBQUEsR0FBQSxJQUFBLHVGQUFBLFlBQUEsR0FBQSxnQkFBQSxHQUFBLElBQUEsMEJBQUEsRUFBQSwwQkFBQSxZQUFBLEVBQUEsZUFBQSxHQUFBLEVBQUEscURBQUEsc0JBQUEsR0FBQSxJQUFBLHlEQUFBLHlCQUFBLEdBQUEsSUFBQSxtQ0FBQSxrQkFBaXVCLEdBQUEsSUFBQSwyQ0FBMEosRUFBQSxpREFBQSxjQUFBLEdBQUEsSUFBQSx1QkFBQSxFQUFBLHFDQUFBLGVBQUEsR0FBQSxnQkFBQSxHQUFBLEVBQUEsd0VBQUEsQ0FBQSwyQkFBdVEsbUJBQUEsRUFBQSxTQUFBLEVBQUEsUUFBQSxFQUFBLFNBQTBCLEVBQUEsVUFBQSxFQUFBLGVBQUEsRUFBQSxFQUFBLHdDQUFBLENBQUEsZ0JBQThNLHVCQUFBLEVBQUEsK0JBQUEsRUFBQSxzQkFBQSxFQUFBLDhCQUE0RyxFQUFBLHFCQUFBLEVBQUEsS0FBQSx5Q0FBQSxrQ0FBcUMsdUJBQUEsR0FBQSwrQkFBQSxHQUFBLHNCQUEyQyxHQUFBLDhCQUFBLEdBQUEsRUFBQSxFQUFBLG1CQUFBLEdBQUEsNENBQUEsRUFBQSx1Q0FBQSxFQUFBLDRDQUFBLElBQUEsdU1BQTZFLEVBQUEsNENBQUEsRUFBQSwwQ0FBQSxFQUFBLG9EQUFBLHNCQUFBLEdBQUEsWUFBQSxHQUFBLHVCQUFBLEdBQUEsbUJBQUEsR0FBQSxNQUFBLHdEQUFBLEdBQUEsa0RBQUEsR0FBQSx1REFBQSxLQUFBLGlCQUFBLElBQUEsaURBQUEsYUFBQSxLQUFBLElBQUEsaUJBQUEsSUFBQSxpREFBQSxhQUFBLEtBQUEsSUFBQSxpQkFBQSxJQUFBLGlEQUFBLGFBQUEsS0FBQSxJQUFBLGtCQUFBLElBQUEsa0RBQUEsY0FBQSxLQUFBLElBQUEsa0JBQUEsSUFBQSxrREFBQSxjQUFBLEtBQUEsSUFBQSxrQkFBQSxJQUFBLGtEQUFBLGNBQUEsS0FBQSxLQUFBLDJDQUFBLEVBQUEscUNBQUEsRUFBQSwwQ0FBQSxFQUFBLG1EQUFBLHNCQUFBLEdBQUEsWUFBQSxHQUFBLFdBQUEsR0FBQSxJQUFBLDJDQUFBLEVBQUEscUNBQUEsRUFBQSwwQ0FBQSxFQUFBLG1EQUFBLHNCQUFBLEdBQUEsWUFBQSxHQUFBLFdBQUEsR0FBQSxJQUFBLDJDQUFBLEVBQUEscUNBQUEsRUFBQSwwQ0FBQSxFQUFBLG1EQUFBLHNCQUFBLEdBQUEsWUFBQSxHQUFBLFdBQUEsR0FBQSxJQUFBLDJDQUFBLEVBQUEscUNBQUEsRUFBQSwwQ0FBQSxFQUFBLDBGQUFBLFdBQUEsR0FBQSxZQUFBLEdBQUEsaUJBQUEsSUFBQSxLQUFBLDhGQUFBLFdBQUEsR0FBQSxhQUFBLEdBQUEsZ0JBQUEsSUFBQSxNQUFBLDJDQUFBLEVBQUEscUNBQUEsRUFBQSwwQ0FBQSxJQUFBLGtGQUFBLFdBQUEsR0FBQSxZQUFBLEdBQUEsdUJBQUEsSUFBQSxRQUFBLDBDQUFBLEVBQUEsNEJBQUEsRUFBQSx5Q0FBQSxLQUFBLGdEQUFBLEdBQUEsZ0RBQUEsNExBQUEsWUFBQSxLQUFBLElBQUEsTUFBQSwwREFBQSxHQUFBLGdEQUFBLG9IQUFBLFdBQUEsS0FBQSxZQUFBLEtBQUEsaUJBQUEsS0FBQSxJQUFBLHNIQUFBLFdBQUEsS0FBQSxhQUFBLEtBQUEsZUFBQSxLQUFBLElBQUEsR0FBQSxnREFBQSxzRkFBQSx1QkFBQSxLQUFBLGdCQUFBLEtBQUEsZUFBQSxLQUFBLFlBQUEsS0FBQSxJQUFBLEtBQUEseUNBQUEsRUFBQSw2QkFBQSxFQUFBLHlDQUFBLEVBQUEsK0NBQUEsZ0dBQUEsZUFBQSxJQUFBLEdBQUEiLCJmaWxlIjoieWlrZXMtaW5jLWVhc3ktbWFpbGNoaW1wLWV4dGVuZGVyLXB1YmxpYy5jc3MiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcciAqIEFsbCBvZiB0aGUgQ1NTIGZvciB5b3VyIHB1YmxpYy1mYWNpbmcgZnVuY3Rpb25hbGl0eSBzaG91bGQgYmVcciAqIGluY2x1ZGVkIGluIHRoaXMgZmlsZS5cciAqL1xyIFxyIC55aWtlcy1lYXN5LW1jLWZvcm0ge1xyXHRkaXNwbGF5OiBibG9jaztcclx0d2lkdGg6IDEwMCU7XHIgfVxyXHRcclx0Lnlpa2VzLWVhc3ktbWFpbGNoaW1wLWVkaXQtZm9ybS1saW5rIHtcclx0XHRkaXNwbGF5OiBibG9jaztcclx0XHRtYXJnaW4tYm90dG9tOiAxZW07XHJcdH1cciBcciAvKiBJbnB1dCBoZWlnaHRzICovXHIgLnlpa2VzLWVhc3ktbWMtZm9ybSBzZWxlY3QsXHIgLnlpa2VzLWVhc3ktbWMtZm9ybSBpbnB1dFt0eXBlPVwidGV4dFwiXSxcciAueWlrZXMtZWFzeS1tYy1mb3JtIGlucHV0W3R5cGU9XCJ1cmxcIl0sXHIgLnlpa2VzLWVhc3ktbWMtZm9ybSBpbnB1dFt0eXBlPVwiZW1haWxcIl0sXHIgLnlpa2VzLWVhc3ktbWMtZm9ybSBpbnB1dFt0eXBlPVwibnVtYmVyXCJdIHtcclx0bWluLWhlaWdodDogNDBweDtcclx0cGFkZGluZzogMTBweDtcclx0YmFja2dyb3VuZDogI0YxRjFGMTtcclx0Ym9yZGVyOiAycHggc29saWQgcmdiYSg1MSwgNTEsIDUxLCAwLjEpO1xyIH1cciBcciAueWlrZXMtZWFzeS1tYy1mb3JtIHNlbGVjdDpmb2N1cyxcciAueWlrZXMtZWFzeS1tYy1mb3JtIGlucHV0W3R5cGU9XCJ0ZXh0XCJdOmZvY3VzLFxyIC55aWtlcy1lYXN5LW1jLWZvcm0gaW5wdXRbdHlwZT1cInVybFwiXTpmb2N1cyxcciAueWlrZXMtZWFzeS1tYy1mb3JtIGlucHV0W3R5cGU9XCJlbWFpbFwiXTpmb2N1cyxcciAueWlrZXMtZWFzeS1tYy1mb3JtIGlucHV0W3R5cGU9XCJudW1iZXJcIl06Zm9jdXMge1xyXHRvdXRsaW5lOiAycHggc29saWQgcmdiYSg1MSwgNTEsIDUxLCAwLjMwKTtcclx0b3V0bGluZTogMnB4IHNvbGlkIHJnYmEoNTEsIDUxLCA1MSwgMC4zMCk7XHIgfVxyIFxyIC8qIFN1Ym1pdCBCdXR0b24gKi9cciAueWlrZXMtZWFzeS1tYy1mb3JtIC55aWtlcy1lYXN5LW1jLXN1Ym1pdC1idXR0b24ge1xyXHRkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XHJcdHdpZHRoOiAxMDAlO1xyXHRtYXJnaW4tdG9wOiAxZW07XHJcdG1hcmdpbi1ib3R0b206IDFlbTtcciB9XHIgIFxyICAvKiBGb3JtIERlc2NyaXB0aW9uICovXHIgICAueWlrZXMtZWFzeS1tYy1mb3JtIC5mb3JtLWZpZWxkLWRlc2NyaXB0aW9uIHtcclx0XHRkaXNwbGF5OiBibG9jaztcclx0XHRtYXJnaW4tdG9wOiAtLjI1ZW07XHJcdFx0bWFyZ2luLWJvdHRvbTogLjc1ZW07XHJcdFx0Zm9udC1zdHlsZTogaXRhbGljO1xyXHQgfVxyXHQgXHJcdCAueWlrZXMtZWFzeS1tYy1mb3JtIGxhYmVsID4gLmZvcm0tZmllbGQtZGVzY3JpcHRpb24ge1xyXHRcdGRpc3BsYXk6IGJsb2NrO1xyXHRcdG1hcmdpbi10b3A6IC4yNWVtO1xyXHRcdG1hcmdpbi1ib3R0b206IDA7XHJcdFx0Zm9udC1zdHlsZTogaXRhbGljO1xyXHQgfVxyIFxyIFxyIC8qIExhYmVscyBEZXNjcmlwdGlvbnMgKi9cciAueWlrZXMtZWFzeS1tYy1mb3JtIGxhYmVsLFxyIC55aWtlcy1lYXN5LW1jLWZvcm0gLmZpZWxkLW5vLWxhYmVsIHtcclx0ZGlzcGxheTogaW5saW5lLWJsb2NrO1xyXHRtYXJnaW4tYm90dG9tOiAuNWVtO1xyXHR3aWR0aDogMTAwJTtcciB9XHIgXHIgXHIgLyogTm8gTGFiZWwgRGVzY3JpcHRpb25zICovXHIgXHIgLnlpa2VzLWVhc3ktbWMtZm9ybSBzZWxlY3QsXHIgLnlpa2VzLWVhc3ktbWMtZm9ybSBpbnB1dFt0eXBlPVwibnVtYmVyXCJdLFxyIC55aWtlcy1lYXN5LW1jLWZvcm0gaW5wdXRbdHlwZT1cInRleHRcIl0sIFxyIC55aWtlcy1lYXN5LW1jLWZvcm0gaW5wdXRbdHlwZT1cImVtYWlsXCJdLCBcciAueWlrZXMtZWFzeS1tYy1mb3JtIGlucHV0W3R5cGU9XCJ1cmxcIl0sIFxyIC55aWtlcy1lYXN5LW1jLWZvcm0gaW5wdXRbdHlwZT1cInBhc3N3b3JkXCJdLCBcciAueWlrZXMtZWFzeS1tYy1mb3JtIHRleHRhcmVhIHtcclx0Ym94LXNpemluZzogYm9yZGVyLWJveDtcclx0ZGlzcGxheTogaW5saW5lLWJsb2NrO1xyXHR3aWR0aDogMTAwJTtcciB9XHIgXHIgLyoqIFJhZGlvIEZvcm0gQnV0dG9ucyAqKi9cciAuY2hlY2tib3gtcGFyZW50LWxhYmVsIHtcclx0d2lkdGg6IDEwMCU7XHJcdGRpc3BsYXk6IGJsb2NrO1xyIH1cciAueWlrZXMtZWFzeS1tYy1mb3JtIC55aWtlcy1lYXN5LW1jLWNoZWNrYm94LWxhYmVsIHtcclx0ZGlzcGxheTogaW5saW5lLWJsb2NrO1xyIH1cciAueWlrZXMtZWFzeS1tYy1mb3JtIC55aWtlcy1lYXN5LW1jLWNoZWNrYm94LWxhYmVsLmxhc3Qtc2VsZWN0aW9uIHtcclx0bWFyZ2luLWJvdHRvbTogMDtcciB9XHIgXHIgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cciAvKiAgICBGcm9udCBFbmQgUHJlLWRlZmluZWQgQ2xhc3NlcyAgKi9cciAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xyIFxyXHQvKiBcclx0XHRUbyBEb1xyXHRcdC0gSW5saW5lIExpc3Rcclx0XHQtIGxpc3QgaGVpZ2h0XHJcdFx0LSBzY3JvbGwgdGV4dCBmb3IgYmxvY2tzIG9mIGh0bWwgdGV4dCAoZGlzY2xhaW1lciBldGMuKVxyXHRcdGh0dHA6Ly93d3cuZ3Jhdml0eWhlbHAuY29tL2Nzcy1yZWFkeS1jbGFzc2VzLWZvci1ncmF2aXR5LWZvcm1zL1xyXHRcdFxyXHQvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXHJcdC8qICAgICAgICBJbmxpbmUgUmFkaW8gJiBDaGVja2JveGVzICAgICAgICovXHJcdC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xyXHQueWlrZXMtZWFzeS1tYy1mb3JtIGxhYmVsLm9wdGlvbi1pbmxpbmUgPiBsYWJlbCB7XHJcdFx0ZGlzcGxheTogaW5saW5lLWJsb2NrO1xyXHRcdGZsb2F0OiBsZWZ0O1xyXHRcdHdpZHRoOiBhdXRvO1xyXHRcdG1hcmdpbi1yaWdodDogMTVweDtcclx0fVx0XHJcdFx0XHJcdC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cclx0LyogICBcdCAgXHRcdDItQ29sdW1uIFJhZGlvICAgICAgICAgICAqL1xyXHQvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cclx0Lnlpa2VzLWVhc3ktbWMtZm9ybSBsYWJlbC5vcHRpb24tMi1jb2wgPiBsYWJlbCB7XHJcdFx0ZGlzcGxheTogaW5saW5lLWJsb2NrO1xyXHRcdGZsb2F0OiBsZWZ0O1xyXHRcdHdpZHRoOiA1MCU7XHJcdH1cclx0XHJcdC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cclx0LyogICBcdCAgXHRcdDMtQ29sdW1uIFJhZGlvICAgICAgICAgICAqL1xyXHQvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cclx0Lnlpa2VzLWVhc3ktbWMtZm9ybSBsYWJlbC5vcHRpb24tMy1jb2wgPiBsYWJlbCB7XHJcdFx0ZGlzcGxheTogaW5saW5lLWJsb2NrO1xyXHRcdGZsb2F0OiBsZWZ0O1xyXHRcdHdpZHRoOiAzMyU7XHJcdH1cclx0XHJcdC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cclx0LyogICBcdCAgXHRcdDQtQ29sdW1uIFJhZGlvICAgICAgICAgICAqL1xyXHQvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cclx0Lnlpa2VzLWVhc3ktbWMtZm9ybSBsYWJlbC5vcHRpb24tMy1jb2wgPiBsYWJlbCB7XHJcdFx0ZGlzcGxheTogaW5saW5lLWJsb2NrO1xyXHRcdGZsb2F0OiBsZWZ0O1xyXHRcdHdpZHRoOiAyNSU7XHJcdH1cclx0XHJcdC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cclx0LyogICBcdCAgXHRcdDItQ29sdW1uIEZvcm0gICAgICAgICAgICAqL1xyXHQvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cclx0IC55aWtlcy1lYXN5LW1jLWZvcm0gbGFiZWwuZmllbGQtbGVmdC1oYWxmIHtcclx0XHR3aWR0aDogNDglO1xyXHRcdGZsb2F0OiBsZWZ0O1xyXHRcdG1hcmdpbi1yaWdodDogMiU7XHJcdCB9XHJcdCBcclx0IC55aWtlcy1lYXN5LW1jLWZvcm0gbGFiZWwuZmllbGQtcmlnaHQtaGFsZiB7XHJcdFx0d2lkdGg6IDQ4JTtcclx0XHRmbG9hdDogcmlnaHQ7XHJcdFx0bWFyZ2luLWxlZnQ6IDIlO1xyXHQgfVxyXHQgXHJcdCAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXHJcdC8qICAgXHQgIFx0XHQzLUNvbHVtbiBGb3JtICAgICAgICAgICAgKi9cclx0LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXHJcdFxyXHQueWlrZXMtZWFzeS1tYy1mb3JtIGxhYmVsLmZpZWxkLWxlZnQtdGhpcmQge1xyXHRcdHdpZHRoOiAzMiU7XHJcdFx0ZmxvYXQ6IGxlZnQ7XHJcdFx0bWFyZ2luLXJpZ2h0OiAxLjMzMzMzJTtcclx0IH1cclx0IFxyXHQgLnlpa2VzLWVhc3ktbWMtZm9ybSBsYWJlbC5maWVsZC1yaWdodC10aGlyZCB7XHJcdFx0d2lkdGg6IDMyJTtcclx0XHRmbG9hdDogcmlnaHQ7XHJcdFx0bWFyZ2luLWxlZnQ6IDEuMzMzMzMlO1xyXHQgfVxyXHQgXHJcdCBcclx0LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cclx0LypcdFx0Q2hlY2tib3ggSW50ZWdyYXRpb24gU3R5bGVzXHQgKi9cclx0LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xyXHQiXX0= */
public/css/yikes-inc-easy-mailchimp-extender-public.min.css CHANGED
@@ -1,2 +1 @@
1
- .yikes-easy-mc-form{display:block;width:100%}.yikes-easy-mailchimp-edit-form-link{display:block;margin-bottom:1em}.yikes-easy-mc-form.yikes-mailchimp-form-inline{display:inline-block;width:100%}.yikes-easy-mc-form input[type=text],.yikes-easy-mc-form input[type=url],.yikes-easy-mc-form input[type=email],.yikes-easy-mc-form input[type=number],.yikes-easy-mc-form select{padding:.5278em;background-color:#F1F1F1;border:2px solid rgba(51,51,51,.1);-moz-box-sizing:border-box;margin-bottom:8px}.yikes-easy-mc-form input[type=text]:focus,.yikes-easy-mc-form input[type=url]:focus,.yikes-easy-mc-form input[type=email]:focus,.yikes-easy-mc-form input[type=number]:focus,.yikes-easy-mc-form select:focus{outline:rgba(51,51,51,.3) solid 2px}.datepicker.datepicker-dropdown.dropdown-menu.datepicker-orient-left.datepicker-orient-top{min-width:258px}.yikes-easy-mc-form .yikes-easy-mc-submit-button{display:block;width:100%;margin-top:.5em;min-height:40px;padding:10px;cursor:pointer}.yikes-easy-mc-form .yikes-easy-mc-submit-button.admin-logged-in{margin-bottom:1em}.yikes-easy-mc-form .submit-button-inline-label{width:20%;min-width:90px;float:left}.yikes-easy-mc-form .submit-button-inline-label .yikes-easy-mc-submit-button{margin-top:0;margin-bottom:.5em}.yikes-easy-mc-form .form-field-description{display:block;margin-top:-.25em;margin-bottom:.75em;font-style:italic}.yikes-easy-mc-form label>.form-field-description{display:block;margin-bottom:5px;font-style:italic}.yikes-easy-mc-error-message{color:rgba(216,48,57,.87);background:#FFBABA;padding:12px;margin:15px 0;position:relative}.yikes-easy-mc-success-message{color:#4F8A10;background:#DFF2BF;padding:12px;margin:15px 0;position:relative}.yikes-easy-mc-form .field-no-label,.yikes-easy-mc-form label{display:inline-block;margin-bottom:.5em;width:100%}p.yikes-mailchimp-required-interest-group-error{color:rgba(216,48,57,.87);margin:8px 0}.yikes-easy-mc-form input[type=text],.yikes-easy-mc-form input[type=url],.yikes-easy-mc-form input[type=email],.yikes-easy-mc-form input[type=number],.yikes-easy-mc-form input[type=password],.yikes-easy-mc-form select,.yikes-easy-mc-form textarea{box-sizing:border-box;display:block;width:100%;max-width:100%}.yikes-easy-mc-form .yikes-easy-mc-submit-button-image{padding:0;width:16%;min-width:140px;max-width:200px}.yikes-easy-mc-form .submit-button-inline-label .yikes-easy-mc-submit-button-image{width:100%;max-width:100%}.checkbox-parent-label{width:100%;display:block}.yikes-easy-mc-form .yikes-easy-mc-checkbox-label{display:inline-block}.mailchimp-field-hidden,.yikes-easy-mc-display-none{display:none!important}.yikes-easy-mc-text-align-right{text-align:right}#yikes-mailchimp-container .yikes-form-title{margin-top:0}.yikes-mailchimp-disclaimer-text{display:block;margin-top:1em}.update-email-preloader{position:absolute;top:40%;left:0;right:0;bottom:0;margin:0 auto}.g-recaptcha{transform:scale(.81);-webkit-transform:scale(.81);transform-origin:0 0;-webkit-transform-origin:0 0;margin:7px 0 -3px}@media screen and (max-height:575px){#rc-imageselect,.g-recaptcha{transform:scale(.81);-webkit-transform:scale(.81);transform-origin:0 0;-webkit-transform-origin:0 0}}.yikes-easy-mc-form label.option-inline>label{display:inline-block;float:left;width:auto!important;margin-right:15px}.yikes-easy-mc-form label.option-height-25{height:25px}.yikes-easy-mc-form label.option-height-50{height:50px}.yikes-easy-mc-form label.option-height-75{height:75px}.yikes-easy-mc-form label.option-height-100{height:100px}.yikes-easy-mc-form label.option-height-125{height:125px}.yikes-easy-mc-form label.option-height-150{height:150px}.yikes-easy-mc-form label.option-2-col>label{display:inline-block;float:left;width:50%}.yikes-easy-mc-form label.option-3-col>label{display:inline-block;float:left;width:33%}.yikes-easy-mc-form label.option-4-col>label{display:inline-block;float:left;width:25%}.yikes-easy-mc-form input.field-left-half,.yikes-easy-mc-form label.field-left-half{width:48%;float:left;margin-right:2%}.yikes-easy-mc-form input.field-right-half,.yikes-easy-mc-form label.field-right-half{width:48%;float:right;margin-left:2%}.yikes-easy-mc-form input.field-third,.yikes-easy-mc-form label.field-third{width:32%;float:left;margin-right:1.33333%}@media only screen and (max-width:525px){.yikes-easy-mc-form input.field-left-half,.yikes-easy-mc-form input.field-right-half,.yikes-easy-mc-form label.field-left-half,.yikes-easy-mc-form label.field-right-half{width:100%}}@media only screen and (max-width:955px){.yikes-easy-mc-form input.field-third:nth-child(odd),.yikes-easy-mc-form label.field-third:nth-child(odd){width:48%;float:left;margin-right:2%}.yikes-easy-mc-form input.field-third:nth-child(even),.yikes-easy-mc-form label.field-third:nth-child(even){width:48%;float:right;margin-left:0}}@media only screen and (max-width:525px){.yikes-easy-mc-form input.field-third,.yikes-easy-mc-form label.field-third{width:100%!important;margin-right:0;margin-left:0;float:none}.datepicker.datepicker-dropdown.dropdown-menu.datepicker-orient-left.datepicker-orient-top{min-width:84%}}
2
- /*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInlpa2VzLWluYy1lYXN5LW1haWxjaGltcC1leHRlbmRlci1wdWJsaWMubWluLmNzcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxvQkFBb0IsY0FBYyxVQUFVLENBQUMscUNBQXFDLGNBQWMsaUJBQWlCLENBQUMsZ0RBQWdELHFCQUFxQixVQUFVLENBQUMsaUxBQWlMLGdCQUFnQix5QkFBeUIsbUNBQW1DLDJCQUEyQixpQkFBaUIsQ0FBQywrTUFBK00sbUNBQW1DLENBQUMsMkZBQTJGLGVBQWUsQ0FBQyxpREFBaUQsY0FBYyxXQUFXLGdCQUFnQixnQkFBZ0IsYUFBYSxjQUFjLENBQUMsaUVBQWlFLGlCQUFpQixDQUFDLGdEQUFnRCxVQUFVLGVBQWUsVUFBVSxDQUFDLDZFQUE2RSxhQUFhLGtCQUFrQixDQUFDLDRDQUE0QyxjQUFjLGtCQUFrQixvQkFBb0IsaUJBQWlCLENBQUMsa0RBQWtELGNBQWMsa0JBQWtCLGlCQUFpQixDQUFDLDZCQUE2QiwwQkFBMEIsbUJBQW1CLGFBQWEsY0FBYyxpQkFBaUIsQ0FBQywrQkFBK0IsY0FBYyxtQkFBbUIsYUFBYSxjQUFjLGlCQUFpQixDQUFDLDhEQUE4RCxxQkFBcUIsbUJBQW1CLFVBQVUsQ0FBQyxnREFBZ0QsMEJBQTBCLFlBQVksQ0FBQyx1UEFBdVAsc0JBQXNCLGNBQWMsV0FBVyxjQUFjLENBQUMsdURBQXVELFVBQVUsVUFBVSxnQkFBZ0IsZUFBZSxDQUFDLG1GQUFtRixXQUFXLGNBQWMsQ0FBQyx1QkFBdUIsV0FBVyxhQUFhLENBQUMsa0RBQWtELG9CQUFvQixDQUFDLG9EQUFvRCxzQkFBc0IsQ0FBQyxnQ0FBZ0MsZ0JBQWdCLENBQUMsNkNBQTZDLFlBQVksQ0FBQyxpQ0FBaUMsY0FBYyxjQUFjLENBQUMsd0JBQXdCLGtCQUFrQixRQUFRLE9BQU8sUUFBUSxTQUFTLGFBQWEsQ0FBQyxhQUFhLHFCQUFxQiw2QkFBNkIscUJBQXFCLDZCQUE2QixpQkFBaUIsQ0FBQyxxQ0FBcUMsNkJBQTZCLHFCQUFxQiw2QkFBNkIscUJBQXFCLDRCQUE0QixDQUFDLENBQUMsOENBQThDLHFCQUFxQixXQUFXLHFCQUFxQixpQkFBaUIsQ0FBQywyQ0FBMkMsV0FBVyxDQUFDLDJDQUEyQyxXQUFXLENBQUMsMkNBQTJDLFdBQVcsQ0FBQyw0Q0FBNEMsWUFBWSxDQUFDLDRDQUE0QyxZQUFZLENBQUMsNENBQTRDLFlBQVksQ0FBQyw2Q0FBNkMscUJBQXFCLFdBQVcsU0FBUyxDQUFDLDZDQUE2QyxxQkFBcUIsV0FBVyxTQUFTLENBQUMsNkNBQTZDLHFCQUFxQixXQUFXLFNBQVMsQ0FBQyxvRkFBb0YsVUFBVSxXQUFXLGVBQWUsQ0FBQyxzRkFBc0YsVUFBVSxZQUFZLGNBQWMsQ0FBQyw0RUFBNEUsVUFBVSxXQUFXLHFCQUFxQixDQUFDLHlDQUF5QywwS0FBMEssVUFBVSxDQUFDLENBQUMseUNBQXlDLDBHQUEwRyxVQUFVLFdBQVcsZUFBZSxDQUFDLDRHQUE0RyxVQUFVLFlBQVksYUFBYSxDQUFDLENBQUMseUNBQXlDLDRFQUE0RSxxQkFBcUIsZUFBZSxjQUFjLFVBQVUsQ0FBQywyRkFBMkYsYUFBYSxDQUFDLENBQUMiLCJmaWxlIjoieWlrZXMtaW5jLWVhc3ktbWFpbGNoaW1wLWV4dGVuZGVyLXB1YmxpYy5taW4uY3NzIiwic291cmNlc0NvbnRlbnQiOlsiLnlpa2VzLWVhc3ktbWMtZm9ybXtkaXNwbGF5OmJsb2NrO3dpZHRoOjEwMCV9Lnlpa2VzLWVhc3ktbWFpbGNoaW1wLWVkaXQtZm9ybS1saW5re2Rpc3BsYXk6YmxvY2s7bWFyZ2luLWJvdHRvbToxZW19Lnlpa2VzLWVhc3ktbWMtZm9ybS55aWtlcy1tYWlsY2hpbXAtZm9ybS1pbmxpbmV7ZGlzcGxheTppbmxpbmUtYmxvY2s7d2lkdGg6MTAwJX0ueWlrZXMtZWFzeS1tYy1mb3JtIGlucHV0W3R5cGU9dGV4dF0sLnlpa2VzLWVhc3ktbWMtZm9ybSBpbnB1dFt0eXBlPXVybF0sLnlpa2VzLWVhc3ktbWMtZm9ybSBpbnB1dFt0eXBlPWVtYWlsXSwueWlrZXMtZWFzeS1tYy1mb3JtIGlucHV0W3R5cGU9bnVtYmVyXSwueWlrZXMtZWFzeS1tYy1mb3JtIHNlbGVjdHtwYWRkaW5nOi41Mjc4ZW07YmFja2dyb3VuZC1jb2xvcjojRjFGMUYxO2JvcmRlcjoycHggc29saWQgcmdiYSg1MSw1MSw1MSwuMSk7LW1vei1ib3gtc2l6aW5nOmJvcmRlci1ib3g7bWFyZ2luLWJvdHRvbTo4cHh9Lnlpa2VzLWVhc3ktbWMtZm9ybSBpbnB1dFt0eXBlPXRleHRdOmZvY3VzLC55aWtlcy1lYXN5LW1jLWZvcm0gaW5wdXRbdHlwZT11cmxdOmZvY3VzLC55aWtlcy1lYXN5LW1jLWZvcm0gaW5wdXRbdHlwZT1lbWFpbF06Zm9jdXMsLnlpa2VzLWVhc3ktbWMtZm9ybSBpbnB1dFt0eXBlPW51bWJlcl06Zm9jdXMsLnlpa2VzLWVhc3ktbWMtZm9ybSBzZWxlY3Q6Zm9jdXN7b3V0bGluZTpyZ2JhKDUxLDUxLDUxLC4zKSBzb2xpZCAycHh9LmRhdGVwaWNrZXIuZGF0ZXBpY2tlci1kcm9wZG93bi5kcm9wZG93bi1tZW51LmRhdGVwaWNrZXItb3JpZW50LWxlZnQuZGF0ZXBpY2tlci1vcmllbnQtdG9we21pbi13aWR0aDoyNThweH0ueWlrZXMtZWFzeS1tYy1mb3JtIC55aWtlcy1lYXN5LW1jLXN1Ym1pdC1idXR0b257ZGlzcGxheTpibG9jazt3aWR0aDoxMDAlO21hcmdpbi10b3A6LjVlbTttaW4taGVpZ2h0OjQwcHg7cGFkZGluZzoxMHB4O2N1cnNvcjpwb2ludGVyfS55aWtlcy1lYXN5LW1jLWZvcm0gLnlpa2VzLWVhc3ktbWMtc3VibWl0LWJ1dHRvbi5hZG1pbi1sb2dnZWQtaW57bWFyZ2luLWJvdHRvbToxZW19Lnlpa2VzLWVhc3ktbWMtZm9ybSAuc3VibWl0LWJ1dHRvbi1pbmxpbmUtbGFiZWx7d2lkdGg6MjAlO21pbi13aWR0aDo5MHB4O2Zsb2F0OmxlZnR9Lnlpa2VzLWVhc3ktbWMtZm9ybSAuc3VibWl0LWJ1dHRvbi1pbmxpbmUtbGFiZWwgLnlpa2VzLWVhc3ktbWMtc3VibWl0LWJ1dHRvbnttYXJnaW4tdG9wOjA7bWFyZ2luLWJvdHRvbTouNWVtfS55aWtlcy1lYXN5LW1jLWZvcm0gLmZvcm0tZmllbGQtZGVzY3JpcHRpb257ZGlzcGxheTpibG9jazttYXJnaW4tdG9wOi0uMjVlbTttYXJnaW4tYm90dG9tOi43NWVtO2ZvbnQtc3R5bGU6aXRhbGljfS55aWtlcy1lYXN5LW1jLWZvcm0gbGFiZWw+LmZvcm0tZmllbGQtZGVzY3JpcHRpb257ZGlzcGxheTpibG9jazttYXJnaW4tYm90dG9tOjVweDtmb250LXN0eWxlOml0YWxpY30ueWlrZXMtZWFzeS1tYy1lcnJvci1tZXNzYWdle2NvbG9yOnJnYmEoMjE2LDQ4LDU3LC44Nyk7YmFja2dyb3VuZDojRkZCQUJBO3BhZGRpbmc6MTJweDttYXJnaW46MTVweCAwO3Bvc2l0aW9uOnJlbGF0aXZlfS55aWtlcy1lYXN5LW1jLXN1Y2Nlc3MtbWVzc2FnZXtjb2xvcjojNEY4QTEwO2JhY2tncm91bmQ6I0RGRjJCRjtwYWRkaW5nOjEycHg7bWFyZ2luOjE1cHggMDtwb3NpdGlvbjpyZWxhdGl2ZX0ueWlrZXMtZWFzeS1tYy1mb3JtIC5maWVsZC1uby1sYWJlbCwueWlrZXMtZWFzeS1tYy1mb3JtIGxhYmVse2Rpc3BsYXk6aW5saW5lLWJsb2NrO21hcmdpbi1ib3R0b206LjVlbTt3aWR0aDoxMDAlfXAueWlrZXMtbWFpbGNoaW1wLXJlcXVpcmVkLWludGVyZXN0LWdyb3VwLWVycm9ye2NvbG9yOnJnYmEoMjE2LDQ4LDU3LC44Nyk7bWFyZ2luOjhweCAwfS55aWtlcy1lYXN5LW1jLWZvcm0gaW5wdXRbdHlwZT10ZXh0XSwueWlrZXMtZWFzeS1tYy1mb3JtIGlucHV0W3R5cGU9dXJsXSwueWlrZXMtZWFzeS1tYy1mb3JtIGlucHV0W3R5cGU9ZW1haWxdLC55aWtlcy1lYXN5LW1jLWZvcm0gaW5wdXRbdHlwZT1udW1iZXJdLC55aWtlcy1lYXN5LW1jLWZvcm0gaW5wdXRbdHlwZT1wYXNzd29yZF0sLnlpa2VzLWVhc3ktbWMtZm9ybSBzZWxlY3QsLnlpa2VzLWVhc3ktbWMtZm9ybSB0ZXh0YXJlYXtib3gtc2l6aW5nOmJvcmRlci1ib3g7ZGlzcGxheTpibG9jazt3aWR0aDoxMDAlO21heC13aWR0aDoxMDAlfS55aWtlcy1lYXN5LW1jLWZvcm0gLnlpa2VzLWVhc3ktbWMtc3VibWl0LWJ1dHRvbi1pbWFnZXtwYWRkaW5nOjA7d2lkdGg6MTYlO21pbi13aWR0aDoxNDBweDttYXgtd2lkdGg6MjAwcHh9Lnlpa2VzLWVhc3ktbWMtZm9ybSAuc3VibWl0LWJ1dHRvbi1pbmxpbmUtbGFiZWwgLnlpa2VzLWVhc3ktbWMtc3VibWl0LWJ1dHRvbi1pbWFnZXt3aWR0aDoxMDAlO21heC13aWR0aDoxMDAlfS5jaGVja2JveC1wYXJlbnQtbGFiZWx7d2lkdGg6MTAwJTtkaXNwbGF5OmJsb2NrfS55aWtlcy1lYXN5LW1jLWZvcm0gLnlpa2VzLWVhc3ktbWMtY2hlY2tib3gtbGFiZWx7ZGlzcGxheTppbmxpbmUtYmxvY2t9Lm1haWxjaGltcC1maWVsZC1oaWRkZW4sLnlpa2VzLWVhc3ktbWMtZGlzcGxheS1ub25le2Rpc3BsYXk6bm9uZSFpbXBvcnRhbnR9Lnlpa2VzLWVhc3ktbWMtdGV4dC1hbGlnbi1yaWdodHt0ZXh0LWFsaWduOnJpZ2h0fSN5aWtlcy1tYWlsY2hpbXAtY29udGFpbmVyIC55aWtlcy1mb3JtLXRpdGxle21hcmdpbi10b3A6MH0ueWlrZXMtbWFpbGNoaW1wLWRpc2NsYWltZXItdGV4dHtkaXNwbGF5OmJsb2NrO21hcmdpbi10b3A6MWVtfS51cGRhdGUtZW1haWwtcHJlbG9hZGVye3Bvc2l0aW9uOmFic29sdXRlO3RvcDo0MCU7bGVmdDowO3JpZ2h0OjA7Ym90dG9tOjA7bWFyZ2luOjAgYXV0b30uZy1yZWNhcHRjaGF7dHJhbnNmb3JtOnNjYWxlKC44MSk7LXdlYmtpdC10cmFuc2Zvcm06c2NhbGUoLjgxKTt0cmFuc2Zvcm0tb3JpZ2luOjAgMDstd2Via2l0LXRyYW5zZm9ybS1vcmlnaW46MCAwO21hcmdpbjo3cHggMCAtM3B4fUBtZWRpYSBzY3JlZW4gYW5kIChtYXgtaGVpZ2h0OjU3NXB4KXsjcmMtaW1hZ2VzZWxlY3QsLmctcmVjYXB0Y2hhe3RyYW5zZm9ybTpzY2FsZSguODEpOy13ZWJraXQtdHJhbnNmb3JtOnNjYWxlKC44MSk7dHJhbnNmb3JtLW9yaWdpbjowIDA7LXdlYmtpdC10cmFuc2Zvcm0tb3JpZ2luOjAgMH19Lnlpa2VzLWVhc3ktbWMtZm9ybSBsYWJlbC5vcHRpb24taW5saW5lPmxhYmVse2Rpc3BsYXk6aW5saW5lLWJsb2NrO2Zsb2F0OmxlZnQ7d2lkdGg6YXV0byFpbXBvcnRhbnQ7bWFyZ2luLXJpZ2h0OjE1cHh9Lnlpa2VzLWVhc3ktbWMtZm9ybSBsYWJlbC5vcHRpb24taGVpZ2h0LTI1e2hlaWdodDoyNXB4fS55aWtlcy1lYXN5LW1jLWZvcm0gbGFiZWwub3B0aW9uLWhlaWdodC01MHtoZWlnaHQ6NTBweH0ueWlrZXMtZWFzeS1tYy1mb3JtIGxhYmVsLm9wdGlvbi1oZWlnaHQtNzV7aGVpZ2h0Ojc1cHh9Lnlpa2VzLWVhc3ktbWMtZm9ybSBsYWJlbC5vcHRpb24taGVpZ2h0LTEwMHtoZWlnaHQ6MTAwcHh9Lnlpa2VzLWVhc3ktbWMtZm9ybSBsYWJlbC5vcHRpb24taGVpZ2h0LTEyNXtoZWlnaHQ6MTI1cHh9Lnlpa2VzLWVhc3ktbWMtZm9ybSBsYWJlbC5vcHRpb24taGVpZ2h0LTE1MHtoZWlnaHQ6MTUwcHh9Lnlpa2VzLWVhc3ktbWMtZm9ybSBsYWJlbC5vcHRpb24tMi1jb2w+bGFiZWx7ZGlzcGxheTppbmxpbmUtYmxvY2s7ZmxvYXQ6bGVmdDt3aWR0aDo1MCV9Lnlpa2VzLWVhc3ktbWMtZm9ybSBsYWJlbC5vcHRpb24tMy1jb2w+bGFiZWx7ZGlzcGxheTppbmxpbmUtYmxvY2s7ZmxvYXQ6bGVmdDt3aWR0aDozMyV9Lnlpa2VzLWVhc3ktbWMtZm9ybSBsYWJlbC5vcHRpb24tNC1jb2w+bGFiZWx7ZGlzcGxheTppbmxpbmUtYmxvY2s7ZmxvYXQ6bGVmdDt3aWR0aDoyNSV9Lnlpa2VzLWVhc3ktbWMtZm9ybSBpbnB1dC5maWVsZC1sZWZ0LWhhbGYsLnlpa2VzLWVhc3ktbWMtZm9ybSBsYWJlbC5maWVsZC1sZWZ0LWhhbGZ7d2lkdGg6NDglO2Zsb2F0OmxlZnQ7bWFyZ2luLXJpZ2h0OjIlfS55aWtlcy1lYXN5LW1jLWZvcm0gaW5wdXQuZmllbGQtcmlnaHQtaGFsZiwueWlrZXMtZWFzeS1tYy1mb3JtIGxhYmVsLmZpZWxkLXJpZ2h0LWhhbGZ7d2lkdGg6NDglO2Zsb2F0OnJpZ2h0O21hcmdpbi1sZWZ0OjIlfS55aWtlcy1lYXN5LW1jLWZvcm0gaW5wdXQuZmllbGQtdGhpcmQsLnlpa2VzLWVhc3ktbWMtZm9ybSBsYWJlbC5maWVsZC10aGlyZHt3aWR0aDozMiU7ZmxvYXQ6bGVmdDttYXJnaW4tcmlnaHQ6MS4zMzMzMyV9QG1lZGlhIG9ubHkgc2NyZWVuIGFuZCAobWF4LXdpZHRoOjUyNXB4KXsueWlrZXMtZWFzeS1tYy1mb3JtIGlucHV0LmZpZWxkLWxlZnQtaGFsZiwueWlrZXMtZWFzeS1tYy1mb3JtIGlucHV0LmZpZWxkLXJpZ2h0LWhhbGYsLnlpa2VzLWVhc3ktbWMtZm9ybSBsYWJlbC5maWVsZC1sZWZ0LWhhbGYsLnlpa2VzLWVhc3ktbWMtZm9ybSBsYWJlbC5maWVsZC1yaWdodC1oYWxme3dpZHRoOjEwMCV9fUBtZWRpYSBvbmx5IHNjcmVlbiBhbmQgKG1heC13aWR0aDo5NTVweCl7Lnlpa2VzLWVhc3ktbWMtZm9ybSBpbnB1dC5maWVsZC10aGlyZDpudGgtY2hpbGQob2RkKSwueWlrZXMtZWFzeS1tYy1mb3JtIGxhYmVsLmZpZWxkLXRoaXJkOm50aC1jaGlsZChvZGQpe3dpZHRoOjQ4JTtmbG9hdDpsZWZ0O21hcmdpbi1yaWdodDoyJX0ueWlrZXMtZWFzeS1tYy1mb3JtIGlucHV0LmZpZWxkLXRoaXJkOm50aC1jaGlsZChldmVuKSwueWlrZXMtZWFzeS1tYy1mb3JtIGxhYmVsLmZpZWxkLXRoaXJkOm50aC1jaGlsZChldmVuKXt3aWR0aDo0OCU7ZmxvYXQ6cmlnaHQ7bWFyZ2luLWxlZnQ6MH19QG1lZGlhIG9ubHkgc2NyZWVuIGFuZCAobWF4LXdpZHRoOjUyNXB4KXsueWlrZXMtZWFzeS1tYy1mb3JtIGlucHV0LmZpZWxkLXRoaXJkLC55aWtlcy1lYXN5LW1jLWZvcm0gbGFiZWwuZmllbGQtdGhpcmR7d2lkdGg6MTAwJSFpbXBvcnRhbnQ7bWFyZ2luLXJpZ2h0OjA7bWFyZ2luLWxlZnQ6MDtmbG9hdDpub25lfS5kYXRlcGlja2VyLmRhdGVwaWNrZXItZHJvcGRvd24uZHJvcGRvd24tbWVudS5kYXRlcGlja2VyLW9yaWVudC1sZWZ0LmRhdGVwaWNrZXItb3JpZW50LXRvcHttaW4td2lkdGg6ODQlfX0iXX0= */
1
+ .yikes-easy-mc-form{display:block;width:100%}.yikes-easy-mailchimp-edit-form-link{display:block;margin-bottom:1em}.yikes-easy-mc-form.yikes-mailchimp-form-inline{display:inline-block;width:100%}.yikes-easy-mc-form input[type=text],.yikes-easy-mc-form input[type=url],.yikes-easy-mc-form input[type=email],.yikes-easy-mc-form input[type=number],.yikes-easy-mc-form select{padding:.5278em;background-color:#F1F1F1;border:2px solid rgba(51,51,51,.1);-moz-box-sizing:border-box;margin-bottom:8px}.yikes-easy-mc-form input[type=text]:focus,.yikes-easy-mc-form input[type=url]:focus,.yikes-easy-mc-form input[type=email]:focus,.yikes-easy-mc-form input[type=number]:focus,.yikes-easy-mc-form select:focus{outline:rgba(51,51,51,.3) solid 2px}.datepicker.datepicker-dropdown.dropdown-menu.datepicker-orient-left.datepicker-orient-top{min-width:258px}.yikes-easy-mc-form .yikes-easy-mc-submit-button{display:block;width:100%;margin-top:.5em;min-height:40px;padding:10px;cursor:pointer}.yikes-easy-mc-form .yikes-easy-mc-submit-button.admin-logged-in{margin-bottom:1em}.yikes-easy-mc-form .submit-button-inline-label{width:20%;min-width:90px;float:left}.yikes-easy-mc-form .submit-button-inline-label .yikes-easy-mc-submit-button{margin-top:0;margin-bottom:.5em}.yikes-easy-mc-form .form-field-description{display:block;margin-top:-.25em;margin-bottom:.75em;font-style:italic}.yikes-easy-mc-form label>.form-field-description{display:block;margin-bottom:5px;font-style:italic}.yikes-easy-mc-error-message{color:rgba(216,48,57,.87);background:#FFBABA;padding:12px;position:relative}.yikes-easy-mc-success-message{color:#4F8A10;background:#DFF2BF;padding:12px;position:relative}.yikes-easy-mc-form .field-no-label,.yikes-easy-mc-form label{display:inline-block;margin-bottom:.5em;width:100%}p.yikes-mailchimp-required-interest-group-error{color:rgba(216,48,57,.87);margin:8px 0}.yikes-easy-mc-form input[type=text],.yikes-easy-mc-form input[type=url],.yikes-easy-mc-form input[type=email],.yikes-easy-mc-form input[type=number],.yikes-easy-mc-form input[type=password],.yikes-easy-mc-form select,.yikes-easy-mc-form textarea{box-sizing:border-box;display:block;width:100%;max-width:100%}.yikes-easy-mc-form .yikes-easy-mc-submit-button-image{padding:0;width:16%;min-width:140px;max-width:200px}.yikes-easy-mc-form .submit-button-inline-label .yikes-easy-mc-submit-button-image{width:100%;max-width:100%}.checkbox-parent-label{width:100%;display:block}.yikes-easy-mc-form .yikes-easy-mc-checkbox-label{display:inline-block}.mailchimp-field-hidden,.yikes-easy-mc-display-none{display:none!important}.yikes-easy-mc-text-align-right{text-align:right}#yikes-mailchimp-container .yikes-form-title{margin-top:0}.yikes-mailchimp-disclaimer-text{display:block;margin-top:1em}.update-email-preloader{position:absolute;top:40%;left:0;right:0;bottom:0;margin:0 auto}.g-recaptcha{transform:scale(.81);-webkit-transform:scale(.81);transform-origin:0 0;-webkit-transform-origin:0 0;margin:7px 0 -3px}@media screen and (max-height:575px){#rc-imageselect,.g-recaptcha{transform:scale(.81);-webkit-transform:scale(.81);transform-origin:0 0;-webkit-transform-origin:0 0}}.yikes-easy-mc-form label.option-inline>label{display:inline-block;float:left;width:auto!important;margin-right:15px}.yikes-easy-mc-form label.option-height-25{height:25px}.yikes-easy-mc-form label.option-height-50{height:50px}.yikes-easy-mc-form label.option-height-75{height:75px}.yikes-easy-mc-form label.option-height-100{height:100px}.yikes-easy-mc-form label.option-height-125{height:125px}.yikes-easy-mc-form label.option-height-150{height:150px}.yikes-easy-mc-form label.option-2-col>label{display:inline-block;float:left;width:50%}.yikes-easy-mc-form label.option-3-col>label{display:inline-block;float:left;width:33%}.yikes-easy-mc-form label.option-4-col>label{display:inline-block;float:left;width:25%}.yikes-easy-mc-form input.field-left-half,.yikes-easy-mc-form label.field-left-half{width:48%;float:left;margin-right:2%}.yikes-easy-mc-form input.field-right-half,.yikes-easy-mc-form label.field-right-half{width:48%;float:right;margin-left:2%}.yikes-easy-mc-form input.field-third,.yikes-easy-mc-form label.field-third{width:32%;float:left;margin-right:1.33333%}@media only screen and (max-width:525px){.yikes-easy-mc-form input.field-left-half,.yikes-easy-mc-form input.field-right-half,.yikes-easy-mc-form label.field-left-half,.yikes-easy-mc-form label.field-right-half{width:100%}}@media only screen and (max-width:955px){.yikes-easy-mc-form input.field-third:nth-child(odd),.yikes-easy-mc-form label.field-third:nth-child(odd){width:48%;float:left;margin-right:2%}.yikes-easy-mc-form input.field-third:nth-child(even),.yikes-easy-mc-form label.field-third:nth-child(even){width:48%;float:right;margin-left:0}}@media only screen and (max-width:525px){.yikes-easy-mc-form input.field-third,.yikes-easy-mc-form label.field-third{width:100%!important;margin-right:0;margin-left:0;float:none}.datepicker.datepicker-dropdown.dropdown-menu.datepicker-orient-left.datepicker-orient-top{min-width:84%}}
 
public/js/yikes-mc-ajax-forms.js CHANGED
@@ -1 +1 @@
1
- (function( $ ) {
1
+ (function( $ ) {
public/js/yikes-mc-ajax-forms.min.js CHANGED
@@ -1 +1 @@
1
- !function(a){"use strict";a(document).ready(function(){a("body").on("submit",".yikes-easy-mc-form",function(){var b=a(this),c=b.attr("data-attr-form-id"),d=[];if(b.find(".yikes-interest-group-required").length>0&&b.find(".yikes-interest-group-required").each(function(){var a=jQuery(this).attr("name"),c=a.replace("[]","");if(0==b.find('input[name="'+c+'[]"]:checked').length){var e=b.find("span."+c+"-label").text();d[c]=e}}),!jQuery.isEmptyObject(d)){if(b.find(".yikes-mailchimp-required-interest-group-error").length>0)b.find(".yikes-mailchimp-required-interest-group-error").fadeOut("fast",function(){b.find(".yikes-mailchimp-required-interest-group-error").remove();for(var a in d)b.find("span."+a+"-label").after('<p class="yikes-mailchimp-required-interest-group-error">'+object.interest_group_checkbox_error+"</p>")});else for(var e in d)b.find("span."+e+"-label").after('<p class="yikes-mailchimp-required-interest-group-error">'+object.interest_group_checkbox_error+"</p>");return!1}b.find(".yikes-easy-mc-submit-button").attr("disabled","disabled"),a(".yikes-easy-mc-error-message").remove(),a(".yikes-easy-mc-success-message").remove();var f={action:"process_form_submission",form_data:b.serialize(),form_id:c,page_data:object.page_data};return a.ajax({url:object.ajax_url,type:"POST",data:f,success:function(d,e,f){if(1==d.error){if(d.security_response)var g=d.security_response;else var g="";a(".yikes-easy-mc-form-description-"+c).length>0?a(".yikes-easy-mc-form-description-"+c).before('<p class="yikes-easy-mc-error-message yikes-easy-mc-error-message-'+c+'" yikes-easy-mc-hidden"> '+d.response+g+"</p>"):b.before('<p class="yikes-easy-mc-error-message yikes-easy-mc-error-message-'+c+' yikes-easy-mc-hidden">'+d.response+g+"</p>"),a(".yikes-easy-mc-error-message").fadeIn()}else{1==d.hide&&(a(".yikes-easy-mc-form-description-"+c).length>0&&a(".yikes-easy-mc-form-description-"+c).hide(),b.hide()),a(".yikes-easy-mc-form-description-"+c).length>0?a(".yikes-easy-mc-form-description-"+c).before('<p class="yikes-easy-mc-success-message yikes-easy-mc-success-message-'+c+' yikes-easy-mc-hidden">'+d.respons+"</p>"):b.before('<p class="yikes-easy-mc-success-message yikes-easy-mc-success-message-'+c+' yikes-easy-mc-hidden">'+d.response+"</p>"),a(".yikes-easy-mc-success-message-"+c).fadeIn(),a(".yikes-mailchimp-required-interest-group-error").remove(),1==d.redirection&&b.before(d.redirect),b.find("input").not(".yikes-easy-mc-submit-button").val("");var h={action:"increase_submission_count",form_id:c};a.ajax({url:object.ajax_url,type:"POST",data:h,success:function(a,b,c){},error:function(a,b,c){console.error(c)}})}},error:function(a,b,c){console.error(c),console.log(a),console.log(b)},complete:function(a,c){b.find(".yikes-easy-mc-submit-button").removeAttr("disabled","disabled")}}),!1}),a("body").on("click",".send-update-email",function(){var a={action:"easy_forms_send_email",user_email:jQuery(this).attr("data-user-email"),list_id:jQuery(this).attr("data-list-id")};return jQuery(this).parent("p").fadeTo("fast",.75).append('<img src="'+object.preloader_url+'" class="update-email-preloader" />'),jQuery.post(object.ajax_url,a,function(a){a.success?jQuery(".yikes-easy-mc-error-message").removeClass("yikes-easy-mc-error-message").addClass("yikes-easy-mc-success-message").html(a.data.response_text):jQuery(".yikes-easy-mc-error-message").fadeTo("fast",1).html(a.data.response_text)}),!1})})}(jQuery);
1
+ !function(a){"use strict";a(document).ready(function(){a("body").on("submit",".yikes-easy-mc-form",function(){var b=a(this),c=b.attr("data-attr-form-id"),d=[];if(b.find(".yikes-interest-group-required").length>0&&b.find(".yikes-interest-group-required").each(function(){var a=jQuery(this).attr("name"),c=a.replace("[]","");if(0==b.find('input[name="'+c+'[]"]:checked').length){var e=b.find("span."+c+"-label").text();d[c]=e}}),!jQuery.isEmptyObject(d)){if(b.find(".yikes-mailchimp-required-interest-group-error").length>0)b.find(".yikes-mailchimp-required-interest-group-error").fadeOut("fast",function(){b.find(".yikes-mailchimp-required-interest-group-error").remove();for(var a in d)b.find("span."+a+"-label").after('<p class="yikes-mailchimp-required-interest-group-error">'+object.interest_group_checkbox_error+"</p>")});else for(var e in d)b.find("span."+e+"-label").after('<p class="yikes-mailchimp-required-interest-group-error">'+object.interest_group_checkbox_error+"</p>");return!1}b.find(".yikes-easy-mc-submit-button").attr("disabled","disabled"),a(".yikes-easy-mc-error-message").remove(),a(".yikes-easy-mc-success-message").remove();var f={action:"process_form_submission",form_data:b.serialize(),form_id:c,page_data:object.page_data};return a.ajax({url:object.ajax_url,type:"POST",data:f,success:function(d,e,f){if(console.log(d),d.success){d=d.data,1==d.hide&&(a(".yikes-easy-mc-form-description-"+c).length>0&&a(".yikes-easy-mc-form-description-"+c).hide(),b.hide()),a(".yikes-easy-mc-form-description-"+c).length>0?a(".yikes-easy-mc-form-description-"+c).before('<p class="yikes-easy-mc-success-message yikes-easy-mc-success-message-'+c+' yikes-easy-mc-hidden">'+d.response+"</p>"):b.before('<p class="yikes-easy-mc-success-message yikes-easy-mc-success-message-'+c+' yikes-easy-mc-hidden">'+d.response+"</p>"),a(".yikes-easy-mc-success-message-"+c).fadeIn(),a(".yikes-mailchimp-required-interest-group-error").remove(),1==d.redirection&&b.before(d.redirect),b.find("input").not(".yikes-easy-mc-submit-button").val("");var g={action:"increase_submission_count",form_id:c};a.ajax({url:object.ajax_url,type:"POST",data:g,success:function(a,b,c){},error:function(a,b,c){console.error(c)}})}else d=d.data,a(".yikes-easy-mc-form-description-"+c).length>0?a(".yikes-easy-mc-form-description-"+c).before('<p class="yikes-easy-mc-error-message yikes-easy-mc-error-message-'+c+'" yikes-easy-mc-hidden"> '+d.response+"</p>"):b.before('<p class="yikes-easy-mc-error-message yikes-easy-mc-error-message-'+c+' yikes-easy-mc-hidden">'+d.response+"</p>"),a(".yikes-easy-mc-error-message").fadeIn()},error:function(a,b,c){console.error(c),console.log(a),console.log(b)},complete:function(a,c){b.find(".yikes-easy-mc-submit-button").removeAttr("disabled","disabled")}}),!1}),a("body").on("click",".send-update-email",function(){var a={action:"easy_forms_send_email",user_email:jQuery(this).attr("data-user-email"),list_id:jQuery(this).attr("data-list-id")};return jQuery(this).parent("p").fadeTo("fast",.75).append('<img src="'+object.preloader_url+'" class="update-email-preloader" />'),jQuery.post(object.ajax_url,a,function(a){a.success?jQuery(".yikes-easy-mc-error-message").removeClass("yikes-easy-mc-error-message").addClass("yikes-easy-mc-success-message").html(a.data.response_text):jQuery(".yikes-easy-mc-error-message").fadeTo("fast",1).html(a.data.response_text)}),!1})})}(jQuery);
public/partials/ajax/class.public_ajax.php CHANGED
@@ -70,76 +70,113 @@
70
  public function sendUpdateProfileEmail() {
71
  $user_email = $_POST['user_email'];
72
  $list_id = $_POST['list_id'];
73
- $api = new Mailchimp( get_option( 'yikes-mc-api-key' , '' ) );
74
- $explode_key = explode( '-' , get_option( 'yikes-mc-api-key' , '' ) );
 
 
75
  $data_center = $explode_key[1];
76
  $full_site_url = get_bloginfo('url');
77
- try {
78
- // get the site URL
79
- // not sure this needs its own API call
80
- $account_details = $api->call( 'helper/account-details', array('apikey' => get_option( 'yikes-mc-api-key' , '' ) ) );
81
- // get the list details (default from name, default from email)
82
- $list_details = $api->call( 'lists/list',
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
83
  array(
84
- 'apikey' => get_option( 'yikes-mc-api-key' , '' ),
85
- 'filters' => array(
86
- 'list_id' => $list_id
87
- )
88
- )
89
  );
90
- // get the subscribers info
91
- $subscriber_account_details = $api->call('lists/member-info',
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
92
  array(
93
- 'id' => $list_id,
94
- 'emails' => array(
95
- 0 => array(
96
- 'email' => $user_email,
97
- ),
98
- )
99
- )
100
  );
101
- $subscriber_id = $subscriber_account_details['data'][0]['id'];
102
- $explode_url = explode( '.' , $account_details['contact']['url'] );
103
- $subject = 'MailChimp Profile Update';
104
- $headers = 'From: ' . $list_details['data'][0]['default_from_name'] . ' <' . $list_details['data'][0]['default_from_email'] . '>' . "\r\n";
105
- $headers .= 'Content-type: text/html';
106
- $email_content = '<p>Greetings,</p> <p>A request has been made to update your MailChimp account profile information. To do so please use the following link: <a href="http://' . $explode_url[1] . '.' . $data_center . '.list-manage1.com/profile?u=' . $account_details['user_id'] . '&id=' . $list_id .'&e=' . $subscriber_id . '" title="Update MailChimp Profile">Update MailChimp Profile Info.</a>';
107
- $email_content .= "<p>If you did not request this update, please disregard this email.</p>";
108
- $email_content .= '<p>&nbsp;</p>';
109
- $email_content .= '<p>This email was sent from : ' . $full_site_url . '</p>';
110
- $email_content .= '<p>&nbsp;</p>';
111
- $email_content .= '<p>&nbsp;</p>';
112
- $email_content .= '<p style="font-size:13px;margin-top:5em;"><em>This email was generated by the <a href="http://www.wordpress.org/plugins/yikes-inc-easy-mailchimp-extender/" target="_blank">Easy Forms for MailChimp</a> plugin, created by <a href="http://www.yikesinc.com" target="_blank">YIKES Inc.</a></em></p>';
113
- /* Confirm that the email was sent */
114
- if ( wp_mail( $user_email, apply_filters( 'yikes-mailchimp-update-email-subject', $subject ), apply_filters( 'yikes-mailchimp-update-email-content', $email_content ), $headers ) ) {
115
- wp_send_json_success(
116
- array(
117
- 'response_text' => '<div class="yikes-easy-mc-success-message">' . sprintf( __( '%s Update email successfully sent. Please check your inbox for the message.' , 'yikes-inc-easy-mailchimp-extender' ), '&#10004;' ) . '</div>',
118
- )
119
- );
120
- exit;
121
- } else {
122
- wp_send_json_error(
123
- array(
124
- 'response_text' => '<div class="yikes-easy-mc-error-message">' . sprintf( __( '%s Email failed to send. Please contact the site administrator.' , 'yikes-inc-easy-mailchimp-extender' ), '&#10005;' ) . '</div>',
125
- )
126
- );
127
- exit;
128
- }
129
- // print_r($account_details);
130
- } catch( Exception $e ) {
131
- $errorMessage = sprintf( __( 'Error sending update profile email. <strong>Error:</strong> %s. Please contact the site administrator.' , 'yikes-inc-easy-mailchimp-extender' ), $e->getMessage() );
132
  wp_send_json_error(
133
  array(
134
- 'response_text' => '<div class="yikes-easy-mc-error-message">&#10005; ' . $errorMessage . '</div>',
135
  )
136
  );
137
  exit;
138
- }
 
139
  } // end sendUpdateProfileEmail();
140
 
141
  } // end class
142
-
143
  new YIKES_Inc_Easy_MailChimp_Public_Ajax();
144
-
145
  ?>
70
  public function sendUpdateProfileEmail() {
71
  $user_email = $_POST['user_email'];
72
  $list_id = $_POST['list_id'];
73
+
74
+ $api_key = trim( get_option( 'yikes-mc-api-key' , '' ) );
75
+ $dash_position = strpos( $api_key, '-' );
76
+ $explode_key = explode( '-' , $api_key );
77
  $data_center = $explode_key[1];
78
  $full_site_url = get_bloginfo('url');
79
+
80
+ // list details api call
81
+ if( $dash_position !== false ) {
82
+ $api_endpoint = 'https://' . substr( $api_key, $dash_position + 1 ) . '.api.mailchimp.com/2.0/lists/list.json';
83
+ }
84
+ $list_details = wp_remote_post( $api_endpoint, array(
85
+ 'body' => array(
86
+ 'apikey' => $api_key,
87
+ 'filters' => array(
88
+ 'list_id' => $list_id
89
+ ),
90
+ ),
91
+ 'timeout' => 10,
92
+ 'sslverify' => apply_filters( 'yikes-mailchimp-sslverify', true )
93
+ ) );
94
+ $list_details = json_decode( wp_remote_retrieve_body( $list_details ), true );
95
+
96
+ // account details api call
97
+ if( $dash_position !== false ) {
98
+ $api_endpoint = 'https://' . substr( $api_key, $dash_position + 1 ) . '.api.mailchimp.com/2.0/helper/account-details.json';
99
+ }
100
+ $account_details = wp_remote_post( $api_endpoint, array(
101
+ 'body' => array(
102
+ 'apikey' => $api_key
103
+ ),
104
+ 'timeout' => 10,
105
+ 'sslverify' => apply_filters( 'yikes-mailchimp-sslverify', true )
106
+ ) );
107
+ $account_details = json_decode( wp_remote_retrieve_body( $account_details ), true );
108
+
109
+ // subscriber details api call
110
+ if( $dash_position !== false ) {
111
+ $api_endpoint = 'https://' . substr( $api_key, $dash_position + 1 ) . '.api.mailchimp.com/2.0/lists/member-info.json';
112
+ }
113
+ $subscriber_account_details = wp_remote_post( $api_endpoint, array(
114
+ 'body' => array(
115
+ 'apikey' => $api_key,
116
+ 'id' => $list_id,
117
+ 'emails' => array(
118
+ array( 'email' => $user_email ),
119
+ ),
120
+ ),
121
+ 'timeout' => 10,
122
+ 'sslverify' => apply_filters( 'yikes-mailchimp-sslverify', true )
123
+ ) );
124
+ $subscriber_account_details = json_decode( wp_remote_retrieve_body( $subscriber_account_details ), true );
125
+
126
+ // check for errors in any of the calls
127
+ if( isset( $list_details['error'] ) || isset( $account_details['error'] ) || isset( $subscriber_account_details['error'] ) ) {
128
+ $error_message = ( isset( $list_details['error'] ) ) ? $list_details['error'] : false;
129
+ if( ! $error_message ) {
130
+ $error_message = ( isset( $account_details['error'] ) ) ? $account_details['error'] : false;
131
+ if( ! $error_message ) {
132
+ $error_message = ( isset( $subscriber_account_details['error'] ) ) ? $subscriber_account_details['error'] : false;
133
+ if( ! $error_message ) {
134
+ $error_message = '';
135
+ }
136
+ }
137
+ }
138
+ $errorMessage = sprintf( __( 'Error sending update profile email. <strong>Error: %s</strong>. Please contact the site administrator.' , 'yikes-inc-easy-mailchimp-extender' ), $error_message );
139
+ wp_send_json_error(
140
  array(
141
+ 'response_text' => '<div class="yikes-easy-mc-error-message">&#10005; ' . $errorMessage . '</div>',
142
+ )
 
 
 
143
  );
144
+ return;
145
+ }
146
+
147
+ // send the email!
148
+ $subscriber_id = $subscriber_account_details['data'][0]['id'];
149
+ $explode_url = explode( '.' , $account_details['contact']['url'] );
150
+ $update_link_href = 'http://' . $explode_url[1] . '.' . $data_center . '.list-manage1.com/profile?u=' . $account_details['user_id'] . '&id=' . $list_id .'&e=' . $subscriber_id;
151
+ $subject = 'MailChimp Profile Update';
152
+ $headers = 'From: ' . $list_details['data'][0]['default_from_name'] . ' <' . $list_details['data'][0]['default_from_email'] . '>' . "\r\n";
153
+ $headers .= 'Content-type: text/html';
154
+ $email_content = '<p>Greetings,</p> <p>A request has been made to update your MailChimp account profile information. To do so please use the following link: <a href="' . $update_link_href . '" title="Update MailChimp Profile">Update MailChimp Profile Info.</a>';
155
+ $email_content .= "<p>If you did not request this update, please disregard this email.</p>";
156
+ $email_content .= '<p>&nbsp;</p>';
157
+ $email_content .= '<p>This email was sent from : ' . $full_site_url . '</p>';
158
+ $email_content .= '<p>&nbsp;</p>';
159
+ $email_content .= '<p>&nbsp;</p>';
160
+ $email_content .= '<p style="font-size:13px;margin-top:5em;"><em>This email was generated by the <a href="http://www.wordpress.org/plugins/yikes-inc-easy-mailchimp-extender/" target="_blank">Easy Forms for MailChimp</a> plugin, created by <a href="http://www.yikesinc.com" target="_blank">YIKES Inc.</a></em></p>';
161
+ /* Confirm that the email was sent */
162
+ if ( wp_mail( $user_email, apply_filters( 'yikes-mailchimp-update-email-subject', $subject ), apply_filters( 'yikes-mailchimp-update-email-content', $email_content, $update_link_href ), $headers ) ) {
163
+ wp_send_json_success(
164
  array(
165
+ 'response_text' => '<div class="yikes-easy-mc-success-message">' . sprintf( __( '%s Update email successfully sent. Please check your inbox for the message.' , 'yikes-inc-easy-mailchimp-extender' ), '&#10004;' ) . '</div>',
166
+ )
 
 
 
 
 
167
  );
168
+ exit;
169
+ } else {
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
170
  wp_send_json_error(
171
  array(
172
+ 'response_text' => '<div class="yikes-easy-mc-error-message">' . sprintf( __( '%s Email failed to send. Please contact the site administrator.' , 'yikes-inc-easy-mailchimp-extender' ), '&#10005;' ) . '</div>',
173
  )
174
  );
175
  exit;
176
+ }
177
+
178
  } // end sendUpdateProfileEmail();
179
 
180
  } // end class
 
181
  new YIKES_Inc_Easy_MailChimp_Public_Ajax();
 
182
  ?>
public/partials/shortcodes/process/process_form_submission.php CHANGED
@@ -19,7 +19,6 @@ $form_settings = Yikes_Inc_Easy_Mailchimp_Extender_Public::yikes_retrieve_form_s
19
  if ( ! isset( $_POST['yikes_easy_mc_new_subscriber'] ) || ! wp_verify_nonce( $_POST['yikes_easy_mc_new_subscriber'], 'yikes_easy_mc_form_submit' ) ) {
20
 
21
  $process_submission_response = '<p><small class="form_submission_error">' . __( "Error : Sorry, the nonce security check didn't pass. Please reload the page and try again. You may want to try clearing your browser cache as a last attempt." , 'yikes-inc-easy-mailchimp-extender' ) . '</small></p>';
22
- // echo '<p><small class="form_submission_error">' . __( "Error : Sorry, the nonce security check didn't pass. Please reload the page and try again. You may want to try clearing your browser cache as a last attempt." , 'yikes-inc-easy-mailchimp-extender' ) . '</small></p>';
23
  return;
24
 
25
  } else {
@@ -29,11 +28,10 @@ if ( ! isset( $_POST['yikes_easy_mc_new_subscriber'] ) || ! wp_verify_nonce( $_P
29
  // if it was filled out, return an error...
30
  if( $honey_pot_filled ) {
31
  $process_submission_response = '<p><small class="form_submission_error">' . __( "Error: It looks like the honeypot was filled out and the form was not properly be submitted." , 'yikes-inc-easy-mailchimp-extender' ) . '</small></p>';
32
- // echo '<p><small class="form_submission_error">' . __( "Error: It looks like the honeypot was filled out and the form was not properly be submitted." , 'yikes-inc-easy-mailchimp-extender' ) . '</small></p>';
33
  return;
34
  }
35
 
36
- // Check reCaptcha Response
37
  if( isset( $_POST['g-recaptcha-response'] ) ) {
38
  $url = esc_url_raw( 'https://www.google.com/recaptcha/api/siteverify?secret=' . get_option( 'yikes-mc-recaptcha-secret-key' , '' ) . '&response=' . $_POST['g-recaptcha-response'] . '&remoteip=' . $_SERVER["REMOTE_ADDR"] );
39
  $response = wp_remote_get( $url );
@@ -88,10 +86,10 @@ if ( ! isset( $_POST['yikes_easy_mc_new_subscriber'] ) || ! wp_verify_nonce( $_P
88
  // check if EU date format
89
  if( $form_settings['fields'][$merge_tag]['date_format'] == 'DD/MM/YYYY' ) {
90
  // convert '/' to '.' and to UNIX timestamp
91
- $value = date( 'Y-m-d', strtotime( str_replace( '/', '.', $value ) ) );
92
  } else {
93
  // convert to UNIX timestamp
94
- $value = date( 'Y-m-d', strtotime( $value ) );
95
  }
96
  }
97
  if( is_numeric( $merge_tag ) ) { // this is is an interest group!
@@ -106,9 +104,13 @@ if ( ! isset( $_POST['yikes_easy_mc_new_subscriber'] ) || ! wp_verify_nonce( $_P
106
  $merge_variables['optin_time'] = current_time( 'Y-m-d H:i:s', 1 );
107
 
108
  // Submit our form data
109
- $api_key = get_option( 'yikes-mc-api-key' , '' );
110
- // initialize MailChimp API
111
- $MailChimp = new MailChimp( $api_key );
 
 
 
 
112
 
113
  /*
114
  * yikes-mailchimp-before-submission
@@ -127,25 +129,96 @@ if ( ! isset( $_POST['yikes_easy_mc_new_subscriber'] ) || ! wp_verify_nonce( $_P
127
  */
128
  if( isset( $merge_variables['error'] ) ) {
129
  $process_submission_response = apply_filters( 'yikes-mailchimp-frontend-content' , $merge_variables['message'] );
130
- // echo apply_filters( 'yikes-mailchimp-frontend-content' , $merge_variables['message'] );
131
  return;
132
  }
133
 
134
- // submit the request & data, using the form settings
135
- try {
 
 
 
 
 
 
 
 
 
 
 
 
 
 
136
 
137
- $subscribe_response = $MailChimp->call('/lists/subscribe', apply_filters( 'yikes-mailchimp-user-subscribe-api-request', array(
138
- 'api_key' => $api_key,
139
- 'id' => $_POST['yikes-mailchimp-associated-list-id'],
140
- 'email' => array( 'email' => sanitize_email( $_POST['EMAIL'] ) ),
141
- 'merge_vars' => $merge_variables,
142
- 'double_optin' => $form_settings['optin_settings']['optin'],
143
- 'update_existing' => $form_settings['optin_settings']['update_existing_user'],
144
- 'send_welcome' => $form_settings['optin_settings']['send_welcome_email'],
145
- 'replace_interests' => ( isset( $form_settings['submission_settings']['replace_interests'] ) ) ? $form_settings['submission_settings']['replace_interests'] : 1, // defaults to replace
146
- ), $form_id, $_POST['yikes-mailchimp-associated-list-id'], $_POST['EMAIL'] ) );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
147
 
148
-
149
  // setup our submission response
150
  $form_submitted = 1;
151
 
@@ -197,74 +270,15 @@ if ( ! isset( $_POST['yikes_easy_mc_new_subscriber'] ) || ! wp_verify_nonce( $_P
197
  $form_settings['submissions']++;
198
  $wpdb->update(
199
  $wpdb->prefix . 'yikes_easy_mc_forms',
200
- array(
201
- 'submissions' => $form_settings['submissions'],
202
- ),
203
- array( 'ID' => $form_id ),
204
- array(
205
- '%d', // send welcome email
206
- ),
207
- array( '%d' )
208
- );
209
- } catch ( Exception $error ) { // Something went wrong...
210
- global $process_submission_response;
211
- $error_response = $error->getMessage();
212
- if( get_option( 'yikes-mailchimp-debug-status' , '' ) == '1' ) {
213
- // If a field exists on the form, is required but isn't being displayed (current displays like "8YBR1 must be provided" , should be more user friendly)
214
- if( strpos( $error_response, 'must be provided' ) !== false ) {
215
- $boom = explode( ' ', $error_response );
216
- $merge_variable = $boom[0];
217
- $api_key = get_option( 'yikes-mc-api-key' , '' );
218
- $MailChimp = new MailChimp( $api_key );
219
- try {
220
- $available_merge_variables = $MailChimp->call( 'lists/merge-vars' , array( 'apikey' => $api_key , 'id' => array( $_POST['yikes-mailchimp-associated-list-id'] ) ) );
221
- foreach( $available_merge_variables['data'][0]['merge_vars'] as $merge_var ) {
222
- if( $merge_var['tag'] == $merge_variable ) {
223
- $field_name = $merge_var['name'];
224
- }
225
- }
226
- $error_response = str_replace( $merge_variable , '<strong>"' . $field_name . '"</strong>' , $error_response );
227
- // echo $error_response;
228
- $process_submission_response = '<p class="yikes-easy-mc-error-message">' . $error_response . '</p>';
229
- } catch ( Exception $e ) {
230
- $process_submission_response = '<p class="yikes-easy-mc-error-message">' . $e->getMessage() . '</p>';
231
- // echo $e->getMessage();
232
- }
233
- } else {
234
- // echo $error_response;
235
- $process_submission_response = '<p class="yikes-easy-mc-error-message">' . $error_response . '</p>';
236
- }
237
- } else {
238
- if ( strpos( $error_response, 'should include an email' ) !== false ) { // include a valid email please
239
- if( ! empty( $form_settings['error_messages']['invalid-email'] ) ) {
240
- $process_submission_response = '<p class="yikes-easy-mc-error-message">' . $form_settings['error_messages']['invalid-email'] . '</p>';
241
- } else {
242
- $process_submission_response = '<p class="yikes-easy-mc-error-message">' . __( 'Please enter a valid email address.' , 'yikes-inc-easy-mailchimp-extender' ) . '</p>';
243
- }
244
- } else if ( strpos( $error_response, 'already subscribed' ) !== false ) { // user already subscribed
245
- $update_account_details_link = ( $form_settings['optin_settings']['update_existing_user'] == 1 ) ? apply_filters( 'yikes-easy-mailchimp-update-existing-subscriber-text', sprintf( __( ' To update your MailChimp profile, please %s.', 'yikes-inc-easy-mailchimp-extender' ), '<a class="send-update-email" data-list-id="' . $_POST['yikes-mailchimp-associated-list-id'] . '" data-user-email="' . sanitize_email( $_POST['EMAIL'] ) . '" href="#">' . __( 'click to send yourself an update link', 'yikes-inc-easy-mailchimp-extender' ) . '</a>' ), '<a class="send-update-email" data-list-id="' . $_POST['yikes-mailchimp-associated-list-id'] . '" data-user-email="' . sanitize_email( $_POST['EMAIL'] ) . '" href="#">' . __( 'click to send yourself an update link', 'yikes-inc-easy-mailchimp-extender' ) . '</a>' ) : false;
246
- if( $update_account_details_link ) {
247
- // if update account details is set, we need to include our script to send out the update email
248
- wp_enqueue_script( 'update-existing-subscriber.js', YIKES_MC_URL . 'public/js/yikes-update-existing-subscriber.js' , array( 'jquery' ), 'all' );
249
- wp_localize_script( 'update-existing-subscriber.js', 'update_subscriber_details_data', array(
250
- 'ajax_url' => esc_url( admin_url( 'admin-ajax.php' ) ),
251
- 'preloader_url' => apply_filters( 'yikes-mailchimp-preloader', esc_url_raw( admin_url( 'images/wpspin_light.gif' ) ) ),
252
- ) );
253
- }
254
- if( ! empty( $form_settings['error_messages']['already-subscribed'] ) ) {
255
- $process_submission_response = '<p class="yikes-easy-mc-error-message">' . $form_settings['error_messages']['already-subscribed'] . ' ' . $update_account_details_link . '</p>';
256
- } else {
257
- $process_submission_response = '<p class="yikes-easy-mc-error-message">' . __( "It looks like you're already subscribed to this list." , 'yikes-inc-easy-mailchimp-extender' ) . ' ' . $update_account_details_link . '</p>';
258
- }
259
- } else { // general error
260
- if( ! empty( $form_settings['error_messages']['general-error'] ) ) {
261
- $process_submission_response = '<p class="yikes-easy-mc-error-message">' . $form_settings['error_messages']['general-error'] . '</p>';
262
- } else {
263
- $process_submission_response = '<p class="yikes-easy-mc-error-message">' . __( "Whoops, something went wrong! Please try again." , 'yikes-inc-easy-mailchimp-extender' ) . '</p>';
264
- }
265
- }
266
- }
267
- }
268
 
269
  }
270
  ?>
19
  if ( ! isset( $_POST['yikes_easy_mc_new_subscriber'] ) || ! wp_verify_nonce( $_POST['yikes_easy_mc_new_subscriber'], 'yikes_easy_mc_form_submit' ) ) {
20
 
21
  $process_submission_response = '<p><small class="form_submission_error">' . __( "Error : Sorry, the nonce security check didn't pass. Please reload the page and try again. You may want to try clearing your browser cache as a last attempt." , 'yikes-inc-easy-mailchimp-extender' ) . '</small></p>';
 
22
  return;
23
 
24
  } else {
28
  // if it was filled out, return an error...
29
  if( $honey_pot_filled ) {
30
  $process_submission_response = '<p><small class="form_submission_error">' . __( "Error: It looks like the honeypot was filled out and the form was not properly be submitted." , 'yikes-inc-easy-mailchimp-extender' ) . '</small></p>';
 
31
  return;
32
  }
33
 
34
+ // Check reCAPTCHA Response
35
  if( isset( $_POST['g-recaptcha-response'] ) ) {
36
  $url = esc_url_raw( 'https://www.google.com/recaptcha/api/siteverify?secret=' . get_option( 'yikes-mc-recaptcha-secret-key' , '' ) . '&response=' . $_POST['g-recaptcha-response'] . '&remoteip=' . $_SERVER["REMOTE_ADDR"] );
37
  $response = wp_remote_get( $url );
86
  // check if EU date format
87
  if( $form_settings['fields'][$merge_tag]['date_format'] == 'DD/MM/YYYY' ) {
88
  // convert '/' to '.' and to UNIX timestamp
89
+ $value = ( '' != $value ) ? date( 'Y-m-d', strtotime( str_replace( '/', '.', $value ) ) ) : '';
90
  } else {
91
  // convert to UNIX timestamp
92
+ $value = ( '' != $value ) ? date( 'Y-m-d', strtotime( $value ) ) : '';
93
  }
94
  }
95
  if( is_numeric( $merge_tag ) ) { // this is is an interest group!
104
  $merge_variables['optin_time'] = current_time( 'Y-m-d H:i:s', 1 );
105
 
106
  // Submit our form data
107
+ $api_key = trim( get_option( 'yikes-mc-api-key' , '' ) );
108
+ $dash_position = strpos( $api_key, '-' );
109
+
110
+ // setup the end point
111
+ if( $dash_position !== false ) {
112
+ $api_endpoint = 'https://' . substr( $api_key, $dash_position + 1 ) . '.api.mailchimp.com/2.0/lists/subscribe.json';
113
+ }
114
 
115
  /*
116
  * yikes-mailchimp-before-submission
129
  */
130
  if( isset( $merge_variables['error'] ) ) {
131
  $process_submission_response = apply_filters( 'yikes-mailchimp-frontend-content' , $merge_variables['message'] );
 
132
  return;
133
  }
134
 
135
+ // submit the request & data, using the form settings
136
+ // subscribe the user
137
+ $subscribe_response = wp_remote_post( $api_endpoint, array(
138
+ 'body' => apply_filters( 'yikes-mailchimp-user-subscribe-api-request', array(
139
+ 'apikey' => $api_key,
140
+ 'id' => $_POST['yikes-mailchimp-associated-list-id'],
141
+ 'email' => array( 'email' => sanitize_email( $_POST['EMAIL'] ) ),
142
+ 'merge_vars' => $merge_variables,
143
+ 'double_optin' => $form_settings['optin_settings']['optin'],
144
+ 'update_existing' => 0, // always set to 0 (when 0, users cannot update. when 1, users can click a link to send an email where they can then update their details)
145
+ 'send_welcome' => $form_settings['optin_settings']['send_welcome_email'],
146
+ 'replace_interests' => ( isset( $form_settings['submission_settings']['replace_interests'] ) ) ? $form_settings['submission_settings']['replace_interests'] : 1, // defaults to replace
147
+ ), $form_id, $_POST['yikes-mailchimp-associated-list-id'], $_POST['EMAIL'] ),
148
+ 'timeout' => 10,
149
+ 'sslverify' => apply_filters( 'yikes-mailchimp-sslverify', true )
150
+ ) );
151
 
152
+ $subscribe_response = json_decode( wp_remote_retrieve_body( $subscribe_response ), true );
153
+
154
+ // check for any errors
155
+ if( isset( $subscribe_response['error'] ) ) {
156
+ $update_account_details_link = '';
157
+ switch( $subscribe_response['code'] ) {
158
+ // user already subscribed
159
+ case '214':
160
+ $update_account_details_link = ( $form_settings['optin_settings']['update_existing_user'] == 1 ) ? apply_filters( 'yikes-easy-mailchimp-update-existing-subscriber-text', sprintf( __( ' To update your MailChimp profile, please %s.', 'yikes-inc-easy-mailchimp-extender' ), '<a class="send-update-email" data-list-id="' . $_POST['yikes-mailchimp-associated-list-id'] . '" data-user-email="' . sanitize_email( $_POST['EMAIL'] ) . '" href="#">' . __( 'click to send yourself an update link', 'yikes-inc-easy-mailchimp-extender' ) . '</a>' ), '<a class="send-update-email" data-list-id="' . $_POST['yikes-mailchimp-associated-list-id'] . '" data-user-email="' . sanitize_email( $_POST['EMAIL'] ) . '" href="#">' . __( 'click to send yourself an update link', 'yikes-inc-easy-mailchimp-extender' ) . '</a>' ) : false;
161
+ if( $update_account_details_link ) {
162
+ // if update account details is set, we need to include our script to send out the update email
163
+ wp_enqueue_script( 'update-existing-subscriber.js', YIKES_MC_URL . 'public/js/yikes-update-existing-subscriber.js' , array( 'jquery' ), 'all' );
164
+ wp_localize_script( 'update-existing-subscriber.js', 'update_subscriber_details_data', array(
165
+ 'ajax_url' => esc_url( admin_url( 'admin-ajax.php' ) ),
166
+ 'preloader_url' => apply_filters( 'yikes-mailchimp-preloader', esc_url_raw( admin_url( 'images/wpspin_light.gif' ) ) ),
167
+ ) );
168
+ }
169
+ if( ! empty( $form_settings['error_messages']['already-subscribed'] ) ) {
170
+ $process_submission_response = '<p class="yikes-easy-mc-error-message">' . $form_settings['error_messages']['already-subscribed'] . ' ' . $update_account_details_link . '</p>';
171
+ } else {
172
+ $process_submission_response = '<p class="yikes-easy-mc-error-message">' . $subscribe_response['error'] . ' ' . $update_account_details_link . '</p>';
173
+ }
174
+ break;
175
+ // missing a required field
176
+ case '250':
177
+ // get all merge variables in array, loop and str_replace error code with field name
178
+ $api_key = trim( get_option( 'yikes-mc-api-key' , '' ) );
179
+ $dash_position = strpos( $api_key, '-' );
180
+ if( $dash_position !== false ) {
181
+ $api_endpoint = 'https://' . substr( $api_key, $dash_position + 1 ) . '.api.mailchimp.com/2.0/lists/merge-vars.json';
182
+ }
183
+ $merge_variables = wp_remote_post( $api_endpoint, array(
184
+ 'body' => array(
185
+ 'apikey' => $api_key,
186
+ 'id' => array( $_POST['yikes-mailchimp-associated-list-id'] ) ,
187
+ ),
188
+ 'timeout' => 10,
189
+ 'sslverify' => apply_filters( 'yikes-mailchimp-sslverify', true ),
190
+ ) );
191
+ $merge_variables = json_decode( wp_remote_retrieve_body( $merge_variables ), true );
192
+ // re-store our data
193
+ $merge_variables = $merge_variables['data'][0]['merge_vars'];
194
+ $merge_variable_name_array = array();
195
+ foreach( $merge_variables as $merge_var ) {
196
+ $merge_variables_name_array[$merge_var['tag']] = $merge_var['name'];
197
+ }
198
+ $error_message = $subscribe_response['error'];
199
+ // replace tag with name in the error message.
200
+ foreach( $merge_variables_name_array as $tag => $name ) {
201
+ $error_message = str_replace( $tag, $name, $error_message );
202
+ }
203
+ $process_submission_response = '<p class="yikes-easy-mc-error-message">' . $error_message . '.</p>';
204
+ break;
205
+ // test@email.com is not allowed
206
+ case '-99':
207
+ // generic error
208
+ $process_submission_response = '<p class="yikes-easy-mc-error-message">' . str_replace( ' and cannot be imported', '', str_replace( 'List_RoleEmailMember:', '', $subscribe_response['error'] ) ) . '</p>';
209
+ break;
210
+ default:
211
+ // generic error
212
+ if( ! empty( $form_settings['error_messages']['general-error'] ) ) {
213
+ $process_submission_response = '<p class="yikes-easy-mc-error-message">' . $form_settings['error_messages']['general-error'] . '</p>';
214
+ } else {
215
+ $process_submission_response = '<p class="yikes-easy-mc-error-message">' . $subscribe_response['error'] . '</p>';
216
+ }
217
+ break;
218
+ }
219
+ return;
220
+ }
221
 
 
222
  // setup our submission response
223
  $form_submitted = 1;
224
 
270
  $form_settings['submissions']++;
271
  $wpdb->update(
272
  $wpdb->prefix . 'yikes_easy_mc_forms',
273
+ array(
274
+ 'submissions' => $form_settings['submissions'],
275
+ ),
276
+ array( 'ID' => $form_id ),
277
+ array(
278
+ '%d', // send welcome email
279
+ ),
280
+ array( '%d' )
281
+ );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
282
 
283
  }
284
  ?>
public/partials/shortcodes/process/process_form_submission_ajax.php CHANGED
@@ -1,223 +1,258 @@
1
  <?php
2
-
3
- /*
4
- * AJAX Form Submission Processing
5
- * Begin below young grasshopper
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
6
  */
7
-
8
- // parse our form data
9
- parse_str( $_POST['form_data'], $data );
10
- // store the form ID to use in our hooks and filters
11
- $form = $_POST['form_id'];
 
12
 
13
- // Retreive the form data from the database instead of posting it with the form-submission
14
- global $wpdb;
15
- // return it as an array, so we can work with it to build our form below
16
- $form_results = $wpdb->get_results( 'SELECT * FROM ' . $wpdb->prefix . 'yikes_easy_mc_forms WHERE id = ' . $form . '', ARRAY_A );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
17
 
18
- if( $form_results ) {
19
- $form_data = $form_results[0];
20
- // List ID
21
- $list_id = $form_data['list_id'];
22
- // decode our submission settings
23
- $submission_settings = json_decode( stripslashes( $form_data['submission_settings'] ), true );
24
- // decode our optin settings
25
- $optin_settings = json_decode( stripslashes( $form_data['optin_settings'] ), true );
26
- // decode our fields
27
- $form_fields = json_decode( stripslashes( $form_data['fields'] ), true );
28
- /* Decode our error messages
29
- * Workaround for international characters (cyrillic etc)
30
- * See: https://wordpress.org/support/topic/custom-messages-do-not-support-cyrillic-characters?replies=11#post-7629620
31
- */
32
- $error_messages = ( get_magic_quotes_gpc() ) ? json_decode( stripslashes( $form_data['error_messages'] ), true ) : json_decode( $form_data['error_messages'], true );
33
- /** Submit Process **/
34
- $notifications = json_decode( stripslashes( $form_data['custom_notifications'] ), true );
35
- /* Page Data */
36
- $page_data = $_POST['page_data'];
37
  }
38
-
39
- // Empty array to build up merge variables
40
- $merge_variables = array();
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
41
 
42
- // set variable
43
- $error = 0;
 
 
 
 
 
 
 
44
 
45
- /* Check for Honeypot filled */
46
- $honey_pot_filled = ( isset( $data['yikes-mailchimp-honeypot'] ) && $data['yikes-mailchimp-honeypot'] != '' ) ? true : false;
47
- // if it was filled out, return an error...
48
- if( $honey_pot_filled ) {
49
- wp_send_json( array(
50
- 'hide' => '0',
51
- 'error' => 1,
52
- 'response' => __( "Error: It looks like the honeypot was filled out and the form was not properly be submitted." , 'yikes-inc-easy-mailchimp-extender' )
53
- ) );
54
- return;
55
- }
 
 
 
 
 
56
 
57
- // Check reCaptcha Response was submitted with the form data
58
- if( isset( $data['g-recaptcha-response'] ) ) {
59
- $url = esc_url_raw( 'https://www.google.com/recaptcha/api/siteverify?secret=' . get_option( 'yikes-mc-recaptcha-secret-key' , '' ) . '&response=' . $data['g-recaptcha-response'] . '&remoteip=' . $_SERVER["REMOTE_ADDR"] );
60
- $response = wp_remote_get( $url );
61
- $response_body = json_decode( $response['body'] , true );
62
- // if we've hit an error, lets return the error!
63
- if( $response_body['success'] != 1 ) {
64
- $error_messages = array(); // empty array to store error messages
65
- if( isset( $response_body['error-codes'] ) ) {
66
- foreach( $response_body['error-codes'] as $error_code ) {
67
- if( $error_code == 'missing-input-response' ) {
68
- $error_code = __( 'Please check the reCAPTCHA field.', 'yikes-inc-easy-mailchimp-extender' );
69
- }
70
- $error_messages[] = __( 'Error', 'yikes-inc-easy-mailchimp-extender' ) . ': ' . $error_code;
71
- }
72
- } else {
73
- $error_messages[] = __( 'Please refresh the page and try again.', 'yikes-inc-easy-mailchimp-extender' );
 
 
 
 
 
74
  }
75
- $error = 1;
76
- wp_send_json( array(
77
- 'hide' => '0',
78
- 'error' => $error ,
79
- 'response' => apply_filters( 'yikes-mailchimp-recaptcha-required-error', implode( ' ', $error_messages ) ),
 
 
80
  ) );
81
- exit();
82
- }
83
- }
84
-
85
- // loop to push variables to our array
86
- foreach ( $data as $merge_tag => $value ) {
87
- if( $merge_tag != 'yikes_easy_mc_new_subscriber' && $merge_tag != '_wp_http_referer' ) {
88
- // check if the current iteration has a 'date_format' key set
89
- // (aka - date/birthday fields)
90
- if( isset( $form_fields[$merge_tag]['date_format'] ) ) {
91
- // check if EU date format
92
- if( $form_fields[$merge_tag]['date_format'] == 'DD/MM/YYYY' ) {
93
- // convert '/' to '.' and to UNIX timestamp
94
- $value = date( 'Y-m-d', strtotime( str_replace( '/', '.', $value ) ) );
95
- } else {
96
- // convert to UNIX timestamp
97
- $value = date( 'Y-m-d', strtotime( $value ) );
98
- }
99
  }
100
- if( is_numeric( $merge_tag ) ) { // this is is an interest group!
101
- $merge_variables['groupings'][] = array( 'id' => $merge_tag , 'groups' => ( is_array( $value ) ) ? $value : array( $value ) );
102
- } else { // or else it's just a standard merge variable
103
- $merge_variables[$merge_tag] = $value;
104
  }
105
- }
106
- }
107
- // store the opt-in time
108
- $merge_variables['optin_time'] = current_time( 'Y-m-d H:i:s', 1 );
109
-
110
- // Submit our form data
111
- $api_key = get_option( 'yikes-mc-api-key' , '' );
112
- // initialize MailChimp API
113
- $MailChimp = new MailChimp( $api_key );
114
-
115
- /*
116
- * yikes-mailchimp-before-submission
117
- *
118
- * Catch the merge variables before they get sent over to MailChimp
119
- * param @merge_variables - user submitted form data
120
- * optional @form - the ID of the form to filter
121
- * @since 6.0.0
122
- */
123
- $merge_variables = apply_filters( 'yikes-mailchimp-before-submission' , $merge_variables );
124
- $merge_variables = apply_filters( 'yikes-mailchimp-before-submission-'.$form , $merge_variables );
125
-
126
- /*
127
- * Allow users to check for submit value
128
- * and pass back an error to the user
129
- */
130
- if( isset( $merge_variables['error'] ) ) {
131
- // send our error response back
132
- wp_send_json( array( 'hide' => '0', 'error' => $merge_variables['error'] , 'response' => $merge_variables['message'] ) );
133
- return;
134
- }
135
-
136
- // submit the request & data, using the form settings
137
- try {
138
-
139
- $subscribe_response = $MailChimp->call('/lists/subscribe', apply_filters( 'yikes-mailchimp-user-subscribe-api-request', array(
140
- 'api_key' => $api_key,
141
- 'id' => $list_id,
142
- 'email' => array( 'email' => sanitize_email( $data['EMAIL'] ) ),
143
- 'merge_vars' => $merge_variables,
144
- 'double_optin' => $optin_settings['optin'],
145
- 'update_existing' => $optin_settings['update_existing_user'],
146
- 'send_welcome' => $optin_settings['send_welcome_email'],
147
- 'replace_interests' => ( isset( $submission_settings['replace_interests'] ) ) ? $submission_settings['replace_interests'] : 1, // defaults to replace
148
- ), $form, $list_id, $data['EMAIL'] ) );
149
-
150
- // set the global variable to 1, to trigger a successful submission
151
- $form_submitted = 1;
152
- /*
153
- * Successful form submission redirect
154
- */
155
- if( $submission_settings['redirect_on_submission'] == '1' ) {
156
- $redirection = '1';
157
- $redirect_url = ( 'custom_url' != $submission_settings['redirect_page'] ) ? get_permalink( $submission_settings['redirect_page'] ) : $submission_settings['custom_redirect_url'];
158
- $redirect = '<script type="text/javascript">setTimeout(function() { window.location="' . apply_filters( 'yikes-mailchimp-redirect-url', esc_url( $redirect_url ), $form, $page_data ) . '"; }, ' . apply_filters( 'yikes-mailchimp-redirect-timer', 1500 ) . ');</script>';
159
- }
160
-
161
- /*
162
- * yikes-mailchimp-after-submission
163
- *
164
- * Catch the merge variables after they've been sent over to MailChimp
165
- * param @merge_variables - user submitted form data
166
- * optional @form - the ID of the form to filter
167
- * @since 6.0.0
168
- */
169
- do_action( 'yikes-mailchimp-after-submission' , $merge_variables );
170
- do_action( 'yikes-mailchimp-after-submission-'.$form , $merge_variables );
171
-
172
- // send our notifications if setup (must go before wp_send_json())
173
- do_action( 'yikes-mailchimp-form-submission' , sanitize_email( $data['EMAIL'] ) , $merge_variables , $form , $notifications );
174
- do_action( 'yikes-mailchimp-form-submission-' . $form , sanitize_email( $data['EMAIL'] ) , $merge_variables , $form , $notifications );
175
-
176
- $default_success_response = ( $optin_settings['optin'] == 1 ) ? __( "Thank you for subscribing! Check your email for the confirmation message." , 'yikes-inc-easy-mailchimp-extender' ) : __( "Thank you for subscribing!" , 'yikes-inc-easy-mailchimp-extender' );
177
-
178
- wp_send_json(
179
- array(
180
- 'hide' => $submission_settings['hide_form_post_signup'],
181
- 'error' => $error,
182
- 'response' => apply_filters( 'yikes-mailchimp-success-response', ( ! empty( $error_messages['success'] ) ? $error_messages['success'] : $default_success_response ), $form, $merge_variables ),
183
- 'redirection' => isset( $redirection ) ? '1' : '0',
184
- 'redirect' => isset( $redirect ) ? $redirect : '',
185
- )
186
- );
187
 
188
- // end successful submission
189
-
190
- } catch ( Exception $error ) { // Something went wrong...
191
- $error_response = $error->getMessage();
192
- $error = 1;
193
- if( get_option( 'yikes-mailchimp-debug-status' , '' ) == '1' ) {
194
- if( strpos( $error_response, 'must be provided' ) !== false ) {
195
- $boom = explode( ' ', $error_response );
196
- $merge_variable = $boom[0];
197
- $api_key = get_option( 'yikes-mc-api-key' , '' );
198
- $MailChimp = new MailChimp( $api_key );
199
- try {
200
- $available_merge_variables = $MailChimp->call( 'lists/merge-vars' , array( 'apikey' => $api_key , 'id' => array( $list_id ) ) );
201
- foreach( $available_merge_variables['data'][0]['merge_vars'] as $merge_var ) {
202
- if( $merge_var['tag'] == $merge_variable ) {
203
- $field_name = $merge_var['name'];
204
- }
205
- }
206
- $error_response = str_replace( $merge_variable , '<strong>"' . $field_name . '"</strong>' , $error_response );
207
- } catch ( Exception $e ) {
208
- $error_response = $e->getMessage();
209
- }
210
- }
211
- // send our error response back
212
- wp_send_json( array( 'hide' => '0', 'error' => $error , 'response' => $error_response ) );
213
- } else {
214
- if ( strpos( $error_response, 'should include an email' ) !== false ) { // include a valid email please
215
- wp_send_json( array( 'hide' => '0', 'error' => $error , 'response' => !empty( $error_messages['invalid-email'] ) ? $error_messages['invalid-email'] : __( 'Please enter a valid email address.' , 'yikes-inc-easy-mailchimp-extender' ) ) );
216
- } else if ( strpos( $error_response, 'already subscribed' ) !== false ) { // user already subscribed
217
- $update_account_details_link = ( $optin_settings['update_existing_user'] == 1 ) ? apply_filters( 'yikes-easy-mailchimp-update-existing-subscriber-text', sprintf( __( ' To update your profile, please %s.', 'yikes-inc-easy-mailchimp-extender' ), '<a class="send-update-email" data-list-id="' . $list_id . '" data-user-email="' . sanitize_email( $data['EMAIL'] ) . '" href="#">' . __( 'click to send yourself an update link', 'yikes-inc-easy-mailchimp-extender' ) . '</a>' ), '<a class="send-update-email" data-list-id="' . $list_id . '" data-user-email="' . sanitize_email( $data['EMAIL'] ) . '" href="#">' . __( 'click to send yourself an update link', 'yikes-inc-easy-mailchimp-extender' ) . '</a>' ) : false;
218
- wp_send_json( array( 'hide' => '0', 'error' => $error , 'response' => !empty( $error_messages['already-subscribed'] ) ? $error_messages['already-subscribed'] : __( "It looks like you're already subscribed to this list." , 'yikes-inc-easy-mailchimp-extender' ), 'security_response' => $update_account_details_link ) );
219
- } else { // general error
220
- wp_send_json( array( 'hide' => '0', 'error' => $error , 'response' => !empty( $error_messages['general-error'] ) ? $error_messages['general-error'] : __( "Whoops, something went wrong! Please try again." , 'yikes-inc-easy-mailchimp-extender' ) ) );
221
- }
222
- }
223
- }
 
 
 
1
  <?php
2
+ /*
3
+ * AJAX Form Submission Processing
4
+ * Begin below young grasshopper
5
+ */
6
+
7
+ // parse our form data
8
+ parse_str( $_POST['form_data'], $data );
9
+ // store the form ID to use in our hooks and filters
10
+ $form = $_POST['form_id'];
11
+
12
+ // Retreive the form data from the database instead of posting it with the form-submission
13
+ global $wpdb;
14
+ // return it as an array, so we can work with it to build our form below
15
+ $form_results = $wpdb->get_results( 'SELECT * FROM ' . $wpdb->prefix . 'yikes_easy_mc_forms WHERE id = ' . $form . '', ARRAY_A );
16
+
17
+ if( $form_results ) {
18
+ $form_data = $form_results[0];
19
+ // List ID
20
+ $list_id = $form_data['list_id'];
21
+ // decode our submission settings
22
+ $submission_settings = json_decode( stripslashes( $form_data['submission_settings'] ), true );
23
+ // decode our optin settings
24
+ $optin_settings = json_decode( stripslashes( $form_data['optin_settings'] ), true );
25
+ // decode our fields
26
+ $form_fields = json_decode( stripslashes( $form_data['fields'] ), true );
27
+ /* Decode our error messages
28
+ * Workaround for international characters (cyrillic etc)
29
+ * See: https://wordpress.org/support/topic/custom-messages-do-not-support-cyrillic-characters?replies=11#post-7629620
30
  */
31
+ $error_messages = ( get_magic_quotes_gpc() ) ? json_decode( stripslashes( $form_data['error_messages'] ), true ) : json_decode( $form_data['error_messages'], true );
32
+ /** Submit Process **/
33
+ $notifications = json_decode( stripslashes( $form_data['custom_notifications'] ), true );
34
+ /* Page Data */
35
+ $page_data = $_POST['page_data'];
36
+ }
37
 
38
+ // Empty array to build up merge variables
39
+ $merge_variables = array();
40
+
41
+ // set variable
42
+ $error = 0;
43
+
44
+ /* Check for Honeypot filled */
45
+ $honey_pot_filled = ( isset( $data['yikes-mailchimp-honeypot'] ) && $data['yikes-mailchimp-honeypot'] != '' ) ? true : false;
46
+ // if it was filled out, return an error...
47
+ if( $honey_pot_filled ) {
48
+ wp_send_json_error( array(
49
+ 'hide' => '0',
50
+ 'error' => 1,
51
+ 'response' => __( "Error: It looks like the honeypot was filled out and the form was not properly be submitted." , 'yikes-inc-easy-mailchimp-extender' )
52
+ ) );
53
+ return;
54
+ }
55
+
56
+ // Check reCAPTCHA Response was submitted with the form data
57
+ if( isset( $data['g-recaptcha-response'] ) ) {
58
+ $url = esc_url_raw( 'https://www.google.com/recaptcha/api/siteverify?secret=' . get_option( 'yikes-mc-recaptcha-secret-key' , '' ) . '&response=' . $data['g-recaptcha-response'] . '&remoteip=' . $_SERVER["REMOTE_ADDR"] );
59
+ $response = wp_remote_get( $url );
60
+ $response_body = json_decode( $response['body'] , true );
61
+ // if we've hit an error, lets return the error!
62
+ if( $response_body['success'] != 1 ) {
63
+ $error_messages = array(); // empty array to store error messages
64
+ if( isset( $response_body['error-codes'] ) ) {
65
+ foreach( $response_body['error-codes'] as $error_code ) {
66
+ if( $error_code == 'missing-input-response' ) {
67
+ $error_code = __( 'Please check the reCAPTCHA field.', 'yikes-inc-easy-mailchimp-extender' );
68
+ }
69
+ $error_messages[] = __( 'Error', 'yikes-inc-easy-mailchimp-extender' ) . ': ' . $error_code;
70
+ }
71
+ } else {
72
+ $error_messages[] = __( 'Please refresh the page and try again.', 'yikes-inc-easy-mailchimp-extender' );
73
+ }
74
+ $error = 1;
75
+ wp_send_json_error( array(
76
+ 'hide' => '0',
77
+ 'error' => $error ,
78
+ 'response' => apply_filters( 'yikes-mailchimp-recaptcha-required-error', implode( ' ', $error_messages ) ),
79
+ ) );
80
+ exit();
81
+ }
82
+ }
83
 
84
+ // loop to push variables to our array
85
+ foreach ( $data as $merge_tag => $value ) {
86
+ if( $merge_tag != 'yikes_easy_mc_new_subscriber' && $merge_tag != '_wp_http_referer' ) {
87
+ // check if the current iteration has a 'date_format' key set
88
+ // (aka - date/birthday fields)
89
+ if( isset( $form_fields[$merge_tag]['date_format'] ) ) {
90
+ // check if EU date format
91
+ if( $form_fields[$merge_tag]['date_format'] == 'DD/MM/YYYY' ) {
92
+ // convert '/' to '.' and to UNIX timestamp
93
+ $value = date( 'Y-m-d', strtotime( str_replace( '/', '.', $value ) ) );
94
+ } else {
95
+ // convert to UNIX timestamp
96
+ $value = date( 'Y-m-d', strtotime( $value ) );
 
 
 
 
 
 
97
  }
98
+ }
99
+ if( is_numeric( $merge_tag ) ) { // this is is an interest group!
100
+ $merge_variables['groupings'][] = array( 'id' => $merge_tag , 'groups' => ( is_array( $value ) ) ? $value : array( $value ) );
101
+ } else { // or else it's just a standard merge variable
102
+ $merge_variables[$merge_tag] = $value;
103
+ }
104
+ }
105
+ }
106
+ // store the opt-in time
107
+ $merge_variables['optin_time'] = current_time( 'Y-m-d H:i:s', 1 );
108
+
109
+ // Submit our form data
110
+ $api_key = trim( get_option( 'yikes-mc-api-key' , '' ) );
111
+ $dash_position = strpos( $api_key, '-' );
112
+
113
+ // setup the end point
114
+ if( $dash_position !== false ) {
115
+ $api_endpoint = 'https://' . substr( $api_key, $dash_position + 1 ) . '.api.mailchimp.com/2.0/lists/subscribe.json';
116
+ }
117
+
118
+ /*
119
+ * yikes-mailchimp-before-submission
120
+ *
121
+ * Catch the merge variables before they get sent over to MailChimp
122
+ * param @merge_variables - user submitted form data
123
+ * optional @form - the ID of the form to filter
124
+ * @since 6.0.0
125
+ */
126
+ $merge_variables = apply_filters( 'yikes-mailchimp-before-submission' , $merge_variables );
127
+ $merge_variables = apply_filters( 'yikes-mailchimp-before-submission-'.$form , $merge_variables );
128
 
129
+ /*
130
+ * Allow users to check for submit value
131
+ * and pass back an error to the user
132
+ */
133
+ if( isset( $merge_variables['error'] ) ) {
134
+ // send our error response back
135
+ wp_send_json_error( array( 'hide' => '0', 'error' => $merge_variables['error'] , 'response' => $merge_variables['message'] ) );
136
+ return;
137
+ }
138
 
139
+ // submit the request & data, using the form settings
140
+ // subscribe the user
141
+ $subscribe_response = wp_remote_post( $api_endpoint, array(
142
+ 'body' => apply_filters( 'yikes-mailchimp-user-subscribe-api-request', array(
143
+ 'apikey' => $api_key,
144
+ 'id' => $list_id,
145
+ 'email' => array( 'email' => sanitize_email( $data['EMAIL'] ) ),
146
+ 'merge_vars' => $merge_variables,
147
+ 'double_optin' => $optin_settings['optin'],
148
+ 'update_existing' => 0, // always set to 0 (when 0, users cannot update. when 1, users can click a link to send an email where they can then update their details)
149
+ 'send_welcome' => $optin_settings['send_welcome_email'],
150
+ 'replace_interests' => ( isset( $submission_settings['replace_interests'] ) ) ? $submission_settings['replace_interests'] : 1, // defaults to replace
151
+ ), $form, $list_id, $data['EMAIL'] ),
152
+ 'timeout' => 10,
153
+ 'sslverify' => apply_filters( 'yikes-mailchimp-sslverify', true )
154
+ ) );
155
 
156
+ $subscribe_response = json_decode( wp_remote_retrieve_body( $subscribe_response ), true );
157
+
158
+ if( isset( $subscribe_response['error'] ) ) {
159
+ $update_account_details_link = '';
160
+ $error = 1;
161
+ switch( $subscribe_response['code'] ) {
162
+ // user already subscribed
163
+ case '214':
164
+ $update_account_details_link = ( $optin_settings['update_existing_user'] == 1 ) ? apply_filters( 'yikes-easy-mailchimp-update-existing-subscriber-text', sprintf( __( ' To update your MailChimp profile, please %s.', 'yikes-inc-easy-mailchimp-extender' ), '<a class="send-update-email" data-list-id="' . $list_id . '" data-user-email="' . sanitize_email( $data['EMAIL'] ) . '" href="#">' . __( 'click to send yourself an update link', 'yikes-inc-easy-mailchimp-extender' ) . '</a>' ) ) : false;
165
+ if( ! empty( $error_messages['already-subscribed'] ) ) {
166
+ $error_response = $error_messages['already-subscribed'] . ' ' . $update_account_details_link;
167
+ } else {
168
+ $error_response = $subscribe_response['error'] . ' ' . $update_account_details_link;
169
+ }
170
+ break;
171
+ // missing a required field
172
+ case '250':
173
+ // get all merge variables in array, loop and str_replace error code with field name
174
+ $api_key = trim( get_option( 'yikes-mc-api-key' , '' ) );
175
+ $dash_position = strpos( $api_key, '-' );
176
+ if( $dash_position !== false ) {
177
+ $api_endpoint = 'https://' . substr( $api_key, $dash_position + 1 ) . '.api.mailchimp.com/2.0/lists/merge-vars.json';
178
  }
179
+ $merge_variables = wp_remote_post( $api_endpoint, array(
180
+ 'body' => array(
181
+ 'apikey' => $api_key,
182
+ 'id' => array( $list_id ) ,
183
+ ),
184
+ 'timeout' => 10,
185
+ 'sslverify' => apply_filters( 'yikes-mailchimp-sslverify', true ),
186
  ) );
187
+ $merge_variables = json_decode( wp_remote_retrieve_body( $merge_variables ), true );
188
+ // re-store our data
189
+ $merge_variables = $merge_variables['data'][0]['merge_vars'];
190
+ $merge_variable_name_array = array();
191
+ foreach( $merge_variables as $merge_var ) {
192
+ $merge_variables_name_array[$merge_var['tag']] = $merge_var['name'];
 
 
 
 
 
 
 
 
 
 
 
 
193
  }
194
+ $error_message = $subscribe_response['error'];
195
+ // replace tag with name in the error message.
196
+ foreach( $merge_variables_name_array as $tag => $name ) {
197
+ $error_message = str_replace( $tag, $name, $error_message );
198
  }
199
+ $error_response = $error_message;
200
+ break;
201
+ // test@email.com is not allowed
202
+ case '-99':
203
+ // generic error
204
+ $error_response = str_replace( ' and cannot be imported', '', str_replace( 'List_RoleEmailMember:', '', $subscribe_response['error'] ) );
205
+ break;
206
+ default:
207
+ $error_response = ( ! empty( $error_messages['general-error'] ) ) ? $error_messages['general-error'] : $subscribe_response['error'];
208
+ break;
209
+ }
210
+ // send the response
211
+ wp_send_json_error( array(
212
+ 'hide' => '0',
213
+ 'error' => $error,
214
+ 'response' => $error_response,
215
+ 'security_response' => $update_account_details_link
216
+ ) );
217
+ return;
218
+ }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
219
 
220
+ // set the global variable to 1, to trigger a successful submission
221
+ $form_submitted = 1;
222
+ /*
223
+ * Successful form submission redirect
224
+ */
225
+ if( $submission_settings['redirect_on_submission'] == '1' ) {
226
+ $redirection = '1';
227
+ $redirect_url = ( 'custom_url' != $submission_settings['redirect_page'] ) ? get_permalink( $submission_settings['redirect_page'] ) : $submission_settings['custom_redirect_url'];
228
+ $redirect = '<script type="text/javascript">setTimeout(function() { window.location="' . apply_filters( 'yikes-mailchimp-redirect-url', esc_url( $redirect_url ), $form, $page_data ) . '"; }, ' . apply_filters( 'yikes-mailchimp-redirect-timer', 1500 ) . ');</script>';
229
+ }
230
+
231
+ /*
232
+ * yikes-mailchimp-after-submission
233
+ *
234
+ * Catch the merge variables after they've been sent over to MailChimp
235
+ * param @merge_variables - user submitted form data
236
+ * optional @form - the ID of the form to filter
237
+ * @since 6.0.0
238
+ */
239
+ do_action( 'yikes-mailchimp-after-submission' , $merge_variables );
240
+ do_action( 'yikes-mailchimp-after-submission-'.$form , $merge_variables );
241
+
242
+ // send our notifications if setup (must go before wp_send_json())
243
+ do_action( 'yikes-mailchimp-form-submission' , sanitize_email( $data['EMAIL'] ) , $merge_variables , $form , $notifications );
244
+ do_action( 'yikes-mailchimp-form-submission-' . $form , sanitize_email( $data['EMAIL'] ) , $merge_variables , $form , $notifications );
245
+
246
+ $default_success_response = ( $optin_settings['optin'] == 1 ) ? __( "Thank you for subscribing! Check your email for the confirmation message." , 'yikes-inc-easy-mailchimp-extender' ) : __( "Thank you for subscribing!" , 'yikes-inc-easy-mailchimp-extender' );
247
+
248
+ wp_send_json_success(
249
+ array(
250
+ 'hide' => $submission_settings['hide_form_post_signup'],
251
+ 'error' => $error,
252
+ 'response' => apply_filters( 'yikes-mailchimp-success-response', ( ! empty( $error_messages['success'] ) ? $error_messages['success'] : $default_success_response ), $form, $merge_variables ),
253
+ 'redirection' => isset( $redirection ) ? '1' : '0',
254
+ 'redirect' => isset( $redirect ) ? $redirect : '',
255
+ )
256
+ );
257
+
258
+ // end successful submission
public/partials/shortcodes/process_form_shortcode.php CHANGED
@@ -70,7 +70,7 @@ function process_mailchimp_shortcode( $atts ) {
70
  // Store the site language (to load recaptcha in a specific language)
71
  $locale = get_locale();
72
  $locale_split = explode( '_', $locale );
73
- // Setup reCaptcha parameters
74
  $lang = ( isset( $locale_split ) ? $locale_split[0] : $locale );
75
  $lang = ( isset( $atts['recaptcha_lang'] ) ) ? $atts['recaptcha_lang'] : $locale_split[0];
76
  $type = ( isset( $atts['recaptcha_type'] ) ) ? strtolower( $atts['recaptcha_type'] ) : 'image'; // setup recaptcha type
@@ -253,7 +253,6 @@ function process_mailchimp_shortcode( $atts ) {
253
  }
254
  ";
255
  wp_add_inline_style( 'yikes-inc-easy-mailchimp-public-styles', $inline_label_css );
256
-
257
  }
258
 
259
  // custom action hook to enqueue scripts & styles wherever the shortcode is used
@@ -1110,7 +1109,7 @@ function process_mailchimp_shortcode( $atts ) {
1110
 
1111
  do_action( 'yikes-mailchimp-additional-form-fields', $form_data );
1112
 
1113
- /* if we've enabled reCaptcha protection */
1114
  if( isset( $recaptcha_box ) ) {
1115
  echo $recaptcha_box;
1116
  }
70
  // Store the site language (to load recaptcha in a specific language)
71
  $locale = get_locale();
72
  $locale_split = explode( '_', $locale );
73
+ // Setup reCAPTCHA parameters
74
  $lang = ( isset( $locale_split ) ? $locale_split[0] : $locale );
75
  $lang = ( isset( $atts['recaptcha_lang'] ) ) ? $atts['recaptcha_lang'] : $locale_split[0];
76
  $type = ( isset( $atts['recaptcha_type'] ) ) ? strtolower( $atts['recaptcha_type'] ) : 'image'; // setup recaptcha type
253
  }
254
  ";
255
  wp_add_inline_style( 'yikes-inc-easy-mailchimp-public-styles', $inline_label_css );
 
256
  }
257
 
258
  // custom action hook to enqueue scripts & styles wherever the shortcode is used
1109
 
1110
  do_action( 'yikes-mailchimp-additional-form-fields', $form_data );
1111
 
1112
+ /* if we've enabled reCAPTCHA protection */
1113
  if( isset( $recaptcha_box ) ) {
1114
  echo $recaptcha_box;
1115
  }
public/partials/shortcodes/yikes-mailchimp-subscriber-count.php CHANGED
@@ -57,16 +57,25 @@ function yikes_mailchimp_subscriber_count_shortcode( $attributes ) {
57
  try {
58
 
59
  // get the api key
60
- $api_key = get_option( 'yikes-mc-api-key' , '' );
61
- // initialize the MailChimp class
62
- $MailChimp = new MailChimp( $api_key );
 
 
 
63
  // run the request
64
- $subscriber_count_response = $MailChimp->call( '/lists/list', apply_filters( 'yikes-mailchimp-user-subscriber-count-api-request', array(
65
- 'api_key' => $api_key,
66
- 'filters' => array(
67
- 'list_id' => $list_id,
68
- ),
69
- ), $list_id ) );
 
 
 
 
 
 
70
 
71
  // if more than one list is returned, something went wrong - bail
72
  if( $subscriber_count_response['total'] != 1 ) {
@@ -75,7 +84,7 @@ function yikes_mailchimp_subscriber_count_shortcode( $attributes ) {
75
  }
76
  return;
77
  }
78
-
79
  /* type cast the returned value as an integer */
80
  echo (int) apply_filters( 'yikes-mailchimp-subscriber-count-value', $subscriber_count_response['data'][0]['stats']['member_count'] );
81
 
57
  try {
58
 
59
  // get the api key
60
+ $api_key = trim( get_option( 'yikes-mc-api-key' , '' ) );
61
+ $dash_position = strpos( $api_key, '-' );
62
+ if( $dash_position !== false ) {
63
+ $api_endpoint = 'https://' . substr( $api_key, $dash_position + 1 ) . '.api.mailchimp.com/2.0/lists/list.json';
64
+ }
65
+
66
  // run the request
67
+ $subscriber_count_response = wp_remote_post( $api_endpoint, array(
68
+ 'body' => apply_filters( 'yikes-mailchimp-user-subscriber-count-api-request', array(
69
+ 'apikey' => $api_key,
70
+ 'filters' => array(
71
+ 'list_id' => $list_id,
72
+ ),
73
+ ), $list_id ),
74
+ 'timeout' => 10,
75
+ 'sslverify' => apply_filters( 'yikes-mailchimp-sslverify', true )
76
+ ) );
77
+
78
+ $subscriber_count_response = json_decode( wp_remote_retrieve_body( $subscriber_count_response ), true );
79
 
80
  // if more than one list is returned, something went wrong - bail
81
  if( $subscriber_count_response['total'] != 1 ) {
84
  }
85
  return;
86
  }
87
+
88
  /* type cast the returned value as an integer */
89
  echo (int) apply_filters( 'yikes-mailchimp-subscriber-count-value', $subscriber_count_response['data'][0]['stats']['member_count'] );
90
 
readme.txt CHANGED
@@ -1 +1 @@
1
- === Easy Forms for MailChimp ===
2
- added `stripslashes()` to the following settings fields :
3
- Updated readme FAQ section
4
- added `stripslashes()` to the following settings fields :
5
- Updated readme FAQ section
6
- added `stripslashes()` to the following settings fields :
7
- Updated readme FAQ section
8
- added `stripslashes()` to the following settings fields :
9
- Updated readme FAQ section
1
+ === Easy Forms for MailChimp ===
 
 
 
 
 
 
 
 
yikes-inc-easy-mailchimp-extender.php CHANGED
@@ -3,7 +3,7 @@
3
  * Plugin Name: Easy Forms for MailChimp by YIKES
4
  * Plugin URI: http://www.yikesinc.com/services/yikes-inc-easy-mailchimp-extender/
5
  * Description: YIKES Easy Forms for MailChimp links your site to MailChimp and allows you to generate and display mailing list opt-in forms anywhere on your site with ease.
6
- * Version: 6.0.4.7
7
  * Author: YIKES
8
  * Author URI: http://www.yikesinc.com/
9
  * License: GPL-3.0+
3
  * Plugin Name: Easy Forms for MailChimp by YIKES
4
  * Plugin URI: http://www.yikesinc.com/services/yikes-inc-easy-mailchimp-extender/
5
  * Description: YIKES Easy Forms for MailChimp links your site to MailChimp and allows you to generate and display mailing list opt-in forms anywhere on your site with ease.
6
+ * Version: 6.0.5
7
  * Author: YIKES
8
  * Author URI: http://www.yikesinc.com/
9
  * License: GPL-3.0+