From 5feebf51d2350846e6c682c83afce24f5714aeff Mon Sep 17 00:00:00 2001 From: Sapayth Hossain Date: Wed, 7 Dec 2022 16:56:52 +0600 Subject: [PATCH 1/3] fix: admin notification after guest email verified --- includes/class-frontend-form-post.php | 124 ++++++++++++++++++-------- 1 file changed, 87 insertions(+), 37 deletions(-) diff --git a/includes/class-frontend-form-post.php b/includes/class-frontend-form-post.php index d3b6e2743..edbc44dea 100755 --- a/includes/class-frontend-form-post.php +++ b/includes/class-frontend-form-post.php @@ -20,6 +20,8 @@ public function __construct() { add_action( 'wp_ajax_nopriv_make_media_embed_code', [ $this, 'make_media_embed_code' ] ); // // guest post hook add_action( 'init', [ $this, 'publish_guest_post' ] ); + // notification and other tasks after the guest verified the email + add_action( 'wpuf_guest_post_email_verified', [ $this, 'send_mail_to_admin_after_guest_mail_verified' ] ); // draft add_action( 'wp_ajax_wpuf_draft_post', [ $this, 'draft_post' ] ); add_action( 'wp_ajax_nopriv_wpuf_draft_post', [ $this, 'draft_post' ] ); @@ -934,48 +936,50 @@ public function publish_guest_post() { $pid = isset( $_GET['p_id'] ) ? sanitize_text_field( wp_unslash( $_GET['p_id'] ) ) : ''; $fid = isset( $_GET['f_id'] ) ? sanitize_text_field( wp_unslash( $_GET['f_id'] ) ) : ''; - if ( $post_msg === 'verified' ) { - $response = []; - $post_id = wpuf_decryption( $pid ); - $form_id = wpuf_decryption( $fid ); - $form_settings = wpuf_get_form_settings( $form_id ); - $post_author_id = get_post_field( 'post_author', $post_id ); - $payment_status = new WPUF_Subscription(); - $form = new WPUF_Form( $form_id ); - $pay_per_post = $form->is_enabled_pay_per_post(); - $force_pack = $form->is_enabled_force_pack(); - - if ( $form->is_charging_enabled() && $pay_per_post ) { - if ( ( $payment_status->get_payment_status( $post_id ) ) === 'pending' ) { - $response['show_message'] = true; - $response['redirect_to'] = add_query_arg( - [ - 'action' => 'wpuf_pay', - 'type' => 'post', - 'post_id' => $post_id, - ], - get_permalink( wpuf_get_option( 'payment_page', 'wpuf_payment' ) ) - ); + if ( $post_msg !== 'verified' ) { + return; + } - wp_redirect( $response['redirect_to'] ); - wpuf_clear_buffer(); - wp_send_json( $response ); - } - } else { - $p_status = get_post_status( $post_id ); + $response = []; + $post_id = wpuf_decryption( $pid ); + $form_id = wpuf_decryption( $fid ); + $form_settings = wpuf_get_form_settings( $form_id ); + $payment_status = new WPUF_Subscription(); + $form = new WPUF_Form( $form_id ); + $pay_per_post = $form->is_enabled_pay_per_post(); + + if ( $form->is_charging_enabled() && $pay_per_post ) { + if ( ( $payment_status->get_payment_status( $post_id ) ) === 'pending' ) { + $response['show_message'] = true; + $response['redirect_to'] = add_query_arg( + [ + 'action' => 'wpuf_pay', + 'type' => 'post', + 'post_id' => $post_id, + ], + get_permalink( wpuf_get_option( 'payment_page', 'wpuf_payment' ) ) + ); - if ( $p_status ) { - wp_update_post( - [ - 'ID' => $post_id, - 'post_status' => isset( $form_settings['post_status'] ) ? $form_settings['post_status'] : 'publish', - ] - ); + wp_redirect( $response['redirect_to'] ); + wpuf_clear_buffer(); + wp_send_json( $response ); + } + } else { + $p_status = get_post_status( $post_id ); - echo wp_kses_post( "
" . __( 'Email successfully verified. Please Login.', 'wp-user-frontend' ) . '
' ); - } + if ( $p_status ) { + wp_update_post( + [ + 'ID' => $post_id, + 'post_status' => isset( $form_settings['post_status'] ) ? $form_settings['post_status'] : 'publish', + ] + ); + + echo wp_kses_post( "
" . __( 'Email successfully verified. Please Login.', 'wp-user-frontend' ) . '
' ); } } + + do_action( 'wpuf_guest_post_email_verified', $post_id ); } public function wpuf_user_subscription_pack( $form_settings, $post_id = null ) { @@ -1260,4 +1264,50 @@ private function generate_auth_link() { $this->form_settings['message_restrict'] = str_replace( $placeholders, $replace, $this->form_settings['message_restrict'] ); } } + + /** + * Send a notification mail after a guest verified his/her email + * + * @since WPUF + * + * @return void + */ + public function send_mail_to_admin_after_guest_mail_verified() { + $post_id = ! empty( $_GET['p_id'] ) ? wpuf_decryption( sanitize_text_field( wp_unslash( $_GET['p_id'] ) ) ) : 0; + $form_id = ! empty( $_GET['f_id'] ) ? wpuf_decryption( sanitize_text_field( wp_unslash( $_GET['f_id'] ) ) ) : 0; + + if ( empty( $post_id ) || empty( $form_id ) ) { + return; + } + + $form = new WPUF_Form( $form_id ); + + if ( empty( $form->data ) ) { + return; + } + + $this->form_fields = $form->get_fields(); + $this->form_settings = $form->get_settings(); + + $author_id = get_post_field( 'post_author', $post_id ); + + $is_email_varified = get_user_meta( $author_id, 'wpuf_guest_email_verified', true ); + + // if user email already verified, no need to check again. + // It will prevent mail flooding by clicking on the same link + if ( $is_email_varified ) { + return; + } + + $mail_body = $this->prepare_mail_body( $this->form_settings['notification']['new_body'], $author_id, $post_id ); + $to = $this->prepare_mail_body( $this->form_settings['notification']['new_to'], $author_id, $post_id ); + $subject = $this->prepare_mail_body( $this->form_settings['notification']['new_subject'], $author_id, $post_id ); + $subject = wp_strip_all_tags( $subject ); + $mail_body = get_formatted_mail_body( $mail_body, $subject ); + $headers = [ 'Content-Type: text/html; charset=UTF-8' ]; + + // update the information for future to check if the email is already verified + update_user_meta( $author_id, 'wpuf_guest_email_verified', 1 ); + wp_mail( $to, $subject, $mail_body, $headers ); + } } From 0e772ebed573e0cdfdd6b7da05355747fcf0e61a Mon Sep 17 00:00:00 2001 From: Sapayth Hossain Date: Mon, 6 May 2024 13:07:31 +0600 Subject: [PATCH 2/3] Merge remote-tracking branch 'upstream/develop' into fix/admin_notification_after_guest_email_verified --- .gitattributes | 6 +- .github/workflows/main.yml | 16 + Gruntfile.js | 5 +- .../WeDevs_Insights.php | 20 +- .../WeDevs_Settings_API.php | 0 admin/class-admin-settings.php | 27 +- admin/class-plugin-upgrade-notice.php | 105 + .../js/components/builder-stage/index.js | 12 +- .../js/components/builder-stage/template.php | 4 +- .../js/components/field-visibility/index.js | 2 +- .../components/field-visibility/template.php | 8 +- .../js/components/form-column_field/index.js | 20 +- .../assets/js/components/form-fields/index.js | 8 +- admin/form-builder/assets/js/form-builder.js | 24 +- admin/form-builder/assets/js/mixins/global.js | 2 +- .../assets/less/builder-responsive.less | 2 +- .../class-wpuf-admin-form-builder.php | 363 - ...class-wpuf-form-builder-field-settings.php | 17 - admin/form.php | 572 - admin/html/form-settings-post-edit.php | 2 +- admin/html/whats-new.php | 1564 -- admin/posting.php | 36 +- admin/settings-options.php | 619 - admin/template-post.php | 10 +- admin/template.php | 8 +- admin/tools.php | 67 - assets/css/admin.css | 100 +- assets/css/admin/whats-new.css | 101 + assets/css/admin/wpuf-module.css | 74 +- assets/css/frontend-forms.css | 36 +- assets/css/registration-forms.css | 206 + assets/images/doc.svg | 3 + assets/images/eye-close.svg | 3 + assets/images/eye.svg | 3 + assets/images/form-banner.svg | 34 + assets/images/icon-buddypress.svg | 5 + assets/images/icon-campaign-monitor.svg | 5 + assets/images/icon-checked.svg | 4 + assets/images/icon-convertkit.svg | 4 + assets/images/icon-doc.svg | 4 + assets/images/icon-getresponse.svg | 4 + assets/images/icon-groups.svg | 9 + assets/images/icon-mailchimp.svg | 10 + assets/images/icon-mailpoet.svg | 4 + assets/images/icon-mailpoet3.svg | 5 + assets/images/icon-mention.svg | 4 + assets/images/icon-money.svg | 5 + assets/images/icon-profile.svg | 6 + assets/images/icon-settings.svg | 4 + assets/images/icon-templates.svg | 4 + assets/images/wpuf-pro-2.svg | 23 + assets/js-templates/form-components.php | 13 +- assets/js/admin/settings.js | 76 + assets/js/billing-address.js | 2 +- assets/js/frontend-form.js | 236 +- assets/js/frontend-form.min.js | 2 +- assets/js/promotion.json | 12 +- assets/js/registration-forms.js | 38 + .../selectWoo.full.js} | 0 .../selectWoo.full.min.js} | 0 .../selectWPUF.js => selectWoo/selectWoo.js} | 0 .../selectWoo.min.js} | 0 assets/js/subscriptions.js | 24 +- assets/js/upload.js | 41 +- assets/js/upload.min.js | 2 +- assets/js/wpuf-admin.js | 124 +- assets/js/wpuf-form-builder-components.js | 41 +- assets/js/wpuf-form-builder-mixins.js | 2 +- assets/js/wpuf-form-builder.js | 24 +- assets/js/wpuf-login-widget.js | 1 + assets/less/admin.less | 133 +- assets/less/frontend-forms.less | 32 +- assets/less/registration-forms.less | 263 + assets/vendor/sweetalert2/sweetalert2.css | 1421 + assets/vendor/sweetalert2/sweetalert2.js | 3970 +++ assets/vendor/sweetalert2/sweetalert2.min.css | 1 + assets/vendor/sweetalert2/sweetalert2.min.js | 1 + changelog.txt | 99 + class/admin-asset-loader.php | 92 - class/asset-loader.php | 92 - class/payment.php | 532 - class/render-form.php | 16 +- class/subscription.php | 89 +- composer.json | 12 +- composer.lock | 1149 +- includes/Admin.php | 156 + includes/Admin/Admin_Installer.php | 188 + includes/Admin/Admin_Settings.php | 185 + .../Admin/Admin_Subscription.php | 106 +- .../Admin/Admin_Tools.php | 196 +- .../Admin/Admin_Welcome.php | 17 +- includes/Admin/Customizer_Options.php | 128 + .../Admin/Dashboard_Metabox.php | 42 +- includes/Admin/Forms/Admin_Form.php | 449 + includes/Admin/Forms/Admin_Form_Builder.php | 361 + .../Forms/Admin_Form_Builder_Free.php} | 5 +- .../Admin/Forms/Admin_Form_Handler.php | 193 +- includes/Admin/Forms/Admin_Template.php | 789 + includes/Admin/Forms/Field_Manager.php | 303 + .../{class-form.php => Admin/Forms/Form.php} | 25 +- .../Forms/Form_Manager.php} | 40 +- .../Admin/Forms/Form_Template.php | 4 +- .../Forms/Post/Templates/Form_Template.php | 110 +- .../Templates/List_Table_Admin_Post_Forms.php | 18 +- .../Post_Form_Template_Events_Calendar.php} | 66 +- .../Templates/Post_Form_Template_Post.php | 8 +- .../Post_Form_Template_WooCommerce.php} | 103 +- .../Post/Templates/Pro_Form_Preview_EDD.php} | 7 +- includes/Admin/Forms/Template_Post.php | 355 + .../List_Table_Subscribers.php} | 30 +- .../Admin/List_Table_Transactions.php | 129 +- includes/Admin/Menu.php | 379 + includes/Admin/Plugin_Upgrade_Notice.php | 105 + includes/Admin/Posting.php | 617 + .../Admin/Promotion.php | 73 +- includes/Admin/Shortcodes_Button.php | 152 + includes/Admin/Subscription.php | 1396 + .../Upgrades.php} | 48 +- .../Admin/template-parts}/modal.php | 3 +- includes/Admin/views/post-form.php | 3 + .../views}/post-forms-list-table-view.php | 28 +- {admin => includes/Admin/views}/premium.php | 0 .../views}/shortcode-builder.php | 2 +- .../Admin/views}/subscribers.php | 14 +- .../html => includes/Admin/views}/support.php | 0 includes/Admin/views/tools.php | 57 + .../views/transactions-list-table-view.php | 7 +- includes/Ajax.php | 102 + .../Address_Form_Ajax.php} | 26 +- .../Ajax/Admin_Form_Builder_Ajax.php | 32 +- .../Frontend_Form_Ajax.php} | 932 +- .../Ajax/Upload_Ajax.php | 119 +- includes/Assets.php | 372 + .../Country_State.php} | 4 +- includes/{ => Data}/countries-formated.php | 0 includes/{ => Data}/countries.php | 0 .../Encryption_Helper.php | 27 +- .../Field_Contract.php} | 52 +- .../Form_Field_Checkbox.php} | 4 +- .../Form_Field_Column.php} | 74 +- .../Form_Field_Dropdown.php} | 4 +- .../Form_Field_Email.php} | 4 +- .../Form_Field_Featured_Image.php} | 12 +- .../Form_Field_HTML.php} | 4 +- .../Form_Field_Hidden.php} | 4 +- .../Form_Field_Image.php} | 10 +- .../Form_Field_MultiDropdown.php} | 6 +- .../Form_Field_Numeric.php} | 4 +- .../Form_Field_Post_Content.php} | 4 +- .../Form_Field_Post_Excerpt.php} | 5 +- .../Form_Field_Post_Tags.php} | 13 +- .../Form_Field_Post_Taxonomy.php} | 25 +- .../Form_Field_Post_Title.php} | 3 +- .../Form_Field_Post_Trait.php} | 4 +- .../Form_Field_Pro.php} | 4 +- .../Form_Field_Radio.php} | 4 +- .../Form_Field_SectionBreak.php} | 5 +- .../Form_Field_Text.php} | 4 +- .../Form_Field_Textarea.php} | 8 +- .../Form_Field_URL.php} | 4 +- .../Form_Field_reCaptcha.php} | 5 +- .../Form_Pro_Upgrade_Fields.php} | 66 +- .../Edit_Profile.php} | 10 +- .../Form_Element.php} | 32 +- .../{free/loader.php => Free/Free_Loader.php} | 684 +- .../{free/prompt.php => Free/Pro_Prompt.php} | 4 +- .../class-login.php => Free/Simple_Login.php} | 198 +- .../Subscription_Element.php} | 11 +- .../WPUF_Admin_Form_Free.php} | 11 +- .../Free/templates/page-registration-form.php | 164 + includes/Frontend.php | 195 + .../Form_Gutenberg_Block.php} | 63 +- .../Form_Preview.php} | 31 +- .../Frontend/Frontend_Account.php | 230 +- .../Frontend/Frontend_Dashboard.php | 77 +- includes/Frontend/Frontend_Form.php | 479 + includes/Frontend/Payment.php | 550 + .../Registration.php} | 183 +- includes/Frontend/Shortcode.php | 30 + includes/Frontend_Render_Form.php | 399 + .../{class-installer.php => Installer.php} | 4 +- .../WPUF_ACF_Compatibility.php} | 158 +- .../WPUF_Dokan_Integration.php} | 52 +- .../WPUF_WCMp_Integration.php} | 96 +- .../WPUF_WC_Vendors_Integration.php} | 189 +- .../{log/class-log.php => Log/WPUF_Log.php} | 2 +- .../WPUF_Log_WPDB_Query.php} | 0 includes/Pro_Upgrades.php | 95 + includes/Render_Form.php | 1639 ++ .../{setup-wizard.php => Setup_Wizard.php} | 72 +- includes/Traits/FieldableTrait.php | 742 + includes/Traits/TaxableTrait.php | 542 + ...subscription.php => User_Subscription.php} | 33 +- .../{class-privacy.php => WPUF_Privacy.php} | 5 + includes/{class-user.php => WPUF_User.php} | 10 +- .../Login_Widget.php} | 60 +- includes/Widgets/Manager.php | 54 + includes/class-customizer.php | 113 - includes/class-field-manager.php | 9 +- includes/class-frontend-render-form.php | 12 + includes/class-pro-upgrades.php | 119 - includes/class-whats-new.php | 137 - includes/free/admin/shortcode-button.php | 160 - includes/functions/settings-options.php | 657 + .../{free => functions/user}/edit-user.php | 2 - includes/upgrades/upgrade-2.1.9.php | 4 +- includes/upgrades/upgrade-2.6.0.php | 4 +- includes/upgrades/upgrade-4.0.4.php | 35 + languages/wp-user-frontend-ar.po | 10 +- languages/wp-user-frontend-es_ES.po | 4 +- languages/wp-user-frontend-fa_IR.po | 4 +- languages/wp-user-frontend-tr_TR.po | 4 +- languages/wp-user-frontend-zh_CN.po | 6 +- languages/wp-user-frontend.pot | 8948 ++++--- lib/appsero/Client.php | 148 +- lib/appsero/Insights.php | 1111 +- lib/appsero/License.php | 382 +- lib/appsero/Updater.php | 247 - lib/gateway/bank.php | 18 +- lib/gateway/paypal.php | 174 +- lib/invisible_recaptcha.php | 5 +- lib/recaptchalib.php | 576 +- lib/recaptchalib_noCaptcha.php | 2 +- package-lock.json | 21493 +++++----------- package.json | 2 +- phpcs.xml.dist | 30 +- readme.md | 197 +- readme.txt | 197 +- templates/account.php | 6 +- templates/dashboard.php | 2 +- templates/dashboard/billing-address.php | 4 +- templates/dashboard/edit-profile.php | 16 +- templates/dashboard/list.php | 3 +- templates/dashboard/posts.php | 5 +- templates/login-form.php | 8 +- templates/lost-pass-form.php | 12 +- templates/registration-form.php | 23 +- templates/reset-pass-form.php | 23 +- views/post-form.php | 3 - wpuf-functions.php | 370 +- wpuf.php | 771 +- 241 files changed, 35452 insertions(+), 29270 deletions(-) create mode 100644 .github/workflows/main.yml rename lib/class-wedevs-insights.php => Lib/WeDevs_Insights.php (62%) rename lib/class.settings-api.php => Lib/WeDevs_Settings_API.php (100%) create mode 100644 admin/class-plugin-upgrade-notice.php delete mode 100644 admin/form-builder/class-wpuf-admin-form-builder.php delete mode 100644 admin/form-builder/class-wpuf-form-builder-field-settings.php delete mode 100644 admin/form.php delete mode 100644 admin/html/whats-new.php delete mode 100644 admin/settings-options.php delete mode 100644 admin/tools.php create mode 100644 assets/css/admin/whats-new.css create mode 100644 assets/css/registration-forms.css create mode 100644 assets/images/doc.svg create mode 100644 assets/images/eye-close.svg create mode 100644 assets/images/eye.svg create mode 100644 assets/images/form-banner.svg create mode 100644 assets/images/icon-buddypress.svg create mode 100644 assets/images/icon-campaign-monitor.svg create mode 100644 assets/images/icon-checked.svg create mode 100644 assets/images/icon-convertkit.svg create mode 100644 assets/images/icon-doc.svg create mode 100644 assets/images/icon-getresponse.svg create mode 100644 assets/images/icon-groups.svg create mode 100644 assets/images/icon-mailchimp.svg create mode 100644 assets/images/icon-mailpoet.svg create mode 100644 assets/images/icon-mailpoet3.svg create mode 100644 assets/images/icon-mention.svg create mode 100644 assets/images/icon-money.svg create mode 100644 assets/images/icon-profile.svg create mode 100644 assets/images/icon-settings.svg create mode 100644 assets/images/icon-templates.svg create mode 100644 assets/images/wpuf-pro-2.svg create mode 100644 assets/js/admin/settings.js create mode 100644 assets/js/registration-forms.js rename assets/js/{selectWPUF/selectWPUF.full.js => selectWoo/selectWoo.full.js} (100%) rename assets/js/{selectWPUF/selectWPUF.full.min.js => selectWoo/selectWoo.full.min.js} (100%) rename assets/js/{selectWPUF/selectWPUF.js => selectWoo/selectWoo.js} (100%) rename assets/js/{selectWPUF/selectWPUF.min.js => selectWoo/selectWoo.min.js} (100%) create mode 100644 assets/less/registration-forms.less create mode 100644 assets/vendor/sweetalert2/sweetalert2.css create mode 100644 assets/vendor/sweetalert2/sweetalert2.js create mode 100644 assets/vendor/sweetalert2/sweetalert2.min.css create mode 100644 assets/vendor/sweetalert2/sweetalert2.min.js delete mode 100644 class/admin-asset-loader.php delete mode 100644 class/asset-loader.php delete mode 100644 class/payment.php create mode 100644 includes/Admin.php create mode 100644 includes/Admin/Admin_Installer.php create mode 100644 includes/Admin/Admin_Settings.php rename admin/class-admin-subscription.php => includes/Admin/Admin_Subscription.php (93%) rename admin/class-tools.php => includes/Admin/Admin_Tools.php (71%) rename admin/class-admin-welcome.php => includes/Admin/Admin_Welcome.php (75%) create mode 100644 includes/Admin/Customizer_Options.php rename admin/dashboard-metabox.php => includes/Admin/Dashboard_Metabox.php (89%) create mode 100644 includes/Admin/Forms/Admin_Form.php create mode 100644 includes/Admin/Forms/Admin_Form_Builder.php rename includes/{free/admin/form-builder/class-wpuf-form-builder-free.php => Admin/Forms/Admin_Form_Builder_Free.php} (71%) rename admin/form-handler.php => includes/Admin/Forms/Admin_Form_Handler.php (68%) create mode 100644 includes/Admin/Forms/Admin_Template.php create mode 100755 includes/Admin/Forms/Field_Manager.php rename includes/{class-form.php => Admin/Forms/Form.php} (93%) rename includes/{class-form-manager.php => Admin/Forms/Form_Manager.php} (85%) rename class/post-form-template.php => includes/Admin/Forms/Form_Template.php (97%) rename admin/form-template.php => includes/Admin/Forms/Post/Templates/Form_Template.php (65%) rename admin/post-forms-list-table.php => includes/Admin/Forms/Post/Templates/List_Table_Admin_Post_Forms.php (97%) rename includes/{free/post-form-templates/the_events_calendar.php => Admin/Forms/Post/Templates/Post_Form_Template_Events_Calendar.php} (80%) rename class/post-form-templates/post.php => includes/Admin/Forms/Post/Templates/Post_Form_Template_Post.php (97%) rename includes/{free/post-form-templates/woocommerce.php => Admin/Forms/Post/Templates/Post_Form_Template_WooCommerce.php} (82%) rename includes/{free/post-form-templates/easy_digital_download.php => Admin/Forms/Post/Templates/Pro_Form_Preview_EDD.php} (88%) create mode 100644 includes/Admin/Forms/Template_Post.php rename includes/{class-list-table-subscribers.php => Admin/List_Table_Subscribers.php} (89%) rename class/transactions-list-table.php => includes/Admin/List_Table_Transactions.php (87%) create mode 100644 includes/Admin/Menu.php create mode 100644 includes/Admin/Plugin_Upgrade_Notice.php create mode 100644 includes/Admin/Posting.php rename admin/promotion.php => includes/Admin/Promotion.php (79%) create mode 100644 includes/Admin/Shortcodes_Button.php create mode 100644 includes/Admin/Subscription.php rename includes/{class-upgrades.php => Admin/Upgrades.php} (60%) rename {admin/html => includes/Admin/template-parts}/modal.php (97%) create mode 100644 includes/Admin/views/post-form.php rename {admin => includes/Admin/views}/post-forms-list-table-view.php (58%) rename {admin => includes/Admin/views}/premium.php (100%) rename includes/{free/admin => Admin/views}/shortcode-builder.php (98%) rename {admin => includes/Admin/views}/subscribers.php (63%) rename {admin/html => includes/Admin/views}/support.php (100%) create mode 100644 includes/Admin/views/tools.php rename admin/transactions.php => includes/Admin/views/transactions-list-table-view.php (57%) create mode 100644 includes/Ajax.php rename includes/{class-billing-address.php => Ajax/Address_Form_Ajax.php} (94%) rename admin/form-builder/class-wpuf-admin-form-builder-ajax.php => includes/Ajax/Admin_Form_Builder_Ajax.php (88%) rename includes/{class-frontend-form-post.php => Ajax/Frontend_Form_Ajax.php} (66%) mode change 100755 => 100644 rename class/upload.php => includes/Ajax/Upload_Ajax.php (81%) create mode 100644 includes/Assets.php rename includes/{countries-state.php => Data/Country_State.php} (99%) rename includes/{ => Data}/countries-formated.php (100%) rename includes/{ => Data}/countries.php (100%) rename class/encryption-helper.php => includes/Encryption_Helper.php (82%) rename includes/{fields/class-abstract-fields.php => Fields/Field_Contract.php} (93%) rename includes/{fields/class-field-checkbox.php => Fields/Form_Field_Checkbox.php} (98%) rename includes/{fields/class-field-column.php => Fields/Form_Field_Column.php} (59%) rename includes/{fields/class-field-dropdown.php => Fields/Form_Field_Dropdown.php} (98%) rename includes/{fields/class-field-email.php => Fields/Form_Field_Email.php} (98%) rename includes/{fields/class-field-featured-image.php => Fields/Form_Field_Featured_Image.php} (95%) rename includes/{fields/class-field-html.php => Fields/Form_Field_HTML.php} (96%) rename includes/{fields/class-field-hidden.php => Fields/Form_Field_Hidden.php} (96%) rename includes/{fields/class-field-image.php => Fields/Form_Field_Image.php} (96%) rename includes/{fields/class-field-multidropdown.php => Fields/Form_Field_MultiDropdown.php} (97%) rename includes/{fields/class-field-numeric.php => Fields/Form_Field_Numeric.php} (89%) rename includes/{fields/class-field-post-content.php => Fields/Form_Field_Post_Content.php} (98%) rename includes/{fields/class-field-post-excerpt.php => Fields/Form_Field_Post_Excerpt.php} (98%) rename includes/{fields/class-field-post-tags.php => Fields/Form_Field_Post_Tags.php} (90%) rename includes/{fields/class-field-post-taxonomy.php => Fields/Form_Field_Post_Taxonomy.php} (94%) rename includes/{fields/class-field-post-title.php => Fields/Form_Field_Post_Title.php} (98%) rename includes/{fields/field-trait.php => Fields/Form_Field_Post_Trait.php} (93%) rename includes/{fields/class-field-pro.php => Fields/Form_Field_Pro.php} (92%) rename includes/{fields/class-field-radio.php => Fields/Form_Field_Radio.php} (98%) rename includes/{fields/class-field-sectionbreak.php => Fields/Form_Field_SectionBreak.php} (97%) rename includes/{fields/class-field-text.php => Fields/Form_Field_Text.php} (98%) rename includes/{fields/class-field-textarea.php => Fields/Form_Field_Textarea.php} (98%) rename includes/{fields/class-field-url.php => Fields/Form_Field_URL.php} (98%) rename includes/{fields/class-field-recaptcha.php => Fields/Form_Field_reCaptcha.php} (98%) rename includes/{fields/class-pro-upgrade-fields.php => Fields/Form_Pro_Upgrade_Fields.php} (64%) rename includes/{free/edit-profile.php => Free/Edit_Profile.php} (99%) rename includes/{free/form-element.php => Free/Form_Element.php} (97%) rename includes/{free/loader.php => Free/Free_Loader.php} (83%) rename includes/{free/prompt.php => Free/Pro_Prompt.php} (94%) rename includes/{free/class-login.php => Free/Simple_Login.php} (86%) rename includes/{free/subscription.php => Free/Subscription_Element.php} (70%) rename includes/{free/form.php => Free/WPUF_Admin_Form_Free.php} (57%) create mode 100644 includes/Free/templates/page-registration-form.php create mode 100644 includes/Frontend.php rename includes/{class-gutenblock.php => Frontend/Form_Gutenberg_Block.php} (72%) rename includes/{class-form-preview.php => Frontend/Form_Preview.php} (83%) rename class/frontend-account.php => includes/Frontend/Frontend_Account.php (77%) rename class/frontend-dashboard.php => includes/Frontend/Frontend_Dashboard.php (81%) create mode 100755 includes/Frontend/Frontend_Form.php create mode 100644 includes/Frontend/Payment.php rename includes/{free/class-registration.php => Frontend/Registration.php} (78%) create mode 100644 includes/Frontend/Shortcode.php create mode 100644 includes/Frontend_Render_Form.php rename includes/{class-installer.php => Installer.php} (98%) rename includes/{class-acf.php => Integrations/WPUF_ACF_Compatibility.php} (57%) rename includes/{class-dokan-integration.php => Integrations/WPUF_Dokan_Integration.php} (91%) rename includes/{class-wcmp-integration.php => Integrations/WPUF_WCMp_Integration.php} (85%) rename includes/{class-wc-vendors-integration.php => Integrations/WPUF_WC_Vendors_Integration.php} (57%) rename includes/{log/class-log.php => Log/WPUF_Log.php} (88%) rename includes/{log/class-log-wpdb-query.php => Log/WPUF_Log_WPDB_Query.php} (100%) create mode 100755 includes/Pro_Upgrades.php create mode 100644 includes/Render_Form.php rename includes/{setup-wizard.php => Setup_Wizard.php} (86%) create mode 100644 includes/Traits/FieldableTrait.php create mode 100644 includes/Traits/TaxableTrait.php rename includes/{class-user-subscription.php => User_Subscription.php} (94%) rename includes/{class-privacy.php => WPUF_Privacy.php} (99%) rename includes/{class-user.php => WPUF_User.php} (96%) rename includes/{class-login-widget.php => Widgets/Login_Widget.php} (93%) create mode 100644 includes/Widgets/Manager.php delete mode 100644 includes/class-customizer.php delete mode 100755 includes/class-pro-upgrades.php delete mode 100644 includes/class-whats-new.php delete mode 100644 includes/free/admin/shortcode-button.php create mode 100644 includes/functions/settings-options.php rename includes/{free => functions/user}/edit-user.php (99%) create mode 100644 includes/upgrades/upgrade-4.0.4.php mode change 100755 => 100644 lib/appsero/Client.php mode change 100755 => 100644 lib/appsero/Insights.php mode change 100755 => 100644 lib/appsero/License.php delete mode 100755 lib/appsero/Updater.php delete mode 100644 views/post-form.php diff --git a/.gitattributes b/.gitattributes index 06eb30990..670878dc5 100644 --- a/.gitattributes +++ b/.gitattributes @@ -4,11 +4,9 @@ .gitignore export-ignore .jshintrc export-ignore .php_cs.dist export-ignore -.svnignore export-ignore +.php_cs export-ignore +.github export-ignore Gruntfile.js export-ignore -appsero.json export-ignore -composer.json export-ignore -composer.lock export-ignore docs.md export-ignore package-lock.json export-ignore package.json export-ignore diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml new file mode 100644 index 000000000..56e36596c --- /dev/null +++ b/.github/workflows/main.yml @@ -0,0 +1,16 @@ +name: Plugin asset/readme update +on: + push: + branches: + - trunk +jobs: + trunk: + name: Push to trunk + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@master + - name: WordPress.org plugin asset/readme update + uses: 10up/action-wordpress-plugin-asset-update@stable + env: + SVN_PASSWORD: ${{ secrets.SVN_PASSWORD }} + SVN_USERNAME: ${{ secrets.SVN_USERNAME }} diff --git a/Gruntfile.js b/Gruntfile.js index 9c4d0518e..ac35c92f0 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -27,7 +27,9 @@ module.exports = function(grunt) { admin: { files: { '<%= dirs.css %>/wpuf-form-builder.css': ['admin/form-builder/assets/less/form-builder.less'], - '<%= dirs.css %>/admin.css': ['<%= dirs.less %>/admin.less'] + '<%= dirs.css %>/admin.css': ['<%= dirs.less %>/admin.less'], + '<%= dirs.css %>/admin/whats-new.css': ['<%= dirs.less %>/whats-new.less'], + '<%= dirs.css %>/registration-forms.css': ['<%= dirs.less %>/registration-forms.less'] } } }, @@ -137,7 +139,6 @@ module.exports = function(grunt) { '!**/readme.md', '!**/docs.md', '!**/*~', - '!vendor/**', '!**/log.txt', '!**/package-lock.json', '!**/appsero.json', diff --git a/lib/class-wedevs-insights.php b/Lib/WeDevs_Insights.php similarity index 62% rename from lib/class-wedevs-insights.php rename to Lib/WeDevs_Insights.php index 0629eca1b..702fc4bb8 100644 --- a/lib/class-wedevs-insights.php +++ b/Lib/WeDevs_Insights.php @@ -1,5 +1,7 @@ */ -class WPUF_WeDevs_Insights { +class WeDevs_Insights { + /** + * @var object|Appsero\Insights|Insights + */ + public $insights; /** * Initialize the class */ public function __construct( $file ) { - if ( ! class_exists( 'Appsero\Client' ) ) { - require_once __DIR__ . '/appsero/Client.php'; + require_once WPUF_ROOT . '/Lib/Appsero/Client.php'; } $client = new Appsero\Client( '958afc63-99f8-4b98-b321-fcbc5cf95694', 'WP User Frontend', $file ); - $this->insights = $client->insights(); - - // Active insights + $this->insights->client = $client; $this->insights->init(); - } +// $client = new Appsero\Client( '958afc63-99f8-4b98-b321-fcbc5cf95694', 'WP User Frontend', $file ); +// $this->insights = $client->insights(); +// $this->insights->init(); + } } endif; diff --git a/lib/class.settings-api.php b/Lib/WeDevs_Settings_API.php similarity index 100% rename from lib/class.settings-api.php rename to Lib/WeDevs_Settings_API.php diff --git a/admin/class-admin-settings.php b/admin/class-admin-settings.php index db955c849..1aaa7163b 100644 --- a/admin/class-admin-settings.php +++ b/admin/class-admin-settings.php @@ -3,26 +3,28 @@ /** * WPUF settings */ + +#[AllowDynamicProperties] class WPUF_Admin_Settings { /** * Settings API * - * @var \WeDevs_Settings_API + * @var WeDevs_Settings_API */ private $settings_api; /** * Static instance of this class * - * @var \self + * @var self */ private static $_instance; /** * Public instance of this class * - * @var \self + * @var self */ public $subscribers_list_table_obj; @@ -490,9 +492,18 @@ public function enqueue_styles() { wp_localize_script( 'wpuf-admin-script', 'wpuf_admin_script', [ - 'ajaxurl' => admin_url( 'admin-ajax.php' ), - 'nonce' => wp_create_nonce( 'wpuf_nonce' ), - 'cleared_schedule_lock' => __( 'Post lock has been cleared', 'wp-user-frontend' ), + 'ajaxurl' => admin_url( 'admin-ajax.php' ), + 'nonce' => wp_create_nonce( 'wpuf_nonce' ), + 'cleared_schedule_lock' => __( 'Post lock has been cleared', 'wp-user-frontend' ), + 'protected_shortcodes' => wpuf_get_protected_shortcodes(), + 'protected_shortcodes_message' => sprintf( + __( '%sThis post contains a sensitive short-code %s, that may allow others to sign-up with distinguished roles. If unsure, remove the short-code before publishing (recommended) %sas this may be exploited as a security vulnerability.%s', 'wp-user-frontend' ), + '
', + '[wpuf-registration]', + '', + '', + '
' + ) ] ); } @@ -603,6 +614,10 @@ public function enable_json_upload( $file ) { public function import_forms() { check_ajax_referer( 'wpuf_admin_tools' ); + if ( ! current_user_can( wpuf_admin_role() ) ) { + wp_send_json_error( __( 'You do not have sufficient permissions to do this action', 'wp-user-frontend' ) ); + } + if ( ! isset( $_POST['file_id'] ) ) { wp_send_json_error( new WP_Error( 'wpuf_ajax_import_forms_error', __( 'Missing file_id param', 'wp-user-frontend' ) ), diff --git a/admin/class-plugin-upgrade-notice.php b/admin/class-plugin-upgrade-notice.php new file mode 100644 index 000000000..89e7fad0a --- /dev/null +++ b/admin/class-plugin-upgrade-notice.php @@ -0,0 +1,105 @@ +plugin_path = trailingslashit( dirname( $plugin_file ) ); + $plugin_dir = trailingslashit( basename( $this->plugin_path ) ); + $file = $plugin_dir . basename( $plugin_file ); + + // WordPress dynamic hook + add_action( 'in_plugin_update_message-' . $file, [ $this, 'maybe_display_message' ] ); + } + + /** + * Display notice upon checking + * + * @since 3.6.6 + * + * @return void + */ + public function maybe_display_message() { + $this->check_for_notice(); + + if ( $this->upgrade_notice ) { + $this->render_notice(); + } + } + + /** + * Tests to see if an upgrade notice is available. + * + * @since 3.6.6 + * + * @return void + */ + protected function check_for_notice() { + $notice_url = 'https://raw.githubusercontent.com/weDevsOfficial/wpuf-util/master/upgrade-notice.json'; + $response = wp_remote_get( $notice_url, [ 'timeout' => 15 ] ); + $notice = wp_remote_retrieve_body( $response ); + + if ( is_wp_error( $response ) || ( 200 !== $response['response']['code'] ) ) { + $notice = '[]'; + } + + $notice = json_decode( $notice, true ); + + if ( empty( $notice ) ) { + return; + } + + $min_version = ! empty( $notice['min-version'] ) ? $notice['min-version'] : ''; + + if ( version_compare( WPUF_VERSION, $min_version, '>=' ) ) { + return; + } + + $this->upgrade_notice = ! empty( $notice['message'] ) ? $notice['message'] : ''; + } + + /** + * Render the notice under new version available message + * + * @since 3.6.6 + * + * @return void + */ + public function render_notice() { + $notice = wp_kses_post( $this->upgrade_notice ); + echo "
$notice
"; + } +} diff --git a/admin/form-builder/assets/js/components/builder-stage/index.js b/admin/form-builder/assets/js/components/builder-stage/index.js index 1e50a05ae..ead333cb7 100644 --- a/admin/form-builder/assets/js/components/builder-stage/index.js +++ b/admin/form-builder/assets/js/components/builder-stage/index.js @@ -101,7 +101,7 @@ Vue.component('builder-stage', { // check if these are already inserted if ( this.isSingleInstance( field.template ) && this.containsField( field.template ) ) { - new swal({ + Swal.fire({ title: "Oops...", text: "You already have this field in the form" }); @@ -114,15 +114,17 @@ Vue.component('builder-stage', { delete_field: function(index) { var self = this; - (new swal({ + (Swal.fire({ text: self.i18n.delete_field_warn_msg, - type: 'warning', + icon: 'warning', showCancelButton: true, confirmButtonColor: '#d54e21', confirmButtonText: self.i18n.yes_delete_it, cancelButtonText: self.i18n.no_cancel_it, - confirmButtonClass: 'btn btn-success', - cancelButtonClass: 'btn btn-danger', + customClass: { + confirmButton: 'btn btn-success', + cancelButton: 'btn btn-danger', + } })).then((result) => { if (result.isConfirmed) { self.$store.commit('delete_form_field_element', index); diff --git a/admin/form-builder/assets/js/components/builder-stage/template.php b/admin/form-builder/assets/js/components/builder-stage/template.php index 102b80f9e..bbab45717 100644 --- a/admin/form-builder/assets/js/components/builder-stage/template.php +++ b/admin/form-builder/assets/js/components/builder-stage/template.php @@ -52,7 +52,7 @@
  •  
    - +
  • @@ -77,5 +77,5 @@ - + diff --git a/admin/form-builder/assets/js/components/field-visibility/index.js b/admin/form-builder/assets/js/components/field-visibility/index.js index 1622ba1a3..aab07acc4 100644 --- a/admin/form-builder/assets/js/components/field-visibility/index.js +++ b/admin/form-builder/assets/js/components/field-visibility/index.js @@ -54,4 +54,4 @@ Vue.component('field-visibility', { this.update_value('selected', new_val); } } -}); \ No newline at end of file +}); diff --git a/admin/form-builder/assets/js/components/field-visibility/template.php b/admin/form-builder/assets/js/components/field-visibility/template.php index 3f17a7163..02b1fc6ac 100644 --- a/admin/form-builder/assets/js/components/field-visibility/template.php +++ b/admin/form-builder/assets/js/components/field-visibility/template.php @@ -13,7 +13,9 @@
    - +
      get_subscriptions(); + $subscriptions = wpuf()->subscription->get_subscriptions(); if ( $subscriptions ) { foreach ( $subscriptions as $pack ) { @@ -54,4 +56,4 @@
    - \ No newline at end of file + diff --git a/admin/form-builder/assets/js/components/form-column_field/index.js b/admin/form-builder/assets/js/components/form-column_field/index.js index 087804ca5..c1adddbb8 100644 --- a/admin/form-builder/assets/js/components/form-column_field/index.js +++ b/admin/form-builder/assets/js/components/form-column_field/index.js @@ -181,7 +181,7 @@ Vue.component('form-column_field', { }; if (this.isAllowedInClolumnField(data.field_template)) { - new swal({ + Swal.fire({ title: "Oops...", text: "You cannot add this field as inner column field" }); @@ -190,7 +190,7 @@ Vue.component('form-column_field', { // check if these are already inserted if ( this.isSingleInstance( data.field_template ) && this.containsField( data.field_template ) ) { - new swal({ + Swal.fire({ title: "Oops...", text: "You already have this field in the form" }); @@ -258,7 +258,7 @@ Vue.component('form-column_field', { // check if the field is allowed to duplicate if ( self.isSingleInstance( field.template ) ) { - new swal({ + Swal.fire({ title: "Oops...", text: "You already have this field in the form" }); @@ -276,18 +276,20 @@ Vue.component('form-column_field', { fromColumn: fromColumn }; - (new swal({ + Swal.fire({ text: self.i18n.delete_field_warn_msg, - type: 'warning', + icon: 'warning', showCancelButton: true, confirmButtonColor: '#d54e21', confirmButtonText: self.i18n.yes_delete_it, cancelButtonText: self.i18n.no_cancel_it, - confirmButtonClass: 'btn btn-success', - cancelButtonClass: 'btn btn-danger', - })).then((result) => { + customClass: { + confirmButton: 'btn btn-success', + cancelButton: 'btn btn-danger' + }, + }).then((result) => { if (result.isConfirmed) { - self.$store.commit('delete_form_field_element', index); + self.$store.commit('delete_column_field_element', payload); } }); }, diff --git a/admin/form-builder/assets/js/components/form-fields/index.js b/admin/form-builder/assets/js/components/form-fields/index.js index c6267ff1d..43f2d3d16 100644 --- a/admin/form-builder/assets/js/components/form-fields/index.js +++ b/admin/form-builder/assets/js/components/form-fields/index.js @@ -42,16 +42,16 @@ Vue.component('form-fields', { alert_pro_feature: function (field) { var title = this.field_settings[field].title; - new swal({ + Swal.fire({ title: ' ' + title + '
    ' + this.i18n.is_a_pro_feature, text: this.i18n.pro_feature_msg, - type: '', + icon: '', showCancelButton: true, cancelButtonText: this.i18n.close, confirmButtonColor: '#46b450', confirmButtonText: this.i18n.upgrade_to_pro - }).then(function (is_confirm) { - if (is_confirm) { + }).then(function (result) { + if (result.isConfirmed) { window.open(wpuf_form_builder.pro_link, '_blank'); } diff --git a/admin/form-builder/assets/js/form-builder.js b/admin/form-builder/assets/js/form-builder.js index 3f575dff2..8349eb77a 100644 --- a/admin/form-builder/assets/js/form-builder.js +++ b/admin/form-builder/assets/js/form-builder.js @@ -161,8 +161,8 @@ var el = $('#form-preview-stage .wpuf-form .field-items').eq(payload.toIndex); if ('yes' == payload.field.is_meta && state.show_custom_field_tooltip) { - var image_one = wpuf_assets_url.url + '/images/custom-fields/settings.png'; - var image_two = wpuf_assets_url.url + '/images/custom-fields/advance.png'; + var image_one = wpuf_admin_script.asset_url + '/images/custom-fields/settings.png'; + var image_two = wpuf_admin_script.asset_url + '/images/custom-fields/advance.png'; var html = '
    '; html += '
    '; html += sprintf( '

    %s%s%s"

    ', __( 'Navigate through', 'wp-user-frontend' ), __( 'WP-admin > WPUF > Settings > Frontend Posting', 'wp-user-frontend' ), __( '- there you have to check the checkbox: "Show custom field data in the post content area', 'wp-user-frontend' ) ); @@ -173,18 +173,20 @@ html += 'custom field data'; html += '
    '; html += '
    '; - new swal({ + Swal.fire({ title: __( 'Do you want to show custom field data inside your post ?', 'wp-user-frontend' ), html: html, showCancelButton: true, confirmButtonColor: '#d54e21', confirmButtonText: "Don't show again", cancelButtonText: 'Okay', - confirmButtonClass: 'btn btn-success', - cancelButtonClass: 'btn btn-success', + customClass: { + confirmButton: 'btn btn-success', + cancelButton: 'btn btn-success', + }, cancelButtonColor: '#007cba' }).then((result) => { - if (result) { + if (result.isConfirmed) { state.show_custom_field_tooltip = false; } else { @@ -282,14 +284,8 @@ if (state.form_fields[columnFieldIndex].inner_fields[payload.toWhichColumn] === undefined) { state.form_fields[columnFieldIndex].inner_fields[payload.toWhichColumn] = []; - } - - if (state.form_fields[columnFieldIndex].inner_fields[payload.toWhichColumn] !== undefined) { - var innerColumnFields = state.form_fields[columnFieldIndex].inner_fields[payload.toWhichColumn]; - - if ( innerColumnFields.filter(innerField => innerField.name === payload.field.name).length <= 0 ) { - state.form_fields[columnFieldIndex].inner_fields[payload.toWhichColumn].splice(payload.toIndex, 0, payload.field); - } + } else { + state.form_fields[columnFieldIndex].inner_fields[payload.toWhichColumn].splice( payload.toIndex, 0, payload.field ); } }, diff --git a/admin/form-builder/assets/js/mixins/global.js b/admin/form-builder/assets/js/mixins/global.js index 23224b523..60ecffd03 100644 --- a/admin/form-builder/assets/js/mixins/global.js +++ b/admin/form-builder/assets/js/mixins/global.js @@ -27,7 +27,7 @@ Vue.mixin({ cancelButtonText: this.i18n.cancel, }, settings); - new swal(settings, callback); + Swal.fire(settings, callback); }, is_failed_to_validate: function (template) { diff --git a/admin/form-builder/assets/less/builder-responsive.less b/admin/form-builder/assets/less/builder-responsive.less index 9dddf8c5c..87549f7b4 100644 --- a/admin/form-builder/assets/less/builder-responsive.less +++ b/admin/form-builder/assets/less/builder-responsive.less @@ -106,7 +106,7 @@ } ul.wpuf-form li.country_list, - ul.wpuf-form li.address_field, { + ul.wpuf-form li.address_field { max-width: 200px; } diff --git a/admin/form-builder/class-wpuf-admin-form-builder.php b/admin/form-builder/class-wpuf-admin-form-builder.php deleted file mode 100644 index dd75388f1..000000000 --- a/admin/form-builder/class-wpuf-admin-form-builder.php +++ /dev/null @@ -1,363 +0,0 @@ - '', // e.g 'post', 'profile' etc - 'post_type' => '', // e.g 'wpuf_forms', 'wpuf_profile' etc, - 'form_settings_key' => '', - 'post_id' => 0, - 'shortcodes' => [], // [ [ 'name' => 'wpuf_form', 'type' => 'profile' ], [ 'name' => 'wpuf_form', 'type' => 'registration' ] ] - ]; - - $this->settings = wp_parse_args( $settings, $defaults ); - - // set post data to global $post - $post = get_post( $this->settings['post_id'] ); - - // if we have an existing post, then let's start - if ( !empty( $post->ID ) ) { - add_action( 'in_admin_header', [ $this, 'remove_admin_notices' ] ); - add_action( 'admin_enqueue_scripts', [ $this, 'admin_enqueue_scripts' ] ); - add_action( 'admin_print_scripts', [ $this, 'admin_print_scripts' ] ); - add_action( 'admin_footer', [ $this, 'custom_dequeue' ] ); - add_action( 'admin_footer', [ $this, 'admin_footer' ] ); - add_action( 'wpuf-admin-form-builder', [ $this, 'include_form_builder' ] ); - } - } - - /** - * Remove all kinds of admin notices - * - * Since we don't have much space left on top of the page, - * we have to remove all kinds of admin notices - * - * @since 2.5 - * - * @return void - */ - public function remove_admin_notices() { - remove_all_actions( 'network_admin_notices' ); - remove_all_actions( 'user_admin_notices' ); - remove_all_actions( 'admin_notices' ); - remove_all_actions( 'all_admin_notices' ); - } - - /** - * Enqueue admin scripts - * - * @since 2.5 - * - * @return void - */ - public function admin_enqueue_scripts() { - global $post; - - /* - * CSS - */ - wp_enqueue_style( 'wpuf-css', WPUF_ASSET_URI . '/css/frontend-forms.css' ); - wp_enqueue_style( 'wpuf-font-awesome', WPUF_ASSET_URI . '/vendor/font-awesome/css/font-awesome.min.css', [], WPUF_VERSION ); - wp_enqueue_style( 'wpuf-sweetalert2', WPUF_ASSET_URI . '/vendor/sweetalert2/dist/sweetalert2.css', [], '11.4.30' ); - wp_enqueue_style( 'wpuf-selectize', WPUF_ASSET_URI . '/vendor/selectize/css/selectize.default.css', [], WPUF_VERSION ); - wp_enqueue_style( 'wpuf-toastr', WPUF_ASSET_URI . '/vendor/toastr/toastr.min.css', [], WPUF_VERSION ); - wp_enqueue_style( 'wpuf-tooltip', WPUF_ASSET_URI . '/vendor/tooltip/tooltip.css', [], WPUF_VERSION ); - - $form_builder_css_deps = apply_filters( 'wpuf-form-builder-css-deps', [ - 'wpuf-css', 'wpuf-font-awesome', 'wpuf-sweetalert2', 'wpuf-selectize', 'wpuf-toastr', 'wpuf-tooltip', - ] ); - - wp_enqueue_style( 'wpuf-form-builder', WPUF_ASSET_URI . '/css/wpuf-form-builder.css', $form_builder_css_deps, WPUF_VERSION ); - - wp_enqueue_style( 'jquery-ui', WPUF_ASSET_URI . '/css/jquery-ui-1.9.1.custom.css' ); - - do_action( 'wpuf-form-builder-enqueue-style' ); - - /** - * JavaScript - */ - $prefix = ( defined( 'SCRIPT_DEBUG' ) && SCRIPT_DEBUG ) ? '' : '.min'; - - wp_enqueue_script( 'wpuf-vue', WPUF_ASSET_URI . '/vendor/vue/vue' . $prefix . '.js', [], WPUF_VERSION, true ); - wp_enqueue_script( 'wpuf-vuex', WPUF_ASSET_URI . '/vendor/vuex/vuex' . $prefix . '.js', [ 'wpuf-vue' ], WPUF_VERSION, true ); - wp_enqueue_script( 'wpuf-sweetalert2', WPUF_ASSET_URI . '/vendor/sweetalert2/dist/sweetalert2.js', [], '11.4.30', true ); - wp_enqueue_script( 'wpuf-jquery-scrollTo', WPUF_ASSET_URI . '/vendor/jquery.scrollTo/jquery.scrollTo' . $prefix . '.js', [ 'jquery' ], WPUF_VERSION, true ); - wp_enqueue_script( 'wpuf-selectize', WPUF_ASSET_URI . '/vendor/selectize/js/standalone/selectize' . $prefix . '.js', [ 'jquery' ], WPUF_VERSION, true ); - wp_enqueue_script( 'wpuf-toastr', WPUF_ASSET_URI . '/vendor/toastr/toastr' . $prefix . '.js', [], WPUF_VERSION, true ); - wp_enqueue_script( 'wpuf-clipboard', WPUF_ASSET_URI . '/vendor/clipboard/clipboard' . $prefix . '.js', [], WPUF_VERSION, true ); - wp_enqueue_script( 'wpuf-tooltip', WPUF_ASSET_URI . '/vendor/tooltip/tooltip' . $prefix . '.js', [], WPUF_VERSION, true ); - - $form_builder_js_deps = apply_filters( 'wpuf-form-builder-js-deps', [ - 'jquery', 'jquery-ui-sortable', 'jquery-ui-draggable', 'jquery-ui-droppable', 'jquery-ui-resizable', 'underscore', - 'wpuf-vue', 'wpuf-vuex', 'wpuf-sweetalert2', 'wpuf-jquery-scrollTo', - 'wpuf-selectize', 'wpuf-toastr', 'wpuf-clipboard', 'wpuf-tooltip', - ] ); - - $single_objects = [ - 'post_title', - 'post_content', - 'post_excerpt', - 'featured_image', - 'user_login', - 'first_name', - 'last_name', - 'nickname', - 'user_email', - 'user_url', - 'user_bio', - 'password', - 'user_avatar', - 'taxonomy' - ]; - $taxonomy_terms = array_keys( get_taxonomies() ); - $single_objects = array_merge( $single_objects, $taxonomy_terms ); - - wp_enqueue_script( 'wpuf-form-builder-mixins', WPUF_ASSET_URI . '/js/wpuf-form-builder-mixins.js', $form_builder_js_deps, WPUF_VERSION, true ); - wp_localize_script( 'wpuf-form-builder-mixins', 'wpuf_single_objects', $single_objects ); - do_action( 'wpuf-form-builder-enqueue-after-mixins' ); - - wp_enqueue_script( 'wpuf-form-builder-components', WPUF_ASSET_URI . '/js/wpuf-form-builder-components.js', [ 'wpuf-form-builder-mixins' ], WPUF_VERSION, true ); - - do_action( 'wpuf-form-builder-enqueue-after-components' ); - - wp_enqueue_script( 'jquery-ui-timepicker', WPUF_ASSET_URI . '/js/jquery-ui-timepicker-addon.js', [ 'jquery-ui-datepicker' ] ); - - wp_enqueue_script( 'wpuf-form-builder', WPUF_ASSET_URI . '/js/wpuf-form-builder.js', [ 'wpuf-form-builder-components' ], WPUF_VERSION, true ); - - do_action( 'wpuf-form-builder-enqueue-after-main-instance' ); - - /* - * Data required for building the form - */ - require_once WPUF_ROOT . '/admin/form-builder/class-wpuf-form-builder-field-settings.php'; - require_once WPUF_ROOT . '/includes/free/prompt.php'; - - $wpuf_form_builder = apply_filters( 'wpuf-form-builder-localize-script', [ - 'i18n' => $this->i18n(), - 'post' => $post, - 'form_fields' => wpuf_get_form_fields( $post->ID ), - 'panel_sections' => wpuf()->fields->get_field_groups(), - 'field_settings' => wpuf()->fields->get_js_settings(), - 'form_settings' => wpuf_get_form_settings( $post->ID ), - 'notifications' => wpuf_get_form_notifications( $post->ID ), - 'pro_link' => WPUF_Pro_Prompt::get_pro_url(), - 'site_url' => site_url( '/' ), - 'recaptcha_site' => wpuf_get_option( 'recaptcha_public', 'wpuf_general' ), - 'recaptcha_secret' => wpuf_get_option( 'recaptcha_private', 'wpuf_general' ), - 'nonce' => wp_create_nonce( 'form-builder-setting-nonce' ) - ] ); - - $wpuf_form_builder = wpuf_unset_conditional( $wpuf_form_builder ); - - wp_localize_script( 'wpuf-form-builder-mixins', 'wpuf_form_builder', $wpuf_form_builder ); - - // mixins - $wpuf_mixins = [ - 'root' => apply_filters( 'wpuf-form-builder-js-root-mixins', [] ), - 'builder_stage' => apply_filters( 'wpuf-form-builder-js-builder-stage-mixins', [] ), - 'form_fields' => apply_filters( 'wpuf-form-builder-js-form-fields-mixins', [] ), - 'field_options' => apply_filters( 'wpuf-form-builder-js-field-options-mixins', [] ), - ]; - - wp_localize_script( 'wpuf-form-builder-mixins', 'wpuf_mixins', $wpuf_mixins ); - } - - /** - * Print js scripts in admin head - * - * @since 2.5 - * - * @return void - */ - public function admin_print_scripts() { - ?> - - - - settings['post_id']; - $form_type = $this->settings['form_type']; - $post_type = $this->settings['post_type']; - $form_settings_key = $this->settings['form_settings_key']; - $shortcodes = $this->settings['shortcodes']; - - $forms = get_posts( [ 'post_type' => $post_type, 'post_status' => 'any' ] ); - - include WPUF_ROOT . '/admin/form-builder/views/form-builder.php'; - } - - /** - * i18n translatable strings - * - * @since 2.5 - * - * @return array - */ - private function i18n() { - return apply_filters( 'wpuf-form-builder-i18n', [ - 'advanced_options' => __( 'Advanced Options', 'wp-user-frontend' ), - 'delete_field_warn_msg' => __( 'Are you sure you want to delete this field?', 'wp-user-frontend' ), - 'yes_delete_it' => __( 'Yes, delete it', 'wp-user-frontend' ), - 'no_cancel_it' => __( 'No, cancel it', 'wp-user-frontend' ), - 'ok' => __( 'OK', 'wp-user-frontend' ), - 'cancel' => __( 'Cancel', 'wp-user-frontend' ), - 'close' => __( 'Close', 'wp-user-frontend' ), - 'last_choice_warn_msg' => __( 'This field must contain at least one choice', 'wp-user-frontend' ), - 'option' => __( 'Option', 'wp-user-frontend' ), - 'column' => __( 'Column', 'wp-user-frontend' ), - 'last_column_warn_msg' => __( 'This field must contain at least one column', 'wp-user-frontend' ), - 'is_a_pro_feature' => __( 'is available in Pro version', 'wp-user-frontend' ), - 'pro_feature_msg' => __( 'Please upgrade to the Pro version to unlock all these awesome features', 'wp-user-frontend' ), - 'upgrade_to_pro' => __( 'Get the Pro version', 'wp-user-frontend' ), - 'select' => __( 'Select', 'wp-user-frontend' ), - 'saved_form_data' => __( 'Saved form data', 'wp-user-frontend' ), - 'unsaved_changes' => __( 'You have unsaved changes.', 'wp-user-frontend' ), - 'copy_shortcode' => __( 'Click to copy shortcode', 'wp-user-frontend' ), - ] ); - } - - /** - * Save form data - * - * @since 2.5 - * - * @param array $data Contains form_fields, form_settings, form_settings_key data - * - * @return bool - */ - public static function save_form( $data ) { - $saved_wpuf_inputs = []; - - wp_update_post( [ 'ID' => $data['form_id'], 'post_status' => 'publish', 'post_title' => $data['post_title'] ] ); - - $existing_wpuf_input_ids = get_children( [ - 'post_parent' => $data['form_id'], - 'post_status' => 'publish', - 'post_type' => 'wpuf_input', - 'numberposts' => '-1', - 'orderby' => 'menu_order', - 'order' => 'ASC', - 'fields' => 'ids', - ] ); - - $new_wpuf_input_ids = []; - - if ( !empty( $data['form_fields'] ) ) { - foreach ( $data['form_fields'] as $order => $field ) { - if ( !empty( $field['is_new'] ) ) { - unset( $field['is_new'] ); - unset( $field['id'] ); - - $field_id = 0; - } else { - $field_id = $field['id']; - } - - $field_id = wpuf_insert_form_field( $data['form_id'], $field, $field_id, $order ); - - $new_wpuf_input_ids[] = $field_id; - - $field['id'] = $field_id; - - $saved_wpuf_inputs[] = $field; - } - } - - $inputs_to_delete = array_diff( $existing_wpuf_input_ids, $new_wpuf_input_ids ); - - if ( !empty( $inputs_to_delete ) ) { - foreach ( $inputs_to_delete as $delete_id ) { - wp_delete_post( $delete_id, true ); - } - } - - update_post_meta( $data['form_id'], $data['form_settings_key'], $data['form_settings'] ); - update_post_meta( $data['form_id'], 'notifications', $data['notifications'] ); - update_post_meta( $data['form_id'], 'integrations', $data['integrations'] ); - - return $saved_wpuf_inputs; - } -} diff --git a/admin/form-builder/class-wpuf-form-builder-field-settings.php b/admin/form-builder/class-wpuf-form-builder-field-settings.php deleted file mode 100644 index 19e765b58..000000000 --- a/admin/form-builder/class-wpuf-form-builder-field-settings.php +++ /dev/null @@ -1,17 +0,0 @@ - __( 'Forms', 'wp-user-frontend' ), - 'public' => false, - 'show_ui' => false, - 'show_in_menu' => false, //false, - 'capability_type' => 'post', - 'hierarchical' => false, - 'query_var' => false, - 'supports' => [ 'title' ], - 'capabilities' => [ - 'publish_posts' => $capability, - 'edit_posts' => $capability, - 'edit_others_posts' => $capability, - 'delete_posts' => $capability, - 'delete_others_posts' => $capability, - 'read_private_posts' => $capability, - 'edit_post' => $capability, - 'delete_post' => $capability, - 'read_post' => $capability, - ], - 'labels' => [ - 'name' => __( 'Forms', 'wp-user-frontend' ), - 'singular_name' => __( 'Form', 'wp-user-frontend' ), - 'menu_name' => __( 'Forms', 'wp-user-frontend' ), - 'add_new' => __( 'Add Form', 'wp-user-frontend' ), - 'add_new_item' => __( 'Add New Form', 'wp-user-frontend' ), - 'edit' => __( 'Edit', 'wp-user-frontend' ), - 'edit_item' => __( 'Edit Form', 'wp-user-frontend' ), - 'new_item' => __( 'New Form', 'wp-user-frontend' ), - 'view' => __( 'View Form', 'wp-user-frontend' ), - 'view_item' => __( 'View Form', 'wp-user-frontend' ), - 'search_items' => __( 'Search Form', 'wp-user-frontend' ), - 'not_found' => __( 'No Form Found', 'wp-user-frontend' ), - 'not_found_in_trash' => __( 'No Form Found in Trash', 'wp-user-frontend' ), - 'parent' => __( 'Parent Form', 'wp-user-frontend' ), - ], - ] - ); - - register_post_type( - 'wpuf_profile', [ - 'label' => __( 'Registraton Forms', 'wp-user-frontend' ), - 'public' => false, - 'show_ui' => false, - 'show_in_menu' => false, - 'capability_type' => 'post', - 'hierarchical' => false, - 'query_var' => false, - 'supports' => [ 'title' ], - 'capabilities' => [ - 'publish_posts' => $capability, - 'edit_posts' => $capability, - 'edit_others_posts' => $capability, - 'delete_posts' => $capability, - 'delete_others_posts' => $capability, - 'read_private_posts' => $capability, - 'edit_post' => $capability, - 'delete_post' => $capability, - 'read_post' => $capability, - ], - 'labels' => [ - 'name' => __( 'Forms', 'wp-user-frontend' ), - 'singular_name' => __( 'Form', 'wp-user-frontend' ), - 'menu_name' => __( 'Registration Forms', 'wp-user-frontend' ), - 'add_new' => __( 'Add Form', 'wp-user-frontend' ), - 'add_new_item' => __( 'Add New Form', 'wp-user-frontend' ), - 'edit' => __( 'Edit', 'wp-user-frontend' ), - 'edit_item' => __( 'Edit Form', 'wp-user-frontend' ), - 'new_item' => __( 'New Form', 'wp-user-frontend' ), - 'view' => __( 'View Form', 'wp-user-frontend' ), - 'view_item' => __( 'View Form', 'wp-user-frontend' ), - 'search_items' => __( 'Search Form', 'wp-user-frontend' ), - 'not_found' => __( 'No Form Found', 'wp-user-frontend' ), - 'not_found_in_trash' => __( 'No Form Found in Trash', 'wp-user-frontend' ), - 'parent' => __( 'Parent Form', 'wp-user-frontend' ), - ], - ] - ); - - register_post_type( - 'wpuf_input', [ - 'public' => false, - 'show_ui' => false, - 'show_in_menu' => false, - ] - ); - } - - /** - * Initiate form builder for wpuf_forms post type - * - * @since 2.5 - * - * @return void - */ - public function post_forms_builder_init() { - if ( ! isset( $_GET['action'] ) ) { - return; - } - - if ( 'add-new' === $_GET['action'] && empty( $_GET['id'] ) ) { - $form_id = wpuf_create_sample_form( 'Sample Form', 'wpuf_forms', true ); - $add_new_page_url = add_query_arg( [ 'id' => $form_id ], admin_url( 'admin.php?page=wpuf-post-forms&action=edit' ) ); - wp_redirect( $add_new_page_url ); - } - - if ( ( 'edit' === $_GET['action'] ) && ! empty( $_GET['id'] ) ) { - add_action( 'wpuf-form-builder-tabs-post', [ $this, 'add_primary_tabs' ] ); - add_action( 'wpuf-form-builder-tab-contents-post', [ $this, 'add_primary_tab_contents' ] ); - add_action( 'wpuf-form-builder-settings-tabs-post', [ $this, 'add_settings_tabs' ] ); - add_action( 'wpuf-form-builder-settings-tab-contents-post', [ $this, 'add_settings_tab_contents' ] ); - add_filter( 'wpuf-form-fields-section-before', [ $this, 'add_post_field_section' ] ); - add_action( 'admin_enqueue_scripts', [ $this, 'admin_enqueue_scripts' ] ); - add_action( 'wpuf-form-builder-js-deps', [ $this, 'js_dependencies' ] ); - add_filter( 'wpuf-form-builder-js-root-mixins', [ $this, 'js_root_mixins' ] ); - add_filter( 'wpuf-form-builder-js-builder-stage-mixins', [ $this, 'js_builder_stage_mixins' ] ); - add_filter( 'wpuf-form-builder-js-field-options-mixins', [ $this, 'js_field_options_mixins' ] ); - add_action( 'wpuf-form-builder-template-builder-stage-submit-area', [ $this, 'add_form_submit_area' ] ); - add_action( 'wpuf-form-builder-localize-script', [ $this, 'add_to_localize_script' ] ); - add_filter( 'wpuf-form-fields', [ $this, 'add_field_settings' ] ); - add_filter( 'wpuf-form-builder-i18n', [ $this, 'i18n' ] ); - - do_action( 'wpuf-form-builder-init-type-wpuf_forms' ); - - $this->set_wp_post_types(); - - $settings = [ - 'form_type' => 'post', - 'post_type' => 'wpuf_forms', - 'post_id' => isset( $_GET['id'] ) ? intval( wp_unslash( $_GET['id'] ) ) : '', - 'form_settings_key' => $this->form_settings_key, - 'shortcodes' => [ [ 'name' => 'wpuf_form' ] ], - ]; - - new WPUF_Admin_Form_Builder( $settings ); - } - } - - /** - * Additional primary tabs - * - * @since 2.5 - * - * @return void - */ - public function add_primary_tabs() { - ?> - - - - - - - -
    - -
    - - - - - - - - - - - - - ID ); - ?> - -
    - -
    - -
    - -
    - -
    - -
    - -
    - -
    - -
    - -
    - -
    - form_post_expiration(); ?> -
    - - - - get_subscriptions(); - - if ( ! $subscriptions ) { - printf( '', esc_html( __( '- Select -', 'wp-user-frontend' ) ) ); - - return; - } - - printf( '', esc_html( __( '- Select -', 'wp-user-frontend' ) ) ); - - foreach ( $subscriptions as $key => $subscription ) { - ?> - - __( 'Post Fields', 'wp-user-frontend' ), - 'id' => 'post-fields', - 'fields' => $post_fields, - ], - - [ - 'title' => __( 'Taxonomies', 'wp-user-frontend' ), - 'id' => 'taxonomies', - 'fields' => [], - ], - ]; - } - - /** - * Admin script form wpuf_forms form builder - * - * @since 2.5 - * - * @return void - */ - public function admin_enqueue_scripts() { - wp_register_script( - 'wpuf-form-builder-wpuf-forms', - WPUF_ASSET_URI . '/js/wpuf-form-builder-wpuf-forms.js', - [ 'jquery', 'underscore', 'wpuf-vue', 'wpuf-vuex' ], - WPUF_VERSION, - true - ); - } - - /** - * Add dependencies to form builder script - * - * @since 2.5 - * - * @param array $deps - * - * @return array - */ - public function js_dependencies( $deps ) { - $deps[] = 'wpuf-form-builder-wpuf-forms'; - - return apply_filters( 'wpuf-form-builder-wpuf-forms-js-deps', $deps ); - } - - /** - * Add mixins to root instance - * - * @since 2.5 - * - * @param array $mixins - * - * @return array - */ - public function js_root_mixins( $mixins ) { - array_push( $mixins, 'wpuf_forms_mixin_root' ); - - return $mixins; - } - - /** - * Add mixins to form builder builder stage component - * - * @since 2.5 - * - * @param array $mixins - * - * @return array - */ - public function js_builder_stage_mixins( $mixins ) { - array_push( $mixins, 'wpuf_forms_mixin_builder_stage' ); - - return $mixins; - } - - /** - * Add mixins to form builder field options component - * - * @since 2.5 - * - * @param array $mixins - * - * @return array - */ - public function js_field_options_mixins( $mixins ) { - array_push( $mixins, 'wpuf_forms_mixin_field_options' ); - - return $mixins; - } - - /** - * Add buttons in form submit area - * - * @since 2.5 - * - * @return void - */ - public function add_form_submit_area() { - ?> - - - - - - true ]; - - $wpuf_post_types = wpuf_get_post_types( $args ); - - $ignore_taxonomies = apply_filters( - 'wpuf-ignore-taxonomies', [ - 'post_format', - ] - ); - - foreach ( $wpuf_post_types as $post_type ) { - $this->wp_post_types[ $post_type ] = []; - - $taxonomies = get_object_taxonomies( $post_type, 'object' ); - - foreach ( $taxonomies as $tax_name => $taxonomy ) { - if ( ! in_array( $tax_name, $ignore_taxonomies ) ) { - $this->wp_post_types[ $post_type ][ $tax_name ] = [ - 'title' => $taxonomy->label, - 'hierarchical' => $taxonomy->hierarchical, - ]; - - $this->wp_post_types[ $post_type ][ $tax_name ]['terms'] = get_terms( - [ - 'taxonomy' => $tax_name, - 'hide_empty' => false, - ] - ); - } - } - } - } - - /** - * Add data to localize_script - * - * @since 2.5 - * - * @param array $data - * - * @return array - */ - public function add_to_localize_script( $data ) { - return array_merge( - $data, [ - 'wp_post_types' => $this->wp_post_types, - ] - ); - } - - /** - * Add field settings - * - * @since 2.5 - * - * @param array $field_settings - * - * @return array - */ - public function add_field_settings( $field_settings ) { - if ( class_exists( 'WPUF_Field_Contract' ) ) { - require_once WPUF_ROOT . '/includes/fields/class-field-post-title.php'; - require_once WPUF_ROOT . '/includes/fields/class-field-post-content.php'; - require_once WPUF_ROOT . '/includes/fields/class-field-post-tags.php'; - require_once WPUF_ROOT . '/includes/fields/class-field-post-excerpt.php'; - require_once WPUF_ROOT . '/includes/fields/class-field-post-taxonomy.php'; - require_once WPUF_ROOT . '/includes/fields/class-field-featured-image.php'; - - $field_settings['post_title'] = new WPUF_Form_Field_Post_Title(); - $field_settings['post_content'] = new WPUF_Form_Field_Post_Content(); - $field_settings['post_excerpt'] = new WPUF_Form_Field_Post_Excerpt(); - $field_settings['featured_image'] = new WPUF_Form_Field_Featured_Image(); - - $taxonomy_templates = []; - - foreach ( $this->wp_post_types as $post_type => $taxonomies ) { - if ( ! empty( $taxonomies ) ) { - foreach ( $taxonomies as $tax_name => $taxonomy ) { - if ( 'post_tag' === $tax_name ) { - $taxonomy_templates['post_tag'] = new WPUF_Form_Field_Post_Tags(); - } else { - $taxonomy_templates[ $tax_name ] = new WPUF_Form_Field_Post_Taxonomy( $tax_name, $taxonomy ); - // $taxonomy_templates[ 'taxonomy' ] = new WPUF_Form_Field_Post_Taxonomy($tax_name, $taxonomy); - } - } - } - } - - $field_settings = array_merge( $field_settings, $taxonomy_templates ); - } - - return $field_settings; - } - - /** - * i18n strings specially for Post Forms - * - * @since 2.5 - * - * @param array $i18n - * - * @return array - */ - public function i18n( $i18n ) { - return array_merge( - $i18n, [ - 'any_of_three_needed' => __( 'Post Forms must have either Post Title, Post Body or Excerpt field', 'wp-user-frontend' ), - ] - ); - } -} diff --git a/admin/html/form-settings-post-edit.php b/admin/html/form-settings-post-edit.php index 6d564a2ba..a7a78a65c 100644 --- a/admin/html/form-settings-post-edit.php +++ b/admin/html/form-settings-post-edit.php @@ -83,7 +83,7 @@ diff --git a/admin/html/whats-new.php b/admin/html/whats-new.php deleted file mode 100644 index d2b4b8df0..000000000 --- a/admin/html/whats-new.php +++ /dev/null @@ -1,1564 +0,0 @@ - 'Version 3.6.0', - 'released' => '2022-11-23', - 'changes' => [ - [ - 'title' => __( 'Admin dashboard news and update meta-box added', 'wp-user-frontend' ), - 'type' => 'Enhancement', - ], - [ - 'title' => __( 'Upgrade prompts design', 'wp-user-frontend' ), - 'type' => 'Enhancement', - ], - [ - 'title' => __( 'Email style handled', 'wp-user-frontend' ), - 'type' => 'Fix', - ], - [ - 'title' => __( 'text-area type selection(Normal, Rich text-area, Teeny Rich text-area) bug in field options', 'wp-user-frontend' ), - 'type' => 'Fix', - ], - [ - 'title' => __( 'Frontend form validation', 'wp-user-frontend' ), - 'type' => 'Fix', - ], - [ - 'title' => __( 'Default value not saving for radio, dropdown, checkbox', 'wp-user-frontend' ), - 'type' => 'Fix', - ], - [ - 'title' => __( 'sweetalert2 version', 'wp-user-frontend' ), - 'type' => 'Update', - ], - ], - ], - [ - 'version' => 'Version 3.5.29', - 'released' => '2022-09-15', - 'changes' => [ - [ - 'title' => __( 'Short-code encryption updated for registration page', 'wp-user-frontend' ), - 'type' => 'Enhancement', - ], - ], - ], - [ - 'version' => 'Version 3.5.28', - 'released' => '2022-08-17', - 'changes' => [ - [ - 'title' => __( 'Updated compatibility with the latest version of WordPress 6.0', 'wp-user-frontend' ), - 'type' => 'Tweak', - ], - [ - 'title' => __( 'Improved some backend implementations', 'wp-user-frontend' ), - 'type' => 'Tweak', - ], - ], - ], - [ - 'version' => 'Version 3.5.27', - 'released' => '2022-03-09', - 'changes' => [ - [ - 'title' => __( 'Email template enhanced for after activation', 'wp-user-frontend' ), - 'type' => 'Enhancement', - ], - [ - 'title' => __( 'Read only option for custom field', 'wp-user-frontend' ), - 'type' => 'Enhancement', - ], - [ - 'title' => __( 'Editor toolbar exclude option enhanced', 'wp-user-frontend' ), - 'type' => 'Enhancement', - ], - [ - 'title' => __( 'Preview option enhanced for user profile', 'wp-user-frontend' ), - 'type' => 'Enhancement', - ], - [ - 'title' => __( 'Meta key enhanced for user email notification', 'wp-user-frontend' ), - 'type' => 'Enhancement', - ], - [ - 'title' => __( 'Global option for disable post edit on account', 'wp-user-frontend' ), - 'type' => 'Enhancement', - ], - [ - 'title' => __( 'Filter for conditional logic for fields added', 'wp-user-frontend' ), - 'type' => 'Enhancement', - ], - [ - 'title' => __( 'PHP 8 compatibility handled', 'wp-user-frontend' ), - 'type' => 'Fix', - ], - [ - 'title' => __( 'Address / Billing address inconsistency handled', 'wp-user-frontend' ), - 'type' => 'Fix', - ], - [ - 'title' => __( 'Content restriction several issue fixed', 'wp-user-frontend' ), - 'type' => 'Fix', - ], - [ - 'title' => __( 'Tax calculation properly handled for all areas', 'wp-user-frontend' ), - 'type' => 'Fix', - ], - [ - 'title' => __( 'Validation added for invalid email and URL formats', 'wp-user-frontend' ), - 'type' => 'Fix', - ], - [ - 'title' => __( 'Special character password handled for login', 'wp-user-frontend' ), - 'type' => 'Fix', - ], - [ - 'title' => __( 'Reset password handled for sidebar widget', 'wp-user-frontend' ), - 'type' => 'Fix', - ], - [ - 'title' => __( 'Required google map issues handled', 'wp-user-frontend' ), - 'type' => 'Fix', - ], - [ - 'title' => __( 'Translation related issue handled for admin menu', 'wp-user-frontend' ), - 'type' => 'Fix', - ], - [ - 'title' => __( 'Label & query enhanced for transaction table', 'wp-user-frontend' ), - 'type' => 'Fix', - ], - [ - 'title' => __( 'Template override for child theme fixed', 'wp-user-frontend' ), - 'type' => 'Fix', - ], - [ - 'title' => __( 'Custom field modal handled for registration form', 'wp-user-frontend' ), - 'type' => 'Fix', - ], - [ - 'title' => __( 'Redundant CSS issues handled', 'wp-user-frontend' ), - 'type' => 'Fix', - ], - [ - 'title' => __( 'Address field inconsistency fixed', 'wp-user-frontend' ), - 'type' => 'Fix', - ], - [ - 'title' => __( 'Plugin page spin loading issue handled', 'wp-user-frontend' ), - 'type' => 'Fix', - ], - [ - 'title' => __( 'Warning on exit for draft post fixed', 'wp-user-frontend' ), - 'type' => 'Fix', - ], - [ - 'title' => __( 'Unlimited expire on admin user profile handled', 'wp-user-frontend' ), - 'type' => 'Fix', - ], - [ - 'title' => __( 'No value checkbox issue handled', 'wp-user-frontend' ), - 'type' => 'Fix', - ], - [ - 'title' => __( 'Tag search security Vulnerability handled', 'wp-user-frontend' ), - 'type' => 'Fix', - ], - [ - 'title' => __( 'Multi dropdown field error handled', 'wp-user-frontend' ), - 'type' => 'Fix', - ], - ], - ], - [ - 'version' => 'Version 3.5.26', - 'released' => '2021-12-24', - 'changes' => [ - - [ - 'title' => __( 'Promotion notice enhanced through api', 'wp-user-frontend' ), - 'type' => 'Enhancement', - ], - ], - ], - [ - 'version' => 'Version 3.5.25', - 'released' => '2021-11-18', - 'changes' => [ - - [ - 'title' => __( 'Security Vulnerability fixed', 'wp-user-frontend' ), - 'type' => 'Fix', - ], - ], - ], - [ - 'version' => 'Version 3.5.22', - 'released' => '2021-10-28', - 'changes' => [ - - [ - 'title' => __( 'Featured item for subscriber', 'wp-user-frontend' ), - 'type' => 'Enhancement', - ], - [ - 'title' => __( 'Warning added for unsaved form data on frontend', 'wp-user-frontend' ), - 'type' => 'Enhancement', - ], - [ - 'title' => __( 'Settings page search implemented', 'wp-user-frontend' ), - 'type' => 'Enhancement', - ], - [ - 'title' => __( 'Editor added for registration form email template', 'wp-user-frontend' ), - 'type' => 'Enhancement', - ], - [ - 'title' => __( 'Fallback pay per post not working with when draft enabled', 'wp-user-frontend' ), - 'type' => 'Fix', - ], - [ - 'title' => __( 'User Dashboard responsive issues fixed', 'wp-user-frontend' ), - 'type' => 'Fix', - ], - [ - 'title' => __( 'Showing wrong license expire message handled', 'wp-user-frontend' ), - 'type' => 'Fix', - ], - [ - 'title' => __( 'Remove expire cron handled for once daily', 'wp-user-frontend' ), - 'type' => 'Fix', - ], - [ - 'title' => __( 'Billing address validation handled', 'wp-user-frontend' ), - 'type' => 'Fix', - ], - [ - 'title' => __( 'Promotion notice restricted for WPUF menu', 'wp-user-frontend' ), - 'type' => 'Update', - ], - ], - ], - [ - 'version' => 'Version 3.5.21', - 'released' => '2021-10-21', - 'changes' => [ - - [ - 'title' => __( 'reCaptcha issue with other plugin handled', 'wp-user-frontend' ), - 'type' => 'Fix', - ], - [ - 'title' => __( 'Multiple post type for wpuf dashboard not working fixed', 'wp-user-frontend' ), - 'type' => 'Fix', - ], - [ - 'title' => __( 'Billing address ajax request issue handled', 'wp-user-frontend' ), - 'type' => 'Fix', - ], - [ - 'title' => __( 'Halloween promotion notice added', 'wp-user-frontend' ), - 'type' => 'Update', - ], - ], - ], - [ - 'version' => 'Version 3.5.20', - 'released' => '2021-09-16', - 'changes' => [ - - [ - 'title' => __( 'Content restriction for minimum, maximum value enhanced', 'wp-user-frontend' ), - 'type' => 'Enhancement', - ], - [ - 'title' => __( 'New option for redirection after pay per post payment in form setting', 'wp-user-frontend' ), - 'type' => 'Enhancement', - ], - [ - 'title' => __( 'Controller added for various email notification', 'wp-user-frontend' ), - 'type' => 'Enhancement', - ], - [ - 'title' => __( 'Placeholder added for unauth message option', 'wp-user-frontend' ), - 'type' => 'Enhancement', - ], - [ - 'title' => __( 'Subscription Post expiration option change to input field', 'wp-user-frontend' ), - 'type' => 'Update', - ], - [ - 'title' => __( 'Content restriction message translatable', 'wp-user-frontend' ), - 'type' => 'Fix', - ], - [ - 'title' => __( 'ACF integration inconsistency handled', 'wp-user-frontend' ), - 'type' => 'Fix', - ], - [ - 'title' => __( 'Enable payment checkbox handled for child option', 'wp-user-frontend' ), - 'type' => 'Fix', - ], - [ - 'title' => __( 'Broken asset link handled for custom field popup', 'wp-user-frontend' ), - 'type' => 'Fix', - ], - [ - 'title' => __( 'Rollback inconsistency for CPT handled', 'wp-user-frontend' ), - 'type' => 'Fix', - ], - [ - 'title' => __( 'Login form loaded after resetting password', 'wp-user-frontend' ), - 'type' => 'Fix', - ], - [ - 'title' => __( 'Billing address inconsistency handled', 'wp-user-frontend' ), - 'type' => 'Fix', - ], - [ - 'title' => __( 'Form duplication on creation handled', 'wp-user-frontend' ), - 'type' => 'Fix', - ], - [ - 'title' => __( 'Field Dragging inconsistency fixed', 'wp-user-frontend' ), - 'type' => 'Fix', - ], - ], - ], - [ - 'version' => 'Version 3.5.18', - 'released' => '2021-07-06', - 'changes' => [ - - [ - 'title' => __( 'Google Map field enhanced along with acf google map', 'wp-user-frontend' ), - 'type' => 'Enhancement', - ], - [ - 'title' => __( 'Filter added for dashboard account menu', 'wp-user-frontend' ), - 'type' => 'Enhancement', - ], - [ - 'title' => __( 'Fallback Pay Per Post inconsistency handled', 'wp-user-frontend' ), - 'type' => 'Fix', - ], - [ - 'title' => __( 'Google map search field not showing', 'wp-user-frontend' ), - 'type' => 'Fix', - ], - [ - 'title' => __( 'Form preview page inconsistency with builder', 'wp-user-frontend' ), - 'type' => 'Fix', - ], - [ - 'title' => __( 'Category not showing as hierarchy', 'wp-user-frontend' ), - 'type' => 'Fix', - ], - [ - 'title' => __( 'TOC field randering issue with registration form', 'wp-user-frontend' ), - 'type' => 'Fix', - ], - [ - 'title' => __( 'Custom plupload filter inconsistency with file upload handled', 'wp-user-frontend' ), - 'type' => 'Fix', - ], - [ - 'title' => __( 'Guest Pay Per Post inconsistency handled', 'wp-user-frontend' ), - 'type' => 'Fix', - ], - [ - 'title' => __( 'Responsive and font issue handled', 'wp-user-frontend' ), - 'type' => 'Fix', - ], - ], - ], - [ - 'version' => 'Version 3.5.17', - 'released' => '2021-06-08', - 'changes' => [ - - [ - 'title' => __( 'Preview page added for post form and registration form', 'wp-user-frontend' ), - 'type' => 'Enhancement', - ], - [ - 'title' => __( 'Post types menu on account page added', 'wp-user-frontend' ), - 'type' => 'Enhancement', - ], - [ - 'title' => __( 'Dashboard shortcode attributes enhanced', 'wp-user-frontend' ), - 'type' => 'Enhancement', - ], - [ - 'title' => __( 'Account page post type list new design', 'wp-user-frontend' ), - 'type' => 'Enhancement', - ], - [ - 'title' => __( 'Payment page restricted from direct unauthenticated access', 'wp-user-frontend' ), - 'type' => 'Fix', - ], - [ - 'title' => __( 'Timepicker conflict with dokan handled', 'wp-user-frontend' ), - 'type' => 'Fix', - ], - [ - 'title' => __( 'Trial inconsistency with paypal fixed', 'wp-user-frontend' ), - 'type' => 'Fix', - ], - [ - 'title' => __( 'Subscription does not cancel with paypal due to profile missing id', 'wp-user-frontend' ), - 'type' => 'Fix', - ], - [ - 'title' => __( 'Subscription email notification inconsistency fixed', 'wp-user-frontend' ), - 'type' => 'Fix', - ], - [ - 'title' => __( 'Various issues on payment page for non-logged in user handled', 'wp-user-frontend' ), - 'type' => 'Fix', - ], - [ - 'title' => __( 'Column inner field cloning inconsistency fixed', 'wp-user-frontend' ), - 'type' => 'Fix', - ], - [ - 'title' => __( 'Popup z-index changed due to other plugin z-index', 'wp-user-frontend' ), - 'type' => 'Fix', - ], - ], - - ], - [ - 'version' => 'Version 3.5.16', - 'released' => '2021-05-08', - 'changes' => [ - - [ - 'title' => __( 'Added Mauritian Rupee for currency', 'wp-user-frontend' ), - 'type' => 'Update', - ], - [ - 'title' => __( 'Added eid promotional offer notice', 'wp-user-frontend' ), - 'type' => 'Update', - ], - [ - 'title' => __( 'Multiple google map validation for same form', 'wp-user-frontend' ), - 'type' => 'Fix', - ], - [ - 'title' => __( 'Various issues on verification, autologin payments & address field', 'wp-user-frontend' ), - 'type' => 'Fix', - ], - [ - 'title' => __( 'Docs update for file & attachments feature which is pro only', 'wp-user-frontend' ), - 'type' => 'Fix', - ], - ], - ], - [ - 'version' => 'Version 3.5.15', - 'released' => '2021-03-15', - 'changes' => [ - - [ - 'title' => __( 'Overflow footer on form builder page', 'wp-user-frontend' ), - 'type' => 'Fix', - ], - [ - 'title' => __( 'WordPress 5.7 compatibility', 'wp-user-frontend' ), - 'type' => 'Fix', - ], - [ - 'title' => __( 'Limited time promotion for weDevs birthday', 'wp-user-frontend' ), - 'type' => 'Notice', - ], - ], - ], - [ - 'version' => 'Version 3.5.14', - 'released' => '2021-03-08', - 'changes' => [ - - [ - 'title' => __( 'Meta key will not change if label update', 'wp-user-frontend' ), - 'type' => 'Fix', - ], - [ - 'title' => __( 'Login redirect empty previous url', 'wp-user-frontend' ), - 'type' => 'Fix', - ], - [ - 'title' => __( 'Email doesnt set as username', 'wp-user-frontend' ), - 'type' => 'Fix', - ], - [ - 'title' => __( 'Post redirection to payment doesn\'t work', 'wp-user-frontend' ), - 'type' => 'Fix', - ], - [ - 'title' => __( 'Address field not working when used with conditional logic', 'wp-user-frontend' ), - 'type' => 'Fix', - ], - [ - 'title' => __( 'Ajax type category child of not working', 'wp-user-frontend' ), - 'type' => 'Fix', - ], - [ - 'title' => __( 'Non recurring subscription did not work', 'wp-user-frontend' ), - 'type' => 'Fix', - ], - ], - ], - [ - 'version' => 'Version 3.5.13', - 'released' => '2021-02-05', - 'changes' => [ - - [ - 'title' => __( 'Menu position has chenged due to dokan has same menu position', 'wp-user-frontend' ), - 'type' => 'Fix', - ], - [ - 'title' => __( 'Drag and drop not working properly for new field', 'wp-user-frontend' ), - 'type' => 'Fix', - ], - ], - ], - [ - 'version' => 'Version 3.5.11', - 'released' => '2021-01-12', - 'changes' => [ - - [ - 'title' => __( 'QR and math captcha added to pro feature list', 'wp-user-frontend' ), - 'type' => 'Fix', - ], - [ - 'title' => __( 'Tooltip for category navigate', 'wp-user-frontend' ), - 'type' => 'Fix', - ], - [ - 'title' => __( 'Understandable guest payment notice', 'wp-user-frontend' ), - 'type' => 'Fix', - ], - [ - 'title' => __( 'Paypal non recurring pack id does not set', 'wp-user-frontend' ), - 'type' => 'Fix', - ], - ], - ], - [ - 'version' => 'Version 3.5.9', - 'released' => '2020-12-11', - 'changes' => [ - - [ - 'title' => __( 'Once trial subscription is used, it couldn\'t reset', 'wp-user-frontend' ), - 'type' => 'Fix', - ], - [ - 'title' => __( 'Subscription cancel doesn\'t work', 'wp-user-frontend' ), - 'type' => 'Fix', - ], - [ - 'title' => __( 'The tax rate was not calculated with the total amount', 'wp-user-frontend' ), - 'type' => 'Fix', - ], - [ - 'title' => __( 'The width of the column field was breaking', 'wp-user-frontend' ), - 'type' => 'Fix', - ], - [ - 'title' => __( 'Paypal recurring payment', 'wp-user-frontend' ), - 'type' => 'Enhancement', - ], - ], - ], - [ - 'version' => 'Version 3.5.8', - 'released' => '2020-11-21', - 'changes' => [ - - [ - 'title' => __( 'Updated codebase to fix timezone mismatch', 'wp-user-frontend' ), - 'type' => 'Fix', - ], - ], - ], - [ - 'version' => 'Version 3.5.7', - 'released' => '2020-11-21', - 'changes' => [ - - [ - 'title' => __( 'Custom html content field\'s width', 'wp-user-frontend' ), - 'type' => 'Enhancement', - ], - [ - 'title' => __( 'All states of New Zealand are added', 'wp-user-frontend' ), - 'type' => 'Enhancement', - ], - ], - ], - [ - 'version' => 'Version 3.5.4', - 'released' => '2020-11-11', - 'changes' => [ - - [ - 'title' => __( 'Get appropriate user id when role based conditions are present', 'wp-user-frontend' ), - 'type' => 'Fix', - ], - [ - 'title' => __( 'Show Invalid subscription message if wrong pack id passed', 'wp-user-frontend' ), - 'type' => 'Fix', - ], - [ - 'title' => __( 'URL field new window not working', 'wp-user-frontend' ), - 'type' => 'Fix', - ], - [ - 'title' => __( 'Option label not working when & use', 'wp-user-frontend' ), - 'type' => 'Fix', - ], - [ - 'title' => __( 'Ajax type category not showing on edit', 'wp-user-frontend' ), - 'type' => 'Fix', - ], - [ - 'title' => __( 'Multiple file image can\'t select', 'wp-user-frontend' ), - 'type' => 'Fix', - ], - [ - 'title' => __( 'Subscription pack PayPal Checkout gets "Error: Access Denied"', 'wp-user-frontend' ), - 'type' => 'Fix', - ], - [ - 'title' => __( 'Conflict image field with acf image field', 'wp-user-frontend' ), - 'type' => 'Fix', - ], - [ - 'title' => __( 'Missing Auckland State for New Zealand country', 'wp-user-frontend' ), - 'type' => 'Enhancement', - ], - [ - 'title' => __( 'Added support for WooCommerce product category value replacemen', 'wp-user-frontend' ), - 'type' => 'Enhancement', - ], - ], - ], - [ - 'version' => 'Version 3.5.2', - 'released' => '2020-09-22', - 'changes' => [ - [ - 'title' => __( 'Add character restriction feature', 'wp-user-frontend' ), - 'type' => 'New', - ], - [ - 'title' => __( 'Make sure post author edit link works only in frontend', 'wp-user-frontend' ), - 'type' => 'Tweak', - ], - [ - 'title' => __( 'Inconsistency in lost password reset email message', 'wp-user-frontend' ), - 'type' => 'Fix', - ], - [ - 'title' => __( 'Saving custom taxonomy terms when input type is text', 'wp-user-frontend' ), - 'type' => 'Fix', - ], - [ - 'title' => __( 'Taxonomy field JS error in builder', 'wp-user-frontend' ), - 'type' => 'Fix', - ], - [ - 'title' => __( 'Showing WPUF edit link for WP default roles', 'wp-user-frontend' ), - 'type' => 'Fix', - ], - [ - 'title' => __( 'Upload button unresponsive issue in iOS', 'wp-user-frontend' ), - 'type' => 'Fix', - ], - ], - ], - [ - 'version' => 'Version 3.4.0', - 'released' => '2020-08-24', - 'changes' => [ - [ - 'title' => __( 'Add post edit link for post authors in single or archive pages', 'wp-user-frontend' ), - 'type' => 'New', - ], - [ - 'title' => __( 'Enhance post delete message', 'wp-user-frontend' ), - 'type' => 'Enhancement', - ], - [ - 'title' => __( 'Refactor control buttons visibility in form builder', 'wp-user-frontend' ), - 'type' => 'Tweak', - ], - [ - 'title' => __( 'Add missing colons after field label', 'wp-user-frontend' ), - 'type' => 'Fix', - ], - [ - 'title' => __( 'Post edit map capability condition', 'wp-user-frontend' ), - 'type' => 'Fix', - ], - [ - 'title' => __( 'Role based permission for accessing a post form', 'wp-user-frontend' ), - 'type' => 'Fix', - ], - [ - 'title' => __( 'Section-break field alignment', 'wp-user-frontend' ), - 'type' => 'Fix', - ], - [ - 'title' => __( 'Pay per post doesn\'t work if subscription pack is activated', 'wp-user-frontend' ), - 'type' => 'Fix', - ], - [ - 'title' => __( 'Mime type for uploading JSON files', 'wp-user-frontend' ), - 'type' => 'Fix', - ], - [ - 'title' => __( 'File upload with same file name', 'wp-user-frontend' ), - 'type' => 'Fix', - ], - [ - 'title' => __( 'Post preview missing fields', 'wp-user-frontend' ), - 'type' => 'Fix', - ], - [ - 'title' => __( 'Illigal variable declartion', 'wp-user-frontend' ), - 'type' => 'Fix', - ], - [ - 'title' => __( 'Featured image updating issue', 'wp-user-frontend' ), - 'type' => 'Fix', - ], - [ - 'title' => __( 'Conflict with Phlox theme', 'wp-user-frontend' ), - 'type' => 'Fix', - ], - [ - 'title' => __( 'Textarea custom field data sanitization', 'wp-user-frontend' ), - 'type' => 'Fix', - ], - [ - 'title' => __( 'exclude_type warning in wpuf_category_checklist', 'wp-user-frontend' ), - 'type' => 'Fix', - ], - [ - 'title' => __( 'Category field not showing all child categories for selection type child of', 'wp-user-frontend' ), - 'type' => 'Fix', - ], - [ - 'title' => __( 'Conflict between image and file upload custom fields', 'wp-user-frontend' ), - 'type' => 'Fix', - ], - [ - 'title' => __( 'Login url when login page is not set', 'wp-user-frontend' ), - 'type' => 'Fix', - ], - ], - ], - [ - 'version' => 'Version 3.3.1', - 'released' => '2020-06-16', - 'changes' => [ - [ - 'title' => __( 'Use common names for Ivory Coast, North Korea and Sourth Korea instead of their official names', 'wp-user-frontend' ), - 'type' => 'Tweak', - ], - [ - 'title' => __( 'Fix condition to use default avatar', 'wp-user-frontend' ), - 'type' => 'Fix', - ], - [ - 'title' => __( 'Make Email and URL fields clickable', 'wp-user-frontend' ), - 'type' => 'Fix', - ], - [ - 'title' => __( 'Fix redirect after user login', 'wp-user-frontend' ), - 'type' => 'Fix', - ], - [ - 'title' => __( 'Sanitize textarea field data', 'wp-user-frontend' ), - 'type' => 'Fix', - ], - [ - 'title' => __( 'Fix missing colon to email, URL, text and textarea labels when renders their data', 'wp-user-frontend' ), - 'type' => 'Fix', - ], - [ - 'title' => __( 'Prevent showing empty labels for fields that have render_field_data method', 'wp-user-frontend' ), - 'type' => 'Fix', - ], - ], - ], - [ - 'version' => 'Version 3.3.0', - 'released' => '2020-06-11', - 'changes' => [ - [ - 'title' => __( 'Add Namibian Dollar in currency list', 'wp-user-frontend' ), - 'type' => 'Enhancement', - ], - [ - 'title' => __( 'Add sync values option for option data fields', 'wp-user-frontend' ), - 'type' => 'Enhancement', - ], - [ - 'title' => __( 'Allow uploading image that having filesize meets php ini settings', 'wp-user-frontend' ), - 'type' => 'Tweak', - ], - [ - 'title' => __( 'Limit the selection of one image at a time', 'wp-user-frontend' ), - 'type' => 'Tweak', - ], - [ - 'title' => __( 'Use file name and size to generate hash to prevent duplicant image upload', 'wp-user-frontend' ), - 'type' => 'Tweak', - ], - [ - 'title' => __( 'Sanitize text and textarea field data', 'wp-user-frontend' ), - 'type' => 'Tweak', - ], - [ - 'title' => __( 'Show label instead of values for radio, checkbox, dropdown and multiselect data', 'wp-user-frontend' ), - 'type' => 'Tweak', - ], - [ - 'title' => __( 'Saving custom taxonomies for type text input', 'wp-user-frontend' ), - 'type' => 'Fix', - ], - [ - 'title' => __( 'Admin settings link for recaptcha helper text', 'wp-user-frontend' ), - 'type' => 'Fix', - ], - [ - 'title' => __( 'Undefined name property for Custom HTML fields', 'wp-user-frontend' ), - 'type' => 'Fix', - ], - [ - 'title' => __( 'Delete attachment process', 'wp-user-frontend' ), - 'type' => 'Fix', - ], - [ - 'title' => __( 'Missing billing address in invoice PDF', 'wp-user-frontend' ), - 'type' => 'Fix', - ], - [ - 'title' => __( 'Showing country field value in frontend post content', 'wp-user-frontend' ), - 'type' => 'Fix', - ], - [ - 'title' => __( 'Avatar size display not complying with admin settings size', 'wp-user-frontend' ), - 'type' => 'Fix', - ], - [ - 'title' => __( 'Display default avatars on admin settings discussion page', 'wp-user-frontend' ), - 'type' => 'Fix', - ], - [ - 'title' => __( 'Redirect to subscription page at registration', 'wp-user-frontend' ), - 'type' => 'Fix', - ], - [ - 'title' => __( 'Error notice regarding registration page redirect', 'wp-user-frontend' ), - 'type' => 'Fix', - ], - [ - 'title' => __( 'Escaping html in registration errors', 'wp-user-frontend' ), - 'type' => 'Fix', - ], - [ - 'title' => __( 'Default login redirect link', 'wp-user-frontend' ), - 'type' => 'Fix', - ], - [ - 'title' => __( 'Implementing default WP login page override option', 'wp-user-frontend' ), - 'type' => 'Fix', - ], - [ - 'title' => __( 'Transparent background of autosuggestion dropdown', 'wp-user-frontend' ), - 'type' => 'Fix', - ], - ], - ], - [ - 'version' => 'Version 3.2.0', - 'released' => '2020-04-14', - 'changes' => [ - [ - 'title' => __( 'Import forms system', 'wp-user-frontend' ), - 'type' => 'Improvement', - ], - [ - 'title' => __( 'Password reset system', 'wp-user-frontend' ), - 'type' => 'Improvement', - ], - [ - 'title' => __( 'Updated url validation regex to support modern tlds', 'wp-user-frontend' ), - 'type' => 'Improvement', - ], - [ - 'title' => __( 'Export WPUF forms individually from admin tools page', 'wp-user-frontend' ), - 'type' => 'Fix', - ], - [ - 'title' => __( 'Subscription cycle label translation issue', 'wp-user-frontend' ), - 'type' => 'Fix', - ], - [ - 'title' => __( 'ACF integration for checkbox fields', 'wp-user-frontend' ), - 'type' => 'Fix', - ], - [ - 'title' => __( 'Illegal string offset warning while updating settings', 'wp-user-frontend' ), - 'type' => 'Fix', - ], - [ - 'title' => __( 'Conditional logic for Section Break field', 'wp-user-frontend' ), - 'type' => 'Fix', - ], - [ - 'title' => __( 'Subscriptions cannot be deleted from backend', 'wp-user-frontend' ), - 'type' => 'Fix', - ], - [ - 'title' => __( 'A regression regarding saving checkbox data', 'wp-user-frontend' ), - 'type' => 'Fix', - ], - [ - 'title' => __( 'Default value of multi-select fields is not showing', 'wp-user-frontend' ), - 'type' => 'Fix', - ], - ], - ], - [ - 'version' => 'Version 3.1.18', - 'released' => '2020-03-13', - 'changes' => [ - [ - 'title' => __( 'Hide post edit option when subscription is expired', 'wp-user-frontend' ), - 'type' => 'Improvement', - 'description' => __( 'Hide post edit option from users whose subscription pack is expired.', 'wp-user-frontend' ), - ], - [ - 'title' => __( 'Check files to prevent duplicity in media upload', 'wp-user-frontend' ), - 'type' => 'Improvement', - 'description' => __( 'A simple measure has been taken to prevent maliciously flooding the site by uploading same file multiple times. Though this won\'t work with already uploaded medias.', 'wp-user-frontend' ), - ], - [ - 'title' => __( 'Refactor address fields in Account section', 'wp-user-frontend' ), - 'type' => 'Improvement', - 'description' => __( 'Address edit section from Account section has been rewritten to improve UX.', 'wp-user-frontend' ), - ], - [ - 'title' => __( 'Update Paypal payment gateway', 'wp-user-frontend' ), - 'type' => 'Improvement', - 'description' => __( 'Paypal payment gateway has seen some improvements.', 'wp-user-frontend' ), - ], - [ - 'title' => __( 'Default Category selection improvements', 'wp-user-frontend' ), - 'type' => 'Improvement', - 'description' => __( 'An intuitive way of selecting default category of a selected post type has been introduced.', 'wp-user-frontend' ), - ], - [ - 'title' => __( 'Compatibility issue with ACF date time field', 'wp-user-frontend' ), - 'type' => 'Fix', - 'description' => __( 'A Compatibility issue with ACF date time field has been addressed.', 'wp-user-frontend' ), - ], - [ - 'title' => __( 'Media title, caption & description not saving', 'wp-user-frontend' ), - 'type' => 'Fix', - 'description' => __( 'Media title, caption & description were not saving from frontend. They will now.', 'wp-user-frontend' ), - ], - [ - 'title' => __( 'The Events Calendar venue and organizer fields issue in WPUF Custom Fields metabox', 'wp-user-frontend' ), - 'type' => 'Fix', - 'description' => __( 'A workaround has been introduced to save The Events Calendar Venue and Organizer fields properly from WPUF Custom Fields metabox.', 'wp-user-frontend' ), - ], - [ - 'title' => __( 'Checkbox data not saving from WPUF Custom Fields metabox', 'wp-user-frontend' ), - 'type' => 'Fix', - 'description' => __( 'Checkboxe data from WPUF Custom Fields metabox were not saving. It has been fixed.', 'wp-user-frontend' ), - ], - [ - 'title' => __( 'Multi-column Repeater field data saving issue', 'wp-user-frontend' ), - 'type' => 'Fix', - 'description' => __( 'Multi-column Repeater field data from a form was not saving. It has been fixed.', 'wp-user-frontend' ), - ], - [ - 'title' => __( 'Multistep form conflict with Elementor', 'wp-user-frontend' ), - 'type' => 'Fix', - 'description' => __( 'Multistep form had a conflict with Elementor. It has been fixed.', 'wp-user-frontend' ), - ], - [ - 'title' => __( 'Multiple images showing issue in frontend', 'wp-user-frontend' ), - 'type' => 'Fix', - 'description' => __( 'Multiple images in a post were not showing in frontend. Now they will.', 'wp-user-frontend' ), - ], - ], - ], - [ - 'version' => 'Version 3.1.12', - 'released' => '2019-10-17', - 'changes' => [ - [ - 'title' => __( 'Nonce not verify on login', 'wp-user-frontend' ), - 'type' => 'Fix', - 'description' => __( 'Return of function wp_verify_nonce() was ignored.', 'wp-user-frontend' ), - ], - ], - ], - [ - 'version' => 'Version 3.1.11', - 'released' => '2019-10-02', - 'changes' => [ - [ - 'title' => __( 'Option to set which tab shows as active on the account page', 'wp-user-frontend' ), - 'type' => 'New', - 'description' => __( 'Option to set which tab shows as active on the account page. To configure this setting navigate to wp-admin->User Frontend->Settings->My Account->Active Tab ', 'wp-user-frontend' ), - ], - [ - 'title' => __( 'Unlock option was unavailable after the post being locked', 'wp-user-frontend' ), - 'type' => 'Fix', - 'description' => __( 'Unlock option was unavailable after the post being locked.', 'wp-user-frontend' ), - ], - [ - 'title' => __( "Gutenberg block of WPUF didn't work on bedrock installation", 'wp-user-frontend' ), - 'type' => 'Fix', - 'description' => __( "Gutenberg block of WPUF didn't work on bedrock installation.", 'wp-user-frontend' ), - ], - [ - 'title' => __( 'Sending admin payment received email twice', 'wp-user-frontend' ), - 'type' => 'Fix', - 'description' => __( 'After processing payment admin & user was receiving payment received email twice.', 'wp-user-frontend' ), - ], - [ - 'title' => __( 'Add shortcode support to display post information in the Post Expiration Message', 'wp-user-frontend' ), - 'type' => 'Improvement', - 'description' => __( 'Add shortcode support to display post information in the Post Expiration Message. You can use: {post_author} {post_url} {blogname} {post_title} {post_status}', 'wp-user-frontend' ), - ], - [ - 'title' => __( 'Add optin on the setup wizard', 'wp-user-frontend' ), - 'type' => 'Improvement', - 'description' => __( 'Added optin on the setup wizard, admin can choose whether he/she wants to share server environment details (php, mysql, server, WordPress versions), Number of users, Site language, Number of active and inactive plugins, Site name and url, admin name and email address. No sensitive data is tracked', 'wp-user-frontend' ), - ], - ], - ], - [ - 'version' => 'Version 3.1.10', - 'released' => '2019-09-06', - 'changes' => [ - [ - 'title' => __( 'Post Owner problem', 'wp-user-frontend' ), - 'type' => 'Fix', - 'description' => __( 'Posts were not assigned to the selected default post owner, this issue has been fixed.', 'wp-user-frontend' ), - ], - [ - 'title' => __( 'Google reCaptcha was not working', 'wp-user-frontend' ), - 'type' => 'Fix', - 'description' => __( 'Google reCaptcha was not working, users could submit the form without reCaptcha validation.', 'wp-user-frontend' ), - ], - ], - ], - [ - 'version' => 'Version 3.1.2', - 'released' => '2019-04-01', - 'changes' => [ - [ - 'title' => __( 'Added column field', 'wp-user-frontend' ), - 'type' => 'New', - 'description' => 'Now, creating multi-column in a single row is super easy with WPUF Column field. Just drag the column field in the builder area, configure columns number, column space and any fields you want inside that Column field.' . 'Multi-select Category', - ], - [ - 'title' => __( 'Unable to render the events on the front-end dashboard', 'wp-user-frontend' ), - 'type' => 'Fix', - 'description' => __( 'On the frontend dashboard, the submitted events were not showing, you will get it fixed in this version.', 'wp-user-frontend' ), - ], - [ - 'title' => __( 'Page order getting 0(zero) after editing from the frontend', 'wp-user-frontend' ), - 'type' => 'Fix', - 'description' => __( 'Page order was not saving while editing a post using WPUF form, it has been fixed.', 'wp-user-frontend' ), - ], - [ - 'title' => __( 'Text input field for taxonomies not working', 'wp-user-frontend' ), - 'type' => 'Fix', - 'description' => __( 'When taxonomy field type is set to `Text Input` then a fatal error was showing on the frontend, no error with taxonomy field in the latest version.', 'wp-user-frontend' ), - ], - [ - 'title' => __( 'In radio and checkbox field use conditional logic that value does not save in database', 'wp-user-frontend' ), - 'type' => 'Fix', - 'description' => __( 'The selected value of radio and checkbox field were not showing while editing posts from the backend or frontend, you can see the selected value in this version.', 'wp-user-frontend' ), - ], - [ - 'title' => __( 'The args param not working with get_avatar filter', 'wp-user-frontend' ), - 'type' => 'Fix', - 'description' => __( 'The args parameter did not exist with get_avatar filter, which now exists.', 'wp-user-frontend' ), - ], - [ - 'title' => __( 'The item in ajax taxonomy field was not selected', 'wp-user-frontend' ), - 'type' => 'Fix', - 'description' => __( 'When the taxonomy field type is set to Ajax, the submitted terms were not showing in the backend and frontend which have been fixed.', 'wp-user-frontend' ), - ], - ], - ], - [ - 'version' => 'Version 3.1.0', - 'released' => '2019-01-31', - 'changes' => [ - [ - 'title' => __( 'Unable to send new user registration email', 'wp-user-frontend' ), - 'type' => 'Fix', - 'description' => __( 'WP User Frontend default registration form `[wpuf-registration]` was unable to send the new user registration email.', 'wp-user-frontend' ), - ], - [ - 'title' => __( 'WPUF forms block compatibility issue with the latest WP version', 'wp-user-frontend' ), - 'type' => 'Fix', - 'description' => __( 'With the latest version of WordPress the gutenberg block of WP User Frontend were not working. In this version, you will get it fixed.', 'wp-user-frontend' ), - ], - [ - 'title' => __( 'Page not update where `[wpuf_dashboard]` shortcode exist', 'wp-user-frontend' ), - 'type' => 'Fix', - 'description' => __( 'While using Gutenberg, the page were not being updated with WPUF shortcode [wpuf dashboard]', 'wp-user-frontend' ), - ], - [ - 'title' => __( 'Retain default when determining whether to display the admin bar', 'wp-user-frontend' ), - 'type' => 'Fix', - 'description' => __( "From the User Frontend Settings, set that Administrator, Editor, Vendor can see the admin bar. Now, the super admin want, one specific user ( who has the user role from the above ) can't see the admin bar and disabled it from the Toolbar form that specific user profile. And this configuration ( Toolbar ) from the specific user profile were unable to impact on the frontend.", 'wp-user-frontend' ), - ], - [ - 'title' => __( 'Fatal error when use PHP lower version (5.4 or lower)', 'wp-user-frontend' ), - 'type' => 'Fix', - 'description' => __( "It was unable to install WP User Frontend with PHP 5.4 or lower version. Here is the error details:

    Fatal error: Can't use method return value in write context in /wp-user-frontend/class/frontend-form-post.php on line 194", 'wp-user-frontend' ), - ], - [ - 'title' => __( 'Product form was unable to show the single gallery image', 'wp-user-frontend' ), - 'type' => 'Fix', - 'description' => __( 'When user upload single image for product gallery using WPUF WooCommerce product form, that image were not showing on the frontend.', 'wp-user-frontend' ), - ], - ], - ], - [ - 'version' => 'Version 2.9.4', - 'released' => '2018-11-20', - 'changes' => [ - [ - 'title' => __( 'WooCommerce gallery images not getting saved', 'wp-user-frontend' ), - 'type' => 'Fix', - 'description' => __( 'After releasing version 2.9.3, WooCommerce gallery image field stopped working. You will get it fixed in this version.', 'wp-user-frontend' ), - ], - ], - ], - [ - 'version' => 'Version 2.9.0', - 'released' => '2018-08-14', - 'changes' => [ - [ - 'title' => __( 'The Events Calendar Integration Form', 'wp-user-frontend' ), - 'type' => 'New', - 'description' => __( 'Now admin can allow users to create event from the frontend. Currently WPUF has a one click pre-build event form that has been integrated with The Events Calendar plugin', 'wp-user-frontend' ), - ], - [ - 'title' => __( 'Post Submission Facility From Account Page', 'wp-user-frontend' ), - 'type' => 'New', - 'description' => __( 'On the frontend account page, added a new menu item named Submit Post. Now admin can allow users to submit post from their default account page. As an admin you can disable or enable this option from User Frontend -> Settings -> My Account -> Post Submission, Also, you can assign any post form that will use to submit posts.', 'wp-user-frontend' ), - ], - [ - 'title' => __( 'Login/Lost Password Link Under Registration Form', 'wp-user-frontend' ), - 'type' => 'Improvement', - 'description' => __( 'Added Login/Lost Password link under registration form', 'wp-user-frontend' ), - ], - ], - ], - [ - 'version' => 'Version 2.8.10', - 'released' => '2018-07-17', - 'changes' => [ - [ - 'title' => __( 'Added drag and drop image ordering on image upload', 'wp-user-frontend' ), - 'type' => 'New', - 'description' => __( 'Now frontend users can drag & drop the images/files to change the order while uploading.', 'wp-user-frontend' ), - ], - [ - 'title' => __( 'Added reCAPTCHA field in login form', 'wp-user-frontend' ), - 'type' => 'New', - 'description' => __( 'Admin has the option to show reCAPTCHA field in login form. Check the related settings from User Frontend > Settings > Login/Registration', 'wp-user-frontend' ), - ], - [ - 'title' => __( 'Added preview option in forms', 'wp-user-frontend' ), - 'type' => 'New', - 'description' => __( 'You can see a nice Preview button with Save Form button, admin can take a quick look of the form without using shortcode', 'wp-user-frontend' ), - ], - [ - 'title' => __( 'Fixed hiding “Select Image” button while uploading multiple images.', 'wp-user-frontend' ), - 'type' => 'Fix', - 'description' => __( 'The upload button will not be hidden until the user selects max number of files ', 'wp-user-frontend' ), - ], - [ - 'title' => __( 'Added form limit notice before form submission', 'wp-user-frontend' ), - 'type' => 'Improvement', - 'description' => __( 'Limit notice message was showing after submission, now it is showing when rendering the form', 'wp-user-frontend' ), - ], - [ - 'title' => __( 'Fixed: default post category not saving', 'wp-user-frontend' ), - 'type' => 'Fix', - 'description' => __( 'From the form Settings > Post Settings, default post category options were not saving. Now, it\'s fixed.', 'wp-user-frontend' ), - ], - [ - 'title' => __( 'WPUF dashboard shortcode with form_id attribute was not showing posts properly', 'wp-user-frontend' ), - 'type' => 'Fix', - 'description' => __( 'Now you can list posts on the frontend by using form_id attribute with [wpuf_dashboard] shortcode', 'wp-user-frontend' ), - ], - ], - ], - [ - 'version' => 'Version 2.8.9', - 'released' => '2018-06-06', - 'changes' => [ - [ - 'title' => __( 'Changed text domain to `wp-user-frontend` from `wpuf` ', 'wp-user-frontend' ), - 'type' => 'Improvement', - 'description' => __( 'If you are using other language than English. Please rename your .po and .mo files to `wp-user-frontend_` from `wpuf_`
    This change was made to support translations from translate.wordpress.org', 'wp-user-frontend' ), - ], - [ - 'title' => __( 'Added WP User Frontend Data export and erase functionality.', 'wp-user-frontend' ), - 'type' => 'New', - 'description' => __( 'Added functionality to export WP User Frontend Data to comply with GDPR.', 'wp-user-frontend' ), - ], - [ - 'title' => __( 'Added billing address customizer.', 'wp-user-frontend' ), - 'type' => 'New', - 'description' => __( 'Added customizer options for billing address in payment page.', 'wp-user-frontend' ), - ], - [ - 'title' => __( 'Make the payment page responsive.', 'wp-user-frontend' ), - 'type' => 'Improvement', - 'description' => __( 'Some css adjustments are made in payment page to make it responsive.', 'wp-user-frontend' ), - ], - [ - 'title' => __( 'Fixed image upload issue in Safari.', 'wp-user-frontend' ), - 'type' => 'Fix', - 'description' => __( 'Images were not showing after upload in safari, it is fixed now.', 'wp-user-frontend' ), - ], - [ - 'title' => __( 'Post update issue after updating or removing post images.', 'wp-user-frontend' ), - 'type' => 'Fix', - 'description' => __( 'Posts cannot be updated after updating or removing post images, it is fixed now.', 'wp-user-frontend' ), - ], - ], - ], - [ - 'version' => 'Version 2.8.8', - 'released' => '2018-05-16', - 'changes' => [ - [ - 'title' => __( 'Allow overriding form input styles using theme styling.', 'wp-user-frontend' ), - 'type' => 'New', - 'description' => __( 'Overriding form input styles using theme style is now possible.', 'wp-user-frontend' ), - ], - [ - 'title' => __( 'Fixed Auto Login after registration.', 'wp-user-frontend' ), - 'type' => 'Fix', - 'description' => __( 'Auto Login after registration was not working is fixed now.', 'wp-user-frontend' ), - ], - [ - 'title' => __( 'Fixed fallback cost calculation', 'wp-user-frontend' ), - 'type' => 'Fix', - 'description' => __( 'Fallback cost calculation was inaccurate for some cases, it is fixed now.', 'wp-user-frontend' ), - ], - [ - 'title' => __( 'Removal of subscription from User Profile gets reverted if updated', 'wp-user-frontend' ), - 'type' => 'Fix', - 'description' => __( 'User subscription deletion gets reverted if updated is fixed.', 'wp-user-frontend' ), - ], - [ - 'title' => __( 'Show Free pack users in subscribers list.', 'wp-user-frontend' ), - 'type' => 'Improvement', - 'description' => __( 'Free pack users were not showing in subscribers list, now they will.', 'wp-user-frontend' ), - ], - ], - ], - [ - 'version' => 'Version 2.8.7', - 'released' => '2018-04-09', - 'changes' => [ - [ - 'title' => __( 'WP User Frontend Guten Block is added', 'wp-user-frontend' ), - 'type' => 'New', - 'description' => __( 'WPUF Form Block is now available to be used within gutenberg editor with preview of the form. ', 'wp-user-frontend' ), - ], - [ - 'title' => __( 'Advanced Custom Fields plugin compatibility', 'wp-user-frontend' ), - 'type' => 'New', - 'description' => __( 'Now all your ACF fields can be used within WPUF Post forms. ', 'wp-user-frontend' ), - ], - [ - 'title' => __( 'Taxonomy Terms not showing for custom post types', 'wp-user-frontend' ), - 'type' => 'Fix', - 'description' => __( 'Fixed an issue with taxonomy terms not appearing for Custom Post types within Form Settings and Dashboard Post Listing', 'wp-user-frontend' ), - ], - [ - 'title' => __( 'Various other code optimizations', 'wp-user-frontend' ), - 'type' => 'Improvement', - 'description' => __( 'Code structure organization and optimization for better performance', 'wp-user-frontend' ), - ], - ], - ], - [ - 'version' => 'Version 2.8.6', - 'released' => '2018-03-22', - 'changes' => [ - [ - 'title' => __( 'WoooCommerce billing address Sync', 'wp-user-frontend' ), - 'type' => 'Improvement', - 'description' => __( 'If an existing customer has previously set his billing address, that will be imported into WPUF Billing address ', 'wp-user-frontend' ), - ], - [ - 'title' => __( 'Trial subscription message not showing properly', 'wp-user-frontend' ), - 'type' => 'Improvement', - 'description' => __( 'Subscriptions with Trial now shows trial notices', 'wp-user-frontend' ), - ], - [ - 'title' => __( 'Reset email Key not working', 'wp-user-frontend' ), - 'type' => 'Fix', - 'description' => __( 'Reset Email key was not working in some cases', 'wp-user-frontend' ), - ], - [ - 'title' => __( 'Post count not showing on the frontend dashboard', 'wp-user-frontend' ), - 'type' => 'Fix', - 'description' => __( 'Dashboard with multiple post type was not showing post counts properly, is now fixed and shows count for each post type', 'wp-user-frontend' ), - ], - [ - 'title' => __( 'Login Redirect showing blank page is fixed', 'wp-user-frontend' ), - 'type' => 'Fix', - 'description' => __( 'If "Previous Page" was set for redirection, login redirect was redirecting to blank page for users who hit login page directly', 'wp-user-frontend' ), - ], - ], - ], - [ - 'version' => 'Version 2.8.5', - 'released' => '2018-03-12', - 'changes' => [ - [ - 'title' => __( 'Enhanced Login Redirect to redirect users to previous page', 'wp-user-frontend' ), - 'type' => 'New', - 'description' => __( 'You can choose Previous Page as Login Redirect page settings now to redirect users to the page from which they went for Login. ', 'wp-user-frontend' ), - ], - [ - 'title' => __( 'Email HTML links not Rendreing properly issue is fixed', 'wp-user-frontend' ), - 'type' => 'Fix', - 'description' => __( 'For some clients emails were not rendering the HTML links properly, this is now fixed', 'wp-user-frontend' ), - ], - [ - 'title' => __( 'Form Builder : Form Field\'s Help text styles not showing properly', 'wp-user-frontend' ), - 'type' => 'Fix', - 'description' => __( 'Help texts styling is now fixed and much easier to read and understand', 'wp-user-frontend' ), - ], - [ - 'title' => __( 'Various other code improvements', 'wp-user-frontend' ), - 'type' => 'Improvement', - 'description' => __( 'Code structure organization and optimization for better performance', 'wp-user-frontend' ), - ], - ], - ], - [ - 'version' => 'Version 2.8.4', - 'released' => '2018-03-04', - 'changes' => [ - [ - 'title' => __( 'Dashboard Post Listing now supports multiple post types', 'wp-user-frontend' ), - 'type' => 'New', - 'description' => __( 'Now you can show multiple post type in user dashboard using shortcode like this :
    [wpuf_dashboard post_type="post,page,custom_type"] ', 'wp-user-frontend' ), - ], - [ - 'title' => __( 'Added Login Redirect Settings', 'wp-user-frontend' ), - 'type' => 'New', - 'description' => __( 'You can now set a page from WPUF Settings > Login/Registration > Redirect after Login. When login redirection is active the user will be redirected to this page after login.', 'wp-user-frontend' ), - ], - [ - 'title' => __( 'Image Upload field button text can be changed', 'wp-user-frontend' ), - 'type' => 'New', - 'description' => __( 'The upload button text can now be changed for image upload fields which defaults to "Select Image" if not set. ', 'wp-user-frontend' ) . 'Multi-select Category', - ], - [ - 'title' => __( 'Multi Step Form styles made compatible with more themes', 'wp-user-frontend' ), - 'type' => 'Fix', - 'description' => __( 'Multi Step form can now be styled more easily with other themes ', 'wp-user-frontend' ), - ], - [ - 'title' => __( 'Required field condition for google map not working is fixed', 'wp-user-frontend' ), - 'type' => 'Fix', - 'description' => __( 'If Google Map field was set as required users were able to submit form without changing the default value.', 'wp-user-frontend' ), - ], - ], - ], - [ - 'version' => 'Version 2.8.3', - 'released' => '2018-02-15', - 'changes' => [ - [ - 'title' => __( 'Admin form builder is now fully responsive.', 'wp-user-frontend' ), - 'type' => 'New', - 'description' => __( 'Now you can edit forms from your mobile devices directly. Our improved responsive layouts of form builder makes it easy for you to build forms on the go.', 'wp-user-frontend' ), - ], - [ - 'title' => __( 'Added color schemes for creating attractive form layouts.', 'wp-user-frontend' ), - 'type' => 'New', - 'description' => __( 'We have added 3 new color schemes for the form layouts which you can choose from each form\'s new display settings.', 'wp-user-frontend' ), - ], - [ - 'title' => __( 'Restrict Free subscription pack to be enabled multiple times ', 'wp-user-frontend' ), - 'type' => 'Fix', - 'description' => __( 'Free subscription packs now can only be purchased once and the limit applies properly', 'wp-user-frontend' ), - ], - [ - 'title' => __( 'Various other bug fixes and improvements were made ', 'wp-user-frontend' ), - 'type' => 'Fix', - 'description' => __( 'Please see the change log to see full details.', 'wp-user-frontend' ), - ], - ], - ], - [ - 'version' => 'Version 2.8.2', - 'released' => '2018-01-23', - 'changes' => [ - [ - 'title' => __( 'Added upgrade function for default category', 'wp-user-frontend' ), - 'type' => 'Improvement', - 'description' => __( 'Upgrader added to upgrade previously set default post category.', 'wp-user-frontend' ), - ], - [ - 'title' => __( 'Subscription pack cannot be canceled', 'wp-user-frontend' ), - 'type' => 'Fix', - 'description' => __( 'Fixed recurring subscription pack cannot be canceled from my account page in subscription details section.', 'wp-user-frontend' ), - ], - [ - 'title' => __( 'page installer admin notice logic issue', 'wp-user-frontend' ), - 'type' => 'Fix', - 'description' => __( 'Fixed page installer admin notice logic problem due to new payment settings default value not set.', 'wp-user-frontend' ), - ], - ], - ], - - [ - 'version' => 'Version 2.8.1', - 'released' => '2018-01-14', - 'changes' => [ - [ - 'title' => __( 'Setup Wizard', 'wp-user-frontend' ), - 'type' => 'New', - 'description' => __( 'Setup Wizard added to turn off payment options and install pages.', 'wp-user-frontend' ) . - 'Setup Wizard', - ], - [ - 'title' => __( 'Multi-select Category', 'wp-user-frontend' ), - 'type' => 'New', - 'description' => __( 'Add multi-select to default category in post form settings.', 'wp-user-frontend' ) . - 'Multi-select Category', - ], - [ - 'title' => __( 'Select Text option for Taxonomy', 'wp-user-frontend' ), - 'type' => 'Improvement', - 'description' => __( 'Add Select Text option for taxonomy fields. Now you can add default text with empty value as first option for Taxonomy dropdown.', 'wp-user-frontend' ), - ], - [ - 'title' => __( 'Taxonomy Checkbox Inline', 'wp-user-frontend' ), - 'type' => 'Improvement', - 'description' => __( 'Added checkbox inline option to taxonomy checkbox. You can now display Taxonomy checkbox fields inline.', 'wp-user-frontend' ), - ], - ], - ], - - [ - 'version' => 'Version 2.8', - 'released' => '2018-01-06', - 'changes' => [ - [ - 'title' => __( 'Manage schedule for form submission', 'wp-user-frontend' ), - 'type' => 'New', - 'description' => __( 'Do not accept form submission if the current date is not between the date range of the schedule.', 'wp-user-frontend' ) . - 'Manage schedule for form submission', - ], - [ - 'title' => __( 'Restrict form submission based on the user roles', 'wp-user-frontend' ), - 'type' => 'New', - 'description' => __( 'Restrict form submission based on the user roles. Now you can manage user role base permission on form submission.', 'wp-user-frontend' ) . - 'Restrict form submission based on the users role', - ], - [ - 'title' => __( 'Limit how many entries a form will accept', 'wp-user-frontend' ), - 'type' => 'New', - 'description' => __( 'Limit how many entries a form will accept and display a custom message when that limit is reached.', 'wp-user-frontend' ) . - 'Limit how many entries a form will accept', - ], - [ - 'title' => __( 'Show/hide Admin Bar', 'wp-user-frontend' ), - 'type' => 'New', - 'description' => __( 'Control the admin bar visibility based on user roles.', 'wp-user-frontend' ) . - 'Show/hide Admin Bar', - ], - [ - 'title' => __( 'Ajax Login widget', 'wp-user-frontend' ), - 'type' => 'New', - 'description' => __( 'Login user is more simple now with Ajax Login Widget. The simple ajax login form do not required page loading for login.', 'wp-user-frontend' ) . - '

    ', - ], - [ - 'title' => __( 'Form submission with Captcha field', 'wp-user-frontend' ), - 'type' => 'Improvement', - 'description' => __( 'Form field validation process updated if form submits with captcha field.', 'wp-user-frontend' ), - ], - ], - ], -]; - -function _wpuf_changelog_content( $content ) { - $content = wpautop( $content, true ); - - return $content; -} -?> - -
    -

    - -
    - - -
    -
    -

    -

    - ( ago) -

    -
    -
    -
      - -
    • -

      - - -

      - - -
      - -
      - -
    • - -
    -
    -
    - -
    - -
    diff --git a/admin/posting.php b/admin/posting.php index 70cbc239b..e98be244a 100644 --- a/admin/posting.php +++ b/admin/posting.php @@ -16,7 +16,7 @@ public function __construct() { add_action( 'add_meta_boxes', [ $this, 'add_meta_box_form_select'] ); add_action( 'add_meta_boxes', [ $this, 'add_meta_box_post_lock'] ); add_action( 'admin_enqueue_scripts', [ $this, 'enqueue_script'] ); - add_action( 'save_post', [ $this, 'save_meta'], 100, 2 ); // save the custom fields + add_action( 'save_post', [ $this, 'save_meta' ], 100, 2 ); // save the custom fields add_action( 'save_post', [ $this, 'form_selection_metabox_save' ], 1, 2 ); // save edit form id add_action( 'save_post', [ $this, 'post_lock_metabox_save' ], 1, 2 ); // save post lock option add_action( 'wp_ajax_wpuf_clear_schedule_lock', [$this, 'clear_schedule_lock'] ); @@ -53,20 +53,22 @@ public function enqueue_script() { } else { add_action( 'admin_head', 'wpuf_hide_google_map_button' ); - function wpuf_hide_google_map_button() { - echo wp_kses( "", [ - 'style' => [], - 'button' => [] - ] ); + 'style' => [], + 'button' => [] + ] ); + } } } - wp_enqueue_style( 'wpuf-sweetalert2', WPUF_ASSET_URI . '/vendor/sweetalert2/dist/sweetalert2.css', [], '11.4.30' ); - wp_enqueue_script( 'wpuf-sweetalert2', WPUF_ASSET_URI . '/vendor/sweetalert2/dist/sweetalert2.js', [], '11.4.30', true ); + wp_enqueue_style( 'wpuf-sweetalert2', WPUF_ASSET_URI . '/vendor/sweetalert2/sweetalert2.css', [], '11.4.19' ); + wp_enqueue_script( 'wpuf-sweetalert2', WPUF_ASSET_URI . '/vendor/sweetalert2/sweetalert2.js', [], '11.4.19', true ); wp_enqueue_script( 'wpuf-upload', WPUF_ASSET_URI . '/js/upload.js', ['jquery', 'plupload-handlers'] ); wp_localize_script( 'wpuf-upload', 'wpuf_frontend_upload', [ 'confirmMsg' => __( 'Are you sure?', 'wp-user-frontend' ), @@ -216,13 +218,13 @@ public function post_lock_metabox() {

    [ - 'href' => [], - 'id' => [], - 'data' => [], - ] - ] ); + echo wp_kses( $msg, [ + 'a' => [ + 'href' => [], + 'id' => [], + 'data' => [], + ] + ] ); ?>

    @@ -537,6 +539,10 @@ public function save_meta( $post_id, $post = null ) { public function clear_schedule_lock() { check_ajax_referer( 'wpuf_nonce', 'nonce' ); + if ( ! current_user_can( wpuf_admin_role() ) ) { + wp_send_json_error( __( 'Unauthorized operation', 'wp-user-frontend' ) ); + } + $post_id = isset( $_POST['post_id'] ) ? intval( wp_unslash( $_POST['post_id'] ) ) : ''; if ( !empty( $post_id ) ) { diff --git a/admin/settings-options.php b/admin/settings-options.php deleted file mode 100644 index f854002b2..000000000 --- a/admin/settings-options.php +++ /dev/null @@ -1,619 +0,0 @@ - 'wpuf_general', - 'title' => __( 'General Options', 'wp-user-frontend' ), - 'icon' => 'dashicons-admin-generic', - ], - [ - 'id' => 'wpuf_frontend_posting', - 'title' => __( 'Frontend Posting', 'wp-user-frontend' ), - 'icon' => 'dashicons-welcome-write-blog', - ], - [ - 'id' => 'wpuf_dashboard', - 'title' => __( 'Dashboard', 'wp-user-frontend' ), - 'icon' => 'dashicons-dashboard', - ], - [ - 'id' => 'wpuf_my_account', - 'title' => __( 'My Account', 'wp-user-frontend' ), - 'icon' => 'dashicons-id', - ], - [ - 'id' => 'wpuf_profile', - 'title' => __( 'Login / Registration', 'wp-user-frontend' ), - 'icon' => 'dashicons-admin-users', - ], - [ - 'id' => 'wpuf_payment', - 'title' => __( 'Payments', 'wp-user-frontend' ), - 'icon' => 'dashicons-money', - ], - [ - 'id' => 'wpuf_mails', - 'title' => __( 'E-Mails', 'wp-user-frontend' ), - 'icon' => 'dashicons-email-alt', - ], - [ - 'id' => 'wpuf_privacy', - 'title' => __( 'Privacy Options', 'wp-user-frontend' ), - 'icon' => 'dashicons-shield-alt', - ], - ]; - - return apply_filters( 'wpuf_settings_sections', $sections ); -} - -function wpuf_settings_fields() { - $pages = wpuf_get_pages(); - $users = wpuf_list_users(); - $post_types = get_post_types(); - unset( $post_types['attachment'], $post_types['revision'], $post_types['nav_menu_item'], $post_types['wpuf_forms'], $post_types['wpuf_profile'], $post_types['wpuf_input'], $post_types['wpuf_subscription'], $post_types['custom_css'], $post_types['customize_changeset'], $post_types['wpuf_coupon'], $post_types['oembed_cache'] ); - - $login_redirect_pages = [ - 'previous_page' => __( 'Previous Page', 'wp-user-frontend' ), - ] + $pages; - - $all_currencies = wpuf_get_currencies(); - - $currencies = []; - - foreach ( $all_currencies as $currency ) { - $currencies[ $currency['currency'] ] = $currency['label'] . ' (' . $currency['symbol'] . ')'; - } - - $default_currency_symbol = wpuf_get_currency( 'symbol' ); - - $user_roles = []; - $all_roles = get_editable_roles(); - - foreach ( $all_roles as $key => $value ) { - $user_roles[ $key ] = $value['name']; - } - - $settings_fields = [ - 'wpuf_general' => apply_filters( - 'wpuf_options_others', [ - [ - 'name' => 'show_admin_bar', - 'label' => __( 'Show Admin Bar', 'wp-user-frontend' ), - 'desc' => __( 'Select user by roles, who can view admin bar in frontend.', 'wp-user-frontend' ), - 'callback' => 'wpuf_settings_multiselect', - 'options' => $user_roles, - 'default' => [ 'administrator', 'editor', 'author', 'contributor' ], - ], - [ - 'name' => 'admin_access', - 'label' => __( 'Admin area access', 'wp-user-frontend' ), - 'desc' => __( 'Allow you to block specific user role to Ajax request and Media upload.', 'wp-user-frontend' ), - 'type' => 'select', - 'default' => 'read', - 'options' => [ - 'manage_options' => __( 'Admin Only', 'wp-user-frontend' ), - 'edit_others_posts' => __( 'Admins, Editors', 'wp-user-frontend' ), - 'publish_posts' => __( 'Admins, Editors, Authors', 'wp-user-frontend' ), - 'edit_posts' => __( 'Admins, Editors, Authors, Contributors', 'wp-user-frontend' ), - 'read' => __( 'Default', 'wp-user-frontend' ), - ], - ], - [ - 'name' => 'override_editlink', - 'label' => __( 'Override the post edit link', 'wp-user-frontend' ), - 'desc' => __( 'Users see the edit link in post if s/he is capable to edit the post/page. Selecting Yes will override the default WordPress edit post link in frontend', 'wp-user-frontend' ), - 'type' => 'select', - 'default' => 'no', - 'options' => [ - 'yes' => __( 'Yes', 'wp-user-frontend' ), - 'no' => __( 'No', 'wp-user-frontend' ), - ], - ], - [ - 'name' => 'wpuf_compatibility_acf', - 'label' => __( 'ACF Compatibility', 'wp-user-frontend' ), - 'desc' => __( 'Select Yes if you want to make compatible WPUF custom fields data with advanced custom fields.', 'wp-user-frontend' ), - 'type' => 'select', - 'default' => 'no', - 'options' => [ - 'yes' => __( 'Yes', 'wp-user-frontend' ), - 'no' => __( 'No', 'wp-user-frontend' ), - ], - ], - [ - 'name' => 'load_script', - 'label' => __( 'Load Scripts', 'wp-user-frontend' ), - 'desc' => __( 'Load scripts/styles in all pages', 'wp-user-frontend' ), - 'type' => 'checkbox', - 'default' => 'on', - ], - [ - 'name' => 'recaptcha_public', - 'label' => __( 'reCAPTCHA Site Key', 'wp-user-frontend' ), - ], - [ - 'name' => 'recaptcha_private', - 'label' => __( 'reCAPTCHA Secret Key', 'wp-user-frontend' ), - 'desc' => __( 'Register here to get reCaptcha Site and Secret keys.', 'wp-user-frontend' ), - ], - [ - 'name' => 'custom_css', - 'label' => __( 'Custom CSS codes', 'wp-user-frontend' ), - 'desc' => __( 'If you want to add your custom CSS code, it will be added on page header wrapped with style tag', 'wp-user-frontend' ), - 'type' => 'textarea', - ], - ] - ), - 'wpuf_frontend_posting' => apply_filters( - 'wpuf_options_frontend_posting', [ - [ - 'name' => 'edit_page_id', - 'label' => __( 'Edit Page', 'wp-user-frontend' ), - 'desc' => __( 'Select the page where [wpuf_edit] is located', 'wp-user-frontend' ), - 'type' => 'select', - 'options' => $pages, - ], - [ - 'name' => 'default_post_owner', - 'label' => __( 'Default Post Owner', 'wp-user-frontend' ), - 'desc' => __( 'If guest post is enabled and user details are OFF, the posts are assigned to this user', 'wp-user-frontend' ), - 'type' => 'select', - 'options' => $users, - 'default' => '1', - ], - [ - 'name' => 'cf_show_front', - 'label' => __( 'Custom Fields in post', 'wp-user-frontend' ), - 'desc' => __( 'Show custom fields on post content area', 'wp-user-frontend' ), - 'type' => 'checkbox', - 'default' => 'off', - ], - [ - 'name' => 'insert_photo_size', - 'label' => __( 'Insert Photo image size', 'wp-user-frontend' ), - 'desc' => __( 'Default image size of "Insert Photo" button in post content area', 'wp-user-frontend' ), - 'type' => 'select', - 'options' => wpuf_get_image_sizes(), - 'default' => 'thumbnail', - ], - [ - 'name' => 'insert_photo_type', - 'label' => __( 'Insert Photo image type', 'wp-user-frontend' ), - 'desc' => __( 'Default image type of "Insert Photo" button in post content area', 'wp-user-frontend' ), - 'type' => 'select', - 'options' => [ - 'image' => __( 'Image only', 'wp-user-frontend' ), - 'link' => __( 'Image with link', 'wp-user-frontend' ), - ], - 'default' => 'link', - ], - [ - 'name' => 'image_caption', - 'label' => __( 'Enable Image Caption', 'wp-user-frontend' ), - 'desc' => __( 'Allow users to update image/video title, caption and description', 'wp-user-frontend' ), - 'type' => 'checkbox', - 'default' => 'off', - ], - [ - 'name' => 'default_post_form', - 'label' => __( 'Default Post Form', 'wp-user-frontend' ), - 'desc' => __( 'Fallback form for post editing if no associated form found', 'wp-user-frontend' ), - 'type' => 'select', - 'options' => wpuf_get_pages( 'wpuf_forms' ), - ], - ] - ), - 'wpuf_dashboard' => apply_filters( - 'wpuf_options_dashboard', [ - [ - 'name' => 'enable_post_edit', - 'label' => __( 'Users can edit post?', 'wp-user-frontend' ), - 'desc' => __( 'Users will be able to edit their own posts', 'wp-user-frontend' ), - 'type' => 'select', - 'default' => 'yes', - 'options' => [ - 'yes' => __( 'Yes', 'wp-user-frontend' ), - 'no' => __( 'No', 'wp-user-frontend' ), - ], - ], - [ - 'name' => 'enable_post_del', - 'label' => __( 'User can delete post?', 'wp-user-frontend' ), - 'desc' => __( 'Users will be able to delete their own posts', 'wp-user-frontend' ), - 'type' => 'select', - 'default' => 'yes', - 'options' => [ - 'yes' => __( 'Yes', 'wp-user-frontend' ), - 'no' => __( 'No', 'wp-user-frontend' ), - ], - ], - [ - 'name' => 'disable_pending_edit', - 'label' => __( 'Pending Post Edit', 'wp-user-frontend' ), - 'desc' => __( 'Disable post editing while post in "pending" status', 'wp-user-frontend' ), - 'type' => 'checkbox', - 'default' => 'on', - ], - [ - 'name' => 'disable_publish_edit', - 'label' => __( 'Editing Published Post', 'wp-user-frontend' ), - 'desc' => __( 'Disable post editing while post in "publish" status', 'wp-user-frontend' ), - 'type' => 'checkbox', - 'default' => 'off', - ], - [ - 'name' => 'per_page', - 'label' => __( 'Posts per page', 'wp-user-frontend' ), - 'desc' => __( 'How many posts will be listed in a page', 'wp-user-frontend' ), - 'type' => 'text', - 'default' => '10', - ], - [ - 'name' => 'show_user_bio', - 'label' => __( 'Show user bio', 'wp-user-frontend' ), - 'desc' => __( 'Users biographical info will be shown', 'wp-user-frontend' ), - 'type' => 'checkbox', - 'default' => 'on', - ], - [ - 'name' => 'show_post_count', - 'label' => __( 'Show post count', 'wp-user-frontend' ), - 'desc' => __( 'Show how many posts are created by the user', 'wp-user-frontend' ), - 'type' => 'checkbox', - 'default' => 'on', - ], - [ - 'name' => 'show_ft_image', - 'label' => __( 'Show Featured Image', 'wp-user-frontend' ), - 'desc' => __( 'Show featured image of the post (Overridden by Shortcode)', 'wp-user-frontend' ), - 'type' => 'checkbox', - ], - [ - 'name' => 'show_payment_column', - 'label' => __( 'Show Payment Column', 'wp-user-frontend' ), - 'desc' => __( 'Enable if you want show payment column on posts table', 'wp-user-frontend' ), - 'type' => 'checkbox', - 'default' => 'on', - ], - [ - 'name' => 'ft_img_size', - 'label' => __( 'Featured Image size', 'wp-user-frontend' ), - 'type' => 'select', - 'options' => wpuf_get_image_sizes(), - ], - [ - 'name' => 'un_auth_msg', - 'label' => __( 'Unauthorized Message', 'wp-user-frontend' ), - 'desc' => __( 'Not logged in users will see this message', 'wp-user-frontend' ), - 'type' => 'textarea', - ], - ] - ), - 'wpuf_my_account' => apply_filters( - 'wpuf_options_wpuf_my_account', [ - [ - 'name' => 'account_page', - 'label' => __( 'Account Page', 'wp-user-frontend' ), - 'desc' => __( 'Select the page which contains [wpuf_account] shortcode', 'wp-user-frontend' ), - 'type' => 'select', - 'options' => $pages, - ], - [ - 'name' => 'cp_on_acc_page', - 'label' => __( 'Select Custom Post For Account Page', 'wp-user-frontend' ), - 'desc' => __( 'Select the post types you want to show on user dashboard.', 'wp-user-frontend' ), - 'callback' => 'wpuf_settings_multiselect', - 'options' => $post_types, - ], - [ - 'name' => 'account_page_active_tab', - 'label' => __( 'Active Tab', 'wp-user-frontend' ), - 'desc' => __( 'Which tab should be set as active by default when opening the account page', 'wp-user-frontend' ), - 'type' => 'select', - 'options' => wpuf_get_account_sections_list(), - ], - [ - 'name' => 'show_subscriptions', - 'label' => __( 'Show Subscriptions', 'wp-user-frontend' ), - 'desc' => __( 'Show Subscriptions tab in "my account" page where [wpuf_account] is located', 'wp-user-frontend' ), - 'type' => 'checkbox', - 'default' => 'on', - ], - [ - 'name' => 'show_billing_address', - 'label' => __( 'Show Billing Address', 'wp-user-frontend' ), - 'desc' => __( 'Show billing address in account page.', 'wp-user-frontend' ), - 'type' => 'checkbox', - 'default' => 'on', - ], - ] - ), - 'wpuf_profile' => apply_filters( - 'wpuf_options_profile', [ - [ - 'name' => 'autologin_after_registration', - 'label' => __( 'Auto Login After Registration', 'wp-user-frontend' ), - 'desc' => __( 'If enabled, users after registration will be logged in to the system', 'wp-user-frontend' ), - 'type' => 'checkbox', - 'default' => 'on', - ], - [ - 'name' => 'register_link_override', - 'label' => __( 'Login/Registration override', 'wp-user-frontend' ), - 'desc' => __( 'If enabled, default login and registration forms will be overridden by WPUF with pages below', 'wp-user-frontend' ), - 'type' => 'checkbox', - 'default' => 'on', - ], - [ - 'name' => 'reg_override_page', - 'label' => __( 'Registration Page', 'wp-user-frontend' ), - 'desc' => __( 'Select the page you want to use as registration page override (should have shortcode)', 'wp-user-frontend' ), - 'type' => 'select', - 'options' => $pages, - ], - [ - 'name' => 'login_page', - 'label' => __( 'Login Page', 'wp-user-frontend' ), - 'desc' => __( 'Select the page which contains [wpuf-login] shortcode', 'wp-user-frontend' ), - 'type' => 'select', - 'options' => $pages, - ], - [ - 'name' => 'redirect_after_login_page', - 'label' => __( 'Redirect After Login', 'wp-user-frontend' ), - 'desc' => __( 'After successfull login, where the page will redirect to', 'wp-user-frontend' ), - 'type' => 'select', - 'options' => $login_redirect_pages, - ], - [ - 'name' => 'wp_default_login_redirect', - 'label' => __( 'Default Login Redirect', 'wp-user-frontend' ), - 'desc' => __( 'If enabled, users who login using WordPress default login form will be redirected to the selected page.', 'wp-user-frontend' ), - 'type' => 'checkbox', - 'default' => 'off', - ], - [ - 'name' => 'login_form_recaptcha', - 'label' => __( 'reCAPTCHA in Login Form', 'wp-user-frontend' ), - 'desc' => __( 'If enabled, users have to verify reCAPTCHA in login page. Also, make sure that reCAPTCHA is configured properly from General Options', 'wp-user-frontend' ), - 'type' => 'checkbox', - 'default' => 'off', - ], - ] - ), - 'wpuf_payment' => apply_filters( - 'wpuf_options_payment', [ - [ - 'name' => 'enable_payment', - 'label' => __( 'Enable Payments', 'wp-user-frontend' ), - 'desc' => __( 'Enable payments on your site.', 'wp-user-frontend' ), - 'type' => 'checkbox', - 'default' => 'on', - ], - [ - 'name' => 'subscription_page', - 'label' => __( 'Subscription Pack Page', 'wp-user-frontend' ), - 'desc' => __( 'Select the page where [wpuf_sub_pack] located.', 'wp-user-frontend' ), - 'type' => 'select', - 'options' => $pages, - ], - [ - 'name' => 'register_subscription', - 'label' => __( 'Subscription at registration', 'wp-user-frontend' ), - 'desc' => __( 'Registration time redirect to subscription page', 'wp-user-frontend' ), - 'type' => 'checkbox', - ], - [ - 'name' => 'currency', - 'label' => __( 'Currency', 'wp-user-frontend' ), - 'type' => 'select', - 'default' => 'USD', - 'options' => $currencies, - ], - [ - 'name' => 'currency_position', - 'label' => __( 'Currency Position', 'wp-user-frontend' ), - 'type' => 'select', - 'default' => 'left', - 'options' => [ - 'left' => sprintf( '%1$s (%2$s99.99)', __( 'Left', 'wp-user-frontend' ), $default_currency_symbol ), - 'right' => sprintf( '%1$s (99.99%2$s)', __( 'Right', 'wp-user-frontend' ), $default_currency_symbol ), - 'left_space' => sprintf( '%1$s (%2$s 99.99)', __( 'Left with space', 'wp-user-frontend' ), $default_currency_symbol ), - 'right_space' => sprintf( '%1$s (99.99 %2$s)', __( 'Right with space', 'wp-user-frontend' ), $default_currency_symbol ), - ], - ], - [ - 'name' => 'wpuf_price_thousand_sep', - 'label' => __( 'Thousand Separator', 'wp-user-frontend' ), - 'desc' => __( 'This sets the thousand separator of displayed prices.', 'wp-user-frontend' ), - 'css' => 'width:50px;', - 'default' => ',', - 'type' => 'text', - 'desc_tip' => true, - ], - [ - 'name' => 'wpuf_price_decimal_sep', - 'label' => __( 'Decimal Separator', 'wp-user-frontend' ), - 'desc' => __( 'This sets the decimal separator of displayed prices.', 'wp-user-frontend' ), - 'default' => '.', - 'type' => 'text', - ], - - [ - 'name' => 'wpuf_price_num_decimals', - 'label' => __( 'Number of Decimals', 'wp-user-frontend' ), - 'desc' => __( 'This sets the number of decimal points shown in displayed prices.', 'wp-user-frontend' ), - 'default' => '2', - 'type' => 'number', - 'custom_attributes' => [ - 'min' => 0, - 'step' => 1, - ], - ], - [ - 'name' => 'sandbox_mode', - 'label' => __( 'Enable demo/sandbox mode', 'wp-user-frontend' ), - 'desc' => __( 'When sandbox mode is active, all payment gateway will be used in demo mode', 'wp-user-frontend' ), - 'type' => 'checkbox', - 'default' => 'on', - ], - [ - 'name' => 'payment_page', - 'label' => __( 'Payment Page', 'wp-user-frontend' ), - 'desc' => __( 'This page will be used to process payment options', 'wp-user-frontend' ), - 'type' => 'select', - 'options' => $pages, - ], - [ - 'name' => 'payment_success', - 'label' => __( 'Payment Success Page', 'wp-user-frontend' ), - 'desc' => __( 'After payment users will be redirected here', 'wp-user-frontend' ), - 'type' => 'select', - 'options' => $pages, - ], - [ - 'name' => 'active_gateways', - 'label' => __( 'Payment Gateways', 'wp-user-frontend' ), - 'desc' => __( 'Active payment gateways', 'wp-user-frontend' ), - 'type' => 'multicheck', - 'options' => wpuf_get_gateways(), - ], - [ - 'name' => 'failed_retry', - 'label' => __( 'Retry Failed Payment', 'wp-user-frontend' ), - 'desc' => __( 'How many times should retry for failed payment max is 4', 'wp-user-frontend' ), - 'default' => '2', - 'type' => 'number', - 'custom_attributes' => [ - 'min' => 1, - 'max' => 4, - 'step' => 1, - ], - ], - ] - ), - 'wpuf_mails' => apply_filters( - 'wpuf_mail_options', [ - [ - 'name' => 'guest_email_setting', - 'label' => __( ' Guest Email', 'wp-user-frontend' ), - 'type' => 'html', - 'class' => 'guest-email-setting', - ], - [ - 'name' => 'enable_guest_email_notification', - 'class' => 'guest-email-setting-option', - 'label' => __( 'Guest Email Notification', 'wp-user-frontend' ), - 'desc' => __( 'Enable Guest Email Notification .', 'wp-user-frontend' ), - 'default' => 'on', - 'type' => 'checkbox', - ], - [ - 'name' => 'guest_email_subject', - 'label' => __( 'Guest mail subject', 'wp-user-frontend' ), - 'desc' => __( 'This sets the subject of the emails sent to guest users', 'wp-user-frontend' ), - 'default' => 'Please Confirm Your Email to Get the Post Published!', - 'type' => 'text', - 'class' => 'guest-email-setting-option', - ], - [ - 'name' => 'guest_email_body', - 'label' => __( 'Guest mail body', 'wp-user-frontend' ), - 'desc' => __( "This sets the body of the emails sent to guest users. Please DON'T edit the {activation_link} part, you can use {sitename} too.", 'wp-user-frontend' ), - 'default' => 'Hey There, - - We just received your guest post and now we want you to confirm your email so that we can verify the content and move on to the publishing process. - - Please click the link below to verify: - {activation_link} - - Regards, - {sitename}', - 'type' => 'wysiwyg', - 'class' => 'guest-email-setting-option', - ], - ] - ), - 'wpuf_privacy' => apply_filters( - 'wpuf_privacy_options', [ - [ - 'name' => 'export_post_types', - 'label' => __( 'Post Types', 'wp-user-frontend' ), - 'desc' => __( 'Select the post types you will allow users to export.', 'wp-user-frontend' ), - 'callback' => 'wpuf_settings_multiselect', - 'options' => $post_types, - ], - ] - ), - ]; - - return apply_filters( 'wpuf_settings_fields', $settings_fields ); -} - -function wpuf_settings_field_profile( $form ) { - $user_roles = wpuf_get_user_roles(); - $forms = get_posts( - [ - 'numberposts' => -1, - 'post_type' => 'wpuf_profile', - ] - ); - $crown_icon = ''; - $class = ''; - $disabled = ''; - - $val = get_option( 'wpuf_profile', [] ); - - if ( ! class_exists( 'WP_User_Frontend_Pro' ) ) { - $crown_icon = sprintf( ' %s', file_get_contents( WPUF_ROOT . '/assets/images/crown.svg' ) ); - $class = 'class="pro-preview"'; - $disabled = 'disabled'; - } - ?> - -

    - -

    - - $name ) { - $current = isset( $val['roles'][ $role ] ) ? $val['roles'][ $role ] : ''; - ?> - > - - - - -
    - - -
    - 0, ] ); - $tax = is_array( $tax ) ? $tax : []; + $tax = is_array( $tax ) ? $tax : []; - foreach ( $tax as $tax_obj ) { - ?> + foreach ( $tax as $tax_obj ) { + ?>
    - + diff --git a/admin/template.php b/admin/template.php index 41b774890..b4b809345 100644 --- a/admin/template.php +++ b/admin/template.php @@ -377,7 +377,7 @@ public static function radio_field( $field_id, $label, $values = [] ) {
    - +
    @@ -401,7 +401,7 @@ public static function checkbox_field( $field_id, $label, $values = [] ) {
    - +
    @@ -628,7 +628,7 @@ public static function image_upload( $field_id, $label, $values = [] ) { - - - -
    - - - list_forms(); - $tools->list_regis_forms(); - break; - - case 'tools': - $tools->tool_page(); - break; - - case 'import': - $tools->import_data(); - break; - - default: - $tools->tool_page(); - break; - } - ?> -
    - - - - - diff --git a/assets/css/admin.css b/assets/css/admin.css index 330e25cb7..aa6c57d66 100644 --- a/assets/css/admin.css +++ b/assets/css/admin.css @@ -1,3 +1,6 @@ +h2.swal2-title { + line-height: 1.2em; +} .wpuf-admin fieldset { border: 1px solid #E3E3E3; margin: 20px 0 0px 0; @@ -580,6 +583,7 @@ ul.wpuf-form .wpuf-field-columns .wpuf-column-field-inner-columns .wpuf-column . background: #fff; -webkit-box-shadow: 0 0 10px rgba(0, 0, 0, 0.3); box-shadow: 0 0 10px rgba(0, 0, 0, 0.3); + position: relative; } ul.wpuf-form .wpuf-field-columns .wpuf-column-field-inner-columns .wpuf-column .wpuf-column-inner-fields ul.wpuf-column-fields-sortable-list li.column-field-items.current-editing { background-color: rgba(255, 185, 0, 0.15); @@ -676,6 +680,7 @@ tr.pro-preview-html th { .pro-field-overlay:hover { display: block; } +.wpuf-subscription-pack-settings nav .tab-current a.wpuf-button.button-upgrade-to-pro, a.wpuf-button.button-upgrade-to-pro { padding: 10px 15px; background: #ff9000; @@ -683,6 +688,7 @@ a.wpuf-button.button-upgrade-to-pro { min-height: auto; border-radius: 5px; text-decoration: none; + border: none; } .pro-field-overlay a.wpuf-button.button-upgrade-to-pro { position: absolute; @@ -691,6 +697,7 @@ a.wpuf-button.button-upgrade-to-pro { -webkit-transform: translate(-50%, -50%); transform: translate(-50%, -50%); } +.wpuf-subscription-pack-settings nav .tab-current a.wpuf-button.button-upgrade-to-pro:hover, a.wpuf-button.button-upgrade-to-pro:hover { background: #d07805; } @@ -729,6 +736,7 @@ img.user-listing.active { /* Safari 6.0 - 9.0 */ filter: grayscale(0%) opacity(1) drop-shadow(8px 8px 5px #ccc); } +.wpuf-subscription-pack-settings nav ul .wpuf-pro-field-tooltip, .wpuf-pro-field-tooltip { background: #000; width: max-content; @@ -752,26 +760,32 @@ img.user-listing.active { h3.tooltip-header { color: #fff; } +.wpuf-subscription-pack-settings nav ul .wpuf-pro-field-tooltip ul li span.tooltip-check svg path, .wpuf-pro-field-tooltip ul li span.tooltip-check svg path { fill: #139F84; } +.wpuf-subscription-pack-settings nav ul .wpuf-pro-field-tooltip ul, .wpuf-pro-field-tooltip ul { margin-bottom: 30px; } +.wpuf-subscription-pack-settings nav ul .wpuf-pro-field-tooltip ul li, .wpuf-pro-field-tooltip ul li { font-size: 1.2em; line-height: 1.5em; font-weight: 400; + margin-bottom: 6px; } span.tooltip-check { margin-right: 10px; } +.wpuf-subscription-pack-settings nav ul .wpuf-pro-field-tooltip .pro-link, .wpuf-pro-field-tooltip .pro-link { display: flex; -webkit-justify-content: center; justify-content: center; margin-left: 25px; } +.wpuf-subscription-pack-settings nav ul .wpuf-pro-field-tooltip i, .wpuf-pro-field-tooltip i { position: absolute; top: 100%; @@ -781,6 +795,7 @@ span.tooltip-check { height: 12px; overflow: hidden; } +.wpuf-subscription-pack-settings nav ul .wpuf-pro-field-tooltip i::after, .wpuf-pro-field-tooltip i::after { content: ''; position: absolute; @@ -791,6 +806,12 @@ span.tooltip-check { transform: translate(-50%, -50%) rotate(45deg); background-color: #000; } +tr.pro-preview.wpuf-subscription-recurring { + position: relative; +} +tr.pro-preview.wpuf-subscription-recurring td { + position: initial; +} tr.pro-preview span.pro-icon, tr span.pro-icon-title { position: relative; @@ -799,7 +820,7 @@ tr span.pro-icon-title { a span.pro-icon-title { position: relative; } -a span.pro-icon-title wpuf-pro-field-tooltip { +a span.pro-icon-title .wpuf-pro-field-tooltip { left: 185px; } span.pro-icon-title:hover .wpuf-pro-field-tooltip { @@ -841,6 +862,83 @@ span.pro-icon:hover .wpuf-pro-field-tooltip { position: absolute; right: 5px; } +.headway-header { + display: flex; + justify-content: space-between; +} +.headway-header ul { + display: flex; + justify-content: flex-end; + align-items: center; + margin: 10px 0; +} +.headway-header ul li.headway-icon { + background: #eea6d0; + margin-right: 1rem; + border-radius: 20px; + width: 10px; + height: 10px; + position: relative; + margin-top: 2px; +} +.headway-header ul li.headway-icon:hover { + background: #ee62b4; +} +.headway-header ul li.headway-icon span#HW_badge_cont { + position: absolute; + top: -6px; + left: -6px; +} +.headway-header ul li a { + font-size: 1rem; + text-decoration: none; +} +.headway-header ul li a:hover { + text-decoration: underline; +} +.user-frontend_page_wpuf-post-forms .wrap h2.with-headway-icon, +.user-frontend_page_wpuf-profile-forms .wrap h2.with-headway-icon, +.user-frontend_page_wpuf-settings .wrap h2.with-headway-icon { + display: flex; + justify-content: space-between; +} +.user-frontend_page_wpuf-post-forms .wrap h2.with-headway-icon .flex-end, +.user-frontend_page_wpuf-profile-forms .wrap h2.with-headway-icon .flex-end, +.user-frontend_page_wpuf-settings .wrap h2.with-headway-icon .flex-end { + display: flex; + align-items: center; +} +.user-frontend_page_wpuf-post-forms .wrap h2.with-headway-icon .flex-end .HW_badge.HW_softHidden, +.user-frontend_page_wpuf-profile-forms .wrap h2.with-headway-icon .flex-end .HW_badge.HW_softHidden, +.user-frontend_page_wpuf-settings .wrap h2.with-headway-icon .flex-end .HW_badge.HW_softHidden { + background: #eea6d0 !important; +} +.user-frontend_page_wpuf-post-forms .wrap h2.with-headway-icon .flex-end .flex-end .headway-icon:hover .HW_badge.HW_softHidden, +.user-frontend_page_wpuf-profile-forms .wrap h2.with-headway-icon .flex-end .flex-end .headway-icon:hover .HW_badge.HW_softHidden, +.user-frontend_page_wpuf-settings .wrap h2.with-headway-icon .flex-end .flex-end .headway-icon:hover .HW_badge.HW_softHidden { + background: #ee62b4 !important; +} +.user-frontend_page_wpuf-post-forms .wrap h2.with-headway-icon .flex-end a.canny-link, +.user-frontend_page_wpuf-profile-forms .wrap h2.with-headway-icon .flex-end a.canny-link, +.user-frontend_page_wpuf-settings .wrap h2.with-headway-icon .flex-end a.canny-link { + font-size: 1rem; + text-decoration: none; +} +.user-frontend_page_wpuf-post-forms .wrap h2.with-headway-icon .flex-end a.canny-link:hover, +.user-frontend_page_wpuf-profile-forms .wrap h2.with-headway-icon .flex-end a.canny-link:hover, +.user-frontend_page_wpuf-settings .wrap h2.with-headway-icon .flex-end a.canny-link:hover { + text-decoration: underline; +} +.user-frontend_page_wpuf-post-forms .wrap h2.with-headway-icon #HW_frame_cont, +.user-frontend_page_wpuf-profile-forms .wrap h2.with-headway-icon #HW_frame_cont, +.user-frontend_page_wpuf-settings .wrap h2.with-headway-icon #HW_frame_cont { + top: 78px !important; +} +@media only screen and (max-width: 1399px) { + a.wpuf-button.button-upgrade-to-pro { + padding: 10px; + } +} .wpuf-help-tabbed { display: flex; width: 100%; diff --git a/assets/css/admin/whats-new.css b/assets/css/admin/whats-new.css new file mode 100644 index 000000000..64e32c0e9 --- /dev/null +++ b/assets/css/admin/whats-new.css @@ -0,0 +1,101 @@ +.notice.wpuf-whats-new-notice { + display: flex; + position: relative; + padding: 0; + height: 65px; +} +.notice.wpuf-whats-new-notice .wpuf-whats-new-icon { + width: 75px; + height: 65px; + overflow: hidden; +} +.notice.wpuf-whats-new-notice .wpuf-whats-new-icon img { + max-width: 65px; +} +.notice.wpuf-whats-new-notice .wpuf-whats-new-text { + width: calc(100% - 240px); +} +.notice.wpuf-whats-new-notice .wpuf-whats-new-actions { + width: 165px; +} +.notice.wpuf-whats-new-notice .wpuf-whats-new-actions a { + display: inline-block; + margin-top: 20px; +} +.wpuf-whats-new .error, +.wpuf-whats-new .udpated, +.wpuf-whats-new .info, +.wpuf-whats-new .notice { + display: none; +} +.wpuf-whats-new h1 { + text-align: center; + margin-top: 20px; + font-size: 30px; +} +.wpuf-whats-new .wedevs-changelog { + display: flex; + max-width: 920px; + border: 1px solid #e5e5e5; + padding: 12px 20px 20px 20px; + margin: 20px auto; + background: #fff; + box-shadow: 0 1px 1px rgba(0, 0, 0, 0.04); +} +.wpuf-whats-new .wedevs-changelog .wedevs-changelog-version { + width: 360px; +} +.wpuf-whats-new .wedevs-changelog .wedevs-changelog-version .released { + font-style: italic; +} +.wpuf-whats-new .wedevs-changelog .wedevs-changelog-history { + width: 100%; + font-size: 14px; +} +.wpuf-whats-new .wedevs-changelog .wedevs-changelog-history li { + margin-bottom: 20px; +} +.wpuf-whats-new .wedevs-changelog .wedevs-changelog-history h4 { + margin: 0 0 10px 0; + font-size: 1.3em; + line-height: 26px; +} +.wpuf-whats-new .wedevs-changelog .wedevs-changelog-history p { + font-size: 14px; + line-height: 1.5; +} +.wpuf-whats-new .wedevs-changelog .wedevs-changelog-history img { + margin-top: 30px; + max-width: 100%; +} +.wpuf-whats-new .wedevs-changelog .wedevs-changelog-history span.label { + margin-left: 10px; + position: relative; + color: #fff; + border-radius: 20px; + padding: 0 8px; + font-size: 12px; + height: 20px; + line-height: 19px; + -webkit-appearance: none; + -moz-appearance: none; + appearance: none; + font-weight: normal; +} +.wpuf-whats-new .wedevs-changelog .wedevs-changelog-history span.label.new { + background: #3778ff; + border: 1px solid #3778ff; +} +.wpuf-whats-new .wedevs-changelog .wedevs-changelog-history span.label.improvement, +.wpuf-whats-new .wedevs-changelog .wedevs-changelog-history span.label.enhancement { + background: #3aaa55; + border: 1px solid #3aaa a; +} +.wpuf-whats-new .wedevs-changelog .wedevs-changelog-history span.label.fix { + background: #ff4772; + border: 1px solid #ff4772; +} +.wpuf-whats-new .wedevs-changelog .wedevs-changelog-history span.label.tweak { + background: #f9a825; + border: 1px solid #ffa000; +} diff --git a/assets/css/admin/wpuf-module.css b/assets/css/admin/wpuf-module.css index 167302c91..95c0f032f 100644 --- a/assets/css/admin/wpuf-module.css +++ b/assets/css/admin/wpuf-module.css @@ -154,13 +154,6 @@ left: 0; z-index: -1; } -a.wpuf-button.button-upgrade-to-pro { - padding: 10px 15px; - background: #ff9000; - color: #fff; - min-height: auto; - border-radius: 5px; -} .form-create-overlay a.wpuf-button.button-upgrade-to-pro { position: absolute; @@ -193,6 +186,11 @@ span.pro-icon svg path { display: block; } +span.line-break:after { + content: "\a"; + white-space: pre; +} + ul.slider-container li img { max-width: 100%; height: auto; @@ -205,8 +203,8 @@ ul.slider-container li img { padding: 50px 80px 30px; -webkit-border-radius: 5px; border-radius: 5px; - width: 55%; - top: 50%; + width: 50%; + top: 52%; left: 50%; -webkit-transform: translate(-50%, -50%); transform: translate(-50%, -50%); @@ -277,7 +275,6 @@ ul.slider-container li img { } .modal-window a.wpuf-button.button-upgrade-to-pro { - text-decoration: none; padding: 15px 30px; } @@ -323,3 +320,60 @@ ul.slider-container li img { .footer-feature p svg path { fill: #139F84; } + +@media only screen and (min-width: 1366px) and (max-width: 1439px) { + .modal-window { + width: 70%; + padding: 30px 70px 20px; + } + + .wpuf-popup-list-area { + margin-bottom: 2em; + } +} + +@media only screen and (min-width: 1280px) and (max-width: 1365px) { + h2.font-orange.header-one { + font-size: 1.4em; + } + + h2.header-two { + font-size: 1.6em; + } + + h2.header-three.font-gray { + font-size: 1em; + } + + span.line-break:after { + white-space: unset; + content: " "; + } + + .modal-window a.wpuf-button.button-upgrade-to-pro { + padding: 10px 15px; + } + + .check-icon svg { + padding: 6px 5px; + } + + .modal-window p { + margin-bottom: 0; + } + + .modal-window { + width: 70%; + } +} + +@media only screen and (min-width: 1024px) and (max-width: 1279px) { + .modal-window { + width: 80%; + padding: 30px 70px 20px; + } + + .wpuf-popup-list-area { + margin-bottom: 2em; + } +} diff --git a/assets/css/frontend-forms.css b/assets/css/frontend-forms.css index 44443a58c..6d14755f2 100644 --- a/assets/css/frontend-forms.css +++ b/assets/css/frontend-forms.css @@ -1,6 +1,5 @@ /* DivTable.com */ body { - font-family: 'Open Sans', sans-serif; /* css for timepicker */ /** author info **/ /** jQuery Suggest **/ @@ -243,7 +242,11 @@ body ul.wpuf-form li.has-error { body ul.wpuf-form li .wp-editor-wrap { border: 1px solid #eee; } -body ul.wpuf-form li.wpuf_hidden_field { +body ul.wpuf-form liwpuf-el { + position: relative; + display: flex; +} +body ul.wpuf-form li.wpuf_hidden_field.wpuf-el { display: none; } body ul.wpuf-form li .wpuf-label { @@ -351,7 +354,8 @@ body ul.wpuf-form li .wpuf-fields .wpuf-name-field-wrap.format-first-middle-last float: right; width: 37%; } -body ul.wpuf-form li .wpuf-fields .wpuf-help { +body ul.wpuf-form li .wpuf-fields .wpuf-help, +body ul.wpuf-form li .wpuf-fields .wpuf-wordlimit-message { color: #666; margin: 2px 0 5px 0; font-size: 12px; @@ -359,14 +363,18 @@ body ul.wpuf-form li .wpuf-fields .wpuf-help { font-family: sans-serif; display: block; } -body ul.wpuf-form li .wpuf-fields .wpuf-help .text-danger { +body ul.wpuf-form li .wpuf-fields .wpuf-help .text-danger, +body ul.wpuf-form li .wpuf-fields .wpuf-wordlimit-message .text-danger { color: red; } -body ul.wpuf-form li .wpuf-fields .wpuf-help .text-success { +body ul.wpuf-form li .wpuf-fields .wpuf-help .text-success, +body ul.wpuf-form li .wpuf-fields .wpuf-wordlimit-message .text-success { color: green; } body ul.wpuf-form li .wpuf-fields .wpuf-help #url-alart, -body ul.wpuf-form li .wpuf-fields .wpuf-help #url-alart-mgs { +body ul.wpuf-form li .wpuf-fields .wpuf-wordlimit-message #url-alart, +body ul.wpuf-form li .wpuf-fields .wpuf-help #url-alart-mgs, +body ul.wpuf-form li .wpuf-fields .wpuf-wordlimit-message #url-alart-mgs { font-style: normal; font-size: 16px; } @@ -1238,7 +1246,6 @@ body .wpuf-form .required { border: 0; } body .wpuf-dashboard-container { - font-family: 'Open Sans', sans-serif; max-width: 85rem !important; /*Responsive css for post table*/ } @@ -1254,7 +1261,6 @@ body .wpuf-dashboard-container .wpuf-dashboard-navigation { body .wpuf-dashboard-container .wpuf-dashboard-navigation a { text-decoration: none; box-shadow: none; - font-family: 'Open Sans', sans-serif; font-size: 16px; font-weight: bold; color: #000; @@ -1313,6 +1319,9 @@ body .wpuf-dashboard-container .wpuf-dashboard-content .wpuf-fields textarea:not body .wpuf-dashboard-container .wpuf-dashboard-content .wpuf-fields input:not([type="reset"]) { width: 100%; } +body .wpuf-dashboard-container .wpuf-dashboard-content .wpuf-fields input[type="radio"] { + width: initial; +} body .wpuf-dashboard-container .items-table-container, body .wpuf-dashboard-container .wpuf-dashboard-content.invoices { max-width: 100%; @@ -1322,7 +1331,6 @@ body .wpuf-dashboard-container table.items-table { width: 100%; margin-top: 0px; border: 1.0218px solid #DAE1F5; - font-family: 'Open Sans', sans-serif !important; color: #000 !important; font-size: 16px !important; font-weight: 400 !important; @@ -1480,7 +1488,6 @@ body input[type="text"].wpuf-google-map-search { background-color: #fff !important; text-overflow: ellipsis !important; width: 170px !important; - font-family: Roboto !important; font-size: 15px !important; font-weight: 300 !important; padding: 0 11px 0 13px !important; @@ -1661,9 +1668,6 @@ body .weforms-quiz-feedback .wrong-answer .wpuf-fields label.checked { color: red; padding: 6px 0; } -body ul.wpuf-form .wpuf-el { - position: relative; -} body ul.wpuf-form .weforms-frontend-field-points { position: absolute; top: 0; @@ -1829,3 +1833,9 @@ body .wpuf-attachment-upload-filelist + .moxie-shim { .iti--allow-dropdown input[type="text"] { padding-left: 52px !important; } +img.wpuf-eye { + position: absolute; + right: 0; + top: 50%; + transform: translateY(-50%) translateX(-6%); +} diff --git a/assets/css/registration-forms.css b/assets/css/registration-forms.css new file mode 100644 index 000000000..12279f5d4 --- /dev/null +++ b/assets/css/registration-forms.css @@ -0,0 +1,206 @@ +.wpuf-registration-page-area .button.focus, +.wpuf-registration-page-area .button:focus, +.wpuf-registration-page-area .button-secondary:focus { + border: none; + color: #fff; + box-shadow: none; +} +.wpuf-registration-page-area .green { + background: #36c16a; +} +.wpuf-registration-page-area .text-white { + color: #fff; +} +.wpuf-registration-page-area .text-gray { + color: #94a3b8; +} +.wpuf-registration-page-area .button-dark { + background: #000; + color: #fff; + border: none; +} +.wpuf-registration-page-area .button-dark:hover { + background: #555; + color: #FFF; +} +.wpuf-registration-page-area .position-relative { + position: relative; +} +.wpuf-registration-page-area .position-absolute { + position: absolute; +} +.wpuf-registration-page-area .flex { + display: flex; +} +.wpuf-registration-page-area .flex-column { + flex-direction: column; +} +.wpuf-registration-page-area .space-between { + justify-content: space-between; +} +.wpuf-registration-page-area .heading-details { + font-size: 1.1em; + line-height: 1.8em; +} +.wpuf-registration-page-area .sub-heading { + margin: 40px 0 30px; +} +.wpuf-registration-page-area span.line-break:after { + content: "\a"; + white-space: pre; +} +.wpuf-registration-page-area .capsule { + padding: 5px 12px; + margin-left: 8px; + border-radius: 20px; + font-size: 0.8em; +} +.wpuf-registration-page-area header { + display: flex; + justify-content: space-between; + align-items: center; + padding: 15px 25px; + background: #fff; + width: calc(100% - 30px); + margin-left: -20px; +} +.wpuf-registration-page-area header .wpuf-menu-area ul { + display: flex; + align-items: center; +} +.wpuf-registration-page-area header .wpuf-menu-area ul li { + margin-right: 20px; +} +.wpuf-registration-page-area header .wpuf-menu-area ul li a { + text-decoration: none; + display: flex; +} +.wpuf-registration-page-area header .wpuf-menu-area ul li a img { + margin-right: 5px; +} +.wpuf-registration-page-area header .wpuf-menu-area ul li:last-child { + margin-right: 0; +} +.wpuf-registration-page-area .wpuf-box { + background: #fff; + width: 60%; + margin: 30px auto; + padding: 50px; + border-radius: 5px; + border: 1px solid #E2E2E2; +} +.wpuf-registration-page-area .wpuf-box code { + padding: 6px; + border: 1px solid #E2E2E2; + margin-right: 10px; + border-radius: 3px; +} +.wpuf-registration-page-area .wpuf-box h3 { + font-size: 1.4em; +} +.wpuf-registration-page-area .wpuf-box .heading { + display: flex; + margin-bottom: 30px; +} +.wpuf-registration-page-area .wpuf-box .heading .crown-icon.pro-icon { + width: 40px; + height: 40px; + background: linear-gradient(0deg, #FF9000, #FF9000), linear-gradient(225deg, #FFD707 -6.25%, #FF5C16 97.92%); + border-radius: 7px; + margin-right: 20px; +} +.wpuf-registration-page-area .wpuf-box .heading .crown-icon.pro-icon svg { + display: block; + margin: auto; + height: 100%; +} +.wpuf-registration-page-area .wpuf-box .heading .crown-icon.pro-icon svg path { + fill: #fff; +} +.wpuf-registration-page-area .wpuf-box .heading .titles h2 { + margin: 0; + font-size: 1.8em; +} +.wpuf-registration-page-area .wpuf-box .wpuf-box-inner .wpuf-shortcode-area { + margin-top: 2.3em; + display: flex; + align-items: center; + font-size: 1.1em; +} +.wpuf-registration-page-area .wpuf-box .wpuf-box-inner a.how-to-setup { + bottom: 0; + padding: 5px 30px; +} +.wpuf-registration-page-area .wpuf-box .wpuf-box-inner:nth-child(2) img { + margin-top: 2em; +} +.wpuf-registration-page-area .wpuf-box .grid { + display: grid; + grid-template-columns: repeat(4, 25%); + grid-gap: 15px; +} +.wpuf-registration-page-area .wpuf-box .grid .single-pro-feature p { + font-size: 1.1em; +} +.wpuf-registration-page-area .footer-links ul { + display: flex; + justify-content: flex-end; + align-items: center; +} +.wpuf-registration-page-area .footer-links ul a.wpuf-button.button-upgrade-to-pro { + margin-left: 30px; +} +.wpuf-registration-page-area .footer-links ul .button-learn-more { + color: #72777C; + text-decoration: none; + padding: 10px; + border-radius: 5px; + box-sizing: border-box; +} +.wpuf-registration-page-area .footer-links ul .button-learn-more:hover { + border: 1px solid; + background: #f7f7f7; +} +@media only screen and (max-width: 1279px) { + .wpuf-registration-page-area .wpuf-box .grid { + grid-gap: 5px; + } +} +@media only screen and (max-width: 1023px) { + .wpuf-registration-page-area span.line-break:after { + white-space: unset; + content: " "; + } + .wpuf-registration-page-area .flex { + display: block; + } + .wpuf-registration-page-area .position-relative { + position: initial; + } + .wpuf-registration-page-area .wpuf-box .wpuf-box-inner .wpuf-shortcode-area { + margin-top: 2em; + } + .wpuf-registration-page-area .position-absolute { + position: initial; + margin-top: 2em; + } + .wpuf-registration-page-area .wpuf-box .wpuf-box-inner:nth-child(2) img { + margin-top: 2em; + display: none; + } + .wpuf-registration-page-area .wpuf-box .grid { + grid-gap: 5px; + } + .wpuf-registration-page-area .wpuf-box .heading .crown-icon.pro-icon { + width: 75px; + } +} +@media only screen and (max-width: 881px) { + .wpuf-registration-page-area span.line-break-tablet:after { + content: "\a"; + white-space: pre; + } + .wpuf-registration-page-area .single-pro-feature { + text-align: center; + } +} diff --git a/assets/images/doc.svg b/assets/images/doc.svg new file mode 100644 index 000000000..b4b63ab46 --- /dev/null +++ b/assets/images/doc.svg @@ -0,0 +1,3 @@ + + + diff --git a/assets/images/eye-close.svg b/assets/images/eye-close.svg new file mode 100644 index 000000000..ab7400f68 --- /dev/null +++ b/assets/images/eye-close.svg @@ -0,0 +1,3 @@ + + + diff --git a/assets/images/eye.svg b/assets/images/eye.svg new file mode 100644 index 000000000..08958c07b --- /dev/null +++ b/assets/images/eye.svg @@ -0,0 +1,3 @@ + + + diff --git a/assets/images/form-banner.svg b/assets/images/form-banner.svg new file mode 100644 index 000000000..382e68847 --- /dev/null +++ b/assets/images/form-banner.svg @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/assets/images/icon-buddypress.svg b/assets/images/icon-buddypress.svg new file mode 100644 index 000000000..56cdd7172 --- /dev/null +++ b/assets/images/icon-buddypress.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/assets/images/icon-campaign-monitor.svg b/assets/images/icon-campaign-monitor.svg new file mode 100644 index 000000000..1893d222c --- /dev/null +++ b/assets/images/icon-campaign-monitor.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/assets/images/icon-checked.svg b/assets/images/icon-checked.svg new file mode 100644 index 000000000..8dd1cc606 --- /dev/null +++ b/assets/images/icon-checked.svg @@ -0,0 +1,4 @@ + + + + diff --git a/assets/images/icon-convertkit.svg b/assets/images/icon-convertkit.svg new file mode 100644 index 000000000..bd03d1f74 --- /dev/null +++ b/assets/images/icon-convertkit.svg @@ -0,0 +1,4 @@ + + + + diff --git a/assets/images/icon-doc.svg b/assets/images/icon-doc.svg new file mode 100644 index 000000000..91da06d4b --- /dev/null +++ b/assets/images/icon-doc.svg @@ -0,0 +1,4 @@ + + + + diff --git a/assets/images/icon-getresponse.svg b/assets/images/icon-getresponse.svg new file mode 100644 index 000000000..fd1450a07 --- /dev/null +++ b/assets/images/icon-getresponse.svg @@ -0,0 +1,4 @@ + + + + diff --git a/assets/images/icon-groups.svg b/assets/images/icon-groups.svg new file mode 100644 index 000000000..bc6170fe0 --- /dev/null +++ b/assets/images/icon-groups.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/assets/images/icon-mailchimp.svg b/assets/images/icon-mailchimp.svg new file mode 100644 index 000000000..fa5bb5378 --- /dev/null +++ b/assets/images/icon-mailchimp.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/assets/images/icon-mailpoet.svg b/assets/images/icon-mailpoet.svg new file mode 100644 index 000000000..56d2855c4 --- /dev/null +++ b/assets/images/icon-mailpoet.svg @@ -0,0 +1,4 @@ + + + + diff --git a/assets/images/icon-mailpoet3.svg b/assets/images/icon-mailpoet3.svg new file mode 100644 index 000000000..01dabba37 --- /dev/null +++ b/assets/images/icon-mailpoet3.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/assets/images/icon-mention.svg b/assets/images/icon-mention.svg new file mode 100644 index 000000000..9500eb0cd --- /dev/null +++ b/assets/images/icon-mention.svg @@ -0,0 +1,4 @@ + + + + diff --git a/assets/images/icon-money.svg b/assets/images/icon-money.svg new file mode 100644 index 000000000..387411e07 --- /dev/null +++ b/assets/images/icon-money.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/assets/images/icon-profile.svg b/assets/images/icon-profile.svg new file mode 100644 index 000000000..1da6c30b4 --- /dev/null +++ b/assets/images/icon-profile.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/assets/images/icon-settings.svg b/assets/images/icon-settings.svg new file mode 100644 index 000000000..36b383434 --- /dev/null +++ b/assets/images/icon-settings.svg @@ -0,0 +1,4 @@ + + + + diff --git a/assets/images/icon-templates.svg b/assets/images/icon-templates.svg new file mode 100644 index 000000000..8323abae2 --- /dev/null +++ b/assets/images/icon-templates.svg @@ -0,0 +1,4 @@ + + + + diff --git a/assets/images/wpuf-pro-2.svg b/assets/images/wpuf-pro-2.svg new file mode 100644 index 000000000..4b295edbb --- /dev/null +++ b/assets/images/wpuf-pro-2.svg @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/assets/js-templates/form-components.php b/assets/js-templates/form-components.php index 6aae8f297..ca68db439 100644 --- a/assets/js-templates/form-components.php +++ b/assets/js-templates/form-components.php @@ -53,7 +53,7 @@
  •  
    - +
  • @@ -78,7 +78,7 @@ - + @@ -373,7 +373,9 @@ class="option-chooser-radio"
    - +
      get_subscriptions(); + $subscriptions = wpuf()->subscription->get_subscriptions(); if ( $subscriptions ) { foreach ( $subscriptions as $pack ) { @@ -414,7 +416,8 @@ class="option-chooser-radio"
    - + + - admin_url( 'admin-ajax.php' ), - 'error_message' => __( 'Please fix the errors to proceed', 'wp-user-frontend' ), - 'nonce' => wp_create_nonce( 'wpuf_nonce' ), - 'word_limit' => __( 'Word limit reached', 'wp-user-frontend' ), - 'cancelSubMsg' => __( 'Are you sure you want to cancel your current subscription ?', 'wp-user-frontend' ), - 'delete_it' => __( 'Yes', 'wp-user-frontend' ), - 'cancel_it' => __( 'No', 'wp-user-frontend' ), - ] ); - - wp_localize_script( 'wpuf-upload', 'wpuf_frontend_upload', [ - 'confirmMsg' => __( 'Are you sure?', 'wp-user-frontend' ), - 'delete_it' => __( 'Yes, delete it', 'wp-user-frontend' ), - 'cancel_it' => __( 'No, cancel it', 'wp-user-frontend' ), - 'nonce' => wp_create_nonce( 'wpuf_nonce' ), - 'ajaxurl' => admin_url( 'admin-ajax.php' ), - 'plupload' => [ - 'url' => admin_url( 'admin-ajax.php' ) . '?nonce=' . wp_create_nonce( 'wpuf-upload-nonce' ), - 'flash_swf_url' => includes_url( 'js/plupload/plupload.flash.swf' ), - 'filters' => [['title' => __( 'Allowed Files', 'wp-user-frontend' ), 'extensions' => '*']], - 'multipart' => true, - 'urlstream_upload' => true, - 'warning' => __( 'Maximum number of files reached!', 'wp-user-frontend' ), - 'size_error' => __( 'The file you have uploaded exceeds the file size limit. Please try again.', 'wp-user-frontend' ), - 'type_error' => __( 'You have uploaded an incorrect file type. Please try again.', 'wp-user-frontend' ), - ], - ] ); - - wp_register_script( 'wpuf-vue', WPUF_ASSET_URI . '/vendor/vue/vue' . $prefix . '.js', [], WPUF_VERSION, true ); - wp_register_script( 'wpuf-vuex', WPUF_ASSET_URI . '/vendor/vuex/vuex' . $prefix . '.js', [ 'wpuf-vue' ], WPUF_VERSION, true ); - wp_register_script( 'wpuf-sweetalert2', WPUF_ASSET_URI . '/vendor/sweetalert2/dist/sweetalert2.js', [], '11.4.30', true ); - wp_register_script( 'wpuf-jquery-scrollTo', WPUF_ASSET_URI . '/vendor/jquery.scrollTo/jquery.scrollTo' . $prefix . '.js', [ 'jquery' ], WPUF_VERSION, true ); - wp_register_script( 'wpuf-selectize', WPUF_ASSET_URI . '/vendor/selectize/js/standalone/selectize' . $prefix . '.js', [ 'jquery' ], WPUF_VERSION, true ); - wp_register_script( 'wpuf-toastr', WPUF_ASSET_URI . '/vendor/toastr/toastr' . $prefix . '.js', [], WPUF_VERSION, true ); - wp_register_script( 'wpuf-clipboard', WPUF_ASSET_URI . '/vendor/clipboard/clipboard' . $prefix . '.js', [], WPUF_VERSION, true ); - wp_register_script( 'wpuf-tooltip', WPUF_ASSET_URI . '/vendor/tooltip/tooltip' . $prefix . '.js', [], WPUF_VERSION, true ); - } - - /** - * Register the styles - * - * @return void - */ - public function register_styles() { - wp_register_style( 'wpuf-css', WPUF_ASSET_URI . '/css/frontend-forms.css' ); - wp_register_style( 'jquery-ui', WPUF_ASSET_URI . '/css/jquery-ui-1.9.1.custom.css' ); - wp_register_style( 'wpuf-sweetalert2', WPUF_ASSET_URI . '/vendor/sweetalert2/dist/sweetalert2.css', [], '11.4.30' ); - } -} diff --git a/class/payment.php b/class/payment.php deleted file mode 100644 index 19331c1c4..000000000 --- a/class/payment.php +++ /dev/null @@ -1,532 +0,0 @@ - [ - 'admin_label' => __( 'PayPal', 'wp-user-frontend' ), - 'checkout_label' => __( 'PayPal', 'wp-user-frontend' ), - 'icon' => apply_filters( 'wpuf_paypal_checkout_icon', WPUF_ASSET_URI . '/images/paypal.png' ), - ], - 'bank' => [ - 'admin_label' => __( 'Bank Payment', 'wp-user-frontend' ), - 'checkout_label' => __( 'Bank Payment', 'wp-user-frontend' ), - ], - ]; - - $gateways = apply_filters( 'wpuf_payment_gateways', $gateways ); - - return $gateways; - } - - /** - * Get active payment gateways - * - * @return array - */ - public function get_active_gateways() { - $all_gateways = wpuf_get_gateways( 'checkout' ); - $active_gateways = wpuf_get_option( 'active_gateways', 'wpuf_payment' ); - $active_gateways = is_array( $active_gateways ) ? $active_gateways : []; - $gateways = []; - - foreach ( $all_gateways as $id => $label ) { - if ( array_key_exists( $id, $active_gateways ) ) { - $gateways [ $id ] = $label; - } - } - - return $gateways; - } - - /** - * Show the payment page - * - * @param string $content - * - * @return string - */ - public function payment_page( $content ) { - global $post; - - $pay_page = intval( wpuf_get_option( 'payment_page', 'wpuf_payment' ) ); - $billing_amount = 0; - - $action = isset( $_REQUEST['action'] ) ? sanitize_text_field( wp_unslash( $_REQUEST['action'] ) ) : ''; - $get_type = isset( $_REQUEST['type'] ) ? sanitize_text_field( wp_unslash( $_REQUEST['type'] ) ) : ''; - $type = ( $get_type === 'post' ) ? 'post' : 'pack'; - - if ( ! is_user_logged_in() && $action === 'wpuf_pay' && $type !== 'post' ) { - /* translators: %s: login url */ - printf( esc_html( __( 'This page is restricted. Please %s to view this page.', 'wp-user-frontend' ) ), wp_loginout( '', false ) ); - - return; - } - - if ( $action === 'wpuf_pay' && $pay_page === 0 ) { - esc_html_e( 'Please select your payment page from admin panel', 'wp-user-frontend' ); - - return; - } - - if ( $post->ID === $pay_page && $action === 'wpuf_pay' ) { - $post_id = isset( $_REQUEST['post_id'] ) ? intval( wp_unslash( $_REQUEST['post_id'] ) ) : 0; - $pack_id = isset( $_REQUEST['pack_id'] ) ? intval( wp_unslash( $_REQUEST['pack_id'] ) ) : 0; - $is_free = false; - - if ( $pack_id ) { - $pack_detail = WPUF_Subscription::get_subscription( $pack_id ); - - if ( ! $pack_detail ) { - ?> -
    - meta_value['recurring_pay'] ) ? $pack_detail->meta_value['recurring_pay'] : 'no'; - - if ( empty( $pack_detail->meta_value['billing_amount'] ) || $pack_detail->meta_value['billing_amount'] <= 0 ) { - $is_free = true; - } - } - - $gateways = $this->get_active_gateways(); - - if ( isset( $_REQUEST['wpuf_payment_submit'] ) ) { - $selected_gateway = isset( $_REQUEST['wpuf_payment_method'] ) ? sanitize_text_field( wp_unslash( $_REQUEST['wpuf_payment_method'] ) ) : ''; - } else { - $selected_gateway = 'paypal'; - } - - ob_start(); - - if ( is_user_logged_in() ) { - $current_user = wp_get_current_user(); - } else { - $user_id = isset( $_GET['user_id'] ) ? intval( wp_unslash( $_GET['user_id'] ) ) : 0; - $current_user = get_userdata( $user_id ); - } - - if ( $pack_id && $is_free ) { - $wpuf_subscription = WPUF_Subscription::init(); - $wpuf_user = new WPUF_User( $current_user->ID ); - - if ( ! $wpuf_user->subscription()->used_free_pack( $pack_id ) ) { - wpuf_get_user( $current_user->ID )->subscription()->add_pack( $pack_id, null, false, 'free' ); - $wpuf_user->subscription()->add_free_pack( $current_user->ID, $pack_id ); - - $message = apply_filters( 'wpuf_fp_activated_msg', __( 'Your free package has been activated. Enjoy!', 'wp-user-frontend' ) ); - } else { - $message = apply_filters( 'wpuf_fp_activated_error', __( 'You already have activated a free package previously.', 'wp-user-frontend' ) ); - } - ?> -
    - - -
    - -
    - -
    -

    -
    - wpuf_ajax_address_form(); - ?> -
    -
    - -
    -
    -
    - - get_subscription( $pack_id ); - $details_meta = WPUF_Subscription::init()->get_details_meta_value(); - $currency = wpuf_get_currency( 'symbol' ); - - if ( is_user_logged_in() ) { - ?> - - - -
    -
    -
    -

    - - - -

    -
    -
    - -
    - - after_apply_coupon( $pack ) ); - } else { - $pack_cost = $pack->meta_value['billing_amount']; - $billing_amount = apply_filters( 'wpuf_payment_amount', $pack->meta_value['billing_amount'] ); - ?> - - - -
    : post_title ); ?>
    -
    :
    - - - -
    :
    - -
    -
    -
    - - - - - - -
    - - is_enabled_force_pack(); - $pay_per_post = $form->is_enabled_pay_per_post(); - $fallback_enabled = $form->is_enabled_fallback_cost(); - $fallback_cost = (float) $form->get_subs_fallback_cost(); - $pay_per_post_cost = (float) $form->get_pay_per_post_cost(); - $current_user = wpuf_get_user(); - - $current_pack = $current_user->subscription()->current_pack(); - - if ( $force_pack && ! is_wp_error( $current_pack ) && $fallback_enabled ) { - $post_cost = $fallback_cost; - $billing_amount = apply_filters( 'wpuf_payment_amount', $fallback_cost ); - } else { - $post_cost = $pay_per_post_cost; - $billing_amount = apply_filters( 'wpuf_payment_amount', $pay_per_post_cost ); - } - ?> - - -
    :
    - - - -
    :
    - - - - - -

    -
    - -

      - $gateway ) { ?> -
    • - - - -
    • - -
    -

    - -

    - - - - - - - - - - - -

    -
    -
    -
    - - - - - subscription()->current_pack(); - $cost = 0; - - if ( is_user_logged_in() ) { - $userdata = wp_get_current_user(); - } else { - $user_id = isset( $_REQUEST['user_id'] ) ? intval( wp_unslash( $_REQUEST['user_id'] ) ) : 0; - - if ( $user_id ) { - $userdata = get_userdata( $user_id ); - } elseif ( $type === 'post' && ! is_user_logged_in() ) { - $post = get_post( $post_id ); - $user_id = $post->post_author; - $userdata = get_userdata( $user_id ); - } else { - $userdata = new stdClass(); - $userdata->ID = 0; - $userdata->user_email = ''; - $userdata->first_name = ''; - $userdata->last_name = ''; - } - } - - switch ( $type ) { - case 'post': - $post = get_post( $post_id ); - $form_id = get_post_meta( $post_id, '_wpuf_form_id', true ); - $form = new WPUF_Form( $form_id ); - $form_settings = $form->get_settings(); - $force_pack = $form->is_enabled_force_pack(); - $fallback_on = $form->is_enabled_fallback_cost(); - $post_count = $current_user->subscription()->has_post_count( $form_settings['post_type'] ); - - if ( $force_pack && $fallback_on && ! is_wp_error( $current_pack ) && ! $post_count ) { - $amount = $form->get_subs_fallback_cost(); - } else { - $amount = $form->get_pay_per_post_cost(); - } - $item_number = $post->ID; - $item_name = $post->post_title; - break; - - case 'pack': - $pack = WPUF_Subscription::init()->get_subscription( $pack_id ); - $custom = $pack->meta_value; - $cost = $pack->meta_value['billing_amount']; - $amount = $cost; - $item_name = $pack->post_title; - $item_number = $pack->ID; - break; - } - - $payment_vars = [ - 'currency' => wpuf_get_option( 'currency', 'wpuf_payment' ), - 'price' => $amount, - 'item_number' => $item_number, - 'item_name' => $item_name, - 'type' => $type, - 'user_info' => [ - 'id' => $userdata->ID, - 'email' => $userdata->user_email, - 'first_name' => $userdata->first_name, - 'last_name' => $userdata->last_name, - ], - 'date' => gmdate( 'Y-m-d H:i:s' ), - 'post_data' => $_POST, - 'custom' => isset( $custom ) ? $custom : '', - ]; - - if ( isset( $_POST['billing_address'] ) ) { - $address_fields = array_map( 'sanitize_text_field', wp_unslash( $_POST['billing_address'] ) ); - } else { - $address_fields = wpuf_get_user_address(); - } - - if ( ! empty( $address_fields ) ) { - update_user_meta( $userdata->ID, 'wpuf_address_fields', $address_fields ); - } - - /** - * Filter: wpuf_payment_vars - * - * @since 3.1.13 - */ - $payment_vars = apply_filters( 'wpuf_payment_vars', $payment_vars ); - - do_action( 'wpuf_gateway_' . $gateway, $payment_vars ); - } - } - - /** - * Insert payment info to database - * - * @global object $wpdb - * - * @param array $data payment data to insert - * @param int $transaction_id the transaction id in case of update - */ - public static function insert_payment( $data, $transaction_id = 0, $recurring = false ) { - global $wpdb; - - $user_id = get_current_user_id(); - - //check if it's already there - $sql = $wpdb->prepare( - 'SELECT transaction_id - FROM ' . $wpdb->prefix . 'wpuf_transaction - WHERE transaction_id = %s LIMIT 1', $transaction_id - ); - - $result = $wpdb->get_row( $sql ); - - if ( $recurring !== false ) { - $profile_id = $data['profile_id']; - } - - if ( isset( $data['profile_id'] ) || empty( $data['profile_id'] ) ) { - unset( $data['profile_id'] ); - } - - if ( empty( $data['tax'] ) ) { - $data['tax'] = floatval( $data['cost'] ) - floatval( $data['subtotal'] ); - } - - if ( wpuf_get_option( 'show_address', 'wpuf_address_options', false ) && ! empty( $data['user_id'] ) ) { - $data['payer_address'] = wpuf_get_user_address( $data['user_id'] ); - } - - if ( ! empty( $data['payer_address'] ) ) { - $data['payer_address'] = maybe_serialize( $data['payer_address'] ); - } - - if ( isset( $profile_id ) ) { - $data['profile_id'] = $profile_id; - } - - if ( ! $result ) { - $wpdb->insert( $wpdb->prefix . 'wpuf_transaction', $data ); - - do_action( 'wpuf_payment_received', $data, $recurring ); - } else { - $wpdb->update( $wpdb->prefix . 'wpuf_transaction', $data, [ 'transaction_id' => $transaction_id ] ); - } - - //workaround for subscriptions can't be assigned from user profile regression - if ( ! did_action( 'wpuf_payment_received' ) ) { - do_action( 'wpuf_payment_received', $data, $recurring ); - } - } - - /** - * Send payment received mail - * - * @param array $info payment information - */ - public function payment_notify_admin( $info ) { - $headers = 'From: ' . get_bloginfo( 'name' ) . ' <' . get_bloginfo( 'admin_email' ) . '>' . "\r\n\\"; - // translators: %s is site title name - $subject = sprintf( __( '[%s] Payment Received', 'wp-user-frontend' ), get_bloginfo( 'name' ) ); - // translators: %s is site title name - $msg = sprintf( __( 'New payment received at %s', 'wp-user-frontend' ), get_bloginfo( 'name' ) ); - - $receiver = get_bloginfo( 'admin_email' ); - wp_mail( $receiver, $subject, $msg, $headers ); - } - - /** - * Handle the cancel payment - * - * @return void - * - * @since 2.4.1 - */ - public function handle_cancel_payment() { - $nonce = isset( $_POST['wpuf_payment_cancel'] ) ? sanitize_text_field( wp_unslash( $_POST['wpuf_payment_cancel'] ) ) : ''; - $action = isset( $_POST['action'] ) ? sanitize_text_field( wp_unslash( $_POST['action'] ) ) : ''; - - if ( ! isset( $_POST['wpuf_payment_cancel_submit'] ) || $action !== 'wpuf_cancel_pay' || ! wp_verify_nonce( $nonce, '_wpnonce' ) ) { - return; - } - - $gateway = isset( $_POST['gateway'] ) ? sanitize_text_field( wp_unslash( $_POST['gateway'] ) ) : ''; - - do_action( "wpuf_cancel_payment_{$gateway}", $_POST ); - } -} diff --git a/class/render-form.php b/class/render-form.php index 4482722cb..c6fe88ed5 100644 --- a/class/render-form.php +++ b/class/render-form.php @@ -982,11 +982,14 @@ public function text( $attr, $post_id, $type = 'post', $form_id = null ) { help_text( $attr ); ?> - + @@ -1579,6 +1582,9 @@ public function taxonomy( $attr, $post_id, $form_id ) { break; case 'text': + $query_string = '?action=wpuf-ajax-tag-search&tax=' . esc_attr( $attr['name'] ); + $query_string .= '&nonce=' . wp_create_nonce( 'wpuf_ajax_tag_search' ); + ?> required_html5( $attr ) ); ?> name="" value="" size="40" /> @@ -1586,7 +1592,7 @@ public function taxonomy( $attr, $post_id, $form_id ) { @@ -1652,7 +1658,7 @@ public function image_upload( $attr, $post_id, $type, $form_id ) { if ( $thumb_id ) { $has_featured_image = true; - $featured_image = WPUF_Upload::attach_html( $thumb_id, 'featured_image' ); + $featured_image = WeDevs\Wpuf\Ajax\Upload_Ajax::attach_html( $thumb_id, 'featured_image' ); } } else { // it must be a user avatar @@ -1686,7 +1692,7 @@ public function image_upload( $attr, $post_id, $type, $form_id ) { if ( $has_images ) { foreach ( $images as $attach_id ) { - echo esc_attr( WPUF_Upload::attach_html( $attach_id, $attr['name'] ) ); + echo esc_attr( WeDevs\Wpuf\Ajax\Upload_Ajax::attach_html( $attach_id, $attr['name'] ) ); } } ?> diff --git a/class/subscription.php b/class/subscription.php index d12c05040..8ada87ff0 100644 --- a/class/subscription.php +++ b/class/subscription.php @@ -17,7 +17,7 @@ public function __construct() { add_filter( 'wpuf_add_post_redirect', [ $this, 'post_redirect' ], 10, 4 ); add_filter( 'wpuf_addpost_notice', [ $this, 'force_pack_notice' ], 20, 3 ); - add_filter( 'wpuf_can_post', [ $this, 'force_pack_permission' ], 20, 3 ); + // add_filter( 'wpuf_can_post', [ $this, 'force_pack_permission' ], 20, 3 ); add_action( 'wpuf_add_post_form_top', [ $this, 'add_post_info' ], 10, 2 ); add_action( 'wpuf_add_post_after_insert', [ $this, 'monitor_new_post' ], 10, 3 ); @@ -274,8 +274,8 @@ public function get_subscriptions( $args = [] ) { * * @since 2.2 * - * @param int $subscription_id - * @param \WP_Post $pack_post + * @param int $subscription_id + * @param WP_Post $pack_post * * @return array */ @@ -353,8 +353,8 @@ public function change_default_title( $title ) { /** * Save form data * - * @param int $post_ID - * @param \WP_Post $post + * @param int $post_ID + * @param WP_Post $post * * @return void */ @@ -372,28 +372,59 @@ public function save_form_meta( $subscription_id, $post ) { $post_data = wp_unslash( $_POST ); - if ( ! isset( $post_data['billing_amount'] ) ) { - return; + // if ( ! isset( $post_data['billing_amount'] ) ) { + // return; + // } + + $expiration_time = ''; + $enable_post_expir = ''; + $expire_post_status = ''; + $post_expire_msg = ''; + $billing_amount = isset( $post_data['billing_amount'] ) ? absint( $post_data['billing_amount'] ) : 0; + $mail_after_expire = isset( $post_data['post_expiration_settings'] ) && isset( $post_data['post_expiration_settings']['enable_mail_after_expired'] ) ? $post_data['post_expiration_settings']['enable_mail_after_expired'] : ''; + $expiration_number = ! empty( $post_data['expiration_number'] ) ? absint( $post_data['expiration_number'] ) : ''; + $billing_cycle_number = ! empty( $post_data['billing_cycle_number'] ) ? sanitize_text_field( wp_unslash( $post_data['billing_cycle_number'] ) ) : 0; + $cycle_period = ! empty( $post_data['cycle_period'] ) ? sanitize_text_field( wp_unslash( $post_data['cycle_period'] ) ) : ''; + $billing_limit = ! empty( $post_data['billing_limit'] ) ? sanitize_text_field( wp_unslash( $post_data['billing_limit'] ) ) : ''; + $trial_duration = ! empty( $post_data['trial_duration'] ) ? sanitize_text_field( wp_unslash( $post_data['trial_duration'] ) ) : ''; + $trial_duration_type = ! empty( $post_data['trial_duration_type'] ) ? sanitize_text_field( wp_unslash( $post_data['trial_duration_type'] ) ) : ''; + + if ( isset( $post_data['post_expiration_settings'] ) ) { + if ( isset( $post_data['post_expiration_settings']['expiration_time_value'] ) && isset( $post_data['post_expiration_settings']['expiration_time_type'] ) ) { + $expiration_time = sanitize_text_field( wp_unslash( $post_data['post_expiration_settings']['expiration_time_value'] ) ) . ' ' . sanitize_text_field( wp_unslash( $post_data['post_expiration_settings']['expiration_time_type'] ) ); + } + + if ( isset( $post_data['post_expiration_settings']['enable_post_expiration'] ) && isset( $post_data['post_expiration_settings']['enable_post_expiration'] ) ) { + $enable_post_expir = sanitize_text_field( wp_unslash( $post_data['post_expiration_settings']['enable_post_expiration'] ) ); + } + + if ( isset( $post_data['post_expiration_settings']['expired_post_status'] ) && isset( $post_data['post_expiration_settings']['expired_post_status'] ) ) { + $expire_post_status = sanitize_text_field( wp_unslash( $post_data['post_expiration_settings']['expired_post_status'] ) ); + } + + if ( isset( $post_data['post_expiration_settings']['post_expiration_message'] ) && isset( $post_data['post_expiration_settings']['post_expiration_message'] ) ) { + $post_expire_msg = sanitize_text_field( wp_unslash( $post_data['post_expiration_settings']['post_expiration_message'] ) ); + } } - update_post_meta( $subscription_id, '_billing_amount', $post_data['billing_amount'] ); - update_post_meta( $subscription_id, '_expiration_number', array_key_exists( 'expiration_number', $post_data ) && ! empty( $post_data['expiration_number'] ) ? $post_data['expiration_number'] : '' ); - update_post_meta( $subscription_id, '_expiration_period', $post_data['expiration_period'] ); - update_post_meta( $subscription_id, '_recurring_pay', isset( $post_data['recurring_pay'] ) ? $post_data['recurring_pay'] : 'no' ); - update_post_meta( $subscription_id, '_billing_cycle_number', $post_data['billing_cycle_number'] ); - update_post_meta( $subscription_id, '_cycle_period', $post_data['cycle_period'] ); - update_post_meta( $subscription_id, '_billing_limit', $post_data['billing_limit'] ); - update_post_meta( $subscription_id, '_trial_status', isset( $post_data['trial_status'] ) ? $post_data['trial_status'] : 'no' ); - update_post_meta( $subscription_id, '_trial_duration', $post_data['trial_duration'] ); - update_post_meta( $subscription_id, '_trial_duration_type', $post_data['trial_duration_type'] ); - update_post_meta( $subscription_id, '_post_type_name', $post_data['post_type_name'] ); - update_post_meta( $subscription_id, '_enable_post_expiration', ( isset( $post_data['post_expiration_settings']['enable_post_expiration'] ) ? $post_data['post_expiration_settings']['enable_post_expiration'] : '' ) ); - update_post_meta( $subscription_id, '_post_expiration_time', $post_data['post_expiration_settings']['expiration_time_value'] . ' ' . $post_data['post_expiration_settings']['expiration_time_type'] ); - update_post_meta( $subscription_id, '_expired_post_status', ( isset( $post_data['post_expiration_settings']['expired_post_status'] ) ? $post_data['post_expiration_settings']['expired_post_status'] : '' ) ); - update_post_meta( $subscription_id, '_enable_mail_after_expired', ( isset( $post_data['post_expiration_settings']['enable_mail_after_expired'] ) ? $post_data['post_expiration_settings']['enable_mail_after_expired'] : '' ) ); - update_post_meta( $subscription_id, '_post_expiration_message', ( isset( $post_data['post_expiration_settings']['post_expiration_message'] ) ? $post_data['post_expiration_settings']['post_expiration_message'] : '' ) ); - update_post_meta( $subscription_id, '_total_feature_item', ( isset( $post_data['total_feature_item'] ) ? $post_data['total_feature_item'] : '' ) ); - update_post_meta( $subscription_id, '_remove_feature_item', ( isset( $post_data['remove_feature_item'] ) ? $post_data['remove_feature_item'] : '' ) ); + update_post_meta( $subscription_id, '_billing_amount', $billing_amount ); + update_post_meta( $subscription_id, '_expiration_number', $expiration_number ); + update_post_meta( $subscription_id, '_expiration_period', sanitize_text_field( wp_unslash( $post_data['expiration_period'] ) ) ); + update_post_meta( $subscription_id, '_recurring_pay', isset( $post_data['recurring_pay'] ) ? sanitize_text_field( wp_unslash( $post_data['recurring_pay'] ) ) : 'no' ); + update_post_meta( $subscription_id, '_billing_cycle_number', $billing_cycle_number ); + update_post_meta( $subscription_id, '_cycle_period', $cycle_period ); + update_post_meta( $subscription_id, '_billing_limit', $billing_limit ); + update_post_meta( $subscription_id, '_trial_status', isset( $post_data['trial_status'] ) ? sanitize_text_field( wp_unslash( $post_data['trial_status'] ) ) : 'no' ); + update_post_meta( $subscription_id, '_trial_duration', $trial_duration ); + update_post_meta( $subscription_id, '_trial_duration_type', $trial_duration_type ); + update_post_meta( $subscription_id, '_post_type_name', array_map( 'sanitize_text_field', $post_data['post_type_name'] ) ); + update_post_meta( $subscription_id, '_enable_post_expiration', $enable_post_expir ); + update_post_meta( $subscription_id, '_post_expiration_time', $expiration_time ); + update_post_meta( $subscription_id, '_expired_post_status', $expire_post_status ); + update_post_meta( $subscription_id, '_enable_mail_after_expired', $mail_after_expire ); + update_post_meta( $subscription_id, '_post_expiration_message', $post_expire_msg ); + update_post_meta( $subscription_id, '_total_feature_item', ( isset( $post_data['total_feature_item'] ) ? sanitize_text_field( wp_unslash( $post_data['total_feature_item'] ) ) : '' ) ); + update_post_meta( $subscription_id, '_remove_feature_item', ( isset( $post_data['remove_feature_item'] ) ? sanitize_text_field( wp_unslash( $post_data['remove_feature_item'] ) ) : '' ) ); do_action( 'wpuf_update_subscription_pack', $subscription_id, $post_data ); } @@ -813,7 +844,7 @@ public function subscription_packs( $atts = null ) { ! empty( $current_pack['pack_id'] ) && isset( $current_pack['status'] ) && $current_pack['status'] === 'completed' - ) { + ) { global $wpdb; $user_id = get_current_user_id(); @@ -1318,9 +1349,9 @@ public function cancel_non_recurring_subscription() { $current_time = current_time( 'mysql' ); $non_recurrent = array_filter( $all_subscription, function ( $pack ) use ( $current_time ) { - $pack = maybe_unserialize( $pack->meta_value ); - return $pack['recurring'] === 'no' && $current_time >= $pack['expire']; - } + $pack = maybe_unserialize( $pack->meta_value ); + return ! empty( $pack['recurring'] ) && $pack['recurring'] === 'no' && $current_time >= $pack['expire']; + } ); $remove_feature_item_by_author = []; diff --git a/composer.json b/composer.json index 6cb5c16a7..76241e547 100644 --- a/composer.json +++ b/composer.json @@ -11,17 +11,23 @@ ], "minimum-stability": "dev", "require": { - "php": ">=5.4.0", + "php": ">=5.5", "composer/installers": ">=1.4", - "appsero/client": "dev-develop" + "wedevs/wp-utils": "dev-main" }, "require-dev": { - "wp-coding-standards/wpcs": "dev-master", + "wp-coding-standards/wpcs": "dev-develop", "dealerdirect/phpcodesniffer-composer-installer": "0.7.0", "tareq1988/wp-php-cs-fixer": "dev-master", "phpcompatibility/phpcompatibility-wp": "dev-master", "phpunit/phpunit": "7.5.9" }, + "autoload": { + "psr-4": { + "WeDevs\\Wpuf\\": "includes/", + "WeDevs\\Wpuf\\Lib\\": "Lib/" + } + }, "scripts": { "phpcs": [ "phpcs -p -s" diff --git a/composer.lock b/composer.lock index 2e00bec1c..26e877181 100644 --- a/composer.lock +++ b/composer.lock @@ -4,84 +4,42 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "2bb5c91e8cedd6a18a1e93aaff9b9c90", + "content-hash": "1fa30eae591844494a2c8a0926763809", "packages": [ - { - "name": "appsero/client", - "version": "dev-develop", - "source": { - "type": "git", - "url": "https://github.com/Appsero/client.git", - "reference": "07608b10580c877fa0c05e20218cf4cbc8cb8187" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/Appsero/client/zipball/07608b10580c877fa0c05e20218cf4cbc8cb8187", - "reference": "07608b10580c877fa0c05e20218cf4cbc8cb8187", - "shasum": "" - }, - "require": { - "php": ">=5.3" - }, - "type": "library", - "autoload": { - "psr-4": { - "Appsero\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Tareq Hasan", - "email": "tareq@appsero.com" - } - ], - "description": "Appsero Client", - "keywords": [ - "analytics", - "plugin", - "theme", - "wordpress" - ], - "time": "2020-11-06T08:16:38+00:00" - }, { "name": "composer/installers", - "version": "dev-master", + "version": "dev-main", "source": { "type": "git", "url": "https://github.com/composer/installers.git", - "reference": "f69761fc0d3f77629d89c1897b84d327188aa27f" + "reference": "2a9170263fcd9cc4fd0b50917293c21d6c1a5bfe" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/installers/zipball/f69761fc0d3f77629d89c1897b84d327188aa27f", - "reference": "f69761fc0d3f77629d89c1897b84d327188aa27f", + "url": "https://api.github.com/repos/composer/installers/zipball/2a9170263fcd9cc4fd0b50917293c21d6c1a5bfe", + "reference": "2a9170263fcd9cc4fd0b50917293c21d6c1a5bfe", "shasum": "" }, "require": { - "composer-plugin-api": "^1.0 || ^2.0" - }, - "replace": { - "roundcube/plugin-installer": "*", - "shama/baton": "*" + "composer-plugin-api": "^1.0 || ^2.0", + "php": "^7.2 || ^8.0" }, "require-dev": { - "composer/composer": "1.6.* || 2.0.*@dev", + "composer/composer": "1.6.* || ^2.0", "composer/semver": "^1 || ^3", - "phpunit/phpunit": "^4.8.36", - "sebastian/comparator": "^1.2.4", - "symfony/process": "^2.3" + "phpstan/phpstan": "^0.12.55", + "phpstan/phpstan-phpunit": "^0.12.16", + "symfony/phpunit-bridge": "^5.3", + "symfony/process": "^5" }, + "default-branch": true, "type": "composer-plugin", "extra": { "class": "Composer\\Installers\\Plugin", "branch-alias": { - "dev-master": "1.0-dev" - } + "dev-main": "2.x-dev" + }, + "plugin-modifies-install-path": true }, "autoload": { "psr-4": { @@ -102,7 +60,6 @@ "description": "A multi-framework Composer library installer", "homepage": "https://composer.github.io/installers/", "keywords": [ - "Craft", "Dolibarr", "Eliasis", "Hurad", @@ -118,11 +75,11 @@ "Porto", "RadPHP", "SMF", + "Starbug", "Thelia", "Whmcs", "WolfCMS", "agl", - "aimeos", "annotatecms", "attogram", "bitrix", @@ -141,7 +98,6 @@ "grav", "installer", "itop", - "joomla", "known", "kohana", "laravel", @@ -150,14 +106,18 @@ "magento", "majima", "mako", + "matomo", "mediawiki", + "miaoxing", "modulework", "modx", "moodle", "osclass", + "pantheon", "phpbb", "piwik", "ppi", + "processwire", "puppet", "pxcms", "reindex", @@ -166,13 +126,16 @@ "silverstripe", "sydes", "sylius", - "symfony", - "typo3", + "tastyigniter", "wordpress", "yawik", "zend", "zikula" ], + "support": { + "issues": "https://github.com/composer/installers/issues", + "source": "https://github.com/composer/installers/tree/main" + }, "funding": [ { "url": "https://packagist.com", @@ -187,7 +150,59 @@ "type": "tidelift" } ], - "time": "2020-10-16T10:26:25+00:00" + "time": "2022-10-12T12:07:30+00:00" + }, + { + "name": "wedevs/wp-utils", + "version": "dev-main", + "source": { + "type": "git", + "url": "https://github.com/weDevsOfficial/wp-utils.git", + "reference": "e5d072e9ed80b8af8fcd3cb0ca7a8a749568fa5f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/weDevsOfficial/wp-utils/zipball/e5d072e9ed80b8af8fcd3cb0ca7a8a749568fa5f", + "reference": "e5d072e9ed80b8af8fcd3cb0ca7a8a749568fa5f", + "shasum": "" + }, + "require-dev": { + "dealerdirect/phpcodesniffer-composer-installer": "^0.7", + "phpcompatibility/php-compatibility": "9.*", + "phpcompatibility/phpcompatibility-wp": "*", + "tareq1988/wp-php-cs-fixer": "dev-master", + "wp-coding-standards/wpcs": "dev-master" + }, + "default-branch": true, + "type": "library", + "autoload": { + "psr-4": { + "WeDevs\\WpUtils\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "GPL-3.0-or-later" + ], + "authors": [ + { + "name": "Tareq Hasan", + "email": "tareq@wedevs.com" + } + ], + "description": "Various WordPress classes and traits for WordPress", + "homepage": "https://wedevs.com/", + "keywords": [ + "classes", + "traits", + "utils", + "wordpress" + ], + "support": { + "issues": "https://github.com/weDevsOfficial/wp-utils/issues", + "source": "https://github.com/weDevsOfficial/wp-utils/tree/main" + }, + "time": "2023-06-06T13:37:32+00:00" } ], "packages-dev": [ @@ -255,40 +270,88 @@ "stylecheck", "tests" ], + "support": { + "issues": "https://github.com/dealerdirect/phpcodesniffer-composer-installer/issues", + "source": "https://github.com/dealerdirect/phpcodesniffer-composer-installer" + }, "time": "2020-06-25T14:57:39+00:00" }, + { + "name": "doctrine/deprecations", + "version": "1.1.x-dev", + "source": { + "type": "git", + "url": "https://github.com/doctrine/deprecations.git", + "reference": "4f2d4f2836e7ec4e7a8625e75c6aa916004db931" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/deprecations/zipball/4f2d4f2836e7ec4e7a8625e75c6aa916004db931", + "reference": "4f2d4f2836e7ec4e7a8625e75c6aa916004db931", + "shasum": "" + }, + "require": { + "php": "^7.1 || ^8.0" + }, + "require-dev": { + "doctrine/coding-standard": "^9", + "phpstan/phpstan": "1.4.10 || 1.10.15", + "phpstan/phpstan-phpunit": "^1.0", + "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5", + "psalm/plugin-phpunit": "0.18.4", + "psr/log": "^1 || ^2 || ^3", + "vimeo/psalm": "4.30.0 || 5.12.0" + }, + "suggest": { + "psr/log": "Allows logging deprecations via PSR-3 logger implementation" + }, + "default-branch": true, + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\Deprecations\\": "lib/Doctrine/Deprecations" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "A small layer on top of trigger_error(E_USER_DEPRECATED) or PSR-3 logging with options to disable all deprecations or selectively for packages.", + "homepage": "https://www.doctrine-project.org/", + "support": { + "issues": "https://github.com/doctrine/deprecations/issues", + "source": "https://github.com/doctrine/deprecations/tree/1.1.2" + }, + "time": "2023-09-27T20:04:15+00:00" + }, { "name": "doctrine/instantiator", - "version": "dev-master", + "version": "1.5.x-dev", "source": { "type": "git", "url": "https://github.com/doctrine/instantiator.git", - "reference": "3e7a22aed197e9333cc929e7f6b4300bdae91fcc" + "reference": "12be2483e1f0e850b353e26869e4e6c038459501" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/instantiator/zipball/3e7a22aed197e9333cc929e7f6b4300bdae91fcc", - "reference": "3e7a22aed197e9333cc929e7f6b4300bdae91fcc", + "url": "https://api.github.com/repos/doctrine/instantiator/zipball/12be2483e1f0e850b353e26869e4e6c038459501", + "reference": "12be2483e1f0e850b353e26869e4e6c038459501", "shasum": "" }, "require": { "php": "^7.1 || ^8.0" }, "require-dev": { - "doctrine/coding-standard": "^6.0", + "doctrine/coding-standard": "^9 || ^12", "ext-pdo": "*", "ext-phar": "*", - "phpbench/phpbench": "^0.13", - "phpstan/phpstan-phpunit": "^0.11", - "phpstan/phpstan-shim": "^0.11", - "phpunit/phpunit": "^7.0" + "phpbench/phpbench": "^0.16 || ^1", + "phpstan/phpstan": "^1.4", + "phpstan/phpstan-phpunit": "^1", + "phpunit/phpunit": "^7.5 || ^8.5 || ^9.6", + "vimeo/psalm": "^4.30 || ^5.4" }, "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.4.x-dev" - } - }, "autoload": { "psr-4": { "Doctrine\\Instantiator\\": "src/Doctrine/Instantiator/" @@ -302,7 +365,7 @@ { "name": "Marco Pivetta", "email": "ocramius@gmail.com", - "homepage": "http://ocramius.github.com/" + "homepage": "https://ocramius.github.io/" } ], "description": "A small, lightweight utility to instantiate objects in PHP without invoking their constructors", @@ -311,6 +374,10 @@ "constructor", "instantiate" ], + "support": { + "issues": "https://github.com/doctrine/instantiator/issues", + "source": "https://github.com/doctrine/instantiator/tree/1.5.x" + }, "funding": [ { "url": "https://www.doctrine-project.org/sponsorship.html", @@ -325,7 +392,7 @@ "type": "tidelift" } ], - "time": "2020-06-15T18:51:04+00:00" + "time": "2023-12-09T14:16:53+00:00" }, { "name": "myclabs/deep-copy", @@ -333,33 +400,36 @@ "source": { "type": "git", "url": "https://github.com/myclabs/DeepCopy.git", - "reference": "00aba97fc36feabc8d94667eebd5d43959e60008" + "reference": "202aaf6b7c2e1e0a622b0298e9f3f537e4d84018" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/00aba97fc36feabc8d94667eebd5d43959e60008", - "reference": "00aba97fc36feabc8d94667eebd5d43959e60008", + "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/202aaf6b7c2e1e0a622b0298e9f3f537e4d84018", + "reference": "202aaf6b7c2e1e0a622b0298e9f3f537e4d84018", "shasum": "" }, "require": { "php": "^7.1 || ^8.0" }, - "replace": { - "myclabs/deep-copy": "self.version" + "conflict": { + "doctrine/collections": "<1.6.8", + "doctrine/common": "<2.13.3 || >=3 <3.2.2" }, "require-dev": { - "doctrine/collections": "^1.0", - "doctrine/common": "^2.6", - "phpunit/phpunit": "^7.1" + "doctrine/collections": "^1.6.8", + "doctrine/common": "^2.13.3 || ^3.2.2", + "phpspec/prophecy": "^1.10", + "phpunit/phpunit": "^7.5.20 || ^8.5.23 || ^9.5.13" }, + "default-branch": true, "type": "library", "autoload": { - "psr-4": { - "DeepCopy\\": "src/DeepCopy/" - }, "files": [ "src/DeepCopy/deep_copy.php" - ] + ], + "psr-4": { + "DeepCopy\\": "src/DeepCopy/" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -373,13 +443,17 @@ "object", "object graph" ], + "support": { + "issues": "https://github.com/myclabs/DeepCopy/issues", + "source": "https://github.com/myclabs/DeepCopy/tree/1.x" + }, "funding": [ { "url": "https://tidelift.com/funding/github/packagist/myclabs/deep-copy", "type": "tidelift" } ], - "time": "2020-10-01T09:35:15+00:00" + "time": "2023-11-01T08:01:43+00:00" }, { "name": "phar-io/manifest", @@ -434,6 +508,10 @@ } ], "description": "Component for reading phar.io manifest information from a PHP Archive (PHAR)", + "support": { + "issues": "https://github.com/phar-io/manifest/issues", + "source": "https://github.com/phar-io/manifest/tree/master" + }, "time": "2018-07-08T19:23:20+00:00" }, { @@ -481,6 +559,10 @@ } ], "description": "Library for handling version information and constraints", + "support": { + "issues": "https://github.com/phar-io/version/issues", + "source": "https://github.com/phar-io/version/tree/master" + }, "time": "2018-07-08T19:19:57+00:00" }, { @@ -539,32 +621,36 @@ "phpcs", "standards" ], + "support": { + "issues": "https://github.com/PHPCompatibility/PHPCompatibility/issues", + "source": "https://github.com/PHPCompatibility/PHPCompatibility" + }, "time": "2019-12-27T09:44:58+00:00" }, { "name": "phpcompatibility/phpcompatibility-paragonie", - "version": "1.3.0", + "version": "1.3.2", "source": { "type": "git", "url": "https://github.com/PHPCompatibility/PHPCompatibilityParagonie.git", - "reference": "b862bc32f7e860d0b164b199bd995e690b4b191c" + "reference": "bba5a9dfec7fcfbd679cfaf611d86b4d3759da26" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/PHPCompatibility/PHPCompatibilityParagonie/zipball/b862bc32f7e860d0b164b199bd995e690b4b191c", - "reference": "b862bc32f7e860d0b164b199bd995e690b4b191c", + "url": "https://api.github.com/repos/PHPCompatibility/PHPCompatibilityParagonie/zipball/bba5a9dfec7fcfbd679cfaf611d86b4d3759da26", + "reference": "bba5a9dfec7fcfbd679cfaf611d86b4d3759da26", "shasum": "" }, "require": { "phpcompatibility/php-compatibility": "^9.0" }, "require-dev": { - "dealerdirect/phpcodesniffer-composer-installer": "^0.5", + "dealerdirect/phpcodesniffer-composer-installer": "^0.7", "paragonie/random_compat": "dev-master", "paragonie/sodium_compat": "dev-master" }, "suggest": { - "dealerdirect/phpcodesniffer-composer-installer": "^0.5 || This Composer plugin will sort out the PHP_CodeSniffer 'installed_paths' automatically.", + "dealerdirect/phpcodesniffer-composer-installer": "^0.7 || This Composer plugin will sort out the PHP_CodeSniffer 'installed_paths' automatically.", "roave/security-advisories": "dev-master || Helps prevent installing dependencies with known security issues." }, "type": "phpcodesniffer-standard", @@ -589,9 +675,14 @@ "paragonie", "phpcs", "polyfill", - "standards" + "standards", + "static analysis" ], - "time": "2019-11-04T15:17:54+00:00" + "support": { + "issues": "https://github.com/PHPCompatibility/PHPCompatibilityParagonie/issues", + "source": "https://github.com/PHPCompatibility/PHPCompatibilityParagonie" + }, + "time": "2022-10-25T01:46:02+00:00" }, { "name": "phpcompatibility/phpcompatibility-wp", @@ -599,12 +690,12 @@ "source": { "type": "git", "url": "https://github.com/PHPCompatibility/PHPCompatibilityWP.git", - "reference": "1ef9c71f294470ff44493cfd305b6c48a18079f6" + "reference": "02e4bf7d1f6b64f09abd93cae49166f1dae1f701" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/PHPCompatibility/PHPCompatibilityWP/zipball/1ef9c71f294470ff44493cfd305b6c48a18079f6", - "reference": "1ef9c71f294470ff44493cfd305b6c48a18079f6", + "url": "https://api.github.com/repos/PHPCompatibility/PHPCompatibilityWP/zipball/02e4bf7d1f6b64f09abd93cae49166f1dae1f701", + "reference": "02e4bf7d1f6b64f09abd93cae49166f1dae1f701", "shasum": "" }, "require": { @@ -612,12 +703,13 @@ "phpcompatibility/phpcompatibility-paragonie": "^1.0" }, "require-dev": { - "dealerdirect/phpcodesniffer-composer-installer": "^0.6" + "dealerdirect/phpcodesniffer-composer-installer": "^1.0" }, "suggest": { - "dealerdirect/phpcodesniffer-composer-installer": "^0.6 || This Composer plugin will sort out the PHP_CodeSniffer 'installed_paths' automatically.", + "dealerdirect/phpcodesniffer-composer-installer": "^1.0 || This Composer plugin will sort out the PHP_CodeSniffer 'installed_paths' automatically.", "roave/security-advisories": "dev-master || Helps prevent installing dependencies with known security issues." }, + "default-branch": true, "type": "phpcodesniffer-standard", "notification-url": "https://packagist.org/downloads/", "license": [ @@ -639,9 +731,183 @@ "compatibility", "phpcs", "standards", + "static analysis", "wordpress" ], - "time": "2020-07-11T18:28:40+00:00" + "support": { + "issues": "https://github.com/PHPCompatibility/PHPCompatibilityWP/issues", + "security": "https://github.com/PHPCompatibility/PHPCompatibilityWP/security/policy", + "source": "https://github.com/PHPCompatibility/PHPCompatibilityWP" + }, + "time": "2023-12-08T17:31:57+00:00" + }, + { + "name": "phpcsstandards/phpcsextra", + "version": "dev-develop", + "source": { + "type": "git", + "url": "https://github.com/PHPCSStandards/PHPCSExtra.git", + "reference": "11d387c6642b6e4acaf0bd9bf5203b8cca1ec489" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/PHPCSStandards/PHPCSExtra/zipball/11d387c6642b6e4acaf0bd9bf5203b8cca1ec489", + "reference": "11d387c6642b6e4acaf0bd9bf5203b8cca1ec489", + "shasum": "" + }, + "require": { + "php": ">=5.4", + "phpcsstandards/phpcsutils": "^1.0.9", + "squizlabs/php_codesniffer": "^3.8.0" + }, + "require-dev": { + "php-parallel-lint/php-console-highlighter": "^1.0", + "php-parallel-lint/php-parallel-lint": "^1.3.2", + "phpcsstandards/phpcsdevcs": "^1.1.6", + "phpcsstandards/phpcsdevtools": "^1.2.1", + "phpunit/phpunit": "^4.5 || ^5.0 || ^6.0 || ^7.0 || ^8.0 || ^9.0" + }, + "default-branch": true, + "type": "phpcodesniffer-standard", + "extra": { + "branch-alias": { + "dev-stable": "1.x-dev", + "dev-develop": "1.x-dev" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "LGPL-3.0-or-later" + ], + "authors": [ + { + "name": "Juliette Reinders Folmer", + "homepage": "https://github.com/jrfnl", + "role": "lead" + }, + { + "name": "Contributors", + "homepage": "https://github.com/PHPCSStandards/PHPCSExtra/graphs/contributors" + } + ], + "description": "A collection of sniffs and standards for use with PHP_CodeSniffer.", + "keywords": [ + "PHP_CodeSniffer", + "phpcbf", + "phpcodesniffer-standard", + "phpcs", + "standards", + "static analysis" + ], + "support": { + "issues": "https://github.com/PHPCSStandards/PHPCSExtra/issues", + "security": "https://github.com/PHPCSStandards/PHPCSExtra/security/policy", + "source": "https://github.com/PHPCSStandards/PHPCSExtra" + }, + "funding": [ + { + "url": "https://github.com/PHPCSStandards", + "type": "github" + }, + { + "url": "https://github.com/jrfnl", + "type": "github" + }, + { + "url": "https://opencollective.com/php_codesniffer", + "type": "open_collective" + } + ], + "time": "2023-12-08T16:49:07+00:00" + }, + { + "name": "phpcsstandards/phpcsutils", + "version": "dev-develop", + "source": { + "type": "git", + "url": "https://github.com/PHPCSStandards/PHPCSUtils.git", + "reference": "da4c4da18b430eacdc6a6016009475951f9b1434" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/PHPCSStandards/PHPCSUtils/zipball/da4c4da18b430eacdc6a6016009475951f9b1434", + "reference": "da4c4da18b430eacdc6a6016009475951f9b1434", + "shasum": "" + }, + "require": { + "dealerdirect/phpcodesniffer-composer-installer": "^0.4.1 || ^0.5 || ^0.6.2 || ^0.7 || ^1.0", + "php": ">=5.4", + "squizlabs/php_codesniffer": "^3.8.0 || 4.0.x-dev@dev" + }, + "require-dev": { + "ext-filter": "*", + "php-parallel-lint/php-console-highlighter": "^1.0", + "php-parallel-lint/php-parallel-lint": "^1.3.2", + "phpcsstandards/phpcsdevcs": "^1.1.6", + "yoast/phpunit-polyfills": "^1.1.0 || ^2.0.0" + }, + "default-branch": true, + "type": "phpcodesniffer-standard", + "extra": { + "branch-alias": { + "dev-stable": "1.x-dev", + "dev-develop": "1.x-dev" + } + }, + "autoload": { + "classmap": [ + "PHPCSUtils/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "LGPL-3.0-or-later" + ], + "authors": [ + { + "name": "Juliette Reinders Folmer", + "homepage": "https://github.com/jrfnl", + "role": "lead" + }, + { + "name": "Contributors", + "homepage": "https://github.com/PHPCSStandards/PHPCSUtils/graphs/contributors" + } + ], + "description": "A suite of utility functions for use with PHP_CodeSniffer", + "homepage": "https://phpcsutils.com/", + "keywords": [ + "PHP_CodeSniffer", + "phpcbf", + "phpcodesniffer-standard", + "phpcs", + "phpcs3", + "standards", + "static analysis", + "tokens", + "utility" + ], + "support": { + "docs": "https://phpcsutils.com/", + "issues": "https://github.com/PHPCSStandards/PHPCSUtils/issues", + "security": "https://github.com/PHPCSStandards/PHPCSUtils/security/policy", + "source": "https://github.com/PHPCSStandards/PHPCSUtils" + }, + "funding": [ + { + "url": "https://github.com/PHPCSStandards", + "type": "github" + }, + { + "url": "https://github.com/jrfnl", + "type": "github" + }, + { + "url": "https://opencollective.com/php_codesniffer", + "type": "open_collective" + } + ], + "time": "2024-01-02T16:59:15+00:00" }, { "name": "phpdocumentor/reflection-common", @@ -649,12 +915,12 @@ "source": { "type": "git", "url": "https://github.com/phpDocumentor/ReflectionCommon.git", - "reference": "cf8df60735d98fd18070b7cab0019ba0831e219c" + "reference": "a0eeab580cbdf4414fef6978732510a36ed0a9d6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/ReflectionCommon/zipball/cf8df60735d98fd18070b7cab0019ba0831e219c", - "reference": "cf8df60735d98fd18070b7cab0019ba0831e219c", + "url": "https://api.github.com/repos/phpDocumentor/ReflectionCommon/zipball/a0eeab580cbdf4414fef6978732510a36ed0a9d6", + "reference": "a0eeab580cbdf4414fef6978732510a36ed0a9d6", "shasum": "" }, "require": { @@ -690,7 +956,11 @@ "reflection", "static analysis" ], - "time": "2020-06-19T17:42:03+00:00" + "support": { + "issues": "https://github.com/phpDocumentor/ReflectionCommon/issues", + "source": "https://github.com/phpDocumentor/ReflectionCommon/tree/master" + }, + "time": "2021-06-25T13:47:51+00:00" }, { "name": "phpdocumentor/reflection-docblock", @@ -698,24 +968,32 @@ "source": { "type": "git", "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git", - "reference": "069a785b2141f5bcf49f3e353548dc1cce6df556" + "reference": "c86c8d449b863bdaed15861a32dc4c50f8e3a832" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/069a785b2141f5bcf49f3e353548dc1cce6df556", - "reference": "069a785b2141f5bcf49f3e353548dc1cce6df556", + "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/c86c8d449b863bdaed15861a32dc4c50f8e3a832", + "reference": "c86c8d449b863bdaed15861a32dc4c50f8e3a832", "shasum": "" }, "require": { "ext-filter": "*", "php": "^7.2 || ^8.0", "phpdocumentor/reflection-common": "^2.2", - "phpdocumentor/type-resolver": "^1.3", + "phpdocumentor/type-resolver": "1.x-dev@dev", + "phpstan/phpdoc-parser": "^1.7", "webmozart/assert": "^1.9.1" }, "require-dev": { - "mockery/mockery": "~1.3.2" - }, + "mockery/mockery": "~1.3.5", + "phpstan/extension-installer": "^1.1", + "phpstan/phpstan": "^1.8", + "phpstan/phpstan-mockery": "^1.1", + "phpstan/phpstan-webmozart-assert": "^1.2", + "phpunit/phpunit": "^9.5", + "vimeo/psalm": "^4.26" + }, + "default-branch": true, "type": "library", "extra": { "branch-alias": { @@ -742,7 +1020,11 @@ } ], "description": "With this component, a library can provide support for annotations via DocBlocks or otherwise retrieve information that is embedded in a DocBlock.", - "time": "2020-09-03T19:13:55+00:00" + "support": { + "issues": "https://github.com/phpDocumentor/ReflectionDocBlock/issues", + "source": "https://github.com/phpDocumentor/ReflectionDocBlock/tree/master" + }, + "time": "2023-10-13T06:34:03+00:00" }, { "name": "phpdocumentor/type-resolver", @@ -750,21 +1032,31 @@ "source": { "type": "git", "url": "https://github.com/phpDocumentor/TypeResolver.git", - "reference": "6a467b8989322d92aa1c8bf2bebcc6e5c2ba55c0" + "reference": "e03361ca67e7e88452c46c28caca34309be40f53" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/6a467b8989322d92aa1c8bf2bebcc6e5c2ba55c0", - "reference": "6a467b8989322d92aa1c8bf2bebcc6e5c2ba55c0", + "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/e03361ca67e7e88452c46c28caca34309be40f53", + "reference": "e03361ca67e7e88452c46c28caca34309be40f53", "shasum": "" }, "require": { - "php": "^7.2 || ^8.0", - "phpdocumentor/reflection-common": "^2.0" + "doctrine/deprecations": "^1.0", + "php": "^7.4 || ^8.0", + "phpdocumentor/reflection-common": "^2.0", + "phpstan/phpdoc-parser": "^1.13" }, "require-dev": { - "ext-tokenizer": "*" - }, + "ext-tokenizer": "*", + "phpbench/phpbench": "^1.2", + "phpstan/extension-installer": "^1.1", + "phpstan/phpstan": "^1.8", + "phpstan/phpstan-phpunit": "^1.1", + "phpunit/phpunit": "^9.5", + "rector/rector": "^0.13.9", + "vimeo/psalm": "^4.25" + }, + "default-branch": true, "type": "library", "extra": { "branch-alias": { @@ -787,7 +1079,11 @@ } ], "description": "A PSR-5 based resolver of Class names, Types and Structural Element Names", - "time": "2020-09-17T18:55:26+00:00" + "support": { + "issues": "https://github.com/phpDocumentor/TypeResolver/issues", + "source": "https://github.com/phpDocumentor/TypeResolver/tree/1.x" + }, + "time": "2023-12-24T20:03:22+00:00" }, { "name": "phpspec/prophecy", @@ -795,29 +1091,31 @@ "source": { "type": "git", "url": "https://github.com/phpspec/prophecy.git", - "reference": "8ce87516be71aae9b956f81906aaf0338e0d8a2d" + "reference": "d4f454f7e1193933f04e6500de3e79191648ed0c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpspec/prophecy/zipball/8ce87516be71aae9b956f81906aaf0338e0d8a2d", - "reference": "8ce87516be71aae9b956f81906aaf0338e0d8a2d", + "url": "https://api.github.com/repos/phpspec/prophecy/zipball/d4f454f7e1193933f04e6500de3e79191648ed0c", + "reference": "d4f454f7e1193933f04e6500de3e79191648ed0c", "shasum": "" }, "require": { - "doctrine/instantiator": "^1.2", - "php": "^7.2 || ~8.0, <8.1", + "doctrine/instantiator": "^1.2 || ^2.0", + "php": "^7.2 || 8.0.* || 8.1.* || 8.2.* || 8.3.*", "phpdocumentor/reflection-docblock": "^5.2", - "sebastian/comparator": "^3.0 || ^4.0", - "sebastian/recursion-context": "^3.0 || ^4.0" + "sebastian/comparator": "^3.0 || ^4.0 || ^5.0", + "sebastian/recursion-context": "^3.0 || ^4.0 || ^5.0" }, "require-dev": { - "phpspec/phpspec": "^6.0", - "phpunit/phpunit": "^8.0 || ^9.0 <9.3" + "phpspec/phpspec": "^6.0 || ^7.0", + "phpstan/phpstan": "^1.9", + "phpunit/phpunit": "^8.0 || ^9.0 || ^10.0" }, + "default-branch": true, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.11.x-dev" + "dev-master": "1.x-dev" } }, "autoload": { @@ -845,12 +1143,64 @@ "keywords": [ "Double", "Dummy", + "dev", "fake", "mock", "spy", "stub" ], - "time": "2020-09-29T09:10:42+00:00" + "support": { + "issues": "https://github.com/phpspec/prophecy/issues", + "source": "https://github.com/phpspec/prophecy/tree/v1.18.0" + }, + "time": "2023-12-07T16:22:33+00:00" + }, + { + "name": "phpstan/phpdoc-parser", + "version": "1.25.0", + "source": { + "type": "git", + "url": "https://github.com/phpstan/phpdoc-parser.git", + "reference": "bd84b629c8de41aa2ae82c067c955e06f1b00240" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpstan/phpdoc-parser/zipball/bd84b629c8de41aa2ae82c067c955e06f1b00240", + "reference": "bd84b629c8de41aa2ae82c067c955e06f1b00240", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0" + }, + "require-dev": { + "doctrine/annotations": "^2.0", + "nikic/php-parser": "^4.15", + "php-parallel-lint/php-parallel-lint": "^1.2", + "phpstan/extension-installer": "^1.0", + "phpstan/phpstan": "^1.5", + "phpstan/phpstan-phpunit": "^1.1", + "phpstan/phpstan-strict-rules": "^1.0", + "phpunit/phpunit": "^9.5", + "symfony/process": "^5.2" + }, + "type": "library", + "autoload": { + "psr-4": { + "PHPStan\\PhpDocParser\\": [ + "src/" + ] + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "PHPDoc parser with support for nullable, intersection and generic types", + "support": { + "issues": "https://github.com/phpstan/phpdoc-parser/issues", + "source": "https://github.com/phpstan/phpdoc-parser/tree/1.25.0" + }, + "time": "2024-01-04T17:06:16+00:00" }, { "name": "phpunit/php-code-coverage", @@ -913,27 +1263,31 @@ "testing", "xunit" ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues", + "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/master" + }, "time": "2018-10-31T16:06:48+00:00" }, { "name": "phpunit/php-file-iterator", - "version": "2.0.2", + "version": "2.0.x-dev", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-file-iterator.git", - "reference": "050bedf145a257b1ff02746c31894800e5122946" + "reference": "42c5ba5220e6904cbfe8b1a1bda7c0cfdc8c12f5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/050bedf145a257b1ff02746c31894800e5122946", - "reference": "050bedf145a257b1ff02746c31894800e5122946", + "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/42c5ba5220e6904cbfe8b1a1bda7c0cfdc8c12f5", + "reference": "42c5ba5220e6904cbfe8b1a1bda7c0cfdc8c12f5", "shasum": "" }, "require": { - "php": "^7.1" + "php": ">=7.1" }, "require-dev": { - "phpunit/phpunit": "^7.1" + "phpunit/phpunit": "^8.5" }, "type": "library", "extra": { @@ -963,7 +1317,17 @@ "filesystem", "iterator" ], - "time": "2018-09-13T20:33:42+00:00" + "support": { + "issues": "https://github.com/sebastianbergmann/php-file-iterator/issues", + "source": "https://github.com/sebastianbergmann/php-file-iterator/tree/2.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2021-12-02T12:42:26+00:00" }, { "name": "phpunit/php-text-template", @@ -1004,27 +1368,31 @@ "keywords": [ "template" ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-text-template/issues", + "source": "https://github.com/sebastianbergmann/php-text-template/tree/1.2.1" + }, "time": "2015-06-21T13:50:34+00:00" }, { "name": "phpunit/php-timer", - "version": "2.1.2", + "version": "2.1.x-dev", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-timer.git", - "reference": "1038454804406b0b5f5f520358e78c1c2f71501e" + "reference": "2454ae1765516d20c4ffe103d85a58a9a3bd5662" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/1038454804406b0b5f5f520358e78c1c2f71501e", - "reference": "1038454804406b0b5f5f520358e78c1c2f71501e", + "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/2454ae1765516d20c4ffe103d85a58a9a3bd5662", + "reference": "2454ae1765516d20c4ffe103d85a58a9a3bd5662", "shasum": "" }, "require": { - "php": "^7.1" + "php": ">=7.1" }, "require-dev": { - "phpunit/phpunit": "^7.0" + "phpunit/phpunit": "^8.5" }, "type": "library", "extra": { @@ -1053,7 +1421,17 @@ "keywords": [ "timer" ], - "time": "2019-06-07T04:22:29+00:00" + "support": { + "issues": "https://github.com/sebastianbergmann/php-timer/issues", + "source": "https://github.com/sebastianbergmann/php-timer/tree/2.1" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-11-30T08:20:02+00:00" }, { "name": "phpunit/php-token-stream", @@ -1061,17 +1439,17 @@ "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-token-stream.git", - "reference": "995192df77f63a59e47f025390d2d1fdf8f425ff" + "reference": "9c1da83261628cb24b6a6df371b6e312b3954768" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-token-stream/zipball/995192df77f63a59e47f025390d2d1fdf8f425ff", - "reference": "995192df77f63a59e47f025390d2d1fdf8f425ff", + "url": "https://api.github.com/repos/sebastianbergmann/php-token-stream/zipball/9c1da83261628cb24b6a6df371b6e312b3954768", + "reference": "9c1da83261628cb24b6a6df371b6e312b3954768", "shasum": "" }, "require": { "ext-tokenizer": "*", - "php": "^7.1" + "php": ">=7.1" }, "require-dev": { "phpunit/phpunit": "^7.0" @@ -1102,8 +1480,18 @@ "keywords": [ "tokenizer" ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-token-stream/issues", + "source": "https://github.com/sebastianbergmann/php-token-stream/tree/3.1" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], "abandoned": true, - "time": "2019-09-17T06:23:10+00:00" + "time": "2021-07-26T12:15:06+00:00" }, { "name": "phpunit/phpunit", @@ -1187,27 +1575,31 @@ "testing", "xunit" ], + "support": { + "issues": "https://github.com/sebastianbergmann/phpunit/issues", + "source": "https://github.com/sebastianbergmann/phpunit/tree/7.5.9" + }, "time": "2019-04-19T15:50:46+00:00" }, { "name": "sebastian/code-unit-reverse-lookup", - "version": "1.0.1", + "version": "1.0.x-dev", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/code-unit-reverse-lookup.git", - "reference": "4419fcdb5eabb9caa61a27c7a1db532a6b55dd18" + "reference": "1de8cd5c010cb153fcd68b8d0f64606f523f7619" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/4419fcdb5eabb9caa61a27c7a1db532a6b55dd18", - "reference": "4419fcdb5eabb9caa61a27c7a1db532a6b55dd18", + "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/1de8cd5c010cb153fcd68b8d0f64606f523f7619", + "reference": "1de8cd5c010cb153fcd68b8d0f64606f523f7619", "shasum": "" }, "require": { - "php": "^5.6 || ^7.0" + "php": ">=5.6" }, "require-dev": { - "phpunit/phpunit": "^5.7 || ^6.0" + "phpunit/phpunit": "^8.5" }, "type": "library", "extra": { @@ -1232,29 +1624,39 @@ ], "description": "Looks up which function or method a line of code belongs to", "homepage": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/", - "time": "2017-03-04T06:30:41+00:00" + "support": { + "issues": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/issues", + "source": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/tree/1.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-11-30T08:15:22+00:00" }, { "name": "sebastian/comparator", - "version": "3.0.2", + "version": "3.0.x-dev", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/comparator.git", - "reference": "5de4fc177adf9bce8df98d8d141a7559d7ccf6da" + "reference": "1dc7ceb4a24aede938c7af2a9ed1de09609ca770" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/5de4fc177adf9bce8df98d8d141a7559d7ccf6da", - "reference": "5de4fc177adf9bce8df98d8d141a7559d7ccf6da", + "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/1dc7ceb4a24aede938c7af2a9ed1de09609ca770", + "reference": "1dc7ceb4a24aede938c7af2a9ed1de09609ca770", "shasum": "" }, "require": { - "php": "^7.1", + "php": ">=7.1", "sebastian/diff": "^3.0", "sebastian/exporter": "^3.1" }, "require-dev": { - "phpunit/phpunit": "^7.1" + "phpunit/phpunit": "^8.5" }, "type": "library", "extra": { @@ -1272,6 +1674,10 @@ "BSD-3-Clause" ], "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + }, { "name": "Jeff Welch", "email": "whatthejeff@gmail.com" @@ -1283,10 +1689,6 @@ { "name": "Bernhard Schussek", "email": "bschussek@2bepublished.at" - }, - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" } ], "description": "Provides the functionality to compare PHP values for equality", @@ -1296,24 +1698,34 @@ "compare", "equality" ], - "time": "2018-07-12T15:12:46+00:00" + "support": { + "issues": "https://github.com/sebastianbergmann/comparator/issues", + "source": "https://github.com/sebastianbergmann/comparator/tree/3.0.5" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2022-09-14T12:31:48+00:00" }, { "name": "sebastian/diff", - "version": "3.0.2", + "version": "3.0.x-dev", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/diff.git", - "reference": "720fcc7e9b5cf384ea68d9d930d480907a0c1a29" + "reference": "6296a0c086dd0117c1b78b059374d7fcbe7545ae" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/720fcc7e9b5cf384ea68d9d930d480907a0c1a29", - "reference": "720fcc7e9b5cf384ea68d9d930d480907a0c1a29", + "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/6296a0c086dd0117c1b78b059374d7fcbe7545ae", + "reference": "6296a0c086dd0117c1b78b059374d7fcbe7545ae", "shasum": "" }, "require": { - "php": "^7.1" + "php": ">=7.1" }, "require-dev": { "phpunit/phpunit": "^7.5 || ^8.0", @@ -1335,13 +1747,13 @@ "BSD-3-Clause" ], "authors": [ - { - "name": "Kore Nordmann", - "email": "mail@kore-nordmann.de" - }, { "name": "Sebastian Bergmann", "email": "sebastian@phpunit.de" + }, + { + "name": "Kore Nordmann", + "email": "mail@kore-nordmann.de" } ], "description": "Diff implementation", @@ -1352,24 +1764,34 @@ "unidiff", "unified diff" ], - "time": "2019-02-04T06:01:07+00:00" + "support": { + "issues": "https://github.com/sebastianbergmann/diff/issues", + "source": "https://github.com/sebastianbergmann/diff/tree/3.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-05-07T05:30:20+00:00" }, { "name": "sebastian/environment", - "version": "4.2.3", + "version": "4.2.x-dev", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/environment.git", - "reference": "464c90d7bdf5ad4e8a6aea15c091fec0603d4368" + "reference": "a8cb2aa3eca438e75a4b7895f04bc8f5f990bc49" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/464c90d7bdf5ad4e8a6aea15c091fec0603d4368", - "reference": "464c90d7bdf5ad4e8a6aea15c091fec0603d4368", + "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/a8cb2aa3eca438e75a4b7895f04bc8f5f990bc49", + "reference": "a8cb2aa3eca438e75a4b7895f04bc8f5f990bc49", "shasum": "" }, "require": { - "php": "^7.1" + "php": ">=7.1" }, "require-dev": { "phpunit/phpunit": "^7.5" @@ -1405,29 +1827,39 @@ "environment", "hhvm" ], - "time": "2019-11-20T08:46:58+00:00" + "support": { + "issues": "https://github.com/sebastianbergmann/environment/issues", + "source": "https://github.com/sebastianbergmann/environment/tree/4.2" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2021-08-17T14:54:22+00:00" }, { "name": "sebastian/exporter", - "version": "3.1.2", + "version": "3.1.x-dev", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/exporter.git", - "reference": "68609e1261d215ea5b21b7987539cbfbe156ec3e" + "reference": "73a9676f2833b9a7c36968f9d882589cd75511e6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/68609e1261d215ea5b21b7987539cbfbe156ec3e", - "reference": "68609e1261d215ea5b21b7987539cbfbe156ec3e", + "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/73a9676f2833b9a7c36968f9d882589cd75511e6", + "reference": "73a9676f2833b9a7c36968f9d882589cd75511e6", "shasum": "" }, "require": { - "php": "^7.0", + "php": ">=7.0", "sebastian/recursion-context": "^3.0" }, "require-dev": { "ext-mbstring": "*", - "phpunit/phpunit": "^6.0" + "phpunit/phpunit": "^8.5" }, "type": "library", "extra": { @@ -1472,7 +1904,17 @@ "export", "exporter" ], - "time": "2019-09-14T09:02:43+00:00" + "support": { + "issues": "https://github.com/sebastianbergmann/exporter/issues", + "source": "https://github.com/sebastianbergmann/exporter/tree/3.1" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2022-09-14T06:00:17+00:00" }, { "name": "sebastian/global-state", @@ -1523,24 +1965,28 @@ "keywords": [ "global state" ], + "support": { + "issues": "https://github.com/sebastianbergmann/global-state/issues", + "source": "https://github.com/sebastianbergmann/global-state/tree/2.0.0" + }, "time": "2017-04-27T15:39:26+00:00" }, { "name": "sebastian/object-enumerator", - "version": "3.0.3", + "version": "3.0.x-dev", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/object-enumerator.git", - "reference": "7cfd9e65d11ffb5af41198476395774d4c8a84c5" + "reference": "e67f6d32ebd0c749cf9d1dbd9f226c727043cdf2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/7cfd9e65d11ffb5af41198476395774d4c8a84c5", - "reference": "7cfd9e65d11ffb5af41198476395774d4c8a84c5", + "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/e67f6d32ebd0c749cf9d1dbd9f226c727043cdf2", + "reference": "e67f6d32ebd0c749cf9d1dbd9f226c727043cdf2", "shasum": "" }, "require": { - "php": "^7.0", + "php": ">=7.0", "sebastian/object-reflector": "^1.1.1", "sebastian/recursion-context": "^3.0" }, @@ -1570,24 +2016,34 @@ ], "description": "Traverses array structures and object graphs to enumerate all referenced objects", "homepage": "https://github.com/sebastianbergmann/object-enumerator/", - "time": "2017-08-03T12:35:26+00:00" + "support": { + "issues": "https://github.com/sebastianbergmann/object-enumerator/issues", + "source": "https://github.com/sebastianbergmann/object-enumerator/tree/3.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-11-30T07:40:27+00:00" }, { "name": "sebastian/object-reflector", - "version": "1.1.1", + "version": "1.1.x-dev", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/object-reflector.git", - "reference": "773f97c67f28de00d397be301821b06708fca0be" + "reference": "9b8772b9cbd456ab45d4a598d2dd1a1bced6363d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/773f97c67f28de00d397be301821b06708fca0be", - "reference": "773f97c67f28de00d397be301821b06708fca0be", + "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/9b8772b9cbd456ab45d4a598d2dd1a1bced6363d", + "reference": "9b8772b9cbd456ab45d4a598d2dd1a1bced6363d", "shasum": "" }, "require": { - "php": "^7.0" + "php": ">=7.0" }, "require-dev": { "phpunit/phpunit": "^6.0" @@ -1615,24 +2071,34 @@ ], "description": "Allows reflection of object attributes, including inherited and non-public ones", "homepage": "https://github.com/sebastianbergmann/object-reflector/", - "time": "2017-03-29T09:07:27+00:00" + "support": { + "issues": "https://github.com/sebastianbergmann/object-reflector/issues", + "source": "https://github.com/sebastianbergmann/object-reflector/tree/1.1" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-11-30T07:37:18+00:00" }, { "name": "sebastian/recursion-context", - "version": "3.0.0", + "version": "3.0.x-dev", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/recursion-context.git", - "reference": "5b0cd723502bac3b006cbf3dbf7a1e3fcefe4fa8" + "reference": "367dcba38d6e1977be014dc4b22f47a484dac7fb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/5b0cd723502bac3b006cbf3dbf7a1e3fcefe4fa8", - "reference": "5b0cd723502bac3b006cbf3dbf7a1e3fcefe4fa8", + "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/367dcba38d6e1977be014dc4b22f47a484dac7fb", + "reference": "367dcba38d6e1977be014dc4b22f47a484dac7fb", "shasum": "" }, "require": { - "php": "^7.0" + "php": ">=7.0" }, "require-dev": { "phpunit/phpunit": "^6.0" @@ -1653,14 +2119,14 @@ "BSD-3-Clause" ], "authors": [ - { - "name": "Jeff Welch", - "email": "whatthejeff@gmail.com" - }, { "name": "Sebastian Bergmann", "email": "sebastian@phpunit.de" }, + { + "name": "Jeff Welch", + "email": "whatthejeff@gmail.com" + }, { "name": "Adam Harvey", "email": "aharvey@php.net" @@ -1668,24 +2134,34 @@ ], "description": "Provides functionality to recursively process PHP variables", "homepage": "http://www.github.com/sebastianbergmann/recursion-context", - "time": "2017-03-03T06:23:57+00:00" + "support": { + "issues": "https://github.com/sebastianbergmann/recursion-context/issues", + "source": "https://github.com/sebastianbergmann/recursion-context/tree/3.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-11-30T07:34:24+00:00" }, { "name": "sebastian/resource-operations", - "version": "2.0.1", + "version": "2.0.x-dev", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/resource-operations.git", - "reference": "4d7a795d35b889bf80a0cc04e08d77cedfa917a9" + "reference": "31d35ca87926450c44eae7e2611d45a7a65ea8b3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/resource-operations/zipball/4d7a795d35b889bf80a0cc04e08d77cedfa917a9", - "reference": "4d7a795d35b889bf80a0cc04e08d77cedfa917a9", + "url": "https://api.github.com/repos/sebastianbergmann/resource-operations/zipball/31d35ca87926450c44eae7e2611d45a7a65ea8b3", + "reference": "31d35ca87926450c44eae7e2611d45a7a65ea8b3", "shasum": "" }, "require": { - "php": "^7.1" + "php": ">=7.1" }, "type": "library", "extra": { @@ -1710,7 +2186,17 @@ ], "description": "Provides a list of PHP built-in functions that operate on resources", "homepage": "https://www.github.com/sebastianbergmann/resource-operations", - "time": "2018-10-04T04:07:39+00:00" + "support": { + "issues": "https://github.com/sebastianbergmann/resource-operations/issues", + "source": "https://github.com/sebastianbergmann/resource-operations/tree/2.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-11-30T07:30:19+00:00" }, { "name": "sebastian/version", @@ -1753,6 +2239,10 @@ ], "description": "Library that helps with managing the version number of Git-hosted PHP projects", "homepage": "https://github.com/sebastianbergmann/version", + "support": { + "issues": "https://github.com/sebastianbergmann/version/issues", + "source": "https://github.com/sebastianbergmann/version/tree/master" + }, "time": "2016-10-03T07:35:21+00:00" }, { @@ -1760,13 +2250,13 @@ "version": "dev-master", "source": { "type": "git", - "url": "https://github.com/squizlabs/PHP_CodeSniffer.git", - "reference": "7c01187e14b8e56f2bc358915a466c35b8f84eb8" + "url": "https://github.com/PHPCSStandards/PHP_CodeSniffer.git", + "reference": "0c9a88b3cd01a476f163332fb959326a8f00826b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/squizlabs/PHP_CodeSniffer/zipball/7c01187e14b8e56f2bc358915a466c35b8f84eb8", - "reference": "7c01187e14b8e56f2bc358915a466c35b8f84eb8", + "url": "https://api.github.com/repos/PHPCSStandards/PHP_CodeSniffer/zipball/0c9a88b3cd01a476f163332fb959326a8f00826b", + "reference": "0c9a88b3cd01a476f163332fb959326a8f00826b", "shasum": "" }, "require": { @@ -1776,11 +2266,12 @@ "php": ">=5.4.0" }, "require-dev": { - "phpunit/phpunit": "^4.0 || ^5.0 || ^6.0 || ^7.0" + "phpunit/phpunit": "^4.0 || ^5.0 || ^6.0 || ^7.0 || ^8.0 || ^9.0" }, + "default-branch": true, "bin": [ - "bin/phpcs", - "bin/phpcbf" + "bin/phpcbf", + "bin/phpcs" ], "type": "library", "extra": { @@ -1795,92 +2286,45 @@ "authors": [ { "name": "Greg Sherwood", - "role": "lead" - } - ], - "description": "PHP_CodeSniffer tokenizes PHP, JavaScript and CSS files and detects violations of a defined set of coding standards.", - "homepage": "https://github.com/squizlabs/PHP_CodeSniffer", - "keywords": [ - "phpcs", - "standards" - ], - "time": "2020-10-26T22:22:45+00:00" - }, - { - "name": "symfony/polyfill-ctype", - "version": "dev-master", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-ctype.git", - "reference": "1c302646f6efc070cd46856e600e5e0684d6b454" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/1c302646f6efc070cd46856e600e5e0684d6b454", - "reference": "1c302646f6efc070cd46856e600e5e0684d6b454", - "shasum": "" - }, - "require": { - "php": ">=5.3.3" - }, - "suggest": { - "ext-ctype": "For best performance" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.18-dev" - }, - "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Polyfill\\Ctype\\": "" + "role": "Former lead" }, - "files": [ - "bootstrap.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ { - "name": "Gert de Pagter", - "email": "BackEndTea@gmail.com" + "name": "Juliette Reinders Folmer", + "role": "Current lead" }, { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" + "name": "Contributors", + "homepage": "https://github.com/PHPCSStandards/PHP_CodeSniffer/graphs/contributors" } ], - "description": "Symfony polyfill for ctype functions", - "homepage": "https://symfony.com", + "description": "PHP_CodeSniffer tokenizes PHP, JavaScript and CSS files and detects violations of a defined set of coding standards.", + "homepage": "https://github.com/PHPCSStandards/PHP_CodeSniffer", "keywords": [ - "compatibility", - "ctype", - "polyfill", - "portable" + "phpcs", + "standards", + "static analysis" ], + "support": { + "issues": "https://github.com/PHPCSStandards/PHP_CodeSniffer/issues", + "security": "https://github.com/PHPCSStandards/PHP_CodeSniffer/security/policy", + "source": "https://github.com/PHPCSStandards/PHP_CodeSniffer", + "wiki": "https://github.com/PHPCSStandards/PHP_CodeSniffer/wiki" + }, "funding": [ { - "url": "https://symfony.com/sponsor", - "type": "custom" + "url": "https://github.com/PHPCSStandards", + "type": "github" }, { - "url": "https://github.com/fabpot", + "url": "https://github.com/jrfnl", "type": "github" }, { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" + "url": "https://opencollective.com/php_codesniffer", + "type": "open_collective" } ], - "time": "2020-07-14T12:35:20+00:00" + "time": "2024-01-04T17:01:36+00:00" }, { "name": "tareq1988/wp-php-cs-fixer", @@ -1888,14 +2332,15 @@ "source": { "type": "git", "url": "https://github.com/tareq1988/wp-php-cs-fixer.git", - "reference": "56b9c1dd2b979a4ff7a25afa2e1c6b290a5ae876" + "reference": "465ea717d0894942bbba260051f0df955286e617" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/tareq1988/wp-php-cs-fixer/zipball/56b9c1dd2b979a4ff7a25afa2e1c6b290a5ae876", - "reference": "56b9c1dd2b979a4ff7a25afa2e1c6b290a5ae876", + "url": "https://api.github.com/repos/tareq1988/wp-php-cs-fixer/zipball/465ea717d0894942bbba260051f0df955286e617", + "reference": "465ea717d0894942bbba260051f0df955286e617", "shasum": "" }, + "default-branch": true, "type": "library", "autoload": { "psr-4": { @@ -1913,20 +2358,24 @@ } ], "description": "WordPress rules for php-cs-fixer", - "time": "2020-09-21T09:47:38+00:00" + "support": { + "issues": "https://github.com/tareq1988/wp-php-cs-fixer/issues", + "source": "https://github.com/tareq1988/wp-php-cs-fixer/tree/master" + }, + "time": "2023-06-19T06:26:04+00:00" }, { "name": "theseer/tokenizer", - "version": "1.2.0", + "version": "1.2.2", "source": { "type": "git", "url": "https://github.com/theseer/tokenizer.git", - "reference": "75a63c33a8577608444246075ea0af0d052e452a" + "reference": "b2ad5003ca10d4ee50a12da31de12a5774ba6b96" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/theseer/tokenizer/zipball/75a63c33a8577608444246075ea0af0d052e452a", - "reference": "75a63c33a8577608444246075ea0af0d052e452a", + "url": "https://api.github.com/repos/theseer/tokenizer/zipball/b2ad5003ca10d4ee50a12da31de12a5774ba6b96", + "reference": "b2ad5003ca10d4ee50a12da31de12a5774ba6b96", "shasum": "" }, "require": { @@ -1953,40 +2402,49 @@ } ], "description": "A small library for converting tokenized PHP source code into XML and potentially other formats", + "support": { + "issues": "https://github.com/theseer/tokenizer/issues", + "source": "https://github.com/theseer/tokenizer/tree/1.2.2" + }, "funding": [ { "url": "https://github.com/theseer", "type": "github" } ], - "time": "2020-07-12T23:59:07+00:00" + "time": "2023-11-20T00:12:19+00:00" }, { "name": "webmozart/assert", - "version": "1.9.1", + "version": "1.11.0", "source": { "type": "git", - "url": "https://github.com/webmozart/assert.git", - "reference": "bafc69caeb4d49c39fd0779086c03a3738cbb389" + "url": "https://github.com/webmozarts/assert.git", + "reference": "11cb2199493b2f8a3b53e7f19068fc6aac760991" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/webmozart/assert/zipball/bafc69caeb4d49c39fd0779086c03a3738cbb389", - "reference": "bafc69caeb4d49c39fd0779086c03a3738cbb389", + "url": "https://api.github.com/repos/webmozarts/assert/zipball/11cb2199493b2f8a3b53e7f19068fc6aac760991", + "reference": "11cb2199493b2f8a3b53e7f19068fc6aac760991", "shasum": "" }, "require": { - "php": "^5.3.3 || ^7.0 || ^8.0", - "symfony/polyfill-ctype": "^1.8" + "ext-ctype": "*", + "php": "^7.2 || ^8.0" }, "conflict": { "phpstan/phpstan": "<0.12.20", - "vimeo/psalm": "<3.9.1" + "vimeo/psalm": "<4.6.1 || 4.6.2" }, "require-dev": { - "phpunit/phpunit": "^4.8.36 || ^7.5.13" + "phpunit/phpunit": "^8.5.13" }, "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.10-dev" + } + }, "autoload": { "psr-4": { "Webmozart\\Assert\\": "src/" @@ -2008,35 +2466,48 @@ "check", "validate" ], - "time": "2020-07-08T17:02:28+00:00" + "support": { + "issues": "https://github.com/webmozarts/assert/issues", + "source": "https://github.com/webmozarts/assert/tree/1.11.0" + }, + "time": "2022-06-03T18:03:27+00:00" }, { "name": "wp-coding-standards/wpcs", - "version": "dev-master", + "version": "dev-develop", "source": { "type": "git", "url": "https://github.com/WordPress/WordPress-Coding-Standards.git", - "reference": "7da1894633f168fe244afc6de00d141f27517b62" + "reference": "eaa70fe99e8aa5f7fc444b67ae7b8401688f2d5c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/WordPress/WordPress-Coding-Standards/zipball/7da1894633f168fe244afc6de00d141f27517b62", - "reference": "7da1894633f168fe244afc6de00d141f27517b62", + "url": "https://api.github.com/repos/WordPress/WordPress-Coding-Standards/zipball/eaa70fe99e8aa5f7fc444b67ae7b8401688f2d5c", + "reference": "eaa70fe99e8aa5f7fc444b67ae7b8401688f2d5c", "shasum": "" }, "require": { + "ext-filter": "*", + "ext-libxml": "*", + "ext-tokenizer": "*", + "ext-xmlreader": "*", "php": ">=5.4", - "squizlabs/php_codesniffer": "^3.3.1" + "phpcsstandards/phpcsextra": "^1.2.1", + "phpcsstandards/phpcsutils": "^1.0.9", + "squizlabs/php_codesniffer": "^3.8.0" }, "require-dev": { - "dealerdirect/phpcodesniffer-composer-installer": "^0.5 || ^0.6", + "php-parallel-lint/php-console-highlighter": "^1.0.0", + "php-parallel-lint/php-parallel-lint": "^1.3.2", "phpcompatibility/php-compatibility": "^9.0", - "phpcsstandards/phpcsdevtools": "^1.0", - "phpunit/phpunit": "^4.0 || ^5.0 || ^6.0 || ^7.0" + "phpcsstandards/phpcsdevtools": "^1.2.0", + "phpunit/phpunit": "^4.0 || ^5.0 || ^6.0 || ^7.0 || ^8.0 || ^9.0" }, "suggest": { - "dealerdirect/phpcodesniffer-composer-installer": "^0.6 || This Composer plugin will sort out the PHPCS 'installed_paths' automatically." + "ext-iconv": "For improved results", + "ext-mbstring": "For improved results" }, + "default-branch": true, "type": "phpcodesniffer-standard", "notification-url": "https://packagist.org/downloads/", "license": [ @@ -2052,15 +2523,27 @@ "keywords": [ "phpcs", "standards", + "static analysis", "wordpress" ], - "time": "2020-05-13T23:57:56+00:00" + "support": { + "issues": "https://github.com/WordPress/WordPress-Coding-Standards/issues", + "source": "https://github.com/WordPress/WordPress-Coding-Standards", + "wiki": "https://github.com/WordPress/WordPress-Coding-Standards/wiki" + }, + "funding": [ + { + "url": "https://opencollective.com/php_codesniffer", + "type": "custom" + } + ], + "time": "2024-01-03T15:33:57+00:00" } ], "aliases": [], "minimum-stability": "dev", "stability-flags": { - "appsero/client": 20, + "wedevs/wp-utils": 20, "wp-coding-standards/wpcs": 20, "tareq1988/wp-php-cs-fixer": 20, "phpcompatibility/phpcompatibility-wp": 20 @@ -2068,8 +2551,8 @@ "prefer-stable": false, "prefer-lowest": false, "platform": { - "php": ">=5.4.0" + "php": ">=5.5" }, "platform-dev": [], - "plugin-api-version": "1.1.0" + "plugin-api-version": "2.3.0" } diff --git a/includes/Admin.php b/includes/Admin.php new file mode 100644 index 000000000..f68716ab5 --- /dev/null +++ b/includes/Admin.php @@ -0,0 +1,156 @@ +admin_welcome = new Admin\Admin_Welcome(); + $this->menu = new Admin\Menu(); + $this->dashboard_metabox = new Admin\Dashboard_Metabox(); + $this->form_template = new Admin\Forms\Post\Templates\Form_Template(); + $this->admin_form = new Admin\Forms\Admin_Form(); + $this->admin_form_handler = new Admin\Forms\Admin_Form_Handler(); + $this->admin_subscription = new Admin\Admin_Subscription(); + $this->admin_installer = new Admin\Admin_Installer(); + $this->settings = new Admin\Admin_Settings(); + $this->forms = new Admin\Forms\Form_Manager(); + $this->gutenberg_block = new Frontend\Form_Gutenberg_Block(); + $this->promotion = new Admin\Promotion(); + $this->plugin_upgrade_notice = new Admin\Plugin_Upgrade_Notice(); + $this->posting = new Admin\Posting(); + $this->shortcodes_button = new Admin\Shortcodes_Button(); + $this->tools = new Admin\Admin_Tools(); + + // dynamic hook. format: "admin_action_{$action}". more details: wp-admin/admin.php + add_action( 'admin_action_post_form_template', [ $this, 'create_post_form_from_template' ] ); + + // enqueue common scripts that will load throughout WordPress dashboard. notice, what's new etc. + add_action( 'admin_enqueue_scripts', [ $this, 'enqueue_common_scripts' ] ); + add_action( 'admin_enqueue_scripts', [ $this, 'enqueue_cpt_page_scripts' ] ); + + // block admin access as per wpuf settings + add_action( 'admin_init', [ $this, 'block_admin_access' ] ); + } + + /** + * Create post form templates depending on the action + * + * @since 4.0.0 + * + * @return void + */ + public function create_post_form_from_template() { + $this->form_template->create_post_form_from_template(); + } + + /** + * Enqueue the common CSS and JS needed for WordPress admin area + * + * @since 4.0.0 + * + * @return void + */ + public function enqueue_common_scripts() { + wp_enqueue_style( 'wpuf-whats-new' ); + wp_enqueue_style( 'wpuf-admin' ); + wp_enqueue_style( 'wpuf-sweetalert2' ); + wp_enqueue_script( 'wpuf-sweetalert2' ); + wp_enqueue_script( 'wpuf-admin' ); + + wp_localize_script( + 'wpuf-admin', 'wpuf_admin_script', + [ + 'ajaxurl' => admin_url( 'admin-ajax.php' ), + 'nonce' => wp_create_nonce( 'wpuf_nonce' ), + 'cleared_schedule_lock' => __( 'Post lock has been cleared', 'wp-user-frontend' ), + 'asset_url' => WPUF_ASSET_URI, + 'protected_shortcodes' => wpuf_get_protected_shortcodes(), + 'protected_shortcodes_message' => sprintf( + __( '%sThis post contains a sensitive short-code %s, that may allow others to sign-up with distinguished roles. If unsure, remove the short-code before publishing (recommended) %sas this may be exploited as a security vulnerability.%s', 'wp-user-frontend' ), + '
    ', + '[wpuf-registration]', + '', + '', + '
    ' + ) + ] + ); + } + + public function enqueue_cpt_page_scripts( $hook_suffix ) { + $cpt = [ 'wpuf_subscription', 'post', 'page' ]; + if ( in_array( $hook_suffix, [ 'post.php', 'post-new.php' ], true ) ) { + wp_enqueue_script( 'wpuf-subscriptions' ); + $screen = get_current_screen(); + + if ( is_object( $screen ) && in_array( $screen->post_type, $cpt, true ) ) { + wp_enqueue_script( 'wpuf-subscriptions' ); + } + } + + if ( in_array( $hook_suffix, [ 'post.php', 'post-new.php' ], true ) ) { + wp_enqueue_script( 'wpuf-upload' ); + wp_localize_script( + 'wpuf-upload', + 'wpuf_upload', + [ + 'confirmMsg' => __( 'Are you sure?', 'wp-user-frontend' ), + 'delete_it' => __( 'Yes, delete it', 'wp-user-frontend' ), + 'cancel_it' => __( 'No, cancel it', 'wp-user-frontend' ), + 'ajaxurl' => admin_url( 'admin-ajax.php' ), + 'nonce' => wp_create_nonce( 'wpuf_nonce' ), + 'plupload' => [ + 'url' => admin_url( 'admin-ajax.php' ) . '?nonce=' . wp_create_nonce( 'wpuf-upload-nonce' ), + 'flash_swf_url' => includes_url( 'js/plupload/plupload.flash.swf' ), + 'filters' => [ + [ + 'title' => __( 'Allowed Files', 'wp-user-frontend' ), + 'extensions' => '*', + ], + ], + 'multipart' => true, + 'urlstream_upload' => true, + 'warning' => __( 'Maximum number of files reached!', 'wp-user-frontend' ), + 'size_error' => __( 'The file you have uploaded exceeds the file size limit. Please try again.', 'wp-user-frontend' ), + 'type_error' => __( 'You have uploaded an incorrect file type. Please try again.', 'wp-user-frontend' ), + ], + ] + ); + } + } + + /** + * Block user access to admin panel for specific roles + * + * @global string $pagenow + */ + public function block_admin_access() { + global $pagenow; + + // bail out if we are from WP Cli + if ( defined( 'WP_CLI' ) ) { + return; + } + + $access_level = wpuf_get_option( 'admin_access', 'wpuf_general', 'read' ); + $valid_pages = [ 'admin-ajax.php', 'admin-post.php', 'async-upload.php', 'media-upload.php' ]; + + if ( ! current_user_can( $access_level ) && ! in_array( $pagenow, $valid_pages ) ) { + // wp_die( __( 'Access Denied. Your site administrator has blocked your access to the WordPress back-office.', 'wpuf' ) ); + wp_redirect( home_url() ); + exit; + } + } +} diff --git a/includes/Admin/Admin_Installer.php b/includes/Admin/Admin_Installer.php new file mode 100644 index 000000000..9a9446ea2 --- /dev/null +++ b/includes/Admin/Admin_Installer.php @@ -0,0 +1,188 @@ + +
    +

    + WP User Frontend pages yet, you can do this by one click.', + 'wp-user-frontend' ); ?> +

    +

    + + + +

    +
    + +
    +

    + WP User Frontend has been successfully installed and saved!', + 'wp-user-frontend' ); ?> +

    +
    + init_pages(); + } + // if ( isset( $_POST['install_wpuf_pages'] ) && $_POST['install_wpuf_pages'] == '1' ) { + // $this->init_pages(); + // } + if ( isset( $_GET['wpuf_hide_page_nag'] ) && $_GET['wpuf_hide_page_nag'] == '1' ) { + update_option( '_wpuf_page_created', '1' ); + } + } + + /** + * Initialize the plugin with some default page/settings + * + * @since 2.2 + * + * @return void + */ + public function init_pages() { + // create a dashboard page + $dashboard_page = $this->create_page( __( 'Dashboard', 'wp-user-frontend' ), '[wpuf_dashboard]' ); + $account_page = $this->create_page( __( 'Account', 'wp-user-frontend' ), '[wpuf_account]' ); + $edit_page = $this->create_page( __( 'Edit', 'wp-user-frontend' ), '[wpuf_edit]' ); + // login page + $login_page = $this->create_page( __( 'Login', 'wp-user-frontend' ), '[wpuf-login]' ); + $post_form = $this->create_form(); + if ( 'on' == wpuf_get_option( 'enable_payment', 'wpuf_payment', 'on' ) ) { + // payment page + $subscr_page = $this->create_page( __( 'Subscription', 'wp-user-frontend' ), + __( '[wpuf_sub_pack]', 'wp-user-frontend' ) ); + $payment_page = $this->create_page( __( 'Payment', 'wp-user-frontend' ), + __( 'Please select a gateway for payment', 'wp-user-frontend' ) ); + $thank_page = $this->create_page( __( 'Thank You', 'wp-user-frontend' ), + __( '

    Payment is complete

    Congratulations, your payment has been completed!

    ', + 'wp-user-frontend' ) ); + $bank_page = $this->create_page( __( 'Order Received', 'wp-user-frontend' ), + __( 'Hi, we have received your order. We will validate the order and will take necessary steps to move forward.', + 'wp-user-frontend' ) ); + } + // save the settings + if ( $edit_page ) { + update_option( 'wpuf_frontend_posting', [ + 'edit_page_id' => $edit_page, + 'default_post_form' => $post_form, + ] ); + } + // profile pages + $profile_options = []; + $reg_page = false; + if ( $login_page ) { + $profile_options['login_page'] = $login_page; + } + $data = apply_filters( 'wpuf_pro_page_install', $profile_options ); + if ( is_array( $data ) ) { + if ( isset( $data['profile_options'] ) ) { + $profile_options = $data['profile_options']; + } + if ( isset( $data['reg_page'] ) ) { + $reg_page = $data['reg_page']; + } + } + if ( $login_page && $reg_page ) { + $profile_options['register_link_override'] = 'on'; + } + update_option( 'wpuf_profile', $profile_options ); + if ( 'on' == wpuf_get_option( 'enable_payment', 'wpuf_payment', 'on' ) ) { + // payment pages + update_option( 'wpuf_payment', [ + 'subscription_page' => $subscr_page, + 'payment_page' => $payment_page, + 'payment_success' => $thank_page, + 'bank_success' => $bank_page, + ] ); + } + update_option( '_wpuf_page_created', '1' ); + $page = isset( $_GET['page'] ) ? sanitize_text_field( wp_unslash( $_GET['page'] ) ) : ''; + if ( $page != 'wpuf-setup' ) { + wp_redirect( admin_url( 'admin.php?page=wpuf-settings&wpuf_page_installed=1' ) ); + exit; + } + } + + /** + * Create a page with title and content + * + * @param string $page_title + * @param string $post_content + * + * @return false|int + */ + public function create_page( $page_title, $post_content = '', $post_type = 'page' ) { + $page_id = wp_insert_post( [ + 'post_title' => $page_title, + 'post_type' => $post_type, + 'post_status' => 'publish', + 'comment_status' => 'closed', + 'post_content' => $post_content, + ] ); + if ( $page_id && ! is_wp_error( $page_id ) ) { + return $page_id; + } + + return false; + } + + /** + * Create a basic registration form by default + * + * @return int|bool + */ + public function create_reg_form() { + return wpuf_create_sample_form( __( 'Registration', 'wp-user-frontend' ), 'wpuf_profile' ); + } + + /** + * Create a post form + * + * @return void + */ + public function create_form() { + return wpuf_create_sample_form( __( 'Sample Form', 'wp-user-frontend' ), 'wpuf_forms' ); + } +} diff --git a/includes/Admin/Admin_Settings.php b/includes/Admin/Admin_Settings.php new file mode 100644 index 000000000..13fd484c3 --- /dev/null +++ b/includes/Admin/Admin_Settings.php @@ -0,0 +1,185 @@ +settings_api = new WeDevs_Settings_API(); + add_action( 'admin_init', [ $this, 'admin_init' ] ); + } + + public function admin_init() { + //set the settings + $this->settings_api->set_sections( $this->get_settings_sections() ); + $this->settings_api->set_fields( $this->get_settings_fields() ); + //initialize settings + $this->settings_api->admin_init(); + } + + /** + * WPUF Settings sections + * + * @since 1.0 + * + * @return array + */ + public function get_settings_sections() { + return wpuf_settings_sections(); + } + + /** + * Returns all the settings fields + * + * @return array settings fields + */ + public function get_settings_fields() { + return wpuf_settings_fields(); + } + + public function plugin_page() { + ?> +
    + +

    +
    + settings_api->show_navigation(); + $this->settings_api->show_forms(); + ?> +
    + +
    + id, $this->menu_pages, true ) ) { + return true; + } + + return false; + } + + /** + * Get the settings_api property + * + * @since 4.0.0 + * + * @return WeDevs_Settings_API + */ + public function get_settings_api() { + return $this->settings_api; + } + + +} diff --git a/admin/class-admin-subscription.php b/includes/Admin/Admin_Subscription.php similarity index 93% rename from admin/class-admin-subscription.php rename to includes/Admin/Admin_Subscription.php index 4f7773cab..aa6dbba9a 100644 --- a/admin/class-admin-subscription.php +++ b/includes/Admin/Admin_Subscription.php @@ -1,53 +1,38 @@ subscription->get_subscription( $pack_id ); + $user_pack = wpuf()->subscription->get_user_pack( $u_id ); if ( isset( $user_pack['pack_id'] ) && $pack_id == $user_pack['pack_id'] ) { //updating number of posts if ( isset( $user_pack['posts'] ) ) { - $p_type = isset( $_POST[ $post_type ] ) ? sanitize_text_field( wp_unslash( $_POST[ $post_type ] ) ) : ''; + $p_type = isset( $_POST['post_type'] ) ? sanitize_text_field( wp_unslash( $_POST['post_type'] ) ) : ''; foreach ( $user_pack['posts'] as $post_type => $post_num ) { $user_pack['posts'][ $post_type ] = $p_type; } @@ -186,7 +171,7 @@ public function profile_subscription_update( $user_id ) { $is_recurring = true; } - WPUF_Payment::insert_payment( $data, 0, $is_recurring ); + Payment::insert_payment( $data, 0, $is_recurring ); } } @@ -230,7 +215,7 @@ public function subscription_columns_content( $column_name, $post_ID ) { break; case 'subscribers': - $users = WPUF_Subscription::init()->subscription_pack_users( $post_ID ); + $users = wpuf()->subscription->subscription_pack_users( $post_ID ); echo wp_kses_post( '' . count( $users ) . '' ); break; @@ -263,7 +248,7 @@ public function subscription_columns_content( $column_name, $post_ID ) { public function get_post_types( $post_types = null ) { if ( ! $post_types ) { - $post_types = WPUF_Subscription::init()->get_all_post_type(); + $post_types = wpuf()->subscription->get_all_post_type(); } ob_start(); @@ -313,7 +298,7 @@ public function pack_description_metabox( $pack_id = null ) { public function subs_meta_box() { global $post; - $sub_meta = WPUF_Subscription::init()->get_subscription_meta( $post->ID, $post ); + $sub_meta = wpuf()->subscription->get_subscription_meta( $post->ID, $post ); $hidden_recurring_class = ( $sub_meta['recurring_pay'] != 'yes' ) ? 'none' : ''; $hidden_trial_class = ( $sub_meta['trial_status'] != 'yes' ) ? 'none' : ''; @@ -328,6 +313,7 @@ public function subs_meta_box() { $post_expiration_message = isset( $sub_meta['_post_expiration_message'] ) ? $sub_meta['_post_expiration_message'] : ''; $featured_item = ! empty( $sub_meta['_total_feature_item'] ) ? $sub_meta['_total_feature_item'] : 0; $remove_featured_item = ! empty( $sub_meta['_remove_feature_item'] ) ? $sub_meta['_remove_feature_item'] : 0; + $billing_amount = ! empty( $sub_meta['billing_amount'] ) ? esc_attr( $sub_meta['billing_amount'] ) : 0; ?>
    @@ -531,11 +517,12 @@ public function subs_meta_box() { public function enqueue_scripts() { $screen = get_current_screen(); - if ( $screen->post_type != 'wpuf_subscription' ) { + if ( 'wpuf_subscription' !== $screen->post_type ) { return; } - wp_enqueue_script( 'wpuf-metabox-tabs', WPUF_ASSET_URI . '/js/metabox-tabs.js', [ 'jquery' ] ); + wp_enqueue_style( 'wpuf-admin' ); + wp_enqueue_script( 'wpuf-metabox-tabs' ); } /** @@ -550,7 +537,7 @@ public function enqueue_profile_script() { return; } - wp_enqueue_script( 'wpuf-admin-profile-subs', WPUF_ASSET_URI . '/js/admin-profile-subs.js', [ 'jquery' ] ); + // wp_enqueue_script( 'wpuf-admin-profile-subs', WPUF_ASSET_URI . '/js/admin-profile-subs.js', [ 'jquery' ] ); } /** @@ -594,6 +581,8 @@ public function profile_subscription_details( $profileuser ) { return; } + wp_enqueue_script( 'wpuf-subscriptions' ); + $current_user = wpuf_get_user(); if ( ! $current_user->subscription()->current_pack_id() ) { @@ -602,8 +591,8 @@ public function profile_subscription_details( $profileuser ) { $userdata = get_userdata( $profileuser->ID ); //wp 3.3 fix - $packs = WPUF_Subscription::init()->get_subscriptions(); - $user_sub = WPUF_Subscription::get_user_pack( $userdata->ID ); + $packs = wpuf()->subscription->get_subscriptions(); + $user_sub = wpuf()->subscription->get_user_pack( $userdata->ID ); $pack_id = isset( $user_sub['pack_id'] ) ? $user_sub['pack_id'] : ''; ?>
    @@ -612,8 +601,8 @@ public function profile_subscription_details( $profileuser ) { get_details_meta_value(); + $pack = wpuf()->subscription->get_subscription( $user_sub['pack_id'] ); + $details_meta = wpuf()->subscription->get_details_meta_value(); $billing_amount = ( isset( $pack->meta_value['billing_amount'] ) && intval( $pack->meta_value['billing_amount'] ) > 0 ) ? $details_meta['symbol'] . $pack->meta_value['billing_amount'] : __( 'Free', 'wp-user-frontend' ); $recurring_pay = ( isset( $pack->meta_value['recurring_pay'] ) && $pack->meta_value['recurring_pay'] == 'yes' ) ? true : false; @@ -667,20 +656,20 @@ public function profile_subscription_details( $profileuser ) { - + $value ) { $post_type_object = get_post_type_object( $key ); if ( $post_type_object ) { ?> - - - - + + + + - + - > + - @@ -734,7 +723,7 @@ public function profile_subscription_details( $profileuser ) { } ?> - $each_time_type_val ) { ?> @@ -830,7 +819,7 @@ public function profile_subscription_details( $profileuser ) {
    @@ -870,15 +859,20 @@ public function delete_user_package() { if ( isset( $nonce ) && ! wp_verify_nonce( $nonce, 'wpuf-subscription-delete-nonce' ) ) { return; } + + if ( ! current_user_can( wpuf_admin_role() ) ) { + return; + } + $userid = isset( $_POST['userid'] ) ? intval( wp_unslash( $_POST['userid'] ) ) : 0; echo esc_html( delete_user_meta( $userid, '_wpuf_subscription_pack' ) ); - $wpuf_paypal = new WPUF_Paypal(); + $wpuf_paypal = new Paypal(); $wpuf_paypal->recurring_change_status( $userid, 'Cancel' ); if ( isset( $_POST['packid'] ) ) { $pack_id = intval( wp_unslash( $_POST['packid'] ) ); - WPUF_Subscription::subscriber_cancel( $userid, $pack_id ); + wpuf()->subscription->subscriber_cancel( $userid, $pack_id ); } exit; } @@ -910,5 +904,3 @@ public function add_help_link() { %s

    ', __( 'Sorry you have no form to export', 'wp-user-frontend' ) ); + printf( '

    %s

    ', __( 'Sorry you have no post form to export', 'wp-user-frontend' ) ); } } @@ -128,7 +140,7 @@ public function list_regis_forms() {
    %s

    ', __( 'Sorry you have no form to export', 'wp-user-frontend' ) ); + printf( '

    %s

    ', __( 'Sorry you have no registration form to export', 'wp-user-frontend' ) ); } } @@ -205,12 +217,12 @@ public static function import_json_file( $file ) { * Export normal form data * * @param string $export_type - * @param int $form_ids + * @param array $form_ids */ public function export_forms( $form_type, $export_type, $form_ids ) { if ( $export_type === 'all' ) { static::export_to_json( $form_type ); - } else if ( $export_type === 'selected' ) { + } else if ( 'selected' === $export_type ) { if ( empty( $form_ids ) ) { printf( '

    %s

    ', @@ -366,4 +378,178 @@ public function tool_page() {
    delete_post_type( 'wpuf_forms' ); + break; + case 'del_pro_forms': + $this->delete_post_type( 'wpuf_profile' ); + break; + case 'del_subs': + $this->delete_post_type( 'wpuf_subscription' ); + break; + case 'del_coupon': + $this->delete_post_type( 'wpuf_coupon' ); + break; + case 'clear_transaction': + $wpdb->query( "TRUNCATE TABLE {$wpdb->prefix}wpuf_transaction" ); + $message = 'del_trans'; + break; + default: + // code... + break; + } + wp_safe_redirect( add_query_arg( [ 'msg' => $message ], admin_url( 'admin.php?page=wpuf_tools&action=tools' ) ) ); + exit; + } + + /** + * Enable json file upload via ajax in tools page + * + * @since 3.2.0 + * + * @param array $file + * + * @return array + */ + public function enable_json_upload( $file ) { + if ( defined( 'DOING_AJAX' ) && DOING_AJAX && isset( $_POST['action'] ) && 'upload-attachment' === $_POST['action'] && isset( $_POST['type'] ) && 'wpuf-form-uploader' === $_POST['type'] ) { + // @see wp_ajax_upload_attachment + check_ajax_referer( 'media-form' ); + add_filter( 'wp_check_filetype_and_ext', [ $this, 'check_filetype_and_ext' ] ); + } + + return $file; + } + + /** + * Ajax handler to import WPUF form + * + * @since 3.2.0 + * + * @return void + */ + public function import_forms() { + check_ajax_referer( 'wpuf_admin_tools' ); + if ( ! isset( $_POST['file_id'] ) ) { + wp_send_json_error( + new WP_Error( + 'wpuf_ajax_import_forms_error', + __( 'Missing file_id param', 'wp-user-frontend' ) + ), + WP_Http::BAD_REQUEST + ); + } + $file_id = absint( wp_unslash( $_POST['file_id'] ) ); + $file = get_attached_file( $file_id ); + if ( empty( $file ) ) { + wp_send_json_error( + new WP_Error( + 'wpuf_ajax_import_forms_error', + __( 'JSON file not found', 'wp-user-frontend' ) + ), + WP_Http::NOT_FOUND + ); + } + $filetype = wp_check_filetype( $file, [ 'json' => 'application/json' ] ); + if ( ! isset( $filetype['type'] ) || 'application/json' !== $filetype['type'] ) { + wp_send_json_error( + new WP_Error( + 'wpuf_ajax_import_forms_error', + __( 'Provided file is not a JSON file.', 'wp-user-frontend' ) + ), + WP_Http::UNSUPPORTED_MEDIA_TYPE + ); + } + + $imported = self::import_json_file( $file ); + if ( is_wp_error( $imported ) ) { + wp_send_json_error( $imported, WP_Http::UNPROCESSABLE_ENTITY ); + } + wp_send_json_success( + [ + 'message' => __( 'Forms imported successfully.', 'wp-user-frontend' ), + ] + ); + } + + /** + * Add json file mime type to upload in WP Media + * + * @since 3.2.0 + * + * @param array $mime_types + * + * @return array + */ + public function add_json_mime_type( $mime_types ) { + $mime_types['json'] = 'application/json'; + + return $mime_types; + } + + /** + * Allow json file to upload with async uploader + * + * @since 3.2.0 + * + * @param array $info + * + * @return array + */ + public function check_filetype_and_ext( $info ) { + $info['ext'] = 'json'; + $info['type'] = 'application/json'; + + return $info; + } + + /** + * Delete all posts by a post type + * + * @param string $post_type + * + * @return void + */ + public function delete_post_type( $post_type ) { + $query = new WP_Query( + [ + 'post_type' => $post_type, + 'posts_per_page' => -1, + 'post_status' => [ 'publish', 'draft', 'pending', 'trash' ], + ] + ); + $posts = $query->get_posts(); + if ( $posts ) { + foreach ( $posts as $item ) { + wp_delete_post( $item->ID, true ); + } + } + wp_reset_postdata(); + } } diff --git a/admin/class-admin-welcome.php b/includes/Admin/Admin_Welcome.php similarity index 75% rename from admin/class-admin-welcome.php rename to includes/Admin/Admin_Welcome.php index 24c6ad97c..fef5fb768 100644 --- a/admin/class-admin-welcome.php +++ b/includes/Admin/Admin_Welcome.php @@ -1,14 +1,16 @@ __( 'Show Billing Address', 'wp-user-frontend' ), + 'country' => __( 'Country', 'wp-user-frontend' ), + 'state' => __( 'State/Province/Region', 'wp-user-frontend' ), + 'address_1' => __( 'Address line 1', 'wp-user-frontend' ), + 'address_2' => __( 'Address line 2', 'wp-user-frontend' ), + 'city' => __( 'City', 'wp-user-frontend' ), + 'zip' => __( 'Postal Code/ZIP', 'wp-user-frontend' ), + ]; + foreach ( $fields as $field => $label ) { + $settings_name = 'wpuf_address_' . $field . '_settings'; + $address_options[ $field ] = get_theme_mod( $settings_name ); + } + update_option( 'wpuf_address_options', $address_options ); ?> + + add_panel( + 'wpuf_panel', [ + 'title' => __( 'WP User Frontend', 'wp-user-frontend' ), + 'description' => __( 'Customize WPUF Settings', 'wp-user-frontend' ), + 'priority' => 25, + ] + ); + /* WPUF Billing Address Customizer */ + $wp_customize->add_section( + 'wpuf_billing_address', [ + 'title' => __( 'Billing Address', 'wp-user-frontend' ), + 'priority' => 20, + 'panel' => 'wpuf_panel', + 'description' => __( + 'These options let you change the appearance of the billing address.', 'wp-user-frontend' + ), + ] + ); + // Billing Address field controls. + $fields = [ + 'show_address' => __( 'Show Billing Address', 'wp-user-frontend' ), + 'country' => __( 'Country', 'wp-user-frontend' ), + 'state' => __( 'State/Province/Region', 'wp-user-frontend' ), + 'address_1' => __( 'Address line 1', 'wp-user-frontend' ), + 'address_2' => __( 'Address line 2', 'wp-user-frontend' ), + 'city' => __( 'City', 'wp-user-frontend' ), + 'zip' => __( 'Postal Code/ZIP', 'wp-user-frontend' ), + ]; + foreach ( $fields as $field => $label ) { + $wp_customize->add_setting( + 'wpuf_address_' . $field . '_settings', [ + 'type' => 'theme_mod', + 'section' => 'wpuf_billing_address', + ] + ); + if ( $field == 'show_address' ) { + $wp_customize->add_control( + 'wpuf_address_' . $field . '_control', [ + /* Translators: %s field name. */ + 'label' => sprintf( __( '%s field', 'wp-user-frontend' ), $label ), + 'section' => 'wpuf_billing_address', + 'settings' => 'wpuf_address_' . $field . '_settings', + 'type' => 'checkbox', + ] + ); + } else { + $wp_customize->add_control( + 'wpuf_address_' . $field . '_control', [ + /* Translators: %s field name. */ + 'label' => sprintf( __( '%s field', 'wp-user-frontend' ), $label ), + 'section' => 'wpuf_billing_address', + 'settings' => 'wpuf_address_' . $field . '_settings', + 'type' => 'select', + 'choices' => [ + 'hidden' => __( 'Hidden', 'wp-user-frontend' ), + 'optional' => __( 'Optional', 'wp-user-frontend' ), + 'required' => __( 'Required', 'wp-user-frontend' ), + ], + ] + ); + } + } + } +} diff --git a/admin/dashboard-metabox.php b/includes/Admin/Dashboard_Metabox.php similarity index 89% rename from admin/dashboard-metabox.php rename to includes/Admin/Dashboard_Metabox.php index 6a0d57262..73b34fee5 100644 --- a/admin/dashboard-metabox.php +++ b/includes/Admin/Dashboard_Metabox.php @@ -1,20 +1,25 @@
    - Rating Banner + Rating Banner

    Could you please take a moment and share your + href="https://wordpress.org/support/plugin/wp-user-frontend/reviews/?filter=5" target="_blank">share + your opinion on WP.org? It would motivate us a lot and help other users get decisive while choosing WP User Frontend. Thanks in advance.

    @@ -62,8 +68,9 @@ public function render_metabox() { $articles = $this->fetch_articles(); foreach ( $articles as $article ) { ?> -
  • - +
  • +
    @@ -80,7 +87,7 @@ public function render_metabox() { target="_blank"> - +
    @@ -89,54 +96,39 @@ public function render_metabox() { private function fetch_articles() { $article_list = get_transient( self::OPT_KEY ); - if ( $article_list ) { return $article_list; } - $response = wp_remote_get( esc_url( self::URL ) ); - if ( is_wp_error( $response ) ) { return []; } - $body = wp_remote_retrieve_body( $response ); - $dom = new DOMDocument(); @$dom->loadHTML( $body ); - $finder = new DomXPath( $dom ); - $classname = 'post__title'; $nodes = $finder->query( "//*[contains(concat(' ', normalize-space(@class), ' '), ' $classname ')]" ); - if ( empty( $nodes ) ) { return []; } - $url = parse_url( self::URL ); $domain = $url['scheme'] . '://' . $url['host']; $article_list = []; $count = 0; - foreach ( $nodes as $node ) { $title = $node->nodeValue; $path = $node->lastChild->attributes[0]->nodeValue; - $article = [ 'title' => $title, 'href' => $domain . $path, ]; - array_push( $article_list, $article ); - $count ++; - if ( $count >= 5 ) { break; } } - if ( ! empty( $article_list ) ) { set_transient( self::OPT_KEY, $article_list, DAY_IN_SECONDS ); diff --git a/includes/Admin/Forms/Admin_Form.php b/includes/Admin/Forms/Admin_Form.php new file mode 100644 index 000000000..202936a5e --- /dev/null +++ b/includes/Admin/Forms/Admin_Form.php @@ -0,0 +1,449 @@ + __( 'Forms', 'wp-user-frontend' ), + 'public' => false, + 'show_ui' => false, + 'show_in_menu' => false, //false, + 'capability_type' => 'post', + 'hierarchical' => false, + 'query_var' => false, + 'supports' => [ 'title' ], + 'capabilities' => [ + 'publish_posts' => $capability, + 'edit_posts' => $capability, + 'edit_others_posts' => $capability, + 'delete_posts' => $capability, + 'delete_others_posts' => $capability, + 'read_private_posts' => $capability, + 'edit_post' => $capability, + 'delete_post' => $capability, + 'read_post' => $capability, + ], + 'labels' => [ + 'name' => __( 'Forms', 'wp-user-frontend' ), + 'singular_name' => __( 'Form', 'wp-user-frontend' ), + 'menu_name' => __( 'Forms', 'wp-user-frontend' ), + 'add_new' => __( 'Add Form', 'wp-user-frontend' ), + 'add_new_item' => __( 'Add New Form', 'wp-user-frontend' ), + 'edit' => __( 'Edit', 'wp-user-frontend' ), + 'edit_item' => __( 'Edit Form', 'wp-user-frontend' ), + 'new_item' => __( 'New Form', 'wp-user-frontend' ), + 'view' => __( 'View Form', 'wp-user-frontend' ), + 'view_item' => __( 'View Form', 'wp-user-frontend' ), + 'search_items' => __( 'Search Form', 'wp-user-frontend' ), + 'not_found' => __( 'No Form Found', 'wp-user-frontend' ), + 'not_found_in_trash' => __( 'No Form Found in Trash', + 'wp-user-frontend' ), + 'parent' => __( 'Parent Form', 'wp-user-frontend' ), + ], + ] ); + register_post_type( 'wpuf_profile', [ + 'label' => __( 'Registraton Forms', 'wp-user-frontend' ), + 'public' => false, + 'show_ui' => false, + 'show_in_menu' => false, + 'capability_type' => 'post', + 'hierarchical' => false, + 'query_var' => false, + 'supports' => [ 'title' ], + 'capabilities' => [ + 'publish_posts' => $capability, + 'edit_posts' => $capability, + 'edit_others_posts' => $capability, + 'delete_posts' => $capability, + 'delete_others_posts' => $capability, + 'read_private_posts' => $capability, + 'edit_post' => $capability, + 'delete_post' => $capability, + 'read_post' => $capability, + ], + 'labels' => [ + 'name' => __( 'Forms', 'wp-user-frontend' ), + 'singular_name' => __( 'Form', 'wp-user-frontend' ), + 'menu_name' => __( 'Registration Forms', + 'wp-user-frontend' ), + 'add_new' => __( 'Add Form', 'wp-user-frontend' ), + 'add_new_item' => __( 'Add New Form', 'wp-user-frontend' ), + 'edit' => __( 'Edit', 'wp-user-frontend' ), + 'edit_item' => __( 'Edit Form', 'wp-user-frontend' ), + 'new_item' => __( 'New Form', 'wp-user-frontend' ), + 'view' => __( 'View Form', 'wp-user-frontend' ), + 'view_item' => __( 'View Form', 'wp-user-frontend' ), + 'search_items' => __( 'Search Form', 'wp-user-frontend' ), + 'not_found' => __( 'No Form Found', 'wp-user-frontend' ), + 'not_found_in_trash' => __( 'No Form Found in Trash', + 'wp-user-frontend' ), + 'parent' => __( 'Parent Form', 'wp-user-frontend' ), + ], + ] ); + register_post_type( 'wpuf_input', [ + 'public' => false, + 'show_ui' => false, + 'show_in_menu' => false, + ] ); + } + + /** + * Initiate form builder for wpuf_forms post type + * + * @since 2.5 + * + * @return void + */ + public function post_forms_builder_init() { + if ( empty( $_GET['action'] ) ) { + return; + } + + if ( 'add-new' === $_GET['action'] && empty( $_GET['id'] ) ) { + $form_id = wpuf_create_sample_form( 'Sample Form', 'wpuf_forms', true ); + $add_new_page_url = add_query_arg( + [ 'id' => $form_id ], + admin_url( 'admin.php?page=wpuf-post-forms&action=edit' ) + ); + wp_safe_redirect( $add_new_page_url ); + } + if ( ( 'edit' === $_GET['action'] ) && ! empty( $_GET['id'] ) ) { + add_action( 'wpuf-form-builder-tabs-post', [ $this, 'add_primary_tabs' ] ); + add_action( 'wpuf-form-builder-tab-contents-post', [ $this, 'add_primary_tab_contents' ] ); + add_action( 'wpuf-form-builder-settings-tabs-post', [ $this, 'add_settings_tabs' ] ); + add_action( 'wpuf-form-builder-settings-tab-contents-post', [ $this, 'add_settings_tab_contents' ] ); + add_filter( 'wpuf_form_fields_section_before', [ $this, 'add_post_field_section' ] ); + + add_filter( 'wpuf_form_builder_js_deps', [ $this, 'js_dependencies' ] ); + add_filter( 'wpuf_form_builder_js_root_mixins', [ $this, 'js_root_mixins' ] ); + add_filter( 'wpuf_form_builder_js_builder_stage_mixins', [ $this, 'js_builder_stage_mixins' ] ); + add_filter( 'wpuf_form_builder_js_field_options_mixins', [ $this, 'js_field_options_mixins' ] ); + add_filter( 'wpuf_form_builder_localize_script', [ $this, 'add_to_localize_script' ] ); + add_filter( 'wpuf_form_fields', [ $this, 'add_field_settings' ] ); + add_filter( 'wpuf_form_builder_i18n', [ $this, 'i18n' ] ); + + do_action( 'wpuf_form_builder_init_type_wpuf_forms' ); + + $this->set_wp_post_types(); + $settings = [ + 'form_type' => 'post', + 'post_type' => 'wpuf_forms', + 'post_id' => ! empty( $_GET['id'] ) ? intval( wp_unslash( $_GET['id'] ) ) : '', + 'form_settings_key' => $this->form_settings_key, + 'shortcodes' => [ [ 'name' => 'wpuf_form' ] ], + ]; + wpuf()->form_builder = new Admin_Form_Builder( $settings ); + } + } + + /** + * Add settings tabs + * + * @since 2.5 + * + * @return void + */ + public function add_settings_tab_contents() { + global $post; + + $form_settings = wpuf_get_form_settings( $post->ID ); + ?> + +
    + +
    + +
    + +
    + +
    + +
    + +
    + +
    + +
    + +
    + +
    + admin->admin_form->form_post_expiration(); ?> +
    + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + get_subscriptions(); + + printf( '', esc_html( __( '- Select -', 'wp-user-frontend' ) ) ); + + if ( ! $subscriptions ) { + return; + } + + printf( '', esc_html( __( '- Select -', 'wp-user-frontend' ) ) ); + foreach ( $subscriptions as $key => $subscription ) { + ?> + + __( 'Post Fields', 'wp-user-frontend' ), + 'id' => 'post-fields', + 'fields' => $post_fields, + ], + [ + 'title' => __( 'Taxonomies', 'wp-user-frontend' ), + 'id' => 'taxonomies', + 'fields' => [], + ], + ]; + } + + /** + * Add dependencies to form builder script + * + * @since 2.5 + * + * @param array $deps + * + * @return array + */ + public function js_dependencies( $deps ) { + $deps[] = 'wpuf-form-builder-wpuf-forms'; + + return apply_filters( 'wpuf_form_builder_wpuf_forms_js_deps', $deps ); + } + + /** + * Add mixins to root instance + * + * @since 2.5 + * + * @param array $mixins + * + * @return array + */ + public function js_root_mixins( $mixins ) { + array_push( $mixins, 'wpuf_forms_mixin_root' ); + + return $mixins; + } + + /** + * Add mixins to form builder builder stage component + * + * @since 2.5 + * + * @param array $mixins + * + * @return array + */ + public function js_builder_stage_mixins( $mixins ) { + array_push( $mixins, 'wpuf_forms_mixin_builder_stage' ); + + return $mixins; + } + + /** + * Add mixins to form builder field options component + * + * @since 2.5 + * + * @param array $mixins + * + * @return array + */ + public function js_field_options_mixins( $mixins ) { + array_push( $mixins, 'wpuf_forms_mixin_field_options' ); + + return $mixins; + } + + /** + * Add data to localize_script + * + * @since 2.5 + * + * @param array $data + * + * @return array + */ + public function add_to_localize_script( $data ) { + return array_merge( $data, [ + 'wp_post_types' => $this->wp_post_types, + ] ); + } + + /** + * i18n strings specially for Post Forms + * + * @since 2.5 + * + * @param array $i18n + * + * @return array + */ + public function i18n( $i18n ) { + return array_merge( $i18n, [ + 'any_of_three_needed' => __( 'Post Forms must have either Post Title, Post Body or Excerpt field', + 'wp-user-frontend' ), + ] ); + } +} diff --git a/includes/Admin/Forms/Admin_Form_Builder.php b/includes/Admin/Forms/Admin_Form_Builder.php new file mode 100644 index 000000000..c100f4bc6 --- /dev/null +++ b/includes/Admin/Forms/Admin_Form_Builder.php @@ -0,0 +1,361 @@ + '', + // e.g 'post', 'profile' etc + 'post_type' => '', + // e.g 'wpuf_forms', 'wpuf_profile' etc, + 'form_settings_key' => '', + 'post_id' => 0, + 'shortcodes' => [], + // [ [ 'name' => 'wpuf_form', 'type' => 'profile' ], [ 'name' => 'wpuf_form', 'type' => 'registration' ] ] + ]; + $this->settings = wp_parse_args( $settings, $defaults ); + // set post data to global $post + $post = get_post( $this->settings['post_id'] ); + // if we have an existing post, then let's start + if ( ! empty( $post->ID ) ) { + add_action( 'in_admin_header', [ $this, 'remove_admin_notices' ] ); + add_action( 'admin_enqueue_scripts', [ $this, 'admin_enqueue_scripts' ] ); + add_action( 'admin_print_scripts', [ $this, 'admin_print_scripts' ] ); + add_action( 'admin_footer', [ $this, 'custom_dequeue' ] ); + add_action( 'admin_footer', [ $this, 'admin_footer' ] ); + add_action( 'wpuf_admin_form_builder', [ $this, 'include_form_builder' ] ); + } + + add_action( 'wpuf_form_builder_template_builder_stage_submit_area', [ $this, 'add_form_submit_area' ] ); + } + + /** + * Add buttons in form submit area + * + * @since 2.5 + * + * @return void + */ + public function add_form_submit_area() { + ?> + + + + + + $this->i18n(), + 'post' => $post, + 'form_fields' => wpuf_get_form_fields( $post->ID ), + 'panel_sections' => wpuf()->fields->get_field_groups(), + 'field_settings' => wpuf()->fields->get_js_settings(), + 'form_settings' => wpuf_get_form_settings( $post->ID ), + 'notifications' => wpuf_get_form_notifications( $post->ID ), + 'pro_link' => Pro_Prompt::get_pro_url(), + 'site_url' => site_url( '/' ), + 'recaptcha_site' => wpuf_get_option( 'recaptcha_public', 'wpuf_general' ), + 'recaptcha_secret' => wpuf_get_option( 'recaptcha_private', 'wpuf_general' ), + 'nonce' => wp_create_nonce( 'form-builder-setting-nonce' ), + ] + ); + $wpuf_form_builder = wpuf_unset_conditional( $wpuf_form_builder ); + wp_localize_script( 'wpuf-form-builder-mixins', 'wpuf_form_builder', $wpuf_form_builder ); + // mixins + $wpuf_mixins = [ + 'root' => apply_filters( 'wpuf_form_builder_js_root_mixins', [] ), + 'builder_stage' => apply_filters( 'wpuf_form_builder_js_builder_stage_mixins', [] ), + 'form_fields' => apply_filters( 'wpuf_form_builder_js_form_fields_mixins', [] ), + 'field_options' => apply_filters( 'wpuf_form_builder_js_field_options_mixins', [] ), + ]; + wp_localize_script( 'wpuf-form-builder-mixins', 'wpuf_mixins', $wpuf_mixins ); + } + + /** + * Print js scripts in admin head + * + * @since 2.5 + * + * @return void + */ + public function admin_print_scripts() { + ?> + + + + settings['post_id']; + $form_type = $this->settings['form_type']; + $post_type = $this->settings['post_type']; + $form_settings_key = $this->settings['form_settings_key']; + $shortcodes = $this->settings['shortcodes']; + $forms = get_posts( [ 'post_type' => $post_type, 'post_status' => 'any' ] ); + include WPUF_ROOT . '/admin/form-builder/views/form-builder.php'; + } + + /** + * i18n translatable strings + * + * @since 2.5 + * + * @return array + */ + private function i18n() { + return apply_filters( + 'wpuf_form_builder_i18n', [ + 'advanced_options' => __( 'Advanced Options', 'wp-user-frontend' ), + 'delete_field_warn_msg' => __( 'Are you sure you want to delete this field?', 'wp-user-frontend' ), + 'yes_delete_it' => __( 'Yes, delete it', 'wp-user-frontend' ), + 'no_cancel_it' => __( 'No, cancel it', 'wp-user-frontend' ), + 'ok' => __( 'OK', 'wp-user-frontend' ), + 'cancel' => __( 'Cancel', 'wp-user-frontend' ), + 'close' => __( 'Close', 'wp-user-frontend' ), + 'last_choice_warn_msg' => __( 'This field must contain at least one choice', 'wp-user-frontend' ), + 'option' => __( 'Option', 'wp-user-frontend' ), + 'column' => __( 'Column', 'wp-user-frontend' ), + 'last_column_warn_msg' => __( 'This field must contain at least one column', 'wp-user-frontend' ), + 'is_a_pro_feature' => __( 'is available in Pro version', 'wp-user-frontend' ), + 'pro_feature_msg' => __( + 'Please upgrade to the Pro version to unlock all these awesome features', 'wp-user-frontend' + ), + 'upgrade_to_pro' => __( 'Get the Pro version', 'wp-user-frontend' ), + 'select' => __( 'Select', 'wp-user-frontend' ), + 'saved_form_data' => __( 'Saved form data', 'wp-user-frontend' ), + 'unsaved_changes' => __( 'You have unsaved changes.', 'wp-user-frontend' ), + 'copy_shortcode' => __( 'Click to copy shortcode', 'wp-user-frontend' ), + ] + ); + } + + /** + * Save form data + * + * @since 2.5 + * + * @param array $data Contains form_fields, form_settings, form_settings_key data + * + * @return bool + */ + public static function save_form( $data ) { + $saved_wpuf_inputs = []; + wp_update_post( [ 'ID' => $data['form_id'], 'post_status' => 'publish', 'post_title' => $data['post_title'] ] ); + $existing_wpuf_input_ids = get_children( [ + 'post_parent' => $data['form_id'], + 'post_status' => 'publish', + 'post_type' => 'wpuf_input', + 'numberposts' => '-1', + 'orderby' => 'menu_order', + 'order' => 'ASC', + 'fields' => 'ids', + ] ); + $new_wpuf_input_ids = []; + if ( ! empty( $data['form_fields'] ) ) { + foreach ( $data['form_fields'] as $order => $field ) { + if ( ! empty( $field['is_new'] ) ) { + unset( $field['is_new'] ); + unset( $field['id'] ); + $field_id = 0; + } else { + $field_id = $field['id']; + } + $field_id = wpuf_insert_form_field( $data['form_id'], $field, $field_id, $order ); + $new_wpuf_input_ids[] = $field_id; + $field['id'] = $field_id; + $saved_wpuf_inputs[] = $field; + } + } + $inputs_to_delete = array_diff( $existing_wpuf_input_ids, $new_wpuf_input_ids ); + if ( ! empty( $inputs_to_delete ) ) { + foreach ( $inputs_to_delete as $delete_id ) { + wp_delete_post( $delete_id, true ); + } + } + update_post_meta( $data['form_id'], $data['form_settings_key'], $data['form_settings'] ); + update_post_meta( $data['form_id'], 'notifications', $data['notifications'] ); + update_post_meta( $data['form_id'], 'integrations', $data['integrations'] ); + + return $saved_wpuf_inputs; + } +} diff --git a/includes/free/admin/form-builder/class-wpuf-form-builder-free.php b/includes/Admin/Forms/Admin_Form_Builder_Free.php similarity index 71% rename from includes/free/admin/form-builder/class-wpuf-form-builder-free.php rename to includes/Admin/Forms/Admin_Form_Builder_Free.php index 127740135..f02a3aae2 100644 --- a/includes/free/admin/form-builder/class-wpuf-form-builder-free.php +++ b/includes/Admin/Forms/Admin_Form_Builder_Free.php @@ -1,8 +1,11 @@ verify_current_page_screen( 'wpuf-post-forms', 'bulk-post-forms' ) ) { + if ( ! $this->verify_current_page_screen( 'wpuf-post-forms', 'bulk-post-forms' ) ) { return; } // Check permission if not wpuf admin then go out from here - if ( !current_user_can( wpuf_admin_role() ) ) { + if ( ! current_user_can( wpuf_admin_role() ) ) { wp_die( esc_html( __( 'You do not have sufficient permissions to do this action', 'wp-user-frontend' ) ) ); } - $post_forms = new WPUF_Admin_Post_Forms_List_Table(); + $post_forms = new Forms\Post\Templates\List_Table_Admin_Post_Forms(); $action = $post_forms->current_action(); - if ( $action ) { - $remove_query_args = [ - '_wp_http_referer', '_wpnonce', 'action', 'id', 'post', 'action2', - ]; - - $add_query_args = []; + if ( ! $action ) { + return; + } - switch ( $action ) { - case 'post_form_search': - $remove_query_args[] = 'post_form_search'; - $redirect = remove_query_arg( $remove_query_args, $_SERVER['REQUEST_URI'] ); - break; + $remove_query_args = [ + '_wp_http_referer', + '_wpnonce', + 'action', + 'id', + 'post', + 'action2', + ]; + + $add_query_args = []; + + switch ( $action ) { + case 'post_form_search': + $remove_query_args[] = 'post_form_search'; + $redirect = remove_query_arg( $remove_query_args, $_SERVER['REQUEST_URI'] ); + break; + + case 'trash': + + if ( !empty( $_GET['id'] ) ) { + $id = intval( wp_unslash( $_GET['id'] ) ); + delete_post_meta( $id, '_wp_trash_meta_status' ); + delete_post_meta( $id, '_wp_trash_meta_time' ); + delete_post_meta( $id, '_wp_desired_post_slug' ); + + wp_trash_post( $id ); + + $add_query_args['trashed'] = 1; + } elseif ( !empty( $_GET['post'] ) ) { + $posts = isset( $_GET['post'] ) ? array_map( 'sanitize_text_field', wp_unslash( $_GET['post'] ) ) : []; + foreach ( $posts as $post_id ) { + delete_post_meta( $post_id, '_wp_trash_meta_status' ); + delete_post_meta( $post_id, '_wp_trash_meta_time' ); + delete_post_meta( $post_id, '_wp_desired_post_slug' ); + + wp_trash_post( $post_id ); + } - case 'trash': + $add_query_args['trashed'] = count( $_GET['post'] ); + } - if ( !empty( $_GET['id'] ) ) { - $id = intval( wp_unslash( $_GET['id'] ) ); - delete_post_meta( $id, '_wp_trash_meta_status' ); - delete_post_meta( $id, '_wp_trash_meta_time' ); - delete_post_meta( $id, '_wp_desired_post_slug' ); + break; - wp_trash_post( $id ); + case 'restore': + if ( !empty( $_GET['id'] ) ) { + $id = intval( wp_unslash( $_GET['id'] ) ); + $trash_meta_status = get_post_meta( $id, '_wp_trash_meta_status', true ); - $add_query_args['trashed'] = 1; - } elseif ( !empty( $_GET['post'] ) ) { - $posts = isset( $_GET['post'] ) ? array_map( 'sanitize_text_field', wp_unslash( $_GET['post'] ) ) : []; - foreach ( $posts as $post_id ) { - delete_post_meta( $post_id, '_wp_trash_meta_status' ); - delete_post_meta( $post_id, '_wp_trash_meta_time' ); - delete_post_meta( $post_id, '_wp_desired_post_slug' ); + $args = [ + 'ID' => $id, + 'post_status' => $trash_meta_status, + ]; - wp_trash_post( $post_id ); - } + wp_update_post( $args ); - $add_query_args['trashed'] = count( $_GET['post'] ); - } + $add_query_args['untrashed'] = 1; + } elseif ( !empty( $_GET['post'] ) ) { - break; + $posts = array_map( 'sanitize_text_field', wp_unslash( $_GET['post'] ) ); - case 'restore': - if ( !empty( $_GET['id'] ) ) { - $id = intval( wp_unslash( $_GET['id'] ) ); - $trash_meta_status = get_post_meta( $id, '_wp_trash_meta_status', true ); + foreach ( $posts as $post_id ) { + $trash_meta_status = get_post_meta( $post_id, '_wp_trash_meta_status', true ); $args = [ - 'ID' => $id, + 'ID' => $post_id, 'post_status' => $trash_meta_status, ]; - wp_update_post( $args ); + wp_update_post( $args ); - $add_query_args['untrashed'] = 1; - } elseif ( !empty( $_GET['post'] ) ) { - - $posts = array_map( 'sanitize_text_field', wp_unslash( $_GET['post'] ) ); - - foreach ( $posts as $post_id ) { - $trash_meta_status = get_post_meta( $post_id, '_wp_trash_meta_status', true ); - - $args = [ - 'ID' => $post_id, - 'post_status' => $trash_meta_status, - ]; - - wp_update_post( $args ); - - $add_query_args['untrashed'] = count( $posts ); - } + $add_query_args['untrashed'] = count( $posts ); } + } - break; + break; - case 'delete': + case 'delete': - if ( !empty( $_GET['id'] ) ) { + if ( !empty( $_GET['id'] ) ) { - $id = intval( wp_unslash( $_GET['id'] ) ); - wp_delete_post( $id ); + $id = intval( wp_unslash( $_GET['id'] ) ); + wp_delete_post( $id ); - $add_query_args['deleted'] = 1; - } elseif ( !empty( $_GET['post'] ) ) { - $posts = array_map( 'sanitize_text_field', wp_unslash( $_GET['post'] ) ); - foreach ( $posts as $post_id ) { - wp_delete_post( $post_id ); - } - - $add_query_args['deleted'] = count( $posts ); + $add_query_args['deleted'] = 1; + } elseif ( !empty( $_GET['post'] ) ) { + $posts = array_map( 'sanitize_text_field', wp_unslash( $_GET['post'] ) ); + foreach ( $posts as $post_id ) { + wp_delete_post( $post_id ); } - $add_query_args['post_status'] = 'trash'; + $add_query_args['deleted'] = count( $posts ); + } - break; + $add_query_args['post_status'] = 'trash'; - case 'duplicate': - if ( !empty( $_GET['id'] ) ) { - $id = intval( wp_unslash( $_GET['id'] ) ); - $add_query_args['duplicated'] = wpuf_duplicate_form( $id ); - } + break; - break; - } + case 'duplicate': + if ( !empty( $_GET['id'] ) ) { + $id = intval( wp_unslash( $_GET['id'] ) ); + $add_query_args['duplicated'] = wpuf_duplicate_form( $id ); + } - $request_uri = isset( $_SERVER['REQUEST_URI'] ) ? sanitize_text_field( wp_unslash( $_SERVER['REQUEST_URI'] ) ) : ''; - $redirect = remove_query_arg( $remove_query_args, $request_uri ); + break; + } - $redirect = add_query_arg( $add_query_args, $redirect ); + $request_uri = isset( $_SERVER['REQUEST_URI'] ) ? sanitize_text_field( wp_unslash( $_SERVER['REQUEST_URI'] ) ) : ''; + $redirect = remove_query_arg( $remove_query_args, $request_uri ); - wp_redirect( $redirect ); - exit(); - } + $redirect = add_query_arg( $add_query_args, $redirect ); + + wp_redirect( $redirect ); + exit(); } /** @@ -189,7 +200,7 @@ public function profile_forms_actions() { wp_die( esc_html( __( 'You do not have sufficient permissions to do this action', 'wp-user-frontend' ) ) ); } - $profile_forms = new WPUF_Admin_Profile_Forms_List_Table(); + $profile_forms = new List_Table_Profile_Forms(); $action = $profile_forms->current_action(); if ( $action ) { diff --git a/includes/Admin/Forms/Admin_Template.php b/includes/Admin/Forms/Admin_Template.php new file mode 100644 index 000000000..9376fb0d5 --- /dev/null +++ b/includes/Admin/Forms/Admin_Template.php @@ -0,0 +1,789 @@ +' . $values['label'] . '' : ''; + $id = isset( $values['id'] ) ? $values['id'] : ''; ?> +
    + +
    +
    + + +
    +
    + +
    + + +
    + + +
    +
    + +
    + + +
    + + +
    + + + +
    + + + + + + + +
    + + +
    + +
    + + +
    + + +
    + + +
    + +
    + + +
    + +
    + + +
    + +
    + + +
    + +
    +
    + +
    + + +
    + +
    + + +
    + +
    + + +
    + +
    + + +
    + +
    + + +
    + + + +
    +
    + +
    + + +
    + +
    +
    + ', esc_attr( self::$input_name ) . esc_attr( $name ), + esc_attr( $value ) + ); + } + + /** + * Displays a radio custom field + * + * @param int $field_id + * @param string $name + * @param array $values + */ + public static function radio_fields( $field_id, $name, $values = [] ) { + $selected_name = sprintf( '%s[%d][selected]', self::$input_name, $field_id ); + $input_name = sprintf( '%s[%d][%s]', self::$input_name, $field_id, $name ); + $input_value_name = sprintf( '%s[%d][%s]', self::$input_name, $field_id, $name . '_values' ); + $selected_value = ( $values && isset( $values['selected'] ) ) ? $values['selected'] : ''; ?> + + + +
    + 0 ) { + foreach ( $values['options'] as $key => $value ) { + ?> +
    + > + + + + +
    + +
    + + + + + +
    + + + + +
    + 0 ) { + foreach ( $values['options'] as $key => $value ) { + ?> +
    + + /> + + + +
    + +
    + + + + + +
    + + add another choice + remove this choice + +
  • + + + + +
    + + + +
    +
  • + +
  • + + + + +
    + + + +
    +
  • + +
  • + + + + +
    + + +
    + + +
    + + +
    + +
    +
    +
  • + +
  • + + + + +
    + + +
    + + +
    + + +
    + +
    +
    +
  • + + + +
  • + + + + +
    + + +
    + + +
    + +
    + + +
    + +
    + + +
    +
    +
  • + +
  • + + + + +
    + + + +
    +
  • + +
  • + + + + +
    + + + +
    +
  • + +
  • + + + + +
    +
    + + +
    + +
    + + +
    + + +
    +
  • + +
  • + + + + +
    +
    + + + + +
    + +
    + + +
    +
    +
  • + +
  • + + + + +
    +
    + + +
    + +
    + + +
    + + +
    +
  • + +
  • + + + + +
    + + +
    + + +
    + +
    + + +
    + + +
    +
  • + +
  • + + + + +
    +
    + + +
    + + +
    + plugin settings. Register first if you don't have any keys.", + 'wp-user-frontend' + ) + ), esc_url( admin_url( 'admin.php?page=wpuf-settings' ) ), + 'https://www.google.com/recaptcha/' + ); ?> +
    +
    +
    + +
    + + +
    + /> + +
    +
    + /> + +
    +
    + + +
    +
  • + fields ) ) { + return $this->fields; + } + $this->register_field_types(); + + return $this->fields; + } + + /** + * Get field type class instance + * + * @since 3.2.0 + * + * @param string $field_type + * + * @return Field_Contract + */ + public function get_field( $field_type ) { + $fields = $this->get_fields(); + + if ( isset( $field_type, $fields, $fields[ $field_type ] ) ) { + return $fields[ $field_type ]; + } + } + + /** + * Register the field types + * + * @return void + */ + private function register_field_types() { + $fields = [ + 'post_title' => new Form_Field_Post_Title(), + 'post_content' => new Form_Field_Post_Content(), + 'post_tags' => new Form_Field_Post_Tags(), + 'taxonomy' => new Form_Field_Post_Taxonomy( 'category', 'category' ), + 'text_field' => new Form_Field_Text(), + 'email_address' => new Form_Field_Email(), + 'textarea_field' => new Form_Field_Textarea(), + 'radio_field' => new Form_Field_Radio(), + 'checkbox_field' => new Form_Field_Checkbox(), + 'dropdown_field' => new Form_Field_Dropdown(), + 'multiple_select' => new Form_Field_MultiDropdown(), + 'website_url' => new Form_Field_URL(), + 'column_field' => new Form_Field_Column(), + 'section_break' => new Form_Field_SectionBreak(), + 'custom_html' => new Form_Field_HTML(), + 'custom_hidden_field' => new Form_Field_Hidden(), + 'image_upload' => new Form_Field_Image(), + 'recaptcha' => new Form_Field_reCaptcha(), + 'featured_image' => new Form_Field_Featured_Image(), + ]; + $this->fields = apply_filters( 'wpuf_form_fields', $fields ); + } + + /** + * Get field groups + * + * @return array + */ + public function get_field_groups() { + $before_custom_fields = apply_filters( 'wpuf_form_fields_section_before', [] ); + $groups = array_merge( $before_custom_fields, $this->get_custom_fields() ); + $groups = array_merge( $groups, $this->get_others_fields() ); + $after_custom_fields = apply_filters( 'wpuf_form_fields_section_after', [] ); + $groups = array_merge( $groups, $after_custom_fields ); + + return $groups; + } + + /** + * Custom field section + * + * @since 2.5 + * + * @return array + */ + private function get_custom_fields() { + // $fields = apply_filters( 'wpuf-form-builder-fields-custom-fields', array( + $fields = apply_filters( + 'wpuf_form_fields_custom_fields', + [ + 'text_field', + 'textarea_field', + 'dropdown_field', + 'multiple_select', + 'radio_field', + 'checkbox_field', + 'website_url', + 'email_address', + 'custom_hidden_field', + 'image_upload', + ] + ); + + return [ + [ + 'title' => __( 'Custom Fields', 'wp-user-frontend' ), + 'id' => 'custom-fields', + 'fields' => $fields, + ], + ]; + } + + /** + * Others field section + * + * @since 2.5 + * + * @return array + */ + private function get_others_fields() { + $fields = apply_filters( + 'wpuf_form_fields_others_fields', + [ + 'column_field', + 'section_break', + 'custom_html', + 'recaptcha', + ] + ); + + return [ + [ + 'title' => __( 'Others', 'wp-user-frontend' ), + 'id' => 'others', + 'fields' => $fields, + ], + ]; + } + + /** + * Get fields JS setting for the form builder + * + * @return array + */ + public function get_js_settings() { + $fields = $this->get_fields(); + $js_array = []; + if ( $fields ) { + foreach ( $fields as $type => $object ) { + if ( is_object( $object ) ) { + $js_array[ $type ] = $object->get_js_settings(); + } + } + } + + return $js_array; + } + + /** + * Render the form fields + * + * @param array $fields + * @param int $form_id + * @param array $atts + * @param string $type + * @param int $post_id + * + * @return void + */ + public function render_fields( $fields, $form_id, $atts = [], $type = 'post', $post_id = NULL ) { + if ( ! $fields ) { + return; + } + $fields = apply_filters( 'wpuf_render_fields', $fields, $form_id ); + foreach ( $fields as $field ) { + if ( ! $field_object = $this->field_exists( $field['template'] ) ) { + if ( defined( 'WP_DEBUG' && WP_DEBUG ) ) { + echo wp_kses_post( '

    ' . $field['template'] . ' field not found.

    ' ); + } + continue; + } + if ( $this->check_field_visibility( $field ) ) { + if ( is_object( $field_object ) ) { + $field_object->render( $field, $form_id, $type, $post_id ); + $field_object->conditional_logic( $field, $form_id ); + } + } + } + } + + /** + * Check field Visibility + * + * @param array $form_field + * + * @return bool + **/ + public function check_field_visibility( &$form_field ) { + $show_field = true; + // check field visibility options + if ( array_key_exists( 'wpuf_visibility', $form_field ) ) { + $visibility_selected = $form_field['wpuf_visibility']['selected']; + $visibility_choices = $form_field['wpuf_visibility']['choices']; + $show_field = false; + if ( $visibility_selected == 'everyone' ) { + $show_field = true; + } + if ( $visibility_selected == 'hidden' ) { + $form_field['css'] .= 'wpuf_hidden_field'; + $show_field = true; + } + if ( $visibility_selected == 'logged_in' && is_user_logged_in() ) { + if ( empty( $visibility_choices ) ) { + $show_field = true; + } else { + foreach ( $visibility_choices as $key => $choice ) { + if ( current_user_can( $choice ) ) { + $show_field = true; + break; + } + continue; + } + } + } + if ( $visibility_selected == 'subscribed_users' && is_user_logged_in() ) { + $user_pack = ( new Subscription() )->get_user_pack( get_current_user_id() ); + if ( empty( $visibility_choices ) && ! empty( $user_pack ) ) { + $show_field = true; + } else if ( ! empty( $user_pack ) && ! empty( $visibility_choices ) ) { + foreach ( $visibility_choices as $pack => $id ) { + if ( $user_pack['pack_id'] == $id ) { + $show_field = true; + break; + } + continue; + } + } + } + } + + return $show_field; + } + + /** + * Check if a field exists + * + * @param string $field_type + * + * @return bool + */ + public function field_exists( $field_type ) { + if ( array_key_exists( $field_type, $this->get_fields() ) ) { + return $this->fields[ $field_type ]; + } + + return false; + } +} diff --git a/includes/class-form.php b/includes/Admin/Forms/Form.php similarity index 93% rename from includes/class-form.php rename to includes/Admin/Forms/Form.php index 72db91f4f..79f019e1c 100644 --- a/includes/class-form.php +++ b/includes/Admin/Forms/Form.php @@ -1,6 +1,9 @@ form_settings['message_restrict'] ) && ! $guest_post_enabled && ! is_user_logged_in() ) { $user_can_post = 'no'; $info = $this->form_settings['message_restrict']; + + return [ $user_can_post, $info ]; + } + + $has_post_count = $current_user->subscription()->has_post_count( $form_settings['post_type'] ); + + if ( $current_user->subscription()->current_pack_id() && ! $has_post_count ) { + $user_can_post = 'no'; + $info = __( 'Post Limit Exceeded for your purchased subscription pack.', 'wp-user-frontend' ); + + return [ $user_can_post, $info ]; } + if ( $this->is_charging_enabled() ) { $pay_per_post = $this->is_enabled_pay_per_post(); - $pay_per_post_cost = (float) $this->get_pay_per_post_cost(); + // $pay_per_post_cost = (float) $this->get_pay_per_post_cost(); $force_pack = $this->is_enabled_force_pack(); $fallback_enabled = $this->is_enabled_fallback_cost(); - $fallback_cost = $this->get_subs_fallback_cost(); - $has_post_count = $current_user->subscription()->has_post_count( $form_settings['post_type'] ); + // $fallback_cost = $this->get_subs_fallback_cost(); // guest post payment checking if ( ! is_user_logged_in() && isset( $form_settings['guest_post'] ) && $form_settings['guest_post'] === 'true' ) { @@ -188,7 +202,8 @@ public function is_submission_open( $form, $form_settings ) { if ( $force_pack ) { $user_can_post = 'no'; - $pack_page = get_permalink( wpuf_get_option( 'subscription_page', 'wpuf_payment' ) ); + $pack_page = get_permalink( wpuf_get_option( 'subscription_page', + 'wpuf_payment' ) ); /* translators: %s: Pack page link */ $info = sprintf( __( 'You need to purchase a subscription package to post in this form', 'wp-user-frontend' ), $pack_page ); } elseif ( $pay_per_post && ! $force_pack ) { diff --git a/includes/class-form-manager.php b/includes/Admin/Forms/Form_Manager.php similarity index 85% rename from includes/class-form-manager.php rename to includes/Admin/Forms/Form_Manager.php index 860295d21..2c1877258 100644 --- a/includes/class-form-manager.php +++ b/includes/Admin/Forms/Form_Manager.php @@ -1,11 +1,17 @@ 0, ], ]; - $defaults = [ + $defaults = [ 'post_type' => 'wpuf_forms', 'post_status' => [ 'publish', 'draft', 'pending' ], - 'posts_per_page' => -1, + 'posts_per_page' => - 1, ]; - - $args = wp_parse_args( $args, $defaults ); - + $args = wp_parse_args( $args, $defaults ); $query = new WP_Query( $args ); $forms = $query->get_posts(); - if ( $forms ) { foreach ( $forms as $form ) { - $forms_array['forms'][] = new WPUF_Form( $form ); + $forms_array['forms'][] = new Form( $form ); } } - $forms_array['meta']['total'] = (int) $query->found_posts; $forms_array['meta']['pages'] = (int) $query->max_num_pages; - wp_reset_postdata(); return $forms_array; @@ -61,10 +62,10 @@ public function get_forms( $args = [] ) { * * @param int|WP_Post $form * - * @return \WPUF_Form + * @return Form */ public function get( $form ) { - return new WPUF_Form( $form ); + return new Form( $form ); } /** @@ -81,11 +82,9 @@ public function create( $form_name, $fields = [] ) { 'post_type' => 'wpuf_forms', 'post_status' => 'publish', ] ); - if ( is_wp_error( $form_id ) ) { return $form_id; } - if ( $fields ) { foreach ( $fields as $order => $field ) { $args = [ @@ -95,7 +94,6 @@ public function create( $form_name, $fields = [] ) { 'post_content' => maybe_serialize( wp_unslash( $field ) ), 'menu_order' => $order, ]; - wp_insert_post( $args ); } } @@ -113,16 +111,12 @@ public function create( $form_name, $fields = [] ) { */ public function delete( $form_id, $force = true ) { global $wpdb; - wp_delete_post( $form_id, $force ); - // delete form inputs as WP doesn't know the relationship - $wpdb->delete( $wpdb->posts, - [ - 'post_parent' => $form_id, - 'post_type' => 'wpuf_input', - ] - ); + $wpdb->delete( $wpdb->posts, [ + 'post_parent' => $form_id, + 'post_type' => 'wpuf_input', + ] ); } /** diff --git a/class/post-form-template.php b/includes/Admin/Forms/Form_Template.php similarity index 97% rename from class/post-form-template.php rename to includes/Admin/Forms/Form_Template.php index 72024d947..4f602427c 100644 --- a/class/post-form-template.php +++ b/includes/Admin/Forms/Form_Template.php @@ -1,11 +1,13 @@ should_display() ) { + return; + } + + $sources = wp_list_pluck( $wp_styles->registered, 'src' ); + + // Look for any pre-existing learn-press style + $result = array_key_exists( 'learn-press-admin', $sources ); + + if ( $result ) { + wp_deregister_style( 'learn-press-admin' ); + } + } + + /** + * Should a form displayed or script enqueued? * * @return bool */ public function should_display() { - $current_screen = get_current_screen(); + $current_screen = get_current_screen(); + $all_submenu_hooks = wpuf()->admin->menu->get_all_submenu_hooks(); + $wpuf_pages = [ + 'post_forms', + ]; - if ( in_array( $current_screen->id, [ 'user-frontend_page_wpuf-post-forms' ] ) ) { - return true; + foreach ( $wpuf_pages as $page ) { + if ( ! array_key_exists( $page, $all_submenu_hooks ) ) { + return false; + } } - return false; + return $current_screen->id === $all_submenu_hooks['post_forms']; } public function enqueue_scripts() { - if ( !$this->should_display() ) { + if ( ! $this->should_display() ) { return; } - wp_enqueue_style( 'wpuf-formbuilder', WPUF_ASSET_URI . '/css/wpuf-form-builder.css' ); + $form_builder_css_deps = wpuf()->assets->form_builder_css_deps; + + foreach ( $form_builder_css_deps as $deps ) { + wp_enqueue_style( $deps ); + } + + wp_enqueue_style( 'wpuf-form-builder' ); } /** @@ -53,21 +91,21 @@ public function enqueue_scripts() { * @return void */ public function render_post_form_templates() { - if ( !$this->should_display() ) { + if ( ! $this->should_display() ) { return; } $registry = wpuf_get_post_form_templates(); $pro_templates = wpuf_get_pro_form_previews(); $blank_form_url = admin_url( 'admin.php?page=wpuf-post-forms&action=add-new' ); - $action_name = 'wpuf_post_form_template'; + $action_name = 'post_form_template'; $footer_help = sprintf( __( 'Want a new integration? Let us know.', 'wp-user-frontend' ), 'mailto:support@wedevs.com?subject=WPUF Custom Post Template Integration Request' ); - if ( !$registry ) { + if ( ! $registry ) { return; } - include __DIR__ . '/html/modal.php'; + include WPUF_ROOT . '/includes/Admin/template-parts/modal.php'; } /** @@ -75,18 +113,18 @@ public function render_post_form_templates() { * * @param string $template * - * @return bool|WPUF_Post_Form_Template + * @return bool|Form_Template */ public function get_template_object( $template ) { $registry = wpuf_get_post_form_templates(); - if ( !array_key_exists( $template, $registry ) ) { + if ( ! array_key_exists( $template, $registry ) ) { return false; } $template_object = $registry[ $template ]; - if ( !is_a( $template_object, 'WPUF_Post_Form_Template' ) ) { + if ( ! is_a( $template_object, 'WeDevs\Wpuf\Admin\Forms\Form_Template' ) ) { return false; } @@ -101,11 +139,15 @@ public function get_template_object( $template ) { * @return void */ public function create_post_form_from_template() { - check_admin_referer( 'wpuf_create_from_template' ); + $result = check_admin_referer( 'wpuf_create_from_template' ); + + if ( ! $result ) { + return; + } $template_name = isset( $_GET['template'] ) ? sanitize_text_field( wp_unslash( $_GET['template'] ) ) : ''; - if ( !$template_name ) { + if ( ! $template_name ) { return; } @@ -136,21 +178,24 @@ public function create_post_form_from_template() { $form_fields = $template_object->get_form_fields(); - if ( !$form_fields ) { + if ( ! $form_fields ) { return; } foreach ( $form_fields as $menu_order => $field ) { - wp_insert_post( [ - 'post_type' => 'wpuf_input', - 'post_status' => 'publish', - 'post_content' => maybe_serialize( $field ), - 'post_parent' => $form_id, - 'menu_order' => $menu_order, - ] ); + wp_insert_post( + [ + 'post_type' => 'wpuf_input', + 'post_status' => 'publish', + 'post_content' => maybe_serialize( $field ), + 'post_parent' => $form_id, + 'menu_order' => $menu_order, + ] + ); } - wp_redirect( admin_url( 'admin.php?page=wpuf-post-forms&action=edit&id=' . $form_id ) ); + wp_safe_redirect( admin_url( 'admin.php?page=wpuf-post-forms&action=edit&id=' . $form_id ) ); + exit; } @@ -175,7 +220,8 @@ public function post_form_settings( $form_settings, $post ) { foreach ( $registry as $key => $template ) { printf( '' . "\n", esc_attr( $key ), esc_attr( selected( $selected, $key, false ) ), esc_html( $template->get_title() ) ); } - } ?> + } + ?>

    @@ -195,7 +241,7 @@ public function post_form_settings( $form_settings, $post ) { public function post_form_submission( $post_id, $form_id, $form_settings ) { $template = isset( $form_settings['form_template'] ) ? $form_settings['form_template'] : ''; - if ( !$template ) { + if ( ! $template ) { return; } @@ -207,9 +253,9 @@ public function post_form_submission( $post_id, $form_id, $form_settings ) { $current_action = current_action(); - if ( $current_action == 'wpuf_add_post_after_insert' ) { + if ( 'wpuf_add_post_after_insert' === $current_action ) { $template_object->after_insert( $post_id, $form_id, $form_settings ); - } elseif ( $current_action == 'wpuf_edit_post_after_update' ) { + } elseif ( 'wpuf_edit_post_after_update' === $current_action ) { $template_object->after_update( $post_id, $form_id, $form_settings ); } } diff --git a/admin/post-forms-list-table.php b/includes/Admin/Forms/Post/Templates/List_Table_Admin_Post_Forms.php similarity index 97% rename from admin/post-forms-list-table.php rename to includes/Admin/Forms/Post/Templates/List_Table_Admin_Post_Forms.php index 811debfa0..7a34cfbb4 100644 --- a/admin/post-forms-list-table.php +++ b/includes/Admin/Forms/Post/Templates/List_Table_Admin_Post_Forms.php @@ -1,6 +1,11 @@ 'post-form', 'plural' => 'post-forms', diff --git a/includes/free/post-form-templates/the_events_calendar.php b/includes/Admin/Forms/Post/Templates/Post_Form_Template_Events_Calendar.php similarity index 80% rename from includes/free/post-form-templates/the_events_calendar.php rename to includes/Admin/Forms/Post/Templates/Post_Form_Template_Events_Calendar.php index d117f4eb4..970f4e831 100644 --- a/includes/free/post-form-templates/the_events_calendar.php +++ b/includes/Admin/Forms/Post/Templates/Post_Form_Template_Events_Calendar.php @@ -1,17 +1,22 @@ enabled = class_exists( 'Tribe__Events__Main' ); $this->title = __( 'The Events Calendar', 'wp-user-frontend' ); - $this->description = __( 'Form for creating events. The Events Calendar plugin is required.', 'wp-user-frontend' ); + $this->description = __( 'Form for creating events. The Events Calendar plugin is required.', + 'wp-user-frontend' ); $this->image = WPUF_ASSET_URI . '/images/templates/post.png'; $this->form_fields = [ [ @@ -86,7 +91,7 @@ public function __construct() { 'yes' => 'Yes', 'no' => 'No', ], - 'wpuf_cond' => $this->conditionals, + 'wpuf_cond' => $this->conditionals, ], [ 'input_type' => 'url', @@ -165,27 +170,28 @@ public function __construct() { 'wpuf_cond' => $this->conditionals, ], ]; - $this->form_settings = [ - 'post_type' => 'tribe_events', - 'post_status' => 'publish', - 'default_cat' => '-1', - 'guest_post' => 'false', - 'message_restrict' => __( 'This page is restricted. Please Log in / Register to view this page.', 'wp-user-frontend' ), - 'redirect_to' => 'post', - 'comment_status' => 'open', - 'submit_text' => __( 'Create Event', 'wp-user-frontend' ), - 'edit_post_status' => 'publish', - 'edit_redirect_to' => 'same', - 'update_message' => __( 'Event has been updated successfully. View event', 'wp-user-frontend' ), - 'edit_url' => '', - 'update_text' => __( 'Update Event', 'wp-user-frontend' ), - 'form_template' => __CLASS__, - 'notification' => [ - 'new' => 'on', - 'new_to' => get_option( 'admin_email' ), - 'new_subject' => 'New event has been created', - 'new_body' => 'Hi, + 'post_type' => 'tribe_events', + 'post_status' => 'publish', + 'default_cat' => '-1', + 'guest_post' => 'false', + 'message_restrict' => __( 'This page is restricted. Please Log in / Register to view this page.', + 'wp-user-frontend' ), + 'redirect_to' => 'post', + 'comment_status' => 'open', + 'submit_text' => __( 'Create Event', 'wp-user-frontend' ), + 'edit_post_status' => 'publish', + 'edit_redirect_to' => 'same', + 'update_message' => __( 'Event has been updated successfully. View event', + 'wp-user-frontend' ), + 'edit_url' => '', + 'update_text' => __( 'Update Event', 'wp-user-frontend' ), + 'form_template' => 'post_form_template_events_calendar', + 'notification' => [ + 'new' => 'on', + 'new_to' => get_option( 'admin_email' ), + 'new_subject' => 'New event has been created', + 'new_body' => 'Hi, A new event has been created in your site %sitename% (%siteurl%). Here is the details: @@ -195,10 +201,10 @@ public function __construct() { Author: %author% Post URL: %permalink% Edit URL: %editlink%', - 'edit' => 'off', - 'edit_to' => get_option( 'admin_email' ), - 'edit_subject' => 'Post has been edited', - 'edit_body' => 'Hi, + 'edit' => 'off', + 'edit_to' => get_option( 'admin_email' ), + 'edit_subject' => 'Post has been edited', + 'edit_body' => 'Hi, The event "%post_title%" has been updated. Here is the details: @@ -208,7 +214,7 @@ public function __construct() { Author: %author% Post URL: %permalink% Edit URL: %editlink%', - ], - ]; + ], + ]; } } diff --git a/class/post-form-templates/post.php b/includes/Admin/Forms/Post/Templates/Post_Form_Template_Post.php similarity index 97% rename from class/post-form-templates/post.php rename to includes/Admin/Forms/Post/Templates/Post_Form_Template_Post.php index dfdbd8388..7cf17fef3 100644 --- a/class/post-form-templates/post.php +++ b/includes/Admin/Forms/Post/Templates/Post_Form_Template_Post.php @@ -1,9 +1,13 @@ __( 'Post has been updated successfully. View post', 'wp-user-frontend' ), 'edit_url' => '', 'update_text' => __( 'Update Post', 'wp-user-frontend' ), - 'form_template' => __CLASS__, + 'form_template' => 'post_form_template_post', 'notification' => [ 'new' => 'on', 'new_to' => get_option( 'admin_email' ), diff --git a/includes/free/post-form-templates/woocommerce.php b/includes/Admin/Forms/Post/Templates/Post_Form_Template_WooCommerce.php similarity index 82% rename from includes/free/post-form-templates/woocommerce.php rename to includes/Admin/Forms/Post/Templates/Post_Form_Template_WooCommerce.php index 43a8aa47a..5a82b607f 100644 --- a/includes/free/post-form-templates/woocommerce.php +++ b/includes/Admin/Forms/Post/Templates/Post_Form_Template_WooCommerce.php @@ -1,13 +1,16 @@ enabled = class_exists( 'WooCommerce' ); $this->title = __( 'WooCommerce Product', 'wp-user-frontend' ); $this->description = __( 'Create a simple product form for WooCommerce.', 'wp-user-frontend' ); @@ -136,10 +139,10 @@ public function __construct() { 'css' => '', 'first' => ' - select -', 'options' => [ - 'visible' => 'Catalog/search', - 'catalog' => 'Catalog', - 'search' => 'Search', - 'hidden' => 'Hidden', + 'visible' => 'Catalog/search', + 'catalog' => 'Catalog', + 'search' => 'Search', + 'hidden' => 'Hidden', ], 'wpuf_cond' => $this->conditionals, ], @@ -162,41 +165,40 @@ public function __construct() { 'text_editor_control' => [], ], [ - 'input_type' => 'checkbox', - 'template' => 'checkbox_field', - 'required' => 'no', - 'label' => 'Product Reviews', - 'name' => 'product_reviews', - 'is_meta' => 'yes', - 'help' => '', - 'css' => '', - 'options' => [ + 'input_type' => 'checkbox', + 'template' => 'checkbox_field', + 'required' => 'no', + 'label' => 'Product Reviews', + 'name' => 'product_reviews', + 'is_meta' => 'yes', + 'help' => '', + 'css' => '', + 'options' => [ '_enable_reviews' => 'Enable reviews', ], - 'wpuf_cond' => $this->conditionals, + 'wpuf_cond' => $this->conditionals, ], ]; - $this->form_settings = [ - 'post_type' => 'product', - 'post_status' => 'publish', - 'default_cat' => '-1', - 'guest_post' => 'false', - 'message_restrict' => 'This page is restricted. Please %login% / %register% to view this page.', - 'redirect_to' => 'post', - 'comment_status' => 'open', - 'submit_text' => 'Create Product', - 'edit_post_status' => 'publish', - 'edit_redirect_to' => 'same', - 'update_message' => 'Product has been updated successfully. View Product', - 'edit_url' => '', - 'update_text' => 'Update Product', - 'form_template' => __CLASS__, - 'notification' => [ - 'new' => 'on', - 'new_to' => get_option( 'admin_email' ), - 'new_subject' => 'New product has been created', - 'new_body' => 'Hi, + 'post_type' => 'product', + 'post_status' => 'publish', + 'default_cat' => '-1', + 'guest_post' => 'false', + 'message_restrict' => 'This page is restricted. Please %login% / %register% to view this page.', + 'redirect_to' => 'post', + 'comment_status' => 'open', + 'submit_text' => 'Create Product', + 'edit_post_status' => 'publish', + 'edit_redirect_to' => 'same', + 'update_message' => 'Product has been updated successfully. View Product', + 'edit_url' => '', + 'update_text' => 'Update Product', + 'form_template' => 'post_form_template_woocommerce', + 'notification' => [ + 'new' => 'on', + 'new_to' => get_option( 'admin_email' ), + 'new_subject' => 'New product has been created', + 'new_body' => 'Hi, A new product has been created in your site %sitename% (%siteurl%). Here is the details: @@ -206,10 +208,10 @@ public function __construct() { Author: %author% Post URL: %permalink% Edit URL: %editlink%', - 'edit' => 'off', - 'edit_to' => get_option( 'admin_email' ), - 'edit_subject' => 'Product has been edited', - 'edit_body' => 'Hi, + 'edit' => 'off', + 'edit_to' => get_option( 'admin_email' ), + 'edit_subject' => 'Product has been edited', + 'edit_body' => 'Hi, The product "%post_title%" has been updated. Here is the details: @@ -219,8 +221,8 @@ public function __construct() { Author: %author% Post URL: %permalink% Edit URL: %editlink%', - ], - ]; + ], + ]; } /** @@ -274,12 +276,9 @@ public function handle_form_updates( $post_id, $form_id, $form_settings ) { */ public function update_reviews( $post_id ) { global $wpdb; - $reviews = get_post_meta( $post_id, 'product_reviews', true ); - $status = !empty( $reviews ) ? 'open' : 'closed'; - + $status = ! empty( $reviews ) ? 'open' : 'closed'; // wp_update_post( array( 'ID' => $post_id, 'comment_status' => $status ) ); - $comment_sql = "UPDATE {$wpdb->prefix}posts SET comment_status='{$status}' WHERE ID={$post_id} AND post_status='publish' AND post_type='product'"; $wpdb->get_results( $comment_sql ); } @@ -294,7 +293,6 @@ public function update_reviews( $post_id ) { public function update_price( $post_id ) { $regular_price = (float) get_post_meta( $post_id, '_regular_price', true ); $sale_price = (float) get_post_meta( $post_id, '_sale_price', true ); - if ( $sale_price && $regular_price > $sale_price ) { update_post_meta( $post_id, '_price', $sale_price ); } else { @@ -311,12 +309,10 @@ public function update_price( $post_id ) { */ public function update_gallery_images( $post_id ) { $images = get_post_meta( $post_id, '_product_image' ); - - if ( !empty( $images ) ) { + if ( ! empty( $images ) ) { if ( is_array( $images[0] ) ) { $images = $images[0]; } - if ( is_serialized( $images[0] ) ) { $images = maybe_unserialize( $images[0] ); } @@ -332,20 +328,15 @@ public function update_gallery_images( $post_id ) { * @return void */ public function update_meta( $post_id ) { - //keep backwards compatible if ( version_compare( WC_VERSION, '2.7', '<' ) ) { return; } - $visibility = get_post_meta( $post_id, '_visibility', true ); - $product = wc_get_product( $post_id ); - - if ( !empty( $visibility ) ) { + if ( ! empty( $visibility ) ) { $product->set_catalog_visibility( $visibility ); } - $product->save(); } } diff --git a/includes/free/post-form-templates/easy_digital_download.php b/includes/Admin/Forms/Post/Templates/Pro_Form_Preview_EDD.php similarity index 88% rename from includes/free/post-form-templates/easy_digital_download.php rename to includes/Admin/Forms/Post/Templates/Pro_Form_Preview_EDD.php index 596502f57..ffb2e5fdb 100644 --- a/includes/free/post-form-templates/easy_digital_download.php +++ b/includes/Admin/Forms/Post/Templates/Pro_Form_Preview_EDD.php @@ -1,8 +1,13 @@ +
  • + + + + +
    + + + +
    +
  • + +
  • + + + + +
    + + + +
    + + +
    + +
    +
    + + +
    +
  • + +
  • + + + + +
    + + + +
    +
  • + + + + + + + +
  • + + + + +
    + + +
    + + +
    + +
    + + +
    + +
    + + +
    + +
    + + +
    + +
    + + +
    + +
    + + +
    + +
    +
    + +
    + + +
    + +
    +
    + + +
    + 'count', + 'hide_empty' => 0, + ] + ); + $tax = is_array( $tax ) ? $tax : []; + foreach ( $tax as $tax_obj ) { + ?> +
    + + +
    + +
    +
    +
  • + [ 'name' => '', 'value' => '' ], + 'names_to_show' => [ 'name' => '', 'value' => '' ], + 'option_to_chose' => [ 'name' => '', 'value' => '' ], + ] + ) { + empty( $param['option_to_chose']['value'] ) ? ( $param['option_to_chose']['value'] = 'all' ) : ''; ?> +
    + +
    +
    + + +
    + +
    + + +
    + + + 'subscriber', - 'plural' => 'subscribers', - 'ajax' => false, - ] ); + parent::__construct( + [ + 'singular' => 'subscriber', + 'plural' => 'subscribers', + 'ajax' => false, + ] + ); } public function get_table_classes() { @@ -127,15 +133,15 @@ public function get_views() { $post_ID = isset( $_REQUEST['post_ID'] ) ? intval( wp_unslash( $_REQUEST['post_ID'] ) ) : 0; $base_link = admin_url( 'admin.php?page=wpuf_subscribers&pack=' . $post_ID ); - $subscribers_count = count( $users = WPUF_Subscription::init()->subscription_pack_users( $post_ID ) ); - $subscriptions_active_count = count( $users = WPUF_Subscription::init()->subscription_pack_users( $post_ID ) ); - $subscriptions_cancle_count = count( $users = WPUF_Subscription::init()->subscription_pack_users( $post_ID ) ); + $subscribers_count = count( wpuf()->subscription->subscription_pack_users( $post_ID ) ); + $subscriptions_active_count = count( wpuf()->subscription->subscription_pack_users( $post_ID ) ); + $subscriptions_cancel_count = count( wpuf()->subscription->subscription_pack_users( $post_ID ) ); $status = isset( $_REQUEST['status'] ) ? sanitize_text_field( wp_unslash( $_REQUEST['status'] ) ) : 'all'; $status_links['all'] = sprintf( '%s (%s)', add_query_arg( [ 'status' => 'all' ], $base_link ), ( $status == 'all' ) ? 'current' : '', __( 'All', 'wp-user-frontend' ), $subscribers_count ); $status_links['Completed'] = sprintf( '%s (%s)', add_query_arg( [ 'status' => 'Completed' ], $base_link ), ( $status == 'pending' ) ? 'current' : '', __( 'Completed', 'wp-user-frontend' ), $subscriptions_active_count ); - $status_links['Cancel'] = sprintf( '%s (%s)', add_query_arg( [ 'status' => 'Cancel' ], $base_link ), ( $status == 'Cancel' ) ? 'current' : '', __( 'Cancel', 'wp-user-frontend' ), $subscriptions_cancle_count ); + $status_links['Cancel'] = sprintf( '%s (%s)', add_query_arg( [ 'status' => 'Cancel' ], $base_link ), ( $status == 'Cancel' ) ? 'current' : '', __( 'Cancel', 'wp-user-frontend' ), $subscriptions_cancel_count ); return $status_links; } @@ -149,7 +155,7 @@ public function prepare_items() { global $wpdb; $columns = $this->get_columns(); - $hidden = [ ]; + $hidden = []; $sortable = $this->get_sortable_columns(); $this->_column_headers = [ $columns, $hidden, $sortable ]; diff --git a/class/transactions-list-table.php b/includes/Admin/List_Table_Transactions.php similarity index 87% rename from class/transactions-list-table.php rename to includes/Admin/List_Table_Transactions.php index 06bf84455..09254b31a 100644 --- a/class/transactions-list-table.php +++ b/includes/Admin/List_Table_Transactions.php @@ -1,10 +1,15 @@ ', $item->id - ); + return sprintf( '', $item->id ); } /** @@ -81,7 +84,6 @@ public function get_sortable_columns() { public function get_views() { $status_links = []; $base_link = admin_url( 'admin.php?page=wpuf_transaction' ); - $transactions_completed_count = wpuf_get_completed_transactions( [ 'count' => true ] ); $transactions_pending_count = wpuf_get_pending_transactions( [ 'count' => true ] ); $transactions_total_count = $transactions_completed_count + $transactions_pending_count; @@ -122,23 +124,22 @@ public function get_views() { */ public function column_id( $item ) { $id = $item->id; - $delete_nonce = wp_create_nonce( 'wpuf-delete-transaction' ); $title = '#' . $id . ''; - $page = isset( $_REQUEST['page'] ) ? sanitize_text_field( wp_unslash( $_REQUEST['page'] ) ) : ''; - if ( 'pending' === $item->status ) { $accept_nonce = wp_create_nonce( 'wpuf-accept-transaction' ); $reject_nonce = wp_create_nonce( 'wpuf-reject-transaction' ); - $actions = [ - 'accept' => sprintf( '%s', esc_attr( $page ), 'accept', absint( $id ), $accept_nonce, __( 'Accept', 'wp-user-frontend' ) ), - 'reject' => sprintf( '%s', esc_attr( $page ), 'reject', absint( $id ), $reject_nonce, __( 'Reject', 'wp-user-frontend' ) ), + 'accept' => sprintf( '%s', esc_attr( $page ), + 'accept', absint( $id ), $accept_nonce, __( 'Accept', 'wp-user-frontend' ) ), + 'reject' => sprintf( '%s', esc_attr( $page ), + 'reject', absint( $id ), $reject_nonce, __( 'Reject', 'wp-user-frontend' ) ), ]; } else { $actions = [ - 'delete' => sprintf( '%s', esc_attr( $page ), 'delete', absint( $id ), $delete_nonce, __( 'Delete', 'wp-user-frontend' ) ), + 'delete' => sprintf( '%s', esc_attr( $page ), + 'delete', absint( $id ), $delete_nonce, __( 'Delete', 'wp-user-frontend' ) ), ]; } @@ -157,7 +158,6 @@ public function column_default( $item, $column_name ) { switch ( $column_name ) { case 'status': return ( $item->status === 'completed' ) ? '' : ''; - case 'user': $user = get_user_by( 'id', $item->user_id ); $post_author_id = get_post_field( 'post_author', $item->post_id ); @@ -182,7 +182,6 @@ public function column_default( $item, $column_name ) { case 'payer': return ! empty( $item->payer_first_name ) ? $item->payer_first_name . ' ' . $item->payer_last_name : '-'; - case 'created': return ! empty( $item->created ) ? gmdate( 'd-m-Y', strtotime( $item->created ) ) : '-'; default: @@ -206,18 +205,17 @@ public function no_items() { * @return array */ public function get_bulk_actions() { - $status = isset( $_REQUEST['status'] ) ? sanitize_text_field( wp_unslash( $_REQUEST['status'] ) ) : ''; + $status = isset( $_REQUEST['status'] ) ? sanitize_text_field( wp_unslash( $_REQUEST['status'] ) ) : ''; $completed_action = [ 'bulk-delete' => __( 'Delete', 'wp-user-frontend' ), ]; - $pending_action = [ + $pending_action = [ 'bulk-accept' => __( 'Accept', 'wp-user-frontend' ), 'bulk-reject' => __( 'Reject', 'wp-user-frontend' ), ]; - if ( 'pending' === $status ) { $actions = $pending_action; - } elseif ( 'completed' === $status ) { + } else if ( 'completed' === $status ) { $actions = $completed_action; } else { $actions = array_merge( $completed_action, $pending_action ); @@ -234,43 +232,32 @@ public function get_bulk_actions() { public function prepare_items() { $per_page = $this->get_items_per_page( 'transactions_per_page', 20 ); $current_page = $this->get_pagenum(); - $status = isset( $_REQUEST['status'] ) ? sanitize_text_field( wp_unslash( $_REQUEST['status'] ) ) : 'all'; - if ( 'pending' === $status ) { $total_items = wpuf_get_pending_transactions( [ 'count' => true ] ); - } elseif ( 'completed' === $status ) { + } else if ( 'completed' === $status ) { $total_items = wpuf_get_completed_transactions( [ 'count' => true ] ); } else { $total_items = wpuf_get_all_transactions( [ 'count' => true ] ); } - - $this->set_pagination_args( - [ - 'total_items' => $total_items, - 'per_page' => $per_page, - ] - ); - + $this->set_pagination_args( [ + 'total_items' => $total_items, + 'per_page' => $per_page, + ] ); $this->_column_headers = $this->get_column_info(); - $this->process_actions(); - $offset = ( $current_page - 1 ) * $per_page; - $args = [ 'offset' => $offset, 'number' => $per_page, ]; - if ( isset( $_REQUEST['orderby'] ) && isset( $_REQUEST['order'] ) ) { $args['orderby'] = sanitize_text_field( wp_unslash( $_REQUEST['orderby'] ) ); $args['order'] = sanitize_text_field( wp_unslash( $_REQUEST['order'] ) ); } - if ( 'pending' === $status ) { $this->items = wpuf_get_pending_transactions( $args ); - } elseif ( 'completed' === $status ) { + } else if ( 'completed' === $status ) { $this->items = wpuf_get_completed_transactions( $args ); } else { $this->items = wpuf_get_all_transactions( $args ); @@ -284,123 +271,96 @@ public function prepare_items() { */ private function process_actions() { global $wpdb; - $page_url = menu_page_url( 'wpuf_transaction', false ); - // Delete Transaction - $action = isset( $_REQUEST['action'] ) ? sanitize_text_field( wp_unslash( $_REQUEST['action'] ) ) : ''; + $action = isset( $_REQUEST['action'] ) ? sanitize_text_field( wp_unslash( $_REQUEST['action'] ) ) : ''; $action2 = isset( $_REQUEST['action2'] ) ? sanitize_text_field( wp_unslash( $_REQUEST['action2'] ) ) : ''; - $nonce = isset( $_REQUEST['_wpnonce'] ) ? sanitize_key( wp_unslash( $_REQUEST['_wpnonce'] ) ) : ''; - $id = isset( $_REQUEST['id'] ) ? sanitize_text_field( wp_unslash( $_REQUEST['id'] ) ) : ''; - + $nonce = isset( $_REQUEST['_wpnonce'] ) ? sanitize_key( wp_unslash( $_REQUEST['_wpnonce'] ) ) : ''; + $id = isset( $_REQUEST['id'] ) ? sanitize_text_field( wp_unslash( $_REQUEST['id'] ) ) : ''; if ( $action === 'delete' || $action2 === 'delete' ) { if ( isset( $nonce ) && ! wp_verify_nonce( $nonce, 'wpuf-delete-transaction' ) ) { return false; } - $id = absint( esc_sql( $id ) ); - $wpdb->delete( $wpdb->prefix . 'wpuf_transaction', [ 'id' => $id ], [ '%d' ] ); - // Redirect wp_redirect( $page_url ); exit; } - // Delete Transactions if ( $action === 'bulk-delete' || $action2 === 'bulk-delete' ) { if ( isset( $nonce ) && ! wp_verify_nonce( $nonce, 'bulk-transactions' ) ) { return false; } - - $bulk_items = isset( $_REQUEST['bulk-items'] ) ? array_map( 'sanitize_text_field', wp_unslash( $_REQUEST['bulk-items'] ) ) : []; - + $bulk_items = isset( $_REQUEST['bulk-items'] ) ? array_map( 'sanitize_text_field', + wp_unslash( $_REQUEST['bulk-items'] ) ) : []; $ids = esc_sql( $bulk_items ); - foreach ( $ids as $id ) { $id = absint( $id ); - $wpdb->delete( $wpdb->prefix . 'wpuf_transaction', [ 'id' => $id ], [ '%d' ] ); } - // Redirect wp_redirect( $page_url ); exit; } - // Reject Transaction if ( $action === 'reject' || $action2 === 'reject' ) { if ( isset( $nonce ) && ! wp_verify_nonce( $nonce, 'wpuf-reject-transaction' ) ) { return false; } - $id = isset( $_REQUEST['id'] ) ? intval( wp_unslash( $_REQUEST['id'] ) ) : 0; $info = get_post_meta( $id, '_data', true ); $gateway = $info['post_data']['wpuf_payment_method']; - do_action( "wpuf_{$gateway}_bank_order_reject", $id ); wp_delete_post( $id, true ); - // Redirect wp_redirect( $page_url ); exit; } - // Reject Transactions if ( $action === 'bulk-reject' || $action2 === 'bulk-reject' ) { if ( isset( $nonce ) && ! wp_verify_nonce( $nonce, 'bulk-transactions' ) ) { return false; } - $bulk_items = isset( $_REQUEST['bulk-items'] ) ? array_map( 'sanitize_text_field', wp_unslash( $_REQUEST['bulk-items'] ) ) : []; - $ids = esc_sql( $bulk_items ); - + $bulk_items = isset( $_REQUEST['bulk-items'] ) ? array_map( 'sanitize_text_field', + wp_unslash( $_REQUEST['bulk-items'] ) ) : []; + $ids = esc_sql( $bulk_items ); foreach ( $ids as $id ) { $id = absint( $id ); $info = get_post_meta( $id, '_data', true ); $gateway = $info['post_data']['wpuf_payment_method']; - do_action( "wpuf_{$gateway}_bank_order_reject", $id ); - wp_delete_post( $id, true ); } - // Redirect wp_redirect( $page_url ); exit; } - // Accept Transaction if ( $action === 'accept' || $action2 === 'accept' ) { if ( isset( $nonce ) && ! wp_verify_nonce( $nonce, 'wpuf-accept-transaction' ) ) { return false; } - if ( ! current_user_can( 'manage_options' ) ) { return; } - $id = isset( $_REQUEST['id'] ) ? intval( wp_unslash( $_REQUEST['id'] ) ) : 0; $info = get_post_meta( $id, '_data', true ); - if ( $info ) { switch ( $info['type'] ) { case 'post': $post_id = $info['item_number']; $pack_id = 0; break; - case 'pack': $post_id = 0; $pack_id = $info['item_number']; break; } - $payer_address = ''; - if ( wpuf_get_option( 'show_address', 'wpuf_address_options', false ) ) { $payer_address = wpuf_get_user_address(); } - $transaction = [ 'user_id' => $info['user_info']['id'], 'status' => 'completed', @@ -417,59 +377,45 @@ private function process_actions() { 'transaction_id' => $id, 'created' => current_time( 'mysql' ), ]; - do_action( 'wpuf_gateway_bank_order_complete', $transaction, $id ); - - WPUF_Payment::insert_payment( $transaction ); - - $coupon_id = $info['post_data']['coupon_id']; - + Payment::insert_payment( $transaction ); + $coupon_id = ! empty( $info['post_data']['coupon_id'] ) ? $info['post_data']['coupon_id'] : 0; if ( $coupon_id ) { $pre_usage = get_post_meta( $coupon_id, '_coupon_used', true ); $pre_usage = ( empty( $pre_usage ) ) ? 0 : $pre_usage; $new_use = $pre_usage + 1; - update_post_meta( $coupon_id, '_coupon_used', $new_use ); } - wp_delete_post( $id, true ); } - wp_redirect( $page_url ); exit; } - // Bulk Accept Transaction if ( $action === 'bulk-accept' || $action2 === 'bulk-accept' ) { if ( isset( $nonce ) && ! wp_verify_nonce( $nonce, 'bulk-transactions' ) ) { return false; } - if ( ! current_user_can( 'manage_options' ) ) { return; } - - $bulk_items = isset( $_REQUEST['bulk-items'] ) ? array_map( 'sanitize_text_field', wp_unslash( $_REQUEST['bulk-items'] ) ) : []; - $ids = esc_sql( $bulk_items ); - + $bulk_items = isset( $_REQUEST['bulk-items'] ) ? array_map( 'sanitize_text_field', + wp_unslash( $_REQUEST['bulk-items'] ) ) : []; + $ids = esc_sql( $bulk_items ); foreach ( $ids as $id ) { $id = absint( $id ); - $info = get_post_meta( $id, '_data', true ); - if ( $info ) { switch ( $info['type'] ) { case 'post': $post_id = $info['item_number']; $pack_id = 0; break; - case 'pack': $post_id = 0; $pack_id = $info['item_number']; break; } - $transaction = [ 'user_id' => $info['user_info']['id'], 'status' => 'completed', @@ -485,14 +431,11 @@ private function process_actions() { 'transaction_id' => $id, 'created' => current_time( 'mysql' ), ]; - do_action( 'wpuf_gateway_bank_order_complete', $transaction, $id ); - - WPUF_Payment::insert_payment( $transaction ); + Payment::insert_payment( $transaction ); wp_delete_post( $id, true ); } } - wp_redirect( $page_url ); exit; } diff --git a/includes/Admin/Menu.php b/includes/Admin/Menu.php new file mode 100644 index 000000000..905b06c46 --- /dev/null +++ b/includes/Admin/Menu.php @@ -0,0 +1,379 @@ +' ); + + add_menu_page( __( 'WP User Frontend', 'wp-user-frontend' ), __( 'User Frontend', 'wp-user-frontend' ), $capability, $this->parent_slug, [ $this, 'wpuf_post_forms_page' ], $wpuf_icon, '54.2' ); + + $post_forms_hook = add_submenu_page( + $this->parent_slug, + __( 'Post Forms', 'wp-user-frontend' ), + __( 'Post Forms', 'wp-user-frontend' ), + $capability, + 'wpuf-post-forms', + [ $this, 'wpuf_post_forms_page' ] + ); + $this->all_submenu_hooks['post_forms'] = $post_forms_hook; + + // remove the toplevel menu item + remove_submenu_page( 'wp-user-frontend', 'wp-user-frontend' ); + + /* + * @since 2.3 + */ + do_action( 'wpuf_admin_menu_top' ); + + if ( 'on' === wpuf_get_option( 'enable_payment', 'wpuf_payment', 'on' ) ) { + $subscription_hook = add_submenu_page( $this->parent_slug, __( 'Subscriptions', 'wp-user-frontend' ), __( 'Subscriptions', 'wp-user-frontend' ), $capability, 'edit.php?post_type=wpuf_subscription' ); + + $this->all_submenu_hooks['subscription_hook'] = $subscription_hook; + + $transactions_page = add_submenu_page( $this->parent_slug, __( 'Transactions', 'wp-user-frontend' ), __( 'Transactions', 'wp-user-frontend' ), $capability, 'wpuf_transaction', [ $this, 'transactions_page' ] ); + + add_action( 'load-' . $transactions_page, [ $this, 'transactions_screen_option' ] ); + } + + $tools_hook = add_submenu_page( $this->parent_slug, __( 'Tools', 'wp-user-frontend' ), __( 'Tools', 'wp-user-frontend' ), $capability, 'wpuf_tools', [ $this, 'tools_page' ] ); + $this->all_submenu_hooks['tools'] = $tools_hook; + + add_action( 'load-' . $tools_hook, [ $this, 'enqueue_tools_script' ] ); + + do_action( 'wpuf_admin_menu' ); + + add_action( 'load-' . $post_forms_hook, [ $this, 'post_form_menu_action' ] ); + + do_action( 'wpuf_admin_menu_bottom' ); + + if ( ! class_exists( 'WP_User_Frontend_Pro' ) ) { + $premium_hook = add_submenu_page( $this->parent_slug, __( 'Premium', 'wp-user-frontend' ), __( 'Premium', 'wp-user-frontend' ), $capability, 'wpuf_premium', [ $this, 'premium_page' ] ); + + $this->all_submenu_hooks['premium'] = $premium_hook; + } + + $help_hook = add_submenu_page( $this->parent_slug, __( 'Help', 'wp-user-frontend' ), sprintf( '%s', __( 'Help', 'wp-user-frontend' ) ), $capability, 'wpuf-support', [ $this, 'support_page' ] ); + $this->all_submenu_hooks['help'] = $help_hook; + + add_action( 'load-' . $help_hook, [ $this, 'enqueue_help_script' ] ); + + $subscribers_page_hook = add_submenu_page( 'edit.php?post_type=wpuf_subscription', __( 'Subscribers', 'wp-user-frontend' ), __( 'Subscribers', 'wp-user-frontend' ), $capability, 'wpuf_subscribers', [ $this, 'subscribers_page' ] ); + //phpcs:ignore + $_registered_pages['user-frontend_page_wpuf_subscribers'] = true; // hack to work the nested subscribers page. WPUF > Subscriptions > Subscribers + + $this->all_submenu_hooks['subscribers_hook'] = $subscribers_page_hook; + + $settings_page_hook = add_submenu_page( $this->parent_slug, __( 'Settings', 'wp-user-frontend' ), __( 'Settings', 'wp-user-frontend' ), $capability, 'wpuf-settings', [ $this, 'plugin_settings_page' ] ); + + $this->all_submenu_hooks['settings_hook'] = $settings_page_hook; + + add_action( 'load-' . $settings_page_hook, [ $this, 'enqueue_settings_page_scripts' ] ); + } + + /** + * The content of the Post Form page. + * + * @since 4.0.0 + * + * @return void + */ + public function wpuf_post_forms_page() { + add_action( 'admin_footer', [ $this, 'load_headway_badge' ] ); + // phpcs:ignore WordPress.Security.NonceVerification + $action = ! empty( $_GET['action'] ) ? sanitize_text_field( wp_unslash( $_GET['action'] ) ) : null; + $add_new_page_url = admin_url( 'admin.php?page=wpuf-post-forms&action=add-new' ); + + switch ( $action ) { + case 'edit': + case 'add-new': + require_once WPUF_INCLUDES . '/Admin/views/post-form.php'; + break; + + default: + require_once WPUF_INCLUDES . '/Admin/views/post-forms-list-table-view.php'; + break; + } + } + + /** + * Load the Headway badge + * + * @since 4.0.5 + * + * @return void + */ + public function load_headway_badge() { + ?> + + + __( 'Number of items per page:', 'wp-user-frontend' ), + 'default' => 20, + 'option' => 'transactions_per_page', + ]; + + add_screen_option( $option, $args ); + + wpuf()->admin->transaction_list_table = new List_Table_Transactions(); + } + + public function transactions_page() { + $page = WPUF_INCLUDES . '/Admin/views/transactions-list-table-view.php'; + + wpuf_require_once( $page ); + } + + /** + * The subscribers page content + * + * @param $post_ID + * + * @return void + */ + public function subscribers_page( $post_ID ) { + $page = WPUF_INCLUDES . '/Admin/views/subscribers.php'; + + wpuf_require_once( $page ); + } + + /** + * Get all the submenu hooks created by WPUF + * + * @since 4.0.0 + * + * @return array + */ + public function get_all_submenu_hooks() { + return $this->all_submenu_hooks; + } + + public function add_submenu_hooks( $key, $hook ) { + $this->all_submenu_hooks[ $key ] = $hook; + } + + /** + * Highlight the proper top level menu + * + * @see http://wordpress.org/support/topic/moving-taxonomy-ui-to-another-main-menu?replies=5#post-2432769 + * + * @global $current_screen + * + * @param string $parent_file + * + * @return string + */ + public function fix_parent_menu( $parent_file ) { + $current_screen = get_current_screen(); + + $post_types = [ 'wpuf_forms', 'wpuf_profile', 'wpuf_subscription', 'wpuf_coupon' ]; + + if ( in_array( $current_screen->post_type, $post_types, true ) ) { + $parent_file = 'wp-user-frontend'; + } + + if ( 'wpuf_subscription' === $current_screen->post_type && $current_screen->base === 'admin_page_the-slug' ) { + $parent_file = 'wp-user-frontend'; + } + + return $parent_file; + } + + /** + * Fix the submenu class in admin menu + * + * @since 2.6.0 + * + * @param string $submenu_file + * + * @return string + */ + public function fix_submenu_file( $submenu_file ) { + $current_screen = get_current_screen(); + + if ( 'wpuf_subscription' === $current_screen->post_type && $current_screen->base === 'admin_page_wpuf_subscribers' ) { + $submenu_file = 'edit.php?post_type=wpuf_subscription'; + } + + return $submenu_file; + } + + /** + * Enqueue scripts required for tools page + * + * @return void + */ + public function enqueue_tools_script() { + /** + * Backdoor for calling the menu hook. + * This hook won't get translated even the site language is changed + */ + do_action( 'wpuf_load_tools' ); + + wp_enqueue_media(); // for uploading JSON + + wp_enqueue_script( 'wpuf-vue' ); + wp_enqueue_script( 'wpuf-admin-tools' ); + + wp_localize_script( + 'wpuf-admin-tools', + 'wpuf_admin_tools', + [ + 'url' => [ + 'ajax' => admin_url( 'admin-ajax.php' ), + ], + 'nonce' => wp_create_nonce( 'wpuf_admin_tools' ), + 'i18n' => [ + 'wpuf_import_forms' => __( 'WPUF Import Forms', 'wp-user-frontend' ), + 'add_json_file' => __( 'Add JSON file', 'wp-user-frontend' ), + 'could_not_import_forms' => __( 'Could not import forms.', 'wp-user-frontend' ), + ], + ] + ); + } + + /** + * The User Frontend > Tools page content + * + * @return void + */ + public function tools_page() { + wpuf()->admin->tools = new Admin_Tools(); + + $tools_page = WPUF_INCLUDES . '/Admin/views/tools.php'; + + wpuf_include_once( $tools_page ); + } + + /** + * Load necessary scripts for User Frontend > Settings page + * + * @return void + */ + public function enqueue_settings_page_scripts() { + wp_enqueue_style( 'wpuf-admin' ); + wp_enqueue_script( 'wpuf-admin' ); + wp_enqueue_script( 'wpuf-subscriptions' ); + wp_enqueue_script( 'wpuf-settings' ); + + add_action( 'admin_footer', [ $this, 'load_headway_badge' ] ); + } + + /** + * The User Frontend > Settings page content + * + * @return void + */ + public function plugin_settings_page() { + ?> +
    +

    + + + + + + 💡 + +

    +
    + admin->settings->get_settings_api()->show_navigation(); + wpuf()->admin->settings->get_settings_api()->show_forms(); + ?> +
    +
    + Premium page content + * + * @return void + */ + public function premium_page() { + require_once WPUF_INCLUDES . '/Admin/views/premium.php'; + } + + /** + * The User Frontend > Support page content + * + * @return void + */ + public function support_page() { + require_once WPUF_INCLUDES . '/Admin/views/support.php'; + } + + /** + * The User Frontend > Help page scripts + * + * @since 4.0.0 + * + * @return void + */ + public function enqueue_help_script() { + wp_enqueue_script( 'wpuf-admin' ); + wp_enqueue_style( 'wpuf-admin' ); + } +} diff --git a/includes/Admin/Plugin_Upgrade_Notice.php b/includes/Admin/Plugin_Upgrade_Notice.php new file mode 100644 index 000000000..05341db78 --- /dev/null +++ b/includes/Admin/Plugin_Upgrade_Notice.php @@ -0,0 +1,105 @@ +plugin_path = trailingslashit( dirname( $plugin_file ) ); + $plugin_dir = trailingslashit( basename( $this->plugin_path ) ); + $file = $plugin_dir . basename( $plugin_file ); + + // WordPress dynamic hook + add_action( 'in_plugin_update_message-' . $file, [ $this, 'maybe_display_message' ] ); + } + + /** + * Display notice upon checking + * + * @since 3.6.6 + * + * @return void + */ + public function maybe_display_message() { + $this->check_for_notice(); + + if ( $this->upgrade_notice ) { + $this->render_notice(); + } + } + + /** + * Tests to see if an upgrade notice is available. + * + * @since 3.6.6 + * + * @return void + */ + protected function check_for_notice() { + $notice_url = 'https://raw.githubusercontent.com/weDevsOfficial/wpuf-util/master/upgrade-notice.json'; + $response = wp_remote_get( $notice_url, [ 'timeout' => 15 ] ); + $notice = wp_remote_retrieve_body( $response ); + + if ( is_wp_error( $response ) || ( 200 !== $response['response']['code'] ) ) { + $notice = '[]'; + } + + $notice = json_decode( $notice, true ); + + if ( empty( $notice ) ) { + return; + } + + $min_version = ! empty( $notice['min-version'] ) ? $notice['min-version'] : ''; + + if ( version_compare( WPUF_VERSION, $min_version, '>=' ) ) { + return; + } + + $this->upgrade_notice = ! empty( $notice['message'] ) ? $notice['message'] : ''; + } + + /** + * Render the notice under new version available message + * + * @since 3.6.6 + * + * @return void + */ + public function render_notice() { + $notice = wp_kses_post( $this->upgrade_notice ); + echo "
    $notice
    "; + } +} diff --git a/includes/Admin/Posting.php b/includes/Admin/Posting.php new file mode 100644 index 000000000..5f42698d3 --- /dev/null +++ b/includes/Admin/Posting.php @@ -0,0 +1,617 @@ + __( 'Are you sure?', 'wp-user-frontend' ), + 'delete_it' => __( 'Yes, delete it', 'wp-user-frontend' ), + 'cancel_it' => __( 'No, cancel it', 'wp-user-frontend' ), + 'ajaxurl' => admin_url( 'admin-ajax.php' ), + 'nonce' => wp_create_nonce( 'wpuf_nonce' ), + 'plupload' => [ + 'url' => admin_url( 'admin-ajax.php' ) . '?nonce=' . wp_create_nonce( 'wpuf-upload-nonce' ), + 'flash_swf_url' => includes_url( 'js/plupload/plupload.flash.swf' ), + 'filters' => [['title' => __( 'Allowed Files', 'wp-user-frontend' ), 'extensions' => '*']], + 'multipart' => true, + 'urlstream_upload' => true, + 'warning' => __( 'Maximum number of files reached!', 'wp-user-frontend' ), + 'size_error' => __( 'The file you have uploaded exceeds the file size limit. Please try again.', 'wp-user-frontend' ), + 'type_error' => __( 'You have uploaded an incorrect file type. Please try again.', 'wp-user-frontend' ), + ], + ] ); + } + + /** + * Meta box for all Post form selection + * + * Registers a meta box in public post types to select the desired WPUF + * form select box to assign a form id. + * + * @since 2.5.2 + * + * @return void + */ + public function add_meta_box_form_select() { + $post_types = get_post_types( ['public' => true] ); + + foreach ( $post_types as $post_type ) { + add_meta_box( 'wpuf-select-form', __( 'WPUF Form', 'wp-user-frontend' ), [$this, 'form_selection_metabox'], $post_type, 'side', 'high' ); + } + } + + /** + * Form selection meta box in post types + * + * Registered via $this->add_meta_box_form_select() + * + * @since 2.5.2 + * + * @global object $post + */ + public function form_selection_metabox() { + global $post; + + $forms = get_posts( ['post_type' => 'wpuf_forms', 'numberposts' => '-1'] ); + $selected = get_post_meta( $post->ID, '_wpuf_form_id', true ); ?> + + + + +
    +

    +
    + ID; + } + $nonce = isset( $_POST['wpuf_form_select_nonce'] ) ? sanitize_key( wp_unslash( $_POST['wpuf_form_select_nonce'] ) ) : ''; + if ( isset( $nonce ) && !wp_verify_nonce( $nonce , plugin_basename( __FILE__ ) ) ) { + return $post->ID; + } + + // Is the user allowed to edit the post or page? + if ( !current_user_can( 'edit_post', $post->ID ) ) { + return $post->ID; + } + $wpuf_form_select = isset( $_POST['wpuf_form_select'] ) ? sanitize_text_field( wp_unslash( $_POST['wpuf_form_select'] ) ) : ''; + + update_post_meta( $post->ID, '_wpuf_form_id', $wpuf_form_select ); + } + + /** + * Meta box for post lock + * + * Registers a meta box in public post types to select the desired WPUF + * form select box to assign a form id. + * + * @since 3.0.2 + * + * @return void + */ + public function add_meta_box_post_lock() { + $post_types = get_post_types( ['public' => true] ); + + foreach ( $post_types as $post_type ) { + add_meta_box( 'wpuf-post-lock', __( 'WPUF Lock User', 'wp-user-frontend' ), [$this, 'post_lock_metabox'], $post_type, 'side', 'high' ); + } + } + + /** + * Post lock meta box in post types + * + * Registered via $this->add_meta_box_post_lock() + * + * @since 3.0.2 + * + * @global object $post + */ + public function post_lock_metabox() { + global $post; + + $msg = ''; + $edit_post_lock = get_post_meta( $post->ID, '_wpuf_lock_editing_post', true ); + $edit_post_lock_time = get_post_meta( $post->ID, '_wpuf_lock_user_editing_post_time', true ); + + if ( empty( $edit_post_lock_time ) ) { + $is_locked = false; + } + + if ( ( !empty( $edit_post_lock_time ) && $edit_post_lock_time < time() ) || $edit_post_lock == 'yes' ) { + $is_locked = true; + $msg = sprintf( __( 'Post is locked, to allow user to edit this post Click here', 'wp-user-frontend' ), $post->ID ); + } + + if ( !empty( $edit_post_lock_time ) && $edit_post_lock_time > time() ) { + $is_locked = false; + $time = date( 'Y-m-d H:i:s', $edit_post_lock_time ); + $local_time = get_date_from_gmt( $time, get_option( 'date_format' ) . ' ' . get_option( 'time_format' ) ); + $msg = sprintf( __( 'Frontend edit access for this post will be automatically locked after %s, Clear Lock Or,', 'wp-user-frontend' ), $local_time, $post->ID ); + } ?> + + + +

    + [ + 'href' => [], + 'id' => [], + 'data' => [], + ] + ] ); + ?> +

    + + + + +

    + + + ID; + } + + $nonce = isset( $_POST['wpuf_lock_editing_post_nonce'] ) ? sanitize_key( wp_unslash( $_POST['wpuf_lock_editing_post_nonce'] ) ) : ''; + + if ( isset( $nonce ) && !wp_verify_nonce( $nonce, plugin_basename( __FILE__ ) ) ) { + return $post->ID; + } + + // Is the user allowed to edit the post or page? + if ( !current_user_can( 'edit_post', $post->ID ) ) { + return $post->ID; + } + $wpuf_lock_post = isset( $_POST['wpuf_lock_post'] ) ? sanitize_text_field( wp_unslash( $_POST['wpuf_lock_post'] ) ) : ''; + + update_post_meta( $post->ID, '_wpuf_lock_editing_post', $wpuf_lock_post ); + } + + /** + * Meta box to show WPUF Custom Fields + * + * Registers a meta box in public post types to show WPUF Custom Fields + * + * @since 2.5 + * + * @return void + */ + public function add_meta_boxes() { + $post_types = get_post_types( ['public' => true] ); + + foreach ( $post_types as $post_type ) { + add_meta_box( 'wpuf-custom-fields', __( 'WPUF Custom Fields', 'wp-user-frontend' ), [$this, 'render_form'], $post_type, 'normal', 'high' ); + } + } + + /** + * function to hide form custom field + * + * @since 2.5 + * + * @return void + */ + public function hide_form() { + ?> + + ID, '_wpuf_form_id', true ); + $form_settings = wpuf_get_form_settings( $form_id ); + + /** + * There may be incompatibilities with WPUF metabox display when Advanced Custom Fields + * is active. By default WPUF metaboxes will be hidden when ACF is detected. However, + * you can override that by using the following filter. + */ + $hide_with_acf = class_exists( 'acf' ) ? apply_filters( 'wpuf_hide_meta_when_acf_active', true ) : false; + $acf_enable = wpuf_get_option( 'wpuf_compatibility_acf', 'wpuf_general', 'yes' ); + + if ( 'yes' === $acf_enable && $hide_with_acf ) { + $hide_with_acf = false; + } + + // hide the metabox itself if no form ID is set + if ( ! $form_id || $hide_with_acf ) { + $this->hide_form(); + + return; + } + + list( $post_fields, $taxonomy_fields, $custom_fields ) = $this->get_input_fields( $form_id ); + + if ( empty( $custom_fields ) ) { + esc_html_e( 'No custom fields found.', 'wp-user-frontend' ); + + return; + } ?> + + + + + + + + + + + fields->render_fields( $custom_fields, $form_id, $atts, $type = 'post', $post->ID ); + // wp_nonce_field( 'wpuf_form_add' ); ?> + +
    + scripts_styles(); + } + + public function scripts_styles() { + ?> + + + update_post_meta( $meta_vars, $post_id ); + } + + /** + * Clear Schedule lock + * + * @since 3.0.2 + */ + public function clear_schedule_lock() { + check_ajax_referer( 'wpuf_nonce', 'nonce' ); + + if ( ! current_user_can( wpuf_admin_role() ) ) { + wp_send_json_error( __( 'Unauthorized operation', 'wp-user-frontend' ) ); + } + + $post_id = isset( $_POST['post_id'] ) ? intval( wp_unslash( $_POST['post_id'] ) ) : ''; + + if ( !empty( $post_id ) ) { + update_post_meta( $post_id, '_wpuf_lock_user_editing_post_time', '' ); + update_post_meta( $post_id, '_wpuf_lock_editing_post', 'no' ); + } + exit; + } + + /** + * Get input meta fields separated as post vars, taxonomy and meta vars + * + * @param int $form_id form id + * + * @return array + */ + public static function get_input_fields( $form_id ) { + $form_vars = wpuf_get_form_fields( $form_id ); + + $ignore_lists = ['section_break', 'html']; + $post_vars = $meta_vars = $taxonomy_vars = []; + + foreach ( $form_vars as $key => $value ) { + // get column field input fields + if ( $value['input_type'] == 'column_field' ) { + $inner_fields = $value['inner_fields']; + + foreach ( $inner_fields as $column_key => $column_fields ) { + if ( !empty( $column_fields ) ) { + // ignore section break and HTML input type + foreach ( $column_fields as $column_field_key => $column_field ) { + if ( in_array( $column_field['input_type'], $ignore_lists ) ) { + continue; + } + + //separate the post and custom fields + if ( isset( $column_field['is_meta'] ) && $column_field['is_meta'] == 'yes' ) { + $meta_vars[] = $column_field; + continue; + } + + if ( $column_field['input_type'] == 'taxonomy' ) { + + // don't add "category" + if ( $column_field['name'] == 'category' ) { + continue; + } + + $taxonomy_vars[] = $column_field; + } else { + $post_vars[] = $column_field; + } + } + } + } + continue; + } + + // ignore section break and HTML input type + if ( in_array( $value['input_type'], $ignore_lists ) ) { + continue; + } + + //separate the post and custom fields + if ( isset( $value['is_meta'] ) && $value['is_meta'] == 'yes' ) { + $meta_vars[] = $value; + continue; + } + + if ( $value['input_type'] == 'taxonomy' ) { + + // don't add "category" + if ( $value['name'] == 'category' ) { + continue; + } + + $taxonomy_vars[] = $value; + } else { + $post_vars[] = $value; + } + } + + return [$post_vars, $taxonomy_vars, $meta_vars]; + } +} diff --git a/admin/promotion.php b/includes/Admin/Promotion.php similarity index 79% rename from admin/promotion.php rename to includes/Admin/Promotion.php index 629183b81..d7e943d9e 100644 --- a/admin/promotion.php +++ b/includes/Admin/Promotion.php @@ -1,16 +1,19 @@ 15 ) ); $promos = wp_remote_retrieve_body( $response ); @@ -62,8 +65,7 @@ public function promotional_offer() { strtotime( $start_date ) < strtotime( $current_time ) && strtotime( $current_time ) < strtotime( $end_date ) ) { - $notice = sprintf( '

    %s %s

    ', __( $content, 'wp-user-frontend' ), $action_url, __( $action_title, 'wp-user-frontend' ) ); - $this->generate_notice( $notice, $option_name ); + $this->generate_notice( $promos ); } } @@ -193,7 +195,7 @@ public function wpuf_review_notice_message() { e.preventDefault(); jQuery("#wpuf-review-notice").hide(); - wp.ajax.post('wpuf-dismiss-review-notice', { + wp.ajax.post('wpuf_dismiss_review_notice', { dismissed: true, _wpnonce: '' }); @@ -211,7 +213,11 @@ public function wpuf_review_notice_message() { */ public function dismiss_promotional_offer() { if ( empty( $_POST['_wpnonce'] ) ) { - wp_send_json_error( __( 'Unauthorized operation', 'wp-user-frontend' ) ); + wp_send_json_error( __( 'Unauthorized operation', 'wp-user-frontend' ) ); + } + + if ( ! current_user_can( wpuf_admin_role() ) ) { + wp_send_json_error( __( 'Unauthorized operation', 'wp-user-frontend' ) ); } if ( isset( $_POST['_wpnonce'] ) && ! wp_verify_nonce( sanitize_key( wp_unslash( $_POST['_wpnonce'] ) ), 'wpuf_nonce' ) ) { @@ -227,38 +233,53 @@ public function dismiss_promotional_offer() { /** * Show admin notice * - * @param string $message - * @param string $option_name + * @since WPUF @param $message and @param $option_name replaced with $args * * @return void */ - public function generate_notice( $message, $option_name ) { - $hide_notice = get_option( $option_name, 'no' ); + public function generate_notice( $args ) { + $option_name = ! empty( $args['key'] ) ? $args['key'] : ''; + $content = ! empty( $args['content'] ) ? $args['content'] : ''; + $title = ! empty( $args['title'] ) ? $args['title'] : ''; + $action_url = ! empty( $args['action_url'] ) ? $args['action_url'] : ''; + $action_title = ! empty( $args['action_title'] ) ? $args['action_title'] : ''; + $hide_notice = get_option( $option_name, 'no' ); if ( 'hide' === $hide_notice ) { return; } ?> -
    - -
    +
    +
    WPUF Icon
    - -
    -

    -
    - -
    - +
    +

    +

    +
    +
    + \ No newline at end of file + diff --git a/admin/html/support.php b/includes/Admin/views/support.php similarity index 100% rename from admin/html/support.php rename to includes/Admin/views/support.php diff --git a/includes/Admin/views/tools.php b/includes/Admin/views/tools.php new file mode 100644 index 000000000..2b4347b67 --- /dev/null +++ b/includes/Admin/views/tools.php @@ -0,0 +1,57 @@ + + +
    + + + admin->tools->list_forms(); + wpuf()->admin->tools->list_regis_forms(); + break; + + case 'import': + wpuf()->admin->tools->import_data(); + break; + + default: + wpuf()->admin->tools->tool_page(); + break; + } + ?> +
    + + + + + diff --git a/admin/transactions.php b/includes/Admin/views/transactions-list-table-view.php similarity index 57% rename from admin/transactions.php rename to includes/Admin/views/transactions-list-table-view.php index 9d0bf63d5..611f742b5 100644 --- a/admin/transactions.php +++ b/includes/Admin/views/transactions-list-table-view.php @@ -4,16 +4,15 @@ get_var( "SELECT SUM(cost) FROM {$wpdb->prefix}wpuf_transaction WHERE status = 'completed'" ); - //$month_income = $wpdb->get_var( "SELECT SUM(cost) FROM {$wpdb->prefix}wpuf_transaction WHERE YEAR(`created`) = YEAR(NOW()) AND MONTH(`created`) = MONTH(NOW()) AND status = 'completed'" ); $total_tax = $wpdb->get_var( "SELECT SUM(tax) FROM {$wpdb->prefix}wpuf_transaction WHERE status = 'completed'" ); ?>
    transactions_list_table_obj->prepare_items(); - $this->transactions_list_table_obj->views(); - $this->transactions_list_table_obj->display(); + wpuf()->admin->transaction_list_table->prepare_items(); + wpuf()->admin->transaction_list_table->views(); + wpuf()->admin->transaction_list_table->display(); ?>
    diff --git a/includes/Ajax.php b/includes/Ajax.php new file mode 100644 index 000000000..84c67ab67 --- /dev/null +++ b/includes/Ajax.php @@ -0,0 +1,102 @@ + false ]; + + /** + * A predefined array to use when we need to create AJAX actions only for logged out users + * + * @var array + */ + protected $logged_out_only = [ 'priv' => false ]; + + public function __construct() { + $this->register_ajax( 'wpuf_submit_post', [ new Ajax\Frontend_Form_Ajax(), 'submit_post' ] ); + $this->register_ajax( 'wpuf_file_del', [ new Ajax\Upload_Ajax(), 'delete_file' ] ); + $this->register_ajax( 'wpuf_upload_file', [ new Ajax\Upload_Ajax(), 'upload_file' ] ); + $this->register_ajax( 'wpuf_insert_image', [ new Ajax\Upload_Ajax(), 'insert_image' ] ); + $this->register_ajax( 'wpuf_form_builder_save_form', [ new Ajax\Admin_Form_Builder_Ajax(), 'save_form' ], $this->logged_in_only ); + $this->register_ajax( 'wpuf_form_setting_post', [ new Ajax\Admin_Form_Builder_Ajax(), 'wpuf_get_post_taxonomies' ], $this->logged_in_only ); + $this->register_ajax( 'wpuf_dismiss_promotional_offer_notice', [ new Admin\Promotion(), 'dismiss_promotional_offer' ], $this->logged_in_only ); + $this->register_ajax( 'wpuf_dismiss_review_notice', [ new Admin\Promotion(), 'dismiss_review_notice' ], $this->logged_in_only ); + $this->register_ajax( 'wpuf_ajax_tag_search', 'wpuf_ajax_tag_search' ); + $this->register_ajax( 'wpuf_dismiss_notice_acf', [ new Integrations\WPUF_ACF_Compatibility(), 'dismiss_notice' ], $this->logged_in_only ); + $this->register_ajax( 'wpuf_compatibility_acf', [ new Integrations\WPUF_ACF_Compatibility(), 'maybe_compatible' ], $this->logged_in_only ); + $this->register_ajax( 'wpuf_migrate_acf', [ new Integrations\WPUF_ACF_Compatibility(), 'migrate_cf_data' ], $this->logged_in_only ); + $this->register_ajax( 'wpuf_ajax_login', [ new Login_Widget(), 'ajax_login' ], $this->logged_out_only ); + $this->register_ajax( 'wpuf_lost_password', [ new Login_Widget(), 'ajax_reset_pass' ], $this->logged_out_only ); + $this->register_ajax( 'wpuf_ajax_logout', [ new Login_Widget(), 'ajax_logout' ], $this->logged_out_only ); + $this->register_ajax( 'wpuf_form_preview', [ new Frontend\Frontend_Form(), 'preview_form' ], $this->logged_in_only ); + $this->register_ajax( 'wpuf_make_media_embed_code', [ new Frontend\Frontend_Form(), 'make_media_embed_code' ] ); + $this->register_ajax( 'wpuf_draft_post', [ new Frontend\Frontend_Form(), 'draft_post' ] ); + $this->register_ajax( 'wpuf_delete_user_package', [ new Admin\Admin_Subscription(), 'delete_user_package' ], $this->logged_in_only ); + $this->register_ajax( 'wpuf_address_ajax_action', [ new Ajax\Address_Form_Ajax(), 'ajax_form_action' ] ); + $this->register_ajax( 'wpuf_account_update_profile', [ new Frontend\Frontend_Account(), 'update_profile' ], $this->logged_in_only ); + $this->register_ajax( 'wpuf_import_forms', [ new Admin\Admin_Tools(), 'import_forms' ], $this->logged_in_only ); + $this->register_ajax( 'wpuf_get_child_cat', 'wpuf_get_child_cats' ); + $this->register_ajax( 'wpuf_ajax_address', 'wpuf_get_child_cats' ); + $this->register_ajax( 'wpuf_update_billing_address', 'wpuf_update_billing_address' ); + $this->register_ajax( 'wpuf_clear_schedule_lock', 'wpuf_clear_schedule_lock', $this->logged_in_only ); + } + + /** + * Register ajax into action hook + * + * Usage: + * register_ajax( 'action', 'action_callback' ); // for logged-in and logged-out users + * register_ajax( 'action', 'action_callback', [ 'nopriv' => false ] ); // for logged-in users only + * register_ajax( 'action', 'action_callback', [ 'nopriv' => true, 'priv' => false ] ); // for logged-out users only + * + * @param string $action + * @param callable|string $callback + * @param array $args + * + * @return void + */ + public function register_ajax( $action, $callback, $args = [] ) { + $default = [ + 'nopriv' => true, + 'priv' => true, + 'priority' => 10, + 'accepted_args' => 1, + ]; + + $args = wp_parse_args( $default, $args ); + + if ( $args['priv'] ) { + add_action( 'wp_ajax_' . $action, $callback, $args['priority'], $args['accepted_args'] ); + } + + if ( $args['nopriv'] ) { + add_action( 'wp_ajax_nopriv_' . $action, $callback, $args['priority'], $args['accepted_args'] ); + } + } + + /** + * Send json error message + * + * @since 4.0.0 + * + * @param string $error + */ + public function send_error( $error ) { + wp_send_json_error( + [ + 'success' => false, + 'error' => $error, + ] + ); + } +} diff --git a/includes/class-billing-address.php b/includes/Ajax/Address_Form_Ajax.php similarity index 94% rename from includes/class-billing-address.php rename to includes/Ajax/Address_Form_Ajax.php index 7fad1d9b4..affbb4907 100644 --- a/includes/class-billing-address.php +++ b/includes/Ajax/Address_Form_Ajax.php @@ -1,14 +1,16 @@ admin_url( 'admin-ajax.php' ), - 'fill_notice' => __( 'Some Required Fields are not filled!', 'wp-user-frontend' ) - ] ); + wp_localize_script( + 'wpuf-ajax-script', + 'ajax_object', + [ + 'ajaxurl' => admin_url( 'admin-ajax.php' ), + 'fill_notice' => __( 'Some Required Fields are not filled!', 'wp-user-frontend' ), + ] + ); } /** @@ -151,7 +157,7 @@ public static function wpuf_ajax_address_form() { ?>
    - + @@ -165,7 +171,7 @@ public static function wpuf_ajax_address_form() { $rates = wpuf_get_tax_rates(); } - $cs = new CountryState(); + $cs = new Country_State(); $states = []; $selected = []; $base_addr = get_option( 'wpuf_base_country_state', false ); @@ -292,7 +298,7 @@ class="input $integrations, ]; - $form_fields = WPUF_Admin_Form_Builder::save_form( $data ); + $form_fields = Admin_Form_Builder::save_form( $data ); wp_send_json_success( [ 'form_fields' => $form_fields, 'form_settings' => $settings ] ); } @@ -82,6 +78,10 @@ public function wpuf_get_post_taxonomies() { wp_send_json_error( __( 'Unauthorized operation', 'wp-user-frontend' ) ); } + if ( ! current_user_can( wpuf_admin_role() ) ) { + wp_send_json_error( __( 'Unauthorized operation', 'wp-user-frontend' ) ); + } + if ( isset( $post_type ) && empty( $post_data['post_type'] ) ) { wp_send_json_error( __( 'Invalid post type', 'wp-user-frontend' ) ); } @@ -111,5 +111,3 @@ public function wpuf_get_post_taxonomies() { wp_send_json_success( [ 'success' => 'true' , 'data' => $cat ] ); } } - -new WPUF_Admin_Form_Builder_Ajax(); diff --git a/includes/class-frontend-form-post.php b/includes/Ajax/Frontend_Form_Ajax.php old mode 100755 new mode 100644 similarity index 66% rename from includes/class-frontend-form-post.php rename to includes/Ajax/Frontend_Form_Ajax.php index edbc44dea..39e2b705f --- a/includes/class-frontend-form-post.php +++ b/includes/Ajax/Frontend_Form_Ajax.php @@ -1,303 +1,26 @@ set_wp_post_types(); - - // Enable post edit link for post authors in frontend - if ( ! is_admin() ) { - add_filter( 'user_has_cap', [ $this, 'map_capabilities_for_post_authors' ], 10, 4 ); - add_filter( 'get_edit_post_link', [ $this, 'get_edit_post_link' ], 10, 3 ); - } - } - - /** - * Edit post shortcode handler - * - * @param array $atts - * - * @return - **/ - public function edit_post_shortcode( $atts ) { - add_filter( 'wpuf-form-fields', [ $this, 'add_field_settings' ] ); - // @codingStandardsIgnoreStart - extract( shortcode_atts( [ 'id' => 0 ], $atts ) ); - - // @codingStandardsIgnoreEnd - ob_start(); - - global $userdata; - - ob_start(); - - if ( ! is_user_logged_in() ) { - echo wp_kses_post( '
    ' . __( 'You are not logged in', 'wp-user-frontend' ) . '
    ' ), - - wp_login_form(); - - return; - } - - $post_id = isset( $_GET['pid'] ) ? intval( wp_unslash( $_GET['pid'] ) ) : 0; - - if ( ! $post_id ) { - return '
    ' . __( 'Invalid post', 'wp-user-frontend' ) . '
    '; - } - - $edit_post_lock = get_post_meta( $post_id, '_wpuf_lock_editing_post', true ); - $edit_post_lock_time = get_post_meta( $post_id, '_wpuf_lock_user_editing_post_time', true ); - - if ( $edit_post_lock === 'yes' ) { - return '
    ' . apply_filters( 'wpuf_edit_post_lock_user_notice', __( 'Your edit access for this post has been locked by an administrator.', 'wp-user-frontend' ) ) . '
    '; - } - - if ( ! empty( $edit_post_lock_time ) && $edit_post_lock_time < time() ) { - return '
    ' . apply_filters( 'wpuf_edit_post_lock_expire_notice', __( 'Your allocated time for editing this post has been expired.', 'wp-user-frontend' ) ) . '
    '; - } - - if ( wpuf_get_user()->edit_post_locked() ) { - if ( wpuf_get_user()->edit_post_lock_reason() ) { - return '
    ' . wpuf_get_user()->edit_post_lock_reason() . '
    '; - } - - return '
    ' . apply_filters( 'wpuf_user_edit_post_lock_notice', __( 'Your post edit access has been locked by an administrator.', 'wp-user-frontend' ) ) . '
    '; - } - - //is editing enabled? - if ( wpuf_get_option( 'enable_post_edit', 'wpuf_dashboard', 'yes' ) !== 'yes' ) { - return '
    ' . __( 'Post Editing is disabled', 'wp-user-frontend' ) . '
    '; - } - - $curpost = get_post( $post_id ); - - if ( ! $curpost ) { - return '
    ' . __( 'Invalid post', 'wp-user-frontend' ); - } - - // has permission? - if ( ! current_user_can( 'delete_others_posts' ) && ( $userdata->ID !== (int) $curpost->post_author ) ) { - return '
    ' . __( 'You are not allowed to edit', 'wp-user-frontend' ) . '
    '; - } - - $form_id = get_post_meta( $post_id, self::$config_id, true ); - - // fallback to default form - if ( ! $form_id ) { - $form_id = wpuf_get_option( 'default_post_form', 'wpuf_frontend_posting' ); - } - - if ( ! $form_id ) { - return '
    ' . __( "I don't know how to edit this post, I don't have the form ID", 'wp-user-frontend' ) . '
    '; - } - - $form = new WPUF_Form( $form_id ); - - $this->form_fields = $form->get_fields(); - // $form_settings = wpuf_get_form_settings( $form_id ); - $this->form_settings = $form->get_settings(); - - $disable_pending_edit = wpuf_get_option( 'disable_pending_edit', 'wpuf_dashboard', 'on' ); - $disable_publish_edit = wpuf_get_option( 'disable_publish_edit', 'wpuf_dashboard', 'off' ); - - if ( 'pending' === $curpost->post_status && 'on' === $disable_pending_edit ) { - return '
    ' . __( 'You can\'t edit a post while in pending mode.', 'wp-user-frontend' ); - } - - if ( 'publish' === $curpost->post_status && 'off' !== $disable_publish_edit ) { - return '
    ' . __( 'You\'re not allowed to edit this post.', 'wp-user-frontend' ); - } - - $msg = isset( $_GET['msg'] ) ? sanitize_text_field( wp_unslash( $_GET['msg'] ) ) : ''; - - if ( $msg === 'post_updated' ) { - echo wp_kses_post( '
    ' ); - echo wp_kses_post( str_replace( '%link%', get_permalink( $post_id ), $this->form_settings['update_message'] ) ); - echo wp_kses_post( '
    ' ); - } - - $this->render_form( $form_id, $post_id, $atts, $form ); - - $content = ob_get_contents(); - - ob_end_clean(); - - return $content; - } - - public static function init() { - if ( ! self::$_instance ) { - self::$_instance = new self(); - } - - return self::$_instance; - } - - /** - * This will embed media to the editor - */ - public function make_media_embed_code() { - $nonce = isset( $_GET['nonce'] ) ? sanitize_key( wp_unslash( $_GET['nonce'] ) ) : ''; - - if ( isset( $nonce ) && ! wp_verify_nonce( $nonce, 'wpuf-upload-nonce' ) ) { - return; - } - - $content = isset( $_POST['content'] ) ? sanitize_text_field( wp_unslash( $_POST['content'] ) ) : ''; - $embed_code = wp_oembed_get( $content ); - - if ( $embed_code ) { - echo esc_html( $embed_code ); - } else { - echo ''; - } - exit; - } - - /** - * Draft Post - */ - public function draft_post() { - check_ajax_referer( 'wpuf_form_add' ); - add_filter( 'wpuf-form-fields', [ $this, 'add_field_settings' ] ); - @header( 'Content-Type: application/json; charset=' . get_option( 'blog_charset' ) ); - - $form_id = isset( $_POST['form_id'] ) ? intval( wp_unslash( $_POST['form_id'] ) ) : 0; - $form = new WPUF_Form( $form_id ); - $this->form_settings = $form->get_settings(); - $this->form_fields = $form->get_fields(); - $pay_per_post = $form->is_enabled_pay_per_post(); - - list( $post_vars, $taxonomy_vars, $meta_vars ) = $this->get_input_fields( $this->form_fields ); - - $entry_fields = $form->prepare_entries(); - $allowed_tags = wp_kses_allowed_html( 'post' ); - $post_content = isset( $_POST['post_content'] ) ? wp_kses( wp_unslash( $_POST['post_content'] ), $allowed_tags ) : ''; - $postarr = [ - 'post_type' => $this->form_settings['post_type'], - 'post_status' => wpuf_get_draft_post_status( $this->form_settings ), - 'post_author' => get_current_user_id(), - 'post_title' => isset( $_POST['post_title'] ) ? sanitize_text_field( wp_unslash( $_POST['post_title'] ) ) : '', - 'post_content' => $post_content, - 'post_excerpt' => isset( $_POST['post_excerpt'] ) ? wp_kses( wp_unslash( $_POST['post_excerpt'] ), $allowed_tags ) : '', - ]; - - if ( ! empty( $this->form_fields ) ) { - foreach ( $this->form_fields as $field ) { - if ( $field['template'] === 'taxonomy' ) { - $category_name = $field['name']; - - if ( isset( $_POST[ $category_name ] ) && is_array( $_POST[ $category_name ] ) ) { // WPCS: sanitization ok. - $category = isset( $_POST[ $category_name ] ) ? array_map( 'sanitize_text_field', wp_unslash( $_POST[ $category_name ] ) ) : []; - } else { - $category = isset( $_POST[ $category_name ] ) ? sanitize_text_field( wp_unslash( $_POST[ $category_name ] ) ) : ''; - } - - if ( $category !== '' && $category !== '0' && $category[0] !== '-1' ) { - if ( ! is_array( $category ) && is_string( $category ) ) { - $category_strings = explode( ',', $category ); - $cat_ids = []; - - foreach ( $category_strings as $key => $each_cat_string ) { - $cat_ids[] = get_cat_ID( trim( $each_cat_string ) ); - $postarr['post_category'] = $cat_ids; - } - } else { - $postarr['post_category'] = $category; - } - } - } - } - } - - // set default post category if it's not been set yet and if post type supports - if ( ! isset( $postarr['post_category'] ) && isset( $this->form_settings['default_cat'] ) && is_object_in_taxonomy( $this->form_settings['post_type'], 'category' ) ) { - if ( is_array( $this->form_settings['default_cat'] ) ) { - $postarr['post_category'] = $this->form_settings['default_cat']; - } else { - $postarr['post_category'] = [ $this->form_settings['default_cat'] ]; - } - } - - if ( isset( $_POST['tags'] ) ) { - $postarr['tags_input'] = explode( ',', sanitize_text_field( wp_unslash( $_POST['tags'] ) ) ); - } - - // if post_id is passed, we update the post - if ( isset( $_POST['post_id'] ) ) { - $is_update = true; - $postarr['ID'] = intval( wp_unslash( $_POST['post_id'] ) ); - $postarr['comment_status'] = 'open'; - } - - $post_id = wp_insert_post( $postarr ); - - // add post revision when post edit from the frontend - wpuf_frontend_post_revision( $post_id, $this->form_settings ); - - if ( $post_id ) { - self::update_post_meta( $meta_vars, $post_id ); - - // set the post form_id for later usage - update_post_meta( $post_id, self::$config_id, $form_id ); +use DOMDocument; +use WeDevs\Wpuf\Admin\Forms\Form; +use WeDevs\Wpuf\Traits\FieldableTrait; +use WeDevs\Wpuf\User_Subscription; +use WP_Error; +use WPUF_Subscription; - // save post formats if have any - if ( isset( $this->form_settings['post_format'] ) && $this->form_settings['post_format'] !== '0' ) { - if ( post_type_supports( $this->form_settings['post_type'], 'post-formats' ) ) { - set_post_format( $post_id, $this->form_settings['post_format'] ); - } - } +#[AllowDynamicProperties] +class Frontend_Form_Ajax { - if ( ! empty( $taxonomy_vars ) ) { - $this->set_custom_taxonomy( $post_id, $taxonomy_vars ); - } else { - $this->set_default_taxonomy( $post_id ); - } - } + use FieldableTrait; - //used to add code to run when the post is going to draft - do_action( 'wpuf_draft_post_after_insert', $post_id, $form_id, $this->form_settings, $this->form_fields ); + public $form_settings = []; - wpuf_clear_buffer(); + private $post_expiration_date = 'wpuf-post_expiration_date'; - echo json_encode( - [ - 'post_id' => $post_id, - 'action' => isset( $_POST['action'] ) ? sanitize_text_field( wp_unslash( $_POST['action'] ) ) : '', - 'date' => current_time( 'mysql' ), - 'post_author' => get_current_user_id(), - 'comment_status' => get_option( 'default_comment_status' ), - 'url' => add_query_arg( 'preview', 'true', get_permalink( $post_id ) ), - 'message' => __( 'Post Saved', 'wp-user-frontend' ), - ] - ); + private $expired_post_status = 'wpuf-expired_post_status'; - exit; - } + private $post_expiration_message = 'wpuf-post_expiration_message'; /** * New/Edit post submit handler @@ -306,11 +29,11 @@ public function draft_post() { */ public function submit_post() { check_ajax_referer( 'wpuf_form_add' ); - add_filter( 'wpuf-form-fields', [ $this, 'add_field_settings' ] ); + add_filter( 'wpuf_form_fields', [ $this, 'add_field_settings' ] ); @header( 'Content-Type: application/json; charset=' . get_option( 'blog_charset' ) ); $form_id = isset( $_POST['form_id'] ) ? intval( wp_unslash( $_POST['form_id'] ) ) : 0; - $form = new WPUF_Form( $form_id ); + $form = new Form( $form_id ); $this->form_settings = $form->get_settings(); $this->form_fields = $form->get_fields(); $guest_mode = isset( $this->form_settings['guest_post'] ) ? $this->form_settings['guest_post'] : ''; @@ -333,22 +56,56 @@ public function submit_post() { // if restriction by character count if ( 'character' === $restriction_type && 'min' === $restriction_to ) { if ( strlen( $current_data ) > 0 && strlen( $current_data ) < $restricted_num ) { - $this->send_error( sprintf( __( 'Minimum %d character is required for %s', 'wp-user-frontend' ), $restricted_num, $label ) ); + wpuf()->ajax->send_error( + sprintf( + __( 'Minimum %d character is required for %s', 'wp-user-frontend' ), $restricted_num, $label + ) + ); } } elseif ( 'character' === $restriction_type && 'max' === $restriction_to ) { if ( strlen( $current_data ) > 0 && strlen( $current_data ) > $restricted_num ) { - $this->send_error( sprintf( __( 'Maximum %d character is allowed for %s', 'wp-user-frontend' ), $restricted_num, $label ) ); + wpuf()->ajax->send_error( + sprintf( + __( 'Maximum %d character is allowed for %s', 'wp-user-frontend' ), $restricted_num, $label + ) + ); } } // if restriction by word count if ( 'word' === $restriction_type && 'min' === $restriction_to ) { if ( str_word_count( $current_data ) > 0 && str_word_count( $current_data ) < $restricted_num ) { - $this->send_error( sprintf( __( 'Minimum %d word is required for %s', 'wp-user-frontend' ), $restricted_num, $label ) ); + wpuf()->ajax->send_error( + sprintf( + __( 'Minimum %d word is required for %s', 'wp-user-frontend' ), $restricted_num, $label + ) + ); } } elseif ( 'word' === $restriction_type && 'max' === $restriction_to ) { if ( str_word_count( $current_data ) > 0 && str_word_count( $current_data ) > $restricted_num ) { - $this->send_error( sprintf( __( 'Maximum %d word is allowed for %s', 'wp-user-frontend' ), $restricted_num, $label ) ); + wpuf()->ajax->send_error( + sprintf( + __( 'Maximum %d word is allowed for %s', 'wp-user-frontend' ), $restricted_num, $label + ) + ); + } + } + } + + $protected_shortcodes = wpuf_get_protected_shortcodes(); + + // check each form field for restricted shortcodes + foreach ( $this->form_fields as $single_field ) { + if ( empty( $single_field['rich'] ) || 'yes' !== $single_field['rich'] ) { + continue; + } + + $current_data = ! empty( $_POST[ $single_field['name'] ] ) ? sanitize_textarea_field( wp_unslash( $_POST[ $single_field['name'] ] ) ) : ''; + + foreach ( $protected_shortcodes as $shortcode ) { + $search_for = '[' . $shortcode; + if ( strpos( $current_data, $search_for ) !== false ) { + wpuf()->ajax->send_error( sprintf( __( 'Using %s as shortcode is restricted', 'wp-user-frontend' ), $shortcode ) ); } } } @@ -357,30 +114,29 @@ public function submit_post() { wp_delete_attachment( $attach_id, true ); } - list( $post_vars, $taxonomy_vars, $meta_vars ) = $this->get_input_fields( $this->form_fields ); + [ $post_vars, $taxonomy_vars, $meta_vars ] = $this->get_input_fields( $this->form_fields ); if ( ! isset( $_POST['post_id'] ) ) { - $has_limit = ( isset( $this->form_settings['limit_entries'] ) && $this->form_settings['limit_entries'] === 'true' ) ? true : false; + $has_limit = isset( $this->form_settings['limit_entries'] ) && $this->form_settings['limit_entries'] === 'true'; if ( $has_limit ) { $limit = (int) ! empty( $this->form_settings['limit_number'] ) ? $this->form_settings['limit_number'] : 0; $form_entries = wpuf_form_posts_count( $form_id ); if ( $limit && $limit <= $form_entries ) { - $this->send_error( $this->form_settings['limit_message'] ); + wpuf()->ajax->send_error( $this->form_settings['limit_message'] ); } } $this->on_edit_no_check_recaptcha( $post_vars ); } $is_update = false; - $post_author = null; - $default_post_author = wpuf_get_option( 'default_post_owner', 'wpuf_frontend_posting', 1 ); + // $default_post_author = wpuf_get_option( 'default_post_owner', 'wpuf_frontend_posting', 1 ); $post_author = $this->wpuf_get_post_user(); $allowed_tags = wp_kses_allowed_html( 'post' ); $postarr = [ - 'post_type' => $this->form_settings['post_type'], + 'post_type' => ! empty( $this->form_settings['post_type'] ) ? $this->form_settings['post_type'] : 'post', 'post_status' => isset( $this->form_settings['post_status'] ) ? $this->form_settings['post_status'] : 'publish', 'post_author' => $post_author, 'post_title' => isset( $_POST['post_title'] ) ? sanitize_text_field( wp_unslash( $_POST['post_title'] ) ) : '', @@ -390,7 +146,7 @@ public function submit_post() { // $charging_enabled = wpuf_get_option( 'charge_posting', 'wpuf_payment' ); $charging_enabled = ''; - $form = new WPUF_Form( $form_id ); + $form = new Form( $form_id ); $payment_options = $form->is_charging_enabled(); $ppp_cost_enabled = $form->is_enabled_pay_per_post(); $current_user = wpuf_get_user(); @@ -408,7 +164,7 @@ public function submit_post() { } //if date is set and assigned as publish date if ( isset( $_POST['wpuf_is_publish_time'] ) ) { - if ( isset( $_POST[ $_POST['wpuf_is_publish_time'] ] ) && ! empty( $_POST[ $_POST['wpuf_is_publish_time'] ] ) ) { + if ( ! empty( $_POST[ $_POST['wpuf_is_publish_time'] ] ) ) { // $postarr['post_date'] = date( 'Y-m-d H:i:s', strtotime( str_replace( array( ':', '/' ), '-', $_POST[$_POST['wpuf_is_publish_time']] ) ) ); $date_time = explode( ' ', sanitize_text_field( wp_unslash( ( $_POST[ $_POST['wpuf_is_publish_time'] ] ) ) ) ); @@ -425,7 +181,7 @@ public function submit_post() { } } - if ( isset( $_POST['category'] ) && is_array( $_POST['category'] ) ) { // WPCS: sanitization ok. + if ( isset( $_POST['category'] ) && is_array( $_POST['category'] ) ) { $category = isset( $_POST['category'] ) ? array_map( 'sanitize_text_field', wp_unslash( $_POST['category'] ) ) : []; } else { $category = isset( $_POST['category'] ) ? sanitize_text_field( wp_unslash( $_POST['category'] ) ) : ''; @@ -505,7 +261,7 @@ public function submit_post() { } if ( ! empty( $error ) ) { - $this->send_error( $error ); + wpuf()->ajax->send_error( $error ); } // ############ It's Time to Save the World ############### if ( $is_update ) { @@ -514,6 +270,8 @@ public function submit_post() { $postarr = apply_filters( 'wpuf_add_post_args', $postarr, $form_id, $this->form_settings, $this->form_fields ); } + $postarr = $this->adjust_thumbnail_id( $postarr ); + $post_id = wp_insert_post( $postarr, $wp_error = false ); // add post revision when post edit from the frontend @@ -531,7 +289,7 @@ public function submit_post() { } if ( $post_id ) { - self::update_post_meta( $meta_vars, $post_id ); + $this->update_post_meta( $meta_vars, $post_id ); // set the post form_id for later usage update_post_meta( $post_id, self::$config_id, $form_id ); // if user has a subscription pack @@ -575,48 +333,190 @@ public function submit_post() { wpuf_clear_buffer(); wp_send_json( $response ); } - $this->send_error( __( 'Something went wrong', 'wp-user-frontend' ) ); + wpuf()->ajax->send_error( __( 'Something went wrong', 'wp-user-frontend' ) ); } - public function wpuf_get_post_user() { - $nonce = isset( $_REQUEST['_wpnonce'] ) ? sanitize_key( wp_unslash( $_REQUEST['_wpnonce'] ) ) : ''; + public function send_mail_for_guest( $charging_enabled, $post_id, $form_id, $is_update, $post_author, $meta_vars ) { + global $wp; + check_ajax_referer( 'wpuf_form_add' ); + $show_message = false; + $redirect_to = false; + $response = []; + $page_id = isset( $_POST['page_id'] ) ? intval( wp_unslash( $_POST['page_id'] ) ) : ''; - if ( isset( $nonce ) && ! wp_verify_nonce( $nonce, 'wpuf_form_add' ) ) { - return; + if ( $is_update ) { + if ( $this->form_settings['edit_redirect_to'] === 'page' ) { + $redirect_to = get_permalink( $this->form_settings['edit_page_id'] ); + } elseif ( $this->form_settings['edit_redirect_to'] === 'url' ) { + $redirect_to = $this->form_settings['edit_url']; + } elseif ( $this->form_settings['edit_redirect_to'] === 'same' ) { + $redirect_to = add_query_arg( + [ + 'pid' => $post_id, + '_wpnonce' => wp_create_nonce( 'wpuf_edit' ), + 'msg' => 'post_updated', + ], + get_permalink( $page_id ) + ); + } else { + $redirect_to = get_permalink( $post_id ); + } + } else { + if ( $this->form_settings['redirect_to'] === 'page' ) { + $redirect_to = get_permalink( $this->form_settings['page_id'] ); + } elseif ( $this->form_settings['redirect_to'] === 'url' ) { + $redirect_to = $this->form_settings['url']; + } elseif ( $this->form_settings['redirect_to'] === 'same' ) { + $show_message = true; + } else { + $redirect_to = get_permalink( $post_id ); + } } - $default_post_author = wpuf_get_option( 'default_post_owner', 'wpuf_frontend_posting', 1 ); + if ( $charging_enabled === 'yes' && isset( $this->form_settings['enable_pay_per_post'] ) + && wpuf_validate_boolean( $this->form_settings['enable_pay_per_post'] ) + && ! $is_update + ) { + $redirect_to = add_query_arg( + [ + 'action' => 'wpuf_pay', + 'type' => 'post', + 'post_id' => $post_id, + ], + get_permalink( wpuf_get_option( 'payment_page', 'wpuf_payment' ) ) + ); + } - if ( ! is_user_logged_in() ) { - if ( isset( $this->form_settings['guest_post'] ) && $this->form_settings['guest_post'] === 'true' && $this->form_settings['guest_details'] === 'true' ) { - $guest_name = isset( $_POST['guest_name'] ) ? sanitize_text_field( wp_unslash( $_POST['guest_name'] ) ) : ''; + $response = [ + 'success' => true, + 'redirect_to' => $redirect_to, + 'show_message' => $show_message, + 'message' => $this->form_settings['message'], + ]; - $guest_email = isset( $_POST['guest_email'] ) ? sanitize_email( wp_unslash( $_POST['guest_email'] ) ) : ''; - $page_id = isset( $_POST['page_id'] ) ? sanitize_text_field( wp_unslash( $_POST['page_id'] ) ) : ''; + $guest_mode = isset( $this->form_settings['guest_post'] ) ? $this->form_settings['guest_post'] : ''; + $guest_verify = isset( $this->form_settings['guest_email_verify'] ) ? $this->form_settings['guest_email_verify'] : 'false'; - // is valid email? - if ( ! is_email( $guest_email ) ) { - $this->send_error( __( 'Invalid email address.', 'wp-user-frontend' ) ); - } + if ( $guest_mode === 'true' && $guest_verify === 'true' && ! is_user_logged_in() && $charging_enabled !== 'yes' ) { + $post_id_encoded = wpuf_encryption( $post_id ); + $form_id_encoded = wpuf_encryption( $form_id ); - // check if the user email already exists - $user = get_user_by( 'email', $guest_email ); + wpuf_send_mail_to_guest( $post_id_encoded, $form_id_encoded, 'no', 1 ); - if ( $user ) { - // $post_author = $user->ID; - wp_send_json( - [ - 'success' => false, - 'error' => __( "You already have an account in our site. Please login to continue.\n\nClicking 'OK' will redirect you to the login page and you will lose the form data.\nClick 'Cancel' to stay at this page.", 'wp-user-frontend' ), - 'type' => 'login', - 'redirect_to' => wp_login_url( get_permalink( $page_id ) ), - ] - ); - } else { + $response['show_message'] = true; + $response['redirect_to'] = add_query_arg( $wp->query_string, '', home_url( $wp->request ) ); + $response['message'] = __( 'Thank you for posting on our site. We have sent you an confirmation email. Please check your inbox!', 'wp-user-frontend' ); + } elseif ( $guest_mode === 'true' && $guest_verify === 'true' && ! is_user_logged_in() && $charging_enabled === 'yes' ) { + $post_id_encoded = wpuf_encryption( $post_id ); + $form_id_encoded = wpuf_encryption( $form_id ); + $response['show_message'] = true; + $response['redirect_to'] = add_query_arg( $wp->query_string, '', home_url( $wp->request ) ); + $response['message'] = __( 'Thank you for posting on our site. We have sent you an confirmation email. Please check your inbox!', 'wp-user-frontend' ); + + update_post_meta( $post_id, '_wpuf_payment_status', 'pending' ); + wpuf_send_mail_to_guest( $post_id_encoded, $form_id_encoded, 'yes', 2 ); + } + + if ( $guest_mode === 'true' && $guest_verify === 'true' && ! is_user_logged_in() ) { + $response = apply_filters( 'wpuf_edit_post_redirect', $response, $post_id, $form_id, $this->form_settings ); + } elseif ( $is_update ) { + //now perform some post related actions + do_action( 'wpuf_edit_post_after_update', $post_id, $form_id, $this->form_settings, $this->form_fields ); // plugin API to extend the functionality + + //send mail notification + if ( isset( $this->form_settings['notification'] ) && $this->form_settings['notification']['edit'] === 'on' ) { + $mail_body = $this->prepare_mail_body( $this->form_settings['notification']['edit_body'], $post_author, $post_id ); + $to = $this->prepare_mail_body( $this->form_settings['notification']['edit_to'], $post_author, $post_id ); + $subject = $this->prepare_mail_body( $this->form_settings['notification']['edit_subject'], $post_author, $post_id ); + $subject = wp_strip_all_tags( $subject ); + $mail_body = get_formatted_mail_body( $mail_body, $subject ); + $headers = [ 'Content-Type: text/html; charset=UTF-8' ]; + + wp_mail( $to, $subject, $mail_body, $headers ); + } + + //now redirect the user + $response = apply_filters( 'wpuf_edit_post_redirect', $response, $post_id, $form_id, $this->form_settings ); + } else { + // send mail notification + if ( isset( $this->form_settings['notification'] ) && $this->form_settings['notification']['new'] === 'on' ) { + $mail_body = $this->prepare_mail_body( $this->form_settings['notification']['new_body'], $post_author, $post_id ); + $to = $this->prepare_mail_body( $this->form_settings['notification']['new_to'], $post_author, $post_id ); + $subject = $this->prepare_mail_body( $this->form_settings['notification']['new_subject'], $post_author, $post_id ); + $subject = wp_strip_all_tags( $subject ); + $mail_body = get_formatted_mail_body( $mail_body, $subject ); + $headers = [ 'Content-Type: text/html; charset=UTF-8' ]; + + wp_mail( $to, $subject, $mail_body, $headers ); + } + + //redirect the user + $response = apply_filters( 'wpuf_add_post_redirect', $response, $post_id, $form_id, $this->form_settings ); + //now perform some post related actions. it should done after other action.either count related problem emerge + do_action( 'wpuf_add_post_after_insert', $post_id, $form_id, $this->form_settings, $meta_vars ); // plugin API to extend the functionality + + } + + return $response; + } + + public function wpuf_get_post_user() { + $nonce = isset( $_REQUEST['_wpnonce'] ) ? sanitize_key( wp_unslash( $_REQUEST['_wpnonce'] ) ) : ''; + + if ( isset( $nonce ) && ! wp_verify_nonce( $nonce, 'wpuf_form_add' ) ) { + return; + } + + $default_post_author = wpuf_get_option( 'default_post_owner', 'wpuf_frontend_posting', 1 ); + + if ( ! is_user_logged_in() ) { + if ( isset( $this->form_settings['guest_post'] ) && $this->form_settings['guest_post'] === 'true' && $this->form_settings['guest_details'] === 'true' ) { + $guest_name = isset( $_POST['guest_name'] ) ? sanitize_text_field( wp_unslash( $_POST['guest_name'] ) ) : ''; + + $guest_email = isset( $_POST['guest_email'] ) ? sanitize_email( wp_unslash( $_POST['guest_email'] ) ) : ''; + $page_id = isset( $_POST['page_id'] ) ? sanitize_text_field( wp_unslash( $_POST['page_id'] ) ) : ''; + + // is valid email? + if ( ! is_email( $guest_email ) ) { + echo json_encode( + [ + 'success' => false, + 'error' => __( 'Invalid email address.', 'wp-user-frontend' ), + ] + ); + + die(); + +// $this->send_error( __( 'Invalid email address.', 'wp-user-frontend' ) ); +// wp_send_json( +// [ +// 'success' => false, +// 'error' => __( "You already have an account in our site. Please login to continue.\n\nClicking 'OK' will redirect you to the login page and you will lose the form data.\nClick 'Cancel' to stay at this page.", 'wp-user-frontend' ), +// 'type' => 'login', +// 'redirect_to' => wp_login_url( get_permalink( $page_id ) ), +// ] +// ); + // wpuf()->ajax->send_error( __( 'Invalid email address.', 'wp-user-frontend' ) ); + } + + // check if the user email already exists + $user = get_user_by( 'email', $guest_email ); + + if ( $user ) { + // $post_author = $user->ID; + wp_send_json( + [ + 'success' => false, + 'error' => __( "You already have an account in our site. Please login to continue.\n\nClicking 'OK' will redirect you to the login page and you will lose the form data.\nClick 'Cancel' to stay at this page.", 'wp-user-frontend' ), + 'type' => 'login', + 'redirect_to' => wp_login_url( get_permalink( $page_id ) ), + ] + ); + } else { // user not found, lets register him // username from email address - $username = $this->guess_username( $guest_email ); + $username = wpuf_guess_username( $guest_email ); $user_pass = wp_generate_password( 12, false ); @@ -656,12 +556,12 @@ public function wpuf_get_post_user() { } elseif ( isset( $this->form_settings['guest_post'] ) && $this->form_settings['guest_post'] === 'true' && $this->form_settings['guest_details'] === 'false' ) { $post_author = $default_post_author; } elseif ( isset( $this->form_settings['guest_post'] ) && $this->form_settings['guest_post'] !== 'true' ) { - $this->send_error( $this->form_settings['message_restrict'] ); + wpuf()->ajax->send_error( $this->form_settings['message_restrict'] ); } // the user must be logged in already } elseif ( isset( $this->form_settings['role_base'] ) && $this->form_settings['role_base'] === 'true' && ! wpuf_user_has_roles( $this->form_settings['roles'] ) ) { - $this->send_error( __( 'You do not have sufficient permissions to access this form.', 'wp-user-frontend' ) ); + wpuf()->ajax->send_error( __( 'You do not have sufficient permissions to access this form.', 'wp-user-frontend' ) ); } else { $post_author = get_current_user_id(); } @@ -669,140 +569,56 @@ public function wpuf_get_post_user() { return $post_author; } - /** - * Add post shortcode handler - * - * @param array $atts - * @return string - */ - - public function add_post_shortcode( $atts ) { - add_filter( 'wpuf-form-fields', [ $this, 'add_field_settings' ] ); - - // @codingStandardsIgnoreStart - extract( shortcode_atts( [ 'id' => 0 ], $atts ) ); - - // @codingStandardsIgnoreEnd - ob_start(); - $form = new WPUF_Form( $id ); - $this->form_fields = $form->get_fields(); - $this->form_settings = $form->get_settings(); - $this->generate_auth_link(); // Translate tag %login% %registration% to login registartion url - list( $user_can_post, $info ) = $form->is_submission_open( $form, $this->form_settings ); - $info = apply_filters( 'wpuf_addpost_notice', $info, $id, $this->form_settings ); - $user_can_post = apply_filters( 'wpuf_can_post', $user_can_post, $id, $this->form_settings ); - - if ( $user_can_post === 'yes' ) { - $this->render_form( $id, null, $atts, $form ); - } else { - echo wp_kses_post( '
    ' . $info . '
    ' ); - } - $content = ob_get_contents(); - ob_end_clean(); - - return $content; - } - - public static function update_post_meta( $meta_vars, $post_id ) { - // check_ajax_referer( 'wpuf_form_add' ); - // prepare the meta vars - list( $meta_key_value, $multi_repeated, $files ) = self::prepare_meta_fields( $meta_vars ); - // set featured image if there's any - - // @codingStandardsIgnoreStart - $wpuf_files = isset( $_POST['wpuf_files'] ) ? $_POST['wpuf_files'] : []; - - if ( isset( $wpuf_files['featured_image'] ) ) { - $attachment_id = $wpuf_files['featured_image'][0]; - - wpuf_associate_attachment( $attachment_id, $post_id ); - set_post_thumbnail( $post_id, $attachment_id ); - - $file_data = isset( $_POST['wpuf_files_data'][ $attachment_id ] ) ? $_POST['wpuf_files_data'][ $attachment_id ] : false; - - // @codingStandardsIgnoreEnd - if ( $file_data ) { - $args = [ - 'ID' => $attachment_id, - 'post_title' => $file_data['title'], - 'post_content' => $file_data['desc'], - 'post_excerpt' => $file_data['caption'], - ]; - wpuf_update_post( $args ); - - update_post_meta( $attachment_id, '_wp_attachment_image_alt', $file_data['title'] ); - } - } - - // save all custom fields - foreach ( $meta_key_value as $meta_key => $meta_value ) { - update_post_meta( $post_id, $meta_key, $meta_value ); - } - - // save any multicolumn repeatable fields - foreach ( $multi_repeated as $repeat_key => $repeat_value ) { - // first, delete any previous repeatable fields - delete_post_meta( $post_id, $repeat_key ); - - // now add them - foreach ( $repeat_value as $repeat_field ) { - add_post_meta( $post_id, $repeat_key, $repeat_field ); - } - } - - // save any files attached - foreach ( $files as $file_input ) { - // delete any previous value - delete_post_meta( $post_id, $file_input['name'] ); - - $image_ids = ''; - - if ( count( $file_input['value'] ) > 1 ) { - $image_ids = $file_input['value']; - } - - if ( count( $file_input['value'] ) === 1 ) { - $image_ids = $file_input['value'][0]; - } + public function wpuf_user_subscription_pack( $form_settings, $post_id = null ) { - if ( ! empty( $image_ids ) ) { - add_post_meta( $post_id, $file_input['name'], $image_ids ); + // if user has a subscription pack + $user_wpuf_subscription_pack = get_user_meta( get_current_user_id(), '_wpuf_subscription_pack', true ); + $wpuf_user = wpuf_get_user(); + $user_subscription = new User_Subscription( $wpuf_user ); + if ( ! empty( $user_wpuf_subscription_pack ) && isset( $user_wpuf_subscription_pack['_enable_post_expiration'] ) + && isset( $user_wpuf_subscription_pack['expire'] ) && strtotime( $user_wpuf_subscription_pack['expire'] ) >= time() ) { + $expire_date = gmdate( 'Y-m-d', strtotime( '+' . $user_wpuf_subscription_pack['_post_expiration_time'] ) ); + update_post_meta( $post_id, $this->post_expiration_date, $expire_date ); + // save post status after expiration + $expired_post_status = $user_wpuf_subscription_pack['_expired_post_status']; + update_post_meta( $post_id, $this->expired_post_status, $expired_post_status ); + // if mail active + if ( isset( $user_wpuf_subscription_pack['_enable_mail_after_expired'] ) && $user_wpuf_subscription_pack['_enable_mail_after_expired'] === 'on' ) { + $post_expiration_message = $user_subscription->get_subscription_exp_msg( $user_wpuf_subscription_pack['pack_id'] ); + update_post_meta( $post_id, $this->post_expiration_message, $post_expiration_message ); } + } elseif ( ! empty( $user_wpuf_subscription_pack ) && isset( $user_wpuf_subscription_pack['expire'] ) && strtotime( $user_wpuf_subscription_pack['expire'] ) <= time() ) { + if ( isset( $form_settings['expiration_settings']['enable_post_expiration'] ) ) { + $expire_date = gmdate( 'Y-m-d', strtotime( '+' . $form_settings['expiration_settings']['expiration_time_value'] . ' ' . $form_settings['expiration_settings']['expiration_time_type'] . '' ) ); - //to track how many files are being uploaded - $file_numbers = 0; - - foreach ( $file_input['value'] as $attachment_id ) { - - //if file numbers are greated than allowed number, prevent it from being uploaded - if ( $file_numbers >= $file_input['count'] ) { - wp_delete_attachment( $attachment_id ); - continue; + update_post_meta( $post_id, $this->post_expiration_date, $expire_date ); + // save post status after expiration + $expired_post_status = $form_settings['expiration_settings']['expired_post_status']; + update_post_meta( $post_id, $this->expired_post_status, $expired_post_status ); + // if mail active + if ( isset( $form_settings['expiration_settings']['enable_mail_after_expired'] ) && $form_settings['expiration_settings']['enable_mail_after_expired'] === 'on' ) { + $post_expiration_message = $form_settings['expiration_settings']['post_expiration_message']; + update_post_meta( $post_id, $this->post_expiration_message, $post_expiration_message ); } - - wpuf_associate_attachment( $attachment_id, $post_id ); - //add_post_meta( $post_id, $file_input['name'], $attachment_id ); - - // file title, caption, desc update - - // @codingStandardsIgnoreStart - $file_data = isset( $_POST['wpuf_files_data'][ $attachment_id ] ) ? wp_unslash( $_POST['wpuf_files_data'][ $attachment_id ] ) : false; - - // @codingStandardsIgnoreEnd - if ( $file_data ) { - $args = [ - 'ID' => $attachment_id, - 'post_title' => $file_data['title'], - 'post_content' => $file_data['desc'], - 'post_excerpt' => $file_data['caption'], - ]; - wpuf_update_post( $args ); - - update_post_meta( $attachment_id, '_wp_attachment_image_alt', $file_data['title'] ); + } + } elseif ( empty( $user_wpuf_subscription_pack ) || $user_wpuf_subscription_pack === 'Cancel' || $user_wpuf_subscription_pack === 'cancel' ) { + if ( isset( $form_settings['expiration_settings']['enable_post_expiration'] ) ) { + $expire_date = gmdate( 'Y-m-d', strtotime( '+' . $form_settings['expiration_settings']['expiration_time_value'] . ' ' . $form_settings['expiration_settings']['expiration_time_type'] . '' ) ); + update_post_meta( $post_id, $this->post_expiration_date, $expire_date ); + // save post status after expiration + $expired_post_status = $form_settings['expiration_settings']['expired_post_status']; + update_post_meta( $post_id, $this->expired_post_status, $expired_post_status ); + // if mail active + if ( isset( $form_settings['expiration_settings']['enable_mail_after_expired'] ) && $form_settings['expiration_settings']['enable_mail_after_expired'] === 'on' ) { + $post_expiration_message = $form_settings['expiration_settings']['post_expiration_message']; + update_post_meta( $post_id, $this->post_expiration_message, $post_expiration_message ); } - $file_numbers++; } } + + //Handle featured item when edit + $sub_meta = $user_subscription->handle_featured_item( $post_id, $user_wpuf_subscription_pack ); + $user_subscription->update_meta( $sub_meta ); } public function prepare_mail_body( $content, $user_id, $post_id ) { @@ -826,7 +642,7 @@ public function prepare_mail_body( $content, $user_id, $post_id ) { $home_url = sprintf( '%s', home_url(), home_url() ); $post_url = sprintf( '%s', get_permalink( $post_id ), get_permalink( $post_id ) ); - $post_edit_link = sprintf( '%s', admin_url( 'post.php?action=edit&post=' . $post_id ), admin_url( 'post.php?action=edit&post=' . $post_id ) ); + $post_edit_link = sprintf( '%s', admin_url( 'post.php?action=edit&post=' . $post_id ), admin_url( 'post.php?action=edit&post=' . $post_id ) ); $post_field_replace = [ $post->post_title, @@ -852,7 +668,7 @@ public function prepare_mail_body( $content, $user_id, $post_id ) { // custom fields preg_match_all( '/%custom_([\w-]*)\b%/', $content, $matches ); - list( $search, $replace ) = $matches; + [ $search, $replace ] = $matches; if ( $replace ) { foreach ( $replace as $index => $meta_key ) { @@ -945,7 +761,7 @@ public function publish_guest_post() { $form_id = wpuf_decryption( $fid ); $form_settings = wpuf_get_form_settings( $form_id ); $payment_status = new WPUF_Subscription(); - $form = new WPUF_Form( $form_id ); + $form = new Form( $form_id ); $pay_per_post = $form->is_enabled_pay_per_post(); if ( $form->is_charging_enabled() && $pay_per_post ) { @@ -982,182 +798,6 @@ public function publish_guest_post() { do_action( 'wpuf_guest_post_email_verified', $post_id ); } - public function wpuf_user_subscription_pack( $form_settings, $post_id = null ) { - - // if user has a subscription pack - $user_wpuf_subscription_pack = get_user_meta( get_current_user_id(), '_wpuf_subscription_pack', true ); - $wpuf_user = wpuf_get_user(); - $user_subscription = new WPUF_User_Subscription( $wpuf_user ); - if ( ! empty( $user_wpuf_subscription_pack ) && isset( $user_wpuf_subscription_pack['_enable_post_expiration'] ) - && isset( $user_wpuf_subscription_pack['expire'] ) && strtotime( $user_wpuf_subscription_pack['expire'] ) >= time() ) { - $expire_date = gmdate( 'Y-m-d', strtotime( '+' . $user_wpuf_subscription_pack['_post_expiration_time'] ) ); - update_post_meta( $post_id, $this->post_expiration_date, $expire_date ); - // save post status after expiration - $expired_post_status = $user_wpuf_subscription_pack['_expired_post_status']; - update_post_meta( $post_id, $this->expired_post_status, $expired_post_status ); - // if mail active - if ( isset( $user_wpuf_subscription_pack['_enable_mail_after_expired'] ) && $user_wpuf_subscription_pack['_enable_mail_after_expired'] === 'on' ) { - $post_expiration_message = $user_subscription->get_subscription_exp_msg( $user_wpuf_subscription_pack['pack_id'] ); - update_post_meta( $post_id, $this->post_expiration_message, $post_expiration_message ); - } - } elseif ( ! empty( $user_wpuf_subscription_pack ) && isset( $user_wpuf_subscription_pack['expire'] ) && strtotime( $user_wpuf_subscription_pack['expire'] ) <= time() ) { - if ( isset( $form_settings['expiration_settings']['enable_post_expiration'] ) ) { - $expire_date = gmdate( 'Y-m-d', strtotime( '+' . $form_settings['expiration_settings']['expiration_time_value'] . ' ' . $form_settings['expiration_settings']['expiration_time_type'] . '' ) ); - - update_post_meta( $post_id, $this->post_expiration_date, $expire_date ); - // save post status after expiration - $expired_post_status = $form_settings['expiration_settings']['expired_post_status']; - update_post_meta( $post_id, $this->expired_post_status, $expired_post_status ); - // if mail active - if ( isset( $form_settings['expiration_settings']['enable_mail_after_expired'] ) && $form_settings['expiration_settings']['enable_mail_after_expired'] === 'on' ) { - $post_expiration_message = $form_settings['expiration_settings']['post_expiration_message']; - update_post_meta( $post_id, $this->post_expiration_message, $post_expiration_message ); - } - } - } elseif ( empty( $user_wpuf_subscription_pack ) || $user_wpuf_subscription_pack === 'Cancel' || $user_wpuf_subscription_pack === 'cancel' ) { - if ( isset( $form_settings['expiration_settings']['enable_post_expiration'] ) ) { - $expire_date = gmdate( 'Y-m-d', strtotime( '+' . $form_settings['expiration_settings']['expiration_time_value'] . ' ' . $form_settings['expiration_settings']['expiration_time_type'] . '' ) ); - update_post_meta( $post_id, $this->post_expiration_date, $expire_date ); - // save post status after expiration - $expired_post_status = $form_settings['expiration_settings']['expired_post_status']; - update_post_meta( $post_id, $this->expired_post_status, $expired_post_status ); - // if mail active - if ( isset( $form_settings['expiration_settings']['enable_mail_after_expired'] ) && $form_settings['expiration_settings']['enable_mail_after_expired'] === 'on' ) { - $post_expiration_message = $form_settings['expiration_settings']['post_expiration_message']; - update_post_meta( $post_id, $this->post_expiration_message, $post_expiration_message ); - } - } - } - - //Handle featured item when edit - $sub_meta = $user_subscription->handle_featured_item( $post_id, $user_wpuf_subscription_pack ); - $user_subscription->update_meta( $sub_meta ); - } - - public function send_mail_for_guest( $charging_enabled, $post_id, $form_id, $is_update, $post_author, $meta_vars ) { - global $wp; - check_ajax_referer( 'wpuf_form_add' ); - $show_message = false; - $redirect_to = false; - $response = []; - $page_id = isset( $_POST['page_id'] ) ? intval( wp_unslash( $_POST['page_id'] ) ) : ''; - - if ( $is_update ) { - if ( $this->form_settings['edit_redirect_to'] === 'page' ) { - $redirect_to = get_permalink( $this->form_settings['edit_page_id'] ); - } elseif ( $this->form_settings['edit_redirect_to'] === 'url' ) { - $redirect_to = $this->form_settings['edit_url']; - } elseif ( $this->form_settings['edit_redirect_to'] === 'same' ) { - $redirect_to = add_query_arg( - [ - 'pid' => $post_id, - '_wpnonce' => wp_create_nonce( 'wpuf_edit' ), - 'msg' => 'post_updated', - ], - get_permalink( $page_id ) - ); - } else { - $redirect_to = get_permalink( $post_id ); - } - } else { - if ( $this->form_settings['redirect_to'] === 'page' ) { - $redirect_to = get_permalink( $this->form_settings['page_id'] ); - } elseif ( $this->form_settings['redirect_to'] === 'url' ) { - $redirect_to = $this->form_settings['url']; - } elseif ( $this->form_settings['redirect_to'] === 'same' ) { - $show_message = true; - } else { - $redirect_to = get_permalink( $post_id ); - } - } - - if ( $charging_enabled === 'yes' && isset( $this->form_settings['enable_pay_per_post'] ) - && wpuf_validate_boolean( $this->form_settings['enable_pay_per_post'] ) - && ! $is_update - ) { - $redirect_to = add_query_arg( - [ - 'action' => 'wpuf_pay', - 'type' => 'post', - 'post_id' => $post_id, - ], - get_permalink( wpuf_get_option( 'payment_page', 'wpuf_payment' ) ) - ); - } - - $response = [ - 'success' => true, - 'redirect_to' => $redirect_to, - 'show_message' => $show_message, - 'message' => $this->form_settings['message'], - ]; - - $guest_mode = isset( $this->form_settings['guest_post'] ) ? $this->form_settings['guest_post'] : ''; - $guest_verify = isset( $this->form_settings['guest_email_verify'] ) ? $this->form_settings['guest_email_verify'] : 'false'; - - if ( $guest_mode === 'true' && $guest_verify === 'true' && ! is_user_logged_in() && $charging_enabled !== 'yes' ) { - $post_id_encoded = wpuf_encryption( $post_id ); - $form_id_encoded = wpuf_encryption( $form_id ); - - wpuf_send_mail_to_guest( $post_id_encoded, $form_id_encoded, 'no', 1 ); - - $response['show_message'] = true; - $response['redirect_to'] = add_query_arg( $wp->query_string, '', home_url( $wp->request ) ); - $response['message'] = __( 'Thank you for posting on our site. We have sent you an confirmation email. Please check your inbox!', 'wp-user-frontend' ); - } elseif ( $guest_mode === 'true' && $guest_verify === 'true' && ! is_user_logged_in() && $charging_enabled === 'yes' ) { - $post_id_encoded = wpuf_encryption( $post_id ); - $form_id_encoded = wpuf_encryption( $form_id ); - $response['show_message'] = true; - $response['redirect_to'] = add_query_arg( $wp->query_string, '', home_url( $wp->request ) ); - $response['message'] = __( 'Thank you for posting on our site. We have sent you an confirmation email. Please check your inbox!', 'wp-user-frontend' ); - - update_post_meta( $post_id, '_wpuf_payment_status', 'pending' ); - wpuf_send_mail_to_guest( $post_id_encoded, $form_id_encoded, 'yes', 2 ); - } - - if ( $guest_mode === 'true' && $guest_verify === 'true' && ! is_user_logged_in() ) { - $response = apply_filters( 'wpuf_edit_post_redirect', $response, $post_id, $form_id, $this->form_settings ); - } elseif ( $is_update ) { - //now perform some post related actions - do_action( 'wpuf_edit_post_after_update', $post_id, $form_id, $this->form_settings, $this->form_fields ); // plugin API to extend the functionality - - //send mail notification - if ( isset( $this->form_settings['notification'] ) && $this->form_settings['notification']['edit'] === 'on' ) { - $mail_body = $this->prepare_mail_body( $this->form_settings['notification']['edit_body'], $post_author, $post_id ); - $to = $this->prepare_mail_body( $this->form_settings['notification']['edit_to'], $post_author, $post_id ); - $subject = $this->prepare_mail_body( $this->form_settings['notification']['edit_subject'], $post_author, $post_id ); - $subject = wp_strip_all_tags( $subject ); - $mail_body = get_formatted_mail_body( $mail_body, $subject ); - $headers = [ 'Content-Type: text/html; charset=UTF-8' ]; - - wp_mail( $to, $subject, $mail_body, $headers ); - } - - //now redirect the user - $response = apply_filters( 'wpuf_edit_post_redirect', $response, $post_id, $form_id, $this->form_settings ); - } else { - // send mail notification - if ( isset( $this->form_settings['notification'] ) && $this->form_settings['notification']['new'] === 'on' ) { - $mail_body = $this->prepare_mail_body( $this->form_settings['notification']['new_body'], $post_author, $post_id ); - $to = $this->prepare_mail_body( $this->form_settings['notification']['new_to'], $post_author, $post_id ); - $subject = $this->prepare_mail_body( $this->form_settings['notification']['new_subject'], $post_author, $post_id ); - $subject = wp_strip_all_tags( $subject ); - $mail_body = get_formatted_mail_body( $mail_body, $subject ); - $headers = [ 'Content-Type: text/html; charset=UTF-8' ]; - - wp_mail( $to, $subject, $mail_body, $headers ); - } - - //redirect the user - $response = apply_filters( 'wpuf_add_post_redirect', $response, $post_id, $form_id, $this->form_settings ); - //now perform some post related actions. it should done after other action.either count related problem emerge - do_action( 'wpuf_add_post_after_insert', $post_id, $form_id, $this->form_settings, $meta_vars ); // plugin API to extend the functionality - - } - - return $response; - } - /** * Enable edit post link for post authors * @@ -1280,7 +920,7 @@ public function send_mail_to_admin_after_guest_mail_verified() { return; } - $form = new WPUF_Form( $form_id ); + $form = new Form( $form_id ); if ( empty( $form->data ) ) { return; diff --git a/class/upload.php b/includes/Ajax/Upload_Ajax.php similarity index 81% rename from class/upload.php rename to includes/Ajax/Upload_Ajax.php index 297f67865..887e50fca 100644 --- a/class/upload.php +++ b/includes/Ajax/Upload_Ajax.php @@ -1,22 +1,13 @@ $file_name . '-' . $hash . '.' . $file_extension, + 'name' => $file_name . '.' . $file_extension, 'type' => $wpuf_file['type'], 'tmp_name' => $wpuf_file['tmp_name'], 'error' => $wpuf_file['error'], 'size' => $wpuf_file['size'], ]; - header( 'Content-Type: text/html; charset=' . get_option( 'blog_charset' ) ); - $attach = $this->handle_upload( $upload ); - if ( $attach['success'] ) { $response = [ 'success' => true ]; - if ( $image_only ) { $image_size = wpuf_get_option( 'insert_photo_size', 'wpuf_frontend_posting', 'thumbnail' ); $image_type = wpuf_get_option( 'insert_photo_type', 'wpuf_frontend_posting', 'link' ); - /** * Filter upload image size for response * @@ -117,7 +87,6 @@ public function upload_file( $image_only = false ) { * @param string $field_type */ $image_size = apply_filters( 'wpuf_upload_response_image_size', $image_size, $form_id, $field_type ); - /** * Filter upload image type for response * @@ -128,7 +97,6 @@ public function upload_file( $image_only = false ) { * @param string $field_type */ $image_type = apply_filters( 'wpuf_upload_response_image_type', $image_type, $form_id, $field_type ); - if ( $image_type == 'link' ) { $response['html'] = wp_get_attachment_link( $attach['attach_id'], $image_size ); } else { @@ -137,7 +105,6 @@ public function upload_file( $image_only = false ) { } else { $response['html'] = self::attach_html( $attach['attach_id'], $field_type, $form_id ); } - echo wp_kses( $response['html'], [ 'li' => [ @@ -174,7 +141,6 @@ public function upload_file( $image_only = false ) { } else { wp_send_json_error( $attach['error'], 200 ); } - exit; } @@ -187,58 +153,50 @@ public function upload_file( $image_only = false ) { */ public function handle_upload( $upload_data ) { $check_duplicate = $this->duplicate_upload( $upload_data ); - if ( isset( $check_duplicate['duplicate'] ) && $check_duplicate['duplicate'] ) { return [ - 'success' => true, + 'success' => true, 'attach_id' => $check_duplicate['duplicate'], ]; } - $uploaded_file = wp_handle_upload( $upload_data, [ 'test_form' => false ] ); - // If the wp_handle_upload call returned a local path for the image if ( isset( $uploaded_file['file'] ) ) { $file_loc = $uploaded_file['file']; $file_name = basename( $upload_data['name'] ); $upload_hash = md5( $upload_data['name'] . $upload_data['size'] ); $file_type = wp_check_filetype( $file_name ); - $attachment = [ 'post_mime_type' => $file_type['type'], 'post_title' => preg_replace( '/\.[^.]+$/', '', basename( $file_name ) ), 'post_content' => '', 'post_status' => 'inherit', ]; - $attach_id = wp_insert_attachment( $attachment, $file_loc ); $attach_data = wp_generate_attachment_metadata( $attach_id, $file_loc ); wp_update_attachment_metadata( $attach_id, $attach_data ); update_post_meta( $attach_id, 'wpuf_file_hash', $upload_hash ); return [ - 'success' => true, + 'success' => true, 'attach_id' => $attach_id, ]; } return [ 'success' => false, - 'error' => $uploaded_file['error'], + 'error' => $uploaded_file['error'], ]; } - public static function attach_html( $attach_id, $type = null, $form_id = null ) { + public static function attach_html( $attach_id, $type = NULL, $form_id = NULL ) { if ( ! $type ) { $type = isset( $_GET['type'] ) ? sanitize_text_field( wp_unslash( $_GET['type'] ) ) : 'image'; } - $attachment = get_post( $attach_id ); - if ( ! $attachment ) { return; } - if ( wp_attachment_is_image( $attach_id ) ) { /** * Filter upload image size for response @@ -250,13 +208,11 @@ public static function attach_html( $attach_id, $type = null, $form_id = null ) * @param string $field_type */ $image_size = apply_filters( 'wpuf_upload_response_image_size', 'thumbnail', $form_id, $type ); - $image = wp_get_attachment_image_src( $attach_id, $image_size ); $image = $image[0]; } else { $image = wp_mime_type_icon( $attach_id ); } - /** * Filter uploaded image class names for the reponse * @@ -264,24 +220,40 @@ public static function attach_html( $attach_id, $type = null, $form_id = null ) * * @param array $class_names */ - $attachment_class_names = apply_filters( 'wpuf_upload_response_image_class_names', [ 'wpuf-attachment-image' ] ); + $attachment_class_names = apply_filters( + 'wpuf_upload_response_image_class_names', [ 'wpuf-attachment-image' ] + ); $attachment_class_names = implode( ' ', $attachment_class_names ); - $html = '
  • '; - $html .= sprintf( '
    %s
    ', $image, esc_attr( $attachment->post_title ), esc_attr( $attachment_class_names ) ); - + $html .= sprintf( + '
    %s
    ', $image, + esc_attr( $attachment->post_title ), esc_attr( $attachment_class_names ) + ); if ( wpuf_get_option( 'image_caption', 'wpuf_frontend_posting', 'off' ) == 'on' ) { $html .= '
    '; - $html .= sprintf( '', $attach_id, esc_attr( $attachment->post_title ), __( 'Title', 'wp-user-frontend' ) ); - $html .= sprintf( '', $attach_id, __( 'Caption', 'wp-user-frontend' ), esc_textarea( $attachment->post_excerpt ) ); - $html .= sprintf( '', $attach_id, __( 'Description', 'wp-user-frontend' ), esc_textarea( $attachment->post_content ) ); + $html .= sprintf( + '', $attach_id, + esc_attr( $attachment->post_title ), __( 'Title', 'wp-user-frontend' ) + ); + $html .= sprintf( + '', $attach_id, + __( 'Caption', 'wp-user-frontend' ), esc_textarea( $attachment->post_excerpt ) + ); + $html .= sprintf( + '', $attach_id, + __( 'Description', 'wp-user-frontend' ), esc_textarea( $attachment->post_content ) + ); $html .= '
    '; } - $html .= sprintf( '', $type, $attach_id ); $html .= '
    '; - $html .= sprintf( ' ', $attach_id, WPUF_ASSET_URI . '/images/del-img.png' ); - $html .= sprintf( ' ', WPUF_ASSET_URI . '/images/move-img.png' ); + $html .= sprintf( + ' ', $attach_id, + WPUF_ASSET_URI . '/images/del-img.png' + ); + $html .= sprintf( + ' ', WPUF_ASSET_URI . '/images/move-img.png' + ); $html .= '
    '; $html .= '
  • '; @@ -290,28 +262,27 @@ public static function attach_html( $attach_id, $type = null, $form_id = null ) public function delete_file() { check_ajax_referer( 'wpuf_nonce', 'nonce' ); - $post_data = wp_unslash( $_POST ); - $attachment_id = isset( $post_data['attach_id'] ) ? absint( $post_data['attach_id'] ) : 0; - if ( empty( $attachment_id ) ) { wp_send_json_error( [ 'message' => __( 'attach_id is required.', 'wp-user-frontend' ) ], 422 ); } - $attachment = get_post( $attachment_id ); + if ( empty( $attachment ) ) { + wp_send_json_error( [ 'message' => __( 'attachment not found.', 'wp-user-frontend' ) ] ); + } + // post author or editor role - if ( get_current_user_id() == absint( $attachment->post_author ) || current_user_can( 'delete_private_pages' ) ) { + if ( get_current_user_id() == absint( $attachment->post_author ) || current_user_can( + 'delete_private_pages' + ) ) { $deleted = wp_delete_attachment( $attachment_id, true ); - if ( $deleted ) { wp_send_json_success( [ 'message' => __( 'Attachment deleted successfully.', 'wp-user-frontend' ) ] ); } - wp_send_json_error( [ 'message' => __( 'Could not deleted the attachment', 'wp-user-frontend' ) ], 422 ); } - wp_send_json_error( [ 'message' => __( 'Something went wrong.', 'wp-user-frontend' ) ], 422 ); } @@ -337,12 +308,12 @@ public function insert_image() { */ function duplicate_upload( $file ) { global $wpdb; - $upload_hash = md5( $file['name'] . $file['size'] ); - - $sql = $wpdb->prepare( "SELECT post_id FROM $wpdb->postmeta m JOIN $wpdb->posts p ON p.ID = m.post_id WHERE m.meta_key = 'wpuf_file_hash' AND m.meta_value = %s AND p.post_status != 'trash' LIMIT 1;", $upload_hash ); + $sql = $wpdb->prepare( + "SELECT post_id FROM $wpdb->postmeta m JOIN $wpdb->posts p ON p.ID = m.post_id WHERE m.meta_key = 'wpuf_file_hash' AND m.meta_value = %s AND p.post_status != 'trash' LIMIT 1;", + $upload_hash + ); $match = $wpdb->get_var( $sql ); - if ( $match ) { $file['duplicate'] = $match; } diff --git a/includes/Assets.php b/includes/Assets.php new file mode 100644 index 000000000..9a8bafd3a --- /dev/null +++ b/includes/Assets.php @@ -0,0 +1,372 @@ +suffix = defined( 'SCRIPT_DEBUG' ) && SCRIPT_DEBUG ? '' : '.min'; + $this->scheme = is_ssl() ? 'https' : 'http'; + $this->form_builder_css_deps = apply_filters( + 'wpuf_form_builder_css_deps', + [ + 'wpuf-frontend-forms', + 'wpuf-font-awesome', + 'wpuf-sweetalert2', + 'wpuf-selectize', + 'wpuf-toastr', + 'wpuf-tooltip', + 'buttons', + ] + ); + add_action( 'init', [ $this, 'register_all_scripts' ] ); + } + + /** + * Register all the css and js from here + * + * @since 4.0.0 + * + * @return void + */ + public function register_all_scripts() { + $styles = $this->get_styles(); + $scripts = $this->get_scripts(); + do_action( 'wpuf_before_register_scripts', $scripts, $styles ); + $this->register_styles( $styles ); + $this->register_scripts( $scripts ); + do_action( 'wpuf_after_register_scripts', $scripts, $styles ); + } + + /** + * Register the CSS from here. Need to define the JS first from get_styles() + * + * @since 4.0.0 + * + * @return void + */ + public function register_styles( $styles ) { + foreach ( $styles as $handle => $style ) { + $deps = ! empty( $style['deps'] ) ? $style['deps'] : []; + $version = ! empty( $style['version'] ) ? $style['version'] : WPUF_VERSION; + $media = ! empty( $style['media'] ) ? $style['media'] : 'all'; + + wp_register_style( 'wpuf-' . $handle, $style['src'], $deps, $version, $media ); + } + } + + /** + * Register the JS from here. Need to define the JS first from get_scripts() + * + * @since 4.0.0 + * + * @return void + */ + public function register_scripts( $scripts ) { + foreach ( $scripts as $handle => $script ) { + $deps = ! empty( $script['deps'] ) ? $script['deps'] : []; + $in_footer = ! empty( $script['in_footer'] ) ? $script['in_footer'] : true; + $version = ! empty( $script['version'] ) ? $script['version'] : WPUF_VERSION; + + wp_register_script( 'wpuf-' . $handle, $script['src'], $deps, $version, $in_footer ); + } + } + + /** + * Returns the list of styles + * + * @since 4.0.0 + * + * @return mixed|null + */ + public function get_styles() { + $styles = [ + 'frontend-forms' => [ + 'src' => WPUF_ASSET_URI . '/css/frontend-forms.css', + ], + 'layout1' => [ + 'src' => WPUF_ASSET_URI . '/css/frontend-form/layout1.css', + ], + 'layout2' => [ + 'src' => WPUF_ASSET_URI . '/css/frontend-form/layout2.css', + ], + 'layout3' => [ + 'src' => WPUF_ASSET_URI . '/css/frontend-form/layout3.css', + ], + 'layout4' => [ + 'src' => WPUF_ASSET_URI . '/css/frontend-form/layout4.css', + ], + 'layout5' => [ + 'src' => WPUF_ASSET_URI . '/css/frontend-form/layout5.css', + ], + 'jquery-ui' => [ + 'src' => WPUF_ASSET_URI . '/css/jquery-ui-1.9.1.custom.css', + 'version' => '1.9.1', + ], + 'sweetalert2' => [ + 'src' => WPUF_ASSET_URI . '/vendor/sweetalert2/dist/sweetalert2.css', + 'version' => '11.4.19', + ], + 'font-awesome' => [ + 'src' => WPUF_ASSET_URI . '/vendor/font-awesome/css/font-awesome.min.css', + 'version' => '4.7.0', + ], + 'selectize' => [ + 'src' => WPUF_ASSET_URI . '/vendor/selectize/css/selectize.default.css', + 'version' => '0.12.4', + ], + 'toastr' => [ + 'src' => WPUF_ASSET_URI . '/vendor/toastr/toastr.min.css', + 'version' => '2.1.3', + ], + 'tooltip' => [ + 'src' => WPUF_ASSET_URI . '/vendor/tooltip/tooltip.css', + 'version' => '3.3.7', + ], + 'form-builder' => [ + 'src' => WPUF_ASSET_URI . '/css/wpuf-form-builder.css', + 'deps' => $this->form_builder_css_deps, + ], + 'admin' => [ + 'src' => WPUF_ASSET_URI . '/css/admin.css', + ], + 'registration-forms' => [ + 'src' => WPUF_ASSET_URI . '/css/registration-forms.css', + ], + 'module' => [ + 'src' => WPUF_ASSET_URI . '/css/admin/wpuf-module.css', + ], + 'swiffy-slider' => [ + 'src' => WPUF_ASSET_URI . '/vendor/swiffy-slider/swiffy-slider.min.css', + 'version' => '1.6.0', + ], + 'setup' => [ + 'src' => WPUF_ASSET_URI . '/css/admin/wpuf-setup.css', + 'deps' => [ 'dashicons', 'install' ], + ], + 'whats-new' => [ + 'src' => WPUF_ASSET_URI . '/css/admin/whats-new.css', + ], + ]; + + return apply_filters( 'wpuf_styles_to_register', $styles ); + } + + /** + * Returns the list of JS + * + * @since 4.0.0 + * + * @return mixed|null + */ + public function get_scripts() { + $this->scheme = is_ssl() ? 'https' : 'http'; + $api_key = wpuf_get_option( 'gmap_api_key', 'wpuf_general' ); + $form_builder_js_deps = apply_filters( + 'wpuf_form_builder_js_deps', + [ + 'jquery', + 'jquery-ui-sortable', + 'jquery-ui-draggable', + 'jquery-ui-droppable', + 'jquery-ui-resizable', + 'underscore', + 'wpuf-vue', + 'wpuf-vuex', + 'wpuf-sweetalert2', + 'wpuf-jquery-scrollTo', + 'wpuf-selectize', + 'wpuf-toastr', + 'wpuf-clipboard', + 'wpuf-tooltip', + ] + ); + $scripts = [ + 'vue' => [ + 'src' => WPUF_ASSET_URI . '/vendor/vue/vue' . $this->suffix . '.js', + 'in_footer' => true, + 'version' => '2.2.4', + ], + 'vuex' => [ + 'src' => WPUF_ASSET_URI . '/vendor/vuex/vuex' . $this->suffix . '.js', + 'in_footer' => true, + 'version' => '2.2.1', + ], + 'sweetalert2' => [ + 'src' => WPUF_ASSET_URI . '/vendor/sweetalert2/dist/sweetalert2' . $this->suffix . '.js', + 'in_footer' => true, + 'version' => '11.4.19', + 'deps' => [ 'jquery' ], + ], + 'jquery-scrollTo' => [ + 'src' => WPUF_ASSET_URI . '/vendor/jquery.scrollTo/jquery.scrollTo' . $this->suffix . '.js', + 'in_footer' => true, + 'deps' => [ 'jquery' ], + 'version' => '11.4.19', + ], + 'selectize' => [ + 'src' => WPUF_ASSET_URI . '/vendor/selectize/js/standalone/selectize' . $this->suffix . '.js', + 'in_footer' => true, + 'deps' => [ 'jquery' ], + 'version' => '0.12.4', + ], + 'toastr' => [ + 'src' => WPUF_ASSET_URI . '/vendor/toastr/toastr' . $this->suffix . '.js', + 'in_footer' => true, + 'version' => '2.1.3', + ], + 'clipboard' => [ + 'src' => WPUF_ASSET_URI . '/vendor/clipboard/clipboard' . $this->suffix . '.js', + 'in_footer' => true, + 'version' => '1.6.0', + ], + 'tooltip' => [ + 'src' => WPUF_ASSET_URI . '/vendor/tooltip/tooltip' . $this->suffix . '.js', + 'in_footer' => true, + 'version' => '3.3.7', + ], + 'form-builder-mixins' => [ + 'src' => WPUF_ASSET_URI . '/js/wpuf-form-builder-mixins.js', + 'deps' => $form_builder_js_deps, + 'in_footer' => true, + ], + 'form-builder-components' => [ + 'src' => WPUF_ASSET_URI . '/js/wpuf-form-builder-components.js', + 'deps' => [ 'wpuf-form-builder-mixins' ], + 'in_footer' => true, + ], + 'form-builder' => [ + 'src' => WPUF_ASSET_URI . '/js/wpuf-form-builder.js', + 'deps' => [ 'wpuf-form-builder-components' ], + 'in_footer' => true, + ], + 'admin' => [ + 'src' => WPUF_ASSET_URI . '/js/wpuf-admin.js', + 'deps' => [ 'jquery' ], + ], + 'subscriptions' => [ + 'src' => WPUF_ASSET_URI . '/js/subscriptions.js', + 'deps' => [ 'jquery' ], + 'in_footer' => true, + ], + 'timepicker' => [ + 'src' => WPUF_ASSET_URI . '/js/jquery-ui-timepicker-addon.js', + 'deps' => [ 'jquery-ui-datepicker' ], + 'version' => '1.2', + ], + 'form-builder-wpuf-forms' => [ + 'src' => WPUF_ASSET_URI . '/js/wpuf-form-builder-wpuf-forms.js', + 'deps' => [ 'jquery', 'underscore', 'wpuf-vue', 'wpuf-vuex' ], + 'in_footer' => true, + ], + 'registration-forms' => [ + 'src' => WPUF_ASSET_URI . '/js/registration-forms.js', + 'deps' => [ 'jquery' ], + 'in_footer' => true, + ], + 'module' => [ + 'src' => WPUF_ASSET_URI . '/js/admin/wpuf-module.js', + 'deps' => [ 'wpuf-swiffy-slider', 'wpuf-swiffy-slider-extensions' ], + 'in_footer' => true, + ], + 'swiffy-slider' => [ + 'src' => WPUF_ASSET_URI . '/vendor/swiffy-slider/swiffy-slider.min.js', + 'deps' => [ 'jquery' ], + 'version' => '1.6.0', + 'in_footer' => true, + ], + 'swiffy-slider-extensions' => [ + 'src' => WPUF_ASSET_URI . '/vendor/swiffy-slider/swiffy-slider-extensions.min.js', + 'deps' => [ 'jquery' ], + 'version' => '1.6.0', + 'in_footer' => true, + ], + 'admin-shortcode' => [ + 'src' => WPUF_ASSET_URI . '/js/admin-shortcode.js', + 'deps' => [ 'jquery' ], + ], + 'billing-address' => [ + 'src' => WPUF_ASSET_URI . '/js/billing-address.js', + 'deps' => [ 'jquery' ], + ], + 'metabox-tabs' => [ + 'src' => WPUF_ASSET_URI . '/js/metabox-tabs.js', + 'deps' => [ 'jquery' ], + ], + 'admin-tools' => [ + 'src' => WPUF_ASSET_URI . '/js/wpuf-admin-tools.js', + 'deps' => [ 'jquery', 'wpuf-vue' ], + ], + 'settings' => [ + 'src' => WPUF_ASSET_URI . '/js/admin/settings.js', + ], + 'ajax-script' => [ + 'src' => WPUF_ASSET_URI . '/js/billing-address.js', + 'deps' => [ 'jquery' ], + ], + 'jquery-blockui' => [ + 'src' => WPUF_ASSET_URI . '/js/jquery-blockui/jquery.blockUI.min.js', + 'deps' => [ 'jquery' ], + 'version' => '2.70', + ], + 'selectWoo' => [ + 'src' => WPUF_ASSET_URI . '/js/selectWoo/selectWoo.full.min.js', + 'deps' => [ 'jquery' ], + 'version' => '1.0.1', + ], + 'enhanced-select' => [ + 'src' => WPUF_ASSET_URI . '/js/admin/wpuf-enhanced-select' . $this->suffix . '.min.js', + 'deps' => [ 'jquery', 'selectWoo' ], + ], + 'setup' => [ + 'src' => WPUF_ASSET_URI . '/js/admin/wpuf-setup' . $this->suffix . '.js', + 'deps' => [ 'jquery', 'wpuf-enhanced-select', 'jquery-blockui' ], + ], + 'frontend-form' => [ + 'src' => WPUF_ASSET_URI . '/js/frontend-form' . $this->suffix . '.js', + 'deps' => [ 'jquery' ], + ], + 'upload' => [ + 'src' => WPUF_ASSET_URI . '/js/upload' . $this->suffix . '.js', + 'deps' => [ 'jquery', 'plupload-handlers', 'jquery-ui-sortable' ], + ], + 'ajax_login' => [ + 'src' => WPUF_ASSET_URI . '/js/wpuf-login-widget.js', + 'deps' => [ 'jquery' ], + ], + ]; + + if ( ! empty( $api_key ) ) { + $scripts['google-maps'] = [ + 'src' => $this->scheme . '://maps.google.com/maps/api/js?libraries=places&key=' . $api_key, + ]; + } + + return apply_filters( 'wpuf_scripts_to_register', $scripts ); + } +} diff --git a/includes/countries-state.php b/includes/Data/Country_State.php similarity index 99% rename from includes/countries-state.php rename to includes/Data/Country_State.php index ba7eb8397..7dce603a4 100644 --- a/includes/countries-state.php +++ b/includes/Data/Country_State.php @@ -1,8 +1,10 @@ '', 'auth_salt' => '', ]; $auth_keys = get_option( 'wpuf_auth_keys', $defaults ); - if ( empty( $auth_keys['auth_key'] ) || empty( $auth_keys['auth_salt'] ) ) { // check for saved key $key = random_bytes( self::get_encryption_key_length() ); $auth_keys['auth_key'] = base64_encode( $key ); // phpcs:ignore - // check for saved nonce $nonce = random_bytes( self::get_encryption_nonce_length() ); $auth_keys['auth_salt'] = base64_encode( $nonce ); // phpcs:ignore - update_option( 'wpuf_auth_keys', $auth_keys ); } diff --git a/includes/fields/class-abstract-fields.php b/includes/Fields/Field_Contract.php similarity index 93% rename from includes/fields/class-abstract-fields.php rename to includes/Fields/Field_Contract.php index d45eef720..eea6862fe 100755 --- a/includes/fields/class-abstract-fields.php +++ b/includes/Fields/Field_Contract.php @@ -1,11 +1,13 @@ get_field_seperator(), $value ); } else { $entry_value = trim( $value ); } @@ -903,4 +905,50 @@ public function check_content_restriction_func( $content_limit, $rich_text, $fie __( 'Are you sure?', 'wp-user-frontend' ), + 'delete_it' => __( 'Yes, delete it', 'wp-user-frontend' ), + 'cancel_it' => __( 'No, cancel it', 'wp-user-frontend' ), + 'ajaxurl' => admin_url( 'admin-ajax.php' ), + 'nonce' => wp_create_nonce( 'wpuf_nonce' ), + 'plupload' => [ + 'url' => admin_url( 'admin-ajax.php' ) . '?nonce=' . wp_create_nonce( + 'wpuf-upload-nonce' + ), + 'flash_swf_url' => includes_url( 'js/plupload/plupload.flash.swf' ), + 'filters' => [ + [ + 'title' => __( 'Allowed Files', 'wp-user-frontend' ), + 'extensions' => '*', + ], + ], + 'multipart' => true, + 'urlstream_upload' => true, + 'warning' => __( 'Maximum number of files reached!', 'wp-user-frontend' ), + 'size_error' => __( + 'The file you have uploaded exceeds the file size limit. Please try again.', + 'wp-user-frontend' + ), + 'type_error' => __( + 'You have uploaded an incorrect file type. Please try again.', 'wp-user-frontend' + ), + ], + ] + ); + } } diff --git a/includes/fields/class-field-checkbox.php b/includes/Fields/Form_Field_Checkbox.php similarity index 98% rename from includes/fields/class-field-checkbox.php rename to includes/Fields/Form_Field_Checkbox.php index a4a54288f..948d469a1 100755 --- a/includes/fields/class-field-checkbox.php +++ b/includes/Fields/Form_Field_Checkbox.php @@ -1,9 +1,11 @@ name = __( 'Checkbox', 'wp-user-frontend' ); diff --git a/includes/fields/class-field-column.php b/includes/Fields/Form_Field_Column.php similarity index 59% rename from includes/fields/class-field-column.php rename to includes/Fields/Form_Field_Column.php index 4bde94280..32d576f29 100644 --- a/includes/fields/class-field-column.php +++ b/includes/Fields/Form_Field_Column.php @@ -1,9 +1,11 @@ name = __( 'Columns', 'wp-user-frontend' ); @@ -27,8 +29,15 @@ public function render( $field_settings, $form_id, $type = 'post', $post_id = nu $columns_size = $field_settings['inner_columns_size']; $column_space = $field_settings['column_space']; $inner_fields = $field_settings['inner_fields']; - $atts = []; ?> -
  • + $id = ! empty( $field_settings['id'] ) ? $field_settings['id'] : 0; + $atts = []; + $input_type = 'column_field'; + $class_names = ! empty( $field_settings['css'] ) ? ' ' . $field_settings['css'] : ''; + $class_names .= ' wpuf_' . $input_type . '_' . $id . '_' . esc_attr( $form_id ); + printf( + '
  • ', esc_attr( $input_type ), esc_attr( $class_names ), 'wpuf-column-field' + ); + ?>
    @@ -91,7 +100,26 @@ public function get_options_settings() { ], ]; - return apply_filters( 'wpuf_text_field_option_settings', $options ); + if ( is_wpuf_post_form_builder() ) { + $options[] = + [ + 'name' => 'wpuf_visibility', + 'title' => __( 'Visibility', 'wp-user-frontend' ), + 'type' => 'visibility', + 'section' => 'advanced', + 'options' => [ + 'everyone' => __( 'Everyone', 'wp-user-frontend' ), + 'hidden' => __( 'Hidden', 'wp-user-frontend' ), + 'logged_in' => __( 'Logged in users only', 'wp-user-frontend' ), + 'subscribed_users' => __( 'Subscription users only', 'wp-user-frontend' ), + ], + 'priority' => 30, + 'inline' => true, + 'help_text' => __( 'Select option', 'wp-user-frontend' ), + ]; + } + + return apply_filters( 'wpuf_column_field_option_settings', $options ); } /** @@ -100,28 +128,28 @@ public function get_options_settings() { * @return array */ public function get_field_props() { - $props = [ - 'input_type' => 'column_field', - 'template' => $this->get_type(), - 'id' => 0, - 'is_new' => true, - 'is_meta' => 'no', - 'columns' => 3, - 'min_column' => 1, - 'max_column' => 3, - 'column_space' => '5', - 'inner_fields' => [ - 'column-1' => [], - 'column-2' => [], - 'column-3' => [], + return [ + 'input_type' => 'column_field', + 'template' => $this->get_type(), + 'id' => 0, + 'is_new' => true, + 'is_meta' => 'no', + 'columns' => 3, + 'min_column' => 1, + 'max_column' => 3, + 'column_space' => '5', + 'inner_fields' => [ + 'column-1' => [], + 'column-2' => [], + 'column-3' => [], ], 'inner_columns_size' => [ - 'column-1' => '33.33%', - 'column-2' => '33.33%', - 'column-3' => '33.33%', + 'column-1' => '33.33%', + 'column-2' => '33.33%', + 'column-3' => '33.33%', ], + 'wpuf_cond' => $this->default_conditional_prop(), + 'wpuf_visibility' => $this->get_default_visibility_prop(), ]; - - return $props; } } diff --git a/includes/fields/class-field-dropdown.php b/includes/Fields/Form_Field_Dropdown.php similarity index 98% rename from includes/fields/class-field-dropdown.php rename to includes/Fields/Form_Field_Dropdown.php index 08babbe08..e10a1d6aa 100755 --- a/includes/fields/class-field-dropdown.php +++ b/includes/Fields/Form_Field_Dropdown.php @@ -1,9 +1,11 @@ name = __( 'Dropdown', 'wp-user-frontend' ); diff --git a/includes/fields/class-field-email.php b/includes/Fields/Form_Field_Email.php similarity index 98% rename from includes/fields/class-field-email.php rename to includes/Fields/Form_Field_Email.php index 4f3161d99..2bc5b1b9f 100755 --- a/includes/fields/class-field-email.php +++ b/includes/Fields/Form_Field_Email.php @@ -1,9 +1,11 @@ name = __( 'Email Address', 'wp-user-frontend' ); diff --git a/includes/fields/class-field-featured-image.php b/includes/Fields/Form_Field_Featured_Image.php similarity index 95% rename from includes/fields/class-field-featured-image.php rename to includes/Fields/Form_Field_Featured_Image.php index d48c41fd8..4a22582d3 100755 --- a/includes/fields/class-field-featured-image.php +++ b/includes/Fields/Form_Field_Featured_Image.php @@ -1,9 +1,13 @@ name = __( 'Featured Image', 'wp-user-frontend' ); @@ -22,6 +26,8 @@ public function __construct() { * @return void */ public function render( $field_settings, $form_id, $type = 'post', $post_id = null ) { + $this->enqueue_file_upload_scripts(); + $has_featured_image = false; $unique_id = sprintf( '%s-%d', $field_settings['name'], $form_id ); @@ -32,8 +38,8 @@ public function render( $field_settings, $form_id, $type = 'post', $post_id = nu $thumb_id = get_post_thumbnail_id( $post_id ); if ( $thumb_id ) { - $featured_image = WPUF_Upload::attach_html( $thumb_id, 'featured_image' ); - $has_featured_image=true; + $featured_image = Upload_Ajax::attach_html( $thumb_id, 'featured_image' ); + $has_featured_image = true; } } diff --git a/includes/fields/class-field-html.php b/includes/Fields/Form_Field_HTML.php similarity index 96% rename from includes/fields/class-field-html.php rename to includes/Fields/Form_Field_HTML.php index 035f34f17..d0d0504a8 100755 --- a/includes/fields/class-field-html.php +++ b/includes/Fields/Form_Field_HTML.php @@ -1,9 +1,11 @@ name = __( 'Custom HTML', 'wp-user-frontend' ); diff --git a/includes/fields/class-field-hidden.php b/includes/Fields/Form_Field_Hidden.php similarity index 96% rename from includes/fields/class-field-hidden.php rename to includes/Fields/Form_Field_Hidden.php index 41530f1aa..25ee6b3fa 100755 --- a/includes/fields/class-field-hidden.php +++ b/includes/Fields/Form_Field_Hidden.php @@ -1,9 +1,11 @@ name = __( 'Hidden Field', 'wp-user-frontend' ); diff --git a/includes/fields/class-field-image.php b/includes/Fields/Form_Field_Image.php similarity index 96% rename from includes/fields/class-field-image.php rename to includes/Fields/Form_Field_Image.php index b6191230f..a18969d91 100755 --- a/includes/fields/class-field-image.php +++ b/includes/Fields/Form_Field_Image.php @@ -1,9 +1,13 @@ name = __( 'Image Upload', 'wp-user-frontend' ); @@ -22,6 +26,8 @@ public function __construct() { * @return void */ public function render( $field_settings, $form_id, $type = 'post', $post_id = null ) { + $this->enqueue_file_upload_scripts(); + $has_images = false; if ( isset( $post_id ) && $post_id !== 0 ) { @@ -57,7 +63,7 @@ public function render( $field_settings, $form_id, $type = 'post', $post_id = nu diff --git a/includes/fields/class-field-multidropdown.php b/includes/Fields/Form_Field_MultiDropdown.php similarity index 97% rename from includes/fields/class-field-multidropdown.php rename to includes/Fields/Form_Field_MultiDropdown.php index a7d58ec88..578a37cd2 100755 --- a/includes/fields/class-field-multidropdown.php +++ b/includes/Fields/Form_Field_MultiDropdown.php @@ -1,9 +1,11 @@ name = __( 'Multi Select', 'wp-user-frontend' ); @@ -109,7 +111,7 @@ public function prepare_entry( $field ) { foreach ( $entry_value as $option_key ) { $new_val[] = isset( $field['options'][$option_key] ) ? $field['options'][$option_key] : ''; } - $entry_value = implode( WP_User_Frontend::$field_separator, $new_val ); + $entry_value = implode( wpuf()->get_field_seperator(), $new_val ); } else { $entry_value = ''; } diff --git a/includes/fields/class-field-numeric.php b/includes/Fields/Form_Field_Numeric.php similarity index 89% rename from includes/fields/class-field-numeric.php rename to includes/Fields/Form_Field_Numeric.php index a79e88c6d..c5c9a7f5a 100755 --- a/includes/fields/class-field-numeric.php +++ b/includes/Fields/Form_Field_Numeric.php @@ -1,7 +1,9 @@ name = __( 'Numeric Field', 'wp-user-frontend' ); diff --git a/includes/fields/class-field-post-content.php b/includes/Fields/Form_Field_Post_Content.php similarity index 98% rename from includes/fields/class-field-post-content.php rename to includes/Fields/Form_Field_Post_Content.php index 663e0cb14..06f2d8de3 100755 --- a/includes/fields/class-field-post-content.php +++ b/includes/Fields/Form_Field_Post_Content.php @@ -1,9 +1,11 @@ name = __( 'Post Content', 'wp-user-frontend' ); diff --git a/includes/fields/class-field-post-excerpt.php b/includes/Fields/Form_Field_Post_Excerpt.php similarity index 98% rename from includes/fields/class-field-post-excerpt.php rename to includes/Fields/Form_Field_Post_Excerpt.php index af9ddd4bb..51b8f963a 100755 --- a/includes/fields/class-field-post-excerpt.php +++ b/includes/Fields/Form_Field_Post_Excerpt.php @@ -1,6 +1,9 @@ name = __( 'Post Excerpt', 'wp-user-frontend' ); diff --git a/includes/fields/class-field-post-tags.php b/includes/Fields/Form_Field_Post_Tags.php similarity index 90% rename from includes/fields/class-field-post-tags.php rename to includes/Fields/Form_Field_Post_Tags.php index d3b2ab46c..97355bfc3 100755 --- a/includes/fields/class-field-post-tags.php +++ b/includes/Fields/Form_Field_Post_Tags.php @@ -1,6 +1,9 @@ name = __( 'Tags', 'wp-user-frontend' ); @@ -29,7 +32,11 @@ public function render( $field_settings, $form_id, $type = 'post', $post_id = nu $value = implode( ', ', $tagsarray ); } else { $value = $field_settings['default']; - } ?> + } + + $query_string = '?action=wpuf_ajax_tag_search&tax=post_tag'; + $query_string .= '&nonce=' . wp_create_nonce( 'wpuf_ajax_tag_search' ); + ?>
  • print_list_attributes( $field_settings ); ?>> @@ -54,7 +61,7 @@ class="textfield ;(function($) { $(document).ready( function(){ - $('li.tags input[name=tags]').suggest( wpuf_frontend.ajaxurl + '?action=wpuf-ajax-tag-search&tax=post_tag', { delay: 500, minchars: 2, multiple: true, multipleSep: ', ' } ); + $('li.tags input[name=tags]').suggest( wpuf_frontend.ajaxurl + '', { delay: 500, minchars: 2, multiple: true, multipleSep: ', ' } ); }); })(jQuery); diff --git a/includes/fields/class-field-post-taxonomy.php b/includes/Fields/Form_Field_Post_Taxonomy.php similarity index 94% rename from includes/fields/class-field-post-taxonomy.php rename to includes/Fields/Form_Field_Post_Taxonomy.php index d46b59ec4..be5a45ac5 100755 --- a/includes/fields/class-field-post-taxonomy.php +++ b/includes/Fields/Form_Field_Post_Taxonomy.php @@ -1,7 +1,15 @@ name = __( $tax_name, 'wp-user-frontend' ); + $this->name = __( ucfirst( $tax_name ), 'wp-user-frontend' ); $this->input_type = 'taxonomy'; $this->tax_name = $tax_name; // $this->taxonomy=$taxonomy; @@ -99,7 +107,7 @@ public function render( $field_settings, $form_id, $type = 'post', $post_id = nu case 'text': $post_id = null; - $this->tax_input( $post_id ); + $this->tax_input( $post_id, $field_settings ); break; default: // code... @@ -195,7 +203,6 @@ public function RecursiveCatWrite( $tree ) { } } - public function tax_ajax( $post_id = null ) { $taxonomy = $this->field_settings['name']; if ( isset( $post_id ) ) { @@ -402,9 +409,9 @@ public function tax_multiselect( $post_id = null ) { echo str_replace( 'field_settings; - $query_string = '?action=wpuf-ajax-tag-search&tax=' . $attr['name']; + $query_string = '?action=wpuf_ajax_tag_search&tax=' . $attr['name']; if ( 'child_of' === $this->exclude_type ) { $exclude = wpuf_get_field_settings_excludes( $this->field_settings, $this->exclude_type ); @@ -414,7 +421,7 @@ public function tax_input( $post_id = null ) { ?> - required_html5( $attr ); ?> name="" value="terms ) ); ?>" size="40" /> + required_html5( $attr ); ?> name="" value="terms ) ); ?>" size="40" /> diff --git a/includes/free/form-element.php b/includes/Free/Form_Element.php similarity index 97% rename from includes/free/form-element.php rename to includes/Free/Form_Element.php index 39a34d677..f2ca13789 100644 --- a/includes/free/form-element.php +++ b/includes/Free/Form_Element.php @@ -1,7 +1,11 @@

    - %post_title%, %post_content%, %post_excerpt%, %tags%, %category%, + %post_title%, %post_content%, %post_excerpt%, %tags%, %category%, @@ -325,8 +329,8 @@ public static function render_registration_form() { $name = ucwords( str_replace( '_', ' ', $input_field['template'] ) ); // @codingStandardsIgnoreStart - WPUF_Admin_Template_Profile::$input_field['template']( $count, $name, $input_field ); - + Template_Profile::$input_field['template']( $count, $name, $input_field ); + // @codingStandardsIgnoreEnd $count++; @@ -375,11 +379,11 @@ public static function render_registration_settings() { $label ) { - printf( - '', - esc_attr( $role ), - esc_attr( selected( $role_selected, $role, false ) ), - esc_attr( $label ) + printf( + '', + esc_attr( $role ), + esc_attr( selected( $role_selected, $role, false ) ), + esc_attr( $label ) ); } ?> @@ -434,11 +438,11 @@ public static function render_registration_settings() { ]); foreach ( $pages as $page ) { - printf( - '', - esc_attr( $page->ID ), - esc_attr( selected( $page_id, $page->ID, false ) ), - esc_attr( $page->post_title ) + printf( + '', + esc_attr( $page->ID ), + esc_attr( selected( $page_id, $page->ID, false ) ), + esc_attr( $page->post_title ) ); } ?> diff --git a/includes/free/loader.php b/includes/Free/Free_Loader.php similarity index 83% rename from includes/free/loader.php rename to includes/Free/Free_Loader.php index 10233f1d7..d3afd2670 100644 --- a/includes/free/loader.php +++ b/includes/Free/Free_Loader.php @@ -1,8 +1,13 @@ includes(); $this->instantiate(); - add_action( 'add_meta_boxes_wpuf_forms', [$this, 'add_meta_box_post'], 99 ); + add_action( 'add_meta_boxes_wpuf_forms', [ $this, 'add_meta_box_post' ], 99 ); add_action( 'wpuf_form_buttons_custom', [ $this, 'wpuf_form_buttons_custom_runner' ] ); - add_action( 'wpuf_form_buttons_other', [ $this, 'wpuf_form_buttons_other_runner'] ); - add_action( 'wpuf_form_post_expiration', [ $this, 'wpuf_form_post_expiration_runner'] ); - add_action( 'wpuf_form_setting', [ $this, 'form_setting_runner' ], 10, 2 ); - add_action( 'wpuf_form_settings_post_notification', [ $this, 'post_notification_hook_runner'] ); + add_action( 'wpuf_form_buttons_other', [ $this, 'wpuf_form_buttons_other_runner' ] ); add_action( 'wpuf_edit_form_area_profile', [ $this, 'wpuf_edit_form_area_profile_runner' ] ); - add_action( 'registration_setting', [$this, 'registration_setting_runner'] ); + add_action( 'registration_setting', [ $this, 'registration_setting_runner' ] ); add_action( 'wpuf_check_post_type', [ $this, 'wpuf_check_post_type_runner' ], 10, 2 ); add_action( 'wpuf_form_custom_taxonomies', [ $this, 'wpuf_form_custom_taxonomies_runner' ] ); add_action( 'wpuf_conditional_field_render_hook', [ $this, 'wpuf_conditional_field_render_hook_runner' ], 10, 3 ); - //subscription - add_action( 'wpuf_admin_subscription_detail', [$this, 'wpuf_admin_subscription_detail_runner'], 10, 4 ); - //coupon - add_action( 'wpuf_coupon_settings_form', [$this, 'wpuf_coupon_settings_form_runner'], 10, 1 ); - add_action( 'wpuf_check_save_permission', [$this, 'wpuf_check_save_permission_runner'], 10, 2 ); + add_action( 'wpuf_coupon_settings_form', [ $this, 'wpuf_coupon_settings_form_runner' ] ); + add_action( 'wpuf_check_save_permission', [ $this, 'wpuf_check_save_permission_runner' ], 10, 2 ); // admin menu - add_action( 'wpuf_admin_menu_top', [$this, 'admin_menu_top'] ); - add_action( 'wpuf_admin_menu', [$this, 'admin_menu'] ); + add_action( 'wpuf_admin_menu', [ $this, 'admin_menu' ] ); + add_action( 'wpuf_admin_menu_top', [ $this, 'admin_menu_top' ] ); + add_action( 'wpuf_form_setting', [ $this, 'form_setting_runner' ], 10, 2 ); + add_action( 'wpuf_form_post_expiration', [ $this, 'wpuf_form_post_expiration_runner' ] ); + add_action( 'wpuf_form_settings_post_notification', [ $this, 'post_notification_hook_runner' ] ); // plugin settings - add_action( 'admin_footer', [$this, 'remove_login_from_settings'] ); add_filter( 'wpuf_settings_sections', [ $this, 'pro_sections' ] ); add_filter( 'wpuf_settings_fields', [ $this, 'pro_settings' ] ); // post form templates - add_action( 'wpuf_get_post_form_templates', [$this, 'post_form_templates'] ); - add_filter( 'wpuf_get_pro_form_previews', [$this, 'pro_form_previews'] ); + add_filter( 'wpuf_get_post_form_templates', [ $this, 'post_form_templates' ] ); + add_filter( 'wpuf_get_pro_form_previews', [ $this, 'pro_form_previews' ] ); // payment gateway added for previewing add_filter( 'wpuf_payment_gateways', [ $this, 'wpuf_payment_gateways' ] ); // navigation tabs added for previewing in Subscription > Add/Edit Subscription add_action( 'wpuf_admin_subs_nav_tab', [ $this, 'subscription_tabs' ] ); - add_action( 'wpuf_admin_subs_nav_content', [ $this, 'subscription_tab_contents' ]); + add_action( 'wpuf_admin_subs_nav_content', [ $this, 'subscription_tab_contents' ] ); + + // subscription + add_action( 'wpuf_admin_subscription_detail', [ $this, 'wpuf_admin_subscription_detail_runner' ], 10, 4 ); } public function includes() { - - //class files to include pro elements - require_once __DIR__ . '/form.php'; - require_once __DIR__ . '/form-element.php'; - require_once __DIR__ . '/subscription.php'; - require_once __DIR__ . '/edit-profile.php'; - require_once __DIR__ . '/edit-user.php'; + // class files to include pro elements + require_once WPUF_INCLUDES . '/functions/user/edit-user.php'; } public function instantiate() { - $this->edit_profile = new WPUF_Edit_Profile(); + $this->edit_profile = new Edit_Profile(); if ( is_admin() ) { /** - * Conditionally load the free loader + * Conditionally load the Free loader * * @since 2.5.7 * @@ -81,133 +80,81 @@ public function instantiate() { } public function admin_menu_top() { - $capability = wpuf_admin_role(); - $parent_slug = 'wp-user-frontend'; - - add_submenu_page( $parent_slug, __( 'Registration Forms', 'wp-user-frontend' ), __( 'Registration Forms', 'wp-user-frontend' ), $capability, 'wpuf-profile-forms', [$this, 'admin_reg_forms_page'] ); - $modules = add_submenu_page( $parent_slug, __( 'Modules', 'wp-user-frontend' ), __( 'Modules', 'wp-user-frontend' ), $capability, 'wpuf-modules', [ $this, 'modules_preview_page' ] ); - add_action( 'wpuf_modules_page_contents', [ $this, 'load_modules_scripts' ] ); - add_action( 'wpuf_modules_page_contents', [ $this, 'modules_page_contents' ] ); - } - - public function admin_menu() { - if ( 'on' == wpuf_get_option( 'enable_payment', 'wpuf_payment', 'on' ) ) { - $capability = wpuf_admin_role(); - add_submenu_page( 'wp-user-frontend', __( 'Coupons', 'wp-user-frontend' ), __( 'Coupons', 'wp-user-frontend' ), $capability, 'wpuf_coupon', [$this, 'admin_coupon_page' ] ); - } + $capability = wpuf_admin_role(); + $reg_forms_hook = add_submenu_page( + wpuf()->admin->menu->parent_slug, + __( 'Registration Forms', 'wp-user-frontend' ), + __( 'Registration Forms', 'wp-user-frontend' ), + $capability, + 'wpuf-profile-forms', + [ $this, 'admin_reg_forms_page' ] + ); + $modules = add_submenu_page( wpuf()->admin->menu->parent_slug, __( 'Modules', 'wp-user-frontend' ), __( 'Modules', 'wp-user-frontend' ), $capability, 'wpuf-modules', [ $this, 'modules_preview_page' ] ); + + // add this menu to all menu hooks + wpuf()->admin->menu->add_submenu_hooks( 'registration_forms', $reg_forms_hook ); + wpuf()->admin->menu->add_submenu_hooks( 'modules', $modules ); + + add_action( "load-$reg_forms_hook", [ $this, 'reg_form_menu_action' ] ); + add_action( "load-$modules", [ $this, 'module_menu_action' ] ); + + add_action( 'wpuf_load_module_page', [ $this, 'load_modules_scripts' ] ); + add_action( 'wpuf_load_module_page', [ $this, 'modules_page_contents' ] ); } - public function admin_reg_forms_page() { - ?> -

    -
    -

    -

    - [wpuf-registration]' ); ?> -

    -

    - - - - -

    -
    -
    -

    - -

    - user registration and profile editing.', 'wp-user-frontend' ) ); ?> -

    - -
      -
    • - - -
    • -
    • - - -
    • -
    • - - -
    • -
    - -

    - - -

    -
    -
    - - - -

    - -
    -

    - -

    - -

    - -

    - -

    - - -

    -
    - - id == 'user-frontend_page_wpuf-settings' ) { - ?> - - admin->menu->parent_slug, + __( 'Coupons', 'wp-user-frontend' ), + __( 'Coupons', 'wp-user-frontend' ), + $capability, + 'wpuf_coupon', + [ $this, 'admin_coupon_page' ], + 4 + ); } } - public function settings_login_prompt( $fields ) { - - // $new_field = array( - // 'name' => 'something', - // 'label' => __( 'Pro Feature', 'wpuf' ), - // 'desc' => 'These Features are ' . self::get_pro_prompt_text() . ' Only.', - // 'type' => 'html', - // ); - - // array_unshift( $fields['wpuf_profile'], $new_field ); + public function admin_reg_forms_page() { + $file_location = __DIR__ . '/templates/page-registration-form.php'; - return $fields; + wpuf_require_once( $file_location ); } /** - * The pro settings preview on the free version + * The pro settings preview on the Free version * * @since 3.6.0 * - * @param $settings_fields + * @param $sections * * @return array */ @@ -262,7 +209,7 @@ public function pro_sections( $sections ) { } /** - * The pro settings preview on the free version + * The pro settings preview on the Free version * * @since 3.6.0 * @@ -286,7 +233,7 @@ public function pro_settings( $settings_fields ) { 'name' => 'ipstack_key', 'label' => __( 'Ipstack API Key', 'wp-user-frontend' ) . ' ' . file_get_contents( $crown_icon_path ) . '', - 'desc' => __( 'Register here to get your free ipstack api key', + 'desc' => __( 'Register here to get your Free ipstack api key', 'wp-user-frontend' ), 'class' => 'pro-preview', 'is_pro_preview' => true, @@ -307,7 +254,7 @@ public function pro_settings( $settings_fields ) { 'desc' => __( 'Allow user to update their profile information from the account page', 'wp-user-frontend' ), 'type' => 'checkbox', - 'default' => 'on', + 'default' => 'off', 'class' => 'pro-preview', 'is_pro_preview' => true, ]; @@ -327,7 +274,7 @@ public function pro_settings( $settings_fields ) { 'label' => __( 'Avatar Size', 'wp-user-frontend' ) . ' ' . file_get_contents( $crown_icon_path ) . '', 'desc' => __( 'Avatar size to crop when upload using the registration/profile form.(e.g:100x100)', - 'wpuf' ), + 'wp-user-frontend' ), 'type' => 'text', 'default' => '100x100', 'class' => 'pro-preview', @@ -877,59 +824,58 @@ public function show_banner_metabox() { } public function wpuf_form_buttons_custom_runner() { - //add formbuilder widget pro buttons - WPUF_form_element::add_form_custom_buttons(); + Form_Element::add_form_custom_buttons(); } public function wpuf_form_buttons_other_runner() { - WPUF_form_element::add_form_other_buttons(); + Form_Element::add_form_other_buttons(); } public function wpuf_form_post_expiration_runner() { - WPUF_form_element::render_form_expiration_tab(); + Form_Element::render_form_expiration_tab(); } public function form_setting_runner( $form_settings, $post ) { - WPUF_form_element::add_form_settings_content( $form_settings, $post ); + Form_Element::add_form_settings_content( $form_settings, $post ); } public function post_notification_hook_runner() { - WPUF_form_element::add_post_notification_content(); + Form_Element::add_post_notification_content(); } public function wpuf_edit_form_area_profile_runner() { - WPUF_form_element::render_registration_form(); + Form_Element::render_registration_form(); } public function registration_setting_runner() { - WPUF_form_element::render_registration_settings(); + Form_Element::render_registration_settings(); } public function wpuf_check_post_type_runner( $post, $update ) { - WPUF_form_element::check_post_type( $post, $update ); + Form_Element::check_post_type( $post, $update ); } public function wpuf_form_custom_taxonomies_runner() { - WPUF_form_element::render_custom_taxonomies_element(); + Form_Element::render_custom_taxonomies_element(); } public function wpuf_conditional_field_render_hook_runner( $field_id, $con_fields, $obj ) { - WPUF_form_element::render_conditional_field( $field_id, $con_fields, $obj ); + Form_Element::render_conditional_field( $field_id, $con_fields, $obj ); } //subscription public function wpuf_admin_subscription_detail_runner( $sub_meta, $hidden_recurring_class, $hidden_trial_class, $obj ) { - WPUF_subscription_element::add_subscription_element( $sub_meta, $hidden_recurring_class, $hidden_trial_class, $obj ); + Subscription_Element::add_subscription_element( $sub_meta, $hidden_recurring_class, $hidden_trial_class, $obj ); } //coupon public function wpuf_coupon_settings_form_runner( $obj ) { - WPUF_Coupon_Elements::add_coupon_elements( $obj ); + Coupon_Elements::add_coupon_elements( $obj ); } public function wpuf_check_save_permission_runner( $post, $update ) { - WPUF_Coupon_Elements::check_saving_capability( $post, $update ); + Coupon_Elements::check_saving_capability( $post, $update ); } /** @@ -942,11 +888,8 @@ public function wpuf_check_save_permission_runner( $post, $update ) { * @return array */ public function post_form_templates( $integrations ) { - require_once __DIR__ . '/post-form-templates/woocommerce.php'; - require_once __DIR__ . '/post-form-templates/the_events_calendar.php'; - - $integrations['WPUF_Post_Form_Template_WooCommerce'] = new WPUF_Post_Form_Template_WooCommerce(); - $integrations['WPUF_Post_Form_Template_Events_Calendar'] = new WPUF_Post_Form_Template_Events_Calendar(); + $integrations['post_form_template_woocommerce'] = new Post_Form_Template_WooCommerce(); + $integrations['post_form_template_events_calendar'] = new Post_Form_Template_Events_Calendar(); return $integrations; } @@ -961,9 +904,9 @@ public function post_form_templates( $integrations ) { * @return array */ public function pro_form_previews( $integrations ) { - include_once __DIR__ . '/post-form-templates/easy_digital_download.php'; + // include_once __DIR__ . '/post-form-templates/WPUF_Pro_Form_Preview_EDD.php'; - $integrations['WPUF_Pro_Form_Preview_EDD'] = new WPUF_Pro_Form_Preview_EDD(); + $integrations['WPUF_Pro_Form_Preview_EDD'] = new Pro_Form_Preview_EDD(); return $integrations; } @@ -977,7 +920,155 @@ public function pro_form_previews( $integrations ) { */ public function modules_preview_page() { $modules = $this->pro_modules_info(); - do_action( 'wpuf_modules_page_contents', $modules ); + + $diamond_icon = file_exists( WPUF_ROOT . '/assets/images/diamond.svg' ) ? file_get_contents( WPUF_ROOT . '/assets/images/diamond.svg' ) : ''; + $check_icon = file_exists( WPUF_ROOT . '/assets/images/check.svg' ) ? file_get_contents( WPUF_ROOT . '/assets/images/check.svg' ) : ''; + $crown_icon = file_exists( WPUF_ROOT . '/assets/images/crown.svg' ) ? file_get_contents( WPUF_ROOT . '/assets/images/crown.svg' ) : ''; + $close_icon = file_exists( WPUF_ROOT . '/assets/images/x.svg' ) ? file_get_contents( WPUF_ROOT . '/assets/images/x.svg' ) : ''; + $suffix = '.min'; + + ?> +
    + +
    +
    +

    +
    + $module ) { + ?> +
    +
    +
    +

    + + +

    +
    + + + +
    +

    + +

    +
    +
    +
    + +
    + +
    + -
    - -
    -
    -

    -
    - $module ) { - ?> -
    -
    -
    -

    - - -

    -
    - - + public function modules_page_contents() { -
    -

    - -

    -
    -
    -
    - -
    - -
    -
  • - + false), 'objects'); ?> - false ], 'objects' ); + ?> + name ) ) { $selected = array(); ?> - +
    true), 'objects'); ?> - name ) ) { ?> + $cts = get_taxonomies( [ '_builtin' => true ], 'objects' ); + ?> + name ) ) { + ?>
    -

    label; ?>

    +

    label; ?>

    $ct->name, - 'hide_empty' => false, - ) ); - foreach ($tax_terms as $tax_term) { + $tax_terms = get_terms( + [ + 'taxonomy' => $ct->name, + 'hide_empty' => false, + ] + ); + foreach ( $tax_terms as $tax_term ) { $selected[] = $tax_term; ?>
      - term_id, $allowed_tax_id_arr ) ? ' checked="checked"' : ''; ?> name="name; ?>" disabled> name; ?> + term_id, $allowed_tax_id_arr, true ) ? ' checked="checked"' : ''; ?> name="name; ?>" disabled> name; ?>

    - 1 || count( $selected ) == 0 ) ? 'categories' : 'category'; ?> total + 1 || 0 === count( $selected ) ) ? 'categories' : 'category'; ?> total Select All @@ -1382,39 +1334,51 @@ public function subscription_tab_contents() {

    - +
    -

    label; ?>

    +

    label; ?>

    $ct->name, - 'hide_empty' => false, - ) ); - foreach ($tax_terms as $tax_term) { + $tax_terms = get_terms( + [ + 'taxonomy' => $ct->name, + 'hide_empty' => false, + ] + ); + foreach ( $tax_terms as $tax_term ) { $selected[] = $tax_term; ?>
      - term_id, $allowed_tax_id_arr ) ? ' checked="checked"' : ''; ?> name="name; ?>" disabled> name; ?> + term_id, $allowed_tax_id_arr, true ) ? ' checked="checked"' : ''; ?> + name="name; ?>" + disabled> name; ?>

    - 1 || count( $selected ) == 0 ) ? 'categories' : 'category'; ?> total + 1 || 0 === count( $selected ) ) ? 'categories' : 'category'; ?> total Select All @@ -1423,8 +1387,10 @@ public function subscription_tab_contents() {

    +

    + +
    +

    + +

    + +

    + +

    + +

    + + +

    +
    + + ' . self::get_pro_prompt_text() . '' ); diff --git a/includes/free/class-login.php b/includes/Free/Simple_Login.php similarity index 86% rename from includes/free/class-login.php rename to includes/Free/Simple_Login.php index 853a6ccce..32ff95cc6 100644 --- a/includes/free/class-login.php +++ b/includes/Free/Simple_Login.php @@ -1,5 +1,12 @@ */ -class WPUF_Simple_Login { +class Simple_Login { private $login_errors = []; private $messages = []; @@ -15,8 +22,6 @@ class WPUF_Simple_Login { private static $_instance; public function __construct() { - add_shortcode( 'wpuf-login', [ $this, 'login_form' ] ); - add_action( 'init', [ $this, 'process_login' ] ); add_action( 'init', [ $this, 'process_logout' ] ); add_action( 'init', [ $this, 'process_reset_password' ] ); @@ -159,7 +164,7 @@ public function validate_custom_fields( $user, $password ) { $no_captcha = 1; $invisible_captcha = 0; - WPUF_Render_Form::init()->validate_re_captcha( $no_captcha, $invisible_captcha ); + Render_Form::init()->validate_re_captcha( $no_captcha, $invisible_captcha ); } } } @@ -338,7 +343,6 @@ public function login_form() { } ob_start(); - if ( is_user_logged_in() ) { wpuf_load_template( 'logged-in.php', [ @@ -357,6 +361,10 @@ public function login_form() { case 'lostpassword': $checkemail = isset( $getdata['checkemail'] ) ? sanitize_text_field( $getdata['checkemail'] ) : ''; + if ( $this->login_errors ) { + wpuf_load_template( 'lost-pass-form.php', $args ); + break; + } if ( 'confirm' === $checkemail ) { $this->messages[] = __( 'Check your e-mail for the confirmation link.', 'wp-user-frontend' ); } @@ -402,106 +410,135 @@ public function login_form() { return ob_get_clean(); } + /** + * Remove selected cookie to have consistency with the login nonce. + * fixes WooCommerce Stripe Gateway plugin conflict + * + * @since WPUF_SINCE + * + * @return void + */ + public function unset_logged_in_cookie() { + if ( isset( $_COOKIE[ LOGGED_IN_COOKIE ] ) ) { + unset( $_COOKIE[ LOGGED_IN_COOKIE ] ); + } + } + /** * Process login form * * @return void */ public function process_login() { - if ( ! empty( $_POST['wpuf_login'] ) && ! empty( $_POST['wpuf-login-nonce'] ) ) { - $creds = []; - - $nonce = sanitize_key( wp_unslash( $_POST['wpuf-login-nonce'] ) ); + if ( empty( $_POST['wpuf_login'] ) || empty( $_POST['wpuf-login-nonce'] ) ) { + return; + } - if ( isset( $nonce ) && ! wp_verify_nonce( $nonce, 'wpuf_login_action' ) ) { - $this->login_errors[] = __( 'Nonce is invalid', 'wp-user-frontend' ); + // unset the specific cookie to fix WooCommerce Stripe Gateway plugin conflict + add_action( 'set_logged_in_cookie', [ $this, 'unset_logged_in_cookie' ], 11 ); - return; - } + $creds = []; - $log = isset( $_POST['log'] ) ? esc_attr( wp_unslash( $_POST['log'] ) ) : ''; - $pwd = isset( $_POST['pwd'] ) ? trim( $_POST['pwd'] ) : ''; - // $g_recaptcha_response = isset( $_POST['g-recaptcha-response'] ) ? sanitize_text_field( wp_unslash( $_POST['g-recaptcha-response'] ) ) : ''; + $nonce = sanitize_key( wp_unslash( $_POST['wpuf-login-nonce'] ) ); - $validation_error = new WP_Error(); - $validation_error = apply_filters( 'wpuf_process_login_errors', $validation_error, $log, $pwd ); + if ( isset( $nonce ) && ! wp_verify_nonce( $nonce, 'wpuf_login_action' ) ) { + $this->login_errors[] = __( 'Nonce is invalid', 'wp-user-frontend' ); - if ( $validation_error->get_error_code() ) { - $this->login_errors[] = $validation_error->get_error_message(); + return; + } - return; - } + $log = isset( $_POST['log'] ) ? esc_attr( wp_unslash( $_POST['log'] ) ) : ''; + $pwd = isset( $_POST['pwd'] ) ? trim( $_POST['pwd'] ) : ''; + // $g_recaptcha_response = isset( $_POST['g-recaptcha-response'] ) ? sanitize_text_field( wp_unslash( $_POST['g-recaptcha-response'] ) ) : ''; - if ( empty( $log ) ) { - $this->login_errors[] = __( 'Username is required.', 'wp-user-frontend' ); + $validation_error = new WP_Error(); + $validation_error = apply_filters( 'wpuf_process_login_errors', $validation_error, $log, $pwd ); - return; - } + if ( $validation_error->get_error_code() ) { + $this->login_errors[] = $validation_error->get_error_message(); - if ( empty( $pwd ) ) { - $this->login_errors[] = __( 'Password is required.', 'wp-user-frontend' ); + return; + } - return; - } + if ( empty( $log ) ) { + $this->login_errors[] = __( 'Username is required.', 'wp-user-frontend' ); - if ( isset( $_POST['g-recaptcha-response'] ) ) { - if ( empty( $_POST['g-recaptcha-response'] ) ) { - $this->login_errors[] = __( 'Empty reCaptcha Field', 'wp-user-frontend' ); - return; - } else { - $no_captcha = 1; - $invisible_captcha = 0; - WPUF_Render_Form::init()->validate_re_captcha( $no_captcha, $invisible_captcha ); - } - } + return; + } - if ( is_email( $log ) && apply_filters( 'wpuf_get_username_from_email', true ) ) { - $user = get_user_by( 'email', $log ); + if ( empty( $pwd ) ) { + $this->login_errors[] = __( 'Password is required.', 'wp-user-frontend' ); - if ( isset( $user->user_login ) ) { - $creds['user_login'] = $user->user_login; - } else { - $this->login_errors[] = '' . __( 'Error', 'wp-user-frontend' ) . ': ' . __( 'A user could not be found with this email address.', 'wp-user-frontend' ); + return; + } - return; - } + if ( isset( $_POST['g-recaptcha-response'] ) ) { + if ( empty( $_POST['g-recaptcha-response'] ) ) { + $this->login_errors[] = __( 'Empty reCaptcha Field', 'wp-user-frontend' ); + return; } else { - $creds['user_login'] = $log; + $no_captcha = 1; + $invisible_captcha = 0; + Render_Form::init()->validate_re_captcha( $no_captcha, $invisible_captcha ); } + } - $creds['user_password'] = $pwd; - $creds['remember'] = isset( $_POST['rememberme'] ) ? sanitize_text_field( wp_unslash( $_POST['rememberme'] ) ) : ''; + if ( is_email( $log ) && apply_filters( 'wpuf_get_username_from_email', true ) ) { + $user = get_user_by( 'email', $log ); if ( isset( $user->user_login ) ) { - $validate = wp_authenticate_email_password( null, trim( $log ), $creds['user_password'] ); + $creds['user_login'] = $user->user_login; + } else { + $this->login_errors[] = '' . __( 'Error', 'wp-user-frontend' ) . ': ' . __( 'A user could not be found with this email address.', 'wp-user-frontend' ); - if ( is_wp_error( $validate ) ) { - $this->login_errors[] = $validate->get_error_message(); - return; - } + return; } - $secure_cookie = is_ssl() ? true : false; - $user = wp_signon( apply_filters( 'wpuf_login_credentials', $creds ), $secure_cookie ); + $wpuf_user_status = get_user_meta( $user->ID, 'wpuf_user_status', true ); + + if ( 'approved' !== $wpuf_user_status ) { + $message = __( 'You can\'t login until an administrator manually approve your account.', 'wp-user-frontend' ); - //try with old implementation, which is wrong but we must support that - if ( is_wp_error( $user ) ) { - $creds['user_login'] = sanitize_text_field( wp_unslash( $_POST['log'] ) ); - $creds['user_password'] = sanitize_text_field( wp_unslash( $_POST['pwd'] ) ); + $this->login_errors[] = $message; - $user = wp_signon( apply_filters( 'wpuf_login_credentials', $creds ), $secure_cookie ); + return; } + } else { + $creds['user_login'] = $log; + } + + $creds['user_password'] = $pwd; + $creds['remember'] = isset( $_POST['rememberme'] ) ? sanitize_text_field( wp_unslash( $_POST['rememberme'] ) ) : ''; - if ( is_wp_error( $user ) ) { - $this->login_errors[] = $user->get_error_message(); + if ( isset( $user->user_login ) ) { + $validate = wp_authenticate_email_password( null, trim( $log ), $creds['user_password'] ); + if ( is_wp_error( $validate ) ) { + $this->login_errors[] = $validate->get_error_message(); return; - } else { - $redirect = $this->login_redirect(); - wp_redirect( apply_filters( 'wpuf_login_redirect', $redirect, $user ) ); - exit; } } + + $secure_cookie = is_ssl() ? true : false; + $user = wp_signon( apply_filters( 'wpuf_login_credentials', $creds ), $secure_cookie ); + + //try with old implementation, which is wrong but we must support that + if ( is_wp_error( $user ) ) { + $creds['user_login'] = sanitize_text_field( wp_unslash( $_POST['log'] ) ); + $creds['user_password'] = sanitize_text_field( wp_unslash( $_POST['pwd'] ) ); + + $user = wp_signon( apply_filters( 'wpuf_login_credentials', $creds ), $secure_cookie ); + } + + if ( is_wp_error( $user ) ) { + $this->login_errors[] = $user->get_error_message(); + + return; + } else { + $redirect = $this->login_redirect(); + wp_safe_redirect( apply_filters( 'wpuf_login_redirect', $redirect, $user ) ); + exit; + } } /** @@ -621,8 +658,11 @@ public function process_reset_password() { // process lost password form if ( isset( $_POST['user_login'] ) && isset( $_POST['_wpnonce'] ) ) { - $nonce = sanitize_key( wp_unslash( $_POST['_wpnonce'] ) ); - wp_verify_nonce( $nonce, 'wpuf_lost_pass' ); + $nonce = ! empty( $_POST['_wpnonce'] ) ? sanitize_key( wp_unslash( $_POST['_wpnonce'] ) ) : ''; + + if ( ! empty( $nonce) && ! wp_verify_nonce( $nonce, 'wpuf_lost_pass' ) ) { + return ; + } if ( $this->retrieve_password() ) { $url = add_query_arg( @@ -653,8 +693,6 @@ public function process_reset_password() { $args['key'] = $key; $args['login'] = $login; - wp_verify_nonce( $nonce, 'wpuf_reset_pass' ); - if ( empty( $pass1 ) || empty( $pass2 ) ) { $this->login_errors[] = __( 'Please enter your password.', 'wp-user-frontend' ); @@ -808,7 +846,7 @@ public function activation_user_registration() { } if ( ! isset( $_GET['id'] ) && empty( $_GET['id'] ) ) { - wpuf()->login->add_error( __( 'Activation URL is not valid', 'wp-user-frontend' ) ); + wpuf()->frontend->simple_login->add_error( __( 'Activation URL is not valid', 'wp-user-frontend' ) ); return; } @@ -819,13 +857,13 @@ public function activation_user_registration() { $wpuf_user_status = get_user_meta( $user_id, 'wpuf_user_status', true ); if ( ! $user ) { - wpuf()->login->add_error( __( 'Invalid User activation url', 'wp-user-frontend' ) ); + wpuf()->frontend->simple_login->add_error( __( 'Invalid User activation url', 'wp-user-frontend' ) ); return; } if ( $user->is_verified() ) { - wpuf()->login->add_error( __( 'User already verified', 'wp-user-frontend' ) ); + wpuf()->frontend->simple_login->add_error( __( 'User already verified', 'wp-user-frontend' ) ); return; } @@ -833,7 +871,7 @@ public function activation_user_registration() { $activation_key = isset( $_GET['wpuf_registration_activation'] ) ? sanitize_text_field( wp_unslash( $_GET['wpuf_registration_activation'] ) ) : ''; if ( $user->get_activation_key() !== $activation_key ) { - wpuf()->login->add_error( __( 'Activation URL is not valid', 'wp-user-frontend' ) ); + wpuf()->frontend->simple_login->add_error( __( 'Activation URL is not valid', 'wp-user-frontend' ) ); return; } @@ -847,7 +885,7 @@ public function activation_user_registration() { $message = __( "Your account has been verified , but you can't login until manually approved your account by an administrator.", 'wp-user-frontend' ); } - wpuf()->login->add_message( $message ); + wpuf()->frontend->simple_login->add_message( $message ); // show activation message add_filter( 'wp_login_errors', [ $this, 'user_activation_message' ] ); @@ -887,7 +925,7 @@ public function activation_user_registration() { $pack_id = ! empty( $_GET['pack_id'] ) ? sanitize_key( wp_unslash( $_GET['pack_id'] ) ) : ''; if ( $autologin_after_registration === 'on' - && $pack_id !== null && is_integer( (int) $pack_id ) ) { + && $pack_id !== null && is_integer( (int) $pack_id ) ) { wp_set_current_user( $user_id ); wp_set_auth_cookie( $user_id ); } @@ -914,7 +952,7 @@ public function activation_user_registration() { * * @since 2.2 * - * @return \WP_Error + * @return WP_Error */ public function user_activation_message() { return new WP_Error( 'user-activated', __( 'Your account has been activated', 'wp-user-frontend' ), 'message' ); diff --git a/includes/free/subscription.php b/includes/Free/Subscription_Element.php similarity index 70% rename from includes/free/subscription.php rename to includes/Free/Subscription_Element.php index f8712e537..72cbba182 100644 --- a/includes/free/subscription.php +++ b/includes/Free/Subscription_Element.php @@ -1,6 +1,8 @@ %s', file_get_contents( $crown_icon ) ); } ?> - + - - + 'icon-doc.svg', + 'title' => sprintf( esc_html__( 'Registration form %s builder', 'wp-user-frontend' ), '' ), + ], + [ + 'icon' => 'icon-profile.svg', + 'title' => sprintf( esc_html__( 'Profile form %s builder', 'wp-user-frontend' ), '' ), + ], + [ + 'icon' => 'icon-money.svg', + 'title' => sprintf( esc_html__( 'Create & Sell %s Subscription %s Package', 'wp-user-frontend' ), '', '' ), + ], + [ + 'icon' => 'icon-templates.svg', + 'title' => sprintf( esc_html__( 'Pre-defined %s Templates', 'wp-user-frontend' ), '' ), + ], + [ + 'icon' => 'icon-checked.svg', + 'title' => sprintf( esc_html__( 'Approval System %s after Registration', 'wp-user-frontend' ), '' ), + ], + [ + 'icon' => 'icon-mention.svg', + 'title' => esc_html__( 'Email Notifications', 'wp-user-frontend' ), + ], + [ + 'icon' => 'icon-settings.svg', + 'title' => esc_html__( 'Custom Field', 'wp-user-frontend' ), + ], + [ + 'icon' => 'icon-buddypress.svg', + 'title' => sprintf( esc_html__( 'BuddyPress %s Support', 'wp-user-frontend' ), '' ), + ], + [ + 'icon' => 'icon-groups.svg', + 'title' => sprintf( esc_html__( 'Social Login & %s Registration', 'wp-user-frontend' ), '' ), + ], +]; + +$email_integrations = [ + [ + 'icon' => 'icon-mailchimp.svg', + 'title' => sprintf( esc_html__( 'Mailchimp %s Support', 'wp-user-frontend' ), '' ), + ], + [ + 'icon' => 'icon-getresponse.svg', + 'title' => sprintf( esc_html__( 'GetResponse %s Support', 'wp-user-frontend' ), '' ), + ], + [ + 'icon' => 'icon-convertkit.svg', + 'title' => sprintf( esc_html__( 'ConvertKit %s Support', 'wp-user-frontend' ), '' ), + ], + [ + 'icon' => 'icon-campaign-monitor.svg', + 'title' => sprintf( esc_html__( 'Campaign Monitor %s Support', 'wp-user-frontend' ), '' ), + ], + [ + 'icon' => 'icon-mailpoet.svg', + 'title' => sprintf( esc_html__( 'Mailpoet %s Support', 'wp-user-frontend' ), '' ), + ], + [ + 'icon' => 'icon-mailpoet3.svg', + 'title' => sprintf( esc_html__( 'Mailpoet 3 Support', 'wp-user-frontend' ), '' ), + ], +]; + +?> +
    +
    +
    + WPUF Pro +
    +
    + +
    +
    +
    +
    +

    +

    + ', '' ); ?> +

    +
    + [wpuf-registration] + +
    + + + +
    +
    + WPUF Registration Form +
    +
    +
    +
    +
    + +
    +
    +

    +

    ' ); ?>

    +
    +
    +
    + +
    + +

    +
    + +
    +

    +
    + +
    + +

    +
    + +
    + +
    +
    diff --git a/includes/Frontend.php b/includes/Frontend.php new file mode 100644 index 000000000..f23273e23 --- /dev/null +++ b/includes/Frontend.php @@ -0,0 +1,195 @@ +frontend_form = new Frontend\Frontend_Form(); + $this->registration = new Frontend\Registration(); + $this->simple_login = new Free\Simple_Login(); + $this->frontend_account = new Frontend\Frontend_Account(); + $this->frontend_dashboard = new Frontend\Frontend_Dashboard(); + $this->shortcode = new Frontend\Shortcode(); + $this->payment = new Frontend\Payment(); + $this->form_preview = new Frontend\Form_Preview(); + + add_action( 'wp_enqueue_scripts', [ $this, 'enqueue_scripts' ] ); + + // show admin bar as per wpuf settings + add_filter( 'show_admin_bar', [ $this, 'show_admin_bar' ] ); + } + + /** + * Enqueue CSS and JS related to WPUF + * + * @since 4.0.0 + * + * @return void + */ + public function enqueue_scripts() { + global $post; + + $pay_page = intval( wpuf_get_option( 'payment_page', 'wpuf_payment' ) ); + + if ( wpuf_has_shortcode( 'wpuf-login' ) + || wpuf_has_shortcode( 'wpuf-registration' ) + || wpuf_has_shortcode( 'wpuf-meta' ) + || wpuf_has_shortcode( 'wpuf_form' ) + || wpuf_has_shortcode( 'wpuf_edit' ) + || wpuf_has_shortcode( 'wpuf_profile' ) + || wpuf_has_shortcode( 'wpuf_dashboard' ) + || wpuf_has_shortcode( 'weforms' ) + || wpuf_has_shortcode( 'wpuf_account' ) + || wpuf_has_shortcode( 'wpuf_sub_pack' ) + || ( isset( $post->ID ) && ( $pay_page == $post->ID ) ) + || isset( $_GET['wpuf_preview'] ) + || class_exists( '\Elementor\Plugin' ) + || $this->dokan_is_seller_dashboard() ) { + wp_enqueue_style( 'wpuf-layout1' ); + wp_enqueue_style( 'wpuf-frontend-forms' ); + wp_enqueue_style( 'wpuf-sweetalert2' ); + wp_enqueue_style( 'wpuf-jquery-ui' ); + + wp_enqueue_script( 'suggest' ); + wp_enqueue_script( 'wpuf-billing-address' ); + wp_enqueue_script( 'wpuf-upload' ); + wp_enqueue_script( 'wpuf-frontend-form' ); + wp_enqueue_script( 'wpuf-sweetalert2' ); + wp_enqueue_script( 'wpuf-subscriptions' ); + + wp_localize_script( + 'wpuf-upload', 'wpuf_upload', [ + 'confirmMsg' => __( 'Are you sure?', 'wp-user-frontend' ), + 'delete_it' => __( 'Yes, delete it', 'wp-user-frontend' ), + 'cancel_it' => __( 'No, cancel it', 'wp-user-frontend' ), + 'ajaxurl' => admin_url( 'admin-ajax.php' ), + 'nonce' => wp_create_nonce( 'wpuf_nonce' ), + 'plupload' => [ + 'url' => admin_url( 'admin-ajax.php' ) . '?nonce=' . wp_create_nonce( + 'wpuf-upload-nonce' + ), + 'flash_swf_url' => includes_url( 'js/plupload/plupload.flash.swf' ), + 'filters' => [ + [ + 'title' => __( 'Allowed Files', 'wp-user-frontend' ), + 'extensions' => '*', + ], + ], + 'multipart' => true, + 'urlstream_upload' => true, + 'warning' => __( 'Maximum number of files reached!', 'wp-user-frontend' ), + 'size_error' => __( + 'The file you have uploaded exceeds the file size limit. Please try again.', + 'wp-user-frontend' + ), + 'type_error' => __( + 'You have uploaded an incorrect file type. Please try again.', 'wp-user-frontend' + ), + ], + ] + ); + wp_localize_script( + 'wpuf-frontend-form', 'wpuf_frontend', apply_filters( + 'wpuf_frontend_object', [ + 'asset_url' => WPUF_ASSET_URI, + 'ajaxurl' => admin_url( 'admin-ajax.php' ), + 'error_message' => __( 'Please fix the errors to proceed', 'wp-user-frontend' ), + 'nonce' => wp_create_nonce( 'wpuf_nonce' ), + 'word_limit' => __( 'Word limit reached', 'wp-user-frontend' ), + 'cancelSubMsg' => __( + 'Are you sure you want to cancel your current subscription ?', 'wp-user-frontend' + ), + 'delete_it' => __( 'Yes', 'wp-user-frontend' ), + 'cancel_it' => __( 'No', 'wp-user-frontend' ), + 'word_max_title' => __( + 'Maximum word limit reached. Please shorten your texts.', 'wp-user-frontend' + ), + 'word_max_details' => __( + 'This field supports a maximum of %number% words, and the limit is reached. Remove a few words to reach the acceptable limit of the field.', + 'wp-user-frontend' + ), + 'word_min_title' => __( 'Minimum word required.', 'wp-user-frontend' ), + 'word_min_details' => __( + 'This field requires minimum %number% words. Please add some more text.', 'wp-user-frontend' + ), + 'char_max_title' => __( + 'Maximum character limit reached. Please shorten your texts.', 'wp-user-frontend' + ), + 'char_max_details' => __( + 'This field supports a maximum of %number% characters, and the limit is reached. Remove a few characters to reach the acceptable limit of the field.', + 'wp-user-frontend' + ), + 'char_min_title' => __( 'Minimum character required.', 'wp-user-frontend' ), + 'char_min_details' => __( + 'This field requires minimum %number% characters. Please add some more character.', + 'wp-user-frontend' + ), + 'protected_shortcodes' => wpuf_get_protected_shortcodes(), + 'protected_shortcodes_message' => __( 'Using %shortcode% is restricted', 'wp-user-frontend' ), + ] + ) + ); + + wp_localize_script( + 'wpuf-frontend-form', 'error_str_obj', [ + 'required' => __( 'is required', 'wp-user-frontend' ), + 'mismatch' => __( 'does not match', 'wp-user-frontend' ), + 'validation' => __( 'is not valid', 'wp-user-frontend' ), + ] + ); + } + } + + /** + * Check if this is a dokan seller dashboard page + * + * @since 4.0.0 + * + * @return bool + */ + private function dokan_is_seller_dashboard() { + return class_exists( 'WeDevs_Dokan' ) + && function_exists( 'dokan_is_seller_dashboard' ) + && dokan_is_seller_dashboard() + && ! empty( $wp->query_vars['posts'] ); + } + + + + /** + * Show/hide admin bar to the permitted user level + * + * @since 2.2.3 + * + * @return bool + */ + public function show_admin_bar( $val ) { + if ( ! is_user_logged_in() ) { + return false; + } + + $roles = wpuf_get_option( 'show_admin_bar', 'wpuf_general', [ 'administrator', 'editor', 'author', 'contributor', 'subscriber' ] ); + $roles = $roles && is_string( $roles ) ? [ strtolower( $roles ) ] : $roles; + $current_user = wp_get_current_user(); + + if ( ! empty( $current_user->roles ) && ! empty( $current_user->roles[0] ) ) { + if ( ! in_array( $current_user->roles[0], $roles ) ) { + return false; + } + } + + return $val; + } +} diff --git a/includes/class-gutenblock.php b/includes/Frontend/Form_Gutenberg_Block.php similarity index 72% rename from includes/class-gutenblock.php rename to includes/Frontend/Form_Gutenberg_Block.php index 17f4acd93..3479b4093 100644 --- a/includes/class-gutenblock.php +++ b/includes/Frontend/Form_Gutenberg_Block.php @@ -1,10 +1,15 @@ -load_dashicons(); - $js_dir = WPUF_ASSET_URI . '/js/admin/'; $css_dir = WPUF_ASSET_URI . '/css/admin/'; - // Once we have Gutenberg block javascript, we can enqueue our assets - wp_register_script( - 'wpuf-forms-block', - $js_dir . 'gutenblock.js', - [ 'wp-blocks', 'wp-editor', 'wp-components', 'wp-i18n', 'wp-element', 'underscore' ], - WPUF_VERSION - ); - - wp_register_style( - 'wpuf-forms-block-style', - $css_dir . 'gutenblock.css', - [ 'wp-edit-blocks' ], - WPUF_VERSION - ); - wp_register_style( - 'wpuf-forms-block-editor', - $css_dir . 'gutenblock-editor.css', - [ 'wp-edit-blocks', 'wpuf-forms-block-style' ], - WPUF_VERSION - ); - + wp_register_script( 'wpuf-forms-block', $js_dir . 'gutenblock.js', + [ 'wp-blocks', 'wp-editor', 'wp-components', 'wp-i18n', 'wp-element', 'underscore' ], WPUF_VERSION ); + wp_register_style( 'wpuf-forms-block-style', $css_dir . 'gutenblock.css', [ 'wp-edit-blocks' ], WPUF_VERSION ); + wp_register_style( 'wpuf-forms-block-editor', $css_dir . 'gutenblock-editor.css', + [ 'wp-edit-blocks', 'wpuf-forms-block-style' ], WPUF_VERSION ); /* * we need to get our forms so that the block can build a dropdown * with the forms * */ wp_enqueue_script( 'wpuf-forms-block' ); - - $forms = []; - $all_forms = wpuf()->forms->get_forms( [ 'post_status' => 'publish' ] ); - + $forms = []; + $all_forms = wpuf()->admin->forms->get_forms( [ 'post_status' => 'publish' ] ); foreach ( $all_forms['forms'] as $form ) { $forms[] = [ 'value' => $form->id, 'label' => $form->get_title(), ]; } - $block_logo = WPUF_ASSET_URI . '/images/icon-128x128.png'; $thumbnail_logo = WPUF_ASSET_URI . '/images/icon-128x128.png'; - wp_localize_script( 'wpuf-forms-block', 'wpufBlock', [ 'forms' => $forms, 'siteUrl' => get_home_url(), @@ -79,18 +63,18 @@ public function wpuf_form_block() { } public function load_preview_data() { - $js_dir = WPUF_ASSET_URI . '/js/admin/'; - + $js_dir = WPUF_ASSET_URI . '/js/admin/'; // check for preview and iframe get parameters - if ( isset( $_GET[ 'wpuf_preview' ] ) && isset( $_GET[ 'wpuf_iframe' ] ) ) { - $form_id = intval( $_GET[ 'wpuf_preview' ] ); + if ( isset( $_GET['wpuf_preview'] ) && isset( $_GET['wpuf_iframe'] ) ) { + $form_id = intval( $_GET['wpuf_preview'] ); // Style below: update width and height for particular form ?> $form_id, ] ); - wp_enqueue_script( 'wpuf-block-setup' ); } } diff --git a/includes/class-form-preview.php b/includes/Frontend/Form_Preview.php similarity index 83% rename from includes/class-form-preview.php rename to includes/Frontend/Form_Preview.php index 998b02078..4d99475ff 100644 --- a/includes/class-form-preview.php +++ b/includes/Frontend/Form_Preview.php @@ -1,5 +1,10 @@ form_id = isset( $_GET['form_id'] ) ? intval( $_GET['form_id'] ) : 0; - add_action( 'pre_get_posts', [ $this, 'pre_get_posts' ] ); - add_filter( 'template_include', [ $this, 'template_include' ] ); - + // add_filter( 'template_include', [ $this, 'template_include' ] ); add_filter( 'the_title', [ $this, 'the_title' ] ); add_filter( 'the_content', [ $this, 'the_content' ] ); add_filter( 'get_the_excerpt', [ $this, 'the_content' ] ); @@ -54,16 +56,14 @@ public function __construct() { * @return string */ public function the_title( $title ) { - if ( !in_the_loop() ) { + if ( ! in_the_loop() ) { return $title; } - $form = new WPUF_Form( $this->form_id ); - - if ( !$form ) { + $form = new Form( $this->form_id ); + if ( ! $form ) { return $title; } - $preview = $this->is_preview ? 'Preview' : ''; return $form->get_title() . ' ' . $preview; @@ -78,13 +78,12 @@ public function the_title( $title ) { */ public function the_content( $content ) { if ( $this->is_preview ) { - if ( !is_user_logged_in() ) { + if ( ! is_user_logged_in() ) { return __( 'You must be logged in to preview this form.', 'wp-user-frontend' ); } - - $viewing_capability = apply_filters( 'wpuf_preview_form_cap', 'edit_posts' ); // at least has to be contributor - - if ( !current_user_can( $viewing_capability ) ) { + $viewing_capability = apply_filters( 'wpuf_preview_form_cap', + 'edit_posts' ); // at least has to be contributor + if ( ! current_user_can( $viewing_capability ) ) { return __( 'Sorry, you are not eligible to preview this form.', 'wp-user-frontend' ); } } diff --git a/class/frontend-account.php b/includes/Frontend/Frontend_Account.php similarity index 77% rename from class/frontend-account.php rename to includes/Frontend/Frontend_Account.php index 987b14194..59ecc1d1f 100644 --- a/class/frontend-account.php +++ b/includes/Frontend/Frontend_Account.php @@ -1,17 +1,21 @@ get_allowed_cpt() as $post_type ) { add_action( 'wpuf_account_content_' . $post_type, [ $this, 'posts_section' ], 10, 2 ); @@ -19,8 +23,8 @@ public function __construct() { add_action( 'wpuf_account_content_subscription', [ $this, 'subscription_section' ], 10, 2 ); add_action( 'wpuf_account_content_edit-profile', [ $this, 'edit_profile_section' ], 10, 2 ); add_action( 'wpuf_account_content_billing-address', [ $this, 'billing_address_section' ], 10, 2 ); - add_action( 'wp_ajax_wpuf_account_update_profile', [ $this, 'update_profile' ] ); - add_filter( 'wpuf_options_wpuf_my_account', [ $this, 'add_settings_options' ] ); + + // add_filter( 'wpuf_options_wpuf_my_account', [ $this, 'add_settings_options' ] ); add_filter( 'wpuf_account_sections', [ $this, 'add_account_sections' ] ); add_action( 'wpuf_account_content_submit-post', [ $this, 'submit_post_section' ], 10, 2 ); add_action( 'pre_get_posts', [ $this, 'process_user_for_previewing_post' ] ); @@ -29,19 +33,19 @@ public function __construct() { /** * Add new settings options * + * @since 2.9.0 * @return array $options * - * @since 2.9.0 */ public function add_settings_options( $options ) { $options[] = [ 'name' => 'allow_post_submission', 'label' => __( 'Post Submission', 'wp-user-frontend' ), - 'desc' => __( 'Enable if you want to allow users to submit post from the account page.', 'wp-user-frontend' ), + 'desc' => __( 'Enable if you want to allow users to submit post from the account page.', + 'wp-user-frontend' ), 'type' => 'checkbox', 'default' => 'on', ]; - $options[] = [ 'name' => 'post_submission_label', 'label' => __( 'Submission Menu Label', 'wp-user-frontend' ), @@ -49,11 +53,11 @@ public function add_settings_options( $options ) { 'type' => 'text', 'default' => __( 'Submit Post', 'wp-user-frontend' ), ]; - $options[] = [ 'name' => 'post_submission_form', 'label' => __( 'Submission Form', 'wp-user-frontend' ), - 'desc' => __( 'Select a post form that will use to submit post by the users from their account page.', 'wp-user-frontend' ), + 'desc' => __( 'Select a post form that will use to submit post by the users from their account page.', + 'wp-user-frontend' ), 'type' => 'select', 'options' => $this->get_post_forms(), ]; @@ -61,55 +65,24 @@ public function add_settings_options( $options ) { return $options; } - /** - * Get post forms created by WPUF - * - * @return array $forms - * - * @since 2.9.0 - */ - public function get_post_forms() { - $args = [ - 'post_type' => 'wpuf_forms', - 'post_status' => 'any', - 'orderby' => 'DESC', - 'order' => 'ID', - 'numberposts' => -1, - ]; - - $posts = get_posts( $args ); - $forms = []; - - if ( ! empty( $posts ) ) { - foreach ( $posts as $post ) { - $forms[ $post->ID ] = $post->post_title; - } - } - - return $forms; - } - /** * Show/Hide frontend post submission menu depending on option * + * @since 2.9.0 * @return array $sections * - * @since 2.9.0 */ public function add_account_sections( $sections ) { $allow_post_submission = wpuf_get_option( 'allow_post_submission', 'wpuf_my_account', 'on' ); - $submission_label = wpuf_get_option( 'post_submission_label', 'wpuf_my_account', __( 'Submit Post', 'wp-user-frontend' ) ); - + $submission_label = wpuf_get_option( 'post_submission_label', 'wpuf_my_account', + __( 'Submit Post', 'wp-user-frontend' ) ); if ( ! is_array( $sections ) ) { $sections = (array) $sections; } - if ( $allow_post_submission === 'on' ) { - $sections = array_merge( - $sections, [ - 'submit-post' => $submission_label, - ] - ); + $sections = array_merge( $sections, [ + 'submit-post' => $submission_label, + ] ); } return $sections; @@ -118,27 +91,24 @@ public function add_account_sections( $sections ) { /** * Display the submit post section * - * @param array $sections + * @since 2.9.0 + * * @param string $current_section * + * @param array $sections + * * @return void * - * @since 2.9.0 */ public function submit_post_section( $sections, $current_section ) { $allow_post_submission = wpuf_get_option( 'allow_post_submission', 'wpuf_my_account', 'on' ); - if ( $allow_post_submission !== 'on' ) { return; } - - wpuf_load_template( - 'submit-post.php', - [ - 'sections' => $sections, - 'current_section' => $current_section, - ] - ); + wpuf_load_template( 'submit-post.php', [ + 'sections' => $sections, + 'current_section' => $current_section, + ] ); } /** @@ -152,33 +122,26 @@ public function submit_post_section( $sections, $current_section ) { public function shortcode( $atts ) { //phpcs:ignore extract( shortcode_atts( [], $atts ) ); - ob_start(); - if ( is_user_logged_in() ) { $default_active_tab = wpuf_get_option( 'account_page_active_tab', 'wpuf_my_account', 'dashboard' ); $section = isset( $_REQUEST['section'] ) ? sanitize_text_field( wp_unslash( $_REQUEST['section'] ) ) : $default_active_tab; $sections = wpuf_get_account_sections(); $current_section = []; - foreach ( $sections as $slug => $label ) { if ( $section === $slug ) { $current_section = $slug; break; } } - - wpuf_load_template( - 'account.php', [ - 'sections' => $sections, - 'current_section' => $current_section, - ] - ); + wpuf_load_template( 'account.php', [ + 'sections' => $sections, + 'current_section' => $current_section, + ] ); } else { $message = wpuf_get_option( 'un_auth_msg', 'wpuf_dashboard' ); wpuf_load_template( 'unauthorized.php', [ 'message' => $message ] ); } - $content = ob_get_contents(); ob_end_clean(); @@ -188,93 +151,96 @@ public function shortcode( $atts ) { /** * Display the dashboard section * - * @param array $sections + * @since 2.4.2 + * * @param string $current_section * - * @since 2.4.2 + * @param array $sections * * @return void */ public function dashboard_section( $sections, $current_section ) { - wpuf_load_template( - 'dashboard/dashboard.php', - [ - 'sections' => $sections, - 'current_section' => $current_section, - ] - ); + wpuf_load_template( 'dashboard/dashboard.php', [ + 'sections' => $sections, + 'current_section' => $current_section, + ] ); } /** * Display the posts section * - * @param array $sections + * @since 2.4.2 + * * @param string $current_section * - * @since 2.4.2 + * @param array $sections * * @return void */ public function posts_section( $sections, $current_section ) { - wpuf_load_template( - 'dashboard/posts.php', - [ - 'sections' => $sections, - 'current_section' => $current_section, - ] - ); + wpuf_load_template( 'dashboard/posts.php', [ + 'sections' => $sections, + 'current_section' => $current_section, + ] ); } /** * Display the subscription section * - * @param array $sections + * @since 2.4.2 + * * @param string $current_section * - * @since 2.4.2 + * @param array $sections * * @return void */ public function subscription_section( $sections, $current_section ) { $wpuf_user = wpuf_get_user(); $sub_id = $wpuf_user->subscription()->current_pack_id(); - if ( ! $sub_id ) { echo wp_kses_post( __( '

    You have not subscribed to any package yet.

    ', 'wp-user-frontend' ) ); return; } - $user_subscription = new WPUF_User_Subscription( $wpuf_user ); + $user_subscription = new User_Subscription( $wpuf_user ); $user_sub = $user_subscription->current_pack(); + if ( ! is_wp_error( $user_sub ) && $user_sub['status'] !== 'completed' && $user_sub['status'] !== 'Free' ) { + esc_html_e( '

    You may have processed your payment, but the pack is not active yet.

    ', + 'wp-user-frontend' ); - if ( ! is_wp_error( $user_sub ) && $user_sub['status'] !== 'completed' && $user_sub['status'] !== 'free' ) { - esc_html_e( '

    You may have processed your payment, but the pack is not active yet.

    ', 'wp-user-frontend' ); + return; + } + $pack = wpuf()->subscription->get_subscription( $sub_id ); + + if ( ! $pack ) { + echo wp_kses_post( sprintf( __( '%sYour subscription pack is not exists. Please contact admin.%s', 'wp-user-frontend' ), '

    ', '

    ' ) ); return; } - $pack = WPUF_Subscription::get_subscription( $sub_id ); $details_meta['payment_page'] = get_permalink( wpuf_get_option( 'payment_page', 'wpuf_payment' ) ); $details_meta['onclick'] = ''; $details_meta['symbol'] = wpuf_get_currency( 'symbol' ); - $recurring_des = ''; - - $billing_amount = ( intval( $pack->meta_value['billing_amount'] ) > 0 ) ? $details_meta['symbol'] . $pack->meta_value['billing_amount'] : __( 'Free', 'wp-user-frontend' ); - + $billing_amount = ( intval( $pack->meta_value['billing_amount'] ) > 0 ) ? $details_meta['symbol'] . $pack->meta_value['billing_amount'] : __( 'Free', + 'wp-user-frontend' ); if ( $pack->meta_value['recurring_pay'] === 'yes' ) { /* translators: %s: billing cycle number, %s: billing cycle period */ - $recurring_des = sprintf( __( 'For each', 'wp-user-frontend' ) . ' %s %s', $pack->meta_value['billing_cycle_number'], WPUF_Subscription::get_cycle_label( $pack->meta_value['cycle_period'], $pack->meta_value['billing_cycle_number'] ), $pack->meta_value['trial_duration_type'] ); + $recurring_des = sprintf( __( 'For each', 'wp-user-frontend' ) . ' %s %s', + $pack->meta_value['billing_cycle_number'], + Subscription::get_cycle_label( $pack->meta_value['cycle_period'], + $pack->meta_value['billing_cycle_number'] ), + $pack->meta_value['trial_duration_type'] ); /* translators: %s: number of installments */ - $recurring_des .= ! empty( $pack->meta_value['billing_limit'] ) ? sprintf( __( ', for %s installments', 'wp-user-frontend' ), $pack->meta_value['billing_limit'] ) : ''; + $recurring_des .= ! empty( $pack->meta_value['billing_limit'] ) ? sprintf( __( ', for %s installments', + 'wp-user-frontend' ), + $pack->meta_value['billing_limit'] ) : ''; } - ob_start(); - wpuf_load_template( - 'dashboard/subscription.php', - [ + 'dashboard/subscription.php', [ 'sections' => $sections, 'current_section' => $current_section, 'userdata' => $wpuf_user->user, @@ -284,28 +250,25 @@ public function subscription_section( $sections, $current_section ) { 'recurring_des' => $recurring_des, ] ); - ob_end_flush(); } /** * Display the edit profile section * - * @param array $sections + * @since 2.4.2 + * * @param string $current_section * - * @since 2.4.2 + * @param array $sections * * @return void */ public function edit_profile_section( $sections, $current_section ) { - wpuf_load_template( - 'dashboard/edit-profile.php', - [ - 'sections' => $sections, - 'current_section' => $current_section, - ] - ); + wpuf_load_template( 'dashboard/edit-profile.php', [ + 'sections' => $sections, + 'current_section' => $current_section, + ] ); } /** @@ -317,13 +280,10 @@ public function edit_profile_section( $sections, $current_section ) { * @return void */ public function billing_address_section( $sections, $current_section ) { - wpuf_load_template( - 'dashboard/billing-address.php', - [ - 'sections' => $sections, - 'current_section' => $current_section, - ] - ); + wpuf_load_template( 'dashboard/billing-address.php', [ + 'sections' => $sections, + 'current_section' => $current_section, + ] ); } /** @@ -335,13 +295,10 @@ public function billing_address_section( $sections, $current_section ) { */ public function update_profile() { $nonce = isset( $_REQUEST['_wpnonce'] ) ? sanitize_key( wp_unslash( $_REQUEST['_wpnonce'] ) ) : ''; - if ( isset( $nonce ) && ! wp_verify_nonce( $nonce, 'wpuf-account-update-profile' ) ) { wp_send_json_error( __( 'Nonce failure', 'wp-user-frontend' ) ); } - global $current_user; - $first_name = ! empty( $_POST['first_name'] ) ? sanitize_text_field( wp_unslash( $_POST['first_name'] ) ) : ''; $last_name = ! empty( $_POST['last_name'] ) ? sanitize_text_field( wp_unslash( $_POST['last_name'] ) ) : ''; $email = ! empty( $_POST['email'] ) ? sanitize_text_field( wp_unslash( $_POST['email'] ) ) : ''; @@ -349,62 +306,52 @@ public function update_profile() { $pass1 = ! empty( $_POST['pass1'] ) ? sanitize_text_field( wp_unslash( $_POST['pass1'] ) ) : ''; $pass2 = ! empty( $_POST['pass2'] ) ? sanitize_text_field( wp_unslash( $_POST['pass2'] ) ) : ''; $save_pass = true; - if ( empty( $first_name ) ) { wp_send_json_error( __( 'First Name is a required field.', 'wp-user-frontend' ) ); } - if ( empty( $last_name ) ) { wp_send_json_error( __( 'Last Name is a required field.', 'wp-user-frontend' ) ); } - if ( empty( $email ) ) { wp_send_json_error( __( 'Email is a required field.', 'wp-user-frontend' ) ); } - $user = new stdClass(); $user->ID = $current_user->ID; $user->first_name = $first_name; $user->last_name = $last_name; - if ( $email ) { $email = sanitize_email( $email ); - if ( ! is_email( $email ) ) { wp_send_json_error( __( 'Please provide a valid email address.', 'wp-user-frontend' ) ); - } elseif ( email_exists( $email ) && $email !== $current_user->user_email ) { + } else if ( email_exists( $email ) && $email !== $current_user->user_email ) { wp_send_json_error( __( 'This email address is already registered.', 'wp-user-frontend' ) ); } $user->user_email = $email; } - if ( ! empty( $current_password ) && empty( $pass1 ) && empty( $pass2 ) ) { wp_send_json_error( __( 'Please fill out all password fields.', 'wp-user-frontend' ) ); $save_pass = false; - } elseif ( ! empty( $pass1 ) && empty( $current_password ) ) { + } else if ( ! empty( $pass1 ) && empty( $current_password ) ) { wp_send_json_error( __( 'Please enter your current password.', 'wp-user-frontend' ) ); $save_pass = false; - } elseif ( ! empty( $pass1 ) && empty( $pass2 ) ) { + } else if ( ! empty( $pass1 ) && empty( $pass2 ) ) { wp_send_json_error( __( 'Please re-enter your password.', 'wp-user-frontend' ) ); $save_pass = false; - } elseif ( ( ! empty( $pass1 ) || ! empty( $pass2 ) ) && $pass1 !== $pass2 ) { + } else if ( ( ! empty( $pass1 ) || ! empty( $pass2 ) ) && $pass1 !== $pass2 ) { wp_send_json_error( __( 'New passwords do not match.', 'wp-user-frontend' ) ); $save_pass = false; - } elseif ( ! empty( $pass1 ) && ! wp_check_password( $current_password, $current_user->user_pass, $current_user->ID ) ) { + } else if ( ! empty( $pass1 ) && ! wp_check_password( $current_password, $current_user->user_pass, + $current_user->ID ) ) { wp_send_json_error( __( 'Your current password is incorrect.', 'wp-user-frontend' ) ); $save_pass = false; } - if ( $pass1 && $save_pass ) { $user->user_pass = $pass1; } - $result = wp_update_user( $user ); - if ( is_wp_error( $result ) ) { wp_send_json_error( __( 'Your current password is incorrect.', 'wp-user-frontend' ) ); } - wp_send_json_success(); } @@ -428,14 +375,11 @@ public function process_user_for_previewing_post( $query ) { if ( current_user_can( 'edit_posts' ) ) { return; } - if ( ! $query->is_main_query() && ! $query->is_preview && ! $query->get( 'p' ) ) { return; } - $current_user_id = get_current_user_id(); $current_post_id = absint( $query->get( 'p' ) ); - if ( $current_user_id === absint( get_post_field( 'post_author', $current_post_id ) ) ) { add_filter( 'user_has_cap', [ $this, 'add_temporary_capability' ], 10, 3 ); } diff --git a/class/frontend-dashboard.php b/includes/Frontend/Frontend_Dashboard.php similarity index 81% rename from class/frontend-dashboard.php rename to includes/Frontend/Frontend_Dashboard.php index 2e7ffe99a..966b81dfa 100644 --- a/class/frontend-dashboard.php +++ b/includes/Frontend/Frontend_Dashboard.php @@ -1,14 +1,18 @@ 'off', - 'post_type' => 'post', - 'category' => 'off', + 'form_id' => 'off', + 'post_type' => 'post', + 'category' => 'off', 'featured_image' => 'default', - 'meta' => 'off', - 'excerpt' => 'off', + 'meta' => 'off', + 'excerpt' => 'off', 'payment_column' => 'on', ], $atts ); $attributes = array_merge( $attributes, $atts ); ob_start(); - if ( is_user_logged_in() ) { $this->post_listing( $attributes ); } else { $message = wpuf_get_option( 'un_auth_msg', 'wpuf_dashboard' ); wpuf_load_template( 'unauthorized.php', [ 'message' => $message ] ); } - $content = ob_get_contents(); ob_end_clean(); @@ -74,29 +76,26 @@ public function post_listing( $attributes ) { global $post; //phpcs:ignore extract( $attributes ); - $pagenum = isset( $_GET['pagenum'] ) ? intval( wp_unslash( $_GET['pagenum'] ) ) : 1; $action = isset( $_REQUEST['action'] ) ? sanitize_text_field( wp_unslash( $_REQUEST['action'] ) ) : ''; - $msg = isset( $_GET['msg'] ) ? sanitize_text_field( wp_unslash( $_GET['msg'] ) ) : ''; + $msg = isset( $_GET['msg'] ) ? sanitize_text_field( wp_unslash( $_GET['msg'] ) ) : ''; //delete post if ( $action === 'del' ) { $this->delete_post(); } - //show delete success message if ( $msg === 'deleted' ) { echo wp_kses_post( '
    ' . __( 'Post Deleted', 'wp-user-frontend' ) . '
    ' ); } - $post_type = explode( ',', $post_type ); + $post_type = explode( ',', $post_type ); unset( $attributes['post_type'] ); - $args = [ + $args = [ 'author' => get_current_user_id(), 'post_status' => [ 'draft', 'future', 'pending', 'publish', 'private' ], 'post_type' => $post_type, 'posts_per_page' => wpuf_get_option( 'per_page', 'wpuf_dashboard', 10 ), 'paged' => $pagenum, ]; - if ( isset( $attributes['form_id'] ) && $attributes['form_id'] !== 'off' ) { $args['meta_query'] = [ [ @@ -106,41 +105,35 @@ public function post_listing( $attributes ) { ], ]; } - if ( isset( $attributes['category__in'] ) ) { $taxonomy = [ 'category' ]; - if ( class_exists( 'WooCommerce' ) ) { $taxonomy[] = 'product_cat'; } - $attributes['category__in'] = get_terms( - [ - 'name' => explode( ',', $attributes['category__in'] ), - 'taxonomy' => $taxonomy, - 'fields' => 'ids', - ] - ); + $attributes['category__in'] = get_terms( + [ + 'name' => explode( ',', $attributes['category__in'] ), + 'taxonomy' => $taxonomy, + 'fields' => 'ids', + ] + ); } - if ( isset( $attributes['author__in'] ) ) { $attributes['author__in'] = get_users( [ - 'nicename__in' => explode( ',', $attributes['author__in'] ), - 'fields' => 'ids', + 'nicename__in' => explode( ',', $attributes['author__in'] ), + 'fields' => 'ids', ] ); unset( $args['author'] ); } - - $args = array_merge( $args, $attributes ); + $args = array_merge( $args, $attributes ); $original_post = $post; $dashboard_query = new WP_Query( apply_filters( 'wpuf_dashboard_query', $args, $attributes ) ); $post_type_obj = []; - foreach ( $post_type as $key => $value ) { $post_type_obj[ $value ] = get_post_type_object( $value ); } - wpuf_load_template( 'dashboard.php', [ 'post_type' => $post_type, @@ -157,9 +150,7 @@ public function post_listing( $attributes ) { 'payment_column' => $payment_column, ] ); - wp_reset_postdata(); - $this->user_info(); } @@ -168,7 +159,6 @@ public function post_listing( $attributes ) { */ public function user_info() { global $userdata; - if ( wpuf_get_option( 'show_user_bio', 'wpuf_dashboard', 'on' ) === 'on' ) { ?>
    @@ -177,7 +167,9 @@ public function user_info() {
    user_email, 80 ); ?>
    @@ -193,29 +185,26 @@ public function user_info() { */ public function delete_post() { global $userdata; - $nonce = isset( $_REQUEST['_wpnonce'] ) ? sanitize_key( wp_unslash( $_REQUEST['_wpnonce'] ) ) : ''; - $pid = isset( $_REQUEST['pid'] ) ? sanitize_text_field( wp_unslash( $_REQUEST['pid'] ) ) : ''; - + $pid = isset( $_REQUEST['pid'] ) ? sanitize_text_field( wp_unslash( $_REQUEST['pid'] ) ) : ''; if ( isset( $nonce ) && ! wp_verify_nonce( $nonce, 'wpuf_del' ) ) { return; } - //check, if the requested user is the post author $maybe_delete = get_post( $pid ); - if ( ( $maybe_delete->post_author == $userdata->ID ) || current_user_can( 'delete_others_pages' ) ) { wp_trash_post( $pid ); - //redirect $redirect = add_query_arg( [ 'msg' => 'deleted' ], get_permalink() ); - $redirect = apply_filters( 'wpuf_delete_post_redirect', $redirect ); - wp_redirect( $redirect ); exit; } else { - echo wp_kses_post( '
    ' . __( 'You are not the post author. Cheating huh!', 'wp-user-frontend' ) . '
    ' ); + echo wp_kses_post( + '
    ' . __( + 'You are not the post author. Cheating huh!', 'wp-user-frontend' + ) . '
    ' + ); } } } diff --git a/includes/Frontend/Frontend_Form.php b/includes/Frontend/Frontend_Form.php new file mode 100755 index 000000000..ec00b15dc --- /dev/null +++ b/includes/Frontend/Frontend_Form.php @@ -0,0 +1,479 @@ +set_wp_post_types(); + + // Enable post edit link for post authors in frontend + if ( ! is_admin() ) { + add_filter( 'user_has_cap', [ $this, 'map_capabilities_for_post_authors' ], 10, 4 ); + add_filter( 'get_edit_post_link', [ $this, 'get_edit_post_link' ], 10, 3 ); + } + } + + /** + * Edit post shortcode handler + * + * @param array $atts + * + * @return + **/ + public function edit_post_shortcode( $atts ) { + add_filter( 'wpuf_form_fields', [ $this, 'add_field_settings' ] ); + // @codingStandardsIgnoreStart + extract( shortcode_atts( [ 'id' => 0 ], $atts ) ); + + // @codingStandardsIgnoreEnd + ob_start(); + + global $userdata; + + ob_start(); + + if ( ! is_user_logged_in() ) { + echo wp_kses_post( '
    ' . __( 'You are not logged in', 'wp-user-frontend' ) . '
    ' ), + + wp_login_form(); + + return; + } + + $post_id = isset( $_GET['pid'] ) ? intval( wp_unslash( $_GET['pid'] ) ) : 0; + + if ( ! $post_id ) { + return '
    ' . __( 'Invalid post', 'wp-user-frontend' ) . '
    '; + } + + $edit_post_lock = get_post_meta( $post_id, '_wpuf_lock_editing_post', true ); + $edit_post_lock_time = get_post_meta( $post_id, '_wpuf_lock_user_editing_post_time', true ); + + if ( $edit_post_lock === 'yes' ) { + return '
    ' . apply_filters( 'wpuf_edit_post_lock_user_notice', __( 'Your edit access for this post has been locked by an administrator.', 'wp-user-frontend' ) ) . '
    '; + } + + if ( ! empty( $edit_post_lock_time ) && $edit_post_lock_time < time() ) { + return '
    ' . apply_filters( 'wpuf_edit_post_lock_expire_notice', __( 'Your allocated time for editing this post has been expired.', 'wp-user-frontend' ) ) . '
    '; + } + + if ( wpuf_get_user()->edit_post_locked() ) { + if ( wpuf_get_user()->edit_post_lock_reason() ) { + return '
    ' . wpuf_get_user()->edit_post_lock_reason() . '
    '; + } + + return '
    ' . apply_filters( 'wpuf_user_edit_post_lock_notice', __( 'Your post edit access has been locked by an administrator.', 'wp-user-frontend' ) ) . '
    '; + } + + //is editing enabled? + if ( wpuf_get_option( 'enable_post_edit', 'wpuf_dashboard', 'yes' ) !== 'yes' ) { + return '
    ' . __( 'Post Editing is disabled', 'wp-user-frontend' ) . '
    '; + } + + $curpost = get_post( $post_id ); + + if ( ! $curpost ) { + return '
    ' . __( 'Invalid post', 'wp-user-frontend' ); + } + + // has permission? + if ( ! current_user_can( 'delete_others_posts' ) && ( $userdata->ID !== (int) $curpost->post_author ) ) { + return '
    ' . __( 'You are not allowed to edit', 'wp-user-frontend' ) . '
    '; + } + + $form_id = get_post_meta( $post_id, self::$config_id, true ); + + // fallback to default form + if ( ! $form_id ) { + $form_id = wpuf_get_option( 'default_post_form', 'wpuf_frontend_posting' ); + } + + if ( ! $form_id ) { + return '
    ' . __( "I don't know how to edit this post, I don't have the form ID", 'wp-user-frontend' ) . '
    '; + } + + $form = new Form( $form_id ); + + $this->form_fields = $form->get_fields(); + // $form_settings = wpuf_get_form_settings( $form_id ); + $this->form_settings = $form->get_settings(); + + $disable_pending_edit = wpuf_get_option( 'disable_pending_edit', 'wpuf_dashboard', 'on' ); + $disable_publish_edit = wpuf_get_option( 'disable_publish_edit', 'wpuf_dashboard', 'off' ); + + if ( 'pending' === $curpost->post_status && 'on' === $disable_pending_edit ) { + return '
    ' . __( 'You can\'t edit a post while in pending mode.', 'wp-user-frontend' ); + } + + if ( 'publish' === $curpost->post_status && 'off' !== $disable_publish_edit ) { + return '
    ' . __( 'You\'re not allowed to edit this post.', 'wp-user-frontend' ); + } + + $msg = isset( $_GET['msg'] ) ? sanitize_text_field( wp_unslash( $_GET['msg'] ) ) : ''; + + if ( $msg === 'post_updated' ) { + echo wp_kses_post( '
    ' ); + echo wp_kses_post( str_replace( '%link%', get_permalink( $post_id ), $this->form_settings['update_message'] ) ); + echo wp_kses_post( '
    ' ); + } + + $this->render_form( $form_id, $post_id, $atts, $form ); + + $content = ob_get_contents(); + + ob_end_clean(); + + return $content; + } + + /** + * This will embed media to the editor + */ + public function make_media_embed_code() { + $nonce = isset( $_GET['nonce'] ) ? sanitize_key( wp_unslash( $_GET['nonce'] ) ) : ''; + + if ( isset( $nonce ) && ! wp_verify_nonce( $nonce, 'wpuf-upload-nonce' ) ) { + exit; + } + + $content = isset( $_POST['content'] ) ? sanitize_text_field( wp_unslash( $_POST['content'] ) ) : ''; + $embed_code = wp_oembed_get( $content ); + + if ( $embed_code ) { + echo esc_html( $embed_code ); + } else { + echo ''; + } + exit; + } + + /** + * Draft Post + */ + public function draft_post() { + check_ajax_referer( 'wpuf_form_add' ); + add_filter( 'wpuf_form_fields', [ $this, 'add_field_settings' ] ); + @header( 'Content-Type: application/json; charset=' . get_option( 'blog_charset' ) ); + + $form_id = isset( $_POST['form_id'] ) ? intval( wp_unslash( $_POST['form_id'] ) ) : 0; + $form = new Form( $form_id ); + $this->form_settings = $form->get_settings(); + $this->form_fields = $form->get_fields(); + $pay_per_post = $form->is_enabled_pay_per_post(); + + [ $post_vars, $taxonomy_vars, $meta_vars ] = $this->get_input_fields( $this->form_fields ); + + $entry_fields = $form->prepare_entries(); + $allowed_tags = wp_kses_allowed_html( 'post' ); + $post_content = isset( $_POST['post_content'] ) ? wp_kses( wp_unslash( $_POST['post_content'] ), $allowed_tags ) : ''; + $postarr = [ + 'post_type' => $this->form_settings['post_type'], + 'post_status' => wpuf_get_draft_post_status( $this->form_settings ), + 'post_author' => get_current_user_id(), + 'post_title' => isset( $_POST['post_title'] ) ? sanitize_text_field( wp_unslash( $_POST['post_title'] ) ) : '', + 'post_content' => $post_content, + 'post_excerpt' => isset( $_POST['post_excerpt'] ) ? wp_kses( wp_unslash( $_POST['post_excerpt'] ), $allowed_tags ) : '', + ]; + + if ( ! empty( $this->form_fields ) ) { + foreach ( $this->form_fields as $field ) { + if ( $field['template'] === 'taxonomy' ) { + $category_name = $field['name']; + + if ( isset( $_POST[ $category_name ] ) && is_array( $_POST[ $category_name ] ) ) { // WPCS: sanitization ok. + $category = isset( $_POST[ $category_name ] ) ? array_map( 'sanitize_text_field', wp_unslash( $_POST[ $category_name ] ) ) : []; + } else { + $category = isset( $_POST[ $category_name ] ) ? sanitize_text_field( wp_unslash( $_POST[ $category_name ] ) ) : ''; + } + + if ( $category !== '' && $category !== '0' && $category[0] !== '-1' ) { + if ( ! is_array( $category ) && is_string( $category ) ) { + $category_strings = explode( ',', $category ); + $cat_ids = []; + + foreach ( $category_strings as $key => $each_cat_string ) { + $cat_ids[] = get_cat_ID( trim( $each_cat_string ) ); + $postarr['post_category'] = $cat_ids; + } + } else { + $postarr['post_category'] = $category; + } + } + } + } + } + + // set default post category if it's not been set yet and if post type supports + if ( ! isset( $postarr['post_category'] ) && isset( $this->form_settings['default_cat'] ) && is_object_in_taxonomy( $this->form_settings['post_type'], 'category' ) ) { + if ( is_array( $this->form_settings['default_cat'] ) ) { + $postarr['post_category'] = $this->form_settings['default_cat']; + } else { + $postarr['post_category'] = [ $this->form_settings['default_cat'] ]; + } + } + + if ( isset( $_POST['tags'] ) ) { + $postarr['tags_input'] = explode( ',', sanitize_text_field( wp_unslash( $_POST['tags'] ) ) ); + } + + // if post_id is passed, we update the post + if ( isset( $_POST['post_id'] ) ) { + $is_update = true; + $postarr['ID'] = intval( wp_unslash( $_POST['post_id'] ) ); + $postarr['comment_status'] = 'open'; + } + + $postarr = $this->adjust_thumbnail_id( $postarr ); + + $post_id = wp_insert_post( $postarr ); + + // add post revision when post edit from the frontend + wpuf_frontend_post_revision( $post_id, $this->form_settings ); + + if ( $post_id ) { + self::update_post_meta( $meta_vars, $post_id ); + + // set the post form_id for later usage + update_post_meta( $post_id, self::$config_id, $form_id ); + + // save post formats if have any + if ( isset( $this->form_settings['post_format'] ) && $this->form_settings['post_format'] !== '0' ) { + if ( post_type_supports( $this->form_settings['post_type'], 'post-formats' ) ) { + set_post_format( $post_id, $this->form_settings['post_format'] ); + } + } + + if ( ! empty( $taxonomy_vars ) ) { + $this->set_custom_taxonomy( $post_id, $taxonomy_vars ); + } else { + $this->set_default_taxonomy( $post_id ); + } + } + + //used to add code to run when the post is going to draft + do_action( 'wpuf_draft_post_after_insert', $post_id, $form_id, $this->form_settings, $this->form_fields ); + + wpuf_clear_buffer(); + + echo json_encode( + [ + 'post_id' => $post_id, + 'action' => isset( $_POST['action'] ) ? sanitize_text_field( wp_unslash( $_POST['action'] ) ) : '', + 'date' => current_time( 'mysql' ), + 'post_author' => get_current_user_id(), + 'comment_status' => get_option( 'default_comment_status' ), + 'url' => add_query_arg( 'preview', 'true', get_permalink( $post_id ) ), + 'message' => __( 'Post Saved', 'wp-user-frontend' ), + ] + ); + + exit; + } + + /** + * Add post shortcode handler + * + * @param array $atts + * @return string + */ + + public function add_post_shortcode( $atts ) { + add_filter( 'wpuf_form_fields', [ $this, 'add_field_settings' ] ); + + // @codingStandardsIgnoreStart + extract( shortcode_atts( [ 'id' => 0 ], $atts ) ); + + // @codingStandardsIgnoreEnd + ob_start(); + $form = new Form( $id ); + $this->form_fields = $form->get_fields(); + $this->form_settings = $form->get_settings(); + $this->generate_auth_link(); // Translate tag %login% %registration% to login registartion url + [ $user_can_post, $info ] = $form->is_submission_open( $form, $this->form_settings ); + $info = apply_filters( 'wpuf_addpost_notice', $info, $id, $this->form_settings ); + $user_can_post = apply_filters( 'wpuf_can_post', $user_can_post, $id, $this->form_settings ); + + if ( $user_can_post === 'yes' ) { + $this->render_form( $id, null, $atts, $form ); + } else { + echo wp_kses_post( '
    ' . $info . '
    ' ); + } + $content = ob_get_contents(); + ob_end_clean(); + + return $content; + } + + /** + * Hook to publish verified guest post with payment + * + * @since 2.5.8 + */ + public function publish_guest_post() { + $post_msg = isset( $_GET['post_msg'] ) ? sanitize_text_field( wp_unslash( $_GET['post_msg'] ) ) : ''; + $pid = isset( $_GET['p_id'] ) ? sanitize_text_field( wp_unslash( $_GET['p_id'] ) ) : ''; + $fid = isset( $_GET['f_id'] ) ? sanitize_text_field( wp_unslash( $_GET['f_id'] ) ) : ''; + + if ( $post_msg === 'verified' ) { + $response = []; + $post_id = wpuf_decryption( $pid ); + $form_id = wpuf_decryption( $fid ); + $form_settings = wpuf_get_form_settings( $form_id ); + $post_author_id = get_post_field( 'post_author', $post_id ); + $payment_status = new Subscription(); + $form = new Form( $form_id ); + $pay_per_post = $form->is_enabled_pay_per_post(); + $force_pack = $form->is_enabled_force_pack(); + + if ( $form->is_charging_enabled() && $pay_per_post ) { + if ( ( $payment_status->get_payment_status( $post_id ) ) === 'pending' ) { + $response['show_message'] = true; + $response['redirect_to'] = add_query_arg( + [ + 'action' => 'wpuf_pay', + 'type' => 'post', + 'post_id' => $post_id, + ], + get_permalink( wpuf_get_option( 'payment_page', 'wpuf_payment' ) ) + ); + + wp_redirect( $response['redirect_to'] ); + wpuf_clear_buffer(); + wp_send_json( $response ); + } + } else { + $p_status = get_post_status( $post_id ); + + if ( $p_status ) { + wp_update_post( + [ + 'ID' => $post_id, + 'post_status' => isset( $form_settings['post_status'] ) ? $form_settings['post_status'] : 'publish', + ] + ); + + echo wp_kses_post( "
    " . __( 'Email successfully verified. Please Login.', 'wp-user-frontend' ) . '
    ' ); + } + } + } + } + + /** + * Enable edit post link for post authors + * + * @since 3.4.0 + * + * @param array $allcaps + * @param array $caps + * @param array $args + * @param WP_User $wp_user + * + * @return array + */ + public function map_capabilities_for_post_authors( $allcaps, $caps, $args, $wp_user ) { + if ( + empty( $args ) + || count( $args ) < 3 + || empty( $caps ) + || 'edit_post' !== $args[0] + || isset( $allcaps[ $caps[0] ] ) + ) { + return $allcaps; + } + + $post_id = $args[2]; + $post = get_post( $post_id ); + + // We'll show edit link only for posts, not page, product or other post types + if ( + empty( $post->post_type ) + || 'post' !== $post->post_type + || ! wpuf_validate_boolean( wpuf_get_option( 'enable_post_edit', 'wpuf_dashboard', 'yes' ) ) + || ! $this->get_frontend_post_edit_link( $post_id ) + || absint( $post->post_author ) !== $wp_user->ID + ) { + return $allcaps; + } + + $allcaps['edit_published_posts'] = 1; + + return $allcaps; + } + + /** + * Filter hook for edit post link + * + * @since 3.4.0 + * + * @param string $url + * @param int $post_id + * + * @return string + */ + public function get_edit_post_link( $url, $post_id ) { + if ( + current_user_can( 'edit_post', $post_id ) + && ! current_user_can( 'administrator' ) + && ! current_user_can( 'editor' ) + && ! current_user_can( 'author' ) + && ! current_user_can( 'contributor' ) + ) { + $post = get_post( $post_id ); + $form_id = get_post_meta( $post_id, '_wpuf_form_id', true ); + + if ( absint( $post->post_author ) === get_current_user_id() && $form_id ) { + return $this->get_frontend_post_edit_link( $post_id ); + } + } + + return $url; + } + + /** + * Get post edit link + * + * @since 3.4.0 + * + * @param int $post_id + * + * @return string + */ + public function get_frontend_post_edit_link( $post_id ) { + $edit_page = absint( wpuf_get_option( 'edit_page_id', 'wpuf_frontend_posting' ) ); + + if ( ! $edit_page ) { + return ''; + } + + $url = add_query_arg( [ 'pid' => $post_id ], get_permalink( $edit_page ) ); + $edit_page_url = apply_filters( 'wpuf_edit_post_link', $url ); + + return wp_nonce_url( $edit_page_url, 'wpuf_edit' ); + } + + /** + * Generate login registartion link for unauth message + */ + private function generate_auth_link() { + if ( ! is_user_logged_in() && $this->form_settings['guest_post'] !== 'true' ) { + $login = wpuf()->frontend->simple_login->get_login_url(); + $register = wpuf()->frontend->simple_login->get_registration_url(); + $replace = [ "Login", "Register" ]; + $placeholders = [ '%login%', '%register%' ]; + + $this->form_settings['message_restrict'] = str_replace( $placeholders, $replace, $this->form_settings['message_restrict'] ); + } + } +} diff --git a/includes/Frontend/Payment.php b/includes/Frontend/Payment.php new file mode 100644 index 000000000..650c71060 --- /dev/null +++ b/includes/Frontend/Payment.php @@ -0,0 +1,550 @@ + [ + 'admin_label' => __( 'PayPal', 'wp-user-frontend' ), + 'checkout_label' => __( 'PayPal', 'wp-user-frontend' ), + 'icon' => apply_filters( 'wpuf_paypal_checkout_icon', WPUF_ASSET_URI . '/images/paypal.png' ), + ], + 'bank' => [ + 'admin_label' => __( 'Bank Payment', 'wp-user-frontend' ), + 'checkout_label' => __( 'Bank Payment', 'wp-user-frontend' ), + ], + ]; + $gateways = apply_filters( 'wpuf_payment_gateways', $gateways ); + + return $gateways; + } + + /** + * Get active payment gateways + * + * @return array + */ + public function get_active_gateways() { + $all_gateways = wpuf_get_gateways( 'checkout' ); + $active_gateways = wpuf_get_option( 'active_gateways', 'wpuf_payment' ); + $active_gateways = is_array( $active_gateways ) ? $active_gateways : []; + $gateways = []; + foreach ( $all_gateways as $id => $label ) { + if ( array_key_exists( $id, $active_gateways ) ) { + $gateways [ $id ] = $label; + } + } + + return $gateways; + } + + /** + * Show the payment page + * + * @param string $content + * + * @return string|void + */ + public function payment_page( $content ) { + global $post; + + if ( ! ( $post instanceof WP_Post ) ) { + return $content; + } + + $pay_page = intval( wpuf_get_option( 'payment_page', 'wpuf_payment' ) ); + + $billing_amount = 0; + $action = isset( $_REQUEST['action'] ) ? sanitize_text_field( wp_unslash( $_REQUEST['action'] ) ) : ''; + $get_type = isset( $_REQUEST['type'] ) ? sanitize_text_field( wp_unslash( $_REQUEST['type'] ) ) : ''; + $type = ( $get_type === 'post' ) ? 'post' : 'pack'; + if ( ! is_user_logged_in() && $action === 'wpuf_pay' && $type !== 'post' ) { + /* translators: %s: login url */ + printf( esc_html( __( 'This page is restricted. Please %s to view this page.', 'wp-user-frontend' ) ), + wp_loginout( '', false ) ); + + return; + } + if ( $action === 'wpuf_pay' && $pay_page === 0 ) { + esc_html_e( 'Please select your payment page from admin panel', 'wp-user-frontend' ); + + return; + } + if ( $post->ID === $pay_page && 'wpuf_pay' === $action ) { + $post_id = isset( $_REQUEST['post_id'] ) ? intval( wp_unslash( $_REQUEST['post_id'] ) ) : 0; + $pack_id = isset( $_REQUEST['pack_id'] ) ? intval( wp_unslash( $_REQUEST['pack_id'] ) ) : 0; + $is_free = false; + if ( $pack_id ) { + $pack_detail = wpuf()->subscription->get_subscription( $pack_id ); + if ( ! $pack_detail ) { + ?> +
    + meta_value['recurring_pay'] ) ? $pack_detail->meta_value['recurring_pay'] : 'no'; + if ( empty( $pack_detail->meta_value['billing_amount'] ) || $pack_detail->meta_value['billing_amount'] <= 0 ) { + $is_free = true; + } + } + $gateways = $this->get_active_gateways(); + if ( isset( $_REQUEST['wpuf_payment_submit'] ) ) { + $selected_gateway = isset( $_REQUEST['wpuf_payment_method'] ) ? sanitize_text_field( wp_unslash( $_REQUEST['wpuf_payment_method'] ) ) : ''; + } else { + $selected_gateway = 'paypal'; + } + ob_start(); + if ( is_user_logged_in() ) { + $current_user = wp_get_current_user(); + } else { + $user_id = isset( $_GET['user_id'] ) ? intval( wp_unslash( $_GET['user_id'] ) ) : 0; + $current_user = get_userdata( $user_id ); + } + if ( $pack_id && $is_free ) { + $wpuf_subscription = wpuf()->subscription; + $wpuf_user = new WPUF_User( $current_user->ID ); + if ( ! $wpuf_user->subscription()->used_free_pack( $pack_id ) ) { + wpuf_get_user( $current_user->ID )->subscription()->add_pack( $pack_id, NULL, false, 'Free' ); + $wpuf_user->subscription()->add_free_pack( $current_user->ID, $pack_id ); + $message = apply_filters( 'wpuf_fp_activated_msg', + __( 'Your Free package has been activated. Enjoy!', + 'wp-user-frontend' ) ); + } else { + $message = apply_filters( 'wpuf_fp_activated_error', + __( 'You already have activated a Free package previously.', + 'wp-user-frontend' ) ); + } + ?> +
    + + +
    + +
    + +
    +

    +
    + wpuf_ajax_address_form(); + ?> +
    +
    + +
    +
    + + + subscription->get_subscription( $pack_id ); + $details_meta = wpuf()->subscription->get_details_meta_value(); + $currency = wpuf_get_currency( 'symbol' ); + if ( is_user_logged_in() ) { + ?> + + + +
    +
    +
    +

    + + + +

    +
    +
    + +
    + + coupons->after_apply_coupon( $pack ) ); + } else { + $pack_cost = $pack->meta_value['billing_amount']; + $billing_amount = apply_filters( 'wpuf_payment_amount', + $pack->meta_value['billing_amount'] ); + ?> + + + +
    : + post_title ); ?> +
    +
    : + +
    + + + +
    : + +
    + +
    +
    +
    + + + + + + +
    + + is_enabled_force_pack(); + $pay_per_post = $form->is_enabled_pay_per_post(); + $fallback_enabled = $form->is_enabled_fallback_cost(); + $fallback_cost = (float) $form->get_subs_fallback_cost(); + $pay_per_post_cost = (float) $form->get_pay_per_post_cost(); + $current_user = wpuf_get_user(); + $current_pack = $current_user->subscription()->current_pack(); + if ( $force_pack && ! is_wp_error( $current_pack ) && $fallback_enabled ) { + $post_cost = $fallback_cost; + $billing_amount = apply_filters( 'wpuf_payment_amount', $fallback_cost ); + } else { + $post_cost = $pay_per_post_cost; + $billing_amount = apply_filters( 'wpuf_payment_amount', $pay_per_post_cost ); + } + ?> + + +
    : +
    + + + +
    : +
    + + + + + +

    +
    + +

      + $gateway ) { ?> +
    • + + + +
    • + +
    +

    + +

    + + + + + + + + + + + +

    + +
    +
    + + + + + subscription()->current_pack(); + $cost = 0; + if ( is_user_logged_in() ) { + $userdata = wp_get_current_user(); + } else { + $user_id = isset( $_REQUEST['user_id'] ) ? intval( wp_unslash( $_REQUEST['user_id'] ) ) : 0; + if ( $user_id ) { + $userdata = get_userdata( $user_id ); + } else if ( $type === 'post' && ! is_user_logged_in() ) { + $post = get_post( $post_id ); + $user_id = $post->post_author; + $userdata = get_userdata( $user_id ); + } else { + $userdata = new stdClass(); + $userdata->ID = 0; + $userdata->user_email = ''; + $userdata->first_name = ''; + $userdata->last_name = ''; + } + } + + switch ( $type ) { + case 'post': + $post = get_post( $post_id ); + $form_id = get_post_meta( $post_id, '_wpuf_form_id', true ); + $form = new Admin\Forms\Form( $form_id ); + $form_settings = $form->get_settings(); + $force_pack = $form->is_enabled_force_pack(); + $fallback_on = $form->is_enabled_fallback_cost(); + $post_count = $current_user->subscription()->has_post_count( $form_settings['post_type'] ); + if ( $force_pack && $fallback_on && ! is_wp_error( $current_pack ) && ! $post_count ) { + $amount = $form->get_subs_fallback_cost(); + } else { + $amount = $form->get_pay_per_post_cost(); + } + $item_number = $post->ID; + $item_name = $post->post_title; + break; + case 'pack': + $pack = wpuf()->subscription->get_subscription( $pack_id ); + $custom = $pack->meta_value; + $cost = $pack->meta_value['billing_amount']; + $amount = $cost; + $item_name = $pack->post_title; + $item_number = $pack->ID; + break; + } + $payment_vars = [ + 'currency' => wpuf_get_option( 'currency', 'wpuf_payment' ), + 'price' => $amount, + 'item_number' => $item_number, + 'item_name' => $item_name, + 'type' => $type, + 'user_info' => [ + 'id' => $userdata->ID, + 'email' => $userdata->user_email, + 'first_name' => $userdata->first_name, + 'last_name' => $userdata->last_name, + ], + 'date' => gmdate( 'Y-m-d H:i:s' ), + 'post_data' => $_POST, + 'custom' => isset( $custom ) ? $custom : '', + 'wpuf_payment_method' => $gateway, + ]; + if ( isset( $_POST['billing_address'] ) ) { + $address_fields = array_map( 'sanitize_text_field', wp_unslash( $_POST['billing_address'] ) ); + } else { + $address_fields = wpuf_get_user_address(); + } + if ( ! empty( $address_fields ) ) { + update_user_meta( $userdata->ID, 'wpuf_address_fields', $address_fields ); + } + /** + * Filter: wpuf_payment_vars + * + * @since 3.1.13 + */ + $payment_vars = apply_filters( 'wpuf_payment_vars', $payment_vars ); + do_action( 'wpuf_gateway_' . $gateway, $payment_vars ); + } + + /** + * Insert payment info to database + * + * @param array $data payment data to insert + * @param int $transaction_id the transaction id in case of update + * + * @global object $wpdb + */ + public static function insert_payment( $data, $transaction_id = 0, $recurring = false ) { + global $wpdb; + $user_id = get_current_user_id(); + //check if it's already there + $sql = $wpdb->prepare( 'SELECT transaction_id + FROM ' . $wpdb->prefix . 'wpuf_transaction + WHERE transaction_id = %s LIMIT 1', $transaction_id ); + $result = $wpdb->get_row( $sql ); + if ( $recurring !== false ) { + $profile_id = $data['profile_id']; + } + if ( isset( $data['profile_id'] ) || empty( $data['profile_id'] ) ) { + unset( $data['profile_id'] ); + } + if ( empty( $data['tax'] ) ) { + $data['tax'] = floatval( $data['cost'] ) - floatval( $data['subtotal'] ); + } + if ( wpuf_get_option( 'show_address', 'wpuf_address_options', false ) && ! empty( $data['user_id'] ) ) { + $data['payer_address'] = wpuf_get_user_address( $data['user_id'] ); + } + if ( ! empty( $data['payer_address'] ) ) { + $data['payer_address'] = maybe_serialize( $data['payer_address'] ); + } + if ( isset( $profile_id ) ) { + $data['profile_id'] = $profile_id; + } + + if ( ! $result ) { + $wpdb->insert( $wpdb->prefix . 'wpuf_transaction', $data ); + + do_action( 'wpuf_payment_received', $data, $recurring ); + } else { + $wpdb->update( $wpdb->prefix . 'wpuf_transaction', $data, [ 'transaction_id' => $transaction_id ] ); + } + //workaround for subscriptions can't be assigned from user profile regression + if ( ! did_action( 'wpuf_payment_received' ) ) { + do_action( 'wpuf_payment_received', $data, $recurring ); + } + } + + /** + * Send payment received mail + * + * @param array $info payment information + */ + public function payment_notify_admin( $info ) { + $headers = 'From: ' . get_bloginfo( 'name' ) . ' <' . get_bloginfo( 'admin_email' ) . '>' . "\r\n\\"; + // translators: %s is site title name + $subject = sprintf( __( '[%s] Payment Received', 'wp-user-frontend' ), get_bloginfo( 'name' ) ); + // translators: %s is site title name + $msg = sprintf( __( 'New payment received at %s', 'wp-user-frontend' ), get_bloginfo( 'name' ) ); + $receiver = get_bloginfo( 'admin_email' ); + wp_mail( $receiver, $subject, $msg, $headers ); + } + + /** + * Handle the cancel payment + * + * @since 2.4.1 + * + * @return void + */ + public function handle_cancel_payment() { + $nonce = isset( $_POST['wpuf_payment_cancel'] ) ? sanitize_text_field( wp_unslash( $_POST['wpuf_payment_cancel'] ) ) : ''; + $action = isset( $_POST['action'] ) ? sanitize_text_field( wp_unslash( $_POST['action'] ) ) : ''; + if ( ! isset( $_POST['wpuf_payment_cancel_submit'] ) || $action !== 'wpuf_cancel_pay' || ! wp_verify_nonce( $nonce, + '_wpnonce' ) ) { + return; + } + $gateway = isset( $_POST['gateway'] ) ? sanitize_text_field( wp_unslash( $_POST['gateway'] ) ) : ''; + do_action( "wpuf_cancel_payment_{$gateway}", $_POST ); + } +} diff --git a/includes/free/class-registration.php b/includes/Frontend/Registration.php similarity index 78% rename from includes/free/class-registration.php rename to includes/Frontend/Registration.php index 1b413c505..b81ada7a0 100644 --- a/includes/free/class-registration.php +++ b/includes/Frontend/Registration.php @@ -1,45 +1,34 @@ get_registration_url(); - switch ( $action ) { case 'register': return $this->get_registration_url(); break; - default: if ( empty( $redirect_to ) ) { return $root_url; @@ -86,18 +72,15 @@ public function get_action_url( $action = 'registration', $redirect_to = '' ) { * * @return bool|string */ - public function get_registration_url( $register_url = null ) { + public function get_registration_url( $register_url = NULL ) { $register_link_override = wpuf_get_option( 'register_link_override', 'wpuf_profile', false ); $page_id = wpuf_get_option( 'reg_override_page', 'wpuf_profile', false ); - if ( $register_link_override === 'off' ) { return $register_url; } - if ( ! $page_id ) { return false; } - $url = get_permalink( $page_id ); return apply_filters( 'wpuf_register_url', $url, $page_id ); @@ -112,14 +95,14 @@ public function get_registration_url( $register_url = null ) { */ public function get_action_links( $args = [] ) { $defaults = [ - 'register' => true, + 'register' => true, ]; - - $args = wp_parse_args( $args, $defaults ); - $links = []; - + $args = wp_parse_args( $args, $defaults ); + $links = []; if ( $args['register'] && get_option( 'users_can_register' ) ) { - $links[] = sprintf( '%s', $this->get_action_url( 'register' ), esc_html__( 'Register', 'wp-user-frontend' ) ); + $links[] = sprintf( + '%s', $this->get_action_url( 'register' ), esc_html__( 'Register', 'wp-user-frontend' ) + ); } return implode( ' | ', $links ); @@ -137,18 +120,14 @@ public function registration_form( $atts ) { ], $atts ); $userrole = $atts['role']; - - $user_nonce = base64_encode( random_bytes( WPUF_Encryption_Helper::get_encryption_nonce_length() ) ); + $user_nonce = base64_encode( random_bytes( Encryption_Helper::get_encryption_nonce_length() ) ); $roleencoded = wpuf_encryption( $userrole, $user_nonce ); - $reg_page = $this->get_registration_url(); if ( false === $reg_page ) { - return; + return ''; } - ob_start(); - if ( is_user_logged_in() ) { wpuf_load_template( 'logged-in.php', [ @@ -157,19 +136,16 @@ public function registration_form( $atts ) { ); } else { $queries = wp_unslash( $_GET ); - array_walk( - $queries, function ( &$a ) { - $a = sanitize_text_field( $a ); - } + $queries, function( &$a ) { + $a = sanitize_text_field( $a ); + } ); - $args = [ 'action_url' => add_query_arg( $queries, $reg_page ), 'userrole' => $roleencoded, 'user_nonce' => $user_nonce, ]; - wpuf_load_template( 'registration-form.php', $args ); } @@ -185,14 +161,11 @@ public function process_registration() { if ( ! empty( $_POST['wpuf_registration'] ) && ! empty( $_POST['_wpnonce'] ) ) { $userdata = []; $user = ''; - if ( isset( $_POST['_wpnonce'] ) ) { $nonce = sanitize_key( wp_unslash( $_POST['_wpnonce'] ) ); wp_verify_nonce( $nonce, 'wpuf_registration_action' ); } - $validation_error = new WP_Error(); - $reg_fname = isset( $_POST['reg_fname'] ) ? sanitize_text_field( wp_unslash( $_POST['reg_fname'] ) ) : ''; $reg_lname = isset( $_POST['reg_lname'] ) ? sanitize_text_field( wp_unslash( $_POST['reg_lname'] ) ) : ''; $reg_email = isset( $_POST['reg_email'] ) ? sanitize_email( wp_unslash( $_POST['reg_email'] ) ) : ''; @@ -200,92 +173,106 @@ public function process_registration() { $pwd2 = isset( $_POST['pwd2'] ) ? sanitize_text_field( wp_unslash( $_POST['pwd2'] ) ) : ''; $log = isset( $_POST['log'] ) ? sanitize_text_field( wp_unslash( $_POST['log'] ) ) : ''; $urhidden = isset( $_POST['urhidden'] ) ? sanitize_text_field( wp_unslash( $_POST['urhidden'] ) ) : ''; - $user_nonce = isset( $_POST['user_nonce'] ) ? sanitize_text_field( wp_unslash( $_POST['user_nonce'] ) ) : ''; - - $validation_error = apply_filters( 'wpuf_process_registration_errors', $validation_error, $reg_fname, $reg_lname, $reg_email, $log, $pwd1, $pwd2 ); - + $user_nonce = isset( $_POST['user_nonce'] ) ? sanitize_text_field( + wp_unslash( $_POST['user_nonce'] ) + ) : ''; + $validation_error = apply_filters( + 'wpuf_process_registration_errors', $validation_error, $reg_fname, $reg_lname, $reg_email, $log, $pwd1, + $pwd2 + ); if ( $validation_error->get_error_code() ) { - $this->registration_errors[] = '' . esc_html__( 'Error', 'wp-user-frontend' ) . ': ' . $validation_error->get_error_message(); + $this->registration_errors[] = '' . esc_html__( + 'Error', 'wp-user-frontend' + ) . ': ' . $validation_error->get_error_message(); return; } - if ( empty( $reg_fname ) ) { - $this->registration_errors[] = '' . esc_html__( 'Error', 'wp-user-frontend' ) . ': ' . esc_html__( 'First name is required.', 'wp-user-frontend' ); + $this->registration_errors[] = '' . esc_html__( + 'Error', 'wp-user-frontend' + ) . ': ' . esc_html__( 'First name is required.', 'wp-user-frontend' ); return; } - if ( empty( $reg_lname ) ) { - $this->registration_errors[] = '' . esc_html__( 'Error', 'wp-user-frontend' ) . ': ' . esc_html__( 'Last name is required.', 'wp-user-frontend' ); + $this->registration_errors[] = '' . esc_html__( + 'Error', 'wp-user-frontend' + ) . ': ' . esc_html__( 'Last name is required.', 'wp-user-frontend' ); return; } - if ( empty( $reg_email ) ) { - $this->registration_errors[] = '' . esc_html__( 'Error', 'wp-user-frontend' ) . ': ' . esc_html__( 'Email is required.', 'wp-user-frontend' ); + $this->registration_errors[] = '' . esc_html__( + 'Error', 'wp-user-frontend' + ) . ': ' . esc_html__( 'Email is required.', 'wp-user-frontend' ); return; } - if ( empty( $log ) ) { - $this->registration_errors[] = '' . esc_html__( 'Error', 'wp-user-frontend' ) . ': ' . esc_html__( 'Username is required.', 'wp-user-frontend' ); + $this->registration_errors[] = '' . esc_html__( + 'Error', 'wp-user-frontend' + ) . ': ' . esc_html__( 'Username is required.', 'wp-user-frontend' ); return; } - if ( empty( $pwd1 ) ) { - $this->registration_errors[] = '' . esc_html__( 'Error', 'wp-user-frontend' ) . ': ' . esc_html__( 'Password is required.', 'wp-user-frontend' ); + $this->registration_errors[] = '' . esc_html__( + 'Error', 'wp-user-frontend' + ) . ': ' . esc_html__( 'Password is required.', 'wp-user-frontend' ); return; } - if ( empty( $pwd2 ) ) { - $this->registration_errors[] = '' . esc_html__( 'Error', 'wp-user-frontend' ) . ': ' . esc_html__( 'Confirm Password is required.', 'wp-user-frontend' ); + $this->registration_errors[] = '' . esc_html__( + 'Error', 'wp-user-frontend' + ) . ': ' . esc_html__( 'Confirm Password is required.', 'wp-user-frontend' ); return; } - if ( $pwd1 !== $pwd2 ) { - $this->registration_errors[] = '' . esc_html__( 'Error', 'wp-user-frontend' ) . ': ' . esc_html__( 'Passwords are not same.', 'wp-user-frontend' ); + $this->registration_errors[] = '' . esc_html__( + 'Error', 'wp-user-frontend' + ) . ': ' . esc_html__( 'Passwords are not same.', 'wp-user-frontend' ); return; } - if ( get_user_by( 'login', $log ) === $log ) { - $this->registration_errors[] = '' . esc_html__( 'Error', 'wp-user-frontend' ) . ': ' . esc_html__( 'A user with same username already exists.', 'wp-user-frontend' ); + $this->registration_errors[] = '' . esc_html__( + 'Error', 'wp-user-frontend' + ) . ': ' . esc_html__( 'A user with same username already exists.', 'wp-user-frontend' ); return; } - if ( is_email( $log ) ) { $user = get_user_by( 'email', $log ); } - if ( $user && apply_filters( 'wpuf_get_username_from_email', true ) ) { if ( isset( $user->user_login ) ) { $userdata['user_login'] = $user->user_login; } else { - $this->registration_errors[] = '' . esc_html__( 'Error', 'wp-user-frontend' ) . ': ' . esc_html__( 'A user could not be found with this email address.', 'wp-user-frontend' ); + $this->registration_errors[] = '' . esc_html__( + 'Error', 'wp-user-frontend' + ) . ': ' . esc_html__( + 'A user could not be found with this email address.', + 'wp-user-frontend' + ); return; } } else { $userdata['user_login'] = $log; } - $dec_role = wpuf_decryption( $urhidden, $user_nonce ); $userdata['first_name'] = $reg_fname; $userdata['last_name'] = $reg_lname; $userdata['user_email'] = $reg_email; $userdata['user_pass'] = $pwd1; - if ( get_role( $dec_role ) ) { - $userdata['role'] = empty( $dec_role ) || 'administrator' === $dec_role ? get_option( 'default_role' ) : $dec_role; + $userdata['role'] = empty( $dec_role ) || 'administrator' === $dec_role ? get_option( + 'default_role' + ) : $dec_role; } - $user = wp_insert_user( $userdata ); - if ( is_wp_error( $user ) ) { $this->registration_errors[] = $user->get_error_message(); @@ -295,39 +282,42 @@ public function process_registration() { $user_login = stripslashes( $wpuf_user->user_login ); $user_email = stripslashes( $wpuf_user->user_email ); $blogname = wp_specialchars_decode( get_option( 'blogname' ), ENT_QUOTES ); - /* translators: %s: site name */ - $message = sprintf( esc_html__( 'New user registration on your site %s:', 'wp-user-frontend' ), get_option( 'blogname' ) ) . "\r\n\r\n"; + $message = sprintf( + esc_html__( 'New user registration on your site %s:', 'wp-user-frontend' ), + get_option( 'blogname' ) + ) . "\r\n\r\n"; /* translators: %s: username */ $message .= sprintf( esc_html__( 'Username: %s', 'wp-user-frontend' ), $user_login ) . "\r\n\r\n"; /* translators: %s: email */ $message .= sprintf( esc_html__( 'E-mail: %s', 'wp-user-frontend' ), $user_email ) . "\r\n"; $subject = 'New User Registration'; - $subject = apply_filters( 'wpuf_default_reg_admin_mail_subject', $subject ); $message = apply_filters( 'wpuf_default_reg_admin_mail_body', $message ); /* translators: %s %s: site name subject*/ - wp_mail( get_option( 'admin_email' ), sprintf( esc_html__( '[%1$s] %2$s', 'wp-user-frontend' ), $blogname, $subject ), $message ); + wp_mail( + get_option( 'admin_email' ), + sprintf( esc_html__( '[%1$s] %2$s', 'wp-user-frontend' ), $blogname, $subject ), $message + ); /* translators: %s: username */ $message = sprintf( esc_html__( 'Hi, %s', 'wp-user-frontend' ), $user_login ) . "\r\n"; $message .= 'Congrats! You are Successfully registered to ' . $blogname . "\r\n\r\n"; $message .= 'Thanks'; $subject = 'Thank you for registering'; - $subject = apply_filters( 'wpuf_default_reg_mail_subject', $subject ); $message = apply_filters( 'wpuf_default_reg_mail_body', $message ); /* translators: %s %s: site name subject*/ - wp_mail( $user_email, sprintf( esc_html__( '[%1$s] %2$s', 'wp-user-frontend' ), $blogname, $subject ), $message ); + wp_mail( + $user_email, sprintf( esc_html__( '[%1$s] %2$s', 'wp-user-frontend' ), $blogname, $subject ), + $message + ); } - $autologin_after_registration = wpuf_get_option( 'autologin_after_registration', 'wpuf_profile', 'on' ); - if ( $autologin_after_registration === 'on' ) { wp_clear_auth_cookie(); wp_set_current_user( $user ); wp_set_auth_cookie( $user ); } - if ( is_wp_error( $user ) ) { $this->registration_errors[] = $user->get_error_message(); @@ -352,12 +342,10 @@ public function process_registration() { public function wp_registration_page_redirect() { global $pagenow; $action = isset( $_GET['action'] ) ? sanitize_text_field( wp_unslash( $_GET['action'] ) ) : ''; - if ( ! is_admin() && $pagenow === 'wp-login.php' && $action === 'register' ) { if ( wpuf_get_option( 'register_link_override', 'wpuf_profile' ) !== 'on' ) { return; } - $reg_page = get_permalink( wpuf_get_option( 'reg_override_page', 'wpuf_profile', false ) ); wp_redirect( $reg_page ); exit; @@ -373,26 +361,24 @@ public function wp_registration_page_redirect() { */ public function registration_page_redirects() { global $post; - $registration_page = wpuf_get_option( 'reg_override_page', 'wpuf_profile' ); - if ( ! isset( $post->ID ) || $post->ID !== absint( $registration_page ) ) { return; } - // Choose subscription pack first then register if ( $this->is_activated_subscription_on_registration() ) { $subscription_page_id = wpuf_get_option( 'subscription_page', 'wpuf_payment' ); - if ( empty( $subscription_page_id ) ) { - WP_User_Frontend::log( 'subscription-on-registration', esc_html__( 'Subscription Page settings not set in admin settings', 'wp-user-frontend' ) ); + WP_User_Frontend::log( + 'subscription-on-registration', + esc_html__( 'Subscription Page settings not set in admin settings', 'wp-user-frontend' ) + ); + return; } - if ( isset( $_GET['type'] ) && 'wpuf_sub' === $_GET['type'] && ! empty( $_GET['pack_id'] ) ) { return; } - wp_safe_redirect( get_permalink( $subscription_page_id ) ); exit; } @@ -416,12 +402,10 @@ public function show_errors() { 'strong' => [], ] ); - if ( $this->registration_errors ) { foreach ( $this->registration_errors as $error ) { printf( - '
    %s
    ', - wp_kses( $error, $allowed_html ) + '
    %s
    ', wp_kses( $error, $allowed_html ) ); } } @@ -449,9 +433,9 @@ public function show_messages() { */ public static function get_posted_value( $key ) { $get = wp_unslash( $_GET ); - if ( isset( $_REQUEST[ $key ] ) ) { $required_key = sanitize_text_field( wp_unslash( $_REQUEST[ $key ] ) ); + return $required_key; } @@ -470,7 +454,6 @@ public static function get_posted_value( $key ) { public function is_activated_subscription_on_registration() { $enable_payment = wpuf_get_option( 'enable_payment', 'wpuf_payment' ); $register_subscription = wpuf_get_option( 'register_subscription', 'wpuf_payment' ); - if ( wpuf_validate_boolean( $enable_payment ) && wpuf_validate_boolean( $register_subscription ) ) { return true; } @@ -490,11 +473,9 @@ public function is_activated_subscription_on_registration() { */ public function redirect_to_payment_page( $redirect, $user ) { $get = wp_unslash( $_GET ); - if ( isset( $get['type'] ) && 'wpuf_sub' === $get['type'] && ! empty( $get['pack_id'] ) && $user ) { $payment_page_id = wpuf_get_option( 'payment_page', 'wpuf_payment' ); $payment_page = get_permalink( $payment_page_id ); - if ( $payment_page ) { $redirect = add_query_arg( [ diff --git a/includes/Frontend/Shortcode.php b/includes/Frontend/Shortcode.php new file mode 100644 index 000000000..98d904598 --- /dev/null +++ b/includes/Frontend/Shortcode.php @@ -0,0 +1,30 @@ +frontend->frontend_dashboard, 'shortcode' ] ); + add_shortcode( 'wpuf-registration', [ wpuf()->frontend->registration, 'registration_form' ] ); + add_shortcode( 'wpuf_form', [ wpuf()->frontend->frontend_form, 'add_post_shortcode' ] ); + add_shortcode( 'wpuf_edit', [ wpuf()->frontend->frontend_form, 'edit_post_shortcode' ] ); + add_shortcode( 'wpuf_editprofile', [ wpuf()->frontend->frontend_account, 'shortcode' ] ); + add_shortcode( 'wpuf_account', [ wpuf()->frontend->frontend_account, 'shortcode' ] ); + add_shortcode( 'wpuf-login', [ wpuf()->frontend->simple_login, 'login_form' ] ); + add_shortcode( 'wpuf_sub_info', [ wpuf()->subscription, 'subscription_info' ] ); + add_shortcode( 'wpuf_sub_pack', [ wpuf()->subscription, 'subscription_packs' ] ); + add_shortcode( 'wpuf-edit-users', 'wpuf_edit_users' ); + add_shortcode( 'wpuf-meta', 'wpuf_meta_shortcode' ); + } +} diff --git a/includes/Frontend_Render_Form.php b/includes/Frontend_Render_Form.php new file mode 100644 index 000000000..a3d49e3b9 --- /dev/null +++ b/includes/Frontend_Render_Form.php @@ -0,0 +1,399 @@ + false, + 'error' => $error, + ] + ); + die(); + } + + + + /** + * render submit button + * + * @param [type] $form_id [description] + * @param [type] $form_settings [description] + * @param [type] $post_id [description] + */ + public function submit_button( $form_id, $form_settings, $post_id = null ) { ?> + +
  • +
    +   +
    + + + + + + + + + + + + + + + + + + + + + + +
  • + + +
  • +
    + +
    + +
    + +
    +
  • + + + + + + + + + __( 'Form Preview', 'wp-user-frontend' ) + + + + + + + +
    + render_form( $form_id, null, null, null ); ?> +
    + + + + ' . __( 'Your selected form is no longer available.', 'wp-user-frontend' ) . '
    ' ); + + return; + } + + if ( $form_status != 'publish' ) { + echo wp_kses_post( '
    ' . __( "Please make sure you've published your form.", 'wp-user-frontend' ) . '
    ' ); + + return; + } + + $label_position = isset( $this->form_settings['label_position'] ) ? $this->form_settings['label_position'] : 'left'; + + $layout = isset( $this->form_settings['form_layout'] ) ? $this->form_settings['form_layout'] : 'layout1'; + + $theme_css = isset( $this->form_settings['use_theme_css'] ) ? $this->form_settings['use_theme_css'] : 'wpuf-style'; + + do_action( 'wpuf_before_form_render', $form_id ); + + if ( ! empty( $layout ) ) { + wp_enqueue_style( 'wpuf-' . $layout ); + } + + if ( ! is_user_logged_in() && $this->form_settings['guest_post'] !== 'true' ) { + echo wp_kses_post( '
    ' . $this->form_settings['message_restrict'] . '
    ' ); + + return; + } + + if ( + isset( $this->form_settings['role_base'] ) + && wpuf_validate_boolean( $this->form_settings['role_base'] ) + && ! wpuf_user_has_roles( $this->form_settings['roles'] ) + ) { + ?> +
    + form_fields ) { + ?> + +
    + + + + +
      + + form_fields ); + + if ( ! $post_id ) { + do_action( 'wpuf_add_post_form_top', $form_id, $this->form_settings ); + } else { + do_action( 'wpuf_edit_post_form_top', $form_id, $post_id, $this->form_settings ); + } + + if ( ! is_user_logged_in() && $this->form_settings['guest_post'] == 'true' && $this->form_settings['guest_details'] == 'true' ) { + $this->guest_fields( $this->form_settings ); + } + + $this->render_featured_field( $post_id ); + + wpuf()->fields->render_fields( $this->form_fields, $form_id, $atts, $type = 'post', $post_id ); + + $this->submit_button( $form_id, $this->form_settings, $post_id ); + + if ( ! $post_id ) { + do_action( 'wpuf_add_post_form_bottom', $form_id, $this->form_settings ); + } else { + do_action( 'wpuf_edit_post_form_bottom', $form_id, $post_id, $this->form_settings ); + } + + ?> + +
    + +
    + + form_settings['post_type'] ) ? $this->form_settings['post_type'] : 'post'; + $featured_item = ! empty( $user_sub['total_feature_item'] ) ? $user_sub['total_feature_item'] : 0; + + if ( ! empty( $user_sub['total_feature_item'] ) || $is_featured ) { + ?> +
  • +
    + +
    +
    + +
    +
  • + + $value ) { + // get column field input fields + if ( $value['input_type'] == 'column_field' ) { + $inner_fields = $value['inner_fields']; + + foreach ( $inner_fields as $column_key => $column_fields ) { + if ( ! empty( $column_fields ) ) { + // ignore section break and HTML input type + foreach ( $column_fields as $column_field_key => $column_field ) { + if ( in_array( $column_field['input_type'], $ignore_lists ) ) { + continue; + } + + //separate the post and custom fields + if ( isset( $column_field['is_meta'] ) && $column_field['is_meta'] == 'yes' ) { + $meta_vars[] = $column_field; + continue; + } + + if ( $column_field['input_type'] == 'taxonomy' ) { + + // don't add "category" + // if ( $column_field['name'] == 'category' ) { + // continue; + // } + + $taxonomy_vars[] = $column_field; + } else { + $post_vars[] = $column_field; + } + } + } + } + continue; + } + + // ignore section break and HTML input type + if ( in_array( $value['input_type'], $ignore_lists ) ) { + continue; + } + + //separate the post and custom fields + if ( isset( $value['is_meta'] ) && $value['is_meta'] == 'yes' ) { + $meta_vars[] = $value; + continue; + } + + if ( $value['input_type'] == 'taxonomy' ) { + + // don't add "category" + // if ( $value['name'] == 'category' ) { + // continue; + // } + + $taxonomy_vars[] = $value; + } else { + $post_vars[] = $value; + } + } + + return [ $post_vars, $taxonomy_vars, $meta_vars ]; + } +} diff --git a/includes/class-installer.php b/includes/Installer.php similarity index 98% rename from includes/class-installer.php rename to includes/Installer.php index 718ef6bd7..44752d584 100644 --- a/includes/class-installer.php +++ b/includes/Installer.php @@ -1,11 +1,13 @@ id, [ $this, 'dismiss_notice' ] ); - add_action( 'wp_ajax_wpuf_compatibility_' . $this->id, [ $this, 'maybe_compatible' ] ); - add_action( 'wp_ajax_wpuf_migrate_' . $this->id, [ $this, 'migrate_cf_data' ] ); add_filter( 'acf/load_value', [ $this, 'load_compatible_value' ], 10, 3 ); add_action( 'wpuf_add_post_after_insert', [ $this, 'update_acf_field_meta' ], 10, 4 ); } @@ -67,52 +65,60 @@ public function dismiss_prompt() { /** * Update option * - *@return void + * @return void */ public function maybe_compatible() { - wpuf_update_option( 'wpuf_compatibility_' . $this->id, 'wpuf_general', 'yes' ); + if ( empty( $_POST['nonce'] ) || ! wp_verify_nonce( sanitize_key( wp_unslash( $_POST['nonce'] ) ), 'wpuf_acf_compatibility' ) ) { + wp_send_json_error( __( 'Permission denied', 'wp-user-frontend' ) ); + } + if ( ! current_user_can( wpuf_admin_role() ) ) { + wp_send_json_error( __( 'Unauthorized operation', 'wp-user-frontend' ) ); + } + + wpuf_update_option( 'wpuf_compatibility_' . $this->id, 'wpuf_general', 'yes' ); wp_send_json_success(); } /** * Update existing custom fields data * - *@return void + * @return void */ public function migrate_cf_data() { - $forms = $this->get_post_forms(); + if ( empty( $_POST['nonce'] ) || ! wp_verify_nonce( sanitize_key( wp_unslash( $_POST['nonce'] ) ), 'wpuf_acf_migration' ) ) { + wp_send_json_error( __( 'Permission denied', 'wp-user-frontend' ) ); + } + if ( ! current_user_can( wpuf_admin_role() ) ) { + wp_send_json_error( __( 'Unauthorized operation', 'wp-user-frontend' ) ); + } + + $forms = $this->get_post_forms(); if ( ! empty( $forms ) ) { foreach ( $forms as $form ) { - $form_id = $form->ID; - $form_vars = wpuf_get_form_fields( $form_id ); - $form_settings = wpuf_get_form_settings( $form_id ); - $post_type = $form_settings['post_type']; - + $form_id = $form->ID; + $form_vars = wpuf_get_form_fields( $form_id ); + $form_settings = wpuf_get_form_settings( $form_id ); + $post_type = $form_settings['post_type']; foreach ( $form_vars as $attr ) { $field_type = $attr['input_type']; $meta = $attr['is_meta']; - if ( $meta == 'yes' && ( $field_type == 'checkbox' || $field_type == 'multiselect' ) ) { $meta_key = $attr['name']; - - $args = [ - 'post_type' => $post_type, - 'meta_key' => '_wpuf_form_id', + $args = [ + 'post_type' => $post_type, + 'meta_key' => '_wpuf_form_id', ]; $posts = get_posts( $args ); - if ( ! empty( $posts ) ) { foreach ( $posts as $post ) { $post_id = $post->ID; $separator = '| '; $meta_value = get_post_meta( $post_id, $meta_key ); - if ( ! empty( $meta_value ) ) { $new_value = explode( $separator, $meta_value[0] ); $new_value = maybe_serialize( $new_value ); - update_post_meta( $post_id, $meta_key, $new_value ); } } @@ -121,17 +127,15 @@ public function migrate_cf_data() { } } } - update_option( 'wpuf_migrate_' . $this->id, 'yes' ); wpuf_update_option( 'wpuf_compatibility_' . $this->id, 'wpuf_general', 'yes' ); - wp_send_json_success(); } /** * Get all post form * - *@return array + * @return array */ public function get_post_forms() { $args = [ @@ -148,8 +152,15 @@ public function get_post_forms() { * @return void */ public function dismiss_notice() { - $this->dismiss_prompt(); + if ( empty( $_POST['nonce'] ) || ! wp_verify_nonce( sanitize_key( wp_unslash( $_POST['nonce'] ) ), 'wpuf_dismiss_acf_notice' ) ) { + wp_send_json_error( __( 'Permission denied', 'wp-user-frontend' ) ); + } + + if ( ! current_user_can( wpuf_admin_role() ) ) { + wp_send_json_error( __( 'Unauthorized operation', 'wp-user-frontend' ) ); + } + $this->dismiss_prompt(); wp_send_json_success(); } @@ -162,81 +173,102 @@ public function maybe_show_notice() { if ( ! $this->plugin_exists() ) { return; } - if ( $this->is_dismissed() || $this->is_compatible() || $this->is_migrated() || ! current_user_can( 'manage_options' ) ) { return; } ?>
    -

    title ) ); ?>

    -

    %s installed. What do you want to do with WPUF?', 'wp-user-frontend' ) ), esc_html( $this->title ) ); ?>

    -

    Compatible:

    -

    Compatible & Migrate:

    +

    title ) ); ?>

    +

    %s installed. What do you want to do with WPUF?', + 'wp-user-frontend' ) ), esc_html( $this->title ) ); ?>

    +

    Compatible:

    +

    Compatible & + Migrate:

    - - - + + +

    fields->get_field( 'checkbox_field' )->get_formatted_value( $value ); break; - default: break; } @@ -277,28 +308,21 @@ public function load_compatible_value( $value, $post_id, $field ) { * @param $meta_vars */ public function update_acf_field_meta( $post_id, $form_id, $form_settings, $meta_vars ) { - if ( ! $this->plugin_exists() ){ + if ( ! $this->plugin_exists() ) { return; } - - $groups = acf_get_field_groups( [ 'post_type' => $form_settings['post_type'] ] ); + $groups = acf_get_field_groups( [ 'post_type' => $form_settings['post_type'] ] ); $existing_meta = get_post_meta( $post_id ); - foreach ( acf_get_fields( $groups ) as $group ) { $meta_key = '_' . $group['name']; - $name = $group['name']; - + $name = $group['name']; if ( 'repeater' === $group['type'] ) { $meta_key = 'repeater'; } - //check key also in meta vars - $meta_keys = array_map( - function ( $meta_var ) { - return $meta_var['name']; - }, $meta_vars - ); - + $meta_keys = array_map( function( $meta_var ) { + return $meta_var['name']; + }, $meta_vars ); if ( ! array_key_exists( $meta_key, $existing_meta ) && in_array( $name, $meta_keys, true ) ) { update_post_meta( $post_id, $meta_key, $group['key'] ); } diff --git a/includes/class-dokan-integration.php b/includes/Integrations/WPUF_Dokan_Integration.php similarity index 91% rename from includes/class-dokan-integration.php rename to includes/Integrations/WPUF_Dokan_Integration.php index 36cfe74f0..a82f45c12 100644 --- a/includes/class-dokan-integration.php +++ b/includes/Integrations/WPUF_Dokan_Integration.php @@ -1,7 +1,8 @@ __( 'Posts', 'wp-user-frontend' ), - 'icon' => '', + 'icon' => '', 'url' => dokan_get_navigation_url( 'posts' ), 'pos' => 56, ]; @@ -44,10 +44,10 @@ public function add_wpuf_posts_page( $urls ) { /** * Load posts template * - * @param array $query_vars - * * @since 2.7 * + * @param array $query_vars + * * @return void */ public function load_wpuf_posts_template( $query_vars ) { @@ -59,10 +59,10 @@ public function load_wpuf_posts_template( $query_vars ) { /** * Register WPUF query var * - * @param array $query_vars - * * @since 2.7 * + * @param array $query_vars + * * @return void */ public function register_wpuf_posts_queryvar( $query_vars ) { @@ -74,10 +74,10 @@ public function register_wpuf_posts_queryvar( $query_vars ) { /** * Dokan settings for WPUF integration * - * @param array $settings_fields - * * @since 2.7 * + * @param array $settings_fields + * * @return array $settings_fields */ public function dokan_wpuf_settings( $settings_fields ) { @@ -85,10 +85,9 @@ public function dokan_wpuf_settings( $settings_fields ) { 'name' => 'allow_wpuf_post', 'label' => __( 'Allow Post', 'wp-user-frontend' ), 'desc' => __( 'Allow Vendors to submit post from dashboard area', 'wp-user-frontend' ), - 'type' => 'checkbox', + 'type' => 'switcher', 'default' => 'off', ]; - $settings_fields['dokan_general']['wpuf_post_forms'] = [ 'name' => 'wpuf_post_forms', 'label' => __( 'Select Post Form', 'wp-user-frontend' ), @@ -104,27 +103,23 @@ public function dokan_wpuf_settings( $settings_fields ) { /** * Get all the post forms * - * @param string $post_type - * * @since 2.7 * + * @param string $post_type + * * @return array $post_forms */ public function get_post_forms( $post_type = 'post' ) { $post_forms = []; - $args = [ 'post_type' => 'wpuf_forms', 'post_status' => 'publish', - 'numberposts' => -1, + 'numberposts' => - 1, ]; - $form_posts = get_posts( $args ); - foreach ( $form_posts as $form ) { $form_settings = wpuf_get_form_settings( $form->ID ); $form_post_type = isset( $form_settings['post_type'] ) ? $form_settings['post_type'] : ''; - if ( $form_post_type === $post_type ) { $post_forms[ $form->ID ] = $form->post_title; } @@ -136,26 +131,21 @@ public function get_post_forms( $post_type = 'post' ) { /** * Generate edit post link * - * @param string $url - * * @since 2.7 * + * @param string $url + * * @return string $url */ public function generate_edit_post_link( $url ) { global $post; - $posts_page_url = dokan_get_navigation_url( 'posts' ); $dashboard = (int) dokan_get_option( 'dashboard', 'dokan_pages' ); - if ( is_page( $dashboard ) ) { - $url = add_query_arg( - [ - 'action' => 'edit-post', - 'pid' => $post->ID, - ], - $posts_page_url - ); + $url = add_query_arg( [ + 'action' => 'edit-post', + 'pid' => $post->ID, + ], $posts_page_url ); } return $url; diff --git a/includes/class-wcmp-integration.php b/includes/Integrations/WPUF_WCMp_Integration.php similarity index 85% rename from includes/class-wcmp-integration.php rename to includes/Integrations/WPUF_WCMp_Integration.php index 729b3b450..fc0be2a8c 100644 --- a/includes/class-wcmp-integration.php +++ b/includes/Integrations/WPUF_WCMp_Integration.php @@ -1,7 +1,8 @@ 'allow_wpuf_post', 'value' => 'yes', ]; - $settings_fields['wpuf_post_forms'] = [ 'title' => __( 'Select Post Form', 'wp-user-frontend' ), 'type' => 'select', 'id' => 'wpuf_post_forms', 'name' => 'wpuf_post_forms', 'label_for' => 'wpuf_post_forms', - 'desc' => stripslashes( __( 'Select a post form that will show on the vendor dashboard.', 'wp-user-frontend' ) ), + 'desc' => stripslashes( __( 'Select a post form that will show on the vendor dashboard.', + 'wp-user-frontend' ) ), 'options' => $this->get_post_forms(), ]; @@ -58,17 +60,16 @@ public function add_wpuf_options( $settings_fields ) { /** * Sanitize option fields * - * @param array $new_input, $input - * * @since 3.0 * + * @param array $new_input , $input + * * @return array $new_input */ public function option_fields_sanitize( $new_input, $input ) { if ( isset( $input['allow_wpuf_post'] ) ) { $new_input['allow_wpuf_post'] = sanitize_text_field( $input['allow_wpuf_post'] ); } - if ( isset( $input['wpuf_post_forms'] ) ) { $new_input['wpuf_post_forms'] = $input['wpuf_post_forms']; } @@ -116,16 +117,17 @@ public function wcmp_vendor_dashboard_submit_post_endpoint() { /** * Insert new URL's to the dashboard navigation bar * - * @param array $urls - * * @since 2.7 * + * @param array $urls + * * @return array */ public function add_wpuf_posts_page( $vendor_nav ) { $vendor_nav['submit-post'] = [ 'label' => __( 'Submit Post', 'wp-user-frontend' ), - 'url' => wcmp_get_vendor_dashboard_endpoint_url( get_wcmp_vendor_settings( 'wcmp_vendor_submit_post_endpoint', 'vendor', 'general', 'submit-post' ) ), + 'url' => wcmp_get_vendor_dashboard_endpoint_url( get_wcmp_vendor_settings( 'wcmp_vendor_submit_post_endpoint', + 'vendor', 'general', 'submit-post' ) ), 'capability' => apply_filters( 'wcmp_vendor_dashboard_menu_vendor_submit_post_capability', true ), 'position' => 90, 'submenu' => [], @@ -142,7 +144,8 @@ public function add_wpuf_posts_page( $vendor_nav ) { public function add_query_var( $query_vars ) { $query_vars['submit-post'] = [ 'label' => __( 'Submit Post', 'wp-user-frontend' ), - 'endpoint' => get_wcmp_vendor_settings( 'wcmp_vendor_submit_post_endpoint', 'vendor', 'general', 'submit-post' ), + 'endpoint' => get_wcmp_vendor_settings( 'wcmp_vendor_submit_post_endpoint', 'vendor', 'general', + 'submit-post' ), ]; return $query_vars; @@ -151,27 +154,23 @@ public function add_query_var( $query_vars ) { /** * Get all the post forms * - * @param string $post_type - * * @since 3.0 * + * @param string $post_type + * * @return array $post_forms */ public function get_post_forms( $post_type = 'post' ) { $post_forms = []; - $args = [ 'post_type' => 'wpuf_forms', 'post_status' => 'publish', - 'numberposts' => -1, + 'numberposts' => - 1, ]; - $form_posts = get_posts( $args ); - foreach ( $form_posts as $form ) { $form_settings = wpuf_get_form_settings( $form->ID ); $form_post_type = isset( $form_settings['post_type'] ) ? $form_settings['post_type'] : ''; - if ( $form_post_type === $post_type ) { $post_forms[ $form->ID ] = $form->post_title; } @@ -183,25 +182,21 @@ public function get_post_forms( $post_type = 'post' ) { /** * Generate edit post link * - * @param string $url - * * @since 3.0 * + * @param string $url + * * @return string $url */ public function generate_edit_post_link( $url ) { global $post; - - $posts_page_url = wcmp_get_vendor_dashboard_endpoint_url( get_wcmp_vendor_settings( 'wcmp_vendor_submit_post_endpoint', 'vendor', 'general', 'submit-post' ) ); - + $posts_page_url = wcmp_get_vendor_dashboard_endpoint_url( get_wcmp_vendor_settings( 'wcmp_vendor_submit_post_endpoint', + 'vendor', 'general', 'submit-post' ) ); if ( is_vendor_dashboard() ) { - $url = add_query_arg( - [ - 'action' => 'edit-post', - 'pid' => $post->ID, - ], - $posts_page_url - ); + $url = add_query_arg( [ + 'action' => 'edit-post', + 'pid' => $post->ID, + ], $posts_page_url ); } return $url; @@ -213,21 +208,17 @@ public function generate_edit_post_link( $url ) { public function update_edit_post_redirect_url( $response, $post_id, $form_id, $form_settings ) { $user = wp_get_current_user(); $role = (array) $user->roles; - $selected_form = ( get_wcmp_vendor_settings( 'wpuf_post_forms', 'general' ) ) ? get_wcmp_vendor_settings( 'wpuf_post_forms', 'general' ) : ''; - + $selected_form = ( get_wcmp_vendor_settings( 'wpuf_post_forms', + 'general' ) ) ? get_wcmp_vendor_settings( 'wpuf_post_forms', 'general' ) : ''; if ( $role[0] === 'dc_vendor' && $form_id === $selected_form && $form_settings['edit_redirect_to'] === 'same' ) { - $post_page_url = wcmp_get_vendor_dashboard_endpoint_url( get_wcmp_vendor_settings( 'wcmp_vendor_submit_post_endpoint', 'vendor', 'general', 'submit-post' ) ); - - $redirect_url = add_query_arg( - [ - 'action' => 'edit-post', - 'pid' => $post_id, - '_wpnonce' => wp_create_nonce( 'wpuf_edit' ), - 'msg' => 'post_updated', - ], - $post_page_url - ); - + $post_page_url = wcmp_get_vendor_dashboard_endpoint_url( get_wcmp_vendor_settings( 'wcmp_vendor_submit_post_endpoint', + 'vendor', 'general', 'submit-post' ) ); + $redirect_url = add_query_arg( [ + 'action' => 'edit-post', + 'pid' => $post_id, + '_wpnonce' => wp_create_nonce( 'wpuf_edit' ), + 'msg' => 'post_updated', + ], $post_page_url ); $response['redirect_to'] = $redirect_url; } @@ -239,14 +230,11 @@ public function update_edit_post_redirect_url( $response, $post_id, $form_id, $f */ public function update_delete_post_redirect_url( $redirect_url ) { if ( is_vendor_dashboard() ) { - $post_page_url = wcmp_get_vendor_dashboard_endpoint_url( get_wcmp_vendor_settings( 'wcmp_vendor_submit_post_endpoint', 'vendor', 'general', 'submit-post' ) ); - - $redirect_url = add_query_arg( - [ - 'msg' => 'deleted', - ], - $post_page_url - ); + $post_page_url = wcmp_get_vendor_dashboard_endpoint_url( get_wcmp_vendor_settings( 'wcmp_vendor_submit_post_endpoint', + 'vendor', 'general', 'submit-post' ) ); + $redirect_url = add_query_arg( [ + 'msg' => 'deleted', + ], $post_page_url ); } return $redirect_url; diff --git a/includes/class-wc-vendors-integration.php b/includes/Integrations/WPUF_WC_Vendors_Integration.php similarity index 57% rename from includes/class-wc-vendors-integration.php rename to includes/Integrations/WPUF_WC_Vendors_Integration.php index b1525f5cc..a84e76648 100644 --- a/includes/class-wc-vendors-integration.php +++ b/includes/Integrations/WPUF_WC_Vendors_Integration.php @@ -1,7 +1,8 @@ __( 'Allow Post', 'wp-user-frontend' ), - 'desc' => __( 'If checked, vendor can submit post from dashboard area.', 'wp-user-frontend' ), - 'id' => 'allow_wcvendors_wpuf_post', - 'default' => 'no', - 'type' => 'checkbox', + 'title' => __( 'Allow Post', 'wp-user-frontend' ), + 'desc' => __( 'If checked, vendor can submit post from dashboard area.', 'wp-user-frontend' ), + 'id' => 'allow_wcvendors_wpuf_post', + 'default' => 'no', + 'type' => 'checkbox', ]; - $settings[] = [ - 'title' => __( 'Select Post Form', 'wp-user-frontend' ), - 'desc_tip' => __( 'Select a post form that will show on the vendor dashboard.', 'wp-user-frontend' ), - 'id' => 'wcvendors_wpuf_allowed_post_form', - 'type' => 'select', - 'class' => 'wc-enhanced-select', - 'options' => $this->get_post_forms(), + 'title' => __( 'Select Post Form', 'wp-user-frontend' ), + 'desc_tip' => __( 'Select a post form that will show on the vendor dashboard.', 'wp-user-frontend' ), + 'id' => 'wcvendors_wpuf_allowed_post_form', + 'type' => 'select', + 'class' => 'wc-enhanced-select', + 'options' => $this->get_post_forms(), ]; - array_push( $settings, $last_option ); return $settings; @@ -57,27 +54,23 @@ public function add_wpuf_options( $settings, $current_section ) { /** * Get all the post forms * - * @param string $post_type - * * @since 3.0 * + * @param string $post_type + * * @return array $post_forms */ public function get_post_forms( $post_type = 'post' ) { $post_forms = []; - $args = [ 'post_type' => 'wpuf_forms', 'post_status' => 'publish', - 'numberposts' => -1, + 'numberposts' => - 1, ]; - $form_posts = get_posts( $args ); - foreach ( $form_posts as $form ) { $form_settings = wpuf_get_form_settings( $form->ID ); $form_post_type = isset( $form_settings['post_type'] ) ? $form_settings['post_type'] : ''; - if ( $form_post_type === $post_type ) { $post_forms[ $form->ID ] = $form->post_title; } @@ -89,27 +82,22 @@ public function get_post_forms( $post_type = 'post' ) { /** * Insert new URL's to the frontend dashboard navigation bar * - * @param array $urls - * * @since 3.0 * + * @param array $urls + * * @return array */ public function add_wpuf_posts_page() { $allow_wpuf_post = get_option( 'allow_wcvendors_wpuf_post', 'no' ); - if ( $allow_wpuf_post === 'yes' ) { $dashboard_url = get_permalink( get_option( 'wcvendors_vendor_dashboard_page_id' ) ); - $post_page_url = add_query_arg( - [ - 'action' => 'post-listing', - ], $dashboard_url - ); - - $output = ''; + $post_page_url = add_query_arg( [ + 'action' => 'post-listing', + ], $dashboard_url ); + $output = ''; $output .= __( 'Posts', 'wp-user-frontend' ); $output .= ''; - echo wp_kses_post( $output ); } } @@ -119,49 +107,49 @@ public function add_wpuf_posts_page() { */ public function after_dashboard() { $action = isset( $_GET['action'] ) ? sanitize_text_field( wp_unslash( $_GET['action'] ) ) : ''; - if ( $action === 'post-listing' || $action === 'new-post' || $action === 'edit-post' || $action === 'del' ) { wpuf_load_template( 'wc-vendors/posts.php' ); ?> - - + + 'edit-post', - 'pid' => $post->ID, - ], - $posts_page_url - ); + $url = add_query_arg( [ + 'action' => 'edit-post', + 'pid' => $post->ID, + ], $posts_page_url ); } return $url; @@ -200,20 +183,14 @@ public function update_edit_post_redirect_url( $response, $post_id, $form_id, $f $user = wp_get_current_user(); $role = (array) $user->roles; $selected_form = get_option( 'wcvendors_wpuf_allowed_post_form', '' ); - if ( $role[0] === 'vendor' && $form_id === $selected_form && $form_settings['edit_redirect_to'] === 'same' ) { $post_page_url = get_permalink( get_option( 'wcvendors_vendor_dashboard_page_id' ) ); - - $redirect_url = add_query_arg( - [ - 'action' => 'edit-post', - 'pid' => $post_id, - '_wpnonce' => wp_create_nonce( 'wpuf_edit' ), - 'msg' => 'post_updated', - ], - $post_page_url - ); - + $redirect_url = add_query_arg( [ + 'action' => 'edit-post', + 'pid' => $post_id, + '_wpnonce' => wp_create_nonce( 'wpuf_edit' ), + 'msg' => 'post_updated', + ], $post_page_url ); $response['redirect_to'] = $redirect_url; } @@ -226,14 +203,10 @@ public function update_edit_post_redirect_url( $response, $post_id, $form_id, $f public function update_delete_post_redirect_url( $redirect_url ) { if ( is_page( get_option( 'wcvendors_vendor_dashboard_page_id' ) ) ) { $post_page_url = get_permalink( get_option( 'wcvendors_vendor_dashboard_page_id' ) ); - - $redirect_url = add_query_arg( - [ - 'action' => 'post-listing', - 'msg' => 'deleted', - ], - $post_page_url - ); + $redirect_url = add_query_arg( [ + 'action' => 'post-listing', + 'msg' => 'deleted', + ], $post_page_url ); } return $redirect_url; diff --git a/includes/log/class-log.php b/includes/Log/WPUF_Log.php similarity index 88% rename from includes/log/class-log.php rename to includes/Log/WPUF_Log.php index 4fd02ac11..49b7b37ae 100644 --- a/includes/log/class-log.php +++ b/includes/Log/WPUF_Log.php @@ -5,7 +5,7 @@ class WPUF_Log { /** * wpdb query logger * - * @var \WPUF_Log_WPDB_Query + * @var WPUF_Log_WPDB_Query */ public $wpdb_query; diff --git a/includes/log/class-log-wpdb-query.php b/includes/Log/WPUF_Log_WPDB_Query.php similarity index 100% rename from includes/log/class-log-wpdb-query.php rename to includes/Log/WPUF_Log_WPDB_Query.php diff --git a/includes/Pro_Upgrades.php b/includes/Pro_Upgrades.php new file mode 100755 index 000000000..3afef0419 --- /dev/null +++ b/includes/Pro_Upgrades.php @@ -0,0 +1,95 @@ +pro_fields = new Fields\Form_Pro_Upgrade_Fields(); + + $preview_fields = wpuf()->pro_fields->get_fields(); + + return array_merge( $fields, $preview_fields ); + } + + /** + * Register fields to custom field section + * + * @param array $fields + */ + public function add_to_custom_fields( $fields ) { + $pro_fields = [ + 'repeat_field', + 'date_field', + 'file_upload', + 'country_list_field', + 'numeric_text_field', + 'address_field', + 'google_map', + 'step_start', + ]; + + return array_merge( $fields, $pro_fields ); + } + + /** + * Register fields to others field section + * + * @param array $fields + */ + public function add_to_others_fields( $fields ) { + $pro_fields = [ + 'shortcode', + 'action_hook', + 'toc', + 'ratings', + 'embed', + 'really_simple_captcha', + 'math_captcha', + 'qr_code', + ]; + + return array_merge( $fields, $pro_fields ); + } + + /** + * Add conditional logic prompt + * + * @param array $settings + */ + public function add_conditional_field_prompt( $settings ) { + $settings['settings'][] = [ + 'name' => 'wpuf_cond', + 'title' => __( 'Conditional Logic', 'wp-user-frontend' ), + 'type' => 'option-pro-feature-alert', + 'section' => 'advanced', + 'priority' => 30, + 'help_text' => '', + 'is_pro_feature' => true, + ]; + + return $settings; + } +} diff --git a/includes/Render_Form.php b/includes/Render_Form.php new file mode 100644 index 000000000..97087393f --- /dev/null +++ b/includes/Render_Form.php @@ -0,0 +1,1639 @@ + false, + 'error' => $error, + ] ); + + die(); + } + + /** + * Really simple captcha validation + * + * @return void + */ + public function validate_rs_captcha() { + $nonce = isset( $_REQUEST['wpuf-login-nonce'] ) ? sanitize_key( wp_unslash( $_REQUEST['wpuf-login-nonce'] ) ) : ''; + + if ( isset( $nonce) && ! wp_verify_nonce( $nonce, 'wpuf_login_action' ) ) { + return ; + } + + $rs_captcha_input = isset( $_POST['rs_captcha'] ) ? sanitize_text_field( wp_unslash( $_POST['rs_captcha'] ) ) : ''; + $rs_captcha_file = isset( $_POST['rs_captcha_val'] ) ? sanitize_text_field( wp_unslash( $_POST['rs_captcha_val'] ) ) : ''; + + if ( class_exists( 'ReallySimpleCaptcha' ) ) { + $captcha_instance = new ReallySimpleCaptcha(); + + if ( !$captcha_instance->check( $rs_captcha_file, $rs_captcha_input ) ) { + $this->send_error( __( 'Really Simple Captcha validation failed', 'wp-user-frontend' ) ); + } else { + // validation success, remove the files + $captcha_instance->remove( $rs_captcha_file ); + } + } + } + + /** + * reCaptcha Validation + * + * @return void + */ + public function validate_re_captcha( $no_captcha = '', $invisible = '' ) { + $nonce = isset( $_REQUEST['wpuf-login-nonce'] ) ? sanitize_key( wp_unslash( $_REQUEST['wpuf-login-nonce'] ) ) : ''; + + if ( isset( $nonce ) && ! wp_verify_nonce( $nonce, 'wpuf_login_action' ) ) { + return ; + } + // need to check if invisible reCaptcha need library or we can do it here. + // ref: https://shareurcodes.com/blog/google%20invisible%20recaptcha%20integration%20with%20php + $site_key = wpuf_get_option( 'recaptcha_public', 'wpuf_general' ); + $private_key = wpuf_get_option( 'recaptcha_private', 'wpuf_general' ); + $rremote_addr = isset( $_SERVER['REMOTE_ADDR'] ) ? sanitize_text_field( wp_unslash( $_SERVER['REMOTE_ADDR'] ) ) : ''; + $g_recaptcha_response = isset( $_POST['g-recaptcha-response'] ) ? sanitize_text_field( wp_unslash( $_POST['g-recaptcha-response'] ) ) : ''; + + if ( $no_captcha == 1 && 0 == $invisible ) { + if ( !class_exists( 'WPUF_ReCaptcha' ) ) { + require_once WPUF_ROOT . '/Lib/recaptchalib_noCaptcha.php'; + } + + $response = null; + $reCaptcha = new WPUF_ReCaptcha( $private_key ); + + $resp = $reCaptcha->verifyResponse( + $rremote_addr, + $g_recaptcha_response + ); + + if ( !$resp->success ) { + $this->send_error( __( 'noCaptcha reCAPTCHA validation failed', 'wp-user-frontend' ) ); + } + } elseif ( $no_captcha == 0 && 0 == $invisible ) { + $recap_challenge = isset( $_POST['recaptcha_challenge_field'] ) ? sanitize_text_field( wp_unslash( $_POST['recaptcha_challenge_field'] ) ) : ''; + $recap_response = isset( $_POST['recaptcha_response_field'] ) ? sanitize_text_field( wp_unslash( $_POST['recaptcha_response_field'] ) ) : ''; + + $resp = recaptcha_check_answer( $private_key, $rremote_addr, $recap_challenge, $recap_response ); + + if ( !$resp->is_valid ) { + $this->send_error( __( 'reCAPTCHA validation failed', 'wp-user-frontend' ) ); + } + } elseif ( $no_captcha == 0 && 1 == $invisible ) { + $response = null; + $recaptcha = isset( $_POST['g-recaptcha-response'] ) ? sanitize_text_field( wp_unslash( $_POST['g-recaptcha-response'] ) ) : ''; + $object = new Invisible_Recaptcha( $site_key, $private_key ); + + $response = $object->verifyResponse( $recaptcha ); + + if ( isset( $response['success'] ) and $response['success'] != true ) { + $this->send_error( __( 'Invisible reCAPTCHA validation failed', 'wp-user-frontend' ) ); + } + } + } + + /** + * Guess a suitable username for registration based on email address + * + * @param string $email email address + * + * @return string username + */ + public function guess_username( $email ) { + // username from email address + $username = sanitize_user( substr( $email, 0, strpos( $email, '@' ) ) ); + + if ( !username_exists( $username ) ) { + return $username; + } + + // try to add some random number in username + // and may be we got our username + $username .= rand( 1, 199 ); + + if ( !username_exists( $username ) ) { + return $username; + } + } + + /** + * Get input meta fields separated as post vars, taxonomy and meta vars + * + * @param int $form_id form id + * + * @return array + */ + public static function get_input_fields_by_form_id( $form_id ) { + $form_vars = wpuf_get_form_fields( $form_id ); + + $ignore_lists = ['section_break', 'html']; + $post_vars = $meta_vars = $taxonomy_vars = []; + + foreach ( $form_vars as $key => $value ) { + + // ignore section break and HTML input type + if ( in_array( $value['input_type'], $ignore_lists ) ) { + continue; + } + + //separate the post and custom fields + if ( isset( $value['is_meta'] ) && $value['is_meta'] == 'yes' ) { + $meta_vars[] = $value; + continue; + } + + if ( $value['input_type'] == 'taxonomy' ) { + + // don't add "category" + if ( $value['name'] == 'category' ) { + continue; + } + + $taxonomy_vars[] = $value; + } else { + $post_vars[] = $value; + } + } + + return [$post_vars, $taxonomy_vars, $meta_vars]; + } + + public function guest_fields( $form_settings ) { + ?> +
  • +
    + +
    + +
    + +
    +
  • + + + ' . __( 'Your selected form is no longer available.', 'wp-user-frontend' ) . '
    ' ); + + return; + } + + if ( $form_status != 'publish' ) { + echo wp_kses_post( '
    ' . __( "Please make sure you've published your form.", 'wp-user-frontend' ) . '
    ' ); + + return; + } + + $form_vars = wpuf_get_form_fields( $form_id ); + $form_settings = wpuf_get_form_settings( $form_id ); + $label_position = isset( $form_settings['label_position'] ) ? $form_settings['label_position'] : 'left'; + $layout = isset( $form_settings['form_layout'] ) ? $form_settings['form_layout'] : 'layout1'; + $theme_css = isset( $form_settings['use_theme_css'] ) ? $form_settings['use_theme_css'] : 'wpuf-style'; + + do_action( 'wpuf_before_form_render', $form_id ); + + if ( !empty( $layout ) ) { + wp_enqueue_style( 'wpuf-' . $layout ); + } + + if ( !is_user_logged_in() && $form_settings['guest_post'] != 'true' ) { + echo wp_kses_post( '
    ' . $form_settings['message_restrict'] . '
    ' ); + + return; + } + + if ( $form_vars ) { + ?> +
    + +
      + + guest_fields( $form_settings ); + } + + $this->render_items( $form_vars, $post_id, 'post', $form_id, $form_settings ); + $this->submit_button( $form_id, $form_settings, $post_id ); + + if ( !$post_id ) { + do_action( 'wpuf_add_post_form_bottom', $form_id, $form_settings ); + } else { + do_action( 'wpuf_edit_post_form_bottom', $form_id, $post_id, $form_settings ); + } ?> + +
    + +
    + + ', esc_attr( $el_name ), esc_attr( $class_name ), esc_attr( $field_size ),esc_attr( $form_field['label'] ) ); + + if ( isset( $form_field['input_type'] ) && !in_array( $form_field['input_type'], $label_exclude ) ) { + $this->label( $form_field, $post_id ); + } + } + + public function render_item_after( $form_field ) { + echo wp_kses_post( '' ); + } + + public function conditional_logic( $form_field, $form_id ) { + $cond_inputs = $form_field['wpuf_cond']; + $cond_inputs['condition_status'] = isset( $cond_inputs['condition_status'] ) ? $cond_inputs['condition_status'] : ''; + + if ( $cond_inputs['condition_status'] == 'yes' ) { + $cond_inputs['type'] = $form_field['input_type']; + $cond_inputs['name'] = $form_field['name']; + $cond_inputs['form_id'] = $form_id; + $condition = json_encode( $cond_inputs ); + } else { + $condition = ''; + } + + //taxnomy name create unique + if ( $form_field['input_type'] == 'taxonomy' ) { + $cond_inputs['name'] = $form_field['name'] . '_' . $form_field['type'] . '_' . $form_field['id']; + $condition = json_encode( $cond_inputs ); + } + + //for section break + if ( $form_field['input_type'] == 'section_break' ) { + $cond_inputs['name'] = $form_field['name'] . '_' . $form_field['id']; + $condition = json_encode( $cond_inputs ); + } ?> + + + + + + + + +
    + +
    + +
    + +
    + $form_field ) { + + // check field visibility options + if ( array_key_exists( 'wpuf_visibility', $form_field ) ) { + $visibility_selected = $form_field['wpuf_visibility']['selected']; + $visibility_choices = $form_field['wpuf_visibility']['choices']; + $show_field = false; + + if ( $visibility_selected == 'everyone' ) { + $show_field = true; + } + + if ( $visibility_selected == 'hidden' ) { + $form_field['css'] .= ' wpuf_hidden_field'; + $show_field = true; + } + + if ( $visibility_selected == 'logged_in' && is_user_logged_in() ) { + if ( empty( $visibility_choices ) ) { + $show_field = true; + } else { + foreach ( $visibility_choices as $key => $choice ) { + if ( current_user_can( $choice ) ) { + $show_field = true; + break; + } + continue; + } + } + } + + if ( $visibility_selected == 'subscribed_users' && is_user_logged_in() ) { + $user_pack = wpuf()->subscription->get_user_pack( get_current_user_id() ); + + if ( empty( $visibility_choices ) && !empty( $user_pack ) ) { + $show_field = true; + } elseif ( !empty( $user_pack ) && !empty( $visibility_choices ) ) { + foreach ( $visibility_choices as $pack => $id ) { + if ( $user_pack['pack_id'] == $id ) { + $show_field = true; + break; + } + continue; + } + } + } + + if ( !$show_field ) { + continue; + } + } + + // don't show captcha in edit page + if ( $post_id && in_array( $form_field['input_type'], $edit_ignore ) ) { + continue; + } + + // igonre the hidden fields + if ( $form_field['input_type'] == 'hidden' ) { + $hidden_fields[] = $form_field; + continue; + } + + if ( $form_field['input_type'] != 'step_start' && $form_field['input_type'] != 'step_end' ) { + $this->render_item_before( $form_field, $post_id ); + } + + $this->field_count++; + + switch ( $form_field['input_type'] ) { + case 'text': + $this->text( $form_field, $post_id, $type, $form_id ); + $this->conditional_logic( $form_field, $form_id ); + break; + + case 'textarea': + $this->textarea( $form_field, $post_id, $type, $form_id ); + $this->conditional_logic( $form_field, $form_id ); + break; + + case 'select': + $this->select( $form_field, false, $post_id, $type, $form_id ); + $this->conditional_logic( $form_field, $form_id ); + break; + + case 'multiselect': + $this->select( $form_field, true, $post_id, $type, $form_id ); + $this->conditional_logic( $form_field, $form_id ); + break; + + case 'radio': + $this->radio( $form_field, $post_id, $type, $form_id ); + $this->conditional_logic( $form_field, $form_id ); + break; + + case 'checkbox': + $this->checkbox( $form_field, $post_id, $type, $form_id ); + $this->conditional_logic( $form_field, $form_id ); + break; + + case 'url': + $this->url( $form_field, $post_id, $type, $form_id ); + $this->conditional_logic( $form_field, $form_id ); + break; + + case 'email': + $this->email( $form_field, $post_id, $type, $form_id ); + $this->conditional_logic( $form_field, $form_id ); + break; + + case 'password': + $this->password( $form_field, $post_id, $type, $form_id ); + $this->conditional_logic( $form_field, $form_id ); + break; + + case 'taxonomy': + + $this->taxonomy( $form_field, $post_id, $form_id ); + $this->conditional_logic( $form_field, $form_id ); + break; + + case 'section_break': + $form_field['name'] = 'section_break'; + $this->section_break( $form_field, $post_id, $form_id ); + $this->conditional_logic( $form_field, $form_id ); + break; + + case 'html': + $form_field['name'] = 'custom_html_' . str_replace( ' ', '_', $form_field['label'] ); + + $this->html( $form_field, $form_id ); + $this->conditional_logic( $form_field, $form_id ); + break; + + case 'image_upload': + $this->image_upload( $form_field, $post_id, $type, $form_id ); + $this->conditional_logic( $form_field, $form_id ); + break; + + case 'recaptcha': + $this->recaptcha( $form_field, $post_id, $form_id ); + $this->conditional_logic( $form_field, $form_id ); + break; + + default: + + // fallback for a dynamic method of this class if exists + $dynamic_method = 'field_' . $form_field['input_type']; + + if ( method_exists( $this, $dynamic_method ) ) { + $this->{$dynamic_method}( $form_field, $post_id, $type, $form_id ); + } + + do_action( 'wpuf_render_form_' . $form_field['input_type'], $form_field, $form_id, $post_id, $form_settings ); + do_action( 'wpuf_render_pro_' . $form_field['input_type'], $form_field, $post_id, $type, $form_id, $form_settings, 'WPUF_Render_Form', $this, $this->multiform_start, isset( $form_settings['enable_multistep'] ) ? $form_settings['enable_multistep'] : '' ); + break; + } + + $this->render_item_after( $form_field ); + } //end foreach + + if ( $hidden_fields ) { + foreach ( $hidden_fields as $field ) { + printf( '', esc_attr( $field['name'] ), esc_attr( $field['meta_value'] ) ); + echo "\r\n"; + } + } + } + + public function submit_button( $form_id, $form_settings, $post_id ) { + ?> +
  • +
    +   +
    + + + + + + + + + + + + + + + + + + + + + +
  • + + + + + + + Form Preview + + + + + + + +
    + render_form( $form_id, null ); ?> +
    + + + + *'; + } + } + + /** + * Prints HTML5 required attribute + * + * @param array $attr + * + * @return string + */ + public function required_html5( $attr ) { + if ( $attr['required'] == 'yes' ) { + // echo ' required="required"'; + } + } + + /** + * Print required class name + * + * @param array $attr + * + * @return string + */ + public function required_class( $attr ) { + if ( $attr['required'] == 'yes' ) { + echo ' required'; + } + } + + /** + * Prints form input label + * + * @param array $attr + */ + public function label( $attr, $post_id = 0 ) { + if ( $post_id && $attr['input_type'] == 'password' ) { + $attr['required'] = 'no'; + } + + if ( isset( $attr['input_type'] ) && $attr['input_type'] == 'recaptcha' && $attr['recaptcha_type'] == 'invisible_recaptcha' ) { + return; + } ?> +
    + +
    + + + $field; + } + + /** + * Prints a text field + * + * @param array $attr + * @param int|null $post_id + */ + public function text( $attr, $post_id, $type = 'post', $form_id = null ) { + // checking for user profile username + $username = false; + $taxonomy = false; + + if ( $post_id ) { + if ( $this->is_meta( $attr ) ) { + $value = $this->get_meta( $post_id, $attr['name'], $type ); + } else { + + // applicable for post tags + if ( $type == 'post' && $attr['name'] == 'tags' ) { + $post_tags = wp_get_post_tags( $post_id ); + $tagsarray = []; + + foreach ( $post_tags as $tag ) { + $tagsarray[] = $tag->name; + } + + $value = implode( ', ', $tagsarray ); + $taxonomy = true; + } elseif ( $type == 'post' ) { + $value = get_post_field( $attr['name'], $post_id ); + } elseif ( $type == 'user' ) { + $name = $attr['name']; + $value = get_user_by( 'id', $post_id )->$name; + + if ( $attr['name'] == 'user_login' ) { + $username = true; + } + } + } + } else { + $value = $attr['default']; + + if ( $type == 'post' && $attr['name'] == 'tags' ) { + $taxonomy = true; + } + } ?> + +
    + required_html5( $attr ); ?> name="" placeholder="" value="" size="" /> + + help_text( $attr ); ?> + + + + +
    + + check_word_restriction_func( $attr['word_restriction'], 'no', $attr['name'] . '_' . $form_id ); + } + } + + /** + * Function to check word restriction + * + * @param $word_nums number of words allowed + */ + public function check_word_restriction_func( $word_nums, $rich_text, $field_name ) { + // bail out if it is dashboard + if ( is_admin() ) { + return; + } ?> + + is_meta( $attr ) ) { + $value = $this->get_meta( $post_id, $attr['name'], $type, true ); + } else { + if ( $type == 'post' ) { + $value = get_post_field( $attr['name'], $post_id ); + } else { + $value = $this->get_user_data( $post_id, $attr['name'] ); + } + } + } else { + $value = $attr['default']; + } ?> + + +
    + +
    + + + + + + + + + field_count; + $content_css = includes_url() . 'js/tinymce/skins/wordpress/wp-content.css'; + + if ( $attr['rich'] == 'yes' ) { + $editor_settings = [ + 'textarea_rows' => $attr['rows'], + 'quicktags' => false, + 'media_buttons' => false, + 'editor_class' => $req_class, + 'textarea_name' => $attr['name'], + 'tinymce' => [ + 'content_css' => $content_css . ', ' . WPUF_ASSET_URI . '/css/frontend-form/' . $layout . '.css', + ], + ]; + + $editor_settings = apply_filters( 'wpuf_textarea_editor_args', $editor_settings ); + wp_editor( $value, $textarea_id, $editor_settings ); + } elseif ( $attr['rich'] == 'teeny' ) { + $editor_settings = [ + 'textarea_rows' => $attr['rows'], + 'quicktags' => false, + 'media_buttons' => false, + 'teeny' => true, + 'editor_class' => $req_class, + 'textarea_name' => $attr['name'], + 'tinymce' => [ + 'content_css' => $content_css . ', ' . WPUF_ASSET_URI . '/css/frontend-form/' . $layout . '.css', + ], + ]; + + $editor_settings = apply_filters( 'wpuf_textarea_editor_args', $editor_settings ); + wp_editor( $value, $textarea_id, $editor_settings ); + } else { + ?> + + + + help_text( $attr ); ?> +
    + check_word_restriction_func( $attr['word_restriction'], $attr['rich'], $attr['name'] . '_' . $form_id ); + } + } + + /** + * Prints a select or multiselect field + * + * @param array $attr + * @param bool $multiselect + * @param int|null $post_id + */ + public function select( $attr, $multiselect, $post_id, $type, $form_id = null ) { + if ( ! $multiselect ) { + $multiselect = false; + } + if ( $post_id ) { + $selected = $this->get_meta( $post_id, $attr['name'], $type ); + + if ( $multiselect ) { + if ( is_serialized( $selected ) ) { + $selected = maybe_unserialize( $selected ); + } elseif ( is_array( $selected ) ) { + $selected = $selected; + } else { + $selected = explode( self::$separator, $selected ); + } + } + } else { + $selected = isset( $attr['selected'] ) ? $attr['selected'] : ''; + $selected = $multiselect ? ( is_array( $selected ) ? $selected : [] ) : $selected; + } + + $name = $multiselect ? $attr['name'] . '[]' : $attr['name']; + $multi = $multiselect ? ' multiple="multiple"' : ''; + $data_type = $multiselect ? 'multiselect' : 'select'; + $css = $multiselect ? ' class="multiselect wpuf_' . $attr['name'] . '_' . $form_id . '"' : ''; ?> + +
    + + help_text( $attr ); ?> +
    + get_meta( $post_id, $attr['name'], $type, true ); + } ?> + +
    + + 0 ) { + foreach ( $attr['options'] as $value => $option ) { + ?> + + + + + help_text( $attr ); ?> +
    + + get_meta( $post_id, $attr['name'], $type, true ) ) { + if ( is_serialized( $value ) ) { + $selected = maybe_unserialize( $value ); + } elseif ( is_array( $value ) ) { + $selected = $value; + } else { + $selected = explode( self::$separator, $value ); + } + } + } ?> + +
    + + 0 ) { + foreach ( $attr['options'] as $value => $option ) { + ?> + + + + help_text( $attr ); ?> + +
    + + is_meta( $attr ) ) { + $value = $this->get_meta( $post_id, $attr['name'], $type, true ); + } else { + //must be user profile url + $value = $this->get_user_data( $post_id, $attr['name'] ); + } + } else { + $value = $attr['default']; + } ?> + +
    + required_html5( $attr ); ?> name="" placeholder="" value="" size="" /> + help_text( $attr ); ?> +
    + + is_meta( $attr ) ) { + $value = $this->get_meta( $post_id, $attr['name'], $type, true ); + } else { + //must be user email + $value = $this->get_user_data( $post_id, $attr['name'] ); + } + } else { + $value = $attr['default']; + } ?> + +
    + required_html5( $attr ); ?> name="" placeholder="" value="" size="" /> + help_text( $attr ); ?> +
    + + + +
    + required_html5( $attr ); ?> data-repeat="" name="pass1" placeholder="" value="" size="" /> + help_text( $attr ); ?> +
    + + ' ); + echo wp_kses_post( '
  • ' ); + + $this->label( ['name' => 'pass2', 'label' => $attr['re_pass_label'], 'required' => $post_id ? 'no' : 'yes'] ); ?> + +
    + required_html5( $attr ); ?> name="pass2" value="" placeholder="" size="" /> +
    + + ' ); + echo wp_kses_post( '
  • ' ); + + wp_enqueue_script( 'zxcvbn' ); + wp_enqueue_script( 'password-strength-meter' ); ?> +
    +   +
    + +
    +
    +
    + + + __( '-- Select --', 'wp-user-frontend' ), + 'hierarchical' => 1, + 'hide_empty' => 0, + 'orderby' => isset( $attr['orderby'] ) ? $attr['orderby'] : 'name', + 'order' => isset( $attr['order'] ) ? $attr['order'] : 'ASC', + 'name' => $taxonomy . '[]', + 'taxonomy' => $taxonomy, + 'echo' => 0, + 'title_li' => '', + 'class' => 'cat-ajax ' . $taxonomy . $class, + $exclude_type => $exclude, + 'selected' => $selected, + 'depth' => 1, + 'child_of' => isset( $attr['parent_cat'] ) ? $attr['parent_cat'] : '', + ]; + + $tax_args = apply_filters( 'wpuf_taxonomy_checklist_args', $tax_args ); + + $select = wp_dropdown_categories( $tax_args ); + + echo wp_kses_post( str_replace( ' $attr['required'], + 'name' => $attr['name'], + 'exclude_type' => $attr['exclude_type'], + 'exclude' => isset( $attr['exclude'] ) ? $attr['exclude'] : '', + 'orderby' => $attr['orderby'], + 'order' => $attr['order'], + //'last_term_id' => isset( $attr['parent_cat'] ) ? $attr['parent_cat'] : '', + //'term_id' => $selected + ]; + $attr = apply_filters( 'wpuf_taxonomy_checklist_args', $attr ); ?> + > + 'names'] ); + } elseif ( $post_id ) { + $terms = wp_get_post_terms( $post_id, $taxonomy, ['fields' => 'ids'] ); + } + + if ( !taxonomy_exists( $taxonomy ) ) { + echo wp_kses_post( '
    ' . __( 'This field is no longer available.', 'wp-user-frontend' ) . '
    ' ); + + return; + } + + $div_class = 'wpuf_' . $attr['name'] . '_' . $attr['type'] . '_' . $attr['id'] . '_' . $form_id; ?> + + + +
    + +
    + + + +
    + +
    + taxnomy_select( null, $attr, $form_id ); ?> +
    + +
    + taxnomy_select( $term_id, $attr ); ?> +
    + +
    + + isset( $attr['first'] ) ? $attr['first'] : '--select--', + 'hierarchical' => 1, + 'hide_empty' => 0, + 'orderby' => isset( $attr['orderby'] ) ? $attr['orderby'] : 'name', + 'order' => isset( $attr['order'] ) ? $attr['order'] : 'ASC', + 'name' => $taxonomy . '[]', + 'taxonomy' => $taxonomy, + 'echo' => 0, + 'title_li' => '', + 'class' => $taxonomy . $class, + $exclude_type => $exclude, + 'selected' => $selected, + ]; + + $tax_args = apply_filters( 'wpuf_taxonomy_checklist_args', $tax_args ); + + $select = wp_dropdown_categories( $tax_args ); + + echo wp_kses_post( str_replace( ' __( '-- Select --', 'wpuf' ), + 'hierarchical' => 1, + 'hide_empty' => 0, + 'orderby' => isset( $attr['orderby'] ) ? $attr['orderby'] : 'name', + 'order' => isset( $attr['order'] ) ? $attr['order'] : 'ASC', + 'name' => $taxonomy . '[]', + 'id' => 'cat-ajax', + 'taxonomy' => $taxonomy, + 'echo' => 0, + 'title_li' => '', + 'class' => $taxonomy . ' multiselect' . $class, + $exclude_type => $exclude, + 'selected' => $selected, + 'walker' => $walker, + ]; + + $tax_args = apply_filters( 'wpuf_taxonomy_checklist_args', $tax_args ); + + $select = wp_dropdown_categories( $tax_args ); + + echo wp_kses_post( str_replace( ' + + required_html5( $attr ) ); ?> name="" value="" size="40" /> + + + + + help_text( $attr ); ?> +
    + + + +
    + +
    + is_meta( $attr ) ) { + $images = $this->get_meta( $post_id, $attr['name'], $type, false ); + + if ( $images ) { + if ( is_serialized( $images[0] ) ) { + $images = maybe_unserialize( $images[0] ); + } + + if ( is_array( $images[0] ) ) { + $images = $images[0]; + } + } + + $has_images = true; + } else { + if ( $type == 'post' ) { + // it's a featured image then + $thumb_id = get_post_thumbnail_id( $post_id ); + + if ( $thumb_id ) { + $has_featured_image = true; + $featured_image = Upload_Ajax::attach_html( $thumb_id, 'featured_image' ); + } + } else { + // it must be a user avatar + $has_avatar = true; + $featured_image = get_avatar( $post_id ); + } + } + } + $button_label = empty( $attr['button_label'] ) ? __( 'Select Image', 'wp-user-frontend' ) : $attr['button_label']; ?> + +
    +
    +
    + + +
      + ' . $featured_image ); + printf( '
      %s', esc_html( __( 'Are you sure?', 'wp-user-frontend' ) ),esc_html( __( 'Delete', 'wp-user-frontend' ) ) ); + echo wp_kses_post( '' ); + } + } + + if ( $has_images ) { + foreach ( $images as $attach_id ) { + echo esc_attr( Upload_Ajax::attach_html( $attach_id, $attr['name'] ) ); + } + } ?> +
    +
    +
    + + help_text( $attr ); ?> + +
    + + + +
    +

    +
    +
    + + + + +
    data-callback="onSubmit" data-size="invisible">
    + +
    + +
    + _x( 'One result is available, press enter to select it.', 'enhanced select', 'wp-user-frontend' ), - 'i18n_matches_n' => _x( '%qty% results are available, use up and down arrow keys to navigate.', 'enhanced select', 'wp-user-frontend' ), - 'i18n_no_matches' => _x( 'No matches found', 'enhanced select', 'wp-user-frontend' ), - 'i18n_ajax_error' => _x( 'Loading failed', 'enhanced select', 'wp-user-frontend' ), - 'i18n_input_too_short_1' => _x( 'Please enter 1 or more characters', 'enhanced select', 'wp-user-frontend' ), - 'i18n_input_too_short_n' => _x( 'Please enter %qty% or more characters', 'enhanced select', 'wp-user-frontend' ), - 'i18n_input_too_long_1' => _x( 'Please delete 1 character', 'enhanced select', 'wp-user-frontend' ), - 'i18n_input_too_long_n' => _x( 'Please delete %qty% characters', 'enhanced select', 'wp-user-frontend' ), - 'i18n_selection_too_long_1' => _x( 'You can only select 1 item', 'enhanced select', 'wp-user-frontend' ), - 'i18n_selection_too_long_n' => _x( 'You can only select %qty% items', 'enhanced select', 'wp-user-frontend' ), - 'i18n_load_more' => _x( 'Loading more results…', 'enhanced select', 'wp-user-frontend' ), - 'i18n_searching' => _x( 'Searching…', 'enhanced select', 'wp-user-frontend' ), - 'ajax_url' => admin_url( 'admin-ajax.php' ), - ] ); - - wp_enqueue_style( 'wpuf_admin_styles', WPUF_ASSET_URI . '/css/admin/admin.css', [] ); - wp_enqueue_style( 'wpuf-setup', WPUF_ASSET_URI . '/css/admin/wpuf-setup.css', [ 'dashicons', 'install' ] ); - - wp_register_script( 'wpuf-setup', WPUF_ASSET_URI . '/js/admin/wpuf-setup' . $suffix . '.js', [ 'jquery', 'wpuf-enhanced-select', 'jquery-blockui' ] ); + wp_enqueue_style( 'wpuf-admin' ); + wp_enqueue_style( 'wpuf-setup' ); + wp_enqueue_script( 'wpuf-setup' ); + wp_localize_script( + 'wpuf-enhanced-select', 'wpuf_enhanced_select_params', [ + 'i18n_matches_1' => _x( + 'One result is available, press enter to select it.', 'enhanced select', 'wp-user-frontend' + ), + 'i18n_matches_n' => _x( + '%qty% results are available, use up and down arrow keys to navigate.', 'enhanced select', + 'wp-user-frontend' + ), + 'i18n_no_matches' => _x( 'No matches found', 'enhanced select', 'wp-user-frontend' ), + 'i18n_ajax_error' => _x( 'Loading failed', 'enhanced select', 'wp-user-frontend' ), + 'i18n_input_too_short_1' => _x( + 'Please enter 1 or more characters', 'enhanced select', 'wp-user-frontend' + ), + 'i18n_input_too_short_n' => _x( + 'Please enter %qty% or more characters', 'enhanced select', 'wp-user-frontend' + ), + 'i18n_input_too_long_1' => _x( 'Please delete 1 character', 'enhanced select', 'wp-user-frontend' ), + 'i18n_input_too_long_n' => _x( + 'Please delete %qty% characters', 'enhanced select', 'wp-user-frontend' + ), + 'i18n_selection_too_long_1' => _x( + 'You can only select 1 item', 'enhanced select', 'wp-user-frontend' + ), + 'i18n_selection_too_long_n' => _x( + 'You can only select %qty% items', 'enhanced select', 'wp-user-frontend' + ), + 'i18n_load_more' => _x( + 'Loading more results…', 'enhanced select', 'wp-user-frontend' + ), + 'i18n_searching' => _x( 'Searching…', 'enhanced select', 'wp-user-frontend' ), + 'ajax_url' => admin_url( 'admin-ajax.php' ), + ] + ); wp_localize_script( 'wpuf-setup', 'wpuf_setup_params', [] ); } @@ -381,7 +397,7 @@ public function wpuf_setup_basic_save() { } if ( 'on' == $install_wpuf_pages ) { - $installer = new WPUF_Admin_Installer(); + $installer = new Admin_Installer(); $installer->init_pages(); } @@ -423,5 +439,3 @@ public function wpuf_safe_style_css( $styles ) { return $styles; } } - -new WPUF_Setup_Wizard(); diff --git a/includes/Traits/FieldableTrait.php b/includes/Traits/FieldableTrait.php new file mode 100644 index 000000000..d16f7db4f --- /dev/null +++ b/includes/Traits/FieldableTrait.php @@ -0,0 +1,742 @@ +set_wp_post_types(); + + if ( class_exists( 'WeDevs\Wpuf\Fields\Field_Contract' ) ) { + $field_settings['post_title'] = new Form_Field_Post_Title(); + $field_settings['post_content'] = new Form_Field_Post_Content(); + $field_settings['post_excerpt'] = new Form_Field_Post_Excerpt(); + $field_settings['featured_image'] = new Form_Field_Featured_Image(); + + $taxonomy_templates = []; + + foreach ( $this->wp_post_types as $post_type => $taxonomies ) { + if ( ! empty( $taxonomies ) ) { + foreach ( $taxonomies as $tax_name => $taxonomy ) { + if ( 'post_tag' === $tax_name ) { + $taxonomy_templates['post_tag'] = new Form_Field_Post_Tags(); + } else { + $taxonomy_templates[ $tax_name ] = new Form_Field_Post_Taxonomy( $tax_name, $taxonomy ); + // $taxonomy_templates[ 'taxonomy' ] = new WPUF_Form_Field_Post_Taxonomy($tax_name, $taxonomy); + } + } + } + } + + $field_settings = array_merge( $field_settings, $taxonomy_templates ); + } + + return $field_settings; + } + + /** + * Populate available wp post types + * + * @since 2.5 + * + * @return void + */ + public function set_wp_post_types() { + $args = [ '_builtin' => true ]; + $wpuf_post_types = wpuf_get_post_types( $args ); + $ignore_taxonomies = apply_filters( 'wpuf-ignore-taxonomies', [ + 'post_format', + ] ); + foreach ( $wpuf_post_types as $post_type ) { + $this->wp_post_types[ $post_type ] = []; + $taxonomies = get_object_taxonomies( $post_type, 'object' ); + foreach ( $taxonomies as $tax_name => $taxonomy ) { + if ( ! in_array( $tax_name, $ignore_taxonomies ) ) { + $this->wp_post_types[ $post_type ][ $tax_name ] = [ + 'title' => $taxonomy->label, + 'hierarchical' => $taxonomy->hierarchical, + ]; + $this->wp_post_types[ $post_type ][ $tax_name ]['terms'] = get_terms( [ + 'taxonomy' => $tax_name, + 'hide_empty' => false, + ] ); + } + } + } + } + + public function set_default_taxonomy( $post_id ) { + $post_taxonomies = get_object_taxonomies( $this->form_settings['post_type'], 'objects' ); + foreach ( $post_taxonomies as $tax ) { + if ( $tax->hierarchical ) { + $name = 'default_' . $tax->name; + if ( isset( $this->form_settings[ $name ] ) && ! empty( $this->form_settings[ $name ] ) ) { + $value = $this->form_settings[ $name ]; + wp_set_post_terms( $post_id, $value, $tax->name ); + } + } + } + } + + /** + * get Input fields + * + * @param array $form_vars + * + * @return array + */ + public function get_input_fields( $form_vars ) { + $ignore_lists = [ 'section_break', 'html' ]; + $post_vars = $meta_vars = $taxonomy_vars = []; + + foreach ( $form_vars as $key => $value ) { + // get column field input fields + if ( $value['input_type'] == 'column_field' ) { + $inner_fields = $value['inner_fields']; + + foreach ( $inner_fields as $column_key => $column_fields ) { + if ( ! empty( $column_fields ) ) { + // ignore section break and HTML input type + foreach ( $column_fields as $column_field_key => $column_field ) { + if ( in_array( $column_field['input_type'], $ignore_lists ) ) { + continue; + } + + //separate the post and custom fields + if ( isset( $column_field['is_meta'] ) && $column_field['is_meta'] == 'yes' ) { + $meta_vars[] = $column_field; + continue; + } + + if ( $column_field['input_type'] == 'taxonomy' ) { + + // don't add "category" + // if ( $column_field['name'] == 'category' ) { + // continue; + // } + + $taxonomy_vars[] = $column_field; + } else { + $post_vars[] = $column_field; + } + } + } + } + continue; + } + + // ignore section break and HTML input type + if ( in_array( $value['input_type'], $ignore_lists ) ) { + continue; + } + + //separate the post and custom fields + if ( isset( $value['is_meta'] ) && $value['is_meta'] == 'yes' ) { + $meta_vars[] = $value; + continue; + } + + if ( $value['input_type'] == 'taxonomy' ) { + + // don't add "category" + // if ( $value['name'] == 'category' ) { + // continue; + // } + + $taxonomy_vars[] = $value; + } else { + $post_vars[] = $value; + } + } + + return [ $post_vars, $taxonomy_vars, $meta_vars ]; + } + + /** + * Checking recaptcha + * + * @param [type] $post_vars [description] + * + * @return void + */ + public function on_edit_no_check_recaptcha( $post_vars ) { + check_ajax_referer( 'wpuf_form_add' ); + // search if rs captcha is there + if ( $this->search( $post_vars, 'input_type', 'really_simple_captcha' ) ) { + $this->validate_rs_captcha(); + } + $no_captcha = ''; + $invisible_captcha = ''; + $recaptcha_type = ''; + $check_recaptcha = $this->search( $post_vars, 'input_type', 'recaptcha' ); + + if ( ! empty( $check_recaptcha ) ) { + $recaptcha_type = $check_recaptcha[0]['recaptcha_type']; + } + // check recaptcha + if ( $check_recaptcha ) { + if ( isset( $_POST['g-recaptcha-response'] ) ) { + if ( empty( $_POST['g-recaptcha-response'] ) && $check_recaptcha[0]['recaptcha_type'] !== 'invisible_recaptcha' ) { + wpuf()->ajax->send_error( __( 'Empty reCaptcha Field', 'wp-user-frontend' ) ); + } + + if ( $recaptcha_type == 'enable_no_captcha' ) { + $no_captcha = 1; + $invisible_captcha = 0; + } elseif ( $recaptcha_type == 'invisible_recaptcha' ) { + $invisible_captcha = 1; + $no_captcha = 0; + } else { + $invisible_captcha = 0; + $no_captcha = 0; + } + } + $this->validate_re_captcha( $no_captcha, $invisible_captcha ); + } + } + + /** + * Really simple captcha validation + * + * @return void + */ + public function validate_rs_captcha() { + $nonce = isset( $_REQUEST['wpuf-login-nonce'] ) ? sanitize_key( wp_unslash( $_REQUEST['wpuf-login-nonce'] ) ) : ''; + + if ( isset( $nonce ) && ! wp_verify_nonce( $nonce, 'wpuf_login_action' ) ) { + return; + } + + $rs_captcha_input = isset( $_POST['rs_captcha'] ) ? sanitize_text_field( wp_unslash( $_POST['rs_captcha'] ) ) : ''; + $rs_captcha_file = isset( $_POST['rs_captcha_val'] ) ? sanitize_text_field( wp_unslash( $_POST['rs_captcha_val'] ) ) : ''; + + if ( class_exists( 'ReallySimpleCaptcha' ) ) { + $captcha_instance = new \ReallySimpleCaptcha(); + + if ( ! $captcha_instance->check( $rs_captcha_file, $rs_captcha_input ) ) { + wpuf()->ajax->send_error( __( 'Really Simple Captcha validation failed', 'wp-user-frontend' ) ); + } else { + // validation success, remove the files + $captcha_instance->remove( $rs_captcha_file ); + } + } + } + + /** + * reCaptcha Validation + * + * @return void + */ + public function validate_re_captcha( $no_captcha = '', $invisible = '' ) { + // need to check if invisible reCaptcha need library or we can do it here. + // ref: https://shareurcodes.com/blog/google%20invisible%20recaptcha%20integration%20with%20php + check_ajax_referer( 'wpuf_form_add' ); + + $site_key = wpuf_get_option( 'recaptcha_public', 'wpuf_general' ); + $private_key = wpuf_get_option( 'recaptcha_private', 'wpuf_general' ); + $remote_addr = isset( $_SERVER['REMOTE_ADDR'] ) ? sanitize_text_field( wp_unslash( $_SERVER['REMOTE_ADDR'] ) ) : ''; + $g_recaptcha_response = isset( $_POST['g-recaptcha-response'] ) ? sanitize_text_field( wp_unslash( $_POST['g-recaptcha-response'] ) ) : ''; + + if ( $no_captcha == 1 && 0 == $invisible ) { + if ( ! class_exists( 'WPUF_ReCaptcha' ) ) { + require_once WPUF_ROOT . '/Lib/recaptchalib_noCaptcha.php'; + } + + $response = null; + $reCaptcha = new \WPUF_ReCaptcha( $private_key ); + + $resp = $reCaptcha->verifyResponse( + $remote_addr, + $g_recaptcha_response + ); + + if ( ! $resp->success ) { + $this->send_error( __( 'noCaptcha reCAPTCHA validation failed', 'wp-user-frontend' ) ); + } + } elseif ( $no_captcha == 0 && 0 == $invisible ) { + $recap_challenge = isset( $_POST['recaptcha_challenge_field'] ) ? sanitize_text_field( wp_unslash( $_POST['recaptcha_challenge_field'] ) ) : ''; + $recap_response = isset( $_POST['recaptcha_response_field'] ) ? sanitize_text_field( wp_unslash( $_POST['recaptcha_response_field'] ) ) : ''; + + $resp = recaptcha_check_answer( $private_key, $remote_addr, $recap_challenge, $recap_response ); + + if ( ! $resp->is_valid ) { + $this->send_error( __( 'reCAPTCHA validation failed', 'wp-user-frontend' ) ); + } + } elseif ( $no_captcha == 0 && 1 == $invisible ) { + $response = null; + $recaptcha = isset( $_POST['g-recaptcha-response'] ) ? sanitize_text_field( wp_unslash( $_POST['g-recaptcha-response'] ) ) : ''; + $object = new Invisible_Recaptcha( $site_key, $private_key ); + + $response = $object->verifyResponse( $recaptcha ); + + if ( isset( $response['success'] ) and $response['success'] != true ) { + $this->send_error( __( 'Invisible reCAPTCHA validation failed', 'wp-user-frontend' ) ); + } + } + } + + /** + * Adjust thumbnail image id if given + * + * @param $postarr + * + * @return array + */ + private function adjust_thumbnail_id( $postarr ) { + $wpuf_files = ! empty( $_POST['wpuf_files'] ) ? wp_unslash( $_POST['wpuf_files'] ) : []; + + if ( ! empty( $wpuf_files['featured_image'] ) ) { + $attachment_id = reset( $wpuf_files['featured_image'] ); + $postarr['_thumbnail_id'] = $attachment_id; + } + + return $postarr; + } + + public function update_post_meta( $meta_vars, $post_id ) { + // check_ajax_referer( 'wpuf_form_add' ); + // prepare the meta vars + [ $meta_key_value, $multi_repeated, $files ] = self::prepare_meta_fields( $meta_vars ); + // set featured image if there's any + + // @codingStandardsIgnoreStart + $wpuf_files = isset( $_POST['wpuf_files'] ) ? $_POST['wpuf_files'] : []; + + if ( isset( $wpuf_files['featured_image'] ) ) { + $attachment_id = $wpuf_files['featured_image'][0]; + + wpuf_associate_attachment( $attachment_id, $post_id ); + set_post_thumbnail( $post_id, $attachment_id ); + + $file_data = isset( $_POST['wpuf_files_data'][ $attachment_id ] ) ? $_POST['wpuf_files_data'][ $attachment_id ] : false; + + // @codingStandardsIgnoreEnd + if ( $file_data ) { + $args = [ + 'ID' => $attachment_id, + 'post_title' => $file_data['title'], + 'post_content' => $file_data['desc'], + 'post_excerpt' => $file_data['caption'], + ]; + wpuf_update_post( $args ); + + update_post_meta( $attachment_id, '_wp_attachment_image_alt', $file_data['title'] ); + } + } + + // save all custom fields + foreach ( $meta_key_value as $meta_key => $meta_value ) { + update_post_meta( $post_id, $meta_key, $meta_value ); + } + + // save any multicolumn repeatable fields + foreach ( $multi_repeated as $repeat_key => $repeat_value ) { + // first, delete any previous repeatable fields + delete_post_meta( $post_id, $repeat_key ); + + // now add them + foreach ( $repeat_value as $repeat_field ) { + add_post_meta( $post_id, $repeat_key, $repeat_field ); + } + } + + // save any files attached + foreach ( $files as $file_input ) { + // delete any previous value + delete_post_meta( $post_id, $file_input['name'] ); + + $image_ids = ''; + + if ( count( $file_input['value'] ) > 1 ) { + $image_ids = $file_input['value']; + } + + if ( count( $file_input['value'] ) === 1 ) { + $image_ids = $file_input['value'][0]; + } + + if ( ! empty( $image_ids ) ) { + add_post_meta( $post_id, $file_input['name'], $image_ids ); + } + + //to track how many files are being uploaded + $file_numbers = 0; + + foreach ( $file_input['value'] as $attachment_id ) { + + //if file numbers are greated than allowed number, prevent it from being uploaded + if ( $file_numbers >= $file_input['count'] ) { + wp_delete_attachment( $attachment_id ); + continue; + } + + wpuf_associate_attachment( $attachment_id, $post_id ); + //add_post_meta( $post_id, $file_input['name'], $attachment_id ); + + // file title, caption, desc update + + // @codingStandardsIgnoreStart + $file_data = isset( $_POST['wpuf_files_data'][ $attachment_id ] ) ? wp_unslash( $_POST['wpuf_files_data'][ $attachment_id ] ) : false; + + // @codingStandardsIgnoreEnd + if ( $file_data ) { + $args = [ + 'ID' => $attachment_id, + 'post_title' => $file_data['title'], + 'post_content' => $file_data['desc'], + 'post_excerpt' => $file_data['caption'], + ]; + wpuf_update_post( $args ); + + update_post_meta( $attachment_id, '_wp_attachment_image_alt', $file_data['title'] ); + } + $file_numbers++; + } + } + } + + /** + * set custom taxonomy + * + * @param int $post_id + * @param array $taxonomy_vars + */ + public function set_custom_taxonomy( $post_id, $taxonomy_vars ) { + check_ajax_referer( 'wpuf_form_add' ); + // save any custom taxonomies + $woo_attr = []; + + foreach ( $taxonomy_vars as $taxonomy ) { + if ( isset( $_POST[ $taxonomy['name'] ] ) && is_array( $_POST[ $taxonomy['name'] ] ) ) { + $taxonomy_name = array_map( 'sanitize_text_field', wp_unslash( $_POST[ $taxonomy['name'] ] ) ); + } + + if ( isset( $_POST[ $taxonomy['name'] ] ) && ! is_array( $_POST[ $taxonomy['name'] ] ) ) { + $taxonomy_name = sanitize_text_field( wp_unslash( $_POST[ $taxonomy['name'] ] ) ); + + if ( 'text' === $taxonomy['type'] ) { + $terms = explode( ',', $taxonomy_name ); + $terms = array_map( + function ( $term_name ) use ( $taxonomy ) { + $term = get_term_by( 'name', $term_name, $taxonomy['name'] ); + + if ( empty( $term_name ) ) { + return null; + } + + if ( $term instanceof \WP_Term ) { + return $term->term_id; + } + + $new_term = wp_insert_term( $term_name, $taxonomy['name'] ); + + return $new_term['term_id']; + }, $terms + ); + + $taxonomy_name = array_filter( $terms ); + } + } + + // At this point $taxonomy_name should be a single id or array of ids + if ( isset( $taxonomy_name ) && $taxonomy_name != 0 && $taxonomy_name != -1 ) { + if ( is_object_in_taxonomy( $this->form_settings['post_type'], $taxonomy['name'] ) ) { + $tax = $taxonomy_name; + // if it's not an array, make it one + if ( ! is_array( $tax ) ) { + $tax = [ $tax ]; + } + + if ( $taxonomy['type'] == 'text' ) { + wp_set_object_terms( $post_id, $taxonomy_name, $taxonomy['name'] ); + + // woocommerce check + if ( isset( $taxonomy['woo_attr'] ) && $taxonomy['woo_attr'] == 'yes' && ! empty( $taxonomy_name ) ) { + $woo_attr[ $taxonomy['name'] ] = $this->woo_attribute( $taxonomy ); + } + } else { + if ( is_taxonomy_hierarchical( $taxonomy['name'] ) ) { + wp_set_post_terms( $post_id, $taxonomy_name, $taxonomy['name'] ); + + // woocommerce check + if ( isset( $taxonomy['woo_attr'] ) && $taxonomy['woo_attr'] == 'yes' && ! empty( $taxonomy_name ) ) { + $woo_attr[ $taxonomy['name'] ] = $this->woo_attribute( $taxonomy ); + } + } else { + if ( $tax ) { + $non_hierarchical = []; + + foreach ( $tax as $value ) { + $term = get_term_by( 'id', $value, $taxonomy['name'] ); + + if ( $term && ! is_wp_error( $term ) ) { + $non_hierarchical[] = $term->name; + } + } + + wp_set_post_terms( $post_id, $non_hierarchical, $taxonomy['name'] ); + + // woocommerce check + if ( isset( $taxonomy['woo_attr'] ) && $taxonomy['woo_attr'] == 'yes' && ! empty( $_POST[ $taxonomy['name'] ] ) ) { + $woo_attr[ $taxonomy['name'] ] = $this->woo_attribute( $taxonomy ); + } + } + } // hierarchical + } // is text + } // is object tax + } // isset tax + + else { + if ( isset( $taxonomy_name ) && 0 === absint( $taxonomy_name ) ) { + wp_set_post_terms( $post_id, $taxonomy_name, $taxonomy['name'] ); + } + + if ( ! isset( $taxonomy['woo_attr'] ) ) { + $this->set_default_taxonomy( $post_id ); + } + } + } + + // if a woocommerce attribute + if ( $woo_attr ) { + update_post_meta( $post_id, '_product_attributes', $woo_attr ); + } + + return $woo_attr; + } + + /** + * prepare meta fields + * + * @param array $meta_vars + * + * @return array + */ + public static function prepare_meta_fields( $meta_vars ) { + // loop through custom fields + // skip files, put in a key => value paired array for later executation + // process repeatable fields separately + // if the input is array type, implode with separator in a field + // /check_ajax_referer( 'wpuf_form_add' ); + $post_data = wp_unslash( $_POST ); // phpcs:ignore WordPress.XSS.EscapeOutput.OutputNotEscaped + $files = []; + $meta_key_value = []; + $multi_repeated = []; //multi repeated fields will in sotre duplicated meta key + + foreach ( $meta_vars as $key => $value ) { + $wpuf_field = wpuf()->fields->get_field( $value['template'] ); + $posted_field_data = isset( $post_data[ $value['name'] ] ) ? $post_data[ $value['name'] ] : null; + + if ( isset( $posted_field_data ) && method_exists( $wpuf_field, 'sanitize_field_data' ) ) { + $meta_key_value[ $value['name'] ] = $wpuf_field->sanitize_field_data( $posted_field_data, $value ); + continue; + } elseif ( isset( $post_data[ $value['name'] ] ) && is_array( $post_data[ $value['name'] ] ) ) { + $value_name = isset( $post_data[ $value['name'] ] ) ? array_map( 'sanitize_text_field', wp_unslash( $post_data[ $value['name'] ] ) ) : ''; + } else { + $value_name = isset( $post_data[ $value['name'] ] ) ? sanitize_text_field( wp_unslash( $post_data[ $value['name'] ] ) ) : ''; + } + + if ( isset( $post_data['wpuf_files'][ $value['name'] ] ) ) { + $wpuf_files = isset( $post_data['wpuf_files'] ) ? array_map( 'sanitize_text_field', wp_unslash( $post_data['wpuf_files'][ $value['name'] ] ) ) : []; + } else { + $wpuf_files = []; + } + + if ( '_downloadable' === $value['name'] && 'on' === $value_name ) { + $value_name = 'yes'; + } + + switch ( $value['input_type'] ) { + + // put files in a separate array, we'll process it later + case 'file_upload': + case 'image_upload': + $files[] = [ + 'name' => $value['name'], + // 'value' => $wpuf_files[$value['name']], + 'value' => isset( $wpuf_files ) ? $wpuf_files : [], + 'count' => $value['count'], + ]; + break; + + case 'repeat': + $repeater_value = wp_unslash( $_POST[ $value['name'] ] ); // WPCS: sanitization ok. + + // if it is a multi column repeat field + if ( isset( $value['multiple'] ) && $value['multiple'] == 'true' ) { + + // if there's any items in the array, process it + if ( $repeater_value ) { + $ref_arr = array(); + $cols = count( $value['columns'] ); + $values = array_values( $repeater_value ); + $first = array_shift( $values ); //first element + $rows = count( $first ); + + // loop through columns + for ( $i = 0; $i < $rows; $i++ ) { + + // loop through the rows and store in a temp array + $temp = array(); + for ( $j = 0; $j < $cols; $j++ ) { + $temp[] = $repeater_value[ $j ][ $i ]; + } + + // store all fields in a row with self::$separator separated + $ref_arr[] = implode( self::$separator, $temp ); + } + + // now, if we found anything in $ref_arr, store to $multi_repeated + if ( $ref_arr ) { + $multi_repeated[ $value['name'] ] = array_slice( $ref_arr, 0, $rows ); + } + } + } else { + $meta_key_value[ $value['name'] ] = implode( self::$separator, $repeater_value ); + } + + break; + + case 'address': + if ( is_array( $value_name ) ) { + foreach ( $value_name as $address_field => $field_value ) { + $meta_key_value[ $value['name'] ][ $address_field ] = sanitize_text_field( $field_value ); + } + } + + break; + + case 'text': + case 'email': + case 'number': + case 'date': + $meta_key_value[ $value['name'] ] = $value_name; + + break; + + case 'textarea': + $allowed_tags = wp_kses_allowed_html( 'post' ); + $meta_key_value[ $value['name'] ] = wp_kses( $value_name, $allowed_tags ); + + break; + + case 'map': + $data = []; + $map_field_data = $value_name; + + if ( ! empty( $map_field_data ) ) { + if ( stripos( $map_field_data, '||' ) !== false ) { + list( $data['address'], $data['lat'], $data['lng'] ) = explode( ' || ', $map_field_data ); + $meta_key_value[ $value['name'] ] = $data; + } else { + $meta_key_value[ $value['name'] ] = json_decode( $map_field_data, true ); + } + } + break; + + case 'checkbox': + if ( is_array( $value_name ) && ! empty( $value_name ) ) { + $meta_key_value[ $value['name'] ] = implode( self::$separator, $value_name ); + } else { + $meta_key_value[ $value['name'] ] = isset( $value_name[0] ) ? $value_name[0] : ''; + } + break; + + default: + // if it's an array, implode with this->separator + if ( ! empty( $value_name ) && is_array( $value_name ) ) { + $acf_compatibility = wpuf_get_option( 'wpuf_compatibility_acf', 'wpuf_general', 'no' ); + + if ( $value['input_type'] == 'address' ) { + $meta_key_value[ $value['name'] ] = $value_name; + } elseif ( ! empty( $acf_compatibility ) && $acf_compatibility == 'yes' ) { + $meta_key_value[ $value['name'] ] = $value_name; + } else { + $meta_key_value[ $value['name'] ] = implode( self::$separator, $value_name ); + } + } elseif ( ! empty( $value_name ) ) { + $meta_key_value[ $value['name'] ] = trim( $value_name ); + } else { + $meta_key_value[ $value['name'] ] = trim( $value_name ); + } + + break; + } + } //end foreach + return [ $meta_key_value, $multi_repeated, $files ]; + } + + /** + * Search on multi dimensional array + * + * @since 4.0.0 moved from Render_Form.php to FieldableTrait.php + * + * @param array $array + * @param string $key name of key + * @param string $value the value to search + * + * @return array + */ + public function search( $array, $key, $value ) { + $results = []; + + if ( is_array( $array ) ) { + if ( isset( $array[ $key ] ) && $array[ $key ] === $value ) { + $results[] = $array; + } + + foreach ( $array as $subarray ) { + $results = array_merge( $results, $this->search( $subarray, $key, $value ) ); + } + } + + return $results; + } + + /** + * Get WooCommerce attributres + * + * @since 4.0.6 moved from Render_Form.php to FieldableTrait.php + * + * @param array $taxonomy + * + * @return array + */ + public function woo_attribute( $taxonomy ) { + check_ajax_referer( 'wpuf_form_add' ); + $taxonomy_name = isset( $_POST[ $taxonomy['name'] ] ) ? sanitize_text_field( wp_unslash( $_POST[ $taxonomy['name'] ] ) ) : ''; + + return [ + 'name' => $taxonomy['name'], + 'value' => $taxonomy_name, + 'is_visible' => $taxonomy['woo_attr_vis'] === 'yes' ? 1 : 0, + 'is_variation' => 0, + 'is_taxonomy' => 1, + ]; + } +} diff --git a/includes/Traits/TaxableTrait.php b/includes/Traits/TaxableTrait.php new file mode 100644 index 000000000..b8e3ca818 --- /dev/null +++ b/includes/Traits/TaxableTrait.php @@ -0,0 +1,542 @@ +wpuf_tax_enabled(); + $price_inc_tax = wpuf_get_option( 'prices_include_tax', 'wpuf_payment_tax', 'yes' ); + $value = false; + + if ( $price_inc_tax === 'yes' && $enable_tax ) { + $value = true; + } + + return apply_filters( 'wpuf_prices_includes_tax', $value ); + } + + /** + * Retrieve tax rates + * @since 4.0.0 moved to TaxableTrait + * + * @return array Defined tax rates + */ + function wpuf_get_tax_rates() { + $rates = get_option( 'wpuf_tax_rates', [] ); + return apply_filters( 'wpuf_get_tax_rates', $rates ); + } + + /** + * Base country and states callback + * @since 4.0.0 moved to TaxableTrait + * + * @param array $args Arguments passed by the setting + * @return void + */ + function wpuf_base_country_state( $args ) { + $rates = $this->wpuf_get_tax_rates(); + + $cs = new Country_State(); + + $states = []; + + ob_start(); ?> +

    + + + + + + + + + 'US' ]; + } else { + $selected['country'] = ! empty( $selected ) && ! empty( $selected['country'] ) ? $selected['country'] : 'US'; + } + + ?> + + + +
    + $cs->countries(), + 'name' => 'wpuf_base[country]', + 'selected' => $selected['country'], + 'show_option_all' => false, + 'show_option_none' => false, + 'id' => 'wpuf-base-country', + 'class' => 'wpuf-base-country', + 'chosen' => false, + 'placeholder' => __( 'Choose a country', 'wpuf-pro' ), + ] + ); + ?> + + getStates( $selected['country'] ); + echo wpuf_select( + [ + 'options' => $states, + 'name' => 'wpuf_base[state]', + 'selected' => isset( $selected['state'] ) ? $selected['state'] : '', + 'show_option_all' => false, + 'show_option_none' => false, + 'class' => 'wpuf-base-state', + 'chosen' => false, + 'placeholder' => __( 'Choose a state', 'wpuf-pro' ), + ] + ); + ?> +
    + countries(); + $states = $cs->getStates( $countries[ $cc ] ); + + $response = 'nostates'; + + if ( ! empty( $states ) ) { + $selected = get_option( 'wpuf_base_country_state', [] ); + $args = [ + 'options' => $states, + 'name' => 'wpuf_base[state]', + 'selected' => $selected['state'], + 'show_option_all' => false, + 'show_option_none' => false, + 'class' => 'wpuf-base-state', + 'chosen' => false, + 'placeholder' => __( 'Choose a state', 'wpuf-pro' ), + ]; + + $response = wpuf_select( $args ); + } + + wp_send_json_success( $response ); + } + + /** + * Tax Rates Callback + * Renders tax rates table + * + * @since 4.0.0 moved to TaxableTrait + * + * @param array $args Arguments passed by the setting + * @return void + */ + function wpuf_tax_rates( $args ) { + $rates = $this->wpuf_get_tax_rates(); + $cs = new Country_State(); + $states = []; + + ob_start(); + ?> +

    + + + + + + + + + + + $rate ) : ?> + + + + + + + + + + + + + + + +
    + $cs->countries(), + 'name' => 'wpuf_tax_rates[' . $key . '][country]', + 'selected' => $selected, + 'show_option_all' => false, + 'show_option_none' => false, + 'class' => 'wpuf-tax-country', + 'chosen' => false, + 'placeholder' => __( 'Choose a country', 'wpuf-pro' ), + ] + ); + ?> + + 'Country Wide' ]; + $states += $cs->getStates( $rate['country'] ); + } + $rate['state'] = isset( $rate['state'] ) ? $rate['state'] : ''; + if ( ! empty( $states ) ) { + echo wpuf_select( + [ + 'options' => $states, + 'name' => 'wpuf_tax_rates[' . $key . '][state]', + 'selected' => $rate['state'], + 'show_option_all' => false, + 'show_option_none' => false, + 'class' => 'wpuf-tax-state', + 'chosen' => false, + 'placeholder' => __( 'Choose a state', 'wpuf-pro' ), + ] + ); + } else { + echo wpuf_text( + [ + 'name' => 'wpuf_tax_rates[0][state]', + $rate['state'], + 'value' => ! empty( $rate['state'] ) ? $rate['state'] : '', + ] + ); + } + ?> +
    + getCountry( $rate['country'] ) : ''; + echo wpuf_select( + [ + 'options' => $cs->countries(), + 'name' => 'wpuf_tax_rates[0][country]', + 'selected' => $selected, + 'show_option_all' => false, + 'show_option_none' => false, + 'class' => 'wpuf-tax-country', + 'chosen' => false, + 'placeholder' => __( 'Choose a country', 'wpuf-pro' ), + ] + ); + ?> + + 'wpuf_tax_rates[0][state]', + ] + ); + ?> +
    +

    + +

    + wpuf_tax_enabled() ) { + return $tax_amount; + } + + $user_id = get_current_user_id(); + $tax_amount = wpuf_get_option( 'fallback_tax_rate', 'wpuf_payment_tax', 0 ); + + if ( metadata_exists( 'user', $user_id, 'wpuf_address_fields' ) ) { + $address_fields = get_user_meta( $user_id, 'wpuf_address_fields', true ); + + if ( array_key_exists( 'billing_country', $address_fields ) ) { + foreach ( $address_fields as $key => $val ) { + unset( $address_fields[ $key ] ); + $address_fields[ str_replace( 'billing_', '', $key ) ] = $val; + } + } + $base_addr = get_option( 'wpuf_base_country_state' ); + $billing_country = ! empty( $address_fields['country'] ) ? $address_fields['country'] : ''; + $billing_state = ! empty( $address_fields['state'] ) ? $address_fields['state'] : ''; + $billing_country = empty( $billing_country ) && $base_addr ? $base_addr['country'] : ''; + $billing_state = empty( $billing_state ) && $base_addr ? $base_addr['state'] : ''; + $tax_amount = $this->wpuf_tax_rate_country_state( $billing_country, $billing_state ); + } else { + if ( class_exists( 'WooCommerce' ) ) { + $customer_id = get_current_user_id(); + $woo_address = []; + $rates = $this->wpuf_get_tax_rates(); + $customer = new WC_Customer( $customer_id ); + + $woo_address = $customer->get_billing(); + unset( $woo_address['email'], $woo_address['tel'], $woo_address['phone'], $woo_address['company'] ); + + $countries_obj = new WC_Countries(); + $countries_array = $countries_obj->get_countries(); + $country_states_array = $countries_obj->get_states(); + $woo_address['state'] = isset( $country_states_array[ $woo_address['country'] ][ $woo_address['state'] ] ) ? $country_states_array[ $woo_address['country'] ][ $woo_address['state'] ] : ''; + $woo_address['state'] = strtolower( str_replace( ' ', '', $woo_address['state'] ) ); + + if ( ! empty( $woo_address ) && ! empty( $rates ) ) { + foreach ( $rates as $rate ) { + $rate_str = ! empty( $rate['rate'] ) ? $rate['rate'] : ''; + $state = ! empty( $rate['state'] ) ? $rate['state'] : ''; + $woo_state = ! empty( $woo_address['state'] ) ? $woo_address['state'] : ''; + $country = ! empty( $rate['country'] ) ? $rate['country'] : ''; + $woo_country = ! empty( $woo_address['country'] ) ? $woo_address['country'] : ''; + + if ( '' === $rate_str ) { + return $tax_amount; + } + if ( $state === $woo_state && $country === $woo_country ) { + $tax_amount = $rate['rate']; + return $tax_amount; + } + } + } + } + } + + return $tax_amount; + } + + /** + * Get Tax rate by country and state + * + * @since 4.0.0 moved to TaxableTrait + * + * @param $post_id + * @return string + */ + function wpuf_tax_rate_country_state( $country, $state ) { + $tax_amount = 0; + + $rates = $this->wpuf_get_tax_rates(); + $cs = new Country_State(); + + if ( empty( $rates ) ) { + return $tax_amount; + } + + foreach ( $rates as $rate ) { + if ( ! array_key_exists( 'state', $rate ) ) { + continue; + } + if ( $rate['state'] === $state && $rate['country'] === $country ) { + $tax_amount = $rate['rate']; + } + + if ( intval( $tax_amount ) === 0 && $rate['country'] === $country && 'country_wide' === $rate['state'] ) { + $tax_amount = $rate['rate']; + } + } + + $tax_enabled = $this->wpuf_tax_enabled(); + + if ( $tax_enabled && intval( $tax_amount ) === 0 ) { + $tax_amount = wpuf_get_option( 'fallback_tax_rate', 'wpuf_payment_tax', 0 ); + } + + return $tax_amount; + } + + /** + * Get billing amount with tax + * + * @since 4.0.0 moved to TaxableTrait + * + * @param $post_id + * @return string + */ + function wpuf_amount_with_tax( $billing_amount ) { + global $current_user; + + $tax_enabled = $this->wpuf_tax_enabled(); + + if ( $tax_enabled ) { + $tax_amount = $this->wpuf_current_tax_rate(); + $billing_amount = $billing_amount + ( ( $billing_amount * $tax_amount ) / 100 ); + } + + return (float) $billing_amount; + } + + /** + * Recalculate taxes + * + * @since 4.0.0 moved to TaxableTrait + * + * @return void|bool + */ + function wpuf_calculate_taxes( $post_data ) { + if ( ! $this->wpuf_tax_enabled() ) { + return false; + } + + global $current_user; + $tax_amount = 0; + $billing_amount = 0; + $user_id = ''; + + if ( isset( $post_data['type'] ) && isset( $post_data['id'] ) ) { + if ( 'pack' === $post_data['type'] ) { + $pack = ( new Subscription() )->get_subscription( $post_data['id'] ); + $billing_amount = $pack->meta_value['billing_amount']; + $user_id = $current_user->ID; + } elseif ( 'post' === $post_data['type'] ) { + $form = new Form( get_post_meta( $post_data['id'], '_wpuf_form_id', true ) ); + $fallback_cost = $form->get_subs_fallback_cost(); + $fallback_enabled = $form->is_enabled_fallback_cost(); + $pay_per_post_cost = (float) $form->get_pay_per_post_cost(); + $current_user_id = wpuf_get_user(); + + if ( $current_user_id->subscription()->current_pack_id() && $fallback_enabled ) { + $billing_amount = $fallback_cost; + } else { + $billing_amount = $pay_per_post_cost; + } + + $postdata = get_post( $post_data['id'] ); + $user_id = $postdata->post_author; + } + } + + $tax_amount = $this->wpuf_tax_rate_country_state( $post_data['billing_country'], $post_data['billing_state'] ); + $tax_rate = $tax_amount . '%'; + $billing_amount = (float) $billing_amount + ( ( $billing_amount * $tax_amount ) / 100 ); + $billing_amount = wpuf_format_price( $billing_amount ); + + $response = [ + 'tax' => html_entity_decode( $tax_rate, ENT_COMPAT, 'UTF-8' ), + 'cost' => html_entity_decode( $billing_amount, ENT_COMPAT, 'UTF-8' ), + ]; + + echo json_encode( $response ); + die(); + } + + /** + * Save taxes options + * + * @since 4.0.0 moved to TaxableTrait + * + * @return void + */ + function wpuf_save_tax_options() { + if ( isset( $_REQUEST['option_page'] ) && $_REQUEST['option_page'] === 'wpuf_payment_tax' ) { + if ( ! is_admin() ) { + return; + } + //phpcs:disable + $base_state = ! empty( $_REQUEST['wpuf_base'] ) && is_array( $_REQUEST['wpuf_base'] ) ? array_map( 'sanitize_text_field', $_REQUEST['wpuf_base'] ) : ''; + $tax_rates = ! empty( $_REQUEST['wpuf_tax_rates'] ) && is_array( $_REQUEST['wpuf_tax_rates'] ) ? wpuf_recursive_sanitize_text_field( $_REQUEST['wpuf_tax_rates'] ) : ''; + //phpcs:enable + update_option( 'wpuf_base_country_state', $base_state ); + update_option( 'wpuf_tax_rates', $tax_rates ); + } + } + + function wpuf_render_tax_field() { + $tax_rate = $this->wpuf_current_tax_rate() . '%'; + if ( $this->wpuf_tax_enabled() ) { + ?> +
    :
    + countries(); + $country = isset( $_REQUEST['country'] ) ? sanitize_text_field( wp_unslash( $_REQUEST['country'] ) ) : ''; + $states = [ 'country_wide' => 'Country Wide' ]; + $states += $cs->getStates( $countries[ $country ] ); + + if ( ! empty( $states ) ) { + $args = [ + 'name' => isset( $_REQUEST['field_name'] ) ? sanitize_text_field( wp_unslash( $_REQUEST['field_name'] ) ) : '', + 'id' => isset( $_REQUEST['field_name'] ) ? sanitize_text_field( wp_unslash( $_REQUEST['field_name'] ) ) : '', + 'class' => isset( $_REQUEST['field_name'] ) ? sanitize_text_field( wp_unslash( $_REQUEST['field_name'] ) ) : '', + 'options' => $states, + 'show_option_all' => false, + 'show_option_none' => false, + ]; + + $response = wpuf_select( $args ); + } else { + $response = 'nostates'; + } + + echo $response; + + wp_die(); + } +} diff --git a/includes/class-user-subscription.php b/includes/User_Subscription.php similarity index 94% rename from includes/class-user-subscription.php rename to includes/User_Subscription.php index c989dfde9..3ecb6d8b7 100644 --- a/includes/class-user-subscription.php +++ b/includes/User_Subscription.php @@ -1,16 +1,18 @@ user = $user; @@ -171,7 +173,7 @@ public function add_pack( $pack_id, $profile_id, $recurring, $status = null ) { } global $wpdb; $result = ''; - $subscription = WPUF_Subscription::init()->get_subscription( $pack_id ); + $subscription = wpuf()->subscription->get_subscription( $pack_id ); if ( $this->user->id && $subscription ) { $user_meta = [ @@ -249,7 +251,7 @@ public function delete_pack() { // cancel is it's a recurring payment if ( $this->recurring() ) { - $wpuf_paypal = new WPUF_Paypal(); + $wpuf_paypal = new Lib\Gateway\Paypal(); $wpuf_paypal->recurring_change_status( $this->user->id, 'Cancel' ); } @@ -257,7 +259,7 @@ public function delete_pack() { } /** - * Determine if the user has used a free pack before + * Determine if the user has used a Free pack before * * @param int $pack_id * @@ -278,7 +280,7 @@ public function used_free_pack( $pack_id ) { } /** - * Add a free used pack to the user account + * Add a Free used pack to the user account * * @param int $pack_id */ @@ -292,7 +294,7 @@ public function add_free_pack( $user_id, $pack_id ) { } public function pack_info( $form_id ) { - $form = new WPUF_Form( $form_id ); + $form = new Admin\Forms\Form( $form_id ); $payment_options = $form->is_charging_enabled(); if ( ! $payment_options || ! is_user_logged_in() ) { @@ -305,14 +307,14 @@ public function pack_info( $form_id ) { return; } - $pack = WPUF_Subscription::get_subscription( $this->current_pack_id() ); + $pack = wpuf()->subscription->get_subscription( $this->current_pack_id() ); - $details_meta = WPUF_Subscription::init()->get_details_meta_value(); + $details_meta = wpuf()->subscription->get_details_meta_value(); $billing_amount = ( intval( $pack->meta_value['billing_amount'] ) > 0 ) ? $details_meta['symbol'] . $pack->meta_value['billing_amount'] : __( 'Free', 'wp-user-frontend' ); if ( $pack->meta_value['recurring_pay'] == 'yes' ) { - $recurring_des = sprintf( 'For each %s %s', $pack->meta_value['billing_cycle_number'], WPUF_Subscription::get_cycle_label( $pack->meta_value['cycle_period'], $pack->meta_value['billing_cycle_number'] ), $pack->meta_value['trial_duration_type'] ); + $recurring_des = sprintf( 'For each %s %s', $pack->meta_value['billing_cycle_number'], Admin\Subscription::get_cycle_label( $pack->meta_value['cycle_period'], $pack->meta_value['billing_cycle_number'] ), $pack->meta_value['trial_duration_type'] ); $recurring_des .= ! empty( $pack->meta_value['billing_limit'] ) ? sprintf( ', for %s installments', $pack->meta_value['billing_limit'] ) : ''; $recurring_des = $recurring_des; } else { @@ -370,7 +372,6 @@ public function pack_info( $form_id ) {
    pack['recurring'] == 'yes' ) { - $payment_page = get_permalink( wpuf_get_option( 'payment_page', 'wpuf_payment' ) ); ?>
    @@ -478,7 +479,7 @@ public function has_error( $form_settings = null ) { } /** - * Checks if a pack is free + * Checks if a pack is Free * * @since 2.8.0 * @@ -487,7 +488,7 @@ public function has_error( $form_settings = null ) { * @return bool */ public static function is_free_pack( $pack_id ) { - $subs = new WPUF_Subscription(); + $subs = wpuf()->subscription; $pack = $subs->get_subscription( $pack_id ); $billing_amount = ( $pack->meta_value['billing_amount'] >= 0 && ! empty( $pack->meta_value['billing_amount'] ) ) ? $pack->meta_value['billing_amount'] : false; @@ -508,7 +509,7 @@ public static function is_free_pack( $pack_id ) { * @return string */ public function get_subscription_exp_msg( $pack_id ) { - $sub_pack = WPUF_Subscription::get_subscription( $pack_id ); + $sub_pack = wpuf()->subscription->get_subscription( $pack_id ); $sub_info = $this->pack; $exp_message = ! empty( $sub_pack->meta_value['_post_expiration_message'] ) ? $sub_pack->meta_value['_post_expiration_message'] : $sub_info['_post_expiration_message']; diff --git a/includes/class-privacy.php b/includes/WPUF_Privacy.php similarity index 99% rename from includes/class-privacy.php rename to includes/WPUF_Privacy.php index fcfa0d627..64ae0ac6a 100644 --- a/includes/class-privacy.php +++ b/includes/WPUF_Privacy.php @@ -1,4 +1,9 @@ __( 'Ajax Login widget for WP User Frontend', 'wp-user-frontend' )] ); - - add_action( 'wp_ajax_nopriv_wpuf_ajax_login', [ $this, 'ajax_login' ] ); - add_action( 'wp_ajax_nopriv_wpuf_lost_password', [ $this, 'ajax_reset_pass' ] ); - add_action( 'wp_ajax_wpuf_ajax_logout', [ $this, 'ajax_logout' ] ); } /** @@ -30,8 +32,8 @@ public function ajax_login() { $rememberme = isset( $_POST['rememberme'] ) ? sanitize_text_field( wp_unslash( $_POST['rememberme'] ) ) : false; $nonce = isset( $_REQUEST['_wpnonce'] ) ? sanitize_key( wp_unslash( $_REQUEST['_wpnonce'] ) ) : ''; - if ( isset( $nonce ) && ! wp_verify_nonce( $nonce , 'wpuf_lost_pass' ) ) { - + if ( empty( $nonce ) || ! wp_verify_nonce( $nonce , 'wpuf_lost_pass' ) ) { + wp_send_json_error( __( 'Permission denied', 'wp-user-frontend' ) ); } if ( empty( $user_login ) || empty( $user_pass ) ) { @@ -54,6 +56,12 @@ public function ajax_login() { * @return void */ public function ajax_logout() { + $nonce = isset( $_REQUEST['nonce'] ) ? sanitize_key( wp_unslash( $_REQUEST['nonce'] ) ) : ''; + + if ( empty( $nonce ) || ! wp_verify_nonce( $nonce, 'wpuf_lost_pass' ) ) { + wp_send_json_error( __( 'Permission denied', 'wp-user-frontend' ) ); + } + wp_logout(); wp_send_json_success( [ 'message'=> __( 'Logout successful!', 'wp-user-frontend' ) ] ); } @@ -67,8 +75,8 @@ public function ajax_reset_pass() { $username_or_email = isset( $_POST['user_login'] ) ? sanitize_text_field( wp_unslash( $_POST['user_login'] ) ) : ''; $nonce = isset( $_REQUEST['_wpnonce'] ) ? sanitize_key( wp_unslash( $_REQUEST['_wpnonce'] ) ) : ''; - if ( isset( $nonce ) && ! wp_verify_nonce( $nonce, 'wpuf_lost_pass' ) ) { - + if ( empty( $nonce ) || ! wp_verify_nonce( $nonce, 'wpuf_lost_pass' ) ) { + wp_send_json_error( __( 'Permission denied', 'wp-user-frontend' ) ); } // Check if input variables are empty @@ -171,6 +179,12 @@ private function ajax_lostpassword_retrieve( $user_input ) { */ public function widget( $args, $instance ) { wp_enqueue_script( 'wpuf_ajax_login' ); + wp_localize_script( + 'wpuf_ajax_login', + 'wpuf_ajax', [ + 'ajaxurl' => admin_url( 'admin-ajax.php' ), + ] + ); $title = apply_filters( 'widget_title', $instance['title'] ); $log_in_header = apply_filters( 'widget_text_content', $instance['log_in_header'] ); @@ -237,7 +251,7 @@ public function widget( $args, $instance ) {

    - + @@ -334,27 +348,3 @@ public function update( $new_instance, $old_instance ) { return $instance; } } - -/** - * Register WPUF_Login_Widget widget - * - * @return void - */ -function wpuf_register_ajax_login_widget() { - register_widget( 'WPUF_Login_Widget' ); -} -add_action( 'widgets_init', 'wpuf_register_ajax_login_widget' ); - -/** - * Registers widget scripts - * - * @return void - */ -function wpuf_register_login_scripts() { - wp_register_script( 'wpuf_ajax_login', WPUF_ASSET_URI . '/js/wpuf-login-widget.js', [ 'jquery' ], false, true ); - - wp_localize_script( 'wpuf_ajax_login', 'wpuf_ajax', [ - 'ajaxurl' => admin_url( 'admin-ajax.php' ), - ] ); -} -add_action( 'wp_enqueue_scripts', 'wpuf_register_login_scripts' ); diff --git a/includes/Widgets/Manager.php b/includes/Widgets/Manager.php new file mode 100644 index 000000000..b040c9e2a --- /dev/null +++ b/includes/Widgets/Manager.php @@ -0,0 +1,54 @@ + 'WeDevs\Wpuf\Widgets\Login_Widget', + ] + ); + + foreach ( $wpuf_widgets as $widget_id => $widget_class ) { + register_widget( $widget_class ); + } + + $this->widgets_list = $wpuf_widgets; + } + + /** + * Check if widget class exists + * + * @since 4.0.0 + * + * @param string $widget_id + * + * @return bool + */ + public function is_exists( $widget_id ) { + return isset( $this->widgets_list[ $widget_id ] ) && class_exists( $this->widgets_list[ $widget_id ] ); + } + + /** + * Get widget id from widget class + * + * @since 4.0.0 + * + * @param string $widget_class + * + * @return bool|string Returns widget id if found, otherwise returns false + */ + public function get_id( $widget_class ) { + return array_search( $widget_class, $this->widgets_list, true ); + } +} diff --git a/includes/class-customizer.php b/includes/class-customizer.php deleted file mode 100644 index 788d981d6..000000000 --- a/includes/class-customizer.php +++ /dev/null @@ -1,113 +0,0 @@ - __( 'Show Billing Address', 'wp-user-frontend' ), - 'country' => __( 'Country', 'wp-user-frontend' ), - 'state' => __( 'State/Province/Region', 'wp-user-frontend' ), - 'address_1' => __( 'Address line 1', 'wp-user-frontend' ), - 'address_2' => __( 'Address line 2', 'wp-user-frontend' ), - 'city' => __( 'City', 'wp-user-frontend' ), - 'zip' => __( 'Postal Code/ZIP', 'wp-user-frontend' ), - ]; - - foreach ( $fields as $field => $label ) { - $settings_name = 'wpuf_address_' . $field . '_settings'; - $address_options[$field] = get_theme_mod( $settings_name ); - } - - update_option( 'wpuf_address_options', $address_options ); ?> - - add_panel( 'wpuf_panel', [ - 'title' => __( 'WP User Frontend', 'wp-user-frontend' ), - 'description' => __( 'Customize WPUF Settings', 'wp-user-frontend' ), - 'priority' => 25, - ] ); - - /* WPUF Billing Address Customizer */ - $wp_customize->add_section( - 'wpuf_billing_address', - [ - 'title' => __( 'Billing Address', 'wp-user-frontend' ), - 'priority' => 20, - 'panel' => 'wpuf_panel', - 'description' => __( 'These options let you change the appearance of the billing address.', 'wp-user-frontend' ), - ] - ); - - // Billing Address field controls. - $fields = [ - 'show_address' => __( 'Show Billing Address', 'wp-user-frontend' ), - 'country' => __( 'Country', 'wp-user-frontend' ), - 'state' => __( 'State/Province/Region', 'wp-user-frontend' ), - 'address_1' => __( 'Address line 1', 'wp-user-frontend' ), - 'address_2' => __( 'Address line 2', 'wp-user-frontend' ), - 'city' => __( 'City', 'wp-user-frontend' ), - 'zip' => __( 'Postal Code/ZIP', 'wp-user-frontend' ), - ]; - - foreach ( $fields as $field => $label ) { - $wp_customize->add_setting( - 'wpuf_address_' . $field . '_settings', - [ - 'type' => 'theme_mod', - 'section' => 'wpuf_billing_address', - ] - ); - - if ( $field == 'show_address' ) { - $wp_customize->add_control( - 'wpuf_address_' . $field . '_control', - [ - /* Translators: %s field name. */ - 'label' => sprintf( __( '%s field', 'wp-user-frontend' ), $label ), - 'section' => 'wpuf_billing_address', - 'settings' => 'wpuf_address_' . $field . '_settings', - 'type' => 'checkbox', - ] - ); - } else { - $wp_customize->add_control( - 'wpuf_address_' . $field . '_control', - [ - /* Translators: %s field name. */ - 'label' => sprintf( __( '%s field', 'wp-user-frontend' ), $label ), - 'section' => 'wpuf_billing_address', - 'settings' => 'wpuf_address_' . $field . '_settings', - 'type' => 'select', - 'choices' => [ - 'hidden' => __( 'Hidden', 'wp-user-frontend' ), - 'optional' => __( 'Optional', 'wp-user-frontend' ), - 'required' => __( 'Required', 'wp-user-frontend' ), - ], - ] - ); - } - } - } -} diff --git a/includes/class-field-manager.php b/includes/class-field-manager.php index 57061e8f0..12e556067 100755 --- a/includes/class-field-manager.php +++ b/includes/class-field-manager.php @@ -43,12 +43,12 @@ public function get_fields() { * * @param string $field_type * - * @return \WPUF_Field_Contract + * @return WPUF_Field_Contract */ public function get_field( $field_type ) { $fields = $this->get_fields(); - if ( isset( $field_type, $fields ) ) { + if ( isset( $field_type, $fields, $fields[ $field_type ] ) ) { return $fields[ $field_type ]; } } @@ -287,8 +287,9 @@ public function check_field_visibility( &$form_field ) { $show_field = true; } - if ( $visibility_selected == 'hidden' ) { - $form_field['css'] .= 'wpuf_hidden_field'; + if ( 'hidden' === $visibility_selected ) { + $form_field['css'] = ! empty( $form_field['css'] ) ? esc_attr( $form_field['css'] ) : ''; + $form_field['css'] .= ' wpuf_hidden_field'; $show_field = true; } diff --git a/includes/class-frontend-render-form.php b/includes/class-frontend-render-form.php index 11fa1a58c..c35d955a6 100644 --- a/includes/class-frontend-render-form.php +++ b/includes/class-frontend-render-form.php @@ -224,6 +224,10 @@ public function guest_fields( $form_settings ) { public function preview_form() { $form_id = isset( $_GET['form_id'] ) ? intval( wp_unslash( $_GET['form_id'] ) ) : 0; + if ( ! current_user_can( wpuf_admin_role() ) ) { + wp_send_json_error( __( 'Unauthorized operation', 'wp-user-frontend' ) ); + } + if ( $form_id ) { ?> @@ -655,6 +659,10 @@ function ( $term_name ) use ( $taxonomy ) { } // isset tax else { + if ( isset( $taxonomy_name ) && 0 === absint( $taxonomy_name ) ) { + wp_set_post_terms( $post_id, $taxonomy_name, $taxonomy['name'] ); + } + if ( ! isset( $taxonomy['woo_attr'] ) ) { $this->set_default_taxonomy( $post_id ); } @@ -720,6 +728,10 @@ public static function prepare_meta_fields( $meta_vars ) { $wpuf_files = []; } + if ( '_downloadable' === $value['name'] && 'on' === $value_name ) { + $value_name = 'yes'; + } + switch ( $value['input_type'] ) { // put files in a separate array, we'll process it later diff --git a/includes/class-pro-upgrades.php b/includes/class-pro-upgrades.php deleted file mode 100755 index 1758b03cd..000000000 --- a/includes/class-pro-upgrades.php +++ /dev/null @@ -1,119 +0,0 @@ - 'wpuf_cond', - 'title' => __( 'Conditional Logic', 'wp-user-frontend' ), - 'type' => 'option-pro-feature-alert', - 'section' => 'advanced', - 'priority' => 30, - 'help_text' => '', - 'is_pro_feature' => true, - ]; - - return $settings; - } -} diff --git a/includes/class-whats-new.php b/includes/class-whats-new.php deleted file mode 100644 index 3c97b64dc..000000000 --- a/includes/class-whats-new.php +++ /dev/null @@ -1,137 +0,0 @@ -get_option(); - - if ( !current_user_can( 'manage_options' ) ) { - return false; - } - - if ( array_key_exists( WPUF_VERSION, $options ) && $options[WPUF_VERSION] === true ) { - return false; - } - - return true; - } - - /** - * Mark the current plugin changelog as read - * - * @return void - */ - public function mark_read() { - $options = $this->get_option(); - - $options[WPUF_VERSION] = true; - - update_option( 'wpuf_whats_new', $options ); - } - - /** - * Get the changelog history - * - * @return array - */ - public function get_option() { - return get_option( 'wpuf_whats_new', [] ); - } - - /** - * Register the menu page - * - * @return void - */ - public function register_menu() { - add_submenu_page( null, __( 'Whats New', 'wp-user-frontend' ), __( 'Whats New', 'wp-user-frontend' ), 'manage_options', 'whats-new-wpuf', [ $this, 'menu_page' ] ); - } - - /** - * Render the menu page - * - * @return void - */ - public function menu_page() { - $this->mark_read(); - - include_once WPUF_ROOT . '/admin/html/whats-new.php'; - } - - /** - * Show the admin notice if applicable - * - * @return void - */ - public function admin_notice() { - if ( !$this->has_new() ) { - return; - } - - wp_enqueue_script( 'wp-util' ); - - ?> -

    - -
    - WPUF Icon -
    - -
    -

    -

    %s version.', 'wp-user-frontend' ) ), esc_html( WPUF_VERSION ) ); ?>

    -
    - -
    - - -
    -
    - - - mark_read(); - - wp_send_json_success(); - } -} diff --git a/includes/free/admin/shortcode-button.php b/includes/free/admin/shortcode-button.php deleted file mode 100644 index 9eac4f6c3..000000000 --- a/includes/free/admin/shortcode-button.php +++ /dev/null @@ -1,160 +0,0 @@ - - - ' . __( ' Add Form', 'wp-user-frontend' ) ); ?> - - [ - 'title' => __( 'Dashboard', 'wp-user-frontend' ), - 'content' => '[wpuf_dashboard]', - ], - 'wpuf-account' => [ - 'title' => __( 'Account', 'wp-user-frontend' ), - 'content' => '[wpuf_account]', - ], - 'wpuf-edit' => [ - 'title' => __( 'Edit', 'wp-user-frontend' ), - 'content' => '[wpuf_edit]', - ], - 'wpuf-login' => [ - 'title' => __( 'Login', 'wp-user-frontend' ), - 'content' => '[wpuf-login]', - ], - 'wpuf-registration' => [ - 'title' => __( 'Registration', 'wp-user-frontend' ), - 'content' => '[wpuf-registration]', - ], - 'wpuf-sub-pack' => [ - 'title' => __( 'Subscription', 'wp-user-frontend' ), - 'content' => '[wpuf_sub_pack]', - ], - ] ); - - $assets_url = WPUF_ASSET_URI; - - wp_localize_script( 'wpuf-subscriptions', 'wpuf_shortcodes', apply_filters( 'wpuf_button_shortcodes', $shortcodes ) ); - wp_localize_script( 'wpuf-subscriptions', 'wpuf_assets_url', [ 'url' => $assets_url ] ); - } - - /** - * * Singleton object - * - * @staticvar boolean $instance - * - * @return \self - */ - public static function init() { - static $instance = false; - - if ( !$instance ) { - $instance = new WPUF_Shortcodes_Button(); - } - - return $instance; - } - - /** - * Add button on Post Editor - * - * @since 2.5.2 - * - * @param array $plugin_array - * - * @return array - */ - public function enqueue_plugin_scripts( $plugin_array ) { - //enqueue TinyMCE plugin script with its ID. - $plugin_array['wpuf_button'] = WPUF_ASSET_URI . '/js/wpuf-tmc-button.js'; - - return $plugin_array; - } - - /** - * Register tinyMce button - * - * @since 2.5.2 - * - * @param array $buttons - * - * @return array - */ - public function register_buttons_editor( $buttons ) { - //register buttons with their id. - array_push( $buttons, 'wpuf_button' ); - - return $buttons; - } -} - -WPUF_Shortcodes_Button::init(); diff --git a/includes/functions/settings-options.php b/includes/functions/settings-options.php new file mode 100644 index 000000000..ede941545 --- /dev/null +++ b/includes/functions/settings-options.php @@ -0,0 +1,657 @@ + 'wpuf_general', + 'title' => __( 'General Options', 'wp-user-frontend' ), + 'icon' => 'dashicons-admin-generic', + ], + [ + 'id' => 'wpuf_frontend_posting', + 'title' => __( 'Frontend Posting', 'wp-user-frontend' ), + 'icon' => 'dashicons-welcome-write-blog', + ], + [ + 'id' => 'wpuf_dashboard', + 'title' => __( 'Dashboard', 'wp-user-frontend' ), + 'icon' => 'dashicons-dashboard', + ], + [ + 'id' => 'wpuf_my_account', + 'title' => __( 'My Account', 'wp-user-frontend' ), + 'icon' => 'dashicons-id', + ], + [ + 'id' => 'wpuf_profile', + 'title' => __( 'Login / Registration', 'wp-user-frontend' ), + 'icon' => 'dashicons-admin-users', + ], + [ + 'id' => 'wpuf_payment', + 'title' => __( 'Payments', 'wp-user-frontend' ), + 'icon' => 'dashicons-money', + ], + [ + 'id' => 'wpuf_mails', + 'title' => __( 'E-Mails', 'wp-user-frontend' ), + 'icon' => 'dashicons-email-alt', + ], + [ + 'id' => 'wpuf_privacy', + 'title' => __( 'Privacy Options', 'wp-user-frontend' ), + 'icon' => 'dashicons-shield-alt', + ], + ]; + + return apply_filters( 'wpuf_settings_sections', $sections ); +} + +function wpuf_settings_fields() { + $pages = wpuf_get_pages(); + $users = wpuf_list_users(); + $post_types = get_post_types(); + unset( $post_types['attachment'], $post_types['revision'], $post_types['nav_menu_item'], $post_types['wpuf_forms'], $post_types['wpuf_profile'], $post_types['wpuf_input'], $post_types['wpuf_subscription'], $post_types['custom_css'], $post_types['customize_changeset'], $post_types['wpuf_coupon'], $post_types['oembed_cache'] ); + + $login_redirect_pages = [ + 'previous_page' => __( 'Previous Page', 'wp-user-frontend' ), + ] + $pages; + + $all_currencies = wpuf_get_currencies(); + + $currencies = []; + + foreach ( $all_currencies as $currency ) { + $currencies[ $currency['currency'] ] = $currency['label'] . ' (' . $currency['symbol'] . ')'; + } + + $default_currency_symbol = wpuf_get_currency( 'symbol' ); + + $user_roles = []; + $all_roles = get_editable_roles(); + + foreach ( $all_roles as $key => $value ) { + $user_roles[ $key ] = $value['name']; + } + + $settings_fields = [ + 'wpuf_general' => apply_filters( 'wpuf_options_others', [ + [ + 'name' => 'show_admin_bar', + 'label' => __( 'Show Admin Bar', 'wp-user-frontend' ), + 'desc' => __( 'Select user by roles, who can view admin bar in frontend.', 'wp-user-frontend' ), + 'callback' => 'wpuf_settings_multiselect', + 'options' => $user_roles, + 'default' => [ + 'administrator', + 'editor', + 'author', + 'contributor', + ], + ], + [ + 'name' => 'admin_access', + 'label' => __( 'Admin area access', 'wp-user-frontend' ), + 'desc' => __( 'Allow you to block specific user role to Ajax request and Media upload.', + 'wp-user-frontend' ), + 'type' => 'select', + 'default' => 'read', + 'options' => [ + 'manage_options' => __( 'Admin Only', 'wp-user-frontend' ), + 'edit_others_posts' => __( 'Admins, Editors', 'wp-user-frontend' ), + 'publish_posts' => __( 'Admins, Editors, Authors', 'wp-user-frontend' ), + 'edit_posts' => __( 'Admins, Editors, Authors, Contributors', 'wp-user-frontend' ), + 'read' => __( 'Default', 'wp-user-frontend' ), + ], + ], + [ + 'name' => 'override_editlink', + 'label' => __( 'Override the post edit link', 'wp-user-frontend' ), + 'desc' => __( 'Users see the edit link in post if s/he is capable to edit the post/page. Selecting Yes will override the default WordPress edit post link in frontend', + 'wp-user-frontend' ), + 'type' => 'select', + 'default' => 'no', + 'options' => [ + 'yes' => __( 'Yes', 'wp-user-frontend' ), + 'no' => __( 'No', 'wp-user-frontend' ), + ], + ], + [ + 'name' => 'wpuf_compatibility_acf', + 'label' => __( 'ACF Compatibility', 'wp-user-frontend' ), + 'desc' => __( 'Select Yes if you want to make compatible WPUF custom fields data with advanced custom fields.', + 'wp-user-frontend' ), + 'type' => 'select', + 'default' => 'no', + 'options' => [ + 'yes' => __( 'Yes', 'wp-user-frontend' ), + 'no' => __( 'No', 'wp-user-frontend' ), + ], + ], + [ + 'name' => 'load_script', + 'label' => __( 'Load Scripts', 'wp-user-frontend' ), + 'desc' => __( 'Load scripts/styles in all pages', 'wp-user-frontend' ), + 'type' => 'checkbox', + 'default' => 'on', + ], + [ + 'name' => 'recaptcha_public', + 'label' => __( 'reCAPTCHA Site Key', 'wp-user-frontend' ), + ], + [ + 'name' => 'recaptcha_private', + 'label' => __( 'reCAPTCHA Secret Key', 'wp-user-frontend' ), + 'desc' => __( 'Register here to get reCaptcha Site and Secret keys.', + 'wp-user-frontend' ), + ], + [ + 'name' => 'custom_css', + 'label' => __( 'Custom CSS codes', 'wp-user-frontend' ), + 'desc' => __( 'If you want to add your custom CSS code, it will be added on page header wrapped with style tag', + 'wp-user-frontend' ), + 'type' => 'textarea', + ], + ] ), + 'wpuf_frontend_posting' => apply_filters( 'wpuf_options_frontend_posting', [ + [ + 'name' => 'edit_page_id', + 'label' => __( 'Edit Page', 'wp-user-frontend' ), + 'desc' => __( 'Select the page where [wpuf_edit] is located', 'wp-user-frontend' ), + 'type' => 'select', + 'options' => $pages, + ], + [ + 'name' => 'default_post_owner', + 'label' => __( 'Default Post Owner', 'wp-user-frontend' ), + 'desc' => __( 'If guest post is enabled and user details are OFF, the posts are assigned to this user', + 'wp-user-frontend' ), + 'type' => 'select', + 'options' => $users, + 'default' => '1', + ], + [ + 'name' => 'cf_show_front', + 'label' => __( 'Custom Fields in post', 'wp-user-frontend' ), + 'desc' => __( 'Show custom fields on post content area', 'wp-user-frontend' ), + 'type' => 'checkbox', + 'default' => 'off', + ], + [ + 'name' => 'insert_photo_size', + 'label' => __( 'Insert Photo image size', 'wp-user-frontend' ), + 'desc' => __( 'Default image size of "Insert Photo" button in post content area', + 'wp-user-frontend' ), + 'type' => 'select', + 'options' => wpuf_get_image_sizes(), + 'default' => 'thumbnail', + ], + [ + 'name' => 'insert_photo_type', + 'label' => __( 'Insert Photo image type', 'wp-user-frontend' ), + 'desc' => __( 'Default image type of "Insert Photo" button in post content area', + 'wp-user-frontend' ), + 'type' => 'select', + 'options' => [ + 'image' => __( 'Image only', 'wp-user-frontend' ), + 'link' => __( 'Image with link', 'wp-user-frontend' ), + ], + 'default' => 'link', + ], + [ + 'name' => 'image_caption', + 'label' => __( 'Enable Image Caption', 'wp-user-frontend' ), + 'desc' => __( 'Allow users to update image/video title, caption and description', + 'wp-user-frontend' ), + 'type' => 'checkbox', + 'default' => 'off', + ], + [ + 'name' => 'default_post_form', + 'label' => __( 'Default Post Form', 'wp-user-frontend' ), + 'desc' => __( 'Fallback form for post editing if no associated form found', 'wp-user-frontend' ), + 'type' => 'select', + 'options' => wpuf_get_pages( 'wpuf_forms' ), + ], + ] ), + 'wpuf_dashboard' => apply_filters( 'wpuf_options_dashboard', [ + [ + 'name' => 'enable_post_edit', + 'label' => __( 'Users can edit post?', 'wp-user-frontend' ), + 'desc' => __( 'Users will be able to edit their own posts', 'wp-user-frontend' ), + 'type' => 'select', + 'default' => 'yes', + 'options' => [ + 'yes' => __( 'Yes', 'wp-user-frontend' ), + 'no' => __( 'No', 'wp-user-frontend' ), + ], + ], + [ + 'name' => 'enable_post_del', + 'label' => __( 'User can delete post?', 'wp-user-frontend' ), + 'desc' => __( 'Users will be able to delete their own posts', 'wp-user-frontend' ), + 'type' => 'select', + 'default' => 'yes', + 'options' => [ + 'yes' => __( 'Yes', 'wp-user-frontend' ), + 'no' => __( 'No', 'wp-user-frontend' ), + ], + ], + [ + 'name' => 'disable_pending_edit', + 'label' => __( 'Pending Post Edit', 'wp-user-frontend' ), + 'desc' => __( 'Disable post editing while post in "pending" status', 'wp-user-frontend' ), + 'type' => 'checkbox', + 'default' => 'on', + ], + [ + 'name' => 'disable_publish_edit', + 'label' => __( 'Editing Published Post', 'wp-user-frontend' ), + 'desc' => __( 'Disable post editing while post in "publish" status', 'wp-user-frontend' ), + 'type' => 'checkbox', + 'default' => 'off', + ], + [ + 'name' => 'per_page', + 'label' => __( 'Posts per page', 'wp-user-frontend' ), + 'desc' => __( 'How many posts will be listed in a page', 'wp-user-frontend' ), + 'type' => 'text', + 'default' => '10', + ], + [ + 'name' => 'show_user_bio', + 'label' => __( 'Show user bio', 'wp-user-frontend' ), + 'desc' => __( 'Users biographical info will be shown', 'wp-user-frontend' ), + 'type' => 'checkbox', + 'default' => 'on', + ], + [ + 'name' => 'show_post_count', + 'label' => __( 'Show post count', 'wp-user-frontend' ), + 'desc' => __( 'Show how many posts are created by the user', 'wp-user-frontend' ), + 'type' => 'checkbox', + 'default' => 'on', + ], + [ + 'name' => 'show_ft_image', + 'label' => __( 'Show Featured Image', 'wp-user-frontend' ), + 'desc' => __( 'Show featured image of the post (Overridden by Shortcode)', 'wp-user-frontend' ), + 'type' => 'checkbox', + ], + [ + 'name' => 'show_payment_column', + 'label' => __( 'Show Payment Column', 'wp-user-frontend' ), + 'desc' => __( 'Enable if you want show payment column on posts table', 'wp-user-frontend' ), + 'type' => 'checkbox', + 'default' => 'on', + ], + [ + 'name' => 'ft_img_size', + 'label' => __( 'Featured Image size', 'wp-user-frontend' ), + 'type' => 'select', + 'options' => wpuf_get_image_sizes(), + ], + [ + 'name' => 'un_auth_msg', + 'label' => __( 'Unauthorized Message', 'wp-user-frontend' ), + 'desc' => __( 'Not logged in users will see this message', 'wp-user-frontend' ), + 'type' => 'textarea', + ], + ] ), + 'wpuf_my_account' => apply_filters( 'wpuf_options_wpuf_my_account', [ + [ + 'name' => 'account_page', + 'label' => __( 'Account Page', 'wp-user-frontend' ), + 'desc' => __( 'Select the page which contains [wpuf_account] shortcode', + 'wp-user-frontend' ), + 'type' => 'select', + 'options' => $pages, + ], + [ + 'name' => 'cp_on_acc_page', + 'label' => __( 'Select Custom Post For Account Page', 'wp-user-frontend' ), + 'desc' => __( 'Select the post types you want to show on user dashboard.', 'wp-user-frontend' ), + 'callback' => 'wpuf_settings_multiselect', + 'options' => $post_types, + ], + [ + 'name' => 'account_page_active_tab', + 'label' => __( 'Active Tab', 'wp-user-frontend' ), + 'desc' => __( 'Which tab should be set as active by default when opening the account page', + 'wp-user-frontend' ), + 'type' => 'select', + 'options' => wpuf_get_account_sections_list(), + ], + [ + 'name' => 'show_subscriptions', + 'label' => __( 'Show Subscriptions', 'wp-user-frontend' ), + 'desc' => __( 'Show Subscriptions tab in "my account" page where [wpuf_account] is located', + 'wp-user-frontend' ), + 'type' => 'checkbox', + 'default' => 'on', + ], + [ + 'name' => 'show_billing_address', + 'label' => __( 'Show Billing Address', 'wp-user-frontend' ), + 'desc' => __( 'Show billing address in account page.', 'wp-user-frontend' ), + 'type' => 'checkbox', + 'default' => 'on', + ], + [ + 'name' => 'allow_post_submission', + 'label' => __( 'Post Submission', 'wp-user-frontend' ), + 'desc' => __( 'Enable if you want to allow users to submit post from the account page.', + 'wp-user-frontend' ), + 'type' => 'checkbox', + 'default' => 'on', + ], + [ + 'name' => 'post_submission_label', + 'label' => __( 'Submission Menu Label', 'wp-user-frontend' ), + 'desc' => __( 'Label for post submission menu', 'wp-user-frontend' ), + 'type' => 'text', + 'default' => __( 'Submit Post', 'wp-user-frontend' ), + ], + [ + 'name' => 'post_submission_form', + 'label' => __( 'Submission Form', 'wp-user-frontend' ), + 'desc' => __( 'Select a post form that will use to submit post by the users from their account page.', + 'wp-user-frontend' ), + 'type' => 'select', + 'options' => wpuf_get_post_forms(), + ], + ] ), + 'wpuf_profile' => apply_filters( 'wpuf_options_profile', [ + [ + 'name' => 'autologin_after_registration', + 'label' => __( 'Auto Login After Registration', 'wp-user-frontend' ), + 'desc' => __( 'If enabled, users after registration will be logged in to the system', + 'wp-user-frontend' ), + 'type' => 'checkbox', + 'default' => 'on', + ], + [ + 'name' => 'register_link_override', + 'label' => __( 'Login/Registration override', 'wp-user-frontend' ), + 'desc' => __( 'If enabled, default login and registration forms will be overridden by WPUF with pages below', + 'wp-user-frontend' ), + 'type' => 'checkbox', + 'default' => 'on', + ], + [ + 'name' => 'reg_override_page', + 'label' => __( 'Registration Page', 'wp-user-frontend' ), + 'desc' => __( 'Select the page you want to use as registration page override (should have shortcode)', + 'wp-user-frontend' ), + 'type' => 'select', + 'options' => $pages, + ], + [ + 'name' => 'login_page', + 'label' => __( 'Login Page', 'wp-user-frontend' ), + 'desc' => __( 'Select the page which contains [wpuf-login] shortcode', + 'wp-user-frontend' ), + 'type' => 'select', + 'options' => $pages, + ], + [ + 'name' => 'redirect_after_login_page', + 'label' => __( 'Redirect After Login', 'wp-user-frontend' ), + 'desc' => __( 'After successfull login, where the page will redirect to', 'wp-user-frontend' ), + 'type' => 'select', + 'options' => $login_redirect_pages, + ], + [ + 'name' => 'wp_default_login_redirect', + 'label' => __( 'Default Login Redirect', 'wp-user-frontend' ), + 'desc' => __( 'If enabled, users who login using WordPress default login form will be redirected to the selected page.', + 'wp-user-frontend' ), + 'type' => 'checkbox', + 'default' => 'off', + ], + [ + 'name' => 'login_form_recaptcha', + 'label' => __( 'reCAPTCHA in Login Form', 'wp-user-frontend' ), + 'desc' => __( 'If enabled, users have to verify reCAPTCHA in login page. Also, make sure that reCAPTCHA is configured properly from General Options', + 'wp-user-frontend' ), + 'type' => 'checkbox', + 'default' => 'off', + ], + ] ), + 'wpuf_payment' => apply_filters( 'wpuf_options_payment', [ + [ + 'name' => 'enable_payment', + 'label' => __( 'Enable Payments', 'wp-user-frontend' ), + 'desc' => __( 'Enable payments on your site.', 'wp-user-frontend' ), + 'type' => 'checkbox', + 'default' => 'on', + ], + [ + 'name' => 'subscription_page', + 'label' => __( 'Subscription Pack Page', 'wp-user-frontend' ), + 'desc' => __( 'Select the page where [wpuf_sub_pack] located.', 'wp-user-frontend' ), + 'type' => 'select', + 'options' => $pages, + ], + [ + 'name' => 'register_subscription', + 'label' => __( 'Subscription at registration', 'wp-user-frontend' ), + 'desc' => __( 'Registration time redirect to subscription page', 'wp-user-frontend' ), + 'type' => 'checkbox', + ], + [ + 'name' => 'currency', + 'label' => __( 'Currency', 'wp-user-frontend' ), + 'type' => 'select', + 'default' => 'USD', + 'options' => $currencies, + ], + [ + 'name' => 'currency_position', + 'label' => __( 'Currency Position', 'wp-user-frontend' ), + 'type' => 'select', + 'default' => 'left', + 'options' => [ + 'left' => sprintf( '%1$s (%2$s99.99)', __( 'Left', 'wp-user-frontend' ), + $default_currency_symbol ), + 'right' => sprintf( '%1$s (99.99%2$s)', __( 'Right', 'wp-user-frontend' ), + $default_currency_symbol ), + 'left_space' => sprintf( '%1$s (%2$s 99.99)', __( 'Left with space', 'wp-user-frontend' ), + $default_currency_symbol ), + 'right_space' => sprintf( '%1$s (99.99 %2$s)', __( 'Right with space', 'wp-user-frontend' ), + $default_currency_symbol ), + ], + ], + [ + 'name' => 'wpuf_price_thousand_sep', + 'label' => __( 'Thousand Separator', 'wp-user-frontend' ), + 'desc' => __( 'This sets the thousand separator of displayed prices.', 'wp-user-frontend' ), + 'css' => 'width:50px;', + 'default' => ',', + 'type' => 'text', + 'desc_tip' => true, + ], + [ + 'name' => 'wpuf_price_decimal_sep', + 'label' => __( 'Decimal Separator', 'wp-user-frontend' ), + 'desc' => __( 'This sets the decimal separator of displayed prices.', 'wp-user-frontend' ), + 'default' => '.', + 'type' => 'text', + ], + [ + 'name' => 'wpuf_price_num_decimals', + 'label' => __( 'Number of Decimals', 'wp-user-frontend' ), + 'desc' => __( 'This sets the number of decimal points shown in displayed prices.', + 'wp-user-frontend' ), + 'default' => '2', + 'type' => 'number', + 'custom_attributes' => [ + 'min' => 0, + 'step' => 1, + ], + ], + [ + 'name' => 'sandbox_mode', + 'label' => __( 'Enable demo/sandbox mode', 'wp-user-frontend' ), + 'desc' => __( 'When sandbox mode is active, all payment gateway will be used in demo mode', + 'wp-user-frontend' ), + 'type' => 'checkbox', + 'default' => 'on', + ], + [ + 'name' => 'payment_page', + 'label' => __( 'Payment Page', 'wp-user-frontend' ), + 'desc' => __( 'This page will be used to process payment options', 'wp-user-frontend' ), + 'type' => 'select', + 'options' => $pages, + ], + [ + 'name' => 'payment_success', + 'label' => __( 'Payment Success Page', 'wp-user-frontend' ), + 'desc' => __( 'After payment users will be redirected here', 'wp-user-frontend' ), + 'type' => 'select', + 'options' => $pages, + ], + [ + 'name' => 'active_gateways', + 'label' => __( 'Payment Gateways', 'wp-user-frontend' ), + 'desc' => __( 'Active payment gateways', 'wp-user-frontend' ), + 'type' => 'multicheck', + 'options' => wpuf_get_gateways(), + ], + [ + 'name' => 'failed_retry', + 'label' => __( 'Retry Failed Payment', 'wp-user-frontend' ), + 'desc' => __( 'How many times should retry for failed payment max is 4', + 'wp-user-frontend' ), + 'default' => '2', + 'type' => 'number', + 'custom_attributes' => [ + 'min' => 1, + 'max' => 4, + 'step' => 1, + ], + ], + ] ), + 'wpuf_mails' => apply_filters( 'wpuf_mail_options', [ + [ + 'name' => 'guest_email_setting', + 'label' => __( ' Guest Email', + 'wp-user-frontend' ), + 'type' => 'html', + 'class' => 'guest-email-setting', + ], + [ + 'name' => 'enable_guest_email_notification', + 'class' => 'guest-email-setting-option', + 'label' => __( 'Guest Email Notification', 'wp-user-frontend' ), + 'desc' => __( 'Enable Guest Email Notification .', 'wp-user-frontend' ), + 'default' => 'on', + 'type' => 'checkbox', + ], + [ + 'name' => 'guest_email_subject', + 'label' => __( 'Guest mail subject', 'wp-user-frontend' ), + 'desc' => __( 'This sets the subject of the emails sent to guest users', 'wp-user-frontend' ), + 'default' => 'Please Confirm Your Email to Get the Post Published!', + 'type' => 'text', + 'class' => 'guest-email-setting-option', + ], + [ + 'name' => 'guest_email_body', + 'label' => __( 'Guest mail body', 'wp-user-frontend' ), + 'desc' => __( "This sets the body of the emails sent to guest users. Please DON'T edit the {activation_link} part, you can use {sitename} too.", + 'wp-user-frontend' ), + 'default' => 'Hey There, + + We just received your guest post and now we want you to confirm your email so that we can verify the content and move on to the publishing process. + + Please click the link below to verify: + {activation_link} + + Regards, + {sitename}', + 'type' => 'wysiwyg', + 'class' => 'guest-email-setting-option', + ], + ] ), + 'wpuf_privacy' => apply_filters( 'wpuf_privacy_options', [ + [ + 'name' => 'export_post_types', + 'label' => __( 'Post Types', 'wp-user-frontend' ), + 'desc' => __( 'Select the post types you will allow users to export.', 'wp-user-frontend' ), + 'callback' => 'wpuf_settings_multiselect', + 'options' => $post_types, + ], + ] ), + ]; + + return apply_filters( 'wpuf_settings_fields', $settings_fields ); +} + +function wpuf_settings_field_profile( $form ) { + $user_roles = wpuf_get_user_roles(); + $forms = get_posts( + [ + 'numberposts' => -1, + 'post_type' => 'wpuf_profile', + ] + ); + $crown_icon = ''; + $class = ''; + $disabled = ''; + + $val = get_option( 'wpuf_profile', [] ); + + if ( ! class_exists( 'WP_User_Frontend_Pro' ) ) { + $crown_icon = sprintf( ' %s', file_get_contents( WPUF_ROOT . '/assets/images/crown.svg' ) ); + $class = 'class="pro-preview"'; + $disabled = 'disabled'; + } + ?> + +

    + +

    + + $name ) { + $current = isset( $val['roles'][ $role ] ) ? $val['roles'][ $role ] : ''; + ?> + > + + + + +
    + + +
    + get_all_post_type(); + $post_type = (new Subscription())->get_all_post_type(); foreach ( $results as $key => $result ) { $args = [ diff --git a/includes/upgrades/upgrade-2.6.0.php b/includes/upgrades/upgrade-2.6.0.php index 412782480..87168df30 100644 --- a/includes/upgrades/upgrade-2.6.0.php +++ b/includes/upgrades/upgrade-2.6.0.php @@ -1,5 +1,7 @@ subscription_pack_users(); + $users = (new Subscription())->subscription_pack_users(); foreach ( $users as $user ) { $sub_data = get_user_meta( $user->data->ID, '_wpuf_subscription_pack', true ); diff --git a/includes/upgrades/upgrade-4.0.4.php b/includes/upgrades/upgrade-4.0.4.php new file mode 100644 index 000000000..19901d5e5 --- /dev/null +++ b/includes/upgrades/upgrade-4.0.4.php @@ -0,0 +1,35 @@ + 'wpuf_input', + 'numberposts' => -1, + ]; + + $input_fields = get_posts( $args ); + + if ( empty( $input_fields ) ) { + return; + } + + foreach ( $input_fields as $field ) { + if ( empty( $field->post_content ) ) { + continue; + } + + $content = maybe_unserialize( $field->post_content ); + + if ( ! empty( $content['input_type'] ) && 'column_field' === $content['input_type'] && ! isset( $content['wpuf_visibility'] ) ) { + $content['wpuf_visibility'] = [ + 'selected' => 'everyone', + 'choices' => [], + ]; + + $field->post_content = maybe_serialize( $content ); + + wp_update_post( $field ); + } + } +} + +wpuf_upgrade_4_0_4_migration(); diff --git a/languages/wp-user-frontend-ar.po b/languages/wp-user-frontend-ar.po index 19ed19d1e..8486444dd 100644 --- a/languages/wp-user-frontend-ar.po +++ b/languages/wp-user-frontend-ar.po @@ -260,8 +260,8 @@ msgid "Product form was unable to show the single gallery image" msgstr "تعذر على نموذج المنتج إظهار صورة المعرض الفردي" #: admin/html/whats-new.php:134 -msgid "It was unable to install WP User Frontend with PHP 5.4 or lower version. Here is the error details:

    Fatal error: Can't use method return value in write context in /wp-user-frontend/class/frontend-form-post.php on line 194" -msgstr "تعذر تثبيت WP User Frontend مع PHP 5.4 أو إصدار أقل. هنا تفاصيل الخطأ:

    Fatal error: Can't use method return value in write context in /wp-user-frontend/class/frontend-form-post.php on line 194" +msgid "It was unable to install WP User Frontend with PHP 5.4 or lower version. Here is the error details:

    Fatal error: Can't use method return value in write context in /wp-user-frontend/class/frontend-form-WPUF_Post_Form_Template_Post.php on line 194" +msgstr "تعذر تثبيت WP User Frontend مع PHP 5.4 أو إصدار أقل. هنا تفاصيل الخطأ:

    Fatal error: Can't use method return value in write context in /wp-user-frontend/class/frontend-form-WPUF_Post_Form_Template_Post.php on line 194" #: admin/html/whats-new.php:132 msgid "Fatal error when use PHP lower version (5.4 or lower)" @@ -4562,11 +4562,11 @@ msgid "Pricing & Plans" msgstr "الأسعار والخطط" #: class/payment.php:123 -msgid "You already have activated a free package previously." +msgid "You already have activated a Free package previously." msgstr "لقد قمت بالفعل بتنشيط حزمة مجانية مسبقًا." #: class/payment.php:121 -msgid "Your free package has been activated. Enjoy!" +msgid "Your Free package has been activated. Enjoy!" msgstr "حزمتك المجانية نشطة. التحق!" #: class/payment.php:71 @@ -6146,4 +6146,4 @@ msgstr "إستمارة" #: admin/form.php:49 admin/form.php:69 admin/form.php:71 admin/form.php:107 msgid "Forms" -msgstr "أشكال" \ No newline at end of file +msgstr "أشكال" diff --git a/languages/wp-user-frontend-es_ES.po b/languages/wp-user-frontend-es_ES.po index 9a3672680..c8c721afa 100644 --- a/languages/wp-user-frontend-es_ES.po +++ b/languages/wp-user-frontend-es_ES.po @@ -2246,11 +2246,11 @@ msgid "Please select your payment page from admin panel" msgstr "Por favor, seleccione su página de pago en el panel de administración" #: class/payment.php:118 -msgid "Your free package has been activated. Enjoy!" +msgid "Your Free package has been activated. Enjoy!" msgstr "¡Su paquete gratuito ha sido activado!" #: class/payment.php:120 -msgid "You already have activated a free package previously." +msgid "You already have activated a Free package previously." msgstr "Ya has activado un paquete gratuito anteriormente." #: class/payment.php:144 diff --git a/languages/wp-user-frontend-fa_IR.po b/languages/wp-user-frontend-fa_IR.po index 3c9951a8a..eb9ea3e33 100644 --- a/languages/wp-user-frontend-fa_IR.po +++ b/languages/wp-user-frontend-fa_IR.po @@ -1834,11 +1834,11 @@ msgid "Please select your payment page from admin panel" msgstr "لطفا برگه پرداخت خود را از ناحیه مدیریت انتخاب کنید" #: class/payment.php:117 -msgid "Your free package has been activated. Enjoy!" +msgid "Your Free package has been activated. Enjoy!" msgstr "بسته رایگان شما فعال شده است. لذت ببرید!" #: class/payment.php:119 -msgid "You already have activated a free package previously." +msgid "You already have activated a Free package previously." msgstr "شما در حال حاضر یک بسته رایگان از قبل فعال کرده اید." #: class/payment.php:143 diff --git a/languages/wp-user-frontend-tr_TR.po b/languages/wp-user-frontend-tr_TR.po index ca1d78ee7..8e3221e86 100644 --- a/languages/wp-user-frontend-tr_TR.po +++ b/languages/wp-user-frontend-tr_TR.po @@ -3231,11 +3231,11 @@ msgid "Please select your payment page from admin panel" msgstr "Lütfen ödeme sayfasını yönetici panelinden seçin" #: class/payment.php:118 -msgid "Your free package has been activated. Enjoy!" +msgid "Your Free package has been activated. Enjoy!" msgstr "Ücretsiz paketiniz etkinleştirildi. Tadını çıkarın!" #: class/payment.php:120 -msgid "You already have activated a free package previously." +msgid "You already have activated a Free package previously." msgstr "Daha önceden zaten bir ücretsiz paketi etkinleştirmişsiniz." #: class/payment.php:144 diff --git a/languages/wp-user-frontend-zh_CN.po b/languages/wp-user-frontend-zh_CN.po index 081cd2dd1..7465f2136 100644 --- a/languages/wp-user-frontend-zh_CN.po +++ b/languages/wp-user-frontend-zh_CN.po @@ -1768,11 +1768,11 @@ msgid "Please select your payment page from admin panel" msgstr "请从管理面板选择付款页面" #: ../class/payment.php:117 -msgid "Your free package has been activated. Enjoy!" +msgid "Your Free package has been activated. Enjoy!" msgstr "你的免费套餐已经激活。" #: ../class/payment.php:119 -msgid "You already have activated a free package previously." +msgid "You already have activated a Free package previously." msgstr "你之前已经激活一个免费套餐。" #: ../class/payment.php:143 @@ -3112,7 +3112,7 @@ msgstr "请修正错误以继续进行" #~ msgid "Post Left:" #~ msgstr "文章剩余:" -#~ msgid "You can only buy the free pack once. Proceed?" +#~ msgid "You can only buy the Free pack once. Proceed?" #~ msgstr "你可以购买一次免费包,继续?" #~ msgid "Click here to complete the payment on %s" diff --git a/languages/wp-user-frontend.pot b/languages/wp-user-frontend.pot index d121c2cd2..6e534c08a 100644 --- a/languages/wp-user-frontend.pot +++ b/languages/wp-user-frontend.pot @@ -1,14 +1,14 @@ -# Copyright (C) 2022 weDevs +# Copyright (C) 2024 weDevs # This file is distributed under the GPL2 or later. msgid "" msgstr "" -"Project-Id-Version: WP User Frontend 3.6.0\n" +"Project-Id-Version: WP User Frontend 4.0.6\n" "Report-Msgid-Bugs-To: https://wedevs.com/contact/\n" -"POT-Creation-Date: 2022-11-23 12:11:01+00:00\n" +"POT-Creation-Date: 2024-02-13 06:25:03+00:00\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" -"PO-Revision-Date: 2022-MO-DA HO:MI+ZONE\n" +"PO-Revision-Date: 2024-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" "Language: en\n" @@ -24,7490 +24,8044 @@ msgstr "" "X-Textdomain-Support: yes\n" "X-Generator: grunt-wp-i18n 1.0.3\n" +#: Lib/Gateway/Bank.php:32 +msgid "Bank Instruction" +msgstr "" + +#: Lib/Gateway/Bank.php:39 +msgid "Bank Payment Success Page" +msgstr "" + +#: Lib/Gateway/Bank.php:40 includes/functions/settings-options.php:518 +msgid "After payment users will be redirected here" +msgstr "" + +#: Lib/Gateway/Bank.php:89 +msgid "[%s] New Bank Order Received" +msgstr "" + +#: Lib/Gateway/Bank.php:90 +msgid "New bank order received at %s, please check it out: %s" +msgstr "" + +#: Lib/Gateway/Bank.php:111 includes/Frontend/Payment.php:526 +#. translators: %s is site title name +msgid "[%s] Payment Received" +msgstr "" + +#: Lib/Gateway/Bank.php:112 +msgid "Hello %s," +msgstr "" + +#: Lib/Gateway/Bank.php:113 +msgid "We have received your bank payment." +msgstr "" + +#: Lib/Gateway/Bank.php:114 +msgid "Thanks for being with us." +msgstr "" + +#: Lib/Gateway/Paypal.php:40 +msgid "PayPal Email" +msgstr "" + +#: Lib/Gateway/Paypal.php:45 +msgid "PayPal Instruction" +msgstr "" + +#: Lib/Gateway/Paypal.php:52 +msgid "PayPal API username" +msgstr "" + +#: Lib/Gateway/Paypal.php:56 +msgid "PayPal API password" +msgstr "" + +#: Lib/Gateway/Paypal.php:60 +msgid "PayPal API signature" +msgstr "" + +#: Lib/Gateway/Paypal.php:142 +msgid "Subscription %1$s at %2$s" +msgstr "" + +#: Lib/WeDevs_Settings_API.php:409 +msgid "Choose File" +msgstr "" + #. Plugin Name of the plugin/theme msgid "WP User Frontend" msgstr "" -#: admin/class-admin-settings.php:87 admin/form.php:35 +#: admin/class-admin-settings.php:89 includes/Admin/Menu.php:23 msgid "User Frontend" msgstr "" -#: admin/class-admin-settings.php:89 admin/post-forms-list-table-view.php:4 +#: admin/class-admin-settings.php:91 includes/Admin/Menu.php:27 +#: includes/Admin/Menu.php:28 +#: includes/Admin/views/post-forms-list-table-view.php:5 msgid "Post Forms" msgstr "" -#: admin/class-admin-settings.php:102 +#: admin/class-admin-settings.php:104 includes/Admin/Menu.php:44 msgid "Subscriptions" msgstr "" -#: admin/class-admin-settings.php:108 admin/class-tools.php:358 -#: admin/transactions.php:2 +#: admin/class-admin-settings.php:110 includes/Admin/Admin_Tools.php:368 +#: includes/Admin/Menu.php:48 +#: includes/Admin/views/transactions-list-table-view.php:2 msgid "Transactions" msgstr "" -#: admin/class-admin-settings.php:111 admin/tools.php:13 +#: admin/class-admin-settings.php:113 includes/Admin/Menu.php:53 +#: includes/Admin/views/tools.php:7 msgid "Tools" msgstr "" -#: admin/class-admin-settings.php:116 +#: admin/class-admin-settings.php:118 includes/Admin/Menu.php:65 msgid "Premium" msgstr "" -#: admin/class-admin-settings.php:118 +#: admin/class-admin-settings.php:120 includes/Admin/Menu.php:70 msgid "Help" msgstr "" -#: admin/class-admin-settings.php:118 +#: admin/class-admin-settings.php:120 msgid "Help" msgstr "" -#: admin/class-admin-settings.php:119 admin/class-admin-settings.php:167 -#: admin/form-builder/views/form-builder.php:9 includes/setup-wizard.php:125 +#: admin/class-admin-settings.php:121 admin/class-admin-settings.php:169 +#: admin/form-builder/views/form-builder.php:9 +#: includes/Admin/Admin_Settings.php:68 includes/Admin/Menu.php:81 +#: includes/Admin/Menu.php:323 includes/Setup_Wizard.php:141 msgid "Settings" msgstr "" -#: admin/class-admin-settings.php:121 admin/class-admin-subscription.php:204 -#: admin/subscribers.php:18 +#: admin/class-admin-settings.php:123 includes/Admin/Admin_Subscription.php:189 +#: includes/Admin/Menu.php:75 includes/Admin/views/subscribers.php:14 msgid "Subscribers" msgstr "" -#: admin/class-admin-settings.php:464 +#: admin/class-admin-settings.php:466 includes/Admin/Menu.php:168 msgid "Number of items per page:" msgstr "" -#: admin/class-admin-settings.php:495 +#: admin/class-admin-settings.php:497 includes/Admin.php:77 msgid "Post lock has been cleared" msgstr "" -#: admin/class-admin-settings.php:525 +#: admin/class-admin-settings.php:500 includes/Admin.php:81 +msgid "" +"%sThis post contains a sensitive short-code %s, that may allow others to " +"sign-up with distinguished roles. If unsure, remove the short-code before " +"publishing (recommended) %sas this may be exploited as a security " +"vulnerability.%s" +msgstr "" + +#: admin/class-admin-settings.php:536 includes/Admin/Menu.php:278 msgid "WPUF Import Forms" msgstr "" -#: admin/class-admin-settings.php:526 +#: admin/class-admin-settings.php:537 includes/Admin/Menu.php:279 msgid "Add JSON file" msgstr "" -#: admin/class-admin-settings.php:527 +#: admin/class-admin-settings.php:538 includes/Admin/Menu.php:280 msgid "Could not import forms." msgstr "" -#: admin/class-admin-settings.php:608 +#: admin/class-admin-settings.php:618 +#: includes/Admin/Forms/Admin_Form_Handler.php:60 +#: includes/Admin/Forms/Admin_Form_Handler.php:200 +msgid "You do not have sufficient permissions to do this action" +msgstr "" + +#: admin/class-admin-settings.php:623 includes/Admin/Admin_Tools.php:459 msgid "Missing file_id param" msgstr "" -#: admin/class-admin-settings.php:618 +#: admin/class-admin-settings.php:633 includes/Admin/Admin_Tools.php:466 msgid "JSON file not found" msgstr "" -#: admin/class-admin-settings.php:627 +#: admin/class-admin-settings.php:642 includes/Admin/Admin_Tools.php:471 msgid "Provided file is not a JSON file." msgstr "" -#: admin/class-admin-settings.php:644 +#: admin/class-admin-settings.php:659 includes/Admin/Admin_Tools.php:482 msgid "Forms imported successfully." msgstr "" -#: admin/class-admin-subscription.php:57 -msgid "Pack Description" +#: admin/form-builder/assets/js/components/builder-stage/template.php:3 +msgid "Add fields by dragging the fields from the right sidebar to this area." msgstr "" -#: admin/class-admin-subscription.php:71 admin/class-admin-subscription.php:74 -msgid "Subscription pack updated." +#: admin/form-builder/assets/js/components/builder-stage/template.php:29 +#: admin/form-builder/assets/js/components/form-column_field/template.php:29 +msgid "is available in Pro Version" msgstr "" -#: admin/class-admin-subscription.php:72 -msgid "Custom field updated." +#: admin/form-builder/assets/js/components/builder-stage/template.php:60 +msgid "Hidden Fields" msgstr "" -#: admin/class-admin-subscription.php:73 -msgid "Custom field deleted." +#: admin/form-builder/assets/js/components/builder-stage/template.php:67 +msgid "key" msgstr "" -#: admin/class-admin-subscription.php:75 -msgid "Subscription pack restored to revision from %s" +#: admin/form-builder/assets/js/components/builder-stage/template.php:67 +msgid "value" msgstr "" -#: admin/class-admin-subscription.php:76 -msgid "Subscription pack published." +#: admin/form-builder/assets/js/components/field-option-data/template.php:10 +#: admin/template.php:231 includes/Admin/Forms/Admin_Template.php:270 +msgid "Show values" msgstr "" -#: admin/class-admin-subscription.php:77 -msgid "Subscription pack saved." +#: admin/form-builder/assets/js/components/field-option-data/template.php:18 +msgid "Sync values" msgstr "" -#: admin/class-admin-subscription.php:78 -msgid "Subscription pack submitted." +#: admin/form-builder/assets/js/components/field-option-data/template.php:20 +msgid "When enabled, option values will update according to their labels." msgstr "" -#: admin/class-admin-subscription.php:80 -msgid "Subscription pack draft updated." +#: admin/form-builder/assets/js/components/field-option-data/template.php:32 +#: admin/template.php:234 admin/template.php:286 +#: includes/Admin/Forms/Admin_Template.php:275 +#: includes/Admin/Forms/Admin_Template.php:336 +msgid "Label" msgstr "" -#: admin/class-admin-subscription.php:202 class/subscription.php:347 -msgid "Pack Name" +#: admin/form-builder/assets/js/components/field-option-data/template.php:33 +msgid "Do not use & or other special character for option label" msgstr "" -#: admin/class-admin-subscription.php:203 -msgid "Amount" +#: admin/form-builder/assets/js/components/field-option-data/template.php:37 +#: admin/template.php:234 admin/template.php:286 +#: includes/Admin/Forms/Admin_Template.php:276 +#: includes/Admin/Forms/Admin_Template.php:337 +msgid "Value" msgstr "" -#: admin/class-admin-subscription.php:205 includes/class-privacy.php:478 -msgid "Recurring" +#: admin/form-builder/assets/js/components/field-option-data/template.php:85 +msgid "Clear Selection" msgstr "" -#: admin/class-admin-subscription.php:206 -msgid "Duration" +#: admin/form-builder/assets/js/components/field-option-pro-feature-alert/template.php:4 +msgid "Available in Pro Version" msgstr "" -#: admin/class-admin-subscription.php:225 -#: admin/class-admin-subscription.php:618 class/frontend-account.php:264 -#: class/subscription.php:938 includes/class-user-subscription.php:312 -#: templates/subscriptions/pack-details.php:24 -msgid "Free" +#: admin/form-builder/assets/js/components/field-select/template.php:7 +msgid "Select an option" msgstr "" -#: admin/class-admin-subscription.php:242 -#: admin/html/form-settings-display.php:41 admin/post-forms-list-table.php:360 -#: admin/settings-options.php:116 admin/settings-options.php:127 -#: admin/settings-options.php:223 admin/settings-options.php:234 -#: admin/template.php:63 class/asset-loader.php:50 -#: includes/fields/class-abstract-fields.php:297 -#: includes/fields/class-abstract-fields.php:390 -#: includes/fields/class-abstract-fields.php:404 -#: includes/fields/class-abstract-fields.php:468 -#: includes/fields/class-field-checkbox.php:81 -#: includes/fields/class-field-radio.php:85 includes/free/form-element.php:499 -#: wpuf.php:715 -msgid "Yes" +#: admin/form-builder/assets/js/components/field-visibility/template.php:52 +msgid "No subscription plan found." msgstr "" -#: admin/class-admin-subscription.php:244 -#: admin/html/form-settings-display.php:40 admin/post-forms-list-table.php:361 -#: admin/settings-options.php:117 admin/settings-options.php:128 -#: admin/settings-options.php:224 admin/settings-options.php:235 -#: admin/template.php:64 class/asset-loader.php:51 -#: includes/fields/class-abstract-fields.php:298 -#: includes/fields/class-abstract-fields.php:391 -#: includes/fields/class-abstract-fields.php:405 -#: includes/fields/class-abstract-fields.php:469 -#: includes/fields/class-field-checkbox.php:82 -#: includes/fields/class-field-radio.php:86 includes/free/form-element.php:500 -#: wpuf.php:716 -msgid "No" +#: admin/form-builder/assets/js/components/form-featured_image/template.php:6 +#: admin/form-builder/assets/js/components/form-image_upload/template.php:6 +#: class/render-form.php:1670 includes/Fields/Form_Field_Featured_Image.php:126 +#: includes/Fields/Form_Field_Image.php:120 +#: includes/Fields/Form_Field_Image.php:141 includes/Render_Form.php:1527 +msgid "Select Image" msgstr "" -#: admin/class-admin-subscription.php:339 admin/form.php:233 -msgid "Payment Settings" +#: admin/form-builder/assets/js/components/form-post_content/template.php:4 +#: class/render-form.php:1058 includes/Fields/Form_Field_Post_Content.php:51 +#: includes/Render_Form.php:915 +msgid "Insert Photo" msgstr "" -#: admin/class-admin-subscription.php:346 -msgid "Posting Restriction" +#: admin/form-builder/assets/js/components/form-recaptcha/template.php:10 +msgid "Invisible reCaptcha" msgstr "" -#: admin/class-admin-subscription.php:360 -msgid "Billing amount:" +#: admin/form-builder/assets/js/components/form-taxonomy/template.php:11 +msgid "— Select —" msgstr "" -#: admin/class-admin-subscription.php:361 -msgid "Billing amount each cycle:" +#: admin/form-builder/views/form-builder.php:5 +msgid "Form Editor" msgstr "" -#: admin/class-admin-subscription.php:369 -msgid "Expires In:" +#: admin/form-builder/views/form-builder.php:15 +#: admin/html/form-settings-post.php:23 templates/dashboard/posts.php:165 +msgid "Preview" msgstr "" -#: admin/class-admin-subscription.php:388 -#: admin/class-admin-subscription.php:669 -msgid "Number of featured item" +#: admin/form-builder/views/form-builder.php:18 +msgid "Save Form" msgstr "" -#: admin/class-admin-subscription.php:392 -msgid "How many items a user can set as featured, including all post types" +#: admin/form-builder/views/form-builder.php:22 +msgid "Saving Form Data" msgstr "" -#: admin/class-admin-subscription.php:396 -msgid "Remove featured item on subscription expiry" +#: admin/form-builder/views/form-builder.php:25 +#: admin/form-builder/views/form-builder.php:77 +msgid "Add Fields" msgstr "" -#: admin/class-admin-subscription.php:400 -msgid "The featured item will be removed if the subscription expires" +#: admin/form-builder/views/form-builder.php:26 +msgid "Show Form" msgstr "" -#: admin/class-admin-subscription.php:435 admin/form.php:235 -#: includes/free/form-element.php:57 -msgid "Post Expiration" +#: admin/form-builder/views/form-builder.php:47 +#. translators: %s: form id +msgid "Click to copy %s shortcode" msgstr "" -#: admin/class-admin-subscription.php:440 includes/free/form-element.php:61 -msgid "Enable Post Expiration" +#: admin/form-builder/views/form-builder.php:50 +#: includes/Admin/Forms/Admin_Form_Builder.php:307 +msgid "Click to copy shortcode" msgstr "" -#: admin/class-admin-subscription.php:452 -#: admin/class-admin-subscription.php:726 includes/free/form-element.php:67 -msgid "Post Expiration Time" +#: admin/form-builder/views/form-builder.php:83 +msgid "Field Options" msgstr "" -#: admin/class-admin-subscription.php:469 admin/html/form-settings-post.php:56 -#: admin/post-forms-list-table.php:313 -msgid "Post Status" +#: admin/html/form-settings-display.php:11 +msgid "Label Position" msgstr "" -#: admin/class-admin-subscription.php:482 includes/free/form-element.php:118 -msgid "Status of post after post expiration time is over " +#: admin/html/form-settings-display.php:16 +msgid "Above Element" msgstr "" -#: admin/class-admin-subscription.php:487 -msgid "Expiration Mail" +#: admin/html/form-settings-display.php:17 +msgid "Left of Element" msgstr "" -#: admin/class-admin-subscription.php:492 -msgid "Send Expiration Email to Post Author" +#: admin/html/form-settings-display.php:18 +msgid "Right of Element" msgstr "" -#: admin/class-admin-subscription.php:496 -msgid "Send Mail to Author After Exceeding Post Expiration Time" +#: admin/html/form-settings-display.php:19 +#: includes/Admin/Customizer_Options.php:119 +#: includes/Fields/Field_Contract.php:352 +#: includes/Fields/Form_Field_Column.php:112 +msgid "Hidden" msgstr "" -#: admin/class-admin-subscription.php:501 -msgid "Expiration Message" +#: admin/html/form-settings-display.php:29 +msgid "Where the labels of the form should display" msgstr "" -#: admin/class-admin-subscription.php:504 includes/free/form-element.php:137 -msgid "You may use: {post_author} {post_url} {blogname} {post_title} {post_status}" +#: admin/html/form-settings-display.php:35 +msgid "Use Theme CSS" msgstr "" -#: admin/class-admin-subscription.php:565 -msgid "Day(s)" +#: admin/html/form-settings-display.php:40 admin/template.php:64 +#: includes/Admin/Admin_Subscription.php:229 +#: includes/Admin/Admin_Subscription.php:705 +#: includes/Admin/Forms/Admin_Template.php:69 +#: includes/Admin/Forms/Post/Templates/List_Table_Admin_Post_Forms.php:371 +#: includes/Fields/Field_Contract.php:300 +#: includes/Fields/Field_Contract.php:393 +#: includes/Fields/Field_Contract.php:407 +#: includes/Fields/Field_Contract.php:471 +#: includes/Fields/Form_Field_Checkbox.php:84 +#: includes/Fields/Form_Field_Radio.php:88 includes/Free/Form_Element.php:504 +#: includes/Frontend.php:115 includes/functions/settings-options.php:123 +#: includes/functions/settings-options.php:135 +#: includes/functions/settings-options.php:233 +#: includes/functions/settings-options.php:244 +msgid "No" msgstr "" -#: admin/class-admin-subscription.php:566 -msgid "Week(s)" +#: admin/html/form-settings-display.php:41 admin/template.php:63 +#: includes/Admin/Admin_Subscription.php:227 +#: includes/Admin/Admin_Subscription.php:705 +#: includes/Admin/Forms/Admin_Template.php:66 +#: includes/Admin/Forms/Post/Templates/List_Table_Admin_Post_Forms.php:370 +#: includes/Fields/Field_Contract.php:299 +#: includes/Fields/Field_Contract.php:392 +#: includes/Fields/Field_Contract.php:406 +#: includes/Fields/Field_Contract.php:470 +#: includes/Fields/Form_Field_Checkbox.php:83 +#: includes/Fields/Form_Field_Radio.php:87 includes/Free/Form_Element.php:503 +#: includes/Frontend.php:114 includes/functions/settings-options.php:122 +#: includes/functions/settings-options.php:134 +#: includes/functions/settings-options.php:232 +#: includes/functions/settings-options.php:243 +msgid "Yes" msgstr "" -#: admin/class-admin-subscription.php:567 -msgid "Month(s)" +#: admin/html/form-settings-display.php:51 +msgid "Selecting \"Yes\" will use your theme's style for form fields." msgstr "" -#: admin/class-admin-subscription.php:568 -msgid "Year(s)" +#: admin/html/form-settings-display.php:58 +msgid "Form Style" msgstr "" -#: admin/class-admin-subscription.php:610 -msgid "WPUF Subscription Information" +#: admin/html/form-settings-payment.php:21 +msgid "Payment Options" msgstr "" -#: admin/class-admin-subscription.php:622 -msgid "For each %1$s %2$s" +#: admin/html/form-settings-payment.php:26 includes/Setup_Wizard.php:317 +#: includes/functions/settings-options.php:431 +msgid "Enable Payments" msgstr "" -#: admin/class-admin-subscription.php:623 class/frontend-account.php:270 -#. translators: %s: number of installments -msgid ", for %s installments" +#: admin/html/form-settings-payment.php:28 +msgid "Check to enable Payments for this form." msgstr "" -#: admin/class-admin-subscription.php:634 -msgid "Subcription Name" +#: admin/html/form-settings-payment.php:33 +msgid "Force Pack" msgstr "" -#: admin/class-admin-subscription.php:644 -msgid "Billing Info" +#: admin/html/form-settings-payment.php:38 +msgid "Force subscription pack" msgstr "" -#: admin/class-admin-subscription.php:658 -msgid "This user is using recurring subscription pack" +#: admin/html/form-settings-payment.php:40 +msgid "Force users to purchase and use subscription pack." msgstr "" -#: admin/class-admin-subscription.php:664 -msgid "Remaining Posting Count" +#: admin/html/form-settings-payment.php:45 +msgid "Fallback to pay per post" msgstr "" -#: admin/class-admin-subscription.php:693 -msgid "Subscription Expiration Info" +#: admin/html/form-settings-payment.php:50 +msgid "Fallback pay per post charging" msgstr "" -#: admin/class-admin-subscription.php:702 -#: includes/class-user-subscription.php:364 -#: templates/dashboard/subscription.php:50 -msgid "Expire date:" +#: admin/html/form-settings-payment.php:52 +msgid "Fallback to pay per post charging if pack limit exceeds" msgstr "" -#: admin/class-admin-subscription.php:715 -msgid "Post Expiration Enabled" +#: admin/html/form-settings-payment.php:57 +msgid "Fallback cost" msgstr "" -#: admin/class-admin-subscription.php:752 -msgid "Allowed Taxonomy Terms" +#: admin/html/form-settings-payment.php:62 +msgid "Cost of pay per post after a subscription pack limit is reached." msgstr "" -#: admin/class-admin-subscription.php:822 -msgid "Assign Package" +#: admin/html/form-settings-payment.php:67 +msgid "Pay Per Post" msgstr "" -#: admin/class-admin-subscription.php:823 -#: admin/form-builder/class-wpuf-admin-form-builder.php:286 -#: class/payment.php:225 class/subscription.php:836 -#: includes/class-list-table-subscribers.php:138 lib/appsero/Insights.php:764 -#: templates/dashboard/subscription.php:68 -msgid "Cancel" +#: admin/html/form-settings-payment.php:72 +msgid "Enable Pay Per Post" msgstr "" -#: admin/class-admin-subscription.php:829 -msgid "Select Package:" +#: admin/html/form-settings-payment.php:74 +msgid "Charge users for posting," msgstr "" -#: admin/class-admin-subscription.php:832 admin/settings-options.php:594 -#: wpuf-functions.php:210 wpuf-functions.php:1810 wpuf-functions.php:2078 -msgid "— Select —" +#: admin/html/form-settings-payment.php:74 +msgid " Learn More about Pay Per Post." msgstr "" -#: admin/class-admin-subscription.php:836 -msgid "Only non-recurring pack can be assigned" +#: admin/html/form-settings-payment.php:79 +msgid "Cost Settings" msgstr "" -#: admin/class-admin-subscription.php:847 -msgid "Delete Package" +#: admin/html/form-settings-payment.php:84 +msgid "Amount to be charged per post" msgstr "" -#: admin/class-admin-subscription.php:901 -msgid "Learn more about Subscription" +#: admin/html/form-settings-payment.php:88 +#: includes/functions/settings-options.php:517 +msgid "Payment Success Page" msgstr "" -#: admin/class-admin-welcome.php:22 -msgid "Welcome to WP User Frontend" +#: admin/html/form-settings-payment.php:101 +msgid "Page will show after successful payment" msgstr "" -#: admin/class-tools.php:37 -msgid "Form Export" +#: admin/html/form-settings-post-edit.php:4 +#: admin/html/form-settings-post.php:16 +msgid "Post updated successfully" msgstr "" -#: admin/class-tools.php:43 admin/class-tools.php:106 -#: admin/post-forms-list-table.php:43 class/transactions-list-table.php:95 -#: includes/class-list-table-subscribers.php:136 wpuf-functions.php:3492 -msgid "All" +#: admin/html/form-settings-post-edit.php:7 +msgid "Update" msgstr "" -#: admin/class-tools.php:48 admin/class-tools.php:111 -msgid "Select individual" +#: admin/html/form-settings-post-edit.php:14 +msgid "Set Post Status to" msgstr "" -#: admin/class-tools.php:58 admin/class-tools.php:124 admin/tools.php:17 -msgid "Export" +#: admin/html/form-settings-post-edit.php:24 +msgid "No Change" msgstr "" -#: admin/class-tools.php:66 admin/class-tools.php:131 -msgid "Sorry you have no form to export" +#: admin/html/form-settings-post-edit.php:31 +#: admin/html/form-settings-post.php:130 includes/Free/Form_Element.php:395 +msgid "Redirect To" msgstr "" -#: admin/class-tools.php:98 -msgid "Registration Form Export" +#: admin/html/form-settings-post-edit.php:36 +#: admin/html/form-settings-post.php:135 +msgid "Newly created post" msgstr "" -#: admin/class-tools.php:140 -msgid "Import forms" +#: admin/html/form-settings-post-edit.php:37 +#: admin/html/form-settings-post.php:136 includes/Free/Form_Element.php:400 +msgid "Same Page" msgstr "" -#: admin/class-tools.php:143 -msgid "Upload your JSON file and start imporing WPUF forms here" +#: admin/html/form-settings-post-edit.php:38 +#: admin/html/form-settings-post.php:137 includes/Free/Form_Element.php:401 +msgid "To a page" msgstr "" -#: admin/class-tools.php:152 -msgid "Upload JSON File" +#: admin/html/form-settings-post-edit.php:39 +#: admin/html/form-settings-post.php:138 includes/Free/Form_Element.php:402 +msgid "To a custom URL" msgstr "" -#: admin/class-tools.php:155 -msgid "Importing JSON File" +#: admin/html/form-settings-post-edit.php:48 +#: admin/html/form-settings-post.php:147 includes/Free/Form_Element.php:411 +msgid "After successfull submit, where the page will redirect to" msgstr "" -#: admin/class-tools.php:217 -msgid "Please select some form for exporting" +#: admin/html/form-settings-post-edit.php:54 +msgid "Post Update Message" msgstr "" -#: admin/class-tools.php:300 -msgid "Are you Sure?" +#: admin/html/form-settings-post-edit.php:61 +#: admin/html/form-settings-post.php:160 includes/Free/Form_Element.php:431 +msgid "Page" msgstr "" -#: admin/class-tools.php:303 -msgid "All forms has been deleted" +#: admin/html/form-settings-post-edit.php:76 +#: admin/html/form-settings-post.php:175 includes/Free/Form_Element.php:454 +msgid "Custom URL" msgstr "" -#: admin/class-tools.php:307 -msgid "Settings has been cleared!" +#: admin/html/form-settings-post-edit.php:83 +msgid "Subscription Title" msgstr "" -#: admin/class-tools.php:311 -msgid "All transactions has been deleted!" +#: admin/html/form-settings-post-edit.php:92 +msgid "Update Post Button text" msgstr "" -#: admin/class-tools.php:327 -msgid "Page Installation" +#: admin/html/form-settings-post-edit.php:99 +msgid "Lock User From Editing After" +msgstr "" + +#: admin/html/form-settings-post-edit.php:102 +msgid "hours" +msgstr "" + +#: admin/html/form-settings-post-edit.php:104 +msgid "After how many hours user will be locked from editing the submitted post." +msgstr "" + +#: admin/html/form-settings-post.php:7 +#: includes/Admin/Forms/Post/Templates/Post_Form_Template_Post.php:134 +msgid "This page is restricted. Please %login% / %register% to view this page." +msgstr "" + +#: admin/html/form-settings-post.php:15 +msgid "Post saved" +msgstr "" + +#: admin/html/form-settings-post.php:21 +msgid "Submit" +msgstr "" + +#: admin/html/form-settings-post.php:22 class/render-form.php:761 +#: includes/Admin/Forms/Admin_Form_Builder.php:74 +#: includes/Frontend_Render_Form.php:79 includes/Render_Form.php:618 +#: includes/class-frontend-render-form.php:183 +msgid "Save Draft" +msgstr "" + +#: admin/html/form-settings-post.php:29 +#: includes/Admin/Forms/Post/Templates/List_Table_Admin_Post_Forms.php:322 +msgid "Post Type" +msgstr "" + +#: admin/html/form-settings-post.php:51 +msgid "Custom Post Type will appear here. " +msgstr "" + +#: admin/html/form-settings-post.php:51 +msgid "Learn More " +msgstr "" + +#: admin/html/form-settings-post.php:56 +#: includes/Admin/Admin_Subscription.php:455 +#: includes/Admin/Forms/Post/Templates/List_Table_Admin_Post_Forms.php:323 +msgid "Post Status" msgstr "" -#: admin/class-tools.php:330 +#: admin/html/form-settings-post.php:71 +msgid "Post Format" +msgstr "" + +#: admin/html/form-settings-post.php:74 +msgid "- None -" +msgstr "" + +#: admin/html/form-settings-post.php:120 msgid "" -"Clicking this button will create required pages for the plugin. Note: It'll " -"not delete/replace existing pages." +"If users are not allowed to choose any category, this category will be used " +"instead (if post type supports)" msgstr "" -#: admin/class-tools.php:331 admin/installer.php:30 -#: includes/setup-wizard.php:308 -msgid "Install WPUF Pages" +#: admin/html/form-settings-post.php:153 +msgid "Message to show" msgstr "" -#: admin/class-tools.php:336 admin/class-tools.php:340 -msgid "Reset Settings" +#: admin/html/form-settings-post.php:182 +msgid "Comment Status" msgstr "" -#: admin/class-tools.php:339 +#: admin/html/form-settings-post.php:185 +msgid "Open" +msgstr "" + +#: admin/html/form-settings-post.php:186 +msgid "Closed" +msgstr "" + +#: admin/html/form-settings-post.php:192 +msgid "Submit Post Button text" +msgstr "" + +#: admin/html/form-settings-post.php:199 +msgid "Post Draft" +msgstr "" + +#: admin/html/form-settings-post.php:204 +msgid "Enable Saving as draft" +msgstr "" + +#: admin/html/form-settings-post.php:206 +msgid "It will show a button to save as draft" +msgstr "" + +#: admin/html/form-submission-restriction.php:11 admin/template-post.php:160 +#: includes/Admin/Forms/Template_Post.php:174 +#: includes/Fields/Field_Contract.php:485 includes/Free/Edit_Profile.php:100 +#: templates/registration-form.php:31 +msgid "Name" +msgstr "" + +#: admin/html/form-submission-restriction.php:12 +#: includes/Admin/List_Table_Transactions.php:56 +#: includes/Admin/views/support.php:223 includes/WPUF_Privacy.php:363 +#: includes/functions/user/edit-user.php:166 templates/registration-form.php:48 +msgid "Email" +msgstr "" + +#: admin/html/form-submission-restriction.php:29 +#: includes/Admin/Forms/Post/Templates/List_Table_Admin_Post_Forms.php:324 +msgid "Guest Post" +msgstr "" + +#: admin/html/form-submission-restriction.php:34 +msgid "Enable Guest Post" +msgstr "" + +#: admin/html/form-submission-restriction.php:36 +msgid "Unregistered users will be able to submit posts" +msgstr "" + +#: admin/html/form-submission-restriction.php:36 +msgid "Learn more about guest posting." +msgstr "" + +#: admin/html/form-submission-restriction.php:41 +msgid "User Details" +msgstr "" + +#: admin/html/form-submission-restriction.php:46 +msgid "Require Name and Email address" +msgstr "" + +#: admin/html/form-submission-restriction.php:48 msgid "" -"Caution: This tool will delete all the plugin settings of WP User Frontend " -"Pro" +"If requires, users will be automatically registered to the site using the " +"name and email address" msgstr "" -#: admin/class-tools.php:345 -msgid "Delete Forms" +#: admin/html/form-submission-restriction.php:53 +msgid "Name Label" msgstr "" -#: admin/class-tools.php:348 -msgid "Caution: This tool will delete all the post and registration/profile forms." +#: admin/html/form-submission-restriction.php:58 +msgid "Label text for name field" msgstr "" -#: admin/class-tools.php:350 -msgid "Delete Post Forms" +#: admin/html/form-submission-restriction.php:63 +msgid "E-Mail Label" msgstr "" -#: admin/class-tools.php:351 -msgid "Delete Registration Forms" +#: admin/html/form-submission-restriction.php:68 +msgid "Label text for email field" msgstr "" -#: admin/class-tools.php:352 -msgid "Delete Subscriptions" +#: admin/html/form-submission-restriction.php:73 +msgid "Email Verification" msgstr "" -#: admin/class-tools.php:353 -msgid "Delete Coupons" +#: admin/html/form-submission-restriction.php:77 +msgid "Require Email Verification for Guests" msgstr "" -#: admin/class-tools.php:361 -msgid "This tool will delete all the transactions from the transaction table." +#: admin/html/form-submission-restriction.php:79 +msgid "If requires, users will be required to verify their email adress." msgstr "" -#: admin/class-tools.php:363 -msgid "Delete Transactions" +#: admin/html/form-submission-restriction.php:84 +msgid "Role Base" msgstr "" -#: admin/dashboard-metabox.php:14 -msgid "WP User Frontend News & Updates" +#: admin/html/form-submission-restriction.php:89 +msgid "Enable role base post" msgstr "" -#: admin/form-builder/assets/js/components/builder-stage/template.php:3 -msgid "Add fields by dragging the fields from the right sidebar to this area." +#: admin/html/form-submission-restriction.php:91 +msgid "You can choose which role can submit posts by this form." msgstr "" -#: admin/form-builder/assets/js/components/builder-stage/template.php:29 -#: admin/form-builder/assets/js/components/form-column_field/template.php:29 -msgid "is available in Pro Version" +#: admin/html/form-submission-restriction.php:96 +msgid "Roles" msgstr "" -#: admin/form-builder/assets/js/components/builder-stage/template.php:60 -msgid "Hidden Fields" +#: admin/html/form-submission-restriction.php:112 +msgid "Choose which roles can submit posts." msgstr "" -#: admin/form-builder/assets/js/components/builder-stage/template.php:67 -msgid "key" +#: admin/html/form-submission-restriction.php:117 +#: includes/functions/settings-options.php:303 +msgid "Unauthorized Message" msgstr "" -#: admin/form-builder/assets/js/components/builder-stage/template.php:67 -msgid "value" +#: admin/html/form-submission-restriction.php:120 +msgid "" +"Not logged in users will see this message. You may use %login%, %register% " +"for link" msgstr "" -#: admin/form-builder/assets/js/components/field-option-data/template.php:10 -#: admin/template.php:231 -msgid "Show values" +#: admin/html/form-submission-restriction.php:125 +msgid "Schedule form" msgstr "" -#: admin/form-builder/assets/js/components/field-option-data/template.php:18 -msgid "Sync values" +#: admin/html/form-submission-restriction.php:130 +msgid "Schedule form for a period" msgstr "" -#: admin/form-builder/assets/js/components/field-option-data/template.php:20 -msgid "When enabled, option values will update according to their labels." +#: admin/html/form-submission-restriction.php:132 +msgid "Schedule for a time period the form is active." msgstr "" -#: admin/form-builder/assets/js/components/field-option-data/template.php:32 -#: admin/template.php:234 admin/template.php:286 -msgid "Label" +#: admin/html/form-submission-restriction.php:137 +msgid "Schedule Period" msgstr "" -#: admin/form-builder/assets/js/components/field-option-data/template.php:33 -msgid "Do not use & or other special character for option label" +#: admin/html/form-submission-restriction.php:140 +msgid "From" msgstr "" -#: admin/form-builder/assets/js/components/field-option-data/template.php:37 -#: admin/template.php:234 admin/template.php:286 -msgid "Value" +#: admin/html/form-submission-restriction.php:144 +#: includes/Free/Form_Element.php:234 includes/Free/Form_Element.php:271 +msgid "To" msgstr "" -#: admin/form-builder/assets/js/components/field-option-data/template.php:85 -msgid "Clear Selection" +#: admin/html/form-submission-restriction.php:151 +msgid "Form Pending Message" msgstr "" -#: admin/form-builder/assets/js/components/field-option-pro-feature-alert/template.php:4 -msgid "Available in Pro Version" +#: admin/html/form-submission-restriction.php:158 +msgid "Form Expired Message" msgstr "" -#: admin/form-builder/assets/js/components/field-select/template.php:7 -msgid "Select an option" +#: admin/html/form-submission-restriction.php:165 +msgid "Limit Entries" msgstr "" -#: admin/form-builder/assets/js/components/field-visibility/template.php:50 -msgid "No subscription plan found." +#: admin/html/form-submission-restriction.php:170 +msgid "Enable form entry limit" msgstr "" -#: admin/form-builder/assets/js/components/form-featured_image/template.php:6 -#: admin/form-builder/assets/js/components/form-image_upload/template.php:6 -#: class/render-form.php:1664 -#: includes/fields/class-field-featured-image.php:122 -#: includes/fields/class-field-image.php:116 -#: includes/fields/class-field-image.php:137 -msgid "Select Image" +#: admin/html/form-submission-restriction.php:174 +msgid "Limit the number of entries allowed for this form" msgstr "" -#: admin/form-builder/assets/js/components/form-post_content/template.php:4 -#: class/render-form.php:1055 includes/fields/class-field-post-content.php:49 -msgid "Insert Photo" +#: admin/html/form-submission-restriction.php:180 +msgid "Number of Entries" msgstr "" -#: admin/form-builder/assets/js/components/form-recaptcha/template.php:10 -msgid "Invisible reCaptcha" +#: admin/html/form-submission-restriction.php:187 +msgid "Limit Reached Message" msgstr "" -#: admin/form-builder/assets/js/components/form-taxonomy/template.php:11 -msgid "— Select —" +#: admin/html/whats-new.php:8 +msgid "Update deprecated uses for PHP versions and latest WordPress" msgstr "" -#: admin/form-builder/class-wpuf-admin-form-builder-ajax.php:31 -msgid "form data is missing" +#: admin/html/whats-new.php:12 +msgid "Eye icon inside password field" msgstr "" -#: admin/form-builder/class-wpuf-admin-form-builder-ajax.php:35 -#: admin/form-builder/class-wpuf-admin-form-builder-ajax.php:82 -#: admin/promotion.php:214 admin/promotion.php:218 admin/promotion.php:280 -#: admin/promotion.php:284 -msgid "Unauthorized operation" +#: admin/html/whats-new.php:16 +msgid "Error after PayPal payment" msgstr "" -#: admin/form-builder/class-wpuf-admin-form-builder-ajax.php:39 -msgid "Invalid form id" +#: admin/html/whats-new.php:20 +msgid "Reset password not working" msgstr "" -#: admin/form-builder/class-wpuf-admin-form-builder-ajax.php:86 -msgid "Invalid post type" +#: admin/html/whats-new.php:24 +msgid "Subscription posting restriction not working" msgstr "" -#: admin/form-builder/class-wpuf-admin-form-builder.php:281 -msgid "Advanced Options" +#: admin/html/whats-new.php:34 +msgid "Integrate headway and canny" msgstr "" -#: admin/form-builder/class-wpuf-admin-form-builder.php:282 -msgid "Are you sure you want to delete this field?" +#: admin/html/whats-new.php:44 +msgid "Add visibility to the Columns field" msgstr "" -#: admin/form-builder/class-wpuf-admin-form-builder.php:283 -#: admin/posting.php:73 class/asset-loader.php:56 wpuf.php:736 -msgid "Yes, delete it" +#: admin/html/whats-new.php:48 +msgid "Login with reCAPTCHA gives error" msgstr "" -#: admin/form-builder/class-wpuf-admin-form-builder.php:284 -#: admin/posting.php:74 class/asset-loader.php:57 wpuf.php:737 -msgid "No, cancel it" +#: admin/html/whats-new.php:52 +msgid "AJAX image upload" msgstr "" -#: admin/form-builder/class-wpuf-admin-form-builder.php:285 -msgid "OK" +#: admin/html/whats-new.php:56 +msgid "Error on multi select form custom taxonomy" msgstr "" -#: admin/form-builder/class-wpuf-admin-form-builder.php:287 -#: includes/free/admin/shortcode-builder.php:70 -msgid "Close" +#: admin/html/whats-new.php:60 +msgid "Frontend registration form is not showing" msgstr "" -#: admin/form-builder/class-wpuf-admin-form-builder.php:288 -msgid "This field must contain at least one choice" +#: admin/html/whats-new.php:64 +msgid "Handle email for guest post" msgstr "" -#: admin/form-builder/class-wpuf-admin-form-builder.php:289 -#: includes/fields/class-field-checkbox.php:108 -#: includes/fields/class-field-dropdown.php:105 -#: includes/fields/class-field-multidropdown.php:82 -#: includes/fields/class-field-radio.php:111 -msgid "Option" +#: admin/html/whats-new.php:68 +msgid "Default form template not selecting" msgstr "" -#: admin/form-builder/class-wpuf-admin-form-builder.php:290 -msgid "Column" +#: admin/html/whats-new.php:72 +msgid "Error in setup wizard" msgstr "" -#: admin/form-builder/class-wpuf-admin-form-builder.php:291 -msgid "This field must contain at least one column" +#: admin/html/whats-new.php:82 admin/html/whats-new.php:104 +#: admin/html/whats-new.php:126 admin/html/whats-new.php:148 +msgid "Restructure plugin codes" msgstr "" -#: admin/form-builder/class-wpuf-admin-form-builder.php:292 -msgid "is available in Pro version" +#: admin/html/whats-new.php:86 admin/html/whats-new.php:108 +#: admin/html/whats-new.php:130 admin/html/whats-new.php:152 +msgid "Error when editing the featured post" msgstr "" -#: admin/form-builder/class-wpuf-admin-form-builder.php:293 -msgid "Please upgrade to the Pro version to unlock all these awesome features" +#: admin/html/whats-new.php:90 admin/html/whats-new.php:112 +#: admin/html/whats-new.php:134 admin/html/whats-new.php:156 +msgid "add/edit post forms if the site language is set to Simplified Chinese" msgstr "" -#: admin/form-builder/class-wpuf-admin-form-builder.php:294 -msgid "Get the Pro version" +#: admin/html/whats-new.php:94 admin/html/whats-new.php:116 +#: admin/html/whats-new.php:138 admin/html/whats-new.php:160 +msgid "Errors with Post Form Conditional Logic" msgstr "" -#: admin/form-builder/class-wpuf-admin-form-builder.php:295 -#: includes/fields/class-abstract-fields.php:443 -msgid "Select" +#: admin/html/whats-new.php:170 +msgid "Add capabilities check on AJAX actions" msgstr "" -#: admin/form-builder/class-wpuf-admin-form-builder.php:296 -msgid "Saved form data" +#: admin/html/whats-new.php:180 +msgid "Delete upload file even after clicking cancel button" msgstr "" -#: admin/form-builder/class-wpuf-admin-form-builder.php:297 -msgid "You have unsaved changes." +#: admin/html/whats-new.php:184 +msgid "Taxonomy data not showing for checkbox" msgstr "" -#: admin/form-builder/class-wpuf-admin-form-builder.php:298 -#: admin/form-builder/views/form-builder.php:50 -msgid "Click to copy shortcode" +#: admin/html/whats-new.php:188 +msgid "Some validation for AJAX actions" msgstr "" -#: admin/form-builder/views/form-builder.php:5 -msgid "Form Editor" +#: admin/html/whats-new.php:198 +msgid "conflicts with Advanced Custom Fields Pro Plugin" msgstr "" -#: admin/form-builder/views/form-builder.php:15 -#: admin/html/form-settings-post.php:23 templates/dashboard/posts.php:165 -msgid "Preview" +#: admin/html/whats-new.php:202 +msgid "conflicts with the Classic Editor Plugin" msgstr "" -#: admin/form-builder/views/form-builder.php:18 -msgid "Save Form" +#: admin/html/whats-new.php:206 +msgid "multiple HTML field inside column field" +msgstr "" + +#: admin/html/whats-new.php:216 +msgid "Restrict shortcode in post form" +msgstr "" + +#: admin/html/whats-new.php:220 +msgid "Add custom note on plugin update page" +msgstr "" + +#: admin/html/whats-new.php:230 +msgid "Revamp registration page design" +msgstr "" + +#: admin/html/whats-new.php:234 +msgid "Expiration time not showing for admin" +msgstr "" + +#: admin/html/whats-new.php:238 +msgid "Error when editing user profile" +msgstr "" + +#: admin/html/whats-new.php:248 +msgid "Post submission for dokan vendors" +msgstr "" + +#: admin/html/whats-new.php:252 +msgid "Paypal transaction not showing" +msgstr "" + +#: admin/html/whats-new.php:256 +msgid "Predefined category field not working" +msgstr "" + +#: admin/html/whats-new.php:260 +msgid "Field visibility not working" +msgstr "" + +#: admin/html/whats-new.php:270 +msgid "Error if Dokan not installed" +msgstr "" + +#: admin/html/whats-new.php:274 +msgid "Style conflict with LearnPress" +msgstr "" + +#: admin/html/whats-new.php:284 +msgid "Post submission for the Dokan Vendors" +msgstr "" + +#: admin/html/whats-new.php:294 +msgid "Add responsiveness to the upgrade-to-pro popup widget" +msgstr "" + +#: admin/html/whats-new.php:298 +msgid "Update Appsero SDK to the latest version" +msgstr "" + +#: admin/html/whats-new.php:302 +msgid "warning before updating a subscription package" +msgstr "" + +#: admin/html/whats-new.php:306 +msgid "Subscription shouldn't be editable from user's profile" +msgstr "" + +#: admin/html/whats-new.php:310 +msgid "Text field append '0' when character exceeds content restriction limit" +msgstr "" + +#: admin/html/whats-new.php:314 +msgid "Fields within column doesn't behave as expected in forms" +msgstr "" + +#: admin/html/whats-new.php:318 +msgid "Change sweetalert2 to v11.4.19 to remove anti-war message" +msgstr "" + +#: admin/html/whats-new.php:328 +msgid "Admin dashboard news and update meta-box added" +msgstr "" + +#: admin/html/whats-new.php:332 +msgid "Upgrade prompts design" +msgstr "" + +#: admin/html/whats-new.php:336 +msgid "Email style handled" +msgstr "" + +#: admin/html/whats-new.php:340 +msgid "" +"text-area type selection(Normal, Rich text-area, Teeny Rich text-area) bug " +"in field options" +msgstr "" + +#: admin/html/whats-new.php:344 +msgid "Frontend form validation" +msgstr "" + +#: admin/html/whats-new.php:348 +msgid "Default value not saving for radio, dropdown, checkbox" msgstr "" -#: admin/form-builder/views/form-builder.php:22 -msgid "Saving Form Data" +#: admin/html/whats-new.php:352 +msgid "sweetalert2 version" msgstr "" -#: admin/form-builder/views/form-builder.php:25 -#: admin/form-builder/views/form-builder.php:77 -msgid "Add Fields" +#: admin/html/whats-new.php:362 +msgid "Short-code encryption updated for registration page" msgstr "" -#: admin/form-builder/views/form-builder.php:26 -msgid "Show Form" +#: admin/html/whats-new.php:372 +msgid "Updated compatibility with the latest version of WordPress 6.0" msgstr "" -#: admin/form-builder/views/form-builder.php:47 -#. translators: %s: form id -msgid "Click to copy %s shortcode" +#: admin/html/whats-new.php:376 +msgid "Improved some backend implementations" msgstr "" -#: admin/form-builder/views/form-builder.php:83 -msgid "Field Options" +#: admin/html/whats-new.php:386 +msgid "Email template enhanced for after activation" msgstr "" -#: admin/form-handler.php:56 admin/form-handler.php:189 -msgid "You do not have sufficient permissions to do this action" +#: admin/html/whats-new.php:390 +msgid "Read only option for custom field" msgstr "" -#: admin/form-handler.php:335 admin/form-handler.php:360 -msgid "%d form moved to the trash." -msgid_plural "%d forms moved to the trash." -msgstr[0] "" -msgstr[1] "" - -#: admin/form-handler.php:340 admin/form-handler.php:365 -msgid "%d form restored from the trash." -msgid_plural "%d forms restored from the trash." -msgstr[0] "" -msgstr[1] "" +#: admin/html/whats-new.php:394 +msgid "Editor toolbar exclude option enhanced" +msgstr "" -#: admin/form-handler.php:345 admin/form-handler.php:370 -msgid "%d form permanently deleted." -msgid_plural "%d forms permanently deleted." -msgstr[0] "" -msgstr[1] "" +#: admin/html/whats-new.php:398 +msgid "Preview option enhanced for user profile" +msgstr "" -#: admin/form-handler.php:351 admin/form-handler.php:376 -msgid "Form duplicated successfully. View form." +#: admin/html/whats-new.php:402 +msgid "Meta key enhanced for user email notification" msgstr "" -#: admin/form-template.php:64 -msgid "Want a new integration? Let us know." +#: admin/html/whats-new.php:406 +msgid "Global option for disable post edit on account" msgstr "" -#: admin/form-template.php:169 -msgid "Form Template" +#: admin/html/whats-new.php:410 +msgid "Filter for conditional logic for fields added" msgstr "" -#: admin/form-template.php:172 -msgid "— No Template —" +#: admin/html/whats-new.php:414 +msgid "PHP 8 compatibility handled" msgstr "" -#: admin/form-template.php:180 -msgid "" -"If selected a form template, it will try to execute that integration " -"options when new post created and updated." +#: admin/html/whats-new.php:418 +msgid "Address / Billing address inconsistency handled" msgstr "" -#: admin/form.php:49 admin/form.php:69 admin/form.php:71 admin/form.php:109 -msgid "Forms" +#: admin/html/whats-new.php:422 +msgid "Content restriction several issue fixed" msgstr "" -#: admin/form.php:70 admin/form.php:110 -msgid "Form" +#: admin/html/whats-new.php:426 +msgid "Tax calculation properly handled for all areas" msgstr "" -#: admin/form.php:72 admin/form.php:112 admin/post-forms-list-table-view.php:8 -msgid "Add Form" +#: admin/html/whats-new.php:430 +msgid "Validation added for invalid email and URL formats" msgstr "" -#: admin/form.php:73 admin/form.php:113 -msgid "Add New Form" +#: admin/html/whats-new.php:434 +msgid "Special character password handled for login" msgstr "" -#: admin/form.php:74 admin/form.php:114 admin/installer.php:86 -#: admin/post-forms-list-table.php:406 class/subscription.php:435 -#: includes/free/admin/shortcode-button.php:87 includes/free/edit-user.php:104 -msgid "Edit" +#: admin/html/whats-new.php:438 +msgid "Reset password handled for sidebar widget" msgstr "" -#: admin/form.php:75 admin/form.php:115 -msgid "Edit Form" +#: admin/html/whats-new.php:442 +msgid "Required google map issues handled" msgstr "" -#: admin/form.php:76 admin/form.php:116 -msgid "New Form" +#: admin/html/whats-new.php:446 +msgid "Translation related issue handled for admin menu" msgstr "" -#: admin/form.php:77 admin/form.php:78 admin/form.php:117 admin/form.php:118 -msgid "View Form" +#: admin/html/whats-new.php:450 +msgid "Label & query enhanced for transaction table" msgstr "" -#: admin/form.php:79 admin/form.php:119 -msgid "Search Form" +#: admin/html/whats-new.php:454 +msgid "Template override for child theme fixed" msgstr "" -#: admin/form.php:80 admin/form.php:120 -msgid "No Form Found" +#: admin/html/whats-new.php:458 +msgid "Custom field modal handled for registration form" msgstr "" -#: admin/form.php:81 admin/form.php:121 -msgid "No Form Found in Trash" +#: admin/html/whats-new.php:462 +msgid "Redundant CSS issues handled" msgstr "" -#: admin/form.php:82 admin/form.php:122 -msgid "Parent Form" +#: admin/html/whats-new.php:466 +msgid "Address field inconsistency fixed" msgstr "" -#: admin/form.php:89 -msgid "Registraton Forms" +#: admin/html/whats-new.php:470 +msgid "Plugin page spin loading issue handled" msgstr "" -#: admin/form.php:111 includes/free/loader.php:87 -msgid "Registration Forms" +#: admin/html/whats-new.php:474 +msgid "Warning on exit for draft post fixed" msgstr "" -#: admin/form.php:197 includes/free/form-element.php:218 -#: includes/free/form-element.php:256 -msgid "Notification" +#: admin/html/whats-new.php:478 +msgid "Unlimited expire on admin user profile handled" msgstr "" -#: admin/form.php:230 -msgid "Post Settings" +#: admin/html/whats-new.php:482 +msgid "No value checkbox issue handled" msgstr "" -#: admin/form.php:231 -msgid "Edit Settings" +#: admin/html/whats-new.php:486 +msgid "Tag search security Vulnerability handled" msgstr "" -#: admin/form.php:232 -msgid "Submission Restriction" +#: admin/html/whats-new.php:490 +msgid "Multi dropdown field error handled" msgstr "" -#: admin/form.php:234 -msgid "Display Settings" +#: admin/html/whats-new.php:501 +msgid "Promotion notice enhanced through api" msgstr "" -#: admin/form.php:297 admin/form.php:302 -msgid "- Select -" +#: admin/html/whats-new.php:512 +msgid "Security Vulnerability fixed" msgstr "" -#: admin/form.php:341 -msgid "Post Fields" +#: admin/html/whats-new.php:523 +msgid "Featured item for subscriber" msgstr "" -#: admin/form.php:347 -msgid "Taxonomies" +#: admin/html/whats-new.php:527 +msgid "Warning added for unsaved form data on frontend" msgstr "" -#: admin/form.php:449 admin/html/form-settings-post.php:22 -#: class/render-form.php:761 includes/class-frontend-render-form.php:183 -msgid "Save Draft" +#: admin/html/whats-new.php:531 +msgid "Settings page search implemented" msgstr "" -#: admin/form.php:568 -msgid "Post Forms must have either Post Title, Post Body or Excerpt field" +#: admin/html/whats-new.php:535 +msgid "Editor added for registration form email template" msgstr "" -#: admin/html/form-settings-display.php:11 -msgid "Label Position" +#: admin/html/whats-new.php:539 +msgid "Fallback pay per post not working with when draft enabled" msgstr "" -#: admin/html/form-settings-display.php:16 -msgid "Above Element" +#: admin/html/whats-new.php:543 +msgid "User Dashboard responsive issues fixed" msgstr "" -#: admin/html/form-settings-display.php:17 -msgid "Left of Element" +#: admin/html/whats-new.php:547 +msgid "Showing wrong license expire message handled" msgstr "" -#: admin/html/form-settings-display.php:18 -msgid "Right of Element" +#: admin/html/whats-new.php:551 +msgid "Remove expire cron handled for once daily" msgstr "" -#: admin/html/form-settings-display.php:19 includes/class-customizer.php:104 -#: includes/fields/class-abstract-fields.php:350 -msgid "Hidden" +#: admin/html/whats-new.php:555 +msgid "Billing address validation handled" msgstr "" -#: admin/html/form-settings-display.php:29 -msgid "Where the labels of the form should display" +#: admin/html/whats-new.php:559 +msgid "Promotion notice restricted for WPUF menu" msgstr "" -#: admin/html/form-settings-display.php:35 -msgid "Use Theme CSS" +#: admin/html/whats-new.php:570 +msgid "reCaptcha issue with other plugin handled" msgstr "" -#: admin/html/form-settings-display.php:51 -msgid "Selecting \"Yes\" will use your theme's style for form fields." +#: admin/html/whats-new.php:574 +msgid "Multiple post type for wpuf dashboard not working fixed" msgstr "" -#: admin/html/form-settings-display.php:58 -msgid "Form Style" +#: admin/html/whats-new.php:578 +msgid "Billing address ajax request issue handled" msgstr "" -#: admin/html/form-settings-payment.php:21 -msgid "Payment Options" +#: admin/html/whats-new.php:582 +msgid "Halloween promotion notice added" msgstr "" -#: admin/html/form-settings-payment.php:26 admin/settings-options.php:396 -#: includes/setup-wizard.php:301 -msgid "Enable Payments" +#: admin/html/whats-new.php:593 +msgid "Content restriction for minimum, maximum value enhanced" msgstr "" -#: admin/html/form-settings-payment.php:28 -msgid "Check to enable Payments for this form." +#: admin/html/whats-new.php:597 +msgid "New option for redirection after pay per post payment in form setting" msgstr "" -#: admin/html/form-settings-payment.php:33 -msgid "Force Pack" +#: admin/html/whats-new.php:601 +msgid "Controller added for various email notification" msgstr "" -#: admin/html/form-settings-payment.php:38 -msgid "Force subscription pack" +#: admin/html/whats-new.php:605 +msgid "Placeholder added for unauth message option" msgstr "" -#: admin/html/form-settings-payment.php:40 -msgid "Force users to purchase and use subscription pack." +#: admin/html/whats-new.php:609 +msgid "Subscription Post expiration option change to input field" msgstr "" -#: admin/html/form-settings-payment.php:45 -msgid "Fallback to pay per post" +#: admin/html/whats-new.php:613 +msgid "Content restriction message translatable" msgstr "" -#: admin/html/form-settings-payment.php:50 -msgid "Fallback pay per post charging" +#: admin/html/whats-new.php:617 +msgid "ACF integration inconsistency handled" msgstr "" -#: admin/html/form-settings-payment.php:52 -msgid "Fallback to pay per post charging if pack limit exceeds" +#: admin/html/whats-new.php:621 +msgid "Enable payment checkbox handled for child option" msgstr "" -#: admin/html/form-settings-payment.php:57 -msgid "Fallback cost" +#: admin/html/whats-new.php:625 +msgid "Broken asset link handled for custom field popup" msgstr "" -#: admin/html/form-settings-payment.php:62 -msgid "Cost of pay per post after a subscription pack limit is reached." +#: admin/html/whats-new.php:629 +msgid "Rollback inconsistency for CPT handled" msgstr "" -#: admin/html/form-settings-payment.php:67 -msgid "Pay Per Post" +#: admin/html/whats-new.php:633 +msgid "Login form loaded after resetting password" msgstr "" -#: admin/html/form-settings-payment.php:72 -msgid "Enable Pay Per Post" +#: admin/html/whats-new.php:637 +msgid "Billing address inconsistency handled" msgstr "" -#: admin/html/form-settings-payment.php:74 -msgid "Charge users for posting," +#: admin/html/whats-new.php:641 +msgid "Form duplication on creation handled" msgstr "" -#: admin/html/form-settings-payment.php:74 -msgid " Learn More about Pay Per Post." +#: admin/html/whats-new.php:645 +msgid "Field Dragging inconsistency fixed" msgstr "" -#: admin/html/form-settings-payment.php:79 -msgid "Cost Settings" +#: admin/html/whats-new.php:656 +msgid "Google Map field enhanced along with acf google map" msgstr "" -#: admin/html/form-settings-payment.php:84 -msgid "Amount to be charged per post" +#: admin/html/whats-new.php:660 +msgid "Filter added for dashboard account menu" msgstr "" -#: admin/html/form-settings-payment.php:88 admin/settings-options.php:477 -msgid "Payment Success Page" +#: admin/html/whats-new.php:664 +msgid "Fallback Pay Per Post inconsistency handled" msgstr "" -#: admin/html/form-settings-payment.php:101 -msgid "Page will show after successful payment" +#: admin/html/whats-new.php:668 +msgid "Google map search field not showing" msgstr "" -#: admin/html/form-settings-post-edit.php:4 -#: admin/html/form-settings-post.php:16 -msgid "Post updated successfully" +#: admin/html/whats-new.php:672 +msgid "Form preview page inconsistency with builder" msgstr "" -#: admin/html/form-settings-post-edit.php:7 -msgid "Update" +#: admin/html/whats-new.php:676 +msgid "Category not showing as hierarchy" msgstr "" -#: admin/html/form-settings-post-edit.php:14 -msgid "Set Post Status to" +#: admin/html/whats-new.php:680 +msgid "TOC field randering issue with registration form" msgstr "" -#: admin/html/form-settings-post-edit.php:24 -msgid "No Change" +#: admin/html/whats-new.php:684 +msgid "Custom plupload filter inconsistency with file upload handled" msgstr "" -#: admin/html/form-settings-post-edit.php:31 -#: admin/html/form-settings-post.php:130 includes/free/form-element.php:391 -msgid "Redirect To" +#: admin/html/whats-new.php:688 +msgid "Guest Pay Per Post inconsistency handled" msgstr "" -#: admin/html/form-settings-post-edit.php:36 -#: admin/html/form-settings-post.php:135 -msgid "Newly created post" +#: admin/html/whats-new.php:692 +msgid "Responsive and font issue handled" msgstr "" -#: admin/html/form-settings-post-edit.php:37 -#: admin/html/form-settings-post.php:136 includes/free/form-element.php:396 -msgid "Same Page" +#: admin/html/whats-new.php:703 +msgid "Preview page added for post form and registration form" msgstr "" -#: admin/html/form-settings-post-edit.php:38 -#: admin/html/form-settings-post.php:137 includes/free/form-element.php:397 -msgid "To a page" +#: admin/html/whats-new.php:707 +msgid "Post types menu on account page added" msgstr "" -#: admin/html/form-settings-post-edit.php:39 -#: admin/html/form-settings-post.php:138 includes/free/form-element.php:398 -msgid "To a custom URL" +#: admin/html/whats-new.php:711 +msgid "Dashboard shortcode attributes enhanced" msgstr "" -#: admin/html/form-settings-post-edit.php:48 -#: admin/html/form-settings-post.php:147 includes/free/form-element.php:407 -msgid "After successfull submit, where the page will redirect to" +#: admin/html/whats-new.php:715 +msgid "Account page post type list new design" msgstr "" -#: admin/html/form-settings-post-edit.php:54 -msgid "Post Update Message" +#: admin/html/whats-new.php:719 +msgid "Payment page restricted from direct unauthenticated access" msgstr "" -#: admin/html/form-settings-post-edit.php:61 -#: admin/html/form-settings-post.php:160 includes/free/form-element.php:427 -msgid "Page" +#: admin/html/whats-new.php:723 +msgid "Timepicker conflict with dokan handled" msgstr "" -#: admin/html/form-settings-post-edit.php:76 -#: admin/html/form-settings-post.php:175 includes/free/form-element.php:450 -msgid "Custom URL" +#: admin/html/whats-new.php:727 +msgid "Trial inconsistency with paypal fixed" msgstr "" -#: admin/html/form-settings-post-edit.php:83 -msgid "Subscription Title" +#: admin/html/whats-new.php:731 +msgid "Subscription does not cancel with paypal due to profile missing id" msgstr "" -#: admin/html/form-settings-post-edit.php:92 -msgid "Update Post Button text" +#: admin/html/whats-new.php:735 +msgid "Subscription email notification inconsistency fixed" msgstr "" -#: admin/html/form-settings-post-edit.php:99 -msgid "Lock User From Editing After" +#: admin/html/whats-new.php:739 +msgid "Various issues on payment page for non-logged in user handled" msgstr "" -#: admin/html/form-settings-post-edit.php:102 -msgid "hours" +#: admin/html/whats-new.php:743 +msgid "Column inner field cloning inconsistency fixed" msgstr "" -#: admin/html/form-settings-post-edit.php:104 -msgid "After how many hours user will be locked from editing the submitted post." +#: admin/html/whats-new.php:747 +msgid "Popup z-index changed due to other plugin z-index" msgstr "" -#: admin/html/form-settings-post.php:7 class/post-form-templates/post.php:130 -msgid "This page is restricted. Please %login% / %register% to view this page." +#: admin/html/whats-new.php:759 +msgid "Added Mauritian Rupee for currency" msgstr "" -#: admin/html/form-settings-post.php:15 -msgid "Post saved" +#: admin/html/whats-new.php:763 +msgid "Added eid promotional offer notice" msgstr "" -#: admin/html/form-settings-post.php:21 -msgid "Submit" +#: admin/html/whats-new.php:767 +msgid "Multiple google map validation for same form" msgstr "" -#: admin/html/form-settings-post.php:29 admin/post-forms-list-table.php:312 -msgid "Post Type" +#: admin/html/whats-new.php:771 +msgid "Various issues on verification, autologin payments & address field" msgstr "" -#: admin/html/form-settings-post.php:51 -msgid "Custom Post Type will appear here. " +#: admin/html/whats-new.php:775 +msgid "Docs update for file & attachments feature which is pro only" msgstr "" -#: admin/html/form-settings-post.php:51 -msgid "Learn More " +#: admin/html/whats-new.php:786 +msgid "Overflow footer on form builder page" msgstr "" -#: admin/html/form-settings-post.php:71 -msgid "Post Format" +#: admin/html/whats-new.php:790 +msgid "WordPress 5.7 compatibility" msgstr "" -#: admin/html/form-settings-post.php:74 -msgid "- None -" +#: admin/html/whats-new.php:794 +msgid "Limited time promotion for weDevs birthday" msgstr "" -#: admin/html/form-settings-post.php:120 -msgid "" -"If users are not allowed to choose any category, this category will be used " -"instead (if post type supports)" +#: admin/html/whats-new.php:805 +msgid "Meta key will not change if label update" msgstr "" -#: admin/html/form-settings-post.php:153 -msgid "Message to show" +#: admin/html/whats-new.php:809 +msgid "Login redirect empty previous url" msgstr "" -#: admin/html/form-settings-post.php:182 -msgid "Comment Status" +#: admin/html/whats-new.php:813 +msgid "Email doesnt set as username" msgstr "" -#: admin/html/form-settings-post.php:185 -msgid "Open" +#: admin/html/whats-new.php:817 +msgid "Post redirection to payment doesn't work" msgstr "" -#: admin/html/form-settings-post.php:186 -msgid "Closed" +#: admin/html/whats-new.php:821 +msgid "Address field not working when used with conditional logic" msgstr "" -#: admin/html/form-settings-post.php:192 -msgid "Submit Post Button text" +#: admin/html/whats-new.php:825 +msgid "Ajax type category child of not working" msgstr "" -#: admin/html/form-settings-post.php:199 -msgid "Post Draft" +#: admin/html/whats-new.php:829 +msgid "Non recurring subscription did not work" msgstr "" -#: admin/html/form-settings-post.php:204 -msgid "Enable Saving as draft" +#: admin/html/whats-new.php:840 +msgid "Menu position has chenged due to dokan has same menu position" msgstr "" -#: admin/html/form-settings-post.php:206 -msgid "It will show a button to save as draft" +#: admin/html/whats-new.php:844 +msgid "Drag and drop not working properly for new field" msgstr "" -#: admin/html/form-submission-restriction.php:11 admin/template-post.php:160 -#: includes/fields/class-abstract-fields.php:483 -#: includes/free/edit-profile.php:98 templates/registration-form.php:30 -msgid "Name" +#: admin/html/whats-new.php:855 +msgid "QR and math captcha added to pro feature list" msgstr "" -#: admin/html/form-submission-restriction.php:12 admin/html/support.php:223 -#: class/transactions-list-table.php:53 includes/class-privacy.php:358 -#: includes/free/edit-user.php:168 templates/registration-form.php:47 -msgid "Email" +#: admin/html/whats-new.php:859 +msgid "Tooltip for category navigate" msgstr "" -#: admin/html/form-submission-restriction.php:29 -#: admin/post-forms-list-table.php:314 -msgid "Guest Post" +#: admin/html/whats-new.php:863 +msgid "Understandable guest payment notice" msgstr "" -#: admin/html/form-submission-restriction.php:34 -msgid "Enable Guest Post" +#: admin/html/whats-new.php:867 +msgid "Paypal non recurring pack id does not set" msgstr "" -#: admin/html/form-submission-restriction.php:36 -msgid "Unregistered users will be able to submit posts" +#: admin/html/whats-new.php:878 +msgid "Once trial subscription is used, it couldn't reset" msgstr "" -#: admin/html/form-submission-restriction.php:36 -msgid "Learn more about guest posting." +#: admin/html/whats-new.php:882 +msgid "Subscription cancel doesn't work" msgstr "" -#: admin/html/form-submission-restriction.php:41 -msgid "User Details" +#: admin/html/whats-new.php:886 +msgid "The tax rate was not calculated with the total amount" msgstr "" -#: admin/html/form-submission-restriction.php:46 -msgid "Require Name and Email address" +#: admin/html/whats-new.php:890 +msgid "The width of the column field was breaking" msgstr "" -#: admin/html/form-submission-restriction.php:48 -msgid "" -"If requires, users will be automatically registered to the site using the " -"name and email address" +#: admin/html/whats-new.php:894 +msgid "Paypal recurring payment" msgstr "" -#: admin/html/form-submission-restriction.php:53 -msgid "Name Label" +#: admin/html/whats-new.php:905 +msgid "Updated codebase to fix timezone mismatch" msgstr "" -#: admin/html/form-submission-restriction.php:58 -msgid "Label text for name field" +#: admin/html/whats-new.php:916 +msgid "Custom html content field's width" msgstr "" -#: admin/html/form-submission-restriction.php:63 -msgid "E-Mail Label" +#: admin/html/whats-new.php:920 +msgid "All states of New Zealand are added" msgstr "" -#: admin/html/form-submission-restriction.php:68 -msgid "Label text for email field" +#: admin/html/whats-new.php:931 +msgid "Get appropriate user id when role based conditions are present" msgstr "" -#: admin/html/form-submission-restriction.php:73 -msgid "Email Verification" +#: admin/html/whats-new.php:935 +msgid "Show Invalid subscription message if wrong pack id passed" msgstr "" -#: admin/html/form-submission-restriction.php:77 -msgid "Require Email Verification for Guests" +#: admin/html/whats-new.php:939 +msgid "URL field new window not working" msgstr "" -#: admin/html/form-submission-restriction.php:79 -msgid "If requires, users will be required to verify their email adress." +#: admin/html/whats-new.php:943 +msgid "Option label not working when & use" msgstr "" -#: admin/html/form-submission-restriction.php:84 -msgid "Role Base" +#: admin/html/whats-new.php:947 +msgid "Ajax type category not showing on edit" msgstr "" -#: admin/html/form-submission-restriction.php:89 -msgid "Enable role base post" +#: admin/html/whats-new.php:951 +msgid "Multiple file image can't select" msgstr "" -#: admin/html/form-submission-restriction.php:91 -msgid "You can choose which role can submit posts by this form." +#: admin/html/whats-new.php:955 +msgid "Subscription pack PayPal Checkout gets \"Error: Access Denied\"" msgstr "" -#: admin/html/form-submission-restriction.php:96 -msgid "Roles" +#: admin/html/whats-new.php:959 +msgid "Conflict image field with acf image field" msgstr "" -#: admin/html/form-submission-restriction.php:112 -msgid "Choose which roles can submit posts." +#: admin/html/whats-new.php:963 +msgid "Missing Auckland State for New Zealand country" msgstr "" -#: admin/html/form-submission-restriction.php:117 -#: admin/settings-options.php:294 -msgid "Unauthorized Message" +#: admin/html/whats-new.php:967 +msgid "Added support for WooCommerce product category value replacemen" msgstr "" -#: admin/html/form-submission-restriction.php:120 -msgid "" -"Not logged in users will see this message. You may use %login%, %register% " -"for link" +#: admin/html/whats-new.php:977 +msgid "Add character restriction feature" msgstr "" -#: admin/html/form-submission-restriction.php:125 -msgid "Schedule form" +#: admin/html/whats-new.php:981 +msgid "Make sure post author edit link works only in frontend" msgstr "" -#: admin/html/form-submission-restriction.php:130 -msgid "Schedule form for a period" +#: admin/html/whats-new.php:985 +msgid "Inconsistency in lost password reset email message" msgstr "" -#: admin/html/form-submission-restriction.php:132 -msgid "Schedule for a time period the form is active." +#: admin/html/whats-new.php:989 +msgid "Saving custom taxonomy terms when input type is text" msgstr "" -#: admin/html/form-submission-restriction.php:137 -msgid "Schedule Period" +#: admin/html/whats-new.php:993 +msgid "Taxonomy field JS error in builder" msgstr "" -#: admin/html/form-submission-restriction.php:140 -msgid "From" +#: admin/html/whats-new.php:997 +msgid "Showing WPUF edit link for WP default roles" msgstr "" -#: admin/html/form-submission-restriction.php:144 -#: includes/free/form-element.php:230 includes/free/form-element.php:267 -msgid "To" +#: admin/html/whats-new.php:1001 +msgid "Upload button unresponsive issue in iOS" msgstr "" -#: admin/html/form-submission-restriction.php:151 -msgid "Form Pending Message" +#: admin/html/whats-new.php:1011 +msgid "Add post edit link for post authors in single or archive pages" msgstr "" -#: admin/html/form-submission-restriction.php:158 -msgid "Form Expired Message" +#: admin/html/whats-new.php:1015 +msgid "Enhance post delete message" msgstr "" -#: admin/html/form-submission-restriction.php:165 -msgid "Limit Entries" +#: admin/html/whats-new.php:1019 +msgid "Refactor control buttons visibility in form builder" msgstr "" -#: admin/html/form-submission-restriction.php:170 -msgid "Enable form entry limit" +#: admin/html/whats-new.php:1023 +msgid "Add missing colons after field label" msgstr "" -#: admin/html/form-submission-restriction.php:174 -msgid "Limit the number of entries allowed for this form" +#: admin/html/whats-new.php:1027 +msgid "Post edit map capability condition" msgstr "" -#: admin/html/form-submission-restriction.php:180 -msgid "Number of Entries" +#: admin/html/whats-new.php:1031 +msgid "Role based permission for accessing a post form" msgstr "" -#: admin/html/form-submission-restriction.php:187 -msgid "Limit Reached Message" +#: admin/html/whats-new.php:1035 +msgid "Section-break field alignment" msgstr "" -#: admin/html/modal.php:4 -msgid "Modal window. Press escape to close." +#: admin/html/whats-new.php:1039 +msgid "Pay per post doesn't work if subscription pack is activated" msgstr "" -#: admin/html/modal.php:5 -msgid "Close modal window" +#: admin/html/whats-new.php:1043 +msgid "Mime type for uploading JSON files" msgstr "" -#: admin/html/modal.php:9 -msgid "Select a Template" +#: admin/html/whats-new.php:1047 +msgid "File upload with same file name" msgstr "" -#: admin/html/modal.php:12 -msgid "Select from a pre-defined template or from a blank form" +#: admin/html/whats-new.php:1051 +msgid "Post preview missing fields" msgstr "" -#: admin/html/modal.php:23 admin/html/modal.php:27 admin/html/modal.php:31 -msgid "Blank Form" +#: admin/html/whats-new.php:1055 +msgid "Illigal variable declartion" msgstr "" -#: admin/html/modal.php:34 admin/html/modal.php:70 -msgid "Create Form" +#: admin/html/whats-new.php:1059 +msgid "Featured image updating issue" msgstr "" -#: admin/html/modal.php:55 -msgid "This integration is not installed." +#: admin/html/whats-new.php:1063 +msgid "Conflict with Phlox theme" msgstr "" -#: admin/html/modal.php:104 includes/free/loader.php:1200 -#: includes/free/loader.php:1282 -msgid "Upgrade to PRO" +#: admin/html/whats-new.php:1067 +msgid "Textarea custom field data sanitization" msgstr "" -#: admin/html/support.php:187 -msgid "Related Articles:" +#: admin/html/whats-new.php:1071 +msgid "exclude_type warning in wpuf_category_checklist" msgstr "" -#: admin/html/support.php:205 -msgid "General Help Questions" +#: admin/html/whats-new.php:1075 +msgid "Category field not showing all child categories for selection type child of" msgstr "" -#: admin/html/support.php:205 -msgid "View all Documentations" +#: admin/html/whats-new.php:1079 +msgid "Conflict between image and file upload custom fields" msgstr "" -#: admin/html/support.php:210 -msgid "Subscribe to Our Newsletter" +#: admin/html/whats-new.php:1083 +msgid "Login url when login page is not set" msgstr "" -#: admin/html/support.php:212 +#: admin/html/whats-new.php:1093 msgid "" -"Subscribe to our newsletter for regular tips, " -"offers and news updates." +"Use common names for Ivory Coast, North Korea and Sourth Korea instead of " +"their official names" msgstr "" -#: admin/html/support.php:218 includes/class-privacy.php:350 -#: includes/free/edit-profile.php:106 -msgid "First Name" +#: admin/html/whats-new.php:1097 +msgid "Fix condition to use default avatar" msgstr "" -#: admin/html/support.php:229 -msgid "Subscribe" +#: admin/html/whats-new.php:1101 +msgid "Make Email and URL fields clickable" msgstr "" -#: admin/html/support.php:240 -msgid "Plugin Setup" +#: admin/html/whats-new.php:1105 +msgid "Fix redirect after user login" msgstr "" -#: admin/html/support.php:246 admin/settings-options.php:19 -msgid "Frontend Posting" +#: admin/html/whats-new.php:1109 +msgid "Sanitize textarea field data" msgstr "" -#: admin/html/support.php:252 -msgid "Frontend Dashboard" +#: admin/html/whats-new.php:1113 +msgid "" +"Fix missing colon to email, URL, text and textarea labels when renders " +"their data" msgstr "" -#: admin/html/support.php:258 -msgid "User Registration" +#: admin/html/whats-new.php:1117 +msgid "Prevent showing empty labels for fields that have render_field_data method" msgstr "" -#: admin/html/support.php:264 -msgid "User Login" +#: admin/html/whats-new.php:1127 +msgid "Add Namibian Dollar in currency list" msgstr "" -#: admin/html/support.php:270 -msgid "Profile Editing" +#: admin/html/whats-new.php:1131 +msgid "Add sync values option for option data fields" msgstr "" -#: admin/html/support.php:276 -msgid "Subscription & Payment" +#: admin/html/whats-new.php:1135 +msgid "Allow uploading image that having filesize meets php ini settings" msgstr "" -#: admin/html/support.php:282 includes/fields/class-abstract-fields.php:67 -msgid "Content Restriction" +#: admin/html/whats-new.php:1139 +msgid "Limit the selection of one image at a time" msgstr "" -#: admin/html/support.php:304 -msgid "Learn More About Installation" +#: admin/html/whats-new.php:1143 +msgid "Use file name and size to generate hash to prevent duplicant image upload" msgstr "" -#: admin/html/support.php:315 -msgid "Learn More About Frontend Posting" +#: admin/html/whats-new.php:1147 +msgid "Sanitize text and textarea field data" msgstr "" -#: admin/html/support.php:325 -msgid "Learn More About Frontend Dashboard" +#: admin/html/whats-new.php:1151 +msgid "" +"Show label instead of values for radio, checkbox, dropdown and multiselect " +"data" msgstr "" -#: admin/html/support.php:355 -msgid "Learn More About Registration" +#: admin/html/whats-new.php:1155 +msgid "Saving custom taxonomies for type text input" msgstr "" -#: admin/html/support.php:371 -msgid "Learn More About Login" +#: admin/html/whats-new.php:1159 +msgid "Admin settings link for recaptcha helper text" msgstr "" -#: admin/html/support.php:388 -msgid "Learn More About Profile Editing" +#: admin/html/whats-new.php:1163 +msgid "Undefined name property for Custom HTML fields" msgstr "" -#: admin/html/support.php:441 -msgid "Learn More About Payments" +#: admin/html/whats-new.php:1167 +msgid "Delete attachment process" +msgstr "" + +#: admin/html/whats-new.php:1171 +msgid "Missing billing address in invoice PDF" msgstr "" -#: admin/html/support.php:458 -msgid "Learn More About Content Restriction" +#: admin/html/whats-new.php:1175 +msgid "Showing country field value in frontend post content" msgstr "" -#: admin/html/support.php:467 admin/html/support.php:469 -msgid "Like The Plugin?" +#: admin/html/whats-new.php:1179 +msgid "Avatar size display not complying with admin settings size" msgstr "" -#: admin/html/support.php:471 -msgid "Your Review is very important to us as it helps us to grow more." +#: admin/html/whats-new.php:1183 +msgid "Display default avatars on admin settings discussion page" msgstr "" -#: admin/html/support.php:473 -msgid "Review Us on WP.org" +#: admin/html/whats-new.php:1187 +msgid "Redirect to subscription page at registration" msgstr "" -#: admin/html/support.php:477 admin/html/support.php:479 -msgid "Found Any Bugs?" +#: admin/html/whats-new.php:1191 +msgid "Error notice regarding registration page redirect" msgstr "" -#: admin/html/support.php:481 -msgid "Report any Bug that you Discovered, Get Instant Solutions." +#: admin/html/whats-new.php:1195 +msgid "Escaping html in registration errors" msgstr "" -#: admin/html/support.php:483 -msgid "Report to GitHub" +#: admin/html/whats-new.php:1199 +msgid "Default login redirect link" msgstr "" -#: admin/html/support.php:487 admin/html/support.php:489 -msgid "Need Any Assistance?" +#: admin/html/whats-new.php:1203 +msgid "Implementing default WP login page override option" msgstr "" -#: admin/html/support.php:491 -msgid "Our EXPERT Support Team is always ready to Help you out." +#: admin/html/whats-new.php:1207 +msgid "Transparent background of autosuggestion dropdown" msgstr "" -#: admin/html/support.php:493 -msgid "Contact Support" +#: admin/html/whats-new.php:1217 +msgid "Import forms system" msgstr "" -#: admin/html/whats-new.php:8 -msgid "Admin dashboard news and update meta-box added" +#: admin/html/whats-new.php:1221 +msgid "Password reset system" msgstr "" -#: admin/html/whats-new.php:12 -msgid "Upgrade prompts design" +#: admin/html/whats-new.php:1225 +msgid "Updated url validation regex to support modern tlds" msgstr "" -#: admin/html/whats-new.php:16 -msgid "Email style handled" +#: admin/html/whats-new.php:1229 +msgid "Export WPUF forms individually from admin tools page" msgstr "" -#: admin/html/whats-new.php:20 -msgid "" -"text-area type selection(Normal, Rich text-area, Teeny Rich text-area) bug " -"in field options" +#: admin/html/whats-new.php:1233 +msgid "Subscription cycle label translation issue" msgstr "" -#: admin/html/whats-new.php:24 -msgid "Frontend form validation" +#: admin/html/whats-new.php:1237 +msgid "ACF integration for checkbox fields" msgstr "" -#: admin/html/whats-new.php:28 -msgid "Default value not saving for radio, dropdown, checkbox" +#: admin/html/whats-new.php:1241 +msgid "Illegal string offset warning while updating settings" msgstr "" -#: admin/html/whats-new.php:32 -msgid "sweetalert2 version" +#: admin/html/whats-new.php:1245 +msgid "Conditional logic for Section Break field" msgstr "" -#: admin/html/whats-new.php:42 -msgid "Short-code encryption updated for registration page" +#: admin/html/whats-new.php:1249 +msgid "Subscriptions cannot be deleted from backend" msgstr "" -#: admin/html/whats-new.php:52 -msgid "Updated compatibility with the latest version of WordPress 6.0" +#: admin/html/whats-new.php:1253 +msgid "A regression regarding saving checkbox data" msgstr "" -#: admin/html/whats-new.php:56 -msgid "Improved some backend implementations" +#: admin/html/whats-new.php:1257 +msgid "Default value of multi-select fields is not showing" msgstr "" -#: admin/html/whats-new.php:66 -msgid "Email template enhanced for after activation" +#: admin/html/whats-new.php:1267 +msgid "Hide post edit option when subscription is expired" msgstr "" -#: admin/html/whats-new.php:70 -msgid "Read only option for custom field" +#: admin/html/whats-new.php:1269 +msgid "Hide post edit option from users whose subscription pack is expired." msgstr "" -#: admin/html/whats-new.php:74 -msgid "Editor toolbar exclude option enhanced" +#: admin/html/whats-new.php:1272 +msgid "Check files to prevent duplicity in media upload" msgstr "" -#: admin/html/whats-new.php:78 -msgid "Preview option enhanced for user profile" +#: admin/html/whats-new.php:1274 +msgid "" +"A simple measure has been taken to prevent maliciously flooding the site by " +"uploading same file multiple times. Though this won't work with already " +"uploaded medias." msgstr "" -#: admin/html/whats-new.php:82 -msgid "Meta key enhanced for user email notification" +#: admin/html/whats-new.php:1277 +msgid "Refactor address fields in Account section" msgstr "" -#: admin/html/whats-new.php:86 -msgid "Global option for disable post edit on account" +#: admin/html/whats-new.php:1279 +msgid "Address edit section from Account section has been rewritten to improve UX." msgstr "" -#: admin/html/whats-new.php:90 -msgid "Filter for conditional logic for fields added" +#: admin/html/whats-new.php:1282 +msgid "Update Paypal payment gateway" msgstr "" -#: admin/html/whats-new.php:94 -msgid "PHP 8 compatibility handled" +#: admin/html/whats-new.php:1284 +msgid "Paypal payment gateway has seen some improvements." msgstr "" -#: admin/html/whats-new.php:98 -msgid "Address / Billing address inconsistency handled" +#: admin/html/whats-new.php:1287 +msgid "Default Category selection improvements" msgstr "" -#: admin/html/whats-new.php:102 -msgid "Content restriction several issue fixed" +#: admin/html/whats-new.php:1289 +msgid "" +"An intuitive way of selecting default category of a selected post type has " +"been introduced." msgstr "" -#: admin/html/whats-new.php:106 -msgid "Tax calculation properly handled for all areas" +#: admin/html/whats-new.php:1292 +msgid "Compatibility issue with ACF date time field" msgstr "" -#: admin/html/whats-new.php:110 -msgid "Validation added for invalid email and URL formats" +#: admin/html/whats-new.php:1294 +msgid "A Compatibility issue with ACF date time field has been addressed." msgstr "" -#: admin/html/whats-new.php:114 -msgid "Special character password handled for login" +#: admin/html/whats-new.php:1297 +msgid "Media title, caption & description not saving" msgstr "" -#: admin/html/whats-new.php:118 -msgid "Reset password handled for sidebar widget" +#: admin/html/whats-new.php:1299 +msgid "" +"Media title, caption & description were not saving from frontend. They will " +"now." msgstr "" -#: admin/html/whats-new.php:122 -msgid "Required google map issues handled" +#: admin/html/whats-new.php:1302 +msgid "" +"The Events Calendar venue and organizer fields issue in WPUF Custom Fields " +"metabox" msgstr "" -#: admin/html/whats-new.php:126 -msgid "Translation related issue handled for admin menu" +#: admin/html/whats-new.php:1304 +msgid "" +"A workaround has been introduced to save The Events Calendar Venue and " +"Organizer fields properly from WPUF Custom Fields metabox." msgstr "" -#: admin/html/whats-new.php:130 -msgid "Label & query enhanced for transaction table" +#: admin/html/whats-new.php:1307 +msgid "Checkbox data not saving from WPUF Custom Fields metabox" msgstr "" -#: admin/html/whats-new.php:134 -msgid "Template override for child theme fixed" +#: admin/html/whats-new.php:1309 +msgid "" +"Checkboxe data from WPUF Custom Fields metabox were not saving. It has been " +"fixed." msgstr "" -#: admin/html/whats-new.php:138 -msgid "Custom field modal handled for registration form" +#: admin/html/whats-new.php:1312 +msgid "Multi-column Repeater field data saving issue" msgstr "" -#: admin/html/whats-new.php:142 -msgid "Redundant CSS issues handled" +#: admin/html/whats-new.php:1314 +msgid "" +"Multi-column Repeater field data from a form was not saving. It has been " +"fixed." msgstr "" -#: admin/html/whats-new.php:146 -msgid "Address field inconsistency fixed" +#: admin/html/whats-new.php:1317 +msgid "Multistep form conflict with Elementor" msgstr "" -#: admin/html/whats-new.php:150 -msgid "Plugin page spin loading issue handled" +#: admin/html/whats-new.php:1319 +msgid "Multistep form had a conflict with Elementor. It has been fixed." msgstr "" -#: admin/html/whats-new.php:154 -msgid "Warning on exit for draft post fixed" +#: admin/html/whats-new.php:1322 +msgid "Multiple images showing issue in frontend" msgstr "" -#: admin/html/whats-new.php:158 -msgid "Unlimited expire on admin user profile handled" +#: admin/html/whats-new.php:1324 +msgid "Multiple images in a post were not showing in frontend. Now they will." msgstr "" -#: admin/html/whats-new.php:162 -msgid "No value checkbox issue handled" +#: admin/html/whats-new.php:1333 +msgid "Nonce not verify on login" msgstr "" -#: admin/html/whats-new.php:166 -msgid "Tag search security Vulnerability handled" +#: admin/html/whats-new.php:1335 +msgid "Return of function wp_verify_nonce() was ignored." msgstr "" -#: admin/html/whats-new.php:170 -msgid "Multi dropdown field error handled" +#: admin/html/whats-new.php:1344 +msgid "Option to set which tab shows as active on the account page" msgstr "" -#: admin/html/whats-new.php:181 -msgid "Promotion notice enhanced through api" +#: admin/html/whats-new.php:1346 +msgid "" +"Option to set which tab shows as active on the account page. To configure " +"this setting navigate to wp-admin->User Frontend->Settings->My " +"Account->Active Tab " msgstr "" -#: admin/html/whats-new.php:192 -msgid "Security Vulnerability fixed" +#: admin/html/whats-new.php:1349 +msgid "Unlock option was unavailable after the post being locked" msgstr "" -#: admin/html/whats-new.php:203 -msgid "Featured item for subscriber" +#: admin/html/whats-new.php:1351 +msgid "Unlock option was unavailable after the post being locked." msgstr "" -#: admin/html/whats-new.php:207 -msgid "Warning added for unsaved form data on frontend" +#: admin/html/whats-new.php:1354 +msgid "Gutenberg block of WPUF didn't work on bedrock installation" msgstr "" -#: admin/html/whats-new.php:211 -msgid "Settings page search implemented" +#: admin/html/whats-new.php:1356 +msgid "Gutenberg block of WPUF didn't work on bedrock installation." msgstr "" -#: admin/html/whats-new.php:215 -msgid "Editor added for registration form email template" +#: admin/html/whats-new.php:1359 +msgid "Sending admin payment received email twice" msgstr "" -#: admin/html/whats-new.php:219 -msgid "Fallback pay per post not working with when draft enabled" +#: admin/html/whats-new.php:1361 +msgid "" +"After processing payment admin & user was receiving payment received email " +"twice." msgstr "" -#: admin/html/whats-new.php:223 -msgid "User Dashboard responsive issues fixed" +#: admin/html/whats-new.php:1364 +msgid "" +"Add shortcode support to display post information in the Post Expiration " +"Message" msgstr "" -#: admin/html/whats-new.php:227 -msgid "Showing wrong license expire message handled" +#: admin/html/whats-new.php:1366 +msgid "" +"Add shortcode support to display post information in the Post Expiration " +"Message. You can use: {post_author} {post_url} {blogname} " +"{post_title} {post_status}" msgstr "" -#: admin/html/whats-new.php:231 -msgid "Remove expire cron handled for once daily" +#: admin/html/whats-new.php:1369 +msgid "Add optin on the setup wizard" msgstr "" -#: admin/html/whats-new.php:235 -msgid "Billing address validation handled" +#: admin/html/whats-new.php:1371 +msgid "" +"Added optin on the setup wizard, admin can choose whether he/she wants to " +"share server environment details (php, mysql, server, WordPress versions), " +"Number of users, Site language, Number of active and inactive plugins, Site " +"name and url, admin name and email address. No sensitive data is tracked" msgstr "" -#: admin/html/whats-new.php:239 -msgid "Promotion notice restricted for WPUF menu" +#: admin/html/whats-new.php:1380 +msgid "Post Owner problem" msgstr "" -#: admin/html/whats-new.php:250 -msgid "reCaptcha issue with other plugin handled" +#: admin/html/whats-new.php:1382 +msgid "" +"Posts were not assigned to the selected default post owner, this issue has " +"been fixed." msgstr "" -#: admin/html/whats-new.php:254 -msgid "Multiple post type for wpuf dashboard not working fixed" +#: admin/html/whats-new.php:1385 +msgid "Google reCaptcha was not working" msgstr "" -#: admin/html/whats-new.php:258 -msgid "Billing address ajax request issue handled" +#: admin/html/whats-new.php:1387 +msgid "" +"Google reCaptcha was not working, users could submit the form without " +"reCaptcha validation." msgstr "" -#: admin/html/whats-new.php:262 -msgid "Halloween promotion notice added" +#: admin/html/whats-new.php:1396 +msgid "Added column field" msgstr "" -#: admin/html/whats-new.php:273 -msgid "Content restriction for minimum, maximum value enhanced" +#: admin/html/whats-new.php:1401 +msgid "Unable to render the events on the front-end dashboard" msgstr "" -#: admin/html/whats-new.php:277 -msgid "New option for redirection after pay per post payment in form setting" +#: admin/html/whats-new.php:1403 +msgid "" +"On the frontend dashboard, the submitted events were not showing, you will " +"get it fixed in this version." msgstr "" -#: admin/html/whats-new.php:281 -msgid "Controller added for various email notification" +#: admin/html/whats-new.php:1406 +msgid "Page order getting 0(zero) after editing from the frontend" msgstr "" -#: admin/html/whats-new.php:285 -msgid "Placeholder added for unauth message option" +#: admin/html/whats-new.php:1408 +msgid "" +"Page order was not saving while editing a post using WPUF form, it has been " +"fixed." msgstr "" -#: admin/html/whats-new.php:289 -msgid "Subscription Post expiration option change to input field" +#: admin/html/whats-new.php:1411 +msgid "Text input field for taxonomies not working" msgstr "" -#: admin/html/whats-new.php:293 -msgid "Content restriction message translatable" +#: admin/html/whats-new.php:1413 +msgid "" +"When taxonomy field type is set to `Text Input` then a fatal error was " +"showing on the frontend, no error with taxonomy field in the latest version." msgstr "" -#: admin/html/whats-new.php:297 -msgid "ACF integration inconsistency handled" +#: admin/html/whats-new.php:1416 +msgid "" +"In radio and checkbox field use conditional logic that value does not save " +"in database" msgstr "" -#: admin/html/whats-new.php:301 -msgid "Enable payment checkbox handled for child option" +#: admin/html/whats-new.php:1418 +msgid "" +"The selected value of radio and checkbox field were not showing while " +"editing posts from the backend or frontend, you can see the selected value " +"in this version." msgstr "" -#: admin/html/whats-new.php:305 -msgid "Broken asset link handled for custom field popup" +#: admin/html/whats-new.php:1421 +msgid "The args param not working with get_avatar filter" msgstr "" -#: admin/html/whats-new.php:309 -msgid "Rollback inconsistency for CPT handled" +#: admin/html/whats-new.php:1423 +msgid "The args parameter did not exist with get_avatar filter, which now exists." msgstr "" -#: admin/html/whats-new.php:313 -msgid "Login form loaded after resetting password" +#: admin/html/whats-new.php:1426 +msgid "The item in ajax taxonomy field was not selected" msgstr "" -#: admin/html/whats-new.php:317 -msgid "Billing address inconsistency handled" +#: admin/html/whats-new.php:1428 +msgid "" +"When the taxonomy field type is set to Ajax, the submitted terms were not " +"showing in the backend and frontend which have been fixed." msgstr "" -#: admin/html/whats-new.php:321 -msgid "Form duplication on creation handled" +#: admin/html/whats-new.php:1437 +msgid "Unable to send new user registration email" msgstr "" -#: admin/html/whats-new.php:325 -msgid "Field Dragging inconsistency fixed" +#: admin/html/whats-new.php:1439 +msgid "" +"WP User Frontend default registration form `[wpuf-registration]` was unable " +"to send the new user registration email." msgstr "" -#: admin/html/whats-new.php:336 -msgid "Google Map field enhanced along with acf google map" +#: admin/html/whats-new.php:1442 +msgid "WPUF forms block compatibility issue with the latest WP version" msgstr "" -#: admin/html/whats-new.php:340 -msgid "Filter added for dashboard account menu" +#: admin/html/whats-new.php:1444 +msgid "" +"With the latest version of WordPress the gutenberg block of WP User " +"Frontend were not working. In this version, you will get it fixed." msgstr "" -#: admin/html/whats-new.php:344 -msgid "Fallback Pay Per Post inconsistency handled" +#: admin/html/whats-new.php:1447 +msgid "Page not update where `[wpuf_dashboard]` shortcode exist" msgstr "" -#: admin/html/whats-new.php:348 -msgid "Google map search field not showing" +#: admin/html/whats-new.php:1449 +msgid "" +"While using Gutenberg, the page were not being updated with WPUF shortcode " +"[wpuf dashboard]" msgstr "" -#: admin/html/whats-new.php:352 -msgid "Form preview page inconsistency with builder" +#: admin/html/whats-new.php:1452 +msgid "Retain default when determining whether to display the admin bar" msgstr "" -#: admin/html/whats-new.php:356 -msgid "Category not showing as hierarchy" +#: admin/html/whats-new.php:1454 +msgid "" +"From the User Frontend Settings, set that Administrator, Editor, Vendor can " +"see the admin bar. Now, the super admin want, one specific user ( who has " +"the user role from the above ) can't see the admin bar and disabled it from " +"the Toolbar form that specific user profile. And this configuration ( " +"Toolbar ) from the specific user profile were unable to impact on the " +"frontend." msgstr "" -#: admin/html/whats-new.php:360 -msgid "TOC field randering issue with registration form" +#: admin/html/whats-new.php:1457 +msgid "Fatal error when use PHP lower version (5.4 or lower)" msgstr "" -#: admin/html/whats-new.php:364 -msgid "Custom plupload filter inconsistency with file upload handled" +#: admin/html/whats-new.php:1459 +msgid "" +"It was unable to install WP User Frontend with PHP 5.4 or lower version. " +"Here is the error details:

    Fatal error: Can't use method " +"return value in write context in " +"/wp-user-frontend/class/frontend-form-post.php on line 194" msgstr "" -#: admin/html/whats-new.php:368 -msgid "Guest Pay Per Post inconsistency handled" +#: admin/html/whats-new.php:1462 +msgid "Product form was unable to show the single gallery image" msgstr "" -#: admin/html/whats-new.php:372 -msgid "Responsive and font issue handled" +#: admin/html/whats-new.php:1464 +msgid "" +"When user upload single image for product gallery using WPUF WooCommerce " +"product form, that image were not showing on the frontend." msgstr "" -#: admin/html/whats-new.php:383 -msgid "Preview page added for post form and registration form" +#: admin/html/whats-new.php:1473 +msgid "WooCommerce gallery images not getting saved" msgstr "" -#: admin/html/whats-new.php:387 -msgid "Post types menu on account page added" +#: admin/html/whats-new.php:1475 +msgid "" +"After releasing version 2.9.3, WooCommerce gallery image field stopped " +"working. You will get it fixed in this version." msgstr "" -#: admin/html/whats-new.php:391 -msgid "Dashboard shortcode attributes enhanced" +#: admin/html/whats-new.php:1484 +msgid "The Events Calendar Integration Form" msgstr "" -#: admin/html/whats-new.php:395 -msgid "Account page post type list new design" +#: admin/html/whats-new.php:1486 +msgid "" +"Now admin can allow users to create event from the frontend. Currently WPUF " +"has a one click pre-build event form that has been integrated with The " +"Events Calendar plugin" msgstr "" -#: admin/html/whats-new.php:399 -msgid "Payment page restricted from direct unauthenticated access" +#: admin/html/whats-new.php:1489 +msgid "Post Submission Facility From Account Page" msgstr "" -#: admin/html/whats-new.php:403 -msgid "Timepicker conflict with dokan handled" +#: admin/html/whats-new.php:1491 +msgid "" +"On the frontend account page, added a new menu item named Submit " +"Post. Now admin can allow users to submit post from their default " +"account page. As an admin you can disable or enable this option from " +"User Frontend -> Settings -> My Account -> Post Submission, Also, " +"you can assign any post form that will use to submit posts." msgstr "" -#: admin/html/whats-new.php:407 -msgid "Trial inconsistency with paypal fixed" +#: admin/html/whats-new.php:1494 +msgid "Login/Lost Password Link Under Registration Form" msgstr "" -#: admin/html/whats-new.php:411 -msgid "Subscription does not cancel with paypal due to profile missing id" +#: admin/html/whats-new.php:1496 +msgid "Added Login/Lost Password link under registration form" msgstr "" -#: admin/html/whats-new.php:415 -msgid "Subscription email notification inconsistency fixed" +#: admin/html/whats-new.php:1505 +msgid "Added drag and drop image ordering on image upload" msgstr "" -#: admin/html/whats-new.php:419 -msgid "Various issues on payment page for non-logged in user handled" +#: admin/html/whats-new.php:1507 +msgid "" +"Now frontend users can drag & drop the images/files to change the order " +"while uploading." msgstr "" -#: admin/html/whats-new.php:423 -msgid "Column inner field cloning inconsistency fixed" +#: admin/html/whats-new.php:1510 +msgid "Added reCAPTCHA field in login form" msgstr "" -#: admin/html/whats-new.php:427 -msgid "Popup z-index changed due to other plugin z-index" +#: admin/html/whats-new.php:1512 +msgid "" +"Admin has the option to show reCAPTCHA field in login form. Check the " +"related settings from User Frontend > Settings > " +"Login/Registration" msgstr "" -#: admin/html/whats-new.php:439 -msgid "Added Mauritian Rupee for currency" +#: admin/html/whats-new.php:1515 +msgid "Added preview option in forms" msgstr "" -#: admin/html/whats-new.php:443 -msgid "Added eid promotional offer notice" +#: admin/html/whats-new.php:1517 +msgid "" +"You can see a nice Preview button with Save " +"Form button, admin can take a quick look of the form without using " +"shortcode" msgstr "" -#: admin/html/whats-new.php:447 -msgid "Multiple google map validation for same form" +#: admin/html/whats-new.php:1520 +msgid "Fixed hiding “Select Image” button while uploading multiple images." msgstr "" -#: admin/html/whats-new.php:451 -msgid "Various issues on verification, autologin payments & address field" +#: admin/html/whats-new.php:1522 +msgid "" +"The upload button will not be hidden until the user selects max number of " +"files " msgstr "" -#: admin/html/whats-new.php:455 -msgid "Docs update for file & attachments feature which is pro only" +#: admin/html/whats-new.php:1525 +msgid "Added form limit notice before form submission" msgstr "" -#: admin/html/whats-new.php:466 -msgid "Overflow footer on form builder page" +#: admin/html/whats-new.php:1527 +msgid "" +"Limit notice message was showing after submission, now it is showing when " +"rendering the form" msgstr "" -#: admin/html/whats-new.php:470 -msgid "WordPress 5.7 compatibility" +#: admin/html/whats-new.php:1530 +msgid "Fixed: default post category not saving" msgstr "" -#: admin/html/whats-new.php:474 -msgid "Limited time promotion for weDevs birthday" +#: admin/html/whats-new.php:1532 +msgid "" +"From the form Settings > Post Settings, default post " +"category options were not saving. Now, it's fixed." msgstr "" -#: admin/html/whats-new.php:485 -msgid "Meta key will not change if label update" +#: admin/html/whats-new.php:1535 +msgid "" +"WPUF dashboard shortcode with form_id attribute was not showing posts " +"properly" msgstr "" -#: admin/html/whats-new.php:489 -msgid "Login redirect empty previous url" +#: admin/html/whats-new.php:1537 +msgid "" +"Now you can list posts on the frontend by using form_id " +"attribute with [wpuf_dashboard] shortcode" msgstr "" -#: admin/html/whats-new.php:493 -msgid "Email doesnt set as username" +#: admin/html/whats-new.php:1546 +msgid "Changed text domain to `wp-user-frontend` from `wpuf` " msgstr "" -#: admin/html/whats-new.php:497 -msgid "Post redirection to payment doesn't work" +#: admin/html/whats-new.php:1548 +msgid "" +"If you are using other language than English. Please rename your " +".po and .mo files to `wp-user-frontend_` from `wpuf_`
    This " +"change was made to support translations from translate.wordpress.org" msgstr "" -#: admin/html/whats-new.php:501 -msgid "Address field not working when used with conditional logic" +#: admin/html/whats-new.php:1551 +msgid "Added WP User Frontend Data export and erase functionality." msgstr "" -#: admin/html/whats-new.php:505 -msgid "Ajax type category child of not working" +#: admin/html/whats-new.php:1553 +msgid "Added functionality to export WP User Frontend Data to comply with GDPR." msgstr "" -#: admin/html/whats-new.php:509 -msgid "Non recurring subscription did not work" +#: admin/html/whats-new.php:1556 +msgid "Added billing address customizer." msgstr "" -#: admin/html/whats-new.php:520 -msgid "Menu position has chenged due to dokan has same menu position" +#: admin/html/whats-new.php:1558 +msgid "Added customizer options for billing address in payment page." msgstr "" -#: admin/html/whats-new.php:524 -msgid "Drag and drop not working properly for new field" +#: admin/html/whats-new.php:1561 +msgid "Make the payment page responsive." msgstr "" -#: admin/html/whats-new.php:535 -msgid "QR and math captcha added to pro feature list" +#: admin/html/whats-new.php:1563 +msgid "Some css adjustments are made in payment page to make it responsive." msgstr "" -#: admin/html/whats-new.php:539 -msgid "Tooltip for category navigate" +#: admin/html/whats-new.php:1566 +msgid "Fixed image upload issue in Safari." msgstr "" -#: admin/html/whats-new.php:543 -msgid "Understandable guest payment notice" +#: admin/html/whats-new.php:1568 +msgid "Images were not showing after upload in safari, it is fixed now." msgstr "" -#: admin/html/whats-new.php:547 -msgid "Paypal non recurring pack id does not set" +#: admin/html/whats-new.php:1571 +msgid "Post update issue after updating or removing post images." msgstr "" -#: admin/html/whats-new.php:558 -msgid "Once trial subscription is used, it couldn't reset" +#: admin/html/whats-new.php:1573 +msgid "" +"Posts cannot be updated after updating or removing post images, it is fixed " +"now." msgstr "" -#: admin/html/whats-new.php:562 -msgid "Subscription cancel doesn't work" +#: admin/html/whats-new.php:1582 +msgid "Allow overriding form input styles using theme styling." msgstr "" -#: admin/html/whats-new.php:566 -msgid "The tax rate was not calculated with the total amount" +#: admin/html/whats-new.php:1584 +msgid "Overriding form input styles using theme style is now possible." msgstr "" -#: admin/html/whats-new.php:570 -msgid "The width of the column field was breaking" +#: admin/html/whats-new.php:1587 +msgid "Fixed Auto Login after registration." msgstr "" -#: admin/html/whats-new.php:574 -msgid "Paypal recurring payment" +#: admin/html/whats-new.php:1589 +msgid "Auto Login after registration was not working is fixed now." msgstr "" -#: admin/html/whats-new.php:585 -msgid "Updated codebase to fix timezone mismatch" +#: admin/html/whats-new.php:1592 +msgid "Fixed fallback cost calculation" msgstr "" -#: admin/html/whats-new.php:596 -msgid "Custom html content field's width" +#: admin/html/whats-new.php:1594 +msgid "Fallback cost calculation was inaccurate for some cases, it is fixed now." msgstr "" -#: admin/html/whats-new.php:600 -msgid "All states of New Zealand are added" +#: admin/html/whats-new.php:1597 +msgid "Removal of subscription from User Profile gets reverted if updated" msgstr "" -#: admin/html/whats-new.php:611 -msgid "Get appropriate user id when role based conditions are present" +#: admin/html/whats-new.php:1599 +msgid "User subscription deletion gets reverted if updated is fixed." msgstr "" -#: admin/html/whats-new.php:615 -msgid "Show Invalid subscription message if wrong pack id passed" +#: admin/html/whats-new.php:1602 +msgid "Show Free pack users in subscribers list." msgstr "" -#: admin/html/whats-new.php:619 -msgid "URL field new window not working" +#: admin/html/whats-new.php:1604 +msgid "Free pack users were not showing in subscribers list, now they will." msgstr "" -#: admin/html/whats-new.php:623 -msgid "Option label not working when & use" +#: admin/html/whats-new.php:1613 +msgid "WP User Frontend Guten Block is added" msgstr "" -#: admin/html/whats-new.php:627 -msgid "Ajax type category not showing on edit" +#: admin/html/whats-new.php:1615 +msgid "" +"WPUF Form Block is now available to be used within gutenberg editor with " +"preview of the form. " msgstr "" -#: admin/html/whats-new.php:631 -msgid "Multiple file image can't select" +#: admin/html/whats-new.php:1618 +msgid "Advanced Custom Fields plugin compatibility" msgstr "" -#: admin/html/whats-new.php:635 -msgid "Subscription pack PayPal Checkout gets \"Error: Access Denied\"" +#: admin/html/whats-new.php:1620 +msgid "Now all your ACF fields can be used within WPUF Post forms. " msgstr "" -#: admin/html/whats-new.php:639 -msgid "Conflict image field with acf image field" +#: admin/html/whats-new.php:1623 +msgid "Taxonomy Terms not showing for custom post types" msgstr "" -#: admin/html/whats-new.php:643 -msgid "Missing Auckland State for New Zealand country" +#: admin/html/whats-new.php:1625 +msgid "" +"Fixed an issue with taxonomy terms not appearing for Custom Post types " +"within Form Settings and Dashboard Post Listing" msgstr "" -#: admin/html/whats-new.php:647 -msgid "Added support for WooCommerce product category value replacemen" +#: admin/html/whats-new.php:1628 +msgid "Various other code optimizations" msgstr "" -#: admin/html/whats-new.php:657 -msgid "Add character restriction feature" +#: admin/html/whats-new.php:1630 admin/html/whats-new.php:1687 +msgid "Code structure organization and optimization for better performance" msgstr "" -#: admin/html/whats-new.php:661 -msgid "Make sure post author edit link works only in frontend" +#: admin/html/whats-new.php:1639 +msgid "WoooCommerce billing address Sync" msgstr "" -#: admin/html/whats-new.php:665 -msgid "Inconsistency in lost password reset email message" +#: admin/html/whats-new.php:1641 +msgid "" +"If an existing customer has previously set his billing address, that will " +"be imported into WPUF Billing address " msgstr "" -#: admin/html/whats-new.php:669 -msgid "Saving custom taxonomy terms when input type is text" +#: admin/html/whats-new.php:1644 +msgid "Trial subscription message not showing properly" msgstr "" -#: admin/html/whats-new.php:673 -msgid "Taxonomy field JS error in builder" +#: admin/html/whats-new.php:1646 +msgid "Subscriptions with Trial now shows trial notices" msgstr "" -#: admin/html/whats-new.php:677 -msgid "Showing WPUF edit link for WP default roles" +#: admin/html/whats-new.php:1649 +msgid "Reset email Key not working" msgstr "" -#: admin/html/whats-new.php:681 -msgid "Upload button unresponsive issue in iOS" +#: admin/html/whats-new.php:1651 +msgid "Reset Email key was not working in some cases" msgstr "" -#: admin/html/whats-new.php:691 -msgid "Add post edit link for post authors in single or archive pages" +#: admin/html/whats-new.php:1654 +msgid "Post count not showing on the frontend dashboard" msgstr "" -#: admin/html/whats-new.php:695 -msgid "Enhance post delete message" +#: admin/html/whats-new.php:1656 +msgid "" +"Dashboard with multiple post type was not showing post counts properly, is " +"now fixed and shows count for each post type" msgstr "" -#: admin/html/whats-new.php:699 -msgid "Refactor control buttons visibility in form builder" +#: admin/html/whats-new.php:1659 +msgid "Login Redirect showing blank page is fixed" msgstr "" -#: admin/html/whats-new.php:703 -msgid "Add missing colons after field label" +#: admin/html/whats-new.php:1661 +msgid "" +"If \"Previous Page\" was set for redirection, login redirect was " +"redirecting to blank page for users who hit login page directly" msgstr "" -#: admin/html/whats-new.php:707 -msgid "Post edit map capability condition" +#: admin/html/whats-new.php:1670 +msgid "Enhanced Login Redirect to redirect users to previous page" msgstr "" -#: admin/html/whats-new.php:711 -msgid "Role based permission for accessing a post form" +#: admin/html/whats-new.php:1672 +msgid "" +"You can choose Previous Page as Login Redirect page settings now to " +"redirect users to the page from which they went for Login. " msgstr "" -#: admin/html/whats-new.php:715 -msgid "Section-break field alignment" +#: admin/html/whats-new.php:1675 +msgid "Email HTML links not Rendreing properly issue is fixed" msgstr "" -#: admin/html/whats-new.php:719 -msgid "Pay per post doesn't work if subscription pack is activated" +#: admin/html/whats-new.php:1677 +msgid "" +"For some clients emails were not rendering the HTML links properly, this is " +"now fixed" msgstr "" -#: admin/html/whats-new.php:723 -msgid "Mime type for uploading JSON files" +#: admin/html/whats-new.php:1680 +msgid "Form Builder : Form Field's Help text styles not showing properly" msgstr "" -#: admin/html/whats-new.php:727 -msgid "File upload with same file name" +#: admin/html/whats-new.php:1682 +msgid "Help texts styling is now fixed and much easier to read and understand" msgstr "" -#: admin/html/whats-new.php:731 -msgid "Post preview missing fields" +#: admin/html/whats-new.php:1685 +msgid "Various other code improvements" msgstr "" -#: admin/html/whats-new.php:735 -msgid "Illigal variable declartion" +#: admin/html/whats-new.php:1696 +msgid "Dashboard Post Listing now supports multiple post types" msgstr "" -#: admin/html/whats-new.php:739 -msgid "Featured image updating issue" +#: admin/html/whats-new.php:1698 +msgid "" +"Now you can show multiple post type in user dashboard using shortcode like " +"this :
    [wpuf_dashboard post_type=\"post,page,custom_type\"] " msgstr "" -#: admin/html/whats-new.php:743 -msgid "Conflict with Phlox theme" +#: admin/html/whats-new.php:1701 +msgid "Added Login Redirect Settings" msgstr "" -#: admin/html/whats-new.php:747 -msgid "Textarea custom field data sanitization" +#: admin/html/whats-new.php:1703 +msgid "" +"You can now set a page from WPUF Settings > Login/Registration > " +"Redirect after Login. When login redirection is active the user will be " +"redirected to this page after login." msgstr "" -#: admin/html/whats-new.php:751 -msgid "exclude_type warning in wpuf_category_checklist" +#: admin/html/whats-new.php:1706 +msgid "Image Upload field button text can be changed" msgstr "" -#: admin/html/whats-new.php:755 -msgid "Category field not showing all child categories for selection type child of" +#: admin/html/whats-new.php:1708 +msgid "" +"The upload button text can now be changed for image upload fields which " +"defaults to \"Select Image\" if not set. " msgstr "" -#: admin/html/whats-new.php:759 -msgid "Conflict between image and file upload custom fields" +#: admin/html/whats-new.php:1711 +msgid "Multi Step Form styles made compatible with more themes" msgstr "" -#: admin/html/whats-new.php:763 -msgid "Login url when login page is not set" +#: admin/html/whats-new.php:1713 +msgid "Multi Step form can now be styled more easily with other themes " msgstr "" -#: admin/html/whats-new.php:773 -msgid "" -"Use common names for Ivory Coast, North Korea and Sourth Korea instead of " -"their official names" +#: admin/html/whats-new.php:1716 +msgid "Required field condition for google map not working is fixed" msgstr "" -#: admin/html/whats-new.php:777 -msgid "Fix condition to use default avatar" +#: admin/html/whats-new.php:1718 +msgid "" +"If Google Map field was set as required users were able to submit form " +"without changing the default value." msgstr "" -#: admin/html/whats-new.php:781 -msgid "Make Email and URL fields clickable" +#: admin/html/whats-new.php:1727 +msgid "Admin form builder is now fully responsive." msgstr "" -#: admin/html/whats-new.php:785 -msgid "Fix redirect after user login" +#: admin/html/whats-new.php:1729 +msgid "" +"Now you can edit forms from your mobile devices directly. Our improved " +"responsive layouts of form builder makes it easy for you to build forms on " +"the go." msgstr "" -#: admin/html/whats-new.php:789 -msgid "Sanitize textarea field data" +#: admin/html/whats-new.php:1732 +msgid "Added color schemes for creating attractive form layouts." msgstr "" -#: admin/html/whats-new.php:793 +#: admin/html/whats-new.php:1734 msgid "" -"Fix missing colon to email, URL, text and textarea labels when renders " -"their data" +"We have added 3 new color schemes for the form layouts which you can choose " +"from each form's new display settings." msgstr "" -#: admin/html/whats-new.php:797 -msgid "Prevent showing empty labels for fields that have render_field_data method" +#: admin/html/whats-new.php:1737 +msgid "Restrict Free subscription pack to be enabled multiple times " msgstr "" -#: admin/html/whats-new.php:807 -msgid "Add Namibian Dollar in currency list" +#: admin/html/whats-new.php:1739 +msgid "" +"Free subscription packs now can only be purchased once and the limit " +"applies properly" msgstr "" -#: admin/html/whats-new.php:811 -msgid "Add sync values option for option data fields" +#: admin/html/whats-new.php:1742 +msgid "Various other bug fixes and improvements were made " msgstr "" -#: admin/html/whats-new.php:815 -msgid "Allow uploading image that having filesize meets php ini settings" +#: admin/html/whats-new.php:1744 +msgid "Please see the change log to see full details." msgstr "" -#: admin/html/whats-new.php:819 -msgid "Limit the selection of one image at a time" +#: admin/html/whats-new.php:1753 +msgid "Added upgrade function for default category" msgstr "" -#: admin/html/whats-new.php:823 -msgid "Use file name and size to generate hash to prevent duplicant image upload" +#: admin/html/whats-new.php:1755 +msgid "Upgrader added to upgrade previously set default post category." msgstr "" -#: admin/html/whats-new.php:827 -msgid "Sanitize text and textarea field data" +#: admin/html/whats-new.php:1758 +msgid "Subscription pack cannot be canceled" msgstr "" -#: admin/html/whats-new.php:831 +#: admin/html/whats-new.php:1760 msgid "" -"Show label instead of values for radio, checkbox, dropdown and multiselect " -"data" -msgstr "" - -#: admin/html/whats-new.php:835 -msgid "Saving custom taxonomies for type text input" +"Fixed recurring subscription pack cannot be canceled from my account page " +"in subscription details section." msgstr "" -#: admin/html/whats-new.php:839 -msgid "Admin settings link for recaptcha helper text" +#: admin/html/whats-new.php:1763 +msgid "page installer admin notice logic issue" msgstr "" -#: admin/html/whats-new.php:843 -msgid "Undefined name property for Custom HTML fields" +#: admin/html/whats-new.php:1765 +msgid "" +"Fixed page installer admin notice logic problem due to new payment settings " +"default value not set." msgstr "" -#: admin/html/whats-new.php:847 -msgid "Delete attachment process" +#: admin/html/whats-new.php:1775 +msgid "Setup Wizard" msgstr "" -#: admin/html/whats-new.php:851 -msgid "Missing billing address in invoice PDF" +#: admin/html/whats-new.php:1777 +msgid "Setup Wizard added to turn off payment options and install pages." msgstr "" -#: admin/html/whats-new.php:855 -msgid "Showing country field value in frontend post content" +#: admin/html/whats-new.php:1781 +msgid "Multi-select Category" msgstr "" -#: admin/html/whats-new.php:859 -msgid "Avatar size display not complying with admin settings size" +#: admin/html/whats-new.php:1783 +msgid "Add multi-select to default category in post form settings." msgstr "" -#: admin/html/whats-new.php:863 -msgid "Display default avatars on admin settings discussion page" +#: admin/html/whats-new.php:1787 +msgid "Select Text option for Taxonomy" msgstr "" -#: admin/html/whats-new.php:867 -msgid "Redirect to subscription page at registration" +#: admin/html/whats-new.php:1789 +msgid "" +"Add Select Text option for taxonomy fields. Now you can add default text " +"with empty value as first option for Taxonomy dropdown." msgstr "" -#: admin/html/whats-new.php:871 -msgid "Error notice regarding registration page redirect" +#: admin/html/whats-new.php:1792 +msgid "Taxonomy Checkbox Inline" msgstr "" -#: admin/html/whats-new.php:875 -msgid "Escaping html in registration errors" +#: admin/html/whats-new.php:1794 +msgid "" +"Added checkbox inline option to taxonomy checkbox. You can now display " +"Taxonomy checkbox fields inline." msgstr "" -#: admin/html/whats-new.php:879 -msgid "Default login redirect link" +#: admin/html/whats-new.php:1804 +msgid "Manage schedule for form submission" msgstr "" -#: admin/html/whats-new.php:883 -msgid "Implementing default WP login page override option" +#: admin/html/whats-new.php:1806 +msgid "" +"Do not accept form submission if the current date is not between the date " +"range of the schedule." msgstr "" -#: admin/html/whats-new.php:887 -msgid "Transparent background of autosuggestion dropdown" +#: admin/html/whats-new.php:1810 +msgid "Restrict form submission based on the user roles" msgstr "" -#: admin/html/whats-new.php:897 -msgid "Import forms system" +#: admin/html/whats-new.php:1812 +msgid "" +"Restrict form submission based on the user roles. Now you can manage user " +"role base permission on form submission." msgstr "" -#: admin/html/whats-new.php:901 -msgid "Password reset system" +#: admin/html/whats-new.php:1816 +msgid "Limit how many entries a form will accept" msgstr "" -#: admin/html/whats-new.php:905 -msgid "Updated url validation regex to support modern tlds" +#: admin/html/whats-new.php:1818 +msgid "" +"Limit how many entries a form will accept and display a custom message when " +"that limit is reached." msgstr "" -#: admin/html/whats-new.php:909 -msgid "Export WPUF forms individually from admin tools page" +#: admin/html/whats-new.php:1822 +msgid "Show/hide Admin Bar" msgstr "" -#: admin/html/whats-new.php:913 -msgid "Subscription cycle label translation issue" +#: admin/html/whats-new.php:1824 +msgid "Control the admin bar visibility based on user roles." msgstr "" -#: admin/html/whats-new.php:917 -msgid "ACF integration for checkbox fields" +#: admin/html/whats-new.php:1828 +msgid "Ajax Login widget" msgstr "" -#: admin/html/whats-new.php:921 -msgid "Illegal string offset warning while updating settings" +#: admin/html/whats-new.php:1830 +msgid "" +"Login user is more simple now with Ajax Login Widget. The simple ajax login " +"form do not required page loading for login." msgstr "" -#: admin/html/whats-new.php:925 -msgid "Conditional logic for Section Break field" +#: admin/html/whats-new.php:1834 +msgid "Form submission with Captcha field" msgstr "" -#: admin/html/whats-new.php:929 -msgid "Subscriptions cannot be deleted from backend" +#: admin/html/whats-new.php:1836 +msgid "Form field validation process updated if form submits with captcha field." msgstr "" -#: admin/html/whats-new.php:933 -msgid "A regression regarding saving checkbox data" +#: admin/html/whats-new.php:1850 +msgid "What's New in WPUF?" msgstr "" -#: admin/html/whats-new.php:937 -msgid "Default value of multi-select fields is not showing" +#: admin/installer.php:27 includes/Admin/Admin_Installer.php:28 +msgid "" +"If you have not created WP User Frontend pages yet, you " +"can do this by one click." msgstr "" -#: admin/html/whats-new.php:947 -msgid "Hide post edit option when subscription is expired" +#: admin/installer.php:30 includes/Admin/Admin_Installer.php:34 +#: includes/Admin/Admin_Tools.php:341 includes/Setup_Wizard.php:324 +msgid "Install WPUF Pages" msgstr "" -#: admin/html/whats-new.php:949 -msgid "Hide post edit option from users whose subscription pack is expired." +#: admin/installer.php:31 includes/Admin/Admin_Installer.php:36 +msgid "or" msgstr "" -#: admin/html/whats-new.php:952 -msgid "Check files to prevent duplicity in media upload" +#: admin/installer.php:32 includes/Admin/Admin_Installer.php:38 +msgid "Skip Setup" msgstr "" -#: admin/html/whats-new.php:954 -msgid "" -"A simple measure has been taken to prevent maliciously flooding the site by " -"uploading same file multiple times. Though this won't work with already " -"uploaded medias." +#: admin/installer.php:42 includes/Admin/Admin_Installer.php:48 +msgid "Congratulations!" msgstr "" -#: admin/html/whats-new.php:957 -msgid "Refactor address fields in Account section" +#: admin/installer.php:84 includes/Admin/Admin_Installer.php:86 +#: includes/Admin/Shortcodes_Button.php:85 +#: includes/functions/settings-options.php:24 wpuf-functions.php:2086 +msgid "Dashboard" msgstr "" -#: admin/html/whats-new.php:959 -msgid "Address edit section from Account section has been rewritten to improve UX." +#: admin/installer.php:85 includes/Admin/Admin_Installer.php:87 +#: includes/Admin/Shortcodes_Button.php:89 +msgid "Account" msgstr "" -#: admin/html/whats-new.php:962 -msgid "Update Paypal payment gateway" +#: admin/installer.php:86 class/subscription.php:466 +#: includes/Admin/Admin_Installer.php:88 includes/Admin/Forms/Admin_Form.php:80 +#: includes/Admin/Forms/Admin_Form.php:119 +#: includes/Admin/Forms/Post/Templates/List_Table_Admin_Post_Forms.php:416 +#: includes/Admin/Shortcodes_Button.php:93 includes/Admin/Subscription.php:464 +#: includes/functions/user/edit-user.php:102 +msgid "Edit" msgstr "" -#: admin/html/whats-new.php:964 -msgid "Paypal payment gateway has seen some improvements." +#: admin/installer.php:89 includes/Admin/Admin_Installer.php:90 +#: includes/Admin/Shortcodes_Button.php:97 +#: includes/Widgets/Login_Widget.php:262 +msgid "Login" msgstr "" -#: admin/html/whats-new.php:967 -msgid "Default Category selection improvements" +#: admin/installer.php:95 class/subscription.php:441 class/subscription.php:461 +#: class/subscription.php:462 class/subscription.php:463 +#: includes/Admin/Admin_Installer.php:94 +#: includes/Admin/Shortcodes_Button.php:105 includes/Admin/Subscription.php:439 +#: includes/Admin/Subscription.php:459 includes/Admin/Subscription.php:460 +#: includes/Admin/Subscription.php:461 wpuf-functions.php:2069 +msgid "Subscription" msgstr "" -#: admin/html/whats-new.php:969 -msgid "" -"An intuitive way of selecting default category of a selected post type has " -"been introduced." +#: admin/installer.php:95 includes/Admin/Admin_Installer.php:95 +msgid "[wpuf_sub_pack]" msgstr "" -#: admin/html/whats-new.php:972 -msgid "Compatibility issue with ACF date time field" +#: admin/installer.php:96 includes/Admin/Admin_Installer.php:96 +#: templates/dashboard/list.php:16 templates/dashboard/posts.php:106 +msgid "Payment" msgstr "" -#: admin/html/whats-new.php:974 -msgid "A Compatibility issue with ACF date time field has been addressed." +#: admin/installer.php:96 includes/Admin/Admin_Installer.php:97 +msgid "Please select a gateway for payment" msgstr "" -#: admin/html/whats-new.php:977 -msgid "Media title, caption & description not saving" +#: admin/installer.php:97 includes/Admin/Admin_Installer.php:98 +msgid "Thank You" msgstr "" -#: admin/html/whats-new.php:979 +#: admin/installer.php:97 includes/Admin/Admin_Installer.php:99 msgid "" -"Media title, caption & description were not saving from frontend. They will " -"now." +"

    Payment is complete

    Congratulations, your payment has been " +"completed!

    " msgstr "" -#: admin/html/whats-new.php:982 -msgid "" -"The Events Calendar venue and organizer fields issue in WPUF Custom Fields " -"metabox" +#: admin/installer.php:98 includes/Admin/Admin_Installer.php:101 +msgid "Order Received" msgstr "" -#: admin/html/whats-new.php:984 +#: admin/installer.php:98 includes/Admin/Admin_Installer.php:102 msgid "" -"A workaround has been introduced to save The Events Calendar Venue and " -"Organizer fields properly from WPUF Custom Fields metabox." +"Hi, we have received your order. We will validate the order and will take " +"necessary steps to move forward." msgstr "" -#: admin/html/whats-new.php:987 -msgid "Checkbox data not saving from WPUF Custom Fields metabox" +#: admin/installer.php:184 includes/Admin/Admin_Installer.php:177 +#: includes/Admin/Shortcodes_Button.php:101 +msgid "Registration" msgstr "" -#: admin/html/whats-new.php:989 -msgid "" -"Checkboxe data from WPUF Custom Fields metabox were not saving. It has been " -"fixed." +#: admin/installer.php:193 includes/Admin/Admin_Installer.php:186 +msgid "Sample Form" msgstr "" -#: admin/html/whats-new.php:992 -msgid "Multi-column Repeater field data saving issue" +#: admin/posting.php:74 class/render-form.php:1688 +#: includes/Admin/Posting.php:61 includes/Admin.php:109 +#: includes/Frontend.php:74 includes/Render_Form.php:1545 +msgid "Are you sure?" msgstr "" -#: admin/html/whats-new.php:994 -msgid "" -"Multi-column Repeater field data from a form was not saving. It has been " -"fixed." +#: admin/posting.php:75 includes/Admin/Forms/Admin_Form_Builder.php:290 +#: includes/Admin/Posting.php:62 includes/Admin.php:110 +#: includes/Frontend.php:75 +msgid "Yes, delete it" msgstr "" -#: admin/html/whats-new.php:997 -msgid "Multistep form conflict with Elementor" +#: admin/posting.php:76 includes/Admin/Forms/Admin_Form_Builder.php:291 +#: includes/Admin/Posting.php:63 includes/Admin.php:111 +#: includes/Frontend.php:76 +msgid "No, cancel it" msgstr "" -#: admin/html/whats-new.php:999 -msgid "Multistep form had a conflict with Elementor. It has been fixed." +#: admin/posting.php:82 includes/Admin/Posting.php:69 includes/Admin.php:119 +#: includes/Frontend.php:86 +msgid "Allowed Files" msgstr "" -#: admin/html/whats-new.php:1002 -msgid "Multiple images showing issue in frontend" +#: admin/posting.php:85 includes/Admin/Posting.php:72 includes/Admin.php:125 +#: includes/Frontend.php:92 +msgid "Maximum number of files reached!" msgstr "" -#: admin/html/whats-new.php:1004 -msgid "Multiple images in a post were not showing in frontend. Now they will." +#: admin/posting.php:86 includes/Admin/Posting.php:73 includes/Admin.php:126 +#: includes/Frontend.php:93 +msgid "The file you have uploaded exceeds the file size limit. Please try again." msgstr "" -#: admin/html/whats-new.php:1013 -msgid "Nonce not verify on login" +#: admin/posting.php:87 includes/Admin/Posting.php:74 includes/Admin.php:127 +#: includes/Frontend.php:97 +msgid "You have uploaded an incorrect file type. Please try again." msgstr "" -#: admin/html/whats-new.php:1015 -msgid "Return of function wp_verify_nonce() was ignored." +#: admin/posting.php:106 includes/Admin/Posting.php:93 +msgid "WPUF Form" msgstr "" -#: admin/html/whats-new.php:1024 -msgid "Option to set which tab shows as active on the account page" +#: admin/posting.php:134 includes/Admin/Posting.php:121 +msgid "Learn more" msgstr "" -#: admin/html/whats-new.php:1026 -msgid "" -"Option to set which tab shows as active on the account page. To configure " -"this setting navigate to wp-admin->User Frontend->Settings->My " -"Account->Active Tab " +#: admin/posting.php:181 includes/Admin/Posting.php:168 +msgid "WPUF Lock User" msgstr "" -#: admin/html/whats-new.php:1029 -msgid "Unlock option was unavailable after the post being locked" +#: admin/posting.php:207 includes/Admin/Posting.php:194 +msgid "" +"Post is locked, to allow user to edit this post Click here" msgstr "" -#: admin/html/whats-new.php:1031 -msgid "Unlock option was unavailable after the post being locked." +#: admin/posting.php:214 includes/Admin/Posting.php:201 +msgid "" +"Frontend edit access for this post will be automatically locked after %s, " +"Clear Lock Or," msgstr "" -#: admin/html/whats-new.php:1034 -msgid "Gutenberg block of WPUF didn't work on bedrock installation" +#: admin/posting.php:235 includes/Admin/Posting.php:222 +msgid "Lock Post Permanently" msgstr "" -#: admin/html/whats-new.php:1036 -msgid "Gutenberg block of WPUF didn't work on bedrock installation." +#: admin/posting.php:240 includes/Admin/Posting.php:227 +msgid "Lock user from editing this post from the frontend dashboard" msgstr "" -#: admin/html/whats-new.php:1039 -msgid "Sending admin payment received email twice" +#: admin/posting.php:291 includes/Admin/Posting.php:278 +msgid "WPUF Custom Fields" msgstr "" -#: admin/html/whats-new.php:1041 -msgid "" -"After processing payment admin & user was receiving payment received email " -"twice." +#: admin/posting.php:348 includes/Admin/Posting.php:335 +msgid "No custom fields found." msgstr "" -#: admin/html/whats-new.php:1044 -msgid "" -"Add shortcode support to display post information in the Post Expiration " -"Message" +#: admin/posting.php:543 includes/Admin/Posting.php:530 +#: includes/Admin/Promotion.php:216 includes/Admin/Promotion.php:220 +#: includes/Admin/Promotion.php:224 includes/Admin/Promotion.php:301 +#: includes/Admin/Promotion.php:305 includes/Admin/Promotion.php:309 +#: includes/Admin/Whats_New.php:156 +#: includes/Ajax/Admin_Form_Builder_Ajax.php:27 +#: includes/Ajax/Admin_Form_Builder_Ajax.php:31 +#: includes/Ajax/Admin_Form_Builder_Ajax.php:78 +#: includes/Ajax/Admin_Form_Builder_Ajax.php:82 +#: includes/Integrations/WPUF_ACF_Compatibility.php:76 +#: includes/Integrations/WPUF_ACF_Compatibility.php:94 +#: includes/Integrations/WPUF_ACF_Compatibility.php:160 +#: includes/class-frontend-render-form.php:228 +msgid "Unauthorized operation" msgstr "" -#: admin/html/whats-new.php:1046 -msgid "" -"Add shortcode support to display post information in the Post Expiration " -"Message. You can use: {post_author} {post_url} {blogname} " -"{post_title} {post_status}" +#: admin/template-post.php:36 includes/Admin/Forms/Template_Post.php:39 +#: includes/Fields/Form_Field_Post_Content.php:145 +msgid "Enable Image Insertion" msgstr "" -#: admin/html/whats-new.php:1049 -msgid "Add optin on the setup wizard" +#: admin/template-post.php:42 includes/Admin/Forms/Template_Post.php:46 +#: includes/Fields/Form_Field_Post_Content.php:147 +msgid "Enable image upload in post area" msgstr "" -#: admin/html/whats-new.php:1051 -msgid "" -"Added optin on the setup wizard, admin can choose whether he/she wants to " -"share server environment details (php, mysql, server, WordPress versions), " -"Number of users, Site language, Number of active and inactive plugins, Site " -"name and url, admin name and email address. No sensitive data is tracked" +#: admin/template-post.php:88 admin/template.php:608 +#: includes/Admin/Forms/Admin_Template.php:694 +#: includes/Admin/Forms/Template_Post.php:92 +#: includes/Fields/Form_Field_Featured_Image.php:120 +#: includes/Fields/Form_Field_Image.php:105 +msgid "Enter maximum upload size limit in KB" msgstr "" -#: admin/html/whats-new.php:1060 -msgid "Post Owner problem" +#: admin/template-post.php:99 admin/template.php:619 +#: includes/Admin/Forms/Admin_Template.php:705 +#: includes/Admin/Forms/Template_Post.php:103 +#: includes/Fields/Form_Field_Featured_Image.php:116 +#: includes/Fields/Form_Field_Image.php:101 +msgid "Max. file size" msgstr "" -#: admin/html/whats-new.php:1062 -msgid "" -"Posts were not assigned to the selected default post owner, this issue has " -"been fixed." +#: admin/template-post.php:147 includes/Admin/Forms/Template_Post.php:151 +#: includes/Fields/Field_Contract.php:442 +msgid "Type" msgstr "" -#: admin/html/whats-new.php:1065 -msgid "Google reCaptcha was not working" +#: admin/template-post.php:149 includes/Admin/Forms/Template_Post.php:153 +#: includes/Fields/Form_Field_Dropdown.php:11 +#: includes/Fields/Form_Field_Dropdown.php:105 +msgid "Dropdown" msgstr "" -#: admin/html/whats-new.php:1067 -msgid "" -"Google reCaptcha was not working, users could submit the form without " -"reCaptcha validation." +#: admin/template-post.php:150 includes/Admin/Forms/Template_Post.php:156 +#: includes/Fields/Field_Contract.php:446 +#: includes/Fields/Form_Field_MultiDropdown.php:11 +#: includes/Fields/Form_Field_MultiDropdown.php:81 +msgid "Multi Select" msgstr "" -#: admin/html/whats-new.php:1076 -msgid "Added column field" +#: admin/template-post.php:151 includes/Admin/Forms/Template_Post.php:159 +#: includes/Fields/Field_Contract.php:447 +#: includes/Fields/Form_Field_Checkbox.php:11 +msgid "Checkbox" msgstr "" -#: admin/html/whats-new.php:1081 -msgid "Unable to render the events on the front-end dashboard" +#: admin/template-post.php:152 includes/Admin/Forms/Template_Post.php:162 +#: includes/Fields/Field_Contract.php:448 +msgid "Text Input" msgstr "" -#: admin/html/whats-new.php:1083 -msgid "" -"On the frontend dashboard, the submitted events were not showing, you will " -"get it fixed in this version." +#: admin/template-post.php:153 includes/Admin/Forms/Template_Post.php:165 +#: includes/Fields/Field_Contract.php:449 +msgid "Ajax" msgstr "" -#: admin/html/whats-new.php:1086 -msgid "Page order getting 0(zero) after editing from the frontend" +#: admin/template-post.php:158 includes/Admin/Forms/Template_Post.php:172 +#: includes/Fields/Field_Contract.php:482 +msgid "Order By" msgstr "" -#: admin/html/whats-new.php:1088 -msgid "" -"Page order was not saving while editing a post using WPUF form, it has been " -"fixed." +#: admin/template-post.php:161 includes/Admin/Forms/Template_Post.php:177 +#: includes/Fields/Field_Contract.php:486 +msgid "Term ID" msgstr "" -#: admin/html/whats-new.php:1091 -msgid "Text input field for taxonomies not working" +#: admin/template-post.php:162 includes/Admin/Forms/Template_Post.php:180 +#: includes/Fields/Field_Contract.php:487 +msgid "Slug" msgstr "" -#: admin/html/whats-new.php:1093 -msgid "" -"When taxonomy field type is set to `Text Input` then a fatal error was " -"showing on the frontend, no error with taxonomy field in the latest version." +#: admin/template-post.php:163 includes/Admin/Forms/Template_Post.php:183 +#: includes/Fields/Field_Contract.php:488 +msgid "Count" msgstr "" -#: admin/html/whats-new.php:1096 -msgid "" -"In radio and checkbox field use conditional logic that value does not save " -"in database" +#: admin/template-post.php:164 includes/Admin/Forms/Template_Post.php:186 +#: includes/Fields/Field_Contract.php:489 +msgid "Term Group" msgstr "" -#: admin/html/whats-new.php:1098 -msgid "" -"The selected value of radio and checkbox field were not showing while " -"editing posts from the backend or frontend, you can see the selected value " -"in this version." +#: admin/template-post.php:169 includes/Admin/Forms/Template_Post.php:193 +#: includes/Fields/Field_Contract.php:498 +msgid "Order" msgstr "" -#: admin/html/whats-new.php:1101 -msgid "The args param not working with get_avatar filter" +#: admin/template-post.php:171 includes/Admin/Forms/Template_Post.php:195 +#: includes/Fields/Field_Contract.php:502 +msgid "ASC" msgstr "" -#: admin/html/whats-new.php:1103 -msgid "The args parameter did not exist with get_avatar filter, which now exists." +#: admin/template-post.php:172 includes/Admin/Forms/Template_Post.php:198 +#: includes/Fields/Field_Contract.php:503 +msgid "DESC" msgstr "" -#: admin/html/whats-new.php:1106 -msgid "The item in ajax taxonomy field was not selected" +#: admin/template-post.php:177 includes/Admin/Forms/Template_Post.php:205 +#: includes/Fields/Field_Contract.php:512 +msgid "Selection Type" msgstr "" -#: admin/html/whats-new.php:1108 -msgid "" -"When the taxonomy field type is set to Ajax, the submitted terms were not " -"showing in the backend and frontend which have been fixed." +#: admin/template-post.php:179 includes/Admin/Forms/Template_Post.php:207 +#: includes/Fields/Field_Contract.php:515 +msgid "Exclude" msgstr "" -#: admin/html/whats-new.php:1117 -msgid "Unable to send new user registration email" +#: admin/template-post.php:180 includes/Admin/Forms/Template_Post.php:210 +#: includes/Fields/Field_Contract.php:516 +msgid "Include" msgstr "" -#: admin/html/whats-new.php:1119 -msgid "" -"WP User Frontend default registration form `[wpuf-registration]` was unable " -"to send the new user registration email." +#: admin/template-post.php:181 includes/Admin/Forms/Template_Post.php:213 +#: includes/Fields/Field_Contract.php:517 +msgid "Child of" msgstr "" -#: admin/html/whats-new.php:1122 -msgid "WPUF forms block compatibility issue with the latest WP version" +#: admin/template-post.php:186 includes/Admin/Forms/Template_Post.php:220 +msgid "Selection terms" msgstr "" -#: admin/html/whats-new.php:1124 -msgid "" -"With the latest version of WordPress the gutenberg block of WP User " -"Frontend were not working. In this version, you will get it fixed." +#: admin/template-post.php:187 includes/Admin/Forms/Template_Post.php:222 +msgid "Search the terms name." msgstr "" -#: admin/html/whats-new.php:1127 -msgid "Page not update where `[wpuf_dashboard]` shortcode exist" +#: admin/template-post.php:191 includes/Admin/Forms/Template_Post.php:227 +msgid "WooCommerce Attribute" msgstr "" -#: admin/html/whats-new.php:1129 -msgid "" -"While using Gutenberg, the page were not being updated with WPUF shortcode " -"[wpuf dashboard]" +#: admin/template-post.php:197 includes/Admin/Forms/Template_Post.php:234 +#: includes/Fields/Field_Contract.php:539 +msgid "This taxonomy is a WooCommerce attribute" msgstr "" -#: admin/html/whats-new.php:1132 -msgid "Retain default when determining whether to display the admin bar" +#: admin/template-post.php:203 includes/Admin/Forms/Template_Post.php:240 +#: includes/Fields/Field_Contract.php:347 +#: includes/Fields/Form_Field_Column.php:107 +msgid "Visibility" msgstr "" -#: admin/html/whats-new.php:1134 -msgid "" -"From the User Frontend Settings, set that Administrator, Editor, Vendor can " -"see the admin bar. Now, the super admin want, one specific user ( who has " -"the user role from the above ) can't see the admin bar and disabled it from " -"the Toolbar form that specific user profile. And this configuration ( " -"Toolbar ) from the specific user profile were unable to impact on the " -"frontend." +#: admin/template-post.php:209 includes/Admin/Forms/Template_Post.php:247 +#: includes/Fields/Field_Contract.php:550 +msgid "Visible on product page" msgstr "" -#: admin/html/whats-new.php:1137 -msgid "Fatal error when use PHP lower version (5.4 or lower)" +#: admin/template-post.php:247 includes/Admin/Forms/Template_Post.php:294 +msgid "all" msgstr "" -#: admin/html/whats-new.php:1139 -msgid "" -"It was unable to install WP User Frontend with PHP 5.4 or lower version. " -"Here is the error details:

    Fatal error: Can't use method " -"return value in write context in " -"/wp-user-frontend/class/frontend-form-post.php on line 194" +#: admin/template-post.php:247 includes/Admin/Forms/Template_Post.php:296 +msgid "Show All" msgstr "" -#: admin/html/whats-new.php:1142 -msgid "Product form was unable to show the single gallery image" +#: admin/template-post.php:250 includes/Admin/Forms/Template_Post.php:302 +msgid "hide" msgstr "" -#: admin/html/whats-new.php:1144 -msgid "" -"When user upload single image for product gallery using WPUF WooCommerce " -"product form, that image were not showing on the frontend." +#: admin/template-post.php:250 includes/Admin/Forms/Template_Post.php:304 +msgid "Hide These Countries" msgstr "" -#: admin/html/whats-new.php:1153 -msgid "WooCommerce gallery images not getting saved" +#: admin/template-post.php:251 includes/Admin/Forms/Template_Post.php:308 +msgid "Chose Country to hide from List" msgstr "" -#: admin/html/whats-new.php:1155 -msgid "" -"After releasing version 2.9.3, WooCommerce gallery image field stopped " -"working. You will get it fixed in this version." +#: admin/template-post.php:255 includes/Admin/Forms/Template_Post.php:315 +msgid "show" msgstr "" -#: admin/html/whats-new.php:1164 -msgid "The Events Calendar Integration Form" +#: admin/template-post.php:255 includes/Admin/Forms/Template_Post.php:317 +msgid "Show These Countries" msgstr "" -#: admin/html/whats-new.php:1166 -msgid "" -"Now admin can allow users to create event from the frontend. Currently WPUF " -"has a one click pre-build event form that has been integrated with The " -"Events Calendar plugin" +#: admin/template-post.php:256 includes/Admin/Forms/Template_Post.php:322 +msgid "Add Country to List" msgstr "" -#: admin/html/whats-new.php:1169 -msgid "Post Submission Facility From Account Page" +#: admin/template.php:20 includes/Admin/Forms/Admin_Template.php:22 +msgid "Click and Drag to rearrange" msgstr "" -#: admin/html/whats-new.php:1171 -msgid "" -"On the frontend account page, added a new menu item named Submit " -"Post. Now admin can allow users to submit post from their default " -"account page. As an admin you can disable or enable this option from " -"User Frontend -> Settings -> My Account -> Post Submission, Also, " -"you can assign any post form that will use to submit posts." +#: admin/template.php:24 includes/Admin/Forms/Admin_Template.php:27 +#: includes/Traits/TaxableTrait.php:192 +msgid "Remove" msgstr "" -#: admin/html/whats-new.php:1174 -msgid "Login/Lost Password Link Under Registration Form" +#: admin/template.php:25 includes/Admin/Forms/Admin_Template.php:28 +msgid "Toggle" msgstr "" -#: admin/html/whats-new.php:1176 -msgid "Added Login/Lost Password link under registration form" +#: admin/template.php:60 includes/Admin/Customizer_Options.php:121 +#: includes/Admin/Forms/Admin_Template.php:61 +#: includes/Fields/Field_Contract.php:296 +msgid "Required" msgstr "" -#: admin/html/whats-new.php:1185 -msgid "Added drag and drop image ordering on image upload" +#: admin/template.php:69 includes/Admin/Forms/Admin_Template.php:74 +#: includes/Fields/Field_Contract.php:278 +msgid "Field Label" msgstr "" -#: admin/html/whats-new.php:1187 -msgid "" -"Now frontend users can drag & drop the images/files to change the order " -"while uploading." +#: admin/template.php:70 includes/Admin/Forms/Admin_Template.php:77 +#: includes/Fields/Field_Contract.php:282 +msgid "Enter a title of this field" msgstr "" -#: admin/html/whats-new.php:1190 -msgid "Added reCAPTCHA field in login form" +#: admin/template.php:75 admin/template.php:550 +#: includes/Admin/Forms/Admin_Template.php:82 +#: includes/Admin/Forms/Admin_Template.php:627 +#: includes/Fields/Field_Contract.php:365 +#: includes/Fields/Form_Field_Hidden.php:41 +msgid "Meta Key" msgstr "" -#: admin/html/whats-new.php:1192 -msgid "" -"Admin has the option to show reCAPTCHA field in login form. Check the " -"related settings from User Frontend > Settings > " -"Login/Registration" +#: admin/template.php:76 admin/template.php:551 +#: includes/Admin/Forms/Admin_Template.php:85 +#: includes/Admin/Forms/Admin_Template.php:630 +#: includes/Fields/Field_Contract.php:369 +#: includes/Fields/Form_Field_Hidden.php:45 +msgid "Name of the meta key this field will save to" msgstr "" -#: admin/html/whats-new.php:1195 -msgid "Added preview option in forms" +#: admin/template.php:87 includes/Admin/Forms/Admin_Template.php:99 +#: includes/Fields/Field_Contract.php:287 +msgid "Help text" msgstr "" -#: admin/html/whats-new.php:1197 -msgid "" -"You can see a nice Preview button with Save " -"Form button, admin can take a quick look of the form without using " -"shortcode" +#: admin/template.php:88 includes/Admin/Forms/Admin_Template.php:100 +#: includes/Fields/Field_Contract.php:291 +msgid "Give the user some information about this field" msgstr "" -#: admin/html/whats-new.php:1200 -msgid "Fixed hiding “Select Image” button while uploading multiple images." +#: admin/template.php:92 includes/Admin/Forms/Admin_Template.php:106 +#: includes/Fields/Field_Contract.php:326 +#: includes/Fields/Form_Field_Column.php:95 +msgid "CSS Class Name" msgstr "" -#: admin/html/whats-new.php:1202 -msgid "" -"The upload button will not be hidden until the user selects max number of " -"files " +#: admin/template.php:93 includes/Admin/Forms/Admin_Template.php:109 +msgid "Add a CSS class name for this field" msgstr "" -#: admin/html/whats-new.php:1205 -msgid "Added form limit notice before form submission" +#: admin/template.php:117 admin/template.php:175 +#: includes/Admin/Forms/Admin_Template.php:132 +#: includes/Admin/Forms/Admin_Template.php:200 +#: includes/Fields/Field_Contract.php:578 +#: includes/Fields/Field_Contract.php:662 +msgid "Placeholder text" msgstr "" -#: admin/html/whats-new.php:1207 -msgid "" -"Limit notice message was showing after submission, now it is showing when " -"rendering the form" +#: admin/template.php:118 includes/Admin/Forms/Admin_Template.php:134 +#: includes/Fields/Field_Contract.php:584 +#: includes/Fields/Field_Contract.php:666 +msgid "Text for HTML5 placeholder attribute" msgstr "" -#: admin/html/whats-new.php:1210 -msgid "Fixed: default post category not saving" +#: admin/template.php:122 admin/template.php:180 +#: includes/Admin/Forms/Admin_Template.php:139 +#: includes/Admin/Forms/Admin_Template.php:206 +#: includes/Fields/Field_Contract.php:589 +#: includes/Fields/Field_Contract.php:674 +msgid "Default value" msgstr "" -#: admin/html/whats-new.php:1212 -msgid "" -"From the form Settings > Post Settings, default post " -"category options were not saving. Now, it's fixed." +#: admin/template.php:123 includes/Admin/Forms/Admin_Template.php:141 +#: includes/Fields/Field_Contract.php:595 +#: includes/Fields/Field_Contract.php:678 +msgid "The default value this field will have" msgstr "" -#: admin/html/whats-new.php:1215 -msgid "" -"WPUF dashboard shortcode with form_id attribute was not showing posts " -"properly" +#: admin/template.php:127 includes/Admin/Forms/Admin_Template.php:146 +#: includes/Fields/Field_Contract.php:600 +msgid "Size" msgstr "" -#: admin/html/whats-new.php:1217 -msgid "" -"Now you can list posts on the frontend by using form_id " -"attribute with [wpuf_dashboard] shortcode" +#: admin/template.php:128 includes/Admin/Forms/Admin_Template.php:148 +#: includes/Fields/Field_Contract.php:605 +msgid "Size of this input field" msgstr "" -#: admin/html/whats-new.php:1226 -msgid "Changed text domain to `wp-user-frontend` from `wpuf` " +#: admin/template.php:132 admin/template.php:195 +#: includes/Admin/Forms/Admin_Template.php:153 +#: includes/Admin/Forms/Admin_Template.php:228 +msgid "Word Restriction" msgstr "" -#: admin/html/whats-new.php:1228 -msgid "" -"If you are using other language than English. Please rename your " -".po and .mo files to `wp-user-frontend_` from `wpuf_`
    This " -"change was made to support translations from translate.wordpress.org" +#: admin/template.php:136 admin/template.php:199 +#: includes/Admin/Forms/Admin_Template.php:158 +#: includes/Admin/Forms/Admin_Template.php:233 +msgid "Numebr of words the author to be restricted in" msgstr "" -#: admin/html/whats-new.php:1231 -msgid "Added WP User Frontend Data export and erase functionality." +#: admin/template.php:165 includes/Admin/Forms/Admin_Template.php:188 +#: includes/Fields/Field_Contract.php:644 +msgid "Rows" msgstr "" -#: admin/html/whats-new.php:1233 -msgid "Added functionality to export WP User Frontend Data to comply with GDPR." +#: admin/template.php:170 includes/Admin/Forms/Admin_Template.php:194 +#: includes/Fields/Field_Contract.php:653 +#: includes/Fields/Form_Field_Column.php:11 +msgid "Columns" msgstr "" -#: admin/html/whats-new.php:1236 -msgid "Added billing address customizer." +#: admin/template.php:185 includes/Admin/Forms/Admin_Template.php:212 +#: includes/Fields/Field_Contract.php:683 +#: includes/Fields/Form_Field_Textarea.php:12 +#: includes/Fields/Form_Field_Textarea.php:125 +msgid "Textarea" msgstr "" -#: admin/html/whats-new.php:1238 -msgid "Added customizer options for billing address in payment page." +#: admin/template.php:188 includes/Admin/Forms/Admin_Template.php:217 +#: includes/Fields/Field_Contract.php:686 +msgid "Normal" msgstr "" -#: admin/html/whats-new.php:1241 -msgid "Make the payment page responsive." +#: admin/template.php:189 includes/Admin/Forms/Admin_Template.php:220 +#: includes/Fields/Field_Contract.php:687 +msgid "Rich textarea" msgstr "" -#: admin/html/whats-new.php:1243 -msgid "Some css adjustments are made in payment page to make it responsive." +#: admin/template.php:190 includes/Admin/Forms/Admin_Template.php:223 +#: includes/Fields/Field_Contract.php:688 +msgid "Teeny Rich textarea" msgstr "" -#: admin/html/whats-new.php:1246 -msgid "Fixed image upload issue in Safari." +#: admin/template.php:285 includes/Admin/Forms/Admin_Template.php:333 +msgid "show values" msgstr "" -#: admin/html/whats-new.php:1248 -msgid "Images were not showing after upload in safari, it is fixed now." +#: admin/template.php:377 admin/template.php:401 admin/template.php:432 +#: admin/template.php:463 includes/Admin/Forms/Admin_Template.php:437 +#: includes/Admin/Forms/Admin_Template.php:461 +#: includes/Admin/Forms/Admin_Template.php:498 +#: includes/Admin/Forms/Admin_Template.php:535 +#: includes/Fields/Field_Contract.php:626 templates/dashboard/list.php:19 +#: templates/dashboard/posts.php:109 +msgid "Options" msgstr "" -#: admin/html/whats-new.php:1251 -msgid "Post update issue after updating or removing post images." +#: admin/template.php:417 admin/template.php:448 +#: includes/Admin/Forms/Admin_Template.php:478 +#: includes/Admin/Forms/Admin_Template.php:515 +#: includes/Fields/Field_Contract.php:462 +#: includes/Fields/Form_Field_Dropdown.php:89 +msgid "" +"First element of the select dropdown. Leave this empty if you don't want to " +"show this field" msgstr "" -#: admin/html/whats-new.php:1253 -msgid "" -"Posts cannot be updated after updating or removing post images, it is fixed " -"now." +#: admin/template.php:427 admin/template.php:458 +#: includes/Admin/Forms/Admin_Template.php:492 +#: includes/Admin/Forms/Admin_Template.php:529 +#: includes/Fields/Field_Contract.php:458 +#: includes/Fields/Form_Field_Dropdown.php:85 +msgid "Select Text" msgstr "" -#: admin/html/whats-new.php:1262 -msgid "Allow overriding form input styles using theme styling." +#: admin/template.php:520 admin/template.php:578 admin/template.php:656 +#: includes/Admin/Forms/Admin_Template.php:592 +#: includes/Admin/Forms/Admin_Template.php:661 +#: includes/Admin/Forms/Admin_Template.php:746 +#: includes/Ajax/Upload_Ajax.php:236 +#: includes/Fields/Form_Field_SectionBreak.php:58 +#: includes/Fields/Form_Field_reCaptcha.php:150 templates/dashboard/list.php:10 +#: templates/dashboard/posts.php:100 wpuf-functions.php:1052 +msgid "Title" msgstr "" -#: admin/html/whats-new.php:1264 -msgid "Overriding form input styles using theme style is now possible." +#: admin/template.php:525 includes/Admin/Forms/Admin_Template.php:599 +msgid "HTML Codes" msgstr "" -#: admin/html/whats-new.php:1267 -msgid "Fixed Auto Login after registration." +#: admin/template.php:557 includes/Admin/Forms/Admin_Template.php:638 +#: includes/Fields/Form_Field_Hidden.php:50 +msgid "Meta Value" msgstr "" -#: admin/html/whats-new.php:1269 -msgid "Auto Login after registration was not working is fixed now." +#: admin/template.php:558 includes/Admin/Forms/Admin_Template.php:640 +#: includes/Fields/Form_Field_Hidden.php:54 +msgid "Enter the meta value" msgstr "" -#: admin/html/whats-new.php:1272 -msgid "Fixed fallback cost calculation" +#: admin/template.php:583 includes/Admin/Forms/Admin_Template.php:668 +#: includes/Ajax/Upload_Ajax.php:244 +#: includes/Fields/Form_Field_SectionBreak.php:66 wpuf-functions.php:1060 +msgid "Description" msgstr "" -#: admin/html/whats-new.php:1274 -msgid "Fallback cost calculation was inaccurate for some cases, it is fixed now." +#: admin/template.php:609 includes/Admin/Forms/Admin_Template.php:695 +#: includes/Fields/Form_Field_Image.php:114 +msgid "Number of images can be uploaded" msgstr "" -#: admin/html/whats-new.php:1277 -msgid "Removal of subscription from User Profile gets reverted if updated" +#: admin/template.php:624 includes/Admin/Forms/Admin_Template.php:711 +#: includes/Fields/Form_Field_Image.php:110 +msgid "Max. files" msgstr "" -#: admin/html/whats-new.php:1279 -msgid "User subscription deletion gets reverted if updated is fixed." +#: admin/template.php:662 includes/Admin/Forms/Admin_Template.php:756 +msgid "" +"Insert your public key and private key in plugin settings. " +"Register first if you don't have any keys." msgstr "" -#: admin/html/whats-new.php:1282 -msgid "Show Free pack users in subscribers list." +#: admin/template.php:668 includes/Admin/Forms/Admin_Template.php:768 +msgid "reCaptcha type" msgstr "" -#: admin/html/whats-new.php:1284 -msgid "Free pack users were not showing in subscribers list, now they will." +#: admin/template.php:672 includes/Admin/Forms/Admin_Template.php:774 +#: includes/Fields/Form_Field_reCaptcha.php:163 +msgid "Enable Invisible reCaptcha" msgstr "" -#: admin/html/whats-new.php:1293 -msgid "WP User Frontend Guten Block is added" +#: admin/template.php:676 includes/Admin/Forms/Admin_Template.php:780 +#: includes/Fields/Form_Field_reCaptcha.php:162 +msgid "Enable noCaptcha" msgstr "" -#: admin/html/whats-new.php:1295 -msgid "" -"WPUF Form Block is now available to be used within gutenberg editor with " -"preview of the form. " +#: class/render-form.php:87 includes/Render_Form.php:71 +#: includes/Traits/FieldableTrait.php:242 +#: includes/class-frontend-render-form.php:84 +msgid "Really Simple Captcha validation failed" msgstr "" -#: admin/html/whats-new.php:1298 -msgid "Advanced Custom Fields plugin compatibility" +#: class/render-form.php:127 includes/Render_Form.php:111 +#: includes/Traits/FieldableTrait.php:279 +#: includes/class-frontend-render-form.php:121 +msgid "noCaptcha reCAPTCHA validation failed" msgstr "" -#: admin/html/whats-new.php:1300 -msgid "Now all your ACF fields can be used within WPUF Post forms. " +#: class/render-form.php:136 includes/Render_Form.php:120 +#: includes/Traits/FieldableTrait.php:288 +#: includes/class-frontend-render-form.php:130 +msgid "reCAPTCHA validation failed" msgstr "" -#: admin/html/whats-new.php:1303 -msgid "Taxonomy Terms not showing for custom post types" +#: class/render-form.php:146 includes/Render_Form.php:130 +#: includes/Traits/FieldableTrait.php:298 +#: includes/class-frontend-render-form.php:140 +msgid "Invisible reCAPTCHA validation failed" msgstr "" -#: admin/html/whats-new.php:1305 -msgid "" -"Fixed an issue with taxonomy terms not appearing for Custom Post types " -"within Form Settings and Dashboard Post Listing" +#: class/render-form.php:378 includes/Frontend_Render_Form.php:181 +#: includes/Render_Form.php:235 includes/class-frontend-render-form.php:289 +msgid "Your selected form is no longer available." msgstr "" -#: admin/html/whats-new.php:1308 -msgid "Various other code optimizations" +#: class/render-form.php:384 includes/Frontend_Render_Form.php:187 +#: includes/Render_Form.php:241 includes/class-frontend-render-form.php:295 +msgid "Please make sure you've published your form." msgstr "" -#: admin/html/whats-new.php:1310 admin/html/whats-new.php:1367 -msgid "Code structure organization and optimization for better performance" +#: class/render-form.php:1329 includes/Free/Edit_Profile.php:202 +#: includes/Render_Form.php:1186 templates/registration-form.php:70 +msgid "Confirm Password" msgstr "" -#: admin/html/whats-new.php:1319 -msgid "WoooCommerce billing address Sync" +#: class/render-form.php:1351 includes/Free/Edit_Profile.php:211 +#: includes/Render_Form.php:1208 templates/dashboard/edit-profile.php:81 +msgid "Strength indicator" msgstr "" -#: admin/html/whats-new.php:1321 -msgid "" -"If an existing customer has previously set his billing address, that will " -"be imported into WPUF Billing address " +#: class/render-form.php:1413 includes/Fields/Form_Field_Post_Taxonomy.php:135 +#: includes/Fields/Form_Field_Post_Taxonomy.php:265 +#: includes/Render_Form.php:1270 +msgid "-- Select --" msgstr "" -#: admin/html/whats-new.php:1324 -msgid "Trial subscription message not showing properly" +#: class/render-form.php:1477 includes/Fields/Form_Field_Post_Taxonomy.php:74 +#: includes/Render_Form.php:1334 +msgid "This field is no longer available." msgstr "" -#: admin/html/whats-new.php:1326 -msgid "Subscriptions with Trial now shows trial notices" +#: class/render-form.php:1688 includes/Admin/List_Table_Transactions.php:142 +#: includes/Admin/List_Table_Transactions.php:210 includes/Render_Form.php:1545 +#: includes/functions/user/edit-user.php:103 +msgid "Delete" msgstr "" -#: admin/html/whats-new.php:1329 -msgid "Reset email Key not working" +#: class/subscription.php:347 includes/Admin/Admin_Subscription.php:187 +#: includes/Admin/Subscription.php:345 +msgid "Pack Name" msgstr "" -#: admin/html/whats-new.php:1331 -msgid "Reset Email key was not working in some cases" +#: class/subscription.php:464 includes/Admin/Subscription.php:462 +msgid "Add Subscription" msgstr "" -#: admin/html/whats-new.php:1334 -msgid "Post count not showing on the frontend dashboard" +#: class/subscription.php:465 includes/Admin/Subscription.php:463 +msgid "Add New Subscription" msgstr "" -#: admin/html/whats-new.php:1336 -msgid "" -"Dashboard with multiple post type was not showing post counts properly, is " -"now fixed and shows count for each post type" +#: class/subscription.php:467 includes/Admin/Subscription.php:465 +msgid "Edit Subscription" msgstr "" -#: admin/html/whats-new.php:1339 -msgid "Login Redirect showing blank page is fixed" +#: class/subscription.php:468 includes/Admin/Subscription.php:466 +msgid "New Subscription" msgstr "" -#: admin/html/whats-new.php:1341 -msgid "" -"If \"Previous Page\" was set for redirection, login redirect was " -"redirecting to blank page for users who hit login page directly" +#: class/subscription.php:469 class/subscription.php:470 +#: includes/Admin/Subscription.php:467 includes/Admin/Subscription.php:468 +msgid "View Subscription" msgstr "" -#: admin/html/whats-new.php:1350 -msgid "Enhanced Login Redirect to redirect users to previous page" +#: class/subscription.php:471 includes/Admin/Subscription.php:469 +msgid "Search Subscription" msgstr "" -#: admin/html/whats-new.php:1352 -msgid "" -"You can choose Previous Page as Login Redirect page settings now to " -"redirect users to the page from which they went for Login. " +#: class/subscription.php:472 includes/Admin/Subscription.php:470 +msgid "No Subscription Found" msgstr "" -#: admin/html/whats-new.php:1355 -msgid "Email HTML links not Rendreing properly issue is fixed" +#: class/subscription.php:473 includes/Admin/Subscription.php:471 +msgid "No Subscription Found in Trash" msgstr "" -#: admin/html/whats-new.php:1357 -msgid "" -"For some clients emails were not rendering the HTML links properly, this is " -"now fixed" +#: class/subscription.php:474 includes/Admin/Subscription.php:472 +msgid "Parent Subscription" msgstr "" -#: admin/html/whats-new.php:1360 -msgid "Form Builder : Form Field's Help text styles not showing properly" +#: class/subscription.php:829 includes/Admin/Subscription.php:835 +msgid "Payment is complete" msgstr "" -#: admin/html/whats-new.php:1362 -msgid "Help texts styling is now fixed and much easier to read and understand" +#: class/subscription.php:829 includes/Admin/Subscription.php:835 +msgid "Congratulations, your payment has been completed!" msgstr "" -#: admin/html/whats-new.php:1365 -msgid "Various other code improvements" +#: class/subscription.php:833 class/subscription.php:837 +#: includes/Admin/Subscription.php:839 includes/Admin/Subscription.php:843 +msgid "Please buy a subscription pack to post" msgstr "" -#: admin/html/whats-new.php:1376 -msgid "Dashboard Post Listing now supports multiple post types" +#: class/subscription.php:856 includes/Admin/Subscription.php:862 +msgid "

    You have a subscription pack activated.

    " msgstr "" -#: admin/html/whats-new.php:1378 -msgid "" -"Now you can show multiple post type in user dashboard using shortcode like " -"this :
    [wpuf_dashboard post_type=\"post,page,custom_type\"] " +#: class/subscription.php:858 includes/Admin/Subscription.php:864 +#. translators: %s: pack title +msgid "

    Pack name: %s

    " msgstr "" -#: admin/html/whats-new.php:1381 -msgid "Added Login Redirect Settings" +#: class/subscription.php:860 includes/Admin/Subscription.php:866 +msgid "To cancel the pack, press the following cancel button" msgstr "" -#: admin/html/whats-new.php:1383 -msgid "" -"You can now set a page from WPUF Settings > Login/Registration > " -"Redirect after Login. When login redirection is active the user will be " -"redirected to this page after login." +#: class/subscription.php:867 includes/Admin/Admin_Subscription.php:812 +#: includes/Admin/Forms/Admin_Form_Builder.php:293 +#: includes/Admin/List_Table_Subscribers.php:144 +#: includes/Admin/Subscription.php:873 includes/Frontend/Payment.php:246 +#: templates/dashboard/subscription.php:68 +msgid "Cancel" msgstr "" -#: admin/html/whats-new.php:1386 -msgid "Image Upload field button text can be changed" +#: class/subscription.php:907 includes/Admin/Subscription.php:913 +msgid "Day" +msgid_plural "Days" +msgstr[0] "" +msgstr[1] "" + +#: class/subscription.php:908 includes/Admin/Subscription.php:914 +msgid "Week" +msgid_plural "Weeks" +msgstr[0] "" +msgstr[1] "" + +#: class/subscription.php:909 includes/Admin/Subscription.php:915 +msgid "Month" +msgid_plural "Months" +msgstr[0] "" +msgstr[1] "" + +#: class/subscription.php:910 includes/Admin/Subscription.php:916 +msgid "Year" +msgid_plural "Years" +msgstr[0] "" +msgstr[1] "" + +#: class/subscription.php:942 includes/Admin/Subscription.php:946 +msgid "One time payment" msgstr "" -#: admin/html/whats-new.php:1388 -msgid "" -"The upload button text can now be changed for image upload fields which " -"defaults to \"Select Image\" if not set. " +#: class/subscription.php:949 includes/Admin/Subscription.php:953 +msgid "Every" msgstr "" -#: admin/html/whats-new.php:1391 -msgid "Multi Step Form styles made compatible with more themes" +#: class/subscription.php:950 includes/Admin/Subscription.php:954 +msgid "for" msgstr "" -#: admin/html/whats-new.php:1393 -msgid "Multi Step form can now be styled more easily with other themes " +#: class/subscription.php:950 includes/Admin/Subscription.php:954 +msgid "installments" msgstr "" -#: admin/html/whats-new.php:1396 -msgid "Required field condition for google map not working is fixed" +#: class/subscription.php:958 includes/Admin/Subscription.php:962 +#. translators: %s: trial days +msgid "Trial available for first %1$s %2$s" msgstr "" -#: admin/html/whats-new.php:1398 -msgid "" -"If Google Map field was set as required users were able to submit form " -"without changing the default value." +#: class/subscription.php:962 includes/Admin/Subscription.php:966 +msgid "Buy Now" msgstr "" -#: admin/html/whats-new.php:1407 -msgid "Admin form builder is now fully responsive." +#: class/subscription.php:966 includes/Admin/Subscription.php:970 +msgid "Sign Up" msgstr "" -#: admin/html/whats-new.php:1409 -msgid "" -"Now you can edit forms from your mobile devices directly. Our improved " -"responsive layouts of form builder makes it easy for you to build forms on " -"the go." +#: class/subscription.php:969 includes/Admin/Admin_Subscription.php:210 +#: includes/Admin/Admin_Subscription.php:607 +#: includes/Admin/Subscription.php:973 +#: includes/Free/templates/page-registration-form.php:94 +#: includes/Frontend/Frontend_Account.php:227 +#: includes/User_Subscription.php:314 +#: templates/subscriptions/pack-details.php:24 +msgid "Free" msgstr "" -#: admin/html/whats-new.php:1412 -msgid "Added color schemes for creating attractive form layouts." +#: class/subscription.php:1034 includes/Admin/Subscription.php:1036 +#. translators: %s: amount +msgid "There is a %s charge to add a new post." msgstr "" -#: admin/html/whats-new.php:1414 +#: class/subscription.php:1051 includes/Admin/Subscription.php:1053 +#. translators: %s: amount msgid "" -"We have added 3 new color schemes for the form layouts which you can choose " -"from each form's new display settings." +"Your Subscription pack is exhausted. There is a %s charge " +"to add a new post." msgstr "" -#: admin/html/whats-new.php:1417 -msgid "Restrict Free subscription pack to be enabled multiple times " +#: class/subscription.php:1097 includes/Admin/Subscription.php:1099 +#. translators: %s: subscription link +msgid "You must purchase a pack before posting" msgstr "" -#: admin/html/whats-new.php:1419 -msgid "" -"Free subscription packs now can only be purchased once and the limit " -"applies properly" +#: includes/Admin/Admin_Subscription.php:42 +msgid "Pack Description" msgstr "" -#: admin/html/whats-new.php:1422 -msgid "Various other bug fixes and improvements were made " +#: includes/Admin/Admin_Subscription.php:56 +#: includes/Admin/Admin_Subscription.php:59 +msgid "Subscription pack updated." msgstr "" -#: admin/html/whats-new.php:1424 -msgid "Please see the change log to see full details." +#: includes/Admin/Admin_Subscription.php:57 +msgid "Custom field updated." msgstr "" -#: admin/html/whats-new.php:1433 -msgid "Added upgrade function for default category" +#: includes/Admin/Admin_Subscription.php:58 +msgid "Custom field deleted." msgstr "" -#: admin/html/whats-new.php:1435 -msgid "Upgrader added to upgrade previously set default post category." +#: includes/Admin/Admin_Subscription.php:60 +msgid "Subscription pack restored to revision from %s" msgstr "" -#: admin/html/whats-new.php:1438 -msgid "Subscription pack cannot be canceled" +#: includes/Admin/Admin_Subscription.php:61 +msgid "Subscription pack published." msgstr "" -#: admin/html/whats-new.php:1440 -msgid "" -"Fixed recurring subscription pack cannot be canceled from my account page " -"in subscription details section." +#: includes/Admin/Admin_Subscription.php:62 +msgid "Subscription pack saved." msgstr "" -#: admin/html/whats-new.php:1443 -msgid "page installer admin notice logic issue" +#: includes/Admin/Admin_Subscription.php:63 +msgid "Subscription pack submitted." msgstr "" -#: admin/html/whats-new.php:1445 -msgid "" -"Fixed page installer admin notice logic problem due to new payment settings " -"default value not set." +#: includes/Admin/Admin_Subscription.php:65 +msgid "Subscription pack draft updated." msgstr "" -#: admin/html/whats-new.php:1455 -msgid "Setup Wizard" +#: includes/Admin/Admin_Subscription.php:188 +msgid "Amount" msgstr "" -#: admin/html/whats-new.php:1457 -msgid "Setup Wizard added to turn off payment options and install pages." +#: includes/Admin/Admin_Subscription.php:190 includes/WPUF_Privacy.php:483 +msgid "Recurring" msgstr "" -#: admin/html/whats-new.php:1461 -msgid "Multi-select Category" +#: includes/Admin/Admin_Subscription.php:191 +msgid "Duration" msgstr "" -#: admin/html/whats-new.php:1463 -msgid "Add multi-select to default category in post form settings." +#: includes/Admin/Admin_Subscription.php:325 +#: includes/Admin/Forms/Admin_Form.php:244 +msgid "Payment Settings" msgstr "" -#: admin/html/whats-new.php:1467 -msgid "Select Text option for Taxonomy" +#: includes/Admin/Admin_Subscription.php:332 +msgid "Posting Restriction" msgstr "" -#: admin/html/whats-new.php:1469 -msgid "" -"Add Select Text option for taxonomy fields. Now you can add default text " -"with empty value as first option for Taxonomy dropdown." +#: includes/Admin/Admin_Subscription.php:346 +msgid "Billing amount:" msgstr "" -#: admin/html/whats-new.php:1472 -msgid "Taxonomy Checkbox Inline" +#: includes/Admin/Admin_Subscription.php:347 +msgid "Billing amount each cycle:" msgstr "" -#: admin/html/whats-new.php:1474 -msgid "" -"Added checkbox inline option to taxonomy checkbox. You can now display " -"Taxonomy checkbox fields inline." +#: includes/Admin/Admin_Subscription.php:355 +msgid "Expires In:" msgstr "" -#: admin/html/whats-new.php:1484 -msgid "Manage schedule for form submission" +#: includes/Admin/Admin_Subscription.php:374 +#: includes/Admin/Admin_Subscription.php:658 +msgid "Number of featured item" msgstr "" -#: admin/html/whats-new.php:1486 -msgid "" -"Do not accept form submission if the current date is not between the date " -"range of the schedule." +#: includes/Admin/Admin_Subscription.php:378 +msgid "How many items a user can set as featured, including all post types" msgstr "" -#: admin/html/whats-new.php:1490 -msgid "Restrict form submission based on the user roles" +#: includes/Admin/Admin_Subscription.php:382 +msgid "Remove featured item on subscription expiry" msgstr "" -#: admin/html/whats-new.php:1492 -msgid "" -"Restrict form submission based on the user roles. Now you can manage user " -"role base permission on form submission." +#: includes/Admin/Admin_Subscription.php:386 +msgid "The featured item will be removed if the subscription expires" msgstr "" -#: admin/html/whats-new.php:1496 -msgid "Limit how many entries a form will accept" +#: includes/Admin/Admin_Subscription.php:421 +#: includes/Admin/Forms/Admin_Form.php:248 includes/Free/Form_Element.php:61 +msgid "Post Expiration" msgstr "" -#: admin/html/whats-new.php:1498 -msgid "" -"Limit how many entries a form will accept and display a custom message when " -"that limit is reached." +#: includes/Admin/Admin_Subscription.php:426 includes/Free/Form_Element.php:65 +msgid "Enable Post Expiration" msgstr "" -#: admin/html/whats-new.php:1502 -msgid "Show/hide Admin Bar" +#: includes/Admin/Admin_Subscription.php:438 +#: includes/Admin/Admin_Subscription.php:715 includes/Free/Form_Element.php:71 +msgid "Post Expiration Time" msgstr "" -#: admin/html/whats-new.php:1504 -msgid "Control the admin bar visibility based on user roles." +#: includes/Admin/Admin_Subscription.php:468 includes/Free/Form_Element.php:122 +msgid "Status of post after post expiration time is over " msgstr "" -#: admin/html/whats-new.php:1508 -msgid "Ajax Login widget" +#: includes/Admin/Admin_Subscription.php:473 +msgid "Expiration Mail" msgstr "" -#: admin/html/whats-new.php:1510 -msgid "" -"Login user is more simple now with Ajax Login Widget. The simple ajax login " -"form do not required page loading for login." +#: includes/Admin/Admin_Subscription.php:478 +msgid "Send Expiration Email to Post Author" msgstr "" -#: admin/html/whats-new.php:1514 -msgid "Form submission with Captcha field" +#: includes/Admin/Admin_Subscription.php:482 +msgid "Send Mail to Author After Exceeding Post Expiration Time" msgstr "" -#: admin/html/whats-new.php:1516 -msgid "Form field validation process updated if form submits with captcha field." +#: includes/Admin/Admin_Subscription.php:487 +msgid "Expiration Message" msgstr "" -#: admin/html/whats-new.php:1530 -msgid "What's New in WPUF?" +#: includes/Admin/Admin_Subscription.php:490 includes/Free/Form_Element.php:141 +msgid "You may use: {post_author} {post_url} {blogname} {post_title} {post_status}" msgstr "" -#: admin/installer.php:27 -msgid "" -"If you have not created WP User Frontend pages yet, you " -"can do this by one click." +#: includes/Admin/Admin_Subscription.php:552 +msgid "Day(s)" msgstr "" -#: admin/installer.php:31 -msgid "or" +#: includes/Admin/Admin_Subscription.php:553 +msgid "Week(s)" msgstr "" -#: admin/installer.php:32 -msgid "Skip Setup" +#: includes/Admin/Admin_Subscription.php:554 +msgid "Month(s)" msgstr "" -#: admin/installer.php:42 -msgid "Congratulations!" +#: includes/Admin/Admin_Subscription.php:555 +msgid "Year(s)" msgstr "" -#: admin/installer.php:84 admin/settings-options.php:24 -#: includes/free/admin/shortcode-button.php:79 wpuf-functions.php:2061 -msgid "Dashboard" +#: includes/Admin/Admin_Subscription.php:599 +msgid "WPUF Subscription Information" msgstr "" -#: admin/installer.php:85 includes/free/admin/shortcode-button.php:83 -msgid "Account" +#: includes/Admin/Admin_Subscription.php:611 +msgid "For each %1$s %2$s" msgstr "" -#: admin/installer.php:89 includes/class-login-widget.php:248 -#: includes/free/admin/shortcode-button.php:91 -msgid "Login" +#: includes/Admin/Admin_Subscription.php:612 +#: includes/Frontend/Frontend_Account.php:237 +#. translators: %s: number of installments +msgid ", for %s installments" msgstr "" -#: admin/installer.php:95 class/subscription.php:410 class/subscription.php:430 -#: class/subscription.php:431 class/subscription.php:432 -#: includes/free/admin/shortcode-button.php:99 wpuf-functions.php:2044 -msgid "Subscription" +#: includes/Admin/Admin_Subscription.php:623 +msgid "Subcription Name" msgstr "" -#: admin/installer.php:95 -msgid "[wpuf_sub_pack]" +#: includes/Admin/Admin_Subscription.php:633 +msgid "Billing Info" msgstr "" -#: admin/installer.php:96 templates/dashboard/list.php:16 -#: templates/dashboard/posts.php:106 -msgid "Payment" +#: includes/Admin/Admin_Subscription.php:647 +msgid "This user is using recurring subscription pack" msgstr "" -#: admin/installer.php:96 -msgid "Please select a gateway for payment" +#: includes/Admin/Admin_Subscription.php:653 +msgid "Remaining Posting Count" msgstr "" -#: admin/installer.php:97 -msgid "Thank You" +#: includes/Admin/Admin_Subscription.php:682 +msgid "Subscription Expiration Info" msgstr "" -#: admin/installer.php:97 -msgid "" -"

    Payment is complete

    Congratulations, your payment has been " -"completed!

    " +#: includes/Admin/Admin_Subscription.php:691 includes/User_Subscription.php:366 +#: templates/dashboard/subscription.php:50 +msgid "Expire date:" msgstr "" -#: admin/installer.php:98 -msgid "Order Received" +#: includes/Admin/Admin_Subscription.php:704 +msgid "Post Expiration Enabled" msgstr "" -#: admin/installer.php:98 -msgid "" -"Hi, we have received your order. We will validate the order and will take " -"necessary steps to move forward." +#: includes/Admin/Admin_Subscription.php:741 +msgid "Allowed Taxonomy Terms" msgstr "" -#: admin/installer.php:184 includes/free/admin/shortcode-button.php:95 -msgid "Registration" +#: includes/Admin/Admin_Subscription.php:811 +msgid "Assign Package" msgstr "" -#: admin/installer.php:193 -msgid "Sample Form" +#: includes/Admin/Admin_Subscription.php:818 +msgid "Select Package:" msgstr "" -#: admin/post-forms-list-table-view.php:23 -msgid "Search Forms" +#: includes/Admin/Admin_Subscription.php:821 +#: includes/functions/settings-options.php:632 wpuf-functions.php:215 +#: wpuf-functions.php:1838 wpuf-functions.php:2103 +msgid "— Select —" msgstr "" -#: admin/post-forms-list-table-view.php:39 -msgid "Learn more about Frontend Posting" +#: includes/Admin/Admin_Subscription.php:825 +msgid "Only non-recurring pack can be assigned" msgstr "" -#: admin/post-forms-list-table.php:44 wpuf-functions.php:58 -msgid "Published" +#: includes/Admin/Admin_Subscription.php:836 +msgid "Delete Package" msgstr "" -#: admin/post-forms-list-table.php:45 admin/post-forms-list-table.php:407 -msgid "Trash" +#: includes/Admin/Admin_Subscription.php:895 +msgid "Learn more about Subscription" msgstr "" -#: admin/post-forms-list-table.php:95 -msgid "No form found." +#: includes/Admin/Admin_Tools.php:47 +msgid "Form Export" msgstr "" -#: admin/post-forms-list-table.php:109 -msgid "Move to Trash" +#: includes/Admin/Admin_Tools.php:53 includes/Admin/Admin_Tools.php:116 +#: includes/Admin/Forms/Post/Templates/List_Table_Admin_Post_Forms.php:53 +#: includes/Admin/List_Table_Subscribers.php:142 +#: includes/Admin/List_Table_Transactions.php:97 wpuf-functions.php:3517 +msgid "All" msgstr "" -#: admin/post-forms-list-table.php:113 admin/post-forms-list-table.php:419 -msgid "Restore" +#: includes/Admin/Admin_Tools.php:58 includes/Admin/Admin_Tools.php:121 +msgid "Select individual" msgstr "" -#: admin/post-forms-list-table.php:114 admin/post-forms-list-table.php:420 -msgid "Delete Permanently" +#: includes/Admin/Admin_Tools.php:68 includes/Admin/Admin_Tools.php:134 +#: includes/Admin/views/tools.php:11 +msgid "Export" msgstr "" -#: admin/post-forms-list-table.php:311 -msgid "Form Name" +#: includes/Admin/Admin_Tools.php:76 includes/Admin/Admin_Tools.php:141 +msgid "Sorry you have no form to export" msgstr "" -#: admin/post-forms-list-table.php:315 admin/premium.php:39 -#: includes/fields/class-pro-upgrade-fields.php:159 -#: includes/free/form-element.php:31 -msgid "Shortcode" +#: includes/Admin/Admin_Tools.php:108 +msgid "Registration Form Export" msgstr "" -#: admin/post-forms-list-table.php:408 -msgid "Duplicate" +#: includes/Admin/Admin_Tools.php:150 +msgid "Import forms" msgstr "" -#: admin/post-forms-list-table.php:429 wpuf-functions.php:61 -msgid "Draft" +#: includes/Admin/Admin_Tools.php:153 +msgid "Upload your JSON file and start imporing WPUF forms here" msgstr "" -#: admin/posting.php:72 class/asset-loader.php:55 class/render-form.php:1682 -#: wpuf.php:735 -msgid "Are you sure?" +#: includes/Admin/Admin_Tools.php:162 +msgid "Upload JSON File" msgstr "" -#: admin/posting.php:80 class/asset-loader.php:63 wpuf.php:746 -msgid "Allowed Files" +#: includes/Admin/Admin_Tools.php:165 +msgid "Importing JSON File" msgstr "" -#: admin/posting.php:83 class/asset-loader.php:66 wpuf.php:752 -msgid "Maximum number of files reached!" +#: includes/Admin/Admin_Tools.php:227 +msgid "Please select some form for exporting" msgstr "" -#: admin/posting.php:84 class/asset-loader.php:67 wpuf.php:753 -msgid "The file you have uploaded exceeds the file size limit. Please try again." +#: includes/Admin/Admin_Tools.php:310 +msgid "Are you Sure?" msgstr "" -#: admin/posting.php:85 class/asset-loader.php:68 wpuf.php:754 -msgid "You have uploaded an incorrect file type. Please try again." +#: includes/Admin/Admin_Tools.php:313 +msgid "All forms has been deleted" msgstr "" -#: admin/posting.php:104 -msgid "WPUF Form" +#: includes/Admin/Admin_Tools.php:317 +msgid "Settings has been cleared!" msgstr "" -#: admin/posting.php:132 -msgid "Learn more" +#: includes/Admin/Admin_Tools.php:321 +msgid "All transactions has been deleted!" msgstr "" -#: admin/posting.php:179 -msgid "WPUF Lock User" +#: includes/Admin/Admin_Tools.php:337 +msgid "Page Installation" msgstr "" -#: admin/posting.php:205 +#: includes/Admin/Admin_Tools.php:340 msgid "" -"Post is locked, to allow user to edit this post Click here" +"Clicking this button will create required pages for the plugin. Note: It'll " +"not delete/replace existing pages." msgstr "" -#: admin/posting.php:212 -msgid "" -"Frontend edit access for this post will be automatically locked after %s, " -"Clear Lock Or," +#: includes/Admin/Admin_Tools.php:346 includes/Admin/Admin_Tools.php:350 +msgid "Reset Settings" msgstr "" -#: admin/posting.php:233 -msgid "Lock Post Permanently" +#: includes/Admin/Admin_Tools.php:349 +msgid "" +"Caution: This tool will delete all the plugin settings of WP User Frontend " +"Pro" msgstr "" -#: admin/posting.php:238 -msgid "Lock user from editing this post from the frontend dashboard" +#: includes/Admin/Admin_Tools.php:355 +msgid "Delete Forms" msgstr "" -#: admin/posting.php:289 -msgid "WPUF Custom Fields" +#: includes/Admin/Admin_Tools.php:358 +msgid "Caution: This tool will delete all the post and registration/profile forms." msgstr "" -#: admin/posting.php:346 -msgid "No custom fields found." +#: includes/Admin/Admin_Tools.php:360 +msgid "Delete Post Forms" msgstr "" -#: admin/premium.php:2 admin/premium.php:5 -msgid "WPUF Pro" +#: includes/Admin/Admin_Tools.php:361 +msgid "Delete Registration Forms" msgstr "" -#: admin/premium.php:4 -msgid "" -"Upgrade to the premium versions of WPUF and unlock even more useful " -"features." +#: includes/Admin/Admin_Tools.php:362 +msgid "Delete Subscriptions" msgstr "" -#: admin/premium.php:10 includes/free/loader.php:116 -msgid "Pro Features" +#: includes/Admin/Admin_Tools.php:363 +msgid "Delete Coupons" msgstr "" -#: admin/premium.php:11 -msgid "" -"WPUF Pro is designed just for you, specially to fulfil your business needs. " -"We have designed and curated every feature keeping your requirements in " -"mind." +#: includes/Admin/Admin_Tools.php:371 +msgid "This tool will delete all the transactions from the transaction table." msgstr "" -#: admin/premium.php:18 admin/premium.php:21 includes/free/loader.php:125 -msgid "Registration Form Builder" +#: includes/Admin/Admin_Tools.php:373 +msgid "Delete Transactions" msgstr "" -#: admin/premium.php:22 -msgid "" -"Registration form builder is a two way form which can be used both for user " -"registration and profile editing. You could also manage Register for " -"Subscription Package Purchase." +#: includes/Admin/Admin_Welcome.php:25 includes/Admin/Admin_Welcome.php:26 +msgid "Welcome to WP User Frontend" msgstr "" -#: admin/premium.php:28 admin/premium.php:31 -msgid "Advanced Fields" +#: includes/Admin/Customizer_Options.php:44 +#: includes/Admin/Customizer_Options.php:85 +#: includes/functions/settings-options.php:342 +msgid "Show Billing Address" msgstr "" -#: admin/premium.php:33 includes/fields/class-pro-upgrade-fields.php:19 -#: includes/free/form-element.php:16 -msgid "Country List" +#: includes/Admin/Customizer_Options.php:45 +#: includes/Admin/Customizer_Options.php:86 +#: includes/Ajax/Address_Form_Ajax.php:167 includes/Traits/TaxableTrait.php:80 +#: includes/Traits/TaxableTrait.php:189 includes/WPUF_Privacy.php:270 +#: templates/dashboard/billing-address.php:51 +#: templates/dashboard/billing-address.php:52 +msgid "Country" msgstr "" -#: admin/premium.php:34 -msgid "Address" +#: includes/Admin/Customizer_Options.php:46 +#: includes/Admin/Customizer_Options.php:87 +#: includes/Ajax/Address_Form_Ajax.php:210 +#: templates/dashboard/billing-address.php:90 +#: templates/dashboard/billing-address.php:91 +msgid "State/Province/Region" msgstr "" -#: admin/premium.php:35 -msgid "Date Field" +#: includes/Admin/Customizer_Options.php:47 +#: includes/Admin/Customizer_Options.php:88 +msgid "Address line 1" msgstr "" -#: admin/premium.php:36 includes/fields/class-pro-upgrade-fields.php:60 -msgid "Google Map" +#: includes/Admin/Customizer_Options.php:48 +#: includes/Admin/Customizer_Options.php:89 +msgid "Address line 2" msgstr "" -#: admin/premium.php:37 includes/fields/class-pro-upgrade-fields.php:71 -#: includes/free/form-element.php:34 -msgid "Action Hook" +#: includes/Admin/Customizer_Options.php:49 +#: includes/Admin/Customizer_Options.php:90 +#: includes/Ajax/Address_Form_Ajax.php:265 includes/WPUF_Privacy.php:258 +#: templates/dashboard/billing-address.php:148 +#: templates/dashboard/billing-address.php:149 +msgid "City" msgstr "" -#: admin/premium.php:38 -msgid "Rating" +#: includes/Admin/Customizer_Options.php:50 +#: includes/Admin/Customizer_Options.php:91 +#: includes/Ajax/Address_Form_Ajax.php:275 +msgid "Postal Code/ZIP" msgstr "" -#: admin/premium.php:40 -msgid "Number" +#: includes/Admin/Customizer_Options.php:68 +msgid "Customize WPUF Settings" msgstr "" -#: admin/premium.php:41 -msgid "Repeater" +#: includes/Admin/Customizer_Options.php:75 includes/Frontend/Payment.php:156 +#: wpuf-functions.php:2070 +msgid "Billing Address" msgstr "" -#: admin/premium.php:42 includes/fields/class-pro-upgrade-fields.php:49 -#: includes/free/form-element.php:14 -msgid "File Upload" +#: includes/Admin/Customizer_Options.php:78 +msgid "These options let you change the appearance of the billing address." msgstr "" -#: admin/premium.php:43 -msgid "Captcha" +#: includes/Admin/Customizer_Options.php:104 +#: includes/Admin/Customizer_Options.php:114 +#. Translators: %s field name. +msgid "%s field" msgstr "" -#: admin/premium.php:44 -msgid "TOC" +#: includes/Admin/Customizer_Options.php:120 +msgid "Optional" msgstr "" -#: admin/premium.php:51 admin/premium.php:54 -msgid "Manage Coupons" +#: includes/Admin/Dashboard_Metabox.php:19 +msgid "WP User Frontend News & Updates" msgstr "" -#: admin/premium.php:55 -msgid "" -"Simple yet powerful coupon management system. Use Coupon codes for selling " -"subscription pack with discounts." +#: includes/Admin/Forms/Admin_Form.php:55 +#: includes/Admin/Forms/Admin_Form.php:75 +#: includes/Admin/Forms/Admin_Form.php:77 +#: includes/Admin/Forms/Admin_Form.php:113 +msgid "Forms" msgstr "" -#: admin/premium.php:61 admin/premium.php:64 -msgid "Content Restrictions" +#: includes/Admin/Forms/Admin_Form.php:76 +#: includes/Admin/Forms/Admin_Form.php:114 +msgid "Form" msgstr "" -#: admin/premium.php:65 -msgid "" -"You can restrict premium content for users by access role, registration or " -"subscriptions only with just a shortcode." +#: includes/Admin/Forms/Admin_Form.php:78 +#: includes/Admin/Forms/Admin_Form.php:117 +#: includes/Admin/views/post-forms-list-table-view.php:9 +msgid "Add Form" msgstr "" -#: admin/premium.php:71 admin/premium.php:74 -#: includes/class-pro-upgrades.php:109 includes/free/form-element.php:496 -msgid "Conditional Logic" +#: includes/Admin/Forms/Admin_Form.php:79 +#: includes/Admin/Forms/Admin_Form.php:118 +msgid "Add New Form" msgstr "" -#: admin/premium.php:75 -msgid "" -"Configure your form’s settings and user flow based on conditional " -"selection. Your forms should appear just the way you want it." +#: includes/Admin/Forms/Admin_Form.php:81 +#: includes/Admin/Forms/Admin_Form.php:120 +msgid "Edit Form" msgstr "" -#: admin/premium.php:81 admin/premium.php:84 -msgid "Multi-step Form" +#: includes/Admin/Forms/Admin_Form.php:82 +#: includes/Admin/Forms/Admin_Form.php:121 +msgid "New Form" msgstr "" -#: admin/premium.php:85 -msgid "" -"Break down the long forms into smaller and attractive multi step forms. " -"Long and lengthy forms are uninviting, why build one?" +#: includes/Admin/Forms/Admin_Form.php:83 +#: includes/Admin/Forms/Admin_Form.php:84 +#: includes/Admin/Forms/Admin_Form.php:122 +#: includes/Admin/Forms/Admin_Form.php:123 +msgid "View Form" msgstr "" -#: admin/premium.php:93 includes/free/loader.php:88 -#: includes/free/loader.php:1241 -msgid "Modules" +#: includes/Admin/Forms/Admin_Form.php:85 +#: includes/Admin/Forms/Admin_Form.php:124 +msgid "Search Form" msgstr "" -#: admin/premium.php:94 -msgid "A bunch of awesome modules to speed up your business growth." +#: includes/Admin/Forms/Admin_Form.php:86 +#: includes/Admin/Forms/Admin_Form.php:125 +msgid "No Form Found" msgstr "" -#: admin/premium.php:101 admin/premium.php:121 admin/premium.php:124 -msgid "BuddyPress Profile" +#: includes/Admin/Forms/Admin_Form.php:87 +#: includes/Admin/Forms/Admin_Form.php:126 +msgid "No Form Found in Trash" msgstr "" -#: admin/premium.php:104 includes/free/loader.php:226 -msgid "Social Login" +#: includes/Admin/Forms/Admin_Form.php:89 +#: includes/Admin/Forms/Admin_Form.php:128 +msgid "Parent Form" msgstr "" -#: admin/premium.php:105 -msgid "" -"Allow your users to Register or Login using Social networks like Google, " -"Facebook, Twitter and LinkedIn." +#: includes/Admin/Forms/Admin_Form.php:93 +msgid "Registraton Forms" msgstr "" -#: admin/premium.php:111 admin/premium.php:114 includes/free/loader.php:233 -msgid "User Directory" +#: includes/Admin/Forms/Admin_Form.php:115 includes/Free/Free_Loader.php:86 +#: includes/Free/Free_Loader.php:87 +msgid "Registration Forms" msgstr "" -#: admin/premium.php:115 -msgid "" -"Handle user listing and user profile in the frontend. Create a directory " -"site easily." +#: includes/Admin/Forms/Admin_Form.php:239 +msgid "Post Settings" msgstr "" -#: admin/premium.php:125 -msgid "Register and upgrade user profiles and sync data with BuddyPress." +#: includes/Admin/Forms/Admin_Form.php:240 +msgid "Edit Settings" msgstr "" -#: admin/premium.php:131 admin/premium.php:171 -msgid "MailChimp Integration" +#: includes/Admin/Forms/Admin_Form.php:242 +msgid "Submission Restriction" msgstr "" -#: admin/premium.php:134 -msgid "User Analytics" +#: includes/Admin/Forms/Admin_Form.php:246 +msgid "Display Settings" msgstr "" -#: admin/premium.php:135 -msgid "Show user tracking info during post and registration directly on Frontend." +#: includes/Admin/Forms/Admin_Form.php:267 includes/Free/Form_Element.php:222 +#: includes/Free/Form_Element.php:260 +msgid "Notification" msgstr "" -#: admin/premium.php:141 admin/premium.php:144 -msgid "Paid Membership Pro" +#: includes/Admin/Forms/Admin_Form.php:303 +#: includes/Admin/Forms/Admin_Form.php:309 +msgid "- Select -" msgstr "" -#: admin/premium.php:145 -msgid "Membership Integration of WP User Frontend with Paid Membership Pro." +#: includes/Admin/Forms/Admin_Form.php:347 +msgid "Post Fields" msgstr "" -#: admin/premium.php:151 admin/premium.php:154 -msgid "Stripe Payment" +#: includes/Admin/Forms/Admin_Form.php:352 +msgid "Taxonomies" msgstr "" -#: admin/premium.php:155 -msgid "" -"Stripe payment gateway for WP User Frontend. Get your subscription payment " -"with Stripe." +#: includes/Admin/Forms/Admin_Form.php:445 +msgid "Post Forms must have either Post Title, Post Body or Excerpt field" msgstr "" -#: admin/premium.php:161 admin/premium.php:164 -msgid "Mailpoet" +#: includes/Admin/Forms/Admin_Form_Builder.php:288 +msgid "Advanced Options" msgstr "" -#: admin/premium.php:165 -msgid "" -"Add subscribers to mailpoet mailing list when they registers via WP User " -"Frontend Pro." +#: includes/Admin/Forms/Admin_Form_Builder.php:289 +msgid "Are you sure you want to delete this field?" msgstr "" -#: admin/premium.php:174 -msgid "MailChimp" +#: includes/Admin/Forms/Admin_Form_Builder.php:292 +msgid "OK" msgstr "" -#: admin/premium.php:175 -msgid "" -"Integrate your desired form to your MailChimp email newsletter using latest " -"API." +#: includes/Admin/Forms/Admin_Form_Builder.php:294 +#: includes/Admin/views/shortcode-builder.php:70 +msgid "Close" msgstr "" -#: admin/premium.php:181 admin/premium.php:184 admin/premium.php:191 -#: admin/premium.php:201 -msgid "SMS Notification" +#: includes/Admin/Forms/Admin_Form_Builder.php:295 +msgid "This field must contain at least one choice" msgstr "" -#: admin/premium.php:185 -msgid "Get instant SMS notification on your mobile when post submits on your site." +#: includes/Admin/Forms/Admin_Form_Builder.php:296 +#: includes/Fields/Form_Field_Checkbox.php:110 +#: includes/Fields/Form_Field_Dropdown.php:107 +#: includes/Fields/Form_Field_MultiDropdown.php:84 +#: includes/Fields/Form_Field_Radio.php:113 +msgid "Option" msgstr "" -#: admin/premium.php:194 -msgid "Comment Manager" +#: includes/Admin/Forms/Admin_Form_Builder.php:297 +msgid "Column" msgstr "" -#: admin/premium.php:195 -msgid "Handle comments in frontend. View / reply comments on post." +#: includes/Admin/Forms/Admin_Form_Builder.php:298 +msgid "This field must contain at least one column" msgstr "" -#: admin/premium.php:204 -msgid "QR Code Generator" +#: includes/Admin/Forms/Admin_Form_Builder.php:299 +msgid "is available in Pro version" msgstr "" -#: admin/premium.php:205 -msgid "Generate QR Code with your custom fields or custom post meta." +#: includes/Admin/Forms/Admin_Form_Builder.php:300 +msgid "Please upgrade to the Pro version to unlock all these awesome features" msgstr "" -#: admin/premium.php:211 admin/premium.php:214 -msgid "More..." +#: includes/Admin/Forms/Admin_Form_Builder.php:303 +msgid "Get the Pro version" msgstr "" -#: admin/premium.php:215 -msgid "A bunch of more modules are coming soon." +#: includes/Admin/Forms/Admin_Form_Builder.php:304 +#: includes/Fields/Field_Contract.php:445 +msgid "Select" msgstr "" -#: admin/premium.php:225 -msgid "Upgrade To The Most Powerful Frontend Plugin" +#: includes/Admin/Forms/Admin_Form_Builder.php:305 +msgid "Saved form data" msgstr "" -#: admin/premium.php:227 -msgid "WP User Frontend Pro is the most powerful solution for your frontend needs." +#: includes/Admin/Forms/Admin_Form_Builder.php:306 +msgid "You have unsaved changes." msgstr "" -#: admin/promotion.php:115 -msgid "Sure! I'd love to!" +#: includes/Admin/Forms/Admin_Form_Handler.php:346 +#: includes/Admin/Forms/Admin_Form_Handler.php:371 +msgid "%d form moved to the trash." +msgid_plural "%d forms moved to the trash." +msgstr[0] "" +msgstr[1] "" + +#: includes/Admin/Forms/Admin_Form_Handler.php:351 +#: includes/Admin/Forms/Admin_Form_Handler.php:376 +msgid "%d form restored from the trash." +msgid_plural "%d forms restored from the trash." +msgstr[0] "" +msgstr[1] "" + +#: includes/Admin/Forms/Admin_Form_Handler.php:356 +#: includes/Admin/Forms/Admin_Form_Handler.php:381 +msgid "%d form permanently deleted." +msgid_plural "%d forms permanently deleted." +msgstr[0] "" +msgstr[1] "" + +#: includes/Admin/Forms/Admin_Form_Handler.php:362 +#: includes/Admin/Forms/Admin_Form_Handler.php:387 +msgid "Form duplicated successfully. View form." msgstr "" -#: admin/promotion.php:116 -msgid "I've already left a review" +#: includes/Admin/Forms/Field_Manager.php:151 +#: includes/class-field-manager.php:185 +msgid "Custom Fields" msgstr "" -#: admin/promotion.php:117 -msgid "Never show again" +#: includes/Admin/Forms/Field_Manager.php:178 +#: includes/class-field-manager.php:206 +msgid "Others" msgstr "" -#: admin/promotion.php:253 includes/class-whats-new.php:107 -msgid "Dismiss this notice." +#: includes/Admin/Forms/Form.php:185 includes/Admin/Forms/Form.php:235 +msgid "Post Limit Exceeded for your purchased subscription pack." msgstr "" -#: admin/settings-options.php:14 -msgid "General Options" +#: includes/Admin/Forms/Form.php:208 +#. translators: %s: Pack page link +msgid "" +"You need to purchase a subscription package to post in " +"this form" msgstr "" -#: admin/settings-options.php:29 -msgid "My Account" +#: includes/Admin/Forms/Form.php:215 includes/Admin/Forms/Form.php:248 +#: includes/Admin/Forms/Form.php:255 +msgid "Payment type not selected for this form. Please contact admin." msgstr "" -#: admin/settings-options.php:34 -msgid "Login / Registration" +#: includes/Admin/Forms/Post/Templates/Form_Template.php:102 +msgid "Want a new integration? Let us know." msgstr "" -#: admin/settings-options.php:39 includes/class-privacy.php:69 -msgid "Payments" +#: includes/Admin/Forms/Post/Templates/Form_Template.php:214 +msgid "Form Template" msgstr "" -#: admin/settings-options.php:44 -msgid "E-Mails" +#: includes/Admin/Forms/Post/Templates/Form_Template.php:217 +msgid "— No Template —" msgstr "" -#: admin/settings-options.php:49 -msgid "Privacy Options" +#: includes/Admin/Forms/Post/Templates/Form_Template.php:226 +msgid "" +"If selected a form template, it will try to execute that integration " +"options when new post created and updated." msgstr "" -#: admin/settings-options.php:64 -msgid "Previous Page" +#: includes/Admin/Forms/Post/Templates/List_Table_Admin_Post_Forms.php:54 +#: wpuf-functions.php:63 +msgid "Published" msgstr "" -#: admin/settings-options.php:89 -msgid "Show Admin Bar" +#: includes/Admin/Forms/Post/Templates/List_Table_Admin_Post_Forms.php:55 +#: includes/Admin/Forms/Post/Templates/List_Table_Admin_Post_Forms.php:417 +msgid "Trash" msgstr "" -#: admin/settings-options.php:90 -msgid "Select user by roles, who can view admin bar in frontend." +#: includes/Admin/Forms/Post/Templates/List_Table_Admin_Post_Forms.php:105 +msgid "No form found." msgstr "" -#: admin/settings-options.php:97 -msgid "Admin area access" +#: includes/Admin/Forms/Post/Templates/List_Table_Admin_Post_Forms.php:119 +msgid "Move to Trash" msgstr "" -#: admin/settings-options.php:98 -msgid "Allow you to block specific user role to Ajax request and Media upload." +#: includes/Admin/Forms/Post/Templates/List_Table_Admin_Post_Forms.php:123 +#: includes/Admin/Forms/Post/Templates/List_Table_Admin_Post_Forms.php:429 +msgid "Restore" msgstr "" -#: admin/settings-options.php:102 -msgid "Admin Only" +#: includes/Admin/Forms/Post/Templates/List_Table_Admin_Post_Forms.php:124 +#: includes/Admin/Forms/Post/Templates/List_Table_Admin_Post_Forms.php:430 +msgid "Delete Permanently" msgstr "" -#: admin/settings-options.php:103 -msgid "Admins, Editors" +#: includes/Admin/Forms/Post/Templates/List_Table_Admin_Post_Forms.php:321 +msgid "Form Name" msgstr "" -#: admin/settings-options.php:104 -msgid "Admins, Editors, Authors" +#: includes/Admin/Forms/Post/Templates/List_Table_Admin_Post_Forms.php:325 +#: includes/Admin/views/premium.php:39 +#: includes/Fields/Form_Pro_Upgrade_Fields.php:187 +#: includes/Free/Form_Element.php:35 +msgid "Shortcode" msgstr "" -#: admin/settings-options.php:105 -msgid "Admins, Editors, Authors, Contributors" +#: includes/Admin/Forms/Post/Templates/List_Table_Admin_Post_Forms.php:418 +msgid "Duplicate" msgstr "" -#: admin/settings-options.php:106 -msgid "Default" +#: includes/Admin/Forms/Post/Templates/List_Table_Admin_Post_Forms.php:439 +#: wpuf-functions.php:66 +msgid "Draft" msgstr "" -#: admin/settings-options.php:111 -msgid "Override the post edit link" +#: includes/Admin/Forms/Post/Templates/Post_Form_Template_Events_Calendar.php:17 +msgid "The Events Calendar" msgstr "" -#: admin/settings-options.php:112 -msgid "" -"Users see the edit link in post if s/he is capable to edit the post/page. " -"Selecting Yes will override the default WordPress edit " -"post link in frontend" +#: includes/Admin/Forms/Post/Templates/Post_Form_Template_Events_Calendar.php:18 +msgid "Form for creating events. The Events Calendar plugin is required." msgstr "" -#: admin/settings-options.php:122 -msgid "ACF Compatibility" +#: includes/Admin/Forms/Post/Templates/Post_Form_Template_Events_Calendar.php:26 +msgid "Event Title" msgstr "" -#: admin/settings-options.php:123 -msgid "" -"Select Yes if you want to make compatible WPUF custom " -"fields data with advanced custom fields." +#: includes/Admin/Forms/Post/Templates/Post_Form_Template_Events_Calendar.php:31 +msgid "Please enter your event title" msgstr "" -#: admin/settings-options.php:133 -msgid "Load Scripts" +#: includes/Admin/Forms/Post/Templates/Post_Form_Template_Events_Calendar.php:40 +msgid "Event details" msgstr "" -#: admin/settings-options.php:134 -msgid "Load scripts/styles in all pages" +#: includes/Admin/Forms/Post/Templates/Post_Form_Template_Events_Calendar.php:43 +msgid "Write the full description of your event" msgstr "" -#: admin/settings-options.php:140 -msgid "reCAPTCHA Site Key" +#: includes/Admin/Forms/Post/Templates/Post_Form_Template_Events_Calendar.php:59 +msgid "Event Start" msgstr "" -#: admin/settings-options.php:144 -msgid "reCAPTCHA Secret Key" +#: includes/Admin/Forms/Post/Templates/Post_Form_Template_Events_Calendar.php:72 +msgid "Event End" msgstr "" -#: admin/settings-options.php:145 -msgid "" -"Register " -"here to get reCaptcha Site and Secret keys." +#: includes/Admin/Forms/Post/Templates/Post_Form_Template_Events_Calendar.php:85 +msgid "All Day Event" msgstr "" -#: admin/settings-options.php:149 -msgid "Custom CSS codes" +#: includes/Admin/Forms/Post/Templates/Post_Form_Template_Events_Calendar.php:100 +msgid "Event Website" msgstr "" -#: admin/settings-options.php:150 -msgid "" -"If you want to add your custom CSS code, it will be added on page header " -"wrapped with style tag" +#: includes/Admin/Forms/Post/Templates/Post_Form_Template_Events_Calendar.php:111 +msgid "Currency Symbol" msgstr "" -#: admin/settings-options.php:159 -msgid "Edit Page" +#: includes/Admin/Forms/Post/Templates/Post_Form_Template_Events_Calendar.php:121 +#: includes/Admin/List_Table_Transactions.php:50 +msgid "Cost" msgstr "" -#: admin/settings-options.php:160 -msgid "Select the page where [wpuf_edit] is located" +#: includes/Admin/Forms/Post/Templates/Post_Form_Template_Events_Calendar.php:131 +#: includes/Admin/Forms/Post/Templates/Post_Form_Template_Events_Calendar.php:132 +#: includes/Admin/Forms/Post/Templates/Post_Form_Template_Post.php:82 +#: includes/Admin/Forms/Post/Templates/Post_Form_Template_Post.php:83 +#: includes/Fields/Form_Field_Featured_Image.php:13 +#: includes/Fields/Form_Field_Featured_Image.php:146 +#: templates/dashboard/list.php:7 templates/dashboard/posts.php:97 +msgid "Featured Image" msgstr "" -#: admin/settings-options.php:166 -msgid "Default Post Owner" +#: includes/Admin/Forms/Post/Templates/Post_Form_Template_Events_Calendar.php:135 +msgid "Upload the main image of your event" msgstr "" -#: admin/settings-options.php:167 -msgid "" -"If guest post is enabled and user details are OFF, the posts are assigned " -"to this user" +#: includes/Admin/Forms/Post/Templates/Post_Form_Template_Events_Calendar.php:144 +#: includes/Admin/Forms/Post/Templates/Post_Form_Template_Post.php:96 +msgid "Excerpt" msgstr "" -#: admin/settings-options.php:174 -msgid "Custom Fields in post" +#: includes/Admin/Forms/Post/Templates/Post_Form_Template_Events_Calendar.php:147 +msgid "Provide a short description of this event (optional)" msgstr "" -#: admin/settings-options.php:175 -msgid "Show custom fields on post content area" +#: includes/Admin/Forms/Post/Templates/Post_Form_Template_Events_Calendar.php:162 +msgid "Event Tags" msgstr "" -#: admin/settings-options.php:181 -msgid "Insert Photo image size" +#: includes/Admin/Forms/Post/Templates/Post_Form_Template_Events_Calendar.php:165 +#: includes/Admin/Forms/Post/Templates/Post_Form_Template_Post.php:119 +msgid "Separate tags with commas." msgstr "" -#: admin/settings-options.php:182 -msgid "" -"Default image size of \"Insert Photo\" button in post " -"content area" +#: includes/Admin/Forms/Post/Templates/Post_Form_Template_Events_Calendar.php:178 +msgid "This page is restricted. Please Log in / Register to view this page." msgstr "" -#: admin/settings-options.php:189 -msgid "Insert Photo image type" +#: includes/Admin/Forms/Post/Templates/Post_Form_Template_Events_Calendar.php:182 +msgid "Create Event" msgstr "" -#: admin/settings-options.php:190 +#: includes/Admin/Forms/Post/Templates/Post_Form_Template_Events_Calendar.php:185 msgid "" -"Default image type of \"Insert Photo\" button in post " -"content area" +"Event has been updated successfully. View event" msgstr "" -#: admin/settings-options.php:193 -msgid "Image only" +#: includes/Admin/Forms/Post/Templates/Post_Form_Template_Events_Calendar.php:188 +msgid "Update Event" msgstr "" -#: admin/settings-options.php:194 -msgid "Image with link" +#: includes/Admin/Forms/Post/Templates/Post_Form_Template_Post.php:16 +#: includes/Admin/views/shortcode-builder.php:8 +msgid "Post Form" msgstr "" -#: admin/settings-options.php:200 -msgid "Enable Image Caption" +#: includes/Admin/Forms/Post/Templates/Post_Form_Template_Post.php:17 +msgid "Form for creating a blog post." msgstr "" -#: admin/settings-options.php:201 -msgid "Allow users to update image/video title, caption and description" +#: includes/Admin/Forms/Post/Templates/Post_Form_Template_Post.php:24 +#: includes/Fields/Form_Field_Post_Title.php:7 includes/WPUF_Privacy.php:422 +msgid "Post Title" msgstr "" -#: admin/settings-options.php:207 -msgid "Default Post Form" +#: includes/Admin/Forms/Post/Templates/Post_Form_Template_Post.php:29 +msgid "Please enter your post name" msgstr "" -#: admin/settings-options.php:208 -msgid "Fallback form for post editing if no associated form found" +#: includes/Admin/Forms/Post/Templates/Post_Form_Template_Post.php:40 +msgid "Category" msgstr "" -#: admin/settings-options.php:218 -msgid "Users can edit post?" +#: includes/Admin/Forms/Post/Templates/Post_Form_Template_Post.php:43 +msgid "Select a category for your post" msgstr "" -#: admin/settings-options.php:219 -msgid "Users will be able to edit their own posts" +#: includes/Admin/Forms/Post/Templates/Post_Form_Template_Post.php:44 +#: includes/Fields/Field_Contract.php:235 +#: includes/Fields/Form_Field_Dropdown.php:108 +#: includes/Fields/Form_Field_MultiDropdown.php:85 +#: includes/Fields/Form_Field_Post_Taxonomy.php:462 +msgid "- select -" msgstr "" -#: admin/settings-options.php:229 -msgid "User can delete post?" +#: includes/Admin/Forms/Post/Templates/Post_Form_Template_Post.php:61 +msgid "Post description" msgstr "" -#: admin/settings-options.php:230 -msgid "Users will be able to delete their own posts" +#: includes/Admin/Forms/Post/Templates/Post_Form_Template_Post.php:64 +msgid "Write the full description of your Post" msgstr "" -#: admin/settings-options.php:240 -msgid "Pending Post Edit" +#: includes/Admin/Forms/Post/Templates/Post_Form_Template_Post.php:86 +msgid "Upload the main image of your post" msgstr "" -#: admin/settings-options.php:241 -msgid "Disable post editing while post in \"pending\" status" +#: includes/Admin/Forms/Post/Templates/Post_Form_Template_Post.php:99 +msgid "Provide a short description of this post (optional)" msgstr "" -#: admin/settings-options.php:247 -msgid "Editing Published Post" +#: includes/Admin/Forms/Post/Templates/Post_Form_Template_Post.php:116 +#: includes/Fields/Form_Field_Post_Tags.php:9 +msgid "Tags" msgstr "" -#: admin/settings-options.php:248 -msgid "Disable post editing while post in \"publish\" status" +#: includes/Admin/Forms/Post/Templates/Post_Form_Template_Post.php:137 +msgid "Create Post" msgstr "" -#: admin/settings-options.php:254 -msgid "Posts per page" +#: includes/Admin/Forms/Post/Templates/Post_Form_Template_Post.php:151 +msgid "" +"Post has been updated successfully. View post" msgstr "" -#: admin/settings-options.php:255 -msgid "How many posts will be listed in a page" +#: includes/Admin/Forms/Post/Templates/Post_Form_Template_Post.php:153 +msgid "Update Post" msgstr "" -#: admin/settings-options.php:261 -msgid "Show user bio" +#: includes/Admin/Forms/Post/Templates/Post_Form_Template_WooCommerce.php:15 +msgid "WooCommerce Product" msgstr "" -#: admin/settings-options.php:262 -msgid "Users biographical info will be shown" +#: includes/Admin/Forms/Post/Templates/Post_Form_Template_WooCommerce.php:16 +msgid "Create a simple product form for WooCommerce." msgstr "" -#: admin/settings-options.php:268 -msgid "Show post count" +#: includes/Admin/Forms/Post/Templates/Pro_Form_Preview_EDD.php:26 +msgid "EDD Download" msgstr "" -#: admin/settings-options.php:269 -msgid "Show how many posts are created by the user" +#: includes/Admin/List_Table_Subscribers.php:36 +msgid "No subscribers found" msgstr "" -#: admin/settings-options.php:275 -msgid "Show Featured Image" +#: includes/Admin/List_Table_Subscribers.php:47 +msgid "User ID" msgstr "" -#: admin/settings-options.php:276 -msgid "Show featured image of the post (Overridden by Shortcode)" +#: includes/Admin/List_Table_Subscribers.php:48 +msgid "User Name" msgstr "" -#: admin/settings-options.php:281 -msgid "Show Payment Column" +#: includes/Admin/List_Table_Subscribers.php:49 +msgid "Subscription ID" msgstr "" -#: admin/settings-options.php:282 -msgid "Enable if you want show payment column on posts table" +#: includes/Admin/List_Table_Subscribers.php:50 +#: includes/Admin/List_Table_Transactions.php:47 +#: templates/dashboard/list.php:11 templates/dashboard/posts.php:101 +msgid "Status" msgstr "" -#: admin/settings-options.php:288 -msgid "Featured Image size" +#: includes/Admin/List_Table_Subscribers.php:51 +#: includes/Admin/List_Table_Transactions.php:54 +msgid "Gateway" msgstr "" -#: admin/settings-options.php:295 -msgid "Not logged in users will see this message" +#: includes/Admin/List_Table_Subscribers.php:52 includes/WPUF_Privacy.php:327 +msgid "Transaction ID" msgstr "" -#: admin/settings-options.php:304 -msgid "Account Page" +#: includes/Admin/List_Table_Subscribers.php:53 +msgid "Starts from" msgstr "" -#: admin/settings-options.php:305 -msgid "Select the page which contains [wpuf_account] shortcode" +#: includes/Admin/List_Table_Subscribers.php:54 +msgid "Expire date" msgstr "" -#: admin/settings-options.php:311 -msgid "Select Custom Post For Account Page" +#: includes/Admin/List_Table_Subscribers.php:143 +#: includes/Admin/List_Table_Transactions.php:104 +#: templates/dashboard/list.php:82 templates/dashboard/posts.php:188 +msgid "Completed" msgstr "" -#: admin/settings-options.php:312 -msgid "Select the post types you want to show on user dashboard." +#: includes/Admin/List_Table_Transactions.php:20 +msgid "transaction" msgstr "" -#: admin/settings-options.php:318 -msgid "Active Tab" +#: includes/Admin/List_Table_Transactions.php:21 +msgid "transactions" msgstr "" -#: admin/settings-options.php:319 -msgid "Which tab should be set as active by default when opening the account page" +#: includes/Admin/List_Table_Transactions.php:46 +msgid "ID" msgstr "" -#: admin/settings-options.php:325 -msgid "Show Subscriptions" +#: includes/Admin/List_Table_Transactions.php:48 +msgid "User" msgstr "" -#: admin/settings-options.php:326 -msgid "" -"Show Subscriptions tab in \"my account\" page where " -"[wpuf_account] is located" +#: includes/Admin/List_Table_Transactions.php:49 includes/WPUF_Privacy.php:335 +msgid "Subtotal" msgstr "" -#: admin/settings-options.php:332 includes/class-customizer.php:21 -#: includes/class-customizer.php:65 -msgid "Show Billing Address" +#: includes/Admin/List_Table_Transactions.php:51 +#: includes/Free/Free_Loader.php:194 includes/Traits/TaxableTrait.php:503 +#: includes/WPUF_Privacy.php:339 +msgid "Tax" msgstr "" -#: admin/settings-options.php:333 -msgid "Show billing address in account page." +#: includes/Admin/List_Table_Transactions.php:52 includes/WPUF_Privacy.php:347 +#: includes/WPUF_Privacy.php:418 +msgid "Post ID" msgstr "" -#: admin/settings-options.php:343 -msgid "Auto Login After Registration" +#: includes/Admin/List_Table_Transactions.php:53 includes/WPUF_Privacy.php:351 +#: includes/WPUF_Privacy.php:471 +msgid "Pack ID" msgstr "" -#: admin/settings-options.php:344 -msgid "If enabled, users after registration will be logged in to the system" +#: includes/Admin/List_Table_Transactions.php:55 +msgid "Payer" msgstr "" -#: admin/settings-options.php:350 -msgid "Login/Registration override" +#: includes/Admin/List_Table_Transactions.php:57 +msgid "Trans ID" msgstr "" -#: admin/settings-options.php:351 -msgid "" -"If enabled, default login and registration forms will be overridden by WPUF " -"with pages below" +#: includes/Admin/List_Table_Transactions.php:58 +#: includes/Free/Form_Element.php:17 +msgid "Date" msgstr "" -#: admin/settings-options.php:357 -msgid "Registration Page" +#: includes/Admin/List_Table_Transactions.php:111 wpuf-functions.php:69 +msgid "Pending" msgstr "" -#: admin/settings-options.php:358 -msgid "" -"Select the page you want to use as registration page override (should " -"have shortcode)" +#: includes/Admin/List_Table_Transactions.php:135 +#: includes/Admin/List_Table_Transactions.php:213 +msgid "Accept" msgstr "" -#: admin/settings-options.php:364 -msgid "Login Page" +#: includes/Admin/List_Table_Transactions.php:137 +#: includes/Admin/List_Table_Transactions.php:214 +msgid "Reject" msgstr "" -#: admin/settings-options.php:365 -msgid "Select the page which contains [wpuf-login] shortcode" +#: includes/Admin/List_Table_Transactions.php:199 +msgid "No transactions found." msgstr "" -#: admin/settings-options.php:371 -msgid "Redirect After Login" +#: includes/Admin/Menu.php:327 +#: includes/Admin/views/post-forms-list-table-view.php:16 +msgid "Submit Ideas" msgstr "" -#: admin/settings-options.php:372 -msgid "After successfull login, where the page will redirect to" +#: includes/Admin/Promotion.php:117 +msgid "Sure! I'd love to!" msgstr "" -#: admin/settings-options.php:378 -msgid "Default Login Redirect" +#: includes/Admin/Promotion.php:118 +msgid "I've already left a review" msgstr "" -#: admin/settings-options.php:379 -msgid "" -"If enabled, users who login using WordPress default login form will be " -"redirected to the selected page." +#: includes/Admin/Promotion.php:119 +msgid "Never show again" msgstr "" -#: admin/settings-options.php:385 -msgid "reCAPTCHA in Login Form" +#: includes/Admin/Promotion.php:261 includes/Admin/Whats_New.php:116 +msgid "Dismiss this notice." msgstr "" -#: admin/settings-options.php:386 -msgid "" -"If enabled, users have to verify reCAPTCHA in login page. Also, make sure " -"that reCAPTCHA is configured properly from General Options" +#: includes/Admin/Shortcodes_Button.php:51 +msgid "Add a Form" msgstr "" -#: admin/settings-options.php:397 -msgid "Enable payments on your site." +#: includes/Admin/Shortcodes_Button.php:53 +msgid " Add Form" msgstr "" -#: admin/settings-options.php:403 -msgid "Subscription Pack Page" +#: includes/Admin/Upgrades.php:121 +msgid "WPUF Data Update Required" msgstr "" -#: admin/settings-options.php:404 -msgid "Select the page where [wpuf_sub_pack] located." +#: includes/Admin/Upgrades.php:122 +msgid "Run the updater" msgstr "" -#: admin/settings-options.php:410 -msgid "Subscription at registration" +#: includes/Admin/Upgrades.php:127 +msgid "" +"It is strongly recommended that you backup your database before proceeding. " +"Are you sure you wish to run the updater now?" msgstr "" -#: admin/settings-options.php:411 -msgid "Registration time redirect to subscription page" +#: includes/Admin/Whats_New.php:73 includes/Admin/Whats_New.php:74 +msgid "Whats New" msgstr "" -#: admin/settings-options.php:416 -msgid "Currency" +#: includes/Admin/Whats_New.php:110 +msgid "WP User Frontend - Version %s" msgstr "" -#: admin/settings-options.php:423 -msgid "Currency Position" +#: includes/Admin/Whats_New.php:111 +msgid "" +"Welcome to the new version of WP User Frontend. See what's been changed in " +"the %s version." msgstr "" -#: admin/settings-options.php:427 -msgid "Left" +#: includes/Admin/Whats_New.php:115 +#: includes/Free/templates/page-registration-form.php:86 +msgid "What's New?" msgstr "" -#: admin/settings-options.php:428 -msgid "Right" +#: includes/Admin/Whats_New.php:152 +#: includes/Integrations/WPUF_ACF_Compatibility.php:72 +#: includes/Integrations/WPUF_ACF_Compatibility.php:90 +#: includes/Integrations/WPUF_ACF_Compatibility.php:156 +#: includes/Widgets/Login_Widget.php:36 includes/Widgets/Login_Widget.php:62 +#: includes/Widgets/Login_Widget.php:79 wpuf-functions.php:1537 +#: wpuf-functions.php:1786 +msgid "Permission denied" msgstr "" -#: admin/settings-options.php:429 -msgid "Left with space" +#: includes/Admin/Whats_New.php:163 +msgid "Failed to dismiss notice" msgstr "" -#: admin/settings-options.php:430 -msgid "Right with space" +#: includes/Admin/template-parts/modal.php:5 +msgid "Modal window. Press escape to close." msgstr "" -#: admin/settings-options.php:435 -msgid "Thousand Separator" +#: includes/Admin/template-parts/modal.php:6 +msgid "Close modal window" msgstr "" -#: admin/settings-options.php:436 -msgid "This sets the thousand separator of displayed prices." +#: includes/Admin/template-parts/modal.php:10 +msgid "Select a Template" msgstr "" -#: admin/settings-options.php:444 -msgid "Decimal Separator" +#: includes/Admin/template-parts/modal.php:13 +msgid "Select from a pre-defined template or from a blank form" msgstr "" -#: admin/settings-options.php:445 -msgid "This sets the decimal separator of displayed prices." +#: includes/Admin/template-parts/modal.php:24 +#: includes/Admin/template-parts/modal.php:28 +#: includes/Admin/template-parts/modal.php:32 +msgid "Blank Form" msgstr "" -#: admin/settings-options.php:452 -msgid "Number of Decimals" +#: includes/Admin/template-parts/modal.php:35 +#: includes/Admin/template-parts/modal.php:71 +msgid "Create Form" msgstr "" -#: admin/settings-options.php:453 -msgid "This sets the number of decimal points shown in displayed prices." +#: includes/Admin/template-parts/modal.php:56 +msgid "This integration is not installed." msgstr "" -#: admin/settings-options.php:463 -msgid "Enable demo/sandbox mode" +#: includes/Admin/template-parts/modal.php:105 +#: includes/Free/Free_Loader.php:984 includes/Free/Free_Loader.php:1066 +#: includes/Free/templates/page-registration-form.php:156 +msgid "Upgrade to PRO" msgstr "" -#: admin/settings-options.php:464 -msgid "When sandbox mode is active, all payment gateway will be used in demo mode" +#: includes/Admin/views/post-forms-list-table-view.php:27 +msgid "Search Forms" msgstr "" -#: admin/settings-options.php:470 -msgid "Payment Page" +#: includes/Admin/views/post-forms-list-table-view.php:43 +msgid "Learn more about Frontend Posting" msgstr "" -#: admin/settings-options.php:471 -msgid "This page will be used to process payment options" +#: includes/Admin/views/premium.php:2 includes/Admin/views/premium.php:5 +msgid "WPUF Pro" msgstr "" -#: admin/settings-options.php:478 lib/gateway/bank.php:36 -msgid "After payment users will be redirected here" +#: includes/Admin/views/premium.php:4 +msgid "" +"Upgrade to the premium versions of WPUF and unlock even more useful " +"features." msgstr "" -#: admin/settings-options.php:484 -msgid "Payment Gateways" +#: includes/Admin/views/premium.php:10 +msgid "Pro Features" msgstr "" -#: admin/settings-options.php:485 -msgid "Active payment gateways" +#: includes/Admin/views/premium.php:11 +msgid "" +"WPUF Pro is designed just for you, specially to fulfil your business needs. " +"We have designed and curated every feature keeping your requirements in " +"mind." msgstr "" -#: admin/settings-options.php:491 -msgid "Retry Failed Payment" +#: includes/Admin/views/premium.php:18 includes/Admin/views/premium.php:21 +msgid "Registration Form Builder" msgstr "" -#: admin/settings-options.php:492 -msgid "How many times should retry for failed payment max is 4" +#: includes/Admin/views/premium.php:22 +msgid "" +"Registration form builder is a two way form which can be used both for user " +"registration and profile editing. You could also manage Register for " +"Subscription Package Purchase." msgstr "" -#: admin/settings-options.php:507 -msgid " Guest Email" +#: includes/Admin/views/premium.php:28 includes/Admin/views/premium.php:31 +msgid "Advanced Fields" msgstr "" -#: admin/settings-options.php:514 -msgid "Guest Email Notification" +#: includes/Admin/views/premium.php:33 +#: includes/Fields/Form_Pro_Upgrade_Fields.php:47 +#: includes/Free/Form_Element.php:20 +msgid "Country List" msgstr "" -#: admin/settings-options.php:515 -msgid "Enable Guest Email Notification ." +#: includes/Admin/views/premium.php:34 +msgid "Address" msgstr "" -#: admin/settings-options.php:521 -msgid "Guest mail subject" +#: includes/Admin/views/premium.php:35 +msgid "Date Field" msgstr "" -#: admin/settings-options.php:522 -msgid "This sets the subject of the emails sent to guest users" +#: includes/Admin/views/premium.php:36 +#: includes/Fields/Form_Pro_Upgrade_Fields.php:88 +msgid "Google Map" msgstr "" -#: admin/settings-options.php:529 -msgid "Guest mail body" +#: includes/Admin/views/premium.php:37 +#: includes/Fields/Form_Pro_Upgrade_Fields.php:99 +#: includes/Free/Form_Element.php:38 +msgid "Action Hook" msgstr "" -#: admin/settings-options.php:530 -msgid "" -"This sets the body of the emails sent to guest users. Please DON'T edit the " -"{activation_link} part, you can use {sitename} too." +#: includes/Admin/views/premium.php:38 +msgid "Rating" msgstr "" -#: admin/settings-options.php:549 -msgid "Post Types" +#: includes/Admin/views/premium.php:40 +msgid "Number" msgstr "" -#: admin/settings-options.php:550 -msgid "Select the post types you will allow users to export." +#: includes/Admin/views/premium.php:41 +msgid "Repeater" msgstr "" -#: admin/settings-options.php:583 -msgid "" -"Select profile/registration forms for user roles. These forms will be used " -"to populate extra edit profile fields in backend." +#: includes/Admin/views/premium.php:42 +#: includes/Fields/Form_Pro_Upgrade_Fields.php:77 +#: includes/Free/Form_Element.php:18 +msgid "File Upload" msgstr "" -#: admin/subscribers.php:4 -msgid "Number of subscribers per page:" +#: includes/Admin/views/premium.php:43 +msgid "Captcha" msgstr "" -#: admin/template-post.php:36 includes/fields/class-field-post-content.php:143 -msgid "Enable Image Insertion" +#: includes/Admin/views/premium.php:44 +msgid "TOC" msgstr "" -#: admin/template-post.php:42 includes/fields/class-field-post-content.php:145 -msgid "Enable image upload in post area" +#: includes/Admin/views/premium.php:51 includes/Admin/views/premium.php:54 +msgid "Manage Coupons" msgstr "" -#: admin/template-post.php:88 admin/template.php:608 -#: includes/fields/class-field-featured-image.php:116 -#: includes/fields/class-field-image.php:101 -msgid "Enter maximum upload size limit in KB" +#: includes/Admin/views/premium.php:55 +msgid "" +"Simple yet powerful coupon management system. Use Coupon codes for selling " +"subscription pack with discounts." msgstr "" -#: admin/template-post.php:99 admin/template.php:619 -#: includes/fields/class-field-featured-image.php:112 -#: includes/fields/class-field-image.php:97 -msgid "Max. file size" +#: includes/Admin/views/premium.php:61 includes/Admin/views/premium.php:64 +msgid "Content Restrictions" msgstr "" -#: admin/template-post.php:147 includes/fields/class-abstract-fields.php:440 -msgid "Type" +#: includes/Admin/views/premium.php:65 +msgid "" +"You can restrict premium content for users by access role, registration or " +"subscriptions only with just a shortcode." msgstr "" -#: admin/template-post.php:149 includes/fields/class-field-dropdown.php:9 -#: includes/fields/class-field-dropdown.php:103 -msgid "Dropdown" +#: includes/Admin/views/premium.php:71 includes/Admin/views/premium.php:74 +#: includes/Free/Form_Element.php:500 includes/Pro_Upgrades.php:85 +msgid "Conditional Logic" msgstr "" -#: admin/template-post.php:150 includes/fields/class-abstract-fields.php:444 -#: includes/fields/class-field-multidropdown.php:9 -#: includes/fields/class-field-multidropdown.php:79 -msgid "Multi Select" +#: includes/Admin/views/premium.php:75 +msgid "" +"Configure your form’s settings and user flow based on conditional " +"selection. Your forms should appear just the way you want it." msgstr "" -#: admin/template-post.php:151 includes/fields/class-abstract-fields.php:445 -#: includes/fields/class-field-checkbox.php:9 -msgid "Checkbox" +#: includes/Admin/views/premium.php:81 includes/Admin/views/premium.php:84 +msgid "Multi-step Form" msgstr "" -#: admin/template-post.php:152 includes/fields/class-abstract-fields.php:446 -msgid "Text Input" +#: includes/Admin/views/premium.php:85 +msgid "" +"Break down the long forms into smaller and attractive multi step forms. " +"Long and lengthy forms are uninviting, why build one?" msgstr "" -#: admin/template-post.php:153 includes/fields/class-abstract-fields.php:447 -msgid "Ajax" +#: includes/Admin/views/premium.php:93 includes/Free/Free_Loader.php:92 +#: includes/Free/Free_Loader.php:1025 +msgid "Modules" msgstr "" -#: admin/template-post.php:158 includes/fields/class-abstract-fields.php:480 -msgid "Order By" +#: includes/Admin/views/premium.php:94 +msgid "A bunch of awesome modules to speed up your business growth." msgstr "" -#: admin/template-post.php:161 includes/fields/class-abstract-fields.php:484 -msgid "Term ID" +#: includes/Admin/views/premium.php:101 includes/Admin/views/premium.php:121 +#: includes/Admin/views/premium.php:124 +msgid "BuddyPress Profile" msgstr "" -#: admin/template-post.php:162 includes/fields/class-abstract-fields.php:485 -msgid "Slug" +#: includes/Admin/views/premium.php:104 includes/Free/Free_Loader.php:173 +msgid "Social Login" msgstr "" -#: admin/template-post.php:163 includes/fields/class-abstract-fields.php:486 -msgid "Count" +#: includes/Admin/views/premium.php:105 +msgid "" +"Allow your users to Register or Login using Social networks like Google, " +"Facebook, Twitter and LinkedIn." msgstr "" -#: admin/template-post.php:164 includes/fields/class-abstract-fields.php:487 -msgid "Term Group" +#: includes/Admin/views/premium.php:111 includes/Admin/views/premium.php:114 +#: includes/Free/Free_Loader.php:180 +msgid "User Directory" msgstr "" -#: admin/template-post.php:169 includes/fields/class-abstract-fields.php:496 -msgid "Order" +#: includes/Admin/views/premium.php:115 +msgid "" +"Handle user listing and user profile in the frontend. Create a directory " +"site easily." msgstr "" -#: admin/template-post.php:171 includes/fields/class-abstract-fields.php:500 -msgid "ASC" +#: includes/Admin/views/premium.php:125 +msgid "Register and upgrade user profiles and sync data with BuddyPress." msgstr "" -#: admin/template-post.php:172 includes/fields/class-abstract-fields.php:501 -msgid "DESC" +#: includes/Admin/views/premium.php:131 includes/Admin/views/premium.php:171 +msgid "MailChimp Integration" msgstr "" -#: admin/template-post.php:177 includes/fields/class-abstract-fields.php:510 -msgid "Selection Type" +#: includes/Admin/views/premium.php:134 +msgid "User Analytics" msgstr "" -#: admin/template-post.php:179 includes/fields/class-abstract-fields.php:513 -msgid "Exclude" +#: includes/Admin/views/premium.php:135 +msgid "Show user tracking info during post and registration directly on Frontend." msgstr "" -#: admin/template-post.php:180 includes/fields/class-abstract-fields.php:514 -msgid "Include" +#: includes/Admin/views/premium.php:141 includes/Admin/views/premium.php:144 +msgid "Paid Membership Pro" msgstr "" -#: admin/template-post.php:181 includes/fields/class-abstract-fields.php:515 -msgid "Child of" +#: includes/Admin/views/premium.php:145 +msgid "Membership Integration of WP User Frontend with Paid Membership Pro." msgstr "" -#: admin/template-post.php:186 -msgid "Selection terms" +#: includes/Admin/views/premium.php:151 includes/Admin/views/premium.php:154 +msgid "Stripe Payment" msgstr "" -#: admin/template-post.php:187 -msgid "Search the terms name." +#: includes/Admin/views/premium.php:155 +msgid "" +"Stripe payment gateway for WP User Frontend. Get your subscription payment " +"with Stripe." msgstr "" -#: admin/template-post.php:191 -msgid "WooCommerce Attribute" +#: includes/Admin/views/premium.php:161 includes/Admin/views/premium.php:164 +msgid "Mailpoet" msgstr "" -#: admin/template-post.php:197 includes/fields/class-abstract-fields.php:537 -msgid "This taxonomy is a WooCommerce attribute" +#: includes/Admin/views/premium.php:165 +msgid "" +"Add subscribers to mailpoet mailing list when they registers via WP User " +"Frontend Pro." msgstr "" -#: admin/template-post.php:203 includes/fields/class-abstract-fields.php:345 -msgid "Visibility" +#: includes/Admin/views/premium.php:174 +msgid "MailChimp" msgstr "" -#: admin/template-post.php:209 includes/fields/class-abstract-fields.php:548 -msgid "Visible on product page" +#: includes/Admin/views/premium.php:175 +msgid "" +"Integrate your desired form to your MailChimp email newsletter using latest " +"API." msgstr "" -#: admin/template-post.php:247 -msgid "all" +#: includes/Admin/views/premium.php:181 includes/Admin/views/premium.php:184 +#: includes/Admin/views/premium.php:191 includes/Admin/views/premium.php:201 +msgid "SMS Notification" msgstr "" -#: admin/template-post.php:247 -msgid "Show All" +#: includes/Admin/views/premium.php:185 +msgid "Get instant SMS notification on your mobile when post submits on your site." msgstr "" -#: admin/template-post.php:250 -msgid "hide" +#: includes/Admin/views/premium.php:194 +msgid "Comment Manager" msgstr "" -#: admin/template-post.php:250 -msgid "Hide These Countries" +#: includes/Admin/views/premium.php:195 +msgid "Handle comments in frontend. View / reply comments on post." msgstr "" -#: admin/template-post.php:251 -msgid "Chose Country to hide from List" +#: includes/Admin/views/premium.php:204 +msgid "QR Code Generator" msgstr "" -#: admin/template-post.php:255 -msgid "show" +#: includes/Admin/views/premium.php:205 +msgid "Generate QR Code with your custom fields or custom post meta." msgstr "" -#: admin/template-post.php:255 -msgid "Show These Countries" +#: includes/Admin/views/premium.php:211 includes/Admin/views/premium.php:214 +msgid "More..." msgstr "" -#: admin/template-post.php:256 -msgid "Add Country to List" +#: includes/Admin/views/premium.php:215 +msgid "A bunch of more modules are coming soon." msgstr "" -#: admin/template.php:20 -msgid "Click and Drag to rearrange" +#: includes/Admin/views/premium.php:225 +msgid "Upgrade To The Most Powerful Frontend Plugin" msgstr "" -#: admin/template.php:24 -msgid "Remove" +#: includes/Admin/views/premium.php:227 +msgid "WP User Frontend Pro is the most powerful solution for your frontend needs." msgstr "" -#: admin/template.php:25 -msgid "Toggle" +#: includes/Admin/views/shortcode-builder.php:5 +msgid "Select a form to insert" msgstr "" -#: admin/template.php:60 includes/class-customizer.php:106 -#: includes/fields/class-abstract-fields.php:294 -msgid "Required" +#: includes/Admin/views/shortcode-builder.php:9 +#: includes/Free/templates/page-registration-form.php:94 +msgid "Registration Form" msgstr "" -#: admin/template.php:69 includes/fields/class-abstract-fields.php:276 -msgid "Field Label" +#: includes/Admin/views/shortcode-builder.php:13 +msgid "Form Type" msgstr "" -#: admin/template.php:70 includes/fields/class-abstract-fields.php:280 -msgid "Enter a title of this field" +#: includes/Admin/views/shortcode-builder.php:69 +msgid "Insert Form" msgstr "" -#: admin/template.php:75 admin/template.php:550 -#: includes/fields/class-abstract-fields.php:363 -#: includes/fields/class-field-hidden.php:39 -msgid "Meta Key" +#: includes/Admin/views/subscribers.php:4 +msgid "Number of subscribers per page:" msgstr "" -#: admin/template.php:76 admin/template.php:551 -#: includes/fields/class-abstract-fields.php:367 -#: includes/fields/class-field-hidden.php:43 -msgid "Name of the meta key this field will save to" +#: includes/Admin/views/support.php:187 +msgid "Related Articles:" msgstr "" -#: admin/template.php:87 includes/fields/class-abstract-fields.php:285 -msgid "Help text" +#: includes/Admin/views/support.php:205 +msgid "General Help Questions" msgstr "" -#: admin/template.php:88 includes/fields/class-abstract-fields.php:289 -msgid "Give the user some information about this field" +#: includes/Admin/views/support.php:205 +msgid "View all Documentations" msgstr "" -#: admin/template.php:92 includes/fields/class-abstract-fields.php:324 -#: includes/fields/class-field-column.php:86 -msgid "CSS Class Name" +#: includes/Admin/views/support.php:210 +msgid "Subscribe to Our Newsletter" msgstr "" -#: admin/template.php:93 -msgid "Add a CSS class name for this field" +#: includes/Admin/views/support.php:212 +msgid "" +"Subscribe to our newsletter for regular tips, " +"offers and news updates." msgstr "" -#: admin/template.php:117 admin/template.php:175 -#: includes/fields/class-abstract-fields.php:576 -#: includes/fields/class-abstract-fields.php:660 -msgid "Placeholder text" +#: includes/Admin/views/support.php:218 includes/Free/Edit_Profile.php:108 +#: includes/WPUF_Privacy.php:355 +msgid "First Name" msgstr "" -#: admin/template.php:118 includes/fields/class-abstract-fields.php:582 -#: includes/fields/class-abstract-fields.php:664 -msgid "Text for HTML5 placeholder attribute" +#: includes/Admin/views/support.php:229 +msgid "Subscribe" msgstr "" -#: admin/template.php:122 admin/template.php:180 -#: includes/fields/class-abstract-fields.php:587 -#: includes/fields/class-abstract-fields.php:672 -msgid "Default value" +#: includes/Admin/views/support.php:240 +msgid "Plugin Setup" msgstr "" -#: admin/template.php:123 includes/fields/class-abstract-fields.php:593 -#: includes/fields/class-abstract-fields.php:676 -msgid "The default value this field will have" +#: includes/Admin/views/support.php:246 +#: includes/functions/settings-options.php:19 +msgid "Frontend Posting" msgstr "" -#: admin/template.php:127 includes/fields/class-abstract-fields.php:598 -msgid "Size" +#: includes/Admin/views/support.php:252 +msgid "Frontend Dashboard" msgstr "" -#: admin/template.php:128 includes/fields/class-abstract-fields.php:603 -msgid "Size of this input field" +#: includes/Admin/views/support.php:258 +msgid "User Registration" msgstr "" -#: admin/template.php:132 admin/template.php:195 -msgid "Word Restriction" +#: includes/Admin/views/support.php:264 +msgid "User Login" msgstr "" -#: admin/template.php:136 admin/template.php:199 -msgid "Numebr of words the author to be restricted in" +#: includes/Admin/views/support.php:270 +msgid "Profile Editing" msgstr "" -#: admin/template.php:165 includes/fields/class-abstract-fields.php:642 -msgid "Rows" +#: includes/Admin/views/support.php:276 +msgid "Subscription & Payment" msgstr "" -#: admin/template.php:170 includes/fields/class-abstract-fields.php:651 -#: includes/fields/class-field-column.php:9 -msgid "Columns" +#: includes/Admin/views/support.php:282 includes/Fields/Field_Contract.php:69 +msgid "Content Restriction" msgstr "" -#: admin/template.php:185 includes/fields/class-abstract-fields.php:681 -#: includes/fields/class-field-textarea.php:9 -#: includes/fields/class-field-textarea.php:123 -msgid "Textarea" +#: includes/Admin/views/support.php:304 +msgid "Learn More About Installation" msgstr "" -#: admin/template.php:188 includes/fields/class-abstract-fields.php:684 -msgid "Normal" +#: includes/Admin/views/support.php:315 +msgid "Learn More About Frontend Posting" msgstr "" -#: admin/template.php:189 includes/fields/class-abstract-fields.php:685 -msgid "Rich textarea" +#: includes/Admin/views/support.php:325 +msgid "Learn More About Frontend Dashboard" msgstr "" -#: admin/template.php:190 includes/fields/class-abstract-fields.php:686 -msgid "Teeny Rich textarea" +#: includes/Admin/views/support.php:355 +msgid "Learn More About Registration" msgstr "" -#: admin/template.php:285 -msgid "show values" +#: includes/Admin/views/support.php:371 +msgid "Learn More About Login" msgstr "" -#: admin/template.php:377 admin/template.php:401 admin/template.php:432 -#: admin/template.php:463 includes/fields/class-abstract-fields.php:624 -#: templates/dashboard/list.php:19 templates/dashboard/posts.php:109 -msgid "Options" +#: includes/Admin/views/support.php:388 +msgid "Learn More About Profile Editing" msgstr "" -#: admin/template.php:417 admin/template.php:448 -#: includes/fields/class-abstract-fields.php:460 -#: includes/fields/class-field-dropdown.php:87 -msgid "" -"First element of the select dropdown. Leave this empty if you don't want to " -"show this field" +#: includes/Admin/views/support.php:441 +msgid "Learn More About Payments" msgstr "" -#: admin/template.php:427 admin/template.php:458 -#: includes/fields/class-abstract-fields.php:456 -#: includes/fields/class-field-dropdown.php:83 -msgid "Select Text" +#: includes/Admin/views/support.php:458 +msgid "Learn More About Content Restriction" msgstr "" -#: admin/template.php:520 admin/template.php:578 admin/template.php:656 -#: class/upload.php:275 includes/fields/class-field-recaptcha.php:147 -#: includes/fields/class-field-sectionbreak.php:55 -#: templates/dashboard/list.php:10 templates/dashboard/posts.php:100 -#: wpuf-functions.php:1025 -msgid "Title" +#: includes/Admin/views/support.php:467 includes/Admin/views/support.php:469 +msgid "Like The Plugin?" msgstr "" -#: admin/template.php:525 -msgid "HTML Codes" +#: includes/Admin/views/support.php:471 +msgid "Your Review is very important to us as it helps us to grow more." msgstr "" -#: admin/template.php:557 includes/fields/class-field-hidden.php:48 -msgid "Meta Value" +#: includes/Admin/views/support.php:473 +msgid "Review Us on WP.org" msgstr "" -#: admin/template.php:558 includes/fields/class-field-hidden.php:52 -msgid "Enter the meta value" +#: includes/Admin/views/support.php:477 includes/Admin/views/support.php:479 +msgid "Found Any Bugs?" msgstr "" -#: admin/template.php:583 class/upload.php:277 -#: includes/fields/class-field-sectionbreak.php:63 wpuf-functions.php:1033 -msgid "Description" +#: includes/Admin/views/support.php:481 +msgid "Report any Bug that you Discovered, Get Instant Solutions." msgstr "" -#: admin/template.php:609 includes/fields/class-field-image.php:110 -msgid "Number of images can be uploaded" +#: includes/Admin/views/support.php:483 +msgid "Report to GitHub" msgstr "" -#: admin/template.php:624 includes/fields/class-field-image.php:106 -msgid "Max. files" +#: includes/Admin/views/support.php:487 includes/Admin/views/support.php:489 +msgid "Need Any Assistance?" msgstr "" -#: admin/template.php:662 -msgid "" -"Insert your public key and private key in plugin settings. " -"Register first if you don't have any keys." +#: includes/Admin/views/support.php:491 +msgid "Our EXPERT Support Team is always ready to Help you out." msgstr "" -#: admin/template.php:668 -msgid "reCaptcha type" +#: includes/Admin/views/support.php:493 +msgid "Contact Support" msgstr "" -#: admin/template.php:672 includes/fields/class-field-recaptcha.php:160 -msgid "Enable Invisible reCaptcha" +#: includes/Admin/views/tools.php:9 +msgid "Import" msgstr "" -#: admin/template.php:676 includes/fields/class-field-recaptcha.php:159 -msgid "Enable noCaptcha" +#: includes/Ajax/Address_Form_Ajax.php:40 +msgid "Some Required Fields are not filled!" msgstr "" -#: admin/tools.php:15 -msgid "Import" +#: includes/Ajax/Address_Form_Ajax.php:191 includes/Traits/TaxableTrait.php:108 +#: includes/Traits/TaxableTrait.php:211 includes/Traits/TaxableTrait.php:265 +#: templates/dashboard/billing-address.php:69 +msgid "Choose a country" msgstr "" -#: class/asset-loader.php:32 wpuf.php:632 -msgid "is required" +#: includes/Ajax/Address_Form_Ajax.php:224 includes/Traits/TaxableTrait.php:125 +#: includes/Traits/TaxableTrait.php:160 includes/Traits/TaxableTrait.php:233 +#: templates/dashboard/billing-address.php:111 +msgid "Choose a state" msgstr "" -#: class/asset-loader.php:33 wpuf.php:633 -msgid "does not match" +#: includes/Ajax/Address_Form_Ajax.php:243 +#: templates/dashboard/billing-address.php:134 +msgid "Address Line 1 " msgstr "" -#: class/asset-loader.php:34 wpuf.php:634 -msgid "is not valid" +#: includes/Ajax/Address_Form_Ajax.php:254 +#: templates/dashboard/billing-address.php:142 +msgid "Address Line 2 " msgstr "" -#: class/asset-loader.php:46 wpuf.php:712 -msgid "Please fix the errors to proceed" +#: includes/Ajax/Address_Form_Ajax.php:285 +#: templates/dashboard/billing-address.php:167 +msgid "Update Billing Address" msgstr "" -#: class/asset-loader.php:48 wpuf.php:719 -msgid "Word limit reached" +#: includes/Ajax/Address_Form_Ajax.php:328 +#: templates/dashboard/billing-address.php:32 +msgid "Billing address is updated." msgstr "" -#: class/asset-loader.php:49 wpuf.php:714 -msgid "Are you sure you want to cancel your current subscription ?" +#: includes/Ajax/Admin_Form_Builder_Ajax.php:23 +msgid "form data is missing" msgstr "" -#: class/frontend-account.php:39 -msgid "Post Submission" +#: includes/Ajax/Admin_Form_Builder_Ajax.php:35 +msgid "Invalid form id" msgstr "" -#: class/frontend-account.php:40 -msgid "Enable if you want to allow users to submit post from the account page." +#: includes/Ajax/Admin_Form_Builder_Ajax.php:86 +msgid "Invalid post type" msgstr "" -#: class/frontend-account.php:47 -msgid "Submission Menu Label" +#: includes/Ajax/Frontend_Form_Ajax.php:60 +msgid "Minimum %d character is required for %s" msgstr "" -#: class/frontend-account.php:48 -msgid "Label for post submission menu" +#: includes/Ajax/Frontend_Form_Ajax.php:68 +msgid "Maximum %d character is allowed for %s" msgstr "" -#: class/frontend-account.php:50 class/frontend-account.php:101 -#: includes/class-wcmp-integration.php:127 -#: includes/class-wcmp-integration.php:144 -msgid "Submit Post" +#: includes/Ajax/Frontend_Form_Ajax.php:79 +msgid "Minimum %d word is required for %s" msgstr "" -#: class/frontend-account.php:55 -msgid "Submission Form" +#: includes/Ajax/Frontend_Form_Ajax.php:87 +msgid "Maximum %d word is allowed for %s" msgstr "" -#: class/frontend-account.php:56 -msgid "" -"Select a post form that will use to submit post by the users from their " -"account page." +#: includes/Ajax/Frontend_Form_Ajax.php:107 +msgid "Using %s as shortcode is restricted" msgstr "" -#: class/frontend-account.php:243 -msgid "

    You have not subscribed to any package yet.

    " +#: includes/Ajax/Frontend_Form_Ajax.php:335 +msgid "Something went wrong" msgstr "" -#: class/frontend-account.php:251 -msgid "

    You may have processed your payment, but the pack is not active yet.

    " +#: includes/Ajax/Frontend_Form_Ajax.php:407 +#: includes/Ajax/Frontend_Form_Ajax.php:413 +msgid "" +"Thank you for posting on our site. We have sent you an confirmation email. " +"Please check your inbox!" msgstr "" -#: class/frontend-account.php:268 -#. translators: %s: billing cycle number, %s: billing cycle period -msgid "For each" +#: includes/Ajax/Frontend_Form_Ajax.php:483 +msgid "Invalid email address." msgstr "" -#: class/frontend-account.php:340 -msgid "Nonce failure" +#: includes/Ajax/Frontend_Form_Ajax.php:509 +msgid "" +"You already have an account in our site. Please login to continue.\n" +"\n" +"Clicking 'OK' will redirect you to the login page and you will lose the " +"form data.\n" +"Click 'Cancel' to stay at this page." msgstr "" -#: class/frontend-account.php:354 -msgid "First Name is a required field." +#: includes/Ajax/Frontend_Form_Ajax.php:563 +#: includes/Frontend_Render_Form.php:216 +#: includes/class-frontend-render-form.php:324 +msgid "You do not have sufficient permissions to access this form." msgstr "" -#: class/frontend-account.php:358 -msgid "Last Name is a required field." +#: includes/Ajax/Upload_Ajax.php:240 wpuf-functions.php:1056 +msgid "Caption" msgstr "" -#: class/frontend-account.php:362 -msgid "Email is a required field." +#: includes/Ajax/Upload_Ajax.php:268 +msgid "attach_id is required." msgstr "" -#: class/frontend-account.php:374 -msgid "Please provide a valid email address." +#: includes/Ajax/Upload_Ajax.php:273 +msgid "attachment not found." msgstr "" -#: class/frontend-account.php:376 -msgid "This email address is already registered." +#: includes/Ajax/Upload_Ajax.php:282 +msgid "Attachment deleted successfully." msgstr "" -#: class/frontend-account.php:382 -msgid "Please fill out all password fields." +#: includes/Ajax/Upload_Ajax.php:284 +msgid "Could not deleted the attachment" msgstr "" -#: class/frontend-account.php:385 -msgid "Please enter your current password." +#: includes/Ajax/Upload_Ajax.php:286 +msgid "Something went wrong." msgstr "" -#: class/frontend-account.php:388 -msgid "Please re-enter your password." +#: includes/Data/countries-formated.php:77 +msgid "Bangladesh" msgstr "" -#: class/frontend-account.php:391 -msgid "New passwords do not match." +#: includes/Fields/Field_Contract.php:41 +msgid "Content restricted type" msgstr "" -#: class/frontend-account.php:394 class/frontend-account.php:405 -msgid "Your current password is incorrect." +#: includes/Fields/Field_Contract.php:44 +msgid "Minimun" msgstr "" -#: class/frontend-dashboard.php:88 -msgid "Post Deleted" +#: includes/Fields/Field_Contract.php:45 +msgid "Maximum" msgstr "" -#: class/frontend-dashboard.php:175 -msgid "Author Info" +#: includes/Fields/Field_Contract.php:55 +msgid "Content restricted by" msgstr "" -#: class/frontend-dashboard.php:218 templates/dashboard/posts.php:34 -#. translators: %s: user display name -msgid "You are not the post author. Cheating huh!" +#: includes/Fields/Field_Contract.php:58 +msgid "Character" msgstr "" -#: class/payment.php:22 class/payment.php:23 -msgid "PayPal" +#: includes/Fields/Field_Contract.php:59 +msgid "Word" msgstr "" -#: class/payment.php:27 class/payment.php:28 -msgid "Bank Payment" +#: includes/Fields/Field_Contract.php:73 +msgid "Number of characters or words the author to be restricted in" msgstr "" -#: class/payment.php:76 includes/free/edit-profile.php:32 -#: includes/free/edit-user.php:40 templates/unauthorized.php:4 -#. translators: %s: login url -msgid "This page is restricted. Please %s to view this page." +#: includes/Fields/Field_Contract.php:306 +msgid "" +"Check this option to mark the field required. A form will not submit unless " +"all required fields are provided." msgstr "" -#: class/payment.php:82 -msgid "Please select your payment page from admin panel" +#: includes/Fields/Field_Contract.php:311 +msgid "Field Size" msgstr "" -#: class/payment.php:97 -msgid "No subscription pack found." +#: includes/Fields/Field_Contract.php:314 +msgid "Small" msgstr "" -#: class/payment.php:134 -msgid "Your free package has been activated. Enjoy!" +#: includes/Fields/Field_Contract.php:315 +msgid "Medium" msgstr "" -#: class/payment.php:136 -msgid "You already have activated a free package previously." +#: includes/Fields/Field_Contract.php:316 +msgid "Large" msgstr "" -#: class/payment.php:154 includes/class-customizer.php:56 -#: wpuf-functions.php:2045 -msgid "Billing Address" +#: includes/Fields/Field_Contract.php:330 +#: includes/Fields/Form_Field_Column.php:99 +msgid "" +"Provide a container class name for this field. Available classes: " +"wpuf-col-half, wpuf-col-half-last, wpuf-col-one-third, " +"wpuf-col-one-third-last" msgstr "" -#: class/payment.php:186 -msgid "Pricing & Plans" +#: includes/Fields/Field_Contract.php:351 +#: includes/Fields/Form_Field_Column.php:111 +msgid "Everyone" msgstr "" -#: class/payment.php:188 -msgid "Change Pack" +#: includes/Fields/Field_Contract.php:353 +#: includes/Fields/Form_Field_Column.php:113 +msgid "Logged in users only" msgstr "" -#: class/payment.php:205 -msgid "Selected Pack " +#: includes/Fields/Field_Contract.php:354 +#: includes/Fields/Form_Field_Column.php:114 +msgid "Subscription users only" msgstr "" -#: class/payment.php:206 -msgid "Pack Price " +#: includes/Fields/Field_Contract.php:358 +#: includes/Fields/Form_Field_Column.php:118 +msgid "Select option" msgstr "" -#: class/payment.php:210 class/payment.php:261 includes/class-privacy.php:338 -msgid "Total" +#: includes/Fields/Field_Contract.php:374 +msgid "Read Only" msgstr "" -#: class/payment.php:224 -msgid "Apply Coupon" +#: includes/Fields/Field_Contract.php:377 +msgid "Make this field read only " msgstr "" -#: class/payment.php:228 -msgid "Have a discount code?" +#: includes/Fields/Field_Contract.php:381 +msgid "Read only" msgstr "" -#: class/payment.php:257 -msgid "Post cost" +#: includes/Fields/Field_Contract.php:389 +msgid "Show Data in Post" msgstr "" -#: class/payment.php:270 -msgid "Choose Your Payment Method" +#: includes/Fields/Field_Contract.php:399 +msgid "Select Yes if you want to show the field data in single post." msgstr "" -#: class/payment.php:307 -msgid "Proceed" +#: includes/Fields/Field_Contract.php:403 +msgid "Hide Field Label in Post" msgstr "" -#: class/payment.php:315 -msgid "No Payment gateway found" +#: includes/Fields/Field_Contract.php:413 +msgid "Select Yes if you want to hide the field label in single post." msgstr "" -#: class/payment.php:505 lib/gateway/bank.php:107 -#. translators: %s is site title name -msgid "[%s] Payment Received" +#: includes/Fields/Field_Contract.php:467 +#: includes/Fields/Form_Field_Checkbox.php:80 +#: includes/Fields/Form_Field_Radio.php:84 +msgid "Show in inline list" msgstr "" -#: class/payment.php:507 -#. translators: %s is site title name -msgid "New payment received at %s" +#: includes/Fields/Field_Contract.php:477 +#: includes/Fields/Form_Field_Checkbox.php:90 +#: includes/Fields/Form_Field_Radio.php:94 +msgid "Show this option in an inline list" msgstr "" -#: class/post-form-templates/post.php:12 -#: includes/free/admin/shortcode-builder.php:8 -msgid "Post Form" +#: includes/Fields/Field_Contract.php:526 +msgid "Selection Terms" msgstr "" -#: class/post-form-templates/post.php:13 -msgid "Form for creating a blog post." +#: includes/Fields/Field_Contract.php:530 +msgid "Search the terms name. use ⇦ ⇨ for navigate" msgstr "" -#: class/post-form-templates/post.php:20 includes/class-privacy.php:417 -#: includes/fields/class-field-post-title.php:6 -msgid "Post Title" +#: includes/Fields/Field_Contract.php:631 +msgid "Add options for the form field" msgstr "" -#: class/post-form-templates/post.php:25 -msgid "Please enter your post name" +#: includes/Fields/Field_Contract.php:648 +msgid "Number of rows in textarea" msgstr "" -#: class/post-form-templates/post.php:36 -msgid "Category" +#: includes/Fields/Field_Contract.php:657 +msgid "Number of columns in textarea" msgstr "" -#: class/post-form-templates/post.php:39 -msgid "Select a category for your post" +#: includes/Fields/Field_Contract.php:696 +msgid "Select buttons to exclude" msgstr "" -#: class/post-form-templates/post.php:40 -#: includes/fields/class-abstract-fields.php:233 -#: includes/fields/class-field-dropdown.php:106 -#: includes/fields/class-field-multidropdown.php:83 -#: includes/fields/class-field-post-taxonomy.php:455 -msgid "- select -" +#: includes/Fields/Field_Contract.php:703 +msgid "" +"Select button for exclude from frontend. Search button name. use ⇦ ⇨ for " +"navigate" msgstr "" -#: class/post-form-templates/post.php:57 -msgid "Post description" +#: includes/Fields/Form_Field_Column.php:79 +msgid "Number of Columns" msgstr "" -#: class/post-form-templates/post.php:60 -msgid "Write the full description of your Post" +#: includes/Fields/Form_Field_Column.php:83 +#: includes/Fields/Form_Field_SectionBreak.php:62 +#: includes/Fields/Form_Field_reCaptcha.php:154 +msgid "Title of the section" msgstr "" -#: class/post-form-templates/post.php:78 class/post-form-templates/post.php:79 -#: includes/fields/class-field-featured-image.php:9 -#: includes/fields/class-field-featured-image.php:142 -#: includes/free/post-form-templates/the_events_calendar.php:126 -#: includes/free/post-form-templates/the_events_calendar.php:127 -#: templates/dashboard/list.php:7 templates/dashboard/posts.php:97 -msgid "Featured Image" +#: includes/Fields/Form_Field_Column.php:87 +msgid "Space Between Columns" msgstr "" -#: class/post-form-templates/post.php:82 -msgid "Upload the main image of your post" +#: includes/Fields/Form_Field_Column.php:91 +msgid "Add padding space between columns. e.g: 10" msgstr "" -#: class/post-form-templates/post.php:92 -#: includes/free/post-form-templates/the_events_calendar.php:139 -msgid "Excerpt" +#: includes/Fields/Form_Field_Email.php:11 +msgid "Email Address" msgstr "" -#: class/post-form-templates/post.php:95 -msgid "Provide a short description of this post (optional)" +#: includes/Fields/Form_Field_Featured_Image.php:124 +#: includes/Fields/Form_Field_Image.php:118 +msgid "Button Label" msgstr "" -#: class/post-form-templates/post.php:112 -#: includes/fields/class-field-post-tags.php:6 -msgid "Tags" +#: includes/Fields/Form_Field_Featured_Image.php:129 +#: includes/Fields/Form_Field_Image.php:123 +msgid "Enter a label for the Select button" msgstr "" -#: class/post-form-templates/post.php:115 -#: includes/free/post-form-templates/the_events_calendar.php:160 -msgid "Separate tags with commas." +#: includes/Fields/Form_Field_HTML.php:11 +msgid "Custom HTML" msgstr "" -#: class/post-form-templates/post.php:133 -msgid "Create Post" +#: includes/Fields/Form_Field_HTML.php:58 +msgid "Html Codes" msgstr "" -#: class/post-form-templates/post.php:147 -msgid "" -"Post has been updated successfully. View post" +#: includes/Fields/Form_Field_HTML.php:62 +msgid "Paste your HTML codes, WordPress shortcodes will also work here" msgstr "" -#: class/post-form-templates/post.php:149 -msgid "Update Post" +#: includes/Fields/Form_Field_HTML.php:79 +msgid "HTML Section" msgstr "" -#: class/render-form.php:87 includes/class-frontend-render-form.php:84 -msgid "Really Simple Captcha validation failed" +#: includes/Fields/Form_Field_Hidden.php:11 +msgid "Hidden Field" msgstr "" -#: class/render-form.php:127 includes/class-frontend-render-form.php:121 -msgid "noCaptcha reCAPTCHA validation failed" +#: includes/Fields/Form_Field_Image.php:13 includes/Free/Form_Element.php:13 +msgid "Image Upload" msgstr "" -#: class/render-form.php:136 includes/class-frontend-render-form.php:130 -msgid "reCAPTCHA validation failed" +#: includes/Fields/Form_Field_Numeric.php:9 +#: includes/Fields/Form_Pro_Upgrade_Fields.php:110 +#: includes/Free/Form_Element.php:21 +msgid "Numeric Field" msgstr "" -#: class/render-form.php:146 includes/class-frontend-render-form.php:140 -msgid "Invisible reCAPTCHA validation failed" +#: includes/Fields/Form_Field_Post_Content.php:11 +#: includes/Free/Free_Loader.php:803 +msgid "Post Content" msgstr "" -#: class/render-form.php:378 includes/class-frontend-render-form.php:285 -msgid "Your selected form is no longer available." +#: includes/Fields/Form_Field_Post_Excerpt.php:9 +msgid "Post Excerpt" msgstr "" -#: class/render-form.php:384 includes/class-frontend-render-form.php:291 -msgid "Please make sure you've published your form." +#: includes/Fields/Form_Field_Radio.php:11 +msgid "Radio" msgstr "" -#: class/render-form.php:1326 includes/free/edit-profile.php:200 -#: templates/registration-form.php:68 -msgid "Confirm Password" +#: includes/Fields/Form_Field_SectionBreak.php:12 +msgid "Section Break" msgstr "" -#: class/render-form.php:1348 includes/free/edit-profile.php:209 -#: templates/dashboard/edit-profile.php:71 -msgid "Strength indicator" +#: includes/Fields/Form_Field_SectionBreak.php:70 +msgid "Some details text about the section" msgstr "" -#: class/render-form.php:1410 includes/fields/class-field-post-taxonomy.php:127 -#: includes/fields/class-field-post-taxonomy.php:258 -msgid "-- Select --" +#: includes/Fields/Form_Field_SectionBreak.php:87 +msgid "Some description about this section" msgstr "" -#: class/render-form.php:1474 includes/fields/class-field-post-taxonomy.php:66 -msgid "This field is no longer available." +#: includes/Fields/Form_Field_Text.php:11 +#: includes/Fields/Form_Field_Text.php:128 +msgid "Text" msgstr "" -#: class/render-form.php:1682 class/transactions-list-table.php:141 -#: class/transactions-list-table.php:211 includes/free/edit-user.php:105 -msgid "Delete" +#: includes/Fields/Form_Field_URL.php:11 +msgid "Website URL" msgstr "" -#: class/subscription.php:433 -msgid "Add Subscription" +#: includes/Fields/Form_Field_URL.php:65 +msgid "Open in : " msgstr "" -#: class/subscription.php:434 -msgid "Add New Subscription" +#: includes/Fields/Form_Field_URL.php:68 +msgid "Same Window" msgstr "" -#: class/subscription.php:436 -msgid "Edit Subscription" +#: includes/Fields/Form_Field_URL.php:69 +msgid "New Window" msgstr "" -#: class/subscription.php:437 -msgid "New Subscription" +#: includes/Fields/Form_Field_URL.php:75 +msgid "Choose whether the link will open in new tab or same window" msgstr "" -#: class/subscription.php:438 class/subscription.php:439 -msgid "View Subscription" +#: includes/Fields/Form_Field_reCaptcha.php:12 +#: includes/Free/Form_Element.php:36 +msgid "reCaptcha" msgstr "" -#: class/subscription.php:440 -msgid "Search Subscription" +#: includes/Fields/Form_Field_reCaptcha.php:51 +msgid "reCaptcha API key is missing." msgstr "" -#: class/subscription.php:441 -msgid "No Subscription Found" +#: includes/Fields/Form_Field_reCaptcha.php:129 +msgid "Site key and Secret key" msgstr "" -#: class/subscription.php:442 -msgid "No Subscription Found in Trash" +#: includes/Fields/Form_Field_reCaptcha.php:131 +msgid "" +"You need to set Site key and Secret key in Settings in order to use \"Recaptcha\" field. Click here to get the these key." msgstr "" -#: class/subscription.php:443 -msgid "Parent Subscription" +#: includes/Fields/Form_Field_reCaptcha.php:168 +msgid "Select reCaptcha type" msgstr "" -#: class/subscription.php:798 -msgid "Payment is complete" +#: includes/Fields/Form_Field_reCaptcha.php:176 +msgid "Light" msgstr "" -#: class/subscription.php:798 -msgid "Congratulations, your payment has been completed!" +#: includes/Fields/Form_Field_reCaptcha.php:177 +msgid "Dark" msgstr "" -#: class/subscription.php:802 class/subscription.php:806 -msgid "Please buy a subscription pack to post" +#: includes/Fields/Form_Field_reCaptcha.php:182 +msgid "Select reCaptcha Theme" msgstr "" -#: class/subscription.php:825 -msgid "

    You have a subscription pack activated.

    " +#: includes/Fields/Form_Pro_Upgrade_Fields.php:36 +#: includes/Free/Form_Element.php:22 +msgid "Address Field" msgstr "" -#: class/subscription.php:827 -#. translators: %s: pack title -msgid "

    Pack name: %s

    " +#: includes/Fields/Form_Pro_Upgrade_Fields.php:58 +msgid "Date / Time" msgstr "" -#: class/subscription.php:829 -msgid "To cancel the pack, press the following cancel button" +#: includes/Fields/Form_Pro_Upgrade_Fields.php:66 +msgid "Embed" msgstr "" -#: class/subscription.php:876 -msgid "Day" -msgid_plural "Days" -msgstr[0] "" -msgstr[1] "" - -#: class/subscription.php:877 -msgid "Week" -msgid_plural "Weeks" -msgstr[0] "" -msgstr[1] "" +#: includes/Fields/Form_Pro_Upgrade_Fields.php:121 +msgid "Ratings" +msgstr "" -#: class/subscription.php:878 -msgid "Month" -msgid_plural "Months" -msgstr[0] "" -msgstr[1] "" +#: includes/Fields/Form_Pro_Upgrade_Fields.php:132 +msgid "Linear Scale" +msgstr "" -#: class/subscription.php:879 -msgid "Year" -msgid_plural "Years" -msgstr[0] "" -msgstr[1] "" +#: includes/Fields/Form_Pro_Upgrade_Fields.php:143 +msgid "Checkbox Grid" +msgstr "" -#: class/subscription.php:911 -msgid "One time payment" +#: includes/Fields/Form_Pro_Upgrade_Fields.php:154 +msgid "Multiple Choice Grid" msgstr "" -#: class/subscription.php:918 -msgid "Every" +#: includes/Fields/Form_Pro_Upgrade_Fields.php:165 +#: includes/Free/Form_Element.php:16 +msgid "Repeat Field" msgstr "" -#: class/subscription.php:919 -msgid "for" +#: includes/Fields/Form_Pro_Upgrade_Fields.php:176 +#: includes/Free/Form_Element.php:37 +msgid "Really Simple Captcha" msgstr "" -#: class/subscription.php:919 -msgid "installments" +#: includes/Fields/Form_Pro_Upgrade_Fields.php:198 +#: includes/Free/Form_Element.php:23 +msgid "Step Start" msgstr "" -#: class/subscription.php:927 -#. translators: %s: trial days -msgid "Trial available for first %1$s %2$s" +#: includes/Fields/Form_Pro_Upgrade_Fields.php:209 +msgid "Terms & Conditions" msgstr "" -#: class/subscription.php:931 -msgid "Buy Now" +#: includes/Fields/Form_Pro_Upgrade_Fields.php:221 +msgid "Math Captcha" msgstr "" -#: class/subscription.php:935 -msgid "Sign Up" +#: includes/Fields/Form_Pro_Upgrade_Fields.php:233 +msgid "QR Code" msgstr "" -#: class/subscription.php:1003 -#. translators: %s: amount -msgid "There is a %s charge to add a new post." +#: includes/Free/Edit_Profile.php:34 includes/Frontend/Payment.php:84 +#: includes/functions/user/edit-user.php:40 templates/unauthorized.php:4 +#. translators: %s: login url +msgid "This page is restricted. Please %s to view this page." msgstr "" -#: class/subscription.php:1020 -#. translators: %s: amount -msgid "" -"Your Subscription pack is exhausted. There is a %s charge " -"to add a new post." +#: includes/Free/Edit_Profile.php:75 +msgid "Success: Profile updated" msgstr "" -#: class/subscription.php:1066 -#. translators: %s: subscription link -msgid "You must purchase a pack before posting" +#: includes/Free/Edit_Profile.php:104 includes/Widgets/Login_Widget.php:292 +#: includes/functions/user/edit-user.php:95 +#: includes/functions/user/edit-user.php:155 templates/registration-form.php:55 +msgid "Username" msgstr "" -#: class/transactions-list-table.php:15 -msgid "transaction" +#: includes/Free/Edit_Profile.php:105 +msgid "Usernames cannot be changed." msgstr "" -#: class/transactions-list-table.php:16 -msgid "transactions" +#: includes/Free/Edit_Profile.php:113 includes/WPUF_Privacy.php:359 +msgid "Last Name" msgstr "" -#: class/transactions-list-table.php:43 -msgid "ID" +#: includes/Free/Edit_Profile.php:118 +msgid "Nickname" msgstr "" -#: class/transactions-list-table.php:44 -#: includes/class-list-table-subscribers.php:44 templates/dashboard/list.php:11 -#: templates/dashboard/posts.php:101 -msgid "Status" +#: includes/Free/Edit_Profile.php:118 includes/Free/Edit_Profile.php:165 +msgid "(required)" msgstr "" -#: class/transactions-list-table.php:45 -msgid "User" +#: includes/Free/Edit_Profile.php:123 +msgid "Display to Public as" msgstr "" -#: class/transactions-list-table.php:46 includes/class-privacy.php:330 -msgid "Subtotal" +#: includes/Free/Edit_Profile.php:161 +msgid "Contact Info" msgstr "" -#: class/transactions-list-table.php:47 -#: includes/free/post-form-templates/the_events_calendar.php:116 -msgid "Cost" +#: includes/Free/Edit_Profile.php:165 +msgid "E-mail" msgstr "" -#: class/transactions-list-table.php:48 includes/class-privacy.php:334 -#: includes/free/loader.php:247 -msgid "Tax" +#: includes/Free/Edit_Profile.php:170 +msgid "Website" msgstr "" -#: class/transactions-list-table.php:49 includes/class-privacy.php:342 -#: includes/class-privacy.php:413 -msgid "Post ID" +#: includes/Free/Edit_Profile.php:187 +msgid "About Yourself" msgstr "" -#: class/transactions-list-table.php:50 includes/class-privacy.php:346 -#: includes/class-privacy.php:466 -msgid "Pack ID" +#: includes/Free/Edit_Profile.php:191 +msgid "Biographical Info" msgstr "" -#: class/transactions-list-table.php:51 -#: includes/class-list-table-subscribers.php:45 -msgid "Gateway" +#: includes/Free/Edit_Profile.php:193 +msgid "" +"Share a little biographical information to fill out your profile. This may " +"be shown publicly." msgstr "" -#: class/transactions-list-table.php:52 -msgid "Payer" +#: includes/Free/Edit_Profile.php:196 templates/dashboard/edit-profile.php:59 +msgid "New Password" msgstr "" -#: class/transactions-list-table.php:54 -msgid "Trans ID" +#: includes/Free/Edit_Profile.php:204 +msgid "Type your new password again." msgstr "" -#: class/transactions-list-table.php:55 includes/free/form-element.php:13 -msgid "Date" +#: includes/Free/Edit_Profile.php:209 +msgid "Password Strength" msgstr "" -#: class/transactions-list-table.php:102 -#: includes/class-list-table-subscribers.php:137 -#: templates/dashboard/list.php:81 templates/dashboard/posts.php:187 -msgid "Completed" +#: includes/Free/Edit_Profile.php:235 includes/Free/Form_Element.php:360 +#: templates/dashboard/edit-profile.php:141 +msgid "Update Profile" msgstr "" -#: class/transactions-list-table.php:109 wpuf-functions.php:64 -msgid "Pending" +#: includes/Free/Edit_Profile.php:259 +msgid "WPUF Post Lock" msgstr "" -#: class/transactions-list-table.php:136 class/transactions-list-table.php:214 -msgid "Accept" +#: includes/Free/Edit_Profile.php:262 +msgid "Lock Post:" msgstr "" -#: class/transactions-list-table.php:137 class/transactions-list-table.php:215 -msgid "Reject" +#: includes/Free/Edit_Profile.php:268 +msgid "Lock user from creating new post." msgstr "" -#: class/transactions-list-table.php:200 -msgid "No transactions found." +#: includes/Free/Edit_Profile.php:272 +msgid "Lock Reason:" msgstr "" -#: class/upload.php:276 wpuf-functions.php:1029 -msgid "Caption" +#: includes/Free/Edit_Profile.php:279 +msgid "Lock Edit Post:" msgstr "" -#: class/upload.php:299 -msgid "attach_id is required." +#: includes/Free/Edit_Profile.php:285 +msgid "Lock user from editing post." msgstr "" -#: class/upload.php:309 -msgid "Attachment deleted successfully." +#: includes/Free/Edit_Profile.php:289 +msgid "Edit Post Lock Reason:" msgstr "" -#: class/upload.php:312 -msgid "Could not deleted the attachment" +#: includes/Free/Form_Element.php:12 includes/Free/Form_Element.php:31 +msgid "Click to add to the editor" msgstr "" -#: class/upload.php:315 -msgid "Something went wrong." +#: includes/Free/Form_Element.php:19 +msgid "Google Maps" msgstr "" -#: includes/class-acf.php:170 -msgid "%s Detected" +#: includes/Free/Form_Element.php:39 +msgid "Term & Conditions" msgstr "" -#: includes/class-acf.php:171 -msgid "" -"Hey, looks like you have %s installed. What do you want to " -"do with WPUF?" +#: includes/Free/Form_Element.php:68 +msgid "Learn more about Automatic Post Expiration" msgstr "" -#: includes/class-acf.php:172 -msgid "" -"It will update compatibility option only, so existing custom fields data " -"format will not change." +#: includes/Free/Form_Element.php:133 +msgid "Send Email to Author After Exceeding Post Expiration Time" msgstr "" -#: includes/class-acf.php:173 -msgid "" -"It will update existing custom fields data to ACF format and update " -"compatibility option too." +#: includes/Free/Form_Element.php:159 includes/Free/Form_Element.php:163 +msgid "Enable Multistep" msgstr "" -#: includes/class-acf.php:176 -msgid "Compatible" +#: includes/Free/Form_Element.php:166 +msgid "If checked, form will be displayed in frontend in multiple steps" msgstr "" -#: includes/class-acf.php:177 -msgid "Compatible & Migrate" +#: includes/Free/Form_Element.php:167 +msgid " Learn more about Multistep" msgstr "" -#: includes/class-acf.php:178 -msgid "No Thanks" +#: includes/Free/Form_Element.php:171 +msgid "Multistep Progressbar Type" msgstr "" -#: includes/class-billing-address.php:35 -msgid "Some Required Fields are not filled!" +#: includes/Free/Form_Element.php:181 +msgid "Choose how you want the progressbar" msgstr "" -#: includes/class-billing-address.php:161 includes/class-customizer.php:22 -#: includes/class-customizer.php:66 includes/class-privacy.php:265 -#: templates/dashboard/billing-address.php:51 -#: templates/dashboard/billing-address.php:52 -msgid "Country" +#: includes/Free/Form_Element.php:210 +msgid "New post created" msgstr "" -#: includes/class-billing-address.php:185 -#: templates/dashboard/billing-address.php:69 -msgid "Choose a country" +#: includes/Free/Form_Element.php:215 +msgid "A post has been edited" msgstr "" -#: includes/class-billing-address.php:204 includes/class-customizer.php:23 -#: includes/class-customizer.php:67 templates/dashboard/billing-address.php:90 -#: templates/dashboard/billing-address.php:91 -msgid "State/Province/Region" +#: includes/Free/Form_Element.php:219 +msgid "New Post Notification" msgstr "" -#: includes/class-billing-address.php:218 -#: templates/dashboard/billing-address.php:111 -msgid "Choose a state" +#: includes/Free/Form_Element.php:227 includes/Free/Form_Element.php:265 +msgid "Enable post notification" msgstr "" -#: includes/class-billing-address.php:237 -#: templates/dashboard/billing-address.php:134 -msgid "Address Line 1 " +#: includes/Free/Form_Element.php:230 +msgid "Learn more about Email Notification" msgstr "" -#: includes/class-billing-address.php:248 -#: templates/dashboard/billing-address.php:142 -msgid "Address Line 2 " +#: includes/Free/Form_Element.php:241 includes/Free/Form_Element.php:276 +msgid "Subject" msgstr "" -#: includes/class-billing-address.php:259 includes/class-customizer.php:26 -#: includes/class-customizer.php:70 includes/class-privacy.php:253 -#: templates/dashboard/billing-address.php:148 -#: templates/dashboard/billing-address.php:149 -msgid "City" +#: includes/Free/Form_Element.php:246 includes/Free/Form_Element.php:281 +msgid "Message" msgstr "" -#: includes/class-billing-address.php:269 includes/class-customizer.php:27 -#: includes/class-customizer.php:71 -msgid "Postal Code/ZIP" +#: includes/Free/Form_Element.php:253 +msgid "Update Post Notification" msgstr "" -#: includes/class-billing-address.php:279 -#: templates/dashboard/billing-address.php:167 -msgid "Update Billing Address" +#: includes/Free/Form_Element.php:289 +msgid "You may use in to, subject & message:" msgstr "" -#: includes/class-billing-address.php:322 -#: templates/dashboard/billing-address.php:32 -msgid "Billing address is updated." +#: includes/Free/Form_Element.php:314 +msgid "Toggle All" msgstr "" -#: includes/class-customizer.php:24 includes/class-customizer.php:68 -msgid "Address line 1" +#: includes/Free/Form_Element.php:318 +msgid "Click on a form element to add to the editor" msgstr "" -#: includes/class-customizer.php:25 includes/class-customizer.php:69 -msgid "Address line 2" +#: includes/Free/Form_Element.php:355 +msgid "Registration successful" msgstr "" -#: includes/class-customizer.php:48 -msgid "Customize WPUF Settings" +#: includes/Free/Form_Element.php:356 +msgid "Profile updated successfully" msgstr "" -#: includes/class-customizer.php:59 -msgid "These options let you change the appearance of the billing address." +#: includes/Free/Form_Element.php:359 includes/Free/Simple_Login.php:320 +#: includes/Frontend/Registration.php:104 includes/Widgets/Login_Widget.php:230 +#: includes/Widgets/Login_Widget.php:266 +msgid "Register" msgstr "" -#: includes/class-customizer.php:88 includes/class-customizer.php:99 -#. Translators: %s field name. -msgid "%s field" +#: includes/Free/Form_Element.php:368 +msgid "Enable Email Verfication" msgstr "" -#: includes/class-customizer.php:105 -msgid "Optional" +#: includes/Free/Form_Element.php:376 +msgid "New User Role" msgstr "" -#: includes/class-dokan-integration.php:34 -#: includes/class-wc-vendors-integration.php:110 -msgid "Posts" +#: includes/Free/Form_Element.php:417 +msgid "Registration success message" msgstr "" -#: includes/class-dokan-integration.php:86 -#: includes/class-wc-vendors-integration.php:36 -#: includes/class-wcmp-integration.php:36 -msgid "Allow Post" +#: includes/Free/Form_Element.php:424 +msgid "Update profile message" msgstr "" -#: includes/class-dokan-integration.php:87 -msgid "Allow Vendors to submit post from dashboard area" +#: includes/Free/Form_Element.php:461 +msgid "Submit Button text" msgstr "" -#: includes/class-dokan-integration.php:94 -#: includes/class-wc-vendors-integration.php:44 -#: includes/class-wcmp-integration.php:46 -msgid "Select Post Form" +#: includes/Free/Form_Element.php:468 +msgid "Update Button text" msgstr "" -#: includes/class-dokan-integration.php:95 -#: includes/class-wc-vendors-integration.php:45 -#: includes/class-wcmp-integration.php:51 -msgid "Select a post form that will show on the vendor dashboard." +#: includes/Free/Free_Loader.php:136 includes/Free/Free_Loader.php:137 +#: includes/Free/Free_Loader.php:1406 +msgid "Coupons" msgstr "" -#: includes/class-field-manager.php:185 -msgid "Custom Fields" +#: includes/Free/Free_Loader.php:166 +msgid "SMS" msgstr "" -#: includes/class-field-manager.php:206 -msgid "Others" +#: includes/Free/Free_Loader.php:187 +msgid "Invoices" msgstr "" -#: includes/class-form-preview.php:82 -msgid "You must be logged in to preview this form." +#: includes/Free/Free_Loader.php:201 +msgid "Content Filtering" msgstr "" -#: includes/class-form-preview.php:88 -msgid "Sorry, you are not eligible to preview this form." +#: includes/Free/Free_Loader.php:224 +msgid "Comments Per Page" msgstr "" -#: includes/class-form.php:193 -#. translators: %s: Pack page link -msgid "" -"You need to purchase a subscription package to post in " -"this form" +#: includes/Free/Free_Loader.php:226 +msgid "Show how many comments per page in comments add-on" msgstr "" -#: includes/class-form.php:200 includes/class-form.php:233 -#: includes/class-form.php:240 -msgid "Payment type not selected for this form. Please contact admin." +#: includes/Free/Free_Loader.php:234 +msgid "Ipstack API Key" msgstr "" -#: includes/class-form.php:220 -msgid "Post Limit Exceeded for your purchased subscription pack." +#: includes/Free/Free_Loader.php:236 +msgid "" +"Register " +"here to get your Free ipstack api key" msgstr "" -#: includes/class-frontend-form-post.php:57 -msgid "You are not logged in" +#: includes/Free/Free_Loader.php:243 +msgid "Google Map API" msgstr "" -#: includes/class-frontend-form-post.php:67 -#: includes/class-frontend-form-post.php:97 -msgid "Invalid post" +#: includes/Free/Free_Loader.php:245 +msgid "" +"API key is needed to render Google Maps" msgstr "" -#: includes/class-frontend-form-post.php:74 -msgid "Your edit access for this post has been locked by an administrator." +#: includes/Free/Free_Loader.php:252 wpuf-functions.php:2068 +msgid "Edit Profile" msgstr "" -#: includes/class-frontend-form-post.php:78 -msgid "Your allocated time for editing this post has been expired." +#: includes/Free/Free_Loader.php:254 +msgid "Allow user to update their profile information from the account page" msgstr "" -#: includes/class-frontend-form-post.php:86 -msgid "Your post edit access has been locked by an administrator." +#: includes/Free/Free_Loader.php:263 +msgid "Profile Form" msgstr "" -#: includes/class-frontend-form-post.php:91 -msgid "Post Editing is disabled" +#: includes/Free/Free_Loader.php:265 +msgid "User will use this form to update their information from the account page," msgstr "" -#: includes/class-frontend-form-post.php:102 -msgid "You are not allowed to edit" +#: includes/Free/Free_Loader.php:274 +msgid "Avatar Size" msgstr "" -#: includes/class-frontend-form-post.php:113 -msgid "I don't know how to edit this post, I don't have the form ID" +#: includes/Free/Free_Loader.php:276 +msgid "" +"Avatar size to crop when upload using the registration/profile " +"form.(e.g:100x100)" msgstr "" -#: includes/class-frontend-form-post.php:126 -msgid "You can't edit a post while in pending mode." +#: includes/Free/Free_Loader.php:285 +msgid "Pending User Message" msgstr "" -#: includes/class-frontend-form-post.php:130 -msgid "You're not allowed to edit this post." +#: includes/Free/Free_Loader.php:287 +msgid "Pending user will see this message when try to log in." msgstr "" -#: includes/class-frontend-form-post.php:293 -msgid "Post Saved" +#: includes/Free/Free_Loader.php:288 +msgid "" +"ERROR: Your account has to be approved by an administrator " +"before you can login." msgstr "" -#: includes/class-frontend-form-post.php:334 -msgid "Minimum %d character is required for %s" +#: includes/Free/Free_Loader.php:296 +msgid "Denied User Message" msgstr "" -#: includes/class-frontend-form-post.php:338 -msgid "Maximum %d character is allowed for %s" +#: includes/Free/Free_Loader.php:298 +msgid "Denied user will see this message when try to log in." msgstr "" -#: includes/class-frontend-form-post.php:345 -msgid "Minimum %d word is required for %s" +#: includes/Free/Free_Loader.php:299 +msgid "" +"ERROR: Your account has been denied by an administrator, " +"please contact admin to approve your account." msgstr "" -#: includes/class-frontend-form-post.php:349 -msgid "Maximum %d word is allowed for %s" +#: includes/Free/Free_Loader.php:307 +msgid " Subscription" msgstr "" -#: includes/class-frontend-form-post.php:576 -msgid "Something went wrong" +#: includes/Free/Free_Loader.php:315 +msgid " Template Settings" msgstr "" -#: includes/class-frontend-form-post.php:597 -msgid "Invalid email address." +#: includes/Free/Free_Loader.php:323 +msgid " Reset Email" msgstr "" -#: includes/class-frontend-form-post.php:608 +#: includes/Free/Free_Loader.php:331 msgid "" -"You already have an account in our site. Please login to continue.\n" -"\n" -"Clicking 'OK' will redirect you to the login page and you will lose the " -"form data.\n" -"Click 'Cancel' to stay at this page." +" Resend Confirmation " +"Email" msgstr "" -#: includes/class-frontend-form-post.php:662 -#: includes/class-frontend-render-form.php:320 -msgid "You do not have sufficient permissions to access this form." +#: includes/Free/Free_Loader.php:339 +msgid " Pending User Email" msgstr "" -#: includes/class-frontend-form-post.php:975 -msgid "Email successfully verified. Please Login." +#: includes/Free/Free_Loader.php:347 +msgid " Denied User Email" msgstr "" -#: includes/class-frontend-form-post.php:1102 -#: includes/class-frontend-form-post.php:1108 -msgid "" -"Thank you for posting on our site. We have sent you an confirmation email. " -"Please check your inbox!" +#: includes/Free/Free_Loader.php:355 +msgid " Approved User Email" msgstr "" -#: includes/class-frontend-render-form.php:865 -#: includes/free/class-login.php:449 -msgid "Empty reCaptcha Field" +#: includes/Free/Free_Loader.php:363 +msgid " Account Activated Email" msgstr "" -#: includes/class-frontend-render-form.php:898 -#: templates/dashboard/posts.php:120 -msgid "Featured" +#: includes/Free/Free_Loader.php:371 +msgid " Approved Post Email" msgstr "" -#: includes/class-frontend-render-form.php:903 -msgid "Mark the %s as featured (remaining %d)" +#: includes/Free/Free_Loader.php:380 includes/Free/Free_Loader.php:381 +msgid "Clickatell name" msgstr "" -#: includes/class-list-table-subscribers.php:30 -msgid "No subscribers found" +#: includes/Free/Free_Loader.php:387 includes/Free/Free_Loader.php:388 +msgid "Clickatell Password" msgstr "" -#: includes/class-list-table-subscribers.php:41 -msgid "User ID" +#: includes/Free/Free_Loader.php:394 includes/Free/Free_Loader.php:395 +msgid "Clickatell api" msgstr "" -#: includes/class-list-table-subscribers.php:42 -msgid "User Name" +#: includes/Free/Free_Loader.php:401 includes/Free/Free_Loader.php:402 +msgid "SMSGlobal Name" msgstr "" -#: includes/class-list-table-subscribers.php:43 -msgid "Subscription ID" +#: includes/Free/Free_Loader.php:408 includes/Free/Free_Loader.php:409 +msgid "SMSGlobal Passord" msgstr "" -#: includes/class-list-table-subscribers.php:46 includes/class-privacy.php:322 -msgid "Transaction ID" +#: includes/Free/Free_Loader.php:415 includes/Free/Free_Loader.php:416 +msgid "Nexmo API" msgstr "" -#: includes/class-list-table-subscribers.php:47 -msgid "Starts from" +#: includes/Free/Free_Loader.php:422 includes/Free/Free_Loader.php:423 +msgid "Nexmo API Secret" msgstr "" -#: includes/class-list-table-subscribers.php:48 -msgid "Expire date" +#: includes/Free/Free_Loader.php:429 includes/Free/Free_Loader.php:430 +msgid "Twillo From Number" msgstr "" -#: includes/class-login-widget.php:13 -msgid "WPUF Ajax Login" +#: includes/Free/Free_Loader.php:436 includes/Free/Free_Loader.php:437 +msgid "Twillo Account SID" msgstr "" -#: includes/class-login-widget.php:14 -msgid "Ajax Login widget for WP User Frontend" +#: includes/Free/Free_Loader.php:443 includes/Free/Free_Loader.php:444 +msgid "Twillo Authro Token" msgstr "" -#: includes/class-login-widget.php:38 includes/class-login-widget.php:76 -msgid "Please fill all form fields" +#: includes/Free/Free_Loader.php:452 +msgid "Enable Social Login" msgstr "" -#: includes/class-login-widget.php:45 -msgid "Login successful!" +#: includes/Free/Free_Loader.php:454 +msgid "" +"Enabling this will add Social Icons under registration form to allow users " +"to login or register using Social Profiles" msgstr "" -#: includes/class-login-widget.php:58 -msgid "Logout successful!" +#: includes/Free/Free_Loader.php:460 +msgid "Facebook App Settings" msgstr "" -#: includes/class-login-widget.php:93 -msgid "Password has been reset. Please check your email." +#: includes/Free/Free_Loader.php:462 includes/Free/Free_Loader.php:489 +#: includes/Free/Free_Loader.php:517 includes/Free/Free_Loader.php:545 +#: includes/Free/Free_Loader.php:573 +msgid "Create an App" msgstr "" -#: includes/class-login-widget.php:109 -msgid "ERROR: Enter a username or email address." +#: includes/Free/Free_Loader.php:463 +msgid " if you don't have one and fill App ID and App Secret below. " msgstr "" -#: includes/class-login-widget.php:114 -msgid "ERROR: There is no user registered with that email address." +#: includes/Free/Free_Loader.php:468 includes/Free/Free_Loader.php:524 +#: includes/Free/Free_Loader.php:580 +msgid "Redirect URI" msgstr "" -#: includes/class-login-widget.php:131 -msgid "ERROR: Invalid username or email." +#: includes/Free/Free_Loader.php:475 +msgid "App Id" msgstr "" -#: includes/class-login-widget.php:145 -msgid "Someone has requested a password reset for the following account:" +#: includes/Free/Free_Loader.php:481 +msgid "App Secret" msgstr "" -#: includes/class-login-widget.php:147 includes/free/class-login.php:872 -#: includes/free/class-login.php:972 includes/free/class-registration.php:302 -#. translators: %s: username -msgid "Username: %s" +#: includes/Free/Free_Loader.php:487 +msgid "Twitter App Settings" msgstr "" -#: includes/class-login-widget.php:148 includes/free/class-login.php:973 -msgid "If this was a mistake, just ignore this email and nothing will happen." +#: includes/Free/Free_Loader.php:490 +msgid " if you don't have one and fill Consumer key and Consumer Secret below." msgstr "" -#: includes/class-login-widget.php:149 includes/free/class-login.php:974 -msgid "To reset your password, visit the following address:" +#: includes/Free/Free_Loader.php:496 +msgid "Callback URL" msgstr "" -#: includes/class-login-widget.php:154 includes/free/class-login.php:985 -#. translators: %s: blogname -msgid "[%s] Password Reset" +#: includes/Free/Free_Loader.php:503 +msgid "Consumer Key" msgstr "" -#: includes/class-login-widget.php:161 -msgid "" -"ERROR: The email could not be sent.Possible reason: your " -"host may have disabled the mail() function." +#: includes/Free/Free_Loader.php:509 +msgid "Consumer Secret" msgstr "" -#: includes/class-login-widget.php:216 includes/class-login-widget.php:252 -#: includes/free/class-login.php:315 includes/free/class-registration.php:122 -#: includes/free/form-element.php:355 -msgid "Register" +#: includes/Free/Free_Loader.php:515 +msgid "Google App Settings" msgstr "" -#: includes/class-login-widget.php:224 -msgid "Lost your password?" +#: includes/Free/Free_Loader.php:518 includes/Free/Free_Loader.php:546 +#: includes/Free/Free_Loader.php:574 +msgid " if you don't have one and fill Client ID and Client Secret below." msgstr "" -#: includes/class-login-widget.php:232 templates/lost-pass-form.php:14 -msgid "Username or E-mail:" +#: includes/Free/Free_Loader.php:531 includes/Free/Free_Loader.php:559 +#: includes/Free/Free_Loader.php:587 +msgid "Client ID" msgstr "" -#: includes/class-login-widget.php:260 -msgid "Log out" +#: includes/Free/Free_Loader.php:537 +msgid "Client secret" msgstr "" -#: includes/class-login-widget.php:275 -msgid "WPUF Login Widget" +#: includes/Free/Free_Loader.php:543 +msgid "Linkedin App Settings" msgstr "" -#: includes/class-login-widget.php:276 -msgid "Username or Email Address" +#: includes/Free/Free_Loader.php:552 +msgid "Redirect URL" msgstr "" -#: includes/class-login-widget.php:277 -msgid "" -"Please enter your username or email address. You will receive a link to " -"create a new password via email" +#: includes/Free/Free_Loader.php:565 includes/Free/Free_Loader.php:593 +msgid "Client Secret" msgstr "" -#: includes/class-login-widget.php:278 includes/free/edit-profile.php:102 -#: includes/free/edit-user.php:97 includes/free/edit-user.php:157 -#: templates/registration-form.php:54 -msgid "Username" +#: includes/Free/Free_Loader.php:571 +msgid "Instagram App Settings" msgstr "" -#: includes/class-login-widget.php:279 templates/login-form.php:27 -#: templates/registration-form.php:61 -msgid "Password" +#: includes/Free/Free_Loader.php:601 +msgid "Profile Gallery Image Size " msgstr "" -#: includes/class-login-widget.php:280 templates/login-form.php:71 -msgid "Remember Me" +#: includes/Free/Free_Loader.php:602 +msgid "Set the image size of picture gallery in frontend" msgstr "" -#: includes/class-login-widget.php:281 includes/free/class-login.php:311 -#: templates/login-form.php:75 -msgid "Log In" +#: includes/Free/Free_Loader.php:609 +msgid "Avatar Size " msgstr "" -#: includes/class-login-widget.php:282 templates/reset-pass-form.php:26 -msgid "Reset Password" +#: includes/Free/Free_Loader.php:610 +msgid "Set the image size of profile picture in frontend" msgstr "" -#: includes/class-login-widget.php:285 -msgid "Title:" +#: includes/Free/Free_Loader.php:617 +msgid "Profile Header Template" msgstr "" -#: includes/class-login-widget.php:289 -msgid "Log-in Text:" +#: includes/Free/Free_Loader.php:629 +msgid "User Listing Template" msgstr "" -#: includes/class-login-widget.php:293 -msgid "Username Label:" +#: includes/Free/Free_Loader.php:646 +msgid "Enable Invoices" msgstr "" -#: includes/class-login-widget.php:297 -msgid "Password Label:" +#: includes/Free/Free_Loader.php:647 +msgid "Enable sending invoices for completed payments" msgstr "" -#: includes/class-login-widget.php:301 -msgid "Remember Me Label:" +#: includes/Free/Free_Loader.php:654 +msgid "Show Invoices" msgstr "" -#: includes/class-login-widget.php:304 -msgid "Log In Label:" +#: includes/Free/Free_Loader.php:655 +msgid "Show Invoices option where [wpuf_account] is located" msgstr "" -#: includes/class-login-widget.php:308 -msgid "Password Reset Text:" +#: includes/Free/Free_Loader.php:663 +msgid "Set Invoice Logo" msgstr "" -#: includes/class-login-widget.php:312 -msgid "Password Reset Label:" +#: includes/Free/Free_Loader.php:664 +msgid "This sets the company Logo to be used in Invoice" msgstr "" -#: includes/class-privacy.php:35 -msgid "" -"This sample policy includes the basics around what personal data you may be " -"collecting, storing and sharing, as well as who may have access to that " -"data. Depending on what settings are enabled and which additional plugins " -"are used, the specific information shared by your form will vary. We " -"recommend consulting with a lawyer when deciding what information to " -"disclose on your privacy policy." +#: includes/Free/Free_Loader.php:671 +msgid "Set Invoice Color" msgstr "" -#: includes/class-privacy.php:37 -msgid "" -"We collect information about you during the form submission process on our " -"WordPress website." +#: includes/Free/Free_Loader.php:672 +msgid "Set color code to be used in invoice" msgstr "" -#: includes/class-privacy.php:38 -msgid "What we collect and store" +#: includes/Free/Free_Loader.php:679 +msgid "From Address" msgstr "" -#: includes/class-privacy.php:39 -msgid "While you visit our , we’ll track:" +#: includes/Free/Free_Loader.php:680 +msgid "" +"This sets the provider information of the Invoice. Note: use the <br> tag to enter line breaks." msgstr "" -#: includes/class-privacy.php:41 -msgid "" -"Form Fields Data: Forms Fields data includes the available field types when " -"creating a form. We’ll use this to, for example, collect informations like " -"Name, Email and other available fields." +#: includes/Free/Free_Loader.php:687 +msgid "Invoice Title" msgstr "" -#: includes/class-privacy.php:42 -msgid "" -"Location, IP address and browser type: we’ll use this for purposes like " -"estimating taxes and shipping. Also, for reducing fraudulent activities and " -"prevent identity theft while placing orders" +#: includes/Free/Free_Loader.php:688 +msgid "This sets the payment information title of the Invoice" msgstr "" -#: includes/class-privacy.php:43 -msgid "" -"Transaction Details: we’ll ask you to enter this so we can, for instance, " -"provide & regulate subscription packs that you bought and keep track of " -"your payment details for subscription packs!" +#: includes/Free/Free_Loader.php:694 +msgid "Invoice Paragraph" msgstr "" -#: includes/class-privacy.php:45 -msgid "" -"We’ll also use cookies to keep track of form elements while you’re browsing " -"our site." +#: includes/Free/Free_Loader.php:695 +msgid "This sets the payment information paragraph of the Invoice" msgstr "" -#: includes/class-privacy.php:46 -msgid "" -"Note: you may want to further detail your cookie policy, and link to that " -"section from here." +#: includes/Free/Free_Loader.php:702 +msgid "Invoice Footer" msgstr "" -#: includes/class-privacy.php:47 -msgid "" -"When you fill up a form, we’ll ask you to provide information including " -"your name, billing address, shipping address, email address, phone number, " -"credit card/payment details and optional account information like username " -"and password and any other form fields found in the form building options. " -"We’ll use this information for purposes, such as, to:" +#: includes/Free/Free_Loader.php:703 +msgid "This sets the footer of the Invoice" msgstr "" -#: includes/class-privacy.php:49 -msgid "Send you information about your account and order" +#: includes/Free/Free_Loader.php:709 +msgid "Invoice Filename Prefix" msgstr "" -#: includes/class-privacy.php:50 -msgid "Respond to your requests, including transaction details and complaints" +#: includes/Free/Free_Loader.php:710 +msgid "This sets the filename prefix of the Invoice" msgstr "" -#: includes/class-privacy.php:51 -msgid "Process payments and prevent fraud" +#: includes/Free/Free_Loader.php:716 +msgid "Set Invoice Mail Subject" msgstr "" -#: includes/class-privacy.php:52 -msgid "Set up your account" +#: includes/Free/Free_Loader.php:717 +msgid "This sets the mail subject of the Invoice" msgstr "" -#: includes/class-privacy.php:53 -msgid "Comply with any legal obligations we have, such as calculating taxes" +#: includes/Free/Free_Loader.php:723 +msgid "Set Invoice Mail Body" msgstr "" -#: includes/class-privacy.php:54 -msgid "Improve our form offerings" +#: includes/Free/Free_Loader.php:724 +msgid "This sets the mail body of the Invoice" msgstr "" -#: includes/class-privacy.php:55 -msgid "Send you marketing messages, if you choose to receive them" +#: includes/Free/Free_Loader.php:732 +msgid "Need help?" msgstr "" -#: includes/class-privacy.php:57 +#: includes/Free/Free_Loader.php:733 msgid "" -"If you create an account, we will store your name, address, email and phone " -"number, which will be used to populate the form fields for future " -"submissions." +"Visit the Tax setup documentation for " +"guidance on how to setup tax." msgstr "" -#: includes/class-privacy.php:58 -msgid "" -"We generally store information about you for as long as we need the " -"information for the purposes for which we collect and use it, and we are " -"not legally required to continue keeping it. For example, we will store " -"form submission information for XXX years for tax, accounting and marketing " -"purposes. This includes your name, email address and billing and shipping " -"addresses." +#: includes/Free/Free_Loader.php:738 +msgid "Enable Tax" msgstr "" -#: includes/class-privacy.php:59 -msgid "Who on our team has access" +#: includes/Free/Free_Loader.php:739 +msgid "Enable tax on payments" msgstr "" -#: includes/class-privacy.php:60 -msgid "" -"Members of our team have access to the information you provide us. For " -"example, Administrators and Editors and any body else who has permission " -"can access:" +#: includes/Free/Free_Loader.php:746 +msgid "Base Country and State" msgstr "" -#: includes/class-privacy.php:62 -msgid "Form submission information and other details related to it" +#: includes/Free/Free_Loader.php:747 +msgid "Select your base country and state" msgstr "" -#: includes/class-privacy.php:63 -msgid "" -"Customer information like your name, email address, and billing and " -"shipping information." +#: includes/Free/Free_Loader.php:752 +msgid "Tax Rates" msgstr "" -#: includes/class-privacy.php:65 -msgid "" -"Our team members have access to this information to help fulfill " -"transactions and support you." +#: includes/Free/Free_Loader.php:753 +msgid "Add tax rates for specific regions. Enter a percentage, such as 5 for 5%" msgstr "" -#: includes/class-privacy.php:66 -msgid "What we share with others" +#: includes/Free/Free_Loader.php:759 +msgid "Fallback Tax Rate" msgstr "" -#: includes/class-privacy.php:67 +#: includes/Free/Free_Loader.php:760 msgid "" -"In this section you should list who you’re sharing data with, and for what " -"purpose. This could include, but may not be limited to, analytics, " -"marketing, payment gateways, shipping providers, and third party embeds." +"Customers not in a specific rate will be charged this tax rate. Enter a " +"percentage, such as 5 for 5%" msgstr "" -#: includes/class-privacy.php:68 -msgid "" -"We share information with third parties who help us provide our orders and " -"store services to you; for example --" +#: includes/Free/Free_Loader.php:768 includes/Free/Free_Loader.php:773 +msgid "Show prices with tax" msgstr "" -#: includes/class-privacy.php:70 -msgid "" -"In this subsection you should list which third party payment processors " -"you’re using to take payments on your site since these may handle customer " -"data. We’ve included PayPal as an example, but you should remove this if " -"you’re not using PayPal." +#: includes/Free/Free_Loader.php:769 +msgid "If frontend prices will include tax or not" msgstr "" -#: includes/class-privacy.php:71 -msgid "" -"We accept payments through PayPal. When processing payments, some of your " -"data will be passed to PayPal, including information required to process or " -"support the payment, such as the purchase total and billing information." +#: includes/Free/Free_Loader.php:774 +msgid "Show prices without tax" msgstr "" -#: includes/class-privacy.php:72 -msgid "" -"Please see the PayPal " -"Privacy Policy for more details." +#: includes/Free/Free_Loader.php:782 +msgid "Enable Content Filtering" msgstr "" -#: includes/class-privacy.php:73 -msgid "" -"Also, we accept payments through Stripe. When processing payments, some of " -"your data will be passed to Stripe, including information required to " -"process or support the payment, such as the purchase total and billing " -"information." +#: includes/Free/Free_Loader.php:783 +msgid "Enable Content Filtering in frontend" msgstr "" -#: includes/class-privacy.php:74 -msgid "" -"Please see the Stripe Privacy " -"Policy for more details." +#: includes/Free/Free_Loader.php:790 +msgid "Keyword Dictionary" msgstr "" -#: includes/class-privacy.php:75 -msgid "Available Modules" +#: includes/Free/Free_Loader.php:791 +msgid "Enter Keywords to Remove. Separate keywords with commas." msgstr "" -#: includes/class-privacy.php:76 -msgid "" -"In this subsection you should list which third party modules you’re using " -"to increase the functionality of your created forms using WP User Frontend " -"since these may handle customer data." +#: includes/Free/Free_Loader.php:798 +msgid "Filter main content" msgstr "" -#: includes/class-privacy.php:77 -msgid "" -"WP User Frontend Pro comes with support for modules like MailChimp, " -"ConvertKit, Stipe, Paid Membership Pro, MailPoet, Zapier, GetResponse, " -"MailPoet 3, Campaign Monitor, Social Login, BuddyPress. Please note any " -"future modules that will be added will have some data transferred to their " -"own platform which falls in their own data policy. " +#: includes/Free/Free_Loader.php:799 +msgid "Choose which content to filter." msgstr "" -#: includes/class-privacy.php:78 -msgid "" -"As an example while using MailChimp for your marketing email automation " -"service by integrating it with WP User Frontend, some of your data will be " -"passed to MailChimp, including information required to process or support " -"the email marketing services, such as name, email address and any other " -"information that you intend to pass or collect including all collected " -"information through subscription. " +#: includes/Free/Free_Loader.php:802 +msgid "Post Titles" msgstr "" -#: includes/class-privacy.php:79 -msgid "" -"Please see the MailChimp " -"Privacy Policy for more details." +#: includes/Free/Free_Loader.php:819 +msgid "Upgrade to Pro" msgstr "" -#: includes/class-privacy.php:94 includes/class-privacy.php:125 -#: includes/class-privacy.php:165 -msgid "WPUF User Data" +#: includes/Free/Free_Loader.php:1256 +msgid "Credit Card" msgstr "" -#: includes/class-privacy.php:99 includes/class-privacy.php:287 -msgid "WPUF Subscription Data" +#: includes/Free/Free_Loader.php:1278 +msgid "Taxonomy Restriction " msgstr "" -#: includes/class-privacy.php:104 includes/class-privacy.php:317 -msgid "WPUF Transaction Data" +#: includes/Free/Free_Loader.php:1296 +msgid "Choose the taxonomy terms you want to enable for this pack:" msgstr "" -#: includes/class-privacy.php:109 includes/class-privacy.php:408 -msgid "WPUF Post Data" +#: includes/Free/Free_Loader.php:1410 +msgid "Use Coupon codes for subscription for discounts." msgstr "" -#: includes/class-privacy.php:166 -msgid "WP User Frontend user data." +#: includes/Free/Free_Loader.php:1414 +msgid "This feature is only available in the Pro Version." msgstr "" -#: includes/class-privacy.php:245 -msgid "Billing Address 1" +#: includes/Free/Free_Loader.php:1418 +msgid "Upgrade to Pro Version" msgstr "" -#: includes/class-privacy.php:249 -msgid "Billing Address 2" +#: includes/Free/Free_Loader.php:1419 +msgid "Learn more about Coupons" msgstr "" -#: includes/class-privacy.php:257 -msgid "State" +#: includes/Free/Simple_Login.php:316 includes/Widgets/Login_Widget.php:295 +#: templates/login-form.php:77 +msgid "Log In" msgstr "" -#: includes/class-privacy.php:261 -msgid "Zip" +#: includes/Free/Simple_Login.php:324 +msgid "Lost Password" msgstr "" -#: includes/class-privacy.php:288 -msgid "WP User Frontend subscription data." +#: includes/Free/Simple_Login.php:369 +msgid "Check your e-mail for the confirmation link." msgstr "" -#: includes/class-privacy.php:318 -msgid "WP User Frontend transaction data." +#: includes/Free/Simple_Login.php:373 +msgid "" +"Please enter your username or email address. You will receive a link to " +"create a new password via email." msgstr "" -#: includes/class-privacy.php:326 -msgid "Payment Status" +#: includes/Free/Simple_Login.php:382 +msgid "Your password has been reset successfully" msgstr "" -#: includes/class-privacy.php:354 includes/free/edit-profile.php:111 -msgid "Last Name" +#: includes/Free/Simple_Login.php:388 +msgid "Enter your new password below." msgstr "" -#: includes/class-privacy.php:362 -msgid "Payment Type" +#: includes/Free/Simple_Login.php:399 +msgid "You are now logged out." msgstr "" -#: includes/class-privacy.php:366 -msgid "payer_address" +#: includes/Free/Simple_Login.php:425 +msgid "Nonce is invalid" msgstr "" -#: includes/class-privacy.php:376 -msgid "Transaction Date" +#: includes/Free/Simple_Login.php:444 includes/Frontend/Registration.php:214 +msgid "Username is required." msgstr "" -#: includes/class-privacy.php:409 -msgid "WP User Frontend post data." +#: includes/Free/Simple_Login.php:450 includes/Frontend/Registration.php:221 +msgid "Password is required." msgstr "" -#: includes/class-privacy.php:421 -msgid "Post URL" +#: includes/Free/Simple_Login.php:457 includes/Traits/FieldableTrait.php:205 +#: includes/class-frontend-render-form.php:877 +msgid "Empty reCaptcha Field" msgstr "" -#: includes/class-privacy.php:425 -msgid "Post Date" +#: includes/Free/Simple_Login.php:472 includes/Frontend/Registration.php:184 +#: includes/Frontend/Registration.php:191 +#: includes/Frontend/Registration.php:198 +#: includes/Frontend/Registration.php:205 +#: includes/Frontend/Registration.php:212 +#: includes/Frontend/Registration.php:219 +#: includes/Frontend/Registration.php:226 +#: includes/Frontend/Registration.php:233 +#: includes/Frontend/Registration.php:240 +#: includes/Frontend/Registration.php:253 +msgid "Error" msgstr "" -#: includes/class-privacy.php:470 -msgid "Pack Title" +#: includes/Free/Simple_Login.php:472 includes/Frontend/Registration.php:255 +msgid "A user could not be found with this email address." msgstr "" -#: includes/class-privacy.php:474 -msgid "Expiry" +#: includes/Free/Simple_Login.php:668 +msgid "Please enter your password." msgstr "" -#: includes/class-upgrades.php:109 -msgid "WPUF Data Update Required" +#: includes/Free/Simple_Login.php:674 +msgid "Passwords do not match." msgstr "" -#: includes/class-upgrades.php:110 -msgid "Run the updater" +#: includes/Free/Simple_Login.php:722 +msgid "Enter a username or e-mail address." msgstr "" -#: includes/class-upgrades.php:115 -msgid "" -"It is strongly recommended that you backup your database before proceeding. " -"Are you sure you wish to run the updater now?" +#: includes/Free/Simple_Login.php:729 +msgid "There is no user registered with that email address." msgstr "" -#: includes/class-user-subscription.php:57 -msgid "You must purchase a subscription package before posting" +#: includes/Free/Simple_Login.php:746 +msgid "Invalid username or e-mail." msgstr "" -#: includes/class-user-subscription.php:62 -msgid "The subscription pack has expired. Please buy a pack." +#: includes/Free/Simple_Login.php:760 +msgid "Password reset is not allowed for this user" msgstr "" -#: includes/class-user-subscription.php:322 -#: templates/dashboard/subscription.php:3 -msgid "Subscription Details" +#: includes/Free/Simple_Login.php:799 +#. translators: %s: activation link +msgid "" +"Your account is not active.
    Please check your email for " +"activation link.
    Click here to resend the activation " +"link" msgstr "" -#: includes/class-user-subscription.php:324 -#: templates/dashboard/subscription.php:5 -msgid "Subcription Name: " +#: includes/Free/Simple_Login.php:820 includes/Free/Simple_Login.php:845 +msgid "Activation URL is not valid" msgstr "" -#: includes/class-user-subscription.php:326 -#: templates/dashboard/subscription.php:7 -msgid "Package & billing details: " +#: includes/Free/Simple_Login.php:831 +msgid "Invalid User activation url" msgstr "" -#: includes/class-user-subscription.php:337 -#: templates/dashboard/subscription.php:20 -msgid "Remaining post: " +#: includes/Free/Simple_Login.php:837 +msgid "User already verified" msgstr "" -#: includes/class-user-subscription.php:351 -#: templates/dashboard/subscription.php:36 -#: templates/dashboard/subscription.php:48 -msgid "Unlimited" +#: includes/Free/Simple_Login.php:853 includes/Free/Simple_Login.php:929 +msgid "Your account has been activated" msgstr "" -#: includes/class-user-subscription.php:383 -msgid "Change" +#: includes/Free/Simple_Login.php:856 +msgid "" +"Your account has been verified , but you can't login until manually " +"approved your account by an administrator." msgstr "" -#: includes/class-wc-vendors-integration.php:37 -#: includes/class-wcmp-integration.php:40 -msgid "If checked, vendor can submit post from dashboard area." +#: includes/Free/Simple_Login.php:879 +#. translators: %s: blogname +msgid "[%s] Your username and password info" msgstr "" -#: includes/class-wcmp-integration.php:84 -msgid "Vendor Submit Post" +#: includes/Free/Simple_Login.php:881 includes/Free/Simple_Login.php:981 +#: includes/Frontend/Registration.php:291 includes/Widgets/Login_Widget.php:155 +#. translators: %s: username +msgid "Username: %s" msgstr "" -#: includes/class-wcmp-integration.php:89 -msgid "Set endpoint for vendor submit post page" +#: includes/Free/Simple_Login.php:882 +msgid "To set your password, visit the following address:" msgstr "" -#: includes/class-whats-new.php:67 -msgid "Whats New" +#: includes/Free/Simple_Login.php:978 +msgid "Someone requested that the password be reset for the following account:" msgstr "" -#: includes/class-whats-new.php:101 -msgid "WP User Frontend - Version %s" +#: includes/Free/Simple_Login.php:982 includes/Widgets/Login_Widget.php:156 +msgid "If this was a mistake, just ignore this email and nothing will happen." msgstr "" -#: includes/class-whats-new.php:102 -msgid "" -"Welcome to the new version of WP User Frontend. See what's been changed in " -"the %s version." +#: includes/Free/Simple_Login.php:983 includes/Widgets/Login_Widget.php:157 +msgid "To reset your password, visit the following address:" msgstr "" -#: includes/class-whats-new.php:106 -msgid "What's New?" +#: includes/Free/Simple_Login.php:994 includes/Widgets/Login_Widget.php:162 +#. translators: %s: blogname +msgid "[%s] Password Reset" msgstr "" -#: includes/countries-formated.php:77 -msgid "Bangladesh" +#: includes/Free/Simple_Login.php:1000 +msgid "The e-mail could not be sent." msgstr "" -#: includes/fields/class-abstract-fields.php:39 -msgid "Content restricted type" +#: includes/Free/Simple_Login.php:1000 +msgid "Possible reason: your host may have disabled the mail() function." msgstr "" -#: includes/fields/class-abstract-fields.php:42 -msgid "Minimun" +#: includes/Free/Simple_Login.php:1120 +#. translators: %s: blogname +msgid "[%s] Account has been activated" msgstr "" -#: includes/fields/class-abstract-fields.php:43 -msgid "Maximum" +#: includes/Free/Simple_Login.php:1122 +#. translators: %s: username +msgid "Hi %s," msgstr "" -#: includes/fields/class-abstract-fields.php:53 -msgid "Content restricted by" +#: includes/Free/Simple_Login.php:1123 +msgid "Congrats! Your account has been activated. To login visit the following url:" msgstr "" -#: includes/fields/class-abstract-fields.php:56 -msgid "Character" +#: includes/Free/Simple_Login.php:1125 +msgid "Thanks" msgstr "" -#: includes/fields/class-abstract-fields.php:57 -msgid "Word" +#: includes/Free/Simple_Login.php:1151 +msgid " Login " msgstr "" -#: includes/fields/class-abstract-fields.php:71 -msgid "Number of characters or words the author to be restricted in" +#: includes/Free/Subscription_Element.php:16 +msgid "Recurring " msgstr "" -#: includes/fields/class-abstract-fields.php:304 -msgid "" -"Check this option to mark the field required. A form will not submit unless " -"all required fields are provided." +#: includes/Free/Subscription_Element.php:20 +msgid "Enable Recurring Payment" msgstr "" -#: includes/fields/class-abstract-fields.php:309 -msgid "Field Size" +#: includes/Free/templates/page-registration-form.php:7 +msgid "Registration form %s builder" msgstr "" -#: includes/fields/class-abstract-fields.php:312 -msgid "Small" +#: includes/Free/templates/page-registration-form.php:11 +msgid "Profile form %s builder" msgstr "" -#: includes/fields/class-abstract-fields.php:313 -msgid "Medium" +#: includes/Free/templates/page-registration-form.php:15 +msgid "Create & Sell %s Subscription %s Package" msgstr "" -#: includes/fields/class-abstract-fields.php:314 -msgid "Large" +#: includes/Free/templates/page-registration-form.php:19 +msgid "Pre-defined %s Templates" msgstr "" -#: includes/fields/class-abstract-fields.php:328 -#: includes/fields/class-field-column.php:90 -msgid "" -"Provide a container class name for this field. Available classes: " -"wpuf-col-half, wpuf-col-half-last, wpuf-col-one-third, " -"wpuf-col-one-third-last" +#: includes/Free/templates/page-registration-form.php:23 +msgid "Approval System %s after Registration" msgstr "" -#: includes/fields/class-abstract-fields.php:349 -msgid "Everyone" +#: includes/Free/templates/page-registration-form.php:27 +msgid "Email Notifications" msgstr "" -#: includes/fields/class-abstract-fields.php:351 -msgid "Logged in users only" +#: includes/Free/templates/page-registration-form.php:31 +msgid "Custom Field" msgstr "" -#: includes/fields/class-abstract-fields.php:352 -msgid "Subscription users only" +#: includes/Free/templates/page-registration-form.php:35 +msgid "BuddyPress %s Support" msgstr "" -#: includes/fields/class-abstract-fields.php:356 -msgid "Select option" +#: includes/Free/templates/page-registration-form.php:39 +msgid "Social Login & %s Registration" msgstr "" -#: includes/fields/class-abstract-fields.php:372 -msgid "Read Only" +#: includes/Free/templates/page-registration-form.php:46 +msgid "Mailchimp %s Support" msgstr "" -#: includes/fields/class-abstract-fields.php:375 -msgid "Make this field read only " +#: includes/Free/templates/page-registration-form.php:50 +msgid "GetResponse %s Support" msgstr "" -#: includes/fields/class-abstract-fields.php:379 -msgid "Read only" +#: includes/Free/templates/page-registration-form.php:54 +msgid "ConvertKit %s Support" msgstr "" -#: includes/fields/class-abstract-fields.php:387 -msgid "Show Data in Post" +#: includes/Free/templates/page-registration-form.php:58 +msgid "Campaign Monitor %s Support" msgstr "" -#: includes/fields/class-abstract-fields.php:397 -msgid "Select Yes if you want to show the field data in single post." +#: includes/Free/templates/page-registration-form.php:62 +msgid "Mailpoet %s Support" msgstr "" -#: includes/fields/class-abstract-fields.php:401 -msgid "Hide Field Label in Post" +#: includes/Free/templates/page-registration-form.php:66 +msgid "Mailpoet 3 Support" msgstr "" -#: includes/fields/class-abstract-fields.php:411 -msgid "Select Yes if you want to hide the field label in single post." +#: includes/Free/templates/page-registration-form.php:81 +msgid "Docs" msgstr "" -#: includes/fields/class-abstract-fields.php:465 -#: includes/fields/class-field-checkbox.php:78 -#: includes/fields/class-field-radio.php:82 -msgid "Show in inline list" +#: includes/Free/templates/page-registration-form.php:96 +msgid "" +"Use the following shortcode to add a %s simple and default WordPress %s " +"registration form." msgstr "" -#: includes/fields/class-abstract-fields.php:475 -#: includes/fields/class-field-checkbox.php:88 -#: includes/fields/class-field-radio.php:92 -msgid "Show this option in an inline list" +#: includes/Free/templates/page-registration-form.php:100 +msgid "Copy" msgstr "" -#: includes/fields/class-abstract-fields.php:524 -msgid "Selection Terms" +#: includes/Free/templates/page-registration-form.php:103 +msgid "How to setup →" msgstr "" -#: includes/fields/class-abstract-fields.php:528 -msgid "Search the terms name. use ⇦ ⇨ for navigate" +#: includes/Free/templates/page-registration-form.php:116 +msgid "Unlock PRO Features" msgstr "" -#: includes/fields/class-abstract-fields.php:629 -msgid "Add options for the form field" +#: includes/Free/templates/page-registration-form.php:117 +msgid "" +"Registration form builder is a two way form which can be used both for user " +"registration %s and profile editing." msgstr "" -#: includes/fields/class-abstract-fields.php:646 -msgid "Number of rows in textarea" +#: includes/Free/templates/page-registration-form.php:132 +msgid "Email Marketing Integrations" msgstr "" -#: includes/fields/class-abstract-fields.php:655 -msgid "Number of columns in textarea" +#: includes/Free/templates/page-registration-form.php:148 +msgid "Learn More →" msgstr "" -#: includes/fields/class-abstract-fields.php:694 -msgid "Select buttons to exclude" +#: includes/Frontend/Form_Preview.php:82 +msgid "You must be logged in to preview this form." msgstr "" -#: includes/fields/class-abstract-fields.php:701 -msgid "" -"Select button for exclude from frontend. Search button name. use ⇦ ⇨ for " -"navigate" +#: includes/Frontend/Form_Preview.php:87 +msgid "Sorry, you are not eligible to preview this form." msgstr "" -#: includes/fields/class-field-column.php:70 -msgid "Number of Columns" +#: includes/Frontend/Frontend_Account.php:43 +#: includes/functions/settings-options.php:349 +msgid "Post Submission" msgstr "" -#: includes/fields/class-field-column.php:74 -#: includes/fields/class-field-recaptcha.php:151 -#: includes/fields/class-field-sectionbreak.php:59 -msgid "Title of the section" +#: includes/Frontend/Frontend_Account.php:44 +#: includes/functions/settings-options.php:350 +msgid "Enable if you want to allow users to submit post from the account page." msgstr "" -#: includes/fields/class-field-column.php:78 -msgid "Space Between Columns" +#: includes/Frontend/Frontend_Account.php:51 +#: includes/functions/settings-options.php:357 +msgid "Submission Menu Label" msgstr "" -#: includes/fields/class-field-column.php:82 -msgid "Add padding space between columns. e.g: 10" +#: includes/Frontend/Frontend_Account.php:52 +#: includes/functions/settings-options.php:358 +msgid "Label for post submission menu" msgstr "" -#: includes/fields/class-field-email.php:9 -msgid "Email Address" +#: includes/Frontend/Frontend_Account.php:54 +#: includes/Frontend/Frontend_Account.php:78 +#: includes/Integrations/WPUF_WCMp_Integration.php:128 +#: includes/Integrations/WPUF_WCMp_Integration.php:146 +#: includes/functions/settings-options.php:360 +msgid "Submit Post" msgstr "" -#: includes/fields/class-field-featured-image.php:120 -#: includes/fields/class-field-image.php:114 -msgid "Button Label" +#: includes/Frontend/Frontend_Account.php:58 +#: includes/functions/settings-options.php:364 +msgid "Submission Form" msgstr "" -#: includes/fields/class-field-featured-image.php:125 -#: includes/fields/class-field-image.php:119 -msgid "Enter a label for the Select button" +#: includes/Frontend/Frontend_Account.php:59 +#: includes/functions/settings-options.php:365 +msgid "" +"Select a post form that will use to submit post by the users from their " +"account page." msgstr "" -#: includes/fields/class-field-hidden.php:9 -msgid "Hidden Field" +#: includes/Frontend/Frontend_Account.php:202 +msgid "

    You have not subscribed to any package yet.

    " msgstr "" -#: includes/fields/class-field-html.php:9 -msgid "Custom HTML" +#: includes/Frontend/Frontend_Account.php:209 +msgid "

    You may have processed your payment, but the pack is not active yet.

    " msgstr "" -#: includes/fields/class-field-html.php:56 -msgid "Html Codes" +#: includes/Frontend/Frontend_Account.php:217 +msgid "%sYour subscription pack is not exists. Please contact admin.%s" msgstr "" -#: includes/fields/class-field-html.php:60 -msgid "Paste your HTML codes, WordPress shortcodes will also work here" +#: includes/Frontend/Frontend_Account.php:231 +#. translators: %s: billing cycle number, %s: billing cycle period +msgid "For each" msgstr "" -#: includes/fields/class-field-html.php:77 -msgid "HTML Section" +#: includes/Frontend/Frontend_Account.php:299 +msgid "Nonce failure" msgstr "" -#: includes/fields/class-field-image.php:9 includes/free/form-element.php:9 -msgid "Image Upload" +#: includes/Frontend/Frontend_Account.php:310 +msgid "First Name is a required field." msgstr "" -#: includes/fields/class-field-numeric.php:7 -#: includes/fields/class-pro-upgrade-fields.php:82 -#: includes/free/form-element.php:17 -msgid "Numeric Field" +#: includes/Frontend/Frontend_Account.php:313 +msgid "Last Name is a required field." msgstr "" -#: includes/fields/class-field-post-content.php:9 includes/free/loader.php:856 -msgid "Post Content" +#: includes/Frontend/Frontend_Account.php:316 +msgid "Email is a required field." msgstr "" -#: includes/fields/class-field-post-excerpt.php:6 -msgid "Post Excerpt" +#: includes/Frontend/Frontend_Account.php:325 +msgid "Please provide a valid email address." msgstr "" -#: includes/fields/class-field-radio.php:9 -msgid "Radio" +#: includes/Frontend/Frontend_Account.php:327 +msgid "This email address is already registered." msgstr "" -#: includes/fields/class-field-recaptcha.php:9 -#: includes/free/form-element.php:32 -msgid "reCaptcha" +#: includes/Frontend/Frontend_Account.php:332 +msgid "Please fill out all password fields." msgstr "" -#: includes/fields/class-field-recaptcha.php:48 -msgid "reCaptcha API key is missing." +#: includes/Frontend/Frontend_Account.php:335 +msgid "Please enter your current password." msgstr "" -#: includes/fields/class-field-recaptcha.php:126 -msgid "Site key and Secret key" +#: includes/Frontend/Frontend_Account.php:338 +msgid "Please re-enter your password." msgstr "" -#: includes/fields/class-field-recaptcha.php:128 -msgid "" -"You need to set Site key and Secret key in Settings in order to use \"Recaptcha\" field. Click here to get the these key." +#: includes/Frontend/Frontend_Account.php:341 +msgid "New passwords do not match." msgstr "" -#: includes/fields/class-field-recaptcha.php:165 -msgid "Select reCaptcha type" +#: includes/Frontend/Frontend_Account.php:345 +#: includes/Frontend/Frontend_Account.php:353 +msgid "Your current password is incorrect." msgstr "" -#: includes/fields/class-field-recaptcha.php:173 -msgid "Light" +#: includes/Frontend/Frontend_Dashboard.php:88 +msgid "Post Deleted" msgstr "" -#: includes/fields/class-field-recaptcha.php:174 -msgid "Dark" +#: includes/Frontend/Frontend_Dashboard.php:165 +msgid "Author Info" msgstr "" -#: includes/fields/class-field-recaptcha.php:179 -msgid "Select reCaptcha Theme" +#: includes/Frontend/Frontend_Dashboard.php:204 +#: templates/dashboard/posts.php:34 +#. translators: %s: user display name +msgid "You are not the post author. Cheating huh!" msgstr "" -#: includes/fields/class-field-sectionbreak.php:9 -msgid "Section Break" +#: includes/Frontend/Frontend_Form.php:48 +msgid "You are not logged in" msgstr "" -#: includes/fields/class-field-sectionbreak.php:67 -msgid "Some details text about the section" +#: includes/Frontend/Frontend_Form.php:58 +#: includes/Frontend/Frontend_Form.php:88 +msgid "Invalid post" msgstr "" -#: includes/fields/class-field-sectionbreak.php:84 -msgid "Some description about this section" +#: includes/Frontend/Frontend_Form.php:65 +msgid "Your edit access for this post has been locked by an administrator." msgstr "" -#: includes/fields/class-field-text.php:9 -#: includes/fields/class-field-text.php:126 -msgid "Text" +#: includes/Frontend/Frontend_Form.php:69 +msgid "Your allocated time for editing this post has been expired." msgstr "" -#: includes/fields/class-field-url.php:9 -msgid "Website URL" +#: includes/Frontend/Frontend_Form.php:77 +msgid "Your post edit access has been locked by an administrator." msgstr "" -#: includes/fields/class-field-url.php:63 -msgid "Open in : " +#: includes/Frontend/Frontend_Form.php:82 +msgid "Post Editing is disabled" msgstr "" -#: includes/fields/class-field-url.php:66 -msgid "Same Window" +#: includes/Frontend/Frontend_Form.php:93 +msgid "You are not allowed to edit" msgstr "" -#: includes/fields/class-field-url.php:67 -msgid "New Window" +#: includes/Frontend/Frontend_Form.php:104 +msgid "I don't know how to edit this post, I don't have the form ID" msgstr "" -#: includes/fields/class-field-url.php:73 -msgid "Choose whether the link will open in new tab or same window" +#: includes/Frontend/Frontend_Form.php:117 +msgid "You can't edit a post while in pending mode." msgstr "" -#: includes/fields/class-pro-upgrade-fields.php:8 -#: includes/free/form-element.php:18 -msgid "Address Field" +#: includes/Frontend/Frontend_Form.php:121 +msgid "You're not allowed to edit this post." msgstr "" -#: includes/fields/class-pro-upgrade-fields.php:30 -msgid "Date / Time" +#: includes/Frontend/Frontend_Form.php:278 +msgid "Post Saved" msgstr "" -#: includes/fields/class-pro-upgrade-fields.php:38 -msgid "Embed" +#: includes/Frontend/Frontend_Form.php:367 +msgid "Email successfully verified. Please Login." msgstr "" -#: includes/fields/class-pro-upgrade-fields.php:93 -msgid "Ratings" +#: includes/Frontend/Payment.php:29 includes/Frontend/Payment.php:30 +msgid "PayPal" msgstr "" -#: includes/fields/class-pro-upgrade-fields.php:104 -msgid "Linear Scale" +#: includes/Frontend/Payment.php:34 includes/Frontend/Payment.php:35 +msgid "Bank Payment" msgstr "" -#: includes/fields/class-pro-upgrade-fields.php:115 -msgid "Checkbox Grid" +#: includes/Frontend/Payment.php:90 +msgid "Please select your payment page from admin panel" msgstr "" -#: includes/fields/class-pro-upgrade-fields.php:126 -msgid "Multiple Choice Grid" +#: includes/Frontend/Payment.php:102 +msgid "No subscription pack found." msgstr "" -#: includes/fields/class-pro-upgrade-fields.php:137 -#: includes/free/form-element.php:12 -msgid "Repeat Field" +#: includes/Frontend/Payment.php:132 +msgid "Your Free package has been activated. Enjoy!" msgstr "" -#: includes/fields/class-pro-upgrade-fields.php:148 -#: includes/free/form-element.php:33 -msgid "Really Simple Captcha" +#: includes/Frontend/Payment.php:136 +msgid "You already have activated a Free package previously." msgstr "" -#: includes/fields/class-pro-upgrade-fields.php:170 -#: includes/free/form-element.php:19 -msgid "Step Start" +#: includes/Frontend/Payment.php:188 +msgid "Pricing & Plans" msgstr "" -#: includes/fields/class-pro-upgrade-fields.php:181 -msgid "Terms & Conditions" +#: includes/Frontend/Payment.php:191 +msgid "Change Pack" msgstr "" -#: includes/fields/class-pro-upgrade-fields.php:193 -msgid "Math Captcha" +#: includes/Frontend/Payment.php:212 +msgid "Selected Pack" msgstr "" -#: includes/fields/class-pro-upgrade-fields.php:205 -msgid "QR Code" +#: includes/Frontend/Payment.php:216 +msgid "Pack Price" msgstr "" -#: includes/free/admin/shortcode-builder.php:5 -msgid "Select a form to insert" +#: includes/Frontend/Payment.php:223 includes/Frontend/Payment.php:288 +#: includes/WPUF_Privacy.php:343 +msgid "Total" msgstr "" -#: includes/free/admin/shortcode-builder.php:9 includes/free/loader.php:104 -msgid "Registration Form" +#: includes/Frontend/Payment.php:243 +msgid "Apply Coupon" msgstr "" -#: includes/free/admin/shortcode-builder.php:13 -msgid "Form Type" +#: includes/Frontend/Payment.php:251 +msgid "Have a discount code?" msgstr "" -#: includes/free/admin/shortcode-builder.php:69 -msgid "Insert Form" +#: includes/Frontend/Payment.php:282 +msgid "Post cost" msgstr "" -#: includes/free/admin/shortcode-button.php:50 -msgid "Add a Form" +#: includes/Frontend/Payment.php:299 +msgid "Choose Your Payment Method" msgstr "" -#: includes/free/admin/shortcode-button.php:51 -msgid " Add Form" +#: includes/Frontend/Payment.php:346 +msgid "Proceed" msgstr "" -#: includes/free/class-login.php:319 -msgid "Lost Password" +#: includes/Frontend/Payment.php:354 +msgid "No Payment gateway found" msgstr "" -#: includes/free/class-login.php:361 -msgid "Check your e-mail for the confirmation link." +#: includes/Frontend/Payment.php:528 +#. translators: %s is site title name +msgid "New payment received at %s" msgstr "" -#: includes/free/class-login.php:365 -msgid "" -"Please enter your username or email address. You will receive a link to " -"create a new password via email." +#: includes/Frontend/Registration.php:193 +msgid "First name is required." msgstr "" -#: includes/free/class-login.php:374 -msgid "Your password has been reset successfully" +#: includes/Frontend/Registration.php:200 +msgid "Last name is required." msgstr "" -#: includes/free/class-login.php:380 -msgid "Enter your new password below." +#: includes/Frontend/Registration.php:207 +msgid "Email is required." msgstr "" -#: includes/free/class-login.php:391 -msgid "You are now logged out." +#: includes/Frontend/Registration.php:228 +msgid "Confirm Password is required." msgstr "" -#: includes/free/class-login.php:417 -msgid "Nonce is invalid" +#: includes/Frontend/Registration.php:235 +msgid "Passwords are not same." msgstr "" -#: includes/free/class-login.php:436 includes/free/class-registration.php:232 -msgid "Username is required." +#: includes/Frontend/Registration.php:242 +msgid "A user with same username already exists." msgstr "" -#: includes/free/class-login.php:442 includes/free/class-registration.php:238 -msgid "Password is required." +#: includes/Frontend/Registration.php:287 +#. translators: %s: site name +msgid "New user registration on your site %s:" msgstr "" -#: includes/free/class-login.php:464 includes/free/class-registration.php:208 -#: includes/free/class-registration.php:214 -#: includes/free/class-registration.php:220 -#: includes/free/class-registration.php:226 -#: includes/free/class-registration.php:232 -#: includes/free/class-registration.php:238 -#: includes/free/class-registration.php:244 -#: includes/free/class-registration.php:250 -#: includes/free/class-registration.php:256 -#: includes/free/class-registration.php:269 -msgid "Error" +#: includes/Frontend/Registration.php:293 +#. translators: %s: email +msgid "E-mail: %s" msgstr "" -#: includes/free/class-login.php:464 includes/free/class-registration.php:269 -msgid "A user could not be found with this email address." +#: includes/Frontend/Registration.php:300 +#: includes/Frontend/Registration.php:311 +#. translators: %s %s: site name subject +msgid "[%1$s] %2$s" msgstr "" -#: includes/free/class-login.php:659 -msgid "Please enter your password." +#: includes/Frontend/Registration.php:303 +#. translators: %s: username +msgid "Hi, %s" msgstr "" -#: includes/free/class-login.php:665 -msgid "Passwords do not match." +#: includes/Frontend/Registration.php:374 +msgid "Subscription Page settings not set in admin settings" msgstr "" -#: includes/free/class-login.php:713 -msgid "Enter a username or e-mail address." +#: includes/Frontend.php:108 +msgid "Please fix the errors to proceed" msgstr "" -#: includes/free/class-login.php:720 -msgid "There is no user registered with that email address." +#: includes/Frontend.php:110 +msgid "Word limit reached" msgstr "" -#: includes/free/class-login.php:737 -msgid "Invalid username or e-mail." +#: includes/Frontend.php:111 +msgid "Are you sure you want to cancel your current subscription ?" msgstr "" -#: includes/free/class-login.php:751 -msgid "Password reset is not allowed for this user" +#: includes/Frontend.php:116 +msgid "Maximum word limit reached. Please shorten your texts." msgstr "" -#: includes/free/class-login.php:790 -#. translators: %s: activation link +#: includes/Frontend.php:119 msgid "" -"Your account is not active.
    Please check your email for " -"activation link.
    Click here to resend the activation " -"link" +"This field supports a maximum of %number% words, and the limit is reached. " +"Remove a few words to reach the acceptable limit of the field." msgstr "" -#: includes/free/class-login.php:811 includes/free/class-login.php:836 -msgid "Activation URL is not valid" +#: includes/Frontend.php:123 +msgid "Minimum word required." msgstr "" -#: includes/free/class-login.php:822 -msgid "Invalid User activation url" +#: includes/Frontend.php:124 +msgid "This field requires minimum %number% words. Please add some more text." msgstr "" -#: includes/free/class-login.php:828 -msgid "User already verified" +#: includes/Frontend.php:127 +msgid "Maximum character limit reached. Please shorten your texts." msgstr "" -#: includes/free/class-login.php:844 includes/free/class-login.php:920 -msgid "Your account has been activated" +#: includes/Frontend.php:130 +msgid "" +"This field supports a maximum of %number% characters, and the limit is " +"reached. Remove a few characters to reach the acceptable limit of the field." +msgstr "" + +#: includes/Frontend.php:134 +msgid "Minimum character required." msgstr "" -#: includes/free/class-login.php:847 +#: includes/Frontend.php:135 msgid "" -"Your account has been verified , but you can't login until manually " -"approved your account by an administrator." +"This field requires minimum %number% characters. Please add some more " +"character." msgstr "" -#: includes/free/class-login.php:870 -#. translators: %s: blogname -msgid "[%s] Your username and password info" +#: includes/Frontend.php:140 +msgid "Using %shortcode% is restricted" msgstr "" -#: includes/free/class-login.php:873 -msgid "To set your password, visit the following address:" +#: includes/Frontend.php:147 +msgid "is required" msgstr "" -#: includes/free/class-login.php:969 -msgid "Someone requested that the password be reset for the following account:" +#: includes/Frontend.php:148 +msgid "does not match" msgstr "" -#: includes/free/class-login.php:991 -msgid "The e-mail could not be sent." +#: includes/Frontend.php:149 +msgid "is not valid" msgstr "" -#: includes/free/class-login.php:991 -msgid "Possible reason: your host may have disabled the mail() function." +#: includes/Frontend_Render_Form.php:300 +#: includes/class-frontend-render-form.php:910 +#: templates/dashboard/posts.php:120 +msgid "Featured" msgstr "" -#: includes/free/class-login.php:1111 -#. translators: %s: blogname -msgid "[%s] Account has been activated" +#: includes/Frontend_Render_Form.php:305 +#: includes/class-frontend-render-form.php:915 +msgid "Mark the %s as featured (remaining %d)" msgstr "" -#: includes/free/class-login.php:1113 -#. translators: %s: username -msgid "Hi %s," +#: includes/Integrations/WPUF_ACF_Compatibility.php:180 +msgid "%s Detected" msgstr "" -#: includes/free/class-login.php:1114 -msgid "Congrats! Your account has been activated. To login visit the following url:" +#: includes/Integrations/WPUF_ACF_Compatibility.php:182 +msgid "" +"Hey, looks like you have %s installed. What do you want to " +"do with WPUF?" msgstr "" -#: includes/free/class-login.php:1116 -msgid "Thanks" +#: includes/Integrations/WPUF_ACF_Compatibility.php:185 +msgid "" +"It will update compatibility option only, so existing custom fields data " +"format will not change." msgstr "" -#: includes/free/class-login.php:1142 -msgid " Login " +#: includes/Integrations/WPUF_ACF_Compatibility.php:188 +msgid "" +"It will update existing custom fields data to ACF format and update " +"compatibility option too." msgstr "" -#: includes/free/class-registration.php:214 -msgid "First name is required." +#: includes/Integrations/WPUF_ACF_Compatibility.php:193 +msgid "Compatible" msgstr "" -#: includes/free/class-registration.php:220 -msgid "Last name is required." +#: includes/Integrations/WPUF_ACF_Compatibility.php:196 +msgid "Compatible & Migrate" msgstr "" -#: includes/free/class-registration.php:226 -msgid "Email is required." +#: includes/Integrations/WPUF_ACF_Compatibility.php:199 +msgid "No Thanks" msgstr "" -#: includes/free/class-registration.php:244 -msgid "Confirm Password is required." +#: includes/Integrations/WPUF_Dokan_Integration.php:34 +#: includes/Integrations/WPUF_WC_Vendors_Integration.php:99 +msgid "Posts" msgstr "" -#: includes/free/class-registration.php:250 -msgid "Passwords are not same." +#: includes/Integrations/WPUF_Dokan_Integration.php:86 +#: includes/Integrations/WPUF_WCMp_Integration.php:38 +#: includes/Integrations/WPUF_WC_Vendors_Integration.php:35 +msgid "Allow Post" msgstr "" -#: includes/free/class-registration.php:256 -msgid "A user with same username already exists." +#: includes/Integrations/WPUF_Dokan_Integration.php:87 +msgid "Allow Vendors to submit post from dashboard area" msgstr "" -#: includes/free/class-registration.php:300 -#. translators: %s: site name -msgid "New user registration on your site %s:" +#: includes/Integrations/WPUF_Dokan_Integration.php:93 +#: includes/Integrations/WPUF_WCMp_Integration.php:47 +#: includes/Integrations/WPUF_WC_Vendors_Integration.php:42 +msgid "Select Post Form" msgstr "" -#: includes/free/class-registration.php:304 -#. translators: %s: email -msgid "E-mail: %s" +#: includes/Integrations/WPUF_Dokan_Integration.php:94 +#: includes/Integrations/WPUF_WCMp_Integration.php:52 +#: includes/Integrations/WPUF_WC_Vendors_Integration.php:43 +msgid "Select a post form that will show on the vendor dashboard." msgstr "" -#: includes/free/class-registration.php:310 -#: includes/free/class-registration.php:320 -#. translators: %s %s: site name subject -msgid "[%1$s] %2$s" +#: includes/Integrations/WPUF_WCMp_Integration.php:42 +#: includes/Integrations/WPUF_WC_Vendors_Integration.php:36 +msgid "If checked, vendor can submit post from dashboard area." msgstr "" -#: includes/free/class-registration.php:312 -#. translators: %s: username -msgid "Hi, %s" +#: includes/Integrations/WPUF_WCMp_Integration.php:85 +msgid "Vendor Submit Post" msgstr "" -#: includes/free/class-registration.php:388 -msgid "Subscription Page settings not set in admin settings" +#: includes/Integrations/WPUF_WCMp_Integration.php:90 +msgid "Set endpoint for vendor submit post page" msgstr "" -#: includes/free/edit-profile.php:73 -msgid "Success: Profile updated" +#: includes/Setup_Wizard.php:136 +msgid "Introduction" msgstr "" -#: includes/free/edit-profile.php:103 -msgid "Usernames cannot be changed." +#: includes/Setup_Wizard.php:146 +msgid "Ready!" msgstr "" -#: includes/free/edit-profile.php:116 -msgid "Nickname" +#: includes/Setup_Wizard.php:183 +msgid "WPUF › Setup Wizard" msgstr "" -#: includes/free/edit-profile.php:116 includes/free/edit-profile.php:163 -msgid "(required)" +#: includes/Setup_Wizard.php:256 +msgid "Return to the WordPress Dashboard" msgstr "" -#: includes/free/edit-profile.php:121 -msgid "Display to Public as" +#: includes/Setup_Wizard.php:297 +msgid "Welcome to the world of WPUF!" msgstr "" -#: includes/free/edit-profile.php:159 -msgid "Contact Info" +#: includes/Setup_Wizard.php:298 +msgid "" +"Thank you for choosing WPUF to power your websites frontend! This quick " +"setup wizard will help you configure the basic settings. It’s " +"completely optional and shouldn’t take longer than a minute." msgstr "" -#: includes/free/edit-profile.php:163 -msgid "E-mail" +#: includes/Setup_Wizard.php:299 +msgid "" +"No time right now? If you don’t want to go through the wizard, you can skip " +"and return to the WordPress dashboard. Come back anytime if you change your " +"mind!" msgstr "" -#: includes/free/edit-profile.php:168 -msgid "Website" +#: includes/Setup_Wizard.php:301 +msgid "Let's Go!" msgstr "" -#: includes/free/edit-profile.php:185 -msgid "About Yourself" +#: includes/Setup_Wizard.php:302 +msgid "Not right now" msgstr "" -#: includes/free/edit-profile.php:189 -msgid "Biographical Info" +#: includes/Setup_Wizard.php:313 +msgid "Basic Setting" msgstr "" -#: includes/free/edit-profile.php:191 -msgid "" -"Share a little biographical information to fill out your profile. This may " -"be shown publicly." +#: includes/Setup_Wizard.php:320 +msgid "Make payment enable for user to add posts on frontend." msgstr "" -#: includes/free/edit-profile.php:194 templates/dashboard/edit-profile.php:55 -msgid "New Password" +#: includes/Setup_Wizard.php:327 +msgid "Install neccessery pages on your site frontend." msgstr "" -#: includes/free/edit-profile.php:202 -msgid "Type your new password again." +#: includes/Setup_Wizard.php:332 +msgid "Share Essentials " msgstr "" -#: includes/free/edit-profile.php:207 -msgid "Password Strength" +#: includes/Setup_Wizard.php:364 +msgid "Continue" msgstr "" -#: includes/free/edit-profile.php:233 includes/free/form-element.php:356 -#: templates/dashboard/edit-profile.php:131 -msgid "Update Profile" +#: includes/Setup_Wizard.php:365 +msgid "Skip this step" msgstr "" -#: includes/free/edit-profile.php:257 -msgid "WPUF Post Lock" +#: includes/Setup_Wizard.php:414 +msgid "Thank you!" msgstr "" -#: includes/free/edit-profile.php:260 -msgid "Lock Post:" +#: includes/Setup_Wizard.php:419 +msgid "Welcome to Awesomeness!" msgstr "" -#: includes/free/edit-profile.php:266 -msgid "Lock user from creating new post." +#: includes/Setup_Wizard.php:423 +msgid "Go to Full Settings" msgstr "" -#: includes/free/edit-profile.php:270 -msgid "Lock Reason:" +#: includes/Traits/TaxableTrait.php:81 includes/Traits/TaxableTrait.php:190 +msgid "State / Province" msgstr "" -#: includes/free/edit-profile.php:277 -msgid "Lock Edit Post:" +#: includes/Traits/TaxableTrait.php:191 +msgid "Rate" msgstr "" -#: includes/free/edit-profile.php:283 -msgid "Lock user from editing post." +#: includes/Traits/TaxableTrait.php:191 +msgid "" +"Regional tax rates: When a customer enters an address on payment page that " +"matches the specified region for this tax rate, the payment tax will adjust " +"automatically. Enter a percentage, such as 5 for 5%." msgstr "" -#: includes/free/edit-profile.php:287 -msgid "Edit Post Lock Reason:" +#: includes/Traits/TaxableTrait.php:248 includes/Traits/TaxableTrait.php:280 +msgid "Remove Rate" msgstr "" -#: includes/free/edit-user.php:23 includes/free/edit-user.php:26 -msgid "User doesn't exists" +#: includes/Traits/TaxableTrait.php:285 +msgid "Add Tax Rate" msgstr "" -#: includes/free/edit-user.php:37 -msgid "You don't have permission for this purpose" +#: includes/User_Subscription.php:59 +msgid "You must purchase a subscription package before posting" msgstr "" -#: includes/free/edit-user.php:81 -msgid "User Deleted" +#: includes/User_Subscription.php:64 +msgid "The subscription pack has expired. Please buy a pack." msgstr "" -#: includes/free/edit-user.php:90 -msgid "Are you sure to delete this user?" +#: includes/User_Subscription.php:324 templates/dashboard/subscription.php:3 +msgid "Subscription Details" msgstr "" -#: includes/free/edit-user.php:98 -msgid "Action" +#: includes/User_Subscription.php:326 templates/dashboard/subscription.php:5 +msgid "Subcription Name: " msgstr "" -#: includes/free/edit-user.php:102 -msgid "%s" +#: includes/User_Subscription.php:328 templates/dashboard/subscription.php:7 +msgid "Package & billing details: " msgstr "" -#: includes/free/edit-user.php:123 includes/free/edit-user.php:196 -msgid "Add New User" +#: includes/User_Subscription.php:339 templates/dashboard/subscription.php:20 +msgid "Remaining post: " msgstr "" -#: includes/free/edit-user.php:145 -msgid "User Added" +#: includes/User_Subscription.php:353 templates/dashboard/subscription.php:36 +#: templates/dashboard/subscription.php:48 +msgid "Unlimited" msgstr "" -#: includes/free/edit-user.php:179 -msgid "Role" +#: includes/User_Subscription.php:384 +msgid "Change" msgstr "" -#: includes/free/edit-user.php:224 -msgid "ERROR: Please enter a username" +#: includes/WPUF_Privacy.php:40 +msgid "" +"This sample policy includes the basics around what personal data you may be " +"collecting, storing and sharing, as well as who may have access to that " +"data. Depending on what settings are enabled and which additional plugins " +"are used, the specific information shared by your form will vary. We " +"recommend consulting with a lawyer when deciding what information to " +"disclose on your privacy policy." msgstr "" -#: includes/free/edit-user.php:226 +#: includes/WPUF_Privacy.php:42 msgid "" -"ERROR: This username is invalid because it uses illegal " -"characters. Please enter a valid username" +"We collect information about you during the form submission process on our " +"WordPress website." msgstr "" -#: includes/free/edit-user.php:229 -msgid "" -"ERROR: This username is already registered, please choose " -"another one" +#: includes/WPUF_Privacy.php:43 +msgid "What we collect and store" msgstr "" -#: includes/free/edit-user.php:234 -msgid "ERROR: Please type your e-mail address" +#: includes/WPUF_Privacy.php:44 +msgid "While you visit our , we’ll track:" msgstr "" -#: includes/free/edit-user.php:236 -msgid "ERROR: The email address isn’t correct" +#: includes/WPUF_Privacy.php:46 +msgid "" +"Form Fields Data: Forms Fields data includes the available field types when " +"creating a form. We’ll use this to, for example, collect informations like " +"Name, Email and other available fields." msgstr "" -#: includes/free/edit-user.php:239 +#: includes/WPUF_Privacy.php:47 msgid "" -"ERROR: This email is already registered, please choose " -"another one" +"Location, IP address and browser type: we’ll use this for purposes like " +"estimating taxes and shipping. Also, for reducing fraudulent activities and " +"prevent identity theft while placing orders" msgstr "" -#: includes/free/edit-user.php:263 +#: includes/WPUF_Privacy.php:48 msgid "" -"ERROR: Couldn’t register you... please contact the " -"webmaster !" +"Transaction Details: we’ll ask you to enter this so we can, for instance, " +"provide & regulate subscription packs that you bought and keep track of " +"your payment details for subscription packs!" msgstr "" -#: includes/free/form-element.php:8 includes/free/form-element.php:27 -msgid "Click to add to the editor" +#: includes/WPUF_Privacy.php:50 +msgid "" +"We’ll also use cookies to keep track of form elements while you’re browsing " +"our site." msgstr "" -#: includes/free/form-element.php:15 -msgid "Google Maps" +#: includes/WPUF_Privacy.php:51 +msgid "" +"Note: you may want to further detail your cookie policy, and link to that " +"section from here." msgstr "" -#: includes/free/form-element.php:35 -msgid "Term & Conditions" +#: includes/WPUF_Privacy.php:52 +msgid "" +"When you fill up a form, we’ll ask you to provide information including " +"your name, billing address, shipping address, email address, phone number, " +"credit card/payment details and optional account information like username " +"and password and any other form fields found in the form building options. " +"We’ll use this information for purposes, such as, to:" msgstr "" -#: includes/free/form-element.php:64 -msgid "Learn more about Automatic Post Expiration" +#: includes/WPUF_Privacy.php:54 +msgid "Send you information about your account and order" msgstr "" -#: includes/free/form-element.php:129 -msgid "Send Email to Author After Exceeding Post Expiration Time" +#: includes/WPUF_Privacy.php:55 +msgid "Respond to your requests, including transaction details and complaints" msgstr "" -#: includes/free/form-element.php:155 includes/free/form-element.php:159 -msgid "Enable Multistep" +#: includes/WPUF_Privacy.php:56 +msgid "Process payments and prevent fraud" msgstr "" -#: includes/free/form-element.php:162 -msgid "If checked, form will be displayed in frontend in multiple steps" +#: includes/WPUF_Privacy.php:57 +msgid "Set up your account" msgstr "" -#: includes/free/form-element.php:163 -msgid " Learn more about Multistep" +#: includes/WPUF_Privacy.php:58 +msgid "Comply with any legal obligations we have, such as calculating taxes" msgstr "" -#: includes/free/form-element.php:167 -msgid "Multistep Progressbar Type" +#: includes/WPUF_Privacy.php:59 +msgid "Improve our form offerings" msgstr "" -#: includes/free/form-element.php:177 -msgid "Choose how you want the progressbar" +#: includes/WPUF_Privacy.php:60 +msgid "Send you marketing messages, if you choose to receive them" msgstr "" -#: includes/free/form-element.php:206 -msgid "New post created" +#: includes/WPUF_Privacy.php:62 +msgid "" +"If you create an account, we will store your name, address, email and phone " +"number, which will be used to populate the form fields for future " +"submissions." msgstr "" -#: includes/free/form-element.php:211 -msgid "A post has been edited" +#: includes/WPUF_Privacy.php:63 +msgid "" +"We generally store information about you for as long as we need the " +"information for the purposes for which we collect and use it, and we are " +"not legally required to continue keeping it. For example, we will store " +"form submission information for XXX years for tax, accounting and marketing " +"purposes. This includes your name, email address and billing and shipping " +"addresses." msgstr "" -#: includes/free/form-element.php:215 -msgid "New Post Notification" +#: includes/WPUF_Privacy.php:64 +msgid "Who on our team has access" msgstr "" -#: includes/free/form-element.php:223 includes/free/form-element.php:261 -msgid "Enable post notification" +#: includes/WPUF_Privacy.php:65 +msgid "" +"Members of our team have access to the information you provide us. For " +"example, Administrators and Editors and any body else who has permission " +"can access:" msgstr "" -#: includes/free/form-element.php:226 -msgid "Learn more about Email Notification" +#: includes/WPUF_Privacy.php:67 +msgid "Form submission information and other details related to it" msgstr "" -#: includes/free/form-element.php:237 includes/free/form-element.php:272 -msgid "Subject" +#: includes/WPUF_Privacy.php:68 +msgid "" +"Customer information like your name, email address, and billing and " +"shipping information." msgstr "" -#: includes/free/form-element.php:242 includes/free/form-element.php:277 -msgid "Message" +#: includes/WPUF_Privacy.php:70 +msgid "" +"Our team members have access to this information to help fulfill " +"transactions and support you." msgstr "" -#: includes/free/form-element.php:249 -msgid "Update Post Notification" +#: includes/WPUF_Privacy.php:71 +msgid "What we share with others" msgstr "" -#: includes/free/form-element.php:285 -msgid "You may use in to, subject & message:" +#: includes/WPUF_Privacy.php:72 +msgid "" +"In this section you should list who you’re sharing data with, and for what " +"purpose. This could include, but may not be limited to, analytics, " +"marketing, payment gateways, shipping providers, and third party embeds." msgstr "" -#: includes/free/form-element.php:310 -msgid "Toggle All" +#: includes/WPUF_Privacy.php:73 +msgid "" +"We share information with third parties who help us provide our orders and " +"store services to you; for example --" msgstr "" -#: includes/free/form-element.php:314 -msgid "Click on a form element to add to the editor" +#: includes/WPUF_Privacy.php:74 includes/functions/settings-options.php:39 +msgid "Payments" msgstr "" -#: includes/free/form-element.php:351 -msgid "Registration successful" +#: includes/WPUF_Privacy.php:75 +msgid "" +"In this subsection you should list which third party payment processors " +"you’re using to take payments on your site since these may handle customer " +"data. We’ve included PayPal as an example, but you should remove this if " +"you’re not using PayPal." msgstr "" -#: includes/free/form-element.php:352 -msgid "Profile updated successfully" +#: includes/WPUF_Privacy.php:76 +msgid "" +"We accept payments through PayPal. When processing payments, some of your " +"data will be passed to PayPal, including information required to process or " +"support the payment, such as the purchase total and billing information." msgstr "" -#: includes/free/form-element.php:364 -msgid "Enable Email Verfication" +#: includes/WPUF_Privacy.php:77 +msgid "" +"Please see the PayPal " +"Privacy Policy for more details." msgstr "" -#: includes/free/form-element.php:372 -msgid "New User Role" +#: includes/WPUF_Privacy.php:78 +msgid "" +"Also, we accept payments through Stripe. When processing payments, some of " +"your data will be passed to Stripe, including information required to " +"process or support the payment, such as the purchase total and billing " +"information." msgstr "" -#: includes/free/form-element.php:413 -msgid "Registration success message" +#: includes/WPUF_Privacy.php:79 +msgid "" +"Please see the Stripe Privacy " +"Policy for more details." msgstr "" -#: includes/free/form-element.php:420 -msgid "Update profile message" +#: includes/WPUF_Privacy.php:80 +msgid "Available Modules" msgstr "" -#: includes/free/form-element.php:457 -msgid "Submit Button text" +#: includes/WPUF_Privacy.php:81 +msgid "" +"In this subsection you should list which third party modules you’re using " +"to increase the functionality of your created forms using WP User Frontend " +"since these may handle customer data." msgstr "" -#: includes/free/form-element.php:464 -msgid "Update Button text" +#: includes/WPUF_Privacy.php:82 +msgid "" +"WP User Frontend Pro comes with support for modules like MailChimp, " +"ConvertKit, Stipe, Paid Membership Pro, MailPoet, Zapier, GetResponse, " +"MailPoet 3, Campaign Monitor, Social Login, BuddyPress. Please note any " +"future modules that will be added will have some data transferred to their " +"own platform which falls in their own data policy. " msgstr "" -#: includes/free/loader.php:96 includes/free/loader.php:157 -msgid "Coupons" +#: includes/WPUF_Privacy.php:83 +msgid "" +"As an example while using MailChimp for your marketing email automation " +"service by integrating it with WP User Frontend, some of your data will be " +"passed to MailChimp, including information required to process or support " +"the email marketing services, such as name, email address and any other " +"information that you intend to pass or collect including all collected " +"information through subscription. " msgstr "" -#: includes/free/loader.php:106 -msgid "Use the shortcode %s for a simple and default WordPress registration form." +#: includes/WPUF_Privacy.php:84 +msgid "" +"Please see the MailChimp " +"Privacy Policy for more details." msgstr "" -#: includes/free/loader.php:111 -msgid "Learn How to Setup" +#: includes/WPUF_Privacy.php:99 includes/WPUF_Privacy.php:130 +#: includes/WPUF_Privacy.php:170 +msgid "WPUF User Data" msgstr "" -#: includes/free/loader.php:119 -msgid "" -"Registration form builder is a two way form which can be used both for " -"user registration and profile editing." +#: includes/WPUF_Privacy.php:104 includes/WPUF_Privacy.php:292 +msgid "WPUF Subscription Data" msgstr "" -#: includes/free/loader.php:129 -msgid "Profile Form Builder" +#: includes/WPUF_Privacy.php:109 includes/WPUF_Privacy.php:322 +msgid "WPUF Transaction Data" msgstr "" -#: includes/free/loader.php:133 -msgid "Register by Subscription Package Purchase" +#: includes/WPUF_Privacy.php:114 includes/WPUF_Privacy.php:413 +msgid "WPUF Post Data" msgstr "" -#: includes/free/loader.php:138 includes/free/loader.php:169 -msgid "Upgrade to Pro Version" +#: includes/WPUF_Privacy.php:171 +msgid "WP User Frontend user data." msgstr "" -#: includes/free/loader.php:139 -msgid "Learn More" +#: includes/WPUF_Privacy.php:250 +msgid "Billing Address 1" msgstr "" -#: includes/free/loader.php:161 -msgid "Use Coupon codes for subscription for discounts." +#: includes/WPUF_Privacy.php:254 +msgid "Billing Address 2" msgstr "" -#: includes/free/loader.php:165 -msgid "This feature is only available in the Pro Version." +#: includes/WPUF_Privacy.php:262 +msgid "State" msgstr "" -#: includes/free/loader.php:170 -msgid "Learn more about Coupons" +#: includes/WPUF_Privacy.php:266 +msgid "Zip" msgstr "" -#: includes/free/loader.php:219 -msgid "SMS" +#: includes/WPUF_Privacy.php:293 +msgid "WP User Frontend subscription data." msgstr "" -#: includes/free/loader.php:240 -msgid "Invoices" +#: includes/WPUF_Privacy.php:323 +msgid "WP User Frontend transaction data." msgstr "" -#: includes/free/loader.php:254 -msgid "Content Filtering" +#: includes/WPUF_Privacy.php:331 +msgid "Payment Status" msgstr "" -#: includes/free/loader.php:277 -msgid "Comments Per Page" +#: includes/WPUF_Privacy.php:367 +msgid "Payment Type" msgstr "" -#: includes/free/loader.php:279 -msgid "Show how many comments per page in comments add-on" +#: includes/WPUF_Privacy.php:371 +msgid "payer_address" msgstr "" -#: includes/free/loader.php:287 -msgid "Ipstack API Key" +#: includes/WPUF_Privacy.php:381 +msgid "Transaction Date" msgstr "" -#: includes/free/loader.php:289 -msgid "" -"Register " -"here to get your free ipstack api key" +#: includes/WPUF_Privacy.php:414 +msgid "WP User Frontend post data." msgstr "" -#: includes/free/loader.php:296 -msgid "Google Map API" +#: includes/WPUF_Privacy.php:426 +msgid "Post URL" msgstr "" -#: includes/free/loader.php:298 -msgid "" -"API key is needed to render Google Maps" +#: includes/WPUF_Privacy.php:430 +msgid "Post Date" +msgstr "" + +#: includes/WPUF_Privacy.php:475 +msgid "Pack Title" msgstr "" -#: includes/free/loader.php:305 wpuf-functions.php:2043 -msgid "Edit Profile" +#: includes/WPUF_Privacy.php:479 +msgid "Expiry" msgstr "" -#: includes/free/loader.php:307 -msgid "Allow user to update their profile information from the account page" +#: includes/Widgets/Login_Widget.php:19 +msgid "WPUF Ajax Login" msgstr "" -#: includes/free/loader.php:316 -msgid "Profile Form" +#: includes/Widgets/Login_Widget.php:20 +msgid "Ajax Login widget for WP User Frontend" msgstr "" -#: includes/free/loader.php:318 -msgid "User will use this form to update their information from the account page," +#: includes/Widgets/Login_Widget.php:40 includes/Widgets/Login_Widget.php:84 +msgid "Please fill all form fields" msgstr "" -#: includes/free/loader.php:327 -msgid "Avatar Size" +#: includes/Widgets/Login_Widget.php:47 +msgid "Login successful!" msgstr "" -#: includes/free/loader.php:329 -msgid "" -"Avatar size to crop when upload using the registration/profile " -"form.(e.g:100x100)" +#: includes/Widgets/Login_Widget.php:66 +msgid "Logout successful!" msgstr "" -#: includes/free/loader.php:338 -msgid "Pending User Message" +#: includes/Widgets/Login_Widget.php:101 +msgid "Password has been reset. Please check your email." msgstr "" -#: includes/free/loader.php:340 -msgid "Pending user will see this message when try to log in." +#: includes/Widgets/Login_Widget.php:117 +msgid "ERROR: Enter a username or email address." msgstr "" -#: includes/free/loader.php:341 -msgid "" -"ERROR: Your account has to be approved by an administrator " -"before you can login." +#: includes/Widgets/Login_Widget.php:122 +msgid "ERROR: There is no user registered with that email address." msgstr "" -#: includes/free/loader.php:349 -msgid "Denied User Message" +#: includes/Widgets/Login_Widget.php:139 +msgid "ERROR: Invalid username or email." msgstr "" -#: includes/free/loader.php:351 -msgid "Denied user will see this message when try to log in." +#: includes/Widgets/Login_Widget.php:153 +msgid "Someone has requested a password reset for the following account:" msgstr "" -#: includes/free/loader.php:352 +#: includes/Widgets/Login_Widget.php:169 msgid "" -"ERROR: Your account has been denied by an administrator, " -"please contact admin to approve your account." -msgstr "" - -#: includes/free/loader.php:360 -msgid " Subscription" +"ERROR: The email could not be sent.Possible reason: your " +"host may have disabled the mail() function." msgstr "" -#: includes/free/loader.php:368 -msgid " Template Settings" +#: includes/Widgets/Login_Widget.php:238 +msgid "Lost your password?" msgstr "" -#: includes/free/loader.php:376 -msgid " Reset Email" +#: includes/Widgets/Login_Widget.php:246 templates/lost-pass-form.php:18 +msgid "Username or E-mail:" msgstr "" -#: includes/free/loader.php:384 -msgid "" -" Resend Confirmation " -"Email" +#: includes/Widgets/Login_Widget.php:274 +msgid "Log out" msgstr "" -#: includes/free/loader.php:392 -msgid " Pending User Email" +#: includes/Widgets/Login_Widget.php:289 +msgid "WPUF Login Widget" msgstr "" -#: includes/free/loader.php:400 -msgid " Denied User Email" +#: includes/Widgets/Login_Widget.php:290 +msgid "Username or Email Address" msgstr "" -#: includes/free/loader.php:408 -msgid " Approved User Email" +#: includes/Widgets/Login_Widget.php:291 +msgid "" +"Please enter your username or email address. You will receive a link to " +"create a new password via email" msgstr "" -#: includes/free/loader.php:416 -msgid " Account Activated Email" +#: includes/Widgets/Login_Widget.php:293 templates/login-form.php:29 +#: templates/registration-form.php:62 +msgid "Password" msgstr "" -#: includes/free/loader.php:424 -msgid " Approved Post Email" +#: includes/Widgets/Login_Widget.php:294 templates/login-form.php:73 +msgid "Remember Me" msgstr "" -#: includes/free/loader.php:433 includes/free/loader.php:434 -msgid "Clickatell name" +#: includes/Widgets/Login_Widget.php:296 templates/reset-pass-form.php:37 +msgid "Reset Password" msgstr "" -#: includes/free/loader.php:440 includes/free/loader.php:441 -msgid "Clickatell Password" +#: includes/Widgets/Login_Widget.php:299 +msgid "Title:" msgstr "" -#: includes/free/loader.php:447 includes/free/loader.php:448 -msgid "Clickatell api" +#: includes/Widgets/Login_Widget.php:303 +msgid "Log-in Text:" msgstr "" -#: includes/free/loader.php:454 includes/free/loader.php:455 -msgid "SMSGlobal Name" +#: includes/Widgets/Login_Widget.php:307 +msgid "Username Label:" msgstr "" -#: includes/free/loader.php:461 includes/free/loader.php:462 -msgid "SMSGlobal Passord" +#: includes/Widgets/Login_Widget.php:311 +msgid "Password Label:" msgstr "" -#: includes/free/loader.php:468 includes/free/loader.php:469 -msgid "Nexmo API" +#: includes/Widgets/Login_Widget.php:315 +msgid "Remember Me Label:" msgstr "" -#: includes/free/loader.php:475 includes/free/loader.php:476 -msgid "Nexmo API Secret" +#: includes/Widgets/Login_Widget.php:318 +msgid "Log In Label:" msgstr "" -#: includes/free/loader.php:482 includes/free/loader.php:483 -msgid "Twillo From Number" +#: includes/Widgets/Login_Widget.php:322 +msgid "Password Reset Text:" msgstr "" -#: includes/free/loader.php:489 includes/free/loader.php:490 -msgid "Twillo Account SID" +#: includes/Widgets/Login_Widget.php:326 +msgid "Password Reset Label:" msgstr "" -#: includes/free/loader.php:496 includes/free/loader.php:497 -msgid "Twillo Authro Token" +#: includes/functions/settings-options.php:14 +msgid "General Options" msgstr "" -#: includes/free/loader.php:505 -msgid "Enable Social Login" +#: includes/functions/settings-options.php:29 +msgid "My Account" msgstr "" -#: includes/free/loader.php:507 -msgid "" -"Enabling this will add Social Icons under registration form to allow users " -"to login or register using Social Profiles" +#: includes/functions/settings-options.php:34 +msgid "Login / Registration" msgstr "" -#: includes/free/loader.php:513 -msgid "Facebook App Settings" +#: includes/functions/settings-options.php:44 +msgid "E-Mails" msgstr "" -#: includes/free/loader.php:515 includes/free/loader.php:542 -#: includes/free/loader.php:570 includes/free/loader.php:598 -#: includes/free/loader.php:626 -msgid "Create an App" +#: includes/functions/settings-options.php:49 +msgid "Privacy Options" msgstr "" -#: includes/free/loader.php:516 -msgid " if you don't have one and fill App ID and App Secret below. " +#: includes/functions/settings-options.php:64 +msgid "Previous Page" msgstr "" -#: includes/free/loader.php:521 includes/free/loader.php:577 -#: includes/free/loader.php:633 -msgid "Redirect URI" +#: includes/functions/settings-options.php:88 +msgid "Show Admin Bar" msgstr "" -#: includes/free/loader.php:528 -msgid "App Id" +#: includes/functions/settings-options.php:89 +msgid "Select user by roles, who can view admin bar in frontend." msgstr "" -#: includes/free/loader.php:534 -msgid "App Secret" +#: includes/functions/settings-options.php:101 +msgid "Admin area access" msgstr "" -#: includes/free/loader.php:540 -msgid "Twitter App Settings" +#: includes/functions/settings-options.php:102 +msgid "Allow you to block specific user role to Ajax request and Media upload." msgstr "" -#: includes/free/loader.php:543 -msgid " if you don't have one and fill Consumer key and Consumer Secret below." +#: includes/functions/settings-options.php:107 +msgid "Admin Only" msgstr "" -#: includes/free/loader.php:549 -msgid "Callback URL" +#: includes/functions/settings-options.php:108 +msgid "Admins, Editors" msgstr "" -#: includes/free/loader.php:556 -msgid "Consumer Key" +#: includes/functions/settings-options.php:109 +msgid "Admins, Editors, Authors" msgstr "" -#: includes/free/loader.php:562 -msgid "Consumer Secret" +#: includes/functions/settings-options.php:110 +msgid "Admins, Editors, Authors, Contributors" msgstr "" -#: includes/free/loader.php:568 -msgid "Google App Settings" +#: includes/functions/settings-options.php:111 +msgid "Default" msgstr "" -#: includes/free/loader.php:571 includes/free/loader.php:599 -#: includes/free/loader.php:627 -msgid " if you don't have one and fill Client ID and Client Secret below." +#: includes/functions/settings-options.php:116 +msgid "Override the post edit link" msgstr "" -#: includes/free/loader.php:584 includes/free/loader.php:612 -#: includes/free/loader.php:640 -msgid "Client ID" +#: includes/functions/settings-options.php:117 +msgid "" +"Users see the edit link in post if s/he is capable to edit the post/page. " +"Selecting Yes will override the default WordPress edit " +"post link in frontend" msgstr "" -#: includes/free/loader.php:590 -msgid "Client secret" +#: includes/functions/settings-options.php:128 +msgid "ACF Compatibility" msgstr "" -#: includes/free/loader.php:596 -msgid "Linkedin App Settings" +#: includes/functions/settings-options.php:129 +msgid "" +"Select Yes if you want to make compatible WPUF custom " +"fields data with advanced custom fields." msgstr "" -#: includes/free/loader.php:605 -msgid "Redirect URL" +#: includes/functions/settings-options.php:140 +msgid "Load Scripts" msgstr "" -#: includes/free/loader.php:618 includes/free/loader.php:646 -msgid "Client Secret" +#: includes/functions/settings-options.php:141 +msgid "Load scripts/styles in all pages" msgstr "" -#: includes/free/loader.php:624 -msgid "Instagram App Settings" +#: includes/functions/settings-options.php:147 +msgid "reCAPTCHA Site Key" msgstr "" -#: includes/free/loader.php:654 -msgid "Profile Gallery Image Size " +#: includes/functions/settings-options.php:151 +msgid "reCAPTCHA Secret Key" msgstr "" -#: includes/free/loader.php:655 -msgid "Set the image size of picture gallery in frontend" +#: includes/functions/settings-options.php:152 +msgid "" +"Register " +"here to get reCaptcha Site and Secret keys." msgstr "" -#: includes/free/loader.php:662 -msgid "Avatar Size " +#: includes/functions/settings-options.php:157 +msgid "Custom CSS codes" msgstr "" -#: includes/free/loader.php:663 -msgid "Set the image size of profile picture in frontend" +#: includes/functions/settings-options.php:158 +msgid "" +"If you want to add your custom CSS code, it will be added on page header " +"wrapped with style tag" msgstr "" -#: includes/free/loader.php:670 -msgid "Profile Header Template" +#: includes/functions/settings-options.php:166 +msgid "Edit Page" msgstr "" -#: includes/free/loader.php:682 -msgid "User Listing Template" +#: includes/functions/settings-options.php:167 +msgid "Select the page where [wpuf_edit] is located" msgstr "" -#: includes/free/loader.php:699 -msgid "Enable Invoices" +#: includes/functions/settings-options.php:173 +msgid "Default Post Owner" msgstr "" -#: includes/free/loader.php:700 -msgid "Enable sending invoices for completed payments" +#: includes/functions/settings-options.php:174 +msgid "" +"If guest post is enabled and user details are OFF, the posts are assigned " +"to this user" msgstr "" -#: includes/free/loader.php:707 -msgid "Show Invoices" +#: includes/functions/settings-options.php:182 +msgid "Custom Fields in post" msgstr "" -#: includes/free/loader.php:708 -msgid "Show Invoices option where [wpuf_account] is located" +#: includes/functions/settings-options.php:183 +msgid "Show custom fields on post content area" msgstr "" -#: includes/free/loader.php:716 -msgid "Set Invoice Logo" +#: includes/functions/settings-options.php:189 +msgid "Insert Photo image size" msgstr "" -#: includes/free/loader.php:717 -msgid "This sets the company Logo to be used in Invoice" +#: includes/functions/settings-options.php:190 +msgid "" +"Default image size of \"Insert Photo\" button in post " +"content area" msgstr "" -#: includes/free/loader.php:724 -msgid "Set Invoice Color" +#: includes/functions/settings-options.php:198 +msgid "Insert Photo image type" msgstr "" -#: includes/free/loader.php:725 -msgid "Set color code to be used in invoice" +#: includes/functions/settings-options.php:199 +msgid "" +"Default image type of \"Insert Photo\" button in post " +"content area" msgstr "" -#: includes/free/loader.php:732 -msgid "From Address" +#: includes/functions/settings-options.php:203 +msgid "Image only" msgstr "" -#: includes/free/loader.php:733 -msgid "" -"This sets the provider information of the Invoice. Note: use the <br> tag to enter line breaks." +#: includes/functions/settings-options.php:204 +msgid "Image with link" msgstr "" -#: includes/free/loader.php:740 -msgid "Invoice Title" +#: includes/functions/settings-options.php:210 +msgid "Enable Image Caption" msgstr "" -#: includes/free/loader.php:741 -msgid "This sets the payment information title of the Invoice" +#: includes/functions/settings-options.php:211 +msgid "Allow users to update image/video title, caption and description" msgstr "" -#: includes/free/loader.php:747 -msgid "Invoice Paragraph" +#: includes/functions/settings-options.php:218 +msgid "Default Post Form" msgstr "" -#: includes/free/loader.php:748 -msgid "This sets the payment information paragraph of the Invoice" +#: includes/functions/settings-options.php:219 +msgid "Fallback form for post editing if no associated form found" msgstr "" -#: includes/free/loader.php:755 -msgid "Invoice Footer" +#: includes/functions/settings-options.php:227 +msgid "Users can edit post?" msgstr "" -#: includes/free/loader.php:756 -msgid "This sets the footer of the Invoice" +#: includes/functions/settings-options.php:228 +msgid "Users will be able to edit their own posts" msgstr "" -#: includes/free/loader.php:762 -msgid "Invoice Filename Prefix" +#: includes/functions/settings-options.php:238 +msgid "User can delete post?" msgstr "" -#: includes/free/loader.php:763 -msgid "This sets the filename prefix of the Invoice" +#: includes/functions/settings-options.php:239 +msgid "Users will be able to delete their own posts" msgstr "" -#: includes/free/loader.php:769 -msgid "Set Invoice Mail Subject" +#: includes/functions/settings-options.php:249 +msgid "Pending Post Edit" msgstr "" -#: includes/free/loader.php:770 -msgid "This sets the mail subject of the Invoice" +#: includes/functions/settings-options.php:250 +msgid "Disable post editing while post in \"pending\" status" msgstr "" -#: includes/free/loader.php:776 -msgid "Set Invoice Mail Body" +#: includes/functions/settings-options.php:256 +msgid "Editing Published Post" msgstr "" -#: includes/free/loader.php:777 -msgid "This sets the mail body of the Invoice" +#: includes/functions/settings-options.php:257 +msgid "Disable post editing while post in \"publish\" status" msgstr "" -#: includes/free/loader.php:785 -msgid "Need help?" +#: includes/functions/settings-options.php:263 +msgid "Posts per page" msgstr "" -#: includes/free/loader.php:786 -msgid "" -"Visit the Tax setup documentation for " -"guidance on how to setup tax." +#: includes/functions/settings-options.php:264 +msgid "How many posts will be listed in a page" msgstr "" -#: includes/free/loader.php:791 -msgid "Enable Tax" +#: includes/functions/settings-options.php:270 +msgid "Show user bio" msgstr "" -#: includes/free/loader.php:792 -msgid "Enable tax on payments" +#: includes/functions/settings-options.php:271 +msgid "Users biographical info will be shown" msgstr "" -#: includes/free/loader.php:799 -msgid "Base Country and State" +#: includes/functions/settings-options.php:277 +msgid "Show post count" msgstr "" -#: includes/free/loader.php:800 -msgid "Select your base country and state" +#: includes/functions/settings-options.php:278 +msgid "Show how many posts are created by the user" msgstr "" -#: includes/free/loader.php:805 -msgid "Tax Rates" +#: includes/functions/settings-options.php:284 +msgid "Show Featured Image" msgstr "" -#: includes/free/loader.php:806 -msgid "Add tax rates for specific regions. Enter a percentage, such as 5 for 5%" +#: includes/functions/settings-options.php:285 +msgid "Show featured image of the post (Overridden by Shortcode)" msgstr "" -#: includes/free/loader.php:812 -msgid "Fallback Tax Rate" +#: includes/functions/settings-options.php:290 +msgid "Show Payment Column" msgstr "" -#: includes/free/loader.php:813 -msgid "" -"Customers not in a specific rate will be charged this tax rate. Enter a " -"percentage, such as 5 for 5%" +#: includes/functions/settings-options.php:291 +msgid "Enable if you want show payment column on posts table" msgstr "" -#: includes/free/loader.php:821 includes/free/loader.php:826 -msgid "Show prices with tax" +#: includes/functions/settings-options.php:297 +msgid "Featured Image size" msgstr "" -#: includes/free/loader.php:822 -msgid "If frontend prices will include tax or not" +#: includes/functions/settings-options.php:304 +msgid "Not logged in users will see this message" msgstr "" -#: includes/free/loader.php:827 -msgid "Show prices without tax" +#: includes/functions/settings-options.php:311 +msgid "Account Page" msgstr "" -#: includes/free/loader.php:835 -msgid "Enable Content Filtering" +#: includes/functions/settings-options.php:312 +msgid "Select the page which contains [wpuf_account] shortcode" msgstr "" -#: includes/free/loader.php:836 -msgid "Enable Content Filtering in frontend" +#: includes/functions/settings-options.php:319 +msgid "Select Custom Post For Account Page" msgstr "" -#: includes/free/loader.php:843 -msgid "Keyword Dictionary" +#: includes/functions/settings-options.php:320 +msgid "Select the post types you want to show on user dashboard." msgstr "" -#: includes/free/loader.php:844 -msgid "Enter Keywords to Remove. Separate keywords with commas." +#: includes/functions/settings-options.php:326 +msgid "Active Tab" msgstr "" -#: includes/free/loader.php:851 -msgid "Filter main content" +#: includes/functions/settings-options.php:327 +msgid "Which tab should be set as active by default when opening the account page" msgstr "" -#: includes/free/loader.php:852 -msgid "Choose which content to filter." +#: includes/functions/settings-options.php:334 +msgid "Show Subscriptions" msgstr "" -#: includes/free/loader.php:855 -msgid "Post Titles" +#: includes/functions/settings-options.php:335 +msgid "" +"Show Subscriptions tab in \"my account\" page where " +"[wpuf_account] is located" msgstr "" -#: includes/free/loader.php:872 -msgid "Upgrade to Pro" +#: includes/functions/settings-options.php:343 +msgid "Show billing address in account page." msgstr "" -#: includes/free/loader.php:1309 -msgid "Credit Card" +#: includes/functions/settings-options.php:374 +msgid "Auto Login After Registration" msgstr "" -#: includes/free/loader.php:1331 -msgid "Taxonomy Restriction " +#: includes/functions/settings-options.php:375 +msgid "If enabled, users after registration will be logged in to the system" msgstr "" -#: includes/free/loader.php:1349 -msgid "Choose the taxonomy terms you want to enable for this pack:" +#: includes/functions/settings-options.php:382 +msgid "Login/Registration override" msgstr "" -#: includes/free/post-form-templates/easy_digital_download.php:21 -msgid "EDD Download" +#: includes/functions/settings-options.php:383 +msgid "" +"If enabled, default login and registration forms will be overridden by WPUF " +"with pages below" msgstr "" -#: includes/free/post-form-templates/the_events_calendar.php:13 -msgid "The Events Calendar" +#: includes/functions/settings-options.php:390 +msgid "Registration Page" msgstr "" -#: includes/free/post-form-templates/the_events_calendar.php:14 -msgid "Form for creating events. The Events Calendar plugin is required." +#: includes/functions/settings-options.php:391 +msgid "" +"Select the page you want to use as registration page override (should " +"have shortcode)" msgstr "" -#: includes/free/post-form-templates/the_events_calendar.php:21 -msgid "Event Title" +#: includes/functions/settings-options.php:398 +msgid "Login Page" msgstr "" -#: includes/free/post-form-templates/the_events_calendar.php:26 -msgid "Please enter your event title" +#: includes/functions/settings-options.php:399 +msgid "Select the page which contains [wpuf-login] shortcode" msgstr "" -#: includes/free/post-form-templates/the_events_calendar.php:35 -msgid "Event details" +#: includes/functions/settings-options.php:406 +msgid "Redirect After Login" msgstr "" -#: includes/free/post-form-templates/the_events_calendar.php:38 -msgid "Write the full description of your event" +#: includes/functions/settings-options.php:407 +msgid "After successfull login, where the page will redirect to" msgstr "" -#: includes/free/post-form-templates/the_events_calendar.php:54 -msgid "Event Start" +#: includes/functions/settings-options.php:413 +msgid "Default Login Redirect" msgstr "" -#: includes/free/post-form-templates/the_events_calendar.php:67 -msgid "Event End" +#: includes/functions/settings-options.php:414 +msgid "" +"If enabled, users who login using WordPress default login form will be " +"redirected to the selected page." msgstr "" -#: includes/free/post-form-templates/the_events_calendar.php:80 -msgid "All Day Event" +#: includes/functions/settings-options.php:421 +msgid "reCAPTCHA in Login Form" msgstr "" -#: includes/free/post-form-templates/the_events_calendar.php:95 -msgid "Event Website" +#: includes/functions/settings-options.php:422 +msgid "" +"If enabled, users have to verify reCAPTCHA in login page. Also, make sure " +"that reCAPTCHA is configured properly from General Options" msgstr "" -#: includes/free/post-form-templates/the_events_calendar.php:106 -msgid "Currency Symbol" +#: includes/functions/settings-options.php:432 +msgid "Enable payments on your site." msgstr "" -#: includes/free/post-form-templates/the_events_calendar.php:130 -msgid "Upload the main image of your event" +#: includes/functions/settings-options.php:438 +msgid "Subscription Pack Page" msgstr "" -#: includes/free/post-form-templates/the_events_calendar.php:142 -msgid "Provide a short description of this event (optional)" +#: includes/functions/settings-options.php:439 +msgid "Select the page where [wpuf_sub_pack] located." msgstr "" -#: includes/free/post-form-templates/the_events_calendar.php:157 -msgid "Event Tags" +#: includes/functions/settings-options.php:445 +msgid "Subscription at registration" msgstr "" -#: includes/free/post-form-templates/the_events_calendar.php:174 -msgid "This page is restricted. Please Log in / Register to view this page." +#: includes/functions/settings-options.php:446 +msgid "Registration time redirect to subscription page" msgstr "" -#: includes/free/post-form-templates/the_events_calendar.php:177 -msgid "Create Event" +#: includes/functions/settings-options.php:451 +msgid "Currency" msgstr "" -#: includes/free/post-form-templates/the_events_calendar.php:180 -msgid "" -"Event has been updated successfully. View event" +#: includes/functions/settings-options.php:458 +msgid "Currency Position" msgstr "" -#: includes/free/post-form-templates/the_events_calendar.php:182 -msgid "Update Event" +#: includes/functions/settings-options.php:462 +msgid "Left" msgstr "" -#: includes/free/post-form-templates/woocommerce.php:12 -msgid "WooCommerce Product" +#: includes/functions/settings-options.php:464 +msgid "Right" msgstr "" -#: includes/free/post-form-templates/woocommerce.php:13 -msgid "Create a simple product form for WooCommerce." +#: includes/functions/settings-options.php:466 +msgid "Left with space" msgstr "" -#: includes/free/subscription.php:14 -msgid "Recurring " +#: includes/functions/settings-options.php:468 +msgid "Right with space" msgstr "" -#: includes/free/subscription.php:18 -msgid "Enable Recurring Payment" +#: includes/functions/settings-options.php:474 +msgid "Thousand Separator" msgstr "" -#: includes/setup-wizard.php:120 -msgid "Introduction" +#: includes/functions/settings-options.php:475 +msgid "This sets the thousand separator of displayed prices." msgstr "" -#: includes/setup-wizard.php:130 -msgid "Ready!" +#: includes/functions/settings-options.php:483 +msgid "Decimal Separator" msgstr "" -#: includes/setup-wizard.php:167 -msgid "WPUF › Setup Wizard" +#: includes/functions/settings-options.php:484 +msgid "This sets the decimal separator of displayed prices." msgstr "" -#: includes/setup-wizard.php:240 -msgid "Return to the WordPress Dashboard" +#: includes/functions/settings-options.php:490 +msgid "Number of Decimals" msgstr "" -#: includes/setup-wizard.php:281 -msgid "Welcome to the world of WPUF!" +#: includes/functions/settings-options.php:491 +msgid "This sets the number of decimal points shown in displayed prices." msgstr "" -#: includes/setup-wizard.php:282 -msgid "" -"Thank you for choosing WPUF to power your websites frontend! This quick " -"setup wizard will help you configure the basic settings. It’s " -"completely optional and shouldn’t take longer than a minute." +#: includes/functions/settings-options.php:502 +msgid "Enable demo/sandbox mode" msgstr "" -#: includes/setup-wizard.php:283 -msgid "" -"No time right now? If you don’t want to go through the wizard, you can skip " -"and return to the WordPress dashboard. Come back anytime if you change your " -"mind!" +#: includes/functions/settings-options.php:503 +msgid "When sandbox mode is active, all payment gateway will be used in demo mode" msgstr "" -#: includes/setup-wizard.php:285 -msgid "Let's Go!" +#: includes/functions/settings-options.php:510 +msgid "Payment Page" msgstr "" -#: includes/setup-wizard.php:286 -msgid "Not right now" +#: includes/functions/settings-options.php:511 +msgid "This page will be used to process payment options" msgstr "" -#: includes/setup-wizard.php:297 -msgid "Basic Setting" +#: includes/functions/settings-options.php:524 +msgid "Payment Gateways" msgstr "" -#: includes/setup-wizard.php:304 -msgid "Make payment enable for user to add posts on frontend." +#: includes/functions/settings-options.php:525 +msgid "Active payment gateways" msgstr "" -#: includes/setup-wizard.php:311 -msgid "Install neccessery pages on your site frontend." +#: includes/functions/settings-options.php:531 +msgid "Retry Failed Payment" msgstr "" -#: includes/setup-wizard.php:316 -msgid "Share Essentials " +#: includes/functions/settings-options.php:532 +msgid "How many times should retry for failed payment max is 4" msgstr "" -#: includes/setup-wizard.php:348 -msgid "Continue" +#: includes/functions/settings-options.php:546 +msgid " Guest Email" msgstr "" -#: includes/setup-wizard.php:349 -msgid "Skip this step" +#: includes/functions/settings-options.php:554 +msgid "Guest Email Notification" msgstr "" -#: includes/setup-wizard.php:398 -msgid "Thank you!" +#: includes/functions/settings-options.php:555 +msgid "Enable Guest Email Notification ." msgstr "" -#: includes/setup-wizard.php:403 -msgid "Welcome to Awesomeness!" +#: includes/functions/settings-options.php:561 +msgid "Guest mail subject" msgstr "" -#: includes/setup-wizard.php:407 -msgid "Go to Full Settings" +#: includes/functions/settings-options.php:562 +msgid "This sets the subject of the emails sent to guest users" msgstr "" -#: lib/appsero/Insights.php:369 -msgid "" -"Want to help make %1$s even more awesome? Allow %1$s to " -"collect non-sensitive diagnostic data and usage information." +#: includes/functions/settings-options.php:569 +msgid "Guest mail body" msgstr "" -#: lib/appsero/Insights.php:374 -msgid "what we collect" +#: includes/functions/settings-options.php:570 +msgid "" +"This sets the body of the emails sent to guest users. Please DON'T edit the " +"{activation_link} part, you can use {sitename} too." msgstr "" -#: lib/appsero/Insights.php:381 -msgid "Allow" +#: includes/functions/settings-options.php:588 +msgid "Post Types" msgstr "" -#: lib/appsero/Insights.php:382 -msgid "No thanks" +#: includes/functions/settings-options.php:589 +msgid "Select the post types you will allow users to export." msgstr "" -#: lib/appsero/Insights.php:747 -msgid "If you have a moment, please let us know why you are deactivating:" +#: includes/functions/settings-options.php:621 +msgid "" +"Select profile/registration forms for user roles. These forms will be used " +"to populate extra edit profile fields in backend." msgstr "" -#: lib/appsero/Insights.php:762 -msgid "I rather wouldn't say" +#: includes/functions/user/edit-user.php:23 +#: includes/functions/user/edit-user.php:26 +msgid "User doesn't exists" msgstr "" -#: lib/appsero/Insights.php:763 -msgid "Submit & Deactivate" +#: includes/functions/user/edit-user.php:37 +msgid "You don't have permission for this purpose" msgstr "" -#: lib/class.settings-api.php:409 -msgid "Choose File" +#: includes/functions/user/edit-user.php:79 +msgid "User Deleted" msgstr "" -#: lib/gateway/bank.php:28 -msgid "Bank Instruction" +#: includes/functions/user/edit-user.php:88 +msgid "Are you sure to delete this user?" msgstr "" -#: lib/gateway/bank.php:35 -msgid "Bank Payment Success Page" +#: includes/functions/user/edit-user.php:96 +msgid "Action" msgstr "" -#: lib/gateway/bank.php:85 -msgid "[%s] New Bank Order Received" +#: includes/functions/user/edit-user.php:100 +msgid "%s" msgstr "" -#: lib/gateway/bank.php:86 -msgid "New bank order received at %s, please check it out: %s" +#: includes/functions/user/edit-user.php:121 +#: includes/functions/user/edit-user.php:194 +msgid "Add New User" msgstr "" -#: lib/gateway/bank.php:108 -msgid "Hello %s," +#: includes/functions/user/edit-user.php:143 +msgid "User Added" msgstr "" -#: lib/gateway/bank.php:109 -msgid "We have received your bank payment." +#: includes/functions/user/edit-user.php:177 +msgid "Role" msgstr "" -#: lib/gateway/bank.php:110 -msgid "Thanks for being with us." +#: includes/functions/user/edit-user.php:222 +msgid "ERROR: Please enter a username" msgstr "" -#: lib/gateway/paypal.php:98 -msgid "Subscription %1$s at %2$s" +#: includes/functions/user/edit-user.php:224 +msgid "" +"ERROR: This username is invalid because it uses illegal " +"characters. Please enter a valid username" msgstr "" -#: lib/gateway/paypal.php:127 -msgid "PayPal Email" +#: includes/functions/user/edit-user.php:227 +msgid "" +"ERROR: This username is already registered, please choose " +"another one" msgstr "" -#: lib/gateway/paypal.php:132 -msgid "PayPal Instruction" +#: includes/functions/user/edit-user.php:232 +msgid "ERROR: Please type your e-mail address" msgstr "" -#: lib/gateway/paypal.php:139 -msgid "PayPal API username" +#: includes/functions/user/edit-user.php:234 +msgid "ERROR: The email address isn’t correct" msgstr "" -#: lib/gateway/paypal.php:143 -msgid "PayPal API password" +#: includes/functions/user/edit-user.php:237 +msgid "" +"ERROR: This email is already registered, please choose " +"another one" msgstr "" -#: lib/gateway/paypal.php:147 -msgid "PayPal API signature" +#: includes/functions/user/edit-user.php:261 +msgid "" +"ERROR: Couldn’t register you... please contact the " +"webmaster !" msgstr "" #: templates/dashboard/billing-address.php:133 @@ -7531,35 +8085,35 @@ msgstr "" msgid "From your account dashboard you can view your dashboard, manage your %s" msgstr "" -#: templates/dashboard/edit-profile.php:10 +#: templates/dashboard/edit-profile.php:11 msgid "Profile updated successfully!" msgstr "" -#: templates/dashboard/edit-profile.php:11 +#: templates/dashboard/edit-profile.php:12 msgid "Something went wrong!" msgstr "" -#: templates/dashboard/edit-profile.php:15 +#: templates/dashboard/edit-profile.php:16 msgid "First Name " msgstr "" -#: templates/dashboard/edit-profile.php:24 +#: templates/dashboard/edit-profile.php:25 msgid "Last Name " msgstr "" -#: templates/dashboard/edit-profile.php:34 +#: templates/dashboard/edit-profile.php:35 msgid "Email Address " msgstr "" -#: templates/dashboard/edit-profile.php:44 +#: templates/dashboard/edit-profile.php:45 msgid "Current Password" msgstr "" -#: templates/dashboard/edit-profile.php:49 +#: templates/dashboard/edit-profile.php:53 msgid "Leave this field empty to keep your password unchanged." msgstr "" -#: templates/dashboard/edit-profile.php:65 +#: templates/dashboard/edit-profile.php:72 msgid "Confirm New Password" msgstr "" @@ -7587,15 +8141,15 @@ msgstr "" msgid "Not Applicable" msgstr "" -#: templates/dashboard/list.php:79 templates/dashboard/posts.php:185 +#: templates/dashboard/list.php:80 templates/dashboard/posts.php:186 msgid "Pay Now" msgstr "" -#: templates/dashboard/list.php:88 templates/dashboard/posts.php:192 +#: templates/dashboard/list.php:89 templates/dashboard/posts.php:193 msgid "Options: " msgstr "" -#: templates/dashboard/list.php:104 templates/dashboard/posts.php:206 +#: templates/dashboard/list.php:105 templates/dashboard/posts.php:207 msgid "Are you sure to delete?" msgstr "" @@ -7611,15 +8165,15 @@ msgstr "" msgid "Payment: " msgstr "" -#: templates/dashboard/posts.php:227 templates/dashboard.php:112 +#: templates/dashboard/posts.php:228 templates/dashboard.php:112 msgid "«" msgstr "" -#: templates/dashboard/posts.php:228 templates/dashboard.php:113 +#: templates/dashboard/posts.php:229 templates/dashboard.php:113 msgid "»" msgstr "" -#: templates/dashboard/posts.php:251 templates/dashboard.php:136 +#: templates/dashboard/posts.php:252 templates/dashboard.php:136 msgid "No %s found" msgstr "" @@ -7669,11 +8223,11 @@ msgstr "" msgid "You are currently logged in! %s?" msgstr "" -#: templates/login-form.php:23 +#: templates/login-form.php:25 msgid "Username or Email" msgstr "" -#: templates/lost-pass-form.php:21 +#: templates/lost-pass-form.php:25 msgid "Get New Password" msgstr "" @@ -7681,19 +8235,19 @@ msgstr "" msgid "Registration has been successful!" msgstr "" -#: templates/registration-form.php:35 +#: templates/registration-form.php:36 msgid "First" msgstr "" -#: templates/registration-form.php:40 +#: templates/registration-form.php:41 msgid "Last" msgstr "" -#: templates/reset-pass-form.php:14 +#: templates/reset-pass-form.php:19 msgid "New password" msgstr "" -#: templates/reset-pass-form.php:19 +#: templates/reset-pass-form.php:27 msgid "Confirm new password" msgstr "" @@ -7713,341 +8267,317 @@ msgstr "" msgid "Read the Full Guide" msgstr "" -#: wpuf-functions.php:27 +#: wpuf-functions.php:32 msgid "Live" msgstr "" -#: wpuf-functions.php:30 +#: wpuf-functions.php:35 msgid "Offline" msgstr "" -#: wpuf-functions.php:33 +#: wpuf-functions.php:38 msgid "Awaiting Approval" msgstr "" -#: wpuf-functions.php:36 wpuf-functions.php:67 +#: wpuf-functions.php:41 wpuf-functions.php:72 msgid "Scheduled" msgstr "" -#: wpuf-functions.php:39 +#: wpuf-functions.php:44 msgid "Private" msgstr "" -#: wpuf-functions.php:510 +#: wpuf-functions.php:533 msgid "Images" msgstr "" -#: wpuf-functions.php:514 +#: wpuf-functions.php:537 msgid "Audio" msgstr "" -#: wpuf-functions.php:518 +#: wpuf-functions.php:541 msgid "Videos" msgstr "" -#: wpuf-functions.php:522 +#: wpuf-functions.php:545 msgid "PDF" msgstr "" -#: wpuf-functions.php:526 +#: wpuf-functions.php:549 msgid "Office Documents" msgstr "" -#: wpuf-functions.php:530 +#: wpuf-functions.php:553 msgid "Zip Archives" msgstr "" -#: wpuf-functions.php:534 +#: wpuf-functions.php:557 msgid "Executable Files" msgstr "" -#: wpuf-functions.php:538 +#: wpuf-functions.php:561 msgid "CSV" msgstr "" -#: wpuf-functions.php:1052 +#: wpuf-functions.php:1081 msgid "Directions »" msgstr "" -#: wpuf-functions.php:2290 +#: wpuf-functions.php:2315 msgid "United Arab Emirates Dirham" msgstr "" -#: wpuf-functions.php:2295 +#: wpuf-functions.php:2320 msgid "Australian Dollars" msgstr "" -#: wpuf-functions.php:2300 +#: wpuf-functions.php:2325 msgid "Argentine Peso" msgstr "" -#: wpuf-functions.php:2305 +#: wpuf-functions.php:2330 msgid "Bangladeshi Taka" msgstr "" -#: wpuf-functions.php:2310 +#: wpuf-functions.php:2335 msgid "Brazilian Real" msgstr "" -#: wpuf-functions.php:2315 +#: wpuf-functions.php:2340 msgid "Bulgarian Lev" msgstr "" -#: wpuf-functions.php:2320 +#: wpuf-functions.php:2345 msgid "Canadian Dollars" msgstr "" -#: wpuf-functions.php:2325 +#: wpuf-functions.php:2350 msgid "Chilean Peso" msgstr "" -#: wpuf-functions.php:2330 +#: wpuf-functions.php:2355 msgid "Chinese Yuan" msgstr "" -#: wpuf-functions.php:2335 +#: wpuf-functions.php:2360 msgid "Colombian Peso" msgstr "" -#: wpuf-functions.php:2340 +#: wpuf-functions.php:2365 msgid "Czech Koruna" msgstr "" -#: wpuf-functions.php:2345 +#: wpuf-functions.php:2370 msgid "Danish Krone" msgstr "" -#: wpuf-functions.php:2350 +#: wpuf-functions.php:2375 msgid "Dominican Peso" msgstr "" -#: wpuf-functions.php:2355 +#: wpuf-functions.php:2380 msgid "Algerian Dinar" msgstr "" -#: wpuf-functions.php:2360 +#: wpuf-functions.php:2385 msgid "Euros" msgstr "" -#: wpuf-functions.php:2365 +#: wpuf-functions.php:2390 msgid "Hong Kong Dollar" msgstr "" -#: wpuf-functions.php:2370 +#: wpuf-functions.php:2395 msgid "Croatia kuna" msgstr "" -#: wpuf-functions.php:2375 +#: wpuf-functions.php:2400 msgid "Hungarian Forint" msgstr "" -#: wpuf-functions.php:2380 +#: wpuf-functions.php:2405 msgid "Icelandic krona" msgstr "" -#: wpuf-functions.php:2385 +#: wpuf-functions.php:2410 msgid "Indonesia Rupiah" msgstr "" -#: wpuf-functions.php:2390 +#: wpuf-functions.php:2415 msgid "Indian Rupee" msgstr "" -#: wpuf-functions.php:2395 +#: wpuf-functions.php:2420 msgid "Mauritian Rupee" msgstr "" -#: wpuf-functions.php:2400 +#: wpuf-functions.php:2425 msgid "Nepali Rupee" msgstr "" -#: wpuf-functions.php:2405 +#: wpuf-functions.php:2430 msgid "Israeli Shekel" msgstr "" -#: wpuf-functions.php:2410 +#: wpuf-functions.php:2435 msgid "Japanese Yen" msgstr "" -#: wpuf-functions.php:2415 +#: wpuf-functions.php:2440 msgid "Lao Kip" msgstr "" -#: wpuf-functions.php:2420 +#: wpuf-functions.php:2445 msgid "South Korean Won" msgstr "" -#: wpuf-functions.php:2425 +#: wpuf-functions.php:2450 msgid "Malaysian Ringgits" msgstr "" -#: wpuf-functions.php:2430 +#: wpuf-functions.php:2455 msgid "Mexican Peso" msgstr "" -#: wpuf-functions.php:2435 +#: wpuf-functions.php:2460 msgid "Nigerian Naira" msgstr "" -#: wpuf-functions.php:2440 +#: wpuf-functions.php:2465 msgid "Norwegian Krone" msgstr "" -#: wpuf-functions.php:2445 +#: wpuf-functions.php:2470 msgid "New Zealand Dollar" msgstr "" -#: wpuf-functions.php:2450 +#: wpuf-functions.php:2475 msgid "Namibian dollar" msgstr "" -#: wpuf-functions.php:2455 +#: wpuf-functions.php:2480 msgid "Omani Rial" msgstr "" -#: wpuf-functions.php:2460 +#: wpuf-functions.php:2485 msgid "Iranian Rial" msgstr "" -#: wpuf-functions.php:2465 +#: wpuf-functions.php:2490 msgid "Pakistani Rupee" msgstr "" -#: wpuf-functions.php:2470 +#: wpuf-functions.php:2495 msgid "Paraguayan Guaraní" msgstr "" -#: wpuf-functions.php:2475 +#: wpuf-functions.php:2500 msgid "Philippine Pesos" msgstr "" -#: wpuf-functions.php:2480 +#: wpuf-functions.php:2505 msgid "Polish Zloty" msgstr "" -#: wpuf-functions.php:2485 +#: wpuf-functions.php:2510 msgid "Pounds Sterling" msgstr "" -#: wpuf-functions.php:2490 +#: wpuf-functions.php:2515 msgid "Romanian Leu" msgstr "" -#: wpuf-functions.php:2495 +#: wpuf-functions.php:2520 msgid "Russian Ruble" msgstr "" -#: wpuf-functions.php:2500 +#: wpuf-functions.php:2525 msgid "Saudi Riyal" msgstr "" -#: wpuf-functions.php:2505 +#: wpuf-functions.php:2530 msgid "Singapore Dollar" msgstr "" -#: wpuf-functions.php:2510 +#: wpuf-functions.php:2535 msgid "South African rand" msgstr "" -#: wpuf-functions.php:2515 +#: wpuf-functions.php:2540 msgid "Swedish Krona" msgstr "" -#: wpuf-functions.php:2520 +#: wpuf-functions.php:2545 msgid "Swiss Franc" msgstr "" -#: wpuf-functions.php:2525 +#: wpuf-functions.php:2550 msgid "Taiwan New Dollars" msgstr "" -#: wpuf-functions.php:2530 +#: wpuf-functions.php:2555 msgid "Thai Baht" msgstr "" -#: wpuf-functions.php:2535 +#: wpuf-functions.php:2560 msgid "Turkish Lira" msgstr "" -#: wpuf-functions.php:2540 +#: wpuf-functions.php:2565 msgid "Trinidad and Tobago Dollar" msgstr "" -#: wpuf-functions.php:2545 +#: wpuf-functions.php:2570 msgid "US Dollar" msgstr "" -#: wpuf-functions.php:2550 +#: wpuf-functions.php:2575 msgid "Vietnamese Dong" msgstr "" -#: wpuf-functions.php:2555 +#: wpuf-functions.php:2580 msgid "Egyptian Pound" msgstr "" -#: wpuf-functions.php:2560 +#: wpuf-functions.php:2585 msgid "Jordanian dinar" msgstr "" -#: wpuf-functions.php:3493 +#: wpuf-functions.php:3518 msgid "None" msgstr "" -#: wpuf.php:107 -msgid "Your installed PHP Version is: " -msgstr "" - -#: wpuf.php:108 -msgid "The WP User Frontend plugin requires PHP version " -msgstr "" - -#: wpuf.php:108 -msgid " or greater." -msgstr "" - -#: wpuf.php:195 -msgid "Your Post Has Been Expired" -msgstr "" - -#: wpuf.php:453 -msgid "" -"

    \n" -" UPDATE " -"REQUIRED \n" -" WP User Frontend Pro is not working because you " -"are using an old version of WP User Frontend Pro. Please update " -"WPUF Pro to >= v3.1.0 to work with the " -"latest version of WP User Frontend\n" -"

    " -msgstr "" - -#: wpuf.php:470 -msgid "Update WP User Frontend Pro Now" +#: wpuf.php:25 +msgid "There was a problem installing the plugin" msgstr "" -#: wpuf.php:474 -msgid "Update WP User Frontend Pro NOW" +#: wpuf.php:25 +msgid "Problem installing plugin" msgstr "" -#: wpuf.php:717 -msgid "Character limit reached" +#: wpuf.php:115 +msgid "Your installed PHP Version is: " msgstr "" -#: wpuf.php:718 -msgid "Minimum character required " +#: wpuf.php:116 +msgid "The WP User Frontend plugin requires PHP version " msgstr "" -#: wpuf.php:720 -msgid "Minimum word required " +#: wpuf.php:116 +msgid " or greater." msgstr "" -#: wpuf.php:728 -msgid "Please Cancel Your Currently Active Pack first!" +#: wpuf.php:236 +msgid "Your WP User Frontend Pro is almost ready!" msgstr "" -#: wpuf.php:899 -msgid "Error: Nonce verification failed" +#: wpuf.php:240 +#. translators: 1: opening anchor tag, 2: closing anchor tag. +msgid "" +"We've pushed a major update on both WP User Frontend Free and WP " +"User Frontend Pro that requires you to use latest version of both. " +"Please update the WPUF pro to the latest version.
    Please make " +"sure to take a complete backup of your site before updating." msgstr "" #. Plugin URI of the plugin/theme @@ -8068,67 +8598,67 @@ msgstr "" msgid "https://wedevs.com/?utm_source=WPUF_Author_URI" msgstr "" -#: includes/setup-wizard.php:41 +#: includes/Setup_Wizard.php:44 msgctxt "enhanced select" msgid "One result is available, press enter to select it." msgstr "" -#: includes/setup-wizard.php:42 +#: includes/Setup_Wizard.php:47 msgctxt "enhanced select" msgid "%qty% results are available, use up and down arrow keys to navigate." msgstr "" -#: includes/setup-wizard.php:43 +#: includes/Setup_Wizard.php:51 msgctxt "enhanced select" msgid "No matches found" msgstr "" -#: includes/setup-wizard.php:44 +#: includes/Setup_Wizard.php:52 msgctxt "enhanced select" msgid "Loading failed" msgstr "" -#: includes/setup-wizard.php:45 +#: includes/Setup_Wizard.php:53 msgctxt "enhanced select" msgid "Please enter 1 or more characters" msgstr "" -#: includes/setup-wizard.php:46 +#: includes/Setup_Wizard.php:56 msgctxt "enhanced select" msgid "Please enter %qty% or more characters" msgstr "" -#: includes/setup-wizard.php:47 +#: includes/Setup_Wizard.php:59 msgctxt "enhanced select" msgid "Please delete 1 character" msgstr "" -#: includes/setup-wizard.php:48 +#: includes/Setup_Wizard.php:60 msgctxt "enhanced select" msgid "Please delete %qty% characters" msgstr "" -#: includes/setup-wizard.php:49 +#: includes/Setup_Wizard.php:63 msgctxt "enhanced select" msgid "You can only select 1 item" msgstr "" -#: includes/setup-wizard.php:50 +#: includes/Setup_Wizard.php:66 msgctxt "enhanced select" msgid "You can only select %qty% items" msgstr "" -#: includes/setup-wizard.php:51 +#: includes/Setup_Wizard.php:69 msgctxt "enhanced select" msgid "Loading more results…" msgstr "" -#: includes/setup-wizard.php:52 +#: includes/Setup_Wizard.php:72 msgctxt "enhanced select" msgid "Searching…" msgstr "" -#: wpuf-functions.php:1521 +#: wpuf-functions.php:1552 msgctxt "tag delimiter" msgid "," msgstr "" \ No newline at end of file diff --git a/lib/appsero/Client.php b/lib/appsero/Client.php old mode 100755 new mode 100644 index 0ac9a76a0..08b7f654d --- a/lib/appsero/Client.php +++ b/lib/appsero/Client.php @@ -1,5 +1,6 @@ hash = $hash; @@ -95,26 +113,18 @@ public function __construct( $hash, $name, $file ) { * @return Appsero\Insights */ public function insights() { - - if ( ! class_exists( __NAMESPACE__ . '\Insights') ) { + if ( ! class_exists( __NAMESPACE__ . '\Insights' ) ) { require_once __DIR__ . '/Insights.php'; } - return new Insights( $this ); - } - - /** - * Initialize plugin/theme updater - * - * @return Appsero\Updater - */ - public function updater() { - - if ( ! class_exists( __NAMESPACE__ . '\Updater') ) { - require_once __DIR__ . '/Updater.php'; + // if already instantiated, return the cached one + if ( $this->insights ) { + return $this->insights; } - return new Updater( $this ); + $this->insights = new Insights( $this ); + + return $this->insights; } /** @@ -123,12 +133,18 @@ public function updater() { * @return Appsero\License */ public function license() { - - if ( ! class_exists( __NAMESPACE__ . '\License') ) { + if ( ! class_exists( __NAMESPACE__ . '\License' ) ) { require_once __DIR__ . '/License.php'; } - return new License( $this ); + // if already instantiated, return the cached one + if ( $this->license ) { + return $this->license; + } + + $this->license = new License( $this ); + + return $this->license; } /** @@ -148,63 +164,95 @@ public function endpoint() { * @return void */ protected function set_basename_and_slug() { - if ( strpos( $this->file, WP_CONTENT_DIR . '/themes/' ) === false ) { - $this->basename = plugin_basename( $this->file ); - list( $this->slug, $mainfile) = explode( '/', $this->basename ); + list( $this->slug, $mainfile ) = explode( '/', $this->basename ); require_once ABSPATH . 'wp-admin/includes/plugin.php'; $plugin_data = get_plugin_data( $this->file ); $this->project_version = $plugin_data['Version']; - $this->type = 'plugin'; - $this->textdomain = $this->slug; - + $this->type = 'plugin'; } else { - $this->basename = str_replace( WP_CONTENT_DIR . '/themes/', '', $this->file ); - list( $this->slug, $mainfile) = explode( '/', $this->basename ); + list( $this->slug, $mainfile ) = explode( '/', $this->basename ); $theme = wp_get_theme( $this->slug ); $this->project_version = $theme->version; - $this->type = 'theme'; - + $this->type = 'theme'; } + + $this->textdomain = $this->slug; } /** * Send request to remote endpoint * - * @param array $params - * @param string $route + * @param array $params + * @param string $route * - * @return array|WP_Error Array of results including HTTP headers or WP_Error if the request failed. + * @return array|WP_Error array of results including HTTP headers or WP_Error if the request failed */ public function send_request( $params, $route, $blocking = false ) { $url = $this->endpoint() . $route; - $headers = array( + $headers = [ 'user-agent' => 'Appsero/' . md5( esc_url( home_url() ) ) . ';', 'Accept' => 'application/json', + ]; + + $response = wp_remote_post( + $url, + [ + 'method' => 'POST', + 'timeout' => 30, + 'redirection' => 5, + 'httpversion' => '1.0', + 'blocking' => $blocking, + 'headers' => $headers, + 'body' => array_merge( $params, [ 'client' => $this->version ] ), + 'cookies' => [], + ] ); - $response = wp_remote_post( $url, array( - 'method' => 'POST', - 'timeout' => 30, - 'redirection' => 5, - 'httpversion' => '1.0', - 'blocking' => $blocking, - 'headers' => $headers, - 'body' => array_merge( $params, array( 'client' => $this->version ) ), - 'cookies' => array() - ) ); - return $response; } + /** + * Check if the current server is localhost + * + * @return bool + */ + public function is_local_server() { + $is_local = isset( $_SERVER['REMOTE_ADDR'] ) && in_array( $_SERVER['REMOTE_ADDR'], [ '127.0.0.1', '::1' ], true ); + + return apply_filters( 'appsero_is_local', $is_local ); + } + + /** + * Translate function _e() + */ + // phpcs:ignore + public function _etrans( $text ) { + call_user_func( '_e', $text, $this->textdomain ); + } + + /** + * Translate function __() + */ + // phpcs:ignore + public function __trans( $text ) { + return call_user_func( '__', $text, $this->textdomain ); + } + + /** + * Set project textdomain + */ + public function set_textdomain( $textdomain ) { + $this->textdomain = $textdomain; + } } diff --git a/lib/appsero/Insights.php b/lib/appsero/Insights.php old mode 100755 new mode 100644 index cc56e2f07..efc99c5b8 --- a/lib/appsero/Insights.php +++ b/lib/appsero/Insights.php @@ -1,5 +1,6 @@ client = $client; } } @@ -57,22 +65,36 @@ public function __construct( $client, $name = null, $file = null ) { /** * Don't show the notice * - * @return \self + * @return self */ - public function hide_notice() { + public function hide_notice() + { $this->show_notice = false; return $this; } + /** + * Add plugin data if needed + * + * @return self + */ + public function add_plugin_data() + { + $this->plugin_data = true; + + return $this; + } + /** * Add extra data if needed * * @param array $data * - * @return \self + * @return self */ - public function add_extra( $data = array() ) { + public function add_extra($data = []) + { $this->extra_data = $data; return $this; @@ -81,11 +103,12 @@ public function add_extra( $data = array() ) { /** * Set custom notice text * - * @param string $text + * @param string $text * - * @return \self + * @return self */ - public function notice( $text ) { + public function notice($text = '') + { $this->notice = $text; return $this; @@ -96,10 +119,11 @@ public function notice( $text ) { * * @return void */ - public function init() { - if ( $this->client->type == 'plugin' ) { + public function init() + { + if ($this->client->type === 'plugin') { $this->init_plugin(); - } else if ( $this->client->type == 'theme' ) { + } elseif ($this->client->type === 'theme') { $this->init_theme(); } } @@ -109,11 +133,12 @@ public function init() { * * @return void */ - public function init_theme() { + public function init_theme() + { $this->init_common(); - add_action( 'switch_theme', array( $this, 'deactivation_cleanup' ) ); - add_action( 'switch_theme', array( $this, 'theme_deactivated' ), 12, 3 ); + add_action('switch_theme', [$this, 'deactivation_cleanup']); + add_action('switch_theme', [$this, 'theme_deactivated'], 12, 3); } /** @@ -121,17 +146,21 @@ public function init_theme() { * * @return void */ - public function init_plugin() { + public function init_plugin() + { // plugin deactivate popup - if ( ! $this->is_local_server() ) { - add_filter( 'plugin_action_links_' . $this->client->basename, array( $this, 'plugin_action_links' ) ); - add_action( 'admin_footer', array( $this, 'deactivate_scripts' ) ); - } + // if ( ! $this->is_local_server() ) { + // add_filter( 'plugin_action_links_' . $this->client->basename, [ $this, 'plugin_action_links' ] ); + // add_action( 'admin_footer', [ $this, 'deactivate_scripts' ] ); + // } + + add_filter('plugin_action_links_' . $this->client->basename, [$this, 'plugin_action_links']); + add_action('admin_footer', [$this, 'deactivate_scripts']); $this->init_common(); - register_activation_hook( $this->client->file, array( $this, 'activate_plugin' ) ); - register_deactivation_hook( $this->client->file, array( $this, 'deactivation_cleanup' ) ); + register_activation_hook($this->client->file, [$this, 'activate_plugin']); + register_deactivation_hook($this->client->file, [$this, 'deactivation_cleanup']); } /** @@ -139,51 +168,49 @@ public function init_plugin() { * * @return void */ - protected function init_common() { - - if ( $this->show_notice ) { + protected function init_common() + { + if ($this->show_notice) { // tracking notice - add_action( 'admin_notices', array( $this, 'admin_notice' ) ); + add_action('admin_notices', [$this, 'admin_notice']); } - add_action( 'admin_init', array( $this, 'handle_optin_optout' ) ); + add_action('admin_init', [$this, 'handle_optin_optout']); // uninstall reason - add_action( 'wp_ajax_' . $this->client->slug . '_submit-uninstall-reason', array( $this, 'uninstall_reason_submission' ) ); + add_action('wp_ajax_' . $this->client->slug . '_submit-uninstall-reason', [$this, 'uninstall_reason_submission']); // cron events - add_filter( 'cron_schedules', array( $this, 'add_weekly_schedule' ) ); - add_action( $this->client->slug . '_tracker_send_event', array( $this, 'send_tracking_data' ) ); + add_filter('cron_schedules', [$this, 'add_weekly_schedule']); + add_action($this->client->slug . '_tracker_send_event', [$this, 'send_tracking_data']); // add_action( 'admin_init', array( $this, 'send_tracking_data' ) ); // test } /** * Send tracking data to AppSero server * - * @param boolean $override + * @param bool $override * * @return void */ - public function send_tracking_data( $override = false ) { - // skip on AJAX Requests - if ( defined( 'DOING_AJAX' ) && DOING_AJAX ) { - return; - } - - if ( ! $this->tracking_allowed() && ! $override ) { + public function send_tracking_data($override = false) + { + if (!$this->tracking_allowed() && !$override) { return; } // Send a maximum of once per week $last_send = $this->get_last_send(); - if ( $last_send && $last_send > strtotime( '-1 week' ) ) { + if ($last_send && $last_send > strtotime('-1 week')) { return; } - $response = $this->client->send_request( $this->get_tracking_data(), 'track' ); + $tracking_data = $this->get_tracking_data(); + + $response = $this->client->send_request($tracking_data, 'track'); - update_option( $this->client->slug . '_tracking_last_send', time() ); + update_option($this->client->slug . '_tracking_last_send', time()); } /** @@ -191,49 +218,88 @@ public function send_tracking_data( $override = false ) { * * @return array */ - protected function get_tracking_data() { + protected function get_tracking_data() + { $all_plugins = $this->get_all_plugins(); - $users = get_users( array( - 'role' => 'administrator', - 'orderby' => 'ID', - 'order' => 'ASC', - 'number' => 1, - 'paged' => 1, - ) ); + $users = get_users( + [ + 'role' => 'administrator', + 'orderby' => 'ID', + 'order' => 'ASC', + 'number' => 1, + 'paged' => 1, + ] + ); - $admin_user = ( is_array( $users ) && ! empty( $users ) ) ? $users[0] : false; - $first_name = $last_name = ''; + $admin_user = (is_array($users) && !empty($users)) ? $users[0] : false; + $first_name = ''; + $last_name = ''; - if ( $admin_user ) { + if ($admin_user) { $first_name = $admin_user->first_name ? $admin_user->first_name : $admin_user->display_name; $last_name = $admin_user->last_name; } - $data = array( - 'version' => $this->client->project_version, - 'url' => esc_url( home_url() ), + $data = [ + 'url' => esc_url(home_url()), 'site' => $this->get_site_name(), - 'admin_email' => get_option( 'admin_email' ), + 'admin_email' => get_option('admin_email'), 'first_name' => $first_name, 'last_name' => $last_name, 'hash' => $this->client->hash, 'server' => $this->get_server_info(), 'wp' => $this->get_wp_info(), 'users' => $this->get_user_counts(), - 'active_plugins' => count( $all_plugins['active_plugins'] ), - 'inactive_plugins' => count( $all_plugins['inactive_plugins'] ), + 'active_plugins' => count($all_plugins['active_plugins']), + 'inactive_plugins' => count($all_plugins['inactive_plugins']), 'ip_address' => $this->get_user_ip_address(), - 'theme' => get_stylesheet(), - 'version' => $this->client->project_version, - ); + 'project_version' => $this->client->project_version, + 'tracking_skipped' => false, + 'is_local' => $this->is_local_server(), + ]; + + // Add Plugins + if ($this->plugin_data) { + $plugins_data = []; + + foreach ($all_plugins['active_plugins'] as $slug => $plugin) { + $slug = strstr($slug, '/', true); + + if (!$slug) { + continue; + } + + $plugins_data[$slug] = [ + 'name' => isset($plugin['name']) ? $plugin['name'] : '', + 'version' => isset($plugin['version']) ? $plugin['version'] : '', + ]; + } - // Add metadata - if ( $extra = $this->get_extra_data() ) { + if (array_key_exists($this->client->slug, $plugins_data)) { + unset($plugins_data[$this->client->slug]); + } + + $data['plugins'] = $plugins_data; + } + + // Add Metadata + $extra = $this->get_extra_data(); + + if ($extra) { $data['extra'] = $extra; } - return apply_filters( $this->client->slug . '_tracker_data', $data ); + // Check this has previously skipped tracking + $skipped = get_option($this->client->slug . '_tracking_skipped'); + + if ($skipped === 'yes') { + delete_option($this->client->slug . '_tracking_skipped'); + + $data['tracking_skipped'] = true; + } + + return apply_filters($this->client->slug . '_tracker_data', $data); } /** @@ -241,32 +307,38 @@ protected function get_tracking_data() { * * @return mixed */ - protected function get_extra_data() { - if ( is_callable( $this->extra_data ) ) { - return call_user_func( $this->extra_data ); + protected function get_extra_data() + { + if (is_callable($this->extra_data)) { + return call_user_func($this->extra_data); } - if ( is_array( $this->extra_data ) ) { + if (is_array($this->extra_data)) { return $this->extra_data; } - return array(); + return []; } /** * Explain the user which data we collect * - * @return string + * @return array */ - protected function data_we_collect() { - $data = array( + protected function data_we_collect() + { + $data = [ 'Server environment details (php, mysql, server, WordPress versions)', 'Number of users in your site', 'Site language', 'Number of active and inactive plugins', - 'Site name and url', + 'Site name and URL', 'Your name and email address', - ); + ]; + + if ($this->plugin_data) { + array_splice($data, 4, 0, ["active plugins' name"]); + } return $data; } @@ -276,10 +348,11 @@ protected function data_we_collect() { * * @return bool */ - public function tracking_allowed() { - $allow_tracking = get_option( $this->client->slug . '_allow_tracking', 'no' ); + public function tracking_allowed() + { + $allow_tracking = get_option($this->client->slug . '_allow_tracking', 'no'); - return $allow_tracking == 'yes'; + return $allow_tracking === 'yes'; } /** @@ -287,19 +360,21 @@ public function tracking_allowed() { * * @return false|string */ - private function get_last_send() { - return get_option( $this->client->slug . '_tracking_last_send', false ); + private function get_last_send() + { + return get_option($this->client->slug . '_tracking_last_send', false); } /** * Check if the notice has been dismissed or enabled * - * @return boolean + * @return bool */ - private function notice_dismissed() { - $hide_notice = get_option( $this->client->slug . '_tracking_notice', null ); + public function notice_dismissed() + { + $hide_notice = get_option($this->client->slug . '_tracking_notice', null); - if ( 'hide' == $hide_notice ) { + if ('hide' === $hide_notice) { return true; } @@ -309,14 +384,23 @@ private function notice_dismissed() { /** * Check if the current server is localhost * - * @return boolean + * @return bool */ - private function is_local_server() { - return false; - - $is_local = in_array( $_SERVER['REMOTE_ADDR'], array( '127.0.0.1', '::1' ) ); + private function is_local_server() + { + $host = isset($_SERVER['HTTP_HOST']) ? sanitize_text_field(wp_unslash($_SERVER['HTTP_HOST'])) : 'localhost'; + $ip = isset($_SERVER['SERVER_ADDR']) ? sanitize_text_field(wp_unslash($_SERVER['SERVER_ADDR'])) : '127.0.0.1'; + $is_local = false; + + if ( + in_array($ip, ['127.0.0.1', '::1'], true) + || !strpos($host, '.') + || in_array(strrchr($host, '.'), ['.test', '.testing', '.local', '.localhost', '.localdomain'], true) + ) { + $is_local = true; + } - return apply_filters( 'appsero_is_local', $is_local ); + return apply_filters('appsero_is_local', $is_local); } /** @@ -324,11 +408,12 @@ private function is_local_server() { * * @return void */ - private function schedule_event() { - $hook_name = $this->client->slug . '_tracker_send_event'; + private function schedule_event() + { + $hook_name = wp_unslash($this->client->slug . '_tracker_send_event'); - if ( ! wp_next_scheduled( $hook_name ) ) { - wp_schedule_event( time(), 'weekly', $hook_name ); + if (!wp_next_scheduled($hook_name)) { + wp_schedule_event(time(), 'weekly', $hook_name); } } @@ -337,8 +422,9 @@ private function schedule_event() { * * @return void */ - private function clear_schedule_event() { - wp_clear_scheduled_hook( $this->client->slug . '_tracker_send_event' ); + private function clear_schedule_event() + { + wp_clear_scheduled_hook($this->client->slug . '_tracker_send_event'); } /** @@ -346,69 +432,81 @@ private function clear_schedule_event() { * * @return void */ - public function admin_notice() { - - if ( $this->notice_dismissed() ) { + public function admin_notice() + { + if ($this->notice_dismissed()) { return; } - if ( $this->tracking_allowed() ) { + if ($this->tracking_allowed()) { return; } - if ( ! current_user_can( 'manage_options' ) ) { + if (!current_user_can('manage_options')) { return; } // don't show tracking if a local server - if ( ! $this->is_local_server() ) { - $optin_url = add_query_arg( $this->client->slug . '_tracker_optin', 'true' ); - $optout_url = add_query_arg( $this->client->slug . '_tracker_optout', 'true' ); + // if ( $this->is_local_server() ) { + // return; + // } - if ( empty( $this->notice ) ) { - $notice = sprintf( __( 'Want to help make %1$s even more awesome? Allow %1$s to collect non-sensitive diagnostic data and usage information.', $this->client->textdomain, 'wp-user-frontend' ), $this->client->name ); - } else { - $notice = $this->notice; - } + $optin_url = wp_nonce_url(add_query_arg($this->client->slug . '_tracker_optin', 'true'), '_wpnonce'); + $optout_url = wp_nonce_url(add_query_arg($this->client->slug . '_tracker_optout', 'true'), '_wpnonce'); - $notice .= ' (' . __( 'what we collect', $this->client->textdomain, 'wp-user-frontend' ) . ')'; - $notice .= ''; - - echo ''; - - echo " - "; + if (empty($this->notice)) { + $notice = sprintf($this->client->__trans('Want to help make %1$s even more awesome? Allow %1$s to collect diagnostic data and usage information.'), $this->client->name); + } else { + $notice = $this->notice; } + + $policy_url = 'https://appsero.com/privacy-policy/'; + + $notice .= ' (' . $this->client->__trans('what we collect') . ')'; + $notice .= ''; + + echo '

    '; + echo $notice; + echo '

    '; + echo ' ' . $this->client->__trans('Allow') . ''; + echo ' ' . $this->client->__trans('No thanks') . ''; + echo '

    '; + + echo " + "; } /** - * handle the optin/optout + * Handle the optin/optout * * @return void */ - public function handle_optin_optout() { + public function handle_optin_optout() + { + if (!isset($_GET['_wpnonce'])) { + return; + } + + if (!wp_verify_nonce(sanitize_key($_GET['_wpnonce']), '_wpnonce')) { + return; + } - if ( isset( $_GET[ $this->client->slug . '_tracker_optin' ] ) && $_GET[ $this->client->slug . '_tracker_optin' ] == 'true' ) { + if (isset($_GET[$this->client->slug . '_tracker_optin']) && $_GET[$this->client->slug . '_tracker_optin'] === 'true') { $this->optin(); - wp_redirect( remove_query_arg( $this->client->slug . '_tracker_optin' ) ); + wp_safe_redirect(remove_query_arg($this->client->slug . '_tracker_optin')); exit; } - if ( isset( $_GET[ $this->client->slug . '_tracker_optout' ] ) && $_GET[ $this->client->slug . '_tracker_optout' ] == 'true' ) { + if (isset($_GET[$this->client->slug . '_tracker_optout']) && isset($_GET[$this->client->slug . '_tracker_optout']) && $_GET[$this->client->slug . '_tracker_optout'] === 'true') { $this->optout(); - wp_redirect( remove_query_arg( $this->client->slug . '_tracker_optout' ) ); + wp_safe_redirect(remove_query_arg($this->client->slug . '_tracker_optout')); exit; } } @@ -418,13 +516,19 @@ public function handle_optin_optout() { * * @return void */ - public function optin() { - update_option( $this->client->slug . '_allow_tracking', 'yes' ); - update_option( $this->client->slug . '_tracking_notice', 'hide' ); + public function optin() + { + update_option($this->client->slug . '_allow_tracking', 'yes'); + update_option($this->client->slug . '_tracking_notice', 'hide'); $this->clear_schedule_event(); $this->schedule_event(); $this->send_tracking_data(); + + /* + * Fires when the user has opted in tracking. + */ + do_action($this->client->slug . '_tracker_optin', $this->get_tracking_data()); } /** @@ -432,24 +536,38 @@ public function optin() { * * @return void */ - public function optout() { - update_option( $this->client->slug . '_allow_tracking', 'no' ); - update_option( $this->client->slug . '_tracking_notice', 'hide' ); + public function optout() + { + update_option($this->client->slug . '_allow_tracking', 'no'); + update_option($this->client->slug . '_tracking_notice', 'hide'); + + $this->send_tracking_skipped_request(); $this->clear_schedule_event(); + + /* + * Fires when the user has opted out tracking. + */ + do_action($this->client->slug . '_tracker_optout'); } /** * Get the number of post counts * - * @param string $post_type + * @param string $post_type * - * @return integer + * @return int */ - public function get_post_count( $post_type ) { + public function get_post_count($post_type) + { global $wpdb; - return (int) $wpdb->get_var( "SELECT count(ID) FROM $wpdb->posts WHERE post_type = '$post_type' and post_status = 'publish'"); + return (int) $wpdb->get_var( + $wpdb->prepare( + "SELECT count(ID) FROM $wpdb->posts WHERE post_type = %s and post_status = %s", + [$post_type, 'publish'] + ) + ); } /** @@ -457,26 +575,28 @@ public function get_post_count( $post_type ) { * * @return array */ - private static function get_server_info() { + private static function get_server_info() + { global $wpdb; - $server_data = array(); + $server_data = []; - if ( isset( $_SERVER['SERVER_SOFTWARE'] ) && ! empty( $_SERVER['SERVER_SOFTWARE'] ) ) { + if (isset($_SERVER['SERVER_SOFTWARE']) && !empty($_SERVER['SERVER_SOFTWARE'])) { + // phpcs:ignore $server_data['software'] = $_SERVER['SERVER_SOFTWARE']; } - if ( function_exists( 'phpversion' ) ) { + if (function_exists('phpversion')) { $server_data['php_version'] = phpversion(); } - $server_data['mysql_version'] = $wpdb->db_version(); + $server_data['mysql_version'] = $wpdb->db_version(); - $server_data['php_max_upload_size'] = size_format( wp_max_upload_size() ); + $server_data['php_max_upload_size'] = size_format(wp_max_upload_size()); $server_data['php_default_timezone'] = date_default_timezone_get(); - $server_data['php_soap'] = class_exists( 'SoapClient' ) ? 'Yes' : 'No'; - $server_data['php_fsockopen'] = function_exists( 'fsockopen' ) ? 'Yes' : 'No'; - $server_data['php_curl'] = function_exists( 'curl_init' ) ? 'Yes' : 'No'; + $server_data['php_soap'] = class_exists('SoapClient') ? 'Yes' : 'No'; + $server_data['php_fsockopen'] = function_exists('fsockopen') ? 'Yes' : 'No'; + $server_data['php_curl'] = function_exists('curl_init') ? 'Yes' : 'No'; return $server_data; } @@ -486,14 +606,23 @@ private static function get_server_info() { * * @return array */ - private function get_wp_info() { - $wp_data = array(); + private function get_wp_info() + { + $wp_data = []; $wp_data['memory_limit'] = WP_MEMORY_LIMIT; - $wp_data['debug_mode'] = ( defined('WP_DEBUG') && WP_DEBUG ) ? 'Yes' : 'No'; + $wp_data['debug_mode'] = (defined('WP_DEBUG') && WP_DEBUG) ? 'Yes' : 'No'; $wp_data['locale'] = get_locale(); - $wp_data['version'] = get_bloginfo( 'version' ); + $wp_data['version'] = get_bloginfo('version'); $wp_data['multisite'] = is_multisite() ? 'Yes' : 'No'; + $wp_data['theme_slug'] = get_stylesheet(); + + $theme = wp_get_theme($wp_data['theme_slug']); + + $wp_data['theme_name'] = $theme->get('Name'); + $wp_data['theme_version'] = $theme->get('Version'); + $wp_data['theme_uri'] = $theme->get('ThemeURI'); + $wp_data['theme_author'] = $theme->get('Author'); return $wp_data; } @@ -503,47 +632,51 @@ private function get_wp_info() { * * @return array */ - private function get_all_plugins() { + private function get_all_plugins() + { // Ensure get_plugins function is loaded - if ( ! function_exists( 'get_plugins' ) ) { + if (!function_exists('get_plugins')) { include ABSPATH . '/wp-admin/includes/plugin.php'; } $plugins = get_plugins(); - $active_plugins_keys = get_option( 'active_plugins', array() ); - $active_plugins = array(); + $active_plugins_keys = get_option('active_plugins', []); + $active_plugins = []; - foreach ( $plugins as $k => $v ) { + foreach ($plugins as $k => $v) { // Take care of formatting the data how we want it. - $formatted = array(); - $formatted['name'] = strip_tags( $v['Name'] ); + $formatted = []; + $formatted['name'] = wp_strip_all_tags($v['Name']); - if ( isset( $v['Version'] ) ) { - $formatted['version'] = strip_tags( $v['Version'] ); + if (isset($v['Version'])) { + $formatted['version'] = wp_strip_all_tags($v['Version']); } - if ( isset( $v['Author'] ) ) { - $formatted['author'] = strip_tags( $v['Author'] ); + if (isset($v['Author'])) { + $formatted['author'] = wp_strip_all_tags($v['Author']); } - if ( isset( $v['Network'] ) ) { - $formatted['network'] = strip_tags( $v['Network'] ); + if (isset($v['Network'])) { + $formatted['network'] = wp_strip_all_tags($v['Network']); } - if ( isset( $v['PluginURI'] ) ) { - $formatted['plugin_uri'] = strip_tags( $v['PluginURI'] ); + if (isset($v['PluginURI'])) { + $formatted['plugin_uri'] = wp_strip_all_tags($v['PluginURI']); } - if ( in_array( $k, $active_plugins_keys ) ) { + if (in_array($k, $active_plugins_keys, true)) { // Remove active plugins from list so we can show active and inactive separately - unset( $plugins[$k] ); + unset($plugins[$k]); $active_plugins[$k] = $formatted; } else { $plugins[$k] = $formatted; } } - return array( 'active_plugins' => $active_plugins, 'inactive_plugins' => $plugins ); + return [ + 'active_plugins' => $active_plugins, + 'inactive_plugins' => $plugins, + ]; } /** @@ -551,14 +684,19 @@ private function get_all_plugins() { * * @return array */ - public function get_user_counts() { - $user_count = array(); + public function get_user_counts() + { + $user_count = []; $user_count_data = count_users(); $user_count['total'] = $user_count_data['total_users']; // Get user count based on user role - foreach ( $user_count_data['avail_roles'] as $role => $count ) { - $user_count[ $role ] = $count; + foreach ($user_count_data['avail_roles'] as $role => $count) { + if (!$count) { + continue; + } + + $user_count[$role] = $count; } return $user_count; @@ -567,16 +705,16 @@ public function get_user_counts() { /** * Add weekly cron schedule * - * @param array $schedules + * @param array $schedules * * @return array */ - public function add_weekly_schedule( $schedules ) { - - $schedules['weekly'] = array( + public function add_weekly_schedule($schedules) + { + $schedules['weekly'] = [ 'interval' => DAY_IN_SECONDS * 7, 'display' => 'Once Weekly', - ); + ]; return $schedules; } @@ -586,23 +724,25 @@ public function add_weekly_schedule( $schedules ) { * * @return void */ - public function activate_plugin() { - $allowed = get_option( $this->client->slug . '_allow_tracking', 'no' ); + public function activate_plugin() + { + $allowed = get_option($this->client->slug . '_allow_tracking', 'no'); // if it wasn't allowed before, do nothing - if ( 'yes' !== $allowed ) { + if ('yes' !== $allowed) { return; } // re-schedule and delete the last sent time so we could force send again $hook_name = $this->client->slug . '_tracker_send_event'; - if ( ! wp_next_scheduled( $hook_name ) ) { - wp_schedule_event( time(), 'weekly', $hook_name ); + + if (!wp_next_scheduled($hook_name)) { + wp_schedule_event(time(), 'weekly', $hook_name); } - delete_option( $this->client->slug . '_tracking_last_send' ); + delete_option($this->client->slug . '_tracking_last_send'); - $this->send_tracking_data( true ); + $this->send_tracking_data(true); } /** @@ -610,78 +750,85 @@ public function activate_plugin() { * * @return void */ - public function deactivation_cleanup() { + public function deactivation_cleanup() + { $this->clear_schedule_event(); - if ( 'theme' == $this->client->type ) { - delete_option( $this->client->slug . '_tracking_last_send' ); - delete_option( $this->client->slug . '_allow_tracking' ); + if ('theme' === $this->client->type) { + delete_option($this->client->slug . '_tracking_last_send'); + delete_option($this->client->slug . '_allow_tracking'); } - delete_option( $this->client->slug . '_tracking_notice' ); + delete_option($this->client->slug . '_tracking_notice'); } /** * Hook into action links and modify the deactivate link * - * @param array $links + * @param array $links * * @return array */ - public function plugin_action_links( $links ) { - - if ( array_key_exists( 'deactivate', $links ) ) { - $links['deactivate'] = str_replace( ' 'could-not-understand', - 'text' => 'I couldn\'t understand how to make it work', - 'type' => 'textarea', - 'placeholder' => 'Would you like us to assist you?' - ), - array( + 'text' => $this->client->__trans("Couldn't understand"), + 'placeholder' => $this->client->__trans('Would you like us to assist you?'), + 'icon' => '', + ], + [ 'id' => 'found-better-plugin', - 'text' => 'I found a better plugin', - 'type' => 'text', - 'placeholder' => 'Which plugin?' - ), - array( + 'text' => $this->client->__trans('Found a better plugin'), + 'placeholder' => $this->client->__trans('Which plugin?'), + 'icon' => '', + ], + [ 'id' => 'not-have-that-feature', - 'text' => 'The plugin is great, but I need specific feature that you don\'t support', - 'type' => 'textarea', - 'placeholder' => 'Could you tell us more about that feature?' - ), - array( + 'text' => $this->client->__trans('Missing a specific feature'), + 'placeholder' => $this->client->__trans('Could you tell us more about that feature?'), + 'icon' => '', + ], + [ 'id' => 'is-not-working', - 'text' => 'The plugin is not working', - 'type' => 'textarea', - 'placeholder' => 'Could you tell us a bit more whats not working?' - ), - array( + 'text' => $this->client->__trans('Not working'), + 'placeholder' => $this->client->__trans('Could you tell us a bit more whats not working?'), + 'icon' => '', + ], + [ 'id' => 'looking-for-other', - 'text' => 'It\'s not what I was looking for', - 'type' => '', - 'placeholder' => '' - ), - array( + 'text' => $this->client->__trans('Not what I was looking'), + 'placeholder' => $this->client->__trans('Could you tell us a bit more?'), + 'icon' => '', + ], + [ 'id' => 'did-not-work-as-expected', - 'text' => 'The plugin didn\'t work as expected', - 'type' => 'textarea', - 'placeholder' => 'What did you expect?' - ), - array( + 'text' => $this->client->__trans("Didn't work as expected"), + 'placeholder' => $this->client->__trans('What did you expect?'), + 'icon' => '', + ], + [ 'id' => 'other', - 'text' => 'Other', - 'type' => 'textarea', - 'placeholder' => 'Could you tell us a bit more?' - ), - ); + 'text' => $this->client->__trans('Others'), + 'placeholder' => $this->client->__trans('Could you tell us a bit more?'), + 'icon' => '', + ], + ]; return $reasons; } @@ -691,37 +838,34 @@ private function get_uninstall_reasons() { * * @return void */ - public function uninstall_reason_submission() { + public function uninstall_reason_submission() + { + if (!isset($_POST['nonce'])) { + return; + } - if ( ! isset( $_POST['reason_id'] ) ) { + if (!isset($_POST['reason_id'])) { wp_send_json_error(); } - $current_user = wp_get_current_user(); - - $data = array( - 'hash' => $this->client->hash, - 'reason_id' => sanitize_text_field( $_POST['reason_id'] ), - 'reason_info' => isset( $_REQUEST['reason_info'] ) ? trim( stripslashes( $_REQUEST['reason_info'] ) ) : '', - 'site' => $this->get_site_name(), - 'url' => esc_url( home_url() ), - 'admin_email' => get_option( 'admin_email' ), - 'user_email' => $current_user->user_email, - 'first_name' => $current_user->first_name, - 'last_name' => $current_user->last_name, - 'server' => $this->get_server_info(), - 'wp' => $this->get_wp_info(), - 'ip_address' => $this->get_user_ip_address(), - 'theme' => get_stylesheet(), - 'version' => $this->client->project_version, - ); + if (!wp_verify_nonce(sanitize_key(wp_unslash($_POST['nonce'])), 'appsero-security-nonce')) { + wp_send_json_error('Nonce verification failed'); + } - // Add metadata - if ( $extra = $this->get_extra_data() ) { - $data['extra'] = $extra; + if (!current_user_can('manage_options')) { + wp_send_json_error('You are not allowed for this task'); } - $this->client->send_request( $data, 'deactivate' ); + $data = $this->get_tracking_data(); + $data['reason_id'] = sanitize_text_field(wp_unslash($_POST['reason_id'])); + $data['reason_info'] = isset($_REQUEST['reason_info']) ? trim(sanitize_text_field(wp_unslash($_REQUEST['reason_info']))) : ''; + + $this->client->send_request($data, 'deactivate'); + + /* + * Fire after the plugin _uninstall_reason_submitted + */ + do_action($this->client->slug . '_uninstall_reason_submitted', $data); wp_send_json_success(); } @@ -731,99 +875,78 @@ public function uninstall_reason_submission() { * * @return void */ - public function deactivate_scripts() { + public function deactivate_scripts() + { global $pagenow; - if ( 'plugins.php' != $pagenow ) { + if ('plugins.php' !== $pagenow) { return; } - $reasons = $this->get_uninstall_reasons(); + $this->deactivation_modal_styles(); + $reasons = $this->get_uninstall_reasons(); + $custom_reasons = apply_filters('appsero_custom_deactivation_reasons', [], $this->client); ?>
    -

    client->textdomain, 'wp-user-frontend' ); ?>

    +

    client->_etrans('Goodbyes are always hard. If you have a moment, please let us know how we can improve.'); ?>

    -
      +
        -
      • - +
      • +
      -

      We share your data with Appsero to troubleshoot problems & make product improvements. Learn more about how Appsero handles your data.

      + +
        + +
      • + +
      • + +
      + +
      +

      + client->__trans('We share your data with Appsero to troubleshoot problems & make product improvements. Learn more about how Appsero handles your data.'), + esc_url('https://appsero.com/'), + esc_url('https://appsero.com/privacy-policy') + ); + ?> +

    - - '; - } else { - $return_var = ''; - } - - return $return_var.' - - '; -} - - - - -/** - * A ReCaptchaResponse is returned from recaptcha_check_answer() - */ -if ( !class_exists( 'ReCaptchaResponse' ) ) { - class ReCaptchaResponse { - var $is_valid; - var $error; - } -} - - - -/** - * Calls an HTTP POST function to verify if the user's guess was correct - * @param string $privkey - * @param string $remoteip - * @param string $challenge - * @param string $response - * @param array $extra_params an array of extra variables to post to the server - * @return ReCaptchaResponse - */ -function recaptcha_check_answer ($privkey, $remoteip, $challenge, $response, $extra_params = array()) -{ - if ($privkey == null || $privkey == '') { - die ("To use reCAPTCHA you must get an API key from https://www.google.com/recaptcha/admin/create"); - } - - if ($remoteip == null || $remoteip == '') { - die ("For security reasons, you must pass the remote ip to reCAPTCHA"); - } - - - - //discard spam submissions - if ($challenge == null || strlen($challenge) == 0 || $response == null || strlen($response) == 0) { - $recaptcha_response = new ReCaptchaResponse(); - $recaptcha_response->is_valid = false; - $recaptcha_response->error = 'incorrect-captcha-sol'; - return $recaptcha_response; - } - - $response = _recaptcha_http_post (RECAPTCHA_VERIFY_SERVER, "/recaptcha/api/verify", - array ( - 'privatekey' => $privkey, - 'remoteip' => $remoteip, - 'challenge' => $challenge, - 'response' => $response - ) + $extra_params - ); - - $answers = explode ("\n", $response [1]); - $recaptcha_response = new ReCaptchaResponse(); - - if (trim ($answers [0]) == 'true') { - $recaptcha_response->is_valid = true; - } - else { - $recaptcha_response->is_valid = false; - $recaptcha_response->error = $answers [1]; - } - return $recaptcha_response; - -} - -/** - * gets a URL where the user can sign up for reCAPTCHA. If your application - * has a configuration page where you enter a key, you should provide a link - * using this function. - * @param string $domain The domain where the page is hosted - * @param string $appname The name of your application - */ -function recaptcha_get_signup_url ($domain = null, $appname = null) { - return "https://www.google.com/recaptcha/admin/create?" . _recaptcha_qsencode (array ('domains' => $domain, 'app' => $appname)); -} - -function _recaptcha_aes_pad($val) { - $block_size = 16; - $numpad = $block_size - (strlen ($val) % $block_size); - return str_pad($val, strlen ($val) + $numpad, chr($numpad)); -} - -/* Mailhide related code */ - -function _recaptcha_aes_encrypt($val,$ky) { - if (! function_exists ("mcrypt_encrypt")) { - die ("To use reCAPTCHA Mailhide, you need to have the mcrypt php module installed."); - } - $mode=MCRYPT_MODE_CBC; - $enc=MCRYPT_RIJNDAEL_128; - $val=_recaptcha_aes_pad($val); - return mcrypt_encrypt($enc, $ky, $val, $mode, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"); -} - - -function _recaptcha_mailhide_urlbase64 ($x) { - return strtr(base64_encode ($x), '+/', '-_'); -} - -/* gets the reCAPTCHA Mailhide url for a given email, public key and private key */ -function recaptcha_mailhide_url($pubkey, $privkey, $email) { - if ($pubkey == '' || $pubkey == null || $privkey == "" || $privkey == null) { - die ("To use reCAPTCHA Mailhide, you have to sign up for a public and private key, " . - "you can do so at http://www.google.com/recaptcha/mailhide/apikey"); - } - - - $ky = pack('H*', $privkey); - $cryptmail = _recaptcha_aes_encrypt ($email, $ky); - - return "http://www.google.com/recaptcha/mailhide/d?k=" . $pubkey . "&c=" . _recaptcha_mailhide_urlbase64 ($cryptmail); -} - -/** - * gets the parts of the email to expose to the user. - * eg, given johndoe@example,com return ["john", "example.com"]. - * the email is then displayed as john...@example.com - */ -function _recaptcha_mailhide_email_parts ($email) { - $arr = preg_split("/@/", $email ); - - if (strlen ($arr[0]) <= 4) { - $arr[0] = substr ($arr[0], 0, 1); - } else if (strlen ($arr[0]) <= 6) { - $arr[0] = substr ($arr[0], 0, 3); - } else { - $arr[0] = substr ($arr[0], 0, 4); - } - return $arr; -} - -/** - * Gets html to display an email address given a public an private key. - * to get a key, go to: - * - * http://www.google.com/recaptcha/mailhide/apikey - */ -function recaptcha_mailhide_html($pubkey, $privkey, $email) { - $emailparts = _recaptcha_mailhide_email_parts ($email); - $url = recaptcha_mailhide_url ($pubkey, $privkey, $email); - - return htmlentities($emailparts[0]) . "...@" . htmlentities ($emailparts [1]); - -} - - -?> + $value ) + $req .= $key . '=' . urlencode( stripslashes($value) ) . '&'; + + // Cut the last '&' + $req=substr($req,0,strlen($req)-1); + return $req; +} + + + +/** + * Submits an HTTP POST to a reCAPTCHA server + * @param string $host + * @param string $path + * @param array $data + * @param int port + * @return array response + */ +function _recaptcha_http_post($host, $path, $data, $port = 80) { + + $req = _recaptcha_qsencode ($data); + + $http_request = "POST $path HTTP/1.0\r\n"; + $http_request .= "Host: $host\r\n"; + $http_request .= "Content-Type: application/x-www-form-urlencoded;\r\n"; + $http_request .= "Content-Length: " . strlen($req) . "\r\n"; + $http_request .= "User-Agent: reCAPTCHA/PHP\r\n"; + $http_request .= "\r\n"; + $http_request .= $req; + + $response = ''; + if( false == ( $fs = @fsockopen($host, $port, $errno, $errstr, 10) ) ) { + die ('Could not open socket'); + } + + fwrite($fs, $http_request); + + while ( !feof($fs) ) + $response .= fgets($fs, 1160); // One TCP-IP packet + fclose($fs); + $response = explode("\r\n\r\n", $response, 2); + + return $response; +} + + + +/** + * Gets the challenge HTML (javascript and non-javascript version). + * This is called from the browser, and the resulting reCAPTCHA HTML widget + * is embedded within the HTML form it was called from. + * @param string $pubkey A public key for reCAPTCHA + * @param string $error The error given by reCAPTCHA (optional, default is null) + * @param boolean $use_ssl Should the request be made over ssl? (optional, default is false) + + * @return string - The HTML to be embedded in the user's form. + */ +function recaptcha_get_html ($pubkey, $enable_no_captcha = false, $error = null, $use_ssl = false) +{ + if ($pubkey == null || $pubkey == '') { + die ("To use reCAPTCHA you must get an API key from https://www.google.com/recaptcha/admin/create"); + } + + if ($use_ssl) { + $server = RECAPTCHA_API_SECURE_SERVER; + } else { + $server = RECAPTCHA_API_SERVER; + } + + $errorpart = ""; + if ($error) { + $errorpart = "&error=" . $error; + } + + + if ( $enable_no_captcha == true ) { + $return_var = '
    '; + } else { + $return_var = ''; + } + + return $return_var.' + + '; +} + + + + +/** + * A ReCaptchaResponse is returned from recaptcha_check_answer() + */ +if ( !class_exists( 'ReCaptchaResponse' ) ) { + class ReCaptchaResponse { + var $is_valid; + var $error; + } +} + + + +/** + * Calls an HTTP POST function to verify if the user's guess was correct + * @param string $privkey + * @param string $remoteip + * @param string $challenge + * @param string $response + * @param array $extra_params an array of extra variables to post to the server + * @return ReCaptchaResponse + */ +function recaptcha_check_answer ($privkey, $remoteip, $challenge, $response, $extra_params = array()) +{ + if ($privkey == null || $privkey == '') { + die ("To use reCAPTCHA you must get an API key from https://www.google.com/recaptcha/admin/create"); + } + + if ($remoteip == null || $remoteip == '') { + die ("For security reasons, you must pass the remote ip to reCAPTCHA"); + } + + + + //discard spam submissions + if ($challenge == null || strlen($challenge) == 0 || $response == null || strlen($response) == 0) { + $recaptcha_response = new ReCaptchaResponse(); + $recaptcha_response->is_valid = false; + $recaptcha_response->error = 'incorrect-captcha-sol'; + return $recaptcha_response; + } + + $response = _recaptcha_http_post (RECAPTCHA_VERIFY_SERVER, "/recaptcha/api/verify", + array ( + 'privatekey' => $privkey, + 'remoteip' => $remoteip, + 'challenge' => $challenge, + 'response' => $response + ) + $extra_params + ); + + $answers = explode ("\n", $response [1]); + $recaptcha_response = new ReCaptchaResponse(); + + if (trim ($answers [0]) == 'true') { + $recaptcha_response->is_valid = true; + } + else { + $recaptcha_response->is_valid = false; + $recaptcha_response->error = $answers [1]; + } + return $recaptcha_response; + +} + +/** + * gets a URL where the user can sign up for reCAPTCHA. If your application + * has a configuration page where you enter a key, you should provide a link + * using this function. + * @param string $domain The domain where the page is hosted + * @param string $appname The name of your application + */ +function recaptcha_get_signup_url ($domain = null, $appname = null) { + return "https://www.google.com/recaptcha/admin/create?" . _recaptcha_qsencode (array ('domains' => $domain, 'app' => $appname)); +} + +function _recaptcha_aes_pad($val) { + $block_size = 16; + $numpad = $block_size - (strlen ($val) % $block_size); + return str_pad($val, strlen ($val) + $numpad, chr($numpad)); +} + +/* Mailhide related code */ + +function _recaptcha_aes_encrypt($val,$ky) { + if (! function_exists ("mcrypt_encrypt")) { + die ("To use reCAPTCHA Mailhide, you need to have the mcrypt php module installed."); + } + $mode=MCRYPT_MODE_CBC; + $enc=MCRYPT_RIJNDAEL_128; + $val=_recaptcha_aes_pad($val); + return mcrypt_encrypt($enc, $ky, $val, $mode, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"); +} + + +function _recaptcha_mailhide_urlbase64 ($x) { + return strtr(base64_encode ($x), '+/', '-_'); +} + +/* gets the reCAPTCHA Mailhide url for a given email, public key and private key */ +function recaptcha_mailhide_url($pubkey, $privkey, $email) { + if ($pubkey == '' || $pubkey == null || $privkey == "" || $privkey == null) { + die ("To use reCAPTCHA Mailhide, you have to sign up for a public and private key, " . + "you can do so at http://www.google.com/recaptcha/mailhide/apikey"); + } + + + $ky = pack('H*', $privkey); + $cryptmail = _recaptcha_aes_encrypt ($email, $ky); + + return "http://www.google.com/recaptcha/mailhide/d?k=" . $pubkey . "&c=" . _recaptcha_mailhide_urlbase64 ($cryptmail); +} + +/** + * gets the parts of the email to expose to the user. + * eg, given johndoe@example,com return ["john", "example.com"]. + * the email is then displayed as john...@example.com + */ +function _recaptcha_mailhide_email_parts ($email) { + $arr = preg_split("/@/", $email ); + + if (strlen ($arr[0]) <= 4) { + $arr[0] = substr ($arr[0], 0, 1); + } else if (strlen ($arr[0]) <= 6) { + $arr[0] = substr ($arr[0], 0, 3); + } else { + $arr[0] = substr ($arr[0], 0, 4); + } + return $arr; +} + +/** + * Gets html to display an email address given a public an private key. + * to get a key, go to: + * + * http://www.google.com/recaptcha/mailhide/apikey + */ +function recaptcha_mailhide_html($pubkey, $privkey, $email) { + $emailparts = _recaptcha_mailhide_email_parts ($email); + $url = recaptcha_mailhide_url ($pubkey, $privkey, $email); + + return htmlentities($emailparts[0]) . "...@" . htmlentities ($emailparts [1]); + +} + + +?> diff --git a/lib/recaptchalib_noCaptcha.php b/lib/recaptchalib_noCaptcha.php index ed50830f1..07c67c77c 100644 --- a/lib/recaptchalib_noCaptcha.php +++ b/lib/recaptchalib_noCaptcha.php @@ -11,7 +11,7 @@ * @copyright Copyright (c) 2014, Google Inc. * @link http://www.google.com/recaptcha * - * Permission is hereby granted, free of charge, to any person obtaining a copy + * Permission is hereby granted, Free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell diff --git a/package-lock.json b/package-lock.json index cadf91eee..caefba1b5 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,2724 +1,3447 @@ { "name": "wp-user-frontend", - "version": "3.6.0", - "lockfileVersion": 2, + "version": "4.0.6", + "lockfileVersion": 1, "requires": true, - "packages": { - "": { - "name": "wp-user-frontend", - "version": "3.5.29", - "license": "GPL", - "dependencies": { - "cli": "^1.0.1" - }, - "devDependencies": { - "grunt": "^1.5.3", - "grunt-contrib-clean": "~1.0.0", - "grunt-contrib-compress": "~1.3.0", - "grunt-contrib-concat": "^1.0.1", - "grunt-contrib-copy": "~1.0.0", - "grunt-contrib-imagemin": "^1.0.1", - "grunt-contrib-jshint": "^1.1.0", - "grunt-contrib-less": "^1.4.0", - "grunt-contrib-uglify": "^2.0.0", - "grunt-contrib-watch": "^1.0.0", - "grunt-notify": "^0.4.5", - "grunt-phplint": "0.0.8", - "grunt-ssh": "^0.12.9", - "grunt-text-replace": "^0.4.0", - "grunt-wp-i18n": "^1.0.3", - "grunt-wp-readme-to-markdown": "^2.0.1", - "jshint-stylish": "^2.2.1" - } - }, - "node_modules/abbrev": { + "dependencies": { + "abbrev": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", "dev": true }, - "node_modules/ansi-gray": { + "ajv": { + "version": "4.11.8", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-4.11.8.tgz", + "integrity": "sha512-I/bSHSNEcFFqXLf91nchoNB9D1Kie3QKcWdchYUaoIg1+1bdWDkdfdlvdIOJbi9U8xR0y+MWc5D+won9v95WlQ==", + "dev": true, + "optional": true, + "requires": { + "co": "^4.6.0", + "json-stable-stringify": "^1.0.1" + }, + "dependencies": { + "co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", + "dev": true, + "optional": true + } + } + }, + "align-text": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz", + "integrity": "sha512-GrTZLRpmp6wIC2ztrWW9MjjTgSKccffgFagbNDOX95/dcjEcYZibYTeaOntySQLcdw1ztBoFkviiUvTMbb9MYg==", + "dev": true, + "requires": { + "kind-of": "^3.0.2", + "longest": "^1.0.1", + "repeat-string": "^1.5.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "ansi-gray": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/ansi-gray/-/ansi-gray-0.1.1.tgz", - "integrity": "sha1-KWLPVOyXksSFEKPetSRDaGHvclE=", + "integrity": "sha512-HrgGIZUl8h2EHuZaU9hTR/cU5nhKxpVE1V6kdGsQ8e4zirElJ5fvtfc8N7Q1oq1aatO275i8pUFUCpNWCAnVWw==", "dev": true, "optional": true, - "dependencies": { + "requires": { "ansi-wrap": "0.1.0" - }, - "engines": { - "node": ">=0.10.0" } }, - "node_modules/ansi-styles": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", + "dev": true + }, + "ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, - "dependencies": { + "requires": { "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/ansi-wrap": { + "ansi-wrap": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/ansi-wrap/-/ansi-wrap-0.1.0.tgz", - "integrity": "sha1-qCJQ3bABXponyoLoLqYDu/pF768=", + "integrity": "sha512-ZyznvL8k/FZeQHr2T6LzcJ/+vBApDnMNZvfVFy3At0knswWd6rJ3/0Hhmpu8oqa6C92npmozs890sX9Dl6q+Qw==", + "dev": true, + "optional": true + }, + "archive-type": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/archive-type/-/archive-type-3.2.0.tgz", + "integrity": "sha512-6cAWDM0lUYTbb7F436FAjbBYnsn5E3L2AgTOLzrFfLt7FVM6uJwKUvllE8VjLKTmKCU8PqtWlUAezEYjg5iGqA==", "dev": true, "optional": true, - "engines": { - "node": ">=0.10.0" + "requires": { + "file-type": "^3.1.0" + } + }, + "archiver": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/archiver/-/archiver-1.3.0.tgz", + "integrity": "sha512-4q/CtGPNVyC5aT9eYHhFP7SAEjKYzQIDIJWXfexUIPNxitNs1y6hORdX+sYxERSZ6qPeNNBJ5UolFsJdWTU02g==", + "dev": true, + "requires": { + "archiver-utils": "^1.3.0", + "async": "^2.0.0", + "buffer-crc32": "^0.2.1", + "glob": "^7.0.0", + "lodash": "^4.8.0", + "readable-stream": "^2.0.0", + "tar-stream": "^1.5.0", + "walkdir": "^0.0.11", + "zip-stream": "^1.1.0" + }, + "dependencies": { + "async": { + "version": "2.6.4", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.4.tgz", + "integrity": "sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==", + "dev": true, + "requires": { + "lodash": "^4.17.14" + } + }, + "readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "archiver-utils": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/archiver-utils/-/archiver-utils-1.3.0.tgz", + "integrity": "sha512-h+hTREBXcW5e1L9RihGXdH4PHHdGipG/jE2sMZrqIH6BmZAxeGU5IWjVsKhokdCSWX7km6Kkh406zZNEElHFPQ==", + "dev": true, + "requires": { + "glob": "^7.0.0", + "graceful-fs": "^4.1.0", + "lazystream": "^1.0.0", + "lodash": "^4.8.0", + "normalize-path": "^2.0.0", + "readable-stream": "^2.0.0" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + } } }, - "node_modules/argparse": { + "argparse": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", "dev": true, - "dependencies": { + "requires": { "sprintf-js": "~1.0.2" + }, + "dependencies": { + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "dev": true + } } }, - "node_modules/argparse/node_modules/sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "arr-diff": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", + "integrity": "sha512-dtXTVMkh6VkEEA7OhXnN1Ecb8aAGFdZ1LFxtOCoqj4qkyOJMt7+qs6Ahdy6p/NQCPYsRSXXivhSB/J5E9jmYKA==", + "dev": true, + "requires": { + "arr-flatten": "^1.0.1" + } + }, + "arr-flatten": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", + "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", "dev": true }, - "node_modules/array-each": { + "array-differ": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-differ/-/array-differ-1.0.0.tgz", + "integrity": "sha512-LeZY+DZDRnvP7eMuQ6LHfCzUGxAAIViUBliK24P3hWXL6y4SortgR6Nim6xrkfSLlmH0+k+9NYNwVC2s53ZrYQ==", + "dev": true, + "optional": true + }, + "array-each": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/array-each/-/array-each-1.0.1.tgz", "integrity": "sha512-zHjL5SZa68hkKHBFBK6DJCTtr9sfTCPCaph/L7tMSLcTFgy+zX7E+6q5UArbtOtMBCtxdICpfTCspRse+ywyXA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } + "dev": true + }, + "array-find-index": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz", + "integrity": "sha512-M1HQyIXcBGtVywBt8WVdim+lrNaK7VHp99Qt5pSNziXznKHViIBbXWtfRTpEFpF/c4FdfxNAsCCwPp5phBYJtw==", + "dev": true }, - "node_modules/array-slice": { + "array-slice": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/array-slice/-/array-slice-1.1.0.tgz", "integrity": "sha512-B1qMD3RBP7O8o0H2KbrXDyB0IccejMF15+87Lvlor12ONPRHP6gTjXMNkt/d3ZuOGbAe66hFmaCfECI24Ufp6w==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/async": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/async/-/async-3.2.4.tgz", - "integrity": "sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==", "dev": true }, - "node_modules/balanced-match": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" + "array-uniq": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", + "integrity": "sha512-MNha4BWQ6JbwhFhj03YK552f7cb3AzoE8SzeljgChvL1dl3IcvggXVz1DilzySZkCja+CXuZbdW7yATchWn8/Q==", + "dev": true, + "optional": true }, - "node_modules/bluebird": { - "version": "3.7.2", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", - "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", + "array-unique": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", + "integrity": "sha512-G2n5bG5fSUCpnsXz4+8FUkYsGPkNfLn9YvS66U5qbTIXI2Ynnlo4Bi42bWv+omKUCqz+ejzfClwne0alJWJPhg==", "dev": true }, - "node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==", "dev": true, - "dependencies": { - "fill-range": "^7.0.1" - }, - "engines": { - "node": ">=8" - } + "optional": true }, - "node_modules/chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "asn1": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", + "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==", "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/cli": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/cli/-/cli-1.0.1.tgz", - "integrity": "sha1-IoF1NPJL+klQw01TLUjsvGIbjBQ=", - "dependencies": { - "exit": "0.1.2", - "glob": "^7.1.1" - }, - "engines": { - "node": ">=0.2.5" + "requires": { + "safer-buffer": "~2.1.0" } }, - "node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "assert-plus": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-0.2.0.tgz", + "integrity": "sha512-u1L0ZLywRziOVjUhRxI0Qg9G+4RnFB9H/Rq40YWn0dieDgO7vAYeJz6jKAO6t/aruzlDFLAPkQTT87e+f8Imaw==", "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } + "optional": true }, - "node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "async": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.4.tgz", + "integrity": "sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==", "dev": true }, - "node_modules/color-support": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", - "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", + "async-each-series": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/async-each-series/-/async-each-series-1.1.0.tgz", + "integrity": "sha512-/VIpPVIJJlJObJiXkHBJ1RhjDtydBRG/3/dWpsXoVGOShNw5tameXnC7Yys+wpb0p/myItxGmSGgNi/dNlsIiA==", "dev": true, - "optional": true, - "bin": { - "color-support": "bin.js" - } + "optional": true }, - "node_modules/colors": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/colors/-/colors-1.1.2.tgz", - "integrity": "sha1-FopHAXVran9RoSzgyXv6KMCE7WM=", + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", "dev": true, - "engines": { - "node": ">=0.1.90" - } - }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + "optional": true }, - "node_modules/dateformat": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-3.0.3.tgz", - "integrity": "sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q==", + "aws-sign2": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.6.0.tgz", + "integrity": "sha512-JnJpAS0p9RmixkOvW2XwDxxzs1bd4/VAGIl6Q0EC5YOo+p+hqIhtDhn/nmFnB/xUNXbLkpE2mOjgVIBRKD4xYw==", "dev": true, - "engines": { - "node": "*" - } + "optional": true }, - "node_modules/detect-file": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz", - "integrity": "sha512-DtCOLG98P007x7wiiOmfI0fi3eIKyWiLTGJ2MDnVi/E04lWGbf+JzrRHMm0rgIIZJGtHpKpbVgLWHrv8xXpc3Q==", + "aws4": { + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.12.0.tgz", + "integrity": "sha512-NmWvPnx0F1SfrQbYwOi7OeaNGokp9XhzNioJ/CSBs8Qa4vxug81mhJEAVZwxXuBmYB5KDRfMq/F3RR0BIU7sWg==", "dev": true, - "engines": { - "node": ">=0.10.0" - } + "optional": true }, - "node_modules/encoding": { - "version": "0.1.13", - "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", - "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", + "balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "dev": true + }, + "bcrypt-pbkdf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==", "dev": true, - "dependencies": { - "iconv-lite": "^0.6.2" + "optional": true, + "requires": { + "tweetnacl": "^0.14.3" } }, - "node_modules/encoding/node_modules/iconv-lite": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "beeper": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/beeper/-/beeper-1.1.1.tgz", + "integrity": "sha512-3vqtKL1N45I5dV0RdssXZG7X6pCqQrWPNOlBPZPrd+QkE2HEhR57Z04m0KtpbsZH73j+a3F8UD1TQnn+ExTvIA==", "dev": true, - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } + "optional": true }, - "node_modules/esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "bin-build": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/bin-build/-/bin-build-2.2.0.tgz", + "integrity": "sha512-m8gaq/BdoePIT5RlHW3KNJZwNkg9YtPn2C89x85/0KYIExoHMm3D/RL/Wxrvum9CI6pbF2KUQa8a/WWFudVmng==", "dev": true, - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" + "optional": true, + "requires": { + "archive-type": "^3.0.1", + "decompress": "^3.0.0", + "download": "^4.1.2", + "exec-series": "^1.0.0", + "rimraf": "^2.2.6", + "tempfile": "^1.0.0", + "url-regex": "^3.0.0" }, - "engines": { - "node": ">=4" + "dependencies": { + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dev": true, + "optional": true, + "requires": { + "glob": "^7.1.3" + } + } } }, - "node_modules/eventemitter2": { - "version": "0.4.14", - "resolved": "https://registry.npmjs.org/eventemitter2/-/eventemitter2-0.4.14.tgz", - "integrity": "sha1-j2G3XN4BKy6esoTUVFWDtWQ7Yas=", - "dev": true + "bin-check": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/bin-check/-/bin-check-2.0.0.tgz", + "integrity": "sha512-jf6fesAGnXBynRU3JLpo0qe8vw8JBPBJCKK0v8NV3iH1P2UkQ6UEcIy7uPw1OdWkPUtpmX1uqeyTGrpeKd2CwQ==", + "dev": true, + "optional": true, + "requires": { + "executable": "^1.0.0" + } }, - "node_modules/exit": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", - "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=", - "engines": { - "node": ">= 0.8.0" + "bin-version": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/bin-version/-/bin-version-1.0.4.tgz", + "integrity": "sha512-o9u3aS7w6RqoH9BErxuilhQG2fn3srr3ZekEEGailMnj5F+0p+R3TXENvO+vGaLnKlmq8xhhh/Fvl1RRxx/FdQ==", + "dev": true, + "optional": true, + "requires": { + "find-versions": "^1.0.0" } }, - "node_modules/expand-tilde": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", - "integrity": "sha512-A5EmesHW6rfnZ9ysHQjPdJRni0SRar0tjtG5MNtm9n5TUvsYU8oozprtRD4AqHxcZWWlVuAmQo2nWKfN9oyjTw==", + "bin-version-check": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/bin-version-check/-/bin-version-check-2.1.0.tgz", + "integrity": "sha512-3lUeqGAbnWQG7OCfIiHXw1EmzzvAGlMYqqgRahkr7oDeY1Qra8r2DZH2bbfXZI4NA3aaD1Ap+xt8CeVO/fftrw==", "dev": true, - "dependencies": { - "homedir-polyfill": "^1.0.1" + "optional": true, + "requires": { + "bin-version": "^1.0.0", + "minimist": "^1.1.0", + "semver": "^4.0.3", + "semver-truncate": "^1.0.0" }, - "engines": { - "node": ">=0.10.0" + "dependencies": { + "semver": { + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/semver/-/semver-4.3.6.tgz", + "integrity": "sha512-IrpJ+yoG4EOH8DFWuVg+8H1kW1Oaof0Wxe7cPcXW3x9BjkN/eVo54F15LyqemnDIUYskQWr9qvl/RihmSy6+xQ==", + "dev": true, + "optional": true + } } }, - "node_modules/extend": { + "bin-wrapper": { "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", - "dev": true + "resolved": "https://registry.npmjs.org/bin-wrapper/-/bin-wrapper-3.0.2.tgz", + "integrity": "sha512-5QEiUnaE7hgRlQxaV2jpeTg0+IA3o4zZ2sduuSqyJCdOuJ1wDuEmM1ntGelDf4ueCOaOam4bOMtOU4W6lG+hUg==", + "dev": true, + "optional": true, + "requires": { + "bin-check": "^2.0.0", + "bin-version-check": "^2.1.0", + "download": "^4.0.0", + "each-async": "^1.1.1", + "lazy-req": "^1.0.0", + "os-filter-obj": "^1.0.0" + } }, - "node_modules/fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "bl": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/bl/-/bl-1.2.3.tgz", + "integrity": "sha512-pvcNpa0UU69UT341rO6AYy4FVAIkUHuZXRIWbq+zHnsVcRzDDjIAhGuuYoi0d//cwIwtt4pkpKycWEfjdV+vww==", "dev": true, - "dependencies": { - "to-regex-range": "^5.0.1" + "requires": { + "readable-stream": "^2.3.5", + "safe-buffer": "^5.1.1" }, - "engines": { - "node": ">=8" + "dependencies": { + "readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + }, + "dependencies": { + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + } + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + }, + "dependencies": { + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + } + } + } } }, - "node_modules/findup-sync": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-0.3.0.tgz", - "integrity": "sha1-N5MKpdgWt3fANEXhlmzGeQpMCxY=", + "bluebird": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", + "dev": true + }, + "body-parser": { + "version": "1.14.2", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.14.2.tgz", + "integrity": "sha512-6D9uiWn7dbnDAhlDikccybuqKCmsoest0es3VSQO8Doz/fzx6Ls7kJNxKBYTjbzu4/RzNsf9zuACnS3UYjVH8Q==", "dev": true, - "dependencies": { - "glob": "~5.0.0" + "requires": { + "bytes": "2.2.0", + "content-type": "~1.0.1", + "debug": "~2.2.0", + "depd": "~1.1.0", + "http-errors": "~1.3.1", + "iconv-lite": "0.4.13", + "on-finished": "~2.3.0", + "qs": "5.2.0", + "raw-body": "~2.1.5", + "type-is": "~1.6.10" }, - "engines": { - "node": ">= 0.6.0" + "dependencies": { + "iconv-lite": { + "version": "0.4.13", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.13.tgz", + "integrity": "sha512-QwVuTNQv7tXC5mMWFX5N5wGjmybjNBBD8P3BReTkPmipoxTUFgWM2gXNvldHQr6T14DH0Dh6qBVg98iJt7u4mQ==", + "dev": true + }, + "qs": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-5.2.0.tgz", + "integrity": "sha512-VH4FeG98gs6AkHivaW2O14vsOPBL9E80Sj7fITunoDijiYQ1lsVwJYmm1CSL+oLyO2N5HPdo23GXAG64uKOAZQ==", + "dev": true + } } }, - "node_modules/findup-sync/node_modules/glob": { - "version": "5.0.15", - "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz", - "integrity": "sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=", + "boom": { + "version": "2.10.1", + "resolved": "https://registry.npmjs.org/boom/-/boom-2.10.1.tgz", + "integrity": "sha512-KbiZEa9/vofNcVJXGwdWWn25reQ3V3dHBWbS07FTF3/TOehLnm9GEhJV4T6ZvGPkShRpmUqYwnaCrkj0mRnP6Q==", "dev": true, - "dependencies": { - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "2 || 3", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" + "optional": true, + "requires": { + "hoek": "2.x.x" } }, - "node_modules/fined": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/fined/-/fined-1.2.0.tgz", - "integrity": "sha512-ZYDqPLGxDkDhDZBjZBb+oD1+j0rA4E0pXY50eplAAOPg2N/gUBSSk5IM1/QhPfyVo19lJ+CvXpqfvk+b2p/8Ng==", + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", "dev": true, - "dependencies": { - "expand-tilde": "^2.0.2", - "is-plain-object": "^2.0.3", - "object.defaults": "^1.1.0", - "object.pick": "^1.2.0", - "parse-filepath": "^1.0.1" - }, - "engines": { - "node": ">= 0.10" + "requires": { + "fill-range": "^7.0.1" } }, - "node_modules/flagged-respawn": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/flagged-respawn/-/flagged-respawn-1.0.1.tgz", - "integrity": "sha512-lNaHNVymajmk0OJMBn8fVUAU1BtDeKIqKoVhk4xAALB57aALg6b4W0MfJ/cUE0g9YBXy5XhSlPIpYIJ7HaY/3Q==", + "browserify-zlib": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.1.4.tgz", + "integrity": "sha512-19OEpq7vWgsH6WkvkBJQDFvJS1uPcbFOQ4v9CU839dO+ZZXUZO6XpE6hNCqvlIIj+4fZvRiJ6DsAQ382GwiyTQ==", "dev": true, - "engines": { - "node": ">= 0.10" + "requires": { + "pako": "~0.2.0" } }, - "node_modules/for-in": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", - "integrity": "sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ==", + "buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", "dev": true, - "engines": { - "node": ">=0.10.0" + "requires": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" } }, - "node_modules/for-own": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/for-own/-/for-own-1.0.0.tgz", - "integrity": "sha512-0OABksIGrxKK8K4kynWkQ7y1zounQxP+CWnyclVwj81KW3vlLlGUx57DKGcP/LH216GzqnstnPocF16Nxs0Ycg==", + "buffer-alloc": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/buffer-alloc/-/buffer-alloc-1.2.0.tgz", + "integrity": "sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==", "dev": true, - "dependencies": { - "for-in": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" + "requires": { + "buffer-alloc-unsafe": "^1.1.0", + "buffer-fill": "^1.0.0" } }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" + "buffer-alloc-unsafe": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz", + "integrity": "sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==", + "dev": true }, - "node_modules/function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "buffer-crc32": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", "dev": true }, - "node_modules/getobject": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/getobject/-/getobject-1.0.2.tgz", - "integrity": "sha512-2zblDBaFcb3rB4rF77XVnuINOE2h2k/OnqXAiy0IrTxUfV1iFp3la33oAQVY9pCpWU268WFYVt2t71hlMuLsOg==", - "dev": true, - "engines": { - "node": ">=10" - } + "buffer-fill": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/buffer-fill/-/buffer-fill-1.0.0.tgz", + "integrity": "sha512-T7zexNBwiiaCOGDg9xNX9PBmjrubblRkENuptryuI64URkXDFum9il/JGL8Lm8wYfAXpredVXXZz7eMHilimiQ==", + "dev": true }, - "node_modules/gettext-parser": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/gettext-parser/-/gettext-parser-3.1.1.tgz", - "integrity": "sha512-vNhWcqXEtZPs5Ft1ReA34g7ByWotpcOIeJvXVy2jF3/G2U9v6W0wG4Z4hXzcU8R//jArqkgHcVCGgGqa4vxVlQ==", + "buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true + }, + "buffer-to-vinyl": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/buffer-to-vinyl/-/buffer-to-vinyl-1.1.0.tgz", + "integrity": "sha512-t6B4HXJ3YdJ/lXKhK3nlGW1aAvpQH2FMyHh25SmfdYkQAU3/R2MYo4VrY1DlQuZd8zLNOqWPxZFJILRuTkqaEQ==", "dev": true, + "requires": { + "file-type": "^3.1.0", + "readable-stream": "^2.0.2", + "uuid": "^2.0.1", + "vinyl": "^1.0.0" + }, "dependencies": { - "encoding": "^0.1.12", - "readable-stream": "^3.2.0", - "safe-buffer": "^5.1.2" + "readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + } } }, - "node_modules/glob": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", - "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } + "bytes": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-2.2.0.tgz", + "integrity": "sha512-zGRpnr2l5w/s8PxkrquUJoVeR06KvqPelrYqiSyQV7QEBqCYivpb6UzXYWC6JDBVtNFOT0rzJRFhkfJgxzmILA==", + "dev": true }, - "node_modules/global-modules": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz", - "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==", + "cache-swap": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/cache-swap/-/cache-swap-0.0.6.tgz", + "integrity": "sha512-ajQE2GxLNoOz/OCUTdMQ+M92dEkkgZ86AikncVL5LrZxXjh3C1+CblFgr74wIXRQANY0FXzMzbQGDYeVheGnlQ==", "dev": true, - "dependencies": { - "global-prefix": "^1.0.1", - "is-windows": "^1.0.1", - "resolve-dir": "^1.0.0" + "requires": { + "async": "~0.2.6", + "lodash": "~1.1.0", + "rimraf": "~2.1.4" }, - "engines": { - "node": ">=0.10.0" + "dependencies": { + "async": { + "version": "0.2.10", + "resolved": "https://registry.npmjs.org/async/-/async-0.2.10.tgz", + "integrity": "sha512-eAkdoKxU6/LkKDBzLpT+t6Ff5EtfSF4wx1WfJiPEEV7WNLnDaRXk0oVysiEPm262roaachGexwUv94WhSgN5TQ==", + "dev": true + }, + "graceful-fs": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-1.2.3.tgz", + "integrity": "sha512-iiTUZ5vZ+2ZV+h71XAgwCSu6+NAizhFU3Yw8aC/hH5SQ3SnISqEqAek40imAFGtDcwJKNhXvSY+hzIolnLwcdQ==", + "dev": true, + "optional": true + }, + "lodash": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-1.1.1.tgz", + "integrity": "sha512-SFeNKyKPh4kvYv0yd95fwLKw4JXM45PJLsPRdA8v7/q0lBzFeK6XS8xJTl6mlhb8PbAzioMkHli1W/1g0y4XQQ==", + "dev": true + }, + "rimraf": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.1.4.tgz", + "integrity": "sha512-tzwmX16YQhcFu0T/m0gHBcFKx6yQAg77Z6WWaQSJsUekXYa6yaAmHhrDdmFicgauX/er7GsdN+vRao3mBhA4kQ==", + "dev": true, + "requires": { + "graceful-fs": "~1" + } + } } }, - "node_modules/global-prefix": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz", - "integrity": "sha512-5lsx1NUDHtSjfg0eHlmYvZKv8/nVqX4ckFbM+FrGcQ+04KWcWFo9P5MxPZYSzUvyzmdTbI7Eix8Q4IbELDqzKg==", + "call-bind": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.6.tgz", + "integrity": "sha512-Mj50FLHtlsoVfRfnHaZvyrooHcrlceNZdL/QBvJJVd9Ta55qCQK0gs4ss2oZDeV9zFCs6ewzYgVE5yfVmfFpVg==", "dev": true, - "dependencies": { - "expand-tilde": "^2.0.2", - "homedir-polyfill": "^1.0.1", - "ini": "^1.3.4", - "is-windows": "^1.0.1", - "which": "^1.2.14" + "requires": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.3", + "set-function-length": "^1.2.0" }, - "engines": { - "node": ">=0.10.0" + "dependencies": { + "function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "dev": true + } } }, - "node_modules/global-prefix/node_modules/which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "camelcase": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", + "integrity": "sha512-DLIsRzJVBQu72meAKPkWQOLcujdXT32hwdfnkI1frSiSRMK1MofjKHf+MEx0SB6fjEFXL8fBDv1dKymBlOp4Qw==", + "dev": true + }, + "camelcase-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz", + "integrity": "sha512-bA/Z/DERHKqoEOrp+qeGKw1QlvEQkGZSc0XaY6VnTxZr+Kv1G5zFwttpjv8qxZ/sBPT4nthwZaAcsAZTJlSKXQ==", "dev": true, - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "which": "bin/which" + "requires": { + "camelcase": "^2.0.0", + "map-obj": "^1.0.0" } }, - "node_modules/grunt": { - "version": "1.5.3", - "resolved": "https://registry.npmjs.org/grunt/-/grunt-1.5.3.tgz", - "integrity": "sha512-mKwmo4X2d8/4c/BmcOETHek675uOqw0RuA/zy12jaspWqvTp4+ZeQF1W+OTpcbncnaBsfbQJ6l0l4j+Sn/GmaQ==", + "capture-stack-trace": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/capture-stack-trace/-/capture-stack-trace-1.0.2.tgz", + "integrity": "sha512-X/WM2UQs6VMHUtjUDnZTRI+i1crWteJySFzr9UpGoQa4WQffXVTTXuekjl7TjZRlcF2XfjgITT0HxZ9RnxeT0w==", "dev": true, - "dependencies": { - "dateformat": "~3.0.3", - "eventemitter2": "~0.4.13", - "exit": "~0.1.2", - "findup-sync": "~0.3.0", - "glob": "~7.1.6", - "grunt-cli": "~1.4.3", - "grunt-known-options": "~2.0.0", - "grunt-legacy-log": "~3.0.0", - "grunt-legacy-util": "~2.0.1", - "iconv-lite": "~0.4.13", - "js-yaml": "~3.14.0", - "minimatch": "~3.0.4", - "mkdirp": "~1.0.4", - "nopt": "~3.0.6", - "rimraf": "~3.0.2" - }, - "bin": { - "grunt": "bin/grunt" + "optional": true + }, + "caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==", + "dev": true, + "optional": true + }, + "caw": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/caw/-/caw-1.2.0.tgz", + "integrity": "sha512-GIAlMoessjWW8p0mkStU4kMvV35toVCAyOWhUajk7O0d7wJI8F9TDjfrkSoO26b0d1QsnDLmw5I3X+yd6OKorQ==", + "dev": true, + "optional": true, + "requires": { + "get-proxy": "^1.0.1", + "is-obj": "^1.0.0", + "object-assign": "^3.0.0", + "tunnel-agent": "^0.4.0" }, - "engines": { - "node": ">=8" + "dependencies": { + "object-assign": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-3.0.0.tgz", + "integrity": "sha512-jHP15vXVGeVh1HuaA2wY6lxk+whK/x4KBG88VXeRma7CCun7iGD5qPc4eYykQ9sdQvg8jkwFKsSxHln2ybW3xQ==", + "dev": true, + "optional": true + } } }, - "node_modules/grunt-cli": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/grunt-cli/-/grunt-cli-1.4.3.tgz", - "integrity": "sha512-9Dtx/AhVeB4LYzsViCjUQkd0Kw0McN2gYpdmGYKtE2a5Yt7v1Q+HYZVWhqXc/kGnxlMtqKDxSwotiGeFmkrCoQ==", + "center-align": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz", + "integrity": "sha512-Baz3aNe2gd2LP2qk5U+sDk/m4oSuwSDcBfayTCTBoWpfIGO5XFxPmjILQII4NGiZjD6DoDI6kf7gKaxkf7s3VQ==", "dev": true, - "dependencies": { - "grunt-known-options": "~2.0.0", - "interpret": "~1.1.0", - "liftup": "~3.0.1", - "nopt": "~4.0.1", - "v8flags": "~3.2.0" - }, - "bin": { - "grunt": "bin/grunt" - }, - "engines": { - "node": ">=10" + "requires": { + "align-text": "^0.1.3", + "lazy-cache": "^1.0.3" } }, - "node_modules/grunt-cli/node_modules/nopt": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-4.0.3.tgz", - "integrity": "sha512-CvaGwVMztSMJLOeXPrez7fyfObdZqNUK1cPAEzLHrTybIua9pMdmmPR5YwtfNftIOMv3DPUhFaxsZMNTQO20Kg==", + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, - "dependencies": { - "abbrev": "1", - "osenv": "^0.1.4" - }, - "bin": { - "nopt": "bin/nopt.js" + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" } }, - "node_modules/grunt-contrib-clean": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/grunt-contrib-clean/-/grunt-contrib-clean-1.0.0.tgz", - "integrity": "sha1-ay7ZQRfix//jLuBFeMlv5GJam20=", + "clap": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/clap/-/clap-1.2.3.tgz", + "integrity": "sha512-4CoL/A3hf90V3VIEjeuhSvlGFEHKzOz+Wfc2IVZc+FaUgU0ZQafJTP49fvnULipOPcAfqhyI2duwQyns6xqjYA==", "dev": true, - "dependencies": { - "async": "^1.5.2", - "rimraf": "^2.5.1" - }, - "engines": { - "node": ">= 0.10.0" + "optional": true, + "requires": { + "chalk": "^1.1.3" }, - "peerDependencies": { - "grunt": ">= 0.4.5" + "dependencies": { + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==", + "dev": true, + "optional": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==", + "dev": true, + "optional": true, + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==", + "dev": true, + "optional": true + } } }, - "node_modules/grunt-contrib-clean/node_modules/async": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", - "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", - "dev": true - }, - "node_modules/grunt-contrib-clean/node_modules/balanced-match": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", - "dev": true + "cli": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cli/-/cli-1.0.1.tgz", + "integrity": "sha512-41U72MB56TfUMGndAKK8vJ78eooOD4Z5NOL4xEfjc0c23s+6EYKXlXsmACBVclLP1yOfWCgEganVzddVrSNoTg==", + "requires": { + "exit": "0.1.2", + "glob": "^7.1.1" + } }, - "node_modules/grunt-contrib-clean/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "cliui": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz", + "integrity": "sha512-GIOYRizG+TGoc7Wgc1LiOTLare95R3mzKgoln+Q/lE4ceiYH19gUpl0l0Ffq4lJDEf3FxujMe6IBfOCs7pfqNA==", "dev": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "requires": { + "center-align": "^0.1.1", + "right-align": "^0.1.1", + "wordwrap": "0.0.2" } }, - "node_modules/grunt-contrib-clean/node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "clone": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", + "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", "dev": true }, - "node_modules/grunt-contrib-clean/node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "clone-stats": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-0.0.1.tgz", + "integrity": "sha512-dhUqc57gSMCo6TX85FLfe51eC/s+Im2MLkAgJwfaRRexR2tA4dd3eLEW4L6efzHc2iNorrRRXITifnDLlRrhaA==", "dev": true }, - "node_modules/grunt-contrib-clean/node_modules/glob": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", - "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", + "co": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/co/-/co-3.1.0.tgz", + "integrity": "sha512-CQsjCRiNObI8AtTsNIBDRMQ4oMR83CzEswHYahClvul7gKk+lDQiOKv+5qh7LQWf5sh6jkZNispz/QlsZxyNgA==", "dev": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - } + "optional": true }, - "node_modules/grunt-contrib-clean/node_modules/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "coa": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/coa/-/coa-1.0.4.tgz", + "integrity": "sha512-KAGck/eNAmCL0dcT3BiuYwLbExK6lduR8DxM3C1TyDzaXhZHyZ8ooX5I5+na2e3dPFuibfxrGdorr0/Lr7RYCQ==", "dev": true, - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" + "optional": true, + "requires": { + "q": "^1.1.2" } }, - "node_modules/grunt-contrib-clean/node_modules/inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "coffee-script": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/coffee-script/-/coffee-script-1.3.3.tgz", + "integrity": "sha512-QjQ1T4BqyHv19k6XSfdhy/QLlIOhywz0ekBUCa9h71zYMJlfDTGan/Z1JXzYkZ6v8R+GhvL/p4FZPbPW8WNXlg==", "dev": true }, - "node_modules/grunt-contrib-clean/node_modules/minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "dev": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/grunt-contrib-clean/node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, - "dependencies": { - "wrappy": "1" + "requires": { + "color-name": "~1.1.4" } }, - "node_modules/grunt-contrib-clean/node_modules/path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true }, - "node_modules/grunt-contrib-clean/node_modules/rimraf": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", - "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", + "color-support": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", + "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", "dev": true, - "dependencies": { - "glob": "^7.0.5" - }, - "bin": { - "rimraf": "bin.js" - } + "optional": true }, - "node_modules/grunt-contrib-clean/node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "colors": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.1.2.tgz", + "integrity": "sha512-ENwblkFQpqqia6b++zLD/KUWafYlVY/UNnAp7oz7LY7E924wmpye416wBOmvv/HMWzl8gL1kJlfvId/1Dg176w==", "dev": true }, - "node_modules/grunt-contrib-compress": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/grunt-contrib-compress/-/grunt-contrib-compress-1.3.0.tgz", - "integrity": "sha1-XlwmogBJCCPH93KIr9LXNQ2Vxj0=", - "dev": true, - "dependencies": { - "archiver": "^1.0.0", - "chalk": "^1.1.1", - "lodash": "^4.7.0", - "pretty-bytes": "^3.0.1", - "stream-buffers": "^2.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/grunt-contrib-compress/node_modules/ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", "dev": true, - "engines": { - "node": ">=0.10.0" + "optional": true, + "requires": { + "delayed-stream": "~1.0.0" } }, - "node_modules/grunt-contrib-compress/node_modules/ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "commander": { + "version": "2.13.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.13.0.tgz", + "integrity": "sha512-MVuS359B+YzaWqjCL/c+22gfryv+mCBPHAv3zyVI2GN8EY6IRP8VwtasXn8jyyhvvq84R4ImN1OKRtcbIasjYA==", "dev": true, - "engines": { - "node": ">=0.10.0" - } + "optional": true }, - "node_modules/grunt-contrib-compress/node_modules/archiver": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/archiver/-/archiver-1.3.0.tgz", - "integrity": "sha1-TyGU1tj5nfP1MeaIHxTxXVX6ryI=", + "compress-commons": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/compress-commons/-/compress-commons-1.2.2.tgz", + "integrity": "sha512-SLTU8iWWmcORfUN+4351Z2aZXKJe1tr0jSilPMCZlLPzpdTXnkBW1LevW/MfuANBKJek8Xu9ggqrtVmQrChLtg==", "dev": true, - "dependencies": { - "archiver-utils": "^1.3.0", - "async": "^2.0.0", + "requires": { "buffer-crc32": "^0.2.1", - "glob": "^7.0.0", - "lodash": "^4.8.0", - "readable-stream": "^2.0.0", - "tar-stream": "^1.5.0", - "walkdir": "^0.0.11", - "zip-stream": "^1.1.0" - }, - "engines": { - "node": ">= 0.10.0" - } - }, - "node_modules/grunt-contrib-compress/node_modules/archiver-utils": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/archiver-utils/-/archiver-utils-1.3.0.tgz", - "integrity": "sha1-5QtMCccL89aA4y/xt5lOn52JUXQ=", - "dev": true, - "dependencies": { - "glob": "^7.0.0", - "graceful-fs": "^4.1.0", - "lazystream": "^1.0.0", - "lodash": "^4.8.0", + "crc32-stream": "^2.0.0", "normalize-path": "^2.0.0", "readable-stream": "^2.0.0" }, - "engines": { - "node": ">= 0.10.0" - } - }, - "node_modules/grunt-contrib-compress/node_modules/async": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/async/-/async-2.6.0.tgz", - "integrity": "sha512-xAfGg1/NTLBBKlHFmnd7PlmUW9KhVQIUuSrYem9xzFUZy13ScvtyGGejaae9iAVRiRq9+Cx7DPFaAAhCpyxyPw==", - "dev": true, "dependencies": { - "lodash": "^4.14.0" + "readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + } } }, - "node_modules/grunt-contrib-compress/node_modules/balanced-match": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", - "dev": true - }, - "node_modules/grunt-contrib-compress/node_modules/bl": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/bl/-/bl-1.2.1.tgz", - "integrity": "sha1-ysMo977kVzDUBLaSID/LWQ4XLV4=", - "dev": true, - "dependencies": { - "readable-stream": "^2.0.5" - } + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" }, - "node_modules/grunt-contrib-compress/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + }, "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/grunt-contrib-compress/node_modules/buffer-crc32": { - "version": "0.2.13", - "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", - "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=", - "dev": true, - "engines": { - "node": "*" + "readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + } } }, - "node_modules/grunt-contrib-compress/node_modules/chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "console-browserify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.1.0.tgz", + "integrity": "sha512-duS7VP5pvfsNLDvL1O4VOEbw37AI3A4ZUQYemvDlnpGrNu9tprR7BYWpDYwC0Xia0Zxz5ZupdiIrUp0GH1aXfg==", "dev": true, - "dependencies": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" + "requires": { + "date-now": "^0.1.4" } }, - "node_modules/grunt-contrib-compress/node_modules/compress-commons": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/compress-commons/-/compress-commons-1.2.2.tgz", - "integrity": "sha1-UkqfEJA/OoEzibAiXSfEi7dRiQ8=", + "console-stream": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/console-stream/-/console-stream-0.1.1.tgz", + "integrity": "sha512-QC/8l9e6ofi6nqZ5PawlDgzmMw3OxIXtvolBzap/F4UDBJlDaZRSNbL/lb41C29FcbSJncBFlJFj2WJoNyZRfQ==", "dev": true, - "dependencies": { - "buffer-crc32": "^0.2.1", - "crc32-stream": "^2.0.0", - "normalize-path": "^2.0.0", - "readable-stream": "^2.0.0" - }, - "engines": { - "node": ">= 0.10.0" - } + "optional": true }, - "node_modules/grunt-contrib-compress/node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", "dev": true }, - "node_modules/grunt-contrib-compress/node_modules/core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", + "convert-source-map": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", "dev": true }, - "node_modules/grunt-contrib-compress/node_modules/crc": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/crc/-/crc-3.5.0.tgz", - "integrity": "sha1-mLi6fUiWZbo5efWbITgTdBAaGWQ=", + "core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", "dev": true }, - "node_modules/grunt-contrib-compress/node_modules/crc32-stream": { + "crc": { + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/crc/-/crc-3.8.0.tgz", + "integrity": "sha512-iX3mfgcTMIq3ZKLIsVFAbv7+Mc10kxabAGQb8HvjA1o3T1PIYprbakQ65d3I+2HGHt6nSKkM9PYjgoJO2KcFBQ==", + "dev": true, + "requires": { + "buffer": "^5.1.0" + } + }, + "crc32-stream": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/crc32-stream/-/crc32-stream-2.0.0.tgz", - "integrity": "sha1-483TtN8xaN10494/u8t7KX/pCPQ=", + "integrity": "sha512-UjZSqFCbn+jZUHJIh6Y3vMF7EJLcJWNm4tKDf2peJRwlZKHvkkvOMTvAei6zjU9gO1xONVr3rRFw0gixm2eUng==", "dev": true, - "dependencies": { + "requires": { "crc": "^3.4.4", "readable-stream": "^2.0.0" }, - "engines": { - "node": ">= 0.10.0" + "dependencies": { + "readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + } } }, - "node_modules/grunt-contrib-compress/node_modules/end-of-stream": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz", - "integrity": "sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==", + "create-error-class": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/create-error-class/-/create-error-class-3.0.2.tgz", + "integrity": "sha512-gYTKKexFO3kh200H1Nit76sRwRtOY32vQd3jpAQKpLtZqyNsSQNfI4N7o3eP2wUjV35pTWKRYqFUDBvUha/Pkw==", "dev": true, - "dependencies": { - "once": "^1.4.0" + "optional": true, + "requires": { + "capture-stack-trace": "^1.0.0" } }, - "node_modules/grunt-contrib-compress/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "cryptiles": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-2.0.5.tgz", + "integrity": "sha512-FFN5KwpvvQTTS5hWPxrU8/QE4kQUc6uwZcrnlMBN82t1MgAtq8mnoDwINBly9Tdr02seeIIhtdF+UH1feBYGog==", "dev": true, - "engines": { - "node": ">=0.8.0" + "optional": true, + "requires": { + "boom": "2.x.x" } }, - "node_modules/grunt-contrib-compress/node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", - "dev": true - }, - "node_modules/grunt-contrib-compress/node_modules/glob": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", - "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", + "csso": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/csso/-/csso-2.0.0.tgz", + "integrity": "sha512-tckZA0LhyEnToPoQDmncCA+TUS3aoIVl/MsSaoipR52Sfa+H83fJvIHRVOHMFn9zW6kIV1L0D7tUDFFjvN28lg==", "dev": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" + "optional": true, + "requires": { + "clap": "^1.0.9", + "source-map": "^0.5.3" }, - "engines": { - "node": "*" + "dependencies": { + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", + "dev": true, + "optional": true + } } }, - "node_modules/grunt-contrib-compress/node_modules/graceful-fs": { - "version": "4.1.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", - "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", + "currently-unhandled": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", + "integrity": "sha512-/fITjgjGU50vjQ4FH6eUoYu+iUoUKIXws2hL15JJpIR+BbTxaXQsMuuyjtNh2WqsSBS5nsaZHFsFecyw5CCAng==", "dev": true, - "engines": { - "node": ">=0.4.0" + "requires": { + "array-find-index": "^1.0.1" } }, - "node_modules/grunt-contrib-compress/node_modules/has-ansi": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", - "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", + "dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==", "dev": true, - "dependencies": { - "ansi-regex": "^2.0.0" + "optional": true, + "requires": { + "assert-plus": "^1.0.0" }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/grunt-contrib-compress/node_modules/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "dev": true, "dependencies": { - "once": "^1.3.0", - "wrappy": "1" + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==", + "dev": true, + "optional": true + } } }, - "node_modules/grunt-contrib-compress/node_modules/inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "date-now": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/date-now/-/date-now-0.1.4.tgz", + "integrity": "sha512-AsElvov3LoNB7tf5k37H2jYSB+ZZPMT5sG2QjJCcdlV5chIv6htBUBUui2IKRjgtKAKtCBN7Zbwa+MtwLjSeNw==", "dev": true }, - "node_modules/grunt-contrib-compress/node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dateformat": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-3.0.3.tgz", + "integrity": "sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q==", "dev": true }, - "node_modules/grunt-contrib-compress/node_modules/lazystream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.0.tgz", - "integrity": "sha1-9plf4PggOS9hOWvolGJAe7dxaOQ=", - "dev": true, - "dependencies": { - "readable-stream": "^2.0.5" - }, - "engines": { - "node": ">= 0.6.3" - } - }, - "node_modules/grunt-contrib-compress/node_modules/minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "debug": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", + "integrity": "sha512-X0rGvJcskG1c3TgSCPqHJ0XJgwlcvOC7elJ5Y0hYuKBZoVqWpAMfLOeIh2UI/DCQ5ruodIjvsugZtjUYUw2pUw==", "dev": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" + "requires": { + "ms": "0.7.1" } }, - "node_modules/grunt-contrib-compress/node_modules/normalize-path": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", - "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", - "dev": true, - "dependencies": { - "remove-trailing-separator": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } + "decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", + "dev": true }, - "node_modules/grunt-contrib-compress/node_modules/number-is-nan": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", - "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", + "decompress": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/decompress/-/decompress-3.0.0.tgz", + "integrity": "sha512-QCl8WTT4FSft5F+0M0InHKO6UYFfYhw5++vktTKpmUsQ6YUMPcBwMu7Sp3P0lMGk00hTNHohdhfdi9+OswLJuQ==", "dev": true, - "engines": { - "node": ">=0.10.0" + "optional": true, + "requires": { + "buffer-to-vinyl": "^1.0.0", + "concat-stream": "^1.4.6", + "decompress-tar": "^3.0.0", + "decompress-tarbz2": "^3.0.0", + "decompress-targz": "^3.0.0", + "decompress-unzip": "^3.0.0", + "stream-combiner2": "^1.1.1", + "vinyl-assign": "^1.0.1", + "vinyl-fs": "^2.2.0" } }, - "node_modules/grunt-contrib-compress/node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "decompress-tar": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/decompress-tar/-/decompress-tar-3.1.0.tgz", + "integrity": "sha512-YuF7b9jA2bnBhf0/HQ/5UDgX5Ogzw1xJz6mWOFRctyOcmZPjJx3jjde9tCBjysvYscutRTPi35Q20mPDA74SKQ==", "dev": true, + "optional": true, + "requires": { + "is-tar": "^1.0.0", + "object-assign": "^2.0.0", + "strip-dirs": "^1.0.0", + "tar-stream": "^1.1.1", + "through2": "^0.6.1", + "vinyl": "^0.4.3" + }, "dependencies": { - "wrappy": "1" + "clone": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/clone/-/clone-0.2.0.tgz", + "integrity": "sha512-g62n3Kb9cszeZvmvBUqP/dsEJD/+80pDA8u8KqHnAPrVnQ2Je9rVV6opxkhuWCd1kCn2gOibzDKxCtBvD3q5kA==", + "dev": true, + "optional": true + }, + "object-assign": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-2.1.1.tgz", + "integrity": "sha512-CdsOUYIh5wIiozhJ3rLQgmUTgcyzFwZZrqhkKhODMoGtPKM+wt0h0CNIoauJWMsS9822EdzPsF/6mb4nLvPN5g==", + "dev": true, + "optional": true + }, + "vinyl": { + "version": "0.4.6", + "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-0.4.6.tgz", + "integrity": "sha512-pmza4M5VA15HOImIQYWhoXGlGNafCm0QK5BpBUXkzzEwrRxKqBsbAhTfkT2zMcJhUX1G1Gkid0xaV8WjOl7DsA==", + "dev": true, + "optional": true, + "requires": { + "clone": "^0.2.0", + "clone-stats": "^0.0.1" + } + } } }, - "node_modules/grunt-contrib-compress/node_modules/path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "decompress-tarbz2": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/decompress-tarbz2/-/decompress-tarbz2-3.1.0.tgz", + "integrity": "sha512-UVCUT54LTEf8uqoytmEMVSwTVl/rZJ0o6bUJsJ7psRmICUzCsz9BJ31drbX0NtgwD9cFzIwKProa2yThmVBKvQ==", "dev": true, - "engines": { - "node": ">=0.10.0" + "optional": true, + "requires": { + "is-bzip2": "^1.0.0", + "object-assign": "^2.0.0", + "seek-bzip": "^1.0.3", + "strip-dirs": "^1.0.0", + "tar-stream": "^1.1.1", + "through2": "^0.6.1", + "vinyl": "^0.4.3" + }, + "dependencies": { + "clone": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/clone/-/clone-0.2.0.tgz", + "integrity": "sha512-g62n3Kb9cszeZvmvBUqP/dsEJD/+80pDA8u8KqHnAPrVnQ2Je9rVV6opxkhuWCd1kCn2gOibzDKxCtBvD3q5kA==", + "dev": true, + "optional": true + }, + "object-assign": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-2.1.1.tgz", + "integrity": "sha512-CdsOUYIh5wIiozhJ3rLQgmUTgcyzFwZZrqhkKhODMoGtPKM+wt0h0CNIoauJWMsS9822EdzPsF/6mb4nLvPN5g==", + "dev": true, + "optional": true + }, + "vinyl": { + "version": "0.4.6", + "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-0.4.6.tgz", + "integrity": "sha512-pmza4M5VA15HOImIQYWhoXGlGNafCm0QK5BpBUXkzzEwrRxKqBsbAhTfkT2zMcJhUX1G1Gkid0xaV8WjOl7DsA==", + "dev": true, + "optional": true, + "requires": { + "clone": "^0.2.0", + "clone-stats": "^0.0.1" + } + } } }, - "node_modules/grunt-contrib-compress/node_modules/pretty-bytes": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-3.0.1.tgz", - "integrity": "sha1-J9AAjXeAY6C0gRuzXHnxvV1fvM8=", + "decompress-targz": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/decompress-targz/-/decompress-targz-3.1.0.tgz", + "integrity": "sha512-umeSWvrmd9/qcmGaf0oAc+Gx7La0B4Uxo+HXoo0HqrjEbCzn7SMiWvmE5sS56B+GqaoJ8z64ORZCRaOzKCYi/w==", "dev": true, - "dependencies": { - "number-is-nan": "^1.0.0" + "optional": true, + "requires": { + "is-gzip": "^1.0.0", + "object-assign": "^2.0.0", + "strip-dirs": "^1.0.0", + "tar-stream": "^1.1.1", + "through2": "^0.6.1", + "vinyl": "^0.4.3" }, - "engines": { - "node": ">=0.10.0" + "dependencies": { + "clone": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/clone/-/clone-0.2.0.tgz", + "integrity": "sha512-g62n3Kb9cszeZvmvBUqP/dsEJD/+80pDA8u8KqHnAPrVnQ2Je9rVV6opxkhuWCd1kCn2gOibzDKxCtBvD3q5kA==", + "dev": true, + "optional": true + }, + "object-assign": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-2.1.1.tgz", + "integrity": "sha512-CdsOUYIh5wIiozhJ3rLQgmUTgcyzFwZZrqhkKhODMoGtPKM+wt0h0CNIoauJWMsS9822EdzPsF/6mb4nLvPN5g==", + "dev": true, + "optional": true + }, + "vinyl": { + "version": "0.4.6", + "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-0.4.6.tgz", + "integrity": "sha512-pmza4M5VA15HOImIQYWhoXGlGNafCm0QK5BpBUXkzzEwrRxKqBsbAhTfkT2zMcJhUX1G1Gkid0xaV8WjOl7DsA==", + "dev": true, + "optional": true, + "requires": { + "clone": "^0.2.0", + "clone-stats": "^0.0.1" + } + } } }, - "node_modules/grunt-contrib-compress/node_modules/process-nextick-args": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", - "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==", - "dev": true - }, - "node_modules/grunt-contrib-compress/node_modules/readable-stream": { - "version": "2.3.4", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.4.tgz", - "integrity": "sha512-vuYxeWYM+fde14+rajzqgeohAI7YoJcHE7kXDAc4Nk0EbuKnJfqtY9YtRkLo/tqkuF7MsBQRhPnPeyjYITp3ZQ==", + "decompress-unzip": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/decompress-unzip/-/decompress-unzip-3.4.0.tgz", + "integrity": "sha512-rclee6Q/+aChW77vbHmtGNZi3ko1Qhsp9Brs5mVyhBSeg+K4n+6MHo47y/+7GsmYZuEqVJ46LjwT3/N8N50jZQ==", "dev": true, + "optional": true, + "requires": { + "is-zip": "^1.0.0", + "read-all-stream": "^3.0.0", + "stat-mode": "^0.2.0", + "strip-dirs": "^1.0.0", + "through2": "^2.0.0", + "vinyl": "^1.0.0", + "yauzl": "^2.2.1" + }, "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.0.3", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/grunt-contrib-compress/node_modules/safe-buffer": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", - "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==", - "dev": true - }, - "node_modules/grunt-contrib-compress/node_modules/stream-buffers": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/stream-buffers/-/stream-buffers-2.2.0.tgz", - "integrity": "sha1-kdX1Ew0c75bc+n9yaUUYh0HQnuQ=", - "dev": true, - "engines": { - "node": ">= 0.10.0" + "readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dev": true, + "optional": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true, + "optional": true + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "optional": true, + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "dev": true, + "optional": true, + "requires": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + } } }, - "node_modules/grunt-contrib-compress/node_modules/string_decoder": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", - "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", + "deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", "dev": true, - "dependencies": { - "safe-buffer": "~5.1.0" - } + "optional": true }, - "node_modules/grunt-contrib-compress/node_modules/strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "define-data-property": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.2.tgz", + "integrity": "sha512-SRtsSqsDbgpJBbW3pABMCOt6rQyeM8s8RiyeSN8jYG8sYmt/kGJejbydttUsnDs1tadr19tvhT4ShwMyoqAm4g==", "dev": true, - "dependencies": { - "ansi-regex": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" + "requires": { + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.2", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.1" } }, - "node_modules/grunt-contrib-compress/node_modules/supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "define-properties": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", "dev": true, - "engines": { - "node": ">=0.8.0" + "requires": { + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" } }, - "node_modules/grunt-contrib-compress/node_modules/tar-stream": { - "version": "1.5.5", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-1.5.5.tgz", - "integrity": "sha512-mQdgLPc/Vjfr3VWqWbfxW8yQNiJCbAZ+Gf6GDu1Cy0bdb33ofyiNGBtAY96jHFhDuivCwgW1H9DgTON+INiXgg==", + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", "dev": true, - "dependencies": { - "bl": "^1.0.0", - "end-of-stream": "^1.0.0", - "readable-stream": "^2.0.0", - "xtend": "^4.0.0" - }, - "engines": { - "node": ">= 0.8.0" - } + "optional": true }, - "node_modules/grunt-contrib-compress/node_modules/util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", "dev": true }, - "node_modules/grunt-contrib-compress/node_modules/walkdir": { - "version": "0.0.11", - "resolved": "https://registry.npmjs.org/walkdir/-/walkdir-0.0.11.tgz", - "integrity": "sha1-oW0CXrkxvQO1LzCMrtD0D86+lTI=", - "dev": true, - "engines": { - "node": ">=0.6.0" - } - }, - "node_modules/grunt-contrib-compress/node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "detect-file": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz", + "integrity": "sha512-DtCOLG98P007x7wiiOmfI0fi3eIKyWiLTGJ2MDnVi/E04lWGbf+JzrRHMm0rgIIZJGtHpKpbVgLWHrv8xXpc3Q==", "dev": true }, - "node_modules/grunt-contrib-compress/node_modules/xtend": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", - "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=", - "dev": true, - "engines": { - "node": ">=0.4" - } - }, - "node_modules/grunt-contrib-compress/node_modules/zip-stream": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/zip-stream/-/zip-stream-1.2.0.tgz", - "integrity": "sha1-qLxF9MG0lpnGuQGYuqyqzbzUugQ=", + "dom-serializer": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz", + "integrity": "sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==", "dev": true, - "dependencies": { - "archiver-utils": "^1.3.0", - "compress-commons": "^1.2.0", - "lodash": "^4.8.0", - "readable-stream": "^2.0.0" + "requires": { + "domelementtype": "^2.0.1", + "entities": "^2.0.0" }, - "engines": { - "node": ">= 0.10.0" - } - }, - "node_modules/grunt-contrib-concat": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/grunt-contrib-concat/-/grunt-contrib-concat-1.0.1.tgz", - "integrity": "sha1-YVCYYwhOhx1+ht5IwBUlntl3Rb0=", - "dev": true, "dependencies": { - "chalk": "^1.0.0", - "source-map": "^0.5.3" - }, - "engines": { - "node": ">=0.10.0" - }, - "peerDependencies": { - "grunt": ">=0.4.0" + "domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", + "dev": true + }, + "entities": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", + "dev": true + } } }, - "node_modules/grunt-contrib-concat/node_modules/ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "domelementtype": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", + "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==", + "dev": true + }, + "domhandler": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.3.0.tgz", + "integrity": "sha512-q9bUwjfp7Eif8jWxxxPSykdRZAb6GkguBGSgvvCrhI9wB71W2K/Kvv4E61CF/mcCfnVJDeDWx/Vb/uAqbDj6UQ==", "dev": true, - "engines": { - "node": ">=0.10.0" + "requires": { + "domelementtype": "1" } }, - "node_modules/grunt-contrib-concat/node_modules/ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "domutils": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz", + "integrity": "sha512-gSu5Oi/I+3wDENBsOWBiRK1eoGxcywYSqg3rR960/+EfY0CF4EX1VPkgHOZ3WiS/Jg2DtliF6BhWcHlfpYUcGw==", "dev": true, - "engines": { - "node": ">=0.10.0" + "requires": { + "dom-serializer": "0", + "domelementtype": "1" } }, - "node_modules/grunt-contrib-concat/node_modules/chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "download": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/download/-/download-4.4.3.tgz", + "integrity": "sha512-yOTsksXxUQ9b/p/HA3g9L97JZThcAKq8v3+Afwhf/kIoV0spu6pOvj+OKQbyGKYAwBGqSPbO+x1pCFSg5ce9OA==", "dev": true, - "dependencies": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" + "optional": true, + "requires": { + "caw": "^1.0.1", + "concat-stream": "^1.4.7", + "each-async": "^1.0.0", + "filenamify": "^1.0.1", + "got": "^5.0.0", + "gulp-decompress": "^1.2.0", + "gulp-rename": "^1.2.0", + "is-url": "^1.2.0", + "object-assign": "^4.0.1", + "read-all-stream": "^3.0.0", + "readable-stream": "^2.0.2", + "stream-combiner2": "^1.1.1", + "vinyl": "^1.0.0", + "vinyl-fs": "^2.2.0", + "ware": "^1.2.0" }, - "engines": { - "node": ">=0.10.0" + "dependencies": { + "readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dev": true, + "optional": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true, + "optional": true + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "optional": true, + "requires": { + "safe-buffer": "~5.1.0" + } + } } }, - "node_modules/grunt-contrib-concat/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "duplexer2": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz", + "integrity": "sha512-asLFVfWWtJ90ZyOUHMqk7/S2w2guQKxUI2itj3d92ADHhxUSbCMGi1f1cBcJ7xM1To+pE/Khbwo1yuNbMEPKeA==", "dev": true, - "engines": { - "node": ">=0.8.0" + "requires": { + "readable-stream": "^2.0.2" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + } } }, - "node_modules/grunt-contrib-concat/node_modules/has-ansi": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", - "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", + "duplexify": { + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", + "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", "dev": true, - "dependencies": { - "ansi-regex": "^2.0.0" + "requires": { + "end-of-stream": "^1.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.0.0", + "stream-shift": "^1.0.0" }, - "engines": { - "node": ">=0.10.0" + "dependencies": { + "readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + } } }, - "node_modules/grunt-contrib-concat/node_modules/source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "each-async": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/each-async/-/each-async-1.1.1.tgz", + "integrity": "sha512-0hJGub96skwr+sUojv7zQ0kc9i4jn3SwLiLk8Jr7KDz7aaaMzkN5UX3a/9ZhzC0OfZVyXHhlHcjC0KVOiKZ+HQ==", "dev": true, - "engines": { - "node": ">=0.10.0" + "optional": true, + "requires": { + "onetime": "^1.0.0", + "set-immediate-shim": "^1.0.0" } }, - "node_modules/grunt-contrib-concat/node_modules/strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "ecc-jsbn": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", + "integrity": "sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==", "dev": true, - "dependencies": { - "ansi-regex": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" + "optional": true, + "requires": { + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" } }, - "node_modules/grunt-contrib-concat/node_modules/supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true, - "engines": { - "node": ">=0.8.0" - } + "ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", + "dev": true }, - "node_modules/grunt-contrib-copy": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/grunt-contrib-copy/-/grunt-contrib-copy-1.0.0.tgz", - "integrity": "sha1-cGDGWB6QS4qw0A8HbgqPbj58NXM=", + "encoding": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", + "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", "dev": true, - "dependencies": { - "chalk": "^1.1.1", - "file-sync-cmp": "^0.1.0" + "requires": { + "iconv-lite": "^0.6.2" }, - "engines": { - "node": ">=0.10.0" + "dependencies": { + "iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dev": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + } + } } }, - "node_modules/grunt-contrib-copy/node_modules/ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", "dev": true, - "engines": { - "node": ">=0.10.0" + "requires": { + "once": "^1.4.0" } }, - "node_modules/grunt-contrib-copy/node_modules/ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "entities": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-1.0.0.tgz", + "integrity": "sha512-LbLqfXgJMmy81t+7c14mnulFHJ170cM6E+0vMXR9k/ZiZwgX8i5pNgjTCX3SO4VeUsFLV+8InixoretwU+MjBQ==", + "dev": true + }, + "errno": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.8.tgz", + "integrity": "sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==", "dev": true, - "engines": { - "node": ">=0.10.0" + "optional": true, + "requires": { + "prr": "~1.0.1" } }, - "node_modules/grunt-contrib-copy/node_modules/chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", "dev": true, - "dependencies": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" + "requires": { + "is-arrayish": "^0.2.1" } }, - "node_modules/grunt-contrib-copy/node_modules/escape-string-regexp": { + "es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "dev": true + }, + "escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", - "dev": true, - "engines": { - "node": ">=0.8.0" - } + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true }, - "node_modules/grunt-contrib-copy/node_modules/file-sync-cmp": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/file-sync-cmp/-/file-sync-cmp-0.1.1.tgz", - "integrity": "sha1-peeo/7+kk7Q7kju9TKiaU7Y7YSs=", + "esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", "dev": true }, - "node_modules/grunt-contrib-copy/node_modules/has-ansi": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", - "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", + "eventemitter2": { + "version": "0.4.14", + "resolved": "https://registry.npmjs.org/eventemitter2/-/eventemitter2-0.4.14.tgz", + "integrity": "sha512-K7J4xq5xAD5jHsGM5ReWXRTFa3JRGofHiMcVgQ8PRwgWxzjHpMWCIzsmyf60+mh8KLsqYPcjUMa0AC4hd6lPyQ==", + "dev": true + }, + "exec-buffer": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/exec-buffer/-/exec-buffer-2.0.1.tgz", + "integrity": "sha512-or7SADjL54VpD0Z3mzsJ6LpSLiqy1VLeAuamwa4k1gXVJCKY+5Y2H+DTgAru5UuEzmN2RqiHHGTEjzT5YLnE/A==", "dev": true, - "dependencies": { - "ansi-regex": "^2.0.0" + "optional": true, + "requires": { + "rimraf": "^2.2.6", + "tempfile": "^1.0.0" }, - "engines": { - "node": ">=0.10.0" + "dependencies": { + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dev": true, + "optional": true, + "requires": { + "glob": "^7.1.3" + } + } } }, - "node_modules/grunt-contrib-copy/node_modules/strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "exec-series": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/exec-series/-/exec-series-1.0.3.tgz", + "integrity": "sha512-VkmGmKa4oWkVBcPPfSzOEmry9ELWKk4oodvXpmtYmvGD82k/TnT0CGNw9VoxQLYGwNJR6fIaXpHUhBm4tNTSMQ==", "dev": true, - "dependencies": { - "ansi-regex": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" + "optional": true, + "requires": { + "async-each-series": "^1.1.0", + "object-assign": "^4.1.0" } }, - "node_modules/grunt-contrib-copy/node_modules/supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "executable": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/executable/-/executable-1.1.0.tgz", + "integrity": "sha512-qZLuUgqTqYRLdF8Gl56y/JhT+X15uPX6y0Vpmj0cF4SCwbswBPc6yxzr1nClQa+SwRQ5Sk9+Mxa3ZBX9t6aWzg==", "dev": true, - "engines": { - "node": ">=0.8.0" + "optional": true, + "requires": { + "meow": "^3.1.0" } }, - "node_modules/grunt-contrib-imagemin": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/grunt-contrib-imagemin/-/grunt-contrib-imagemin-1.0.1.tgz", - "integrity": "sha1-5Ho1YTN29MqpwfkERlA8rhyUTXk=", - "dev": true, - "dependencies": { - "async": "^1.5.2", - "chalk": "^1.0.0", - "gulp-rename": "^1.2.0", - "imagemin": "^4.0.0", - "pretty-bytes": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } + "exit": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", + "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==" }, - "node_modules/grunt-contrib-imagemin/node_modules/ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "expand-brackets": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", + "integrity": "sha512-hxx03P2dJxss6ceIeri9cmYOT4SRs3Zk3afZwWpOsRqLqprhTR8u++SlC+sFGsQr7WGFPdMF7Gjc1njDLDK6UA==", "dev": true, - "engines": { - "node": ">=0.10.0" + "requires": { + "is-posix-bracket": "^0.1.0" } }, - "node_modules/grunt-contrib-imagemin/node_modules/ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "expand-range": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz", + "integrity": "sha512-AFASGfIlnIbkKPQwX1yHaDjFvh/1gyKJODme52V6IORh69uEYgZp0o9C+qsIGNVEiuuhQU0CSSl++Rlegg1qvA==", "dev": true, - "engines": { - "node": ">=0.10.0" + "requires": { + "fill-range": "^2.1.0" + }, + "dependencies": { + "fill-range": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.4.tgz", + "integrity": "sha512-cnrcCbj01+j2gTG921VZPnHbjmdAf8oQV/iGeV2kZxGSyfYjjTyY79ErsK1WJWMpw6DaApEX72binqJE+/d+5Q==", + "dev": true, + "requires": { + "is-number": "^2.1.0", + "isobject": "^2.0.0", + "randomatic": "^3.0.0", + "repeat-element": "^1.1.2", + "repeat-string": "^1.5.2" + } + }, + "is-number": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz", + "integrity": "sha512-QUzH43Gfb9+5yckcrSA0VBDwEtDUchrk4F6tfJZQuNzDJbEDB9cZNzSfXGQ1jqmdDY/kl41lUOWM9syA8z8jlg==", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + } + }, + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha512-+OUdGJlgjOBZDfxnDjYYG6zp487z0JGNQq3cYQYg5f5hKR+syHMsaztzGeml/4kGG55CSpKSpWTY+jYGgsHLgA==", + "dev": true, + "requires": { + "isarray": "1.0.0" + } + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } } }, - "node_modules/grunt-contrib-imagemin/node_modules/archive-type": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/archive-type/-/archive-type-3.2.0.tgz", - "integrity": "sha1-nNnABpV+vpX62tW9YJiUKoE3N/Y=", + "expand-tilde": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", + "integrity": "sha512-A5EmesHW6rfnZ9ysHQjPdJRni0SRar0tjtG5MNtm9n5TUvsYU8oozprtRD4AqHxcZWWlVuAmQo2nWKfN9oyjTw==", "dev": true, - "optional": true, - "dependencies": { - "file-type": "^3.1.0" - }, - "engines": { - "node": ">=0.10.0" + "requires": { + "homedir-polyfill": "^1.0.1" } }, - "node_modules/grunt-contrib-imagemin/node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "dev": true + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", "dev": true, - "optional": true, - "dependencies": { - "sprintf-js": "~1.0.2" + "requires": { + "is-extendable": "^0.1.0" } }, - "node_modules/grunt-contrib-imagemin/node_modules/arr-diff": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", - "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", + "extglob": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", + "integrity": "sha512-1FOj1LOwn42TMrruOHGt18HemVnbwAmAak7krWk+wa93KXxGbK+2jpezm+ytJYDaBX0/SPLZFHKM7m+tKobWGg==", "dev": true, - "dependencies": { - "arr-flatten": "^1.0.1" + "requires": { + "is-extglob": "^1.0.0" }, - "engines": { - "node": ">=0.10.0" + "dependencies": { + "is-extglob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", + "integrity": "sha512-7Q+VbVafe6x2T+Tu6NcOf6sRklazEPmBoB3IWk3WdGZM2iGUwU/Oe3Wtq5lSEkDTTlpp8yx+5t4pzO/i9Ty1ww==", + "dev": true + } } }, - "node_modules/grunt-contrib-imagemin/node_modules/arr-flatten": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", - "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", + "extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==", "dev": true, - "engines": { - "node": ">=0.10.0" - } + "optional": true }, - "node_modules/grunt-contrib-imagemin/node_modules/array-differ": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/array-differ/-/array-differ-1.0.0.tgz", - "integrity": "sha1-7/UuN1gknTO+QCuLuOVkuytdQDE=", + "fancy-log": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/fancy-log/-/fancy-log-1.3.3.tgz", + "integrity": "sha512-k9oEhlyc0FrVh25qYuSELjr8oxsCoc4/LEZfg2iJJrfEk/tZL9bCoJE47gqAvI2m/AUjluCS4+3I0eTx8n3AEw==", "dev": true, "optional": true, - "engines": { - "node": ">=0.10.0" + "requires": { + "ansi-gray": "^0.1.1", + "color-support": "^1.1.3", + "parse-node-version": "^1.0.0", + "time-stamp": "^1.0.0" } }, - "node_modules/grunt-contrib-imagemin/node_modules/array-find-index": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz", - "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=", + "faye-websocket": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.10.0.tgz", + "integrity": "sha512-Xhj93RXbMSq8urNCUq4p9l0P6hnySJ/7YNRhYNug0bLOuii7pKO7xQFb5mx9xZXWCar88pLPb805PvUkwrLZpQ==", "dev": true, - "optional": true, - "engines": { - "node": ">=0.10.0" + "requires": { + "websocket-driver": ">=0.5.1" } }, - "node_modules/grunt-contrib-imagemin/node_modules/array-uniq": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", - "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=", + "fd-slicer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", + "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==", "dev": true, "optional": true, - "engines": { - "node": ">=0.10.0" + "requires": { + "pend": "~1.2.0" } }, - "node_modules/grunt-contrib-imagemin/node_modules/array-unique": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", - "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=", + "figures": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz", + "integrity": "sha512-UxKlfCRuCBxSXU4C6t9scbDyWZ4VlaFFdojKtzJuSkuOBQ5CNFum+zZXFwHjo+CxBC1t6zlYPgHIgFjL8ggoEQ==", "dev": true, - "engines": { - "node": ">=0.10.0" + "requires": { + "escape-string-regexp": "^1.0.5", + "object-assign": "^4.1.0" } }, - "node_modules/grunt-contrib-imagemin/node_modules/async": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", - "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", + "file-sync-cmp": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/file-sync-cmp/-/file-sync-cmp-0.1.1.tgz", + "integrity": "sha512-0k45oWBokCqh2MOexeYKpyqmGKG+8mQ2Wd8iawx+uWd/weWJQAZ6SoPybagdCI4xFisag8iAR77WPm4h3pTfxA==", "dev": true }, - "node_modules/grunt-contrib-imagemin/node_modules/async-each-series": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/async-each-series/-/async-each-series-1.1.0.tgz", - "integrity": "sha1-9C/YFV048hpbjqB8KOBj7RcAsTg=", - "dev": true, - "optional": true, - "engines": { - "node": ">=0.8.0" - } + "file-type": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/file-type/-/file-type-3.9.0.tgz", + "integrity": "sha512-RLoqTXE8/vPmMuTI88DAzhMYC99I8BWv7zYP4A1puo5HIjEJ5EX48ighy4ZyKMG9EDXxBgW6e++cn7d1xuFghA==", + "dev": true }, - "node_modules/grunt-contrib-imagemin/node_modules/balanced-match": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", + "filename-regex": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz", + "integrity": "sha512-BTCqyBaWBTsauvnHiE8i562+EdJj+oUpkqWp2R1iCoR8f6oo8STRu3of7WJJ0TqWtxN50a5YFpzYK4Jj9esYfQ==", "dev": true }, - "node_modules/grunt-contrib-imagemin/node_modules/beeper": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/beeper/-/beeper-1.1.1.tgz", - "integrity": "sha1-5tXqjF2tABMEpwsiY4RH9pyy+Ak=", + "filename-reserved-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/filename-reserved-regex/-/filename-reserved-regex-1.0.0.tgz", + "integrity": "sha512-UZArj7+U+2reBBVCvVmRlyq9D7EYQdUtuNN+1iz7pF1jGcJ2L0TjiRCxsTZfj2xFbM4c25uGCUDpKTHA7L2TKg==", "dev": true, - "optional": true, - "engines": { - "node": ">=0.10.0" - } + "optional": true }, - "node_modules/grunt-contrib-imagemin/node_modules/bin-build": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/bin-build/-/bin-build-2.2.0.tgz", - "integrity": "sha1-EfjdYfcP/Por3KpbRvXo/t1CIcw=", + "filenamify": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/filenamify/-/filenamify-1.2.1.tgz", + "integrity": "sha512-DKVP0WQcB7WaIMSwDETqImRej2fepPqvXQjaVib7LRZn9Rxn5UbvK2tYTqGf1A1DkIprQQkG4XSQXSOZp7Q3GQ==", "dev": true, "optional": true, - "dependencies": { - "archive-type": "^3.0.1", - "decompress": "^3.0.0", - "download": "^4.1.2", - "exec-series": "^1.0.0", - "rimraf": "^2.2.6", - "tempfile": "^1.0.0", - "url-regex": "^3.0.0" - }, - "engines": { - "node": ">=0.10.0" + "requires": { + "filename-reserved-regex": "^1.0.0", + "strip-outer": "^1.0.0", + "trim-repeated": "^1.0.0" } }, - "node_modules/grunt-contrib-imagemin/node_modules/bin-check": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/bin-check/-/bin-check-2.0.0.tgz", - "integrity": "sha1-hvjm9CU4k99g3DFpV/WvAqywWTA=", + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", "dev": true, - "optional": true, - "dependencies": { - "executable": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" + "requires": { + "to-regex-range": "^5.0.1" } }, - "node_modules/grunt-contrib-imagemin/node_modules/bin-version": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/bin-version/-/bin-version-1.0.4.tgz", - "integrity": "sha1-nrSY7m/Xb3q5p8FgQ2+JV5Q1144=", + "find-up": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", + "integrity": "sha512-jvElSjyuo4EMQGoTwo1uJU5pQMwTW5lS1x05zzfJuTIyLR3zwO27LYrxNg+dlvKpGOuGy/MzBdXh80g0ve5+HA==", "dev": true, - "optional": true, - "dependencies": { - "find-versions": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" + "requires": { + "path-exists": "^2.0.0", + "pinkie-promise": "^2.0.0" } }, - "node_modules/grunt-contrib-imagemin/node_modules/bin-version-check": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/bin-version-check/-/bin-version-check-2.1.0.tgz", - "integrity": "sha1-5OXfKQuQaffRETJAMe/BP90RpbA=", + "find-versions": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/find-versions/-/find-versions-1.2.1.tgz", + "integrity": "sha512-t0ciYD8XnoFVirFJN2niUJAQ/kyZU5UDSJobyekmiMPCBsYsWd4nd75e7HU2Xf4m+1Y7iLEo3fovNRNIV5MaDQ==", "dev": true, "optional": true, - "dependencies": { - "bin-version": "^1.0.0", - "minimist": "^1.1.0", - "semver": "^4.0.3", - "semver-truncate": "^1.0.0" - }, - "bin": { - "bin-version-check": "cli.js" - }, - "engines": { - "node": ">=0.10.0" + "requires": { + "array-uniq": "^1.0.0", + "get-stdin": "^4.0.1", + "meow": "^3.5.0", + "semver-regex": "^1.0.0" } }, - "node_modules/grunt-contrib-imagemin/node_modules/bin-version-check/node_modules/semver": { - "version": "4.3.6", - "resolved": "https://registry.npmjs.org/semver/-/semver-4.3.6.tgz", - "integrity": "sha1-MAvG4OhjdPe6YQaLWx7NV/xlMto=", + "findup-sync": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-0.3.0.tgz", + "integrity": "sha512-z8Nrwhi6wzxNMIbxlrTzuUW6KWuKkogZ/7OdDVq+0+kxn77KUH1nipx8iU6suqkHqc4y6n7a9A8IpmxY/pTjWg==", "dev": true, - "optional": true, - "bin": { - "semver": "bin/semver" + "requires": { + "glob": "~5.0.0" + }, + "dependencies": { + "glob": { + "version": "5.0.15", + "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz", + "integrity": "sha512-c9IPMazfRITpmAAKi22dK1VKxGDX9ehhqfABDriL/lzO92xcUKEJPQHrVA/2YHSNFB4iFlykVmWvwo48nr3OxA==", + "dev": true, + "requires": { + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "2 || 3", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + } } }, - "node_modules/grunt-contrib-imagemin/node_modules/bin-wrapper": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/bin-wrapper/-/bin-wrapper-3.0.2.tgz", - "integrity": "sha1-Z9MwYmLksaXy+I7iNGT2plVneus=", + "fined": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/fined/-/fined-1.2.0.tgz", + "integrity": "sha512-ZYDqPLGxDkDhDZBjZBb+oD1+j0rA4E0pXY50eplAAOPg2N/gUBSSk5IM1/QhPfyVo19lJ+CvXpqfvk+b2p/8Ng==", "dev": true, - "optional": true, - "dependencies": { - "bin-check": "^2.0.0", - "bin-version-check": "^2.1.0", - "download": "^4.0.0", - "each-async": "^1.1.1", - "lazy-req": "^1.0.0", - "os-filter-obj": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" + "requires": { + "expand-tilde": "^2.0.2", + "is-plain-object": "^2.0.3", + "object.defaults": "^1.1.0", + "object.pick": "^1.2.0", + "parse-filepath": "^1.0.1" } }, - "node_modules/grunt-contrib-imagemin/node_modules/bl": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/bl/-/bl-1.2.1.tgz", - "integrity": "sha1-ysMo977kVzDUBLaSID/LWQ4XLV4=", - "dev": true, - "optional": true, - "dependencies": { - "readable-stream": "^2.0.5" - } - }, - "node_modules/grunt-contrib-imagemin/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/grunt-contrib-imagemin/node_modules/braces": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", - "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", - "dev": true, - "dependencies": { - "expand-range": "^1.8.1", - "preserve": "^0.2.0", - "repeat-element": "^1.1.2" - }, - "engines": { - "node": ">=0.10.0" - } + "first-chunk-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/first-chunk-stream/-/first-chunk-stream-1.0.0.tgz", + "integrity": "sha512-ArRi5axuv66gEsyl3UuK80CzW7t56hem73YGNYxNWTGNKFJUadSb9Gu9SHijYEUi8ulQMf1bJomYNwSCPHhtTQ==", + "dev": true }, - "node_modules/grunt-contrib-imagemin/node_modules/buffer-crc32": { - "version": "0.2.13", - "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", - "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=", - "dev": true, - "optional": true, - "engines": { - "node": "*" - } + "flagged-respawn": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/flagged-respawn/-/flagged-respawn-1.0.1.tgz", + "integrity": "sha512-lNaHNVymajmk0OJMBn8fVUAU1BtDeKIqKoVhk4xAALB57aALg6b4W0MfJ/cUE0g9YBXy5XhSlPIpYIJ7HaY/3Q==", + "dev": true }, - "node_modules/grunt-contrib-imagemin/node_modules/buffer-to-vinyl": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/buffer-to-vinyl/-/buffer-to-vinyl-1.1.0.tgz", - "integrity": "sha1-APFfruOreh3aLN5tkSG//dB7ImI=", - "dev": true, - "dependencies": { - "file-type": "^3.1.0", - "readable-stream": "^2.0.2", - "uuid": "^2.0.1", - "vinyl": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } + "for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ==", + "dev": true }, - "node_modules/grunt-contrib-imagemin/node_modules/builtin-modules": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", - "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", + "for-own": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/for-own/-/for-own-1.0.0.tgz", + "integrity": "sha512-0OABksIGrxKK8K4kynWkQ7y1zounQxP+CWnyclVwj81KW3vlLlGUx57DKGcP/LH216GzqnstnPocF16Nxs0Ycg==", "dev": true, - "optional": true, - "engines": { - "node": ">=0.10.0" + "requires": { + "for-in": "^1.0.1" } }, - "node_modules/grunt-contrib-imagemin/node_modules/camelcase": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", - "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=", + "forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==", "dev": true, - "optional": true, - "engines": { - "node": ">=0.10.0" - } + "optional": true }, - "node_modules/grunt-contrib-imagemin/node_modules/camelcase-keys": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz", - "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=", + "form-data": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.1.4.tgz", + "integrity": "sha512-8HWGSLAPr+AG0hBpsqi5Ob8HrLStN/LWeqhpFl14d7FJgHK48TmgLoALPz69XSUR65YJzDfLUX/BM8+MLJLghQ==", "dev": true, "optional": true, - "dependencies": { - "camelcase": "^2.0.0", - "map-obj": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.5", + "mime-types": "^2.1.12" } }, - "node_modules/grunt-contrib-imagemin/node_modules/capture-stack-trace": { + "fs-constants": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/capture-stack-trace/-/capture-stack-trace-1.0.0.tgz", - "integrity": "sha1-Sm+gc5nCa7pH8LJJa00PtAjFVQ0=", - "dev": true, - "optional": true, - "engines": { - "node": ">=0.10.0" - } + "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", + "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", + "dev": true }, - "node_modules/grunt-contrib-imagemin/node_modules/caw": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/caw/-/caw-1.2.0.tgz", - "integrity": "sha1-/7Im/n78VHKI3GLuPpcHPCEtEDQ=", - "dev": true, - "optional": true, - "dependencies": { - "get-proxy": "^1.0.1", - "is-obj": "^1.0.0", - "object-assign": "^3.0.0", - "tunnel-agent": "^0.4.0" - }, - "engines": { - "node": ">=0.10.0" - } + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" }, - "node_modules/grunt-contrib-imagemin/node_modules/caw/node_modules/object-assign": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-3.0.0.tgz", - "integrity": "sha1-m+3VygiXlJvKR+f/QIBi1Un1h/I=", + "gaze": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/gaze/-/gaze-1.1.2.tgz", + "integrity": "sha512-38Jtqi8EsWt2l0x6iiL1NWN3/llOwWEv0NC3HGb/gPHLJkLq0N2c/TtuLrSfRXHwV6VkYmxAJj9YBdF33Et5hg==", "dev": true, - "optional": true, - "engines": { - "node": ">=0.10.0" + "requires": { + "globule": "^1.0.0" } }, - "node_modules/grunt-contrib-imagemin/node_modules/chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "get-intrinsic": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", + "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", "dev": true, - "dependencies": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" + "requires": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "hasown": "^2.0.0" }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/grunt-contrib-imagemin/node_modules/clap": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/clap/-/clap-1.2.3.tgz", - "integrity": "sha512-4CoL/A3hf90V3VIEjeuhSvlGFEHKzOz+Wfc2IVZc+FaUgU0ZQafJTP49fvnULipOPcAfqhyI2duwQyns6xqjYA==", - "dev": true, - "optional": true, "dependencies": { - "chalk": "^1.1.3" - }, - "engines": { - "node": ">=0.10.0" + "function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "dev": true + }, + "has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "dev": true + } } }, - "node_modules/grunt-contrib-imagemin/node_modules/clone": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.3.tgz", - "integrity": "sha1-KY1+IjFmD0DAA8LtMUDezz9TCF8=", + "get-proxy": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/get-proxy/-/get-proxy-1.1.0.tgz", + "integrity": "sha512-3cJ+77wC52qD2PqWNXtB2HkU6tQXc/X3hSMtSN0Y8c8nbYMMxF7vpsjH4H0iSt+28l/NK13DKl8iKAVGkqDFnA==", "dev": true, - "engines": { - "node": ">=0.8" + "optional": true, + "requires": { + "rc": "^1.1.2" } }, - "node_modules/grunt-contrib-imagemin/node_modules/clone-stats": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-0.0.1.tgz", - "integrity": "sha1-uI+UqCzzi4eR1YBG6kAprYjKmdE=", + "get-stdin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", + "integrity": "sha512-F5aQMywwJ2n85s4hJPTT9RPxGmubonuB10MNYo17/xph174n2MIR33HRguhzVag10O/npM7SPk73LMZNP+FaWw==", "dev": true }, - "node_modules/grunt-contrib-imagemin/node_modules/co": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/co/-/co-3.1.0.tgz", - "integrity": "sha1-TqVOpaCJOBUxheFSEMaNkJK8G3g=", - "dev": true, - "optional": true + "getobject": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/getobject/-/getobject-1.0.2.tgz", + "integrity": "sha512-2zblDBaFcb3rB4rF77XVnuINOE2h2k/OnqXAiy0IrTxUfV1iFp3la33oAQVY9pCpWU268WFYVt2t71hlMuLsOg==", + "dev": true }, - "node_modules/grunt-contrib-imagemin/node_modules/coa": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/coa/-/coa-1.0.4.tgz", - "integrity": "sha1-qe8VNmDWqGqL3sAomlxoTSF0Mv0=", + "getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==", "dev": true, "optional": true, - "dependencies": { - "q": "^1.1.2" + "requires": { + "assert-plus": "^1.0.0" }, - "engines": { - "node": ">= 0.8.0" + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==", + "dev": true, + "optional": true + } } }, - "node_modules/grunt-contrib-imagemin/node_modules/colors": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/colors/-/colors-1.1.2.tgz", - "integrity": "sha1-FopHAXVran9RoSzgyXv6KMCE7WM=", + "gettext-parser": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/gettext-parser/-/gettext-parser-3.1.1.tgz", + "integrity": "sha512-vNhWcqXEtZPs5Ft1ReA34g7ByWotpcOIeJvXVy2jF3/G2U9v6W0wG4Z4hXzcU8R//jArqkgHcVCGgGqa4vxVlQ==", "dev": true, - "optional": true, - "engines": { - "node": ">=0.1.90" + "requires": { + "encoding": "^0.1.12", + "readable-stream": "^3.2.0", + "safe-buffer": "^5.1.2" } }, - "node_modules/grunt-contrib-imagemin/node_modules/commander": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.8.1.tgz", - "integrity": "sha1-Br42f+v9oMMwqh4qBy09yXYkJdQ=", + "gifsicle": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/gifsicle/-/gifsicle-3.0.4.tgz", + "integrity": "sha512-bfwYZooxxqCHpu3qUMn3En9xij/rrQd1fD9TNr+f7r5y/Inqj0WGkL7AeqQffBe/Sd6M/MIHzRKeD9hgI6Xavg==", "dev": true, "optional": true, - "dependencies": { - "graceful-readlink": ">= 1.0.0" - }, - "engines": { - "node": ">= 0.6.x" + "requires": { + "bin-build": "^2.0.0", + "bin-wrapper": "^3.0.0", + "logalot": "^2.0.0" } }, - "node_modules/grunt-contrib-imagemin/node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", - "dev": true - }, - "node_modules/grunt-contrib-imagemin/node_modules/concat-stream": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.0.tgz", - "integrity": "sha1-CqxmL9Ur54lk1VMvaUeE5wEQrPc=", - "dev": true, - "engines": [ - "node >= 0.8" - ], - "dependencies": { - "inherits": "^2.0.3", - "readable-stream": "^2.2.2", - "typedarray": "^0.0.6" + "glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" } }, - "node_modules/grunt-contrib-imagemin/node_modules/console-stream": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/console-stream/-/console-stream-0.1.1.tgz", - "integrity": "sha1-oJX+B7IEZZVfL6/Si11yvM2UnUQ=", - "dev": true, - "optional": true - }, - "node_modules/grunt-contrib-imagemin/node_modules/convert-source-map": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.5.1.tgz", - "integrity": "sha1-uCeAl7m8IpNl3lxiz1/K7YtVmeU=", - "dev": true - }, - "node_modules/grunt-contrib-imagemin/node_modules/core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", - "dev": true - }, - "node_modules/grunt-contrib-imagemin/node_modules/create-error-class": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/create-error-class/-/create-error-class-3.0.2.tgz", - "integrity": "sha1-Br56vvlHo/FKMP1hBnHUAbyot7Y=", + "glob-base": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz", + "integrity": "sha512-ab1S1g1EbO7YzauaJLkgLp7DZVAqj9M/dvKlTt8DkXA2tiOIcSMrlVI2J1RZyB5iJVccEscjGn+kpOG9788MHA==", "dev": true, - "optional": true, - "dependencies": { - "capture-stack-trace": "^1.0.0" + "requires": { + "glob-parent": "^2.0.0", + "is-glob": "^2.0.0" }, - "engines": { - "node": ">=0.10.0" + "dependencies": { + "glob-parent": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz", + "integrity": "sha512-JDYOvfxio/t42HKdxkAYaCiBN7oYiuxykOxKxdaUW5Qn0zaYN3gRQWolrwdnf0shM9/EP0ebuuTmyoXNr1cC5w==", + "dev": true, + "requires": { + "is-glob": "^2.0.0" + } + }, + "is-extglob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", + "integrity": "sha512-7Q+VbVafe6x2T+Tu6NcOf6sRklazEPmBoB3IWk3WdGZM2iGUwU/Oe3Wtq5lSEkDTTlpp8yx+5t4pzO/i9Ty1ww==", + "dev": true + }, + "is-glob": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", + "integrity": "sha512-a1dBeB19NXsf/E0+FHqkagizel/LQw2DjSQpvQrj3zT+jYPpaUCryPnrQajXKFLCMuf4I6FhRpaGtw4lPrG6Eg==", + "dev": true, + "requires": { + "is-extglob": "^1.0.0" + } + } } }, - "node_modules/grunt-contrib-imagemin/node_modules/csso": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/csso/-/csso-2.0.0.tgz", - "integrity": "sha1-F4tDpEYhIhwndWCG9THgL0KQDug=", + "glob-parent": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha512-E8Ak/2+dZY6fnzlR7+ueWvhsH1SjHr4jjss4YS/h4py44jY9MhK/VFdaZJAWDz6BbL21KeteKxFSFpq8OS5gVA==", "dev": true, - "optional": true, - "dependencies": { - "clap": "^1.0.9", - "source-map": "^0.5.3" - }, - "bin": { - "csso": "bin/csso" + "requires": { + "is-glob": "^3.1.0", + "path-dirname": "^1.0.0" }, - "engines": { - "node": ">=0.10.0" + "dependencies": { + "is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha512-UFpDDrPgM6qpnFNI+rh/p3bUaq9hKLZN8bMUWzxmcnZVS3omf4IPK+BrewlnWjO1WmUsMYuSjKh4UJuV4+Lqmw==", + "dev": true, + "requires": { + "is-extglob": "^2.1.0" + } + } } }, - "node_modules/grunt-contrib-imagemin/node_modules/currently-unhandled": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", - "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=", + "glob-stream": { + "version": "5.3.5", + "resolved": "https://registry.npmjs.org/glob-stream/-/glob-stream-5.3.5.tgz", + "integrity": "sha512-piN8XVAO2sNxwVLokL4PswgJvK/uQ6+awwXUVRTGF+rRfgCZpn4hOqxiRuTEbU/k3qgKl0DACYQ/0Sge54UMQg==", "dev": true, - "optional": true, - "dependencies": { - "array-find-index": "^1.0.1" + "requires": { + "extend": "^3.0.0", + "glob": "^5.0.3", + "glob-parent": "^3.0.0", + "micromatch": "^2.3.7", + "ordered-read-streams": "^0.3.0", + "through2": "^0.6.0", + "to-absolute-glob": "^0.1.1", + "unique-stream": "^2.0.2" }, - "engines": { - "node": ">=0.10.0" + "dependencies": { + "braces": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", + "integrity": "sha512-xU7bpz2ytJl1bH9cgIurjpg/n8Gohy9GTw81heDYLJQ4RU60dlyJsa+atVF2pI0yMMvKxI9HkKwjePCj5XI1hw==", + "dev": true, + "requires": { + "expand-range": "^1.8.1", + "preserve": "^0.2.0", + "repeat-element": "^1.1.2" + } + }, + "glob": { + "version": "5.0.15", + "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz", + "integrity": "sha512-c9IPMazfRITpmAAKi22dK1VKxGDX9ehhqfABDriL/lzO92xcUKEJPQHrVA/2YHSNFB4iFlykVmWvwo48nr3OxA==", + "dev": true, + "requires": { + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "2 || 3", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "is-extglob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", + "integrity": "sha512-7Q+VbVafe6x2T+Tu6NcOf6sRklazEPmBoB3IWk3WdGZM2iGUwU/Oe3Wtq5lSEkDTTlpp8yx+5t4pzO/i9Ty1ww==", + "dev": true + }, + "is-glob": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", + "integrity": "sha512-a1dBeB19NXsf/E0+FHqkagizel/LQw2DjSQpvQrj3zT+jYPpaUCryPnrQajXKFLCMuf4I6FhRpaGtw4lPrG6Eg==", + "dev": true, + "requires": { + "is-extglob": "^1.0.0" + } + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + }, + "micromatch": { + "version": "2.3.11", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", + "integrity": "sha512-LnU2XFEk9xxSJ6rfgAry/ty5qwUTyHYOBU0g4R6tIw5ljwgGIBmiKhRWLw5NpMOnrgUNcDJ4WMp8rl3sYVHLNA==", + "dev": true, + "requires": { + "arr-diff": "^2.0.0", + "array-unique": "^0.2.1", + "braces": "^1.8.2", + "expand-brackets": "^0.1.4", + "extglob": "^0.3.1", + "filename-regex": "^2.0.0", + "is-extglob": "^1.0.0", + "is-glob": "^2.0.1", + "kind-of": "^3.0.2", + "normalize-path": "^2.0.1", + "object.omit": "^2.0.0", + "parse-glob": "^3.0.4", + "regex-cache": "^0.4.2" + } + } } }, - "node_modules/grunt-contrib-imagemin/node_modules/dateformat": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-2.2.0.tgz", - "integrity": "sha1-QGXiATz5+5Ft39gu+1Bq1MZ2kGI=", + "global-modules": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz", + "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==", "dev": true, - "optional": true, - "engines": { - "node": "*" + "requires": { + "global-prefix": "^1.0.1", + "is-windows": "^1.0.1", + "resolve-dir": "^1.0.0" } }, - "node_modules/grunt-contrib-imagemin/node_modules/decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", + "global-prefix": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz", + "integrity": "sha512-5lsx1NUDHtSjfg0eHlmYvZKv8/nVqX4ckFbM+FrGcQ+04KWcWFo9P5MxPZYSzUvyzmdTbI7Eix8Q4IbELDqzKg==", "dev": true, - "optional": true, - "engines": { - "node": ">=0.10.0" + "requires": { + "expand-tilde": "^2.0.2", + "homedir-polyfill": "^1.0.1", + "ini": "^1.3.4", + "is-windows": "^1.0.1", + "which": "^1.2.14" } }, - "node_modules/grunt-contrib-imagemin/node_modules/decompress": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/decompress/-/decompress-3.0.0.tgz", - "integrity": "sha1-rx3VDQbjv8QyRh033hGzjA2ZG+0=", + "globule": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/globule/-/globule-1.3.4.tgz", + "integrity": "sha512-OPTIfhMBh7JbBYDpa5b+Q5ptmMWKwcNcFSR/0c6t8V4f3ZAVBEsKNY37QdVqmLRYSMhOUGYrY0QhSoEpzGr/Eg==", "dev": true, - "optional": true, - "dependencies": { - "buffer-to-vinyl": "^1.0.0", - "concat-stream": "^1.4.6", - "decompress-tar": "^3.0.0", - "decompress-tarbz2": "^3.0.0", - "decompress-targz": "^3.0.0", - "decompress-unzip": "^3.0.0", - "stream-combiner2": "^1.1.1", - "vinyl-assign": "^1.0.1", - "vinyl-fs": "^2.2.0" - }, - "engines": { - "node": ">=0.10.0" + "requires": { + "glob": "~7.1.1", + "lodash": "^4.17.21", + "minimatch": "~3.0.2" } }, - "node_modules/grunt-contrib-imagemin/node_modules/decompress-tar": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/decompress-tar/-/decompress-tar-3.1.0.tgz", - "integrity": "sha1-IXx4n5uURQ76rcXF5TeXj8MzxGY=", + "glogg": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/glogg/-/glogg-1.0.2.tgz", + "integrity": "sha512-5mwUoSuBk44Y4EshyiqcH95ZntbDdTQqA3QYSrxmzj28Ai0vXBGMH1ApSANH14j2sIRtqCEyg6PfsuP7ElOEDA==", "dev": true, "optional": true, - "dependencies": { - "is-tar": "^1.0.0", - "object-assign": "^2.0.0", - "strip-dirs": "^1.0.0", - "tar-stream": "^1.1.1", - "through2": "^0.6.1", - "vinyl": "^0.4.3" - }, - "engines": { - "node": ">=0.10.0" + "requires": { + "sparkles": "^1.0.0" } }, - "node_modules/grunt-contrib-imagemin/node_modules/decompress-tar/node_modules/clone": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/clone/-/clone-0.2.0.tgz", - "integrity": "sha1-xhJqkK1Pctv1rNskPMN3JP6T/B8=", + "gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", "dev": true, - "optional": true, - "engines": { - "node": "*" + "requires": { + "get-intrinsic": "^1.1.3" } }, - "node_modules/grunt-contrib-imagemin/node_modules/decompress-tar/node_modules/vinyl": { - "version": "0.4.6", - "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-0.4.6.tgz", - "integrity": "sha1-LzVsh6VQolVGHza76ypbqL94SEc=", + "got": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/got/-/got-5.7.1.tgz", + "integrity": "sha512-1qd54GLxvVgzuidFmw9ze9umxS3rzhdBH6Wt6BTYrTQUXTN01vGGYXwzLzYLowNx8HBH3/c7kRyvx90fh13i7Q==", "dev": true, "optional": true, - "dependencies": { - "clone": "^0.2.0", - "clone-stats": "^0.0.1" + "requires": { + "create-error-class": "^3.0.1", + "duplexer2": "^0.1.4", + "is-redirect": "^1.0.0", + "is-retry-allowed": "^1.0.0", + "is-stream": "^1.0.0", + "lowercase-keys": "^1.0.0", + "node-status-codes": "^1.0.0", + "object-assign": "^4.0.1", + "parse-json": "^2.1.0", + "pinkie-promise": "^2.0.0", + "read-all-stream": "^3.0.0", + "readable-stream": "^2.0.5", + "timed-out": "^3.0.0", + "unzip-response": "^1.0.2", + "url-parse-lax": "^1.0.0" }, - "engines": { - "node": ">= 0.9" - } - }, - "node_modules/grunt-contrib-imagemin/node_modules/decompress-tarbz2": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/decompress-tarbz2/-/decompress-tarbz2-3.1.0.tgz", - "integrity": "sha1-iyOTVoE1X58YnYclag+L3ZbZZm0=", - "dev": true, - "optional": true, "dependencies": { - "is-bzip2": "^1.0.0", - "object-assign": "^2.0.0", - "seek-bzip": "^1.0.3", - "strip-dirs": "^1.0.0", - "tar-stream": "^1.1.1", - "through2": "^0.6.1", - "vinyl": "^0.4.3" - }, - "engines": { - "node": ">=0.10.0" + "readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dev": true, + "optional": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true, + "optional": true + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "optional": true, + "requires": { + "safe-buffer": "~5.1.0" + } + } } }, - "node_modules/grunt-contrib-imagemin/node_modules/decompress-tarbz2/node_modules/clone": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/clone/-/clone-0.2.0.tgz", - "integrity": "sha1-xhJqkK1Pctv1rNskPMN3JP6T/B8=", - "dev": true, - "optional": true, - "engines": { - "node": "*" - } + "graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true }, - "node_modules/grunt-contrib-imagemin/node_modules/decompress-tarbz2/node_modules/vinyl": { - "version": "0.4.6", - "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-0.4.6.tgz", - "integrity": "sha1-LzVsh6VQolVGHza76ypbqL94SEc=", + "grunt": { + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/grunt/-/grunt-1.5.3.tgz", + "integrity": "sha512-mKwmo4X2d8/4c/BmcOETHek675uOqw0RuA/zy12jaspWqvTp4+ZeQF1W+OTpcbncnaBsfbQJ6l0l4j+Sn/GmaQ==", "dev": true, - "optional": true, - "dependencies": { - "clone": "^0.2.0", - "clone-stats": "^0.0.1" + "requires": { + "dateformat": "~3.0.3", + "eventemitter2": "~0.4.13", + "exit": "~0.1.2", + "findup-sync": "~0.3.0", + "glob": "~7.1.6", + "grunt-cli": "~1.4.3", + "grunt-known-options": "~2.0.0", + "grunt-legacy-log": "~3.0.0", + "grunt-legacy-util": "~2.0.1", + "iconv-lite": "~0.4.13", + "js-yaml": "~3.14.0", + "minimatch": "~3.0.4", + "mkdirp": "~1.0.4", + "nopt": "~3.0.6", + "rimraf": "~3.0.2" }, - "engines": { - "node": ">= 0.9" - } - }, - "node_modules/grunt-contrib-imagemin/node_modules/decompress-targz": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/decompress-targz/-/decompress-targz-3.1.0.tgz", - "integrity": "sha1-ssE9+YFmJomRtxXWRH9kLpaW9aA=", - "dev": true, - "optional": true, "dependencies": { - "is-gzip": "^1.0.0", - "object-assign": "^2.0.0", - "strip-dirs": "^1.0.0", - "tar-stream": "^1.1.1", - "through2": "^0.6.1", - "vinyl": "^0.4.3" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/grunt-contrib-imagemin/node_modules/decompress-targz/node_modules/clone": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/clone/-/clone-0.2.0.tgz", - "integrity": "sha1-xhJqkK1Pctv1rNskPMN3JP6T/B8=", - "dev": true, - "optional": true, - "engines": { - "node": "*" + "grunt-cli": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/grunt-cli/-/grunt-cli-1.4.3.tgz", + "integrity": "sha512-9Dtx/AhVeB4LYzsViCjUQkd0Kw0McN2gYpdmGYKtE2a5Yt7v1Q+HYZVWhqXc/kGnxlMtqKDxSwotiGeFmkrCoQ==", + "dev": true, + "requires": { + "grunt-known-options": "~2.0.0", + "interpret": "~1.1.0", + "liftup": "~3.0.1", + "nopt": "~4.0.1", + "v8flags": "~3.2.0" + }, + "dependencies": { + "nopt": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-4.0.3.tgz", + "integrity": "sha512-CvaGwVMztSMJLOeXPrez7fyfObdZqNUK1cPAEzLHrTybIua9pMdmmPR5YwtfNftIOMv3DPUhFaxsZMNTQO20Kg==", + "dev": true, + "requires": { + "abbrev": "1", + "osenv": "^0.1.4" + } + } + } + } } }, - "node_modules/grunt-contrib-imagemin/node_modules/decompress-targz/node_modules/vinyl": { - "version": "0.4.6", - "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-0.4.6.tgz", - "integrity": "sha1-LzVsh6VQolVGHza76ypbqL94SEc=", + "grunt-contrib-clean": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/grunt-contrib-clean/-/grunt-contrib-clean-1.0.0.tgz", + "integrity": "sha512-53igYwhP+AUWdIfO1R+L9r4O48FSnA5ImYPWdXUNU+YQruOpprmMb+N74P7fAZLL3w9lsFin4B234NUrWx/RrQ==", "dev": true, - "optional": true, - "dependencies": { - "clone": "^0.2.0", - "clone-stats": "^0.0.1" + "requires": { + "async": "^1.5.2", + "rimraf": "^2.5.1" }, - "engines": { - "node": ">= 0.9" - } - }, - "node_modules/grunt-contrib-imagemin/node_modules/decompress-unzip": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/decompress-unzip/-/decompress-unzip-3.4.0.tgz", - "integrity": "sha1-YUdbQVIGa74/7hL51inRX+ZHjus=", - "dev": true, - "optional": true, "dependencies": { - "is-zip": "^1.0.0", - "read-all-stream": "^3.0.0", - "stat-mode": "^0.2.0", - "strip-dirs": "^1.0.0", - "through2": "^2.0.0", - "vinyl": "^1.0.0", - "yauzl": "^2.2.1" - }, - "engines": { - "node": ">=0.10.0" + "async": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", + "integrity": "sha512-nSVgobk4rv61R9PUSDtYt7mPVB2olxNR5RWJcAsH676/ef11bUZwvu7+RGYrYauVdDPcO519v68wRhXQtxsV9w==", + "dev": true + }, + "rimraf": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", + "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", + "dev": true, + "requires": { + "glob": "^7.0.5" + } + } } }, - "node_modules/grunt-contrib-imagemin/node_modules/decompress-unzip/node_modules/through2": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.3.tgz", - "integrity": "sha1-AARWmzfHx0ujnEPzzteNGtlBQL4=", + "grunt-contrib-compress": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/grunt-contrib-compress/-/grunt-contrib-compress-1.3.0.tgz", + "integrity": "sha512-pERsxMY+cORJIK/q448mLkFeBAOBp7BB63tkTxq1fFFIAjUj6QS7thN+TJ20ubK7BoRbYYY1wK8LwHACUpnrQg==", "dev": true, - "optional": true, + "requires": { + "archiver": "^1.0.0", + "chalk": "^1.1.1", + "lodash": "^4.7.0", + "pretty-bytes": "^3.0.1", + "stream-buffers": "^2.1.0" + }, "dependencies": { - "readable-stream": "^2.1.5", - "xtend": "~4.0.1" - } - }, - "node_modules/grunt-contrib-imagemin/node_modules/deep-extend": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.4.2.tgz", - "integrity": "sha1-SLaZwn4zS/ifEIkr5DL25MfTSn8=", - "dev": true, - "optional": true, - "engines": { - "iojs": ">=1.0.0", - "node": ">=0.12.0" + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==", + "dev": true, + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + } + }, + "pretty-bytes": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-3.0.1.tgz", + "integrity": "sha512-eb7ZAeUTgfh294cElcu51w+OTRp/6ItW758LjwJSK72LDevcuJn0P4eD71PLMDGPwwatXmAmYHTkzvpKlJE3ow==", + "dev": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==", + "dev": true + } } }, - "node_modules/grunt-contrib-imagemin/node_modules/download": { - "version": "4.4.3", - "resolved": "https://registry.npmjs.org/download/-/download-4.4.3.tgz", - "integrity": "sha1-qlX9rTktldS2jowr4D4MKqIbqaw=", + "grunt-contrib-concat": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/grunt-contrib-concat/-/grunt-contrib-concat-1.0.1.tgz", + "integrity": "sha512-QdTmcxe8aim2Z0dFeuSJ+f7fHIeY7PZaTMZxgvosjXwyMhpy2GUR5WHkr12lksHfZVE80v2wUwqF56wyfPUwoQ==", "dev": true, - "optional": true, - "dependencies": { - "caw": "^1.0.1", - "concat-stream": "^1.4.7", - "each-async": "^1.0.0", - "filenamify": "^1.0.1", - "got": "^5.0.0", - "gulp-decompress": "^1.2.0", - "gulp-rename": "^1.2.0", - "is-url": "^1.2.0", - "object-assign": "^4.0.1", - "read-all-stream": "^3.0.0", - "readable-stream": "^2.0.2", - "stream-combiner2": "^1.1.1", - "vinyl": "^1.0.0", - "vinyl-fs": "^2.2.0", - "ware": "^1.2.0" + "requires": { + "chalk": "^1.0.0", + "source-map": "^0.5.3" }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/grunt-contrib-imagemin/node_modules/download/node_modules/object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", - "dev": true, - "optional": true, - "engines": { - "node": ">=0.10.0" + "dependencies": { + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==", + "dev": true, + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + } + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", + "dev": true + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==", + "dev": true + } } }, - "node_modules/grunt-contrib-imagemin/node_modules/duplexer2": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz", - "integrity": "sha1-ixLauHjA1p4+eJEFFmKjL8a93ME=", + "grunt-contrib-copy": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/grunt-contrib-copy/-/grunt-contrib-copy-1.0.0.tgz", + "integrity": "sha512-gFRFUB0ZbLcjKb67Magz1yOHGBkyU6uL29hiEW1tdQ9gQt72NuMKIy/kS6dsCbV0cZ0maNCb0s6y+uT1FKU7jA==", "dev": true, + "requires": { + "chalk": "^1.1.1", + "file-sync-cmp": "^0.1.0" + }, "dependencies": { - "readable-stream": "^2.0.2" + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==", + "dev": true, + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==", + "dev": true + } } }, - "node_modules/grunt-contrib-imagemin/node_modules/duplexify": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.5.3.tgz", - "integrity": "sha512-g8ID9OroF9hKt2POf8YLayy+9594PzmM3scI00/uBXocX3TWNgoB67hjzkFe9ITAbQOne/lLdBxHXvYUM4ZgGA==", + "grunt-contrib-imagemin": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/grunt-contrib-imagemin/-/grunt-contrib-imagemin-1.0.1.tgz", + "integrity": "sha512-5QM+e2zgC3eYn6f7XMZnEPQvunp0cSktW7ryyX9wMqv+LB5Q5rgKGwpjUwy5XQovK82JnMAelhodS3ylpKGAxw==", "dev": true, + "requires": { + "async": "^1.5.2", + "chalk": "^1.0.0", + "gulp-rename": "^1.2.0", + "imagemin": "^4.0.0", + "pretty-bytes": "^3.0.1" + }, "dependencies": { - "end-of-stream": "^1.0.0", - "inherits": "^2.0.1", - "readable-stream": "^2.0.0", - "stream-shift": "^1.0.0" + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==", + "dev": true + }, + "async": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", + "integrity": "sha512-nSVgobk4rv61R9PUSDtYt7mPVB2olxNR5RWJcAsH676/ef11bUZwvu7+RGYrYauVdDPcO519v68wRhXQtxsV9w==", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==", + "dev": true, + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + } + }, + "pretty-bytes": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-3.0.1.tgz", + "integrity": "sha512-eb7ZAeUTgfh294cElcu51w+OTRp/6ItW758LjwJSK72LDevcuJn0P4eD71PLMDGPwwatXmAmYHTkzvpKlJE3ow==", + "dev": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==", + "dev": true + } } }, - "node_modules/grunt-contrib-imagemin/node_modules/each-async": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/each-async/-/each-async-1.1.1.tgz", - "integrity": "sha1-3uUim98KtrogEqOV4bhpq/iBNHM=", + "grunt-contrib-jshint": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/grunt-contrib-jshint/-/grunt-contrib-jshint-1.1.0.tgz", + "integrity": "sha512-N8jtQ/FmvuRdJoEGphmGt+ov1oi5bJq4hPBPT/g54ed1glF34l2z5VAdHHhcgOaezBxur3kcMPChB0pfZxxcFw==", "dev": true, - "optional": true, - "dependencies": { - "onetime": "^1.0.0", - "set-immediate-shim": "^1.0.0" + "requires": { + "chalk": "^1.1.1", + "hooker": "^0.2.3", + "jshint": "~2.9.4" }, - "engines": { - "node": ">=0.10.0" + "dependencies": { + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==", + "dev": true, + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + } + }, + "hooker": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/hooker/-/hooker-0.2.3.tgz", + "integrity": "sha512-t+UerCsQviSymAInD01Pw+Dn/usmz1sRO+3Zk1+lx8eg+WKpD2ulcwWqHHL0+aseRBr+3+vIhiG1K1JTwaIcTA==", + "dev": true + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==", + "dev": true + } } }, - "node_modules/grunt-contrib-imagemin/node_modules/end-of-stream": { + "grunt-contrib-less": { "version": "1.4.1", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz", - "integrity": "sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==", + "resolved": "https://registry.npmjs.org/grunt-contrib-less/-/grunt-contrib-less-1.4.1.tgz", + "integrity": "sha512-NI8pp1KL3c43iR6OLWRyla6I5FLSpvbT5R6UzGHvdRDT0cM0WVfDiIAqqnjDL9z7pPr3ZyOrum5Jn1CIATmHxQ==", "dev": true, + "requires": { + "async": "^2.0.0", + "chalk": "^1.0.0", + "less": "~2.7.1", + "lodash": "^4.8.2" + }, "dependencies": { - "once": "^1.4.0" - } - }, - "node_modules/grunt-contrib-imagemin/node_modules/error-ex": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.1.tgz", - "integrity": "sha1-+FWobOYa3E6GIcPNoh56dhLDqNw=", - "dev": true, - "optional": true, - "dependencies": { - "is-arrayish": "^0.2.1" - } - }, - "node_modules/grunt-contrib-imagemin/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", - "dev": true, - "engines": { - "node": ">=0.8.0" + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==", + "dev": true + }, + "async": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.0.tgz", + "integrity": "sha512-xAfGg1/NTLBBKlHFmnd7PlmUW9KhVQIUuSrYem9xzFUZy13ScvtyGGejaae9iAVRiRq9+Cx7DPFaAAhCpyxyPw==", + "dev": true, + "requires": { + "lodash": "^4.14.0" + } + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==", + "dev": true, + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==", + "dev": true + } } }, - "node_modules/grunt-contrib-imagemin/node_modules/esprima": { - "version": "2.7.3", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz", - "integrity": "sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE=", + "grunt-contrib-uglify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/grunt-contrib-uglify/-/grunt-contrib-uglify-2.3.0.tgz", + "integrity": "sha512-hdV6W7OwRCcYb6MJoSK8OE/D3dFJ02ykp+UMoGNBGusKxiX0TBreQ0JD/PHMsBUfCmp8vOYEbL9np90qO4bJJQ==", "dev": true, - "optional": true, - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" + "requires": { + "chalk": "^1.0.0", + "maxmin": "^1.1.0", + "object.assign": "^4.0.4", + "uglify-js": "~2.8.21", + "uri-path": "^1.0.0" }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/grunt-contrib-imagemin/node_modules/exec-buffer": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/exec-buffer/-/exec-buffer-2.0.1.tgz", - "integrity": "sha1-ACijG+CxRgth0HX5avRYO54zXqA=", - "dev": true, - "optional": true, "dependencies": { - "rimraf": "^2.2.6", - "tempfile": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==", + "dev": true, + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + } + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", + "dev": true + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==", + "dev": true + }, + "uglify-js": { + "version": "2.8.29", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.29.tgz", + "integrity": "sha512-qLq/4y2pjcU3vhlhseXGGJ7VbFO4pBANu0kwl8VCa9KEI0V8VfZIx2Fy3w01iSTA/pGwKZSmu/+I4etLNDdt5w==", + "dev": true, + "requires": { + "source-map": "~0.5.1", + "uglify-to-browserify": "~1.0.0", + "yargs": "~3.10.0" + } + } } }, - "node_modules/grunt-contrib-imagemin/node_modules/exec-series": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/exec-series/-/exec-series-1.0.3.tgz", - "integrity": "sha1-bSV6m+rEgqhyx3g7yGFYOfx3FDo=", + "grunt-contrib-watch": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/grunt-contrib-watch/-/grunt-contrib-watch-1.0.0.tgz", + "integrity": "sha512-q8oL5nBqeph+HILsbFx6EZVtu5ZbFqiDt8uhanyA7uwHM3z9ahtHK7VOdLd7fZ8RkknVUVdnl+ywaRQpFt6QPg==", "dev": true, - "optional": true, + "requires": { + "async": "^1.5.0", + "gaze": "^1.0.0", + "lodash": "^3.10.1", + "tiny-lr": "^0.2.1" + }, "dependencies": { - "async-each-series": "^1.1.0", - "object-assign": "^4.1.0" - } - }, - "node_modules/grunt-contrib-imagemin/node_modules/exec-series/node_modules/object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", - "dev": true, - "optional": true, - "engines": { - "node": ">=0.10.0" + "async": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", + "integrity": "sha512-nSVgobk4rv61R9PUSDtYt7mPVB2olxNR5RWJcAsH676/ef11bUZwvu7+RGYrYauVdDPcO519v68wRhXQtxsV9w==", + "dev": true + }, + "lodash": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-3.10.1.tgz", + "integrity": "sha512-9mDDwqVIma6OZX79ZlDACZl8sBm0TEnkf99zV3iMA4GzkIT/9hiqP5mY0HoT1iNLCrKc/R1HByV+yJfRWVJryQ==", + "dev": true + } } }, - "node_modules/grunt-contrib-imagemin/node_modules/executable": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/executable/-/executable-1.1.0.tgz", - "integrity": "sha1-h3mA6REvM5EGbaNyZd562ENKtNk=", - "dev": true, - "optional": true, - "dependencies": { - "meow": "^3.1.0" - }, - "bin": { - "executable": "cli.js" - }, - "engines": { - "node": ">=0.10.0" - } + "grunt-known-options": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/grunt-known-options/-/grunt-known-options-2.0.0.tgz", + "integrity": "sha512-GD7cTz0I4SAede1/+pAbmJRG44zFLPipVtdL9o3vqx9IEyb7b4/Y3s7r6ofI3CchR5GvYJ+8buCSioDv5dQLiA==", + "dev": true }, - "node_modules/grunt-contrib-imagemin/node_modules/expand-brackets": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", - "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", + "grunt-legacy-log": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/grunt-legacy-log/-/grunt-legacy-log-3.0.0.tgz", + "integrity": "sha512-GHZQzZmhyq0u3hr7aHW4qUH0xDzwp2YXldLPZTCjlOeGscAOWWPftZG3XioW8MasGp+OBRIu39LFx14SLjXRcA==", "dev": true, - "dependencies": { - "is-posix-bracket": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" + "requires": { + "colors": "~1.1.2", + "grunt-legacy-log-utils": "~2.1.0", + "hooker": "~0.2.3", + "lodash": "~4.17.19" } }, - "node_modules/grunt-contrib-imagemin/node_modules/expand-range": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz", - "integrity": "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=", + "grunt-legacy-log-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/grunt-legacy-log-utils/-/grunt-legacy-log-utils-2.1.0.tgz", + "integrity": "sha512-lwquaPXJtKQk0rUM1IQAop5noEpwFqOXasVoedLeNzaibf/OPWjKYvvdqnEHNmU+0T0CaReAXIbGo747ZD+Aaw==", "dev": true, - "dependencies": { - "fill-range": "^2.1.0" - }, - "engines": { - "node": ">=0.10.0" + "requires": { + "chalk": "~4.1.0", + "lodash": "~4.17.19" } }, - "node_modules/grunt-contrib-imagemin/node_modules/extend-shallow": { + "grunt-legacy-util": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "resolved": "https://registry.npmjs.org/grunt-legacy-util/-/grunt-legacy-util-2.0.1.tgz", + "integrity": "sha512-2bQiD4fzXqX8rhNdXkAywCadeqiPiay0oQny77wA2F3WF4grPJXCvAcyoWUJV+po/b15glGkxuSiQCK299UC2w==", "dev": true, - "dependencies": { - "is-extendable": "^0.1.0" + "requires": { + "async": "~3.2.0", + "exit": "~0.1.2", + "getobject": "~1.0.0", + "hooker": "~0.2.3", + "lodash": "~4.17.21", + "underscore.string": "~3.3.5", + "which": "~2.0.2" }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/grunt-contrib-imagemin/node_modules/extglob": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", - "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", - "dev": true, "dependencies": { - "is-extglob": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/grunt-contrib-imagemin/node_modules/extglob/node_modules/is-extglob": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", - "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", - "dev": true, - "engines": { - "node": ">=0.10.0" + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + } } }, - "node_modules/grunt-contrib-imagemin/node_modules/fancy-log": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/fancy-log/-/fancy-log-1.3.2.tgz", - "integrity": "sha1-9BEl49hPLn2JpD0G2VjI94vha+E=", + "grunt-notify": { + "version": "0.4.5", + "resolved": "https://registry.npmjs.org/grunt-notify/-/grunt-notify-0.4.5.tgz", + "integrity": "sha512-tOuxVw4HHcCGXuCzUGIDN5ZVAN5t0BFt+yVhV4cvipXbqRQCGKyGUuYj50jKSycK663cHaQP9RbDXeIOQzgntw==", "dev": true, - "optional": true, - "dependencies": { - "ansi-gray": "^0.1.1", - "color-support": "^1.1.3", - "time-stamp": "^1.0.0" + "requires": { + "semver": "^5.1.0", + "stack-parser": "^0.0.1", + "which": "^1.2.4" }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/grunt-contrib-imagemin/node_modules/fd-slicer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.0.1.tgz", - "integrity": "sha1-i1vL2ewyfFBBv5qwI/1nUPEXfmU=", - "dev": true, - "optional": true, "dependencies": { - "pend": "~1.2.0" + "semver": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz", + "integrity": "sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA==", + "dev": true + }, + "which": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.0.tgz", + "integrity": "sha512-xcJpopdamTuY5duC/KnTTNBraPK54YwpenP4lzxU8H91GudWpFv38u0CKjclE1Wi2EH2EDz5LRcHcKbCIzqGyg==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + } } }, - "node_modules/grunt-contrib-imagemin/node_modules/figures": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz", - "integrity": "sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=", + "grunt-phplint": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/grunt-phplint/-/grunt-phplint-0.0.8.tgz", + "integrity": "sha512-3yEhT2n+h9E8bKFJQ9ms7ufCHlWdd1hFbC83e8BGLo/hXByvS61IZPCWR3FaTALlShsQ3g8OKZwxXvEZPWXp1w==", "dev": true, - "optional": true, - "dependencies": { - "escape-string-regexp": "^1.0.5", - "object-assign": "^4.1.0" + "requires": { + "cache-swap": "~0.0.2", + "grunt": "~0.4.1" }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/grunt-contrib-imagemin/node_modules/figures/node_modules/object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", - "dev": true, - "optional": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/grunt-contrib-imagemin/node_modules/file-type": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/file-type/-/file-type-3.9.0.tgz", - "integrity": "sha1-JXoHg4TR24CHvESdEH1SpSZyuek=", - "dev": true, - "engines": { - "node": ">=0.10.0" + "dependencies": { + "argparse": { + "version": "0.1.16", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-0.1.16.tgz", + "integrity": "sha512-LjmC2dNpdn2L4UzyoaIr11ELYoLn37ZFy9zObrQFHsSuOepeUEMKnM8w5KL4Tnrp2gy88rRuQt6Ky8Bjml+Baw==", + "dev": true, + "requires": { + "underscore": "~1.7.0", + "underscore.string": "~2.4.0" + }, + "dependencies": { + "underscore.string": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/underscore.string/-/underscore.string-2.4.0.tgz", + "integrity": "sha512-yxkabuCaIBnzfIvX3kBxQqCs0ar/bfJwDnFEHJUm/ZrRVhT3IItdRF5cZjARLzEnyQYtIUhsZ2LG2j3HidFOFQ==", + "dev": true + } + } + }, + "async": { + "version": "0.1.22", + "resolved": "https://registry.npmjs.org/async/-/async-0.1.22.tgz", + "integrity": "sha512-2tEzliJmf5fHNafNwQLJXUasGzQCVctvsNkXmnlELHwypU0p08/rHohYvkqKIjyXpx+0rkrYv6QbhJ+UF4QkBg==", + "dev": true + }, + "colors": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/colors/-/colors-0.6.2.tgz", + "integrity": "sha512-OsSVtHK8Ir8r3+Fxw/b4jS1ZLPXkV6ZxDRJQzeD7qo0SqMXWrHDM71DgYzPMHY8SFJ0Ao+nNU2p1MmwdzKqPrw==", + "dev": true + }, + "dateformat": { + "version": "1.0.2-1.2.3", + "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-1.0.2-1.2.3.tgz", + "integrity": "sha512-AXvW8g7tO4ilk5HgOWeDmPi/ZPaCnMJ+9Cg1I3p19w6mcvAAXBuuGEXAxybC+Djj1PSZUiHUcyoYu7WneCX8gQ==", + "dev": true + }, + "esprima": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-1.0.4.tgz", + "integrity": "sha512-rp5dMKN8zEs9dfi9g0X1ClLmV//WRyk/R15mppFNICIFRG5P92VP7Z04p8pk++gABo9W2tY+kHyu6P1mEHgmTA==", + "dev": true + }, + "findup-sync": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-0.1.3.tgz", + "integrity": "sha512-yjftfYnF4ThYEvKEV/kEFR15dmtyXTAh3vQnzpJUoc7Naj5y1P0Ck7Zs1+Vroa00E3KT3IYsk756S+8WA5dNLw==", + "dev": true, + "requires": { + "glob": "~3.2.9", + "lodash": "~2.4.1" + }, + "dependencies": { + "glob": { + "version": "3.2.11", + "resolved": "https://registry.npmjs.org/glob/-/glob-3.2.11.tgz", + "integrity": "sha512-hVb0zwEZwC1FXSKRPFTeOtN7AArJcJlI6ULGLtrstaswKNlrTJqAA+1lYlSUop4vjA423xlBzqfVS3iWGlqJ+g==", + "dev": true, + "requires": { + "inherits": "2", + "minimatch": "0.3" + } + }, + "lodash": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-2.4.2.tgz", + "integrity": "sha512-Kak1hi6/hYHGVPmdyiZijoQyz5x2iGVzs6w9GYB/HiXEtylY7tIoYEROMjvM1d9nXJqPOrG2MNPMn01bJ+S0Rw==", + "dev": true + }, + "minimatch": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.3.0.tgz", + "integrity": "sha512-WFX1jI1AaxNTZVOHLBVazwTWKaQjoykSzCBNXB72vDTCzopQGtyP91tKdFK5cv1+qMwPyiTu1HqUriqplI8pcA==", + "dev": true, + "requires": { + "lru-cache": "2", + "sigmund": "~1.0.0" + } + } + } + }, + "getobject": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/getobject/-/getobject-0.1.0.tgz", + "integrity": "sha512-hIGEBfnHcZpWkXPsAVeVmpYDvfy/matVl03yOY91FPmnpCC12Lm5izNxCjO3lHAeO6uaTwMxu7g450Siknlhig==", + "dev": true + }, + "glob": { + "version": "3.1.21", + "resolved": "https://registry.npmjs.org/glob/-/glob-3.1.21.tgz", + "integrity": "sha512-ANhy2V2+tFpRajE3wN4DhkNQ08KDr0Ir1qL12/cUe5+a7STEK8jkW4onUYuY8/06qAFuT5je7mjAqzx0eKI2tQ==", + "dev": true, + "requires": { + "graceful-fs": "~1.2.0", + "inherits": "1", + "minimatch": "~0.2.11" + }, + "dependencies": { + "inherits": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-1.0.2.tgz", + "integrity": "sha512-Al67oatbRSo3RV5hRqIoln6Y5yMVbJSIn4jEJNL7VCImzq/kLr7vvb6sFRJXqr8rpHc/2kJOM+y0sPKN47VdzA==", + "dev": true + } + } + }, + "graceful-fs": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-1.2.3.tgz", + "integrity": "sha512-iiTUZ5vZ+2ZV+h71XAgwCSu6+NAizhFU3Yw8aC/hH5SQ3SnISqEqAek40imAFGtDcwJKNhXvSY+hzIolnLwcdQ==", + "dev": true + }, + "grunt": { + "version": "0.4.5", + "resolved": "https://registry.npmjs.org/grunt/-/grunt-0.4.5.tgz", + "integrity": "sha512-1iq3ylLjzXqz/KSq1OAE2qhnpcbkF2WyhsQcavZt+YmgvHu0EbPMEhGhy2gr0FP67isHpRdfwjB5WVeXXcJemQ==", + "dev": true, + "requires": { + "async": "~0.1.22", + "coffee-script": "~1.3.3", + "colors": "~0.6.2", + "dateformat": "1.0.2-1.2.3", + "eventemitter2": "~0.4.13", + "exit": "~0.1.1", + "findup-sync": "~0.1.2", + "getobject": "~0.1.0", + "glob": "~3.1.21", + "grunt-legacy-log": "~0.1.0", + "grunt-legacy-util": "~0.2.0", + "hooker": "~0.2.3", + "iconv-lite": "~0.2.11", + "js-yaml": "~2.0.5", + "lodash": "~0.9.2", + "minimatch": "~0.2.12", + "nopt": "~1.0.10", + "rimraf": "~2.2.8", + "underscore.string": "~2.2.1", + "which": "~1.0.5" + } + }, + "grunt-legacy-log": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/grunt-legacy-log/-/grunt-legacy-log-0.1.3.tgz", + "integrity": "sha512-qYs/uM0ImdzwIXLhS4O5WLV5soAM+PEqqHI/hzSxlo450ERSccEhnXqoeDA9ZozOdaWuYnzTOTwRcVRogleMxg==", + "dev": true, + "requires": { + "colors": "~0.6.2", + "grunt-legacy-log-utils": "~0.1.1", + "hooker": "~0.2.3", + "lodash": "~2.4.1", + "underscore.string": "~2.3.3" + }, + "dependencies": { + "lodash": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-2.4.2.tgz", + "integrity": "sha512-Kak1hi6/hYHGVPmdyiZijoQyz5x2iGVzs6w9GYB/HiXEtylY7tIoYEROMjvM1d9nXJqPOrG2MNPMn01bJ+S0Rw==", + "dev": true + }, + "underscore.string": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/underscore.string/-/underscore.string-2.3.3.tgz", + "integrity": "sha512-hbD5MibthuDAu4yA5wxes5bzFgqd3PpBJuClbRxaNddxfdsz+qf+1kHwrGQFrmchmDHb9iNU+6EHDn8uj0xDJg==", + "dev": true + } + } + }, + "grunt-legacy-log-utils": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/grunt-legacy-log-utils/-/grunt-legacy-log-utils-0.1.1.tgz", + "integrity": "sha512-D0vbUX00TFYCKNZtcZzemMpwT8TR/FdRs1pmfiBw6qnUw80PfsjV+lhIozY/3eJ3PSG2zj89wd2mH/7f4tNAlw==", + "dev": true, + "requires": { + "colors": "~0.6.2", + "lodash": "~2.4.1", + "underscore.string": "~2.3.3" + }, + "dependencies": { + "lodash": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-2.4.2.tgz", + "integrity": "sha512-Kak1hi6/hYHGVPmdyiZijoQyz5x2iGVzs6w9GYB/HiXEtylY7tIoYEROMjvM1d9nXJqPOrG2MNPMn01bJ+S0Rw==", + "dev": true + }, + "underscore.string": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/underscore.string/-/underscore.string-2.3.3.tgz", + "integrity": "sha512-hbD5MibthuDAu4yA5wxes5bzFgqd3PpBJuClbRxaNddxfdsz+qf+1kHwrGQFrmchmDHb9iNU+6EHDn8uj0xDJg==", + "dev": true + } + } + }, + "grunt-legacy-util": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/grunt-legacy-util/-/grunt-legacy-util-0.2.0.tgz", + "integrity": "sha512-cXPbfF8aM+pvveQeN1K872D5fRm30xfJWZiS63Y8W8oyIPLClCsmI8bW96Txqzac9cyL4lRqEBhbhJ3n5EzUUQ==", + "dev": true, + "requires": { + "async": "~0.1.22", + "exit": "~0.1.1", + "getobject": "~0.1.0", + "hooker": "~0.2.3", + "lodash": "~0.9.2", + "underscore.string": "~2.2.1", + "which": "~1.0.5" + } + }, + "iconv-lite": { + "version": "0.2.11", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.2.11.tgz", + "integrity": "sha512-KhmFWgaQZY83Cbhi+ADInoUQ8Etn6BG5fikM9syeOjQltvR45h7cRKJ/9uvQEuD61I3Uju77yYce0/LhKVClQw==", + "dev": true + }, + "js-yaml": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-2.0.5.tgz", + "integrity": "sha512-VEKcIksckDBUhg2JS874xVouiPkywVUh4yyUmLCDe1Zg3bCd6M+F1eGPenPeHLc2XC8pp9G8bsuofK0NeEqRkA==", + "dev": true, + "requires": { + "argparse": "~ 0.1.11", + "esprima": "~ 1.0.2" + } + }, + "lodash": { + "version": "0.9.2", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-0.9.2.tgz", + "integrity": "sha512-LVbt/rjK62gSbhehDVKL0vlaime4Y1IBixL+bKeNfoY4L2zab/jGrxU6Ka05tMA/zBxkTk5t3ivtphdyYupczw==", + "dev": true + }, + "minimatch": { + "version": "0.2.14", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.2.14.tgz", + "integrity": "sha512-zZ+Jy8lVWlvqqeM8iZB7w7KmQkoJn8djM585z88rywrEbzoqawVa9FR5p2hwD+y74nfuKOjmNvi9gtWJNLqHvA==", + "dev": true, + "requires": { + "lru-cache": "2", + "sigmund": "~1.0.0" + } + }, + "nopt": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz", + "integrity": "sha512-NWmpvLSqUrgrAC9HCuxEvb+PSloHpqVu+FqcO4eeF2h5qYRhA7ev6KvelyQAKtegUbC6RypJnlEOhd8vloNKYg==", + "dev": true, + "requires": { + "abbrev": "1" + } + }, + "rimraf": { + "version": "2.2.8", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.2.8.tgz", + "integrity": "sha512-R5KMKHnPAQaZMqLOsyuyUmcIjSeDm+73eoqQpaXA7AZ22BL+6C+1mcUscgOsNd8WVlJuvlgAPsegcx7pjlV0Dg==", + "dev": true + }, + "underscore.string": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/underscore.string/-/underscore.string-2.2.1.tgz", + "integrity": "sha512-3FVmhXqelrj6gfgp3Bn6tOavJvW0dNH2T+heTD38JRxIrAbiuzbqjknszoOYj3DyFB1nWiLj208Qt2no/L4cIA==", + "dev": true + }, + "which": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/which/-/which-1.0.9.tgz", + "integrity": "sha512-E87fdQ/eRJr9W1X4wTPejNy9zTW3FI2vpCZSJ/HAY+TkjKVC0TUm1jk6vn2Z7qay0DQy0+RBGdXxj+RmmiGZKQ==", + "dev": true + } } }, - "node_modules/grunt-contrib-imagemin/node_modules/filename-regex": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz", - "integrity": "sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY=", + "grunt-ssh": { + "version": "0.12.9", + "resolved": "https://registry.npmjs.org/grunt-ssh/-/grunt-ssh-0.12.9.tgz", + "integrity": "sha512-eQEAm564mUokmR6a5WemHT4jy7fkZ3bZ5LuFPgPBL3++Qm68K/YWQtMJ54W4qzft848WZ8YXOAfu2pyFRBmYlg==", "dev": true, - "engines": { - "node": ">=0.10.0" + "requires": { + "async": ">=1.0.0", + "progress": "~1.1.3", + "ssh2": "~0.4.6" } }, - "node_modules/grunt-contrib-imagemin/node_modules/filename-reserved-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/filename-reserved-regex/-/filename-reserved-regex-1.0.0.tgz", - "integrity": "sha1-5hz4BfDeHJhFZ9A4bcXfUO5a9+Q=", - "dev": true, - "optional": true, - "engines": { - "node": ">=0.10.0" - } + "grunt-text-replace": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/grunt-text-replace/-/grunt-text-replace-0.4.0.tgz", + "integrity": "sha512-A4dFGpOaD/TQpeOlDK/zP962X1qG7KcOqPiSXOWOIeAKMzzpoDJYZ8Sz56iazI5+kTqeTa+IaEEl5c4sk+QN+Q==", + "dev": true }, - "node_modules/grunt-contrib-imagemin/node_modules/filenamify": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/filenamify/-/filenamify-1.2.1.tgz", - "integrity": "sha1-qfL/0RxQO+0wABUCknI3jx8TZaU=", - "dev": true, - "optional": true, - "dependencies": { - "filename-reserved-regex": "^1.0.0", - "strip-outer": "^1.0.0", - "trim-repeated": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/grunt-contrib-imagemin/node_modules/fill-range": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.3.tgz", - "integrity": "sha1-ULd9/X5Gm8dJJHCWNpn+eoSFpyM=", - "dev": true, - "dependencies": { - "is-number": "^2.1.0", - "isobject": "^2.0.0", - "randomatic": "^1.1.3", - "repeat-element": "^1.1.2", - "repeat-string": "^1.5.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/grunt-contrib-imagemin/node_modules/find-up": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", - "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", - "dev": true, - "optional": true, - "dependencies": { - "path-exists": "^2.0.0", - "pinkie-promise": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/grunt-contrib-imagemin/node_modules/find-versions": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/find-versions/-/find-versions-1.2.1.tgz", - "integrity": "sha1-y96fEuOFdaCvG+G5osXV/Y8Ya2I=", - "dev": true, - "optional": true, - "dependencies": { - "array-uniq": "^1.0.0", - "get-stdin": "^4.0.1", - "meow": "^3.5.0", - "semver-regex": "^1.0.0" - }, - "bin": { - "find-versions": "cli.js" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/grunt-contrib-imagemin/node_modules/first-chunk-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/first-chunk-stream/-/first-chunk-stream-1.0.0.tgz", - "integrity": "sha1-Wb+1DNkF9g18OUzT2ayqtOatk04=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/grunt-contrib-imagemin/node_modules/for-own": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz", - "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=", - "dev": true, - "dependencies": { - "for-in": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/grunt-contrib-imagemin/node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", - "dev": true, - "optional": true - }, - "node_modules/grunt-contrib-imagemin/node_modules/get-proxy": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/get-proxy/-/get-proxy-1.1.0.tgz", - "integrity": "sha1-iUhUSRvFkbDxR9euVw9cZ4tyVus=", - "dev": true, - "optional": true, - "dependencies": { - "rc": "^1.1.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/grunt-contrib-imagemin/node_modules/get-stdin": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", - "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=", - "dev": true, - "optional": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/grunt-contrib-imagemin/node_modules/gifsicle": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/gifsicle/-/gifsicle-3.0.4.tgz", - "integrity": "sha1-9Fy17RAWW2ZdySng6TKLbIId+js=", - "dev": true, - "hasInstallScript": true, - "optional": true, - "dependencies": { - "bin-build": "^2.0.0", - "bin-wrapper": "^3.0.0", - "logalot": "^2.0.0" - }, - "bin": { - "gifsicle": "cli.js" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/grunt-contrib-imagemin/node_modules/glob": { - "version": "5.0.15", - "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz", - "integrity": "sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=", - "dev": true, - "dependencies": { - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "2 || 3", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - } - }, - "node_modules/grunt-contrib-imagemin/node_modules/glob-base": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz", - "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=", - "dev": true, - "dependencies": { - "glob-parent": "^2.0.0", - "is-glob": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/grunt-contrib-imagemin/node_modules/glob-base/node_modules/glob-parent": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz", - "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=", - "dev": true, - "dependencies": { - "is-glob": "^2.0.0" - } - }, - "node_modules/grunt-contrib-imagemin/node_modules/glob-base/node_modules/is-extglob": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", - "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", + "grunt-wp-i18n": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/grunt-wp-i18n/-/grunt-wp-i18n-1.0.3.tgz", + "integrity": "sha512-CJNbEKeBeOSAPeaJ9B8iCgSwtaG63UR9/uT46a4OsIqnFhOJpeAi138JTlvjfIbnDVoBrzvdrKJe1svveLjUtA==", "dev": true, - "engines": { - "node": ">=0.10.0" + "requires": { + "grunt": "^1.0.3", + "node-wp-i18n": "^1.2.2" } }, - "node_modules/grunt-contrib-imagemin/node_modules/glob-base/node_modules/is-glob": { + "grunt-wp-readme-to-markdown": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", - "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", - "dev": true, - "dependencies": { - "is-extglob": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/grunt-contrib-imagemin/node_modules/glob-parent": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", - "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", - "dev": true, - "dependencies": { - "is-glob": "^3.1.0", - "path-dirname": "^1.0.0" - } - }, - "node_modules/grunt-contrib-imagemin/node_modules/glob-stream": { - "version": "5.3.5", - "resolved": "https://registry.npmjs.org/glob-stream/-/glob-stream-5.3.5.tgz", - "integrity": "sha1-pVZlqajM3EGRWofHAeMtTgFvrSI=", - "dev": true, - "dependencies": { - "extend": "^3.0.0", - "glob": "^5.0.3", - "glob-parent": "^3.0.0", - "micromatch": "^2.3.7", - "ordered-read-streams": "^0.3.0", - "through2": "^0.6.0", - "to-absolute-glob": "^0.1.1", - "unique-stream": "^2.0.2" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/grunt-contrib-imagemin/node_modules/glogg": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/glogg/-/glogg-1.0.1.tgz", - "integrity": "sha512-ynYqXLoluBKf9XGR1gA59yEJisIL7YHEH4xr3ZziHB5/yl4qWfaK8Js9jGe6gBGCSCKVqiyO30WnRZADvemUNw==", - "dev": true, - "optional": true, - "dependencies": { - "sparkles": "^1.0.0" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/grunt-contrib-imagemin/node_modules/got": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/got/-/got-5.7.1.tgz", - "integrity": "sha1-X4FjWmHkplifGAVp6k44FoClHzU=", - "dev": true, - "optional": true, - "dependencies": { - "create-error-class": "^3.0.1", - "duplexer2": "^0.1.4", - "is-redirect": "^1.0.0", - "is-retry-allowed": "^1.0.0", - "is-stream": "^1.0.0", - "lowercase-keys": "^1.0.0", - "node-status-codes": "^1.0.0", - "object-assign": "^4.0.1", - "parse-json": "^2.1.0", - "pinkie-promise": "^2.0.0", - "read-all-stream": "^3.0.0", - "readable-stream": "^2.0.5", - "timed-out": "^3.0.0", - "unzip-response": "^1.0.2", - "url-parse-lax": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0 <7" - } - }, - "node_modules/grunt-contrib-imagemin/node_modules/got/node_modules/object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", - "dev": true, - "optional": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/grunt-contrib-imagemin/node_modules/graceful-fs": { - "version": "4.1.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", - "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", - "dev": true, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/grunt-contrib-imagemin/node_modules/graceful-readlink": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz", - "integrity": "sha1-TK+tdrxi8C+gObL5Tpo906ORpyU=", - "dev": true, - "optional": true + "resolved": "https://registry.npmjs.org/grunt-wp-readme-to-markdown/-/grunt-wp-readme-to-markdown-2.0.1.tgz", + "integrity": "sha512-NvP05OJBSG+FXD/iTexxbp/Cn1z16bEKgKRZUlVUX1c+ouCKwxj2ecMrnDQ3V7sgvwIw9a/eH5UV9FKZvqdrfg==", + "dev": true }, - "node_modules/grunt-contrib-imagemin/node_modules/gulp-decompress": { + "gulp-decompress": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/gulp-decompress/-/gulp-decompress-1.2.0.tgz", - "integrity": "sha1-jutlpeAV+O2FMsr+KEVJYGJvDcc=", + "integrity": "sha512-ChTv+4/4BwAdQLUgQoAvLFjYFvxYF6p9Mmf/b19/Lp7yNCvb8+KRkdXV8Gd7XErxtrEh8XDCCVon3DgqW4TgfA==", "dev": true, "optional": true, - "dependencies": { + "requires": { "archive-type": "^3.0.0", "decompress": "^3.0.0", "gulp-util": "^3.0.1", "readable-stream": "^2.0.2" }, - "engines": { - "node": ">=0.10.0" + "dependencies": { + "readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dev": true, + "optional": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true, + "optional": true + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "optional": true, + "requires": { + "safe-buffer": "~5.1.0" + } + } } }, - "node_modules/grunt-contrib-imagemin/node_modules/gulp-rename": { + "gulp-rename": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/gulp-rename/-/gulp-rename-1.2.2.tgz", - "integrity": "sha1-OtRCh2PwXidk3sHGfYaNsnVoeBc=", - "dev": true, - "engines": { - "node": ">=0.10.0", - "npm": ">=1.2.10" - } + "integrity": "sha512-qhfUlYwq5zIP4cpRjx+np2vZVnr0xCRQrF3RsGel8uqL47Gu3yjmllSfnvJyl/39zYuxS68e1nnxImbm7388vw==", + "dev": true }, - "node_modules/grunt-contrib-imagemin/node_modules/gulp-sourcemaps": { + "gulp-sourcemaps": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/gulp-sourcemaps/-/gulp-sourcemaps-1.6.0.tgz", - "integrity": "sha1-uG/zSdgBzrVuHZ59x7vLS33uYAw=", + "integrity": "sha512-NjRy6+Qb5K1xbwOvPviD3uA4KSq2zsalPL+4vxPQPuL+kKzHjXJL10/kLaESic3LmBto8VIBHr3gIN3F9AjnhA==", "dev": true, - "dependencies": { + "requires": { "convert-source-map": "^1.1.1", "graceful-fs": "^4.1.2", "strip-bom": "^2.0.0", "through2": "^2.0.0", "vinyl": "^1.0.0" - } - }, - "node_modules/grunt-contrib-imagemin/node_modules/gulp-sourcemaps/node_modules/through2": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.3.tgz", - "integrity": "sha1-AARWmzfHx0ujnEPzzteNGtlBQL4=", - "dev": true, + }, "dependencies": { - "readable-stream": "^2.1.5", - "xtend": "~4.0.1" + "readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "dev": true, + "requires": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + } } }, - "node_modules/grunt-contrib-imagemin/node_modules/gulp-util": { + "gulp-util": { "version": "3.0.8", "resolved": "https://registry.npmjs.org/gulp-util/-/gulp-util-3.0.8.tgz", - "integrity": "sha1-AFTh50RQLifATBh8PsxQXdVLu08=", - "deprecated": "gulp-util is deprecated - replace it, following the guidelines at https://medium.com/gulpjs/gulp-util-ca3b1f9f9ac5", + "integrity": "sha512-q5oWPc12lwSFS9h/4VIjG+1NuNDlJ48ywV2JKItY4Ycc/n1fXJeYPVQsfu5ZrhQi7FGSDBalwUCLar/GyHXKGw==", "dev": true, "optional": true, - "dependencies": { + "requires": { "array-differ": "^1.0.0", "array-uniq": "^1.0.2", "beeper": "^1.0.0", @@ -2738,11984 +3461,1061 @@ "through2": "^2.0.0", "vinyl": "^0.5.0" }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/grunt-contrib-imagemin/node_modules/gulp-util/node_modules/object-assign": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-3.0.0.tgz", - "integrity": "sha1-m+3VygiXlJvKR+f/QIBi1Un1h/I=", - "dev": true, - "optional": true, - "engines": { - "node": ">=0.10.0" + "dependencies": { + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==", + "dev": true, + "optional": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==", + "dev": true, + "optional": true, + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + } + }, + "dateformat": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-2.2.0.tgz", + "integrity": "sha512-GODcnWq3YGoTnygPfi02ygEiRxqUxpJwuRHjdhJYuxpcZmDq4rjBiXYmbCCzStxo176ixfLT6i4NPwQooRySnw==", + "dev": true, + "optional": true + }, + "object-assign": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-3.0.0.tgz", + "integrity": "sha512-jHP15vXVGeVh1HuaA2wY6lxk+whK/x4KBG88VXeRma7CCun7iGD5qPc4eYykQ9sdQvg8jkwFKsSxHln2ybW3xQ==", + "dev": true, + "optional": true + }, + "readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dev": true, + "optional": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true, + "optional": true + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "optional": true, + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==", + "dev": true, + "optional": true + }, + "through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "dev": true, + "optional": true, + "requires": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + }, + "vinyl": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-0.5.3.tgz", + "integrity": "sha512-P5zdf3WB9uzr7IFoVQ2wZTmUwHL8cMZWJGzLBNCHNZ3NB6HTMsYABtt7z8tAGIINLXyAob9B9a1yzVGMFOYKEA==", + "dev": true, + "optional": true, + "requires": { + "clone": "^1.0.0", + "clone-stats": "^0.0.1", + "replace-ext": "0.0.1" + } + } } }, - "node_modules/grunt-contrib-imagemin/node_modules/gulp-util/node_modules/through2": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.3.tgz", - "integrity": "sha1-AARWmzfHx0ujnEPzzteNGtlBQL4=", + "gulplog": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/gulplog/-/gulplog-1.0.0.tgz", + "integrity": "sha512-hm6N8nrm3Y08jXie48jsC55eCZz9mnb4OirAStEk2deqeyhXU3C1otDVh+ccttMuc1sBi6RX6ZJ720hs9RCvgw==", "dev": true, "optional": true, - "dependencies": { - "readable-stream": "^2.1.5", - "xtend": "~4.0.1" + "requires": { + "glogg": "^1.0.0" } }, - "node_modules/grunt-contrib-imagemin/node_modules/gulp-util/node_modules/vinyl": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-0.5.3.tgz", - "integrity": "sha1-sEVbOPxeDPMNQyUTLkYZcMIJHN4=", + "gzip-size": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-1.0.0.tgz", + "integrity": "sha512-mu66twX6zg8WB6IPfUtrquS7fjwGnDJ7kdVcggd5rpjwBItQKjHtvhu6VcQMkqPYAR7DjWpEaN3xiBSNmxvzPg==", "dev": true, - "optional": true, - "dependencies": { - "clone": "^1.0.0", - "clone-stats": "^0.0.1", - "replace-ext": "0.0.1" - }, - "engines": { - "node": ">= 0.9" + "requires": { + "browserify-zlib": "^0.1.4", + "concat-stream": "^1.4.1" } }, - "node_modules/grunt-contrib-imagemin/node_modules/gulplog": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/gulplog/-/gulplog-1.0.0.tgz", - "integrity": "sha1-4oxNRdBey77YGDY86PnFkmIp/+U=", + "har-schema": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-1.0.5.tgz", + "integrity": "sha512-f8xf2GOR6Rgwc9FPTLNzgwB+JQ2/zMauYXSWmX5YV5acex6VomT0ocSuwR7BfXo5MpHi+jL+saaux2fwsGJDKQ==", + "dev": true, + "optional": true + }, + "har-validator": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-4.2.1.tgz", + "integrity": "sha512-5Gbp6RAftMYYV3UEI4c4Vv3+a4dQ7taVyvHt+/L6kRt+f4HX1GweAk5UDWN0SvdVnRBzGQ6OG89pGaD9uSFnVw==", "dev": true, "optional": true, - "dependencies": { - "glogg": "^1.0.0" - }, - "engines": { - "node": ">= 0.10" + "requires": { + "ajv": "^4.9.1", + "har-schema": "^1.0.5" } }, - "node_modules/grunt-contrib-imagemin/node_modules/has-ansi": { + "has-ansi": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", - "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", + "integrity": "sha512-C8vBJ8DwUCx19vhm7urhTuUsr4/IyP6l4VzNQDv+ryHQObW3TTTp9yB68WpYgRe2bbaGuZ/se74IqFeVnMnLZg==", "dev": true, - "dependencies": { + "requires": { "ansi-regex": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" } }, - "node_modules/grunt-contrib-imagemin/node_modules/has-gulplog": { + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "has-gulplog": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/has-gulplog/-/has-gulplog-0.1.0.tgz", - "integrity": "sha1-ZBTIKRNpfaUVkDl9r7EvIpZ4Ec4=", + "integrity": "sha512-+F4GzLjwHNNDEAJW2DC1xXfEoPkRDmUdJ7CBYw4MpqtDwOnqdImJl7GWlpqx+Wko6//J8uKTnIe4wZSv7yCqmw==", "dev": true, "optional": true, - "dependencies": { + "requires": { "sparkles": "^1.0.0" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/grunt-contrib-imagemin/node_modules/hosted-git-info": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.5.0.tgz", - "integrity": "sha512-pNgbURSuab90KbTqvRPsseaTxOJCZBD0a7t+haSN33piP9cCM4l0CqdzAif2hUqm716UovKB2ROmiabGAKVXyg==", - "dev": true, - "optional": true - }, - "node_modules/grunt-contrib-imagemin/node_modules/imagemin": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/imagemin/-/imagemin-4.0.0.tgz", - "integrity": "sha1-6Q5/CTaDZZXxj6Ff6Qb0+iWeqEc=", - "dev": true, - "dependencies": { - "buffer-to-vinyl": "^1.0.0", - "concat-stream": "^1.4.6", - "optional": "^0.1.0", - "readable-stream": "^2.0.0", - "stream-combiner2": "^1.1.1", - "vinyl-fs": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0", - "npm": ">=2.1.5" - }, - "optionalDependencies": { - "imagemin-gifsicle": "^4.0.0", - "imagemin-jpegtran": "^4.0.0", - "imagemin-optipng": "^4.0.0", - "imagemin-svgo": "^4.0.0" - } - }, - "node_modules/grunt-contrib-imagemin/node_modules/imagemin-gifsicle": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/imagemin-gifsicle/-/imagemin-gifsicle-4.2.0.tgz", - "integrity": "sha1-D++butNHbmt2iFc2zFsLh6CHV8o=", - "dev": true, - "optional": true, - "dependencies": { - "gifsicle": "^3.0.0", - "is-gif": "^1.0.0", - "through2": "^0.6.1" - }, - "engines": { - "node": ">=0.10.0" } }, - "node_modules/grunt-contrib-imagemin/node_modules/imagemin-jpegtran": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/imagemin-jpegtran/-/imagemin-jpegtran-4.3.2.tgz", - "integrity": "sha1-G8bR4r0T/bZNJFUm1jWn5d/rEvw=", + "has-property-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.1.tgz", + "integrity": "sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg==", "dev": true, - "optional": true, - "dependencies": { - "is-jpg": "^1.0.0", - "jpegtran-bin": "^3.0.0", - "through2": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" + "requires": { + "get-intrinsic": "^1.2.2" } }, - "node_modules/grunt-contrib-imagemin/node_modules/imagemin-jpegtran/node_modules/through2": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.3.tgz", - "integrity": "sha1-AARWmzfHx0ujnEPzzteNGtlBQL4=", - "dev": true, - "optional": true, - "dependencies": { - "readable-stream": "^2.1.5", - "xtend": "~4.0.1" - } + "has-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", + "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", + "dev": true }, - "node_modules/grunt-contrib-imagemin/node_modules/imagemin-optipng": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/imagemin-optipng/-/imagemin-optipng-4.3.0.tgz", - "integrity": "sha1-dgRmOrLuMVczJ0cm/Rw3TStErbY=", - "dev": true, - "optional": true, - "dependencies": { - "exec-buffer": "^2.0.0", - "is-png": "^1.0.0", - "optipng-bin": "^3.0.0", - "through2": "^0.6.1" - }, - "engines": { - "node": ">=0.10.0" - } + "has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "dev": true }, - "node_modules/grunt-contrib-imagemin/node_modules/imagemin-svgo": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/imagemin-svgo/-/imagemin-svgo-4.2.1.tgz", - "integrity": "sha1-VPB9xW9HJgRi32phxUvvtEtXvlU=", + "hasown": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz", + "integrity": "sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==", "dev": true, - "optional": true, - "dependencies": { - "is-svg": "^1.0.0", - "svgo": "^0.6.0", - "through2": "^2.0.0" + "requires": { + "function-bind": "^1.1.2" }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/grunt-contrib-imagemin/node_modules/imagemin-svgo/node_modules/through2": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.3.tgz", - "integrity": "sha1-AARWmzfHx0ujnEPzzteNGtlBQL4=", - "dev": true, - "optional": true, "dependencies": { - "readable-stream": "^2.1.5", - "xtend": "~4.0.1" + "function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "dev": true + } } }, - "node_modules/grunt-contrib-imagemin/node_modules/indent-string": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz", - "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=", + "hawk": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/hawk/-/hawk-3.1.3.tgz", + "integrity": "sha512-X8xbmTc1cbPXcQV4WkLcRMALuyoxhfpFATmyuCxJPOAvrDS4DNnsTAOmKUxMTOWU6TzrTOkxPKwIx5ZOpJVSrg==", "dev": true, "optional": true, - "dependencies": { - "repeating": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" + "requires": { + "boom": "2.x.x", + "cryptiles": "2.x.x", + "hoek": "2.x.x", + "sntp": "1.x.x" } }, - "node_modules/grunt-contrib-imagemin/node_modules/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "hoek": { + "version": "2.16.3", + "resolved": "https://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz", + "integrity": "sha512-V6Yw1rIcYV/4JsnggjBU0l4Kr+EXhpwqXRusENU1Xx6ro00IHPHYNynCuBTOZAPlr3AAmLvchH9I7N/VUdvOwQ==", "dev": true, - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "node_modules/grunt-contrib-imagemin/node_modules/inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", - "dev": true + "optional": true }, - "node_modules/grunt-contrib-imagemin/node_modules/ip-regex": { + "homedir-polyfill": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-1.0.3.tgz", - "integrity": "sha1-3FiQdvZZ9BnCIgOaMzFvHHOH7/0=", - "dev": true, - "optional": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/grunt-contrib-imagemin/node_modules/is-absolute": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/is-absolute/-/is-absolute-0.1.7.tgz", - "integrity": "sha1-hHSREZ/MtftDYhfMc39/qtUPYD8=", + "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz", + "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==", "dev": true, - "optional": true, - "dependencies": { - "is-relative": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" + "requires": { + "parse-passwd": "^1.0.0" } }, - "node_modules/grunt-contrib-imagemin/node_modules/is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", - "dev": true, - "optional": true + "hooker": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/hooker/-/hooker-0.2.3.tgz", + "integrity": "sha512-t+UerCsQviSymAInD01Pw+Dn/usmz1sRO+3Zk1+lx8eg+WKpD2ulcwWqHHL0+aseRBr+3+vIhiG1K1JTwaIcTA==", + "dev": true }, - "node_modules/grunt-contrib-imagemin/node_modules/is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "hosted-git-info": { + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", "dev": true }, - "node_modules/grunt-contrib-imagemin/node_modules/is-builtin-module": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz", - "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=", + "htmlparser2": { + "version": "3.8.3", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.8.3.tgz", + "integrity": "sha512-hBxEg3CYXe+rPIua8ETe7tmG3XDn9B0edOE/e9wH2nLczxzgdu0m0aNHY+5wFZiviLWLdANPJTssa92dMcXQ5Q==", "dev": true, - "optional": true, - "dependencies": { - "builtin-modules": "^1.0.0" + "requires": { + "domelementtype": "1", + "domhandler": "2.3", + "domutils": "1.5", + "entities": "1.0", + "readable-stream": "1.1" }, - "engines": { - "node": ">=0.10.0" + "dependencies": { + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==", + "dev": true + }, + "readable-stream": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", + "integrity": "sha512-+MeVjFf4L44XUkhM1eYbD8fyEsxcV81pqMSR5gblfcLCHfZvbrqy4/qYHE+/R5HoBUT11WV5O08Cr1n3YXkWVQ==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==", + "dev": true + } } }, - "node_modules/grunt-contrib-imagemin/node_modules/is-bzip2": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-bzip2/-/is-bzip2-1.0.0.tgz", - "integrity": "sha1-XuWOqlounIDiFAe+3yOuWsCRs/w=", + "http-errors": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.3.1.tgz", + "integrity": "sha512-gMygNskMurDCWfoCdyh1gOeDfSbkAHXqz94QoPj5IHIUjC/BG8/xv7FSEUr7waR5RcAya4j58bft9Wu/wHNeXA==", "dev": true, - "optional": true, - "engines": { - "node": ">=0.10.0" + "requires": { + "inherits": "~2.0.1", + "statuses": "1" } }, - "node_modules/grunt-contrib-imagemin/node_modules/is-dotfile": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/is-dotfile/-/is-dotfile-1.0.3.tgz", - "integrity": "sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE=", + "http-parser-js": { + "version": "0.5.8", + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.8.tgz", + "integrity": "sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q==", + "dev": true + }, + "http-signature": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.1.1.tgz", + "integrity": "sha512-iUn0NcRULlDGtqNLN1Jxmzayk8ogm7NToldASyZBpM2qggbphjXzNOiw3piN8tgz+e/DRs6X5gAzFwTI6BCRcg==", "dev": true, - "engines": { - "node": ">=0.10.0" + "optional": true, + "requires": { + "assert-plus": "^0.2.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" } }, - "node_modules/grunt-contrib-imagemin/node_modules/is-equal-shallow": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz", - "integrity": "sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ=", + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", "dev": true, - "dependencies": { - "is-primitive": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" + "requires": { + "safer-buffer": ">= 2.1.2 < 3" } }, - "node_modules/grunt-contrib-imagemin/node_modules/is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "dev": true + }, + "image-size": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/image-size/-/image-size-0.5.5.tgz", + "integrity": "sha512-6TDAlDPZxUFCv+fuOkIoXT/V/f3Qbq8e37p+YOiYrUv3v9cc3/6x78VdfPgFVaB9dZYeLUfKgHRebpkm/oP2VQ==", "dev": true, - "engines": { - "node": ">=0.10.0" - } + "optional": true }, - "node_modules/grunt-contrib-imagemin/node_modules/is-finite": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz", - "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=", + "imagemin": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/imagemin/-/imagemin-4.0.0.tgz", + "integrity": "sha512-iJyJW7JAHHGsbmb729CEpEILUXx8xXvczQ8SAS8nT97UPKkawgoMGIuW+It9lyRerPSiB7eliZ/tE2K3Bww5uA==", "dev": true, - "optional": true, - "dependencies": { - "number-is-nan": "^1.0.0" + "requires": { + "buffer-to-vinyl": "^1.0.0", + "concat-stream": "^1.4.6", + "imagemin-gifsicle": "^4.0.0", + "imagemin-jpegtran": "^4.0.0", + "imagemin-optipng": "^4.0.0", + "imagemin-svgo": "^4.0.0", + "optional": "^0.1.0", + "readable-stream": "^2.0.0", + "stream-combiner2": "^1.1.1", + "vinyl-fs": "^2.1.1" }, - "engines": { - "node": ">=0.10.0" + "dependencies": { + "readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + } } }, - "node_modules/grunt-contrib-imagemin/node_modules/is-gif": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-gif/-/is-gif-1.0.0.tgz", - "integrity": "sha1-ptKumIkwB7/6l6HYwB1jIFgyCX4=", + "imagemin-gifsicle": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/imagemin-gifsicle/-/imagemin-gifsicle-4.2.0.tgz", + "integrity": "sha512-YrmI8O4hbNLoS7LDG65QwA92k5pRQ0UkJJSeAq44Pc2fWTMUKTLEYjCBBvSC22qKRZUB7nTEezI/hWC5xE6HTg==", "dev": true, "optional": true, - "engines": { - "node": ">=0.10.0" + "requires": { + "gifsicle": "^3.0.0", + "is-gif": "^1.0.0", + "through2": "^0.6.1" } }, - "node_modules/grunt-contrib-imagemin/node_modules/is-glob": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", - "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "imagemin-jpegtran": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/imagemin-jpegtran/-/imagemin-jpegtran-4.3.2.tgz", + "integrity": "sha512-rTcs0JPWSPUKJKTc2IoFF4Tes34FLKZLSXkxl4z1fS86/zdSjIutA5VZgte/iZZPzyGzKo+EiFbd/T3p2odt9w==", "dev": true, - "dependencies": { - "is-extglob": "^2.1.0" + "optional": true, + "requires": { + "is-jpg": "^1.0.0", + "jpegtran-bin": "^3.0.0", + "through2": "^2.0.0" }, - "engines": { - "node": ">=0.10.0" + "dependencies": { + "readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dev": true, + "optional": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true, + "optional": true + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "optional": true, + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "dev": true, + "optional": true, + "requires": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + } } }, - "node_modules/grunt-contrib-imagemin/node_modules/is-gzip": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-gzip/-/is-gzip-1.0.0.tgz", - "integrity": "sha1-bKiwe5nHeZgCWQDlVc7Y7YCHmoM=", + "imagemin-optipng": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/imagemin-optipng/-/imagemin-optipng-4.3.0.tgz", + "integrity": "sha512-URpRIva07RB3k+v3cUFpMT8sj0MGU349pRfWIZRDrxLrhh0iDxnnzmsD79QCZ4swv51RWgQat3pZnaR8RuQtlg==", "dev": true, "optional": true, - "engines": { - "node": ">=0.10.0" + "requires": { + "exec-buffer": "^2.0.0", + "is-png": "^1.0.0", + "optipng-bin": "^3.0.0", + "through2": "^0.6.1" } }, - "node_modules/grunt-contrib-imagemin/node_modules/is-jpg": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-jpg/-/is-jpg-1.0.0.tgz", - "integrity": "sha1-KVnBfnNDDbOCZNp1uQ3VTy2G2hw=", + "imagemin-svgo": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/imagemin-svgo/-/imagemin-svgo-4.2.1.tgz", + "integrity": "sha512-kAHl0IIfJcrCdje1z4PcVzz7nE2wMgIX9Nolkyl0nNAjEz2P7c2o0ZrJr1FfhKx372cJPWpttALKQ2rE0UpoZg==", "dev": true, "optional": true, - "engines": { - "node": ">=0.10.0" + "requires": { + "is-svg": "^1.0.0", + "svgo": "^0.6.0", + "through2": "^2.0.0" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dev": true, + "optional": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true, + "optional": true + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "optional": true, + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "dev": true, + "optional": true, + "requires": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + } } }, - "node_modules/grunt-contrib-imagemin/node_modules/is-natural-number": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-natural-number/-/is-natural-number-2.1.1.tgz", - "integrity": "sha1-fUxXKDd+84bD4ZSpkRv1fG3DNec=", - "dev": true, - "optional": true - }, - "node_modules/grunt-contrib-imagemin/node_modules/is-number": { + "indent-string": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz", - "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz", + "integrity": "sha512-aqwDFWSgSgfRaEwao5lg5KEcVd/2a+D1rvoG7NdilmYz0NwRk6StWpWdz/Hpk34MKPpx7s8XxUqimfcQK6gGlg==", "dev": true, - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" + "requires": { + "repeating": "^2.0.0" } }, - "node_modules/grunt-contrib-imagemin/node_modules/is-obj": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", - "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=", - "dev": true, - "optional": true, - "engines": { - "node": ">=0.10.0" + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "requires": { + "once": "^1.3.0", + "wrappy": "1" } }, - "node_modules/grunt-contrib-imagemin/node_modules/is-png": { + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "dev": true + }, + "interpret": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-png/-/is-png-1.1.0.tgz", - "integrity": "sha1-1XSxK/J1wDUEVVcLDltXqwYgd84=", - "dev": true, - "optional": true, - "engines": { - "node": ">=0.10.0" - } + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.1.0.tgz", + "integrity": "sha512-CLM8SNMDu7C5psFCn6Wg/tgpj/bKAg7hc2gWqcuR9OD5Ft9PhBpIu8PLicPeis+xDd6YX2ncI8MCA64I9tftIA==", + "dev": true }, - "node_modules/grunt-contrib-imagemin/node_modules/is-posix-bracket": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz", - "integrity": "sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q=", + "ip-regex": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-1.0.3.tgz", + "integrity": "sha512-HjpCHTuxbR/6jWJroc/VN+npo5j0T4Vv2TAI5qdEHQx7hsL767MeccGFSsLtF694EiZKTSEqgoeU6DtGFCcuqQ==", "dev": true, - "engines": { - "node": ">=0.10.0" - } + "optional": true }, - "node_modules/grunt-contrib-imagemin/node_modules/is-primitive": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-primitive/-/is-primitive-2.0.0.tgz", - "integrity": "sha1-IHurkWOEmcB7Kt8kCkGochADRXU=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } + "irregular-plurals": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/irregular-plurals/-/irregular-plurals-1.4.0.tgz", + "integrity": "sha512-kniTIJmaZYiwa17eTtWIfm0K342seyugl6vuC8DiiyiRAJWAVlLkqGCI0Im0neo0TkXw+pRcKaBPRdcKHnQJ6Q==", + "dev": true }, - "node_modules/grunt-contrib-imagemin/node_modules/is-redirect": { + "is-absolute": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-redirect/-/is-redirect-1.0.0.tgz", - "integrity": "sha1-HQPd7VO9jbDzDCbk+V02/HyH3CQ=", + "resolved": "https://registry.npmjs.org/is-absolute/-/is-absolute-1.0.0.tgz", + "integrity": "sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA==", "dev": true, - "optional": true, - "engines": { - "node": ">=0.10.0" + "requires": { + "is-relative": "^1.0.0", + "is-windows": "^1.0.1" } }, - "node_modules/grunt-contrib-imagemin/node_modules/is-relative": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/is-relative/-/is-relative-0.1.3.tgz", - "integrity": "sha1-kF/uiuhvRbPsYUvDwVyGnfCHboI=", - "dev": true, - "optional": true, - "engines": { - "node": ">=0.10.0" - } + "is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "dev": true }, - "node_modules/grunt-contrib-imagemin/node_modules/is-retry-allowed": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-1.1.0.tgz", - "integrity": "sha1-EaBgVotnM5REAz0BJaYaINVk+zQ=", - "dev": true, - "optional": true, - "engines": { - "node": ">=0.10.0" - } + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "dev": true }, - "node_modules/grunt-contrib-imagemin/node_modules/is-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", + "is-bzip2": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-bzip2/-/is-bzip2-1.0.0.tgz", + "integrity": "sha512-v5DA9z/rmk4UdJtb3N1jYqjvCA5roRVf5Q6vprHOcF6U/98TmAJ/AvbPeRMEOYWDW4eMr/pJj5Fnfe0T2wL1Bg==", "dev": true, - "engines": { - "node": ">=0.10.0" - } + "optional": true }, - "node_modules/grunt-contrib-imagemin/node_modules/is-svg": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-svg/-/is-svg-1.1.1.tgz", - "integrity": "sha1-rA76r7ZTrFhHNwix+HNjbKEQ4xs=", + "is-core-module": { + "version": "2.13.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", + "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", "dev": true, - "optional": true, - "engines": { - "node": ">=0.10.0" + "requires": { + "hasown": "^2.0.0" } }, - "node_modules/grunt-contrib-imagemin/node_modules/is-tar": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-tar/-/is-tar-1.0.0.tgz", - "integrity": "sha1-L2suF5LB9bs2UZrKqdZcDSb+hT0=", + "is-dotfile": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-dotfile/-/is-dotfile-1.0.3.tgz", + "integrity": "sha512-9YclgOGtN/f8zx0Pr4FQYMdibBiTaH3sn52vjYip4ZSf6C4/6RfTEZ+MR4GvKhCxdPh21Bg42/WL55f6KSnKpg==", + "dev": true + }, + "is-equal-shallow": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz", + "integrity": "sha512-0EygVC5qPvIyb+gSz7zdD5/AAoS6Qrx1e//6N4yv4oNm30kqvdmG66oZFWVlQHUWe5OjP08FuTw2IdT0EOTcYA==", "dev": true, - "optional": true, - "engines": { - "node": ">=0.10.0" + "requires": { + "is-primitive": "^2.0.0" } }, - "node_modules/grunt-contrib-imagemin/node_modules/is-url": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/is-url/-/is-url-1.2.2.tgz", - "integrity": "sha1-SYkFpZO/R8wtnn9zg3K792lsfyY=", - "dev": true, - "optional": true + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", + "dev": true }, - "node_modules/grunt-contrib-imagemin/node_modules/is-utf8": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", - "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=", + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", "dev": true }, - "node_modules/grunt-contrib-imagemin/node_modules/is-valid-glob": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/is-valid-glob/-/is-valid-glob-0.3.0.tgz", - "integrity": "sha1-1LVcafUYhvm2XHDWwmItN+KfSP4=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } + "is-finite": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.1.0.tgz", + "integrity": "sha512-cdyMtqX/BOqqNBBiKlIVkytNHm49MtMlYyn1zxzvJKWmFMlGzm+ry5BBfYyeY9YmNKbRSo/o7OX9w9ale0wg3w==", + "dev": true }, - "node_modules/grunt-contrib-imagemin/node_modules/is-zip": { + "is-gif": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-zip/-/is-zip-1.0.0.tgz", - "integrity": "sha1-R7Co/004p2QxzP2ZqOFaTIa6IyU=", + "resolved": "https://registry.npmjs.org/is-gif/-/is-gif-1.0.0.tgz", + "integrity": "sha512-WDzHvXD3xfQ5einLRHRH7iReMuPwuXImHikxQeTWP09kGIv2mf2ZM63e9YHVSq9kEgjJuxRSp5AzH8Hga0+lNw==", "dev": true, - "optional": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/grunt-contrib-imagemin/node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true + "optional": true }, - "node_modules/grunt-contrib-imagemin/node_modules/isobject": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", - "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", "dev": true, - "dependencies": { - "isarray": "1.0.0" - }, - "engines": { - "node": ">=0.10.0" + "requires": { + "is-extglob": "^2.1.1" } }, - "node_modules/grunt-contrib-imagemin/node_modules/jpegtran-bin": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/jpegtran-bin/-/jpegtran-bin-3.2.0.tgz", - "integrity": "sha1-9g7PSumZwL2tLp+83ytvCYHnops=", + "is-gzip": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-gzip/-/is-gzip-1.0.0.tgz", + "integrity": "sha512-rcfALRIb1YewtnksfRIHGcIY93QnK8BIQ/2c9yDYcG/Y6+vRoJuTWBmmSEbyLLYtXm7q35pHOHbZFQBaLrhlWQ==", "dev": true, - "hasInstallScript": true, - "optional": true, - "dependencies": { - "bin-build": "^2.0.0", - "bin-wrapper": "^3.0.0", - "logalot": "^2.0.0" - }, - "bin": { - "jpegtran": "cli.js" - }, - "engines": { - "node": ">=0.10.0" - } + "optional": true }, - "node_modules/grunt-contrib-imagemin/node_modules/js-yaml": { - "version": "3.6.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.6.1.tgz", - "integrity": "sha1-bl/mfYsgXOTSL60Ft3geja3MSzA=", + "is-jpg": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-jpg/-/is-jpg-1.0.1.tgz", + "integrity": "sha512-X5PVpLMBH/OaeTN8quzbcLTlwXCb/6n3tcfYTtEDzp0ZwAlgAOtIAIBHN4mS5OcscMgO8etZ5Ol1mNrXSqwBVQ==", "dev": true, - "optional": true, - "dependencies": { - "argparse": "^1.0.7", - "esprima": "^2.6.0" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } + "optional": true }, - "node_modules/grunt-contrib-imagemin/node_modules/json-stable-stringify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz", - "integrity": "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=", + "is-natural-number": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-natural-number/-/is-natural-number-2.1.1.tgz", + "integrity": "sha512-88gG/Fur5/8RkhB6UonqOuwQfNJvuaDStW/+r6oIB/hOQPUQe7DiiDQq0fitGOnARt+mQl/S6rg6Vku+i0sA4w==", "dev": true, - "dependencies": { - "jsonify": "~0.0.0" - } + "optional": true + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true }, - "node_modules/grunt-contrib-imagemin/node_modules/jsonify": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", - "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=", + "is-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", + "integrity": "sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg==", "dev": true, - "engines": { - "node": "*" - } + "optional": true }, - "node_modules/grunt-contrib-imagemin/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", "dev": true, - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" + "requires": { + "isobject": "^3.0.1" } }, - "node_modules/grunt-contrib-imagemin/node_modules/lazy-req": { + "is-png": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/lazy-req/-/lazy-req-1.1.0.tgz", - "integrity": "sha1-va6+rTD42CQDnODOFJ1Nqge6H6w=", + "resolved": "https://registry.npmjs.org/is-png/-/is-png-1.1.0.tgz", + "integrity": "sha512-23Rmps8UEx3Bzqr0JqAtQo0tYP6sDfIfMt1rL9rzlla/zbteftI9LSJoqsIoGgL06sJboDGdVns4RTakAW/WTw==", "dev": true, - "optional": true, - "engines": { - "node": ">=0.10.0" - } + "optional": true + }, + "is-posix-bracket": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz", + "integrity": "sha512-Yu68oeXJ7LeWNmZ3Zov/xg/oDBnBK2RNxwYY1ilNJX+tKKZqgPK+qOn/Gs9jEu66KDY9Netf5XLKNGzas/vPfQ==", + "dev": true + }, + "is-primitive": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-primitive/-/is-primitive-2.0.0.tgz", + "integrity": "sha512-N3w1tFaRfk3UrPfqeRyD+GYDASU3W5VinKhlORy8EWVf/sIdDL9GAcew85XmktCfH+ngG7SRXEVDoO18WMdB/Q==", + "dev": true }, - "node_modules/grunt-contrib-imagemin/node_modules/lazystream": { + "is-redirect": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.0.tgz", - "integrity": "sha1-9plf4PggOS9hOWvolGJAe7dxaOQ=", + "resolved": "https://registry.npmjs.org/is-redirect/-/is-redirect-1.0.0.tgz", + "integrity": "sha512-cr/SlUEe5zOGmzvj9bUyC4LVvkNVAXu4GytXLNMr1pny+a65MpQ9IJzFHD5vi7FyJgb4qt27+eS3TuQnqB+RQw==", "dev": true, - "dependencies": { - "readable-stream": "^2.0.5" - }, - "engines": { - "node": ">= 0.6.3" - } + "optional": true }, - "node_modules/grunt-contrib-imagemin/node_modules/load-json-file": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", - "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", + "is-relative": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-relative/-/is-relative-1.0.0.tgz", + "integrity": "sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA==", "dev": true, - "optional": true, - "dependencies": { - "graceful-fs": "^4.1.2", - "parse-json": "^2.2.0", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0", - "strip-bom": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" + "requires": { + "is-unc-path": "^1.0.0" } }, - "node_modules/grunt-contrib-imagemin/node_modules/lodash._basecopy": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz", - "integrity": "sha1-jaDmqHbPNEwK2KVIghEd08XHyjY=", + "is-retry-allowed": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-1.2.0.tgz", + "integrity": "sha512-RUbUeKwvm3XG2VYamhJL1xFktgjvPzL0Hq8C+6yrWIswDy3BIXGqCxhxkc30N9jqK311gVU137K8Ei55/zVJRg==", "dev": true, "optional": true }, - "node_modules/grunt-contrib-imagemin/node_modules/lodash._basetostring": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/lodash._basetostring/-/lodash._basetostring-3.0.1.tgz", - "integrity": "sha1-0YYdh3+CSlL2aYMtyvPuFVZqB9U=", - "dev": true, - "optional": true + "is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==", + "dev": true }, - "node_modules/grunt-contrib-imagemin/node_modules/lodash._basevalues": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lodash._basevalues/-/lodash._basevalues-3.0.0.tgz", - "integrity": "sha1-W3dXYoAr3j0yl1A+JjAIIP32Ybc=", + "is-svg": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-svg/-/is-svg-1.1.1.tgz", + "integrity": "sha512-o6rxtFf0DlA6nJLX/5IrDRjuRJ4FeSmoFhJW/wKNF8WrcS7jg/zXM5od1HFMVnymFhFWcvLEXXcqUq0Np3e4MA==", "dev": true, "optional": true }, - "node_modules/grunt-contrib-imagemin/node_modules/lodash._getnative": { - "version": "3.9.1", - "resolved": "https://registry.npmjs.org/lodash._getnative/-/lodash._getnative-3.9.1.tgz", - "integrity": "sha1-VwvH3t5G1hzc3mh9ZdPuy6o6r/U=", + "is-tar": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-tar/-/is-tar-1.0.0.tgz", + "integrity": "sha512-8sR603bS6APKxcdkQ1e5rAC9JDCxM3OlbGJDWv5ajhHqIh6cTaqcpeOTch1iIeHYY4nHEFTgmCiGSLfvmODH4w==", "dev": true, "optional": true }, - "node_modules/grunt-contrib-imagemin/node_modules/lodash._isiterateecall": { - "version": "3.0.9", - "resolved": "https://registry.npmjs.org/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz", - "integrity": "sha1-UgOte6Ql+uhCRg5pbbnPPmqsBXw=", + "is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==", "dev": true, "optional": true }, - "node_modules/grunt-contrib-imagemin/node_modules/lodash._reescape": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lodash._reescape/-/lodash._reescape-3.0.0.tgz", - "integrity": "sha1-Kx1vXf4HyKNVdT5fJ/rH8c3hYWo=", + "is-unc-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-unc-path/-/is-unc-path-1.0.0.tgz", + "integrity": "sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ==", "dev": true, - "optional": true + "requires": { + "unc-path-regex": "^0.1.2" + } }, - "node_modules/grunt-contrib-imagemin/node_modules/lodash._reevaluate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lodash._reevaluate/-/lodash._reevaluate-3.0.0.tgz", - "integrity": "sha1-WLx0xAZklTrgsSTYBpltrKQx4u0=", + "is-url": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/is-url/-/is-url-1.2.4.tgz", + "integrity": "sha512-ITvGim8FhRiYe4IQ5uHSkj7pVaPDrCTkNd3yq3cV7iZAcJdHTUMPMEHcqSOy9xZ9qFenQCvi+2wjH9a1nXqHww==", "dev": true, "optional": true }, - "node_modules/grunt-contrib-imagemin/node_modules/lodash._reinterpolate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz", - "integrity": "sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0=", + "is-utf8": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", + "integrity": "sha512-rMYPYvCzsXywIsldgLaSoPlw5PfoB/ssr7hY4pLfcodrA5M/eArza1a9VmTiNIBNMjOGr1Ow9mTyU2o69U6U9Q==", + "dev": true + }, + "is-valid-glob": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/is-valid-glob/-/is-valid-glob-0.3.0.tgz", + "integrity": "sha512-CvG8EtJZ8FyzVOGPzrDorzyN65W1Ld8BVnqshRCah6pFIsprGx3dKgFtjLn/Vw9kGqR4OlR84U7yhT9ZVTyWIQ==", + "dev": true + }, + "is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", + "dev": true + }, + "is-zip": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-zip/-/is-zip-1.0.0.tgz", + "integrity": "sha512-aym/dLqHZVMW/+bbNrA/eTeWTyW4fE6koLSoFSsM2GF3/pho7aPCcmHFWFLvzHu7MDuf67domYn36GDwU/cJkQ==", "dev": true, "optional": true }, - "node_modules/grunt-contrib-imagemin/node_modules/lodash._root": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "dev": true + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true + }, + "isobject": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/lodash._root/-/lodash._root-3.0.1.tgz", - "integrity": "sha1-+6HEUkwZ7ppfgTa0YJ8BfPTe1pI=", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "dev": true + }, + "isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==", "dev": true, "optional": true }, - "node_modules/grunt-contrib-imagemin/node_modules/lodash.escape": { + "jpegtran-bin": { "version": "3.2.0", - "resolved": "https://registry.npmjs.org/lodash.escape/-/lodash.escape-3.2.0.tgz", - "integrity": "sha1-mV7g3BjBtIzJLv+ucaEKq1tIdpg=", + "resolved": "https://registry.npmjs.org/jpegtran-bin/-/jpegtran-bin-3.2.0.tgz", + "integrity": "sha512-XdDj5m/ssa1Anieqd8/JVQLrIsBZ6A9rYzASfpNI0/o/rfsmQx1TP3zZ1GvkMMW5sVlqM2RcMjy8bg428UE9fQ==", "dev": true, "optional": true, - "dependencies": { - "lodash._root": "^3.0.0" + "requires": { + "bin-build": "^2.0.0", + "bin-wrapper": "^3.0.0", + "logalot": "^2.0.0" } }, - "node_modules/grunt-contrib-imagemin/node_modules/lodash.isarguments": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz", - "integrity": "sha1-L1c9hcaiQon/AGY7SRwdM4/zRYo=", + "js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", "dev": true, - "optional": true + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } }, - "node_modules/grunt-contrib-imagemin/node_modules/lodash.isarray": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/lodash.isarray/-/lodash.isarray-3.0.4.tgz", - "integrity": "sha1-eeTriMNqgSKvhvhEqpvNhRtfu1U=", + "jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==", "dev": true, "optional": true }, - "node_modules/grunt-contrib-imagemin/node_modules/lodash.isequal": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", - "integrity": "sha1-QVxEePK8wwEgwizhDtMib30+GOA=", - "dev": true - }, - "node_modules/grunt-contrib-imagemin/node_modules/lodash.keys": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-3.1.2.tgz", - "integrity": "sha1-TbwEcrFWvlCgsoaFXRvQsMZWCYo=", - "dev": true, - "optional": true, - "dependencies": { - "lodash._getnative": "^3.0.0", - "lodash.isarguments": "^3.0.0", - "lodash.isarray": "^3.0.0" - } - }, - "node_modules/grunt-contrib-imagemin/node_modules/lodash.restparam": { - "version": "3.6.1", - "resolved": "https://registry.npmjs.org/lodash.restparam/-/lodash.restparam-3.6.1.tgz", - "integrity": "sha1-k2pOMJ7zMKdkXtQUWYbIWuWyCAU=", - "dev": true, - "optional": true - }, - "node_modules/grunt-contrib-imagemin/node_modules/lodash.template": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-3.6.2.tgz", - "integrity": "sha1-+M3sxhaaJVvpCYrosMU9N4kx0U8=", - "dev": true, - "optional": true, - "dependencies": { - "lodash._basecopy": "^3.0.0", - "lodash._basetostring": "^3.0.0", - "lodash._basevalues": "^3.0.0", - "lodash._isiterateecall": "^3.0.0", - "lodash._reinterpolate": "^3.0.0", - "lodash.escape": "^3.0.0", - "lodash.keys": "^3.0.0", - "lodash.restparam": "^3.0.0", - "lodash.templatesettings": "^3.0.0" - } - }, - "node_modules/grunt-contrib-imagemin/node_modules/lodash.templatesettings": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-3.1.1.tgz", - "integrity": "sha1-+zB4RHU7Zrnxr6VOJix0UwfbqOU=", - "dev": true, - "optional": true, - "dependencies": { - "lodash._reinterpolate": "^3.0.0", - "lodash.escape": "^3.0.0" - } - }, - "node_modules/grunt-contrib-imagemin/node_modules/logalot": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/logalot/-/logalot-2.1.0.tgz", - "integrity": "sha1-X46MkNME7fElMJUaVVSruMXj9VI=", - "dev": true, - "optional": true, - "dependencies": { - "figures": "^1.3.5", - "squeak": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/grunt-contrib-imagemin/node_modules/longest": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz", - "integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc=", - "dev": true, - "optional": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/grunt-contrib-imagemin/node_modules/loud-rejection": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz", - "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=", - "dev": true, - "optional": true, - "dependencies": { - "currently-unhandled": "^0.4.1", - "signal-exit": "^3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/grunt-contrib-imagemin/node_modules/lowercase-keys": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.0.tgz", - "integrity": "sha1-TjNms55/VFfjXxMkvfb4jQv8cwY=", - "dev": true, - "optional": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/grunt-contrib-imagemin/node_modules/lpad-align": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/lpad-align/-/lpad-align-1.1.2.tgz", - "integrity": "sha1-IfYArBwwlcPG5JfuZyce4ISB/p4=", - "dev": true, - "optional": true, - "dependencies": { - "get-stdin": "^4.0.1", - "indent-string": "^2.1.0", - "longest": "^1.0.0", - "meow": "^3.3.0" - }, - "bin": { - "lpad-align": "cli.js" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/grunt-contrib-imagemin/node_modules/map-obj": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", - "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=", - "dev": true, - "optional": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/grunt-contrib-imagemin/node_modules/meow": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz", - "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=", - "dev": true, - "optional": true, - "dependencies": { - "camelcase-keys": "^2.0.0", - "decamelize": "^1.1.2", - "loud-rejection": "^1.0.0", - "map-obj": "^1.0.1", - "minimist": "^1.1.3", - "normalize-package-data": "^2.3.4", - "object-assign": "^4.0.1", - "read-pkg-up": "^1.0.1", - "redent": "^1.0.0", - "trim-newlines": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/grunt-contrib-imagemin/node_modules/meow/node_modules/object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", - "dev": true, - "optional": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/grunt-contrib-imagemin/node_modules/merge-stream": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-1.0.1.tgz", - "integrity": "sha1-QEEgLVCKNCugAXQAjfDCUbjBNeE=", - "dev": true, - "dependencies": { - "readable-stream": "^2.0.1" - } - }, - "node_modules/grunt-contrib-imagemin/node_modules/micromatch": { - "version": "2.3.11", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", - "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", - "dev": true, - "dependencies": { - "arr-diff": "^2.0.0", - "array-unique": "^0.2.1", - "braces": "^1.8.2", - "expand-brackets": "^0.1.4", - "extglob": "^0.3.1", - "filename-regex": "^2.0.0", - "is-extglob": "^1.0.0", - "is-glob": "^2.0.1", - "kind-of": "^3.0.2", - "normalize-path": "^2.0.1", - "object.omit": "^2.0.0", - "parse-glob": "^3.0.4", - "regex-cache": "^0.4.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/grunt-contrib-imagemin/node_modules/micromatch/node_modules/is-extglob": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", - "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/grunt-contrib-imagemin/node_modules/micromatch/node_modules/is-glob": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", - "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", - "dev": true, - "dependencies": { - "is-extglob": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/grunt-contrib-imagemin/node_modules/minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "dev": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/grunt-contrib-imagemin/node_modules/mkdirp": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", - "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", - "deprecated": "Legacy versions of mkdirp are no longer supported. Please update to mkdirp 1.x. (Note that the API surface has changed to use Promises in 1.x.)", - "dev": true, - "dependencies": { - "minimist": "0.0.8" - }, - "bin": { - "mkdirp": "bin/cmd.js" - } - }, - "node_modules/grunt-contrib-imagemin/node_modules/mkdirp/node_modules/minimist": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", - "dev": true - }, - "node_modules/grunt-contrib-imagemin/node_modules/multipipe": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/multipipe/-/multipipe-0.1.2.tgz", - "integrity": "sha1-Ko8t33Du1WTf8tV/HhoTfZ8FB4s=", - "dev": true, - "optional": true, - "dependencies": { - "duplexer2": "0.0.2" - } - }, - "node_modules/grunt-contrib-imagemin/node_modules/multipipe/node_modules/duplexer2": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.0.2.tgz", - "integrity": "sha1-xhTc9n4vsUmVqRcR5aYX6KYKMds=", - "dev": true, - "optional": true, - "dependencies": { - "readable-stream": "~1.1.9" - } - }, - "node_modules/grunt-contrib-imagemin/node_modules/multipipe/node_modules/isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", - "dev": true, - "optional": true - }, - "node_modules/grunt-contrib-imagemin/node_modules/multipipe/node_modules/readable-stream": { - "version": "1.1.14", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", - "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", - "dev": true, - "optional": true, - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - } - }, - "node_modules/grunt-contrib-imagemin/node_modules/multipipe/node_modules/string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", - "dev": true, - "optional": true - }, - "node_modules/grunt-contrib-imagemin/node_modules/node-status-codes": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/node-status-codes/-/node-status-codes-1.0.0.tgz", - "integrity": "sha1-WuVUHQJGRdMqWPzdyc7s6nrjrC8=", - "dev": true, - "optional": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/grunt-contrib-imagemin/node_modules/normalize-package-data": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz", - "integrity": "sha512-9jjUFbTPfEy3R/ad/2oNbKtW9Hgovl5O1FvFWKkKblNXoN/Oou6+9+KKohPK13Yc3/TyunyWhJp6gvRNR/PPAw==", - "dev": true, - "optional": true, - "dependencies": { - "hosted-git-info": "^2.1.4", - "is-builtin-module": "^1.0.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - } - }, - "node_modules/grunt-contrib-imagemin/node_modules/normalize-path": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", - "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", - "dev": true, - "dependencies": { - "remove-trailing-separator": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/grunt-contrib-imagemin/node_modules/number-is-nan": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", - "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/grunt-contrib-imagemin/node_modules/object-assign": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-2.1.1.tgz", - "integrity": "sha1-Q8NuXVaf+OSBbE76i+AtJpZ8GKo=", - "dev": true, - "optional": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/grunt-contrib-imagemin/node_modules/object.omit": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz", - "integrity": "sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=", - "dev": true, - "dependencies": { - "for-own": "^0.1.4", - "is-extendable": "^0.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/grunt-contrib-imagemin/node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dev": true, - "dependencies": { - "wrappy": "1" - } - }, - "node_modules/grunt-contrib-imagemin/node_modules/onetime": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-1.1.0.tgz", - "integrity": "sha1-ofeDj4MUxRbwXs78vEzP4EtO14k=", - "dev": true, - "optional": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/grunt-contrib-imagemin/node_modules/optional": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/optional/-/optional-0.1.4.tgz", - "integrity": "sha512-gtvrrCfkE08wKcgXaVwQVgwEQ8vel2dc5DDBn9RLQZ3YtmtkBss6A2HY6BnJH4N/4Ku97Ri/SF8sNWE2225WJw==", - "dev": true - }, - "node_modules/grunt-contrib-imagemin/node_modules/optipng-bin": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/optipng-bin/-/optipng-bin-3.1.4.tgz", - "integrity": "sha1-ldNPLEiHBPb9cGBr/qDGWfHZXYQ=", + "jshint": { + "version": "2.9.5", + "resolved": "https://registry.npmjs.org/jshint/-/jshint-2.9.5.tgz", + "integrity": "sha512-a4rJTGuWzFrZ7eDxb3ID5A9pIBn6pvn5GI97luAZJtfCzvN6FeoOc8li38eoYrpo4AGTVb6lvVcLmXpOuJbNYQ==", "dev": true, - "hasInstallScript": true, - "optional": true, - "dependencies": { - "bin-build": "^2.0.0", - "bin-wrapper": "^3.0.0", - "logalot": "^2.0.0" - }, - "bin": { - "optipng": "cli.js" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/grunt-contrib-imagemin/node_modules/ordered-read-streams": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/ordered-read-streams/-/ordered-read-streams-0.3.0.tgz", - "integrity": "sha1-cTfmmzKYuzQiR6G77jiByA4v14s=", - "dev": true, - "dependencies": { - "is-stream": "^1.0.1", - "readable-stream": "^2.0.1" - } - }, - "node_modules/grunt-contrib-imagemin/node_modules/os-filter-obj": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/os-filter-obj/-/os-filter-obj-1.0.3.tgz", - "integrity": "sha1-WRUzDZDs7VV9LZOKMcbdIU2cY60=", - "dev": true, - "optional": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/grunt-contrib-imagemin/node_modules/parse-glob": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz", - "integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=", - "dev": true, - "dependencies": { - "glob-base": "^0.3.0", - "is-dotfile": "^1.0.0", - "is-extglob": "^1.0.0", - "is-glob": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/grunt-contrib-imagemin/node_modules/parse-glob/node_modules/is-extglob": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", - "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/grunt-contrib-imagemin/node_modules/parse-glob/node_modules/is-glob": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", - "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", - "dev": true, - "dependencies": { - "is-extglob": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/grunt-contrib-imagemin/node_modules/parse-json": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", - "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", - "dev": true, - "optional": true, - "dependencies": { - "error-ex": "^1.2.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/grunt-contrib-imagemin/node_modules/path-dirname": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", - "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=", - "dev": true - }, - "node_modules/grunt-contrib-imagemin/node_modules/path-exists": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", - "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", - "dev": true, - "optional": true, - "dependencies": { - "pinkie-promise": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/grunt-contrib-imagemin/node_modules/path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/grunt-contrib-imagemin/node_modules/path-type": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", - "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", - "dev": true, - "optional": true, - "dependencies": { - "graceful-fs": "^4.1.2", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/grunt-contrib-imagemin/node_modules/pend": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", - "integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA=", - "dev": true, - "optional": true - }, - "node_modules/grunt-contrib-imagemin/node_modules/pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true, - "optional": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/grunt-contrib-imagemin/node_modules/pinkie": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", - "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", - "dev": true, - "optional": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/grunt-contrib-imagemin/node_modules/pinkie-promise": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", - "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", - "dev": true, - "optional": true, - "dependencies": { - "pinkie": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/grunt-contrib-imagemin/node_modules/prepend-http": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", - "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=", - "dev": true, - "optional": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/grunt-contrib-imagemin/node_modules/preserve": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz", - "integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/grunt-contrib-imagemin/node_modules/pretty-bytes": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-3.0.1.tgz", - "integrity": "sha1-J9AAjXeAY6C0gRuzXHnxvV1fvM8=", - "dev": true, - "dependencies": { - "number-is-nan": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/grunt-contrib-imagemin/node_modules/process-nextick-args": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", - "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==", - "dev": true - }, - "node_modules/grunt-contrib-imagemin/node_modules/q": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", - "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=", - "dev": true, - "optional": true, - "engines": { - "node": ">=0.6.0", - "teleport": ">=0.2.0" - } - }, - "node_modules/grunt-contrib-imagemin/node_modules/randomatic": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-1.1.7.tgz", - "integrity": "sha512-D5JUjPyJbaJDkuAazpVnSfVkLlpeO3wDlPROTMLGKG1zMFNFRgrciKo1ltz/AzNTkqE0HzDx655QOL51N06how==", - "dev": true, - "dependencies": { - "is-number": "^3.0.0", - "kind-of": "^4.0.0" - }, - "engines": { - "node": ">= 0.10.0" - } - }, - "node_modules/grunt-contrib-imagemin/node_modules/randomatic/node_modules/is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dev": true, - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/grunt-contrib-imagemin/node_modules/randomatic/node_modules/is-number/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/grunt-contrib-imagemin/node_modules/randomatic/node_modules/kind-of": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", - "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", - "dev": true, - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/grunt-contrib-imagemin/node_modules/rc": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.5.tgz", - "integrity": "sha1-J1zWh/bjs2zHVrqibf7oCnkDAf0=", - "dev": true, - "optional": true, - "dependencies": { - "deep-extend": "~0.4.0", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" - }, - "bin": { - "rc": "cli.js" - } - }, - "node_modules/grunt-contrib-imagemin/node_modules/read-all-stream": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/read-all-stream/-/read-all-stream-3.1.0.tgz", - "integrity": "sha1-NcPhd/IHjveJ7kv6+kNzB06u9Po=", - "dev": true, - "optional": true, - "dependencies": { - "pinkie-promise": "^2.0.0", - "readable-stream": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/grunt-contrib-imagemin/node_modules/read-pkg": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", - "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", - "dev": true, - "optional": true, - "dependencies": { - "load-json-file": "^1.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/grunt-contrib-imagemin/node_modules/read-pkg-up": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", - "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", - "dev": true, - "optional": true, - "dependencies": { - "find-up": "^1.0.0", - "read-pkg": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/grunt-contrib-imagemin/node_modules/readable-stream": { - "version": "2.3.4", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.4.tgz", - "integrity": "sha512-vuYxeWYM+fde14+rajzqgeohAI7YoJcHE7kXDAc4Nk0EbuKnJfqtY9YtRkLo/tqkuF7MsBQRhPnPeyjYITp3ZQ==", - "dev": true, - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.0.3", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/grunt-contrib-imagemin/node_modules/redent": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz", - "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=", - "dev": true, - "optional": true, - "dependencies": { - "indent-string": "^2.1.0", - "strip-indent": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/grunt-contrib-imagemin/node_modules/regex-cache": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.4.tgz", - "integrity": "sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ==", - "dev": true, - "dependencies": { - "is-equal-shallow": "^0.1.3" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/grunt-contrib-imagemin/node_modules/repeat-element": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.2.tgz", - "integrity": "sha1-7wiaF40Ug7quTZPrmLT55OEdmQo=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/grunt-contrib-imagemin/node_modules/repeat-string": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", - "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", - "dev": true, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/grunt-contrib-imagemin/node_modules/repeating": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", - "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", - "dev": true, - "optional": true, - "dependencies": { - "is-finite": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/grunt-contrib-imagemin/node_modules/replace-ext": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-0.0.1.tgz", - "integrity": "sha1-KbvZIHinOfC8zitO5B6DeVNSKSQ=", - "dev": true, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/grunt-contrib-imagemin/node_modules/rimraf": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", - "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", - "dev": true, - "optional": true, - "dependencies": { - "glob": "^7.0.5" - }, - "bin": { - "rimraf": "bin.js" - } - }, - "node_modules/grunt-contrib-imagemin/node_modules/rimraf/node_modules/glob": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", - "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", - "dev": true, - "optional": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - } - }, - "node_modules/grunt-contrib-imagemin/node_modules/safe-buffer": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", - "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==", - "dev": true - }, - "node_modules/grunt-contrib-imagemin/node_modules/sax": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", - "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", - "dev": true, - "optional": true - }, - "node_modules/grunt-contrib-imagemin/node_modules/seek-bzip": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/seek-bzip/-/seek-bzip-1.0.5.tgz", - "integrity": "sha1-z+kXyz0nS8/6x5J1ivUxc+sfq9w=", - "dev": true, - "optional": true, - "dependencies": { - "commander": "~2.8.1" - }, - "bin": { - "seek-bunzip": "bin/seek-bunzip", - "seek-table": "bin/seek-bzip-table" - } - }, - "node_modules/grunt-contrib-imagemin/node_modules/semver": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz", - "integrity": "sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA==", - "dev": true, - "optional": true, - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/grunt-contrib-imagemin/node_modules/semver-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/semver-regex/-/semver-regex-1.0.0.tgz", - "integrity": "sha1-kqSWkGX5xwxpR1PVUkj8aPj2Usk=", - "dev": true, - "optional": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/grunt-contrib-imagemin/node_modules/semver-truncate": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/semver-truncate/-/semver-truncate-1.1.2.tgz", - "integrity": "sha1-V/Qd5pcHpicJp+AQS6IRcQnqR+g=", - "dev": true, - "optional": true, - "dependencies": { - "semver": "^5.3.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/grunt-contrib-imagemin/node_modules/set-immediate-shim": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz", - "integrity": "sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E=", - "dev": true, - "optional": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/grunt-contrib-imagemin/node_modules/signal-exit": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", - "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", - "dev": true, - "optional": true - }, - "node_modules/grunt-contrib-imagemin/node_modules/source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true, - "optional": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/grunt-contrib-imagemin/node_modules/sparkles": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/sparkles/-/sparkles-1.0.0.tgz", - "integrity": "sha1-Gsu/tZJDbRC76PeFt8xvgoFQEsM=", - "dev": true, - "optional": true, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/grunt-contrib-imagemin/node_modules/spdx-correct": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-2.0.4.tgz", - "integrity": "sha512-c+4gPpt9YDhz7cHlz5UrsHzxxRi4ksclxnEEKsuGT9JdwSC+ZNmsGbYRzzgxyZaBYpcWnlu+4lPcdLKx4DOCmA==", - "dev": true, - "optional": true, - "dependencies": { - "spdx-expression-parse": "^2.0.1", - "spdx-license-ids": "^2.0.1" - } - }, - "node_modules/grunt-contrib-imagemin/node_modules/spdx-correct/node_modules/spdx-expression-parse": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-2.0.2.tgz", - "integrity": "sha512-oFxOkWCfFS0ltNp0H66gXlU4NF6bxg7RkoTYR0413t+yTY9zyj+AIWsjtN8dcVp6703ijDYBWBIARlJ7DkyP9Q==", - "dev": true, - "optional": true, - "dependencies": { - "spdx-exceptions": "^2.0.0", - "spdx-license-ids": "^2.0.1" - } - }, - "node_modules/grunt-contrib-imagemin/node_modules/spdx-expression-parse": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz", - "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==", - "dev": true, - "optional": true, - "dependencies": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, - "node_modules/grunt-contrib-imagemin/node_modules/spdx-expression-parse/node_modules/spdx-license-ids": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.0.tgz", - "integrity": "sha512-2+EPwgbnmOIl8HjGBXXMd9NAu02vLjOO1nWw4kmeRDFyHn+M/ETfHxQUK0oXg8ctgVnl9t3rosNVsZ1jG61nDA==", - "dev": true, - "optional": true - }, - "node_modules/grunt-contrib-imagemin/node_modules/spdx-license-ids": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-2.0.1.tgz", - "integrity": "sha1-AgF7zDU07k/+9tWNIOfT6aHDyOw=", - "dev": true, - "optional": true - }, - "node_modules/grunt-contrib-imagemin/node_modules/sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", - "dev": true, - "optional": true - }, - "node_modules/grunt-contrib-imagemin/node_modules/squeak": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/squeak/-/squeak-1.3.0.tgz", - "integrity": "sha1-MwRQN7ZDiLVnZ0uEMiplIQc5FsM=", - "dev": true, - "optional": true, - "dependencies": { - "chalk": "^1.0.0", - "console-stream": "^0.1.1", - "lpad-align": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/grunt-contrib-imagemin/node_modules/stat-mode": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/stat-mode/-/stat-mode-0.2.2.tgz", - "integrity": "sha1-5sgLYjEj19gM8TLOU480YokHJQI=", - "dev": true, - "optional": true - }, - "node_modules/grunt-contrib-imagemin/node_modules/stream-combiner2": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/stream-combiner2/-/stream-combiner2-1.1.1.tgz", - "integrity": "sha1-+02KFCDqNidk4hrUeAOXvry0HL4=", - "dev": true, - "dependencies": { - "duplexer2": "~0.1.0", - "readable-stream": "^2.0.2" - } - }, - "node_modules/grunt-contrib-imagemin/node_modules/stream-shift": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.0.tgz", - "integrity": "sha1-1cdSgl5TZ+eG944Y5EXqIjoVWVI=", - "dev": true - }, - "node_modules/grunt-contrib-imagemin/node_modules/string_decoder": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", - "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", - "dev": true, - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/grunt-contrib-imagemin/node_modules/strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, - "dependencies": { - "ansi-regex": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/grunt-contrib-imagemin/node_modules/strip-bom": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", - "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", - "dev": true, - "dependencies": { - "is-utf8": "^0.2.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/grunt-contrib-imagemin/node_modules/strip-bom-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-bom-stream/-/strip-bom-stream-1.0.0.tgz", - "integrity": "sha1-5xRDmFd9Uaa+0PoZlPoF9D/ZiO4=", - "dev": true, - "dependencies": { - "first-chunk-stream": "^1.0.0", - "strip-bom": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/grunt-contrib-imagemin/node_modules/strip-dirs": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/strip-dirs/-/strip-dirs-1.1.1.tgz", - "integrity": "sha1-lgu9EoeETzl1pFWKoQOoJV4kVqA=", - "dev": true, - "optional": true, - "dependencies": { - "chalk": "^1.0.0", - "get-stdin": "^4.0.1", - "is-absolute": "^0.1.5", - "is-natural-number": "^2.0.0", - "minimist": "^1.1.0", - "sum-up": "^1.0.1" - }, - "bin": { - "strip-dirs": "cli.js" - } - }, - "node_modules/grunt-contrib-imagemin/node_modules/strip-indent": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz", - "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=", - "dev": true, - "optional": true, - "dependencies": { - "get-stdin": "^4.0.1" - }, - "bin": { - "strip-indent": "cli.js" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/grunt-contrib-imagemin/node_modules/strip-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", - "dev": true, - "optional": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/grunt-contrib-imagemin/node_modules/strip-outer": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-outer/-/strip-outer-1.0.0.tgz", - "integrity": "sha1-qsC6YNLpDF1PJ1/Yhp/ZotMQ/7g=", - "dev": true, - "optional": true, - "dependencies": { - "escape-string-regexp": "^1.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/grunt-contrib-imagemin/node_modules/sum-up": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sum-up/-/sum-up-1.0.3.tgz", - "integrity": "sha1-HGYfZnBX9jvLeHWqFDi8FiUlFW4=", - "dev": true, - "optional": true, - "dependencies": { - "chalk": "^1.0.0" - } - }, - "node_modules/grunt-contrib-imagemin/node_modules/supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/grunt-contrib-imagemin/node_modules/svgo": { - "version": "0.6.6", - "resolved": "https://registry.npmjs.org/svgo/-/svgo-0.6.6.tgz", - "integrity": "sha1-s0CIkDbyD5tEdUMHfQ9Vc+0ETAg=", - "deprecated": "This SVGO version is no longer supported. Upgrade to v2.x.x.", - "dev": true, - "optional": true, - "dependencies": { - "coa": "~1.0.1", - "colors": "~1.1.2", - "csso": "~2.0.0", - "js-yaml": "~3.6.0", - "mkdirp": "~0.5.1", - "sax": "~1.2.1", - "whet.extend": "~0.9.9" - }, - "bin": { - "svgo": "bin/svgo" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/grunt-contrib-imagemin/node_modules/tar-stream": { - "version": "1.5.5", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-1.5.5.tgz", - "integrity": "sha512-mQdgLPc/Vjfr3VWqWbfxW8yQNiJCbAZ+Gf6GDu1Cy0bdb33ofyiNGBtAY96jHFhDuivCwgW1H9DgTON+INiXgg==", - "dev": true, - "optional": true, - "dependencies": { - "bl": "^1.0.0", - "end-of-stream": "^1.0.0", - "readable-stream": "^2.0.0", - "xtend": "^4.0.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/grunt-contrib-imagemin/node_modules/tempfile": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/tempfile/-/tempfile-1.1.1.tgz", - "integrity": "sha1-W8xOrsxKsscH2LwR2ZzMmiyyh/I=", - "dev": true, - "optional": true, - "dependencies": { - "os-tmpdir": "^1.0.0", - "uuid": "^2.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/grunt-contrib-imagemin/node_modules/through2": { - "version": "0.6.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz", - "integrity": "sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=", - "dev": true, - "dependencies": { - "readable-stream": ">=1.0.33-1 <1.1.0-0", - "xtend": ">=4.0.0 <4.1.0-0" - } - }, - "node_modules/grunt-contrib-imagemin/node_modules/through2-filter": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/through2-filter/-/through2-filter-2.0.0.tgz", - "integrity": "sha1-YLxVoNrLdghdsfna6Zq0P4PWIuw=", - "dev": true, - "dependencies": { - "through2": "~2.0.0", - "xtend": "~4.0.0" - } - }, - "node_modules/grunt-contrib-imagemin/node_modules/through2-filter/node_modules/through2": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.3.tgz", - "integrity": "sha1-AARWmzfHx0ujnEPzzteNGtlBQL4=", - "dev": true, - "dependencies": { - "readable-stream": "^2.1.5", - "xtend": "~4.0.1" - } - }, - "node_modules/grunt-contrib-imagemin/node_modules/through2/node_modules/isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", - "dev": true - }, - "node_modules/grunt-contrib-imagemin/node_modules/through2/node_modules/readable-stream": { - "version": "1.0.34", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", - "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", - "dev": true, - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - } - }, - "node_modules/grunt-contrib-imagemin/node_modules/through2/node_modules/string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", - "dev": true - }, - "node_modules/grunt-contrib-imagemin/node_modules/time-stamp": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/time-stamp/-/time-stamp-1.1.0.tgz", - "integrity": "sha1-dkpaEa9QVhkhsTPztE5hhofg9cM=", - "dev": true, - "optional": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/grunt-contrib-imagemin/node_modules/timed-out": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-3.1.3.tgz", - "integrity": "sha1-lYYL/MXHbCd/j4Mm/Q9bLiDrohc=", - "dev": true, - "optional": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/grunt-contrib-imagemin/node_modules/to-absolute-glob": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/to-absolute-glob/-/to-absolute-glob-0.1.1.tgz", - "integrity": "sha1-HN+kcqnvUMI57maZm2YsoOs5k38=", - "dev": true, - "dependencies": { - "extend-shallow": "^2.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/grunt-contrib-imagemin/node_modules/trim-newlines": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz", - "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=", - "dev": true, - "optional": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/grunt-contrib-imagemin/node_modules/trim-repeated": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/trim-repeated/-/trim-repeated-1.0.0.tgz", - "integrity": "sha1-42RqLqTokTEr9+rObPsFOAvAHCE=", - "dev": true, - "optional": true, - "dependencies": { - "escape-string-regexp": "^1.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/grunt-contrib-imagemin/node_modules/tunnel-agent": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.4.3.tgz", - "integrity": "sha1-Y3PbdpCf5XDgjXNYM2Xtgop07us=", - "dev": true, - "optional": true, - "engines": { - "node": "*" - } - }, - "node_modules/grunt-contrib-imagemin/node_modules/typedarray": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", - "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", - "dev": true - }, - "node_modules/grunt-contrib-imagemin/node_modules/unique-stream": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/unique-stream/-/unique-stream-2.2.1.tgz", - "integrity": "sha1-WqADz76Uxf+GbE59ZouxxNuts2k=", - "dev": true, - "dependencies": { - "json-stable-stringify": "^1.0.0", - "through2-filter": "^2.0.0" - } - }, - "node_modules/grunt-contrib-imagemin/node_modules/unzip-response": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/unzip-response/-/unzip-response-1.0.2.tgz", - "integrity": "sha1-uYTwh3/AqJwsdzzB73tbIytbBv4=", - "dev": true, - "optional": true, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/grunt-contrib-imagemin/node_modules/url-parse-lax": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-1.0.0.tgz", - "integrity": "sha1-evjzA2Rem9eaJy56FKxovAYJ2nM=", - "dev": true, - "optional": true, - "dependencies": { - "prepend-http": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/grunt-contrib-imagemin/node_modules/url-regex": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/url-regex/-/url-regex-3.2.0.tgz", - "integrity": "sha1-260eDJ4p4QXdCx8J9oYvf9tIJyQ=", - "dev": true, - "optional": true, - "dependencies": { - "ip-regex": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/grunt-contrib-imagemin/node_modules/util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", - "dev": true - }, - "node_modules/grunt-contrib-imagemin/node_modules/uuid": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-2.0.3.tgz", - "integrity": "sha1-Z+LoY3lyFVMN/zGOW/nc6/1Hsho=", - "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", - "dev": true - }, - "node_modules/grunt-contrib-imagemin/node_modules/vali-date": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/vali-date/-/vali-date-1.0.0.tgz", - "integrity": "sha1-G5BKWWCfsyjvB4E4Qgk09rhnCaY=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/grunt-contrib-imagemin/node_modules/validate-npm-package-license": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.2.tgz", - "integrity": "sha512-8zlGw3EZDpC7iUDKy4yHCSqFwkBTeAK4h1QqDC3ST6rT7dzvu2ZuclExZN7zuXNEhQ3+2UBQgdca5eNNL06sBg==", - "dev": true, - "optional": true, - "dependencies": { - "spdx-correct": "^2.0.4", - "spdx-expression-parse": "^3.0.0" - } - }, - "node_modules/grunt-contrib-imagemin/node_modules/vinyl": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-1.2.0.tgz", - "integrity": "sha1-XIgDbPVl5d8FVYv8kR+GVt8hiIQ=", - "dev": true, - "dependencies": { - "clone": "^1.0.0", - "clone-stats": "^0.0.1", - "replace-ext": "0.0.1" - }, - "engines": { - "node": ">= 0.9" - } - }, - "node_modules/grunt-contrib-imagemin/node_modules/vinyl-assign": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/vinyl-assign/-/vinyl-assign-1.2.1.tgz", - "integrity": "sha1-TRmIkbVRWRHXcajNnFSApGoHSkU=", - "dev": true, - "optional": true, - "dependencies": { - "object-assign": "^4.0.1", - "readable-stream": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/grunt-contrib-imagemin/node_modules/vinyl-assign/node_modules/object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", - "dev": true, - "optional": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/grunt-contrib-imagemin/node_modules/vinyl-fs": { - "version": "2.4.4", - "resolved": "https://registry.npmjs.org/vinyl-fs/-/vinyl-fs-2.4.4.tgz", - "integrity": "sha1-vm/zJwy1Xf19MGNkDegfJddTIjk=", - "dev": true, - "dependencies": { - "duplexify": "^3.2.0", - "glob-stream": "^5.3.2", - "graceful-fs": "^4.0.0", - "gulp-sourcemaps": "1.6.0", - "is-valid-glob": "^0.3.0", - "lazystream": "^1.0.0", - "lodash.isequal": "^4.0.0", - "merge-stream": "^1.0.0", - "mkdirp": "^0.5.0", - "object-assign": "^4.0.0", - "readable-stream": "^2.0.4", - "strip-bom": "^2.0.0", - "strip-bom-stream": "^1.0.0", - "through2": "^2.0.0", - "through2-filter": "^2.0.0", - "vali-date": "^1.0.0", - "vinyl": "^1.0.0" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/grunt-contrib-imagemin/node_modules/vinyl-fs/node_modules/object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/grunt-contrib-imagemin/node_modules/vinyl-fs/node_modules/through2": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.3.tgz", - "integrity": "sha1-AARWmzfHx0ujnEPzzteNGtlBQL4=", - "dev": true, - "dependencies": { - "readable-stream": "^2.1.5", - "xtend": "~4.0.1" - } - }, - "node_modules/grunt-contrib-imagemin/node_modules/ware": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/ware/-/ware-1.3.0.tgz", - "integrity": "sha1-0bFPOdLiy0q4xAmPdW/ksWTkc9Q=", - "dev": true, - "optional": true, - "dependencies": { - "wrap-fn": "^0.1.0" - } - }, - "node_modules/grunt-contrib-imagemin/node_modules/whet.extend": { - "version": "0.9.9", - "resolved": "https://registry.npmjs.org/whet.extend/-/whet.extend-0.9.9.tgz", - "integrity": "sha1-+HfVv2SMl+WqVC+twW1qJZucEaE=", - "dev": true, - "optional": true, - "engines": { - "node": ">=0.6.0" - } - }, - "node_modules/grunt-contrib-imagemin/node_modules/wrap-fn": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/wrap-fn/-/wrap-fn-0.1.5.tgz", - "integrity": "sha1-8htuQQFv9KfjFyDbxjoJAWvfmEU=", - "dev": true, - "optional": true, - "dependencies": { - "co": "3.1.0" - } - }, - "node_modules/grunt-contrib-imagemin/node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true - }, - "node_modules/grunt-contrib-imagemin/node_modules/xtend": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", - "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=", - "dev": true, - "engines": { - "node": ">=0.4" - } - }, - "node_modules/grunt-contrib-imagemin/node_modules/yauzl": { - "version": "2.9.1", - "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.9.1.tgz", - "integrity": "sha1-qBmB6nCleUYTOIPwKcWCGok1mn8=", - "dev": true, - "optional": true, - "dependencies": { - "buffer-crc32": "~0.2.3", - "fd-slicer": "~1.0.1" - } - }, - "node_modules/grunt-contrib-jshint": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/grunt-contrib-jshint/-/grunt-contrib-jshint-1.1.0.tgz", - "integrity": "sha1-Np2QmyWTxA6L55lAshNAhQx5Oaw=", - "dev": true, - "dependencies": { - "chalk": "^1.1.1", - "hooker": "^0.2.3", - "jshint": "~2.9.4" - }, - "engines": { - "node": ">=0.10.0" - }, - "peerDependencies": { - "grunt": ">=0.4.0" - } - }, - "node_modules/grunt-contrib-jshint/node_modules/ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/grunt-contrib-jshint/node_modules/ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/grunt-contrib-jshint/node_modules/balanced-match": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", - "dev": true - }, - "node_modules/grunt-contrib-jshint/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/grunt-contrib-jshint/node_modules/chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "dependencies": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/grunt-contrib-jshint/node_modules/cli": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/cli/-/cli-1.0.1.tgz", - "integrity": "sha1-IoF1NPJL+klQw01TLUjsvGIbjBQ=", - "dev": true, - "dependencies": { - "exit": "0.1.2", - "glob": "^7.1.1" - }, - "engines": { - "node": ">=0.2.5" - } - }, - "node_modules/grunt-contrib-jshint/node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", - "dev": true - }, - "node_modules/grunt-contrib-jshint/node_modules/console-browserify": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.1.0.tgz", - "integrity": "sha1-8CQcRXMKn8YyOyBtvzjtx0HQuxA=", - "dev": true, - "dependencies": { - "date-now": "^0.1.4" - } - }, - "node_modules/grunt-contrib-jshint/node_modules/core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", - "dev": true - }, - "node_modules/grunt-contrib-jshint/node_modules/date-now": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/date-now/-/date-now-0.1.4.tgz", - "integrity": "sha1-6vQ5/U1ISK105cx9vvIAZyueNFs=", - "dev": true - }, - "node_modules/grunt-contrib-jshint/node_modules/dom-serializer": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.0.tgz", - "integrity": "sha1-BzxpdUbOB4DOI75KKOKT5AvDDII=", - "dev": true, - "dependencies": { - "domelementtype": "~1.1.1", - "entities": "~1.1.1" - } - }, - "node_modules/grunt-contrib-jshint/node_modules/dom-serializer/node_modules/domelementtype": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.1.3.tgz", - "integrity": "sha1-vSh3PiZCiBrsUVRJJCmcXNgiGFs=", - "dev": true - }, - "node_modules/grunt-contrib-jshint/node_modules/dom-serializer/node_modules/entities": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.1.tgz", - "integrity": "sha1-blwtClYhtdra7O+AuQ7ftc13cvA=", - "dev": true - }, - "node_modules/grunt-contrib-jshint/node_modules/domelementtype": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.0.tgz", - "integrity": "sha1-sXrtguirWeUt2cGbF1bg/BhyBMI=", - "deprecated": "update to domelementtype@1.3.1", - "dev": true - }, - "node_modules/grunt-contrib-jshint/node_modules/domhandler": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.3.0.tgz", - "integrity": "sha1-LeWaCCLVAn+r/28DLCsloqir5zg=", - "dev": true, - "dependencies": { - "domelementtype": "1" - } - }, - "node_modules/grunt-contrib-jshint/node_modules/domutils": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz", - "integrity": "sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=", - "dev": true, - "dependencies": { - "dom-serializer": "0", - "domelementtype": "1" - } - }, - "node_modules/grunt-contrib-jshint/node_modules/entities": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-1.0.0.tgz", - "integrity": "sha1-sph6o4ITR/zeZCsk/fyeT7cSvyY=", - "dev": true - }, - "node_modules/grunt-contrib-jshint/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/grunt-contrib-jshint/node_modules/exit": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", - "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=", - "dev": true, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/grunt-contrib-jshint/node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", - "dev": true - }, - "node_modules/grunt-contrib-jshint/node_modules/glob": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", - "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", - "dev": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - } - }, - "node_modules/grunt-contrib-jshint/node_modules/has-ansi": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", - "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", - "dev": true, - "dependencies": { - "ansi-regex": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/grunt-contrib-jshint/node_modules/hooker": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/hooker/-/hooker-0.2.3.tgz", - "integrity": "sha1-uDT3I8xKJCqmWWNFnfbZhMXT2Vk=", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/grunt-contrib-jshint/node_modules/htmlparser2": { - "version": "3.8.3", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.8.3.tgz", - "integrity": "sha1-mWwosZFRaovoZQGn15dX5ccMEGg=", - "dev": true, - "dependencies": { - "domelementtype": "1", - "domhandler": "2.3", - "domutils": "1.5", - "entities": "1.0", - "readable-stream": "1.1" - } - }, - "node_modules/grunt-contrib-jshint/node_modules/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "dev": true, - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "node_modules/grunt-contrib-jshint/node_modules/inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", - "dev": true - }, - "node_modules/grunt-contrib-jshint/node_modules/isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", - "dev": true - }, - "node_modules/grunt-contrib-jshint/node_modules/jshint": { - "version": "2.9.5", - "resolved": "https://registry.npmjs.org/jshint/-/jshint-2.9.5.tgz", - "integrity": "sha1-HnJSkVzmgbQIJ+4UJIxG006apiw=", - "dev": true, - "dependencies": { - "cli": "~1.0.0", - "console-browserify": "1.1.x", - "exit": "0.1.x", - "htmlparser2": "3.8.x", - "lodash": "3.7.x", - "minimatch": "~3.0.2", - "shelljs": "0.3.x", - "strip-json-comments": "1.0.x" - }, - "bin": { - "jshint": "bin/jshint" - } - }, - "node_modules/grunt-contrib-jshint/node_modules/lodash": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-3.7.0.tgz", - "integrity": "sha1-Nni9irmVBXwHreg27S7wh9qBHUU=", - "dev": true - }, - "node_modules/grunt-contrib-jshint/node_modules/minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "dev": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/grunt-contrib-jshint/node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dev": true, - "dependencies": { - "wrappy": "1" - } - }, - "node_modules/grunt-contrib-jshint/node_modules/path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/grunt-contrib-jshint/node_modules/readable-stream": { - "version": "1.1.14", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", - "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", - "dev": true, - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - } - }, - "node_modules/grunt-contrib-jshint/node_modules/shelljs": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.3.0.tgz", - "integrity": "sha1-NZbmMHp4FUT1kfN9phg2DzHbV7E=", - "dev": true, - "bin": { - "shjs": "bin/shjs" - }, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/grunt-contrib-jshint/node_modules/string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", - "dev": true - }, - "node_modules/grunt-contrib-jshint/node_modules/strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, - "dependencies": { - "ansi-regex": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/grunt-contrib-jshint/node_modules/strip-json-comments": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-1.0.4.tgz", - "integrity": "sha1-HhX7ysl9Pumb8tc7TGVrCCu6+5E=", - "dev": true, - "bin": { - "strip-json-comments": "cli.js" - }, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/grunt-contrib-jshint/node_modules/supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/grunt-contrib-jshint/node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true - }, - "node_modules/grunt-contrib-less": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/grunt-contrib-less/-/grunt-contrib-less-1.4.1.tgz", - "integrity": "sha1-O73sC3XRLOqlXWKUNiXAsIYc328=", - "dev": true, - "dependencies": { - "async": "^2.0.0", - "chalk": "^1.0.0", - "less": "~2.7.1", - "lodash": "^4.8.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/grunt-contrib-less/node_modules/ajv": { - "version": "4.11.8", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-4.11.8.tgz", - "integrity": "sha1-gv+wKynmYq5TvcIK8VlHcGc5xTY=", - "dev": true, - "optional": true, - "dependencies": { - "co": "^4.6.0", - "json-stable-stringify": "^1.0.1" - } - }, - "node_modules/grunt-contrib-less/node_modules/ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/grunt-contrib-less/node_modules/ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/grunt-contrib-less/node_modules/asap": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", - "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=", - "dev": true, - "optional": true - }, - "node_modules/grunt-contrib-less/node_modules/asn1": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz", - "integrity": "sha1-2sh4dxPJlmhJ/IGAd36+nB3fO4Y=", - "dev": true, - "optional": true - }, - "node_modules/grunt-contrib-less/node_modules/assert-plus": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-0.2.0.tgz", - "integrity": "sha1-104bh+ev/A24qttwIfP+SBAasjQ=", - "dev": true, - "optional": true, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/grunt-contrib-less/node_modules/async": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/async/-/async-2.6.0.tgz", - "integrity": "sha512-xAfGg1/NTLBBKlHFmnd7PlmUW9KhVQIUuSrYem9xzFUZy13ScvtyGGejaae9iAVRiRq9+Cx7DPFaAAhCpyxyPw==", - "dev": true, - "dependencies": { - "lodash": "^4.14.0" - } - }, - "node_modules/grunt-contrib-less/node_modules/asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", - "dev": true, - "optional": true - }, - "node_modules/grunt-contrib-less/node_modules/aws-sign2": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.6.0.tgz", - "integrity": "sha1-FDQt0428yU0OW4fXY81jYSwOeU8=", - "dev": true, - "optional": true, - "engines": { - "node": "*" - } - }, - "node_modules/grunt-contrib-less/node_modules/aws4": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.6.0.tgz", - "integrity": "sha1-g+9cqGCysy5KDe7e6MdxudtXRx4=", - "dev": true, - "optional": true - }, - "node_modules/grunt-contrib-less/node_modules/bcrypt-pbkdf": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz", - "integrity": "sha1-Y7xdy2EzG5K8Bf1SiVPDNGKgb40=", - "dev": true, - "optional": true, - "dependencies": { - "tweetnacl": "^0.14.3" - } - }, - "node_modules/grunt-contrib-less/node_modules/boom": { - "version": "2.10.1", - "resolved": "https://registry.npmjs.org/boom/-/boom-2.10.1.tgz", - "integrity": "sha1-OciRjO/1eZ+D+UkqhI9iWt0Mdm8=", - "deprecated": "This version has been deprecated in accordance with the hapi support policy (hapi.im/support). Please upgrade to the latest version to get the best features, bug fixes, and security patches. If you are unable to upgrade at this time, paid support is available for older versions (hapi.im/commercial).", - "dev": true, - "optional": true, - "dependencies": { - "hoek": "2.x.x" - }, - "engines": { - "node": ">=0.10.40" - } - }, - "node_modules/grunt-contrib-less/node_modules/caseless": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", - "dev": true, - "optional": true - }, - "node_modules/grunt-contrib-less/node_modules/chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "dependencies": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/grunt-contrib-less/node_modules/co": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", - "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", - "dev": true, - "optional": true, - "engines": { - "iojs": ">= 1.0.0", - "node": ">= 0.12.0" - } - }, - "node_modules/grunt-contrib-less/node_modules/combined-stream": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.6.tgz", - "integrity": "sha1-cj599ugBrFYTETp+RFqbactjKBg=", - "dev": true, - "optional": true, - "dependencies": { - "delayed-stream": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/grunt-contrib-less/node_modules/core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", - "dev": true, - "optional": true - }, - "node_modules/grunt-contrib-less/node_modules/cryptiles": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-2.0.5.tgz", - "integrity": "sha1-O9/s3GCBR8HGcgL6KR59ylnqo7g=", - "deprecated": "This version has been deprecated in accordance with the hapi support policy (hapi.im/support). Please upgrade to the latest version to get the best features, bug fixes, and security patches. If you are unable to upgrade at this time, paid support is available for older versions (hapi.im/commercial).", - "dev": true, - "optional": true, - "dependencies": { - "boom": "2.x.x" - }, - "engines": { - "node": ">=0.10.40" - } - }, - "node_modules/grunt-contrib-less/node_modules/dashdash": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", - "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", - "dev": true, - "optional": true, - "dependencies": { - "assert-plus": "^1.0.0" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/grunt-contrib-less/node_modules/dashdash/node_modules/assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", - "dev": true, - "optional": true, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/grunt-contrib-less/node_modules/delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", - "dev": true, - "optional": true, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/grunt-contrib-less/node_modules/ecc-jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz", - "integrity": "sha1-D8c6ntXw1Tw4GTOYUj735UN3dQU=", - "dev": true, - "optional": true, - "dependencies": { - "jsbn": "~0.1.0" - } - }, - "node_modules/grunt-contrib-less/node_modules/errno": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.7.tgz", - "integrity": "sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg==", - "dev": true, - "optional": true, - "dependencies": { - "prr": "~1.0.1" - }, - "bin": { - "errno": "cli.js" - } - }, - "node_modules/grunt-contrib-less/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/grunt-contrib-less/node_modules/extsprintf": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", - "dev": true, - "engines": [ - "node >=0.6.0" - ], - "optional": true - }, - "node_modules/grunt-contrib-less/node_modules/forever-agent": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", - "dev": true, - "optional": true, - "engines": { - "node": "*" - } - }, - "node_modules/grunt-contrib-less/node_modules/form-data": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.1.4.tgz", - "integrity": "sha1-M8GDrPGTJ27KqYFDpp6Uv+4XUNE=", - "dev": true, - "optional": true, - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.5", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 0.12" - } - }, - "node_modules/grunt-contrib-less/node_modules/getpass": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", - "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", - "dev": true, - "optional": true, - "dependencies": { - "assert-plus": "^1.0.0" - } - }, - "node_modules/grunt-contrib-less/node_modules/getpass/node_modules/assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", - "dev": true, - "optional": true, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/grunt-contrib-less/node_modules/graceful-fs": { - "version": "4.1.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", - "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", - "dev": true, - "optional": true, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/grunt-contrib-less/node_modules/har-schema": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-1.0.5.tgz", - "integrity": "sha1-0mMTX0MwfALGAq/I/pWXDAFRNp4=", - "dev": true, - "optional": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/grunt-contrib-less/node_modules/har-validator": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-4.2.1.tgz", - "integrity": "sha1-M0gdDxu/9gDdID11gSpqX7oALio=", - "deprecated": "this library is no longer supported", - "dev": true, - "optional": true, - "dependencies": { - "ajv": "^4.9.1", - "har-schema": "^1.0.5" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/grunt-contrib-less/node_modules/has-ansi": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", - "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", - "dev": true, - "dependencies": { - "ansi-regex": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/grunt-contrib-less/node_modules/hawk": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/hawk/-/hawk-3.1.3.tgz", - "integrity": "sha1-B4REvXwWQLD+VA0sm3PVlnjo4cQ=", - "deprecated": "This module moved to @hapi/hawk. Please make sure to switch over as this distribution is no longer supported and may contain bugs and critical security issues.", - "dev": true, - "optional": true, - "dependencies": { - "boom": "2.x.x", - "cryptiles": "2.x.x", - "hoek": "2.x.x", - "sntp": "1.x.x" - }, - "engines": { - "node": ">=0.10.32" - } - }, - "node_modules/grunt-contrib-less/node_modules/hoek": { - "version": "2.16.3", - "resolved": "https://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz", - "integrity": "sha1-ILt0A9POo5jpHcRxCo/xuCdKJe0=", - "deprecated": "This version has been deprecated in accordance with the hapi support policy (hapi.im/support). Please upgrade to the latest version to get the best features, bug fixes, and security patches. If you are unable to upgrade at this time, paid support is available for older versions (hapi.im/commercial).", - "dev": true, - "optional": true, - "engines": { - "node": ">=0.10.40" - } - }, - "node_modules/grunt-contrib-less/node_modules/http-signature": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.1.1.tgz", - "integrity": "sha1-33LiZwZs0Kxn+3at+OE0qPvPkb8=", - "dev": true, - "optional": true, - "dependencies": { - "assert-plus": "^0.2.0", - "jsprim": "^1.2.2", - "sshpk": "^1.7.0" - }, - "engines": { - "node": ">=0.8", - "npm": ">=1.3.7" - } - }, - "node_modules/grunt-contrib-less/node_modules/image-size": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/image-size/-/image-size-0.5.5.tgz", - "integrity": "sha1-Cd/Uq50g4p6xw+gLiZA3jfnjy5w=", - "dev": true, - "optional": true, - "bin": { - "image-size": "bin/image-size.js" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/grunt-contrib-less/node_modules/is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", - "dev": true, - "optional": true - }, - "node_modules/grunt-contrib-less/node_modules/isstream": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", - "dev": true, - "optional": true - }, - "node_modules/grunt-contrib-less/node_modules/jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", - "dev": true, - "optional": true - }, - "node_modules/grunt-contrib-less/node_modules/json-schema": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", - "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", - "dev": true, - "optional": true - }, - "node_modules/grunt-contrib-less/node_modules/json-stable-stringify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz", - "integrity": "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=", - "dev": true, - "optional": true, - "dependencies": { - "jsonify": "~0.0.0" - } - }, - "node_modules/grunt-contrib-less/node_modules/json-stringify-safe": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", - "dev": true, - "optional": true - }, - "node_modules/grunt-contrib-less/node_modules/jsonify": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", - "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=", - "dev": true, - "optional": true, - "engines": { - "node": "*" - } - }, - "node_modules/grunt-contrib-less/node_modules/jsprim": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", - "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", - "dev": true, - "engines": [ - "node >=0.6.0" - ], - "optional": true, - "dependencies": { - "assert-plus": "1.0.0", - "extsprintf": "1.3.0", - "json-schema": "0.2.3", - "verror": "1.10.0" - } - }, - "node_modules/grunt-contrib-less/node_modules/jsprim/node_modules/assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", - "dev": true, - "optional": true, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/grunt-contrib-less/node_modules/less": { - "version": "2.7.3", - "resolved": "https://registry.npmjs.org/less/-/less-2.7.3.tgz", - "integrity": "sha512-KPdIJKWcEAb02TuJtaLrhue0krtRLoRoo7x6BNJIBelO00t/CCdJQUnHW5V34OnHMWzIktSalJxRO+FvytQlCQ==", - "dev": true, - "bin": { - "lessc": "bin/lessc" - }, - "engines": { - "node": ">=0.12" - }, - "optionalDependencies": { - "errno": "^0.1.1", - "graceful-fs": "^4.1.2", - "image-size": "~0.5.0", - "mime": "^1.2.11", - "mkdirp": "^0.5.0", - "promise": "^7.1.1", - "request": "2.81.0", - "source-map": "^0.5.3" - } - }, - "node_modules/grunt-contrib-less/node_modules/mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", - "dev": true, - "optional": true, - "bin": { - "mime": "cli.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/grunt-contrib-less/node_modules/mime-db": { - "version": "1.33.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.33.0.tgz", - "integrity": "sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ==", - "dev": true, - "optional": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/grunt-contrib-less/node_modules/mime-types": { - "version": "2.1.18", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.18.tgz", - "integrity": "sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ==", - "dev": true, - "optional": true, - "dependencies": { - "mime-db": "~1.33.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/grunt-contrib-less/node_modules/minimist": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", - "dev": true, - "optional": true - }, - "node_modules/grunt-contrib-less/node_modules/mkdirp": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", - "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", - "deprecated": "Legacy versions of mkdirp are no longer supported. Please update to mkdirp 1.x. (Note that the API surface has changed to use Promises in 1.x.)", - "dev": true, - "optional": true, - "dependencies": { - "minimist": "0.0.8" - }, - "bin": { - "mkdirp": "bin/cmd.js" - } - }, - "node_modules/grunt-contrib-less/node_modules/oauth-sign": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz", - "integrity": "sha1-Rqarfwrq2N6unsBWV4C31O/rnUM=", - "dev": true, - "optional": true, - "engines": { - "node": "*" - } - }, - "node_modules/grunt-contrib-less/node_modules/performance-now": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-0.2.0.tgz", - "integrity": "sha1-M+8wxcd9TqIcWlOGnZG1bY8lVeU=", - "dev": true, - "optional": true - }, - "node_modules/grunt-contrib-less/node_modules/promise": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", - "integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==", - "dev": true, - "optional": true, - "dependencies": { - "asap": "~2.0.3" - } - }, - "node_modules/grunt-contrib-less/node_modules/prr": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", - "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=", - "dev": true, - "optional": true - }, - "node_modules/grunt-contrib-less/node_modules/punycode": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", - "dev": true, - "optional": true - }, - "node_modules/grunt-contrib-less/node_modules/qs": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.4.0.tgz", - "integrity": "sha1-E+JtKK1rD/qpExLNO/cI7TUecjM=", - "dev": true, - "optional": true, - "engines": { - "node": ">=0.6" - } - }, - "node_modules/grunt-contrib-less/node_modules/request": { - "version": "2.81.0", - "resolved": "https://registry.npmjs.org/request/-/request-2.81.0.tgz", - "integrity": "sha1-xpKJRqDgbF+Nb4qTM0af/aRimKA=", - "deprecated": "request has been deprecated, see https://github.com/request/request/issues/3142", - "dev": true, - "optional": true, - "dependencies": { - "aws-sign2": "~0.6.0", - "aws4": "^1.2.1", - "caseless": "~0.12.0", - "combined-stream": "~1.0.5", - "extend": "~3.0.0", - "forever-agent": "~0.6.1", - "form-data": "~2.1.1", - "har-validator": "~4.2.1", - "hawk": "~3.1.3", - "http-signature": "~1.1.0", - "is-typedarray": "~1.0.0", - "isstream": "~0.1.2", - "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.7", - "oauth-sign": "~0.8.1", - "performance-now": "^0.2.0", - "qs": "~6.4.0", - "safe-buffer": "^5.0.1", - "stringstream": "~0.0.4", - "tough-cookie": "~2.3.0", - "tunnel-agent": "^0.6.0", - "uuid": "^3.0.0" - }, - "engines": { - "node": ">= 4" - } - }, - "node_modules/grunt-contrib-less/node_modules/sntp": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/sntp/-/sntp-1.0.9.tgz", - "integrity": "sha1-ZUEYTMkK7qbG57NeJlkIJEPGYZg=", - "deprecated": "This module moved to @hapi/sntp. Please make sure to switch over as this distribution is no longer supported and may contain bugs and critical security issues.", - "dev": true, - "optional": true, - "dependencies": { - "hoek": "2.x.x" - }, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/grunt-contrib-less/node_modules/source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true, - "optional": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/grunt-contrib-less/node_modules/sshpk": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.13.1.tgz", - "integrity": "sha1-US322mKHFEMW3EwY/hzx2UBzm+M=", - "dev": true, - "optional": true, - "dependencies": { - "asn1": "~0.2.3", - "assert-plus": "^1.0.0", - "dashdash": "^1.12.0", - "getpass": "^0.1.1" - }, - "bin": { - "sshpk-conv": "bin/sshpk-conv", - "sshpk-sign": "bin/sshpk-sign", - "sshpk-verify": "bin/sshpk-verify" - }, - "engines": { - "node": ">=0.10.0" - }, - "optionalDependencies": { - "bcrypt-pbkdf": "^1.0.0", - "ecc-jsbn": "~0.1.1", - "jsbn": "~0.1.0", - "tweetnacl": "~0.14.0" - } - }, - "node_modules/grunt-contrib-less/node_modules/sshpk/node_modules/assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", - "dev": true, - "optional": true, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/grunt-contrib-less/node_modules/stringstream": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.5.tgz", - "integrity": "sha1-TkhM1N5aC7vuGORjB3EKioFiGHg=", - "dev": true, - "optional": true - }, - "node_modules/grunt-contrib-less/node_modules/strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, - "dependencies": { - "ansi-regex": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/grunt-contrib-less/node_modules/supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/grunt-contrib-less/node_modules/tough-cookie": { - "version": "2.3.4", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.4.tgz", - "integrity": "sha512-TZ6TTfI5NtZnuyy/Kecv+CnoROnyXn2DN97LontgQpCwsX2XyLYCC0ENhYkehSOwAp8rTQKc/NUIF7BkQ5rKLA==", - "dev": true, - "optional": true, - "dependencies": { - "punycode": "^1.4.1" - }, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/grunt-contrib-less/node_modules/tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", - "dev": true, - "optional": true, - "dependencies": { - "safe-buffer": "^5.0.1" - }, - "engines": { - "node": "*" - } - }, - "node_modules/grunt-contrib-less/node_modules/tweetnacl": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", - "dev": true, - "optional": true - }, - "node_modules/grunt-contrib-less/node_modules/uuid": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.2.1.tgz", - "integrity": "sha512-jZnMwlb9Iku/O3smGWvZhauCf6cvvpKi4BKRiliS3cxnI+Gz9j5MEpTz2UFuXiKPJocb7gnsLHwiS05ige5BEA==", - "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", - "dev": true, - "optional": true, - "bin": { - "uuid": "bin/uuid" - } - }, - "node_modules/grunt-contrib-less/node_modules/verror": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", - "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", - "dev": true, - "engines": [ - "node >=0.6.0" - ], - "optional": true, - "dependencies": { - "assert-plus": "^1.0.0", - "core-util-is": "1.0.2", - "extsprintf": "^1.2.0" - } - }, - "node_modules/grunt-contrib-less/node_modules/verror/node_modules/assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", - "dev": true, - "optional": true, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/grunt-contrib-uglify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/grunt-contrib-uglify/-/grunt-contrib-uglify-2.3.0.tgz", - "integrity": "sha1-s9AmDr3WzvoS/y+Onh4ln33kIW8=", - "dev": true, - "dependencies": { - "chalk": "^1.0.0", - "maxmin": "^1.1.0", - "object.assign": "^4.0.4", - "uglify-js": "~2.8.21", - "uri-path": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/grunt-contrib-uglify/node_modules/align-text": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz", - "integrity": "sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=", - "dev": true, - "dependencies": { - "kind-of": "^3.0.2", - "longest": "^1.0.1", - "repeat-string": "^1.5.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/grunt-contrib-uglify/node_modules/ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/grunt-contrib-uglify/node_modules/ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/grunt-contrib-uglify/node_modules/array-find-index": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz", - "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/grunt-contrib-uglify/node_modules/browserify-zlib": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.1.4.tgz", - "integrity": "sha1-uzX4pRn2AOD6a4SFJByXnQFB+y0=", - "dev": true, - "dependencies": { - "pako": "~0.2.0" - } - }, - "node_modules/grunt-contrib-uglify/node_modules/builtin-modules": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", - "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/grunt-contrib-uglify/node_modules/camelcase": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", - "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/grunt-contrib-uglify/node_modules/camelcase-keys": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz", - "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=", - "dev": true, - "dependencies": { - "camelcase": "^2.0.0", - "map-obj": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/grunt-contrib-uglify/node_modules/center-align": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz", - "integrity": "sha1-qg0yYptu6XIgBBHL1EYckHvCt60=", - "dev": true, - "dependencies": { - "align-text": "^0.1.3", - "lazy-cache": "^1.0.3" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/grunt-contrib-uglify/node_modules/chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "dependencies": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/grunt-contrib-uglify/node_modules/cliui": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz", - "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=", - "dev": true, - "dependencies": { - "center-align": "^0.1.1", - "right-align": "^0.1.1", - "wordwrap": "0.0.2" - } - }, - "node_modules/grunt-contrib-uglify/node_modules/concat-stream": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.0.tgz", - "integrity": "sha1-CqxmL9Ur54lk1VMvaUeE5wEQrPc=", - "dev": true, - "engines": [ - "node >= 0.8" - ], - "dependencies": { - "inherits": "^2.0.3", - "readable-stream": "^2.2.2", - "typedarray": "^0.0.6" - } - }, - "node_modules/grunt-contrib-uglify/node_modules/core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", - "dev": true - }, - "node_modules/grunt-contrib-uglify/node_modules/currently-unhandled": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", - "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=", - "dev": true, - "dependencies": { - "array-find-index": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/grunt-contrib-uglify/node_modules/decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/grunt-contrib-uglify/node_modules/define-properties": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.2.tgz", - "integrity": "sha1-g6c/L+pWmJj7c3GTyPhzyvbUXJQ=", - "dev": true, - "dependencies": { - "foreach": "^2.0.5", - "object-keys": "^1.0.8" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/grunt-contrib-uglify/node_modules/error-ex": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.1.tgz", - "integrity": "sha1-+FWobOYa3E6GIcPNoh56dhLDqNw=", - "dev": true, - "dependencies": { - "is-arrayish": "^0.2.1" - } - }, - "node_modules/grunt-contrib-uglify/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/grunt-contrib-uglify/node_modules/figures": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz", - "integrity": "sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=", - "dev": true, - "dependencies": { - "escape-string-regexp": "^1.0.5", - "object-assign": "^4.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/grunt-contrib-uglify/node_modules/find-up": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", - "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", - "dev": true, - "dependencies": { - "path-exists": "^2.0.0", - "pinkie-promise": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/grunt-contrib-uglify/node_modules/foreach": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/foreach/-/foreach-2.0.5.tgz", - "integrity": "sha1-C+4AUBiusmDQo6865ljdATbsG5k=", - "dev": true - }, - "node_modules/grunt-contrib-uglify/node_modules/get-stdin": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", - "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/grunt-contrib-uglify/node_modules/graceful-fs": { - "version": "4.1.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", - "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", - "dev": true, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/grunt-contrib-uglify/node_modules/gzip-size": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-1.0.0.tgz", - "integrity": "sha1-Zs+LEBBHInuVus5uodoMF37Vwi8=", - "dev": true, - "dependencies": { - "browserify-zlib": "^0.1.4", - "concat-stream": "^1.4.1" - }, - "bin": { - "gzip-size": "cli.js" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/grunt-contrib-uglify/node_modules/has-ansi": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", - "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", - "dev": true, - "dependencies": { - "ansi-regex": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/grunt-contrib-uglify/node_modules/hosted-git-info": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.5.0.tgz", - "integrity": "sha512-pNgbURSuab90KbTqvRPsseaTxOJCZBD0a7t+haSN33piP9cCM4l0CqdzAif2hUqm716UovKB2ROmiabGAKVXyg==", - "dev": true - }, - "node_modules/grunt-contrib-uglify/node_modules/indent-string": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz", - "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=", - "dev": true, - "dependencies": { - "repeating": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/grunt-contrib-uglify/node_modules/inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", - "dev": true - }, - "node_modules/grunt-contrib-uglify/node_modules/is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", - "dev": true - }, - "node_modules/grunt-contrib-uglify/node_modules/is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", - "dev": true - }, - "node_modules/grunt-contrib-uglify/node_modules/is-builtin-module": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz", - "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=", - "dev": true, - "dependencies": { - "builtin-modules": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/grunt-contrib-uglify/node_modules/is-finite": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz", - "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=", - "dev": true, - "dependencies": { - "number-is-nan": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/grunt-contrib-uglify/node_modules/is-utf8": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", - "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=", - "dev": true - }, - "node_modules/grunt-contrib-uglify/node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "node_modules/grunt-contrib-uglify/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/grunt-contrib-uglify/node_modules/lazy-cache": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz", - "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/grunt-contrib-uglify/node_modules/load-json-file": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", - "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", - "dev": true, - "dependencies": { - "graceful-fs": "^4.1.2", - "parse-json": "^2.2.0", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0", - "strip-bom": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/grunt-contrib-uglify/node_modules/longest": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz", - "integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/grunt-contrib-uglify/node_modules/loud-rejection": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz", - "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=", - "dev": true, - "dependencies": { - "currently-unhandled": "^0.4.1", - "signal-exit": "^3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/grunt-contrib-uglify/node_modules/map-obj": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", - "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/grunt-contrib-uglify/node_modules/maxmin": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/maxmin/-/maxmin-1.1.0.tgz", - "integrity": "sha1-cTZehKmd2Piz99X94vANHn9zvmE=", - "dev": true, - "dependencies": { - "chalk": "^1.0.0", - "figures": "^1.0.1", - "gzip-size": "^1.0.0", - "pretty-bytes": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/grunt-contrib-uglify/node_modules/meow": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz", - "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=", - "dev": true, - "dependencies": { - "camelcase-keys": "^2.0.0", - "decamelize": "^1.1.2", - "loud-rejection": "^1.0.0", - "map-obj": "^1.0.1", - "minimist": "^1.1.3", - "normalize-package-data": "^2.3.4", - "object-assign": "^4.0.1", - "read-pkg-up": "^1.0.1", - "redent": "^1.0.0", - "trim-newlines": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/grunt-contrib-uglify/node_modules/normalize-package-data": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz", - "integrity": "sha512-9jjUFbTPfEy3R/ad/2oNbKtW9Hgovl5O1FvFWKkKblNXoN/Oou6+9+KKohPK13Yc3/TyunyWhJp6gvRNR/PPAw==", - "dev": true, - "dependencies": { - "hosted-git-info": "^2.1.4", - "is-builtin-module": "^1.0.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - } - }, - "node_modules/grunt-contrib-uglify/node_modules/number-is-nan": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", - "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/grunt-contrib-uglify/node_modules/object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/grunt-contrib-uglify/node_modules/object-keys": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.0.11.tgz", - "integrity": "sha1-xUYBd4rVYPEULODgG8yotW0TQm0=", - "dev": true, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/grunt-contrib-uglify/node_modules/object.assign": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", - "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", - "dev": true, - "dependencies": { - "define-properties": "^1.1.2", - "function-bind": "^1.1.1", - "has-symbols": "^1.0.0", - "object-keys": "^1.0.11" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/grunt-contrib-uglify/node_modules/pako": { - "version": "0.2.9", - "resolved": "https://registry.npmjs.org/pako/-/pako-0.2.9.tgz", - "integrity": "sha1-8/dSL073gjSNqBYbrZ7P1Rv4OnU=", - "dev": true - }, - "node_modules/grunt-contrib-uglify/node_modules/parse-json": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", - "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", - "dev": true, - "dependencies": { - "error-ex": "^1.2.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/grunt-contrib-uglify/node_modules/path-exists": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", - "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", - "dev": true, - "dependencies": { - "pinkie-promise": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/grunt-contrib-uglify/node_modules/path-type": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", - "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", - "dev": true, - "dependencies": { - "graceful-fs": "^4.1.2", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/grunt-contrib-uglify/node_modules/pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/grunt-contrib-uglify/node_modules/pinkie": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", - "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/grunt-contrib-uglify/node_modules/pinkie-promise": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", - "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", - "dev": true, - "dependencies": { - "pinkie": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/grunt-contrib-uglify/node_modules/pretty-bytes": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-1.0.4.tgz", - "integrity": "sha1-CiLoIQYJrTVUL4yNXSFZr/B1HIQ=", - "dev": true, - "dependencies": { - "get-stdin": "^4.0.1", - "meow": "^3.1.0" - }, - "bin": { - "pretty-bytes": "cli.js" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/grunt-contrib-uglify/node_modules/process-nextick-args": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", - "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==", - "dev": true - }, - "node_modules/grunt-contrib-uglify/node_modules/read-pkg": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", - "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", - "dev": true, - "dependencies": { - "load-json-file": "^1.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/grunt-contrib-uglify/node_modules/read-pkg-up": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", - "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", - "dev": true, - "dependencies": { - "find-up": "^1.0.0", - "read-pkg": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/grunt-contrib-uglify/node_modules/readable-stream": { - "version": "2.3.4", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.4.tgz", - "integrity": "sha512-vuYxeWYM+fde14+rajzqgeohAI7YoJcHE7kXDAc4Nk0EbuKnJfqtY9YtRkLo/tqkuF7MsBQRhPnPeyjYITp3ZQ==", - "dev": true, - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.0.3", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/grunt-contrib-uglify/node_modules/redent": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz", - "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=", - "dev": true, - "dependencies": { - "indent-string": "^2.1.0", - "strip-indent": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/grunt-contrib-uglify/node_modules/repeat-string": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", - "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", - "dev": true, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/grunt-contrib-uglify/node_modules/repeating": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", - "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", - "dev": true, - "dependencies": { - "is-finite": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/grunt-contrib-uglify/node_modules/right-align": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz", - "integrity": "sha1-YTObci/mo1FWiSENJOFMlhSGE+8=", - "dev": true, - "dependencies": { - "align-text": "^0.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/grunt-contrib-uglify/node_modules/safe-buffer": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", - "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==", - "dev": true - }, - "node_modules/grunt-contrib-uglify/node_modules/semver": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz", - "integrity": "sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA==", - "dev": true, - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/grunt-contrib-uglify/node_modules/signal-exit": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", - "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", - "dev": true - }, - "node_modules/grunt-contrib-uglify/node_modules/source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/grunt-contrib-uglify/node_modules/spdx-correct": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-2.0.4.tgz", - "integrity": "sha512-c+4gPpt9YDhz7cHlz5UrsHzxxRi4ksclxnEEKsuGT9JdwSC+ZNmsGbYRzzgxyZaBYpcWnlu+4lPcdLKx4DOCmA==", - "dev": true, - "dependencies": { - "spdx-expression-parse": "^2.0.1", - "spdx-license-ids": "^2.0.1" - } - }, - "node_modules/grunt-contrib-uglify/node_modules/spdx-correct/node_modules/spdx-expression-parse": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-2.0.2.tgz", - "integrity": "sha512-oFxOkWCfFS0ltNp0H66gXlU4NF6bxg7RkoTYR0413t+yTY9zyj+AIWsjtN8dcVp6703ijDYBWBIARlJ7DkyP9Q==", - "dev": true, - "dependencies": { - "spdx-exceptions": "^2.0.0", - "spdx-license-ids": "^2.0.1" - } - }, - "node_modules/grunt-contrib-uglify/node_modules/spdx-expression-parse": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz", - "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==", - "dev": true, - "dependencies": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, - "node_modules/grunt-contrib-uglify/node_modules/spdx-expression-parse/node_modules/spdx-license-ids": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.0.tgz", - "integrity": "sha512-2+EPwgbnmOIl8HjGBXXMd9NAu02vLjOO1nWw4kmeRDFyHn+M/ETfHxQUK0oXg8ctgVnl9t3rosNVsZ1jG61nDA==", - "dev": true - }, - "node_modules/grunt-contrib-uglify/node_modules/spdx-license-ids": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-2.0.1.tgz", - "integrity": "sha1-AgF7zDU07k/+9tWNIOfT6aHDyOw=", - "dev": true - }, - "node_modules/grunt-contrib-uglify/node_modules/string_decoder": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", - "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", - "dev": true, - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/grunt-contrib-uglify/node_modules/strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, - "dependencies": { - "ansi-regex": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/grunt-contrib-uglify/node_modules/strip-bom": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", - "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", - "dev": true, - "dependencies": { - "is-utf8": "^0.2.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/grunt-contrib-uglify/node_modules/strip-indent": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz", - "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=", - "dev": true, - "dependencies": { - "get-stdin": "^4.0.1" - }, - "bin": { - "strip-indent": "cli.js" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/grunt-contrib-uglify/node_modules/supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/grunt-contrib-uglify/node_modules/trim-newlines": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz", - "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/grunt-contrib-uglify/node_modules/typedarray": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", - "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", - "dev": true - }, - "node_modules/grunt-contrib-uglify/node_modules/uglify-js": { - "version": "2.8.29", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.29.tgz", - "integrity": "sha1-KcVzMUgFe7Th913zW3qcty5qWd0=", - "dev": true, - "dependencies": { - "source-map": "~0.5.1", - "yargs": "~3.10.0" - }, - "bin": { - "uglifyjs": "bin/uglifyjs" - }, - "engines": { - "node": ">=0.8.0" - }, - "optionalDependencies": { - "uglify-to-browserify": "~1.0.0" - } - }, - "node_modules/grunt-contrib-uglify/node_modules/uglify-to-browserify": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz", - "integrity": "sha1-bgkk1r2mta/jSeOabWMoUKD4grc=", - "dev": true, - "optional": true - }, - "node_modules/grunt-contrib-uglify/node_modules/uri-path": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/uri-path/-/uri-path-1.0.0.tgz", - "integrity": "sha1-l0fwGDWJM8Md4PzP2C0TjmcmLjI=", - "dev": true, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/grunt-contrib-uglify/node_modules/util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", - "dev": true - }, - "node_modules/grunt-contrib-uglify/node_modules/validate-npm-package-license": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.2.tgz", - "integrity": "sha512-8zlGw3EZDpC7iUDKy4yHCSqFwkBTeAK4h1QqDC3ST6rT7dzvu2ZuclExZN7zuXNEhQ3+2UBQgdca5eNNL06sBg==", - "dev": true, - "dependencies": { - "spdx-correct": "^2.0.4", - "spdx-expression-parse": "^3.0.0" - } - }, - "node_modules/grunt-contrib-uglify/node_modules/window-size": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz", - "integrity": "sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0=", - "dev": true, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/grunt-contrib-uglify/node_modules/wordwrap": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz", - "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=", - "dev": true, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/grunt-contrib-uglify/node_modules/yargs": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz", - "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=", - "dev": true, - "dependencies": { - "camelcase": "^1.0.2", - "cliui": "^2.1.0", - "decamelize": "^1.0.0", - "window-size": "0.1.0" - } - }, - "node_modules/grunt-contrib-uglify/node_modules/yargs/node_modules/camelcase": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", - "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/grunt-contrib-watch": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/grunt-contrib-watch/-/grunt-contrib-watch-1.0.0.tgz", - "integrity": "sha1-hKGnodar0m7VaEE0lscxM+mQAY8=", - "dev": true, - "dependencies": { - "async": "^1.5.0", - "gaze": "^1.0.0", - "lodash": "^3.10.1", - "tiny-lr": "^0.2.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/grunt-contrib-watch/node_modules/async": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", - "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", - "dev": true - }, - "node_modules/grunt-contrib-watch/node_modules/balanced-match": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", - "dev": true - }, - "node_modules/grunt-contrib-watch/node_modules/body-parser": { - "version": "1.14.2", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.14.2.tgz", - "integrity": "sha1-EBXLH+LEQ4WCWVgdtTMy+NDPUPk=", - "dev": true, - "dependencies": { - "bytes": "2.2.0", - "content-type": "~1.0.1", - "debug": "~2.2.0", - "depd": "~1.1.0", - "http-errors": "~1.3.1", - "iconv-lite": "0.4.13", - "on-finished": "~2.3.0", - "qs": "5.2.0", - "raw-body": "~2.1.5", - "type-is": "~1.6.10" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/grunt-contrib-watch/node_modules/body-parser/node_modules/qs": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-5.2.0.tgz", - "integrity": "sha1-qfMRQq9GjLcrJbMBNrokVoNJFr4=", - "dev": true, - "engines": ">=0.10.40" - }, - "node_modules/grunt-contrib-watch/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/grunt-contrib-watch/node_modules/bytes": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-2.2.0.tgz", - "integrity": "sha1-/TVGSkA/b5EXwt42Cez/nK4ABYg=", - "dev": true - }, - "node_modules/grunt-contrib-watch/node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", - "dev": true - }, - "node_modules/grunt-contrib-watch/node_modules/content-type": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", - "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/grunt-contrib-watch/node_modules/debug": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", - "integrity": "sha1-+HBX6ZWxofauaklgZkE3vFbwOdo=", - "dev": true, - "dependencies": { - "ms": "0.7.1" - } - }, - "node_modules/grunt-contrib-watch/node_modules/depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/grunt-contrib-watch/node_modules/ee-first": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=", - "dev": true - }, - "node_modules/grunt-contrib-watch/node_modules/faye-websocket": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.10.0.tgz", - "integrity": "sha1-TkkvjQTftviQA1B/btvy1QHnxvQ=", - "dev": true, - "dependencies": { - "websocket-driver": ">=0.5.1" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/grunt-contrib-watch/node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", - "dev": true - }, - "node_modules/grunt-contrib-watch/node_modules/gaze": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/gaze/-/gaze-1.1.2.tgz", - "integrity": "sha1-hHIkZ3rbiHDWeSV+0ziP22HkAQU=", - "dev": true, - "dependencies": { - "globule": "^1.0.0" - }, - "engines": { - "node": ">= 0.10.0" - } - }, - "node_modules/grunt-contrib-watch/node_modules/glob": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", - "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", - "dev": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - } - }, - "node_modules/grunt-contrib-watch/node_modules/globule": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/globule/-/globule-1.2.0.tgz", - "integrity": "sha1-HcScaCLdnoovoAuiopUAboZkvQk=", - "dev": true, - "dependencies": { - "glob": "~7.1.1", - "lodash": "~4.17.4", - "minimatch": "~3.0.2" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/grunt-contrib-watch/node_modules/globule/node_modules/lodash": { - "version": "4.17.5", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.5.tgz", - "integrity": "sha512-svL3uiZf1RwhH+cWrfZn3A4+U58wbP0tGVTLQPbjplZxZ8ROD9VLuNgsRniTlLe7OlSqR79RUehXgpBW/s0IQw==", - "dev": true - }, - "node_modules/grunt-contrib-watch/node_modules/http-errors": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.3.1.tgz", - "integrity": "sha1-GX4izevUGYWF6GlO9nhhl7ke2UI=", - "dev": true, - "dependencies": { - "inherits": "~2.0.1", - "statuses": "1" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/grunt-contrib-watch/node_modules/iconv-lite": { - "version": "0.4.13", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.13.tgz", - "integrity": "sha1-H4irpKsLFQjoMSrMOTRfNumS4vI=", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/grunt-contrib-watch/node_modules/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "dev": true, - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "node_modules/grunt-contrib-watch/node_modules/inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", - "dev": true - }, - "node_modules/grunt-contrib-watch/node_modules/livereload-js": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/livereload-js/-/livereload-js-2.3.0.tgz", - "integrity": "sha512-j1R0/FeGa64Y+NmqfZhyoVRzcFlOZ8sNlKzHjh4VvLULFACZhn68XrX5DFg2FhMvSMJmROuFxRSa560ECWKBMg==", - "dev": true - }, - "node_modules/grunt-contrib-watch/node_modules/lodash": { - "version": "3.10.1", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-3.10.1.tgz", - "integrity": "sha1-W/Rejkm6QYnhfUgnid/RW9FAt7Y=", - "dev": true - }, - "node_modules/grunt-contrib-watch/node_modules/media-typer": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/grunt-contrib-watch/node_modules/mime-db": { - "version": "1.33.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.33.0.tgz", - "integrity": "sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ==", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/grunt-contrib-watch/node_modules/mime-types": { - "version": "2.1.18", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.18.tgz", - "integrity": "sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ==", - "dev": true, - "dependencies": { - "mime-db": "~1.33.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/grunt-contrib-watch/node_modules/minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "dev": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/grunt-contrib-watch/node_modules/ms": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz", - "integrity": "sha1-nNE8A62/8ltl7/3nzoZO6VIBcJg=", - "dev": true - }, - "node_modules/grunt-contrib-watch/node_modules/on-finished": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", - "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", - "dev": true, - "dependencies": { - "ee-first": "1.1.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/grunt-contrib-watch/node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dev": true, - "dependencies": { - "wrappy": "1" - } - }, - "node_modules/grunt-contrib-watch/node_modules/parseurl": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.2.tgz", - "integrity": "sha1-/CidTtiZMRlGDBViUyYs3I3mW/M=", - "dev": true, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/grunt-contrib-watch/node_modules/path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/grunt-contrib-watch/node_modules/qs": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-5.1.0.tgz", - "integrity": "sha1-TZMuXH6kEcynajEtOaYGIA/VDNk=", - "dev": true, - "engines": ">=0.10.40" - }, - "node_modules/grunt-contrib-watch/node_modules/raw-body": { - "version": "2.1.7", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.1.7.tgz", - "integrity": "sha1-rf6s4uT7MJgFgBTQjActzFl1h3Q=", - "dev": true, - "dependencies": { - "bytes": "2.4.0", - "iconv-lite": "0.4.13", - "unpipe": "1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/grunt-contrib-watch/node_modules/raw-body/node_modules/bytes": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-2.4.0.tgz", - "integrity": "sha1-fZcZb51br39pNeJZhVSe3SpsIzk=", - "dev": true - }, - "node_modules/grunt-contrib-watch/node_modules/statuses": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz", - "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/grunt-contrib-watch/node_modules/tiny-lr": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/tiny-lr/-/tiny-lr-0.2.1.tgz", - "integrity": "sha1-s/26gC5dVqM8L28QeUsy5Hescp0=", - "dev": true, - "dependencies": { - "body-parser": "~1.14.0", - "debug": "~2.2.0", - "faye-websocket": "~0.10.0", - "livereload-js": "^2.2.0", - "parseurl": "~1.3.0", - "qs": "~5.1.0" - } - }, - "node_modules/grunt-contrib-watch/node_modules/type-is": { - "version": "1.6.16", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.16.tgz", - "integrity": "sha512-HRkVv/5qY2G6I8iab9cI7v1bOIdhm94dVjQCPFElW9W+3GeDOSHmy2EBYe4VTApuzolPcmgFTN3ftVJRKR2J9Q==", - "dev": true, - "dependencies": { - "media-typer": "0.3.0", - "mime-types": "~2.1.18" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/grunt-contrib-watch/node_modules/unpipe": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", - "dev": true, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/grunt-contrib-watch/node_modules/websocket-driver": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.0.tgz", - "integrity": "sha1-DK+dLXVdk67gSdS90NP+LMoqJOs=", - "dev": true, - "dependencies": { - "http-parser-js": ">=0.4.0", - "websocket-extensions": ">=0.1.1" - }, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/grunt-contrib-watch/node_modules/websocket-extensions": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.3.tgz", - "integrity": "sha512-nqHUnMXmBzT0w570r2JpJxfiSD1IzoI+HGVdd3aZ0yNi3ngvQ4jv1dtHt5VGxfI2yj5yqImPhOK4vmIh2xMbGg==", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/grunt-contrib-watch/node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true - }, - "node_modules/grunt-known-options": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/grunt-known-options/-/grunt-known-options-2.0.0.tgz", - "integrity": "sha512-GD7cTz0I4SAede1/+pAbmJRG44zFLPipVtdL9o3vqx9IEyb7b4/Y3s7r6ofI3CchR5GvYJ+8buCSioDv5dQLiA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/grunt-legacy-log": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/grunt-legacy-log/-/grunt-legacy-log-3.0.0.tgz", - "integrity": "sha512-GHZQzZmhyq0u3hr7aHW4qUH0xDzwp2YXldLPZTCjlOeGscAOWWPftZG3XioW8MasGp+OBRIu39LFx14SLjXRcA==", - "dev": true, - "dependencies": { - "colors": "~1.1.2", - "grunt-legacy-log-utils": "~2.1.0", - "hooker": "~0.2.3", - "lodash": "~4.17.19" - }, - "engines": { - "node": ">= 0.10.0" - } - }, - "node_modules/grunt-legacy-log-utils": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/grunt-legacy-log-utils/-/grunt-legacy-log-utils-2.1.0.tgz", - "integrity": "sha512-lwquaPXJtKQk0rUM1IQAop5noEpwFqOXasVoedLeNzaibf/OPWjKYvvdqnEHNmU+0T0CaReAXIbGo747ZD+Aaw==", - "dev": true, - "dependencies": { - "chalk": "~4.1.0", - "lodash": "~4.17.19" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/grunt-legacy-util": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/grunt-legacy-util/-/grunt-legacy-util-2.0.1.tgz", - "integrity": "sha512-2bQiD4fzXqX8rhNdXkAywCadeqiPiay0oQny77wA2F3WF4grPJXCvAcyoWUJV+po/b15glGkxuSiQCK299UC2w==", - "dev": true, - "dependencies": { - "async": "~3.2.0", - "exit": "~0.1.2", - "getobject": "~1.0.0", - "hooker": "~0.2.3", - "lodash": "~4.17.21", - "underscore.string": "~3.3.5", - "which": "~2.0.2" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/grunt-notify": { - "version": "0.4.5", - "resolved": "https://registry.npmjs.org/grunt-notify/-/grunt-notify-0.4.5.tgz", - "integrity": "sha1-BSk5kGFhENtrwK0V5sBZL/4YrDE=", - "dev": true, - "dependencies": { - "semver": "^5.1.0", - "stack-parser": "^0.0.1", - "which": "^1.2.4" - } - }, - "node_modules/grunt-notify/node_modules/semver": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz", - "integrity": "sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA==", - "dev": true, - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/grunt-notify/node_modules/stack-parser": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/stack-parser/-/stack-parser-0.0.1.tgz", - "integrity": "sha1-fTtjoXiH6eLCv1Xb0zGP40o50ec=", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/grunt-notify/node_modules/which": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.0.tgz", - "integrity": "sha512-xcJpopdamTuY5duC/KnTTNBraPK54YwpenP4lzxU8H91GudWpFv38u0CKjclE1Wi2EH2EDz5LRcHcKbCIzqGyg==", - "dev": true, - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "which": "bin/which" - } - }, - "node_modules/grunt-phplint": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/grunt-phplint/-/grunt-phplint-0.0.8.tgz", - "integrity": "sha1-wSeqKP930jnBSgHwUMx7cVnOkMA=", - "dev": true, - "dependencies": { - "cache-swap": "~0.0.2", - "grunt": "~0.4.1" - } - }, - "node_modules/grunt-phplint/node_modules/abbrev": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", - "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", - "dev": true - }, - "node_modules/grunt-phplint/node_modules/argparse": { - "version": "0.1.16", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-0.1.16.tgz", - "integrity": "sha1-z9AeD7uj1srtBJ+9dY1A9lGW9Xw=", - "dev": true, - "dependencies": { - "underscore": "~1.7.0", - "underscore.string": "~2.4.0" - } - }, - "node_modules/grunt-phplint/node_modules/argparse/node_modules/underscore.string": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/underscore.string/-/underscore.string-2.4.0.tgz", - "integrity": "sha1-jN2PusTi0uoefi6Al8QvRCKA+Fs=", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/grunt-phplint/node_modules/async": { - "version": "0.2.10", - "resolved": "https://registry.npmjs.org/async/-/async-0.2.10.tgz", - "integrity": "sha1-trvgsGdLnXGXCMo43owjfLUmw9E=", - "dev": true - }, - "node_modules/grunt-phplint/node_modules/cache-swap": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/cache-swap/-/cache-swap-0.0.6.tgz", - "integrity": "sha1-F834NebDAf0VgJCwPRzDb0Z7FpU=", - "dev": true, - "dependencies": { - "async": "~0.2.6", - "lodash": "~1.1.0", - "rimraf": "~2.1.4" - } - }, - "node_modules/grunt-phplint/node_modules/coffee-script": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/coffee-script/-/coffee-script-1.3.3.tgz", - "integrity": "sha1-FQ1rTLUiiUNp7+1qIQHCC8f0pPQ=", - "deprecated": "CoffeeScript on NPM has moved to \"coffeescript\" (no hyphen)", - "dev": true, - "bin": { - "cake": "bin/cake", - "coffee": "bin/coffee" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/grunt-phplint/node_modules/colors": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/colors/-/colors-0.6.2.tgz", - "integrity": "sha1-JCP+ZnisDF2uiFLl0OW+CMmXq8w=", - "dev": true, - "engines": { - "node": ">=0.1.90" - } - }, - "node_modules/grunt-phplint/node_modules/dateformat": { - "version": "1.0.2-1.2.3", - "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-1.0.2-1.2.3.tgz", - "integrity": "sha1-sCIMAt6YYXQztyhRz0fePfLNvuk=", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/grunt-phplint/node_modules/esprima": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-1.0.4.tgz", - "integrity": "sha1-n1V+CPw7TSbs6d00+Pv0drYlha0=", - "dev": true, - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/grunt-phplint/node_modules/eventemitter2": { - "version": "0.4.14", - "resolved": "https://registry.npmjs.org/eventemitter2/-/eventemitter2-0.4.14.tgz", - "integrity": "sha1-j2G3XN4BKy6esoTUVFWDtWQ7Yas=", - "dev": true - }, - "node_modules/grunt-phplint/node_modules/exit": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", - "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=", - "dev": true, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/grunt-phplint/node_modules/findup-sync": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-0.1.3.tgz", - "integrity": "sha1-fz56l7gjksZTvwZYm9hRkOk8NoM=", - "dev": true, - "dependencies": { - "glob": "~3.2.9", - "lodash": "~2.4.1" - }, - "engines": { - "node": ">= 0.6.0" - } - }, - "node_modules/grunt-phplint/node_modules/findup-sync/node_modules/glob": { - "version": "3.2.11", - "resolved": "https://registry.npmjs.org/glob/-/glob-3.2.11.tgz", - "integrity": "sha1-Spc/Y1uRkPcV0QmH1cAP0oFevj0=", - "dev": true, - "dependencies": { - "inherits": "2", - "minimatch": "0.3" - }, - "engines": { - "node": "*" - } - }, - "node_modules/grunt-phplint/node_modules/findup-sync/node_modules/lodash": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-2.4.2.tgz", - "integrity": "sha1-+t2DS5aDBz2hebPq5tnA0VBT9z4=", - "dev": true, - "engines": [ - "node", - "rhino" - ] - }, - "node_modules/grunt-phplint/node_modules/findup-sync/node_modules/minimatch": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.3.0.tgz", - "integrity": "sha1-J12O2qxPG7MyZHIInnlJyDlGmd0=", - "deprecated": "Please update to minimatch 3.0.2 or higher to avoid a RegExp DoS issue", - "dev": true, - "dependencies": { - "lru-cache": "2", - "sigmund": "~1.0.0" - }, - "engines": { - "node": "*" - } - }, - "node_modules/grunt-phplint/node_modules/getobject": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/getobject/-/getobject-0.1.0.tgz", - "integrity": "sha1-BHpEl4n6Fg0Bj1SG7ZEyC27HiFw=", - "dev": true, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/grunt-phplint/node_modules/glob": { - "version": "3.1.21", - "resolved": "https://registry.npmjs.org/glob/-/glob-3.1.21.tgz", - "integrity": "sha1-0p4KBV3qUTj00H7UDomC6DwgZs0=", - "dev": true, - "dependencies": { - "graceful-fs": "~1.2.0", - "inherits": "1", - "minimatch": "~0.2.11" - }, - "engines": { - "node": "*" - } - }, - "node_modules/grunt-phplint/node_modules/glob/node_modules/inherits": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-1.0.2.tgz", - "integrity": "sha1-ykMJ2t7mtUzAuNJH6NfHoJdb3Js=", - "dev": true - }, - "node_modules/grunt-phplint/node_modules/graceful-fs": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-1.2.3.tgz", - "integrity": "sha1-FaSAaldUfLLS2/J/QuiajDRRs2Q=", - "deprecated": "please upgrade to graceful-fs 4 for compatibility with current and future versions of Node.js", - "dev": true, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/grunt-phplint/node_modules/grunt": { - "version": "0.4.5", - "resolved": "https://registry.npmjs.org/grunt/-/grunt-0.4.5.tgz", - "integrity": "sha1-VpN81RlDJK3/bSB2MYMqnWuk5/A=", - "dev": true, - "dependencies": { - "async": "~0.1.22", - "coffee-script": "~1.3.3", - "colors": "~0.6.2", - "dateformat": "1.0.2-1.2.3", - "eventemitter2": "~0.4.13", - "exit": "~0.1.1", - "findup-sync": "~0.1.2", - "getobject": "~0.1.0", - "glob": "~3.1.21", - "grunt-legacy-log": "~0.1.0", - "grunt-legacy-util": "~0.2.0", - "hooker": "~0.2.3", - "iconv-lite": "~0.2.11", - "js-yaml": "~2.0.5", - "lodash": "~0.9.2", - "minimatch": "~0.2.12", - "nopt": "~1.0.10", - "rimraf": "~2.2.8", - "underscore.string": "~2.2.1", - "which": "~1.0.5" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/grunt-phplint/node_modules/grunt-legacy-log": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/grunt-legacy-log/-/grunt-legacy-log-0.1.3.tgz", - "integrity": "sha1-7ClCboAwIa9ZAp+H0vnNczWgVTE=", - "dev": true, - "dependencies": { - "colors": "~0.6.2", - "grunt-legacy-log-utils": "~0.1.1", - "hooker": "~0.2.3", - "lodash": "~2.4.1", - "underscore.string": "~2.3.3" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/grunt-phplint/node_modules/grunt-legacy-log-utils": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/grunt-legacy-log-utils/-/grunt-legacy-log-utils-0.1.1.tgz", - "integrity": "sha1-wHBrndkGThFvNvI/5OawSGcsD34=", - "dev": true, - "dependencies": { - "colors": "~0.6.2", - "lodash": "~2.4.1", - "underscore.string": "~2.3.3" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/grunt-phplint/node_modules/grunt-legacy-log-utils/node_modules/lodash": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-2.4.2.tgz", - "integrity": "sha1-+t2DS5aDBz2hebPq5tnA0VBT9z4=", - "dev": true, - "engines": [ - "node", - "rhino" - ] - }, - "node_modules/grunt-phplint/node_modules/grunt-legacy-log-utils/node_modules/underscore.string": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/underscore.string/-/underscore.string-2.3.3.tgz", - "integrity": "sha1-ccCL9rQosRM/N+ePo6Icgvcymw0=", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/grunt-phplint/node_modules/grunt-legacy-log/node_modules/lodash": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-2.4.2.tgz", - "integrity": "sha1-+t2DS5aDBz2hebPq5tnA0VBT9z4=", - "dev": true, - "engines": [ - "node", - "rhino" - ] - }, - "node_modules/grunt-phplint/node_modules/grunt-legacy-log/node_modules/underscore.string": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/underscore.string/-/underscore.string-2.3.3.tgz", - "integrity": "sha1-ccCL9rQosRM/N+ePo6Icgvcymw0=", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/grunt-phplint/node_modules/grunt-legacy-util": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/grunt-legacy-util/-/grunt-legacy-util-0.2.0.tgz", - "integrity": "sha1-kzJIhNv343qf98Am3/RR2UqeVUs=", - "dev": true, - "dependencies": { - "async": "~0.1.22", - "exit": "~0.1.1", - "getobject": "~0.1.0", - "hooker": "~0.2.3", - "lodash": "~0.9.2", - "underscore.string": "~2.2.1", - "which": "~1.0.5" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/grunt-phplint/node_modules/grunt-legacy-util/node_modules/async": { - "version": "0.1.22", - "resolved": "https://registry.npmjs.org/async/-/async-0.1.22.tgz", - "integrity": "sha1-D8GqoIig4+8Ovi2IMbqw3PiEUGE=", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/grunt-phplint/node_modules/grunt-legacy-util/node_modules/lodash": { - "version": "0.9.2", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-0.9.2.tgz", - "integrity": "sha1-jzSZxSRdNG1oLlsNO0B2fgnxqSw=", - "dev": true, - "engines": [ - "node", - "rhino" - ] - }, - "node_modules/grunt-phplint/node_modules/grunt/node_modules/async": { - "version": "0.1.22", - "resolved": "https://registry.npmjs.org/async/-/async-0.1.22.tgz", - "integrity": "sha1-D8GqoIig4+8Ovi2IMbqw3PiEUGE=", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/grunt-phplint/node_modules/grunt/node_modules/lodash": { - "version": "0.9.2", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-0.9.2.tgz", - "integrity": "sha1-jzSZxSRdNG1oLlsNO0B2fgnxqSw=", - "dev": true, - "engines": [ - "node", - "rhino" - ] - }, - "node_modules/grunt-phplint/node_modules/grunt/node_modules/rimraf": { - "version": "2.2.8", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.2.8.tgz", - "integrity": "sha1-5Dm+Kq7jJzIZUnMPmaiSnk/FBYI=", - "dev": true, - "bin": { - "rimraf": "bin.js" - } - }, - "node_modules/grunt-phplint/node_modules/hooker": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/hooker/-/hooker-0.2.3.tgz", - "integrity": "sha1-uDT3I8xKJCqmWWNFnfbZhMXT2Vk=", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/grunt-phplint/node_modules/iconv-lite": { - "version": "0.2.11", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.2.11.tgz", - "integrity": "sha1-HOYKOleGSiktEyH/RgnKS7llrcg=", - "dev": true, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/grunt-phplint/node_modules/inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", - "dev": true - }, - "node_modules/grunt-phplint/node_modules/js-yaml": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-2.0.5.tgz", - "integrity": "sha1-olrmUJmZ6X3yeMZxnaEb0Gh3Q6g=", - "dev": true, - "dependencies": { - "argparse": "~ 0.1.11", - "esprima": "~ 1.0.2" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - }, - "engines": { - "node": ">= 0.6.0" - } - }, - "node_modules/grunt-phplint/node_modules/lodash": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-1.1.1.tgz", - "integrity": "sha1-QaKy6aAOZNbRmZ8UP/awdV9ruyQ=", - "dev": true, - "engines": [ - "node", - "rhino" - ] - }, - "node_modules/grunt-phplint/node_modules/lru-cache": { - "version": "2.7.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.7.3.tgz", - "integrity": "sha1-bUUk6LlV+V1PW1iFHOId1y+06VI=", - "dev": true - }, - "node_modules/grunt-phplint/node_modules/minimatch": { - "version": "0.2.14", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.2.14.tgz", - "integrity": "sha1-x054BXT2PG+aCQ6Q775u9TpqdWo=", - "deprecated": "Please update to minimatch 3.0.2 or higher to avoid a RegExp DoS issue", - "dev": true, - "dependencies": { - "lru-cache": "2", - "sigmund": "~1.0.0" - }, - "engines": { - "node": "*" - } - }, - "node_modules/grunt-phplint/node_modules/nopt": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz", - "integrity": "sha1-bd0hvSoxQXuScn3Vhfim83YI6+4=", - "dev": true, - "dependencies": { - "abbrev": "1" - }, - "bin": { - "nopt": "bin/nopt.js" - }, - "engines": { - "node": "*" - } - }, - "node_modules/grunt-phplint/node_modules/rimraf": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.1.4.tgz", - "integrity": "sha1-Wm62Lu2gaPUe3lDymz5c0i89m7I=", - "dev": true, - "optionalDependencies": { - "graceful-fs": "~1" - } - }, - "node_modules/grunt-phplint/node_modules/sigmund": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.1.tgz", - "integrity": "sha1-P/IfGYytIXX587eBhT/ZTQ0ZtZA=", - "dev": true - }, - "node_modules/grunt-phplint/node_modules/underscore": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.7.0.tgz", - "integrity": "sha1-a7rwh3UA02vjTsqlhODbn+8DUgk=", - "dev": true - }, - "node_modules/grunt-phplint/node_modules/underscore.string": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/underscore.string/-/underscore.string-2.2.1.tgz", - "integrity": "sha1-18D6KvXVoaZ/QlPa7pgTLnM/Dxk=", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/grunt-phplint/node_modules/which": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/which/-/which-1.0.9.tgz", - "integrity": "sha1-RgwdoPgQED0DIam2M6+eV15kSG8=", - "dev": true, - "bin": { - "which": "bin/which" - } - }, - "node_modules/grunt-ssh": { - "version": "0.12.9", - "resolved": "https://registry.npmjs.org/grunt-ssh/-/grunt-ssh-0.12.9.tgz", - "integrity": "sha1-IVUaNzmB8Ooo3HmdOKdp5UzU2QQ=", - "dev": true, - "dependencies": { - "async": ">=1.0.0", - "progress": "~1.1.3", - "ssh2": "~0.4.6" - }, - "engines": { - "node": ">= 0.8.7" - }, - "peerDependencies": { - "grunt": "~0.4.1" - } - }, - "node_modules/grunt-ssh/node_modules/asn1": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz", - "integrity": "sha1-2sh4dxPJlmhJ/IGAd36+nB3fO4Y=", - "dev": true - }, - "node_modules/grunt-ssh/node_modules/core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", - "dev": true - }, - "node_modules/grunt-ssh/node_modules/inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", - "dev": true - }, - "node_modules/grunt-ssh/node_modules/isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", - "dev": true - }, - "node_modules/grunt-ssh/node_modules/progress": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/progress/-/progress-1.1.8.tgz", - "integrity": "sha1-4mDHj2Fhzdmw5WzD4Khd4Xx6V74=", - "dev": true, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/grunt-ssh/node_modules/readable-stream": { - "version": "1.0.34", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", - "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", - "dev": true, - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - } - }, - "node_modules/grunt-ssh/node_modules/ssh2": { - "version": "0.4.15", - "resolved": "https://registry.npmjs.org/ssh2/-/ssh2-0.4.15.tgz", - "integrity": "sha1-B8b0EG2fe26m5N9jbGxT8fmBf/g=", - "dev": true, - "dependencies": { - "readable-stream": "~1.0.0", - "ssh2-streams": "~0.0.22" - }, - "engines": { - "node": ">=0.8.7" - } - }, - "node_modules/grunt-ssh/node_modules/ssh2-streams": { - "version": "0.0.23", - "resolved": "https://registry.npmjs.org/ssh2-streams/-/ssh2-streams-0.0.23.tgz", - "integrity": "sha1-ru8wgxu1/Er2qj9tCiYaQTUxYSs=", - "dev": true, - "dependencies": { - "asn1": "~0.2.0", - "readable-stream": "~1.0.0", - "streamsearch": "~0.1.2" - }, - "engines": { - "node": ">=0.8.7" - } - }, - "node_modules/grunt-ssh/node_modules/streamsearch": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-0.1.2.tgz", - "integrity": "sha1-gIudDlb8Jz2Am6VzOOkpkZoanxo=", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/grunt-ssh/node_modules/string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", - "dev": true - }, - "node_modules/grunt-text-replace": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/grunt-text-replace/-/grunt-text-replace-0.4.0.tgz", - "integrity": "sha1-252c5Z4v5J2id+nbwZXD4Rz7FsI=", - "dev": true, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/grunt-wp-i18n": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/grunt-wp-i18n/-/grunt-wp-i18n-1.0.3.tgz", - "integrity": "sha512-CJNbEKeBeOSAPeaJ9B8iCgSwtaG63UR9/uT46a4OsIqnFhOJpeAi138JTlvjfIbnDVoBrzvdrKJe1svveLjUtA==", - "dev": true, - "dependencies": { - "grunt": "^1.0.3", - "node-wp-i18n": "^1.2.2" - }, - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/grunt-wp-readme-to-markdown": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/grunt-wp-readme-to-markdown/-/grunt-wp-readme-to-markdown-2.0.1.tgz", - "integrity": "sha1-QGzV6YmIWA3B0W6AXE4uYJJWhVI=", - "dev": true, - "engines": { - "node": ">= 0.8.0" - }, - "peerDependencies": { - "grunt": ">=0.4.0" - } - }, - "node_modules/has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dev": true, - "dependencies": { - "function-bind": "^1.1.1" - }, - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/has-symbols": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.0.tgz", - "integrity": "sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q=", - "dev": true, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/homedir-polyfill": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz", - "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==", - "dev": true, - "dependencies": { - "parse-passwd": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/hooker": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/hooker/-/hooker-0.2.3.tgz", - "integrity": "sha1-uDT3I8xKJCqmWWNFnfbZhMXT2Vk=", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/http-parser-js": { - "version": "0.4.10", - "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.4.10.tgz", - "integrity": "sha1-ksnBN0w1CF912zWexWzCV8u5P6Q=", - "dev": true - }, - "node_modules/iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dev": true, - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" - }, - "node_modules/ini": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", - "dev": true - }, - "node_modules/interpret": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.1.0.tgz", - "integrity": "sha512-CLM8SNMDu7C5psFCn6Wg/tgpj/bKAg7hc2gWqcuR9OD5Ft9PhBpIu8PLicPeis+xDd6YX2ncI8MCA64I9tftIA==", - "dev": true - }, - "node_modules/is-absolute": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-absolute/-/is-absolute-1.0.0.tgz", - "integrity": "sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA==", - "dev": true, - "dependencies": { - "is-relative": "^1.0.0", - "is-windows": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-core-module": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.9.0.tgz", - "integrity": "sha512-+5FPy5PnwmO3lvfMb0AsoPaBG+5KHUI0wYFXOtYPnVVVspTFUuMZNfNaNVRt3FZadstu2c8x23vykRW/NBoU6A==", - "dev": true, - "dependencies": { - "has": "^1.0.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true, - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/is-plain-object": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", - "dev": true, - "dependencies": { - "isobject": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-relative": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-relative/-/is-relative-1.0.0.tgz", - "integrity": "sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA==", - "dev": true, - "dependencies": { - "is-unc-path": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-unc-path": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-unc-path/-/is-unc-path-1.0.0.tgz", - "integrity": "sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ==", - "dev": true, - "dependencies": { - "unc-path-regex": "^0.1.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-windows": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", - "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true - }, - "node_modules/isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "dev": true, - "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/jshint-stylish": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/jshint-stylish/-/jshint-stylish-2.2.1.tgz", - "integrity": "sha1-JCCCosA1rgP9gQROBXDMQgjPbmE=", - "dev": true, - "dependencies": { - "beeper": "^1.1.0", - "chalk": "^1.0.0", - "log-symbols": "^1.0.0", - "plur": "^2.1.0", - "string-length": "^1.0.0", - "text-table": "^0.2.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/jshint-stylish/node_modules/ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/jshint-stylish/node_modules/ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/jshint-stylish/node_modules/beeper": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/beeper/-/beeper-1.1.1.tgz", - "integrity": "sha1-5tXqjF2tABMEpwsiY4RH9pyy+Ak=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/jshint-stylish/node_modules/chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "dependencies": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/jshint-stylish/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/jshint-stylish/node_modules/has-ansi": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", - "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", - "dev": true, - "dependencies": { - "ansi-regex": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/jshint-stylish/node_modules/irregular-plurals": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/irregular-plurals/-/irregular-plurals-1.4.0.tgz", - "integrity": "sha1-LKmwM2UREYVUEvFr5dd8YqRYp2Y=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/jshint-stylish/node_modules/log-symbols": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-1.0.2.tgz", - "integrity": "sha1-N2/3tY6jCGoPCfrMdGF+ylAeGhg=", - "dev": true, - "dependencies": { - "chalk": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/jshint-stylish/node_modules/plur": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/plur/-/plur-2.1.2.tgz", - "integrity": "sha1-dIJFLBoPUI4+NE6uwxLJHCncZVo=", - "dev": true, - "dependencies": { - "irregular-plurals": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/jshint-stylish/node_modules/string-length": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/string-length/-/string-length-1.0.1.tgz", - "integrity": "sha1-VpcPscOFWOnnC3KL894mmsRa36w=", - "dev": true, - "dependencies": { - "strip-ansi": "^3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/jshint-stylish/node_modules/strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, - "dependencies": { - "ansi-regex": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/jshint-stylish/node_modules/supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/jshint-stylish/node_modules/text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", - "dev": true - }, - "node_modules/kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/liftup": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/liftup/-/liftup-3.0.1.tgz", - "integrity": "sha512-yRHaiQDizWSzoXk3APcA71eOI/UuhEkNN9DiW2Tt44mhYzX4joFoCZlxsSOF7RyeLlfqzFLQI1ngFq3ggMPhOw==", - "dev": true, - "dependencies": { - "extend": "^3.0.2", - "findup-sync": "^4.0.0", - "fined": "^1.2.0", - "flagged-respawn": "^1.0.1", - "is-plain-object": "^2.0.4", - "object.map": "^1.0.1", - "rechoir": "^0.7.0", - "resolve": "^1.19.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/liftup/node_modules/findup-sync": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-4.0.0.tgz", - "integrity": "sha512-6jvvn/12IC4quLBL1KNokxC7wWTvYncaVUYSoxWw7YykPLuRrnv4qdHcSOywOI5RpkOVGeQRtWM8/q+G6W6qfQ==", - "dev": true, - "dependencies": { - "detect-file": "^1.0.0", - "is-glob": "^4.0.0", - "micromatch": "^4.0.2", - "resolve-dir": "^1.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "dev": true - }, - "node_modules/make-iterator": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/make-iterator/-/make-iterator-1.0.1.tgz", - "integrity": "sha512-pxiuXh0iVEq7VM7KMIhs5gxsfxCux2URptUQaXo4iZZJxBAzTPOLE2BumO5dbfVYq/hBJFBR/a1mFDmOx5AGmw==", - "dev": true, - "dependencies": { - "kind-of": "^6.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/map-cache": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", - "integrity": "sha512-8y/eV9QQZCiyn1SprXSrCmqJN0yNRATe+PO8ztwqrvrbdRLA3eYJF0yaR0YayLWkMbsQSKWS9N2gPcGEc4UsZg==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", - "dev": true, - "dependencies": { - "braces": "^3.0.2", - "picomatch": "^2.3.1" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", - "dev": true - }, - "node_modules/mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "dev": true, - "bin": { - "mkdirp": "bin/cmd.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/node-wp-i18n": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/node-wp-i18n/-/node-wp-i18n-1.2.6.tgz", - "integrity": "sha512-aLutjDB1rMJ3FNlNcs/XjmaejED1/y30uLYQrmkXpeUj1NH/SA6pI94CUz3iI7fbQd63lTGg0YNvOQAT8cWdIw==", - "dev": true, - "dependencies": { - "bluebird": "^3.4.1", - "gettext-parser": "^3.1.0", - "glob": "^7.0.5", - "lodash": "^4.14.2", - "minimist": "^1.2.5", - "mkdirp": "^1.0.4", - "tmp": "^0.2.1" - }, - "bin": { - "wpi18n": "bin/wpi18n" - } - }, - "node_modules/nopt": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", - "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=", - "dev": true, - "dependencies": { - "abbrev": "1" - }, - "bin": { - "nopt": "bin/nopt.js" - } - }, - "node_modules/object.defaults": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/object.defaults/-/object.defaults-1.1.0.tgz", - "integrity": "sha512-c/K0mw/F11k4dEUBMW8naXUuBuhxRCfG7W+yFy8EcijU/rSmazOUd1XAEEe6bC0OuXY4HUKjTJv7xbxIMqdxrA==", - "dev": true, - "dependencies": { - "array-each": "^1.0.1", - "array-slice": "^1.0.0", - "for-own": "^1.0.0", - "isobject": "^3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object.map": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/object.map/-/object.map-1.0.1.tgz", - "integrity": "sha512-3+mAJu2PLfnSVGHwIWubpOFLscJANBKuB/6A4CxBstc4aqwQY0FWcsppuy4jU5GSB95yES5JHSI+33AWuS4k6w==", - "dev": true, - "dependencies": { - "for-own": "^1.0.0", - "make-iterator": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object.pick": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", - "integrity": "sha512-tqa/UMy/CCoYmj+H5qc07qvSL9dqcs/WZENZ1JbtWBlATP+iVOe778gE6MSijnyCnORzDuX6hU+LA4SZ09YjFQ==", - "dev": true, - "dependencies": { - "isobject": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dependencies": { - "wrappy": "1" - } - }, - "node_modules/os-homedir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", - "integrity": "sha512-B5JU3cabzk8c67mRRd3ECmROafjYMXbuzlwtqdM8IbS8ktlTix8aFGb2bAGKrSRIlnfKwovGUUr72JUPyOb6kQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/os-tmpdir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/osenv": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz", - "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", - "dev": true, - "dependencies": { - "os-homedir": "^1.0.0", - "os-tmpdir": "^1.0.0" - } - }, - "node_modules/parse-filepath": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/parse-filepath/-/parse-filepath-1.0.2.tgz", - "integrity": "sha512-FwdRXKCohSVeXqwtYonZTXtbGJKrn+HNyWDYVcp5yuJlesTwNH4rsmRZ+GrKAPJ5bLpRxESMeS+Rl0VCHRvB2Q==", - "dev": true, - "dependencies": { - "is-absolute": "^1.0.0", - "map-cache": "^0.2.0", - "path-root": "^0.1.1" - }, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/parse-passwd": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", - "integrity": "sha512-1Y1A//QUXEZK7YKz+rD9WydcE1+EuPr6ZBgKecAB8tmoW6UFv0NREVJe1p+jRxtThkcbbKkfwIbWJe/IeE6m2Q==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true - }, - "node_modules/path-root": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/path-root/-/path-root-0.1.1.tgz", - "integrity": "sha512-QLcPegTHF11axjfojBIoDygmS2E3Lf+8+jI6wOVmNVenrKSo3mFdSGiIgdSHenczw3wPtlVMQaFVwGmM7BJdtg==", - "dev": true, - "dependencies": { - "path-root-regex": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/path-root-regex": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/path-root-regex/-/path-root-regex-0.1.2.tgz", - "integrity": "sha512-4GlJ6rZDhQZFE0DPVKh0e9jmZ5egZfxTkp7bcRDuPlJXbAwhxcl2dINPUAsjLdejqaLsCeg8axcLjIbvBjN4pQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true, - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "dev": true, - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/rechoir": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.7.1.tgz", - "integrity": "sha512-/njmZ8s1wVeR6pjTZ+0nCnv8SpZNRMT2D1RLOJQESlYFDBvwpTA4KWJpZ+sBJ4+vhjILRcK7JIFdGCdxEAAitg==", - "dev": true, - "dependencies": { - "resolve": "^1.9.0" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/remove-trailing-separator": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", - "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", - "dev": true - }, - "node_modules/resolve": { - "version": "1.22.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.0.tgz", - "integrity": "sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw==", - "dev": true, - "dependencies": { - "is-core-module": "^2.8.1", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/resolve-dir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz", - "integrity": "sha512-R7uiTjECzvOsWSfdM0QKFNBVFcK27aHOUwdvK53BcW8zqnGdYp0Fbj82cy54+2A4P2tFM22J5kRfe1R+lM/1yg==", - "dev": true, - "dependencies": { - "expand-tilde": "^2.0.0", - "global-modules": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true - }, - "node_modules/spdx-exceptions": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.1.0.tgz", - "integrity": "sha512-4K1NsmrlCU1JJgUrtgEeTVyfx8VaYea9J9LvARxhbHtVtohPs/gFGG5yy49beySjlIMhhXZ4QqujIZEfS4l6Cg==", - "dev": true - }, - "node_modules/sprintf-js": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.2.tgz", - "integrity": "sha512-VE0SOVEHCk7Qc8ulkWw3ntAzXuqf7S2lvwQaDLRnUeIEaKNQJzV6BwmLKhOqT61aGhfUMrXeaBk+oDGCzvhcug==", - "dev": true - }, - "node_modules/string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "dev": true, - "dependencies": { - "safe-buffer": "~5.2.0" - } - }, - "node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/tmp": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz", - "integrity": "sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==", - "dev": true, - "dependencies": { - "rimraf": "^3.0.0" - }, - "engines": { - "node": ">=8.17.0" - } - }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/unc-path-regex": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/unc-path-regex/-/unc-path-regex-0.1.2.tgz", - "integrity": "sha512-eXL4nmJT7oCpkZsHZUOJo8hcX3GbsiDOa0Qu9F646fi8dT3XuSVopVqAcEiVzSKKH7UoDti23wNX3qGFxcW5Qg==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/underscore.string": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/underscore.string/-/underscore.string-3.3.6.tgz", - "integrity": "sha512-VoC83HWXmCrF6rgkyxS9GHv8W9Q5nhMKho+OadDJGzL2oDYbYEppBaCMH6pFlwLeqj2QS+hhkw2kpXkSdD1JxQ==", - "dev": true, - "dependencies": { - "sprintf-js": "^1.1.1", - "util-deprecate": "^1.0.2" - }, - "engines": { - "node": "*" - } - }, - "node_modules/util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", - "dev": true - }, - "node_modules/v8flags": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-3.2.0.tgz", - "integrity": "sha512-mH8etigqMfiGWdeXpaaqGfs6BndypxusHHcv2qSHyZkGEznCd/qAXCWWRzeowtL54147cktFOC4P5y+kl8d8Jg==", - "dev": true, - "dependencies": { - "homedir-polyfill": "^1.0.1" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" - } - }, - "dependencies": { - "abbrev": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", - "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", - "dev": true - }, - "ansi-gray": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/ansi-gray/-/ansi-gray-0.1.1.tgz", - "integrity": "sha1-KWLPVOyXksSFEKPetSRDaGHvclE=", - "dev": true, - "optional": true, - "requires": { - "ansi-wrap": "0.1.0" - } - }, - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "ansi-wrap": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/ansi-wrap/-/ansi-wrap-0.1.0.tgz", - "integrity": "sha1-qCJQ3bABXponyoLoLqYDu/pF768=", - "dev": true, - "optional": true - }, - "argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "requires": { - "sprintf-js": "~1.0.2" - }, - "dependencies": { - "sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", - "dev": true - } - } - }, - "array-each": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/array-each/-/array-each-1.0.1.tgz", - "integrity": "sha512-zHjL5SZa68hkKHBFBK6DJCTtr9sfTCPCaph/L7tMSLcTFgy+zX7E+6q5UArbtOtMBCtxdICpfTCspRse+ywyXA==", - "dev": true - }, - "array-slice": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/array-slice/-/array-slice-1.1.0.tgz", - "integrity": "sha512-B1qMD3RBP7O8o0H2KbrXDyB0IccejMF15+87Lvlor12ONPRHP6gTjXMNkt/d3ZuOGbAe66hFmaCfECI24Ufp6w==", - "dev": true - }, - "async": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/async/-/async-3.2.4.tgz", - "integrity": "sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==", - "dev": true - }, - "balanced-match": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" - }, - "bluebird": { - "version": "3.7.2", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", - "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", - "dev": true - }, - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "requires": { - "fill-range": "^7.0.1" - } - }, - "chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "cli": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/cli/-/cli-1.0.1.tgz", - "integrity": "sha1-IoF1NPJL+klQw01TLUjsvGIbjBQ=", - "requires": { - "exit": "0.1.2", - "glob": "^7.1.1" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "color-support": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", - "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", - "dev": true, - "optional": true - }, - "colors": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/colors/-/colors-1.1.2.tgz", - "integrity": "sha1-FopHAXVran9RoSzgyXv6KMCE7WM=", - "dev": true - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" - }, - "dateformat": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-3.0.3.tgz", - "integrity": "sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q==", - "dev": true - }, - "detect-file": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz", - "integrity": "sha512-DtCOLG98P007x7wiiOmfI0fi3eIKyWiLTGJ2MDnVi/E04lWGbf+JzrRHMm0rgIIZJGtHpKpbVgLWHrv8xXpc3Q==", - "dev": true - }, - "encoding": { - "version": "0.1.13", - "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", - "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", - "dev": true, - "requires": { - "iconv-lite": "^0.6.2" - }, - "dependencies": { - "iconv-lite": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", - "dev": true, - "requires": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - } - } - } - }, - "esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true - }, - "eventemitter2": { - "version": "0.4.14", - "resolved": "https://registry.npmjs.org/eventemitter2/-/eventemitter2-0.4.14.tgz", - "integrity": "sha1-j2G3XN4BKy6esoTUVFWDtWQ7Yas=", - "dev": true - }, - "exit": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", - "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=" - }, - "expand-tilde": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", - "integrity": "sha512-A5EmesHW6rfnZ9ysHQjPdJRni0SRar0tjtG5MNtm9n5TUvsYU8oozprtRD4AqHxcZWWlVuAmQo2nWKfN9oyjTw==", - "dev": true, - "requires": { - "homedir-polyfill": "^1.0.1" - } - }, - "extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", - "dev": true - }, - "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "findup-sync": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-0.3.0.tgz", - "integrity": "sha1-N5MKpdgWt3fANEXhlmzGeQpMCxY=", - "dev": true, - "requires": { - "glob": "~5.0.0" - }, - "dependencies": { - "glob": { - "version": "5.0.15", - "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz", - "integrity": "sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=", - "dev": true, - "requires": { - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "2 || 3", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - } - } - }, - "fined": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/fined/-/fined-1.2.0.tgz", - "integrity": "sha512-ZYDqPLGxDkDhDZBjZBb+oD1+j0rA4E0pXY50eplAAOPg2N/gUBSSk5IM1/QhPfyVo19lJ+CvXpqfvk+b2p/8Ng==", - "dev": true, - "requires": { - "expand-tilde": "^2.0.2", - "is-plain-object": "^2.0.3", - "object.defaults": "^1.1.0", - "object.pick": "^1.2.0", - "parse-filepath": "^1.0.1" - } - }, - "flagged-respawn": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/flagged-respawn/-/flagged-respawn-1.0.1.tgz", - "integrity": "sha512-lNaHNVymajmk0OJMBn8fVUAU1BtDeKIqKoVhk4xAALB57aALg6b4W0MfJ/cUE0g9YBXy5XhSlPIpYIJ7HaY/3Q==", - "dev": true - }, - "for-in": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", - "integrity": "sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ==", - "dev": true - }, - "for-own": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/for-own/-/for-own-1.0.0.tgz", - "integrity": "sha512-0OABksIGrxKK8K4kynWkQ7y1zounQxP+CWnyclVwj81KW3vlLlGUx57DKGcP/LH216GzqnstnPocF16Nxs0Ycg==", - "dev": true, - "requires": { - "for-in": "^1.0.1" - } - }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" - }, - "function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true - }, - "getobject": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/getobject/-/getobject-1.0.2.tgz", - "integrity": "sha512-2zblDBaFcb3rB4rF77XVnuINOE2h2k/OnqXAiy0IrTxUfV1iFp3la33oAQVY9pCpWU268WFYVt2t71hlMuLsOg==", - "dev": true - }, - "gettext-parser": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/gettext-parser/-/gettext-parser-3.1.1.tgz", - "integrity": "sha512-vNhWcqXEtZPs5Ft1ReA34g7ByWotpcOIeJvXVy2jF3/G2U9v6W0wG4Z4hXzcU8R//jArqkgHcVCGgGqa4vxVlQ==", - "dev": true, - "requires": { - "encoding": "^0.1.12", - "readable-stream": "^3.2.0", - "safe-buffer": "^5.1.2" - } - }, - "glob": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", - "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "global-modules": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz", - "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==", - "dev": true, - "requires": { - "global-prefix": "^1.0.1", - "is-windows": "^1.0.1", - "resolve-dir": "^1.0.0" - } - }, - "global-prefix": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz", - "integrity": "sha512-5lsx1NUDHtSjfg0eHlmYvZKv8/nVqX4ckFbM+FrGcQ+04KWcWFo9P5MxPZYSzUvyzmdTbI7Eix8Q4IbELDqzKg==", - "dev": true, - "requires": { - "expand-tilde": "^2.0.2", - "homedir-polyfill": "^1.0.1", - "ini": "^1.3.4", - "is-windows": "^1.0.1", - "which": "^1.2.14" - }, - "dependencies": { - "which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - } - } - }, - "grunt": { - "version": "1.5.3", - "resolved": "https://registry.npmjs.org/grunt/-/grunt-1.5.3.tgz", - "integrity": "sha512-mKwmo4X2d8/4c/BmcOETHek675uOqw0RuA/zy12jaspWqvTp4+ZeQF1W+OTpcbncnaBsfbQJ6l0l4j+Sn/GmaQ==", - "dev": true, - "requires": { - "dateformat": "~3.0.3", - "eventemitter2": "~0.4.13", - "exit": "~0.1.2", - "findup-sync": "~0.3.0", - "glob": "~7.1.6", - "grunt-cli": "~1.4.3", - "grunt-known-options": "~2.0.0", - "grunt-legacy-log": "~3.0.0", - "grunt-legacy-util": "~2.0.1", - "iconv-lite": "~0.4.13", - "js-yaml": "~3.14.0", - "minimatch": "~3.0.4", - "mkdirp": "~1.0.4", - "nopt": "~3.0.6", - "rimraf": "~3.0.2" - } - }, - "grunt-cli": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/grunt-cli/-/grunt-cli-1.4.3.tgz", - "integrity": "sha512-9Dtx/AhVeB4LYzsViCjUQkd0Kw0McN2gYpdmGYKtE2a5Yt7v1Q+HYZVWhqXc/kGnxlMtqKDxSwotiGeFmkrCoQ==", - "dev": true, - "requires": { - "grunt-known-options": "~2.0.0", - "interpret": "~1.1.0", - "liftup": "~3.0.1", - "nopt": "~4.0.1", - "v8flags": "~3.2.0" - }, - "dependencies": { - "nopt": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-4.0.3.tgz", - "integrity": "sha512-CvaGwVMztSMJLOeXPrez7fyfObdZqNUK1cPAEzLHrTybIua9pMdmmPR5YwtfNftIOMv3DPUhFaxsZMNTQO20Kg==", - "dev": true, - "requires": { - "abbrev": "1", - "osenv": "^0.1.4" - } - } - } - }, - "grunt-contrib-clean": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/grunt-contrib-clean/-/grunt-contrib-clean-1.0.0.tgz", - "integrity": "sha1-ay7ZQRfix//jLuBFeMlv5GJam20=", - "dev": true, - "requires": { - "async": "^1.5.2", - "rimraf": "^2.5.1" - }, - "dependencies": { - "async": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", - "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", - "dev": true - }, - "balanced-match": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", - "dev": true - }, - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", - "dev": true - }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", - "dev": true - }, - "glob": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", - "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "dev": true, - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", - "dev": true - }, - "minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "dev": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dev": true, - "requires": { - "wrappy": "1" - } - }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "dev": true - }, - "rimraf": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", - "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", - "dev": true, - "requires": { - "glob": "^7.0.5" - } - }, - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true - } - } - }, - "grunt-contrib-compress": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/grunt-contrib-compress/-/grunt-contrib-compress-1.3.0.tgz", - "integrity": "sha1-XlwmogBJCCPH93KIr9LXNQ2Vxj0=", - "dev": true, - "requires": { - "archiver": "^1.0.0", - "chalk": "^1.1.1", - "lodash": "^4.7.0", - "pretty-bytes": "^3.0.1", - "stream-buffers": "^2.1.0" - }, - "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true - }, - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "dev": true - }, - "archiver": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/archiver/-/archiver-1.3.0.tgz", - "integrity": "sha1-TyGU1tj5nfP1MeaIHxTxXVX6ryI=", - "dev": true, - "requires": { - "archiver-utils": "^1.3.0", - "async": "^2.0.0", - "buffer-crc32": "^0.2.1", - "glob": "^7.0.0", - "lodash": "^4.8.0", - "readable-stream": "^2.0.0", - "tar-stream": "^1.5.0", - "walkdir": "^0.0.11", - "zip-stream": "^1.1.0" - } - }, - "archiver-utils": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/archiver-utils/-/archiver-utils-1.3.0.tgz", - "integrity": "sha1-5QtMCccL89aA4y/xt5lOn52JUXQ=", - "dev": true, - "requires": { - "glob": "^7.0.0", - "graceful-fs": "^4.1.0", - "lazystream": "^1.0.0", - "lodash": "^4.8.0", - "normalize-path": "^2.0.0", - "readable-stream": "^2.0.0" - } - }, - "async": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/async/-/async-2.6.0.tgz", - "integrity": "sha512-xAfGg1/NTLBBKlHFmnd7PlmUW9KhVQIUuSrYem9xzFUZy13ScvtyGGejaae9iAVRiRq9+Cx7DPFaAAhCpyxyPw==", - "dev": true, - "requires": { - "lodash": "^4.14.0" - } - }, - "balanced-match": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", - "dev": true - }, - "bl": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/bl/-/bl-1.2.1.tgz", - "integrity": "sha1-ysMo977kVzDUBLaSID/LWQ4XLV4=", - "dev": true, - "requires": { - "readable-stream": "^2.0.5" - } - }, - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "buffer-crc32": { - "version": "0.2.13", - "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", - "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=", - "dev": true - }, - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "requires": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - } - }, - "compress-commons": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/compress-commons/-/compress-commons-1.2.2.tgz", - "integrity": "sha1-UkqfEJA/OoEzibAiXSfEi7dRiQ8=", - "dev": true, - "requires": { - "buffer-crc32": "^0.2.1", - "crc32-stream": "^2.0.0", - "normalize-path": "^2.0.0", - "readable-stream": "^2.0.0" - } - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", - "dev": true - }, - "core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", - "dev": true - }, - "crc": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/crc/-/crc-3.5.0.tgz", - "integrity": "sha1-mLi6fUiWZbo5efWbITgTdBAaGWQ=", - "dev": true - }, - "crc32-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/crc32-stream/-/crc32-stream-2.0.0.tgz", - "integrity": "sha1-483TtN8xaN10494/u8t7KX/pCPQ=", - "dev": true, - "requires": { - "crc": "^3.4.4", - "readable-stream": "^2.0.0" - } - }, - "end-of-stream": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz", - "integrity": "sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==", - "dev": true, - "requires": { - "once": "^1.4.0" - } - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", - "dev": true - }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", - "dev": true - }, - "glob": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", - "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "graceful-fs": { - "version": "4.1.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", - "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", - "dev": true - }, - "has-ansi": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", - "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - } - }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "dev": true, - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", - "dev": true - }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "lazystream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.0.tgz", - "integrity": "sha1-9plf4PggOS9hOWvolGJAe7dxaOQ=", - "dev": true, - "requires": { - "readable-stream": "^2.0.5" - } - }, - "minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "dev": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "normalize-path": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", - "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", - "dev": true, - "requires": { - "remove-trailing-separator": "^1.0.1" - } - }, - "number-is-nan": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", - "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", - "dev": true - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dev": true, - "requires": { - "wrappy": "1" - } - }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "dev": true - }, - "pretty-bytes": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-3.0.1.tgz", - "integrity": "sha1-J9AAjXeAY6C0gRuzXHnxvV1fvM8=", - "dev": true, - "requires": { - "number-is-nan": "^1.0.0" - } - }, - "process-nextick-args": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", - "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==", - "dev": true - }, - "readable-stream": { - "version": "2.3.4", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.4.tgz", - "integrity": "sha512-vuYxeWYM+fde14+rajzqgeohAI7YoJcHE7kXDAc4Nk0EbuKnJfqtY9YtRkLo/tqkuF7MsBQRhPnPeyjYITp3ZQ==", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.0.3", - "util-deprecate": "~1.0.1" - } - }, - "safe-buffer": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", - "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==", - "dev": true - }, - "stream-buffers": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/stream-buffers/-/stream-buffers-2.2.0.tgz", - "integrity": "sha1-kdX1Ew0c75bc+n9yaUUYh0HQnuQ=", - "dev": true - }, - "string_decoder": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", - "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - } - }, - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true - }, - "tar-stream": { - "version": "1.5.5", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-1.5.5.tgz", - "integrity": "sha512-mQdgLPc/Vjfr3VWqWbfxW8yQNiJCbAZ+Gf6GDu1Cy0bdb33ofyiNGBtAY96jHFhDuivCwgW1H9DgTON+INiXgg==", - "dev": true, - "requires": { - "bl": "^1.0.0", - "end-of-stream": "^1.0.0", - "readable-stream": "^2.0.0", - "xtend": "^4.0.0" - } - }, - "util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", - "dev": true - }, - "walkdir": { - "version": "0.0.11", - "resolved": "https://registry.npmjs.org/walkdir/-/walkdir-0.0.11.tgz", - "integrity": "sha1-oW0CXrkxvQO1LzCMrtD0D86+lTI=", - "dev": true - }, - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true - }, - "xtend": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", - "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=", - "dev": true - }, - "zip-stream": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/zip-stream/-/zip-stream-1.2.0.tgz", - "integrity": "sha1-qLxF9MG0lpnGuQGYuqyqzbzUugQ=", - "dev": true, - "requires": { - "archiver-utils": "^1.3.0", - "compress-commons": "^1.2.0", - "lodash": "^4.8.0", - "readable-stream": "^2.0.0" - } - } - } - }, - "grunt-contrib-concat": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/grunt-contrib-concat/-/grunt-contrib-concat-1.0.1.tgz", - "integrity": "sha1-YVCYYwhOhx1+ht5IwBUlntl3Rb0=", - "dev": true, - "requires": { - "chalk": "^1.0.0", - "source-map": "^0.5.3" - }, - "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true - }, - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "dev": true - }, - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "requires": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - } - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", - "dev": true - }, - "has-ansi": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", - "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - } - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - } - }, - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true - } - } - }, - "grunt-contrib-copy": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/grunt-contrib-copy/-/grunt-contrib-copy-1.0.0.tgz", - "integrity": "sha1-cGDGWB6QS4qw0A8HbgqPbj58NXM=", - "dev": true, - "requires": { - "chalk": "^1.1.1", - "file-sync-cmp": "^0.1.0" - }, - "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true - }, - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "dev": true - }, - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "requires": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - } - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", - "dev": true - }, - "file-sync-cmp": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/file-sync-cmp/-/file-sync-cmp-0.1.1.tgz", - "integrity": "sha1-peeo/7+kk7Q7kju9TKiaU7Y7YSs=", - "dev": true - }, - "has-ansi": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", - "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - } - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - } - }, - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true - } - } - }, - "grunt-contrib-imagemin": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/grunt-contrib-imagemin/-/grunt-contrib-imagemin-1.0.1.tgz", - "integrity": "sha1-5Ho1YTN29MqpwfkERlA8rhyUTXk=", - "dev": true, - "requires": { - "async": "^1.5.2", - "chalk": "^1.0.0", - "gulp-rename": "^1.2.0", - "imagemin": "^4.0.0", - "pretty-bytes": "^3.0.1" - }, - "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true - }, - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "dev": true - }, - "archive-type": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/archive-type/-/archive-type-3.2.0.tgz", - "integrity": "sha1-nNnABpV+vpX62tW9YJiUKoE3N/Y=", - "dev": true, - "optional": true, - "requires": { - "file-type": "^3.1.0" - } - }, - "argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "optional": true, - "requires": { - "sprintf-js": "~1.0.2" - } - }, - "arr-diff": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", - "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", - "dev": true, - "requires": { - "arr-flatten": "^1.0.1" - } - }, - "arr-flatten": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", - "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", - "dev": true - }, - "array-differ": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/array-differ/-/array-differ-1.0.0.tgz", - "integrity": "sha1-7/UuN1gknTO+QCuLuOVkuytdQDE=", - "dev": true, - "optional": true - }, - "array-find-index": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz", - "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=", - "dev": true, - "optional": true - }, - "array-uniq": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", - "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=", - "dev": true, - "optional": true - }, - "array-unique": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", - "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=", - "dev": true - }, - "async": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", - "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", - "dev": true - }, - "async-each-series": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/async-each-series/-/async-each-series-1.1.0.tgz", - "integrity": "sha1-9C/YFV048hpbjqB8KOBj7RcAsTg=", - "dev": true, - "optional": true - }, - "balanced-match": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", - "dev": true - }, - "beeper": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/beeper/-/beeper-1.1.1.tgz", - "integrity": "sha1-5tXqjF2tABMEpwsiY4RH9pyy+Ak=", - "dev": true, - "optional": true - }, - "bin-build": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/bin-build/-/bin-build-2.2.0.tgz", - "integrity": "sha1-EfjdYfcP/Por3KpbRvXo/t1CIcw=", - "dev": true, - "optional": true, - "requires": { - "archive-type": "^3.0.1", - "decompress": "^3.0.0", - "download": "^4.1.2", - "exec-series": "^1.0.0", - "rimraf": "^2.2.6", - "tempfile": "^1.0.0", - "url-regex": "^3.0.0" - } - }, - "bin-check": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/bin-check/-/bin-check-2.0.0.tgz", - "integrity": "sha1-hvjm9CU4k99g3DFpV/WvAqywWTA=", - "dev": true, - "optional": true, - "requires": { - "executable": "^1.0.0" - } - }, - "bin-version": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/bin-version/-/bin-version-1.0.4.tgz", - "integrity": "sha1-nrSY7m/Xb3q5p8FgQ2+JV5Q1144=", - "dev": true, - "optional": true, - "requires": { - "find-versions": "^1.0.0" - } - }, - "bin-version-check": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/bin-version-check/-/bin-version-check-2.1.0.tgz", - "integrity": "sha1-5OXfKQuQaffRETJAMe/BP90RpbA=", - "dev": true, - "optional": true, - "requires": { - "bin-version": "^1.0.0", - "minimist": "^1.1.0", - "semver": "^4.0.3", - "semver-truncate": "^1.0.0" - }, - "dependencies": { - "semver": { - "version": "4.3.6", - "resolved": "https://registry.npmjs.org/semver/-/semver-4.3.6.tgz", - "integrity": "sha1-MAvG4OhjdPe6YQaLWx7NV/xlMto=", - "dev": true, - "optional": true - } - } - }, - "bin-wrapper": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/bin-wrapper/-/bin-wrapper-3.0.2.tgz", - "integrity": "sha1-Z9MwYmLksaXy+I7iNGT2plVneus=", - "dev": true, - "optional": true, - "requires": { - "bin-check": "^2.0.0", - "bin-version-check": "^2.1.0", - "download": "^4.0.0", - "each-async": "^1.1.1", - "lazy-req": "^1.0.0", - "os-filter-obj": "^1.0.0" - } - }, - "bl": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/bl/-/bl-1.2.1.tgz", - "integrity": "sha1-ysMo977kVzDUBLaSID/LWQ4XLV4=", - "dev": true, - "optional": true, - "requires": { - "readable-stream": "^2.0.5" - } - }, - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "braces": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", - "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", - "dev": true, - "requires": { - "expand-range": "^1.8.1", - "preserve": "^0.2.0", - "repeat-element": "^1.1.2" - } - }, - "buffer-crc32": { - "version": "0.2.13", - "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", - "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=", - "dev": true, - "optional": true - }, - "buffer-to-vinyl": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/buffer-to-vinyl/-/buffer-to-vinyl-1.1.0.tgz", - "integrity": "sha1-APFfruOreh3aLN5tkSG//dB7ImI=", - "dev": true, - "requires": { - "file-type": "^3.1.0", - "readable-stream": "^2.0.2", - "uuid": "^2.0.1", - "vinyl": "^1.0.0" - } - }, - "builtin-modules": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", - "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", - "dev": true, - "optional": true - }, - "camelcase": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", - "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=", - "dev": true, - "optional": true - }, - "camelcase-keys": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz", - "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=", - "dev": true, - "optional": true, - "requires": { - "camelcase": "^2.0.0", - "map-obj": "^1.0.0" - } - }, - "capture-stack-trace": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/capture-stack-trace/-/capture-stack-trace-1.0.0.tgz", - "integrity": "sha1-Sm+gc5nCa7pH8LJJa00PtAjFVQ0=", - "dev": true, - "optional": true - }, - "caw": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/caw/-/caw-1.2.0.tgz", - "integrity": "sha1-/7Im/n78VHKI3GLuPpcHPCEtEDQ=", - "dev": true, - "optional": true, - "requires": { - "get-proxy": "^1.0.1", - "is-obj": "^1.0.0", - "object-assign": "^3.0.0", - "tunnel-agent": "^0.4.0" - }, - "dependencies": { - "object-assign": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-3.0.0.tgz", - "integrity": "sha1-m+3VygiXlJvKR+f/QIBi1Un1h/I=", - "dev": true, - "optional": true - } - } - }, - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "requires": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - } - }, - "clap": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/clap/-/clap-1.2.3.tgz", - "integrity": "sha512-4CoL/A3hf90V3VIEjeuhSvlGFEHKzOz+Wfc2IVZc+FaUgU0ZQafJTP49fvnULipOPcAfqhyI2duwQyns6xqjYA==", - "dev": true, - "optional": true, - "requires": { - "chalk": "^1.1.3" - } - }, - "clone": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.3.tgz", - "integrity": "sha1-KY1+IjFmD0DAA8LtMUDezz9TCF8=", - "dev": true - }, - "clone-stats": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-0.0.1.tgz", - "integrity": "sha1-uI+UqCzzi4eR1YBG6kAprYjKmdE=", - "dev": true - }, - "co": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/co/-/co-3.1.0.tgz", - "integrity": "sha1-TqVOpaCJOBUxheFSEMaNkJK8G3g=", - "dev": true, - "optional": true - }, - "coa": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/coa/-/coa-1.0.4.tgz", - "integrity": "sha1-qe8VNmDWqGqL3sAomlxoTSF0Mv0=", - "dev": true, - "optional": true, - "requires": { - "q": "^1.1.2" - } - }, - "colors": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/colors/-/colors-1.1.2.tgz", - "integrity": "sha1-FopHAXVran9RoSzgyXv6KMCE7WM=", - "dev": true, - "optional": true - }, - "commander": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.8.1.tgz", - "integrity": "sha1-Br42f+v9oMMwqh4qBy09yXYkJdQ=", - "dev": true, - "optional": true, - "requires": { - "graceful-readlink": ">= 1.0.0" - } - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", - "dev": true - }, - "concat-stream": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.0.tgz", - "integrity": "sha1-CqxmL9Ur54lk1VMvaUeE5wEQrPc=", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "readable-stream": "^2.2.2", - "typedarray": "^0.0.6" - } - }, - "console-stream": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/console-stream/-/console-stream-0.1.1.tgz", - "integrity": "sha1-oJX+B7IEZZVfL6/Si11yvM2UnUQ=", - "dev": true, - "optional": true - }, - "convert-source-map": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.5.1.tgz", - "integrity": "sha1-uCeAl7m8IpNl3lxiz1/K7YtVmeU=", - "dev": true - }, - "core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", - "dev": true - }, - "create-error-class": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/create-error-class/-/create-error-class-3.0.2.tgz", - "integrity": "sha1-Br56vvlHo/FKMP1hBnHUAbyot7Y=", - "dev": true, - "optional": true, - "requires": { - "capture-stack-trace": "^1.0.0" - } - }, - "csso": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/csso/-/csso-2.0.0.tgz", - "integrity": "sha1-F4tDpEYhIhwndWCG9THgL0KQDug=", - "dev": true, - "optional": true, - "requires": { - "clap": "^1.0.9", - "source-map": "^0.5.3" - } - }, - "currently-unhandled": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", - "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=", - "dev": true, - "optional": true, - "requires": { - "array-find-index": "^1.0.1" - } - }, - "dateformat": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-2.2.0.tgz", - "integrity": "sha1-QGXiATz5+5Ft39gu+1Bq1MZ2kGI=", - "dev": true, - "optional": true - }, - "decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", - "dev": true, - "optional": true - }, - "decompress": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/decompress/-/decompress-3.0.0.tgz", - "integrity": "sha1-rx3VDQbjv8QyRh033hGzjA2ZG+0=", - "dev": true, - "optional": true, - "requires": { - "buffer-to-vinyl": "^1.0.0", - "concat-stream": "^1.4.6", - "decompress-tar": "^3.0.0", - "decompress-tarbz2": "^3.0.0", - "decompress-targz": "^3.0.0", - "decompress-unzip": "^3.0.0", - "stream-combiner2": "^1.1.1", - "vinyl-assign": "^1.0.1", - "vinyl-fs": "^2.2.0" - } - }, - "decompress-tar": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/decompress-tar/-/decompress-tar-3.1.0.tgz", - "integrity": "sha1-IXx4n5uURQ76rcXF5TeXj8MzxGY=", - "dev": true, - "optional": true, - "requires": { - "is-tar": "^1.0.0", - "object-assign": "^2.0.0", - "strip-dirs": "^1.0.0", - "tar-stream": "^1.1.1", - "through2": "^0.6.1", - "vinyl": "^0.4.3" - }, - "dependencies": { - "clone": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/clone/-/clone-0.2.0.tgz", - "integrity": "sha1-xhJqkK1Pctv1rNskPMN3JP6T/B8=", - "dev": true, - "optional": true - }, - "vinyl": { - "version": "0.4.6", - "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-0.4.6.tgz", - "integrity": "sha1-LzVsh6VQolVGHza76ypbqL94SEc=", - "dev": true, - "optional": true, - "requires": { - "clone": "^0.2.0", - "clone-stats": "^0.0.1" - } - } - } - }, - "decompress-tarbz2": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/decompress-tarbz2/-/decompress-tarbz2-3.1.0.tgz", - "integrity": "sha1-iyOTVoE1X58YnYclag+L3ZbZZm0=", - "dev": true, - "optional": true, - "requires": { - "is-bzip2": "^1.0.0", - "object-assign": "^2.0.0", - "seek-bzip": "^1.0.3", - "strip-dirs": "^1.0.0", - "tar-stream": "^1.1.1", - "through2": "^0.6.1", - "vinyl": "^0.4.3" - }, - "dependencies": { - "clone": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/clone/-/clone-0.2.0.tgz", - "integrity": "sha1-xhJqkK1Pctv1rNskPMN3JP6T/B8=", - "dev": true, - "optional": true - }, - "vinyl": { - "version": "0.4.6", - "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-0.4.6.tgz", - "integrity": "sha1-LzVsh6VQolVGHza76ypbqL94SEc=", - "dev": true, - "optional": true, - "requires": { - "clone": "^0.2.0", - "clone-stats": "^0.0.1" - } - } - } - }, - "decompress-targz": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/decompress-targz/-/decompress-targz-3.1.0.tgz", - "integrity": "sha1-ssE9+YFmJomRtxXWRH9kLpaW9aA=", - "dev": true, - "optional": true, - "requires": { - "is-gzip": "^1.0.0", - "object-assign": "^2.0.0", - "strip-dirs": "^1.0.0", - "tar-stream": "^1.1.1", - "through2": "^0.6.1", - "vinyl": "^0.4.3" - }, - "dependencies": { - "clone": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/clone/-/clone-0.2.0.tgz", - "integrity": "sha1-xhJqkK1Pctv1rNskPMN3JP6T/B8=", - "dev": true, - "optional": true - }, - "vinyl": { - "version": "0.4.6", - "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-0.4.6.tgz", - "integrity": "sha1-LzVsh6VQolVGHza76ypbqL94SEc=", - "dev": true, - "optional": true, - "requires": { - "clone": "^0.2.0", - "clone-stats": "^0.0.1" - } - } - } - }, - "decompress-unzip": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/decompress-unzip/-/decompress-unzip-3.4.0.tgz", - "integrity": "sha1-YUdbQVIGa74/7hL51inRX+ZHjus=", - "dev": true, - "optional": true, - "requires": { - "is-zip": "^1.0.0", - "read-all-stream": "^3.0.0", - "stat-mode": "^0.2.0", - "strip-dirs": "^1.0.0", - "through2": "^2.0.0", - "vinyl": "^1.0.0", - "yauzl": "^2.2.1" - }, - "dependencies": { - "through2": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.3.tgz", - "integrity": "sha1-AARWmzfHx0ujnEPzzteNGtlBQL4=", - "dev": true, - "optional": true, - "requires": { - "readable-stream": "^2.1.5", - "xtend": "~4.0.1" - } - } - } - }, - "deep-extend": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.4.2.tgz", - "integrity": "sha1-SLaZwn4zS/ifEIkr5DL25MfTSn8=", - "dev": true, - "optional": true - }, - "download": { - "version": "4.4.3", - "resolved": "https://registry.npmjs.org/download/-/download-4.4.3.tgz", - "integrity": "sha1-qlX9rTktldS2jowr4D4MKqIbqaw=", - "dev": true, - "optional": true, - "requires": { - "caw": "^1.0.1", - "concat-stream": "^1.4.7", - "each-async": "^1.0.0", - "filenamify": "^1.0.1", - "got": "^5.0.0", - "gulp-decompress": "^1.2.0", - "gulp-rename": "^1.2.0", - "is-url": "^1.2.0", - "object-assign": "^4.0.1", - "read-all-stream": "^3.0.0", - "readable-stream": "^2.0.2", - "stream-combiner2": "^1.1.1", - "vinyl": "^1.0.0", - "vinyl-fs": "^2.2.0", - "ware": "^1.2.0" - }, - "dependencies": { - "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", - "dev": true, - "optional": true - } - } - }, - "duplexer2": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz", - "integrity": "sha1-ixLauHjA1p4+eJEFFmKjL8a93ME=", - "dev": true, - "requires": { - "readable-stream": "^2.0.2" - } - }, - "duplexify": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.5.3.tgz", - "integrity": "sha512-g8ID9OroF9hKt2POf8YLayy+9594PzmM3scI00/uBXocX3TWNgoB67hjzkFe9ITAbQOne/lLdBxHXvYUM4ZgGA==", - "dev": true, - "requires": { - "end-of-stream": "^1.0.0", - "inherits": "^2.0.1", - "readable-stream": "^2.0.0", - "stream-shift": "^1.0.0" - } - }, - "each-async": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/each-async/-/each-async-1.1.1.tgz", - "integrity": "sha1-3uUim98KtrogEqOV4bhpq/iBNHM=", - "dev": true, - "optional": true, - "requires": { - "onetime": "^1.0.0", - "set-immediate-shim": "^1.0.0" - } - }, - "end-of-stream": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz", - "integrity": "sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==", - "dev": true, - "requires": { - "once": "^1.4.0" - } - }, - "error-ex": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.1.tgz", - "integrity": "sha1-+FWobOYa3E6GIcPNoh56dhLDqNw=", - "dev": true, - "optional": true, - "requires": { - "is-arrayish": "^0.2.1" - } - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", - "dev": true - }, - "esprima": { - "version": "2.7.3", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz", - "integrity": "sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE=", - "dev": true, - "optional": true - }, - "exec-buffer": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/exec-buffer/-/exec-buffer-2.0.1.tgz", - "integrity": "sha1-ACijG+CxRgth0HX5avRYO54zXqA=", - "dev": true, - "optional": true, - "requires": { - "rimraf": "^2.2.6", - "tempfile": "^1.0.0" - } - }, - "exec-series": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/exec-series/-/exec-series-1.0.3.tgz", - "integrity": "sha1-bSV6m+rEgqhyx3g7yGFYOfx3FDo=", - "dev": true, - "optional": true, - "requires": { - "async-each-series": "^1.1.0", - "object-assign": "^4.1.0" - }, - "dependencies": { - "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", - "dev": true, - "optional": true - } - } - }, - "executable": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/executable/-/executable-1.1.0.tgz", - "integrity": "sha1-h3mA6REvM5EGbaNyZd562ENKtNk=", - "dev": true, - "optional": true, - "requires": { - "meow": "^3.1.0" - } - }, - "expand-brackets": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", - "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", - "dev": true, - "requires": { - "is-posix-bracket": "^0.1.0" - } - }, - "expand-range": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz", - "integrity": "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=", - "dev": true, - "requires": { - "fill-range": "^2.1.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - }, - "extglob": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", - "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", - "dev": true, - "requires": { - "is-extglob": "^1.0.0" - }, - "dependencies": { - "is-extglob": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", - "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", - "dev": true - } - } - }, - "fancy-log": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/fancy-log/-/fancy-log-1.3.2.tgz", - "integrity": "sha1-9BEl49hPLn2JpD0G2VjI94vha+E=", - "dev": true, - "optional": true, - "requires": { - "ansi-gray": "^0.1.1", - "color-support": "^1.1.3", - "time-stamp": "^1.0.0" - } - }, - "fd-slicer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.0.1.tgz", - "integrity": "sha1-i1vL2ewyfFBBv5qwI/1nUPEXfmU=", - "dev": true, - "optional": true, - "requires": { - "pend": "~1.2.0" - } - }, - "figures": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz", - "integrity": "sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=", - "dev": true, - "optional": true, - "requires": { - "escape-string-regexp": "^1.0.5", - "object-assign": "^4.1.0" - }, - "dependencies": { - "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", - "dev": true, - "optional": true - } - } - }, - "file-type": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/file-type/-/file-type-3.9.0.tgz", - "integrity": "sha1-JXoHg4TR24CHvESdEH1SpSZyuek=", - "dev": true - }, - "filename-regex": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz", - "integrity": "sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY=", - "dev": true - }, - "filename-reserved-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/filename-reserved-regex/-/filename-reserved-regex-1.0.0.tgz", - "integrity": "sha1-5hz4BfDeHJhFZ9A4bcXfUO5a9+Q=", - "dev": true, - "optional": true - }, - "filenamify": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/filenamify/-/filenamify-1.2.1.tgz", - "integrity": "sha1-qfL/0RxQO+0wABUCknI3jx8TZaU=", - "dev": true, - "optional": true, - "requires": { - "filename-reserved-regex": "^1.0.0", - "strip-outer": "^1.0.0", - "trim-repeated": "^1.0.0" - } - }, - "fill-range": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.3.tgz", - "integrity": "sha1-ULd9/X5Gm8dJJHCWNpn+eoSFpyM=", - "dev": true, - "requires": { - "is-number": "^2.1.0", - "isobject": "^2.0.0", - "randomatic": "^1.1.3", - "repeat-element": "^1.1.2", - "repeat-string": "^1.5.2" - } - }, - "find-up": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", - "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", - "dev": true, - "optional": true, - "requires": { - "path-exists": "^2.0.0", - "pinkie-promise": "^2.0.0" - } - }, - "find-versions": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/find-versions/-/find-versions-1.2.1.tgz", - "integrity": "sha1-y96fEuOFdaCvG+G5osXV/Y8Ya2I=", - "dev": true, - "optional": true, - "requires": { - "array-uniq": "^1.0.0", - "get-stdin": "^4.0.1", - "meow": "^3.5.0", - "semver-regex": "^1.0.0" - } - }, - "first-chunk-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/first-chunk-stream/-/first-chunk-stream-1.0.0.tgz", - "integrity": "sha1-Wb+1DNkF9g18OUzT2ayqtOatk04=", - "dev": true - }, - "for-own": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz", - "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=", - "dev": true, - "requires": { - "for-in": "^1.0.1" - } - }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", - "dev": true, - "optional": true - }, - "get-proxy": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/get-proxy/-/get-proxy-1.1.0.tgz", - "integrity": "sha1-iUhUSRvFkbDxR9euVw9cZ4tyVus=", - "dev": true, - "optional": true, - "requires": { - "rc": "^1.1.2" - } - }, - "get-stdin": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", - "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=", - "dev": true, - "optional": true - }, - "gifsicle": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/gifsicle/-/gifsicle-3.0.4.tgz", - "integrity": "sha1-9Fy17RAWW2ZdySng6TKLbIId+js=", - "dev": true, - "optional": true, - "requires": { - "bin-build": "^2.0.0", - "bin-wrapper": "^3.0.0", - "logalot": "^2.0.0" - } - }, - "glob": { - "version": "5.0.15", - "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz", - "integrity": "sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=", - "dev": true, - "requires": { - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "2 || 3", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "glob-base": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz", - "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=", - "dev": true, - "requires": { - "glob-parent": "^2.0.0", - "is-glob": "^2.0.0" - }, - "dependencies": { - "glob-parent": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz", - "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=", - "dev": true, - "requires": { - "is-glob": "^2.0.0" - } - }, - "is-extglob": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", - "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", - "dev": true - }, - "is-glob": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", - "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", - "dev": true, - "requires": { - "is-extglob": "^1.0.0" - } - } - } - }, - "glob-parent": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", - "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", - "dev": true, - "requires": { - "is-glob": "^3.1.0", - "path-dirname": "^1.0.0" - } - }, - "glob-stream": { - "version": "5.3.5", - "resolved": "https://registry.npmjs.org/glob-stream/-/glob-stream-5.3.5.tgz", - "integrity": "sha1-pVZlqajM3EGRWofHAeMtTgFvrSI=", - "dev": true, - "requires": { - "extend": "^3.0.0", - "glob": "^5.0.3", - "glob-parent": "^3.0.0", - "micromatch": "^2.3.7", - "ordered-read-streams": "^0.3.0", - "through2": "^0.6.0", - "to-absolute-glob": "^0.1.1", - "unique-stream": "^2.0.2" - } - }, - "glogg": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/glogg/-/glogg-1.0.1.tgz", - "integrity": "sha512-ynYqXLoluBKf9XGR1gA59yEJisIL7YHEH4xr3ZziHB5/yl4qWfaK8Js9jGe6gBGCSCKVqiyO30WnRZADvemUNw==", - "dev": true, - "optional": true, - "requires": { - "sparkles": "^1.0.0" - } - }, - "got": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/got/-/got-5.7.1.tgz", - "integrity": "sha1-X4FjWmHkplifGAVp6k44FoClHzU=", - "dev": true, - "optional": true, - "requires": { - "create-error-class": "^3.0.1", - "duplexer2": "^0.1.4", - "is-redirect": "^1.0.0", - "is-retry-allowed": "^1.0.0", - "is-stream": "^1.0.0", - "lowercase-keys": "^1.0.0", - "node-status-codes": "^1.0.0", - "object-assign": "^4.0.1", - "parse-json": "^2.1.0", - "pinkie-promise": "^2.0.0", - "read-all-stream": "^3.0.0", - "readable-stream": "^2.0.5", - "timed-out": "^3.0.0", - "unzip-response": "^1.0.2", - "url-parse-lax": "^1.0.0" - }, - "dependencies": { - "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", - "dev": true, - "optional": true - } - } - }, - "graceful-fs": { - "version": "4.1.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", - "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", - "dev": true - }, - "graceful-readlink": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz", - "integrity": "sha1-TK+tdrxi8C+gObL5Tpo906ORpyU=", - "dev": true, - "optional": true - }, - "gulp-decompress": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/gulp-decompress/-/gulp-decompress-1.2.0.tgz", - "integrity": "sha1-jutlpeAV+O2FMsr+KEVJYGJvDcc=", - "dev": true, - "optional": true, - "requires": { - "archive-type": "^3.0.0", - "decompress": "^3.0.0", - "gulp-util": "^3.0.1", - "readable-stream": "^2.0.2" - } - }, - "gulp-rename": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/gulp-rename/-/gulp-rename-1.2.2.tgz", - "integrity": "sha1-OtRCh2PwXidk3sHGfYaNsnVoeBc=", - "dev": true - }, - "gulp-sourcemaps": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/gulp-sourcemaps/-/gulp-sourcemaps-1.6.0.tgz", - "integrity": "sha1-uG/zSdgBzrVuHZ59x7vLS33uYAw=", - "dev": true, - "requires": { - "convert-source-map": "^1.1.1", - "graceful-fs": "^4.1.2", - "strip-bom": "^2.0.0", - "through2": "^2.0.0", - "vinyl": "^1.0.0" - }, - "dependencies": { - "through2": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.3.tgz", - "integrity": "sha1-AARWmzfHx0ujnEPzzteNGtlBQL4=", - "dev": true, - "requires": { - "readable-stream": "^2.1.5", - "xtend": "~4.0.1" - } - } - } - }, - "gulp-util": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/gulp-util/-/gulp-util-3.0.8.tgz", - "integrity": "sha1-AFTh50RQLifATBh8PsxQXdVLu08=", - "dev": true, - "optional": true, - "requires": { - "array-differ": "^1.0.0", - "array-uniq": "^1.0.2", - "beeper": "^1.0.0", - "chalk": "^1.0.0", - "dateformat": "^2.0.0", - "fancy-log": "^1.1.0", - "gulplog": "^1.0.0", - "has-gulplog": "^0.1.0", - "lodash._reescape": "^3.0.0", - "lodash._reevaluate": "^3.0.0", - "lodash._reinterpolate": "^3.0.0", - "lodash.template": "^3.0.0", - "minimist": "^1.1.0", - "multipipe": "^0.1.2", - "object-assign": "^3.0.0", - "replace-ext": "0.0.1", - "through2": "^2.0.0", - "vinyl": "^0.5.0" - }, - "dependencies": { - "object-assign": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-3.0.0.tgz", - "integrity": "sha1-m+3VygiXlJvKR+f/QIBi1Un1h/I=", - "dev": true, - "optional": true - }, - "through2": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.3.tgz", - "integrity": "sha1-AARWmzfHx0ujnEPzzteNGtlBQL4=", - "dev": true, - "optional": true, - "requires": { - "readable-stream": "^2.1.5", - "xtend": "~4.0.1" - } - }, - "vinyl": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-0.5.3.tgz", - "integrity": "sha1-sEVbOPxeDPMNQyUTLkYZcMIJHN4=", - "dev": true, - "optional": true, - "requires": { - "clone": "^1.0.0", - "clone-stats": "^0.0.1", - "replace-ext": "0.0.1" - } - } - } - }, - "gulplog": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/gulplog/-/gulplog-1.0.0.tgz", - "integrity": "sha1-4oxNRdBey77YGDY86PnFkmIp/+U=", - "dev": true, - "optional": true, - "requires": { - "glogg": "^1.0.0" - } - }, - "has-ansi": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", - "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - } - }, - "has-gulplog": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/has-gulplog/-/has-gulplog-0.1.0.tgz", - "integrity": "sha1-ZBTIKRNpfaUVkDl9r7EvIpZ4Ec4=", - "dev": true, - "optional": true, - "requires": { - "sparkles": "^1.0.0" - } - }, - "hosted-git-info": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.5.0.tgz", - "integrity": "sha512-pNgbURSuab90KbTqvRPsseaTxOJCZBD0a7t+haSN33piP9cCM4l0CqdzAif2hUqm716UovKB2ROmiabGAKVXyg==", - "dev": true, - "optional": true - }, - "imagemin": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/imagemin/-/imagemin-4.0.0.tgz", - "integrity": "sha1-6Q5/CTaDZZXxj6Ff6Qb0+iWeqEc=", - "dev": true, - "requires": { - "buffer-to-vinyl": "^1.0.0", - "concat-stream": "^1.4.6", - "imagemin-gifsicle": "^4.0.0", - "imagemin-jpegtran": "^4.0.0", - "imagemin-optipng": "^4.0.0", - "imagemin-svgo": "^4.0.0", - "optional": "^0.1.0", - "readable-stream": "^2.0.0", - "stream-combiner2": "^1.1.1", - "vinyl-fs": "^2.1.1" - } - }, - "imagemin-gifsicle": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/imagemin-gifsicle/-/imagemin-gifsicle-4.2.0.tgz", - "integrity": "sha1-D++butNHbmt2iFc2zFsLh6CHV8o=", - "dev": true, - "optional": true, - "requires": { - "gifsicle": "^3.0.0", - "is-gif": "^1.0.0", - "through2": "^0.6.1" - } - }, - "imagemin-jpegtran": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/imagemin-jpegtran/-/imagemin-jpegtran-4.3.2.tgz", - "integrity": "sha1-G8bR4r0T/bZNJFUm1jWn5d/rEvw=", - "dev": true, - "optional": true, - "requires": { - "is-jpg": "^1.0.0", - "jpegtran-bin": "^3.0.0", - "through2": "^2.0.0" - }, - "dependencies": { - "through2": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.3.tgz", - "integrity": "sha1-AARWmzfHx0ujnEPzzteNGtlBQL4=", - "dev": true, - "optional": true, - "requires": { - "readable-stream": "^2.1.5", - "xtend": "~4.0.1" - } - } - } - }, - "imagemin-optipng": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/imagemin-optipng/-/imagemin-optipng-4.3.0.tgz", - "integrity": "sha1-dgRmOrLuMVczJ0cm/Rw3TStErbY=", - "dev": true, - "optional": true, - "requires": { - "exec-buffer": "^2.0.0", - "is-png": "^1.0.0", - "optipng-bin": "^3.0.0", - "through2": "^0.6.1" - } - }, - "imagemin-svgo": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/imagemin-svgo/-/imagemin-svgo-4.2.1.tgz", - "integrity": "sha1-VPB9xW9HJgRi32phxUvvtEtXvlU=", - "dev": true, - "optional": true, - "requires": { - "is-svg": "^1.0.0", - "svgo": "^0.6.0", - "through2": "^2.0.0" - }, - "dependencies": { - "through2": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.3.tgz", - "integrity": "sha1-AARWmzfHx0ujnEPzzteNGtlBQL4=", - "dev": true, - "optional": true, - "requires": { - "readable-stream": "^2.1.5", - "xtend": "~4.0.1" - } - } - } - }, - "indent-string": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz", - "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=", - "dev": true, - "optional": true, - "requires": { - "repeating": "^2.0.0" - } - }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "dev": true, - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", - "dev": true - }, - "ip-regex": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-1.0.3.tgz", - "integrity": "sha1-3FiQdvZZ9BnCIgOaMzFvHHOH7/0=", - "dev": true, - "optional": true - }, - "is-absolute": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/is-absolute/-/is-absolute-0.1.7.tgz", - "integrity": "sha1-hHSREZ/MtftDYhfMc39/qtUPYD8=", - "dev": true, - "optional": true, - "requires": { - "is-relative": "^0.1.0" - } - }, - "is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", - "dev": true, - "optional": true - }, - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", - "dev": true - }, - "is-builtin-module": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz", - "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=", - "dev": true, - "optional": true, - "requires": { - "builtin-modules": "^1.0.0" - } - }, - "is-bzip2": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-bzip2/-/is-bzip2-1.0.0.tgz", - "integrity": "sha1-XuWOqlounIDiFAe+3yOuWsCRs/w=", - "dev": true, - "optional": true - }, - "is-dotfile": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/is-dotfile/-/is-dotfile-1.0.3.tgz", - "integrity": "sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE=", - "dev": true - }, - "is-equal-shallow": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz", - "integrity": "sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ=", - "dev": true, - "requires": { - "is-primitive": "^2.0.0" - } - }, - "is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", - "dev": true - }, - "is-finite": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz", - "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=", - "dev": true, - "optional": true, - "requires": { - "number-is-nan": "^1.0.0" - } - }, - "is-gif": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-gif/-/is-gif-1.0.0.tgz", - "integrity": "sha1-ptKumIkwB7/6l6HYwB1jIFgyCX4=", - "dev": true, - "optional": true - }, - "is-glob": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", - "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", - "dev": true, - "requires": { - "is-extglob": "^2.1.0" - } - }, - "is-gzip": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-gzip/-/is-gzip-1.0.0.tgz", - "integrity": "sha1-bKiwe5nHeZgCWQDlVc7Y7YCHmoM=", - "dev": true, - "optional": true - }, - "is-jpg": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-jpg/-/is-jpg-1.0.0.tgz", - "integrity": "sha1-KVnBfnNDDbOCZNp1uQ3VTy2G2hw=", - "dev": true, - "optional": true - }, - "is-natural-number": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-natural-number/-/is-natural-number-2.1.1.tgz", - "integrity": "sha1-fUxXKDd+84bD4ZSpkRv1fG3DNec=", - "dev": true, - "optional": true - }, - "is-number": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz", - "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - } - }, - "is-obj": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", - "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=", - "dev": true, - "optional": true - }, - "is-png": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-png/-/is-png-1.1.0.tgz", - "integrity": "sha1-1XSxK/J1wDUEVVcLDltXqwYgd84=", - "dev": true, - "optional": true - }, - "is-posix-bracket": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz", - "integrity": "sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q=", - "dev": true - }, - "is-primitive": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-primitive/-/is-primitive-2.0.0.tgz", - "integrity": "sha1-IHurkWOEmcB7Kt8kCkGochADRXU=", - "dev": true - }, - "is-redirect": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-redirect/-/is-redirect-1.0.0.tgz", - "integrity": "sha1-HQPd7VO9jbDzDCbk+V02/HyH3CQ=", - "dev": true, - "optional": true - }, - "is-relative": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/is-relative/-/is-relative-0.1.3.tgz", - "integrity": "sha1-kF/uiuhvRbPsYUvDwVyGnfCHboI=", - "dev": true, - "optional": true - }, - "is-retry-allowed": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-1.1.0.tgz", - "integrity": "sha1-EaBgVotnM5REAz0BJaYaINVk+zQ=", - "dev": true, - "optional": true - }, - "is-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", - "dev": true - }, - "is-svg": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-svg/-/is-svg-1.1.1.tgz", - "integrity": "sha1-rA76r7ZTrFhHNwix+HNjbKEQ4xs=", - "dev": true, - "optional": true - }, - "is-tar": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-tar/-/is-tar-1.0.0.tgz", - "integrity": "sha1-L2suF5LB9bs2UZrKqdZcDSb+hT0=", - "dev": true, - "optional": true - }, - "is-url": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/is-url/-/is-url-1.2.2.tgz", - "integrity": "sha1-SYkFpZO/R8wtnn9zg3K792lsfyY=", - "dev": true, - "optional": true - }, - "is-utf8": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", - "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=", - "dev": true - }, - "is-valid-glob": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/is-valid-glob/-/is-valid-glob-0.3.0.tgz", - "integrity": "sha1-1LVcafUYhvm2XHDWwmItN+KfSP4=", - "dev": true - }, - "is-zip": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-zip/-/is-zip-1.0.0.tgz", - "integrity": "sha1-R7Co/004p2QxzP2ZqOFaTIa6IyU=", - "dev": true, - "optional": true - }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "isobject": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", - "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", - "dev": true, - "requires": { - "isarray": "1.0.0" - } - }, - "jpegtran-bin": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/jpegtran-bin/-/jpegtran-bin-3.2.0.tgz", - "integrity": "sha1-9g7PSumZwL2tLp+83ytvCYHnops=", - "dev": true, - "optional": true, - "requires": { - "bin-build": "^2.0.0", - "bin-wrapper": "^3.0.0", - "logalot": "^2.0.0" - } - }, - "js-yaml": { - "version": "3.6.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.6.1.tgz", - "integrity": "sha1-bl/mfYsgXOTSL60Ft3geja3MSzA=", - "dev": true, - "optional": true, - "requires": { - "argparse": "^1.0.7", - "esprima": "^2.6.0" - } - }, - "json-stable-stringify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz", - "integrity": "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=", - "dev": true, - "requires": { - "jsonify": "~0.0.0" - } - }, - "jsonify": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", - "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=", - "dev": true - }, - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - }, - "lazy-req": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/lazy-req/-/lazy-req-1.1.0.tgz", - "integrity": "sha1-va6+rTD42CQDnODOFJ1Nqge6H6w=", - "dev": true, - "optional": true - }, - "lazystream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.0.tgz", - "integrity": "sha1-9plf4PggOS9hOWvolGJAe7dxaOQ=", - "dev": true, - "requires": { - "readable-stream": "^2.0.5" - } - }, - "load-json-file": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", - "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", - "dev": true, - "optional": true, - "requires": { - "graceful-fs": "^4.1.2", - "parse-json": "^2.2.0", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0", - "strip-bom": "^2.0.0" - } - }, - "lodash._basecopy": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz", - "integrity": "sha1-jaDmqHbPNEwK2KVIghEd08XHyjY=", - "dev": true, - "optional": true - }, - "lodash._basetostring": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/lodash._basetostring/-/lodash._basetostring-3.0.1.tgz", - "integrity": "sha1-0YYdh3+CSlL2aYMtyvPuFVZqB9U=", - "dev": true, - "optional": true - }, - "lodash._basevalues": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lodash._basevalues/-/lodash._basevalues-3.0.0.tgz", - "integrity": "sha1-W3dXYoAr3j0yl1A+JjAIIP32Ybc=", - "dev": true, - "optional": true - }, - "lodash._getnative": { - "version": "3.9.1", - "resolved": "https://registry.npmjs.org/lodash._getnative/-/lodash._getnative-3.9.1.tgz", - "integrity": "sha1-VwvH3t5G1hzc3mh9ZdPuy6o6r/U=", - "dev": true, - "optional": true - }, - "lodash._isiterateecall": { - "version": "3.0.9", - "resolved": "https://registry.npmjs.org/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz", - "integrity": "sha1-UgOte6Ql+uhCRg5pbbnPPmqsBXw=", - "dev": true, - "optional": true - }, - "lodash._reescape": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lodash._reescape/-/lodash._reescape-3.0.0.tgz", - "integrity": "sha1-Kx1vXf4HyKNVdT5fJ/rH8c3hYWo=", - "dev": true, - "optional": true - }, - "lodash._reevaluate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lodash._reevaluate/-/lodash._reevaluate-3.0.0.tgz", - "integrity": "sha1-WLx0xAZklTrgsSTYBpltrKQx4u0=", - "dev": true, - "optional": true - }, - "lodash._reinterpolate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz", - "integrity": "sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0=", - "dev": true, - "optional": true - }, - "lodash._root": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/lodash._root/-/lodash._root-3.0.1.tgz", - "integrity": "sha1-+6HEUkwZ7ppfgTa0YJ8BfPTe1pI=", - "dev": true, - "optional": true - }, - "lodash.escape": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/lodash.escape/-/lodash.escape-3.2.0.tgz", - "integrity": "sha1-mV7g3BjBtIzJLv+ucaEKq1tIdpg=", - "dev": true, - "optional": true, - "requires": { - "lodash._root": "^3.0.0" - } - }, - "lodash.isarguments": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz", - "integrity": "sha1-L1c9hcaiQon/AGY7SRwdM4/zRYo=", - "dev": true, - "optional": true - }, - "lodash.isarray": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/lodash.isarray/-/lodash.isarray-3.0.4.tgz", - "integrity": "sha1-eeTriMNqgSKvhvhEqpvNhRtfu1U=", - "dev": true, - "optional": true - }, - "lodash.isequal": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", - "integrity": "sha1-QVxEePK8wwEgwizhDtMib30+GOA=", - "dev": true - }, - "lodash.keys": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-3.1.2.tgz", - "integrity": "sha1-TbwEcrFWvlCgsoaFXRvQsMZWCYo=", - "dev": true, - "optional": true, - "requires": { - "lodash._getnative": "^3.0.0", - "lodash.isarguments": "^3.0.0", - "lodash.isarray": "^3.0.0" - } - }, - "lodash.restparam": { - "version": "3.6.1", - "resolved": "https://registry.npmjs.org/lodash.restparam/-/lodash.restparam-3.6.1.tgz", - "integrity": "sha1-k2pOMJ7zMKdkXtQUWYbIWuWyCAU=", - "dev": true, - "optional": true - }, - "lodash.template": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-3.6.2.tgz", - "integrity": "sha1-+M3sxhaaJVvpCYrosMU9N4kx0U8=", - "dev": true, - "optional": true, - "requires": { - "lodash._basecopy": "^3.0.0", - "lodash._basetostring": "^3.0.0", - "lodash._basevalues": "^3.0.0", - "lodash._isiterateecall": "^3.0.0", - "lodash._reinterpolate": "^3.0.0", - "lodash.escape": "^3.0.0", - "lodash.keys": "^3.0.0", - "lodash.restparam": "^3.0.0", - "lodash.templatesettings": "^3.0.0" - } - }, - "lodash.templatesettings": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-3.1.1.tgz", - "integrity": "sha1-+zB4RHU7Zrnxr6VOJix0UwfbqOU=", - "dev": true, - "optional": true, - "requires": { - "lodash._reinterpolate": "^3.0.0", - "lodash.escape": "^3.0.0" - } - }, - "logalot": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/logalot/-/logalot-2.1.0.tgz", - "integrity": "sha1-X46MkNME7fElMJUaVVSruMXj9VI=", - "dev": true, - "optional": true, - "requires": { - "figures": "^1.3.5", - "squeak": "^1.0.0" - } - }, - "longest": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz", - "integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc=", - "dev": true, - "optional": true - }, - "loud-rejection": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz", - "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=", - "dev": true, - "optional": true, - "requires": { - "currently-unhandled": "^0.4.1", - "signal-exit": "^3.0.0" - } - }, - "lowercase-keys": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.0.tgz", - "integrity": "sha1-TjNms55/VFfjXxMkvfb4jQv8cwY=", - "dev": true, - "optional": true - }, - "lpad-align": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/lpad-align/-/lpad-align-1.1.2.tgz", - "integrity": "sha1-IfYArBwwlcPG5JfuZyce4ISB/p4=", - "dev": true, - "optional": true, - "requires": { - "get-stdin": "^4.0.1", - "indent-string": "^2.1.0", - "longest": "^1.0.0", - "meow": "^3.3.0" - } - }, - "map-obj": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", - "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=", - "dev": true, - "optional": true - }, - "meow": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz", - "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=", - "dev": true, - "optional": true, - "requires": { - "camelcase-keys": "^2.0.0", - "decamelize": "^1.1.2", - "loud-rejection": "^1.0.0", - "map-obj": "^1.0.1", - "minimist": "^1.1.3", - "normalize-package-data": "^2.3.4", - "object-assign": "^4.0.1", - "read-pkg-up": "^1.0.1", - "redent": "^1.0.0", - "trim-newlines": "^1.0.0" - }, - "dependencies": { - "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", - "dev": true, - "optional": true - } - } - }, - "merge-stream": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-1.0.1.tgz", - "integrity": "sha1-QEEgLVCKNCugAXQAjfDCUbjBNeE=", - "dev": true, - "requires": { - "readable-stream": "^2.0.1" - } - }, - "micromatch": { - "version": "2.3.11", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", - "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", - "dev": true, - "requires": { - "arr-diff": "^2.0.0", - "array-unique": "^0.2.1", - "braces": "^1.8.2", - "expand-brackets": "^0.1.4", - "extglob": "^0.3.1", - "filename-regex": "^2.0.0", - "is-extglob": "^1.0.0", - "is-glob": "^2.0.1", - "kind-of": "^3.0.2", - "normalize-path": "^2.0.1", - "object.omit": "^2.0.0", - "parse-glob": "^3.0.4", - "regex-cache": "^0.4.2" - }, - "dependencies": { - "is-extglob": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", - "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", - "dev": true - }, - "is-glob": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", - "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", - "dev": true, - "requires": { - "is-extglob": "^1.0.0" - } - } - } - }, - "minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "dev": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "mkdirp": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", - "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", - "dev": true, - "requires": { - "minimist": "0.0.8" - }, - "dependencies": { - "minimist": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", - "dev": true - } - } - }, - "multipipe": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/multipipe/-/multipipe-0.1.2.tgz", - "integrity": "sha1-Ko8t33Du1WTf8tV/HhoTfZ8FB4s=", - "dev": true, - "optional": true, - "requires": { - "duplexer2": "0.0.2" - }, - "dependencies": { - "duplexer2": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.0.2.tgz", - "integrity": "sha1-xhTc9n4vsUmVqRcR5aYX6KYKMds=", - "dev": true, - "optional": true, - "requires": { - "readable-stream": "~1.1.9" - } - }, - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", - "dev": true, - "optional": true - }, - "readable-stream": { - "version": "1.1.14", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", - "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", - "dev": true, - "optional": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - } - }, - "string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", - "dev": true, - "optional": true - } - } - }, - "node-status-codes": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/node-status-codes/-/node-status-codes-1.0.0.tgz", - "integrity": "sha1-WuVUHQJGRdMqWPzdyc7s6nrjrC8=", - "dev": true, - "optional": true - }, - "normalize-package-data": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz", - "integrity": "sha512-9jjUFbTPfEy3R/ad/2oNbKtW9Hgovl5O1FvFWKkKblNXoN/Oou6+9+KKohPK13Yc3/TyunyWhJp6gvRNR/PPAw==", - "dev": true, - "optional": true, - "requires": { - "hosted-git-info": "^2.1.4", - "is-builtin-module": "^1.0.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - } - }, - "normalize-path": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", - "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", - "dev": true, - "requires": { - "remove-trailing-separator": "^1.0.1" - } - }, - "number-is-nan": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", - "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", - "dev": true - }, - "object-assign": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-2.1.1.tgz", - "integrity": "sha1-Q8NuXVaf+OSBbE76i+AtJpZ8GKo=", - "dev": true, - "optional": true - }, - "object.omit": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz", - "integrity": "sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=", - "dev": true, - "requires": { - "for-own": "^0.1.4", - "is-extendable": "^0.1.1" - } - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dev": true, - "requires": { - "wrappy": "1" - } - }, - "onetime": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-1.1.0.tgz", - "integrity": "sha1-ofeDj4MUxRbwXs78vEzP4EtO14k=", - "dev": true, - "optional": true - }, - "optional": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/optional/-/optional-0.1.4.tgz", - "integrity": "sha512-gtvrrCfkE08wKcgXaVwQVgwEQ8vel2dc5DDBn9RLQZ3YtmtkBss6A2HY6BnJH4N/4Ku97Ri/SF8sNWE2225WJw==", - "dev": true - }, - "optipng-bin": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/optipng-bin/-/optipng-bin-3.1.4.tgz", - "integrity": "sha1-ldNPLEiHBPb9cGBr/qDGWfHZXYQ=", - "dev": true, - "optional": true, - "requires": { - "bin-build": "^2.0.0", - "bin-wrapper": "^3.0.0", - "logalot": "^2.0.0" - } - }, - "ordered-read-streams": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/ordered-read-streams/-/ordered-read-streams-0.3.0.tgz", - "integrity": "sha1-cTfmmzKYuzQiR6G77jiByA4v14s=", - "dev": true, - "requires": { - "is-stream": "^1.0.1", - "readable-stream": "^2.0.1" - } - }, - "os-filter-obj": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/os-filter-obj/-/os-filter-obj-1.0.3.tgz", - "integrity": "sha1-WRUzDZDs7VV9LZOKMcbdIU2cY60=", - "dev": true, - "optional": true - }, - "parse-glob": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz", - "integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=", - "dev": true, - "requires": { - "glob-base": "^0.3.0", - "is-dotfile": "^1.0.0", - "is-extglob": "^1.0.0", - "is-glob": "^2.0.0" - }, - "dependencies": { - "is-extglob": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", - "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", - "dev": true - }, - "is-glob": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", - "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", - "dev": true, - "requires": { - "is-extglob": "^1.0.0" - } - } - } - }, - "parse-json": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", - "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", - "dev": true, - "optional": true, - "requires": { - "error-ex": "^1.2.0" - } - }, - "path-dirname": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", - "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=", - "dev": true - }, - "path-exists": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", - "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", - "dev": true, - "optional": true, - "requires": { - "pinkie-promise": "^2.0.0" - } - }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "dev": true - }, - "path-type": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", - "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", - "dev": true, - "optional": true, - "requires": { - "graceful-fs": "^4.1.2", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0" - } - }, - "pend": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", - "integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA=", - "dev": true, - "optional": true - }, - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true, - "optional": true - }, - "pinkie": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", - "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", - "dev": true, - "optional": true - }, - "pinkie-promise": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", - "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", - "dev": true, - "optional": true, - "requires": { - "pinkie": "^2.0.0" - } - }, - "prepend-http": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", - "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=", - "dev": true, - "optional": true - }, - "preserve": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz", - "integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=", - "dev": true - }, - "pretty-bytes": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-3.0.1.tgz", - "integrity": "sha1-J9AAjXeAY6C0gRuzXHnxvV1fvM8=", - "dev": true, - "requires": { - "number-is-nan": "^1.0.0" - } - }, - "process-nextick-args": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", - "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==", - "dev": true - }, - "q": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", - "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=", - "dev": true, - "optional": true - }, - "randomatic": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-1.1.7.tgz", - "integrity": "sha512-D5JUjPyJbaJDkuAazpVnSfVkLlpeO3wDlPROTMLGKG1zMFNFRgrciKo1ltz/AzNTkqE0HzDx655QOL51N06how==", - "dev": true, - "requires": { - "is-number": "^3.0.0", - "kind-of": "^4.0.0" - }, - "dependencies": { - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "kind-of": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", - "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "rc": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.5.tgz", - "integrity": "sha1-J1zWh/bjs2zHVrqibf7oCnkDAf0=", - "dev": true, - "optional": true, - "requires": { - "deep-extend": "~0.4.0", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" - } - }, - "read-all-stream": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/read-all-stream/-/read-all-stream-3.1.0.tgz", - "integrity": "sha1-NcPhd/IHjveJ7kv6+kNzB06u9Po=", - "dev": true, - "optional": true, - "requires": { - "pinkie-promise": "^2.0.0", - "readable-stream": "^2.0.0" - } - }, - "read-pkg": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", - "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", - "dev": true, - "optional": true, - "requires": { - "load-json-file": "^1.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^1.0.0" - } - }, - "read-pkg-up": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", - "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", - "dev": true, - "optional": true, - "requires": { - "find-up": "^1.0.0", - "read-pkg": "^1.0.0" - } - }, - "readable-stream": { - "version": "2.3.4", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.4.tgz", - "integrity": "sha512-vuYxeWYM+fde14+rajzqgeohAI7YoJcHE7kXDAc4Nk0EbuKnJfqtY9YtRkLo/tqkuF7MsBQRhPnPeyjYITp3ZQ==", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.0.3", - "util-deprecate": "~1.0.1" - } - }, - "redent": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz", - "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=", - "dev": true, - "optional": true, - "requires": { - "indent-string": "^2.1.0", - "strip-indent": "^1.0.1" - } - }, - "regex-cache": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.4.tgz", - "integrity": "sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ==", - "dev": true, - "requires": { - "is-equal-shallow": "^0.1.3" - } - }, - "repeat-element": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.2.tgz", - "integrity": "sha1-7wiaF40Ug7quTZPrmLT55OEdmQo=", - "dev": true - }, - "repeat-string": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", - "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", - "dev": true - }, - "repeating": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", - "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", - "dev": true, - "optional": true, - "requires": { - "is-finite": "^1.0.0" - } - }, - "replace-ext": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-0.0.1.tgz", - "integrity": "sha1-KbvZIHinOfC8zitO5B6DeVNSKSQ=", - "dev": true - }, - "rimraf": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", - "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", - "dev": true, - "optional": true, - "requires": { - "glob": "^7.0.5" - }, - "dependencies": { - "glob": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", - "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", - "dev": true, - "optional": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - } - } - }, - "safe-buffer": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", - "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==", - "dev": true - }, - "sax": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", - "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", - "dev": true, - "optional": true - }, - "seek-bzip": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/seek-bzip/-/seek-bzip-1.0.5.tgz", - "integrity": "sha1-z+kXyz0nS8/6x5J1ivUxc+sfq9w=", - "dev": true, - "optional": true, - "requires": { - "commander": "~2.8.1" - } - }, - "semver": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz", - "integrity": "sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA==", - "dev": true, - "optional": true - }, - "semver-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/semver-regex/-/semver-regex-1.0.0.tgz", - "integrity": "sha1-kqSWkGX5xwxpR1PVUkj8aPj2Usk=", - "dev": true, - "optional": true - }, - "semver-truncate": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/semver-truncate/-/semver-truncate-1.1.2.tgz", - "integrity": "sha1-V/Qd5pcHpicJp+AQS6IRcQnqR+g=", - "dev": true, - "optional": true, - "requires": { - "semver": "^5.3.0" - } - }, - "set-immediate-shim": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz", - "integrity": "sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E=", - "dev": true, - "optional": true - }, - "signal-exit": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", - "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", - "dev": true, - "optional": true - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true, - "optional": true - }, - "sparkles": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/sparkles/-/sparkles-1.0.0.tgz", - "integrity": "sha1-Gsu/tZJDbRC76PeFt8xvgoFQEsM=", - "dev": true, - "optional": true - }, - "spdx-correct": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-2.0.4.tgz", - "integrity": "sha512-c+4gPpt9YDhz7cHlz5UrsHzxxRi4ksclxnEEKsuGT9JdwSC+ZNmsGbYRzzgxyZaBYpcWnlu+4lPcdLKx4DOCmA==", - "dev": true, - "optional": true, - "requires": { - "spdx-expression-parse": "^2.0.1", - "spdx-license-ids": "^2.0.1" - }, - "dependencies": { - "spdx-expression-parse": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-2.0.2.tgz", - "integrity": "sha512-oFxOkWCfFS0ltNp0H66gXlU4NF6bxg7RkoTYR0413t+yTY9zyj+AIWsjtN8dcVp6703ijDYBWBIARlJ7DkyP9Q==", - "dev": true, - "optional": true, - "requires": { - "spdx-exceptions": "^2.0.0", - "spdx-license-ids": "^2.0.1" - } - } - } - }, - "spdx-expression-parse": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz", - "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==", - "dev": true, - "optional": true, - "requires": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - }, - "dependencies": { - "spdx-license-ids": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.0.tgz", - "integrity": "sha512-2+EPwgbnmOIl8HjGBXXMd9NAu02vLjOO1nWw4kmeRDFyHn+M/ETfHxQUK0oXg8ctgVnl9t3rosNVsZ1jG61nDA==", - "dev": true, - "optional": true - } - } - }, - "spdx-license-ids": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-2.0.1.tgz", - "integrity": "sha1-AgF7zDU07k/+9tWNIOfT6aHDyOw=", - "dev": true, - "optional": true - }, - "sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", - "dev": true, - "optional": true - }, - "squeak": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/squeak/-/squeak-1.3.0.tgz", - "integrity": "sha1-MwRQN7ZDiLVnZ0uEMiplIQc5FsM=", - "dev": true, - "optional": true, - "requires": { - "chalk": "^1.0.0", - "console-stream": "^0.1.1", - "lpad-align": "^1.0.1" - } - }, - "stat-mode": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/stat-mode/-/stat-mode-0.2.2.tgz", - "integrity": "sha1-5sgLYjEj19gM8TLOU480YokHJQI=", - "dev": true, - "optional": true - }, - "stream-combiner2": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/stream-combiner2/-/stream-combiner2-1.1.1.tgz", - "integrity": "sha1-+02KFCDqNidk4hrUeAOXvry0HL4=", - "dev": true, - "requires": { - "duplexer2": "~0.1.0", - "readable-stream": "^2.0.2" - } - }, - "stream-shift": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.0.tgz", - "integrity": "sha1-1cdSgl5TZ+eG944Y5EXqIjoVWVI=", - "dev": true - }, - "string_decoder": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", - "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - } - }, - "strip-bom": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", - "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", - "dev": true, - "requires": { - "is-utf8": "^0.2.0" - } - }, - "strip-bom-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-bom-stream/-/strip-bom-stream-1.0.0.tgz", - "integrity": "sha1-5xRDmFd9Uaa+0PoZlPoF9D/ZiO4=", - "dev": true, - "requires": { - "first-chunk-stream": "^1.0.0", - "strip-bom": "^2.0.0" - } - }, - "strip-dirs": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/strip-dirs/-/strip-dirs-1.1.1.tgz", - "integrity": "sha1-lgu9EoeETzl1pFWKoQOoJV4kVqA=", - "dev": true, - "optional": true, - "requires": { - "chalk": "^1.0.0", - "get-stdin": "^4.0.1", - "is-absolute": "^0.1.5", - "is-natural-number": "^2.0.0", - "minimist": "^1.1.0", - "sum-up": "^1.0.1" - } - }, - "strip-indent": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz", - "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=", - "dev": true, - "optional": true, - "requires": { - "get-stdin": "^4.0.1" - } - }, - "strip-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", - "dev": true, - "optional": true - }, - "strip-outer": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-outer/-/strip-outer-1.0.0.tgz", - "integrity": "sha1-qsC6YNLpDF1PJ1/Yhp/ZotMQ/7g=", - "dev": true, - "optional": true, - "requires": { - "escape-string-regexp": "^1.0.2" - } - }, - "sum-up": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sum-up/-/sum-up-1.0.3.tgz", - "integrity": "sha1-HGYfZnBX9jvLeHWqFDi8FiUlFW4=", - "dev": true, - "optional": true, - "requires": { - "chalk": "^1.0.0" - } - }, - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true - }, - "svgo": { - "version": "0.6.6", - "resolved": "https://registry.npmjs.org/svgo/-/svgo-0.6.6.tgz", - "integrity": "sha1-s0CIkDbyD5tEdUMHfQ9Vc+0ETAg=", - "dev": true, - "optional": true, - "requires": { - "coa": "~1.0.1", - "colors": "~1.1.2", - "csso": "~2.0.0", - "js-yaml": "~3.6.0", - "mkdirp": "~0.5.1", - "sax": "~1.2.1", - "whet.extend": "~0.9.9" - } - }, - "tar-stream": { - "version": "1.5.5", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-1.5.5.tgz", - "integrity": "sha512-mQdgLPc/Vjfr3VWqWbfxW8yQNiJCbAZ+Gf6GDu1Cy0bdb33ofyiNGBtAY96jHFhDuivCwgW1H9DgTON+INiXgg==", - "dev": true, - "optional": true, - "requires": { - "bl": "^1.0.0", - "end-of-stream": "^1.0.0", - "readable-stream": "^2.0.0", - "xtend": "^4.0.0" - } - }, - "tempfile": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/tempfile/-/tempfile-1.1.1.tgz", - "integrity": "sha1-W8xOrsxKsscH2LwR2ZzMmiyyh/I=", - "dev": true, - "optional": true, - "requires": { - "os-tmpdir": "^1.0.0", - "uuid": "^2.0.1" - } - }, - "through2": { - "version": "0.6.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz", - "integrity": "sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=", - "dev": true, - "requires": { - "readable-stream": ">=1.0.33-1 <1.1.0-0", - "xtend": ">=4.0.0 <4.1.0-0" - }, - "dependencies": { - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", - "dev": true - }, - "readable-stream": { - "version": "1.0.34", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", - "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - } - }, - "string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", - "dev": true - } - } - }, - "through2-filter": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/through2-filter/-/through2-filter-2.0.0.tgz", - "integrity": "sha1-YLxVoNrLdghdsfna6Zq0P4PWIuw=", - "dev": true, - "requires": { - "through2": "~2.0.0", - "xtend": "~4.0.0" - }, - "dependencies": { - "through2": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.3.tgz", - "integrity": "sha1-AARWmzfHx0ujnEPzzteNGtlBQL4=", - "dev": true, - "requires": { - "readable-stream": "^2.1.5", - "xtend": "~4.0.1" - } - } - } - }, - "time-stamp": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/time-stamp/-/time-stamp-1.1.0.tgz", - "integrity": "sha1-dkpaEa9QVhkhsTPztE5hhofg9cM=", - "dev": true, - "optional": true - }, - "timed-out": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-3.1.3.tgz", - "integrity": "sha1-lYYL/MXHbCd/j4Mm/Q9bLiDrohc=", - "dev": true, - "optional": true - }, - "to-absolute-glob": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/to-absolute-glob/-/to-absolute-glob-0.1.1.tgz", - "integrity": "sha1-HN+kcqnvUMI57maZm2YsoOs5k38=", - "dev": true, - "requires": { - "extend-shallow": "^2.0.1" - } - }, - "trim-newlines": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz", - "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=", - "dev": true, - "optional": true - }, - "trim-repeated": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/trim-repeated/-/trim-repeated-1.0.0.tgz", - "integrity": "sha1-42RqLqTokTEr9+rObPsFOAvAHCE=", - "dev": true, - "optional": true, - "requires": { - "escape-string-regexp": "^1.0.2" - } - }, - "tunnel-agent": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.4.3.tgz", - "integrity": "sha1-Y3PbdpCf5XDgjXNYM2Xtgop07us=", - "dev": true, - "optional": true - }, - "typedarray": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", - "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", - "dev": true - }, - "unique-stream": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/unique-stream/-/unique-stream-2.2.1.tgz", - "integrity": "sha1-WqADz76Uxf+GbE59ZouxxNuts2k=", - "dev": true, - "requires": { - "json-stable-stringify": "^1.0.0", - "through2-filter": "^2.0.0" - } - }, - "unzip-response": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/unzip-response/-/unzip-response-1.0.2.tgz", - "integrity": "sha1-uYTwh3/AqJwsdzzB73tbIytbBv4=", - "dev": true, - "optional": true - }, - "url-parse-lax": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-1.0.0.tgz", - "integrity": "sha1-evjzA2Rem9eaJy56FKxovAYJ2nM=", - "dev": true, - "optional": true, - "requires": { - "prepend-http": "^1.0.1" - } - }, - "url-regex": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/url-regex/-/url-regex-3.2.0.tgz", - "integrity": "sha1-260eDJ4p4QXdCx8J9oYvf9tIJyQ=", - "dev": true, - "optional": true, - "requires": { - "ip-regex": "^1.0.1" - } - }, - "util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", - "dev": true - }, - "uuid": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-2.0.3.tgz", - "integrity": "sha1-Z+LoY3lyFVMN/zGOW/nc6/1Hsho=", - "dev": true - }, - "vali-date": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/vali-date/-/vali-date-1.0.0.tgz", - "integrity": "sha1-G5BKWWCfsyjvB4E4Qgk09rhnCaY=", - "dev": true - }, - "validate-npm-package-license": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.2.tgz", - "integrity": "sha512-8zlGw3EZDpC7iUDKy4yHCSqFwkBTeAK4h1QqDC3ST6rT7dzvu2ZuclExZN7zuXNEhQ3+2UBQgdca5eNNL06sBg==", - "dev": true, - "optional": true, - "requires": { - "spdx-correct": "^2.0.4", - "spdx-expression-parse": "^3.0.0" - } - }, - "vinyl": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-1.2.0.tgz", - "integrity": "sha1-XIgDbPVl5d8FVYv8kR+GVt8hiIQ=", - "dev": true, - "requires": { - "clone": "^1.0.0", - "clone-stats": "^0.0.1", - "replace-ext": "0.0.1" - } - }, - "vinyl-assign": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/vinyl-assign/-/vinyl-assign-1.2.1.tgz", - "integrity": "sha1-TRmIkbVRWRHXcajNnFSApGoHSkU=", - "dev": true, - "optional": true, - "requires": { - "object-assign": "^4.0.1", - "readable-stream": "^2.0.0" - }, - "dependencies": { - "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", - "dev": true, - "optional": true - } - } - }, - "vinyl-fs": { - "version": "2.4.4", - "resolved": "https://registry.npmjs.org/vinyl-fs/-/vinyl-fs-2.4.4.tgz", - "integrity": "sha1-vm/zJwy1Xf19MGNkDegfJddTIjk=", - "dev": true, - "requires": { - "duplexify": "^3.2.0", - "glob-stream": "^5.3.2", - "graceful-fs": "^4.0.0", - "gulp-sourcemaps": "1.6.0", - "is-valid-glob": "^0.3.0", - "lazystream": "^1.0.0", - "lodash.isequal": "^4.0.0", - "merge-stream": "^1.0.0", - "mkdirp": "^0.5.0", - "object-assign": "^4.0.0", - "readable-stream": "^2.0.4", - "strip-bom": "^2.0.0", - "strip-bom-stream": "^1.0.0", - "through2": "^2.0.0", - "through2-filter": "^2.0.0", - "vali-date": "^1.0.0", - "vinyl": "^1.0.0" - }, - "dependencies": { - "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", - "dev": true - }, - "through2": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.3.tgz", - "integrity": "sha1-AARWmzfHx0ujnEPzzteNGtlBQL4=", - "dev": true, - "requires": { - "readable-stream": "^2.1.5", - "xtend": "~4.0.1" - } - } - } - }, - "ware": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/ware/-/ware-1.3.0.tgz", - "integrity": "sha1-0bFPOdLiy0q4xAmPdW/ksWTkc9Q=", - "dev": true, - "optional": true, - "requires": { - "wrap-fn": "^0.1.0" - } - }, - "whet.extend": { - "version": "0.9.9", - "resolved": "https://registry.npmjs.org/whet.extend/-/whet.extend-0.9.9.tgz", - "integrity": "sha1-+HfVv2SMl+WqVC+twW1qJZucEaE=", - "dev": true, - "optional": true - }, - "wrap-fn": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/wrap-fn/-/wrap-fn-0.1.5.tgz", - "integrity": "sha1-8htuQQFv9KfjFyDbxjoJAWvfmEU=", - "dev": true, - "optional": true, - "requires": { - "co": "3.1.0" - } - }, - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true - }, - "xtend": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", - "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=", - "dev": true - }, - "yauzl": { - "version": "2.9.1", - "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.9.1.tgz", - "integrity": "sha1-qBmB6nCleUYTOIPwKcWCGok1mn8=", - "dev": true, - "optional": true, - "requires": { - "buffer-crc32": "~0.2.3", - "fd-slicer": "~1.0.1" - } - } - } - }, - "grunt-contrib-jshint": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/grunt-contrib-jshint/-/grunt-contrib-jshint-1.1.0.tgz", - "integrity": "sha1-Np2QmyWTxA6L55lAshNAhQx5Oaw=", - "dev": true, - "requires": { - "chalk": "^1.1.1", - "hooker": "^0.2.3", - "jshint": "~2.9.4" - }, - "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true - }, - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "dev": true - }, - "balanced-match": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", - "dev": true - }, - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "requires": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - } - }, - "cli": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/cli/-/cli-1.0.1.tgz", - "integrity": "sha1-IoF1NPJL+klQw01TLUjsvGIbjBQ=", - "dev": true, - "requires": { - "exit": "0.1.2", - "glob": "^7.1.1" - } - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", - "dev": true - }, - "console-browserify": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.1.0.tgz", - "integrity": "sha1-8CQcRXMKn8YyOyBtvzjtx0HQuxA=", - "dev": true, - "requires": { - "date-now": "^0.1.4" - } - }, - "core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", - "dev": true - }, - "date-now": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/date-now/-/date-now-0.1.4.tgz", - "integrity": "sha1-6vQ5/U1ISK105cx9vvIAZyueNFs=", - "dev": true - }, - "dom-serializer": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.0.tgz", - "integrity": "sha1-BzxpdUbOB4DOI75KKOKT5AvDDII=", - "dev": true, - "requires": { - "domelementtype": "~1.1.1", - "entities": "~1.1.1" - }, - "dependencies": { - "domelementtype": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.1.3.tgz", - "integrity": "sha1-vSh3PiZCiBrsUVRJJCmcXNgiGFs=", - "dev": true - }, - "entities": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.1.tgz", - "integrity": "sha1-blwtClYhtdra7O+AuQ7ftc13cvA=", - "dev": true - } - } - }, - "domelementtype": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.0.tgz", - "integrity": "sha1-sXrtguirWeUt2cGbF1bg/BhyBMI=", - "dev": true - }, - "domhandler": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.3.0.tgz", - "integrity": "sha1-LeWaCCLVAn+r/28DLCsloqir5zg=", - "dev": true, - "requires": { - "domelementtype": "1" - } - }, - "domutils": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz", - "integrity": "sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=", - "dev": true, - "requires": { - "dom-serializer": "0", - "domelementtype": "1" - } - }, - "entities": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-1.0.0.tgz", - "integrity": "sha1-sph6o4ITR/zeZCsk/fyeT7cSvyY=", - "dev": true - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", - "dev": true - }, - "exit": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", - "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=", - "dev": true - }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", - "dev": true - }, - "glob": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", - "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "has-ansi": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", - "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - } - }, - "hooker": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/hooker/-/hooker-0.2.3.tgz", - "integrity": "sha1-uDT3I8xKJCqmWWNFnfbZhMXT2Vk=", - "dev": true - }, - "htmlparser2": { - "version": "3.8.3", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.8.3.tgz", - "integrity": "sha1-mWwosZFRaovoZQGn15dX5ccMEGg=", - "dev": true, - "requires": { - "domelementtype": "1", - "domhandler": "2.3", - "domutils": "1.5", - "entities": "1.0", - "readable-stream": "1.1" - } - }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "dev": true, - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", - "dev": true - }, - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", - "dev": true - }, - "jshint": { - "version": "2.9.5", - "resolved": "https://registry.npmjs.org/jshint/-/jshint-2.9.5.tgz", - "integrity": "sha1-HnJSkVzmgbQIJ+4UJIxG006apiw=", - "dev": true, - "requires": { - "cli": "~1.0.0", - "console-browserify": "1.1.x", - "exit": "0.1.x", - "htmlparser2": "3.8.x", - "lodash": "3.7.x", - "minimatch": "~3.0.2", - "shelljs": "0.3.x", - "strip-json-comments": "1.0.x" - } - }, - "lodash": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-3.7.0.tgz", - "integrity": "sha1-Nni9irmVBXwHreg27S7wh9qBHUU=", - "dev": true - }, - "minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "dev": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dev": true, - "requires": { - "wrappy": "1" - } - }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "dev": true - }, - "readable-stream": { - "version": "1.1.14", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", - "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - } - }, - "shelljs": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.3.0.tgz", - "integrity": "sha1-NZbmMHp4FUT1kfN9phg2DzHbV7E=", - "dev": true - }, - "string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", - "dev": true - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - } - }, - "strip-json-comments": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-1.0.4.tgz", - "integrity": "sha1-HhX7ysl9Pumb8tc7TGVrCCu6+5E=", - "dev": true - }, - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true - }, - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true - } - } - }, - "grunt-contrib-less": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/grunt-contrib-less/-/grunt-contrib-less-1.4.1.tgz", - "integrity": "sha1-O73sC3XRLOqlXWKUNiXAsIYc328=", - "dev": true, - "requires": { - "async": "^2.0.0", - "chalk": "^1.0.0", - "less": "~2.7.1", - "lodash": "^4.8.2" - }, - "dependencies": { - "ajv": { - "version": "4.11.8", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-4.11.8.tgz", - "integrity": "sha1-gv+wKynmYq5TvcIK8VlHcGc5xTY=", - "dev": true, - "optional": true, - "requires": { - "co": "^4.6.0", - "json-stable-stringify": "^1.0.1" - } - }, - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true - }, - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "dev": true - }, - "asap": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", - "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=", - "dev": true, - "optional": true - }, - "asn1": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz", - "integrity": "sha1-2sh4dxPJlmhJ/IGAd36+nB3fO4Y=", - "dev": true, - "optional": true - }, - "assert-plus": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-0.2.0.tgz", - "integrity": "sha1-104bh+ev/A24qttwIfP+SBAasjQ=", - "dev": true, - "optional": true - }, - "async": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/async/-/async-2.6.0.tgz", - "integrity": "sha512-xAfGg1/NTLBBKlHFmnd7PlmUW9KhVQIUuSrYem9xzFUZy13ScvtyGGejaae9iAVRiRq9+Cx7DPFaAAhCpyxyPw==", - "dev": true, - "requires": { - "lodash": "^4.14.0" - } - }, - "asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", - "dev": true, - "optional": true - }, - "aws-sign2": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.6.0.tgz", - "integrity": "sha1-FDQt0428yU0OW4fXY81jYSwOeU8=", - "dev": true, - "optional": true - }, - "aws4": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.6.0.tgz", - "integrity": "sha1-g+9cqGCysy5KDe7e6MdxudtXRx4=", - "dev": true, - "optional": true - }, - "bcrypt-pbkdf": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz", - "integrity": "sha1-Y7xdy2EzG5K8Bf1SiVPDNGKgb40=", - "dev": true, - "optional": true, - "requires": { - "tweetnacl": "^0.14.3" - } - }, - "boom": { - "version": "2.10.1", - "resolved": "https://registry.npmjs.org/boom/-/boom-2.10.1.tgz", - "integrity": "sha1-OciRjO/1eZ+D+UkqhI9iWt0Mdm8=", - "dev": true, - "optional": true, - "requires": { - "hoek": "2.x.x" - } - }, - "caseless": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", - "dev": true, - "optional": true - }, - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "requires": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - } - }, - "co": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", - "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", - "dev": true, - "optional": true - }, - "combined-stream": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.6.tgz", - "integrity": "sha1-cj599ugBrFYTETp+RFqbactjKBg=", - "dev": true, - "optional": true, - "requires": { - "delayed-stream": "~1.0.0" - } - }, - "core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", - "dev": true, - "optional": true - }, - "cryptiles": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-2.0.5.tgz", - "integrity": "sha1-O9/s3GCBR8HGcgL6KR59ylnqo7g=", - "dev": true, - "optional": true, - "requires": { - "boom": "2.x.x" - } - }, - "dashdash": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", - "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", - "dev": true, - "optional": true, - "requires": { - "assert-plus": "^1.0.0" - }, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", - "dev": true, - "optional": true - } - } - }, - "delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", - "dev": true, - "optional": true - }, - "ecc-jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz", - "integrity": "sha1-D8c6ntXw1Tw4GTOYUj735UN3dQU=", - "dev": true, - "optional": true, - "requires": { - "jsbn": "~0.1.0" - } - }, - "errno": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.7.tgz", - "integrity": "sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg==", - "dev": true, - "optional": true, - "requires": { - "prr": "~1.0.1" - } - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", - "dev": true - }, - "extsprintf": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", - "dev": true, - "optional": true - }, - "forever-agent": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", - "dev": true, - "optional": true - }, - "form-data": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.1.4.tgz", - "integrity": "sha1-M8GDrPGTJ27KqYFDpp6Uv+4XUNE=", - "dev": true, - "optional": true, - "requires": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.5", - "mime-types": "^2.1.12" - } - }, - "getpass": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", - "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", - "dev": true, - "optional": true, - "requires": { - "assert-plus": "^1.0.0" - }, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", - "dev": true, - "optional": true - } - } - }, - "graceful-fs": { - "version": "4.1.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", - "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", - "dev": true, - "optional": true - }, - "har-schema": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-1.0.5.tgz", - "integrity": "sha1-0mMTX0MwfALGAq/I/pWXDAFRNp4=", - "dev": true, - "optional": true - }, - "har-validator": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-4.2.1.tgz", - "integrity": "sha1-M0gdDxu/9gDdID11gSpqX7oALio=", - "dev": true, - "optional": true, - "requires": { - "ajv": "^4.9.1", - "har-schema": "^1.0.5" - } - }, - "has-ansi": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", - "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - } - }, - "hawk": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/hawk/-/hawk-3.1.3.tgz", - "integrity": "sha1-B4REvXwWQLD+VA0sm3PVlnjo4cQ=", - "dev": true, - "optional": true, - "requires": { - "boom": "2.x.x", - "cryptiles": "2.x.x", - "hoek": "2.x.x", - "sntp": "1.x.x" - } - }, - "hoek": { - "version": "2.16.3", - "resolved": "https://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz", - "integrity": "sha1-ILt0A9POo5jpHcRxCo/xuCdKJe0=", - "dev": true, - "optional": true - }, - "http-signature": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.1.1.tgz", - "integrity": "sha1-33LiZwZs0Kxn+3at+OE0qPvPkb8=", - "dev": true, - "optional": true, - "requires": { - "assert-plus": "^0.2.0", - "jsprim": "^1.2.2", - "sshpk": "^1.7.0" - } - }, - "image-size": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/image-size/-/image-size-0.5.5.tgz", - "integrity": "sha1-Cd/Uq50g4p6xw+gLiZA3jfnjy5w=", - "dev": true, - "optional": true - }, - "is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", - "dev": true, - "optional": true - }, - "isstream": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", - "dev": true, - "optional": true - }, - "jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", - "dev": true, - "optional": true - }, - "json-schema": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", - "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", - "dev": true, - "optional": true - }, - "json-stable-stringify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz", - "integrity": "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=", - "dev": true, - "optional": true, - "requires": { - "jsonify": "~0.0.0" - } - }, - "json-stringify-safe": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", - "dev": true, - "optional": true - }, - "jsonify": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", - "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=", - "dev": true, - "optional": true - }, - "jsprim": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", - "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", - "dev": true, - "optional": true, - "requires": { - "assert-plus": "1.0.0", - "extsprintf": "1.3.0", - "json-schema": "0.2.3", - "verror": "1.10.0" - }, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", - "dev": true, - "optional": true - } - } - }, - "less": { - "version": "2.7.3", - "resolved": "https://registry.npmjs.org/less/-/less-2.7.3.tgz", - "integrity": "sha512-KPdIJKWcEAb02TuJtaLrhue0krtRLoRoo7x6BNJIBelO00t/CCdJQUnHW5V34OnHMWzIktSalJxRO+FvytQlCQ==", - "dev": true, - "requires": { - "errno": "^0.1.1", - "graceful-fs": "^4.1.2", - "image-size": "~0.5.0", - "mime": "^1.2.11", - "mkdirp": "^0.5.0", - "promise": "^7.1.1", - "request": "2.81.0", - "source-map": "^0.5.3" - } - }, - "mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", - "dev": true, - "optional": true - }, - "mime-db": { - "version": "1.33.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.33.0.tgz", - "integrity": "sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ==", - "dev": true, - "optional": true - }, - "mime-types": { - "version": "2.1.18", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.18.tgz", - "integrity": "sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ==", - "dev": true, - "optional": true, - "requires": { - "mime-db": "~1.33.0" - } - }, - "minimist": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", - "dev": true, - "optional": true - }, - "mkdirp": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", - "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", - "dev": true, - "optional": true, - "requires": { - "minimist": "0.0.8" - } - }, - "oauth-sign": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz", - "integrity": "sha1-Rqarfwrq2N6unsBWV4C31O/rnUM=", - "dev": true, - "optional": true - }, - "performance-now": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-0.2.0.tgz", - "integrity": "sha1-M+8wxcd9TqIcWlOGnZG1bY8lVeU=", - "dev": true, - "optional": true - }, - "promise": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", - "integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==", - "dev": true, - "optional": true, - "requires": { - "asap": "~2.0.3" - } - }, - "prr": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", - "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=", - "dev": true, - "optional": true - }, - "punycode": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", - "dev": true, - "optional": true - }, - "qs": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.4.0.tgz", - "integrity": "sha1-E+JtKK1rD/qpExLNO/cI7TUecjM=", - "dev": true, - "optional": true - }, - "request": { - "version": "2.81.0", - "resolved": "https://registry.npmjs.org/request/-/request-2.81.0.tgz", - "integrity": "sha1-xpKJRqDgbF+Nb4qTM0af/aRimKA=", - "dev": true, - "optional": true, - "requires": { - "aws-sign2": "~0.6.0", - "aws4": "^1.2.1", - "caseless": "~0.12.0", - "combined-stream": "~1.0.5", - "extend": "~3.0.0", - "forever-agent": "~0.6.1", - "form-data": "~2.1.1", - "har-validator": "~4.2.1", - "hawk": "~3.1.3", - "http-signature": "~1.1.0", - "is-typedarray": "~1.0.0", - "isstream": "~0.1.2", - "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.7", - "oauth-sign": "~0.8.1", - "performance-now": "^0.2.0", - "qs": "~6.4.0", - "safe-buffer": "^5.0.1", - "stringstream": "~0.0.4", - "tough-cookie": "~2.3.0", - "tunnel-agent": "^0.6.0", - "uuid": "^3.0.0" - } - }, - "sntp": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/sntp/-/sntp-1.0.9.tgz", - "integrity": "sha1-ZUEYTMkK7qbG57NeJlkIJEPGYZg=", - "dev": true, - "optional": true, - "requires": { - "hoek": "2.x.x" - } - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true, - "optional": true - }, - "sshpk": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.13.1.tgz", - "integrity": "sha1-US322mKHFEMW3EwY/hzx2UBzm+M=", - "dev": true, - "optional": true, - "requires": { - "asn1": "~0.2.3", - "assert-plus": "^1.0.0", - "bcrypt-pbkdf": "^1.0.0", - "dashdash": "^1.12.0", - "ecc-jsbn": "~0.1.1", - "getpass": "^0.1.1", - "jsbn": "~0.1.0", - "tweetnacl": "~0.14.0" - }, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", - "dev": true, - "optional": true - } - } - }, - "stringstream": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.5.tgz", - "integrity": "sha1-TkhM1N5aC7vuGORjB3EKioFiGHg=", - "dev": true, - "optional": true - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - } - }, - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true - }, - "tough-cookie": { - "version": "2.3.4", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.4.tgz", - "integrity": "sha512-TZ6TTfI5NtZnuyy/Kecv+CnoROnyXn2DN97LontgQpCwsX2XyLYCC0ENhYkehSOwAp8rTQKc/NUIF7BkQ5rKLA==", - "dev": true, - "optional": true, - "requires": { - "punycode": "^1.4.1" - } - }, - "tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "requires": { + "cli": "~1.0.0", + "console-browserify": "1.1.x", + "exit": "0.1.x", + "htmlparser2": "3.8.x", + "lodash": "3.7.x", + "minimatch": "~3.0.2", + "shelljs": "0.3.x", + "strip-json-comments": "1.0.x" + }, + "dependencies": { + "cli": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cli/-/cli-1.0.1.tgz", + "integrity": "sha512-41U72MB56TfUMGndAKK8vJ78eooOD4Z5NOL4xEfjc0c23s+6EYKXlXsmACBVclLP1yOfWCgEganVzddVrSNoTg==", "dev": true, - "optional": true, "requires": { - "safe-buffer": "^5.0.1" + "exit": "0.1.2", + "glob": "^7.1.1" } }, - "tweetnacl": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", - "dev": true, - "optional": true - }, - "uuid": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.2.1.tgz", - "integrity": "sha512-jZnMwlb9Iku/O3smGWvZhauCf6cvvpKi4BKRiliS3cxnI+Gz9j5MEpTz2UFuXiKPJocb7gnsLHwiS05ige5BEA==", - "dev": true, - "optional": true + "lodash": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-3.7.0.tgz", + "integrity": "sha512-73GDDlioRJOCHV8N9gnBEpjdWI34+e9AvMnS4qdqdMfl8/yH/dJP1tfuqUFccZ/deZQlHuJiRSuKXjKIfDwBOg==", + "dev": true }, - "verror": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", - "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", - "dev": true, - "optional": true, - "requires": { - "assert-plus": "^1.0.0", - "core-util-is": "1.0.2", - "extsprintf": "^1.2.0" - }, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", - "dev": true, - "optional": true - } - } + "strip-json-comments": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-1.0.4.tgz", + "integrity": "sha512-AOPG8EBc5wAikaG1/7uFCNFJwnKOuQwFTpYBdTW6OvWHeZBQBrAA/amefHGrEiOnCPcLFZK6FUPtWVKpQVIRgg==", + "dev": true } } }, - "grunt-contrib-uglify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/grunt-contrib-uglify/-/grunt-contrib-uglify-2.3.0.tgz", - "integrity": "sha1-s9AmDr3WzvoS/y+Onh4ln33kIW8=", + "jshint-stylish": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/jshint-stylish/-/jshint-stylish-2.2.1.tgz", + "integrity": "sha512-7ySPIM1/gONcJ1isbd1IPKuBzQ/iDTvofILFSsIaMrWZUO7OJkV9kdU0O6O1pxM+bNj/9mbJ31LyXgQgOhIa0A==", "dev": true, "requires": { + "beeper": "^1.1.0", "chalk": "^1.0.0", - "maxmin": "^1.1.0", - "object.assign": "^4.0.4", - "uglify-js": "~2.8.21", - "uri-path": "^1.0.0" + "log-symbols": "^1.0.0", + "plur": "^2.1.0", + "string-length": "^1.0.0", + "text-table": "^0.2.0" }, "dependencies": { - "align-text": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz", - "integrity": "sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=", - "dev": true, - "requires": { - "kind-of": "^3.0.2", - "longest": "^1.0.1", - "repeat-string": "^1.5.2" - } - }, - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true - }, "ansi-styles": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "dev": true - }, - "array-find-index": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz", - "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=", + "integrity": "sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==", "dev": true }, - "browserify-zlib": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.1.4.tgz", - "integrity": "sha1-uzX4pRn2AOD6a4SFJByXnQFB+y0=", - "dev": true, - "requires": { - "pako": "~0.2.0" - } - }, - "builtin-modules": { + "beeper": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", - "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", - "dev": true - }, - "camelcase": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", - "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=", + "resolved": "https://registry.npmjs.org/beeper/-/beeper-1.1.1.tgz", + "integrity": "sha512-3vqtKL1N45I5dV0RdssXZG7X6pCqQrWPNOlBPZPrd+QkE2HEhR57Z04m0KtpbsZH73j+a3F8UD1TQnn+ExTvIA==", "dev": true }, - "camelcase-keys": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz", - "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=", - "dev": true, - "requires": { - "camelcase": "^2.0.0", - "map-obj": "^1.0.0" - } - }, - "center-align": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz", - "integrity": "sha1-qg0yYptu6XIgBBHL1EYckHvCt60=", - "dev": true, - "requires": { - "align-text": "^0.1.3", - "lazy-cache": "^1.0.3" - } - }, "chalk": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "integrity": "sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==", "dev": true, "requires": { "ansi-styles": "^2.2.1", "escape-string-regexp": "^1.0.2", "has-ansi": "^2.0.0", "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - } - }, - "cliui": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz", - "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=", - "dev": true, - "requires": { - "center-align": "^0.1.1", - "right-align": "^0.1.1", - "wordwrap": "0.0.2" - } - }, - "concat-stream": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.0.tgz", - "integrity": "sha1-CqxmL9Ur54lk1VMvaUeE5wEQrPc=", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "readable-stream": "^2.2.2", - "typedarray": "^0.0.6" - } - }, - "core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", - "dev": true - }, - "currently-unhandled": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", - "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=", - "dev": true, - "requires": { - "array-find-index": "^1.0.1" - } - }, - "decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", - "dev": true - }, - "define-properties": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.2.tgz", - "integrity": "sha1-g6c/L+pWmJj7c3GTyPhzyvbUXJQ=", - "dev": true, - "requires": { - "foreach": "^2.0.5", - "object-keys": "^1.0.8" - } - }, - "error-ex": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.1.tgz", - "integrity": "sha1-+FWobOYa3E6GIcPNoh56dhLDqNw=", - "dev": true, - "requires": { - "is-arrayish": "^0.2.1" - } - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", - "dev": true - }, - "figures": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz", - "integrity": "sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=", - "dev": true, - "requires": { - "escape-string-regexp": "^1.0.5", - "object-assign": "^4.1.0" - } - }, - "find-up": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", - "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", - "dev": true, - "requires": { - "path-exists": "^2.0.0", - "pinkie-promise": "^2.0.0" - } - }, - "foreach": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/foreach/-/foreach-2.0.5.tgz", - "integrity": "sha1-C+4AUBiusmDQo6865ljdATbsG5k=", - "dev": true - }, - "get-stdin": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", - "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=", - "dev": true - }, - "graceful-fs": { - "version": "4.1.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", - "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", - "dev": true - }, - "gzip-size": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-1.0.0.tgz", - "integrity": "sha1-Zs+LEBBHInuVus5uodoMF37Vwi8=", - "dev": true, - "requires": { - "browserify-zlib": "^0.1.4", - "concat-stream": "^1.4.1" - } - }, - "has-ansi": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", - "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - } - }, - "hosted-git-info": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.5.0.tgz", - "integrity": "sha512-pNgbURSuab90KbTqvRPsseaTxOJCZBD0a7t+haSN33piP9cCM4l0CqdzAif2hUqm716UovKB2ROmiabGAKVXyg==", - "dev": true - }, - "indent-string": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz", - "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=", - "dev": true, - "requires": { - "repeating": "^2.0.0" - } - }, - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", - "dev": true - }, - "is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", - "dev": true - }, - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", - "dev": true - }, - "is-builtin-module": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz", - "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=", - "dev": true, - "requires": { - "builtin-modules": "^1.0.0" - } - }, - "is-finite": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz", - "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=", - "dev": true, - "requires": { - "number-is-nan": "^1.0.0" - } - }, - "is-utf8": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", - "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=", - "dev": true - }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - }, - "lazy-cache": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz", - "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=", - "dev": true - }, - "load-json-file": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", - "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "parse-json": "^2.2.0", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0", - "strip-bom": "^2.0.0" - } - }, - "longest": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz", - "integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc=", - "dev": true - }, - "loud-rejection": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz", - "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=", - "dev": true, - "requires": { - "currently-unhandled": "^0.4.1", - "signal-exit": "^3.0.0" - } - }, - "map-obj": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", - "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=", - "dev": true - }, - "maxmin": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/maxmin/-/maxmin-1.1.0.tgz", - "integrity": "sha1-cTZehKmd2Piz99X94vANHn9zvmE=", - "dev": true, - "requires": { - "chalk": "^1.0.0", - "figures": "^1.0.1", - "gzip-size": "^1.0.0", - "pretty-bytes": "^1.0.0" - } - }, - "meow": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz", - "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=", - "dev": true, - "requires": { - "camelcase-keys": "^2.0.0", - "decamelize": "^1.1.2", - "loud-rejection": "^1.0.0", - "map-obj": "^1.0.1", - "minimist": "^1.1.3", - "normalize-package-data": "^2.3.4", - "object-assign": "^4.0.1", - "read-pkg-up": "^1.0.1", - "redent": "^1.0.0", - "trim-newlines": "^1.0.0" - } - }, - "normalize-package-data": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz", - "integrity": "sha512-9jjUFbTPfEy3R/ad/2oNbKtW9Hgovl5O1FvFWKkKblNXoN/Oou6+9+KKohPK13Yc3/TyunyWhJp6gvRNR/PPAw==", - "dev": true, - "requires": { - "hosted-git-info": "^2.1.4", - "is-builtin-module": "^1.0.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - } - }, - "number-is-nan": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", - "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", - "dev": true - }, - "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", - "dev": true - }, - "object-keys": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.0.11.tgz", - "integrity": "sha1-xUYBd4rVYPEULODgG8yotW0TQm0=", - "dev": true - }, - "object.assign": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", - "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", - "dev": true, - "requires": { - "define-properties": "^1.1.2", - "function-bind": "^1.1.1", - "has-symbols": "^1.0.0", - "object-keys": "^1.0.11" - } - }, - "pako": { - "version": "0.2.9", - "resolved": "https://registry.npmjs.org/pako/-/pako-0.2.9.tgz", - "integrity": "sha1-8/dSL073gjSNqBYbrZ7P1Rv4OnU=", - "dev": true - }, - "parse-json": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", - "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", - "dev": true, - "requires": { - "error-ex": "^1.2.0" - } - }, - "path-exists": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", - "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", - "dev": true, - "requires": { - "pinkie-promise": "^2.0.0" - } - }, - "path-type": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", - "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0" - } - }, - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true - }, - "pinkie": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", - "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", - "dev": true - }, - "pinkie-promise": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", - "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", - "dev": true, - "requires": { - "pinkie": "^2.0.0" - } - }, - "pretty-bytes": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-1.0.4.tgz", - "integrity": "sha1-CiLoIQYJrTVUL4yNXSFZr/B1HIQ=", - "dev": true, - "requires": { - "get-stdin": "^4.0.1", - "meow": "^3.1.0" + "supports-color": "^2.0.0" } }, - "process-nextick-args": { + "supports-color": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", - "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==", "dev": true - }, - "read-pkg": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", - "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", + } + } + }, + "json-schema": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", + "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==", + "dev": true, + "optional": true + }, + "json-stable-stringify": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.1.1.tgz", + "integrity": "sha512-SU/971Kt5qVQfJpyDveVhQ/vya+5hvrjClFOcr8c0Fq5aODJjMwutrOfCU+eCnVD5gpx1Q3fEqkyom77zH1iIg==", + "dev": true, + "optional": true, + "requires": { + "call-bind": "^1.0.5", + "isarray": "^2.0.5", + "jsonify": "^0.0.1", + "object-keys": "^1.1.1" + }, + "dependencies": { + "isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", "dev": true, - "requires": { - "load-json-file": "^1.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^1.0.0" - } - }, - "read-pkg-up": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", - "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", + "optional": true + } + } + }, + "json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true + }, + "json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", + "dev": true, + "optional": true + }, + "jsonify": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.1.tgz", + "integrity": "sha512-2/Ki0GcmuqSrgFyelQq9M05y7PS0mEwuIzrf3f1fPqkVDVRvZrPZtVSMHxdgo8Aq0sxAOb/cr2aqqA3LeWHVPg==", + "dev": true, + "optional": true + }, + "jsprim": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz", + "integrity": "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==", + "dev": true, + "optional": true, + "requires": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.4.0", + "verror": "1.10.0" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==", "dev": true, - "requires": { - "find-up": "^1.0.0", - "read-pkg": "^1.0.0" - } - }, + "optional": true + } + } + }, + "kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true + }, + "lazy-cache": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz", + "integrity": "sha512-RE2g0b5VGZsOCFOCgP7omTRYFqydmZkBwl5oNnQ1lDYC57uyO9KqNnNVxT7COSHTxrRCWVcAVOcbjk+tvh/rgQ==", + "dev": true + }, + "lazy-req": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/lazy-req/-/lazy-req-1.1.0.tgz", + "integrity": "sha512-Vn/JuGaYykbelAVNAhfVJxuwHQCOSNE6mqMtD+gnd+QORlAHwWVmVFqQga3yWt84G5vAwEwpT6sAsZ+tgJ88/Q==", + "dev": true, + "optional": true + }, + "lazystream": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.1.tgz", + "integrity": "sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==", + "dev": true, + "requires": { + "readable-stream": "^2.0.5" + }, + "dependencies": { "readable-stream": { - "version": "2.3.4", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.4.tgz", - "integrity": "sha512-vuYxeWYM+fde14+rajzqgeohAI7YoJcHE7kXDAc4Nk0EbuKnJfqtY9YtRkLo/tqkuF7MsBQRhPnPeyjYITp3ZQ==", + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", "dev": true, "requires": { "core-util-is": "~1.0.0", @@ -14723,1094 +4523,1596 @@ "isarray": "~1.0.0", "process-nextick-args": "~2.0.0", "safe-buffer": "~5.1.1", - "string_decoder": "~1.0.3", + "string_decoder": "~1.1.1", "util-deprecate": "~1.0.1" } }, - "redent": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz", - "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=", - "dev": true, - "requires": { - "indent-string": "^2.1.0", - "strip-indent": "^1.0.1" - } - }, - "repeat-string": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", - "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", "dev": true }, - "repeating": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", - "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "dev": true, "requires": { - "is-finite": "^1.0.0" + "safe-buffer": "~5.1.0" } + } + } + }, + "less": { + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/less/-/less-2.7.3.tgz", + "integrity": "sha512-KPdIJKWcEAb02TuJtaLrhue0krtRLoRoo7x6BNJIBelO00t/CCdJQUnHW5V34OnHMWzIktSalJxRO+FvytQlCQ==", + "dev": true, + "requires": { + "errno": "^0.1.1", + "graceful-fs": "^4.1.2", + "image-size": "~0.5.0", + "mime": "^1.2.11", + "mkdirp": "^0.5.0", + "promise": "^7.1.1", + "request": "2.81.0", + "source-map": "^0.5.3" + }, + "dependencies": { + "minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true, + "optional": true }, - "right-align": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz", - "integrity": "sha1-YTObci/mo1FWiSENJOFMlhSGE+8=", + "mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", "dev": true, + "optional": true, "requires": { - "align-text": "^0.1.1" + "minimist": "^1.2.6" } }, - "safe-buffer": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", - "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==", - "dev": true - }, - "semver": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz", - "integrity": "sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA==", - "dev": true - }, - "signal-exit": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", - "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", - "dev": true - }, "source-map": { "version": "0.5.7", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - }, - "spdx-correct": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-2.0.4.tgz", - "integrity": "sha512-c+4gPpt9YDhz7cHlz5UrsHzxxRi4ksclxnEEKsuGT9JdwSC+ZNmsGbYRzzgxyZaBYpcWnlu+4lPcdLKx4DOCmA==", + "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", "dev": true, - "requires": { - "spdx-expression-parse": "^2.0.1", - "spdx-license-ids": "^2.0.1" - }, - "dependencies": { - "spdx-expression-parse": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-2.0.2.tgz", - "integrity": "sha512-oFxOkWCfFS0ltNp0H66gXlU4NF6bxg7RkoTYR0413t+yTY9zyj+AIWsjtN8dcVp6703ijDYBWBIARlJ7DkyP9Q==", - "dev": true, - "requires": { - "spdx-exceptions": "^2.0.0", - "spdx-license-ids": "^2.0.1" - } - } - } - }, - "spdx-expression-parse": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz", - "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==", + "optional": true + } + } + }, + "liftup": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/liftup/-/liftup-3.0.1.tgz", + "integrity": "sha512-yRHaiQDizWSzoXk3APcA71eOI/UuhEkNN9DiW2Tt44mhYzX4joFoCZlxsSOF7RyeLlfqzFLQI1ngFq3ggMPhOw==", + "dev": true, + "requires": { + "extend": "^3.0.2", + "findup-sync": "^4.0.0", + "fined": "^1.2.0", + "flagged-respawn": "^1.0.1", + "is-plain-object": "^2.0.4", + "object.map": "^1.0.1", + "rechoir": "^0.7.0", + "resolve": "^1.19.0" + }, + "dependencies": { + "findup-sync": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-4.0.0.tgz", + "integrity": "sha512-6jvvn/12IC4quLBL1KNokxC7wWTvYncaVUYSoxWw7YykPLuRrnv4qdHcSOywOI5RpkOVGeQRtWM8/q+G6W6qfQ==", "dev": true, "requires": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - }, - "dependencies": { - "spdx-license-ids": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.0.tgz", - "integrity": "sha512-2+EPwgbnmOIl8HjGBXXMd9NAu02vLjOO1nWw4kmeRDFyHn+M/ETfHxQUK0oXg8ctgVnl9t3rosNVsZ1jG61nDA==", - "dev": true - } + "detect-file": "^1.0.0", + "is-glob": "^4.0.0", + "micromatch": "^4.0.2", + "resolve-dir": "^1.0.1" } - }, - "spdx-license-ids": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-2.0.1.tgz", - "integrity": "sha1-AgF7zDU07k/+9tWNIOfT6aHDyOw=", + } + } + }, + "livereload-js": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/livereload-js/-/livereload-js-2.4.0.tgz", + "integrity": "sha512-XPQH8Z2GDP/Hwz2PCDrh2mth4yFejwA1OZ/81Ti3LgKyhDcEjsSsqFWZojHG0va/duGd+WyosY7eXLDoOyqcPw==", + "dev": true + }, + "load-json-file": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", + "integrity": "sha512-cy7ZdNRXdablkXYNI049pthVeXFurRyb9+hA/dZzerZ0pGTx42z+y+ssxBaVV2l70t1muq5IdKhn4UtcoGUY9A==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0", + "strip-bom": "^2.0.0" + } + }, + "lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "dev": true + }, + "lodash._basecopy": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz", + "integrity": "sha512-rFR6Vpm4HeCK1WPGvjZSJ+7yik8d8PVUdCJx5rT2pogG4Ve/2ZS7kfmO5l5T2o5V2mqlNIfSF5MZlr1+xOoYQQ==", + "dev": true, + "optional": true + }, + "lodash._basetostring": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/lodash._basetostring/-/lodash._basetostring-3.0.1.tgz", + "integrity": "sha512-mTzAr1aNAv/i7W43vOR/uD/aJ4ngbtsRaCubp2BfZhlGU/eORUjg/7F6X0orNMdv33JOrdgGybtvMN/po3EWrA==", + "dev": true, + "optional": true + }, + "lodash._basevalues": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lodash._basevalues/-/lodash._basevalues-3.0.0.tgz", + "integrity": "sha512-H94wl5P13uEqlCg7OcNNhMQ8KvWSIyqXzOPusRgHC9DK3o54P6P3xtbXlVbRABG4q5gSmp7EDdJ0MSuW9HX6Mg==", + "dev": true, + "optional": true + }, + "lodash._getnative": { + "version": "3.9.1", + "resolved": "https://registry.npmjs.org/lodash._getnative/-/lodash._getnative-3.9.1.tgz", + "integrity": "sha512-RrL9VxMEPyDMHOd9uFbvMe8X55X16/cGM5IgOKgRElQZutpX89iS6vwl64duTV1/16w5JY7tuFNXqoekmh1EmA==", + "dev": true, + "optional": true + }, + "lodash._isiterateecall": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz", + "integrity": "sha512-De+ZbrMu6eThFti/CSzhRvTKMgQToLxbij58LMfM8JnYDNSOjkjTCIaa8ixglOeGh2nyPlakbt5bJWJ7gvpYlQ==", + "dev": true, + "optional": true + }, + "lodash._reescape": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lodash._reescape/-/lodash._reescape-3.0.0.tgz", + "integrity": "sha512-Sjlavm5y+FUVIF3vF3B75GyXrzsfYV8Dlv3L4mEpuB9leg8N6yf/7rU06iLPx9fY0Mv3khVp9p7Dx0mGV6V5OQ==", + "dev": true, + "optional": true + }, + "lodash._reevaluate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lodash._reevaluate/-/lodash._reevaluate-3.0.0.tgz", + "integrity": "sha512-OrPwdDc65iJiBeUe5n/LIjd7Viy99bKwDdk7Z5ljfZg0uFRFlfQaCy9tZ4YMAag9WAZmlVpe1iZrkIMMSMHD3w==", + "dev": true, + "optional": true + }, + "lodash._reinterpolate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz", + "integrity": "sha512-xYHt68QRoYGjeeM/XOE1uJtvXQAgvszfBhjV4yvsQH0u2i9I6cI6c6/eG4Hh3UAOVn0y/xAXwmTzEay49Q//HA==", + "dev": true, + "optional": true + }, + "lodash._root": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/lodash._root/-/lodash._root-3.0.1.tgz", + "integrity": "sha512-O0pWuFSK6x4EXhM1dhZ8gchNtG7JMqBtrHdoUFUWXD7dJnNSUze1GuyQr5sOs0aCvgGeI3o/OJW8f4ca7FDxmQ==", + "dev": true, + "optional": true + }, + "lodash.escape": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/lodash.escape/-/lodash.escape-3.2.0.tgz", + "integrity": "sha512-n1PZMXgaaDWZDSvuNZ/8XOcYO2hOKDqZel5adtR30VKQAtoWs/5AOeFA0vPV8moiPzlqe7F4cP2tzpFewQyelQ==", + "dev": true, + "optional": true, + "requires": { + "lodash._root": "^3.0.0" + } + }, + "lodash.isarguments": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz", + "integrity": "sha512-chi4NHZlZqZD18a0imDHnZPrDeBbTtVN7GXMwuGdRH9qotxAjYs3aVLKc7zNOG9eddR5Ksd8rvFEBc9SsggPpg==", + "dev": true, + "optional": true + }, + "lodash.isarray": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/lodash.isarray/-/lodash.isarray-3.0.4.tgz", + "integrity": "sha512-JwObCrNJuT0Nnbuecmqr5DgtuBppuCvGD9lxjFpAzwnVtdGoDQ1zig+5W8k5/6Gcn0gZ3936HDAlGd28i7sOGQ==", + "dev": true, + "optional": true + }, + "lodash.isequal": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", + "integrity": "sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==", + "dev": true + }, + "lodash.keys": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-3.1.2.tgz", + "integrity": "sha512-CuBsapFjcubOGMn3VD+24HOAPxM79tH+V6ivJL3CHYjtrawauDJHUk//Yew9Hvc6e9rbCrURGk8z6PC+8WJBfQ==", + "dev": true, + "optional": true, + "requires": { + "lodash._getnative": "^3.0.0", + "lodash.isarguments": "^3.0.0", + "lodash.isarray": "^3.0.0" + } + }, + "lodash.restparam": { + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/lodash.restparam/-/lodash.restparam-3.6.1.tgz", + "integrity": "sha512-L4/arjjuq4noiUJpt3yS6KIKDtJwNe2fIYgMqyYYKoeIfV1iEqvPwhCx23o+R9dzouGihDAPN1dTIRWa7zk8tw==", + "dev": true, + "optional": true + }, + "lodash.template": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-3.6.2.tgz", + "integrity": "sha512-0B4Y53I0OgHUJkt+7RmlDFWKjVAI/YUpWNiL9GQz5ORDr4ttgfQGo+phBWKFLJbBdtOwgMuUkdOHOnPg45jKmQ==", + "dev": true, + "optional": true, + "requires": { + "lodash._basecopy": "^3.0.0", + "lodash._basetostring": "^3.0.0", + "lodash._basevalues": "^3.0.0", + "lodash._isiterateecall": "^3.0.0", + "lodash._reinterpolate": "^3.0.0", + "lodash.escape": "^3.0.0", + "lodash.keys": "^3.0.0", + "lodash.restparam": "^3.0.0", + "lodash.templatesettings": "^3.0.0" + } + }, + "lodash.templatesettings": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-3.1.1.tgz", + "integrity": "sha512-TcrlEr31tDYnWkHFWDCV3dHYroKEXpJZ2YJYvJdhN+y4AkWMDZ5I4I8XDtUKqSAyG81N7w+I1mFEJtcED+tGqQ==", + "dev": true, + "optional": true, + "requires": { + "lodash._reinterpolate": "^3.0.0", + "lodash.escape": "^3.0.0" + } + }, + "log-symbols": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-1.0.2.tgz", + "integrity": "sha512-mmPrW0Fh2fxOzdBbFv4g1m6pR72haFLPJ2G5SJEELf1y+iaQrDG6cWCPjy54RHYbZAt7X+ls690Kw62AdWXBzQ==", + "dev": true, + "requires": { + "chalk": "^1.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==", "dev": true }, - "string_decoder": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", - "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - } - }, - "strip-bom": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", - "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", - "dev": true, - "requires": { - "is-utf8": "^0.2.0" - } - }, - "strip-indent": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz", - "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=", + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==", "dev": true, "requires": { - "get-stdin": "^4.0.1" + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" } }, "supports-color": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true - }, - "trim-newlines": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz", - "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=", - "dev": true - }, - "typedarray": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", - "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", - "dev": true - }, - "uglify-js": { - "version": "2.8.29", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.29.tgz", - "integrity": "sha1-KcVzMUgFe7Th913zW3qcty5qWd0=", - "dev": true, - "requires": { - "source-map": "~0.5.1", - "uglify-to-browserify": "~1.0.0", - "yargs": "~3.10.0" - } - }, - "uglify-to-browserify": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz", - "integrity": "sha1-bgkk1r2mta/jSeOabWMoUKD4grc=", - "dev": true, - "optional": true - }, - "uri-path": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/uri-path/-/uri-path-1.0.0.tgz", - "integrity": "sha1-l0fwGDWJM8Md4PzP2C0TjmcmLjI=", - "dev": true - }, - "util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", - "dev": true - }, - "validate-npm-package-license": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.2.tgz", - "integrity": "sha512-8zlGw3EZDpC7iUDKy4yHCSqFwkBTeAK4h1QqDC3ST6rT7dzvu2ZuclExZN7zuXNEhQ3+2UBQgdca5eNNL06sBg==", - "dev": true, - "requires": { - "spdx-correct": "^2.0.4", - "spdx-expression-parse": "^3.0.0" - } - }, - "window-size": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz", - "integrity": "sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0=", - "dev": true - }, - "wordwrap": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz", - "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=", + "integrity": "sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==", "dev": true - }, - "yargs": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz", - "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=", - "dev": true, - "requires": { - "camelcase": "^1.0.2", - "cliui": "^2.1.0", - "decamelize": "^1.0.0", - "window-size": "0.1.0" - }, - "dependencies": { - "camelcase": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", - "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=", - "dev": true - } - } } } }, - "grunt-contrib-watch": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/grunt-contrib-watch/-/grunt-contrib-watch-1.0.0.tgz", - "integrity": "sha1-hKGnodar0m7VaEE0lscxM+mQAY8=", + "logalot": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/logalot/-/logalot-2.1.0.tgz", + "integrity": "sha512-Ah4CgdSRfeCJagxQhcVNMi9BfGYyEKLa6d7OA6xSbld/Hg3Cf2QiOa1mDpmG7Ve8LOH6DN3mdttzjQAvWTyVkw==", "dev": true, + "optional": true, "requires": { - "async": "^1.5.0", - "gaze": "^1.0.0", - "lodash": "^3.10.1", - "tiny-lr": "^0.2.1" - }, - "dependencies": { - "async": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", - "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", - "dev": true - }, - "balanced-match": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", - "dev": true - }, - "body-parser": { - "version": "1.14.2", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.14.2.tgz", - "integrity": "sha1-EBXLH+LEQ4WCWVgdtTMy+NDPUPk=", - "dev": true, - "requires": { - "bytes": "2.2.0", - "content-type": "~1.0.1", - "debug": "~2.2.0", - "depd": "~1.1.0", - "http-errors": "~1.3.1", - "iconv-lite": "0.4.13", - "on-finished": "~2.3.0", - "qs": "5.2.0", - "raw-body": "~2.1.5", - "type-is": "~1.6.10" - }, - "dependencies": { - "qs": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-5.2.0.tgz", - "integrity": "sha1-qfMRQq9GjLcrJbMBNrokVoNJFr4=", - "dev": true - } - } - }, - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "bytes": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-2.2.0.tgz", - "integrity": "sha1-/TVGSkA/b5EXwt42Cez/nK4ABYg=", - "dev": true - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", - "dev": true - }, - "content-type": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", - "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==", - "dev": true - }, - "debug": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", - "integrity": "sha1-+HBX6ZWxofauaklgZkE3vFbwOdo=", - "dev": true, - "requires": { - "ms": "0.7.1" - } - }, - "depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", - "dev": true - }, - "ee-first": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=", - "dev": true - }, - "faye-websocket": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.10.0.tgz", - "integrity": "sha1-TkkvjQTftviQA1B/btvy1QHnxvQ=", - "dev": true, - "requires": { - "websocket-driver": ">=0.5.1" - } - }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", - "dev": true - }, - "gaze": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/gaze/-/gaze-1.1.2.tgz", - "integrity": "sha1-hHIkZ3rbiHDWeSV+0ziP22HkAQU=", - "dev": true, - "requires": { - "globule": "^1.0.0" - } - }, - "glob": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", - "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "globule": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/globule/-/globule-1.2.0.tgz", - "integrity": "sha1-HcScaCLdnoovoAuiopUAboZkvQk=", - "dev": true, - "requires": { - "glob": "~7.1.1", - "lodash": "~4.17.4", - "minimatch": "~3.0.2" - }, - "dependencies": { - "lodash": { - "version": "4.17.5", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.5.tgz", - "integrity": "sha512-svL3uiZf1RwhH+cWrfZn3A4+U58wbP0tGVTLQPbjplZxZ8ROD9VLuNgsRniTlLe7OlSqR79RUehXgpBW/s0IQw==", - "dev": true - } - } + "figures": "^1.3.5", + "squeak": "^1.0.0" + } + }, + "longest": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz", + "integrity": "sha512-k+yt5n3l48JU4k8ftnKG6V7u32wyH2NfKzeMto9F/QRE0amxy/LayxwlvjjkZEIzqR+19IrtFO8p5kB9QaYUFg==", + "dev": true + }, + "loud-rejection": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz", + "integrity": "sha512-RPNliZOFkqFumDhvYqOaNY4Uz9oJM2K9tC6JWsJJsNdhuONW4LQHRBpb0qf4pJApVffI5N39SwzWZJuEhfd7eQ==", + "dev": true, + "requires": { + "currently-unhandled": "^0.4.1", + "signal-exit": "^3.0.0" + } + }, + "lowercase-keys": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", + "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==", + "dev": true, + "optional": true + }, + "lpad-align": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/lpad-align/-/lpad-align-1.1.2.tgz", + "integrity": "sha512-MMIcFmmR9zlGZtBcFOows6c2COMekHCIFJz3ew/rRpKZ1wR4mXDPzvcVqLarux8M33X4TPSq2Jdw8WJj0q0KbQ==", + "dev": true, + "optional": true, + "requires": { + "get-stdin": "^4.0.1", + "indent-string": "^2.1.0", + "longest": "^1.0.0", + "meow": "^3.3.0" + } + }, + "lru-cache": { + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.7.3.tgz", + "integrity": "sha512-WpibWJ60c3AgAz8a2iYErDrcT2C7OmKnsWhIcHOjkUHFjkXncJhtLxNSqUmxRxRunpb5I8Vprd7aNSd2NtksJQ==", + "dev": true + }, + "make-iterator": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/make-iterator/-/make-iterator-1.0.1.tgz", + "integrity": "sha512-pxiuXh0iVEq7VM7KMIhs5gxsfxCux2URptUQaXo4iZZJxBAzTPOLE2BumO5dbfVYq/hBJFBR/a1mFDmOx5AGmw==", + "dev": true, + "requires": { + "kind-of": "^6.0.2" + } + }, + "map-cache": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", + "integrity": "sha512-8y/eV9QQZCiyn1SprXSrCmqJN0yNRATe+PO8ztwqrvrbdRLA3eYJF0yaR0YayLWkMbsQSKWS9N2gPcGEc4UsZg==", + "dev": true + }, + "map-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", + "integrity": "sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==", + "dev": true + }, + "math-random": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/math-random/-/math-random-1.0.4.tgz", + "integrity": "sha512-rUxjysqif/BZQH2yhd5Aaq7vXMSx9NdEsQcyA07uEzIvxgI7zIr33gGsh+RU0/XjmQpCW7RsVof1vlkvQVCK5A==", + "dev": true + }, + "maxmin": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/maxmin/-/maxmin-1.1.0.tgz", + "integrity": "sha512-jypoV6wTPuz/ngkc2sDZnFvpvx14QICNKS/jK9RbkmiQQJZ4JWstIszA8iT/z9tPSF/vXQ5qtG0h65N9tiLIKA==", + "dev": true, + "requires": { + "chalk": "^1.0.0", + "figures": "^1.0.1", + "gzip-size": "^1.0.0", + "pretty-bytes": "^1.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==", + "dev": true }, - "http-errors": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.3.1.tgz", - "integrity": "sha1-GX4izevUGYWF6GlO9nhhl7ke2UI=", + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==", "dev": true, "requires": { - "inherits": "~2.0.1", - "statuses": "1" + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" } }, - "iconv-lite": { - "version": "0.4.13", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.13.tgz", - "integrity": "sha1-H4irpKsLFQjoMSrMOTRfNumS4vI=", + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==", "dev": true - }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + } + } + }, + "media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "dev": true + }, + "meow": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz", + "integrity": "sha512-TNdwZs0skRlpPpCUK25StC4VH+tP5GgeY1HQOOGP+lQ2xtdkN2VtT/5tiX9k3IWpkBPV9b3LsAWXn4GGi/PrSA==", + "dev": true, + "requires": { + "camelcase-keys": "^2.0.0", + "decamelize": "^1.1.2", + "loud-rejection": "^1.0.0", + "map-obj": "^1.0.1", + "minimist": "^1.1.3", + "normalize-package-data": "^2.3.4", + "object-assign": "^4.0.1", + "read-pkg-up": "^1.0.1", + "redent": "^1.0.0", + "trim-newlines": "^1.0.0" + } + }, + "merge-stream": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-1.0.1.tgz", + "integrity": "sha512-e6RM36aegd4f+r8BZCcYXlO2P3H6xbUM6ktL2Xmf45GAOit9bI4z6/3VU7JwllVO1L7u0UDSg/EhzQ5lmMLolA==", + "dev": true, + "requires": { + "readable-stream": "^2.0.1" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", "dev": true, "requires": { - "once": "^1.3.0", - "wrappy": "1" + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" } }, - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", - "dev": true - }, - "livereload-js": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/livereload-js/-/livereload-js-2.3.0.tgz", - "integrity": "sha512-j1R0/FeGa64Y+NmqfZhyoVRzcFlOZ8sNlKzHjh4VvLULFACZhn68XrX5DFg2FhMvSMJmROuFxRSa560ECWKBMg==", - "dev": true - }, - "lodash": { - "version": "3.10.1", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-3.10.1.tgz", - "integrity": "sha1-W/Rejkm6QYnhfUgnid/RW9FAt7Y=", - "dev": true - }, - "media-typer": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=", - "dev": true - }, - "mime-db": { - "version": "1.33.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.33.0.tgz", - "integrity": "sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ==", + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", "dev": true }, - "mime-types": { - "version": "2.1.18", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.18.tgz", - "integrity": "sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ==", + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "dev": true, "requires": { - "mime-db": "~1.33.0" + "safe-buffer": "~5.1.0" } - }, - "minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + } + } + }, + "micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dev": true, + "requires": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + } + }, + "mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "dev": true, + "optional": true + }, + "mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "dev": true + }, + "mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dev": true, + "requires": { + "mime-db": "1.52.0" + } + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", + "dev": true + }, + "mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true + }, + "ms": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz", + "integrity": "sha512-lRLiIR9fSNpnP6TC4v8+4OU7oStC01esuNowdQ34L+Gk8e5Puoc88IqJ+XAY/B3Mn2ZKis8l8HX90oU8ivzUHg==", + "dev": true + }, + "multipipe": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/multipipe/-/multipipe-0.1.2.tgz", + "integrity": "sha512-7ZxrUybYv9NonoXgwoOqtStIu18D1c3eFZj27hqgf5kBrBF8Q+tE8V0MW8dKM5QLkQPh1JhhbKgHLY9kifov4Q==", + "dev": true, + "optional": true, + "requires": { + "duplexer2": "0.0.2" + }, + "dependencies": { + "duplexer2": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.0.2.tgz", + "integrity": "sha512-+AWBwjGadtksxjOQSFDhPNQbed7icNXApT4+2BNpsXzcCBiInq2H9XW0O8sfHFaPmnQRs7cg/P0fAr2IWQSW0g==", "dev": true, + "optional": true, "requires": { - "brace-expansion": "^1.1.7" + "readable-stream": "~1.1.9" } }, - "ms": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz", - "integrity": "sha1-nNE8A62/8ltl7/3nzoZO6VIBcJg=", - "dev": true + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==", + "dev": true, + "optional": true }, - "on-finished": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", - "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", + "readable-stream": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", + "integrity": "sha512-+MeVjFf4L44XUkhM1eYbD8fyEsxcV81pqMSR5gblfcLCHfZvbrqy4/qYHE+/R5HoBUT11WV5O08Cr1n3YXkWVQ==", "dev": true, + "optional": true, "requires": { - "ee-first": "1.1.1" + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" } }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==", + "dev": true, + "optional": true + } + } + }, + "node-status-codes": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/node-status-codes/-/node-status-codes-1.0.0.tgz", + "integrity": "sha512-1cBMgRxdMWE8KeWCqk2RIOrvUb0XCwYfEsY5/y2NlXyq4Y/RumnOZvTj4Nbr77+Vb2C+kyBoRTdkNOS8L3d/aQ==", + "dev": true, + "optional": true + }, + "node-wp-i18n": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/node-wp-i18n/-/node-wp-i18n-1.2.6.tgz", + "integrity": "sha512-aLutjDB1rMJ3FNlNcs/XjmaejED1/y30uLYQrmkXpeUj1NH/SA6pI94CUz3iI7fbQd63lTGg0YNvOQAT8cWdIw==", + "dev": true, + "requires": { + "bluebird": "^3.4.1", + "gettext-parser": "^3.1.0", + "glob": "^7.0.5", + "lodash": "^4.14.2", + "minimist": "^1.2.5", + "mkdirp": "^1.0.4", + "tmp": "^0.2.1" + } + }, + "nopt": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", + "integrity": "sha512-4GUt3kSEYmk4ITxzB/b9vaIDfUVWN/Ml1Fwl11IlnIG2iaJ9O6WXZ9SrYM9NLI8OCBieN2Y8SWC2oJV0RQ7qYg==", + "dev": true, + "requires": { + "abbrev": "1" + } + }, + "normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "dev": true, + "requires": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha512-3pKJwH184Xo/lnH6oyP1q2pMd7HcypqqmRs91/6/i2CGtWwIKGCkOOMTm/zXbgTEWHw1uNpNi/igc3ePOYHb6w==", + "dev": true, + "requires": { + "remove-trailing-separator": "^1.0.1" + } + }, + "number-is-nan": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha512-4jbtZXNAsfZbAHiiqjLPBiCl16dES1zI4Hpzzxw61Tk+loF+sBDBKx1ICKKKwIqQ7M0mFn1TmkN7euSncWgHiQ==", + "dev": true + }, + "oauth-sign": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz", + "integrity": "sha512-VlF07iu3VV3+BTXj43Nmp6Irt/G7j/NgEctUS6IweH1RGhURjjCc2NWtzXFPXXWWfc7hgbXQdtiQu2LGp6MxUg==", + "dev": true, + "optional": true + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "dev": true + }, + "object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true + }, + "object.assign": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.5.tgz", + "integrity": "sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "has-symbols": "^1.0.3", + "object-keys": "^1.1.1" + } + }, + "object.defaults": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/object.defaults/-/object.defaults-1.1.0.tgz", + "integrity": "sha512-c/K0mw/F11k4dEUBMW8naXUuBuhxRCfG7W+yFy8EcijU/rSmazOUd1XAEEe6bC0OuXY4HUKjTJv7xbxIMqdxrA==", + "dev": true, + "requires": { + "array-each": "^1.0.1", + "array-slice": "^1.0.0", + "for-own": "^1.0.0", + "isobject": "^3.0.0" + } + }, + "object.map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object.map/-/object.map-1.0.1.tgz", + "integrity": "sha512-3+mAJu2PLfnSVGHwIWubpOFLscJANBKuB/6A4CxBstc4aqwQY0FWcsppuy4jU5GSB95yES5JHSI+33AWuS4k6w==", + "dev": true, + "requires": { + "for-own": "^1.0.0", + "make-iterator": "^1.0.0" + } + }, + "object.omit": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz", + "integrity": "sha512-UiAM5mhmIuKLsOvrL+B0U2d1hXHF3bFYWIuH1LMpuV2EJEHG1Ntz06PgLEHjm6VFd87NpH8rastvPoyv6UW2fA==", + "dev": true, + "requires": { + "for-own": "^0.1.4", + "is-extendable": "^0.1.1" + }, + "dependencies": { + "for-own": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz", + "integrity": "sha512-SKmowqGTJoPzLO1T0BBJpkfp3EMacCMOuH40hOUbrbzElVktk4DioXVM99QkLCyKoiuOmyjgcWMpVz2xjE7LZw==", "dev": true, "requires": { - "wrappy": "1" + "for-in": "^1.0.1" } - }, - "parseurl": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.2.tgz", - "integrity": "sha1-/CidTtiZMRlGDBViUyYs3I3mW/M=", - "dev": true - }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "dev": true - }, - "qs": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-5.1.0.tgz", - "integrity": "sha1-TZMuXH6kEcynajEtOaYGIA/VDNk=", - "dev": true - }, - "raw-body": { - "version": "2.1.7", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.1.7.tgz", - "integrity": "sha1-rf6s4uT7MJgFgBTQjActzFl1h3Q=", + } + } + }, + "object.pick": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", + "integrity": "sha512-tqa/UMy/CCoYmj+H5qc07qvSL9dqcs/WZENZ1JbtWBlATP+iVOe778gE6MSijnyCnORzDuX6hU+LA4SZ09YjFQ==", + "dev": true, + "requires": { + "isobject": "^3.0.1" + } + }, + "on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==", + "dev": true, + "requires": { + "ee-first": "1.1.1" + } + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "requires": { + "wrappy": "1" + } + }, + "onetime": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-1.1.0.tgz", + "integrity": "sha512-GZ+g4jayMqzCRMgB2sol7GiCLjKfS1PINkjmx8spcKce1LiVqcbQreXwqs2YAFXC6R03VIG28ZS31t8M866v6A==", + "dev": true, + "optional": true + }, + "optional": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/optional/-/optional-0.1.4.tgz", + "integrity": "sha512-gtvrrCfkE08wKcgXaVwQVgwEQ8vel2dc5DDBn9RLQZ3YtmtkBss6A2HY6BnJH4N/4Ku97Ri/SF8sNWE2225WJw==", + "dev": true + }, + "optipng-bin": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/optipng-bin/-/optipng-bin-3.1.4.tgz", + "integrity": "sha512-gsHt71VXDuI7ymHq5pBdzKS5Q1dcHLW6V6j13gnutO1mS8ezulK5Q+Xj/9/e6AwtjOResu2/UOBO/AiGrBo6+A==", + "dev": true, + "optional": true, + "requires": { + "bin-build": "^2.0.0", + "bin-wrapper": "^3.0.0", + "logalot": "^2.0.0" + } + }, + "ordered-read-streams": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/ordered-read-streams/-/ordered-read-streams-0.3.0.tgz", + "integrity": "sha512-xQvd8qvx9U1iYY9aVqPpoF5V9uaWJKV6ZGljkh/jkiNX0DiQsjbWvRumbh10QTMDE8DheaOEU8xi0szbrgjzcw==", + "dev": true, + "requires": { + "is-stream": "^1.0.1", + "readable-stream": "^2.0.1" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", "dev": true, "requires": { - "bytes": "2.4.0", - "iconv-lite": "0.4.13", - "unpipe": "1.0.0" - }, - "dependencies": { - "bytes": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-2.4.0.tgz", - "integrity": "sha1-fZcZb51br39pNeJZhVSe3SpsIzk=", - "dev": true - } + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" } }, - "statuses": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz", - "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==", + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", "dev": true }, - "tiny-lr": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/tiny-lr/-/tiny-lr-0.2.1.tgz", - "integrity": "sha1-s/26gC5dVqM8L28QeUsy5Hescp0=", - "dev": true, - "requires": { - "body-parser": "~1.14.0", - "debug": "~2.2.0", - "faye-websocket": "~0.10.0", - "livereload-js": "^2.2.0", - "parseurl": "~1.3.0", - "qs": "~5.1.0" - } - }, - "type-is": { - "version": "1.6.16", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.16.tgz", - "integrity": "sha512-HRkVv/5qY2G6I8iab9cI7v1bOIdhm94dVjQCPFElW9W+3GeDOSHmy2EBYe4VTApuzolPcmgFTN3ftVJRKR2J9Q==", + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "dev": true, "requires": { - "media-typer": "0.3.0", - "mime-types": "~2.1.18" + "safe-buffer": "~5.1.0" } - }, - "unpipe": { + } + } + }, + "os-filter-obj": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/os-filter-obj/-/os-filter-obj-1.0.3.tgz", + "integrity": "sha512-rohpWX8f46ASEOR77j8ZlJ2j5Rzg0j7gxC73ceZaDeMyE6H3nXnwgEjgg5ySlcT0bDuPUw7qcdWtd8Pzp/FJxg==", + "dev": true, + "optional": true + }, + "os-homedir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", + "integrity": "sha512-B5JU3cabzk8c67mRRd3ECmROafjYMXbuzlwtqdM8IbS8ktlTix8aFGb2bAGKrSRIlnfKwovGUUr72JUPyOb6kQ==", + "dev": true + }, + "os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==", + "dev": true + }, + "osenv": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz", + "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", + "dev": true, + "requires": { + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.0" + } + }, + "pako": { + "version": "0.2.9", + "resolved": "https://registry.npmjs.org/pako/-/pako-0.2.9.tgz", + "integrity": "sha512-NUcwaKxUxWrZLpDG+z/xZaCgQITkA/Dv4V/T6bw7VON6l1Xz/VnrBqrYjZQ12TamKHzITTfOEIYUj48y2KXImA==", + "dev": true + }, + "parse-filepath": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/parse-filepath/-/parse-filepath-1.0.2.tgz", + "integrity": "sha512-FwdRXKCohSVeXqwtYonZTXtbGJKrn+HNyWDYVcp5yuJlesTwNH4rsmRZ+GrKAPJ5bLpRxESMeS+Rl0VCHRvB2Q==", + "dev": true, + "requires": { + "is-absolute": "^1.0.0", + "map-cache": "^0.2.0", + "path-root": "^0.1.1" + } + }, + "parse-glob": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz", + "integrity": "sha512-FC5TeK0AwXzq3tUBFtH74naWkPQCEWs4K+xMxWZBlKDWu0bVHXGZa+KKqxKidd7xwhdZ19ZNuF2uO1M/r196HA==", + "dev": true, + "requires": { + "glob-base": "^0.3.0", + "is-dotfile": "^1.0.0", + "is-extglob": "^1.0.0", + "is-glob": "^2.0.0" + }, + "dependencies": { + "is-extglob": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", + "integrity": "sha512-7Q+VbVafe6x2T+Tu6NcOf6sRklazEPmBoB3IWk3WdGZM2iGUwU/Oe3Wtq5lSEkDTTlpp8yx+5t4pzO/i9Ty1ww==", "dev": true }, - "websocket-driver": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.0.tgz", - "integrity": "sha1-DK+dLXVdk67gSdS90NP+LMoqJOs=", + "is-glob": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", + "integrity": "sha512-a1dBeB19NXsf/E0+FHqkagizel/LQw2DjSQpvQrj3zT+jYPpaUCryPnrQajXKFLCMuf4I6FhRpaGtw4lPrG6Eg==", "dev": true, "requires": { - "http-parser-js": ">=0.4.0", - "websocket-extensions": ">=0.1.1" + "is-extglob": "^1.0.0" } - }, - "websocket-extensions": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.3.tgz", - "integrity": "sha512-nqHUnMXmBzT0w570r2JpJxfiSD1IzoI+HGVdd3aZ0yNi3ngvQ4jv1dtHt5VGxfI2yj5yqImPhOK4vmIh2xMbGg==", - "dev": true - }, - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true } } }, - "grunt-known-options": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/grunt-known-options/-/grunt-known-options-2.0.0.tgz", - "integrity": "sha512-GD7cTz0I4SAede1/+pAbmJRG44zFLPipVtdL9o3vqx9IEyb7b4/Y3s7r6ofI3CchR5GvYJ+8buCSioDv5dQLiA==", + "parse-json": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "integrity": "sha512-QR/GGaKCkhwk1ePQNYDRKYZ3mwU9ypsKhB0XyFnLQdomyEqk3e8wpW3V5Jp88zbxK4n5ST1nqo+g9juTpownhQ==", + "dev": true, + "requires": { + "error-ex": "^1.2.0" + } + }, + "parse-node-version": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parse-node-version/-/parse-node-version-1.0.1.tgz", + "integrity": "sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA==", + "dev": true, + "optional": true + }, + "parse-passwd": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", + "integrity": "sha512-1Y1A//QUXEZK7YKz+rD9WydcE1+EuPr6ZBgKecAB8tmoW6UFv0NREVJe1p+jRxtThkcbbKkfwIbWJe/IeE6m2Q==", "dev": true }, - "grunt-legacy-log": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/grunt-legacy-log/-/grunt-legacy-log-3.0.0.tgz", - "integrity": "sha512-GHZQzZmhyq0u3hr7aHW4qUH0xDzwp2YXldLPZTCjlOeGscAOWWPftZG3XioW8MasGp+OBRIu39LFx14SLjXRcA==", + "parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "dev": true + }, + "path-dirname": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", + "integrity": "sha512-ALzNPpyNq9AqXMBjeymIjFDAkAFH06mHJH/cSBHAgU0s4vfpBn6b2nf8tiRLvagKD8RbTpq2FKTBg7cl9l3c7Q==", + "dev": true + }, + "path-exists": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", + "integrity": "sha512-yTltuKuhtNeFJKa1PiRzfLAU5182q1y4Eb4XCJ3PBqyzEDkAZRzBrKKBct682ls9reBVHf9udYLN5Nd+K1B9BQ==", + "dev": true, + "requires": { + "pinkie-promise": "^2.0.0" + } + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==" + }, + "path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true + }, + "path-root": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/path-root/-/path-root-0.1.1.tgz", + "integrity": "sha512-QLcPegTHF11axjfojBIoDygmS2E3Lf+8+jI6wOVmNVenrKSo3mFdSGiIgdSHenczw3wPtlVMQaFVwGmM7BJdtg==", + "dev": true, + "requires": { + "path-root-regex": "^0.1.0" + } + }, + "path-root-regex": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/path-root-regex/-/path-root-regex-0.1.2.tgz", + "integrity": "sha512-4GlJ6rZDhQZFE0DPVKh0e9jmZ5egZfxTkp7bcRDuPlJXbAwhxcl2dINPUAsjLdejqaLsCeg8axcLjIbvBjN4pQ==", + "dev": true + }, + "path-type": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", + "integrity": "sha512-S4eENJz1pkiQn9Znv33Q+deTOKmbl+jj1Fl+qiP/vYezj+S8x+J3Uo0ISrx/QoEvIlOaDWJhPaRd1flJ9HXZqg==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + }, + "pend": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", + "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==", + "dev": true, + "optional": true + }, + "performance-now": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-0.2.0.tgz", + "integrity": "sha512-YHk5ez1hmMR5LOkb9iJkLKqoBlL7WD5M8ljC75ZfzXriuBIVNuecaXuU7e+hOwyqf24Wxhh7Vxgt7Hnw9288Tg==", + "dev": true, + "optional": true + }, + "picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "dev": true + }, + "pinkie": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha512-MnUuEycAemtSaeFSjXKW/aroV7akBbY+Sv+RkyqFjgAe73F+MR0TBWKBRDkmfWq/HiFmdavfZ1G7h4SPZXaCSg==", + "dev": true + }, + "pinkie-promise": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "integrity": "sha512-0Gni6D4UcLTbv9c57DfxDGdr41XfgUjqWZu492f0cIGr16zDU06BWP/RAEvOuo7CQ0CNjHaLlM59YJJFm3NWlw==", "dev": true, "requires": { - "colors": "~1.1.2", - "grunt-legacy-log-utils": "~2.1.0", - "hooker": "~0.2.3", - "lodash": "~4.17.19" + "pinkie": "^2.0.0" } }, - "grunt-legacy-log-utils": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/grunt-legacy-log-utils/-/grunt-legacy-log-utils-2.1.0.tgz", - "integrity": "sha512-lwquaPXJtKQk0rUM1IQAop5noEpwFqOXasVoedLeNzaibf/OPWjKYvvdqnEHNmU+0T0CaReAXIbGo747ZD+Aaw==", + "plur": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/plur/-/plur-2.1.2.tgz", + "integrity": "sha512-WhcHk576xg9y/iv6RWOuroZgsqvCbJN+XGvAypCJwLAYs2iWDp5LUmvaCdV6JR2O0SMBf8l6p7A94AyLCFVMlQ==", "dev": true, "requires": { - "chalk": "~4.1.0", - "lodash": "~4.17.19" + "irregular-plurals": "^1.0.0" } }, - "grunt-legacy-util": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/grunt-legacy-util/-/grunt-legacy-util-2.0.1.tgz", - "integrity": "sha512-2bQiD4fzXqX8rhNdXkAywCadeqiPiay0oQny77wA2F3WF4grPJXCvAcyoWUJV+po/b15glGkxuSiQCK299UC2w==", + "prepend-http": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", + "integrity": "sha512-PhmXi5XmoyKw1Un4E+opM2KcsJInDvKyuOumcjjw3waw86ZNjHwVUOOWLc4bCzLdcKNaWBH9e99sbWzDQsVaYg==", "dev": true, - "requires": { - "async": "~3.2.0", - "exit": "~0.1.2", - "getobject": "~1.0.0", - "hooker": "~0.2.3", - "lodash": "~4.17.21", - "underscore.string": "~3.3.5", - "which": "~2.0.2" - } + "optional": true }, - "grunt-notify": { - "version": "0.4.5", - "resolved": "https://registry.npmjs.org/grunt-notify/-/grunt-notify-0.4.5.tgz", - "integrity": "sha1-BSk5kGFhENtrwK0V5sBZL/4YrDE=", + "preserve": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz", + "integrity": "sha512-s/46sYeylUfHNjI+sA/78FAHlmIuKqI9wNnzEOGehAlUUYeObv5C2mOinXBjyUyWmJ2SfcS2/ydApH4hTF4WXQ==", + "dev": true + }, + "pretty-bytes": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-1.0.4.tgz", + "integrity": "sha512-LNisJvAjy+hruxp3GV4IkZZscTI34+ISfeM1hesB9V6ezIDfXYrBi9TIXVjjMcEB4QFN7tL+dFDEk4s8jMBMyA==", "dev": true, "requires": { - "semver": "^5.1.0", - "stack-parser": "^0.0.1", - "which": "^1.2.4" - }, - "dependencies": { - "semver": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz", - "integrity": "sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA==", - "dev": true - }, - "stack-parser": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/stack-parser/-/stack-parser-0.0.1.tgz", - "integrity": "sha1-fTtjoXiH6eLCv1Xb0zGP40o50ec=", - "dev": true - }, - "which": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.0.tgz", - "integrity": "sha512-xcJpopdamTuY5duC/KnTTNBraPK54YwpenP4lzxU8H91GudWpFv38u0CKjclE1Wi2EH2EDz5LRcHcKbCIzqGyg==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - } + "get-stdin": "^4.0.1", + "meow": "^3.1.0" } }, - "grunt-phplint": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/grunt-phplint/-/grunt-phplint-0.0.8.tgz", - "integrity": "sha1-wSeqKP930jnBSgHwUMx7cVnOkMA=", + "process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "dev": true + }, + "progress": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/progress/-/progress-1.1.8.tgz", + "integrity": "sha512-UdA8mJ4weIkUBO224tIarHzuHs4HuYiJvsuGT7j/SPQiUJVjYvNDBIPa0hAorduOfjGohB/qHWRa/lrrWX/mXw==", + "dev": true + }, + "promise": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", + "integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==", "dev": true, + "optional": true, "requires": { - "cache-swap": "~0.0.2", - "grunt": "~0.4.1" - }, - "dependencies": { - "abbrev": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", - "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", - "dev": true - }, - "argparse": { - "version": "0.1.16", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-0.1.16.tgz", - "integrity": "sha1-z9AeD7uj1srtBJ+9dY1A9lGW9Xw=", - "dev": true, - "requires": { - "underscore": "~1.7.0", - "underscore.string": "~2.4.0" - }, - "dependencies": { - "underscore.string": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/underscore.string/-/underscore.string-2.4.0.tgz", - "integrity": "sha1-jN2PusTi0uoefi6Al8QvRCKA+Fs=", - "dev": true - } - } - }, - "async": { - "version": "0.2.10", - "resolved": "https://registry.npmjs.org/async/-/async-0.2.10.tgz", - "integrity": "sha1-trvgsGdLnXGXCMo43owjfLUmw9E=", - "dev": true - }, - "cache-swap": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/cache-swap/-/cache-swap-0.0.6.tgz", - "integrity": "sha1-F834NebDAf0VgJCwPRzDb0Z7FpU=", - "dev": true, - "requires": { - "async": "~0.2.6", - "lodash": "~1.1.0", - "rimraf": "~2.1.4" - } - }, - "coffee-script": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/coffee-script/-/coffee-script-1.3.3.tgz", - "integrity": "sha1-FQ1rTLUiiUNp7+1qIQHCC8f0pPQ=", - "dev": true - }, - "colors": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/colors/-/colors-0.6.2.tgz", - "integrity": "sha1-JCP+ZnisDF2uiFLl0OW+CMmXq8w=", - "dev": true - }, - "dateformat": { - "version": "1.0.2-1.2.3", - "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-1.0.2-1.2.3.tgz", - "integrity": "sha1-sCIMAt6YYXQztyhRz0fePfLNvuk=", - "dev": true - }, - "esprima": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-1.0.4.tgz", - "integrity": "sha1-n1V+CPw7TSbs6d00+Pv0drYlha0=", - "dev": true - }, - "eventemitter2": { - "version": "0.4.14", - "resolved": "https://registry.npmjs.org/eventemitter2/-/eventemitter2-0.4.14.tgz", - "integrity": "sha1-j2G3XN4BKy6esoTUVFWDtWQ7Yas=", - "dev": true - }, - "exit": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", - "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=", - "dev": true - }, - "findup-sync": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-0.1.3.tgz", - "integrity": "sha1-fz56l7gjksZTvwZYm9hRkOk8NoM=", - "dev": true, - "requires": { - "glob": "~3.2.9", - "lodash": "~2.4.1" - }, - "dependencies": { - "glob": { - "version": "3.2.11", - "resolved": "https://registry.npmjs.org/glob/-/glob-3.2.11.tgz", - "integrity": "sha1-Spc/Y1uRkPcV0QmH1cAP0oFevj0=", - "dev": true, - "requires": { - "inherits": "2", - "minimatch": "0.3" - } - }, - "lodash": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-2.4.2.tgz", - "integrity": "sha1-+t2DS5aDBz2hebPq5tnA0VBT9z4=", - "dev": true - }, - "minimatch": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.3.0.tgz", - "integrity": "sha1-J12O2qxPG7MyZHIInnlJyDlGmd0=", - "dev": true, - "requires": { - "lru-cache": "2", - "sigmund": "~1.0.0" - } - } - } - }, - "getobject": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/getobject/-/getobject-0.1.0.tgz", - "integrity": "sha1-BHpEl4n6Fg0Bj1SG7ZEyC27HiFw=", - "dev": true - }, - "glob": { - "version": "3.1.21", - "resolved": "https://registry.npmjs.org/glob/-/glob-3.1.21.tgz", - "integrity": "sha1-0p4KBV3qUTj00H7UDomC6DwgZs0=", - "dev": true, - "requires": { - "graceful-fs": "~1.2.0", - "inherits": "1", - "minimatch": "~0.2.11" - }, - "dependencies": { - "inherits": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-1.0.2.tgz", - "integrity": "sha1-ykMJ2t7mtUzAuNJH6NfHoJdb3Js=", - "dev": true - } - } - }, - "graceful-fs": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-1.2.3.tgz", - "integrity": "sha1-FaSAaldUfLLS2/J/QuiajDRRs2Q=", - "dev": true - }, - "grunt": { - "version": "0.4.5", - "resolved": "https://registry.npmjs.org/grunt/-/grunt-0.4.5.tgz", - "integrity": "sha1-VpN81RlDJK3/bSB2MYMqnWuk5/A=", - "dev": true, - "requires": { - "async": "~0.1.22", - "coffee-script": "~1.3.3", - "colors": "~0.6.2", - "dateformat": "1.0.2-1.2.3", - "eventemitter2": "~0.4.13", - "exit": "~0.1.1", - "findup-sync": "~0.1.2", - "getobject": "~0.1.0", - "glob": "~3.1.21", - "grunt-legacy-log": "~0.1.0", - "grunt-legacy-util": "~0.2.0", - "hooker": "~0.2.3", - "iconv-lite": "~0.2.11", - "js-yaml": "~2.0.5", - "lodash": "~0.9.2", - "minimatch": "~0.2.12", - "nopt": "~1.0.10", - "rimraf": "~2.2.8", - "underscore.string": "~2.2.1", - "which": "~1.0.5" - }, - "dependencies": { - "async": { - "version": "0.1.22", - "resolved": "https://registry.npmjs.org/async/-/async-0.1.22.tgz", - "integrity": "sha1-D8GqoIig4+8Ovi2IMbqw3PiEUGE=", - "dev": true - }, - "lodash": { - "version": "0.9.2", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-0.9.2.tgz", - "integrity": "sha1-jzSZxSRdNG1oLlsNO0B2fgnxqSw=", - "dev": true - }, - "rimraf": { - "version": "2.2.8", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.2.8.tgz", - "integrity": "sha1-5Dm+Kq7jJzIZUnMPmaiSnk/FBYI=", - "dev": true - } - } - }, - "grunt-legacy-log": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/grunt-legacy-log/-/grunt-legacy-log-0.1.3.tgz", - "integrity": "sha1-7ClCboAwIa9ZAp+H0vnNczWgVTE=", - "dev": true, - "requires": { - "colors": "~0.6.2", - "grunt-legacy-log-utils": "~0.1.1", - "hooker": "~0.2.3", - "lodash": "~2.4.1", - "underscore.string": "~2.3.3" - }, - "dependencies": { - "lodash": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-2.4.2.tgz", - "integrity": "sha1-+t2DS5aDBz2hebPq5tnA0VBT9z4=", - "dev": true - }, - "underscore.string": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/underscore.string/-/underscore.string-2.3.3.tgz", - "integrity": "sha1-ccCL9rQosRM/N+ePo6Icgvcymw0=", - "dev": true - } - } + "asap": "~2.0.3" + } + }, + "prr": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", + "integrity": "sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==", + "dev": true, + "optional": true + }, + "punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==", + "dev": true, + "optional": true + }, + "q": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", + "integrity": "sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==", + "dev": true, + "optional": true + }, + "qs": { + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.4.1.tgz", + "integrity": "sha512-LQy1Q1fcva/UsnP/6Iaa4lVeM49WiOitu2T4hZCyA/elLKu37L99qcBJk4VCCk+rdLvnMzfKyiN3SZTqdAZGSQ==", + "dev": true, + "optional": true + }, + "randomatic": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-3.1.1.tgz", + "integrity": "sha512-TuDE5KxZ0J461RVjrJZCJc+J+zCkTb1MbH9AQUq68sMhOMcy9jLcb3BrZKgp9q9Ncltdg4QVqWrH02W2EFFVYw==", + "dev": true, + "requires": { + "is-number": "^4.0.0", + "kind-of": "^6.0.0", + "math-random": "^1.0.1" + }, + "dependencies": { + "is-number": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz", + "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==", + "dev": true + } + } + }, + "raw-body": { + "version": "2.1.7", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.1.7.tgz", + "integrity": "sha512-x4d27vsIG04gZ1imkuDXB9Rd/EkAx5kYzeMijIYw1PAor0Ld3nTlkQQwDjKu42GdRUFCX1AfGnTSQB4O57eWVg==", + "dev": true, + "requires": { + "bytes": "2.4.0", + "iconv-lite": "0.4.13", + "unpipe": "1.0.0" + }, + "dependencies": { + "bytes": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-2.4.0.tgz", + "integrity": "sha512-SvUX8+c/Ga454a4fprIdIUzUN9xfd1YTvYh7ub5ZPJ+ZJ/+K2Bp6IpWGmnw8r3caLTsmhvJAKZz3qjIo9+XuCQ==", + "dev": true }, - "grunt-legacy-log-utils": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/grunt-legacy-log-utils/-/grunt-legacy-log-utils-0.1.1.tgz", - "integrity": "sha1-wHBrndkGThFvNvI/5OawSGcsD34=", + "iconv-lite": { + "version": "0.4.13", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.13.tgz", + "integrity": "sha512-QwVuTNQv7tXC5mMWFX5N5wGjmybjNBBD8P3BReTkPmipoxTUFgWM2gXNvldHQr6T14DH0Dh6qBVg98iJt7u4mQ==", + "dev": true + } + } + }, + "rc": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "dev": true, + "optional": true, + "requires": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + } + }, + "read-all-stream": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/read-all-stream/-/read-all-stream-3.1.0.tgz", + "integrity": "sha512-DI1drPHbmBcUDWrJ7ull/F2Qb8HkwBncVx8/RpKYFSIACYaVRQReISYPdZz/mt1y1+qMCOrfReTopERmaxtP6w==", + "dev": true, + "optional": true, + "requires": { + "pinkie-promise": "^2.0.0", + "readable-stream": "^2.0.0" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", "dev": true, + "optional": true, "requires": { - "colors": "~0.6.2", - "lodash": "~2.4.1", - "underscore.string": "~2.3.3" - }, - "dependencies": { - "lodash": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-2.4.2.tgz", - "integrity": "sha1-+t2DS5aDBz2hebPq5tnA0VBT9z4=", - "dev": true - }, - "underscore.string": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/underscore.string/-/underscore.string-2.3.3.tgz", - "integrity": "sha1-ccCL9rQosRM/N+ePo6Icgvcymw0=", - "dev": true - } + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" } }, - "grunt-legacy-util": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/grunt-legacy-util/-/grunt-legacy-util-0.2.0.tgz", - "integrity": "sha1-kzJIhNv343qf98Am3/RR2UqeVUs=", + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", "dev": true, - "requires": { - "async": "~0.1.22", - "exit": "~0.1.1", - "getobject": "~0.1.0", - "hooker": "~0.2.3", - "lodash": "~0.9.2", - "underscore.string": "~2.2.1", - "which": "~1.0.5" - }, - "dependencies": { - "async": { - "version": "0.1.22", - "resolved": "https://registry.npmjs.org/async/-/async-0.1.22.tgz", - "integrity": "sha1-D8GqoIig4+8Ovi2IMbqw3PiEUGE=", - "dev": true - }, - "lodash": { - "version": "0.9.2", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-0.9.2.tgz", - "integrity": "sha1-jzSZxSRdNG1oLlsNO0B2fgnxqSw=", - "dev": true - } - } - }, - "hooker": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/hooker/-/hooker-0.2.3.tgz", - "integrity": "sha1-uDT3I8xKJCqmWWNFnfbZhMXT2Vk=", - "dev": true - }, - "iconv-lite": { - "version": "0.2.11", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.2.11.tgz", - "integrity": "sha1-HOYKOleGSiktEyH/RgnKS7llrcg=", - "dev": true - }, - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", - "dev": true + "optional": true }, - "js-yaml": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-2.0.5.tgz", - "integrity": "sha1-olrmUJmZ6X3yeMZxnaEb0Gh3Q6g=", + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "dev": true, + "optional": true, "requires": { - "argparse": "~ 0.1.11", - "esprima": "~ 1.0.2" + "safe-buffer": "~5.1.0" } - }, - "lodash": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-1.1.1.tgz", - "integrity": "sha1-QaKy6aAOZNbRmZ8UP/awdV9ruyQ=", - "dev": true - }, - "lru-cache": { - "version": "2.7.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.7.3.tgz", - "integrity": "sha1-bUUk6LlV+V1PW1iFHOId1y+06VI=", - "dev": true - }, - "minimatch": { - "version": "0.2.14", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.2.14.tgz", - "integrity": "sha1-x054BXT2PG+aCQ6Q775u9TpqdWo=", + } + } + }, + "read-pkg": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", + "integrity": "sha512-7BGwRHqt4s/uVbuyoeejRn4YmFnYZiFl4AuaeXHlgZf3sONF0SOGlxs2Pw8g6hCKupo08RafIO5YXFNOKTfwsQ==", + "dev": true, + "requires": { + "load-json-file": "^1.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^1.0.0" + } + }, + "read-pkg-up": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", + "integrity": "sha512-WD9MTlNtI55IwYUS27iHh9tK3YoIVhxis8yKhLpTqWtml739uXc9NWTpxoHkfZf3+DkCCsXox94/VWZniuZm6A==", + "dev": true, + "requires": { + "find-up": "^1.0.0", + "read-pkg": "^1.0.0" + } + }, + "readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + }, + "rechoir": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.7.1.tgz", + "integrity": "sha512-/njmZ8s1wVeR6pjTZ+0nCnv8SpZNRMT2D1RLOJQESlYFDBvwpTA4KWJpZ+sBJ4+vhjILRcK7JIFdGCdxEAAitg==", + "dev": true, + "requires": { + "resolve": "^1.9.0" + } + }, + "redent": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz", + "integrity": "sha512-qtW5hKzGQZqKoh6JNSD+4lfitfPKGz42e6QwiRmPM5mmKtR0N41AbJRYu0xJi7nhOJ4WDgRkKvAk6tw4WIwR4g==", + "dev": true, + "requires": { + "indent-string": "^2.1.0", + "strip-indent": "^1.0.1" + } + }, + "regex-cache": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.4.tgz", + "integrity": "sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ==", + "dev": true, + "requires": { + "is-equal-shallow": "^0.1.3" + } + }, + "remove-trailing-separator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", + "integrity": "sha512-/hS+Y0u3aOfIETiaiirUFwDBDzmXPvO+jAfKTitUngIPzdKc6Z0LoFjM/CK5PL4C+eKwHohlHAb6H0VFfmmUsw==", + "dev": true + }, + "repeat-element": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.4.tgz", + "integrity": "sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ==", + "dev": true + }, + "repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==", + "dev": true + }, + "repeating": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", + "integrity": "sha512-ZqtSMuVybkISo2OWvqvm7iHSWngvdaW3IpsT9/uP8v4gMi591LY6h35wdOfvQdWCKFWZWm2Y1Opp4kV7vQKT6A==", + "dev": true, + "requires": { + "is-finite": "^1.0.0" + } + }, + "replace-ext": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-0.0.1.tgz", + "integrity": "sha512-AFBWBy9EVRTa/LhEcG8QDP3FvpwZqmvN2QFDuJswFeaVhWnZMp8q3E6Zd90SR04PlIwfGdyVjNyLPyen/ek5CQ==", + "dev": true + }, + "request": { + "version": "2.81.0", + "resolved": "https://registry.npmjs.org/request/-/request-2.81.0.tgz", + "integrity": "sha512-IZnsR7voF0miGSu29EXPRgPTuEsI/+aibNSBbN1pplrfartF5wDYGADz3iD9vmBVf2r00rckWZf8BtS5kk7Niw==", + "dev": true, + "optional": true, + "requires": { + "aws-sign2": "~0.6.0", + "aws4": "^1.2.1", + "caseless": "~0.12.0", + "combined-stream": "~1.0.5", + "extend": "~3.0.0", + "forever-agent": "~0.6.1", + "form-data": "~2.1.1", + "har-validator": "~4.2.1", + "hawk": "~3.1.3", + "http-signature": "~1.1.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.7", + "oauth-sign": "~0.8.1", + "performance-now": "^0.2.0", + "qs": "~6.4.0", + "safe-buffer": "^5.0.1", + "stringstream": "~0.0.4", + "tough-cookie": "~2.3.0", + "tunnel-agent": "^0.6.0", + "uuid": "^3.0.0" + }, + "dependencies": { + "tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", "dev": true, + "optional": true, "requires": { - "lru-cache": "2", - "sigmund": "~1.0.0" + "safe-buffer": "^5.0.1" } }, - "nopt": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz", - "integrity": "sha1-bd0hvSoxQXuScn3Vhfim83YI6+4=", + "uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", "dev": true, - "requires": { - "abbrev": "1" - } + "optional": true + } + } + }, + "resolve": { + "version": "1.22.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.0.tgz", + "integrity": "sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw==", + "dev": true, + "requires": { + "is-core-module": "^2.8.1", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + } + }, + "resolve-dir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz", + "integrity": "sha512-R7uiTjECzvOsWSfdM0QKFNBVFcK27aHOUwdvK53BcW8zqnGdYp0Fbj82cy54+2A4P2tFM22J5kRfe1R+lM/1yg==", + "dev": true, + "requires": { + "expand-tilde": "^2.0.0", + "global-modules": "^1.0.0" + } + }, + "right-align": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz", + "integrity": "sha512-yqINtL/G7vs2v+dFIZmFUDbnVyFUJFKd6gK22Kgo6R4jfJGFtisKyncWDDULgjfqf4ASQuIQyjJ7XZ+3aWpsAg==", + "dev": true, + "requires": { + "align-text": "^0.1.1" + } + }, + "rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + }, + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true + }, + "sax": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", + "dev": true, + "optional": true + }, + "seek-bzip": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/seek-bzip/-/seek-bzip-1.0.6.tgz", + "integrity": "sha512-e1QtP3YL5tWww8uKaOCQ18UxIT2laNBXHjV/S2WYCiK4udiv8lkG89KRIoCjUagnAmCBurjF4zEVX2ByBbnCjQ==", + "dev": true, + "optional": true, + "requires": { + "commander": "^2.8.1" + } + }, + "semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "dev": true + }, + "semver-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/semver-regex/-/semver-regex-1.0.0.tgz", + "integrity": "sha512-1vZcoRC+LPtHFkLUPyrabsATDSHerxW+hJBN8h04HZOZBuewbXaNROtUVdEPrTdZsWNq6sfsXDhd48GB2xTG4g==", + "dev": true, + "optional": true + }, + "semver-truncate": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/semver-truncate/-/semver-truncate-1.1.2.tgz", + "integrity": "sha512-V1fGg9i4CL3qesB6U0L6XAm4xOJiHmt4QAacazumuasc03BvtFGIMCduv01JWQ69Nv+JST9TqhSCiJoxoY031w==", + "dev": true, + "optional": true, + "requires": { + "semver": "^5.3.0" + } + }, + "set-function-length": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.1.tgz", + "integrity": "sha512-j4t6ccc+VsKwYHso+kElc5neZpjtq9EnRICFZtWyBsLojhmeF/ZBd/elqm22WJh/BziDe/SBiOeAt0m2mfLD0g==", + "dev": true, + "requires": { + "define-data-property": "^1.1.2", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.3", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.1" + }, + "dependencies": { + "function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "dev": true + } + } + }, + "set-immediate-shim": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz", + "integrity": "sha512-Li5AOqrZWCVA2n5kryzEmqai6bKSIvpz5oUJHPVj6+dsbD3X1ixtsY5tEnsaNpH3pFAHmG8eIHUrtEtohrg+UQ==", + "dev": true, + "optional": true + }, + "shelljs": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.3.0.tgz", + "integrity": "sha512-Ny0KN4dyT8ZSCE0frtcbAJGoM/HTArpyPkeli1/00aYfm0sbD/Gk/4x7N2DP9QKGpBsiQH7n6rpm1L79RtviEQ==", + "dev": true + }, + "sigmund": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.1.tgz", + "integrity": "sha512-fCvEXfh6NWpm+YSuY2bpXb/VIihqWA6hLsgboC+0nl71Q7N7o2eaCW8mJa/NLvQhs6jpd3VZV4UiUQlV6+lc8g==", + "dev": true + }, + "signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true + }, + "sntp": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/sntp/-/sntp-1.0.9.tgz", + "integrity": "sha512-7bgVOAnPj3XjrKY577S+puCKGCRlUrcrEdsMeRXlg9Ghf5df/xNi6sONUa43WrHUd3TjJBF7O04jYoiY0FVa0A==", + "dev": true, + "optional": true, + "requires": { + "hoek": "2.x.x" + } + }, + "sparkles": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/sparkles/-/sparkles-1.0.1.tgz", + "integrity": "sha512-dSO0DDYUahUt/0/pD/Is3VIm5TGJjludZ0HVymmhYF6eNA53PVLhnUk0znSYbH8IYBuJdCE+1luR22jNLMaQdw==", + "dev": true, + "optional": true + }, + "spdx-correct": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", + "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", + "dev": true, + "requires": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-exceptions": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.1.0.tgz", + "integrity": "sha512-4K1NsmrlCU1JJgUrtgEeTVyfx8VaYea9J9LvARxhbHtVtohPs/gFGG5yy49beySjlIMhhXZ4QqujIZEfS4l6Cg==", + "dev": true + }, + "spdx-expression-parse": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "dev": true, + "requires": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-license-ids": { + "version": "3.0.16", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.16.tgz", + "integrity": "sha512-eWN+LnM3GR6gPu35WxNgbGl8rmY1AEmoMDvL/QD6zYmPWgywxWqJWNdLGT+ke8dKNWrcYgYjPpG5gbTfghP8rw==", + "dev": true + }, + "sprintf-js": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.3.tgz", + "integrity": "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==", + "dev": true + }, + "squeak": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/squeak/-/squeak-1.3.0.tgz", + "integrity": "sha512-YQL1ulInM+ev8nXX7vfXsCsDh6IqXlrremc1hzi77776BtpWgYJUMto3UM05GSAaGzJgWekszjoKDrVNB5XG+A==", + "dev": true, + "optional": true, + "requires": { + "chalk": "^1.0.0", + "console-stream": "^0.1.1", + "lpad-align": "^1.0.1" + }, + "dependencies": { + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==", + "dev": true, + "optional": true }, - "rimraf": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.1.4.tgz", - "integrity": "sha1-Wm62Lu2gaPUe3lDymz5c0i89m7I=", + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==", "dev": true, + "optional": true, "requires": { - "graceful-fs": "~1" + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" } }, - "sigmund": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.1.tgz", - "integrity": "sha1-P/IfGYytIXX587eBhT/ZTQ0ZtZA=", - "dev": true - }, - "underscore": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.7.0.tgz", - "integrity": "sha1-a7rwh3UA02vjTsqlhODbn+8DUgk=", - "dev": true - }, - "underscore.string": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/underscore.string/-/underscore.string-2.2.1.tgz", - "integrity": "sha1-18D6KvXVoaZ/QlPa7pgTLnM/Dxk=", - "dev": true - }, - "which": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/which/-/which-1.0.9.tgz", - "integrity": "sha1-RgwdoPgQED0DIam2M6+eV15kSG8=", - "dev": true + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==", + "dev": true, + "optional": true } } }, - "grunt-ssh": { - "version": "0.12.9", - "resolved": "https://registry.npmjs.org/grunt-ssh/-/grunt-ssh-0.12.9.tgz", - "integrity": "sha1-IVUaNzmB8Ooo3HmdOKdp5UzU2QQ=", + "ssh2": { + "version": "0.4.15", + "resolved": "https://registry.npmjs.org/ssh2/-/ssh2-0.4.15.tgz", + "integrity": "sha512-/KEtwbNly4LtP92bBfgY4RCj8YAvKaXg89nLaCINNMu1X5d++W5DOZz+yX2xwjlSmdw8we7AC9LYnAzBkA4OwA==", "dev": true, "requires": { - "async": ">=1.0.0", - "progress": "~1.1.3", - "ssh2": "~0.4.6" + "readable-stream": "~1.0.0", + "ssh2-streams": "~0.0.22" }, "dependencies": { - "asn1": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz", - "integrity": "sha1-2sh4dxPJlmhJ/IGAd36+nB3fO4Y=", - "dev": true - }, - "core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", - "dev": true - }, - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", - "dev": true - }, "isarray": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", - "dev": true - }, - "progress": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/progress/-/progress-1.1.8.tgz", - "integrity": "sha1-4mDHj2Fhzdmw5WzD4Khd4Xx6V74=", + "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==", "dev": true }, "readable-stream": { "version": "1.0.34", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", - "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", + "integrity": "sha512-ok1qVCJuRkNmvebYikljxJA/UEsKwLl2nI1OmaqAu4/UE+h0wKCHok4XkL/gvi39OacXvw59RJUOFUkDib2rHg==", "dev": true, "requires": { "core-util-is": "~1.0.0", @@ -15819,272 +6121,321 @@ "string_decoder": "~0.10.x" } }, - "ssh2": { - "version": "0.4.15", - "resolved": "https://registry.npmjs.org/ssh2/-/ssh2-0.4.15.tgz", - "integrity": "sha1-B8b0EG2fe26m5N9jbGxT8fmBf/g=", - "dev": true, - "requires": { - "readable-stream": "~1.0.0", - "ssh2-streams": "~0.0.22" - } + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==", + "dev": true + } + } + }, + "ssh2-streams": { + "version": "0.0.23", + "resolved": "https://registry.npmjs.org/ssh2-streams/-/ssh2-streams-0.0.23.tgz", + "integrity": "sha512-llhegJ0WOuEZQoWvh+ZB/ZQpJNjuDVPVAh+UjIsi0YLM7GeKPX7xMnh5LJtjOBAChumuUg7hNfIUfKjrxfNNYg==", + "dev": true, + "requires": { + "asn1": "~0.2.0", + "readable-stream": "~1.0.0", + "streamsearch": "~0.1.2" + }, + "dependencies": { + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==", + "dev": true }, - "ssh2-streams": { - "version": "0.0.23", - "resolved": "https://registry.npmjs.org/ssh2-streams/-/ssh2-streams-0.0.23.tgz", - "integrity": "sha1-ru8wgxu1/Er2qj9tCiYaQTUxYSs=", + "readable-stream": { + "version": "1.0.34", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", + "integrity": "sha512-ok1qVCJuRkNmvebYikljxJA/UEsKwLl2nI1OmaqAu4/UE+h0wKCHok4XkL/gvi39OacXvw59RJUOFUkDib2rHg==", "dev": true, "requires": { - "asn1": "~0.2.0", - "readable-stream": "~1.0.0", - "streamsearch": "~0.1.2" + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" } }, - "streamsearch": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-0.1.2.tgz", - "integrity": "sha1-gIudDlb8Jz2Am6VzOOkpkZoanxo=", - "dev": true - }, "string_decoder": { "version": "0.10.31", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", + "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==", "dev": true } } }, - "grunt-text-replace": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/grunt-text-replace/-/grunt-text-replace-0.4.0.tgz", - "integrity": "sha1-252c5Z4v5J2id+nbwZXD4Rz7FsI=", - "dev": true - }, - "grunt-wp-i18n": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/grunt-wp-i18n/-/grunt-wp-i18n-1.0.3.tgz", - "integrity": "sha512-CJNbEKeBeOSAPeaJ9B8iCgSwtaG63UR9/uT46a4OsIqnFhOJpeAi138JTlvjfIbnDVoBrzvdrKJe1svveLjUtA==", + "sshpk": { + "version": "1.18.0", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.18.0.tgz", + "integrity": "sha512-2p2KJZTSqQ/I3+HX42EpYOa2l3f8Erv8MWKsy2I9uf4wA7yFIkXRffYdsx86y6z4vHtV8u7g+pPlr8/4ouAxsQ==", "dev": true, + "optional": true, "requires": { - "grunt": "^1.0.3", - "node-wp-i18n": "^1.2.2" + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jsbn": "~0.1.0", + "safer-buffer": "^2.0.2", + "tweetnacl": "~0.14.0" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==", + "dev": true, + "optional": true + } } }, - "grunt-wp-readme-to-markdown": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/grunt-wp-readme-to-markdown/-/grunt-wp-readme-to-markdown-2.0.1.tgz", - "integrity": "sha1-QGzV6YmIWA3B0W6AXE4uYJJWhVI=", + "stack-parser": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/stack-parser/-/stack-parser-0.0.1.tgz", + "integrity": "sha512-7wM3FaSOHg0EMrQ4GqRLLwAN4oY8eUHiqOnxTQgRnJ3hAiGKhAItH+cAJHqyyxgBJSr06MosLpkg9hksbrJakQ==", "dev": true }, - "has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "stat-mode": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/stat-mode/-/stat-mode-0.2.2.tgz", + "integrity": "sha512-o+7DC0OM5Jt3+gratXXqfXf62V/CBoqQbT7Kp7jCxTYW2PLOB2/ZSGIfm9T5/QZe1Vw1MCbu6DoB6JnhVtxcJw==", "dev": true, - "requires": { - "function-bind": "^1.1.1" - } + "optional": true }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", "dev": true }, - "has-symbols": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.0.tgz", - "integrity": "sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q=", + "stream-buffers": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/stream-buffers/-/stream-buffers-2.2.0.tgz", + "integrity": "sha512-uyQK/mx5QjHun80FLJTfaWE7JtwfRMKBLkMne6udYOmvH0CawotVa7TfgYHzAnpphn4+TweIx1QKMnRIbipmUg==", "dev": true }, - "homedir-polyfill": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz", - "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==", + "stream-combiner2": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/stream-combiner2/-/stream-combiner2-1.1.1.tgz", + "integrity": "sha512-3PnJbYgS56AeWgtKF5jtJRT6uFJe56Z0Hc5Ngg/6sI6rIt8iiMBTa9cvdyFfpMQjaVHr8dusbNeFGIIonxOvKw==", "dev": true, "requires": { - "parse-passwd": "^1.0.0" + "duplexer2": "~0.1.0", + "readable-stream": "^2.0.2" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + } } }, - "hooker": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/hooker/-/hooker-0.2.3.tgz", - "integrity": "sha1-uDT3I8xKJCqmWWNFnfbZhMXT2Vk=", + "stream-shift": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.3.tgz", + "integrity": "sha512-76ORR0DO1o1hlKwTbi/DM3EXWGf3ZJYO8cXX5RJwnul2DEg2oyoZyjLNoQM8WsvZiFKCRfC1O0J7iCvie3RZmQ==", "dev": true }, - "http-parser-js": { - "version": "0.4.10", - "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.4.10.tgz", - "integrity": "sha1-ksnBN0w1CF912zWexWzCV8u5P6Q=", + "streamsearch": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-0.1.2.tgz", + "integrity": "sha512-jos8u++JKm0ARcSUTAZXOVC0mSox7Bhn6sBgty73P1f3JGf7yG2clTbBNHUdde/kdvP2FESam+vM6l8jBrNxHA==", "dev": true }, - "iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "string-length": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/string-length/-/string-length-1.0.1.tgz", + "integrity": "sha512-MNCACnufWUf3pQ57O5WTBMkKhzYIaKEcUioO0XHrTMafrbBaNk4IyDOLHBv5xbXO0jLLdsYWeFjpjG2hVHRDtw==", "dev": true, "requires": { - "safer-buffer": ">= 2.1.2 < 3" + "strip-ansi": "^3.0.0" } }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dev": true, "requires": { - "once": "^1.3.0", - "wrappy": "1" + "safe-buffer": "~5.2.0" } }, - "inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" - }, - "ini": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", - "dev": true - }, - "interpret": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.1.0.tgz", - "integrity": "sha512-CLM8SNMDu7C5psFCn6Wg/tgpj/bKAg7hc2gWqcuR9OD5Ft9PhBpIu8PLicPeis+xDd6YX2ncI8MCA64I9tftIA==", - "dev": true - }, - "is-absolute": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-absolute/-/is-absolute-1.0.0.tgz", - "integrity": "sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA==", + "stringstream": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.6.tgz", + "integrity": "sha512-87GEBAkegbBcweToUrdzf3eLhWNg06FJTebl4BVJz/JgWy8CvEr9dRtX5qWphiynMSQlxxi+QqN0z5T32SLlhA==", "dev": true, - "requires": { - "is-relative": "^1.0.0", - "is-windows": "^1.0.1" - } + "optional": true }, - "is-core-module": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.9.0.tgz", - "integrity": "sha512-+5FPy5PnwmO3lvfMb0AsoPaBG+5KHUI0wYFXOtYPnVVVspTFUuMZNfNaNVRt3FZadstu2c8x23vykRW/NBoU6A==", + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==", "dev": true, "requires": { - "has": "^1.0.3" + "ansi-regex": "^2.0.0" } }, - "is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "dev": true - }, - "is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "strip-bom": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", + "integrity": "sha512-kwrX1y7czp1E69n2ajbG65mIo9dqvJ+8aBQXOGVxqwvNbsXdFM6Lq37dLAY3mknUwru8CfcCbfOLL/gMo+fi3g==", "dev": true, "requires": { - "is-extglob": "^2.1.1" + "is-utf8": "^0.2.0" } }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true - }, - "is-plain-object": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "strip-bom-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-bom-stream/-/strip-bom-stream-1.0.0.tgz", + "integrity": "sha512-7jfJB9YpI2Z0aH3wu10ZqitvYJaE0s5IzFuWE+0pbb4Q/armTloEUShymkDO47YSLnjAW52mlXT//hs9wXNNJQ==", "dev": true, "requires": { - "isobject": "^3.0.1" + "first-chunk-stream": "^1.0.0", + "strip-bom": "^2.0.0" } }, - "is-relative": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-relative/-/is-relative-1.0.0.tgz", - "integrity": "sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA==", + "strip-dirs": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/strip-dirs/-/strip-dirs-1.1.1.tgz", + "integrity": "sha512-+0QvOUTIs3xMridKraQAUSIp/kq7FRt/QjevB40+U6qJfeuPpTDQENFVfAbfZp59GpJkxY+yMdjR5cgKZyR2vg==", "dev": true, + "optional": true, "requires": { - "is-unc-path": "^1.0.0" + "chalk": "^1.0.0", + "get-stdin": "^4.0.1", + "is-absolute": "^0.1.5", + "is-natural-number": "^2.0.0", + "minimist": "^1.1.0", + "sum-up": "^1.0.1" + }, + "dependencies": { + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==", + "dev": true, + "optional": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==", + "dev": true, + "optional": true, + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + } + }, + "is-absolute": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/is-absolute/-/is-absolute-0.1.7.tgz", + "integrity": "sha512-Xi9/ZSn4NFapG8RP98iNPMOeaV3mXPisxKxzKtHVqr3g56j/fBn+yZmnxSVAA8lmZbl2J9b/a4kJvfU3hqQYgA==", + "dev": true, + "optional": true, + "requires": { + "is-relative": "^0.1.0" + } + }, + "is-relative": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/is-relative/-/is-relative-0.1.3.tgz", + "integrity": "sha512-wBOr+rNM4gkAZqoLRJI4myw5WzzIdQosFAAbnvfXP5z1LyzgAI3ivOKehC5KfqlQJZoihVhirgtCBj378Eg8GA==", + "dev": true, + "optional": true + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==", + "dev": true, + "optional": true + } } }, - "is-unc-path": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-unc-path/-/is-unc-path-1.0.0.tgz", - "integrity": "sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ==", + "strip-indent": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz", + "integrity": "sha512-I5iQq6aFMM62fBEAIB/hXzwJD6EEZ0xEGCX2t7oXqaKPIRgt4WruAQ285BISgdkP+HLGWyeGmNJcpIwFeRYRUA==", "dev": true, "requires": { - "unc-path-regex": "^0.1.2" + "get-stdin": "^4.0.1" } }, - "is-windows": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", - "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", - "dev": true - }, - "isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true - }, - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", - "dev": true + "strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", + "dev": true, + "optional": true }, - "js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "strip-outer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/strip-outer/-/strip-outer-1.0.1.tgz", + "integrity": "sha512-k55yxKHwaXnpYGsOzg4Vl8+tDrWylxDEpknGjhTiZB8dFRU5rTo9CAzeycivxV3s+zlTKwrs6WxMxR95n26kwg==", "dev": true, + "optional": true, "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" + "escape-string-regexp": "^1.0.2" } }, - "jshint-stylish": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/jshint-stylish/-/jshint-stylish-2.2.1.tgz", - "integrity": "sha1-JCCCosA1rgP9gQROBXDMQgjPbmE=", + "sum-up": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sum-up/-/sum-up-1.0.3.tgz", + "integrity": "sha512-zw5P8gnhiqokJUWRdR6F4kIIIke0+ubQSGyYUY506GCbJWtV7F6Xuy0j6S125eSX2oF+a8KdivsZ8PlVEH0Mcw==", "dev": true, + "optional": true, "requires": { - "beeper": "^1.1.0", - "chalk": "^1.0.0", - "log-symbols": "^1.0.0", - "plur": "^2.1.0", - "string-length": "^1.0.0", - "text-table": "^0.2.0" + "chalk": "^1.0.0" }, "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true - }, "ansi-styles": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "dev": true - }, - "beeper": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/beeper/-/beeper-1.1.1.tgz", - "integrity": "sha1-5tXqjF2tABMEpwsiY4RH9pyy+Ak=", - "dev": true + "integrity": "sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==", + "dev": true, + "optional": true }, "chalk": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "integrity": "sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==", "dev": true, + "optional": true, "requires": { "ansi-styles": "^2.2.1", "escape-string-regexp": "^1.0.2", @@ -16093,464 +6444,850 @@ "supports-color": "^2.0.0" } }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", - "dev": true - }, - "has-ansi": { + "supports-color": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", - "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==", + "dev": true, + "optional": true + } + } + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + }, + "supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true + }, + "svgo": { + "version": "0.6.6", + "resolved": "https://registry.npmjs.org/svgo/-/svgo-0.6.6.tgz", + "integrity": "sha512-C5A1r5SjFesNoKsmc+kWBxmB04iBGH2D/nFy8HJaME9+SyZKcmqcN8QG+GwxIc7D2+JWhaaW7uaM9+XwfplTEQ==", + "dev": true, + "optional": true, + "requires": { + "coa": "~1.0.1", + "colors": "~1.1.2", + "csso": "~2.0.0", + "js-yaml": "~3.6.0", + "mkdirp": "~0.5.1", + "sax": "~1.2.1", + "whet.extend": "~0.9.9" + }, + "dependencies": { + "esprima": { + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz", + "integrity": "sha512-OarPfz0lFCiW4/AV2Oy1Rp9qu0iusTKqykwTspGCZtPxmF81JR4MmIebvF1F9+UOKth2ZubLQ4XGGaU+hSn99A==", + "dev": true, + "optional": true + }, + "js-yaml": { + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.6.1.tgz", + "integrity": "sha512-BLv3oxhfET+w5fjPwq3PsAsxzi9i3qzU//HMpWVz0A6KplF86HdR9x2TGnv9DXhSUrO7LO8czUiTd3yb3mLSvg==", "dev": true, + "optional": true, "requires": { - "ansi-regex": "^2.0.0" + "argparse": "^1.0.7", + "esprima": "^2.6.0" } }, - "irregular-plurals": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/irregular-plurals/-/irregular-plurals-1.4.0.tgz", - "integrity": "sha1-LKmwM2UREYVUEvFr5dd8YqRYp2Y=", - "dev": true + "minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true, + "optional": true }, - "log-symbols": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-1.0.2.tgz", - "integrity": "sha1-N2/3tY6jCGoPCfrMdGF+ylAeGhg=", + "mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", "dev": true, + "optional": true, "requires": { - "chalk": "^1.0.0" + "minimist": "^1.2.6" } - }, - "plur": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/plur/-/plur-2.1.2.tgz", - "integrity": "sha1-dIJFLBoPUI4+NE6uwxLJHCncZVo=", + } + } + }, + "tar-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-1.6.2.tgz", + "integrity": "sha512-rzS0heiNf8Xn7/mpdSVVSMAWAoy9bfb1WOTYC78Z0UQKeKa/CWS8FOq0lKGNa8DWKAn9gxjCvMLYc5PGXYlK2A==", + "dev": true, + "requires": { + "bl": "^1.0.0", + "buffer-alloc": "^1.2.0", + "end-of-stream": "^1.0.0", + "fs-constants": "^1.0.0", + "readable-stream": "^2.3.0", + "to-buffer": "^1.1.1", + "xtend": "^4.0.0" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", "dev": true, "requires": { - "irregular-plurals": "^1.0.0" + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" } }, - "string-length": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/string-length/-/string-length-1.0.1.tgz", - "integrity": "sha1-VpcPscOFWOnnC3KL894mmsRa36w=", + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "dev": true, "requires": { - "strip-ansi": "^3.0.0" + "safe-buffer": "~5.1.0" } + } + } + }, + "tempfile": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/tempfile/-/tempfile-1.1.1.tgz", + "integrity": "sha512-NjT12fW6pSEKz1eVcADgaKfeM+XZ4+zSaqVz46XH7+CiEwcelnwtGWRRjF1p+xyW2PVgKKKS2UUw1LzRelntxg==", + "dev": true, + "optional": true, + "requires": { + "os-tmpdir": "^1.0.0", + "uuid": "^2.0.1" + } + }, + "text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", + "dev": true + }, + "through2": { + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz", + "integrity": "sha512-RkK/CCESdTKQZHdmKICijdKKsCRVHs5KsLZ6pACAmF/1GPUQhonHSXWNERctxEp7RmvjdNbZTL5z9V7nSCXKcg==", + "dev": true, + "requires": { + "readable-stream": ">=1.0.33-1 <1.1.0-0", + "xtend": ">=4.0.0 <4.1.0-0" + }, + "dependencies": { + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==", + "dev": true }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "readable-stream": { + "version": "1.0.34", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", + "integrity": "sha512-ok1qVCJuRkNmvebYikljxJA/UEsKwLl2nI1OmaqAu4/UE+h0wKCHok4XkL/gvi39OacXvw59RJUOFUkDib2rHg==", "dev": true, "requires": { - "ansi-regex": "^2.0.0" + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" } }, - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true - }, - "text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==", "dev": true } } }, - "kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true - }, - "liftup": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/liftup/-/liftup-3.0.1.tgz", - "integrity": "sha512-yRHaiQDizWSzoXk3APcA71eOI/UuhEkNN9DiW2Tt44mhYzX4joFoCZlxsSOF7RyeLlfqzFLQI1ngFq3ggMPhOw==", + "through2-filter": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/through2-filter/-/through2-filter-2.0.0.tgz", + "integrity": "sha512-miwWajb1B80NvIVKXFPN/o7+vJc4jYUvnZCwvhicRAoTxdD9wbcjri70j+BenCrN/JXEPKDjhpw4iY7yiNsCGg==", "dev": true, "requires": { - "extend": "^3.0.2", - "findup-sync": "^4.0.0", - "fined": "^1.2.0", - "flagged-respawn": "^1.0.1", - "is-plain-object": "^2.0.4", - "object.map": "^1.0.1", - "rechoir": "^0.7.0", - "resolve": "^1.19.0" + "through2": "~2.0.0", + "xtend": "~4.0.0" }, "dependencies": { - "findup-sync": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-4.0.0.tgz", - "integrity": "sha512-6jvvn/12IC4quLBL1KNokxC7wWTvYncaVUYSoxWw7YykPLuRrnv4qdHcSOywOI5RpkOVGeQRtWM8/q+G6W6qfQ==", + "readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", "dev": true, "requires": { - "detect-file": "^1.0.0", - "is-glob": "^4.0.0", - "micromatch": "^4.0.2", - "resolve-dir": "^1.0.1" + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "dev": true, + "requires": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" } } } }, - "lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "dev": true + "time-stamp": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/time-stamp/-/time-stamp-1.1.0.tgz", + "integrity": "sha512-gLCeArryy2yNTRzTGKbZbloctj64jkZ57hj5zdraXue6aFgd6PmvVtEyiUU+hvU0v7q08oVv8r8ev0tRo6bvgw==", + "dev": true, + "optional": true }, - "make-iterator": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/make-iterator/-/make-iterator-1.0.1.tgz", - "integrity": "sha512-pxiuXh0iVEq7VM7KMIhs5gxsfxCux2URptUQaXo4iZZJxBAzTPOLE2BumO5dbfVYq/hBJFBR/a1mFDmOx5AGmw==", + "timed-out": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-3.1.3.tgz", + "integrity": "sha512-3RB4qgvPkxF/FGPnrzaWLhW1rxNK2sdH0mFjbhxkfTR6QXvcM3EtYm9L44UrhODZrZ+yhDXeMncLqi8QXn2MJg==", + "dev": true, + "optional": true + }, + "tiny-lr": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/tiny-lr/-/tiny-lr-0.2.1.tgz", + "integrity": "sha512-cmC4iw/nymXg+dc57AQ8Xv3bHxNQOGyQC3Ht5xLN67hksk6ucshrLk/VKiXuMbnZgToQ2NbnICxYj63xVw+Qbw==", "dev": true, "requires": { - "kind-of": "^6.0.2" + "body-parser": "~1.14.0", + "debug": "~2.2.0", + "faye-websocket": "~0.10.0", + "livereload-js": "^2.2.0", + "parseurl": "~1.3.0", + "qs": "~5.1.0" + }, + "dependencies": { + "qs": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-5.1.0.tgz", + "integrity": "sha512-SGDM48EwFLWnYYpNlOkEIRJb4wil5FKJxpR6NVfQjz6qJmX53ki7Xj1cLNEAkb70vUfJmdVLOwODyABgZyDMZw==", + "dev": true + } } }, - "map-cache": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", - "integrity": "sha512-8y/eV9QQZCiyn1SprXSrCmqJN0yNRATe+PO8ztwqrvrbdRLA3eYJF0yaR0YayLWkMbsQSKWS9N2gPcGEc4UsZg==", - "dev": true - }, - "micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "tmp": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz", + "integrity": "sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==", "dev": true, "requires": { - "braces": "^3.0.2", - "picomatch": "^2.3.1" + "rimraf": "^3.0.0" } }, - "minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "to-absolute-glob": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/to-absolute-glob/-/to-absolute-glob-0.1.1.tgz", + "integrity": "sha512-Vvl5x6zNf9iVG1QTWeknmWrKzZxaeKfIDRibrZCR3b2V/2NlFJuD2HV7P7AVjaKLZNqLPHqyr0jGrW0fTcxCPQ==", + "dev": true, "requires": { - "brace-expansion": "^1.1.7" + "extend-shallow": "^2.0.1" } }, - "minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", - "dev": true - }, - "mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "to-buffer": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/to-buffer/-/to-buffer-1.1.1.tgz", + "integrity": "sha512-lx9B5iv7msuFYE3dytT+KE5tap+rNYw+K4jVkb9R/asAb+pbBSM17jtunHplhBe6RRJdZx3Pn2Jph24O32mOVg==", "dev": true }, - "node-wp-i18n": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/node-wp-i18n/-/node-wp-i18n-1.2.6.tgz", - "integrity": "sha512-aLutjDB1rMJ3FNlNcs/XjmaejED1/y30uLYQrmkXpeUj1NH/SA6pI94CUz3iI7fbQd63lTGg0YNvOQAT8cWdIw==", + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", "dev": true, "requires": { - "bluebird": "^3.4.1", - "gettext-parser": "^3.1.0", - "glob": "^7.0.5", - "lodash": "^4.14.2", - "minimist": "^1.2.5", - "mkdirp": "^1.0.4", - "tmp": "^0.2.1" + "is-number": "^7.0.0" } }, - "nopt": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", - "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=", + "tough-cookie": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.4.tgz", + "integrity": "sha512-TZ6TTfI5NtZnuyy/Kecv+CnoROnyXn2DN97LontgQpCwsX2XyLYCC0ENhYkehSOwAp8rTQKc/NUIF7BkQ5rKLA==", "dev": true, + "optional": true, "requires": { - "abbrev": "1" + "punycode": "^1.4.1" } }, - "object.defaults": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/object.defaults/-/object.defaults-1.1.0.tgz", - "integrity": "sha512-c/K0mw/F11k4dEUBMW8naXUuBuhxRCfG7W+yFy8EcijU/rSmazOUd1XAEEe6bC0OuXY4HUKjTJv7xbxIMqdxrA==", + "trim-newlines": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz", + "integrity": "sha512-Nm4cF79FhSTzrLKGDMi3I4utBtFv8qKy4sq1enftf2gMdpqI8oVQTAfySkTz5r49giVzDj88SVZXP4CeYQwjaw==", + "dev": true + }, + "trim-repeated": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/trim-repeated/-/trim-repeated-1.0.0.tgz", + "integrity": "sha512-pkonvlKk8/ZuR0D5tLW8ljt5I8kmxp2XKymhepUeOdCEfKpZaktSArkLHZt76OB1ZvO9bssUsDty4SWhLvZpLg==", "dev": true, + "optional": true, "requires": { - "array-each": "^1.0.1", - "array-slice": "^1.0.0", - "for-own": "^1.0.0", - "isobject": "^3.0.0" + "escape-string-regexp": "^1.0.2" } }, - "object.map": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/object.map/-/object.map-1.0.1.tgz", - "integrity": "sha512-3+mAJu2PLfnSVGHwIWubpOFLscJANBKuB/6A4CxBstc4aqwQY0FWcsppuy4jU5GSB95yES5JHSI+33AWuS4k6w==", + "tunnel-agent": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.4.3.tgz", + "integrity": "sha512-e0IoVDWx8SDHc/hwFTqJDQ7CCDTEeGhmcT9jkWJjoGQSpgBz20nAMr80E3Tpk7PatJ1b37DQDgJR3CNSzcMOZQ==", "dev": true, - "requires": { - "for-own": "^1.0.0", - "make-iterator": "^1.0.0" - } + "optional": true }, - "object.pick": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", - "integrity": "sha512-tqa/UMy/CCoYmj+H5qc07qvSL9dqcs/WZENZ1JbtWBlATP+iVOe778gE6MSijnyCnORzDuX6hU+LA4SZ09YjFQ==", + "tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==", "dev": true, - "requires": { - "isobject": "^3.0.1" - } + "optional": true }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "dev": true, "requires": { - "wrappy": "1" + "media-typer": "0.3.0", + "mime-types": "~2.1.24" } }, - "os-homedir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", - "integrity": "sha512-B5JU3cabzk8c67mRRd3ECmROafjYMXbuzlwtqdM8IbS8ktlTix8aFGb2bAGKrSRIlnfKwovGUUr72JUPyOb6kQ==", + "typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==", "dev": true }, - "os-tmpdir": { + "uglify-to-browserify": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==", + "resolved": "https://registry.npmjs.org/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz", + "integrity": "sha512-vb2s1lYx2xBtUgy+ta+b2J/GLVUR+wmpINwHePmPRhOsIVCG2wDzKJ0n14GslH1BifsqVzSOwQhRaCAsZ/nI4Q==", + "dev": true, + "optional": true + }, + "unc-path-regex": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/unc-path-regex/-/unc-path-regex-0.1.2.tgz", + "integrity": "sha512-eXL4nmJT7oCpkZsHZUOJo8hcX3GbsiDOa0Qu9F646fi8dT3XuSVopVqAcEiVzSKKH7UoDti23wNX3qGFxcW5Qg==", "dev": true }, - "osenv": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz", - "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", + "underscore": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.7.0.tgz", + "integrity": "sha512-cp0oQQyZhUM1kpJDLdGO1jPZHgS/MpzoWYfe9+CM2h/QGDZlqwT2T3YGukuBdaNJ/CAPoeyAZRRHz8JFo176vA==", + "dev": true + }, + "underscore.string": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/underscore.string/-/underscore.string-3.3.6.tgz", + "integrity": "sha512-VoC83HWXmCrF6rgkyxS9GHv8W9Q5nhMKho+OadDJGzL2oDYbYEppBaCMH6pFlwLeqj2QS+hhkw2kpXkSdD1JxQ==", "dev": true, "requires": { - "os-homedir": "^1.0.0", - "os-tmpdir": "^1.0.0" + "sprintf-js": "^1.1.1", + "util-deprecate": "^1.0.2" } }, - "parse-filepath": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/parse-filepath/-/parse-filepath-1.0.2.tgz", - "integrity": "sha512-FwdRXKCohSVeXqwtYonZTXtbGJKrn+HNyWDYVcp5yuJlesTwNH4rsmRZ+GrKAPJ5bLpRxESMeS+Rl0VCHRvB2Q==", + "unique-stream": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/unique-stream/-/unique-stream-2.3.1.tgz", + "integrity": "sha512-2nY4TnBE70yoxHkDli7DMazpWiP7xMdCYqU2nBRO0UB+ZpEkGsSija7MvmvnZFUeC+mrgiUfcHSr3LmRFIg4+A==", "dev": true, "requires": { - "is-absolute": "^1.0.0", - "map-cache": "^0.2.0", - "path-root": "^0.1.1" + "json-stable-stringify-without-jsonify": "^1.0.1", + "through2-filter": "^3.0.0" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "dev": true, + "requires": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + }, + "through2-filter": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/through2-filter/-/through2-filter-3.0.0.tgz", + "integrity": "sha512-jaRjI2WxN3W1V8/FMZ9HKIBXixtiqs3SQSX4/YGIiP3gL6djW48VoZq9tDqeCWs3MT8YY5wb/zli8VW8snY1CA==", + "dev": true, + "requires": { + "through2": "~2.0.0", + "xtend": "~4.0.0" + } + } } }, - "parse-passwd": { + "unpipe": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", - "integrity": "sha512-1Y1A//QUXEZK7YKz+rD9WydcE1+EuPr6ZBgKecAB8tmoW6UFv0NREVJe1p+jRxtThkcbbKkfwIbWJe/IeE6m2Q==", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", "dev": true }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" + "unzip-response": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/unzip-response/-/unzip-response-1.0.2.tgz", + "integrity": "sha512-pwCcjjhEcpW45JZIySExBHYv5Y9EeL2OIGEfrSKp2dMUFGFv4CpvZkwJbVge8OvGH2BNNtJBx67DuKuJhf+N5Q==", + "dev": true, + "optional": true }, - "path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "uri-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/uri-path/-/uri-path-1.0.0.tgz", + "integrity": "sha512-8pMuAn4KacYdGMkFaoQARicp4HSw24/DHOVKWqVRJ8LhhAwPPFpdGvdL9184JVmUwe7vz7Z9n6IqI6t5n2ELdg==", "dev": true }, - "path-root": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/path-root/-/path-root-0.1.1.tgz", - "integrity": "sha512-QLcPegTHF11axjfojBIoDygmS2E3Lf+8+jI6wOVmNVenrKSo3mFdSGiIgdSHenczw3wPtlVMQaFVwGmM7BJdtg==", + "url-parse-lax": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-1.0.0.tgz", + "integrity": "sha512-BVA4lR5PIviy2PMseNd2jbFQ+jwSwQGdJejf5ctd1rEXt0Ypd7yanUK9+lYechVlN5VaTJGsu2U/3MDDu6KgBA==", "dev": true, + "optional": true, "requires": { - "path-root-regex": "^0.1.0" + "prepend-http": "^1.0.1" } }, - "path-root-regex": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/path-root-regex/-/path-root-regex-0.1.2.tgz", - "integrity": "sha512-4GlJ6rZDhQZFE0DPVKh0e9jmZ5egZfxTkp7bcRDuPlJXbAwhxcl2dINPUAsjLdejqaLsCeg8axcLjIbvBjN4pQ==", + "url-regex": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/url-regex/-/url-regex-3.2.0.tgz", + "integrity": "sha512-dQ9cJzMou5OKr6ZzfvwJkCq3rC72PNXhqz0v3EIhF4a3Np+ujr100AhUx2cKx5ei3iymoJpJrPB3sVSEMdqAeg==", + "dev": true, + "optional": true, + "requires": { + "ip-regex": "^1.0.1" + } + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", "dev": true }, - "picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "uuid": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-2.0.3.tgz", + "integrity": "sha512-FULf7fayPdpASncVy4DLh3xydlXEJJpvIELjYjNeQWYUZ9pclcpvCZSr2gkmN2FrrGcI7G/cJsIEwk5/8vfXpg==", "dev": true }, - "readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "v8flags": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-3.2.0.tgz", + "integrity": "sha512-mH8etigqMfiGWdeXpaaqGfs6BndypxusHHcv2qSHyZkGEznCd/qAXCWWRzeowtL54147cktFOC4P5y+kl8d8Jg==", "dev": true, "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" + "homedir-polyfill": "^1.0.1" } }, - "rechoir": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.7.1.tgz", - "integrity": "sha512-/njmZ8s1wVeR6pjTZ+0nCnv8SpZNRMT2D1RLOJQESlYFDBvwpTA4KWJpZ+sBJ4+vhjILRcK7JIFdGCdxEAAitg==", + "vali-date": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/vali-date/-/vali-date-1.0.0.tgz", + "integrity": "sha512-sgECfZthyaCKW10N0fm27cg8HYTFK5qMWgypqkXMQ4Wbl/zZKx7xZICgcoxIIE+WFAP/MBL2EFwC/YvLxw3Zeg==", + "dev": true + }, + "validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", "dev": true, "requires": { - "resolve": "^1.9.0" + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" } }, - "remove-trailing-separator": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", - "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", - "dev": true + "verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==", + "dev": true, + "optional": true, + "requires": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==", + "dev": true, + "optional": true + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==", + "dev": true, + "optional": true + } + } }, - "resolve": { - "version": "1.22.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.0.tgz", - "integrity": "sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw==", + "vinyl": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-1.2.0.tgz", + "integrity": "sha512-Ci3wnR2uuSAWFMSglZuB8Z2apBdtOyz8CV7dC6/U1XbltXBC+IuutUkXQISz01P+US2ouBuesSbV6zILZ6BuzQ==", "dev": true, "requires": { - "is-core-module": "^2.8.1", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" + "clone": "^1.0.0", + "clone-stats": "^0.0.1", + "replace-ext": "0.0.1" } }, - "resolve-dir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz", - "integrity": "sha512-R7uiTjECzvOsWSfdM0QKFNBVFcK27aHOUwdvK53BcW8zqnGdYp0Fbj82cy54+2A4P2tFM22J5kRfe1R+lM/1yg==", + "vinyl-assign": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/vinyl-assign/-/vinyl-assign-1.2.1.tgz", + "integrity": "sha512-jUVK1MkXgsZDdyUAy0rnrcmPeuR/ZLwsaS377zaaciz9SoDRVPIjHlUcYVcUAzLD+AolsLxMMwSe/VP77lAvow==", "dev": true, + "optional": true, "requires": { - "expand-tilde": "^2.0.0", - "global-modules": "^1.0.0" + "object-assign": "^4.0.1", + "readable-stream": "^2.0.0" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dev": true, + "optional": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true, + "optional": true + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "optional": true, + "requires": { + "safe-buffer": "~5.1.0" + } + } } }, - "rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "vinyl-fs": { + "version": "2.4.4", + "resolved": "https://registry.npmjs.org/vinyl-fs/-/vinyl-fs-2.4.4.tgz", + "integrity": "sha512-lxMlQW/Wxk/pwhooY3Ut0Q11OH5ZvZfV0Gg1c306fBNWznQ6ZeQaCdE7XX0O/PpGSqgAsHMBxwFgcGxiYW3hZg==", "dev": true, "requires": { - "glob": "^7.1.3" + "duplexify": "^3.2.0", + "glob-stream": "^5.3.2", + "graceful-fs": "^4.0.0", + "gulp-sourcemaps": "1.6.0", + "is-valid-glob": "^0.3.0", + "lazystream": "^1.0.0", + "lodash.isequal": "^4.0.0", + "merge-stream": "^1.0.0", + "mkdirp": "^0.5.0", + "object-assign": "^4.0.0", + "readable-stream": "^2.0.4", + "strip-bom": "^2.0.0", + "strip-bom-stream": "^1.0.0", + "through2": "^2.0.0", + "through2-filter": "^2.0.0", + "vali-date": "^1.0.0", + "vinyl": "^1.0.0" + }, + "dependencies": { + "minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true + }, + "mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "dev": true, + "requires": { + "minimist": "^1.2.6" + } + }, + "readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "dev": true, + "requires": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + } } }, - "safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true - }, - "safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true - }, - "spdx-exceptions": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.1.0.tgz", - "integrity": "sha512-4K1NsmrlCU1JJgUrtgEeTVyfx8VaYea9J9LvARxhbHtVtohPs/gFGG5yy49beySjlIMhhXZ4QqujIZEfS4l6Cg==", - "dev": true - }, - "sprintf-js": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.2.tgz", - "integrity": "sha512-VE0SOVEHCk7Qc8ulkWw3ntAzXuqf7S2lvwQaDLRnUeIEaKNQJzV6BwmLKhOqT61aGhfUMrXeaBk+oDGCzvhcug==", + "walkdir": { + "version": "0.0.11", + "resolved": "https://registry.npmjs.org/walkdir/-/walkdir-0.0.11.tgz", + "integrity": "sha512-lMFYXGpf7eg+RInVL021ZbJJT4hqsvsBvq5sZBp874jfhs3IWlA7OPoG0ojQrYcXHuUSi+Nqp6qGN+pPGaMgPQ==", "dev": true }, - "string_decoder": { + "ware": { "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "resolved": "https://registry.npmjs.org/ware/-/ware-1.3.0.tgz", + "integrity": "sha512-Y2HUDMktriUm+SR2gZWxlrszcgtXExlhQYZ8QJNYbl22jum00KIUcHJ/h/sdAXhWTJcbSkiMYN9Z2tWbWYSrrw==", "dev": true, + "optional": true, "requires": { - "safe-buffer": "~5.2.0" + "wrap-fn": "^0.1.0" } }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "websocket-driver": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", + "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==", "dev": true, "requires": { - "has-flag": "^4.0.0" + "http-parser-js": ">=0.5.1", + "safe-buffer": ">=5.1.0", + "websocket-extensions": ">=0.1.1" } }, - "supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "websocket-extensions": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", + "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==", "dev": true }, - "tmp": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz", - "integrity": "sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==", + "whet.extend": { + "version": "0.9.9", + "resolved": "https://registry.npmjs.org/whet.extend/-/whet.extend-0.9.9.tgz", + "integrity": "sha512-mmIPAft2vTgEILgPeZFqE/wWh24SEsR/k+N9fJ3Jxrz44iDFy9aemCxdksfURSHYFCLmvs/d/7Iso5XjPpNfrA==", "dev": true, - "requires": { - "rimraf": "^3.0.0" - } + "optional": true }, - "to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", "dev": true, "requires": { - "is-number": "^7.0.0" + "isexe": "^2.0.0" } }, - "unc-path-regex": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/unc-path-regex/-/unc-path-regex-0.1.2.tgz", - "integrity": "sha512-eXL4nmJT7oCpkZsHZUOJo8hcX3GbsiDOa0Qu9F646fi8dT3XuSVopVqAcEiVzSKKH7UoDti23wNX3qGFxcW5Qg==", + "window-size": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz", + "integrity": "sha512-1pTPQDKTdd61ozlKGNCjhNRd+KPmgLSGa3mZTHoOliaGcESD8G1PXhh7c1fgiPjVbNVfgy2Faw4BI8/m0cC8Mg==", "dev": true }, - "underscore.string": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/underscore.string/-/underscore.string-3.3.6.tgz", - "integrity": "sha512-VoC83HWXmCrF6rgkyxS9GHv8W9Q5nhMKho+OadDJGzL2oDYbYEppBaCMH6pFlwLeqj2QS+hhkw2kpXkSdD1JxQ==", + "wordwrap": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz", + "integrity": "sha512-xSBsCeh+g+dinoBv3GAOWM4LcVVO68wLXRanibtBSdUvkGWQRGeE9P7IwU9EmDDi4jA6L44lz15CGMwdw9N5+Q==", + "dev": true + }, + "wrap-fn": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/wrap-fn/-/wrap-fn-0.1.5.tgz", + "integrity": "sha512-xDLdGx0M8JQw9QDAC9s5NUxtg9MI09F6Vbxa2LYoSoCvzJnx2n81YMIfykmXEGsUvuLaxnblJTzhSOjUOX37ag==", "dev": true, + "optional": true, "requires": { - "sprintf-js": "^1.1.1", - "util-deprecate": "^1.0.2" + "co": "3.1.0" } }, - "util-deprecate": { + "wrappy": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" + }, + "xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", "dev": true }, - "v8flags": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-3.2.0.tgz", - "integrity": "sha512-mH8etigqMfiGWdeXpaaqGfs6BndypxusHHcv2qSHyZkGEznCd/qAXCWWRzeowtL54147cktFOC4P5y+kl8d8Jg==", + "yargs": { + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz", + "integrity": "sha512-QFzUah88GAGy9lyDKGBqZdkYApt63rCXYBGYnEP4xDJPXNqXXnBDACnbrXnViV6jRSqAePwrATi2i8mfYm4L1A==", "dev": true, "requires": { - "homedir-polyfill": "^1.0.1" + "camelcase": "^1.0.2", + "cliui": "^2.1.0", + "decamelize": "^1.0.0", + "window-size": "0.1.0" + }, + "dependencies": { + "camelcase": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", + "integrity": "sha512-wzLkDa4K/mzI1OSITC+DUyjgIl/ETNHE9QvYgy6J6Jvqyyz4C0Xfd+lQhb19sX2jMpZV4IssUn0VDVmglV+s4g==", + "dev": true + } } }, - "which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "yauzl": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", + "integrity": "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==", "dev": true, + "optional": true, "requires": { - "isexe": "^2.0.0" + "buffer-crc32": "~0.2.3", + "fd-slicer": "~1.1.0" } }, - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + "zip-stream": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/zip-stream/-/zip-stream-1.2.0.tgz", + "integrity": "sha512-2olrDUuPM4NvRIgGPhvrp84f7/HmWR6RiQrgwFF2VctmnssFiogtYL3DcA8Vl2bsSmju79sVXe38TsII7JleUg==", + "dev": true, + "requires": { + "archiver-utils": "^1.3.0", + "compress-commons": "^1.2.0", + "lodash": "^4.8.0", + "readable-stream": "^2.0.0" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + } + } } } } diff --git a/package.json b/package.json index 8727c4255..26f34520d 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "wp-user-frontend", - "version": "3.6.0", + "version": "4.0.6", "description": "A Frontend Plugin for WordPress", "author": "Tareq Hasan", "license": "GPL", diff --git a/phpcs.xml.dist b/phpcs.xml.dist index 5187c67a5..24eaa87e0 100644 --- a/phpcs.xml.dist +++ b/phpcs.xml.dist @@ -3,16 +3,25 @@ Generally-applicable sniffs for WordPress plugins. - . - */assets/* + . + */.git/* + */.githooks/* + */.make/* + */assets/* */src/* */lib/* + */dist/* */build/* */node_modules/* */vendor/* */tests/* - */bin/* - */templates/* + *.js + *.mo + *.po + *.twig + *.css + *.scss + languages/* @@ -39,9 +48,11 @@ - - - + + + + + @@ -94,9 +105,6 @@ error - - error - 0 @@ -109,7 +117,7 @@ 0 - + 0 diff --git a/readme.md b/readme.md index 423af47e1..d870726b3 100644 --- a/readme.md +++ b/readme.md @@ -1,11 +1,11 @@ # WP User Frontend - Registration, User Profile, Membership, Content Restriction, User Directory, and Frontend Post Submission Plugin # **Contributors:** [tareq1988](https://profiles.wordpress.org/tareq1988), [nizamuddinbabu](https://profiles.wordpress.org/nizamuddinbabu), [wedevs](https://profiles.wordpress.org/wedevs) **Donate link:** https://tareq.co/donate/ -**Tags:** Forms, registration, profile-builder, login, membership, frontend-post +**Tags:** frontend post, content restriction, registration, user profile, membership, login, forms, user directory, profile builder **Requires at least:** 4.0 -**Tested up to:** 6.1.1 +**Tested up to:** 6.4.3 +**Stable tag:** 4.0.6 **Requires PHP:** 5.6 -**Stable tag:** 3.6.0 **License:** GPLv2 **License URI:** https://www.gnu.org/licenses/gpl-2.0.html @@ -126,32 +126,32 @@ Try an Online Demo of the FREE & P WP User Frontend PRO – Premium Features -* 20+ Modules [BuddyPress, Paid Memberships Pro, Social Login, User Directory, User Activity, Stripe, MailChimp, Private Messaging, HTML Email Templates & more] -* Content restriction: Restrict or lock your exclusive content or pages or just a specific part of a content, based on registration, user roles, or subscriptions. -* Menu restriction: Lock or hide your website's menu links for certain users based on user roles, registration, or subscriptions. -* Post expiration facility: Automatically take down published posts on your sites after a given time based on subscription packs or specific forms. -* Conditional logic: Use conditional logic in your forms to show or hide fields, sections, and pages based on user selections. -* Profile form builder: Build your own custom profile form with as many fields you need. -* 20+ custom fields: Utilize fields like Text, Text Area, Dropdown, Multi Select, Hidden, Repeat, Phone, Time, Google Maps, and a lot more to customize your forms according to your requirements. -* Custom taxonomy support: Use custom taxonomies for WooCommerce products. Use them as drop-down, multi-select, or check-box lists. -* Post update notification: Get notified through email when an author updates a new post. Make the notification email dynamic using shortcodes. -* Multistep forms: Break down a form in multi steps easily from its settings. -* Payment invoice: For every successful transaction, an invoice is generated and emailed to the user. You can customize several fields of the invoice. -* Coupons: Create and manage coupons for your Subscription Packs. -* Personalized forms: Create different registration and profile edit forms for different user roles. -* User profiles in backend: The custom elements you create in Profile Forms are generated in the admin profile area too. -* Taxonomy restriction: Restrict users to post on a taxonomy/category based on subscription packs. -* Form layouts and form templates: Quickly create forms from pre-defined templates. Drag-and-drop fields to customize it further. Vendor registration templates are available for Dokan, WC Marketplace, and WC Vendors. -* WooCommerce support: Create a frontend interface to post and manage products of your WooCommerce powered site. -* Registration form builder: Use templates or build with your own set of registration elements to register users on your site. -* Assign new roles to forms: Create different registration forms for different user roles. New users will be assigned the role according to the form they used. -* Captcha support: Prevent bots and spam attacks using Google reCAPTCHA or Really Simple CAPTCHA. -* Update user profile information from frontend: No need to go to the backend to update your profile, do it from frontend. -* Files & attachments upload: Let users upload files and attachments or embed playable audio & video files using Post Forms. -* Avatar upload: Let users upload profile pictures. It supports Gravatar and locally uploaded avatars work side by side. -* Frontend Customizer: Allows admins to customize colors and labels for some important frontend elements and features of WPUF. -* More email notification options: Configure email notifications for the important events. -* Tax in payments: Apply custom country and state-wise tax rates to: Pay Per Post Forms and +* **20+ Modules** [BuddyPress, Paid Memberships Pro, Social Login, User Directory, User Activity, Stripe, MailChimp, Private Messaging, HTML Email Templates & more] +* **Content restriction:** Restrict or lock your exclusive content or pages or just a specific part of a content, based on registration, user roles, or subscriptions. +* **Menu restriction:** Lock or hide your website's menu links for certain users based on user roles, registration, or subscriptions. +* **Post expiration facility:** Automatically take down published posts on your sites after a given time based on subscription packs or specific forms. +* **Conditional logic:** Use conditional logic in your forms to show or hide fields, sections, and pages based on user selections. +* **Profile form builder:** Build your own custom profile form with as many fields you need. +* **20+ custom fields:** Utilize fields like Text, Text Area, Dropdown, Multi Select, Hidden, Repeat, Phone, Time, Google Maps, and a lot more to customize your forms according to your requirements. +* **Custom taxonomy support:** Use custom taxonomies for WooCommerce products. Use them as drop-down, multi-select, or check-box lists. +* **Post update notification:** Get notified through email when an author updates a new post. Make the notification email dynamic using shortcodes. +* **Multistep forms:** Break down a form in multi steps easily from its settings. +* **Payment invoice:** For every successful transaction, an invoice is generated and emailed to the user. You can customize several fields of the invoice. +* **Coupons:** Create and manage coupons for your Subscription Packs. +* **Personalized forms:** Create different registration and profile edit forms for different user roles. +* **User profiles in backend:** The custom elements you create in Profile Forms are generated in the admin profile area too. +* **Taxonomy restriction:** Restrict users to post on a taxonomy/category based on subscription packs. +* **Form layouts and form templates:** Quickly create forms from pre-defined templates. Drag-and-drop fields to customize it further. Vendor registration templates are available for Dokan, WC Marketplace, and WC Vendors. +* **WooCommerce support:** Create a frontend interface to post and manage products of your WooCommerce powered site. +* **Registration form builder:** Use templates or build with your own set of registration elements to register users on your site. +* **Assign new roles to forms:** Create different registration forms for different user roles. New users will be assigned the role according to the form they used. +* **CAPTCHA support:** Prevent bots and spam attacks using Google reCAPTCHA or Really Simple CAPTCHA. +* **Update user profile information from frontend:** No need to go to the backend to update your profile, do it from frontend. +* **Files & attachments upload:** Let users upload files and attachments or embed playable audio & video files using Post Forms. +* **Avatar upload:** Let users upload profile pictures. It supports Gravatar and locally uploaded avatars work side by side. +* **Frontend Customizer:** Allows admins to customize colors and labels for some important frontend elements and features of WPUF. +* **More email notification options:** Configure email notifications for the important events. +* **Tax in payments:** Apply custom country and state-wise tax rates to: Pay Per Post Forms and Subscription Packs. Premium Modules @@ -213,6 +213,39 @@ After having installed the plugin: ### Video ### [youtube https://www.youtube.com/watch?v=rzxdIN8ZMYc] +## Frequently Asked Questions ## + +### Can I create new posts from frontend ### + +Yes + +### Can I Edit my posts from frontend ### + +Yes + +### Can I delete my posts from frontend ### + +Yes + +### Can I upload photo/image/video ### + +Yes + +### I am having problem with uploading files ### + +Please check if you've specified the max upload size on setting + +### Why "Edit Post" page shows "invalid post id"? ### + +This page is for the purpose of editing posts. You shouldn't access this page directly. +First you need to go to the dashboard, then when you click "edit", you'll be +redirected to the edit page with that post id. Then you'll see the edit post form. + +### ### + + + + ## Screenshots ## 1. Create Forms with Powerful Builders @@ -234,32 +267,104 @@ After having installed the plugin: 17. Login, Restriction, Frontend Security 18. Set Payment Related Options -## Frequently Asked Questions ## +## Changelog ## +### v4.0.6 (13 Feb, 2024) ### +* Enhance - Update deprecated uses for PHP versions and latest WordPress +* Enhance - Eye icon inside password field +* Fix - Error after PayPal payment +* Fix - Reset password not working +* Fix - Subscription posting restriction not working -### Can I create new posts from frontend ### +### v4.0.5 (31 Jan, 2024) ### +* Enhance - Integrate headway and canny -Yes +### v4.0.4 (25 Jan, 2024) ### +* Enhance - Add visibility to the Columns field +* Fix - Login with reCAPTCHA gives error +* Fix - AJAX image upload +* Fix - Error on multi select form custom taxonomy +* Fix - Frontend registration form is not showing +* Fix - Handle email for guest post +* Fix - Default form template not selecting +* Fix - Error in setup wizard -### Can I Edit my posts from frontend ### +### v4.0.3 (05 Jan, 2024) ### +* Enhance - Restructure plugin codes +* Fix - Error when editing the featured post +* Fix - add/edit post forms if the site language is set to Simplified Chinese +* Fix - Errors with Post Form Conditional Logic -Yes +### v4.0.2 (03 Jan, 2024) ### +* Enhance - Restructure plugin codes +* Fix - Error when editing the featured post +* Fix - add/edit post forms if the site language is set to Simplified Chinese +* Fix - Errors with Post Form Conditional Logic -### Can I delete my posts from frontend ### +### v4.0.1 (03 Jan, 2024) ### +* Enhance - Restructure plugin codes +* Fix - Error when editing the featured post +* Fix - add/edit post forms if the site language is set to Simplified Chinese +* Fix - Errors with Post Form Conditional Logic -Yes +### v4.0.0 (02 Jan, 2024) ### +* Enhance - Restructure plugin codes +* Fix - Error when editing the featured post +* Fix - add/edit post forms if the site language is set to Simplified Chinese +* Fix - Errors with Post Form Conditional Logic -### Can I upload photo/image/video ### -Yes +### v3.6.9 (11 Sep, 2023) ### +* Enhance - add capabilities check on AJAX actions -### I am having problem with uploading files ### -Please check if you've specified the max upload size on setting +### v3.6.8 (31 Aug, 2023) ### +* Fix - Delete upload file even after clicking cancel button +* Fix - Taxonomy data not showing for checkbox +* Fix - Some validation for AJAX actions -### Why "Edit Post" page shows "invalid post id"? ### -This page is for the purpose of editing posts. You shouldn't access this page directly. -First you need to go to the dashboard, then when you click "edit", you'll be -redirected to the edit page with that post id. Then you'll see the edit post form. +### v3.6.7 (09 Aug, 2023) ### + +* Fix - conflicts with Advanced Custom Fields Pro Plugin +* Fix - conflicts with the Classic Editor Plugin +* Fix - multiple HTML field inside column field + +### v3.6.6 (27 Jul, 2023) ### + +* Enhancement - Restrict shortcode in post form +* Enhancement - Add custom note on plugin update page + +### v3.6.5 (25 May, 2023) ### + +* Enhancement - Revamp registration page design + +* Fix - Expiration time not showing for admin +* Fix - Error when editing user profile + +### v3.6.4 (4 Apr, 2023) ### + +* Fix - Post submission for dokan vendors +* Fix - Paypal transaction not showing +* Fix - Predefined category field not working +* Fix - Field visibility not working + +### v3.6.3 (13 Feb, 2023) ### + +* Fix - Error if Dokan not installed +* Fix - Style conflict with LearnPress + +### v3.6.2 (8 Feb, 2023) ### + +* Fix - Post submission for the Dokan Vendors + +### v3.6.1 (2 Jan, 2023) ### + +* Enhancement - Add responsiveness to the upgrade-to-pro popup widget +* Enhancement - Update Appsero SDK to the latest version +* Enhancement - warning before updating a subscription package + +* Fix - Subscription shouldn't be editable from user's profile +* Fix - Text field append '0' when character exceeds content restriction limit +* Fix - Fields within column doesn't behave as expected in forms +* Fix - Change sweetalert2 to v11.4.19 to remove anti-war message -## Changelog ## ### v3.6.0 (23 Nov, 2022) ### * Enhancement - Admin dashboard news and update meta-box added @@ -272,7 +377,7 @@ redirected to the edit page with that post id. Then you'll see the edit post for * Update - sweetalert2 version -v3.5.29 (15 Sep, 2022) = +### v3.5.29 (15 Sep, 2022) ### * Enhancement - Short-code encryption updated for registration page diff --git a/readme.txt b/readme.txt index 0d1f0efd7..bf6fd5c99 100644 --- a/readme.txt +++ b/readme.txt @@ -1,11 +1,11 @@ === WP User Frontend - Registration, User Profile, Membership, Content Restriction, User Directory, and Frontend Post Submission Plugin === Contributors: tareq1988, nizamuddinbabu, wedevs Donate link: https://tareq.co/donate/ -Tags: Forms, registration, profile-builder, login, membership, frontend-post +Tags: frontend post, content restriction, registration, user profile, membership, login, forms, user directory, profile builder Requires at least: 4.0 -Tested up to: 6.1.1 +Tested up to: 6.4.3 +Stable tag: 4.0.6 Requires PHP: 5.6 -Stable tag: 3.6.0 License: GPLv2 License URI: https://www.gnu.org/licenses/gpl-2.0.html @@ -126,32 +126,32 @@ Try an Online Demo of the FREE & P WP User Frontend PRO – Premium Features -* 20+ Modules [BuddyPress, Paid Memberships Pro, Social Login, User Directory, User Activity, Stripe, MailChimp, Private Messaging, HTML Email Templates & more] -* Content restriction: Restrict or lock your exclusive content or pages or just a specific part of a content, based on registration, user roles, or subscriptions. -* Menu restriction: Lock or hide your website's menu links for certain users based on user roles, registration, or subscriptions. -* Post expiration facility: Automatically take down published posts on your sites after a given time based on subscription packs or specific forms. -* Conditional logic: Use conditional logic in your forms to show or hide fields, sections, and pages based on user selections. -* Profile form builder: Build your own custom profile form with as many fields you need. -* 20+ custom fields: Utilize fields like Text, Text Area, Dropdown, Multi Select, Hidden, Repeat, Phone, Time, Google Maps, and a lot more to customize your forms according to your requirements. -* Custom taxonomy support: Use custom taxonomies for WooCommerce products. Use them as drop-down, multi-select, or check-box lists. -* Post update notification: Get notified through email when an author updates a new post. Make the notification email dynamic using shortcodes. -* Multistep forms: Break down a form in multi steps easily from its settings. -* Payment invoice: For every successful transaction, an invoice is generated and emailed to the user. You can customize several fields of the invoice. -* Coupons: Create and manage coupons for your Subscription Packs. -* Personalized forms: Create different registration and profile edit forms for different user roles. -* User profiles in backend: The custom elements you create in Profile Forms are generated in the admin profile area too. -* Taxonomy restriction: Restrict users to post on a taxonomy/category based on subscription packs. -* Form layouts and form templates: Quickly create forms from pre-defined templates. Drag-and-drop fields to customize it further. Vendor registration templates are available for Dokan, WC Marketplace, and WC Vendors. -* WooCommerce support: Create a frontend interface to post and manage products of your WooCommerce powered site. -* Registration form builder: Use templates or build with your own set of registration elements to register users on your site. -* Assign new roles to forms: Create different registration forms for different user roles. New users will be assigned the role according to the form they used. -* Captcha support: Prevent bots and spam attacks using Google reCAPTCHA or Really Simple CAPTCHA. -* Update user profile information from frontend: No need to go to the backend to update your profile, do it from frontend. -* Files & attachments upload: Let users upload files and attachments or embed playable audio & video files using Post Forms. -* Avatar upload: Let users upload profile pictures. It supports Gravatar and locally uploaded avatars work side by side. -* Frontend Customizer: Allows admins to customize colors and labels for some important frontend elements and features of WPUF. -* More email notification options: Configure email notifications for the important events. -* Tax in payments: Apply custom country and state-wise tax rates to: Pay Per Post Forms and +* **20+ Modules** [BuddyPress, Paid Memberships Pro, Social Login, User Directory, User Activity, Stripe, MailChimp, Private Messaging, HTML Email Templates & more] +* **Content restriction:** Restrict or lock your exclusive content or pages or just a specific part of a content, based on registration, user roles, or subscriptions. +* **Menu restriction:** Lock or hide your website's menu links for certain users based on user roles, registration, or subscriptions. +* **Post expiration facility:** Automatically take down published posts on your sites after a given time based on subscription packs or specific forms. +* **Conditional logic:** Use conditional logic in your forms to show or hide fields, sections, and pages based on user selections. +* **Profile form builder:** Build your own custom profile form with as many fields you need. +* **20+ custom fields:** Utilize fields like Text, Text Area, Dropdown, Multi Select, Hidden, Repeat, Phone, Time, Google Maps, and a lot more to customize your forms according to your requirements. +* **Custom taxonomy support:** Use custom taxonomies for WooCommerce products. Use them as drop-down, multi-select, or check-box lists. +* **Post update notification:** Get notified through email when an author updates a new post. Make the notification email dynamic using shortcodes. +* **Multistep forms:** Break down a form in multi steps easily from its settings. +* **Payment invoice:** For every successful transaction, an invoice is generated and emailed to the user. You can customize several fields of the invoice. +* **Coupons:** Create and manage coupons for your Subscription Packs. +* **Personalized forms:** Create different registration and profile edit forms for different user roles. +* **User profiles in backend:** The custom elements you create in Profile Forms are generated in the admin profile area too. +* **Taxonomy restriction:** Restrict users to post on a taxonomy/category based on subscription packs. +* **Form layouts and form templates:** Quickly create forms from pre-defined templates. Drag-and-drop fields to customize it further. Vendor registration templates are available for Dokan, WC Marketplace, and WC Vendors. +* **WooCommerce support:** Create a frontend interface to post and manage products of your WooCommerce powered site. +* **Registration form builder:** Use templates or build with your own set of registration elements to register users on your site. +* **Assign new roles to forms:** Create different registration forms for different user roles. New users will be assigned the role according to the form they used. +* **CAPTCHA support:** Prevent bots and spam attacks using Google reCAPTCHA or Really Simple CAPTCHA. +* **Update user profile information from frontend:** No need to go to the backend to update your profile, do it from frontend. +* **Files & attachments upload:** Let users upload files and attachments or embed playable audio & video files using Post Forms. +* **Avatar upload:** Let users upload profile pictures. It supports Gravatar and locally uploaded avatars work side by side. +* **Frontend Customizer:** Allows admins to customize colors and labels for some important frontend elements and features of WPUF. +* **More email notification options:** Configure email notifications for the important events. +* **Tax in payments:** Apply custom country and state-wise tax rates to: Pay Per Post Forms and Subscription Packs. Premium Modules @@ -213,6 +213,39 @@ After having installed the plugin: = Video = [youtube https://www.youtube.com/watch?v=rzxdIN8ZMYc] +== Frequently Asked Questions == + += Can I create new posts from frontend = + +Yes + += Can I Edit my posts from frontend = + +Yes + += Can I delete my posts from frontend = + +Yes + += Can I upload photo/image/video = + +Yes + += I am having problem with uploading files = + +Please check if you've specified the max upload size on setting + += Why "Edit Post" page shows "invalid post id"? = + +This page is for the purpose of editing posts. You shouldn't access this page directly. +First you need to go to the dashboard, then when you click "edit", you'll be +redirected to the edit page with that post id. Then you'll see the edit post form. + += = + + + + == Screenshots == 1. Create Forms with Powerful Builders @@ -234,32 +267,104 @@ After having installed the plugin: 17. Login, Restriction, Frontend Security 18. Set Payment Related Options -== Frequently Asked Questions == +== Changelog == += v4.0.6 (13 Feb, 2024) = +* Enhance - Update deprecated uses for PHP versions and latest WordPress +* Enhance - Eye icon inside password field +* Fix - Error after PayPal payment +* Fix - Reset password not working +* Fix - Subscription posting restriction not working -= Can I create new posts from frontend = += v4.0.5 (31 Jan, 2024) = +* Enhance - Integrate headway and canny -Yes += v4.0.4 (25 Jan, 2024) = +* Enhance - Add visibility to the Columns field +* Fix - Login with reCAPTCHA gives error +* Fix - AJAX image upload +* Fix - Error on multi select form custom taxonomy +* Fix - Frontend registration form is not showing +* Fix - Handle email for guest post +* Fix - Default form template not selecting +* Fix - Error in setup wizard -= Can I Edit my posts from frontend = += v4.0.3 (05 Jan, 2024) = +* Enhance - Restructure plugin codes +* Fix - Error when editing the featured post +* Fix - add/edit post forms if the site language is set to Simplified Chinese +* Fix - Errors with Post Form Conditional Logic -Yes += v4.0.2 (03 Jan, 2024) = +* Enhance - Restructure plugin codes +* Fix - Error when editing the featured post +* Fix - add/edit post forms if the site language is set to Simplified Chinese +* Fix - Errors with Post Form Conditional Logic -= Can I delete my posts from frontend = += v4.0.1 (03 Jan, 2024) = +* Enhance - Restructure plugin codes +* Fix - Error when editing the featured post +* Fix - add/edit post forms if the site language is set to Simplified Chinese +* Fix - Errors with Post Form Conditional Logic -Yes += v4.0.0 (02 Jan, 2024) = +* Enhance - Restructure plugin codes +* Fix - Error when editing the featured post +* Fix - add/edit post forms if the site language is set to Simplified Chinese +* Fix - Errors with Post Form Conditional Logic -= Can I upload photo/image/video = -Yes += v3.6.9 (11 Sep, 2023) = +* Enhance - add capabilities check on AJAX actions -= I am having problem with uploading files = -Please check if you've specified the max upload size on setting += v3.6.8 (31 Aug, 2023) = +* Fix - Delete upload file even after clicking cancel button +* Fix - Taxonomy data not showing for checkbox +* Fix - Some validation for AJAX actions -= Why "Edit Post" page shows "invalid post id"? = -This page is for the purpose of editing posts. You shouldn't access this page directly. -First you need to go to the dashboard, then when you click "edit", you'll be -redirected to the edit page with that post id. Then you'll see the edit post form. += v3.6.7 (09 Aug, 2023) = + +* Fix - conflicts with Advanced Custom Fields Pro Plugin +* Fix - conflicts with the Classic Editor Plugin +* Fix - multiple HTML field inside column field + += v3.6.6 (27 Jul, 2023) = + +* Enhancement - Restrict shortcode in post form +* Enhancement - Add custom note on plugin update page + += v3.6.5 (25 May, 2023) = + +* Enhancement - Revamp registration page design + +* Fix - Expiration time not showing for admin +* Fix - Error when editing user profile + += v3.6.4 (4 Apr, 2023) = + +* Fix - Post submission for dokan vendors +* Fix - Paypal transaction not showing +* Fix - Predefined category field not working +* Fix - Field visibility not working + += v3.6.3 (13 Feb, 2023) = + +* Fix - Error if Dokan not installed +* Fix - Style conflict with LearnPress + += v3.6.2 (8 Feb, 2023) = + +* Fix - Post submission for the Dokan Vendors + += v3.6.1 (2 Jan, 2023) = + +* Enhancement - Add responsiveness to the upgrade-to-pro popup widget +* Enhancement - Update Appsero SDK to the latest version +* Enhancement - warning before updating a subscription package + +* Fix - Subscription shouldn't be editable from user's profile +* Fix - Text field append '0' when character exceeds content restriction limit +* Fix - Fields within column doesn't behave as expected in forms +* Fix - Change sweetalert2 to v11.4.19 to remove anti-war message -== Changelog == = v3.6.0 (23 Nov, 2022) = * Enhancement - Admin dashboard news and update meta-box added @@ -272,7 +377,7 @@ redirected to the edit page with that post id. Then you'll see the edit post for * Update - sweetalert2 version -v3.5.29 (15 Sep, 2022) = += v3.5.29 (15 Sep, 2022) = * Enhancement - Short-code encryption updated for registration page diff --git a/templates/account.php b/templates/account.php index d21c343d6..c2521bea5 100644 --- a/templates/account.php +++ b/templates/account.php @@ -11,13 +11,15 @@ } if ( 'subscription' == $section ) { - if ( 'off' == wpuf_get_option( 'show_subscriptions', 'wpuf_my_account', 'on' ) || 'on' != wpuf_get_option( 'enable_payment', 'wpuf_payment', 'on' ) ) { + if ( 'off' == wpuf_get_option( 'show_subscriptions', 'wpuf_my_account', 'on' ) || 'on' != wpuf_get_option( 'enable_payment', + 'wpuf_payment', 'on' ) ) { continue; } } if ( 'billing-address' == $section ) { - if ( 'off' == wpuf_get_option( 'show_billing_address', 'wpuf_my_account', 'on' ) || 'on' != wpuf_get_option( 'enable_payment', 'wpuf_payment', 'on' ) ) { + if ( 'off' == wpuf_get_option( 'show_billing_address', 'wpuf_my_account', 'on' ) || 'on' != wpuf_get_option( 'enable_payment', + 'wpuf_payment', 'on' ) ) { continue; } } diff --git a/templates/dashboard.php b/templates/dashboard.php index 92b5eb805..a8c9141b8 100644 --- a/templates/dashboard.php +++ b/templates/dashboard.php @@ -83,7 +83,7 @@ $featured_img_size = wpuf_get_option( 'ft_img_size', 'wpuf_dashboard' ); $enable_payment = wpuf_get_option( 'enable_payment', 'wpuf_payment' ); $current_user = wpuf_get_user(); - $user_subscription = new WPUF_User_Subscription( $current_user ); + $user_subscription = new WeDevs\Wpuf\User_Subscription( $current_user ); $user_sub = $user_subscription->current_pack(); $sub_id = $current_user->subscription()->current_pack_id(); diff --git a/templates/dashboard/billing-address.php b/templates/dashboard/billing-address.php index e2c28aecd..4255f8d4a 100644 --- a/templates/dashboard/billing-address.php +++ b/templates/dashboard/billing-address.php @@ -4,7 +4,7 @@ $address_fields = []; $countries = []; -$cs = new CountryState(); +$cs = new WeDevs\Wpuf\Data\Country_State(); if ( isset( $_POST['update_billing_address'] ) ) { @@ -43,7 +43,7 @@
      diff --git a/templates/dashboard/edit-profile.php b/templates/dashboard/edit-profile.php index 7829f8a32..19cbe0211 100644 --- a/templates/dashboard/edit-profile.php +++ b/templates/dashboard/edit-profile.php @@ -3,6 +3,7 @@ global $current_user; ob_start(); +$eye_icon_src = file_exists( WPUF_ROOT . '/assets/images/eye.svg' ) ? WPUF_ASSET_URI . '/images/eye.svg' : ''; ?> @@ -44,7 +45,10 @@
    - +
    + + +
  • @@ -55,7 +59,10 @@
    - +
    + + +
    @@ -65,7 +72,10 @@
    - +
    + + +
    diff --git a/templates/dashboard/list.php b/templates/dashboard/list.php index f63e676c0..871a9b18e 100644 --- a/templates/dashboard/list.php +++ b/templates/dashboard/list.php @@ -76,7 +76,8 @@ if ( empty( $payment_status ) ) { esc_html_e( 'Not Applicable', 'wp-user-frontend' ); } elseif ( $payment_status !== 'completed' ) { - echo '' . esc_html__( 'Pay Now', 'wp-user-frontend' ) . ''; + echo '' . esc_html__( 'Pay Now', 'wp-user-frontend' ) . ''; } elseif ( 'completed' === $payment_status ) { esc_html_e( 'Completed', 'wp-user-frontend' ); } diff --git a/templates/dashboard/posts.php b/templates/dashboard/posts.php index 630fb35d1..03af00f19 100644 --- a/templates/dashboard/posts.php +++ b/templates/dashboard/posts.php @@ -1,6 +1,6 @@ - + diff --git a/templates/login-form.php b/templates/login-form.php index feb907dba..c23aaacb1 100644 --- a/templates/login-form.php +++ b/templates/login-form.php @@ -15,8 +15,10 @@ } ?> - login->show_errors(); ?> - login->show_messages(); ?> + frontend->simple_login->show_errors(); + wpuf()->frontend->simple_login->show_messages(); + ?>

    @@ -83,5 +85,5 @@

    - login->get_action_links( [ 'login' => false ] ) ); ?> + frontend->simple_login->get_action_links( [ 'login' => false ] ) ); ?>
    diff --git a/templates/lost-pass-form.php b/templates/lost-pass-form.php index 506984707..169205a01 100644 --- a/templates/lost-pass-form.php +++ b/templates/lost-pass-form.php @@ -3,11 +3,15 @@ If you would like to edit this file, copy it to your current theme's directory and edit it there. WPUF will always look in your theme's directory first, before using this default template. */ + +use WeDevs\Wpuf\Free\Simple_Login; ?> diff --git a/templates/registration-form.php b/templates/registration-form.php index ca8a3adc1..50a20d34a 100644 --- a/templates/registration-form.php +++ b/templates/registration-form.php @@ -20,8 +20,9 @@ } ?> - registration->show_errors(); ?> - registration->show_messages(); ?> + frontend->registration->show_errors(); ?> + frontend->registration->show_messages(); ?> +
    @@ -31,12 +32,12 @@
    - +
    - +
    @@ -46,28 +47,30 @@
  • *
    - +
  • *
    - +
  • *
    -
    +
    +
  • *
    -
    +
    +
  • @@ -75,7 +78,7 @@ - + @@ -83,7 +86,7 @@
  • - login->get_action_links( [ 'register' => false ] ) ); ?> + frontend->simple_login->get_action_links( [ 'register' => false ] ) ); ?>
  • diff --git a/templates/reset-pass-form.php b/templates/reset-pass-form.php index 6309d280c..6cda8941a 100644 --- a/templates/reset-pass-form.php +++ b/templates/reset-pass-form.php @@ -3,29 +3,40 @@ If you would like to edit this file, copy it to your current theme's directory and edit it there. WPUF will always look in your theme's directory first, before using this default template. */ +use WeDevs\Wpuf\Free\Simple_Login; ?> ', esc_url( Pro_Prompt::get_upgrade_to_pro_popup_url() ), '_blank', 'wpuf-button button-upgrade-to-pro', file_get_contents( $crown_icon ) ); } @@ -4488,7 +4524,7 @@ function wpuf_get_pro_preview_tooltip() { $html .= ''; $html .= sprintf( '', - esc_url( WPUF_Pro_Prompt::get_upgrade_to_pro_popup_url() ), '_blank', 'wpuf-button button-upgrade-to-pro', + esc_url( Pro_Prompt::get_upgrade_to_pro_popup_url() ), '_blank', 'wpuf-button button-upgrade-to-pro', file_get_contents( $crown_icon ) ); $html .= ''; @@ -4496,3 +4532,207 @@ function wpuf_get_pro_preview_tooltip() { return $html; } + +/** + * Get post forms created by WPUF + * + * @since 2.9.0 + * @since 4.0.0 moved to wpuf-functions.php from WPUF_Frontend_Account.php + * + * @return array $forms + * + */ +function wpuf_get_post_forms() { + $args = [ + 'post_type' => 'wpuf_forms', + 'post_status' => 'any', + 'orderby' => 'DESC', + 'order' => 'ID', + 'numberposts' => - 1, + ]; + $posts = get_posts( $args ); + $forms = []; + if ( ! empty( $posts ) ) { + foreach ( $posts as $post ) { + $forms[ $post->ID ] = $post->post_title; + } + } + + return $forms; +} + +/** + * require_once a file upon checking the existence of the file + * + * @since 4.0.0 + * + * @param $file_location + * + * @return void + */ +function wpuf_require_once( $file_location ) { + if ( file_exists( $file_location ) ) { + require_once $file_location; + } +} + +/** + * include_once a file upon checking the existence of the file + * + * @since 4.0.0 + * + * @param $file_location + * + * @return void + */ +function wpuf_include_once( $file_location ) { + if ( file_exists( $file_location ) ) { + include_once $file_location; + } +} + +/** + * Guess a suitable username for registration based on email address + * + * @param string $email email address + * + * @return string username + */ +function wpuf_guess_username( $email ) { + // username from email address + $username = sanitize_user( substr( $email, 0, strpos( $email, '@' ) ) ); + + if ( ! username_exists( $username ) ) { + return $username; + } + + // try to add some random number in username + // and may be we got our username + $username .= rand( 1, 199 ); + + if ( ! username_exists( $username ) ) { + return $username; + } +} + +/** + * Clear Schedule lock + * + * @since 3.0.2 + */ +function wpuf_clear_schedule_lock() { + check_ajax_referer( 'wpuf_nonce', 'nonce' ); + + $post_id = isset( $_POST['post_id'] ) ? intval( wp_unslash( $_POST['post_id'] ) ) : ''; + + if ( ! empty( $post_id ) ) { + update_post_meta( $post_id, '_wpuf_lock_user_editing_post_time', '' ); + update_post_meta( $post_id, '_wpuf_lock_editing_post', 'no' ); + } + exit; +} + +/** + * Get the shortcodes that are protected on the post form. + * User cannot submit post containing those shortcodes. + * + * @since 3.6.6 + * + * @return array + */ +function wpuf_get_protected_shortcodes() { + return [ + 'wpuf-registration', + ]; +} + +/** + * Get the current users roles as an array + * + * @since 3.6.6 + * + * @return array|bool + */ +function wpuf_get_single_user_roles( $user_id ) { + if ( ! is_numeric( $user_id ) ) { + return false; + } + + $user = get_user_by( 'id', $user_id ); + + return ( array ) $user->roles; +} + +/** + * Check and modify the post content not to render shortcode values + * in the frontend for any user except admin. + * + * @since 3.6.6 + * + * @return string + */ +function wpuf_modify_shortcodes( $content ) { + global $pagenow; + + $post = get_post(); + + if ( ! ( $post instanceof WP_Post ) ) { + return $content; + } + + if ( 'post.php' === $pagenow ) { + return $content; + } + + // get the id of the user who last edited the post + $user_id = get_post_meta( get_post()->ID, '_edit_last', true ); + + $roles = wpuf_get_single_user_roles( $user_id ); + + if ( empty( $roles ) ) { + return $content; + } + + // last modified by an admin, returns the content as it is + if ( in_array( 'administrator', $roles ) ) { + return $content; + } + + $protected_shortcodes = wpuf_get_protected_shortcodes(); + + foreach ( $protected_shortcodes as $shortcode ) { + $search_for = '[' . $shortcode; + + if ( strpos( $content, $search_for ) !== false ) { + $pattern = '/\[' . $shortcode . '(.*?)\]/'; + + $content = preg_replace_callback( + $pattern, function( $matches ) { + return str_replace( [ '[', ']' ], [ '[', ']' ], $matches[0] ); + }, $content ); + } + } + + return $content; +} + +// @todo: move this to frontend class +add_filter( 'the_content', 'wpuf_modify_shortcodes' ); + +/** + * Hide the Google map button + * + * @since 4.0.0 function moved from Posting class + * + * @return void + */ +function wpuf_hide_google_map_button() { + echo wp_kses( "", [ + 'style' => [], + 'button' => [] + ] ); +} diff --git a/wpuf.php b/wpuf.php index 26ca7d660..4d0aa888a 100644 --- a/wpuf.php +++ b/wpuf.php @@ -4,7 +4,7 @@ Plugin URI: https://wordpress.org/plugins/wp-user-frontend/ Description: Create, edit, delete, manages your post, pages or custom post types from frontend. Create registration forms, frontend profile and more... Author: weDevs -Version: 3.6.0 +Version: 4.0.6 Author URI: https://wedevs.com/?utm_source=WPUF_Author_URI License: GPL2 or later License URI: https://www.gnu.org/licenses/gpl-2.0.html @@ -12,25 +12,37 @@ Domain Path: /languages */ -define( 'WPUF_VERSION', '3.6.0' ); +// don't call the file directly +if ( ! defined( 'ABSPATH' ) ) { + exit; +} + +$autoload = __DIR__ . '/vendor/autoload.php'; + +if ( file_exists( $autoload ) ) { + require_once $autoload; +} else { + wp_die( __( 'There was a problem installing the plugin' ), __( 'Problem installing plugin' ) ); +} + +define( 'WPUF_VERSION', '4.0.6' ); define( 'WPUF_FILE', __FILE__ ); define( 'WPUF_ROOT', __DIR__ ); define( 'WPUF_ROOT_URI', plugins_url( '', __FILE__ ) ); define( 'WPUF_ASSET_URI', WPUF_ROOT_URI . '/assets' ); +define( 'WPUF_INCLUDES', WPUF_ROOT . '/includes' ); + +use WeDevs\WpUtils\ContainerTrait; +use WeDevs\WpUtils\SingletonTrait; /** * Main bootstrap class for WP User Frontend */ -final class WP_User_Frontend { - /** - * Holds various class instances - * - * @since 2.5.7 - * - * @var array - */ - private $container = []; +/*Marking a class with #[AllowDynamicProperties] is fully backwards-compatible with earlier PHP versions, because prior to PHP 8.0 this would be interpreted as a comment, and the use non-existent classes as attributes is not an error.*/ +#[AllowDynamicProperties] +final class WP_User_Frontend { + use SingletonTrait, ContainerTrait; /** * Form field value seperator @@ -39,13 +51,6 @@ final class WP_User_Frontend { */ public static $field_separator = '| '; - /** - * The singleton instance - * - * @var WP_User_Frontend - */ - private static $_instance; - /** * Pro plugin checkup * @@ -76,6 +81,9 @@ public function __construct() { $this->includes(); $this->init_hooks(); + // Insight class instantiate + $this->container['tracker'] = new WeDevs\Wpuf\Lib\WeDevs_Insights( __FILE__ ); + do_action( 'wpuf_loaded' ); } @@ -121,132 +129,16 @@ public function php_version_notice() { */ public function init_hooks() { add_action( 'plugins_loaded', [ $this, 'wpuf_loader' ] ); + add_action( 'plugins_loaded', [ $this, 'process_wpuf_pro_version' ] ); add_action( 'plugins_loaded', [ $this, 'plugin_upgrades' ] ); - add_action( 'plugins_loaded', [ $this, 'instantiate' ] ); - add_action( 'init', [ $this, 'load_textdomain' ] ); - - add_action( 'admin_init', [ $this, 'block_admin_access' ] ); - - add_filter( 'show_admin_bar', [ $this, 'show_admin_bar' ] ); - // enqueue plugin scripts, don't remove priority. - // If remove or set priority under 1000 then registered styles will not load on WC Marketplace vendor dashboard. - // we have integration with WC Marketplace plugin since version 3.0 where WC Marketplae vendors' can submit post - add_action( 'wp_enqueue_scripts', [ $this, 'enqueue_scripts' ], 9999 ); + add_action( 'init', [ $this, 'load_textdomain' ] ); // do plugin upgrades add_filter( 'plugin_action_links_' . plugin_basename( __FILE__ ), [ $this, 'plugin_action_links' ] ); - // add custom css - add_action( 'wp_head', [ $this, 'add_custom_css' ] ); - - // set schedule event - add_action( 'wpuf_remove_expired_post_hook', [ $this, 'action_to_remove_exipred_post' ] ); - add_action( 'wp_ajax_wpuf_weforms_install', [ $this, 'install_weforms' ] ); - - // Insight class instentiate - $this->container['tracker'] = new WPUF_WeDevs_Insights( __FILE__ ); - } - - /** - * Magic getter to bypass referencing plugin. - * - * @since 2.5.7 - * - * @param string $prop - * - * @return mixed - */ - public function __get( $prop ) { - if ( array_key_exists( $prop, $this->container ) ) { - return $this->container[ $prop ]; - } - - return $this->{$prop}; - } - - /** - * Schedules the post expiry event - * - * @since 2.2.7 - */ - public static function set_schedule_events() { - if ( ! wp_next_scheduled( 'wpuf_remove_expired_post_hook' ) ) { - wp_schedule_event(time(), 'daily', 'wpuf_remove_expired_post_hook'); - } - } - - /** - * Action when posts expiration date is passed - * - * @since 2.2.7 - */ - public function action_to_remove_exipred_post() { - $args = [ - 'meta_key' => 'wpuf-post_expiration_date', - 'meta_value' => date( 'Y-m-d' ), - 'meta_compare' => '<', - 'post_type' => get_post_types(), - 'post_status' => 'publish', - 'posts_per_page' => -1, - ]; - - $mail_subject = apply_filters( 'wpuf_post_expiry_mail_subject', sprintf( '[%s] %s', get_bloginfo( 'name' ), __( 'Your Post Has Been Expired', 'wp-user-frontend' ) ) ); - $posts = get_posts( $args ); - - foreach ( $posts as $each_post ) { - $post_to_update = [ - 'ID' => $each_post->ID, - 'post_status' => get_post_meta( $each_post->ID, 'wpuf-expired_post_status', true ) ? get_post_meta( $each_post->ID, 'wpuf-expired_post_status', true ) : 'draft', - ]; - - wp_update_post( $post_to_update ); - - $post_url = get_permalink( $each_post->ID ); - $author_id = $each_post->post_author; - $post_author = get_the_author_meta( 'user_login', $author_id ); - $blogname = wp_specialchars_decode( get_option( 'blogname' ), ENT_QUOTES ); - - $search = [ - '{post_author}', - '{post_url}', - '{blogname}', - '{post_title}', - '{post_status}', - ]; - - $replace = [ - $post_author, - $post_url, - $blogname, - $each_post->post_title, - $each_post->post_status, - ]; - - $message = get_post_meta( $each_post->ID, 'wpuf-post_expiration_message', true ); - $message = str_replace( $search, $replace, $message ); - $message = get_formatted_mail_body( $message, $mail_subject ); - - if ( ! empty( $message ) ) { - wp_mail( get_the_author_meta( 'user_email', $each_post->post_author ), $mail_subject, $message ); - } - } - // save an option for debugging purpose - update_option( 'wpuf_expiry_posts_last_cleaned', date( 'F j, Y g:i a' ) ); - } - - /** - * Singleton Instance - * - * @return \self - */ - public static function init() { - if ( ! self::$_instance ) { - self::$_instance = new WP_User_Frontend(); - } - - return self::$_instance; + add_action( 'widgets_init', [ $this, 'register_widgets' ] ); } /** @@ -255,86 +147,14 @@ public static function init() { * @return void */ public function includes() { - require_once __DIR__ . '/class/encryption-helper.php'; require_once __DIR__ . '/wpuf-functions.php'; - require_once __DIR__ . '/lib/gateway/paypal.php'; - require_once __DIR__ . '/lib/gateway/bank.php'; - require_once __DIR__ . '/lib/class-wedevs-insights.php'; - - require_once WPUF_ROOT . '/includes/class-frontend-render-form.php'; - require_once WPUF_ROOT . '/admin/form-builder/class-wpuf-form-builder-field-settings.php'; - - // global classes/functions - require_once WPUF_ROOT . '/class/upload.php'; - require_once WPUF_ROOT . '/admin/form-template.php'; - require_once WPUF_ROOT . '/class/post-form-template.php'; - require_once WPUF_ROOT . '/class/subscription.php'; - require_once WPUF_ROOT . '/class/render-form.php'; - require_once WPUF_ROOT . '/class/payment.php'; - require_once WPUF_ROOT . '/class/frontend-account.php'; - require_once WPUF_ROOT . '/includes/class-form.php'; - require_once WPUF_ROOT . '/includes/class-form-manager.php'; - require_once WPUF_ROOT . '/includes/class-login-widget.php'; - require_once WPUF_ROOT . '/includes/setup-wizard.php'; - require_once WPUF_ROOT . '/includes/countries-state.php'; - require_once WPUF_ROOT . '/includes/class-billing-address.php'; - include_once WPUF_ROOT . '/includes/class-gutenblock.php'; - include_once WPUF_ROOT . '/includes/class-form-preview.php'; - include_once WPUF_ROOT . '/includes/class-customizer.php'; - include_once WPUF_ROOT . '/includes/log/class-log.php'; - include_once WPUF_ROOT . '/includes/log/class-log-wpdb-query.php'; - // include_once WPUF_ROOT . '/includes/class-user-prorate.php'; - - if ( class_exists( 'WeDevs_Dokan' ) ) { - require_once WPUF_ROOT . '/includes/class-dokan-integration.php'; - } - - if ( class_exists( 'WCMp' ) ) { - require_once WPUF_ROOT . '/includes/class-wcmp-integration.php'; - } - - if ( class_exists( 'WC_Vendors' ) ) { - require_once WPUF_ROOT . '/includes/class-wc-vendors-integration.php'; - } - - require_once WPUF_ROOT . '/includes/class-user.php'; - require_once WPUF_ROOT . '/includes/class-user-subscription.php'; - - if ( is_admin() ) { - require_once WPUF_ROOT . '/admin/settings-options.php'; - require_once WPUF_ROOT . '/admin/class-admin-settings.php'; - require_once WPUF_ROOT . '/admin/form-handler.php'; - require_once WPUF_ROOT . '/admin/form.php'; - require_once WPUF_ROOT . '/admin/posting.php'; - require_once WPUF_ROOT . '/admin/class-admin-subscription.php'; - require_once WPUF_ROOT . '/admin/installer.php'; - require_once WPUF_ROOT . '/admin/class-admin-welcome.php'; - require_once WPUF_ROOT . '/admin/promotion.php'; - require_once WPUF_ROOT . '/admin/post-forms-list-table.php'; - require_once WPUF_ROOT . '/includes/free/admin/shortcode-button.php'; - require_once WPUF_ROOT . '/admin/form-builder/class-wpuf-admin-form-builder.php'; - require_once WPUF_ROOT . '/admin/form-builder/class-wpuf-admin-form-builder-ajax.php'; - // include_once WPUF_ROOT . '/lib/class-weforms-upsell.php'; - include_once WPUF_ROOT . '/includes/class-whats-new.php'; - include_once WPUF_ROOT . '/includes/class-acf.php'; - include_once WPUF_ROOT . '/includes/class-privacy.php'; - include_once WPUF_ROOT . '/admin/dashboard-metabox.php'; - } else { - require_once WPUF_ROOT . '/class/frontend-dashboard.php'; - require_once WPUF_ROOT . '/includes/free/class-registration.php'; - } + require_once __DIR__ . '/includes/class-frontend-render-form.php'; // add reCaptcha library if not found if ( ! function_exists( 'recaptcha_get_html' ) ) { - require_once __DIR__ . '/lib/recaptchalib.php'; - require_once __DIR__ . '/lib/invisible_recaptcha.php'; + require_once __DIR__ . '/Lib/recaptchalib.php'; + require_once __DIR__ . '/Lib/invisible_recaptcha.php'; } - - require_once WPUF_ROOT . '/includes/free/class-login.php'; - require_once WPUF_ROOT . '/includes/class-frontend-form-post.php'; - require_once WPUF_ROOT . '/includes/class-field-manager.php'; - require_once WPUF_ROOT . '/includes/class-pro-upgrades.php'; - require_once WPUF_ROOT . '/includes/fields/field-trait.php'; } /** @@ -343,54 +163,25 @@ public function includes() { * @return void */ public function instantiate() { - $this->container['upload'] = new WPUF_Upload(); - $this->container['paypal'] = new WPUF_Paypal(); - $this->container['form_template'] = new WPUF_Admin_Form_Template(); - - $this->container['subscription'] = WPUF_Subscription::init(); - $this->container['account'] = new WPUF_Frontend_Account(); - $this->container['billing_address'] = new WPUF_Ajax_Address_Form(); - $this->container['forms'] = new WPUF_Form_Manager(); - $this->container['preview'] = new WPUF_Form_Preview(); - $this->container['block'] = new WPUF_Form_Block(); - $this->container['customize'] = new WPUF_Customizer_Options(); - $this->container['log'] = new WPUF_Log(); - - if ( class_exists( 'WeDevs_Dokan' ) ) { - $this->container['dokan_integration'] = new WPUF_Dokan_Integration(); - } - - if ( class_exists( 'WCMp' ) ) { - $this->container['wcmp_integration'] = new WPUF_WCMp_Integration(); - } - - if ( class_exists( 'WC_Vendors' ) ) { - $this->container['WCV_Integration'] = new WPUF_WC_Vendors_Integration(); - } + $this->assets = new WeDevs\Wpuf\Assets(); + $this->subscription = new WeDevs\Wpuf\Admin\Subscription(); + $this->fields = new WeDevs\Wpuf\Admin\Forms\Field_Manager(); + $this->customize = new WeDevs\Wpuf\Admin\Customizer_Options(); + $this->bank = new WeDevs\Wpuf\Lib\Gateway\Bank(); + $this->paypal = new WeDevs\Wpuf\Lib\Gateway\Paypal(); if ( is_admin() ) { - $this->container['settings'] = WPUF_Admin_Settings::init(); - $this->container['form_handler'] = new WPUF_Admin_Form_Handler(); - $this->container['admin_form'] = new WPUF_Admin_Form(); - $this->container['admin_posting'] = WPUF_Admin_Posting::init(); - $this->container['admin_subscription'] = new WPUF_Admin_Subscription(); - $this->container['admin_installer'] = new WPUF_Admin_Installer(); - $this->container['admin_promotion'] = new WPUF_Admin_Promotion(); - $this->container['welcome'] = new WPUF_Admin_Welcome(); - $this->container['whats_new'] = new WPUF_Whats_New(); - $this->container['wpuf_acf'] = new WPUF_ACF_Compatibility(); - $this->container['privacy'] = new WPUF_Privacy(); - $this->container['dashboard_mb'] = new Dashboard_Metabox(); + $this->admin = new WeDevs\Wpuf\Admin(); + $this->setup_wizard = new WeDevs\Wpuf\Setup_Wizard(); + $this->pro_upgrades = new WeDevs\Wpuf\Pro_Upgrades(); + $this->privacy = new WeDevs\Wpuf\WPUF_Privacy(); } else { - $this->container['dashboard'] = new WPUF_Frontend_Dashboard(); - $this->container['payment'] = new WPUF_Payment(); - $this->container['registration'] = WPUF_Registration::init(); + $this->frontend = new WeDevs\Wpuf\Frontend(); } - $this->container['login'] = WPUF_Simple_Login::init(); - $this->container['fields'] = new WPUF_Field_Manager(); - $this->container['frontend_form'] = WPUF_Frontend_Form::init(); - $this->container['pro_upgrades'] = new WPUF_Pro_Upgrades(); + if ( defined( 'DOING_AJAX' ) && DOING_AJAX ) { + $this->ajax = new WeDevs\Wpuf\Ajax(); + } } /** @@ -398,10 +189,8 @@ public function instantiate() { * * @global object $wpdb */ - public static function install() { - require_once WPUF_ROOT . '/includes/class-installer.php'; - - $installer = new WPUF_Installer(); + public function install() { + $installer = new WeDevs\Wpuf\Installer(); $installer->install(); } @@ -417,392 +206,70 @@ public function plugin_upgrades() { return; } - require_once WPUF_ROOT . '/includes/class-upgrades.php'; - - $this->container['upgrades'] = new WPUF_Upgrades(); + $this->upgrades = new WeDevs\Wpuf\Admin\Upgrades(); } /** - * Load wpuf free class if not pro + * Check whether the version of wpuf pro is prior to the code restructure * - * @since 2.5.4 - */ - public function wpuf_loader() { - $has_pro = class_exists( 'WP_User_Frontend_Pro' ); - - if ( $has_pro ) { - $this->is_pro = true; - add_action( 'admin_notices', [ $this, 'wpuf_latest_pro_activation_notice' ] ); - } else { - include __DIR__ . '/includes/free/loader.php'; - - $this->container['free_loader'] = new WPUF_Free_Loader(); - } - } - - /** - * Latest Pro Activation Message + * @since WPUF_FREE * * @return void */ - public function wpuf_latest_pro_activation_notice() { - if ( ! version_compare( WPUF_PRO_VERSION, '3.1.0', '<' ) ) { - return; - } - - $offer_msg = __( - '

    - UPDATE REQUIRED - WP User Frontend Pro is not working because you are using an old version of WP User Frontend Pro. Please update WPUF Pro to >= v3.1.0 to work with the latest version of WP User Frontend -

    ', 'wp-user-frontend' - ); - ?> -
    - - - - - - - - -
    - - - -
    - -
    - - - - - ID ) ) { - ?> - - plugin_scripts(); - } elseif ( wpuf_has_shortcode( 'wpuf-login' ) || wpuf_has_shortcode( 'wpuf-registration' ) || wpuf_has_shortcode( 'wpuf-meta' ) || wpuf_has_shortcode( 'wpuf_form' ) || wpuf_has_shortcode( 'wpuf_edit' ) || wpuf_has_shortcode( 'wpuf_profile' ) || wpuf_has_shortcode( 'wpuf_dashboard' ) || wpuf_has_shortcode( 'weforms' ) || wpuf_has_shortcode( 'wpuf_account' ) || wpuf_has_shortcode( 'wpuf_sub_pack' ) || ( isset( $post->ID ) && ( $pay_page == $post->ID ) ) || isset( $_GET['wpuf_preview'] ) || class_exists( '\Elementor\Plugin' ) ) { - $this->plugin_scripts(); + add_action( 'admin_notices', [ $this, 'wpuf_upgrade_notice' ] ); } } /** - * add custom css to head + * Show WordPress error notice if WP User Frontend not found + * + * @since 2.4.2 */ - public function add_custom_css() { - global $post; - - if ( ! is_a( $post, 'WP_Post' ) ) { - return; - } - - if ( wpuf_has_shortcode( 'wpuf-login', $post->ID ) - || wpuf_has_shortcode( 'wpuf-registration', $post->ID ) - || wpuf_has_shortcode( 'wpuf-meta', $post->ID ) - || wpuf_has_shortcode( 'wpuf_form', $post->ID ) - || wpuf_has_shortcode( 'wpuf_edit', $post->ID ) - || wpuf_has_shortcode( 'wpuf_profile', $post->ID ) - || wpuf_has_shortcode( 'wpuf_dashboard', $post->ID ) - || wpuf_has_shortcode( 'wpuf_sub_pack', $post->ID ) - || wpuf_has_shortcode( 'wpuf-login', $post->ID ) - || wpuf_has_shortcode( 'wpuf_form', $post->ID ) - || wpuf_has_shortcode( 'wpuf_account', $post->ID ) - ) { - ?> - - admin_url( 'admin-ajax.php' ), - 'error_message' => __( 'Please fix the errors to proceed', 'wp-user-frontend' ), - 'nonce' => wp_create_nonce( 'wpuf_nonce' ), - 'cancelSubMsg' => __( 'Are you sure you want to cancel your current subscription ?', 'wp-user-frontend' ), - 'delete_it' => __( 'Yes', 'wp-user-frontend' ), - 'cancel_it' => __( 'No', 'wp-user-frontend' ), - 'char_max' => __( 'Character limit reached', 'wp-user-frontend' ), - 'char_min' => __( 'Minimum character required ', 'wp-user-frontend' ), - 'word_max' => __( 'Word limit reached', 'wp-user-frontend' ), - 'word_min' => __( 'Minimum word required ', 'wp-user-frontend' ), - ] - ) - ); - - wp_localize_script( - 'wpuf-subscriptions', 'wpuf_subscription', apply_filters( - 'wpuf_subscription_js_data', [ - 'pack_notice' => __( 'Please Cancel Your Currently Active Pack first!', 'wp-user-frontend' ), - ] - ) - ); - - wp_localize_script( - 'wpuf-upload', 'wpuf_frontend_upload', [ - 'confirmMsg' => __( 'Are you sure?', 'wp-user-frontend' ), - 'delete_it' => __( 'Yes, delete it', 'wp-user-frontend' ), - 'cancel_it' => __( 'No, cancel it', 'wp-user-frontend' ), - 'nonce' => wp_create_nonce( 'wpuf_nonce' ), - 'ajaxurl' => admin_url( 'admin-ajax.php' ), - 'max_filesize' => wpuf_max_upload_size(), - 'plupload' => [ - 'url' => admin_url( 'admin-ajax.php' ) . '?nonce=' . wp_create_nonce( 'wpuf-upload-nonce' ), - 'flash_swf_url' => includes_url( 'js/plupload/plupload.flash.swf' ), - 'filters' => [ - [ - 'title' => __( 'Allowed Files', 'wp-user-frontend' ), - 'extensions' => '*', - ], - ], - 'multipart' => true, - 'urlstream_upload' => true, - 'warning' => __( 'Maximum number of files reached!', 'wp-user-frontend' ), - 'size_error' => __( 'The file you have uploaded exceeds the file size limit. Please try again.', 'wp-user-frontend' ), - 'type_error' => __( 'You have uploaded an incorrect file type. Please try again.', 'wp-user-frontend' ), - ], - ] - ); +

    +
    + is_pro = true; + } else { + $this->free_loader = new WeDevs\Wpuf\Free\Free_Loader(); } - $access_level = wpuf_get_option( 'admin_access', 'wpuf_general', 'read' ); - $valid_pages = [ 'admin-ajax.php', 'admin-post.php', 'async-upload.php', 'media-upload.php' ]; - - if ( ! current_user_can( $access_level ) && ! in_array( $pagenow, $valid_pages ) ) { - // wp_die( __( 'Access Denied. Your site administrator has blocked your access to the WordPress back-office.', 'wpuf' ) ); - wp_redirect( home_url() ); - exit; - } + // Remove the what's new option. + delete_option( 'wpuf_whats_new' ); + delete_option( 'wpufpro_whats_new' ); } /** - * Show/hide admin bar to the permitted user level - * - * @since 2.2.3 + * Manage task on plugin deactivation * * @return void */ - public function show_admin_bar( $val ) { - if ( ! is_user_logged_in() ) { - return false; - } - - $roles = wpuf_get_option( 'show_admin_bar', 'wpuf_general', [ 'administrator', 'editor', 'author', 'contributor', 'subscriber' ] ); - $roles = $roles && is_string( $roles ) ? [ strtolower( $roles ) ] : $roles; - $current_user = wp_get_current_user(); - - if ( ! empty( $current_user->roles ) && ! empty( $current_user->roles[0] ) ) { - if ( ! in_array( $current_user->roles[0], $roles ) ) { - return false; - } - } - - return $val; + public static function uninstall() { + wp_clear_scheduled_hook( 'wpuf_remove_expired_post_hook' ); } /** @@ -851,7 +318,7 @@ public function is_pro() { */ public function plugin_action_links( $links ) { if ( ! $this->is_pro() ) { - $links[] = 'Get PRO'; + $links[] = 'Get PRO'; } $links[] = 'Settings'; @@ -861,12 +328,15 @@ public function plugin_action_links( $links ) { } /** - * Show renew prompt once the license key is expired + * Register widgets * - * @since 2.3.13 + * @since 4.0.0 * * @return void */ + public function register_widgets() { + $this->widgets = new WeDevs\Wpuf\Widgets\Manager(); + } public function license_expired() { echo '
    '; echo '

    Your WP User Frontend Pro License has been expired. Please renew your license.

    '; @@ -874,73 +344,24 @@ public function license_expired() { } /** - * If the core isn't installed + * Get the global field seperator for WPUF * - * @return void - */ - public function maybe_weforms_install() { - if ( class_exists( 'WeForms' ) ) { - return; - } - - // install the core - add_action( 'wp_ajax_wpuf_weforms_install', [ $this, 'install_weforms' ] ); - } - - /** - * Install weforms plugin via ajax + * @since 4.0.0 * - * @return void + * @return string */ - public function install_weforms() { - $nonce = isset( $_REQUEST['_wpnonce'] ) ? sanitize_key( wp_unslash( $_REQUEST['_wpnonce'] ) ) : ''; - - if ( isset( $nonce ) && ! wp_verify_nonce( $nonce, 'wpuf-weforms-installer-nonce' ) ) { - wp_send_json_error( __( 'Error: Nonce verification failed', 'wp-user-frontend' ) ); - } - - include_once ABSPATH . 'wp-admin/includes/plugin-install.php'; - include_once ABSPATH . 'wp-admin/includes/class-wp-upgrader.php'; - - if ( file_exists( WP_PLUGIN_DIR . '/weforms/weforms.php' ) ) { - activate_plugin( 'weforms/weforms.php' ); - wp_send_json_success(); - } - - $plugin = 'weforms'; - $api = plugins_api( - 'plugin_information', [ - 'slug' => $plugin, - 'fields' => [ - 'sections' => false, - ], - ] - ); - - $upgrader = new Plugin_Upgrader( new WP_Ajax_Upgrader_Skin() ); - $result = $upgrader->install( $api->download_link ); - - if ( is_wp_error( $result ) ) { - wp_send_json_error( $result ); - } - - $result = activate_plugin( 'weforms/weforms.php' ); - - if ( is_wp_error( $result ) ) { - wp_send_json_error( $result ); - } - - wp_send_json_success(); + public function get_field_seperator() { + return self::$field_separator; } } /** * Returns the singleton instance * - * @return \WP_User_Frontend + * @return WP_User_Frontend */ function wpuf() { - return WP_User_Frontend::init(); + return WP_User_Frontend::instance(); } // kickoff From 79bf57d8f31dae56706d1c284af652879969c0ea Mon Sep 17 00:00:00 2001 From: Sapayth Hossain Date: Wed, 18 Sep 2024 12:10:11 +0600 Subject: [PATCH 3/3] code cleanup --- includes/Admin/Forms/Form.php | 2 +- includes/Ajax/Frontend_Form_Ajax.php | 9 +- includes/Frontend/Frontend_Form.php | 246 ++++++++++++++++++++++----- 3 files changed, 216 insertions(+), 41 deletions(-) diff --git a/includes/Admin/Forms/Form.php b/includes/Admin/Forms/Form.php index f06504e7d..26a937a9b 100644 --- a/includes/Admin/Forms/Form.php +++ b/includes/Admin/Forms/Form.php @@ -21,7 +21,7 @@ class Form { /** * @var array|\WP_Post|null */ - private $data; + public $data; public function __construct( $form ) { if ( is_numeric( $form ) ) { diff --git a/includes/Ajax/Frontend_Form_Ajax.php b/includes/Ajax/Frontend_Form_Ajax.php index 630617651..43c4f1fd4 100644 --- a/includes/Ajax/Frontend_Form_Ajax.php +++ b/includes/Ajax/Frontend_Form_Ajax.php @@ -20,6 +20,11 @@ class Frontend_Form_Ajax { private $post_expiration_message = 'wpuf-post_expiration_message'; + /** + * @var array + */ + private $form_fields; + /** * New/Edit post submit handler * @@ -155,9 +160,9 @@ public function submit_post() { $charging_enabled = 'yes'; } - if ( $guest_mode === 'true' && $guest_verify === 'true' && ! is_user_logged_in() && $charging_enabled === 'yes' ) { + if ( 'true' === $guest_mode && 'true' === $guest_verify && ! is_user_logged_in() && 'yes' === $charging_enabled ) { $postarr['post_status'] = wpuf_get_draft_post_status( $this->form_settings ); - } elseif ( $guest_mode === 'true' && $guest_verify === 'true' && ! is_user_logged_in() ) { + } elseif ( 'true' === $guest_mode && 'true' === $guest_verify && ! is_user_logged_in() ) { $postarr['post_status'] = 'draft'; } //if date is set and assigned as publish date diff --git a/includes/Frontend/Frontend_Form.php b/includes/Frontend/Frontend_Form.php index 22c2d087e..92e59a8ad 100755 --- a/includes/Frontend/Frontend_Form.php +++ b/includes/Frontend/Frontend_Form.php @@ -16,6 +16,9 @@ class Frontend_Form extends Frontend_Render_Form { public function __construct() { // // guest post hook add_action( 'init', [ $this, 'publish_guest_post' ] ); + // notification and other tasks after the guest verified the email + add_action( 'wpuf_guest_post_email_verified', [ $this, 'send_mail_to_admin_after_guest_mail_verified' ] ); + $this->set_wp_post_types(); // Enable post edit link for post authors in frontend @@ -326,48 +329,52 @@ public function publish_guest_post() { $pid = isset( $_GET['p_id'] ) ? sanitize_text_field( wp_unslash( $_GET['p_id'] ) ) : ''; $fid = isset( $_GET['f_id'] ) ? sanitize_text_field( wp_unslash( $_GET['f_id'] ) ) : ''; - if ( $post_msg === 'verified' ) { - $response = []; - $post_id = wpuf_decryption( $pid ); - $form_id = wpuf_decryption( $fid ); - $form_settings = wpuf_get_form_settings( $form_id ); - $post_author_id = get_post_field( 'post_author', $post_id ); - $payment_status = new Subscription(); - $form = new Form( $form_id ); - $pay_per_post = $form->is_enabled_pay_per_post(); - $force_pack = $form->is_enabled_force_pack(); - - if ( $form->is_charging_enabled() && $pay_per_post ) { - if ( ( $payment_status->get_payment_status( $post_id ) ) === 'pending' ) { - $response['show_message'] = true; - $response['redirect_to'] = add_query_arg( - [ - 'action' => 'wpuf_pay', - 'type' => 'post', - 'post_id' => $post_id, - ], - get_permalink( wpuf_get_option( 'payment_page', 'wpuf_payment' ) ) - ); - - wp_redirect( $response['redirect_to'] ); - wpuf_clear_buffer(); - wp_send_json( $response ); - } - } else { - $p_status = get_post_status( $post_id ); + if ( $post_msg !== 'verified' ) { + return; + } - if ( $p_status ) { - wp_update_post( - [ - 'ID' => $post_id, - 'post_status' => isset( $form_settings['post_status'] ) ? $form_settings['post_status'] : 'publish', - ] - ); + $response = []; + $post_id = wpuf_decryption( $pid ); + $form_id = wpuf_decryption( $fid ); + $form_settings = wpuf_get_form_settings( $form_id ); + $post_author_id = get_post_field( 'post_author', $post_id ); + $payment_status = new Subscription(); + $form = new Form( $form_id ); + $pay_per_post = $form->is_enabled_pay_per_post(); + $force_pack = $form->is_enabled_force_pack(); + + if ( $form->is_charging_enabled() && $pay_per_post ) { + if ( ( $payment_status->get_payment_status( $post_id ) ) === 'pending' ) { + $response['show_message'] = true; + $response['redirect_to'] = add_query_arg( + [ + 'action' => 'wpuf_pay', + 'type' => 'post', + 'post_id' => $post_id, + ], + get_permalink( wpuf_get_option( 'payment_page', 'wpuf_payment' ) ) + ); + + wp_redirect( $response['redirect_to'] ); + wpuf_clear_buffer(); + wp_send_json( $response ); + } + } else { + $p_status = get_post_status( $post_id ); - echo wp_kses_post( "
    " . __( 'Email successfully verified. Please Login.', 'wp-user-frontend' ) . '
    ' ); - } + if ( $p_status ) { + wp_update_post( + [ + 'ID' => $post_id, + 'post_status' => isset( $form_settings['post_status'] ) ? $form_settings['post_status'] : 'publish', + ] + ); + + echo wp_kses_post( "
    " . __( 'Email successfully verified. Please Login.', 'wp-user-frontend' ) . '
    ' ); } } + + do_action( 'wpuf_guest_post_email_verified', $post_id ); } /** @@ -476,4 +483,167 @@ private function generate_auth_link() { $this->form_settings['message_restrict'] = str_replace( $placeholders, $replace, $this->form_settings['message_restrict'] ); } } + + /** + * Send a notification mail after a guest verified his/her email + * + * @since WPUF + * + * @return void + */ + public function send_mail_to_admin_after_guest_mail_verified() { + $post_id = ! empty( $_GET['p_id'] ) ? wpuf_decryption( sanitize_text_field( wp_unslash( $_GET['p_id'] ) ) ) : 0; + $form_id = ! empty( $_GET['f_id'] ) ? wpuf_decryption( sanitize_text_field( wp_unslash( $_GET['f_id'] ) ) ) : 0; + + if ( empty( $post_id ) || empty( $form_id ) ) { + return; + } + + $form = new Form( $form_id ); + + if ( empty( $form->data ) ) { + return; + } + + $this->form_fields = $form->get_fields(); + $this->form_settings = $form->get_settings(); + + $author_id = get_post_field( 'post_author', $post_id ); + + $is_email_varified = get_user_meta( $author_id, 'wpuf_guest_email_verified', true ); + + // if user email already verified, no need to check again. + // It will prevent mail flooding by clicking on the same link + if ( $is_email_varified ) { + return; + } + + $mail_body = $this->prepare_mail_body( $this->form_settings['notification']['new_body'], $author_id, $post_id ); + $to = $this->prepare_mail_body( $this->form_settings['notification']['new_to'], $author_id, $post_id ); + $subject = $this->prepare_mail_body( $this->form_settings['notification']['new_subject'], $author_id, $post_id ); + $subject = wp_strip_all_tags( $subject ); + $mail_body = get_formatted_mail_body( $mail_body, $subject ); + $headers = [ 'Content-Type: text/html; charset=UTF-8' ]; + + // update the information for future to check if the email is already verified + update_user_meta( $author_id, 'wpuf_guest_email_verified', 1 ); + wp_mail( $to, $subject, $mail_body, $headers ); + } + + /** + * Prepare the mail body + * + * @param $content + * @param $user_id + * @param $post_id + * + * @return array|string|string[] + */ + public function prepare_mail_body( $content, $user_id, $post_id ) { + $user = get_user_by( 'id', $user_id ); + $post = get_post( $post_id ); + + $post_field_search = [ + '{post_title}', + '{post_content}', + '{post_excerpt}', + '{tags}', + '{category}', + '{author}', + '{author_email}', + '{author_bio}', + '{sitename}', + '{siteurl}', + '{permalink}', + '{editlink}', + ]; + + $home_url = sprintf( '%s', home_url(), home_url() ); + $post_url = sprintf( '%s', get_permalink( $post_id ), get_permalink( $post_id ) ); + $post_edit_link = sprintf( '%s', admin_url( 'post.php?action=edit&post=' . $post_id ), admin_url( 'post.php?action=edit&post=' . $post_id ) ); + + $post_field_replace = [ + $post->post_title, + $post->post_content, + $post->post_excerpt, + get_the_term_list( $post_id, 'post_tag', '', ', ' ), + get_the_term_list( $post_id, 'category', '', ', ' ), + $user->display_name, + $user->user_email, + ( $user->description ) ? $user->description : 'not available', + get_bloginfo( 'name' ), + $home_url, + $post_url, + $post_edit_link, + ]; + + if ( class_exists( 'WooCommerce' ) ) { + $post_field_search[] = '{product_cat}'; + $post_field_replace[] = get_the_term_list( $post_id, 'product_cat', '', ', ' ); + } + + $content = str_replace( $post_field_search, $post_field_replace, $content ); + + // custom fields + preg_match_all( '/{custom_([\w-]*)\b}/', $content, $matches ); + [ $search, $replace ] = $matches; + + if ( $replace ) { + foreach ( $replace as $index => $meta_key ) { + $value = get_post_meta( $post_id, $meta_key, false ); + + if ( isset( $value[0] ) && is_array( $value[0] ) ) { + $new_value = implode( '; ', $value[0] ); + } else { + $new_value = implode( '; ', $value ); + } + + $original_value = ''; + $meta_val = ''; + + if ( count( $value ) > 1 ) { + $is_first = true; + + foreach ( $value as $val ) { + if ( $is_first ) { + if ( get_post_mime_type( (int) $val ) ) { + $meta_val = wp_get_attachment_url( $val ); + } else { + $meta_val = $val; + } + $is_first = false; + } else { + if ( get_post_mime_type( (int) $val ) ) { + $meta_val = $meta_val . ', ' . wp_get_attachment_url( $val ); + } else { + $meta_val = $meta_val . ', ' . $val; + } + } + + if ( get_post_mime_type( (int) $val ) ) { + $meta_val = $meta_val . ',' . wp_get_attachment_url( $val ); + } else { + $meta_val = $meta_val . ',' . $val; + } + } + $original_value = $original_value . $meta_val; + } else { + if ( 'address_field' === $meta_key ) { + $value = get_post_meta( $post_id, $meta_key, true ); + $new_value = implode( ', ', $value ); + } + + if ( get_post_mime_type( (int) $new_value ) ) { + $original_value = wp_get_attachment_url( $new_value ); + } else { + $original_value = $new_value; + } + } + + $content = str_replace( $search[ $index ], $original_value, $content ); + } + } + + return $content; + } }