Plugin Directory

Changeset 3457552


Ignore:
Timestamp:
02/09/2026 11:21:34 PM (8 weeks ago)
Author:
ryanhungate
Message:

pre-release 6.0

Location:
mailchimp-for-woocommerce/trunk
Files:
29 added
33 edited

Legend:

Unmodified
Added
Removed
  • mailchimp-for-woocommerce/trunk/CHANGELOG.txt

    r3433839 r3457552  
    11== Changelog ==
     2= 6.0 =
     3* Adds WooCommerce Order Fulfillments tracking
     4* Adds SMS phone number field with consent for checkout
     5* Adds Bi-directional SMS contact sync
     6* Adds Order creation error handling
     7* Adds Customer skip sync logging
     8* Fixes Fatal error in subscription payment processing
     9* Fixes Cart update incorrectly setting subscriber status to transactional
     10* Fixes Backorders status sync between WooCommerce and Mailchimp
     11* Fixes Sync status icon positioning in admin
     12* Fixes PHP deprecated parameter warnings on plugin connection
     13* Fixes Undefined array key "SERVER_NAME" log warnings
     14* Updates plugin metadata
     15* Updates js-yaml to 4.1.1
     16* Updates node-forge to 1.3.2
     17* Updates qs to 6.14.1 and express to 4.22.1
     18* Updates lodash to 4.17.23
     19* Updates playwright to 1.56.1
     20* Updates tar-fs to 3.1.1
     21* Removes unused functions
     22* Updates plugin metadata
    223= 5.7 =
    324* Fixes error when order is not created yet and removes unused function.
  • mailchimp-for-woocommerce/trunk/README.txt

    r3433839 r3457552  
    7979
    8080== Changelog ==
    81 = 5.7 =
    82 * Fixes error when order is not created yet and removes unused function.
    83 * Fixes Fatal Error scheduled subscription payment processing
    84 * Fixes PHP warnings throwing Undefined array key “SERVER_NAME”
    85 * Fixes Mailchimp backorders status issues
    86 * Add better support for current PHP versions
    87 * Fixes sync-status-icon positioning issue in plugins dashboard
    88 * Bumps node-forge from 1.3.1 to 1.3.2 in /blocks
    89 * Bumps to js-yaml in /blocks
    90 * Bumps to playwright and @playwright/test in /blocks
    91 * Bumps to tar-fs from 3.0.9 to 3.1.1 in /blocks
     81= 6.0 =
     82* Adds WooCommerce Order Fulfillments tracking
     83* Adds SMS phone number field with consent for checkout
     84* Adds Bi-directional SMS contact sync
     85* Adds Order creation error handling
     86* Adds Customer skip sync logging
     87* Fixes Fatal error in subscription payment processing
     88* Fixes Cart update incorrectly setting subscriber status to transactional
     89* Fixes Backorders status sync between WooCommerce and Mailchimp
     90* Fixes Sync status icon positioning in admin
     91* Fixes PHP deprecated parameter warnings on plugin connection
     92* Fixes Undefined array key "SERVER_NAME" log warnings
     93* Updates plugin metadata
     94* Updates js-yaml to 4.1.1
     95* Updates node-forge to 1.3.2
     96* Updates qs to 6.14.1 and express to 4.22.1
     97* Updates lodash to 4.17.23
     98* Updates playwright to 1.56.1
     99* Updates tar-fs to 3.1.1
     100* Removes unused functions
     101* Updates plugin metadata
  • mailchimp-for-woocommerce/trunk/admin/class-mailchimp-woocommerce-admin.php

    r3433839 r3457552  
    13751375            'mailchimp_permission_cap'    => $permissions,
    13761376            'mailchimp_checkbox_action'   => isset( $input['mailchimp_checkbox_action'] ) ? $input['mailchimp_checkbox_action'] : $this->getOption( 'mailchimp_checkbox_action', 'woocommerce_after_checkout_billing_form' ),
     1377            'mailchimp_sms_consent_enabled'   => isset( $input['mailchimp_sms_consent_enabled'] ) ? $input['mailchimp_sms_consent_enabled'] : $this->getOption( 'mailchimp_sms_consent_enabled', false ),
    13771378            'mailchimp_product_image_key' => isset( $input['mailchimp_product_image_key'] ) ? $input['mailchimp_product_image_key'] : 'medium',
    13781379            'newsletter_label'              => ( isset( $input['newsletter_label'] ) ) ? wp_kses( $input['newsletter_label'], $allowed_html ) : $this->getOption( 'newsletter_label', __( 'Subscribe to our newsletter', 'mailchimp-for-woocommerce' ) ),
  • mailchimp-for-woocommerce/trunk/admin/v2/processes/class-mailchimp-woocommerce-event.php

    r3433839 r3457552  
    158158            }
    159159
    160             mailchimp_debug('event_tracer', $this->object_detail, array(
    161                 'id' => isset($response['headers']) && isset($response['headers']['event_id']) ? $response['headers']['event_id'] : 'none'
    162             ));
     160            if (defined('MAILCHIMP_DEBUG') && MAILCHIMP_DEBUG === true) {
     161                mailchimp_debug('event_tracer', $this->object_detail, array(
     162                    'id' => isset($response['headers']) && isset($response['headers']['event_id']) ? $response['headers']['event_id'] : 'none'
     163                ));
     164            }
    163165
    164166            return json_decode( $response['body'] );
     
    237239
    238240        if (empty($this->user_id)) {
    239             mailchimp_log('mailchimp_events', "mailchimp beacon :: sending anonymous event");
     241            if (defined('MAILCHIMP_DEBUG') && MAILCHIMP_DEBUG === true) {
     242                mailchimp_debug('mailchimp_events', "mailchimp beacon :: sending anonymous event");
     243            }
    240244            // remove the user id and login id if we don't have this info yet.
    241245            unset($payload['context']['user_id'], $payload['context']['login_id']);
     
    251255        }
    252256
    253         mailchimp_debug('mailchimp_events', "mailchimp beacon tracking payload {$this->event}", $payload);
     257        if (defined('MAILCHIMP_DEBUG') && MAILCHIMP_DEBUG === true) {
     258            mailchimp_debug('mailchimp_events', "mailchimp beacon tracking payload {$this->event}", $payload);
     259        }
    254260
    255261        return $payload;
  • mailchimp-for-woocommerce/trunk/admin/v2/templates/confirmation/tabs/audience.php

    r3346450 r3457552  
    163163        </div>
    164164    </div>
     165
     166    <!-- SMS Marketing Consent Settings -->
     167    <div class="mc-wc-tab-content-box has-underline">
     168        <div class="mc-wc-tab-content-title">
     169            <h3><?php esc_html_e( 'SMS Marketing Consent', 'mailchimp-for-woocommerce' ); ?></h3>
     170        </div>
     171        <div class="mc-wc-tab-content-description-small">
     172            <?php esc_html_e( 'Collect SMS marketing consent at checkout and sync phone numbers to Mailchimp for SMS campaigns.', 'mailchimp-for-woocommerce' ); ?>
     173        </div>
     174       
     175        <?php
     176            $sms_enabled = ( array_key_exists( 'mailchimp_sms_enabled', $options ) && ! is_null( $options['mailchimp_sms_enabled'] ) ) ? (bool) $options['mailchimp_sms_enabled'] : false;
     177        ?>
     178       
     179        <!-- Enable SMS Checkbox -->
     180        <div class="mc-wc-contact-import-ref-choose" style="margin-bottom: 20px;">
     181            <div class="mc-wc-import-list-sync">
     182                <div class="mc-wc-import-list-sync-item">
     183                    <div class="mc-wc-import-list-sync-input">
     184                        <div class="mc-wc-checkbox">
     185                            <label class="mc-wc-checkbox-label fw-700">
     186                                <input type="checkbox" id="mailchimp_sms_enabled" name="<?php echo esc_attr( $this->plugin_name ); ?>[mailchimp_sms_enabled]" value="1" <?php if ($sms_enabled) { echo "checked"; } ?>>
     187                                <?php esc_html_e( 'Enable SMS consent collection at checkout', 'mailchimp-for-woocommerce' ); ?>
     188                            </label>
     189                        </div>
     190                    </div>
     191                    <div class="mc-wc-import-list-sync-description">
     192                        <?php esc_html_e( 'Note: Your Mailchimp account must have an approved SMS application to use this feature. The SMS consent checkbox will appear unchecked by default at checkout with compliant label and disclaimer text.', 'mailchimp-for-woocommerce' ); ?>
     193                    </div>
     194                </div>
     195            </div>
     196        </div>
     197    </div>
    165198</div>
  • mailchimp-for-woocommerce/trunk/admin/v2/templates/confirmation/tabs/overview.php

    r3433839 r3457552  
    8484
    8585    }
    86     //  try {
    87 //      $mailchimp_total_subscribers = $mailchimp_api->getSubscribedCount( $store->getListId() );
    88 //  } catch ( Exception $e ) {
    89 //      $mailchimp_total_subscribers = 0; }
    90 //  try {
    91 //      $mailchimp_total_transactional = $mailchimp_api->getTransactionalCount( $store->getListId() );
    92 //  } catch ( Exception $e ) {
    93 //      $mailchimp_total_transactional = 0;
    94 //    }
    9586}
    9687
  • mailchimp-for-woocommerce/trunk/admin/v2/templates/confirmation/tabs/store-info.php

    r3209992 r3457552  
    2727    );
    2828
    29     $opt_in_settings = apply_filters('mailchimp_checkout_opt_in_options', $default_opt_in_settings);;
    30 ?>
     29    $opt_in_settings = apply_filters('mailchimp_checkout_opt_in_options', $default_opt_in_settings);
     30    ?>
    3131<input type="hidden" name="mailchimp_active_settings_tab" value="<?php echo MC_WC_STORE_INFO_TAB; ?>"/>
    3232<input type="hidden" value="<?php echo ( esc_attr( isset( $current_currency_data ) ? $current_currency . ' | ' . $current_currency_data['name'] : $current_currency ) ); ?>" disabled/>
     
    136136                </p>
    137137            </div>
     138
     139            <?php if (Mailchimp_Sms_Consent::isEligibleCountry()): ?>
     140            <div class="mc-wc-input-wrapper">
     141                <div class="mc-wc-checkbox">
     142                    <label class="mc-wc-checkbox-label fw-700">
     143                        <input type="checkbox" name="<?php echo esc_attr( $this->plugin_name ); ?>[mailchimp_sms_consent_enabled]" value="1" <?php if ($options['mailchimp_sms_consent_enabled']) { echo "checked"; } ?>>
     144                        <?php esc_html_e( 'Enable SMS consent in checkout', 'mailchimp-for-woocommerce' ); ?>
     145                    </label>
     146                </div>
     147            </div>
     148            <?php endif; ?>
     149
    138150        <?php endif; ?>
    139151    </div>
  • mailchimp-for-woocommerce/trunk/blocks/composer.json

    r2940866 r3457552  
    99  },
    1010  "require-dev": {
    11     "phpunit/phpunit": "5.7.19",
     11    "phpunit/phpunit": "8.5.52",
    1212    "sirbrillig/spies": "^1.5"
    1313  },
  • mailchimp-for-woocommerce/trunk/blocks/composer.lock

    r2865898 r3457552  
    55        "This file is @generated automatically"
    66    ],
    7     "content-hash": "b57f7d9fff58efcf93ae2b5722bfa630",
     7    "content-hash": "722e36cbd086f7314eae6730b576dd9a",
    88    "packages": [
    99        {
     
    162162        {
    163163            "name": "doctrine/instantiator",
    164             "version": "1.4.1",
     164            "version": "1.5.0",
    165165            "source": {
    166166                "type": "git",
    167167                "url": "https://github.com/doctrine/instantiator.git",
    168                 "reference": "10dcfce151b967d20fde1b34ae6640712c3891bc"
    169             },
    170             "dist": {
    171                 "type": "zip",
    172                 "url": "https://api.github.com/repos/doctrine/instantiator/zipball/10dcfce151b967d20fde1b34ae6640712c3891bc",
    173                 "reference": "10dcfce151b967d20fde1b34ae6640712c3891bc",
     168                "reference": "0a0fa9780f5d4e507415a065172d26a98d02047b"
     169            },
     170            "dist": {
     171                "type": "zip",
     172                "url": "https://api.github.com/repos/doctrine/instantiator/zipball/0a0fa9780f5d4e507415a065172d26a98d02047b",
     173                "reference": "0a0fa9780f5d4e507415a065172d26a98d02047b",
    174174                "shasum": ""
    175175            },
     
    178178            },
    179179            "require-dev": {
    180                 "doctrine/coding-standard": "^9",
     180                "doctrine/coding-standard": "^9 || ^11",
    181181                "ext-pdo": "*",
    182182                "ext-phar": "*",
     
    185185                "phpstan/phpstan-phpunit": "^1",
    186186                "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5",
    187                 "vimeo/psalm": "^4.22"
     187                "vimeo/psalm": "^4.30 || ^5.4"
    188188            },
    189189            "type": "library",
     
    212212            "support": {
    213213                "issues": "https://github.com/doctrine/instantiator/issues",
    214                 "source": "https://github.com/doctrine/instantiator/tree/1.4.1"
     214                "source": "https://github.com/doctrine/instantiator/tree/1.5.0"
    215215            },
    216216            "funding": [
     
    228228                }
    229229            ],
    230             "time": "2022-03-03T08:28:38+00:00"
     230            "time": "2022-12-30T00:15:36+00:00"
    231231        },
    232232        {
    233233            "name": "myclabs/deep-copy",
    234             "version": "1.11.0",
     234            "version": "1.13.4",
    235235            "source": {
    236236                "type": "git",
    237237                "url": "https://github.com/myclabs/DeepCopy.git",
    238                 "reference": "14daed4296fae74d9e3201d2c4925d1acb7aa614"
    239             },
    240             "dist": {
    241                 "type": "zip",
    242                 "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/14daed4296fae74d9e3201d2c4925d1acb7aa614",
    243                 "reference": "14daed4296fae74d9e3201d2c4925d1acb7aa614",
     238                "reference": "07d290f0c47959fd5eed98c95ee5602db07e0b6a"
     239            },
     240            "dist": {
     241                "type": "zip",
     242                "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/07d290f0c47959fd5eed98c95ee5602db07e0b6a",
     243                "reference": "07d290f0c47959fd5eed98c95ee5602db07e0b6a",
    244244                "shasum": ""
    245245            },
     
    249249            "conflict": {
    250250                "doctrine/collections": "<1.6.8",
    251                 "doctrine/common": "<2.13.3 || >=3,<3.2.2"
     251                "doctrine/common": "<2.13.3 || >=3 <3.2.2"
    252252            },
    253253            "require-dev": {
    254254                "doctrine/collections": "^1.6.8",
    255255                "doctrine/common": "^2.13.3 || ^3.2.2",
     256                "phpspec/prophecy": "^1.10",
    256257                "phpunit/phpunit": "^7.5.20 || ^8.5.23 || ^9.5.13"
    257258            },
     
    279280            "support": {
    280281                "issues": "https://github.com/myclabs/DeepCopy/issues",
    281                 "source": "https://github.com/myclabs/DeepCopy/tree/1.11.0"
     282                "source": "https://github.com/myclabs/DeepCopy/tree/1.13.4"
    282283            },
    283284            "funding": [
     
    287288                }
    288289            ],
    289             "time": "2022-03-03T13:19:32+00:00"
    290         },
    291         {
    292             "name": "phpdocumentor/reflection-common",
    293             "version": "2.2.0",
    294             "source": {
    295                 "type": "git",
    296                 "url": "https://github.com/phpDocumentor/ReflectionCommon.git",
    297                 "reference": "1d01c49d4ed62f25aa84a747ad35d5a16924662b"
    298             },
    299             "dist": {
    300                 "type": "zip",
    301                 "url": "https://api.github.com/repos/phpDocumentor/ReflectionCommon/zipball/1d01c49d4ed62f25aa84a747ad35d5a16924662b",
    302                 "reference": "1d01c49d4ed62f25aa84a747ad35d5a16924662b",
    303                 "shasum": ""
    304             },
    305             "require": {
     290            "time": "2025-08-01T08:46:24+00:00"
     291        },
     292        {
     293            "name": "phar-io/manifest",
     294            "version": "2.0.4",
     295            "source": {
     296                "type": "git",
     297                "url": "https://github.com/phar-io/manifest.git",
     298                "reference": "54750ef60c58e43759730615a392c31c80e23176"
     299            },
     300            "dist": {
     301                "type": "zip",
     302                "url": "https://api.github.com/repos/phar-io/manifest/zipball/54750ef60c58e43759730615a392c31c80e23176",
     303                "reference": "54750ef60c58e43759730615a392c31c80e23176",
     304                "shasum": ""
     305            },
     306            "require": {
     307                "ext-dom": "*",
     308                "ext-libxml": "*",
     309                "ext-phar": "*",
     310                "ext-xmlwriter": "*",
     311                "phar-io/version": "^3.0.1",
    306312                "php": "^7.2 || ^8.0"
    307313            },
     
    309315            "extra": {
    310316                "branch-alias": {
    311                     "dev-2.x": "2.x-dev"
    312                 }
    313             },
    314             "autoload": {
    315                 "psr-4": {
    316                     "phpDocumentor\\Reflection\\": "src/"
    317                 }
    318             },
    319             "notification-url": "https://packagist.org/downloads/",
    320             "license": [
    321                 "MIT"
    322             ],
    323             "authors": [
    324                 {
    325                     "name": "Jaap van Otterdijk",
    326                     "email": "opensource@ijaap.nl"
    327                 }
    328             ],
    329             "description": "Common reflection classes used by phpdocumentor to reflect the code structure",
    330             "homepage": "http://www.phpdoc.org",
    331             "keywords": [
    332                 "FQSEN",
    333                 "phpDocumentor",
    334                 "phpdoc",
    335                 "reflection",
    336                 "static analysis"
    337             ],
    338             "support": {
    339                 "issues": "https://github.com/phpDocumentor/ReflectionCommon/issues",
    340                 "source": "https://github.com/phpDocumentor/ReflectionCommon/tree/2.x"
    341             },
    342             "time": "2020-06-27T09:03:43+00:00"
    343         },
    344         {
    345             "name": "phpdocumentor/reflection-docblock",
    346             "version": "5.3.0",
    347             "source": {
    348                 "type": "git",
    349                 "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git",
    350                 "reference": "622548b623e81ca6d78b721c5e029f4ce664f170"
    351             },
    352             "dist": {
    353                 "type": "zip",
    354                 "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/622548b623e81ca6d78b721c5e029f4ce664f170",
    355                 "reference": "622548b623e81ca6d78b721c5e029f4ce664f170",
    356                 "shasum": ""
    357             },
    358             "require": {
    359                 "ext-filter": "*",
    360                 "php": "^7.2 || ^8.0",
    361                 "phpdocumentor/reflection-common": "^2.2",
    362                 "phpdocumentor/type-resolver": "^1.3",
    363                 "webmozart/assert": "^1.9.1"
    364             },
    365             "require-dev": {
    366                 "mockery/mockery": "~1.3.2",
    367                 "psalm/phar": "^4.8"
    368             },
    369             "type": "library",
    370             "extra": {
    371                 "branch-alias": {
    372                     "dev-master": "5.x-dev"
    373                 }
    374             },
    375             "autoload": {
    376                 "psr-4": {
    377                     "phpDocumentor\\Reflection\\": "src"
    378                 }
    379             },
    380             "notification-url": "https://packagist.org/downloads/",
    381             "license": [
    382                 "MIT"
    383             ],
    384             "authors": [
    385                 {
    386                     "name": "Mike van Riel",
    387                     "email": "me@mikevanriel.com"
    388                 },
    389                 {
    390                     "name": "Jaap van Otterdijk",
    391                     "email": "account@ijaap.nl"
    392                 }
    393             ],
    394             "description": "With this component, a library can provide support for annotations via DocBlocks or otherwise retrieve information that is embedded in a DocBlock.",
    395             "support": {
    396                 "issues": "https://github.com/phpDocumentor/ReflectionDocBlock/issues",
    397                 "source": "https://github.com/phpDocumentor/ReflectionDocBlock/tree/5.3.0"
    398             },
    399             "time": "2021-10-19T17:43:47+00:00"
    400         },
    401         {
    402             "name": "phpdocumentor/type-resolver",
    403             "version": "1.6.2",
    404             "source": {
    405                 "type": "git",
    406                 "url": "https://github.com/phpDocumentor/TypeResolver.git",
    407                 "reference": "48f445a408c131e38cab1c235aa6d2bb7a0bb20d"
    408             },
    409             "dist": {
    410                 "type": "zip",
    411                 "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/48f445a408c131e38cab1c235aa6d2bb7a0bb20d",
    412                 "reference": "48f445a408c131e38cab1c235aa6d2bb7a0bb20d",
    413                 "shasum": ""
    414             },
    415             "require": {
    416                 "php": "^7.4 || ^8.0",
    417                 "phpdocumentor/reflection-common": "^2.0"
    418             },
    419             "require-dev": {
    420                 "ext-tokenizer": "*",
    421                 "phpstan/extension-installer": "^1.1",
    422                 "phpstan/phpstan": "^1.8",
    423                 "phpstan/phpstan-phpunit": "^1.1",
    424                 "phpunit/phpunit": "^9.5",
    425                 "rector/rector": "^0.13.9",
    426                 "vimeo/psalm": "^4.25"
    427             },
    428             "type": "library",
    429             "extra": {
    430                 "branch-alias": {
    431                     "dev-1.x": "1.x-dev"
    432                 }
    433             },
    434             "autoload": {
    435                 "psr-4": {
    436                     "phpDocumentor\\Reflection\\": "src"
    437                 }
    438             },
    439             "notification-url": "https://packagist.org/downloads/",
    440             "license": [
    441                 "MIT"
    442             ],
    443             "authors": [
    444                 {
    445                     "name": "Mike van Riel",
    446                     "email": "me@mikevanriel.com"
    447                 }
    448             ],
    449             "description": "A PSR-5 based resolver of Class names, Types and Structural Element Names",
    450             "support": {
    451                 "issues": "https://github.com/phpDocumentor/TypeResolver/issues",
    452                 "source": "https://github.com/phpDocumentor/TypeResolver/tree/1.6.2"
    453             },
    454             "time": "2022-10-14T12:47:21+00:00"
    455         },
    456         {
    457             "name": "phpspec/prophecy",
    458             "version": "v1.10.3",
    459             "source": {
    460                 "type": "git",
    461                 "url": "https://github.com/phpspec/prophecy.git",
    462                 "reference": "451c3cd1418cf640de218914901e51b064abb093"
    463             },
    464             "dist": {
    465                 "type": "zip",
    466                 "url": "https://api.github.com/repos/phpspec/prophecy/zipball/451c3cd1418cf640de218914901e51b064abb093",
    467                 "reference": "451c3cd1418cf640de218914901e51b064abb093",
    468                 "shasum": ""
    469             },
    470             "require": {
    471                 "doctrine/instantiator": "^1.0.2",
    472                 "php": "^5.3|^7.0",
    473                 "phpdocumentor/reflection-docblock": "^2.0|^3.0.2|^4.0|^5.0",
    474                 "sebastian/comparator": "^1.2.3|^2.0|^3.0|^4.0",
    475                 "sebastian/recursion-context": "^1.0|^2.0|^3.0|^4.0"
    476             },
    477             "require-dev": {
    478                 "phpspec/phpspec": "^2.5 || ^3.2",
    479                 "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.5 || ^7.1"
    480             },
    481             "type": "library",
    482             "extra": {
    483                 "branch-alias": {
    484                     "dev-master": "1.10.x-dev"
    485                 }
    486             },
    487             "autoload": {
    488                 "psr-4": {
    489                     "Prophecy\\": "src/Prophecy"
    490                 }
    491             },
    492             "notification-url": "https://packagist.org/downloads/",
    493             "license": [
    494                 "MIT"
    495             ],
    496             "authors": [
    497                 {
    498                     "name": "Konstantin Kudryashov",
    499                     "email": "ever.zet@gmail.com",
    500                     "homepage": "http://everzet.com"
    501                 },
    502                 {
    503                     "name": "Marcello Duarte",
    504                     "email": "marcello.duarte@gmail.com"
    505                 }
    506             ],
    507             "description": "Highly opinionated mocking framework for PHP 5.3+",
    508             "homepage": "https://github.com/phpspec/prophecy",
    509             "keywords": [
    510                 "Double",
    511                 "Dummy",
    512                 "fake",
    513                 "mock",
    514                 "spy",
    515                 "stub"
    516             ],
    517             "support": {
    518                 "issues": "https://github.com/phpspec/prophecy/issues",
    519                 "source": "https://github.com/phpspec/prophecy/tree/v1.10.3"
    520             },
    521             "time": "2020-03-05T15:02:03+00:00"
     317                    "dev-master": "2.0.x-dev"
     318                }
     319            },
     320            "autoload": {
     321                "classmap": [
     322                    "src/"
     323                ]
     324            },
     325            "notification-url": "https://packagist.org/downloads/",
     326            "license": [
     327                "BSD-3-Clause"
     328            ],
     329            "authors": [
     330                {
     331                    "name": "Arne Blankerts",
     332                    "email": "arne@blankerts.de",
     333                    "role": "Developer"
     334                },
     335                {
     336                    "name": "Sebastian Heuer",
     337                    "email": "sebastian@phpeople.de",
     338                    "role": "Developer"
     339                },
     340                {
     341                    "name": "Sebastian Bergmann",
     342                    "email": "sebastian@phpunit.de",
     343                    "role": "Developer"
     344                }
     345            ],
     346            "description": "Component for reading phar.io manifest information from a PHP Archive (PHAR)",
     347            "support": {
     348                "issues": "https://github.com/phar-io/manifest/issues",
     349                "source": "https://github.com/phar-io/manifest/tree/2.0.4"
     350            },
     351            "funding": [
     352                {
     353                    "url": "https://github.com/theseer",
     354                    "type": "github"
     355                }
     356            ],
     357            "time": "2024-03-03T12:33:53+00:00"
     358        },
     359        {
     360            "name": "phar-io/version",
     361            "version": "3.2.1",
     362            "source": {
     363                "type": "git",
     364                "url": "https://github.com/phar-io/version.git",
     365                "reference": "4f7fd7836c6f332bb2933569e566a0d6c4cbed74"
     366            },
     367            "dist": {
     368                "type": "zip",
     369                "url": "https://api.github.com/repos/phar-io/version/zipball/4f7fd7836c6f332bb2933569e566a0d6c4cbed74",
     370                "reference": "4f7fd7836c6f332bb2933569e566a0d6c4cbed74",
     371                "shasum": ""
     372            },
     373            "require": {
     374                "php": "^7.2 || ^8.0"
     375            },
     376            "type": "library",
     377            "autoload": {
     378                "classmap": [
     379                    "src/"
     380                ]
     381            },
     382            "notification-url": "https://packagist.org/downloads/",
     383            "license": [
     384                "BSD-3-Clause"
     385            ],
     386            "authors": [
     387                {
     388                    "name": "Arne Blankerts",
     389                    "email": "arne@blankerts.de",
     390                    "role": "Developer"
     391                },
     392                {
     393                    "name": "Sebastian Heuer",
     394                    "email": "sebastian@phpeople.de",
     395                    "role": "Developer"
     396                },
     397                {
     398                    "name": "Sebastian Bergmann",
     399                    "email": "sebastian@phpunit.de",
     400                    "role": "Developer"
     401                }
     402            ],
     403            "description": "Library for handling version information and constraints",
     404            "support": {
     405                "issues": "https://github.com/phar-io/version/issues",
     406                "source": "https://github.com/phar-io/version/tree/3.2.1"
     407            },
     408            "time": "2022-02-21T01:04:05+00:00"
    522409        },
    523410        {
    524411            "name": "phpunit/php-code-coverage",
    525             "version": "4.0.8",
     412            "version": "7.0.17",
    526413            "source": {
    527414                "type": "git",
    528415                "url": "https://github.com/sebastianbergmann/php-code-coverage.git",
    529                 "reference": "ef7b2f56815df854e66ceaee8ebe9393ae36a40d"
    530             },
    531             "dist": {
    532                 "type": "zip",
    533                 "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/ef7b2f56815df854e66ceaee8ebe9393ae36a40d",
    534                 "reference": "ef7b2f56815df854e66ceaee8ebe9393ae36a40d",
     416                "reference": "40a4ed114a4aea5afd6df8d0f0c9cd3033097f66"
     417            },
     418            "dist": {
     419                "type": "zip",
     420                "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/40a4ed114a4aea5afd6df8d0f0c9cd3033097f66",
     421                "reference": "40a4ed114a4aea5afd6df8d0f0c9cd3033097f66",
    535422                "shasum": ""
    536423            },
     
    538425                "ext-dom": "*",
    539426                "ext-xmlwriter": "*",
    540                 "php": "^5.6 || ^7.0",
    541                 "phpunit/php-file-iterator": "^1.3",
    542                 "phpunit/php-text-template": "^1.2",
    543                 "phpunit/php-token-stream": "^1.4.2 || ^2.0",
    544                 "sebastian/code-unit-reverse-lookup": "^1.0",
    545                 "sebastian/environment": "^1.3.2 || ^2.0",
    546                 "sebastian/version": "^1.0 || ^2.0"
     427                "php": ">=7.2",
     428                "phpunit/php-file-iterator": "^2.0.2",
     429                "phpunit/php-text-template": "^1.2.1",
     430                "phpunit/php-token-stream": "^3.1.3 || ^4.0",
     431                "sebastian/code-unit-reverse-lookup": "^1.0.1",
     432                "sebastian/environment": "^4.2.2",
     433                "sebastian/version": "^2.0.1",
     434                "theseer/tokenizer": "^1.1.3"
    547435            },
    548436            "require-dev": {
    549                 "ext-xdebug": "^2.1.4",
    550                 "phpunit/phpunit": "^5.7"
     437                "phpunit/phpunit": "^8.2.2"
    551438            },
    552439            "suggest": {
    553                 "ext-xdebug": "^2.5.1"
    554             },
    555             "type": "library",
    556             "extra": {
    557                 "branch-alias": {
    558                     "dev-master": "4.0.x-dev"
    559                 }
    560             },
    561             "autoload": {
    562                 "classmap": [
    563                     "src/"
    564                 ]
    565             },
    566             "notification-url": "https://packagist.org/downloads/",
    567             "license": [
    568                 "BSD-3-Clause"
    569             ],
    570             "authors": [
    571                 {
    572                     "name": "Sebastian Bergmann",
    573                     "email": "sb@sebastian-bergmann.de",
     440                "ext-xdebug": "^2.7.2"
     441            },
     442            "type": "library",
     443            "extra": {
     444                "branch-alias": {
     445                    "dev-master": "7.0-dev"
     446                }
     447            },
     448            "autoload": {
     449                "classmap": [
     450                    "src/"
     451                ]
     452            },
     453            "notification-url": "https://packagist.org/downloads/",
     454            "license": [
     455                "BSD-3-Clause"
     456            ],
     457            "authors": [
     458                {
     459                    "name": "Sebastian Bergmann",
     460                    "email": "sebastian@phpunit.de",
    574461                    "role": "lead"
    575462                }
     
    583470            ],
    584471            "support": {
    585                 "irc": "irc://irc.freenode.net/phpunit",
    586472                "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues",
    587                 "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/4.0"
    588             },
    589             "time": "2017-04-02T07:44:40+00:00"
     473                "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/7.0.17"
     474            },
     475            "funding": [
     476                {
     477                    "url": "https://github.com/sebastianbergmann",
     478                    "type": "github"
     479                }
     480            ],
     481            "time": "2024-03-02T06:09:37+00:00"
    590482        },
    591483        {
    592484            "name": "phpunit/php-file-iterator",
    593             "version": "1.4.5",
     485            "version": "2.0.6",
    594486            "source": {
    595487                "type": "git",
    596488                "url": "https://github.com/sebastianbergmann/php-file-iterator.git",
    597                 "reference": "730b01bc3e867237eaac355e06a36b85dd93a8b4"
    598             },
    599             "dist": {
    600                 "type": "zip",
    601                 "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/730b01bc3e867237eaac355e06a36b85dd93a8b4",
    602                 "reference": "730b01bc3e867237eaac355e06a36b85dd93a8b4",
    603                 "shasum": ""
    604             },
    605             "require": {
    606                 "php": ">=5.3.3"
    607             },
    608             "type": "library",
    609             "extra": {
    610                 "branch-alias": {
    611                     "dev-master": "1.4.x-dev"
    612                 }
    613             },
    614             "autoload": {
    615                 "classmap": [
    616                     "src/"
    617                 ]
    618             },
    619             "notification-url": "https://packagist.org/downloads/",
    620             "license": [
    621                 "BSD-3-Clause"
    622             ],
    623             "authors": [
    624                 {
    625                     "name": "Sebastian Bergmann",
    626                     "email": "sb@sebastian-bergmann.de",
     489                "reference": "69deeb8664f611f156a924154985fbd4911eb36b"
     490            },
     491            "dist": {
     492                "type": "zip",
     493                "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/69deeb8664f611f156a924154985fbd4911eb36b",
     494                "reference": "69deeb8664f611f156a924154985fbd4911eb36b",
     495                "shasum": ""
     496            },
     497            "require": {
     498                "php": ">=7.1"
     499            },
     500            "require-dev": {
     501                "phpunit/phpunit": "^8.5"
     502            },
     503            "type": "library",
     504            "extra": {
     505                "branch-alias": {
     506                    "dev-master": "2.0.x-dev"
     507                }
     508            },
     509            "autoload": {
     510                "classmap": [
     511                    "src/"
     512                ]
     513            },
     514            "notification-url": "https://packagist.org/downloads/",
     515            "license": [
     516                "BSD-3-Clause"
     517            ],
     518            "authors": [
     519                {
     520                    "name": "Sebastian Bergmann",
     521                    "email": "sebastian@phpunit.de",
    627522                    "role": "lead"
    628523                }
     
    635530            ],
    636531            "support": {
    637                 "irc": "irc://irc.freenode.net/phpunit",
    638532                "issues": "https://github.com/sebastianbergmann/php-file-iterator/issues",
    639                 "source": "https://github.com/sebastianbergmann/php-file-iterator/tree/1.4.5"
    640             },
    641             "time": "2017-11-27T13:52:08+00:00"
     533                "source": "https://github.com/sebastianbergmann/php-file-iterator/tree/2.0.6"
     534            },
     535            "funding": [
     536                {
     537                    "url": "https://github.com/sebastianbergmann",
     538                    "type": "github"
     539                }
     540            ],
     541            "time": "2024-03-01T13:39:50+00:00"
    642542        },
    643543        {
     
    688588        {
    689589            "name": "phpunit/php-timer",
    690             "version": "1.0.9",
     590            "version": "2.1.4",
    691591            "source": {
    692592                "type": "git",
    693593                "url": "https://github.com/sebastianbergmann/php-timer.git",
    694                 "reference": "3dcf38ca72b158baf0bc245e9184d3fdffa9c46f"
    695             },
    696             "dist": {
    697                 "type": "zip",
    698                 "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/3dcf38ca72b158baf0bc245e9184d3fdffa9c46f",
    699                 "reference": "3dcf38ca72b158baf0bc245e9184d3fdffa9c46f",
    700                 "shasum": ""
    701             },
    702             "require": {
    703                 "php": "^5.3.3 || ^7.0"
     594                "reference": "a691211e94ff39a34811abd521c31bd5b305b0bb"
     595            },
     596            "dist": {
     597                "type": "zip",
     598                "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/a691211e94ff39a34811abd521c31bd5b305b0bb",
     599                "reference": "a691211e94ff39a34811abd521c31bd5b305b0bb",
     600                "shasum": ""
     601            },
     602            "require": {
     603                "php": ">=7.1"
    704604            },
    705605            "require-dev": {
    706                 "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.0"
    707             },
    708             "type": "library",
    709             "extra": {
    710                 "branch-alias": {
    711                     "dev-master": "1.0-dev"
    712                 }
    713             },
    714             "autoload": {
    715                 "classmap": [
    716                     "src/"
    717                 ]
    718             },
    719             "notification-url": "https://packagist.org/downloads/",
    720             "license": [
    721                 "BSD-3-Clause"
    722             ],
    723             "authors": [
    724                 {
    725                     "name": "Sebastian Bergmann",
    726                     "email": "sb@sebastian-bergmann.de",
     606                "phpunit/phpunit": "^8.5"
     607            },
     608            "type": "library",
     609            "extra": {
     610                "branch-alias": {
     611                    "dev-master": "2.1-dev"
     612                }
     613            },
     614            "autoload": {
     615                "classmap": [
     616                    "src/"
     617                ]
     618            },
     619            "notification-url": "https://packagist.org/downloads/",
     620            "license": [
     621                "BSD-3-Clause"
     622            ],
     623            "authors": [
     624                {
     625                    "name": "Sebastian Bergmann",
     626                    "email": "sebastian@phpunit.de",
    727627                    "role": "lead"
    728628                }
     
    735635            "support": {
    736636                "issues": "https://github.com/sebastianbergmann/php-timer/issues",
    737                 "source": "https://github.com/sebastianbergmann/php-timer/tree/master"
    738             },
    739             "time": "2017-02-26T11:10:40+00:00"
     637                "source": "https://github.com/sebastianbergmann/php-timer/tree/2.1.4"
     638            },
     639            "funding": [
     640                {
     641                    "url": "https://github.com/sebastianbergmann",
     642                    "type": "github"
     643                }
     644            ],
     645            "time": "2024-03-01T13:42:41+00:00"
    740646        },
    741647        {
    742648            "name": "phpunit/php-token-stream",
    743             "version": "2.0.2",
     649            "version": "4.0.4",
    744650            "source": {
    745651                "type": "git",
    746652                "url": "https://github.com/sebastianbergmann/php-token-stream.git",
    747                 "reference": "791198a2c6254db10131eecfe8c06670700904db"
    748             },
    749             "dist": {
    750                 "type": "zip",
    751                 "url": "https://api.github.com/repos/sebastianbergmann/php-token-stream/zipball/791198a2c6254db10131eecfe8c06670700904db",
    752                 "reference": "791198a2c6254db10131eecfe8c06670700904db",
     653                "reference": "a853a0e183b9db7eed023d7933a858fa1c8d25a3"
     654            },
     655            "dist": {
     656                "type": "zip",
     657                "url": "https://api.github.com/repos/sebastianbergmann/php-token-stream/zipball/a853a0e183b9db7eed023d7933a858fa1c8d25a3",
     658                "reference": "a853a0e183b9db7eed023d7933a858fa1c8d25a3",
    753659                "shasum": ""
    754660            },
    755661            "require": {
    756662                "ext-tokenizer": "*",
    757                 "php": "^7.0"
     663                "php": "^7.3 || ^8.0"
    758664            },
    759665            "require-dev": {
    760                 "phpunit/phpunit": "^6.2.4"
    761             },
    762             "type": "library",
    763             "extra": {
    764                 "branch-alias": {
    765                     "dev-master": "2.0-dev"
     666                "phpunit/phpunit": "^9.0"
     667            },
     668            "type": "library",
     669            "extra": {
     670                "branch-alias": {
     671                    "dev-master": "4.0-dev"
    766672                }
    767673            },
     
    790696                "source": "https://github.com/sebastianbergmann/php-token-stream/tree/master"
    791697            },
     698            "funding": [
     699                {
     700                    "url": "https://github.com/sebastianbergmann",
     701                    "type": "github"
     702                }
     703            ],
    792704            "abandoned": true,
    793             "time": "2017-11-27T05:48:46+00:00"
     705            "time": "2020-08-04T08:28:15+00:00"
    794706        },
    795707        {
    796708            "name": "phpunit/phpunit",
    797             "version": "5.7.19",
     709            "version": "8.5.52",
    798710            "source": {
    799711                "type": "git",
    800712                "url": "https://github.com/sebastianbergmann/phpunit.git",
    801                 "reference": "69c4f49ff376af2692bad9cebd883d17ebaa98a1"
    802             },
    803             "dist": {
    804                 "type": "zip",
    805                 "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/69c4f49ff376af2692bad9cebd883d17ebaa98a1",
    806                 "reference": "69c4f49ff376af2692bad9cebd883d17ebaa98a1",
    807                 "shasum": ""
    808             },
    809             "require": {
     713                "reference": "1015741814413c156abb0f53d7db7bbd03c6e858"
     714            },
     715            "dist": {
     716                "type": "zip",
     717                "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/1015741814413c156abb0f53d7db7bbd03c6e858",
     718                "reference": "1015741814413c156abb0f53d7db7bbd03c6e858",
     719                "shasum": ""
     720            },
     721            "require": {
     722                "doctrine/instantiator": "^1.5.0",
    810723                "ext-dom": "*",
    811724                "ext-json": "*",
     
    813726                "ext-mbstring": "*",
    814727                "ext-xml": "*",
    815                 "myclabs/deep-copy": "~1.3",
    816                 "php": "^5.6 || ^7.0",
    817                 "phpspec/prophecy": "^1.6.2",
    818                 "phpunit/php-code-coverage": "^4.0.4",
    819                 "phpunit/php-file-iterator": "~1.4",
    820                 "phpunit/php-text-template": "~1.2",
    821                 "phpunit/php-timer": "^1.0.6",
    822                 "phpunit/phpunit-mock-objects": "^3.2",
    823                 "sebastian/comparator": "^1.2.4",
    824                 "sebastian/diff": "~1.2",
    825                 "sebastian/environment": "^1.3.4 || ^2.0",
    826                 "sebastian/exporter": "~2.0",
    827                 "sebastian/global-state": "^1.1",
    828                 "sebastian/object-enumerator": "~2.0",
    829                 "sebastian/resource-operations": "~1.0",
    830                 "sebastian/version": "~1.0.3|~2.0",
    831                 "symfony/yaml": "~2.1|~3.0"
    832             },
    833             "conflict": {
    834                 "phpdocumentor/reflection-docblock": "3.0.2"
    835             },
    836             "require-dev": {
    837                 "ext-pdo": "*"
     728                "ext-xmlwriter": "*",
     729                "myclabs/deep-copy": "^1.13.4",
     730                "phar-io/manifest": "^2.0.4",
     731                "phar-io/version": "^3.2.1",
     732                "php": ">=7.2",
     733                "phpunit/php-code-coverage": "^7.0.17",
     734                "phpunit/php-file-iterator": "^2.0.6",
     735                "phpunit/php-text-template": "^1.2.1",
     736                "phpunit/php-timer": "^2.1.4",
     737                "sebastian/comparator": "^3.0.7",
     738                "sebastian/diff": "^3.0.6",
     739                "sebastian/environment": "^4.2.5",
     740                "sebastian/exporter": "^3.1.8",
     741                "sebastian/global-state": "^3.0.6",
     742                "sebastian/object-enumerator": "^3.0.5",
     743                "sebastian/resource-operations": "^2.0.3",
     744                "sebastian/type": "^1.1.5",
     745                "sebastian/version": "^2.0.1"
    838746            },
    839747            "suggest": {
    840                 "ext-xdebug": "*",
    841                 "phpunit/php-invoker": "~1.1"
     748                "ext-soap": "To be able to generate mocks based on WSDL files",
     749                "ext-xdebug": "PHP extension that provides line coverage as well as branch and path coverage",
     750                "phpunit/php-invoker": "To allow enforcing time limits"
    842751            },
    843752            "bin": [
     
    847756            "extra": {
    848757                "branch-alias": {
    849                     "dev-master": "5.7.x-dev"
     758                    "dev-master": "8.5-dev"
    850759                }
    851760            },
     
    875784            "support": {
    876785                "issues": "https://github.com/sebastianbergmann/phpunit/issues",
    877                 "source": "https://github.com/sebastianbergmann/phpunit/tree/5.7.19"
    878             },
    879             "time": "2017-04-03T02:22:27+00:00"
    880         },
    881         {
    882             "name": "phpunit/phpunit-mock-objects",
    883             "version": "3.4.4",
    884             "source": {
    885                 "type": "git",
    886                 "url": "https://github.com/sebastianbergmann/phpunit-mock-objects.git",
    887                 "reference": "a23b761686d50a560cc56233b9ecf49597cc9118"
    888             },
    889             "dist": {
    890                 "type": "zip",
    891                 "url": "https://api.github.com/repos/sebastianbergmann/phpunit-mock-objects/zipball/a23b761686d50a560cc56233b9ecf49597cc9118",
    892                 "reference": "a23b761686d50a560cc56233b9ecf49597cc9118",
    893                 "shasum": ""
    894             },
    895             "require": {
    896                 "doctrine/instantiator": "^1.0.2",
    897                 "php": "^5.6 || ^7.0",
    898                 "phpunit/php-text-template": "^1.2",
    899                 "sebastian/exporter": "^1.2 || ^2.0"
    900             },
    901             "conflict": {
    902                 "phpunit/phpunit": "<5.4.0"
    903             },
    904             "require-dev": {
    905                 "phpunit/phpunit": "^5.4"
    906             },
    907             "suggest": {
    908                 "ext-soap": "*"
    909             },
    910             "type": "library",
    911             "extra": {
    912                 "branch-alias": {
    913                     "dev-master": "3.2.x-dev"
    914                 }
    915             },
    916             "autoload": {
    917                 "classmap": [
    918                     "src/"
    919                 ]
    920             },
    921             "notification-url": "https://packagist.org/downloads/",
    922             "license": [
    923                 "BSD-3-Clause"
    924             ],
    925             "authors": [
    926                 {
    927                     "name": "Sebastian Bergmann",
    928                     "email": "sb@sebastian-bergmann.de",
    929                     "role": "lead"
    930                 }
    931             ],
    932             "description": "Mock Object library for PHPUnit",
    933             "homepage": "https://github.com/sebastianbergmann/phpunit-mock-objects/",
    934             "keywords": [
    935                 "mock",
    936                 "xunit"
    937             ],
    938             "support": {
    939                 "irc": "irc://irc.freenode.net/phpunit",
    940                 "issues": "https://github.com/sebastianbergmann/phpunit-mock-objects/issues",
    941                 "source": "https://github.com/sebastianbergmann/phpunit-mock-objects/tree/3.4"
    942             },
    943             "abandoned": true,
    944             "time": "2017-06-30T09:13:00+00:00"
     786                "security": "https://github.com/sebastianbergmann/phpunit/security/policy",
     787                "source": "https://github.com/sebastianbergmann/phpunit/tree/8.5.52"
     788            },
     789            "funding": [
     790                {
     791                    "url": "https://phpunit.de/sponsors.html",
     792                    "type": "custom"
     793                },
     794                {
     795                    "url": "https://github.com/sebastianbergmann",
     796                    "type": "github"
     797                },
     798                {
     799                    "url": "https://liberapay.com/sebastianbergmann",
     800                    "type": "liberapay"
     801                },
     802                {
     803                    "url": "https://thanks.dev/u/gh/sebastianbergmann",
     804                    "type": "thanks_dev"
     805                },
     806                {
     807                    "url": "https://tidelift.com/funding/github/packagist/phpunit/phpunit",
     808                    "type": "tidelift"
     809                }
     810            ],
     811            "time": "2026-01-27T05:20:18+00:00"
    945812        },
    946813        {
    947814            "name": "sebastian/code-unit-reverse-lookup",
    948             "version": "1.0.2",
     815            "version": "1.0.3",
    949816            "source": {
    950817                "type": "git",
    951818                "url": "https://github.com/sebastianbergmann/code-unit-reverse-lookup.git",
    952                 "reference": "1de8cd5c010cb153fcd68b8d0f64606f523f7619"
    953             },
    954             "dist": {
    955                 "type": "zip",
    956                 "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/1de8cd5c010cb153fcd68b8d0f64606f523f7619",
    957                 "reference": "1de8cd5c010cb153fcd68b8d0f64606f523f7619",
     819                "reference": "92a1a52e86d34cde6caa54f1b5ffa9fda18e5d54"
     820            },
     821            "dist": {
     822                "type": "zip",
     823                "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/92a1a52e86d34cde6caa54f1b5ffa9fda18e5d54",
     824                "reference": "92a1a52e86d34cde6caa54f1b5ffa9fda18e5d54",
    958825                "shasum": ""
    959826            },
     
    989856            "support": {
    990857                "issues": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/issues",
    991                 "source": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/tree/1.0.2"
     858                "source": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/tree/1.0.3"
    992859            },
    993860            "funding": [
     
    997864                }
    998865            ],
    999             "time": "2020-11-30T08:15:22+00:00"
     866            "time": "2024-03-01T13:45:45+00:00"
    1000867        },
    1001868        {
    1002869            "name": "sebastian/comparator",
    1003             "version": "1.2.4",
     870            "version": "3.0.7",
    1004871            "source": {
    1005872                "type": "git",
    1006873                "url": "https://github.com/sebastianbergmann/comparator.git",
    1007                 "reference": "2b7424b55f5047b47ac6e5ccb20b2aea4011d9be"
    1008             },
    1009             "dist": {
    1010                 "type": "zip",
    1011                 "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/2b7424b55f5047b47ac6e5ccb20b2aea4011d9be",
    1012                 "reference": "2b7424b55f5047b47ac6e5ccb20b2aea4011d9be",
    1013                 "shasum": ""
    1014             },
    1015             "require": {
    1016                 "php": ">=5.3.3",
    1017                 "sebastian/diff": "~1.2",
    1018                 "sebastian/exporter": "~1.2 || ~2.0"
     874                "reference": "bc7d8ac2fe1cce229bff9b5fd4efe65918a1ff52"
     875            },
     876            "dist": {
     877                "type": "zip",
     878                "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/bc7d8ac2fe1cce229bff9b5fd4efe65918a1ff52",
     879                "reference": "bc7d8ac2fe1cce229bff9b5fd4efe65918a1ff52",
     880                "shasum": ""
     881            },
     882            "require": {
     883                "php": ">=7.1",
     884                "sebastian/diff": "^3.0",
     885                "sebastian/exporter": "^3.1"
    1019886            },
    1020887            "require-dev": {
    1021                 "phpunit/phpunit": "~4.4"
    1022             },
    1023             "type": "library",
    1024             "extra": {
    1025                 "branch-alias": {
    1026                     "dev-master": "1.2.x-dev"
    1027                 }
    1028             },
    1029             "autoload": {
    1030                 "classmap": [
    1031                     "src/"
    1032                 ]
    1033             },
    1034             "notification-url": "https://packagist.org/downloads/",
    1035             "license": [
    1036                 "BSD-3-Clause"
    1037             ],
    1038             "authors": [
     888                "phpunit/phpunit": "^8.5"
     889            },
     890            "type": "library",
     891            "extra": {
     892                "branch-alias": {
     893                    "dev-master": "3.0-dev"
     894                }
     895            },
     896            "autoload": {
     897                "classmap": [
     898                    "src/"
     899                ]
     900            },
     901            "notification-url": "https://packagist.org/downloads/",
     902            "license": [
     903                "BSD-3-Clause"
     904            ],
     905            "authors": [
     906                {
     907                    "name": "Sebastian Bergmann",
     908                    "email": "sebastian@phpunit.de"
     909                },
    1039910                {
    1040911                    "name": "Jeff Welch",
     
    1048919                    "name": "Bernhard Schussek",
    1049920                    "email": "bschussek@2bepublished.at"
    1050                 },
    1051                 {
    1052                     "name": "Sebastian Bergmann",
    1053                     "email": "sebastian@phpunit.de"
    1054921                }
    1055922            ],
    1056923            "description": "Provides the functionality to compare PHP values for equality",
    1057             "homepage": "http://www.github.com/sebastianbergmann/comparator",
     924            "homepage": "https://github.com/sebastianbergmann/comparator",
    1058925            "keywords": [
    1059926                "comparator",
     
    1063930            "support": {
    1064931                "issues": "https://github.com/sebastianbergmann/comparator/issues",
    1065                 "source": "https://github.com/sebastianbergmann/comparator/tree/1.2"
    1066             },
    1067             "time": "2017-01-29T09:50:25+00:00"
     932                "source": "https://github.com/sebastianbergmann/comparator/tree/3.0.7"
     933            },
     934            "funding": [
     935                {
     936                    "url": "https://github.com/sebastianbergmann",
     937                    "type": "github"
     938                },
     939                {
     940                    "url": "https://liberapay.com/sebastianbergmann",
     941                    "type": "liberapay"
     942                },
     943                {
     944                    "url": "https://thanks.dev/u/gh/sebastianbergmann",
     945                    "type": "thanks_dev"
     946                },
     947                {
     948                    "url": "https://tidelift.com/funding/github/packagist/sebastian/comparator",
     949                    "type": "tidelift"
     950                }
     951            ],
     952            "time": "2026-01-24T09:20:25+00:00"
    1068953        },
    1069954        {
    1070955            "name": "sebastian/diff",
    1071             "version": "1.4.3",
     956            "version": "3.0.6",
    1072957            "source": {
    1073958                "type": "git",
    1074959                "url": "https://github.com/sebastianbergmann/diff.git",
    1075                 "reference": "7f066a26a962dbe58ddea9f72a4e82874a3975a4"
    1076             },
    1077             "dist": {
    1078                 "type": "zip",
    1079                 "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/7f066a26a962dbe58ddea9f72a4e82874a3975a4",
    1080                 "reference": "7f066a26a962dbe58ddea9f72a4e82874a3975a4",
    1081                 "shasum": ""
    1082             },
    1083             "require": {
    1084                 "php": "^5.3.3 || ^7.0"
     960                "reference": "98ff311ca519c3aa73ccd3de053bdb377171d7b6"
     961            },
     962            "dist": {
     963                "type": "zip",
     964                "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/98ff311ca519c3aa73ccd3de053bdb377171d7b6",
     965                "reference": "98ff311ca519c3aa73ccd3de053bdb377171d7b6",
     966                "shasum": ""
     967            },
     968            "require": {
     969                "php": ">=7.1"
    1085970            },
    1086971            "require-dev": {
    1087                 "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.0"
    1088             },
    1089             "type": "library",
    1090             "extra": {
    1091                 "branch-alias": {
    1092                     "dev-master": "1.4-dev"
    1093                 }
    1094             },
    1095             "autoload": {
    1096                 "classmap": [
    1097                     "src/"
    1098                 ]
    1099             },
    1100             "notification-url": "https://packagist.org/downloads/",
    1101             "license": [
    1102                 "BSD-3-Clause"
    1103             ],
    1104             "authors": [
     972                "phpunit/phpunit": "^7.5 || ^8.0",
     973                "symfony/process": "^2 || ^3.3 || ^4"
     974            },
     975            "type": "library",
     976            "extra": {
     977                "branch-alias": {
     978                    "dev-master": "3.0-dev"
     979                }
     980            },
     981            "autoload": {
     982                "classmap": [
     983                    "src/"
     984                ]
     985            },
     986            "notification-url": "https://packagist.org/downloads/",
     987            "license": [
     988                "BSD-3-Clause"
     989            ],
     990            "authors": [
     991                {
     992                    "name": "Sebastian Bergmann",
     993                    "email": "sebastian@phpunit.de"
     994                },
    1105995                {
    1106996                    "name": "Kore Nordmann",
    1107997                    "email": "mail@kore-nordmann.de"
    1108                 },
    1109                 {
    1110                     "name": "Sebastian Bergmann",
    1111                     "email": "sebastian@phpunit.de"
    1112998                }
    1113999            ],
     
    11151001            "homepage": "https://github.com/sebastianbergmann/diff",
    11161002            "keywords": [
    1117                 "diff"
     1003                "diff",
     1004                "udiff",
     1005                "unidiff",
     1006                "unified diff"
    11181007            ],
    11191008            "support": {
    11201009                "issues": "https://github.com/sebastianbergmann/diff/issues",
    1121                 "source": "https://github.com/sebastianbergmann/diff/tree/1.4"
    1122             },
    1123             "time": "2017-05-22T07:24:03+00:00"
     1010                "source": "https://github.com/sebastianbergmann/diff/tree/3.0.6"
     1011            },
     1012            "funding": [
     1013                {
     1014                    "url": "https://github.com/sebastianbergmann",
     1015                    "type": "github"
     1016                }
     1017            ],
     1018            "time": "2024-03-02T06:16:36+00:00"
    11241019        },
    11251020        {
    11261021            "name": "sebastian/environment",
    1127             "version": "2.0.0",
     1022            "version": "4.2.5",
    11281023            "source": {
    11291024                "type": "git",
    11301025                "url": "https://github.com/sebastianbergmann/environment.git",
    1131                 "reference": "5795ffe5dc5b02460c3e34222fee8cbe245d8fac"
    1132             },
    1133             "dist": {
    1134                 "type": "zip",
    1135                 "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/5795ffe5dc5b02460c3e34222fee8cbe245d8fac",
    1136                 "reference": "5795ffe5dc5b02460c3e34222fee8cbe245d8fac",
    1137                 "shasum": ""
    1138             },
    1139             "require": {
    1140                 "php": "^5.6 || ^7.0"
     1026                "reference": "56932f6049a0482853056ffd617c91ffcc754205"
     1027            },
     1028            "dist": {
     1029                "type": "zip",
     1030                "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/56932f6049a0482853056ffd617c91ffcc754205",
     1031                "reference": "56932f6049a0482853056ffd617c91ffcc754205",
     1032                "shasum": ""
     1033            },
     1034            "require": {
     1035                "php": ">=7.1"
    11411036            },
    11421037            "require-dev": {
    1143                 "phpunit/phpunit": "^5.0"
    1144             },
    1145             "type": "library",
    1146             "extra": {
    1147                 "branch-alias": {
    1148                     "dev-master": "2.0.x-dev"
     1038                "phpunit/phpunit": "^7.5"
     1039            },
     1040            "suggest": {
     1041                "ext-posix": "*"
     1042            },
     1043            "type": "library",
     1044            "extra": {
     1045                "branch-alias": {
     1046                    "dev-master": "4.2-dev"
    11491047                }
    11501048            },
     
    11731071            "support": {
    11741072                "issues": "https://github.com/sebastianbergmann/environment/issues",
    1175                 "source": "https://github.com/sebastianbergmann/environment/tree/master"
    1176             },
    1177             "time": "2016-11-26T07:53:53+00:00"
     1073                "source": "https://github.com/sebastianbergmann/environment/tree/4.2.5"
     1074            },
     1075            "funding": [
     1076                {
     1077                    "url": "https://github.com/sebastianbergmann",
     1078                    "type": "github"
     1079                }
     1080            ],
     1081            "time": "2024-03-01T13:49:59+00:00"
    11781082        },
    11791083        {
    11801084            "name": "sebastian/exporter",
    1181             "version": "2.0.0",
     1085            "version": "3.1.8",
    11821086            "source": {
    11831087                "type": "git",
    11841088                "url": "https://github.com/sebastianbergmann/exporter.git",
    1185                 "reference": "ce474bdd1a34744d7ac5d6aad3a46d48d9bac4c4"
    1186             },
    1187             "dist": {
    1188                 "type": "zip",
    1189                 "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/ce474bdd1a34744d7ac5d6aad3a46d48d9bac4c4",
    1190                 "reference": "ce474bdd1a34744d7ac5d6aad3a46d48d9bac4c4",
    1191                 "shasum": ""
    1192             },
    1193             "require": {
    1194                 "php": ">=5.3.3",
    1195                 "sebastian/recursion-context": "~2.0"
     1089                "reference": "64cfeaa341951ceb2019d7b98232399d57bb2296"
     1090            },
     1091            "dist": {
     1092                "type": "zip",
     1093                "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/64cfeaa341951ceb2019d7b98232399d57bb2296",
     1094                "reference": "64cfeaa341951ceb2019d7b98232399d57bb2296",
     1095                "shasum": ""
     1096            },
     1097            "require": {
     1098                "php": ">=7.2",
     1099                "sebastian/recursion-context": "^3.0"
    11961100            },
    11971101            "require-dev": {
    11981102                "ext-mbstring": "*",
    1199                 "phpunit/phpunit": "~4.4"
    1200             },
    1201             "type": "library",
    1202             "extra": {
    1203                 "branch-alias": {
    1204                     "dev-master": "2.0.x-dev"
    1205                 }
    1206             },
    1207             "autoload": {
    1208                 "classmap": [
    1209                     "src/"
    1210                 ]
    1211             },
    1212             "notification-url": "https://packagist.org/downloads/",
    1213             "license": [
    1214                 "BSD-3-Clause"
    1215             ],
    1216             "authors": [
     1103                "phpunit/phpunit": "^8.5"
     1104            },
     1105            "type": "library",
     1106            "extra": {
     1107                "branch-alias": {
     1108                    "dev-master": "3.1.x-dev"
     1109                }
     1110            },
     1111            "autoload": {
     1112                "classmap": [
     1113                    "src/"
     1114                ]
     1115            },
     1116            "notification-url": "https://packagist.org/downloads/",
     1117            "license": [
     1118                "BSD-3-Clause"
     1119            ],
     1120            "authors": [
     1121                {
     1122                    "name": "Sebastian Bergmann",
     1123                    "email": "sebastian@phpunit.de"
     1124                },
    12171125                {
    12181126                    "name": "Jeff Welch",
     
    12241132                },
    12251133                {
    1226                     "name": "Bernhard Schussek",
    1227                     "email": "bschussek@2bepublished.at"
    1228                 },
    1229                 {
    1230                     "name": "Sebastian Bergmann",
    1231                     "email": "sebastian@phpunit.de"
    1232                 },
    1233                 {
    12341134                    "name": "Adam Harvey",
    12351135                    "email": "aharvey@php.net"
     1136                },
     1137                {
     1138                    "name": "Bernhard Schussek",
     1139                    "email": "bschussek@gmail.com"
    12361140                }
    12371141            ],
     
    12441148            "support": {
    12451149                "issues": "https://github.com/sebastianbergmann/exporter/issues",
    1246                 "source": "https://github.com/sebastianbergmann/exporter/tree/master"
    1247             },
    1248             "time": "2016-11-19T08:54:04+00:00"
     1150                "source": "https://github.com/sebastianbergmann/exporter/tree/3.1.8"
     1151            },
     1152            "funding": [
     1153                {
     1154                    "url": "https://github.com/sebastianbergmann",
     1155                    "type": "github"
     1156                },
     1157                {
     1158                    "url": "https://liberapay.com/sebastianbergmann",
     1159                    "type": "liberapay"
     1160                },
     1161                {
     1162                    "url": "https://thanks.dev/u/gh/sebastianbergmann",
     1163                    "type": "thanks_dev"
     1164                },
     1165                {
     1166                    "url": "https://tidelift.com/funding/github/packagist/sebastian/exporter",
     1167                    "type": "tidelift"
     1168                }
     1169            ],
     1170            "time": "2025-09-24T05:55:14+00:00"
    12491171        },
    12501172        {
    12511173            "name": "sebastian/global-state",
    1252             "version": "1.1.1",
     1174            "version": "3.0.6",
    12531175            "source": {
    12541176                "type": "git",
    12551177                "url": "https://github.com/sebastianbergmann/global-state.git",
    1256                 "reference": "bc37d50fea7d017d3d340f230811c9f1d7280af4"
    1257             },
    1258             "dist": {
    1259                 "type": "zip",
    1260                 "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/bc37d50fea7d017d3d340f230811c9f1d7280af4",
    1261                 "reference": "bc37d50fea7d017d3d340f230811c9f1d7280af4",
    1262                 "shasum": ""
    1263             },
    1264             "require": {
    1265                 "php": ">=5.3.3"
     1178                "reference": "800689427e3e8cf57a8fe38fcd1d4344c9b2f046"
     1179            },
     1180            "dist": {
     1181                "type": "zip",
     1182                "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/800689427e3e8cf57a8fe38fcd1d4344c9b2f046",
     1183                "reference": "800689427e3e8cf57a8fe38fcd1d4344c9b2f046",
     1184                "shasum": ""
     1185            },
     1186            "require": {
     1187                "php": ">=7.2",
     1188                "sebastian/object-reflector": "^1.1.1",
     1189                "sebastian/recursion-context": "^3.0"
    12661190            },
    12671191            "require-dev": {
    1268                 "phpunit/phpunit": "~4.2"
     1192                "ext-dom": "*",
     1193                "phpunit/phpunit": "^8.0"
    12691194            },
    12701195            "suggest": {
     
    12741199            "extra": {
    12751200                "branch-alias": {
    1276                     "dev-master": "1.0-dev"
     1201                    "dev-master": "3.0-dev"
    12771202                }
    12781203            },
     
    12991224            "support": {
    13001225                "issues": "https://github.com/sebastianbergmann/global-state/issues",
    1301                 "source": "https://github.com/sebastianbergmann/global-state/tree/1.1.1"
    1302             },
    1303             "time": "2015-10-12T03:26:01+00:00"
     1226                "source": "https://github.com/sebastianbergmann/global-state/tree/3.0.6"
     1227            },
     1228            "funding": [
     1229                {
     1230                    "url": "https://github.com/sebastianbergmann",
     1231                    "type": "github"
     1232                },
     1233                {
     1234                    "url": "https://liberapay.com/sebastianbergmann",
     1235                    "type": "liberapay"
     1236                },
     1237                {
     1238                    "url": "https://thanks.dev/u/gh/sebastianbergmann",
     1239                    "type": "thanks_dev"
     1240                },
     1241                {
     1242                    "url": "https://tidelift.com/funding/github/packagist/sebastian/global-state",
     1243                    "type": "tidelift"
     1244                }
     1245            ],
     1246            "time": "2025-08-10T05:40:12+00:00"
    13041247        },
    13051248        {
    13061249            "name": "sebastian/object-enumerator",
    1307             "version": "2.0.1",
     1250            "version": "3.0.5",
    13081251            "source": {
    13091252                "type": "git",
    13101253                "url": "https://github.com/sebastianbergmann/object-enumerator.git",
    1311                 "reference": "1311872ac850040a79c3c058bea3e22d0f09cbb7"
    1312             },
    1313             "dist": {
    1314                 "type": "zip",
    1315                 "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/1311872ac850040a79c3c058bea3e22d0f09cbb7",
    1316                 "reference": "1311872ac850040a79c3c058bea3e22d0f09cbb7",
    1317                 "shasum": ""
    1318             },
    1319             "require": {
    1320                 "php": ">=5.6",
    1321                 "sebastian/recursion-context": "~2.0"
     1254                "reference": "ac5b293dba925751b808e02923399fb44ff0d541"
     1255            },
     1256            "dist": {
     1257                "type": "zip",
     1258                "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/ac5b293dba925751b808e02923399fb44ff0d541",
     1259                "reference": "ac5b293dba925751b808e02923399fb44ff0d541",
     1260                "shasum": ""
     1261            },
     1262            "require": {
     1263                "php": ">=7.0",
     1264                "sebastian/object-reflector": "^1.1.1",
     1265                "sebastian/recursion-context": "^3.0"
    13221266            },
    13231267            "require-dev": {
    1324                 "phpunit/phpunit": "~5"
    1325             },
    1326             "type": "library",
    1327             "extra": {
    1328                 "branch-alias": {
    1329                     "dev-master": "2.0.x-dev"
     1268                "phpunit/phpunit": "^6.0"
     1269            },
     1270            "type": "library",
     1271            "extra": {
     1272                "branch-alias": {
     1273                    "dev-master": "3.0.x-dev"
    13301274                }
    13311275            },
     
    13491293            "support": {
    13501294                "issues": "https://github.com/sebastianbergmann/object-enumerator/issues",
    1351                 "source": "https://github.com/sebastianbergmann/object-enumerator/tree/master"
    1352             },
    1353             "time": "2017-02-18T15:18:39+00:00"
     1295                "source": "https://github.com/sebastianbergmann/object-enumerator/tree/3.0.5"
     1296            },
     1297            "funding": [
     1298                {
     1299                    "url": "https://github.com/sebastianbergmann",
     1300                    "type": "github"
     1301                }
     1302            ],
     1303            "time": "2024-03-01T13:54:02+00:00"
     1304        },
     1305        {
     1306            "name": "sebastian/object-reflector",
     1307            "version": "1.1.3",
     1308            "source": {
     1309                "type": "git",
     1310                "url": "https://github.com/sebastianbergmann/object-reflector.git",
     1311                "reference": "1d439c229e61f244ff1f211e5c99737f90c67def"
     1312            },
     1313            "dist": {
     1314                "type": "zip",
     1315                "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/1d439c229e61f244ff1f211e5c99737f90c67def",
     1316                "reference": "1d439c229e61f244ff1f211e5c99737f90c67def",
     1317                "shasum": ""
     1318            },
     1319            "require": {
     1320                "php": ">=7.0"
     1321            },
     1322            "require-dev": {
     1323                "phpunit/phpunit": "^6.0"
     1324            },
     1325            "type": "library",
     1326            "extra": {
     1327                "branch-alias": {
     1328                    "dev-master": "1.1-dev"
     1329                }
     1330            },
     1331            "autoload": {
     1332                "classmap": [
     1333                    "src/"
     1334                ]
     1335            },
     1336            "notification-url": "https://packagist.org/downloads/",
     1337            "license": [
     1338                "BSD-3-Clause"
     1339            ],
     1340            "authors": [
     1341                {
     1342                    "name": "Sebastian Bergmann",
     1343                    "email": "sebastian@phpunit.de"
     1344                }
     1345            ],
     1346            "description": "Allows reflection of object attributes, including inherited and non-public ones",
     1347            "homepage": "https://github.com/sebastianbergmann/object-reflector/",
     1348            "support": {
     1349                "issues": "https://github.com/sebastianbergmann/object-reflector/issues",
     1350                "source": "https://github.com/sebastianbergmann/object-reflector/tree/1.1.3"
     1351            },
     1352            "funding": [
     1353                {
     1354                    "url": "https://github.com/sebastianbergmann",
     1355                    "type": "github"
     1356                }
     1357            ],
     1358            "time": "2024-03-01T13:56:04+00:00"
    13541359        },
    13551360        {
    13561361            "name": "sebastian/recursion-context",
    1357             "version": "2.0.0",
     1362            "version": "3.0.3",
    13581363            "source": {
    13591364                "type": "git",
    13601365                "url": "https://github.com/sebastianbergmann/recursion-context.git",
    1361                 "reference": "2c3ba150cbec723aa057506e73a8d33bdb286c9a"
    1362             },
    1363             "dist": {
    1364                 "type": "zip",
    1365                 "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/2c3ba150cbec723aa057506e73a8d33bdb286c9a",
    1366                 "reference": "2c3ba150cbec723aa057506e73a8d33bdb286c9a",
    1367                 "shasum": ""
    1368             },
    1369             "require": {
    1370                 "php": ">=5.3.3"
     1366                "reference": "8fe7e75986a9d24b4cceae847314035df7703a5a"
     1367            },
     1368            "dist": {
     1369                "type": "zip",
     1370                "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/8fe7e75986a9d24b4cceae847314035df7703a5a",
     1371                "reference": "8fe7e75986a9d24b4cceae847314035df7703a5a",
     1372                "shasum": ""
     1373            },
     1374            "require": {
     1375                "php": ">=7.0"
    13711376            },
    13721377            "require-dev": {
    1373                 "phpunit/phpunit": "~4.4"
    1374             },
    1375             "type": "library",
    1376             "extra": {
    1377                 "branch-alias": {
    1378                     "dev-master": "2.0.x-dev"
    1379                 }
    1380             },
    1381             "autoload": {
    1382                 "classmap": [
    1383                     "src/"
    1384                 ]
    1385             },
    1386             "notification-url": "https://packagist.org/downloads/",
    1387             "license": [
    1388                 "BSD-3-Clause"
    1389             ],
    1390             "authors": [
     1378                "phpunit/phpunit": "^6.0"
     1379            },
     1380            "type": "library",
     1381            "extra": {
     1382                "branch-alias": {
     1383                    "dev-master": "3.0.x-dev"
     1384                }
     1385            },
     1386            "autoload": {
     1387                "classmap": [
     1388                    "src/"
     1389                ]
     1390            },
     1391            "notification-url": "https://packagist.org/downloads/",
     1392            "license": [
     1393                "BSD-3-Clause"
     1394            ],
     1395            "authors": [
     1396                {
     1397                    "name": "Sebastian Bergmann",
     1398                    "email": "sebastian@phpunit.de"
     1399                },
    13911400                {
    13921401                    "name": "Jeff Welch",
     
    13941403                },
    13951404                {
    1396                     "name": "Sebastian Bergmann",
    1397                     "email": "sebastian@phpunit.de"
    1398                 },
    1399                 {
    14001405                    "name": "Adam Harvey",
    14011406                    "email": "aharvey@php.net"
     
    14061411            "support": {
    14071412                "issues": "https://github.com/sebastianbergmann/recursion-context/issues",
    1408                 "source": "https://github.com/sebastianbergmann/recursion-context/tree/master"
    1409             },
    1410             "time": "2016-11-19T07:33:16+00:00"
     1413                "source": "https://github.com/sebastianbergmann/recursion-context/tree/3.0.3"
     1414            },
     1415            "funding": [
     1416                {
     1417                    "url": "https://github.com/sebastianbergmann",
     1418                    "type": "github"
     1419                },
     1420                {
     1421                    "url": "https://liberapay.com/sebastianbergmann",
     1422                    "type": "liberapay"
     1423                },
     1424                {
     1425                    "url": "https://thanks.dev/u/gh/sebastianbergmann",
     1426                    "type": "thanks_dev"
     1427                },
     1428                {
     1429                    "url": "https://tidelift.com/funding/github/packagist/sebastian/recursion-context",
     1430                    "type": "tidelift"
     1431                }
     1432            ],
     1433            "time": "2025-08-10T05:25:53+00:00"
    14111434        },
    14121435        {
    14131436            "name": "sebastian/resource-operations",
    1414             "version": "1.0.0",
     1437            "version": "2.0.3",
    14151438            "source": {
    14161439                "type": "git",
    14171440                "url": "https://github.com/sebastianbergmann/resource-operations.git",
    1418                 "reference": "ce990bb21759f94aeafd30209e8cfcdfa8bc3f52"
    1419             },
    1420             "dist": {
    1421                 "type": "zip",
    1422                 "url": "https://api.github.com/repos/sebastianbergmann/resource-operations/zipball/ce990bb21759f94aeafd30209e8cfcdfa8bc3f52",
    1423                 "reference": "ce990bb21759f94aeafd30209e8cfcdfa8bc3f52",
    1424                 "shasum": ""
    1425             },
    1426             "require": {
    1427                 "php": ">=5.6.0"
    1428             },
    1429             "type": "library",
    1430             "extra": {
    1431                 "branch-alias": {
    1432                     "dev-master": "1.0.x-dev"
     1441                "reference": "72a7f7674d053d548003b16ff5a106e7e0e06eee"
     1442            },
     1443            "dist": {
     1444                "type": "zip",
     1445                "url": "https://api.github.com/repos/sebastianbergmann/resource-operations/zipball/72a7f7674d053d548003b16ff5a106e7e0e06eee",
     1446                "reference": "72a7f7674d053d548003b16ff5a106e7e0e06eee",
     1447                "shasum": ""
     1448            },
     1449            "require": {
     1450                "php": ">=7.1"
     1451            },
     1452            "type": "library",
     1453            "extra": {
     1454                "branch-alias": {
     1455                    "dev-master": "2.0-dev"
    14331456                }
    14341457            },
     
    14511474            "homepage": "https://www.github.com/sebastianbergmann/resource-operations",
    14521475            "support": {
    1453                 "issues": "https://github.com/sebastianbergmann/resource-operations/issues",
    1454                 "source": "https://github.com/sebastianbergmann/resource-operations/tree/master"
    1455             },
    1456             "time": "2015-07-28T20:34:47+00:00"
     1476                "source": "https://github.com/sebastianbergmann/resource-operations/tree/2.0.3"
     1477            },
     1478            "funding": [
     1479                {
     1480                    "url": "https://github.com/sebastianbergmann",
     1481                    "type": "github"
     1482                }
     1483            ],
     1484            "time": "2024-03-01T13:59:09+00:00"
     1485        },
     1486        {
     1487            "name": "sebastian/type",
     1488            "version": "1.1.5",
     1489            "source": {
     1490                "type": "git",
     1491                "url": "https://github.com/sebastianbergmann/type.git",
     1492                "reference": "18f071c3a29892b037d35e6b20ddf3ea39b42874"
     1493            },
     1494            "dist": {
     1495                "type": "zip",
     1496                "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/18f071c3a29892b037d35e6b20ddf3ea39b42874",
     1497                "reference": "18f071c3a29892b037d35e6b20ddf3ea39b42874",
     1498                "shasum": ""
     1499            },
     1500            "require": {
     1501                "php": ">=7.2"
     1502            },
     1503            "require-dev": {
     1504                "phpunit/phpunit": "^8.2"
     1505            },
     1506            "type": "library",
     1507            "extra": {
     1508                "branch-alias": {
     1509                    "dev-master": "1.1-dev"
     1510                }
     1511            },
     1512            "autoload": {
     1513                "classmap": [
     1514                    "src/"
     1515                ]
     1516            },
     1517            "notification-url": "https://packagist.org/downloads/",
     1518            "license": [
     1519                "BSD-3-Clause"
     1520            ],
     1521            "authors": [
     1522                {
     1523                    "name": "Sebastian Bergmann",
     1524                    "email": "sebastian@phpunit.de",
     1525                    "role": "lead"
     1526                }
     1527            ],
     1528            "description": "Collection of value objects that represent the types of the PHP type system",
     1529            "homepage": "https://github.com/sebastianbergmann/type",
     1530            "support": {
     1531                "issues": "https://github.com/sebastianbergmann/type/issues",
     1532                "source": "https://github.com/sebastianbergmann/type/tree/1.1.5"
     1533            },
     1534            "funding": [
     1535                {
     1536                    "url": "https://github.com/sebastianbergmann",
     1537                    "type": "github"
     1538                }
     1539            ],
     1540            "time": "2024-03-01T14:04:07+00:00"
    14571541        },
    14581542        {
     
    15621646        },
    15631647        {
    1564             "name": "symfony/polyfill-ctype",
    1565             "version": "v1.26.0",
    1566             "source": {
    1567                 "type": "git",
    1568                 "url": "https://github.com/symfony/polyfill-ctype.git",
    1569                 "reference": "6fd1b9a79f6e3cf65f9e679b23af304cd9e010d4"
    1570             },
    1571             "dist": {
    1572                 "type": "zip",
    1573                 "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/6fd1b9a79f6e3cf65f9e679b23af304cd9e010d4",
    1574                 "reference": "6fd1b9a79f6e3cf65f9e679b23af304cd9e010d4",
    1575                 "shasum": ""
    1576             },
    1577             "require": {
    1578                 "php": ">=7.1"
    1579             },
    1580             "provide": {
    1581                 "ext-ctype": "*"
    1582             },
    1583             "suggest": {
    1584                 "ext-ctype": "For best performance"
    1585             },
    1586             "type": "library",
    1587             "extra": {
    1588                 "branch-alias": {
    1589                     "dev-main": "1.26-dev"
    1590                 },
    1591                 "thanks": {
    1592                     "name": "symfony/polyfill",
    1593                     "url": "https://github.com/symfony/polyfill"
    1594                 }
    1595             },
    1596             "autoload": {
    1597                 "files": [
    1598                     "bootstrap.php"
    1599                 ],
    1600                 "psr-4": {
    1601                     "Symfony\\Polyfill\\Ctype\\": ""
    1602                 }
    1603             },
    1604             "notification-url": "https://packagist.org/downloads/",
    1605             "license": [
    1606                 "MIT"
    1607             ],
    1608             "authors": [
    1609                 {
    1610                     "name": "Gert de Pagter",
    1611                     "email": "BackEndTea@gmail.com"
    1612                 },
    1613                 {
    1614                     "name": "Symfony Community",
    1615                     "homepage": "https://symfony.com/contributors"
    1616                 }
    1617             ],
    1618             "description": "Symfony polyfill for ctype functions",
    1619             "homepage": "https://symfony.com",
    1620             "keywords": [
    1621                 "compatibility",
    1622                 "ctype",
    1623                 "polyfill",
    1624                 "portable"
    1625             ],
    1626             "support": {
    1627                 "source": "https://github.com/symfony/polyfill-ctype/tree/v1.26.0"
    1628             },
    1629             "funding": [
    1630                 {
    1631                     "url": "https://symfony.com/sponsor",
    1632                     "type": "custom"
    1633                 },
    1634                 {
    1635                     "url": "https://github.com/fabpot",
    1636                     "type": "github"
    1637                 },
    1638                 {
    1639                     "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
    1640                     "type": "tidelift"
    1641                 }
    1642             ],
    1643             "time": "2022-05-24T11:49:31+00:00"
    1644         },
    1645         {
    1646             "name": "symfony/yaml",
    1647             "version": "v3.4.47",
    1648             "source": {
    1649                 "type": "git",
    1650                 "url": "https://github.com/symfony/yaml.git",
    1651                 "reference": "88289caa3c166321883f67fe5130188ebbb47094"
    1652             },
    1653             "dist": {
    1654                 "type": "zip",
    1655                 "url": "https://api.github.com/repos/symfony/yaml/zipball/88289caa3c166321883f67fe5130188ebbb47094",
    1656                 "reference": "88289caa3c166321883f67fe5130188ebbb47094",
    1657                 "shasum": ""
    1658             },
    1659             "require": {
    1660                 "php": "^5.5.9|>=7.0.8",
    1661                 "symfony/polyfill-ctype": "~1.8"
    1662             },
    1663             "conflict": {
    1664                 "symfony/console": "<3.4"
    1665             },
    1666             "require-dev": {
    1667                 "symfony/console": "~3.4|~4.0"
    1668             },
    1669             "suggest": {
    1670                 "symfony/console": "For validating YAML files using the lint command"
    1671             },
    1672             "type": "library",
    1673             "autoload": {
    1674                 "psr-4": {
    1675                     "Symfony\\Component\\Yaml\\": ""
    1676                 },
    1677                 "exclude-from-classmap": [
    1678                     "/Tests/"
    1679                 ]
    1680             },
    1681             "notification-url": "https://packagist.org/downloads/",
    1682             "license": [
    1683                 "MIT"
    1684             ],
    1685             "authors": [
    1686                 {
    1687                     "name": "Fabien Potencier",
    1688                     "email": "fabien@symfony.com"
    1689                 },
    1690                 {
    1691                     "name": "Symfony Community",
    1692                     "homepage": "https://symfony.com/contributors"
    1693                 }
    1694             ],
    1695             "description": "Symfony Yaml Component",
    1696             "homepage": "https://symfony.com",
    1697             "support": {
    1698                 "source": "https://github.com/symfony/yaml/tree/v3.4.47"
    1699             },
    1700             "funding": [
    1701                 {
    1702                     "url": "https://symfony.com/sponsor",
    1703                     "type": "custom"
    1704                 },
    1705                 {
    1706                     "url": "https://github.com/fabpot",
    1707                     "type": "github"
    1708                 },
    1709                 {
    1710                     "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
    1711                     "type": "tidelift"
    1712                 }
    1713             ],
    1714             "time": "2020-10-24T10:57:07+00:00"
    1715         },
    1716         {
    1717             "name": "webmozart/assert",
    1718             "version": "1.11.0",
    1719             "source": {
    1720                 "type": "git",
    1721                 "url": "https://github.com/webmozarts/assert.git",
    1722                 "reference": "11cb2199493b2f8a3b53e7f19068fc6aac760991"
    1723             },
    1724             "dist": {
    1725                 "type": "zip",
    1726                 "url": "https://api.github.com/repos/webmozarts/assert/zipball/11cb2199493b2f8a3b53e7f19068fc6aac760991",
    1727                 "reference": "11cb2199493b2f8a3b53e7f19068fc6aac760991",
    1728                 "shasum": ""
    1729             },
    1730             "require": {
    1731                 "ext-ctype": "*",
     1648            "name": "theseer/tokenizer",
     1649            "version": "1.3.1",
     1650            "source": {
     1651                "type": "git",
     1652                "url": "https://github.com/theseer/tokenizer.git",
     1653                "reference": "b7489ce515e168639d17feec34b8847c326b0b3c"
     1654            },
     1655            "dist": {
     1656                "type": "zip",
     1657                "url": "https://api.github.com/repos/theseer/tokenizer/zipball/b7489ce515e168639d17feec34b8847c326b0b3c",
     1658                "reference": "b7489ce515e168639d17feec34b8847c326b0b3c",
     1659                "shasum": ""
     1660            },
     1661            "require": {
     1662                "ext-dom": "*",
     1663                "ext-tokenizer": "*",
     1664                "ext-xmlwriter": "*",
    17321665                "php": "^7.2 || ^8.0"
    17331666            },
    1734             "conflict": {
    1735                 "phpstan/phpstan": "<0.12.20",
    1736                 "vimeo/psalm": "<4.6.1 || 4.6.2"
    1737             },
    1738             "require-dev": {
    1739                 "phpunit/phpunit": "^8.5.13"
    1740             },
    1741             "type": "library",
    1742             "extra": {
    1743                 "branch-alias": {
    1744                     "dev-master": "1.10-dev"
    1745                 }
    1746             },
    1747             "autoload": {
    1748                 "psr-4": {
    1749                     "Webmozart\\Assert\\": "src/"
    1750                 }
    1751             },
    1752             "notification-url": "https://packagist.org/downloads/",
    1753             "license": [
    1754                 "MIT"
    1755             ],
    1756             "authors": [
    1757                 {
    1758                     "name": "Bernhard Schussek",
    1759                     "email": "bschussek@gmail.com"
    1760                 }
    1761             ],
    1762             "description": "Assertions to validate method input/output with nice error messages.",
    1763             "keywords": [
    1764                 "assert",
    1765                 "check",
    1766                 "validate"
    1767             ],
    1768             "support": {
    1769                 "issues": "https://github.com/webmozarts/assert/issues",
    1770                 "source": "https://github.com/webmozarts/assert/tree/1.11.0"
    1771             },
    1772             "time": "2022-06-03T18:03:27+00:00"
     1667            "type": "library",
     1668            "autoload": {
     1669                "classmap": [
     1670                    "src/"
     1671                ]
     1672            },
     1673            "notification-url": "https://packagist.org/downloads/",
     1674            "license": [
     1675                "BSD-3-Clause"
     1676            ],
     1677            "authors": [
     1678                {
     1679                    "name": "Arne Blankerts",
     1680                    "email": "arne@blankerts.de",
     1681                    "role": "Developer"
     1682                }
     1683            ],
     1684            "description": "A small library for converting tokenized PHP source code into XML and potentially other formats",
     1685            "support": {
     1686                "issues": "https://github.com/theseer/tokenizer/issues",
     1687                "source": "https://github.com/theseer/tokenizer/tree/1.3.1"
     1688            },
     1689            "funding": [
     1690                {
     1691                    "url": "https://github.com/theseer",
     1692                    "type": "github"
     1693                }
     1694            ],
     1695            "time": "2025-11-17T20:03:58+00:00"
    17731696        }
    17741697    ],
    17751698    "aliases": [],
    17761699    "minimum-stability": "stable",
    1777     "stability-flags": [],
     1700    "stability-flags": {},
    17781701    "prefer-stable": false,
    17791702    "prefer-lowest": false,
    1780     "platform": [],
    1781     "platform-dev": [],
    1782     "plugin-api-version": "2.1.0"
     1703    "platform": {},
     1704    "platform-dev": {},
     1705    "plugin-api-version": "2.6.0"
    17831706}
  • mailchimp-for-woocommerce/trunk/blocks/newsletter.php

    r3100617 r3457552  
    1616        add_action( 'woocommerce_store_api_checkout_order_processed', array( 'Mailchimp_Woocommerce_Newsletter_Blocks_Integration', 'order_customer_processed' ) );
    1717
     18        add_action( 'woocommerce_store_api_checkout_update_order_from_request', array( 'Mailchimp_Woocommerce_Sms_Blocks_Integration', 'order_processed' ), 10, 2 );
     19        add_action( 'woocommerce_store_api_checkout_order_processed', array( 'Mailchimp_Woocommerce_Sms_Blocks_Integration', 'order_customer_processed' ) );
     20
    1821        require_once dirname( __FILE__ ) . '/woocommerce-blocks-integration.php';
     22        require_once dirname( __FILE__ ) . '/woocommerce-sms-blocks-integration.php';
    1923        require_once dirname( __FILE__ ) . '/woocommerce-blocks-extend-store-endpoint.php';
    2024
     
    2327            function( $integration_registry ) {
    2428                $integration_registry->register( new Mailchimp_Woocommerce_Newsletter_Blocks_Integration() );
     29                $integration_registry->register( new Mailchimp_Woocommerce_Sms_Blocks_Integration() );
    2530            }
    2631        );
  • mailchimp-for-woocommerce/trunk/blocks/package-lock.json

    r3433839 r3457552  
    1010      "license": "GPL-3.0+",
    1111      "dependencies": {
    12         "classnames": "^2.5.1"
     12        "classnames": "^2.5.1",
     13        "express": "^4.22.1",
     14        "qs": "^6.14.1"
    1315      },
    1416      "devDependencies": {
     
    43154317      }
    43164318    },
     4319    "node_modules/@types/eslint": {
     4320      "version": "9.6.1",
     4321      "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-9.6.1.tgz",
     4322      "integrity": "sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==",
     4323      "dev": true,
     4324      "license": "MIT",
     4325      "dependencies": {
     4326        "@types/estree": "*",
     4327        "@types/json-schema": "*"
     4328      }
     4329    },
     4330    "node_modules/@types/eslint-scope": {
     4331      "version": "3.7.7",
     4332      "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.7.tgz",
     4333      "integrity": "sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==",
     4334      "dev": true,
     4335      "license": "MIT",
     4336      "dependencies": {
     4337        "@types/eslint": "*",
     4338        "@types/estree": "*"
     4339      }
     4340    },
    43174341    "node_modules/@types/estree": {
    4318       "version": "1.0.5",
    4319       "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz",
    4320       "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==",
    4321       "dev": true
     4342      "version": "1.0.8",
     4343      "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz",
     4344      "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==",
     4345      "dev": true,
     4346      "license": "MIT"
    43224347    },
    43234348    "node_modules/@types/express": {
     
    44274452    },
    44284453    "node_modules/@types/json-schema": {
    4429       "version": "7.0.12",
    4430       "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.12.tgz",
    4431       "integrity": "sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA==",
    4432       "dev": true
     4454      "version": "7.0.15",
     4455      "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz",
     4456      "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==",
     4457      "dev": true,
     4458      "license": "MIT"
    44334459    },
    44344460    "node_modules/@types/json5": {
     
    50205046    },
    50215047    "node_modules/@webassemblyjs/ast": {
    5022       "version": "1.12.1",
    5023       "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.12.1.tgz",
    5024       "integrity": "sha512-EKfMUOPRRUTy5UII4qJDGPpqfwjOmZ5jeGFwid9mnoqIFK+e0vqoi1qH56JpmZSzEL53jKnNzScdmftJyG5xWg==",
    5025       "dev": true,
    5026       "dependencies": {
    5027         "@webassemblyjs/helper-numbers": "1.11.6",
    5028         "@webassemblyjs/helper-wasm-bytecode": "1.11.6"
     5048      "version": "1.14.1",
     5049      "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.14.1.tgz",
     5050      "integrity": "sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==",
     5051      "dev": true,
     5052      "license": "MIT",
     5053      "dependencies": {
     5054        "@webassemblyjs/helper-numbers": "1.13.2",
     5055        "@webassemblyjs/helper-wasm-bytecode": "1.13.2"
    50295056      }
    50305057    },
    50315058    "node_modules/@webassemblyjs/floating-point-hex-parser": {
    5032       "version": "1.11.6",
    5033       "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz",
    5034       "integrity": "sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==",
    5035       "dev": true
     5059      "version": "1.13.2",
     5060      "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.13.2.tgz",
     5061      "integrity": "sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA==",
     5062      "dev": true,
     5063      "license": "MIT"
    50365064    },
    50375065    "node_modules/@webassemblyjs/helper-api-error": {
    5038       "version": "1.11.6",
    5039       "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz",
    5040       "integrity": "sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==",
    5041       "dev": true
     5066      "version": "1.13.2",
     5067      "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.13.2.tgz",
     5068      "integrity": "sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ==",
     5069      "dev": true,
     5070      "license": "MIT"
    50425071    },
    50435072    "node_modules/@webassemblyjs/helper-buffer": {
    5044       "version": "1.12.1",
    5045       "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.12.1.tgz",
    5046       "integrity": "sha512-nzJwQw99DNDKr9BVCOZcLuJJUlqkJh+kVzVl6Fmq/tI5ZtEyWT1KZMyOXltXLZJmDtvLCDgwsyrkohEtopTXCw==",
    5047       "dev": true
     5073      "version": "1.14.1",
     5074      "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.14.1.tgz",
     5075      "integrity": "sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA==",
     5076      "dev": true,
     5077      "license": "MIT"
    50485078    },
    50495079    "node_modules/@webassemblyjs/helper-numbers": {
    5050       "version": "1.11.6",
    5051       "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz",
    5052       "integrity": "sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==",
    5053       "dev": true,
    5054       "dependencies": {
    5055         "@webassemblyjs/floating-point-hex-parser": "1.11.6",
    5056         "@webassemblyjs/helper-api-error": "1.11.6",
     5080      "version": "1.13.2",
     5081      "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.13.2.tgz",
     5082      "integrity": "sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA==",
     5083      "dev": true,
     5084      "license": "MIT",
     5085      "dependencies": {
     5086        "@webassemblyjs/floating-point-hex-parser": "1.13.2",
     5087        "@webassemblyjs/helper-api-error": "1.13.2",
    50575088        "@xtuc/long": "4.2.2"
    50585089      }
    50595090    },
    50605091    "node_modules/@webassemblyjs/helper-wasm-bytecode": {
    5061       "version": "1.11.6",
    5062       "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz",
    5063       "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==",
    5064       "dev": true
     5092      "version": "1.13.2",
     5093      "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.13.2.tgz",
     5094      "integrity": "sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA==",
     5095      "dev": true,
     5096      "license": "MIT"
    50655097    },
    50665098    "node_modules/@webassemblyjs/helper-wasm-section": {
    5067       "version": "1.12.1",
    5068       "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.12.1.tgz",
    5069       "integrity": "sha512-Jif4vfB6FJlUlSbgEMHUyk1j234GTNG9dBJ4XJdOySoj518Xj0oGsNi59cUQF4RRMS9ouBUxDDdyBVfPTypa5g==",
    5070       "dev": true,
    5071       "dependencies": {
    5072         "@webassemblyjs/ast": "1.12.1",
    5073         "@webassemblyjs/helper-buffer": "1.12.1",
    5074         "@webassemblyjs/helper-wasm-bytecode": "1.11.6",
    5075         "@webassemblyjs/wasm-gen": "1.12.1"
     5099      "version": "1.14.1",
     5100      "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.14.1.tgz",
     5101      "integrity": "sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw==",
     5102      "dev": true,
     5103      "license": "MIT",
     5104      "dependencies": {
     5105        "@webassemblyjs/ast": "1.14.1",
     5106        "@webassemblyjs/helper-buffer": "1.14.1",
     5107        "@webassemblyjs/helper-wasm-bytecode": "1.13.2",
     5108        "@webassemblyjs/wasm-gen": "1.14.1"
    50765109      }
    50775110    },
    50785111    "node_modules/@webassemblyjs/ieee754": {
    5079       "version": "1.11.6",
    5080       "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz",
    5081       "integrity": "sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==",
    5082       "dev": true,
     5112      "version": "1.13.2",
     5113      "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.13.2.tgz",
     5114      "integrity": "sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw==",
     5115      "dev": true,
     5116      "license": "MIT",
    50835117      "dependencies": {
    50845118        "@xtuc/ieee754": "^1.2.0"
     
    50865120    },
    50875121    "node_modules/@webassemblyjs/leb128": {
    5088       "version": "1.11.6",
    5089       "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.6.tgz",
    5090       "integrity": "sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==",
    5091       "dev": true,
     5122      "version": "1.13.2",
     5123      "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.13.2.tgz",
     5124      "integrity": "sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw==",
     5125      "dev": true,
     5126      "license": "Apache-2.0",
    50925127      "dependencies": {
    50935128        "@xtuc/long": "4.2.2"
     
    50955130    },
    50965131    "node_modules/@webassemblyjs/utf8": {
    5097       "version": "1.11.6",
    5098       "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.6.tgz",
    5099       "integrity": "sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==",
    5100       "dev": true
     5132      "version": "1.13.2",
     5133      "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.13.2.tgz",
     5134      "integrity": "sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ==",
     5135      "dev": true,
     5136      "license": "MIT"
    51015137    },
    51025138    "node_modules/@webassemblyjs/wasm-edit": {
    5103       "version": "1.12.1",
    5104       "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.12.1.tgz",
    5105       "integrity": "sha512-1DuwbVvADvS5mGnXbE+c9NfA8QRcZ6iKquqjjmR10k6o+zzsRVesil54DKexiowcFCPdr/Q0qaMgB01+SQ1u6g==",
    5106       "dev": true,
    5107       "dependencies": {
    5108         "@webassemblyjs/ast": "1.12.1",
    5109         "@webassemblyjs/helper-buffer": "1.12.1",
    5110         "@webassemblyjs/helper-wasm-bytecode": "1.11.6",
    5111         "@webassemblyjs/helper-wasm-section": "1.12.1",
    5112         "@webassemblyjs/wasm-gen": "1.12.1",
    5113         "@webassemblyjs/wasm-opt": "1.12.1",
    5114         "@webassemblyjs/wasm-parser": "1.12.1",
    5115         "@webassemblyjs/wast-printer": "1.12.1"
     5139      "version": "1.14.1",
     5140      "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.14.1.tgz",
     5141      "integrity": "sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ==",
     5142      "dev": true,
     5143      "license": "MIT",
     5144      "dependencies": {
     5145        "@webassemblyjs/ast": "1.14.1",
     5146        "@webassemblyjs/helper-buffer": "1.14.1",
     5147        "@webassemblyjs/helper-wasm-bytecode": "1.13.2",
     5148        "@webassemblyjs/helper-wasm-section": "1.14.1",
     5149        "@webassemblyjs/wasm-gen": "1.14.1",
     5150        "@webassemblyjs/wasm-opt": "1.14.1",
     5151        "@webassemblyjs/wasm-parser": "1.14.1",
     5152        "@webassemblyjs/wast-printer": "1.14.1"
    51165153      }
    51175154    },
    51185155    "node_modules/@webassemblyjs/wasm-gen": {
    5119       "version": "1.12.1",
    5120       "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.12.1.tgz",
    5121       "integrity": "sha512-TDq4Ojh9fcohAw6OIMXqiIcTq5KUXTGRkVxbSo1hQnSy6lAM5GSdfwWeSxpAo0YzgsgF182E/U0mDNhuA0tW7w==",
    5122       "dev": true,
    5123       "dependencies": {
    5124         "@webassemblyjs/ast": "1.12.1",
    5125         "@webassemblyjs/helper-wasm-bytecode": "1.11.6",
    5126         "@webassemblyjs/ieee754": "1.11.6",
    5127         "@webassemblyjs/leb128": "1.11.6",
    5128         "@webassemblyjs/utf8": "1.11.6"
     5156      "version": "1.14.1",
     5157      "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.14.1.tgz",
     5158      "integrity": "sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg==",
     5159      "dev": true,
     5160      "license": "MIT",
     5161      "dependencies": {
     5162        "@webassemblyjs/ast": "1.14.1",
     5163        "@webassemblyjs/helper-wasm-bytecode": "1.13.2",
     5164        "@webassemblyjs/ieee754": "1.13.2",
     5165        "@webassemblyjs/leb128": "1.13.2",
     5166        "@webassemblyjs/utf8": "1.13.2"
    51295167      }
    51305168    },
    51315169    "node_modules/@webassemblyjs/wasm-opt": {
    5132       "version": "1.12.1",
    5133       "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.12.1.tgz",
    5134       "integrity": "sha512-Jg99j/2gG2iaz3hijw857AVYekZe2SAskcqlWIZXjji5WStnOpVoat3gQfT/Q5tb2djnCjBtMocY/Su1GfxPBg==",
    5135       "dev": true,
    5136       "dependencies": {
    5137         "@webassemblyjs/ast": "1.12.1",
    5138         "@webassemblyjs/helper-buffer": "1.12.1",
    5139         "@webassemblyjs/wasm-gen": "1.12.1",
    5140         "@webassemblyjs/wasm-parser": "1.12.1"
     5170      "version": "1.14.1",
     5171      "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.14.1.tgz",
     5172      "integrity": "sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw==",
     5173      "dev": true,
     5174      "license": "MIT",
     5175      "dependencies": {
     5176        "@webassemblyjs/ast": "1.14.1",
     5177        "@webassemblyjs/helper-buffer": "1.14.1",
     5178        "@webassemblyjs/wasm-gen": "1.14.1",
     5179        "@webassemblyjs/wasm-parser": "1.14.1"
    51415180      }
    51425181    },
    51435182    "node_modules/@webassemblyjs/wasm-parser": {
    5144       "version": "1.12.1",
    5145       "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.12.1.tgz",
    5146       "integrity": "sha512-xikIi7c2FHXysxXe3COrVUPSheuBtpcfhbpFj4gmu7KRLYOzANztwUU0IbsqvMqzuNK2+glRGWCEqZo1WCLyAQ==",
    5147       "dev": true,
    5148       "dependencies": {
    5149         "@webassemblyjs/ast": "1.12.1",
    5150         "@webassemblyjs/helper-api-error": "1.11.6",
    5151         "@webassemblyjs/helper-wasm-bytecode": "1.11.6",
    5152         "@webassemblyjs/ieee754": "1.11.6",
    5153         "@webassemblyjs/leb128": "1.11.6",
    5154         "@webassemblyjs/utf8": "1.11.6"
     5183      "version": "1.14.1",
     5184      "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.14.1.tgz",
     5185      "integrity": "sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ==",
     5186      "dev": true,
     5187      "license": "MIT",
     5188      "dependencies": {
     5189        "@webassemblyjs/ast": "1.14.1",
     5190        "@webassemblyjs/helper-api-error": "1.13.2",
     5191        "@webassemblyjs/helper-wasm-bytecode": "1.13.2",
     5192        "@webassemblyjs/ieee754": "1.13.2",
     5193        "@webassemblyjs/leb128": "1.13.2",
     5194        "@webassemblyjs/utf8": "1.13.2"
    51555195      }
    51565196    },
    51575197    "node_modules/@webassemblyjs/wast-printer": {
    5158       "version": "1.12.1",
    5159       "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.12.1.tgz",
    5160       "integrity": "sha512-+X4WAlOisVWQMikjbcvY2e0rwPsKQ9F688lksZhBcPycBBuii3O7m8FACbDMWDojpAqvjIncrG8J0XHKyQfVeA==",
    5161       "dev": true,
    5162       "dependencies": {
    5163         "@webassemblyjs/ast": "1.12.1",
     5198      "version": "1.14.1",
     5199      "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.14.1.tgz",
     5200      "integrity": "sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw==",
     5201      "dev": true,
     5202      "license": "MIT",
     5203      "dependencies": {
     5204        "@webassemblyjs/ast": "1.14.1",
    51645205        "@xtuc/long": "4.2.2"
    51655206      }
     
    71127153      "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz",
    71137154      "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==",
    7114       "dev": true
     7155      "dev": true,
     7156      "license": "BSD-3-Clause"
    71157157    },
    71167158    "node_modules/@xtuc/long": {
     
    71187160      "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz",
    71197161      "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==",
    7120       "dev": true
     7162      "dev": true,
     7163      "license": "Apache-2.0"
    71217164    },
    71227165    "node_modules/abab": {
     
    71307173      "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz",
    71317174      "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==",
    7132       "dev": true,
    71337175      "dependencies": {
    71347176        "mime-types": "~2.1.34",
     
    71407182    },
    71417183    "node_modules/acorn": {
    7142       "version": "8.10.0",
    7143       "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz",
    7144       "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==",
    7145       "dev": true,
     7184      "version": "8.15.0",
     7185      "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz",
     7186      "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==",
     7187      "dev": true,
     7188      "license": "MIT",
    71467189      "bin": {
    71477190        "acorn": "bin/acorn"
     
    71617204      }
    71627205    },
    7163     "node_modules/acorn-import-attributes": {
    7164       "version": "1.9.5",
    7165       "resolved": "https://registry.npmjs.org/acorn-import-attributes/-/acorn-import-attributes-1.9.5.tgz",
    7166       "integrity": "sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ==",
    7167       "dev": true,
    7168       "peerDependencies": {
    7169         "acorn": "^8"
     7206    "node_modules/acorn-import-phases": {
     7207      "version": "1.0.4",
     7208      "resolved": "https://registry.npmjs.org/acorn-import-phases/-/acorn-import-phases-1.0.4.tgz",
     7209      "integrity": "sha512-wKmbr/DDiIXzEOiWrTTUcDm24kQ2vGfZQvM2fwg2vXqR5uW6aapr7ObPtj1th32b9u90/Pf4AItvdTh42fBmVQ==",
     7210      "dev": true,
     7211      "license": "MIT",
     7212      "engines": {
     7213        "node": ">=10.13.0"
     7214      },
     7215      "peerDependencies": {
     7216        "acorn": "^8.14.0"
    71707217      }
    71717218    },
     
    80628109      "license": "MIT"
    80638110    },
     8111    "node_modules/baseline-browser-mapping": {
     8112      "version": "2.9.19",
     8113      "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.9.19.tgz",
     8114      "integrity": "sha512-ipDqC8FrAl/76p2SSWKSI+H9tFwm7vYqXQrItCuiVPt26Km0jS+NzSsBWAaBusvSbQcfJG+JitdMm+wZAgTYqg==",
     8115      "dev": true,
     8116      "license": "Apache-2.0",
     8117      "bin": {
     8118        "baseline-browser-mapping": "dist/cli.js"
     8119      }
     8120    },
    80648121    "node_modules/basic-ftp": {
    80658122      "version": "5.0.5",
     
    81068163      "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.3.tgz",
    81078164      "integrity": "sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==",
    8108       "dev": true,
    81098165      "dependencies": {
    81108166        "bytes": "3.1.2",
     
    81308186      "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
    81318187      "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
    8132       "dev": true,
    81338188      "dependencies": {
    81348189        "ms": "2.0.0"
     
    81398194      "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
    81408195      "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
    8141       "dev": true,
    81428196      "dependencies": {
    81438197        "safer-buffer": ">= 2.1.2 < 3"
     
    81508204      "version": "2.0.0",
    81518205      "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
    8152       "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
    8153       "dev": true
     8206      "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="
     8207    },
     8208    "node_modules/body-parser/node_modules/qs": {
     8209      "version": "6.13.0",
     8210      "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz",
     8211      "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==",
     8212      "license": "BSD-3-Clause",
     8213      "dependencies": {
     8214        "side-channel": "^1.0.6"
     8215      },
     8216      "engines": {
     8217        "node": ">=0.6"
     8218      },
     8219      "funding": {
     8220        "url": "https://github.com/sponsors/ljharb"
     8221      }
    81548222    },
    81558223    "node_modules/bonjour-service": {
     
    81948262    },
    81958263    "node_modules/browserslist": {
    8196       "version": "4.23.3",
    8197       "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.3.tgz",
    8198       "integrity": "sha512-btwCFJVjI4YWDNfau8RhZ+B1Q/VLoUITrm3RlP6y1tYGWIOa+InuYiRGXUBXo8nA1qKmHMyLB/iVQg5TT4eFoA==",
     8264      "version": "4.28.1",
     8265      "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.1.tgz",
     8266      "integrity": "sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==",
    81998267      "dev": true,
    82008268      "funding": [
     
    82128280        }
    82138281      ],
    8214       "dependencies": {
    8215         "caniuse-lite": "^1.0.30001646",
    8216         "electron-to-chromium": "^1.5.4",
    8217         "node-releases": "^2.0.18",
    8218         "update-browserslist-db": "^1.1.0"
     8282      "license": "MIT",
     8283      "dependencies": {
     8284        "baseline-browser-mapping": "^2.9.0",
     8285        "caniuse-lite": "^1.0.30001759",
     8286        "electron-to-chromium": "^1.5.263",
     8287        "node-releases": "^2.0.27",
     8288        "update-browserslist-db": "^1.2.0"
    82198289      },
    82208290      "bin": {
     
    82918361      "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz",
    82928362      "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==",
    8293       "dev": true,
    82948363      "license": "MIT",
    82958364      "engines": {
     
    83208389      "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz",
    83218390      "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==",
    8322       "dev": true,
    83238391      "license": "MIT",
    83248392      "dependencies": {
     
    83288396      "engines": {
    83298397        "node": ">= 0.4"
     8398      }
     8399    },
     8400    "node_modules/call-bound": {
     8401      "version": "1.0.4",
     8402      "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz",
     8403      "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==",
     8404      "license": "MIT",
     8405      "dependencies": {
     8406        "call-bind-apply-helpers": "^1.0.2",
     8407        "get-intrinsic": "^1.3.0"
     8408      },
     8409      "engines": {
     8410        "node": ">= 0.4"
     8411      },
     8412      "funding": {
     8413        "url": "https://github.com/sponsors/ljharb"
    83308414      }
    83318415    },
     
    84008484    },
    84018485    "node_modules/caniuse-lite": {
    8402       "version": "1.0.30001660",
    8403       "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001660.tgz",
    8404       "integrity": "sha512-GacvNTTuATm26qC74pt+ad1fW15mlQ/zuTzzY1ZoIzECTP8HURDfF43kNxPgf7H1jmelCBQTTbBNxdSXOA7Bqg==",
     8486      "version": "1.0.30001769",
     8487      "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001769.tgz",
     8488      "integrity": "sha512-BCfFL1sHijQlBGWBMuJyhZUhzo7wer5sVj9hqekB/7xn0Ypy+pER/edCYQm4exbXj4WiySGp40P8UuTh6w1srg==",
    84058489      "dev": true,
    84068490      "funding": [
     
    84178501          "url": "https://github.com/sponsors/ai"
    84188502        }
    8419       ]
     8503      ],
     8504      "license": "CC-BY-4.0"
    84208505    },
    84218506    "node_modules/capital-case": {
     
    89729057      "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz",
    89739058      "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==",
    8974       "dev": true,
    89759059      "dependencies": {
    89769060        "safe-buffer": "5.2.1"
     
    89849068      "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz",
    89859069      "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==",
    8986       "dev": true,
    89879070      "engines": {
    89889071        "node": ">= 0.6"
     
    89999082      "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.1.tgz",
    90009083      "integrity": "sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==",
    9001       "dev": true,
    90029084      "license": "MIT",
    90039085      "engines": {
     
    90089090      "version": "1.0.6",
    90099091      "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz",
    9010       "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==",
    9011       "dev": true
     9092      "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ=="
    90129093    },
    90139094    "node_modules/copy-webpack-plugin": {
     
    99069987      "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz",
    99079988      "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==",
    9908       "dev": true,
    99099989      "engines": {
    99109990        "node": ">= 0.8"
     
    992410004      "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz",
    992510005      "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==",
    9926       "dev": true,
    992710006      "engines": {
    992810007        "node": ">= 0.8",
     
    1012810207      "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz",
    1012910208      "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==",
    10130       "dev": true,
    1013110209      "license": "MIT",
    1013210210      "dependencies": {
     
    1014810226      "version": "1.1.1",
    1014910227      "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
    10150       "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==",
    10151       "dev": true
     10228      "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow=="
    1015210229    },
    1015310230    "node_modules/electron-to-chromium": {
    10154       "version": "1.5.19",
    10155       "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.19.tgz",
    10156       "integrity": "sha512-kpLJJi3zxTR1U828P+LIUDZ5ohixyo68/IcYOHLqnbTPr/wdgn4i1ECvmALN9E16JPA6cvCG5UG79gVwVdEK5w==",
    10157       "dev": true
     10231      "version": "1.5.286",
     10232      "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.286.tgz",
     10233      "integrity": "sha512-9tfDXhJ4RKFNerfjdCcZfufu49vg620741MNs26a9+bhLThdB+plgMeou98CAaHu/WATj2iHOOHTp1hWtABj2A==",
     10234      "dev": true,
     10235      "license": "ISC"
    1015810236    },
    1015910237    "node_modules/emittery": {
     
    1018810266      "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz",
    1018910267      "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==",
    10190       "dev": true,
    1019110268      "engines": {
    1019210269        "node": ">= 0.8"
     
    1021310290    },
    1021410291    "node_modules/enhanced-resolve": {
    10215       "version": "5.17.1",
    10216       "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.17.1.tgz",
    10217       "integrity": "sha512-LMHl3dXhTcfv8gM4kEzIUeTQ+7fpdA0l2tUf34BddXPkz2A5xJ5L/Pchd5BL6rdccM9QGvu0sWZzK1Z1t4wwyg==",
    10218       "dev": true,
     10292      "version": "5.19.0",
     10293      "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.19.0.tgz",
     10294      "integrity": "sha512-phv3E1Xl4tQOShqSte26C7Fl84EwUdZsyOuSSk9qtAGyyQs2s3jJzComh+Abf4g187lUUAvH+H26omrqia2aGg==",
     10295      "dev": true,
     10296      "license": "MIT",
    1021910297      "dependencies": {
    1022010298        "graceful-fs": "^4.2.4",
    10221         "tapable": "^2.2.0"
     10299        "tapable": "^2.3.0"
    1022210300      },
    1022310301      "engines": {
     
    1034410422      "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz",
    1034510423      "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==",
    10346       "dev": true,
    1034710424      "license": "MIT",
    1034810425      "engines": {
     
    1035410431      "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz",
    1035510432      "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==",
    10356       "dev": true,
    1035710433      "engines": {
    1035810434        "node": ">= 0.4"
     
    1036010436    },
    1036110437    "node_modules/es-module-lexer": {
    10362       "version": "1.3.0",
    10363       "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.3.0.tgz",
    10364       "integrity": "sha512-vZK7T0N2CBmBOixhmjdqx2gWVbFZ4DXZ/NyRMZVlJXPa7CyFS+/a4QQsDGDQy9ZfEzxFuNEsMLeQJnKP2p5/JA==",
    10365       "dev": true
     10438      "version": "2.0.0",
     10439      "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-2.0.0.tgz",
     10440      "integrity": "sha512-5POEcUuZybH7IdmGsD8wlf0AI55wMecM9rVBTI/qEAy2c1kTOm3DjFYjrBdI2K3BaJjJYfYFeRtM0t9ssnRuxw==",
     10441      "dev": true,
     10442      "license": "MIT"
    1036610443    },
    1036710444    "node_modules/es-object-atoms": {
     
    1036910446      "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz",
    1037010447      "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==",
    10371       "dev": true,
    1037210448      "license": "MIT",
    1037310449      "dependencies": {
     
    1043210508      "version": "1.0.3",
    1043310509      "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
    10434       "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==",
    10435       "dev": true
     10510      "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow=="
    1043610511    },
    1043710512    "node_modules/escape-string-regexp": {
     
    1116611241      "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz",
    1116711242      "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==",
    11168       "dev": true,
    1116911243      "engines": {
    1117011244        "node": ">= 0.6"
     
    1130311377    },
    1130411378    "node_modules/express": {
    11305       "version": "4.21.2",
    11306       "resolved": "https://registry.npmjs.org/express/-/express-4.21.2.tgz",
    11307       "integrity": "sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==",
    11308       "dev": true,
     11379      "version": "4.22.1",
     11380      "resolved": "https://registry.npmjs.org/express/-/express-4.22.1.tgz",
     11381      "integrity": "sha512-F2X8g9P1X7uCPZMA3MVf9wcTqlyNp7IhH5qPCI0izhaOIYXaW9L535tGA3qmjRzpH+bZczqq7hVKxTR4NWnu+g==",
    1130911382      "license": "MIT",
    1131011383      "dependencies": {
    1131111384        "accepts": "~1.3.8",
    1131211385        "array-flatten": "1.1.1",
    11313         "body-parser": "1.20.3",
    11314         "content-disposition": "0.5.4",
     11386        "body-parser": "~1.20.3",
     11387        "content-disposition": "~0.5.4",
    1131511388        "content-type": "~1.0.4",
    11316         "cookie": "0.7.1",
    11317         "cookie-signature": "1.0.6",
     11389        "cookie": "~0.7.1",
     11390        "cookie-signature": "~1.0.6",
    1131811391        "debug": "2.6.9",
    1131911392        "depd": "2.0.0",
     
    1132111394        "escape-html": "~1.0.3",
    1132211395        "etag": "~1.8.1",
    11323         "finalhandler": "1.3.1",
    11324         "fresh": "0.5.2",
    11325         "http-errors": "2.0.0",
     11396        "finalhandler": "~1.3.1",
     11397        "fresh": "~0.5.2",
     11398        "http-errors": "~2.0.0",
    1132611399        "merge-descriptors": "1.0.3",
    1132711400        "methods": "~1.1.2",
    11328         "on-finished": "2.4.1",
     11401        "on-finished": "~2.4.1",
    1132911402        "parseurl": "~1.3.3",
    11330         "path-to-regexp": "0.1.12",
     11403        "path-to-regexp": "~0.1.12",
    1133111404        "proxy-addr": "~2.0.7",
    11332         "qs": "6.13.0",
     11405        "qs": "~6.14.0",
    1133311406        "range-parser": "~1.2.1",
    1133411407        "safe-buffer": "5.2.1",
    11335         "send": "0.19.0",
    11336         "serve-static": "1.16.2",
     11408        "send": "~0.19.0",
     11409        "serve-static": "~1.16.2",
    1133711410        "setprototypeof": "1.2.0",
    11338         "statuses": "2.0.1",
     11411        "statuses": "~2.0.1",
    1133911412        "type-is": "~1.6.18",
    1134011413        "utils-merge": "1.0.1",
     
    1135211425      "version": "1.1.1",
    1135311426      "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz",
    11354       "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==",
    11355       "dev": true
     11427      "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg=="
    1135611428    },
    1135711429    "node_modules/express/node_modules/debug": {
     
    1135911431      "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
    1136011432      "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
    11361       "dev": true,
    1136211433      "dependencies": {
    1136311434        "ms": "2.0.0"
     
    1136711438      "version": "2.0.0",
    1136811439      "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
    11369       "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
    11370       "dev": true
     11440      "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="
    1137111441    },
    1137211442    "node_modules/express/node_modules/path-to-regexp": {
     
    1137411444      "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.12.tgz",
    1137511445      "integrity": "sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==",
    11376       "dev": true,
    1137711446      "license": "MIT"
    1137811447    },
     
    1158211651      "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.1.tgz",
    1158311652      "integrity": "sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==",
    11584       "dev": true,
    1158511653      "dependencies": {
    1158611654        "debug": "2.6.9",
     
    1160011668      "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
    1160111669      "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
    11602       "dev": true,
    1160311670      "dependencies": {
    1160411671        "ms": "2.0.0"
     
    1160811675      "version": "2.0.0",
    1160911676      "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
    11610       "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
    11611       "dev": true
     11677      "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="
    1161211678    },
    1161311679    "node_modules/find-cache-dir": {
     
    1187911945      "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz",
    1188011946      "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==",
    11881       "dev": true,
    1188211947      "engines": {
    1188311948        "node": ">= 0.6"
     
    1194212007      "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz",
    1194312008      "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==",
    11944       "dev": true,
    1194512009      "engines": {
    1194612010        "node": ">= 0.6"
     
    1198612050      "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz",
    1198712051      "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==",
    11988       "dev": true,
    1198912052      "funding": {
    1199012053        "url": "https://github.com/sponsors/ljharb"
     
    1204012103      "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz",
    1204112104      "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==",
    12042       "dev": true,
    1204312105      "license": "MIT",
    1204412106      "dependencies": {
     
    1209512157      "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz",
    1209612158      "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==",
    12097       "dev": true,
    1209812159      "license": "MIT",
    1209912160      "dependencies": {
     
    1220612267      "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz",
    1220712268      "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==",
    12208       "dev": true
     12269      "dev": true,
     12270      "license": "BSD-2-Clause"
    1220912271    },
    1221012272    "node_modules/global-modules": {
     
    1229912361      "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz",
    1230012362      "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==",
    12301       "dev": true,
    1230212363      "license": "MIT",
    1230312364      "engines": {
     
    1241712478      "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz",
    1241812479      "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==",
    12419       "dev": true,
    1242012480      "license": "MIT",
    1242112481      "engines": {
     
    1244612506      "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz",
    1244712507      "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==",
    12448       "dev": true,
    1244912508      "dependencies": {
    1245012509        "function-bind": "^1.1.2"
     
    1263712696      "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz",
    1263812697      "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==",
    12639       "dev": true,
    1264012698      "dependencies": {
    1264112699        "depd": "2.0.0",
     
    1291012968      "version": "2.0.4",
    1291112969      "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
    12912       "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
    12913       "dev": true
     12970      "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
    1291412971    },
    1291512972    "node_modules/ini": {
     
    1567115728    },
    1567215729    "node_modules/loader-runner": {
    15673       "version": "4.3.0",
    15674       "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz",
    15675       "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==",
    15676       "dev": true,
     15730      "version": "4.3.1",
     15731      "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.1.tgz",
     15732      "integrity": "sha512-IWqP2SCPhyVFTBtRcgMHdzlf9ul25NwaFx4wCEH/KjAXuuHY4yNjvPXsBokp8jCB936PyWRaPKUNh8NvylLp2Q==",
     15733      "dev": true,
     15734      "license": "MIT",
    1567715735      "engines": {
    1567815736        "node": ">=6.11.5"
     15737      },
     15738      "funding": {
     15739        "type": "opencollective",
     15740        "url": "https://opencollective.com/webpack"
    1567915741      }
    1568015742    },
     
    1571915781    },
    1572015782    "node_modules/lodash": {
    15721       "version": "4.17.21",
    15722       "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
    15723       "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==",
    15724       "dev": true
     15783      "version": "4.17.23",
     15784      "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.23.tgz",
     15785      "integrity": "sha512-LgVTMpQtIopCi79SJeDiP0TfWi5CNEc/L/aRdTh3yIvmZXTnheWpKjSZhnvMl8iXbC1tFg9gdHHDMLoV7CnG+w==",
     15786      "dev": true,
     15787      "license": "MIT"
    1572515788    },
    1572615789    "node_modules/lodash-es": {
    15727       "version": "4.17.21",
    15728       "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz",
    15729       "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==",
     15790      "version": "4.17.23",
     15791      "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.23.tgz",
     15792      "integrity": "sha512-kVI48u3PZr38HdYz98UmfPnXl2DXrpdctLrFLCd3kOx1xUkOmpFPx7gCWWM5MPkL/fD8zb+Ph0QzjGFs4+hHWg==",
    1573015793      "dev": true,
    1573115794      "license": "MIT"
     
    1605016113      "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz",
    1605116114      "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==",
    16052       "dev": true,
    1605316115      "license": "MIT",
    1605416116      "engines": {
     
    1608216144      "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
    1608316145      "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==",
    16084       "dev": true,
    1608516146      "engines": {
    1608616147        "node": ">= 0.6"
     
    1617016231      "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz",
    1617116232      "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==",
    16172       "dev": true,
    1617316233      "funding": {
    1617416234        "url": "https://github.com/sponsors/sindresorhus"
     
    1620116261      "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz",
    1620216262      "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==",
    16203       "dev": true,
    1620416263      "engines": {
    1620516264        "node": ">= 0.6"
     
    1622316282      "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz",
    1622416283      "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==",
    16225       "dev": true,
    1622616284      "bin": {
    1622716285        "mime": "cli.js"
     
    1623516293      "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
    1623616294      "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==",
    16237       "dev": true,
    1623816295      "engines": {
    1623916296        "node": ">= 0.6"
     
    1624416301      "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
    1624516302      "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
    16246       "dev": true,
    1624716303      "dependencies": {
    1624816304        "mime-db": "1.52.0"
     
    1653116587      "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz",
    1653216588      "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==",
    16533       "dev": true,
    1653416589      "engines": {
    1653516590        "node": ">= 0.6"
     
    1657816633    },
    1657916634    "node_modules/node-releases": {
    16580       "version": "2.0.18",
    16581       "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.18.tgz",
    16582       "integrity": "sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==",
    16583       "dev": true
     16635      "version": "2.0.27",
     16636      "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.27.tgz",
     16637      "integrity": "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==",
     16638      "dev": true,
     16639      "license": "MIT"
    1658416640    },
    1658516641    "node_modules/node-wp-i18n": {
     
    1691916975    },
    1692016976    "node_modules/object-inspect": {
    16921       "version": "1.13.2",
    16922       "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.2.tgz",
    16923       "integrity": "sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==",
    16924       "dev": true,
     16977      "version": "1.13.4",
     16978      "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz",
     16979      "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==",
     16980      "license": "MIT",
    1692516981      "engines": {
    1692616982        "node": ">= 0.4"
     
    1704017096      "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz",
    1704117097      "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==",
    17042       "dev": true,
    1704317098      "dependencies": {
    1704417099        "ee-first": "1.1.1"
     
    1733817393      "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz",
    1733917394      "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==",
    17340       "dev": true,
    1734117395      "engines": {
    1734217396        "node": ">= 0.8"
     
    1742517479    },
    1742617480    "node_modules/picocolors": {
    17427       "version": "1.1.0",
    17428       "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.0.tgz",
    17429       "integrity": "sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw==",
    17430       "dev": true
     17481      "version": "1.1.1",
     17482      "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz",
     17483      "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==",
     17484      "dev": true,
     17485      "license": "ISC"
    1743117486    },
    1743217487    "node_modules/picomatch": {
     
    1837318428      "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz",
    1837418429      "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==",
    18375       "dev": true,
    1837618430      "dependencies": {
    1837718431        "forwarded": "0.2.0",
     
    1838618440      "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz",
    1838718441      "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==",
    18388       "dev": true,
    1838918442      "engines": {
    1839018443        "node": ">= 0.10"
     
    1854518598    },
    1854618599    "node_modules/qs": {
    18547       "version": "6.13.0",
    18548       "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz",
    18549       "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==",
    18550       "dev": true,
    18551       "dependencies": {
    18552         "side-channel": "^1.0.6"
     18600      "version": "6.14.1",
     18601      "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.1.tgz",
     18602      "integrity": "sha512-4EK3+xJl8Ts67nLYNwqw/dsFVnCf+qR7RgXSK9jEEm9unao3njwMDdmsdvoKBKHzxd7tCYz5e5M+SnMjdtXGQQ==",
     18603      "license": "BSD-3-Clause",
     18604      "dependencies": {
     18605        "side-channel": "^1.1.0"
    1855318606      },
    1855418607      "engines": {
     
    1860718660      "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz",
    1860818661      "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==",
    18609       "dev": true,
    1861018662      "engines": {
    1861118663        "node": ">= 0.6"
     
    1861618668      "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz",
    1861718669      "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==",
    18618       "dev": true,
    1861918670      "dependencies": {
    1862018671        "bytes": "3.1.2",
     
    1863118682      "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
    1863218683      "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
    18633       "dev": true,
    1863418684      "dependencies": {
    1863518685        "safer-buffer": ">= 2.1.2 < 3"
     
    1938419434      "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
    1938519435      "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
    19386       "dev": true,
    1938719436      "funding": [
    1938819437        {
     
    1941719466      "version": "2.1.2",
    1941819467      "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
    19419       "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
    19420       "dev": true
     19468      "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="
    1942119469    },
    1942219470    "node_modules/sass": {
     
    1955119599      "resolved": "https://registry.npmjs.org/send/-/send-0.19.0.tgz",
    1955219600      "integrity": "sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==",
    19553       "dev": true,
    1955419601      "dependencies": {
    1955519602        "debug": "2.6.9",
     
    1957519622      "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
    1957619623      "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
    19577       "dev": true,
    1957819624      "dependencies": {
    1957919625        "ms": "2.0.0"
     
    1958319629      "version": "2.0.0",
    1958419630      "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
    19585       "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
    19586       "dev": true
     19631      "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="
    1958719632    },
    1958819633    "node_modules/send/node_modules/encodeurl": {
     
    1959019635      "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz",
    1959119636      "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==",
    19592       "dev": true,
    1959319637      "engines": {
    1959419638        "node": ">= 0.8"
     
    1959819642      "version": "2.1.3",
    1959919643      "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
    19600       "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
    19601       "dev": true
     19644      "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="
    1960219645    },
    1960319646    "node_modules/sentence-case": {
     
    1970419747      "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.2.tgz",
    1970519748      "integrity": "sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==",
    19706       "dev": true,
    1970719749      "dependencies": {
    1970819750        "encodeurl": "~2.0.0",
     
    1974119783      "version": "1.2.0",
    1974219784      "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz",
    19743       "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==",
    19744       "dev": true
     19785      "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw=="
    1974519786    },
    1974619787    "node_modules/shallow-clone": {
     
    2000320044    },
    2000420045    "node_modules/side-channel": {
    20005       "version": "1.0.6",
    20006       "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz",
    20007       "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==",
    20008       "dev": true,
    20009       "dependencies": {
    20010         "call-bind": "^1.0.7",
     20046      "version": "1.1.0",
     20047      "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz",
     20048      "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==",
     20049      "license": "MIT",
     20050      "dependencies": {
    2001120051        "es-errors": "^1.3.0",
    20012         "get-intrinsic": "^1.2.4",
    20013         "object-inspect": "^1.13.1"
     20052        "object-inspect": "^1.13.3",
     20053        "side-channel-list": "^1.0.0",
     20054        "side-channel-map": "^1.0.1",
     20055        "side-channel-weakmap": "^1.0.2"
     20056      },
     20057      "engines": {
     20058        "node": ">= 0.4"
     20059      },
     20060      "funding": {
     20061        "url": "https://github.com/sponsors/ljharb"
     20062      }
     20063    },
     20064    "node_modules/side-channel-list": {
     20065      "version": "1.0.0",
     20066      "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz",
     20067      "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==",
     20068      "license": "MIT",
     20069      "dependencies": {
     20070        "es-errors": "^1.3.0",
     20071        "object-inspect": "^1.13.3"
     20072      },
     20073      "engines": {
     20074        "node": ">= 0.4"
     20075      },
     20076      "funding": {
     20077        "url": "https://github.com/sponsors/ljharb"
     20078      }
     20079    },
     20080    "node_modules/side-channel-map": {
     20081      "version": "1.0.1",
     20082      "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz",
     20083      "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==",
     20084      "license": "MIT",
     20085      "dependencies": {
     20086        "call-bound": "^1.0.2",
     20087        "es-errors": "^1.3.0",
     20088        "get-intrinsic": "^1.2.5",
     20089        "object-inspect": "^1.13.3"
     20090      },
     20091      "engines": {
     20092        "node": ">= 0.4"
     20093      },
     20094      "funding": {
     20095        "url": "https://github.com/sponsors/ljharb"
     20096      }
     20097    },
     20098    "node_modules/side-channel-weakmap": {
     20099      "version": "1.0.2",
     20100      "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz",
     20101      "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==",
     20102      "license": "MIT",
     20103      "dependencies": {
     20104        "call-bound": "^1.0.2",
     20105        "es-errors": "^1.3.0",
     20106        "get-intrinsic": "^1.2.5",
     20107        "object-inspect": "^1.13.3",
     20108        "side-channel-map": "^1.0.1"
    2001420109      },
    2001520110      "engines": {
     
    2038020475      "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz",
    2038120476      "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==",
    20382       "dev": true,
    2038320477      "engines": {
    2038420478        "node": ">= 0.8"
     
    2091721011    },
    2091821012    "node_modules/tapable": {
    20919       "version": "2.2.1",
    20920       "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz",
    20921       "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==",
    20922       "dev": true,
     21013      "version": "2.3.0",
     21014      "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.0.tgz",
     21015      "integrity": "sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg==",
     21016      "dev": true,
     21017      "license": "MIT",
    2092321018      "engines": {
    2092421019        "node": ">=6"
     21020      },
     21021      "funding": {
     21022        "type": "opencollective",
     21023        "url": "https://opencollective.com/webpack"
    2092521024      }
    2092621025    },
     
    2097121070    },
    2097221071    "node_modules/terser-webpack-plugin": {
    20973       "version": "5.3.10",
    20974       "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.10.tgz",
    20975       "integrity": "sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w==",
    20976       "dev": true,
    20977       "dependencies": {
    20978         "@jridgewell/trace-mapping": "^0.3.20",
     21072      "version": "5.3.16",
     21073      "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.16.tgz",
     21074      "integrity": "sha512-h9oBFCWrq78NyWWVcSwZarJkZ01c2AyGrzs1crmHZO3QUg9D61Wu4NPjBy69n7JqylFF5y+CsUZYmYEIZ3mR+Q==",
     21075      "dev": true,
     21076      "license": "MIT",
     21077      "dependencies": {
     21078        "@jridgewell/trace-mapping": "^0.3.25",
    2097921079        "jest-worker": "^27.4.5",
    20980         "schema-utils": "^3.1.1",
    20981         "serialize-javascript": "^6.0.1",
    20982         "terser": "^5.26.0"
     21080        "schema-utils": "^4.3.0",
     21081        "serialize-javascript": "^6.0.2",
     21082        "terser": "^5.31.1"
    2098321083      },
    2098421084      "engines": {
     
    2100421104      }
    2100521105    },
     21106    "node_modules/terser-webpack-plugin/node_modules/ajv": {
     21107      "version": "8.17.1",
     21108      "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz",
     21109      "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==",
     21110      "dev": true,
     21111      "license": "MIT",
     21112      "dependencies": {
     21113        "fast-deep-equal": "^3.1.3",
     21114        "fast-uri": "^3.0.1",
     21115        "json-schema-traverse": "^1.0.0",
     21116        "require-from-string": "^2.0.2"
     21117      },
     21118      "funding": {
     21119        "type": "github",
     21120        "url": "https://github.com/sponsors/epoberezkin"
     21121      }
     21122    },
     21123    "node_modules/terser-webpack-plugin/node_modules/ajv-keywords": {
     21124      "version": "5.1.0",
     21125      "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz",
     21126      "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==",
     21127      "dev": true,
     21128      "license": "MIT",
     21129      "dependencies": {
     21130        "fast-deep-equal": "^3.1.3"
     21131      },
     21132      "peerDependencies": {
     21133        "ajv": "^8.8.2"
     21134      }
     21135    },
    2100621136    "node_modules/terser-webpack-plugin/node_modules/has-flag": {
    2100721137      "version": "4.0.0",
     
    2102721157      }
    2102821158    },
     21159    "node_modules/terser-webpack-plugin/node_modules/json-schema-traverse": {
     21160      "version": "1.0.0",
     21161      "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz",
     21162      "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==",
     21163      "dev": true,
     21164      "license": "MIT"
     21165    },
     21166    "node_modules/terser-webpack-plugin/node_modules/schema-utils": {
     21167      "version": "4.3.3",
     21168      "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.3.tgz",
     21169      "integrity": "sha512-eflK8wEtyOE6+hsaRVPxvUKYCpRgzLqDTb8krvAsRIwOGlHoSgYLgBXoubGgLd2fT41/OUYdb48v4k4WWHQurA==",
     21170      "dev": true,
     21171      "license": "MIT",
     21172      "dependencies": {
     21173        "@types/json-schema": "^7.0.9",
     21174        "ajv": "^8.9.0",
     21175        "ajv-formats": "^2.1.1",
     21176        "ajv-keywords": "^5.1.0"
     21177      },
     21178      "engines": {
     21179        "node": ">= 10.13.0"
     21180      },
     21181      "funding": {
     21182        "type": "opencollective",
     21183        "url": "https://opencollective.com/webpack"
     21184      }
     21185    },
    2102921186    "node_modules/terser-webpack-plugin/node_modules/supports-color": {
    2103021187      "version": "8.1.1",
     
    2118121338      "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz",
    2118221339      "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==",
    21183       "dev": true,
    2118421340      "engines": {
    2118521341        "node": ">=0.6"
     
    2137021526      "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz",
    2137121527      "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==",
    21372       "dev": true,
    2137321528      "dependencies": {
    2137421529        "media-typer": "0.3.0",
     
    2157221727      "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
    2157321728      "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==",
    21574       "dev": true,
    2157521729      "engines": {
    2157621730        "node": ">= 0.8"
     
    2157821732    },
    2157921733    "node_modules/update-browserslist-db": {
    21580       "version": "1.1.0",
    21581       "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.0.tgz",
    21582       "integrity": "sha512-EdRAaAyk2cUE1wOf2DkEhzxqOQvFOoRJFNS6NeyJ01Gp2beMRpBAINjM2iDXE3KCuKhwnvHIQCJm6ThL2Z+HzQ==",
     21734      "version": "1.2.3",
     21735      "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz",
     21736      "integrity": "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==",
    2158321737      "dev": true,
    2158421738      "funding": [
     
    2159621750        }
    2159721751      ],
    21598       "dependencies": {
    21599         "escalade": "^3.1.2",
    21600         "picocolors": "^1.0.1"
     21752      "license": "MIT",
     21753      "dependencies": {
     21754        "escalade": "^3.2.0",
     21755        "picocolors": "^1.1.1"
    2160121756      },
    2160221757      "bin": {
     
    2175521910      "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz",
    2175621911      "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==",
    21757       "dev": true,
    2175821912      "engines": {
    2175921913        "node": ">= 0.4.0"
     
    2185922013      "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
    2186022014      "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==",
    21861       "dev": true,
    2186222015      "engines": {
    2186322016        "node": ">= 0.8"
     
    2190522058    },
    2190622059    "node_modules/watchpack": {
    21907       "version": "2.4.2",
    21908       "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.2.tgz",
    21909       "integrity": "sha512-TnbFSbcOCcDgjZ4piURLCbJ3nJhznVh9kw6F6iokjiFPl8ONxe9A6nMDVXDiNbrSfLILs6vB07F7wLBrwPYzJw==",
    21910       "dev": true,
     22060      "version": "2.5.1",
     22061      "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.5.1.tgz",
     22062      "integrity": "sha512-Zn5uXdcFNIA1+1Ei5McRd+iRzfhENPCe7LeABkJtNulSxjma+l7ltNx55BWZkRlwRnpOgHqxnjyaDgJnNXnqzg==",
     22063      "dev": true,
     22064      "license": "MIT",
    2191122065      "dependencies": {
    2191222066        "glob-to-regexp": "^0.4.1",
     
    2194222096    },
    2194322097    "node_modules/webpack": {
    21944       "version": "5.94.0",
    21945       "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.94.0.tgz",
    21946       "integrity": "sha512-KcsGn50VT+06JH/iunZJedYGUJS5FGjow8wb9c0v5n1Om8O1g4L6LjtfxwlXIATopoQu+vOXXa7gYisWxCoPyg==",
    21947       "dev": true,
    21948       "dependencies": {
    21949         "@types/estree": "^1.0.5",
    21950         "@webassemblyjs/ast": "^1.12.1",
    21951         "@webassemblyjs/wasm-edit": "^1.12.1",
    21952         "@webassemblyjs/wasm-parser": "^1.12.1",
    21953         "acorn": "^8.7.1",
    21954         "acorn-import-attributes": "^1.9.5",
    21955         "browserslist": "^4.21.10",
     22098      "version": "5.105.0",
     22099      "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.105.0.tgz",
     22100      "integrity": "sha512-gX/dMkRQc7QOMzgTe6KsYFM7DxeIONQSui1s0n/0xht36HvrgbxtM1xBlgx596NbpHuQU8P7QpKwrZYwUX48nw==",
     22101      "dev": true,
     22102      "license": "MIT",
     22103      "dependencies": {
     22104        "@types/eslint-scope": "^3.7.7",
     22105        "@types/estree": "^1.0.8",
     22106        "@types/json-schema": "^7.0.15",
     22107        "@webassemblyjs/ast": "^1.14.1",
     22108        "@webassemblyjs/wasm-edit": "^1.14.1",
     22109        "@webassemblyjs/wasm-parser": "^1.14.1",
     22110        "acorn": "^8.15.0",
     22111        "acorn-import-phases": "^1.0.3",
     22112        "browserslist": "^4.28.1",
    2195622113        "chrome-trace-event": "^1.0.2",
    21957         "enhanced-resolve": "^5.17.1",
    21958         "es-module-lexer": "^1.2.1",
     22114        "enhanced-resolve": "^5.19.0",
     22115        "es-module-lexer": "^2.0.0",
    2195922116        "eslint-scope": "5.1.1",
    2196022117        "events": "^3.2.0",
     
    2196222119        "graceful-fs": "^4.2.11",
    2196322120        "json-parse-even-better-errors": "^2.3.1",
    21964         "loader-runner": "^4.2.0",
     22121        "loader-runner": "^4.3.1",
    2196522122        "mime-types": "^2.1.27",
    2196622123        "neo-async": "^2.6.2",
    21967         "schema-utils": "^3.2.0",
    21968         "tapable": "^2.1.1",
    21969         "terser-webpack-plugin": "^5.3.10",
    21970         "watchpack": "^2.4.1",
    21971         "webpack-sources": "^3.2.3"
     22124        "schema-utils": "^4.3.3",
     22125        "tapable": "^2.3.0",
     22126        "terser-webpack-plugin": "^5.3.16",
     22127        "watchpack": "^2.5.1",
     22128        "webpack-sources": "^3.3.3"
    2197222129      },
    2197322130      "bin": {
     
    2241322570    },
    2241422571    "node_modules/webpack-sources": {
    22415       "version": "3.2.3",
    22416       "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz",
    22417       "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==",
    22418       "dev": true,
     22572      "version": "3.3.3",
     22573      "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.3.3.tgz",
     22574      "integrity": "sha512-yd1RBzSGanHkitROoPFd6qsrxt+oFhg/129YzheDGqeustzX0vTZJZsSsQjVQC4yzBQ56K55XU8gaNCtIzOnTg==",
     22575      "dev": true,
     22576      "license": "MIT",
    2241922577      "engines": {
    2242022578        "node": ">=10.13.0"
     22579      }
     22580    },
     22581    "node_modules/webpack/node_modules/ajv": {
     22582      "version": "8.17.1",
     22583      "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz",
     22584      "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==",
     22585      "dev": true,
     22586      "license": "MIT",
     22587      "dependencies": {
     22588        "fast-deep-equal": "^3.1.3",
     22589        "fast-uri": "^3.0.1",
     22590        "json-schema-traverse": "^1.0.0",
     22591        "require-from-string": "^2.0.2"
     22592      },
     22593      "funding": {
     22594        "type": "github",
     22595        "url": "https://github.com/sponsors/epoberezkin"
     22596      }
     22597    },
     22598    "node_modules/webpack/node_modules/ajv-keywords": {
     22599      "version": "5.1.0",
     22600      "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz",
     22601      "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==",
     22602      "dev": true,
     22603      "license": "MIT",
     22604      "dependencies": {
     22605        "fast-deep-equal": "^3.1.3"
     22606      },
     22607      "peerDependencies": {
     22608        "ajv": "^8.8.2"
     22609      }
     22610    },
     22611    "node_modules/webpack/node_modules/json-schema-traverse": {
     22612      "version": "1.0.0",
     22613      "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz",
     22614      "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==",
     22615      "dev": true,
     22616      "license": "MIT"
     22617    },
     22618    "node_modules/webpack/node_modules/schema-utils": {
     22619      "version": "4.3.3",
     22620      "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.3.tgz",
     22621      "integrity": "sha512-eflK8wEtyOE6+hsaRVPxvUKYCpRgzLqDTb8krvAsRIwOGlHoSgYLgBXoubGgLd2fT41/OUYdb48v4k4WWHQurA==",
     22622      "dev": true,
     22623      "license": "MIT",
     22624      "dependencies": {
     22625        "@types/json-schema": "^7.0.9",
     22626        "ajv": "^8.9.0",
     22627        "ajv-formats": "^2.1.1",
     22628        "ajv-keywords": "^5.1.0"
     22629      },
     22630      "engines": {
     22631        "node": ">= 10.13.0"
     22632      },
     22633      "funding": {
     22634        "type": "opencollective",
     22635        "url": "https://opencollective.com/webpack"
    2242122636      }
    2242222637    },
  • mailchimp-for-woocommerce/trunk/blocks/package.json

    r3159961 r3457552  
    5151  },
    5252  "dependencies": {
    53     "classnames": "^2.5.1"
     53    "classnames": "^2.5.1",
     54    "express": "^4.22.1",
     55    "qs": "^6.14.1"
    5456  }
    5557}
  • mailchimp-for-woocommerce/trunk/blocks/webpack.config.js

    r2686137 r3457552  
    3030        'newsletter-block': path.resolve( process.cwd(), 'assets', 'js', 'checkout-newsletter-subscription-block', 'index.js' ),
    3131        'newsletter-block-frontend': path.resolve( process.cwd(), 'assets', 'js', 'checkout-newsletter-subscription-block', 'frontend.js' ),
     32
     33        'sms-consent-block': path.resolve( process.cwd(), 'assets', 'js', 'checkout-sms-consent-block', 'index.js' ),
     34        'sms-consent-block-frontend': path.resolve( process.cwd(), 'assets', 'js', 'checkout-sms-consent-block', 'frontend.js' ),
    3235    },
    3336    plugins: [
  • mailchimp-for-woocommerce/trunk/bootstrap.php

    r3433839 r3457552  
    1717        'MailChimp_WooCommerce_Options' => 'includes/class-mailchimp-woocommerce-options.php',
    1818        'MailChimp_Newsletter' => 'includes/class-mailchimp-woocommerce-newsletter.php',
     19        'MailChimp_Sms_Consent' => 'includes/class-mailchimp-woocommerce-sms-consent.php',
    1920        'MailChimp_WooCommerce_Loader' => 'includes/class-mailchimp-woocommerce-loader.php',
    2021        'MailChimp_WooCommerce_i18n' => 'includes/class-mailchimp-woocommerce-i18n.php',
     
    113114        'repo' => 'master',
    114115        'environment' => 'production', // staging or production
    115         'version' => '5.7.0',
     116        'version' => '6.0',
    116117        'php_version' => phpversion(),
    117118        'wp_version' => (empty($wp_version) ? 'Unknown' : $wp_version),
     
    15491550            }
    15501551
    1551             $result = mailchimp_get_api()
     1552            $api = mailchimp_get_api();
     1553
     1554            if ($caller === 'cart') {
     1555                $status = mailchimp_get_subscriber_status($user_email);
     1556
     1557                if (in_array($status, ['transactional', 'subscribed', 'pending'])) {
     1558                    $status_if_new = $status;
     1559                }
     1560            }
     1561
     1562            $result = $api
    15521563                ->useAutoDoi($should_doi)
    15531564                ->update(
     
    16001611            }
    16011612        }
     1613    }
     1614}
     1615
     1616
     1617/**
     1618 * Sync SMS consent data to Mailchimp for a member
     1619 *
     1620 * IMPORTANT: This function respects AC8 - if a customer places an order WITHOUT
     1621 * checking SMS consent, we should NOT change their existing SMS subscription status.
     1622 * We only sync when the customer explicitly opts in.
     1623 *
     1624 * @param string|null $user_email The user's email address (can be null for email-less checkout)
     1625 * @param int|null $order_id The WooCommerce order ID (optional)
     1626 * @param int|null $user_id The WordPress user ID (optional)
     1627 * @param string $caller The calling context for logging
     1628 * @param string|null $email_status The status of user's email subscription for contact upserts.
     1629 * @return bool True if SMS was synced, false otherwise
     1630 */
     1631function mailchimp_member_sms_update($user_email = null, $order_id = null, $user_id = null, $caller = 'order', $email_status = null) {
     1632    // Check if SMS is enabled
     1633    $options = \Mailchimp_Woocommerce_DB_Helpers::get_option('mailchimp-woocommerce');
     1634    if (empty($options['mailchimp_sms_consent_enabled'])) {
     1635        return false;
     1636    }
     1637
     1638    $sms_data = null;
     1639
     1640    // Try to get SMS data from order first
     1641    if ($order_id) {
     1642        $sms_data = MailChimp_Sms_Consent::getSmsDataFromOrder($order_id);
     1643    }
     1644
     1645    // If no order SMS data, try from user
     1646    if (!$sms_data && $user_id) {
     1647        $sms_data = MailChimp_Sms_Consent::getSmsDataFromUser($user_id);
     1648    }
     1649
     1650    // If still no SMS data, try current user if logged in
     1651    if (!$sms_data && is_user_logged_in()) {
     1652        $sms_data = MailChimp_Sms_Consent::getSmsDataFromUser(get_current_user_id());
     1653    }
     1654
     1655    // No SMS consent data found - this is expected when customer doesn't check the box
     1656    // Per AC8: Do NOT change existing SMS subscription status in this case
     1657    if (!$sms_data || empty($sms_data['phone'])) {
     1658        mailchimp_debug('sms.sync', "No SMS consent data found - preserving existing status");
     1659        return false;
     1660    }
     1661
     1662    // Only sync if they explicitly opted in (AC8 compliance)
     1663    if (empty($sms_data['subscribed'])) {
     1664        mailchimp_debug('sms.sync', "SMS consent not checked - preserving existing status");
     1665        return false;
     1666    }
     1667
     1668    $list_id = mailchimp_get_list_id();
     1669    if (!$list_id) {
     1670        return false;
     1671    }
     1672
     1673    // Handle email-less checkout (AC10)
     1674    $identifier = $user_email;
     1675    if (empty($identifier) && $order_id) {
     1676        $order = wc_get_order($order_id);
     1677        if ($order) {
     1678            $identifier = $order->get_billing_email();
     1679        }
     1680    }
     1681
     1682    $transient_key = $caller . ".sms.member." . md5(($sms_data['phone'].'.'.$identifier));
     1683
     1684    // Check if we've already synced recently
     1685    if (mailchimp_get_transient($transient_key)) {
     1686        mailchimp_debug('sms.sync', "Skipping SMS sync for phone {$sms_data['phone']} - recently synced");
     1687        return true;
     1688    }
     1689
     1690    try {
     1691        $api = mailchimp_get_api();
     1692
     1693        mailchimp_debug('sms.sync', "Syncing SMS consent", array(
     1694            'email' => $identifier,
     1695            'phone' => $sms_data['phone'],
     1696            'subscribed' => $sms_data['subscribed'],
     1697        ));
     1698
     1699        // Sync SMS consent to Mailchimp
     1700        // preserve_existing = true means we won't unsubscribe someone who's already subscribed
     1701        $result = $api->subscribeSms($list_id, $identifier, $sms_data['phone'], $sms_data['subscribed'], true, $email_status);
     1702
     1703        mailchimp_log('sms_consent_sync', 'caller', [
     1704            'caller' => $caller,
     1705            'user_id' => $user_id,
     1706            'sms_data' => $sms_data,
     1707            'email' => $identifier,
     1708            'result' => $result
     1709        ]);
     1710
     1711        // Set transient to prevent duplicate calls
     1712        mailchimp_set_transient($transient_key, true, 3600);
     1713
     1714        mailchimp_log($caller . '.sms.synced', "SMS consent synced :: phone: {$sms_data['phone']}" . ($identifier ? " :: email: {$identifier}" : " (email-less)"));
     1715        return true;
     1716
     1717    } catch (Exception $e) {
     1718        mailchimp_error($caller . '.sms.sync.error', $e->getMessage() . " :: phone: {$sms_data['phone']}");
     1719        return false;
    16021720    }
    16031721}
  • mailchimp-for-woocommerce/trunk/includes/api/assets/class-mailchimp-customer.php

    r3346450 r3457552  
    1313    protected $id            = null;
    1414    protected $email_address = null;
    15     protected $opt_in_status = null;
     15    protected $opt_in_status = false;
     16    protected $sms_opt_in_status = false;
     17    protected $phone_number = null;
    1618    protected $company       = null;
    1719    protected $first_name    = null;
     
    3436            'id'            => 'required',
    3537            'email_address' => 'required|email',
    36             'opt_in_status' => 'required|string',
     38            'opt_in_status' => 'required',
    3739            'company'       => 'string',
    3840            'first_name'    => 'string',
     
    8587
    8688    /**
     89     * @return null
     90     */
     91    public function getPhoneNumber() {
     92        return $this->phone_number;
     93    }
     94
     95    /**
     96     * @return null
     97     */
     98    public function getSmsOptInStatus() {
     99        return $this->sms_opt_in_status;
     100    }
     101
     102    /**
    87103     * @return DateTime|false|mixed|null
    88104     */
     
    123139    }
    124140
     141
     142    /**
     143     * @param bool $sms_opt_in_status
     144     * @return MailChimp_WooCommerce_Customer
     145     */
     146    public function setSmsOptInStatus( $sms_opt_in_status ) {
     147        if ( is_bool( $sms_opt_in_status ) ) {
     148            $this->sms_opt_in_status = $sms_opt_in_status;
     149        } else {
     150            $this->sms_opt_in_status = $sms_opt_in_status === '1' || $sms_opt_in_status === 1 || $sms_opt_in_status === true;
     151        }
     152        return $this;
     153    }
     154
     155    /**
     156     * @param string|null $phone_number
     157     * @return MailChimp_WooCommerce_Customer
     158     */
     159    public function setPhoneNumber( $phone_number ) {
     160        $this->phone_number = $phone_number;
     161        return $this;
     162    }
    125163    /**
    126164     * @return null
     
    370408                } elseif ( $subscriber['status'] === 'archived' ) {
    371409                    $meta_value = 'archived';
     410                } elseif ( $subscriber["status"] === "unsubscribed" ) {
     411                    $meta_value = "unsubscribed";
    372412                }
    373413                $meta_value !== null && update_user_meta($this->wordpress_user->ID, 'mailchimp_woocommerce_is_subscribed', $meta_value);
     
    393433        $address = $this->getAddress()->toArray();
    394434
    395         return mailchimp_array_remove_empty(
    396             array(
    397                 'id'            => (string) $this->getId(),
    398                 'email_address' => (string) $this->getEmailAddress(),
    399                 'opt_in_status' => false, //$this->getOptInStatus(),
    400                 'marketing_status_updated_at' => $this->getOptInStatusTimeAsString(),
    401                 'company'       => (string) $this->getCompany(),
    402                 'first_name'    => (string) $this->getFirstName(),
    403                 'last_name'     => (string) $this->getLastName(),
    404                 // 'orders_count' => (int) $this->getOrdersCount(),
    405                 // 'total_spent' => floatval(number_format($this->getTotalSpent(), 2, '.', '')),
    406                 'address'       => ( empty( $address ) ? null : $address ),
    407             )
     435        $array = array(
     436            'id'            => (string) $this->getId(),
     437            'email_address' => (string) $this->getEmailAddress(),
     438            'opt_in_status' => (bool)$this->getOptInStatus(),
     439            'marketing_status_updated_at' => $this->getOptInStatusTimeAsString(),
     440            'company'       => (string) $this->getCompany(),
     441            'first_name'    => (string) $this->getFirstName(),
     442            'last_name'     => (string) $this->getLastName(),
     443            // 'orders_count' => (int) $this->getOrdersCount(),
     444            // 'total_spent' => floatval(number_format($this->getTotalSpent(), 2, '.', '')),
     445            'address'       => ( empty( $address ) ? null : $address ),
    408446        );
     447
     448        // Add SMS fields if SMS consent is enabled
     449        $sms_phone = $this->getPhoneNumber();
     450        if ( $this->getSmsOptInStatus() && !empty( $sms_phone ) ) {
     451            $array['phone_number'] = (string) $sms_phone;
     452        }
     453
     454        return mailchimp_array_remove_empty( $array );
    409455    }
    410456
  • mailchimp-for-woocommerce/trunk/includes/api/class-mailchimp-api.php

    r3355528 r3457552  
    398398    }
    399399
     400    public function getContacts($list_id)
     401    {
     402        $endpoint = "/audiences/{$list_id}/contacts";
     403
     404        return $this->get( $endpoint );
     405    }
     406
     407    public function smsGetContact($list_id, $email)
     408    {
     409        $hash = md5( strtolower( trim( $email ) ) );
     410
     411        $endpoint = "/audiences/{$list_id}/contacts/{$hash}";
     412
     413        return $this->get( $endpoint );
     414    }
     415
     416    public function smsConsentUpdate($list_id, $phone_number, $subscribed = '1', $merge_fields = array())
     417    {
     418        $hash = hash( 'sha256', trim( $phone_number ) );
     419
     420        if ( $subscribed === '1' ) {
     421            $status = 'confirmed';
     422        } else {
     423            $status = 'unknown';
     424        }
     425
     426        $payload = [
     427            'sms_channel' => [
     428                'sms_phone' => $phone_number,
     429                'marketing_consent' => [
     430                    'status' => $status,
     431                    'source' => 'Mailchimp for Woocommerce'
     432                ]
     433            ],
     434            'merge_fields' => $merge_fields,
     435        ];
     436
     437        $data = $this->cleanListSubmission($payload);
     438
     439        try {
     440            $endpoint = "/audiences/{$list_id}/contacts/{$hash}";
     441            return $this->patch( $endpoint, $data );
     442        } catch ( Exception $e ) {}
     443    }
     444
     445    public function smsConsentPost($list_id, $phone_number, $subscribed = '1', $merge_fields = array())
     446    {
     447        if ( $subscribed === '1' ) {
     448            $status = 'confirmed';
     449        } else {
     450            $status = 'unknown';
     451        }
     452
     453        $payload = [
     454            'sms_channel' => [
     455                'sms_phone' => $phone_number,
     456                'marketing_consent' => [
     457                    'status' => $status,
     458                    'source' => 'Mailchimp for Woocommerce'
     459                ]
     460            ],
     461            'merge_fields' => $merge_fields,
     462//            'update_existing' => true
     463        ];
     464
     465        $data = $this->cleanListSubmission($payload);
     466
     467        try {
     468            $endpoint = "audiences/{$list_id}/contacts";
     469
     470            $response =  $this->post( $endpoint, $data );
     471            mailchimp_debug('sms-consent.post', 'success', [
     472                'payload' => $data,
     473                'endpoint' => $endpoint,
     474                'response' => $response,
     475            ]);
     476
     477            return $response;
     478        } catch ( Exception $e ) {
     479            mailchimp_debug('sms-consent.post', 'error', [
     480                'payload' => $data,
     481                'endpoint' => $endpoint,
     482                'message' => $e->getMessage(),
     483            ]);
     484
     485            return false;
     486        }
     487    }
     488
    400489    /**
    401490     * @param $data
     
    607696    }
    608697
    609     /**
     698    /**
     699     * Subscribe a contact to SMS marketing
     700     *
     701     * @param string $list_id The audience/list ID
     702     * @param string|null $email The contact's email address (used to identify the contact, can be null for email-less checkout)
     703     * @param string $sms_phone The SMS phone number (E.164 format preferred)
     704     * @param bool $subscribed Whether to subscribe (true) or mark as pending (false)
     705     * @param bool $preserve_existing If true, don't change status of already subscribed contacts
     706     * @return array|bool|mixed|object|null
     707     * @throws MailChimp_WooCommerce_Error
     708     * @throws MailChimp_WooCommerce_RateLimitError
     709     * @throws MailChimp_WooCommerce_ServerError
     710     */
     711    public function subscribeSms( $list_id, $email, $sms_phone, $subscribed = true, $preserve_existing = true, $email_status = '0' ) {
     712        // Validate and format phone number
     713        $sms_phone = $this->formatSmsPhone( $sms_phone );
     714        if ( empty( $sms_phone ) ) {
     715            throw new MailChimp_WooCommerce_Error( 'Invalid SMS phone number format' );
     716        }
     717
     718        // Build the SMS channel data according to Mailchimp API
     719        $sms_channel = array(
     720            'sms_phone' => $sms_phone,
     721            'marketing_consent' => array(
     722                'status' => $subscribed ? 'confirmed' : 'pending',
     723                'source' => 'Mailchimp for Woocommerce',
     724            ),
     725        );
     726
     727        // Handle email-less checkout (AC10 requirement)
     728        if ( empty( $email ) ) {
     729            // Use phone number as identifier for email-less subscribers
     730            $data = array(
     731                'sms_channel' => $sms_channel,
     732                'update_existing' => true,
     733            );
     734            mailchimp_debug( 'api.sms_subscribe', "SMS Subscribe (no email) :: {$sms_phone}", $data );
     735
     736            // For email-less, we use the SMS phone endpoint
     737            return $this->post( "audiences/{$list_id}/sms-subscribers", $data );
     738        }
     739
     740        // Check if we should preserve existing status (AC8 requirement)
     741        if ( $preserve_existing && ! $subscribed ) {
     742            // Check current status first
     743            $current_status = $this->getSmsStatus( $list_id, $email );
     744            if ( $current_status && isset( $current_status['marketing_consent']['status'] ) ) {
     745                if ( $current_status['marketing_consent']['status'] === 'confirmed' ) {
     746                    mailchimp_debug( 'api.sms_subscribe', "Preserving existing SMS subscription for {$email}" );
     747                    return $current_status;
     748                }
     749            }
     750        }
     751
     752        $email_subscribed = $email_status === 'subscribed' || $email_status === '1';
     753
     754        $data = array(
     755            'email_channel' => [
     756                'email' => $email,
     757                'marketing_consent' => [
     758                    'status' => $email_subscribed ? 'confirmed' : 'unknown',
     759                    'source' => 'Mailchimp for Woocommerce',
     760                ]
     761            ],
     762            'sms_channel' => $sms_channel,
     763            'update_existing' => true,
     764        );
     765
     766        mailchimp_debug( 'api.sms_subscribe', "SMS Subscribe {$email} :: {$sms_phone}", $data );
     767
     768        try {
     769            // Use the audiences contacts endpoint for SMS
     770            return $this->post( "audiences/{$list_id}/contacts", $data );
     771
     772        } catch ( MailChimp_WooCommerce_Error $e ) {
     773            // If contact already exists, try to update instead
     774            if ( mailchimp_string_contains( $e->getMessage(), 'already a list member' ) ||
     775                mailchimp_string_contains( $e->getMessage(), 'is already in the audience' ) ) {
     776                return $this->updateSmsConsent( $list_id, $email, $sms_phone, $subscribed, $preserve_existing );
     777            }
     778
     779            throw $e;
     780        }
     781    }
     782
     783    /**
     784     * Update SMS consent for an existing contact
     785     *
     786     * @param string $list_id The audience/list ID
     787     * @param string $email The contact's email address
     788     * @param string $sms_phone The SMS phone number
     789     * @param bool $subscribed Whether subscribed or not
     790     * @param bool $preserve_existing If true and not subscribing, don't change existing subscribed status
     791     * @return array|bool|mixed|object|null
     792     * @throws MailChimp_WooCommerce_Error
     793     * @throws MailChimp_WooCommerce_RateLimitError
     794     * @throws MailChimp_WooCommerce_ServerError
     795     */
     796    public function updateSmsConsent( $list_id, $email, $sms_phone, $subscribed = true, $preserve_existing = true ) {
     797        $sms_phone = $this->formatSmsPhone( $sms_phone );
     798        if ( empty( $sms_phone ) ) {
     799            throw new MailChimp_WooCommerce_Error( 'Invalid SMS phone number format' );
     800        }
     801
     802        $hash = md5( strtolower( trim( $email ) ) );
     803
     804        // Check if we should preserve existing status (AC8 requirement)
     805        if ( $preserve_existing && ! $subscribed ) {
     806            $current_status = $this->getSmsStatus( $list_id, $email );
     807            if ( $current_status && isset( $current_status['marketing_consent']['status'] ) ) {
     808                if ( $current_status['marketing_consent']['status'] === 'confirmed' ) {
     809                    mailchimp_debug( 'api.sms_update', "Preserving existing SMS subscription for {$email}" );
     810                    return $current_status;
     811                }
     812            }
     813        }
     814
     815        $sms_channel = array(
     816            'sms_phone' => $sms_phone,
     817            'marketing_consent' => array(
     818                'status' => $subscribed ? 'confirmed' : 'unsubscribed',
     819                'source' => 'Mailchimp for Woocommerce',
     820            ),
     821        );
     822
     823        $data = array(
     824            'sms_channel' => $sms_channel,
     825        );
     826
     827        mailchimp_debug( 'api.sms_update', "SMS Update {$email} :: {$sms_phone}", $data );
     828
     829        return $this->patch( "lists/{$list_id}/members/{$hash}", $data );
     830    }
     831
     832    /**
     833     * Unsubscribe a contact from SMS marketing
     834     *
     835     * @param string $list_id The audience/list ID
     836     * @param string $email The contact's email address
     837     * @return array|bool|mixed|object|null
     838     * @throws MailChimp_WooCommerce_Error
     839     * @throws MailChimp_WooCommerce_RateLimitError
     840     * @throws MailChimp_WooCommerce_ServerError
     841     */
     842    public function unsubscribeSms( $list_id, $email ) {
     843        $hash = md5( strtolower( trim( $email ) ) );
     844
     845        $data = array(
     846            'sms_channel' => array(
     847                'marketing_consent' => array(
     848                    'status' => 'unsubscribed',
     849                    'source' => 'Mailchimp for Woocommerce',
     850                ),
     851            ),
     852        );
     853
     854        mailchimp_debug( 'api.sms_unsubscribe', "SMS Unsubscribe {$email}", $data );
     855
     856        return $this->patch( "lists/{$list_id}/members/{$hash}", $data );
     857    }
     858
     859    /**
     860     * Get SMS subscription status for a contact
     861     *
     862     * @param string $list_id The audience/list ID
     863     * @param string $email The contact's email address
     864     * @return array|false SMS data or false if not subscribed
     865     * @throws MailChimp_WooCommerce_Error
     866     * @throws MailChimp_WooCommerce_RateLimitError
     867     * @throws MailChimp_WooCommerce_ServerError
     868     */
     869    public function getSmsStatus( $list_id, $email ) {
     870        try {
     871            $member = $this->member( $list_id, $email );
     872            if ( isset( $member['sms_channel'] ) ) {
     873                return $member['sms_channel'];
     874            }
     875            return false;
     876        } catch ( Exception $e ) {
     877            return false;
     878        }
     879    }
     880
     881    /**
     882     * Format phone number to E.164 format
     883     *
     884     * @param string $phone Raw phone number
     885     * @return string Formatted phone number or empty string if invalid
     886     */
     887    protected function formatSmsPhone( $phone ) {
     888        // Remove all non-digit characters except +
     889        $phone = preg_replace( '/[^\+\d]/', '', $phone );
     890
     891        // If it doesn't start with +, assume US and add +1
     892        if ( strpos( $phone, '+' ) !== 0 ) {
     893            // Remove leading 1 if present, then add +1
     894            $phone = ltrim( $phone, '1' );
     895            if ( strlen( $phone ) === 10 ) {
     896                $phone = '+1' . $phone;
     897            } else {
     898                $phone = '+' . $phone;
     899            }
     900        }
     901
     902        // Validate minimum length (E.164 requires at least 8 digits)
     903        $digits = preg_replace( '/[^\d]/', '', $phone );
     904        if ( strlen( $digits ) < 8 || strlen( $digits ) > 15 ) {
     905            return '';
     906        }
     907
     908        return $phone;
     909    }
     910
     911    /**
     912     * Check if the merchant has an approved SMS application for the given audience
     913     *
     914     * @param string $list_id The audience/list ID
     915     * @return array|false SMS application status or false if not approved
     916     * @throws MailChimp_WooCommerce_Error
     917     * @throws MailChimp_WooCommerce_RateLimitError
     918     * @throws MailChimp_WooCommerce_ServerError
     919     */
     920    public function getSmsApplicationStatus( $list_id ) {
     921        try {
     922            // Try to get SMS settings for the audience
     923            $result = $this->get( "lists/{$list_id}/sms" );
     924
     925            if ( isset( $result['sms_enabled'] ) && $result['sms_enabled'] ) {
     926                return array(
     927                    'enabled' => true,
     928                    'sending_countries' => isset( $result['sending_countries'] ) ? $result['sending_countries'] : array(),
     929                    'phone_country' => isset( $result['phone_country'] ) ? $result['phone_country'] : null,
     930                );
     931            }
     932            return false;
     933        } catch ( Exception $e ) {
     934            // If 404 or other error, SMS is not enabled
     935            mailchimp_debug( 'api.sms_status', "SMS not available for list {$list_id}: " . $e->getMessage() );
     936            return false;
     937        }
     938    }
     939
     940    /**
     941     * Get cached SMS application status (cached for 1 hour)
     942     *
     943     * @param string $list_id The audience/list ID
     944     * @return array|false SMS application status or false if not approved
     945     */
     946    public function getCachedSmsApplicationStatus( $list_id ) {
     947        $transient_key = "mailchimp_sms_status_{$list_id}";
     948        $cached = mailchimp_get_transient( $transient_key );
     949
     950        if ( $cached !== false ) {
     951            return $cached;
     952        }
     953
     954        try {
     955            $status = $this->getSmsApplicationStatus( $list_id );
     956            // Cache for 1 hour
     957            mailchimp_set_transient( $transient_key, $status !== false ? $status : 'disabled', 3600 );
     958            return $status;
     959        } catch ( Exception $e ) {
     960            return false;
     961        }
     962    }
     963
     964    /**
     965     * Check if a country is in the merchant's SMS sending countries
     966     *
     967     * @param string $list_id The audience/list ID
     968     * @param string $country_code The 2-letter country code to check
     969     * @return bool
     970     */
     971    public function isSmsSendingCountry( $list_id, $country_code ) {
     972        $sms_status = $this->getCachedSmsApplicationStatus( $list_id );
     973
     974        if ( ! $sms_status || empty( $sms_status['sending_countries'] ) ) {
     975            return false;
     976        }
     977
     978        $country_code = strtoupper( $country_code );
     979        return in_array( $country_code, $sms_status['sending_countries'], true );
     980    }
     981
     982    /**
    610983     * @param MailChimp_WooCommerce_CreateListSubmission $submission
    611984     *
     
    22372610                'url'     => $url,
    22382611                'events'  => array(
     2612                    'sms_subscribe' => true,
     2613                    'sms_unsubscribe' => true,
    22392614                    'subscribe'   => true,
    22402615                    'unsubscribe' => true,
     
    27033078        $err  = curl_error( $curl );
    27043079        $info = curl_getinfo( $curl );
    2705        
     3080
    27063081        // Capture request details before closing curl
    27073082        $url = isset($info['url']) ? $info['url'] : 'UNKNOWN';
     
    27163091
    27173092        curl_close( $curl );
    2718        
     3093
    27193094        // Initialize error info array
    27203095        if ( $err ) {
     
    27243099                'code' => 500
    27253100            );
    2726            
     3101
    27273102            // Log with enhanced logger
    27283103            if (class_exists('MailChimp_WooCommerce_Enhanced_Logger')) {
     
    27373112                );
    27383113            }
    2739            
     3114
    27403115            throw new MailChimp_WooCommerce_Error( 'CURL error :: ' . $err, 500 );
    27413116        }
     
    27533128                'code' => $http_code
    27543129            );
    2755            
     3130
    27563131            // Log with enhanced logger
    27573132            if (class_exists('MailChimp_WooCommerce_Enhanced_Logger')) {
     
    27663141                );
    27673142            }
    2768            
     3143
    27693144            throw new MailChimp_WooCommerce_RateLimitError( 'API is failing - try again.' );
    27703145        }
     
    27873162                        'response_data' => $data
    27883163                    );
    2789                    
     3164
    27903165                    if (class_exists('MailChimp_WooCommerce_Enhanced_Logger')) {
    27913166                        MailChimp_WooCommerce_Enhanced_Logger::log_connection_attempt(
     
    27993174                        );
    28003175                    }
    2801                    
     3176
    28023177                    throw $e;
    28033178                }
    28043179            }
    2805            
     3180
    28063181            // Log successful request if debug logging is enabled
    28073182            if (mailchimp_environment_variables()->logging === 'debug' && class_exists('MailChimp_WooCommerce_Enhanced_Logger')) {
     
    28163191                );
    28173192            }
    2818            
     3193
    28193194            return $data;
    28203195        }
     
    28313206                    'response_data' => $data
    28323207                );
    2833                
     3208
    28343209                // Log with enhanced logger
    28353210                if (class_exists('MailChimp_WooCommerce_Enhanced_Logger')) {
     
    28443219                    );
    28453220                }
    2846                
     3221
    28473222                throw new MailChimp_WooCommerce_RateLimitError();
    28483223            }
    28493224            $error_message  = isset( $data['title'] ) ? $data['title'] : '';
    28503225            $error_message .= isset( $data['detail'] ) ? $data['detail'] : '';
    2851            
     3226
    28523227            $error_info = array(
    28533228                'type' => 'client_error',
     
    28563231                'response_data' => $data
    28573232            );
    2858            
     3233
    28593234            // Log with enhanced logger
    28603235            if (class_exists('MailChimp_WooCommerce_Enhanced_Logger')) {
     
    28693244                );
    28703245            }
    2871            
     3246
    28723247            throw new MailChimp_WooCommerce_Error( $error_message, $error_status );
    28733248        }
     
    28753250        if ( $http_code >= 500 ) {
    28763251            $error_message = isset( $data['detail'] ) ? $data['detail'] : '';
    2877            
     3252
    28783253            $error_info = array(
    28793254                'type' => 'server_error',
     
    28823257                'response_data' => $data
    28833258            );
    2884            
     3259
    28853260            // Log with enhanced logger
    28863261            if (class_exists('MailChimp_WooCommerce_Enhanced_Logger')) {
     
    28953270                );
    28963271            }
    2897            
     3272
    28983273            throw new MailChimp_WooCommerce_ServerError( $error_message, $error_status );
    28993274        }
     
    29063281                'raw_response' => $response
    29073282            );
    2908            
     3283
    29093284            // Log with enhanced logger
    29103285            if (class_exists('MailChimp_WooCommerce_Enhanced_Logger')) {
     
    29193294                );
    29203295            }
    2921            
     3296
    29223297            mailchimp_error(
    29233298                'api.debug',
  • mailchimp-for-woocommerce/trunk/includes/api/class-mailchimp-woocommerce-tower.php

    r3234127 r3457552  
    818818        }
    819819
    820         mailchimp_debug('tower.remote_support', "trace.step_1", array(
    821             'command'       => $command,
    822             'store_id'      => $store_id,
    823             'list_id'       => $list_id,
    824             'php_version'   => phpversion(),
    825             'curl_enabled'  => function_exists( 'curl_init' ),
    826             'is_connected'  => $is_connected,
    827             'sync_complete' => mailchimp_is_done_syncing(),
    828             'rest_url'      => MailChimp_WooCommerce_Rest_Api::url( '' ),
    829         ));
     820        if (defined('MAILCHIMP_DEBUG') && MAILCHIMP_DEBUG === true) {
     821            mailchimp_debug('tower.remote_support', "trace.step_1", array(
     822                'command'       => $command,
     823                'store_id'      => $store_id,
     824                'list_id'       => $list_id,
     825                'php_version'   => phpversion(),
     826                'curl_enabled'  => function_exists( 'curl_init' ),
     827                'is_connected'  => $is_connected,
     828                'sync_complete' => mailchimp_is_done_syncing(),
     829                'rest_url'      => MailChimp_WooCommerce_Rest_Api::url( '' ),
     830            ));
     831        }
    830832
    831833        if ( $enable ) {
     
    905907                return ['success' => false, 'code' => $response['code'], 'message' => $response['message']];
    906908            }
    907             mailchimp_debug('tower.remote_support', "trace.step_3", array(
    908                 'response' => $response,
    909             ));
     909            if (defined('MAILCHIMP_DEBUG') && MAILCHIMP_DEBUG === true) {
     910                mailchimp_debug('tower.remote_support', "trace.step_3", array(
     911                    'response' => $response,
     912                ));
     913            }
    910914            return json_decode( $response['body'] );
    911915        } catch ( Throwable $e ) {
  • mailchimp-for-woocommerce/trunk/includes/class-mailchimp-woocommerce-enhanced-logger.php

    r3433839 r3457552  
    2222     */
    2323    public static function log_connection_attempt($method, $url, $curl_info = array(), $response = null, $error_info = array(), $headers = array(), $request_data = null) {
     24        if (!defined('MAILCHIMP_DEBUG') || MAILCHIMP_DEBUG !== true) return;
    2425        $log_entry = array(
    2526            'timestamp' => current_time('mysql'),
  • mailchimp-for-woocommerce/trunk/includes/class-mailchimp-woocommerce-newsletter.php

    r3141736 r3457552  
    109109
    110110            echo apply_filters( 'mailchimp_woocommerce_newsletter_field', $checkbox, $status, $label);
     111
     112            // Render SMS consent fields after newsletter checkbox
     113            $this->applySmsConsentField();
     114        }
     115    }
     116
     117    /**
     118     * Render SMS consent checkbox and phone field for classic checkout
     119     */
     120    public function applySmsConsentField()
     121    {
     122        // Check if SMS is enabled in settings
     123        if (!$this->isSmsEnabled()) {
     124            return;
     125        }
     126
     127        // Check if merchant has approved SMS application
     128        if (!$this->merchantHasSmsApproved()) {
     129            return;
     130        }
     131
     132        // Compliance: checkbox must always be unchecked by default, label and disclaimer are fixed
     133        $sms_label = __('Text me with news and offers', 'mailchimp-for-woocommerce');
     134       
     135        $audience_name = $this->getAudienceName();
     136        $prefix = !empty($audience_name) ? $audience_name . ' – ' : '';
     137        $sms_disclaimer = $prefix . __('By providing your phone number, you agree to receive promotional and marketing messages, notifications, and customer service communications. Message & data rates may apply. Consent is not a condition of purchase. Message frequency may vary. You can unsubscribe at any time by replying STOP.', 'mailchimp-for-woocommerce');
     138
     139        // Always unchecked by default per compliance
     140        $sms_status = false;
     141        $sms_phone = '';
     142        $hide_sms_for_subscriber = false;
     143
     144        // Check logged-in user's SMS subscription status
     145        if (is_user_logged_in()) {
     146            $user_sms_status = get_user_meta(get_current_user_id(), 'mailchimp_woocommerce_sms_subscribed', true);
     147            $sms_phone = get_user_meta(get_current_user_id(), 'mailchimp_woocommerce_sms_phone', true);
     148            $hide_sms_for_subscriber = $user_sms_status === true || $user_sms_status === '1';
     149
     150            if ($user_sms_status === '' || $user_sms_status === null) {
     151                $sms_status = $sms_default_checked;
     152            } else {
     153                $sms_status = (bool) $user_sms_status;
     154            }
     155        }
     156
     157        // Don't show if already subscribed to SMS
     158        if (is_checkout() && $hide_sms_for_subscriber) {
     159            return;
     160        }
     161
     162        // Build SMS consent HTML
     163        $sms_html = '<div class="mailchimp-sms-consent" style="margin-top: 15px;">';
     164       
     165        // SMS Checkbox
     166        $sms_html .= '<p class="form-row form-row-wide mailchimp-sms-checkbox">';
     167        $sms_html .= '<label for="mailchimp_woocommerce_sms_subscribe" class="woocommerce-form__label woocommerce-form__label-for-checkbox inline">';
     168        $sms_html .= '<input class="woocommerce-form__input woocommerce-form__input-checkbox input-checkbox" id="mailchimp_woocommerce_sms_subscribe" type="checkbox" name="mailchimp_woocommerce_sms_subscribe" value="1"' . ($sms_status ? ' checked="checked"' : '') . '> ';
     169        $sms_html .= '<span>' . esc_html($sms_label) . '</span></label>';
     170        $sms_html .= '</p>';
     171       
     172        // SMS Phone field (conditionally displayed via JS)
     173        $sms_html .= '<div id="mailchimp-sms-phone-wrapper" class="form-row form-row-wide" style="display: ' . ($sms_status ? 'block' : 'none') . '; margin-left: 28px;">';
     174        $sms_html .= '<label for="mailchimp_woocommerce_sms_phone">' . __('SMS Phone Number', 'mailchimp-for-woocommerce') . ' <abbr class="required" title="required">*</abbr></label>';
     175        $sms_html .= '<input type="tel" class="input-text" id="mailchimp_woocommerce_sms_phone" name="mailchimp_woocommerce_sms_phone" placeholder="+1 (555) 123-4567" value="' . esc_attr($sms_phone) . '">';
     176        $sms_html .= '<small class="mailchimp-sms-disclaimer" style="display: block; color: #666; font-size: 12px; margin-top: 8px; line-height: 1.4;">' . esc_html($sms_disclaimer) . '</small>';
     177        $sms_html .= '</div>';
     178       
     179        $sms_html .= '</div>';
     180        $sms_html .= '<div class="clear"></div>';
     181
     182        // Get SMS sending countries for JS
     183        $sms_countries = $this->getSmsSendingCountries();
     184        $sms_countries_json = !empty($sms_countries) ? json_encode($sms_countries) : '[]';
     185
     186        // JavaScript to toggle phone field visibility, validation, and country filtering
     187        $sms_html .= '<script type="text/javascript">
     188            jQuery(document).ready(function($) {
     189                var smsCheckbox = $("#mailchimp_woocommerce_sms_subscribe");
     190                var smsPhoneWrapper = $("#mailchimp-sms-phone-wrapper");
     191                var smsPhoneInput = $("#mailchimp_woocommerce_sms_phone");
     192                var smsConsentWrapper = $(".mailchimp-sms-consent");
     193                var smsSendingCountries = ' . $sms_countries_json . ';
     194               
     195                function isCountryEligible(countryCode) {
     196                    // If no countries configured, allow all
     197                    if (!smsSendingCountries || smsSendingCountries.length === 0) {
     198                        return true;
     199                    }
     200                    return smsSendingCountries.indexOf(countryCode.toUpperCase()) !== -1;
     201                }
     202               
     203                function checkBillingCountry() {
     204                    var billingCountry = $("#billing_country").val();
     205                    if (billingCountry && !isCountryEligible(billingCountry)) {
     206                        smsConsentWrapper.slideUp();
     207                        smsCheckbox.prop("checked", false);
     208                        smsPhoneInput.prop("required", false).val("");
     209                    } else {
     210                        smsConsentWrapper.slideDown();
     211                    }
     212                }
     213               
     214                function toggleSmsPhone() {
     215                    if (smsCheckbox.is(":checked")) {
     216                        smsPhoneWrapper.slideDown();
     217                        smsPhoneInput.prop("required", true);
     218                    } else {
     219                        smsPhoneWrapper.slideUp();
     220                        smsPhoneInput.prop("required", false).val("");
     221                    }
     222                }
     223               
     224                smsCheckbox.on("change", toggleSmsPhone);
     225                toggleSmsPhone();
     226               
     227                // Watch for billing country changes
     228                $("#billing_country").on("change", checkBillingCountry);
     229                $(document.body).on("updated_checkout", checkBillingCountry);
     230                checkBillingCountry();
     231               
     232                // Validation on checkout
     233                $("form.checkout").on("checkout_place_order", function() {
     234                    if (smsCheckbox.is(":checked") && !smsPhoneInput.val().trim()) {
     235                        alert("' . esc_js(__('Please enter a phone number for SMS consent.', 'mailchimp-for-woocommerce')) . '");
     236                        smsPhoneInput.focus();
     237                        return false;
     238                    }
     239                    return true;
     240                });
     241            });
     242        </script>';
     243
     244        echo apply_filters('mailchimp_woocommerce_sms_consent_field', $sms_html, $sms_status, $sms_label);
     245    }
     246
     247    /**
     248     * Check if SMS marketing is enabled
     249     *
     250     * @return bool
     251     */
     252    public function isSmsEnabled()
     253    {
     254        return (bool) $this->getOption('mailchimp_sms_enabled', false);
     255    }
     256
     257    /**
     258     * Check if merchant has an approved SMS application
     259     *
     260     * @return bool
     261     */
     262    public function merchantHasSmsApproved()
     263    {
     264        try {
     265            if (!mailchimp_is_configured()) {
     266                return false;
     267            }
     268            $list_id = mailchimp_get_list_id();
     269            if (!$list_id) {
     270                return false;
     271            }
     272            $api = mailchimp_get_api();
     273            $sms_status = $api->getCachedSmsApplicationStatus($list_id);
     274            return $sms_status && !empty($sms_status['enabled']);
     275        } catch (Exception $e) {
     276            return false;
     277        }
     278    }
     279
     280    /**
     281     * Get SMS sending countries for the merchant
     282     *
     283     * @return array
     284     */
     285    public function getSmsSendingCountries()
     286    {
     287        try {
     288            if (!mailchimp_is_configured()) {
     289                return array();
     290            }
     291            $list_id = mailchimp_get_list_id();
     292            if (!$list_id) {
     293                return array();
     294            }
     295            $api = mailchimp_get_api();
     296            $sms_status = $api->getCachedSmsApplicationStatus($list_id);
     297            if ($sms_status && !empty($sms_status['sending_countries'])) {
     298                return $sms_status['sending_countries'];
     299            }
     300            return array();
     301        } catch (Exception $e) {
     302            return array();
     303        }
     304    }
     305
     306    /**
     307     * Check if a country is eligible for SMS
     308     *
     309     * @param string $country_code 2-letter country code
     310     * @return bool
     311     */
     312    public function isCountryEligibleForSms($country_code)
     313    {
     314        $sending_countries = $this->getSmsSendingCountries();
     315        if (empty($sending_countries)) {
     316            // If no countries configured, allow all (graceful fallback)
     317            return true;
     318        }
     319        return in_array(strtoupper($country_code), $sending_countries, true);
     320    }
     321
     322    /**
     323     * Get the audience name for disclaimer
     324     *
     325     * @return string
     326     */
     327    protected function getAudienceName()
     328    {
     329        try {
     330            if (!mailchimp_is_configured()) {
     331                return '';
     332            }
     333            $list_id = mailchimp_get_list_id();
     334            if (!$list_id) {
     335                return '';
     336            }
     337            $api = mailchimp_get_api();
     338            $list = $api->getList($list_id);
     339            return isset($list['name']) ? $list['name'] : '';
     340        } catch (Exception $e) {
     341            return '';
    111342        }
    112343    }
     
    119350    {
    120351        $this->handleStatus($order_id);
     352        $this->handleSmsStatus($order_id);
    121353    }
    122354
     
    127359    {
    128360        $this->handleStatus($order->get_id());
     361        $this->handleSmsStatus($order->get_id());
    129362    }
    130363
     
    141374
    142375        $this->handleStatus();
     376        $this->handleSmsStatus();
    143377    }
    144378
     
    175409        return false;
    176410    }
     411
     412    /**
     413     * Handle SMS subscription status from classic checkout
     414     *
     415     * @param null $order_id
     416     * @return bool
     417     */
     418    protected function handleSmsStatus($order_id = null)
     419    {
     420        // Check if SMS is enabled
     421        if (!$this->isSmsEnabled()) {
     422            return false;
     423        }
     424
     425        $sms_checkbox_key = 'mailchimp_woocommerce_sms_subscribe';
     426        $sms_phone_key = 'mailchimp_woocommerce_sms_phone';
     427        $sms_subscribed_meta = 'mailchimp_woocommerce_sms_subscribed';
     428        $sms_phone_meta = 'mailchimp_woocommerce_sms_phone';
     429        $logged_in = is_user_logged_in();
     430
     431        // Get SMS consent status from POST
     432        $sms_subscribed = isset($_POST[$sms_checkbox_key]) ? (bool) $_POST[$sms_checkbox_key] : false;
     433        $sms_phone = isset($_POST[$sms_phone_key]) ? sanitize_text_field($_POST[$sms_phone_key]) : '';
     434
     435        // Sanitize phone number - keep only + and digits
     436        $sms_phone = preg_replace('/[^\+\d]/', '', $sms_phone);
     437
     438        // If they didn't check the box or didn't provide a phone, don't save anything
     439        if (!$sms_subscribed || empty($sms_phone)) {
     440            return false;
     441        }
     442
     443        // Update order meta
     444        if ($order_id) {
     445            MailChimp_WooCommerce_HPOS::update_order_meta($order_id, $sms_subscribed_meta, true);
     446            MailChimp_WooCommerce_HPOS::update_order_meta($order_id, $sms_phone_meta, $sms_phone);
     447        }
     448
     449        // Update user meta if logged in
     450        if ($logged_in) {
     451            update_user_meta(get_current_user_id(), $sms_subscribed_meta, true);
     452            update_user_meta(get_current_user_id(), $sms_phone_meta, $sms_phone);
     453        }
     454
     455        return true;
     456    }
     457
     458    /**
     459     * Get SMS subscription data from order
     460     *
     461     * @param int $order_id
     462     * @return array|false
     463     */
     464    public static function getSmsDataFromOrder($order_id)
     465    {
     466        $wc_order = wc_get_order($order_id);
     467        if (!$wc_order) {
     468            return false;
     469        }
     470
     471        $sms_subscribed = $wc_order->get_meta('mailchimp_woocommerce_sms_subscribed');
     472        $sms_phone = $wc_order->get_meta('mailchimp_woocommerce_sms_phone');
     473
     474        if (!$sms_subscribed || empty($sms_phone)) {
     475            return false;
     476        }
     477
     478        return array(
     479            'subscribed' => (bool) $sms_subscribed,
     480            'phone' => $sms_phone,
     481        );
     482    }
     483
     484    /**
     485     * Get SMS subscription data from user
     486     *
     487     * @param int $user_id
     488     * @return array|false
     489     */
     490    public static function getSmsDataFromUser($user_id)
     491    {
     492        $sms_subscribed = get_user_meta($user_id, 'mailchimp_woocommerce_sms_subscribed', true);
     493        $sms_phone = get_user_meta($user_id, 'mailchimp_woocommerce_sms_phone', true);
     494
     495        if (!$sms_subscribed || empty($sms_phone)) {
     496            return false;
     497        }
     498
     499        return array(
     500            'subscribed' => (bool) $sms_subscribed,
     501            'phone' => $sms_phone,
     502        );
     503    }
    177504}
  • mailchimp-for-woocommerce/trunk/includes/class-mailchimp-woocommerce-rest-api.php

    r3273692 r3457552  
    10261026        // this is just a safeguard against people trying to do wonky things.
    10271027        if (!in_array($key, $allowed_keys, true)) {
     1028            mailchimp_log('authorize', "invalid token type: {$key}");
    10281029            wp_send_json_error(array('message' => 'unauthorized token type'), 403);
    10291030        }
     
    10361037        // or the token doesn't equal the saved token, throw an error.
    10371038        if (empty($token) || empty($saved) || ($token !== $saved && base64_decode($token) !== $saved)) {
     1039            mailchimp_log('authorize', "unauthorized access on subscriber sync");
    10381040            wp_send_json_error(array('message' => 'unauthorized'), 403);
    10391041        }
     
    10541056        // if we don't have 2 items, that's invalid
    10551057        if (count($parts) !== 2) {
     1058            mailchimp_debug('authorize', "token invalid format", ['token_present' => !empty($token)]);
    10561059            wp_send_json_error(array('message' => 'unauthorized'), 403);
    10571060        }
     
    10621065        $api_key = $wpdb->get_row( $sql );
    10631066        if (empty($api_key)) {
     1067            mailchimp_debug('authorize', "token not found", ['token_present' => !empty($token)]);
    10641068            wp_send_json_error(array('message' => 'unauthorized'), 403);
    10651069        }
  • mailchimp-for-woocommerce/trunk/includes/class-mailchimp-woocommerce-service.php

    r3433839 r3457552  
    282282
    283283                // if they had the checkbox checked - go ahead and subscribe them if this is the first post.
    284                 //$handler->setStatus($this->cart_subscribe);
     284                $handler->setStatus($this->cart_subscribe);
    285285                $handler->prepend_to_queue = true;
    286286                mailchimp_handle_or_queue($handler);
  • mailchimp-for-woocommerce/trunk/includes/class-mailchimp-woocommerce.php

    r3355528 r3457552  
    131131
    132132        $this->activateMailChimpNewsletter();
     133        $this->activateMailchimpSmsConsent();
    133134        $this->activateMailChimpService();
    134135        $this->applyQueryStringOverrides();
     
    357358        }
    358359    }
     360
     361    private function activateMailchimpSmsConsent()
     362    {
     363        $sms_consent = MailChimp_Sms_Consent::instance();
     364
     365        if ($this->is_configured && $sms_consent->isConfigured()) {
     366            $sms_consent->setEnvironment($this->environment);
     367            $sms_consent->setVersion($this->version);
     368
     369            $render_on = $sms_consent->getOption('mailchimp_sms_consent_checkbox_action', 'woocommerce_after_checkout_billing_form');
     370            $sms_consent_allowed = MailChimp_Sms_Consent::isAllowedToUse();
     371
     372            if ($sms_consent_allowed) {
     373                $this->loader->add_action($render_on, $sms_consent, 'applyField');
     374
     375                $this->loader->add_action('woocommerce_checkout_order_processed', $sms_consent, 'processSmsConsentField', 10, 2);
     376                $this->loader->add_action('woocommerce_ppe_do_payaction', $sms_consent, 'processPayPalSmsConsentField');
     377            }
     378        }
     379    }
    359380
    360381    /**
  • mailchimp-for-woocommerce/trunk/includes/processes/class-mailchimp-woocommerce-cart-update.php

    r3355528 r3457552  
    156156            } catch (Exception $e) {
    157157
     158                // this error is for first time contacts not existing on the audience.
     159                if (mailchimp_string_contains($e->getMessage(), ['not found in audience'])) {
     160                    $list_id = mailchimp_get_list_id();
     161                    $email = $customer->getEmailAddress();
     162                    mailchimp_debug('abandoned_cart.error', "Contact {$email} was not found in audience during cart update, adding to audience and retrying.");
     163                    $subscriber = $api->update($list_id, $email, 'transactional', [], null, null);
     164                    if ($subscriber) {
     165                        // if the post is successful we're all good.
     166                        $api->addCart($store_id, $cart, false);
     167                        mailchimp_log('abandoned_cart.success', "email: {$customer->getEmailAddress()} was added to the audience during checkout");
     168                        return true;
     169                    }
     170                }
     171
    158172                mailchimp_error('abandoned_cart.error', "email: {$customer->getEmailAddress()} :: attempting product update :: {$e->getMessage()}");
    159173
     
    176190
    177191            // Maybe sync subscriber to set correct member.language
    178             // TODO this function is doing nothing except pushing the log message with no actual process
    179             mailchimp_member_data_update($this->email, $this->user_language, 'cart');
     192            // Pass subscriber status if user opted in via newsletter checkbox
     193            $subscriber_status = $this->status ? 'subscribed' : 'transactional';
     194            mailchimp_member_data_update($this->email, $this->user_language, 'cart', $subscriber_status);
    180195
    181196        } catch (MailChimp_WooCommerce_RateLimitError $e) {
  • mailchimp-for-woocommerce/trunk/includes/processes/class-mailchimp-woocommerce-single-customer.php

    r3433839 r3457552  
    8989        $customer->fromArray($data);
    9090
     91
     92        // Retrieve and set SMS consent data if user exists
     93        if ($wordpress_user_id && $user) {
     94            $sms_consent = get_user_meta($wordpress_user_id, 'mailchimp_woocommerce_sms_consent_subscribed', true);
     95            $sms_phone = get_user_meta($wordpress_user_id, 'mailchimp_woocommerce_sms_consent_phone', true);
     96
     97            if ($sms_consent && !empty($sms_phone)) {
     98                $customer->setSmsOptInStatus($sms_consent);
     99                $customer->setPhoneNumber($sms_phone);
     100            }
     101        }
    91102        // set the address from the customer lookup table
    92103        $customer->getAddress()->setCity($this->customer_data->city ?? '');
  • mailchimp-for-woocommerce/trunk/includes/processes/class-mailchimp-woocommerce-single-order.php

    r3433839 r3457552  
    2525    protected $is_amazon_order = false;
    2626    protected $is_privacy_restricted = false;
    27     /**
    28      * @var null|WC_Order|WC_Order_Refund
    29      */
    30     protected $woo_order = null;
    31 
    32     /**
    33      * MailChimp_WooCommerce_Single_Order constructor.
    34      *
    35      * @param null $id
    36      * @param null $cart_session_id
    37      * @param null $landing_site
    38      * @param null $user_language
    39      * @param null $gdpr_fields
    40      */
     27    /** @var bool */
     28    // this is going to be a flag to run different code paths without refactoring everything yet
     29    protected $using_new_audience_flow = true;
     30
     31    /**
     32     * @var null|WC_Order|WC_Order_Refund
     33     */
     34    protected $woo_order = null;
     35
     36    /**
     37     * MailChimp_WooCommerce_Single_Order constructor.
     38     *
     39     * @param null $id
     40     * @param null $cart_session_id
     41     * @param null $landing_site
     42     * @param null $user_language
     43     * @param null $gdpr_fields
     44     */
    4145    public function __construct($id = null, $cart_session_id = null, $landing_site = null, $user_language = null, $gdpr_fields = null)
    4246    {
     
    5963    }
    6064
    61     /**
    62     * @param $is_full_sync
    63     *
    64     * @return $this
    65     */
     65    /**
     66    * @param $is_full_sync
     67    *
     68    * @return $this
     69    */
    6670    public function set_full_sync($is_full_sync)
    6771    {
     
    7175    }
    7276
    73     /**
    74     * @return false
    75     * @throws MailChimp_WooCommerce_Error
    76     * @throws MailChimp_WooCommerce_RateLimitError
    77     * @throws MailChimp_WooCommerce_ServerError
    78     */
     77    /**
     78    * @return false
     79    * @throws MailChimp_WooCommerce_Error
     80    * @throws MailChimp_WooCommerce_RateLimitError
     81    * @throws MailChimp_WooCommerce_ServerError
     82    */
    7983    public function handle()
    8084    {
     
    8387    }
    8488
    85     /**
    86     * @return false
    87     * @throws MailChimp_WooCommerce_Error
    88     * @throws MailChimp_WooCommerce_RateLimitError
    89     * @throws MailChimp_WooCommerce_ServerError
    90     */
     89    /**
     90    * @return false
     91    * @throws MailChimp_WooCommerce_Error
     92    * @throws MailChimp_WooCommerce_RateLimitError
     93    * @throws MailChimp_WooCommerce_ServerError
     94    */
    9195    public function process()
    9296    {
     
    98102        $store_id = mailchimp_get_store_id();
    99103
    100         // this will set the woo_order variable or return false.
     104        // this will set the woo_order variable or return false.
    101105        if (!($woo_order_number = $this->getRealOrderNumber())) {
    102106            mailchimp_log('order_submit.failure', "There is no real order number to use for order ID {$this->id}.");
     
    105109
    106110        $order_post_type_list = apply_filters( 'mailchimp_should_push_order_post_type_list', [
    107             'shop_order'
     111            'shop_order'
    108112        ]);
    109113
     
    113117        }
    114118
    115         $wordpress_user_id = $this->woo_order->get_user_id();
    116         $user = $wordpress_user_id ? get_user_by( 'ID', $wordpress_user_id ) : false;
    117 
    118         if ( $user ) {
    119             $restricted_roles = array('administrator');
    120             $allowed_roles = array();
    121             $allowed_roles = apply_filters('mailchimp_campaign_user_roles', $allowed_roles );
    122             if ( ( count( $allowed_roles ) && count( array_intersect( $allowed_roles, $user->roles ) ) === 0 ) || ( count( array_intersect( $restricted_roles, $user->roles ) ) !== 0 ) ) {
    123                 mailchimp_log( 'order_process', "Order #{$woo_order_number} skipped, user #{$this->woo_order->get_user_id()} user role is not in the list" );
    124                 return false;
    125             }
    126         }
     119        $wordpress_user_id = $this->woo_order->get_user_id();
     120        $user = $wordpress_user_id ? get_user_by( 'ID', $wordpress_user_id ) : false;
     121
     122        if ( $user ) {
     123            $restricted_roles = array('administrator');
     124            $allowed_roles = array();
     125            $allowed_roles = apply_filters('mailchimp_campaign_user_roles', $allowed_roles );
     126            if ( ( count( $allowed_roles ) && count( array_intersect( $allowed_roles, $user->roles ) ) === 0 ) || ( count( array_intersect( $restricted_roles, $user->roles ) ) !== 0 ) ) {
     127                mailchimp_log( 'order_process', "Order #{$woo_order_number} skipped, user #{$this->woo_order->get_user_id()} user role is not in the list" );
     128                return false;
     129            }
     130        }
    127131
    128132        if ($this->is_full_sync) {
     
    164168
    165169        if (!$this->is_admin_save && $new_order && $this->is_update === true) {
    166             mailchimp_log('order_submit.filter', "Order ID {$this->id} was new, but skipping because this job was supposed to be an update.");
     170            mailchimp_log('order_submit.filter', "Order ID {$this->id} was new, but skipping because this job was supposed to be an update.");
    167171            return false;
    168172        }
     
    174178        }
    175179
    176         $email = null;
     180        $email = null;
    177181
    178182        try {
     
    188192            // all subscriber logic has now been changed
    189193
    190             $original_woo_status = $order->getOriginalWooStatus();
     194            $original_woo_status = $order->getOriginalWooStatus();
    191195
    192196            // don't allow this to happen.
     
    218222            $current_status = null;
    219223
    220             // for live traffic, if the customer was not opted in, and we should only submit subscribers: return false
     224            // for live traffic, if the customer was not opted in, and we should only submit subscribers: return false
    221225            if (!$this->is_full_sync && (!$order->getCustomer()->getOptInStatus() && mailchimp_submit_subscribed_only())) {
    222226                mailchimp_debug('filter', "#{$woo_order_number} was blocked due to subscriber only settings and current mailchimp status was {$current_status}");
     
    274278
    275279            // only do this stuff on new orders
    276             // apply the landing site if we have one.
    277             if ( $new_order && ! empty( $this->landing_site ) ) {
    278                 $log .= ' :: landing site ' . $this->landing_site;
    279                 $order->setLandingSite($this->landing_site);
    280             }
     280            // apply the landing site if we have one.
     281            if ( $new_order && ! empty( $this->landing_site ) ) {
     282                $log .= ' :: landing site ' . $this->landing_site;
     283                $order->setLandingSite($this->landing_site);
     284            }
    281285
    282286            if ($this->is_full_sync) {
     
    305309
    306310            mailchimp_debug('order_submit', " #{$woo_order_number}", $order->toArray());
     311
     312            $status_if_new = $order->getCustomer()->getOptInStatus() ? 'subscribed' : 'transactional';
     313
     314            // if we're using the new audience flow the contact needs to be created or updated first.
     315            if ($this->using_new_audience_flow && !$this->is_full_sync) {
     316                mailchimp_member_data_update($email, $this->user_language, 'order', $status_if_new, $order, $this->gdpr_fields, true);
     317                // Sync SMS consent if available
     318                $user_id = $this->woo_order ? $this->woo_order->get_user_id() : null;
     319                mailchimp_member_sms_update($email, $this->id, $user_id, 'order', $status_if_new);
     320            }
    307321
    308322            try {
     
    331345            }
    332346
    333             // log the campaign id if we have this value from the API response.
    334             if ( $new_order && $api_response instanceof MailChimp_WooCommerce_Order ) {
    335                 if (($campaign_id = $api_response->getCampaignId()) && !empty($campaign_id)) {
    336                     $log .= " :: campaign id {$campaign_id}";
    337                 }
    338             }
    339 
    340             $status_if_new = $order->getCustomer()->getOptInStatus() ? 'subscribed' : 'transactional';
     347            // log the campaign id if we have this value from the API response.
     348            if ( $new_order && $api_response instanceof MailChimp_WooCommerce_Order ) {
     349                if (($campaign_id = $api_response->getCampaignId()) && !empty($campaign_id)) {
     350                    $log .= " :: campaign id {$campaign_id}";
     351                }
     352            }
    341353
    342354            // if this is not currently in mailchimp - and we have the saved GDPR fields from
     
    347359
    348360            // Maybe sync subscriber to set correct member.language
    349             if (!$this->is_full_sync) {
     361            if (!$this->is_full_sync && !$this->using_new_audience_flow) {
    350362                mailchimp_member_data_update($email, $this->user_language, 'order', $status_if_new, $order, $this->gdpr_fields, true);
     363
     364                // Sync SMS consent if available
     365                $user_id = $this->woo_order ? $this->woo_order->get_user_id() : null;
     366                mailchimp_member_sms_update($email, $this->id, $user_id, 'order', $status_if_new);
    351367            }
    352368
     
    406422    {
    407423        try {
    408             $this->woo_order = null;
    409             $this->woo_order_number = false;
     424            $this->woo_order = null;
     425            $this->woo_order_number = false;
    410426            if (empty($this->id)) {
    411427                return false;
    412428            }
    413429            if ( !($woo = MailChimp_WooCommerce_HPOS::get_order($this->id)) ) {
    414                 mailchimp_log('order_sync.failure', "Order #{$this->id}. Can’t submit order without a valid ID");
    415                 return false;
    416             }
    417             $this->woo_order = $woo;
     430                mailchimp_log('order_sync.failure', "Order #{$this->id}. Can’t submit order without a valid ID");
     431                return false;
     432            }
     433            $this->woo_order = $woo;
    418434            return $this->woo_order_number = $this->woo_order->get_order_number();
    419435        } catch (Exception $e) {
    420             $this->woo_order = null;
     436            $this->woo_order = null;
    421437            $this->woo_order_number = false;
    422438            mailchimp_error('order_sync.failure', mailchimp_error_trace($e, "{$this->id} could not be loaded"));
     
    451467    }
    452468}
    453 
  • mailchimp-for-woocommerce/trunk/includes/processes/class-mailchimp-woocommerce-single-product-category.php

    r3255434 r3457552  
    9090                    $synced_products = $this->api()->syncProductsToCollection(mailchimp_get_store_id(), $category->getId(), $product_ids);
    9191
     92                    $failed_product_ids = $synced_products['failed_product_ids'] ?? [];
     93
    9294                    mailchimp_debug('product_category.products_sync', "Synced products to category #{$this->id}", [
    9395                        'products' => $synced_products['products'],
    94                         'failed_product_ids' => $synced_products['failed_product_ids']
     96                        'failed_product_ids' => $failed_product_ids
    9597                    ]);
    9698
    97                     if (count($synced_products['failed_product_ids']) > 0) {
     99                    if (count($failed_product_ids) > 0) {
    98100                        if ($this->handle_failed_products) {
    99                             $this->handleFailedProductsSync($synced_products['failed_product_ids']);
     101                            $this->handleFailedProductsSync($failed_product_ids);
    100102                        } else {
    101103                            mailchimp_debug('product_category.products_sync', 'Failed to resync products', [
    102                                 'failed_product_ids' => $synced_products['failed_product_ids']
     104                                'failed_product_ids' => $failed_product_ids
    103105                            ]);
    104106                        }
  • mailchimp-for-woocommerce/trunk/includes/processes/class-mailchimp-woocommerce-subscriber-sync.php

    r3141736 r3457552  
    2323    public function handle()
    2424    {
    25         mailchimp_debug('subscriber_sync', "tracing mailchimp post", array('data' => $this->data));
     25        if (defined('MAILCHIMP_DEBUG') && MAILCHIMP_DEBUG === true) {
     26            mailchimp_debug('subscriber_sync', "tracing mailchimp post", array('data' => $this->data));
     27        }
    2628
    2729        try {
     
    5052                return false;
    5153            }
     54
     55            // Check if this is an SMS event
     56            $is_sms_event = in_array($hook_type, array('sms_subscribe', 'sms_unsubscribe'));
     57
     58            if ($is_sms_event) {
     59                if (empty($email) && array_key_exists('merges', $data) && array_key_exists('EMAIL', $data['merges'])) {
     60                    $email = $data['merges']['EMAIL'];
     61                }
     62                // Handle SMS subscription events
     63                return $this->handleSmsEvent($hook_type, $data, $email);
     64            }
     65
    5266            // if hook type is 'subscribe' that means we need ot subscribe them
    5367            $subscribe = $hook_type === 'subscribe';
     
    128142        $data = isset($this->data['data']) ? $this->data['data'] : [];
    129143        $failed = false;
    130         $allowed_hooks = array('subscribe' => true, 'unsubscribe' => true,);
     144        // Include SMS webhook types
     145        $allowed_hooks = array(
     146            'subscribe' => true,
     147            'unsubscribe' => true,
     148            'sms_subscribe' => true,
     149            'sms_unsubscribe' => true,
     150        );
     151
    131152        if (!is_string($hook_type) || !isset($allowed_hooks[$hook_type])) {
    132153            $failed = true;
     
    143164     * @throws MailChimp_WooCommerce_ServerError
    144165     */
    145     private function createNewCustomer($email)
     166    private function createNewCustomer($email, $sms = null)
    146167    {
    147168        $member = mailchimp_get_api()->member(mailchimp_get_list_id(), $email);
    148169        $first_name = !empty($member['merge_fields']['FNAME']) ? $member['merge_fields']['FNAME'] : 'Guest';
    149170        $last_name = !empty($member['merge_fields']['LNAME']) ? $member['merge_fields']['LNAME'] : 'Customer';
     171        $sms_phone = !empty($member['merge_fields']['SMSPHONE']) ? $member['merge_fields']['SMSPHONE'] : null;
    150172        if (empty($first_name)) $first_name = null;
    151173        if (empty($last_name)) $last_name = null;
    152         // TODO maybe use the registration method and keep a record for when the user is verified later
     174
    153175        $user = wp_create_user(strtolower($email), wp_generate_password(), strtolower($email));
    154176        // subscribe them because this function only runs for subscribers.
     
    162184            ));
    163185        }
     186        if (empty($sms) && !empty($sms_phone)) {
     187            $sms = $sms_phone;
     188        }
     189        if (!empty($sms)) {
     190            // Update user meta for SMS subscription status
     191            update_user_meta($user, 'mailchimp_woocommerce_sms_consent_subscribed', '1');
     192            update_user_meta($user, 'mailchimp_woocommerce_sms_consent_phone', $sms);
     193            mailchimp_log('webhook', "CREATED CUSTOMER with SMS and email :: {$email} :: {$sms} :: {$first_name} {$last_name}");
     194            return $user;
     195        }
    164196        mailchimp_log('webhook', "CREATED CUSTOMER :: {$email} :: {$first_name} {$last_name}");
    165197        return $user;
     
    203235        return false;
    204236    }
     237
     238    /**
     239     * Handle SMS subscribe/unsubscribe webhook events from Mailchimp
     240     *
     241     * @param string $hook_type The webhook event type (sms_subscribe or sms_unsubscribe)
     242     * @param array $data The webhook payload data
     243     * @param string $email The contact's email address
     244     * @return bool
     245     */
     246    private function handleSmsEvent($hook_type, $data, $email)
     247    {
     248        $sms_subscribe = $hook_type === 'sms_subscribe';
     249
     250        // Extract SMS phone number from webhook data
     251        $sms_phone = '';
     252        if (isset($data['sms_phone_number'])) {
     253            $sms_phone = $data['sms_phone_number'];
     254        } elseif (isset($data['sms_channel']['sms_phone'])) {
     255            $sms_phone = $data['sms_channel']['sms_phone'];
     256        }
     257
     258        // Try to find the user by email
     259        $user = get_user_by('email', $email);
     260
     261        if (!$user) {
     262            // if we don't have a user by email
     263            $user = $sms_subscribe && $this->shouldCreateNewCustomers() && $this->createNewCustomer($email, $sms_phone);
     264            if ($user) return true;
     265            mailchimp_log('webhook.sms', "SMS event for non-existent user :: {$hook_type} :: {$email}");
     266            return false;
     267        }
     268
     269        try {
     270            $hashed = md5(trim(strtolower($email)));
     271            $handled_key = "sms_subscriber_sync.{$hashed}.handled";
     272
     273            // Check if we've already handled this recently
     274            $handled = mailchimp_get_transient($handled_key);
     275            if ($handled === $sms_subscribe) {
     276                mailchimp_log('webhook.sms', "SMS sync already handled for {$email}");
     277                return true;
     278            }
     279
     280            // Update user meta for SMS subscription status
     281            update_user_meta($user->ID, 'mailchimp_woocommerce_sms_consent_subscribed', $sms_subscribe);
     282
     283            // If subscribing and we have a phone number, store it
     284            if ($sms_subscribe && !empty($sms_phone)) {
     285                update_user_meta($user->ID, 'mailchimp_woocommerce_sms_consent_phone', $sms_phone);
     286            }
     287
     288            // If unsubscribing, we keep the phone number but update the status
     289            if (!$sms_subscribe) {
     290                // Cache the unsubscribe to prevent re-subscription issues
     291                mailchimp_set_transient("{$hashed}.sms_subscriber_sync", array(
     292                    'time' => time(),
     293                    'status' => false
     294                ), 90);
     295            }
     296
     297            // Cache the handled status
     298            mailchimp_set_transient($handled_key, $sms_subscribe, 90);
     299
     300            mailchimp_log('webhook.sms', "SMS Subscriber Sync :: {$hook_type} :: {$email}", array(
     301                'sms_subscribed' => $sms_subscribe,
     302                'sms_phone' => $sms_phone,
     303                'user_id' => $user->ID,
     304            ));
     305
     306            return true;
     307        } catch (Exception $e) {
     308            mailchimp_error('webhook.sms', "SMS Subscriber Sync Error :: {$hook_type} :: {$email} :: " . $e->getMessage());
     309            return false;
     310        }
     311    }
    205312}
  • mailchimp-for-woocommerce/trunk/includes/processes/class-mailchimp-woocommerce-webhooks-sync.php

    r3025229 r3457552  
    7777                if ($href && mailchimp_string_contains($href, $rest_url)) {
    7878                    if (!$disconnect && !empty($token) && mailchimp_string_contains($href, $token)) {
    79                         $this->skip_creation = true;
    80                         mailchimp_log('webhooks', "Verified webhook {$hook['id']}");
    81                         continue;
     79                        if (array_key_exists('sms_subscribe', $hook['events']) && $hook['events']['sms_subscribe']) {
     80                            $this->skip_creation = true;
     81                            mailchimp_log('webhooks', "Verified webhook {$hook['id']}");
     82                            continue;
     83                        }
    8284                    }
    8385                    $api->deleteWebhookByID($list, $hook['id']);
  • mailchimp-for-woocommerce/trunk/languages/mc-woocommerce-newsletter.pot

    r3355528 r3457552  
    1 # Copyright (C) 2025
     1# Copyright (C) 2026
    22# This file is distributed under the same license as the  package.
    33msgid ""
     
    55"Project-Id-Version: \n"
    66"Report-Msgid-Bugs-To: https://wordpress.org/support/plugin/blocks\n"
    7 "POT-Creation-Date: 2025-08-20 08:03:29+00:00\n"
     7"POT-Creation-Date: 2026-02-06 15:19:09+00:00\n"
    88"MIME-Version: 1.0\n"
    99"Content-Type: text/plain; charset=utf-8\n"
    1010"Content-Transfer-Encoding: 8bit\n"
    11 "PO-Revision-Date: 2025-MO-DA HO:MI+ZONE\n"
     11"PO-Revision-Date: 2026-MO-DA HO:MI+ZONE\n"
    1212"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
    1313"Language-Team: LANGUAGE <LL@li.org>\n"
     
    2727
    2828#: woocommerce-blocks-integration.php:144
     29#: woocommerce-sms-blocks-integration.php:140
    2930msgid "Checked by default"
    3031msgstr ""
    3132
    3233#: woocommerce-blocks-integration.php:145
     34#: woocommerce-sms-blocks-integration.php:141
    3335msgid "Unchecked by default"
    3436msgstr ""
     
    3739msgid "Please select all the ways you would like to hear from us"
    3840msgstr ""
     41
     42#: woocommerce-sms-blocks-integration.php:130
     43msgid "Text me with news and offers"
     44msgstr ""
     45
     46#: woocommerce-sms-blocks-integration.php:355
     47msgid ""
     48"By providing your phone number, you agree to receive promotional and "
     49"marketing messages, notifications, and customer service communications. "
     50"Message & data rates may apply. Consent is not a condition of purchase. "
     51"Message frequency may vary. You can unsubscribe at any time by replying "
     52"STOP."
     53msgstr ""
  • mailchimp-for-woocommerce/trunk/mailchimp-woocommerce.php

    r3433839 r3457552  
    1717 * Plugin URI:        https://mailchimp.com/connect-your-store/
    1818 * Description:       Connects WooCommerce to Mailchimp to sync your store data, send targeted campaigns to your customers, and sell more stuff.
    19  * Version:           5.7
     19 * Version:           6.0
    2020 * Author:            Mailchimp
    2121 * Author URI:        https://mailchimp.com
     
    4848// make this a one liner for testing and code separation
    4949include_once __DIR__ . '/blocks/newsletter.php';
     50// SMS consent block for checkout
     51include_once __DIR__ . '/blocks/sms.php';
    5052
    5153add_action( 'before_woocommerce_init', function() {
  • mailchimp-for-woocommerce/trunk/public/class-mailchimp-woocommerce-public.php

    r3209992 r3457552  
    6666     */
    6767    public function enqueue_scripts() {
    68         wp_register_script($this->plugin_name, plugin_dir_url( __FILE__ ) . 'js/mailchimp-woocommerce-public.min.js', array(), $this->version.'.07');
    69         wp_localize_script($this->plugin_name, 'mailchimp_public_data', array(
    70             'site_url' => site_url(),
    71             'ajax_url' => admin_url('admin-ajax.php'),
    72             'disable_carts' => mailchimp_carts_disabled(),
    73             'subscribers_only' => mailchimp_carts_subscribers_only(),
    74             'language' => substr( get_locale(), 0, 2 ),
     68        $public_data = array(
     69            'site_url' => site_url(),
     70            'ajax_url' => admin_url('admin-ajax.php'),
     71            'disable_carts' => mailchimp_carts_disabled(),
     72            'subscribers_only' => mailchimp_carts_subscribers_only(),
     73            'language' => substr( get_locale(), 0, 2 ),
    7574            'allowed_to_set_cookies' => mailchimp_allowed_to_use_cookie('mailchimp_user_email'),
    76         ));
     75            'sms_allowed_countries' => MailChimp_Sms_Consent::$allowedCountries
     76        );
     77        wp_register_script($this->plugin_name, plugin_dir_url( __FILE__ ) . 'js/mailchimp-woocommerce-public.min.js', array(), $this->version.'.08');
     78        wp_localize_script($this->plugin_name, 'mailchimp_public_data', $public_data);
    7779
    7880        // Enqueued script with localized data.
    7981        wp_enqueue_script($this->plugin_name, '', array(), $this->version, true);
     82
     83        $sms_consent_allowed = MailChimp_Sms_Consent::isAllowedToUse();
     84
     85        if ($sms_consent_allowed) {
     86            wp_register_script($this->plugin_name . '_sms_consent', plugin_dir_url( __FILE__ ) . 'js/mailchimp-woocommerce-sms-consent.min.js', array(), $this->version. '.07');
     87            wp_localize_script($this->plugin_name . '_sms_consent', 'mailchimp_public_data', $public_data);
     88            wp_enqueue_script($this->plugin_name . '_sms_consent', '', array('jquery'), $this->version, true);
     89        }
    8090
    8191        // if we have the "fragment" we can just inject this vs. loading the file
  • mailchimp-for-woocommerce/trunk/public/js/mailchimp-woocommerce-public.js

    r3355528 r3457552  
    202202        var blockSubscribed = document.querySelector("#subscribe-to-newsletter");
    203203
     204
    204205        if (subscribed) {
    205206            subscribed.onchange = function() {
     
    213214            }
    214215        }
     216
    215217
    216218        mailchimp_username_email = document.querySelector("#username");
  • mailchimp-for-woocommerce/trunk/public/js/mailchimp-woocommerce-public.min.js

    r3209992 r3457552  
    1 var mailchimp,mailchimp_cart,mailchimp_billing_email,mailchimp_username_email,mailchimp_registration_email,mailchimp_submitted_email=!1,mailchimpReady=function(e){/in/.test(document.readyState)?setTimeout(() => {mailchimpReady(e)},9):e()};function mailchimpGetCurrentUserByHash(e){try{if(!mailchimp_public_data.allowed_to_set_cookies)return;var i=mailchimp_public_data.ajax_url+"?action=mailchimp_get_user_by_hash&hash="+e,a=new XMLHttpRequest;a.open("POST",i,!0),a.onload=function(){if(a.status>=200&&a.status<400){var e=JSON.parse(a.responseText);e&&mailchimp_cart.valueEmail(e.email)&&mailchimp_cart.setEmail(e.email)}},a.onerror=function(){console.log("mailchimp.get_email_by_hash.request.error",a.responseText)},a.setRequestHeader("Content-Type","application/json"),a.setRequestHeader("Accept","application/json"),a.send()}catch(t){console.log("mailchimp.get_email_by_hash.error",t)}}function mailchimpHandleBillingEmail(e){try{if(!mailchimp_public_data.allowed_to_set_cookies||mailchimp_public_data.disable_carts)return;var i=document.querySelector("#mailchimp_woocommerce_newsletter");i||(i=document.querySelector("#subscribe-to-newsletter")),e||(e="#billing_email");var a=document.querySelector(e),t=void 0!==a?a.value:"";if(!mailchimp_cart.valueEmail(t)||mailchimp_submitted_email===t)return!1;mailchimp_cart.setEmail(t),console.log(t),console.log(mailchimp_cart);var l=mailchimp_public_data.ajax_url+"?action=mailchimp_set_user_by_email",r=new XMLHttpRequest;return r.open("POST",l,!0),r.onload=function(){console.log(r);var e=r.status>=200&&r.status<400;e&&(mailchimp_submitted_email=t),console.log(e?"mailchimp.handle_billing_email.request.success":"mailchimp.handle_billing_email.request.error",r.responseText)},r.onerror=function(){console.log("mailchimp.handle_billing_email.request.error",r.responseText)},r.setRequestHeader("Content-Type","application/x-www-form-urlencoded"),r.setRequestHeader("Accept","application/json"),r.send("email="+t+"&mc_language="+mailchimp_public_data.language+"&subscribed="+(i&&i.checked?"1":"0")),!0}catch(n){console.log("mailchimp.handle_billing_email.error",n),mailchimp_submitted_email=!1}}!function(){"use strict";var e,i,a,t;mailchimp={storage:(e=document,(a=function(e,i,t){return 1===arguments.length?a.get(e):a.set(e,i,t)}).get=function(i,t){return e.cookie!==a._cacheString&&a._populateCache(),void 0==a._cache[i]?t:a._cache[i]},a.defaults={path:"/",secure:!0,samesite:"strict"},a.set=function(t,l,r){switch(r={path:r&&r.path||a.defaults.path,domain:r&&r.domain||a.defaults.domain,expires:r&&r.expires||a.defaults.expires,secure:r&&r.secure!==i?r.secure:a.defaults.secure,samesite:r&&r.samesite||a.defaults.samesite},l===i&&(r.expires=-1),typeof r.expires){case"number":r.expires=new Date((new Date).getTime()+1e3*r.expires);break;case"string":r.expires=new Date(r.expires)}return t=encodeURIComponent(t)+"="+(l+"").replace(/[^!#-+\--:<-\[\]-~]/g,encodeURIComponent),t+=r.path?";path="+r.path:"",t+=r.domain?";domain="+r.domain:"",t+=r.expires?";expires="+r.expires.toGMTString():"",t+=r.secure?";secure":"",t+=r.samesite?";samesite="+r.samesite:"",e.cookie=t,a},a.expire=function(e,t){return a.set(e,i,t)},a._populateCache=function(){a._cache={};try{a._cacheString=e.cookie;for(var t=a._cacheString.split("; "),l=0;l<t.length;l++){var r=t[l].indexOf("="),n=decodeURIComponent(t[l].substr(0,r)),r=decodeURIComponent(t[l].substr(r+1));a._cache[n]===i&&(a._cache[n]=r)}}catch(m){console.log(m)}},a.enabled=(t="1"===a.set("cookies.js","1").get("cookies.js"),a.expire("cookies.js"),t),a),utils:{extend:function(e,i){for(var a in i||{})i.hasOwnProperty(a)&&(e[a]=i[a]);return e},getQueryStringVars:function(){var e=window.location.search||"",i=[],a={};if((e=e.substr(1)).length)for(var t in i=e.split("&")){var l=i[t];if("string"==typeof l){var r=l.split("="),n=r[0],m=r[1];n.length&&(void 0===a[n]&&(a[n]=[]),a[n].push(m))}}return a},unEscape:function(e){return decodeURIComponent(e)},escape:function(e){return encodeURIComponent(e)},createDate:function(e,i){e||(e=0);var a=new Date,t=i?a.getDate()-e:a.getDate()+e;return a.setDate(t),a},arrayUnique:function(e){for(var i=e.concat(),a=0;a<i.length;++a)for(var t=a+1;t<i.length;++t)i[a]===i[t]&&i.splice(t,1);return i},objectCombineUnique:function(e){for(var i=e[0],a=1;a<e.length;a++){var t=e[a];for(var l in t)i[l]=t[l]}return i}}},mailchimp_cart=new function e(){return this.email_types="input[type=email]",this.regex_email=/^([A-Za-z0-9_+\-\.])+\@([A-Za-z0-9_\-\.])+\.([A-Za-z]{2,4})$/,this.current_email=null,this.previous_email=null,this.expireUser=function(){this.current_email=null,mailchimp_public_data.allowed_to_set_cookies&&mailchimp.storage.expire("mailchimp.cart.current_email")},this.expireSaved=function(){mailchimp_public_data.allowed_to_set_cookies&&mailchimp.storage.expire("mailchimp.cart.items")},this.setEmail=function(e){if(mailchimp_public_data.allowed_to_set_cookies){if(!this.valueEmail(e))return!1;this.setPreviousEmail(this.getEmail()),mailchimp.storage.set("mailchimp.cart.current_email",this.current_email=e)}},this.getEmail=function(){if(mailchimp_public_data.allowed_to_set_cookies){if(this.current_email)return this.current_email;var e=mailchimp.storage.get("mailchimp.cart.current_email",!1);return!!(e&&this.valueEmail(e))&&(this.current_email=e)}},this.setPreviousEmail=function(e){if(mailchimp_public_data.allowed_to_set_cookies){if(!this.valueEmail(e))return!1;mailchimp.storage.set("mailchimp.cart.previous_email",this.previous_email=e)}},this.valueEmail=function(e){return this.regex_email.test(e)},this}}(),mailchimpReady(function(){if(console.log("mailchimp ready"),mailchimp_public_data.allowed_to_set_cookies&&!mailchimp_public_data.disable_carts){if(void 0===e)var e={site_url:document.location.origin,defaulted:!0,ajax_url:document.location.origin+"/wp-admin?admin-ajax.php"};try{var i,a=mailchimp.utils.getQueryStringVars();void 0!==a.mc_cart_id&&mailchimpGetCurrentUserByHash(a.mc_cart_id);var t=document.querySelector("#mailchimp_woocommerce_newsletter"),l=document.querySelector("#subscribe-to-newsletter");t?t.onchange=function(){mailchimp_submitted_email=null,mailchimpHandleBillingEmail("#billing_email")}:l&&(l.onchange=function(){mailchimp_submitted_email=null,mailchimpHandleBillingEmail('#contact-fields input[type="email"]')}),mailchimp_username_email=document.querySelector("#username"),mailchimp_billing_email=document.querySelector("#billing_email"),mailchimp_registration_email=document.querySelector("#reg_email");var r=document.querySelector('#contact-fields input[type="email"]');mailchimp_billing_email&&(mailchimp_billing_email.onblur=function(){mailchimpHandleBillingEmail("#billing_email")},mailchimp_billing_email.onfocus=function(){mailchimpHandleBillingEmail("#billing_email")}),mailchimp_username_email&&(mailchimp_username_email.onblur=function(){mailchimpHandleBillingEmail("#username")},mailchimp_username_email.onfocus=function(){mailchimpHandleBillingEmail("#username")}),mailchimp_registration_email&&(mailchimp_registration_email.onblur=function(){mailchimpHandleBillingEmail("#reg_email")},mailchimp_registration_email.onfocus=function(){mailchimpHandleBillingEmail("#reg_email")}),r&&(r.onblur=function(){mailchimpHandleBillingEmail('#contact-fields input[type="email"]')},r.onfocus=function(){mailchimpHandleBillingEmail('#contact-fields input[type="email"]')},r.addEventListener("keyup",function(){i&&clearTimeout(i),i=setTimeout(function(){mailchimp_cart.valueEmail(r.value)&&mailchimpHandleBillingEmail('#contact-fields input[type="email"]')},2e3)}),r.addEventListener("keydown",function(){i&&clearTimeout(i)}))}catch(n){console.log("mailchimp ready error",n)}}});
     1var mailchimp,mailchimp_cart,mailchimp_billing_email,mailchimp_username_email,mailchimp_registration_email,mailchimp_submitted_email=false,mailchimpReady=function(a){/in/.test(document.readyState)?setTimeout(()=>{mailchimpReady(a)},9):a()};function mailchimpGetCurrentUserByHash(a){try{if(!mailchimp_public_data.allowed_to_set_cookies)return;var b=mailchimp_public_data.ajax_url+"?action=mailchimp_get_user_by_hash&hash="+a,c=new XMLHttpRequest;c.open("POST",b,!0),c.onload=function(){if(c.status>=200&&c.status<400){var a=JSON.parse(c.responseText);if(!a)return;mailchimp_cart.valueEmail(a.email)&&mailchimp_cart.setEmail(a.email)}};c.onerror=function(){console.log("mailchimp.get_email_by_hash.request.error",c.responseText)};c.setRequestHeader("Content-Type","application/json");c.setRequestHeader("Accept","application/json");c.send()}catch(a){console.log("mailchimp.get_email_by_hash.error",a)}}function mailchimpHandleBillingEmail(selector){try{if(!mailchimp_public_data.allowed_to_set_cookies)return;if(mailchimp_public_data.disable_carts)return;var subscribed=document.querySelector("#mailchimp_woocommerce_newsletter");if(!subscribed)subscribed=document.querySelector("#subscribe-to-newsletter");if(!selector)selector="#billing_email";var a=document.querySelector(selector);var b=void 0!==a?a.value:"";if(!mailchimp_cart.valueEmail(b)||mailchimp_submitted_email===b){return false}mailchimp_cart.setEmail(b);var c=mailchimp_public_data.ajax_url+"?action=mailchimp_set_user_by_email";var d=new XMLHttpRequest;d.open("POST",c,!0);d.onload=function(){var successful=d.status>=200&&d.status<400;var msg=successful?"mailchimp.handle_billing_email.request.success":"mailchimp.handle_billing_email.request.error";if(successful){mailchimp_submitted_email=b}console.log(msg,d.responseText)};d.onerror=function(){console.log("mailchimp.handle_billing_email.request.error",d.responseText)};d.setRequestHeader("Content-Type","application/x-www-form-urlencoded");d.setRequestHeader("Accept","application/json");d.send("email="+b+"&mc_language="+mailchimp_public_data.language+"&subscribed="+(subscribed&&subscribed.checked?"1":"0"));return true}catch(a){console.log("mailchimp.handle_billing_email.error",a);mailchimp_submitted_email=!1}}!function(){"use strict";function mailchimpCart(){this.email_types="input[type=email]";this.regex_email=/^([A-Za-z0-9_+\-\.])+\@([A-Za-z0-9_\-\.])+\.([A-Za-z]{2,4})$/;this.current_email=null;this.previous_email=null;this.expireUser=function(){this.current_email=null;if(!mailchimp_public_data.allowed_to_set_cookies)return;mailchimp.storage.expire("mailchimp.cart.current_email")};this.expireSaved=function(){if(!mailchimp_public_data.allowed_to_set_cookies)return;mailchimp.storage.expire("mailchimp.cart.items")};this.setEmail=function(a){if(!mailchimp_public_data.allowed_to_set_cookies)return;if(!this.valueEmail(a))return false;this.setPreviousEmail(this.getEmail());mailchimp.storage.set("mailchimp.cart.current_email",this.current_email=a)};this.getEmail=function(){if(!mailchimp_public_data.allowed_to_set_cookies)return;if(this.current_email)return this.current_email;var a=mailchimp.storage.get("mailchimp.cart.current_email",!1);if(!a||!this.valueEmail(a))return false;return this.current_email=a};this.setPreviousEmail=function(a){if(!mailchimp_public_data.allowed_to_set_cookies)return;if(!this.valueEmail(a))return false;mailchimp.storage.set("mailchimp.cart.previous_email",this.previous_email=a)};this.valueEmail=function(a){return this.regex_email.test(a)};return this}var g={extend:function(a,b){for(var c in b||{})b.hasOwnProperty(c)&&(a[c]=b[c]);return a},getQueryStringVars:function(){var a=window.location.search||"",b=[],c={};if(a=a.substr(1),a.length){b=a.split("&");for(var d in b){var e=b[d];if("string"==typeof e){var f=e.split("="),g=f[0],h=f[1];g.length&&("undefined"==typeof c[g]&&(c[g]=[]),c[g].push(h))}}}return c},unEscape:function(a){return decodeURIComponent(a)},escape:function(a){return encodeURIComponent(a)},createDate:function(a,b){a||(a=0);var c=new Date,d=b?c.getDate()-a:c.getDate()+a;return c.setDate(d),c},arrayUnique:function(a){for(var b=a.concat(),c=0;c<b.length;++c)for(var d=c+1;d<b.length;++d)b[c]===b[d]&&b.splice(d,1);return b},objectCombineUnique:function(a){for(var b=a[0],c=1;c<a.length;c++){var d=a[c];for(var e in d)b[e]=d[e]}return b}},h=function(a,b){var c=function(a,b,d){return 1===arguments.length?c.get(a):c.set(a,b,d)};return c.get=function(b,d){return a.cookie!==c._cacheString&&c._populateCache(),void 0==c._cache[b]?d:c._cache[b]},c.defaults={path:"/",secure:true,samesite:"strict"},c.set=function(d,e,f){switch(f={path:f&&f.path||c.defaults.path,domain:f&&f.domain||c.defaults.domain,expires:f&&f.expires||c.defaults.expires,secure:f&&f.secure!==b?f.secure:c.defaults.secure,samesite:f&&f.samesite||c.defaults.samesite},e===b&&(f.expires=-1),typeof f.expires){case"number":f.expires=new Date((new Date).getTime()+1e3*f.expires);break;case"string":f.expires=new Date(f.expires)}return d=encodeURIComponent(d)+"="+(e+"").replace(/[^!#-+\--:<-\[\]-~]/g,encodeURIComponent),d+=f.path?";path="+f.path:"",d+=f.domain?";domain="+f.domain:"",d+=f.expires?";expires="+f.expires.toGMTString():"",d+=f.secure?";secure":"",d+=f.samesite?";samesite="+f.samesite:"",a.cookie=d,c},c.expire=function(a,d){return c.set(a,b,d)},c._populateCache=function(){c._cache={};try{c._cacheString=a.cookie;for(var d=c._cacheString.split("; "),e=0;e<d.length;e++){var f=d[e].indexOf("="),g=decodeURIComponent(d[e].substr(0,f)),f=decodeURIComponent(d[e].substr(f+1));c._cache[g]===b&&(c._cache[g]=f)}}catch(a){console.log(a)}},c.enabled=function(){var a="1"===c.set("cookies.js","1").get("cookies.js");return c.expire("cookies.js"),a}(),c}(document);mailchimp={storage:h,utils:g};mailchimp_cart=new mailchimpCart}();mailchimpReady(function(){if(!mailchimp_public_data.allowed_to_set_cookies)return;if(mailchimp_public_data.disable_carts)return;if(void 0===a){var a={site_url:document.location.origin,defaulted:!0,ajax_url:document.location.origin+"/wp-admin?admin-ajax.php"}}try{var b=mailchimp.utils.getQueryStringVars();void 0!==b.mc_cart_id&&mailchimpGetCurrentUserByHash(b.mc_cart_id);var subscribed=document.querySelector("#mailchimp_woocommerce_newsletter");var blockSubscribed=document.querySelector("#subscribe-to-newsletter");if(subscribed){subscribed.onchange=function(){mailchimp_submitted_email=null;mailchimpHandleBillingEmail("#billing_email")}}else if(blockSubscribed){blockSubscribed.onchange=function(){mailchimp_submitted_email=null;mailchimpHandleBillingEmail('#contact-fields input[type="email"]')}}mailchimp_username_email=document.querySelector("#username");mailchimp_billing_email=document.querySelector("#billing_email");mailchimp_registration_email=document.querySelector("#reg_email");var mailchimp_username_email_block=document.querySelector('#contact-fields input[type="email"]');if(mailchimp_billing_email){mailchimp_billing_email.onblur=function(){mailchimpHandleBillingEmail("#billing_email")};mailchimp_billing_email.onfocus=function(){mailchimpHandleBillingEmail("#billing_email")}}if(mailchimp_username_email){mailchimp_username_email.onblur=function(){mailchimpHandleBillingEmail("#username")};mailchimp_username_email.onfocus=function(){mailchimpHandleBillingEmail("#username")}}if(mailchimp_registration_email){mailchimp_registration_email.onblur=function(){mailchimpHandleBillingEmail("#reg_email")};mailchimp_registration_email.onfocus=function(){mailchimpHandleBillingEmail("#reg_email")}}if(mailchimp_username_email_block){mailchimp_username_email_block.onblur=function(){mailchimpHandleBillingEmail('#contact-fields input[type="email"]')};mailchimp_username_email_block.onfocus=function(){mailchimpHandleBillingEmail('#contact-fields input[type="email"]')};var typingTimer;mailchimp_username_email_block.addEventListener("keyup",function(){typingTimer&&clearTimeout(typingTimer);typingTimer=setTimeout(function(){if(mailchimp_cart.valueEmail(mailchimp_username_email_block.value)){mailchimpHandleBillingEmail('#contact-fields input[type="email"]')}},2e3)});mailchimp_username_email_block.addEventListener("keydown",function(){typingTimer&&clearTimeout(typingTimer)})}}catch(e){console.log("mailchimp ready error",e)}});
Note: See TracChangeset for help on using the changeset viewer.