Changeset 3468312
- Timestamp:
- 02/24/2026 07:13:55 AM (5 weeks ago)
- Location:
- woocommerce-google-adwords-conversion-tracking-tag/trunk
- Files:
-
- 16 added
- 8 deleted
- 28 edited
-
class-wgact.php (modified) (5 diffs)
-
css/admin.css (modified) (4 diffs)
-
freemius-loader.php (modified) (1 diff)
-
includes/admin/class-admin-rest.php (modified) (2 diffs)
-
includes/admin/class-admin.php (modified) (7 diffs)
-
includes/admin/class-ask-for-rating.php (modified) (3 diffs)
-
includes/admin/class-environment.php (modified) (1 diff)
-
includes/admin/class-validations.php (modified) (1 diff)
-
includes/admin/notifications/class-notifications.php (modified) (4 diffs)
-
includes/admin/notifications/class-ssp-quota-exceeded-notification.php (added)
-
includes/admin/notifications/class-trial-promotion-notification.php (modified) (1 diff)
-
includes/admin/opportunities/class-opportunities.php (modified) (5 diffs)
-
includes/admin/opportunities/free/class-gadwc-opportunity.php (added)
-
includes/admin/opportunities/free/class-gcr-opportunity.php (added)
-
includes/class-abilities.php (added)
-
includes/class-options.php (modified) (3 diffs)
-
includes/pixels/class-pixel-manager.php (modified) (6 diffs)
-
includes/pixels/google/class-gtg-config.php (modified) (1 diff)
-
includes/pixels/google/class-gtg-proxy.php (modified) (8 diffs)
-
includes/pixels/google/pmw-gtg-config (added)
-
includes/pixels/google/pmw-gtg-config/config-1.json (added)
-
includes/pixels/google/pmw-gtg-config/index.php (added)
-
includes/pixels/google/pmw-gtg-config/site-map.json (added)
-
includes/pixels/google/pmw-gtg-proxy.php (modified) (11 diffs)
-
js/admin/pmw-admin.p1.min.js (modified) (1 diff)
-
js/admin/pmw-admin.p1.min.js.br (modified) (previous)
-
js/admin/pmw-admin.p1.min.js.gz (modified) (previous)
-
js/admin/pmw-admin.p1.min.js.map (modified) (1 diff)
-
js/public/free/pixel-facebook.1aad8345.chunk.min.js (deleted)
-
js/public/free/pixel-facebook.1aad8345.chunk.min.js.br (deleted)
-
js/public/free/pixel-facebook.1aad8345.chunk.min.js.gz (deleted)
-
js/public/free/pixel-facebook.1aad8345.chunk.min.js.map (deleted)
-
js/public/free/pixel-facebook.b4f040d6.chunk.min.js (added)
-
js/public/free/pixel-facebook.b4f040d6.chunk.min.js.br (added)
-
js/public/free/pixel-facebook.b4f040d6.chunk.min.js.gz (added)
-
js/public/free/pixel-facebook.b4f040d6.chunk.min.js.map (added)
-
js/public/free/pixel-google.2dcfb231.chunk.min.js (added)
-
js/public/free/pixel-google.2dcfb231.chunk.min.js.br (added)
-
js/public/free/pixel-google.2dcfb231.chunk.min.js.gz (added)
-
js/public/free/pixel-google.2dcfb231.chunk.min.js.map (added)
-
js/public/free/pixel-google.87d84819.chunk.min.js (deleted)
-
js/public/free/pixel-google.87d84819.chunk.min.js.br (deleted)
-
js/public/free/pixel-google.87d84819.chunk.min.js.gz (deleted)
-
js/public/free/pixel-google.87d84819.chunk.min.js.map (deleted)
-
js/public/free/pmw-public.p1.min.js (modified) (1 diff)
-
js/public/free/pmw-public.p1.min.js.br (modified) (previous)
-
js/public/free/pmw-public.p1.min.js.gz (modified) (previous)
-
js/public/free/pmw-public.p1.min.js.map (modified) (1 diff)
-
readme.txt (modified) (2 diffs)
-
vendor/composer/autoload_static.php (modified) (3 diffs)
-
vendor/composer/installed.php (modified) (2 diffs)
-
wgact.php (modified) (2 diffs)
Legend:
- Unmodified
- Added
- Removed
-
woocommerce-google-adwords-conversion-tracking-tag/trunk/class-wgact.php
r3447088 r3468312 12 12 defined( 'ABSPATH' ) || exit; 13 13 // Exit if accessed directly 14 use SweetCode\Pixel_Manager\Abilities; 14 15 use SweetCode\Pixel_Manager\Admin\Admin; 15 16 use SweetCode\Pixel_Manager\Admin\Admin_REST; … … 20 21 use SweetCode\Pixel_Manager\Admin\Notifications\Notifications; 21 22 use SweetCode\Pixel_Manager\Admin\Order_Columns; 23 use SweetCode\Pixel_Manager\Admin\SSP_REST; 22 24 use SweetCode\Pixel_Manager\Deprecated_Filters; 23 25 use SweetCode\Pixel_Manager\Helpers; … … 26 28 use SweetCode\Pixel_Manager\Pixels\Pixel_Manager; 27 29 use SweetCode\Pixel_Manager\Product; 30 use SweetCode\Pixel_Manager\SSP_Purchase_Proxy; 31 use SweetCode\Pixel_Manager\SSP_Sync; 28 32 use SweetCode\Pixel_Manager\Shop; 29 33 use SweetCode\Pixel_Manager\Admin\Ask_For_Rating; … … 62 66 wp_unschedule_event( $timestamp, 'pmw_tracking_accuracy_analysis' ); 63 67 } ); 68 register_deactivation_hook( __FILE__, function () { 69 if ( class_exists( '\\SweetCode\\Pixel_Manager\\Pixels\\Google\\GTG_Proxy' ) ) { 70 \SweetCode\Pixel_Manager\Pixels\Google\GTG_Proxy::unschedule_config_refresh(); 71 } 72 } ); 64 73 Deprecated_Filters::load_deprecated_filters(); 65 74 if ( Environment::is_woocommerce_active() ) { … … 297 306 } 298 307 Deprecated_Filters::load_deprecated_filters(); 308 // Register abilities with the WordPress Abilities API (WP 6.9+) 309 Abilities::init(); 299 310 // inject pixels into front end 300 311 $this->inject_pixels(); -
woocommerce-google-adwords-conversion-tracking-tag/trunk/css/admin.css
r3447088 r3468312 320 320 } 321 321 322 /* Modern opportunity card styling (matching trial/rating notifications) */ 323 .pmw .opportunity-card-modern { 324 background-color: #ffffff; 325 border-radius: 0; 326 box-shadow: 0 1px 1px rgba(0, 0, 0, 0.04); 327 } 328 329 .pmw .opportunity-card-modern.dismissed { 330 opacity: 0.6; 331 } 332 322 333 .pmw .opportunity-card, 323 334 .pmw .notification-card { … … 395 406 .pmw .opportunity-card-top-impact-level.impact-high, 396 407 .pmw .notification-card-top-impact-level.impact-high { 397 background: #f de8e8;398 border-color: # f56565;399 color: # c53030;408 background: #f3e8ff; 409 border-color: #8b5cf6; 410 color: #5b21b6; 400 411 } 401 412 402 413 .pmw .opportunity-card-top-impact-level.impact-medium, 403 414 .pmw .notification-card-top-impact-level.impact-medium { 404 background: # fef3c7;405 border-color: # f6ad55;406 color: # c05621;415 background: #dbeafe; 416 border-color: #3b82f6; 417 color: #1e40af; 407 418 } 408 419 409 420 .pmw .opportunity-card-top-impact-level.impact-low, 410 421 .pmw .notification-card-top-impact-level.impact-low { 411 background: # e6fffa;412 border-color: # 48bb78;413 color: # 276749;422 background: #ccfbf1; 423 border-color: #14b8a6; 424 color: #0f766e; 414 425 } 415 426 … … 533 544 534 545 .pmw .pmw-stat-card.impact-high { 535 background: #f de8e8;536 border-color: # f56565;546 background: #f3e8ff; 547 border-color: #8b5cf6; 537 548 } 538 549 539 550 .pmw .pmw-stat-card.impact-high .pmw-stat-card-count { 540 color: # c53030;551 color: #5b21b6; 541 552 } 542 553 543 554 .pmw .pmw-stat-card.impact-high .pmw-stat-card-label { 544 color: # c53030;555 color: #5b21b6; 545 556 } 546 557 547 558 .pmw .pmw-stat-card.impact-medium { 548 background: # fef3c7;549 border-color: # f6ad55;559 background: #dbeafe; 560 border-color: #3b82f6; 550 561 } 551 562 552 563 .pmw .pmw-stat-card.impact-medium .pmw-stat-card-count { 553 color: # c05621;564 color: #1e40af; 554 565 } 555 566 556 567 .pmw .pmw-stat-card.impact-medium .pmw-stat-card-label { 557 color: # c05621;568 color: #1e40af; 558 569 } 559 570 560 571 .pmw .pmw-stat-card.impact-low { 561 background: # e6fffa;562 border-color: # 48bb78;572 background: #ccfbf1; 573 border-color: #14b8a6; 563 574 } 564 575 565 576 .pmw .pmw-stat-card.impact-low .pmw-stat-card-count { 566 color: # 276749;577 color: #0f766e; 567 578 } 568 579 569 580 .pmw .pmw-stat-card.impact-low .pmw-stat-card-label { 570 color: # 276749;581 color: #0f766e; 571 582 } 572 583 … … 1188 1199 font-size: 13px; 1189 1200 } 1201 1202 /* ─── SSE (Server-Side Events) Tab ──────────────────────── */ 1203 1204 .pmw-sse-card { 1205 background: #fff; 1206 border: 1px solid #e0e0e0; 1207 border-radius: 8px; 1208 padding: 20px 24px; 1209 margin-bottom: 20px; 1210 max-width: 800px; 1211 } 1212 1213 .pmw-sse-card > h3 { 1214 margin-top: 0; 1215 margin-bottom: 4px; 1216 font-size: 15px; 1217 } 1218 1219 .pmw-sse-card-description { 1220 color: #666; 1221 font-size: 13px; 1222 line-height: 1.5; 1223 margin-top: 0; 1224 margin-bottom: 12px; 1225 } 1226 1227 .pmw-sse-card .form-table { 1228 margin-top: 0; 1229 } 1230 1231 /* ─── SSP (Server-Side Proxy) Section ─────────────────── */ 1232 1233 .pmw-ssp-container > .pmw-section-description { 1234 color: #555; 1235 font-size: 14px; 1236 line-height: 1.6; 1237 margin-bottom: 24px; 1238 } 1239 1240 /* Setup wizard steps */ 1241 .pmw-ssp-steps { 1242 display: flex; 1243 flex-direction: column; 1244 gap: 0; 1245 position: relative; 1246 padding-left: 0; 1247 } 1248 1249 .pmw-ssp-step { 1250 display: flex; 1251 align-items: flex-start; 1252 gap: 14px; 1253 padding: 12px 0; 1254 position: relative; 1255 } 1256 1257 .pmw-ssp-step:not(:last-child)::after { 1258 content: ''; 1259 position: absolute; 1260 left: 15px; 1261 top: 40px; 1262 bottom: -4px; 1263 width: 2px; 1264 background-color: #ddd; 1265 } 1266 1267 .pmw-ssp-step.completed:not(:last-child)::after { 1268 background-color: #2e7d32; 1269 } 1270 1271 .pmw-ssp-step-indicator { 1272 flex-shrink: 0; 1273 width: 32px; 1274 height: 32px; 1275 border-radius: 50%; 1276 display: flex; 1277 align-items: center; 1278 justify-content: center; 1279 font-size: 14px; 1280 font-weight: 600; 1281 border: 2px solid #ddd; 1282 color: #999; 1283 background: #fff; 1284 position: relative; 1285 z-index: 1; 1286 } 1287 1288 .pmw-ssp-step.completed .pmw-ssp-step-indicator { 1289 background: #2e7d32; 1290 border-color: #2e7d32; 1291 color: #fff; 1292 } 1293 1294 .pmw-ssp-step.current .pmw-ssp-step-indicator { 1295 border-color: #0073aa; 1296 color: #0073aa; 1297 background: #f0f6fc; 1298 } 1299 1300 .pmw-ssp-step-content { 1301 flex: 1; 1302 padding-top: 4px; 1303 } 1304 1305 .pmw-ssp-step-content strong { 1306 display: block; 1307 font-size: 14px; 1308 margin-bottom: 2px; 1309 } 1310 1311 .pmw-ssp-step-content p { 1312 margin: 0; 1313 color: #666; 1314 font-size: 13px; 1315 } 1316 1317 .pmw-ssp-step.pending .pmw-ssp-step-content strong, 1318 .pmw-ssp-step.pending .pmw-ssp-step-content p { 1319 color: #bbb; 1320 } 1321 1322 /* Status badges */ 1323 .pmw-ssp-badge { 1324 display: inline-flex; 1325 align-items: center; 1326 padding: 3px 10px; 1327 border-radius: 20px; 1328 font-size: 12px; 1329 font-weight: 600; 1330 line-height: 1.4; 1331 } 1332 1333 .pmw-ssp-badge--active, 1334 .pmw-ssp-badge--synced { 1335 background-color: #e6fffa; 1336 border: 1px solid #81c784; 1337 color: #2e7d32; 1338 } 1339 1340 .pmw-ssp-badge--pending_dns, 1341 .pmw-ssp-badge--waiting_config { 1342 background-color: #fef3c7; 1343 border: 1px solid #f59e0b; 1344 color: #92400e; 1345 } 1346 1347 .pmw-ssp-badge--disabled, 1348 .pmw-ssp-badge--deleted, 1349 .pmw-ssp-badge--sync_error, 1350 .pmw-ssp-badge--inactive { 1351 background-color: #fde8e8; 1352 border: 1px solid #f56565; 1353 color: #c53030; 1354 } 1355 1356 .pmw-ssp-badge--unknown { 1357 background-color: #f8f8f8; 1358 border: 1px solid #e0e0e0; 1359 color: #626262; 1360 } 1361 1362 /* Compact status table rows */ 1363 .pmw-ssp-status-section .form-table th, 1364 .pmw-ssp-status-section .form-table td { 1365 padding-top: 6px; 1366 padding-bottom: 6px; 1367 line-height: 1.6; 1368 vertical-align: middle; 1369 } 1370 1371 .pmw-ssp-error-text { 1372 color: #c53030; 1373 font-size: 13px; 1374 } 1375 1376 /* SSP action buttons result messages */ 1377 .pmw-ssp-msg-success { 1378 color: #2e7d32; 1379 font-weight: 500; 1380 } 1381 1382 .pmw-ssp-msg-error { 1383 color: #c53030; 1384 font-weight: 500; 1385 } 1386 1387 .pmw-ssp-msg-loading { 1388 color: #666; 1389 font-style: italic; 1390 } -
woocommerce-google-adwords-conversion-tracking-tag/trunk/freemius-loader.php
r3447088 r3468312 73 73 wpm_fs()->add_filter( 'after_connect_url', 'pmw_fs_settings_url' ); 74 74 wpm_fs()->add_filter( 'after_pending_connect_url', 'pmw_fs_settings_url' ); 75 wpm_fs()->add_filter( 'show_deactivation_subscription_cancellation', '__return_false' ); 75 76 } 76 77 // Run the PMW loader -
woocommerce-google-adwords-conversion-tracking-tag/trunk/includes/admin/class-admin-rest.php
r3449154 r3468312 35 35 36 36 public function register_routes() { 37 38 $this->register_settings_save_route(); 37 39 38 40 register_rest_route(self::$rest_namespace, '/notifications/', [ … … 325 327 ]); 326 328 } 329 330 /** 331 * Register the REST route for saving all settings (PMW + add-ons) via AJAX. 332 * 333 * Replaces the WordPress Settings API form POST to options.php with a REST 334 * endpoint so that both PMW core and add-on settings can be saved in a single 335 * request, each to their own wp_options row. 336 * 337 * @since 1.57.0 338 */ 339 private function register_settings_save_route() { 340 register_rest_route(self::$rest_namespace, '/options/save', [ 341 'methods' => 'POST', 342 'callback' => [ $this, 'handle_settings_save' ], 343 'permission_callback' => [ $this, 'can_current_user_edit_options' ], 344 ]); 345 } 346 347 /** 348 * Handle the settings save REST request. 349 * 350 * 1. Extracts PMW core options from POST data, runs them through the existing 351 * Validations::options_validate() pipeline (sanitize, validate, merge defaults, 352 * create backup), and saves to the PMW options record. 353 * 2. Fires the 'pmw_addon_save_settings' filter so add-on plugins can extract 354 * their own prefixed data, validate, and save to their own wp_options rows. 355 * 3. Returns a JSON response with success/error status and validation messages. 356 * 357 * @param \WP_REST_Request $request The REST request containing form-serialized POST data. 358 * 359 * @return \WP_REST_Response 360 * 361 * @since 1.57.0 362 */ 363 public function handle_settings_save( $request ) { 364 365 // Ensure settings error functions are available (not loaded during REST requests) 366 if (!function_exists('get_settings_errors')) { 367 require_once ABSPATH . 'wp-admin/includes/template.php'; 368 } 369 370 $body = $request->get_body_params(); 371 372 $pmw_errors = []; 373 $addon_errors = []; 374 375 // --- Save PMW core options --- 376 if (isset($body['wgact_plugin_options']) && is_array($body['wgact_plugin_options'])) { 377 378 $input = $body['wgact_plugin_options']; 379 380 // Run through the existing validation pipeline. 381 // This sanitizes, validates per-field, merges non_form_keys, 382 // sets timestamp, fills defaults, and creates an automatic backup. 383 $validated = Validations::options_validate($input); 384 385 // Collect any settings errors that the validation pipeline added 386 // (they use add_settings_error() which stores to a global). 387 $settings_errors = get_settings_errors('wgact_plugin_options'); 388 389 if (!empty($settings_errors)) { 390 foreach ($settings_errors as $error) { 391 $pmw_errors[] = $error['message']; 392 } 393 } 394 395 // Save the validated options 396 update_option(PMW_DB_OPTIONS_NAME, $validated); 397 Options::invalidate_cache(); 398 } 399 400 // --- Let add-ons save their settings --- 401 /** 402 * Filter for add-on plugins to process and save their own settings. 403 * 404 * Add-ons should: 405 * 1. Extract their data from $body using their unique key (e.g. $body['pmw_addon_myaddon']) 406 * 2. Validate and sanitize the data 407 * 3. Call update_option() with their own option name 408 * 4. Append any error messages to $addon_results 409 * 410 * @param array $addon_results Array of add-on save result arrays, each with 'slug', 'success', 'errors' keys. 411 * @param array $body The full POST body params. 412 * 413 * @return array Modified addon_results array. 414 * 415 * @since 1.57.0 416 */ 417 $addon_results = apply_filters('pmw_addon_save_settings', [], $body); 418 419 // Collect add-on errors 420 foreach ($addon_results as $result) { 421 if (!empty($result['errors'])) { 422 $addon_errors = array_merge($addon_errors, $result['errors']); 423 } 424 } 425 426 $all_errors = array_merge($pmw_errors, $addon_errors); 427 428 if (!empty($all_errors)) { 429 return new \WP_REST_Response([ 430 'success' => false, 431 'message' => esc_html__('Settings saved with errors.', 'woocommerce-google-adwords-conversion-tracking-tag'), 432 'errors' => $all_errors, 433 'addon_results' => $addon_results, 434 ], 200); 435 } 436 437 return new \WP_REST_Response([ 438 'success' => true, 439 'message' => esc_html__('Settings saved.', 'woocommerce-google-adwords-conversion-tracking-tag'), 440 'errors' => [], 441 'addon_results' => $addon_results, 442 ], 200); 443 } 327 444 } -
woocommerce-google-adwords-conversion-tracking-tag/trunk/includes/admin/class-admin.php
r3451824 r3468312 304 304 return; 305 305 } 306 self::add_section_main(); 307 self::add_section_advanced(); 306 $tabs = self::get_admin_tabs(); 307 foreach ( $tabs as $tab ) { 308 if ( isset( $tab['add_section_callback'] ) && is_callable( $tab['add_section_callback'] ) ) { 309 call_user_func( $tab['add_section_callback'] ); 310 } 311 } 312 } 313 314 /** 315 * Get the registered admin tabs, sorted by priority. 316 * 317 * Add-ons can use the 'pmw_admin_tabs' filter to register their own tabs. 318 * 319 * Each tab array should contain: 320 * - 'slug' (string) Unique tab identifier 321 * - 'title' (string) Display title 322 * - 'priority' (int) Sort order (lower = earlier) 323 * - 'show_save_button' (bool) Whether the save button is shown for this tab 324 * - 'add_section_callback' (callable) Function that registers the tab's settings sections and fields 325 * - 'option_name' (string) Optional. The wp_options key this tab saves to (for add-on tabs) 326 * - 'sanitize_callback' (callable) Optional. Validation/sanitize function for add-on tab data 327 * 328 * @return array Sorted array of tab configurations. 329 * 330 * @since 1.57.0 331 */ 332 public static function get_admin_tabs() { 333 $tabs = [[ 334 'slug' => 'main', 335 'priority' => 10, 336 'show_save_button' => true, 337 'add_section_callback' => [__CLASS__, 'add_section_main'], 338 ], [ 339 'slug' => 'advanced', 340 'priority' => 20, 341 'show_save_button' => true, 342 'add_section_callback' => [__CLASS__, 'add_section_advanced'], 343 ]]; 308 344 if ( Environment::is_woocommerce_active() ) { 309 self::add_section_shop(); 310 } 311 self::add_section_consent_management(); 312 self::add_section_opportunities(); 345 $tabs[] = [ 346 'slug' => 'shop', 347 'priority' => 30, 348 'show_save_button' => true, 349 'add_section_callback' => [__CLASS__, 'add_section_shop'], 350 ]; 351 } 352 // SSE tab — requires active pro license 353 if ( Helpers::is_pmw_pro_version_active() || Options::is_pro_version_demo_active() ) { 354 $tabs[] = [ 355 'slug' => 'sse', 356 'priority' => 25, 357 'show_save_button' => true, 358 'add_section_callback' => [__CLASS__, 'add_section_sse__premium_only'], 359 ]; 360 } 361 $tabs[] = [ 362 'slug' => 'consent-management', 363 'priority' => 40, 364 'show_save_button' => true, 365 'add_section_callback' => [__CLASS__, 'add_section_consent_management'], 366 ]; 367 $tabs[] = [ 368 'slug' => 'opportunities', 369 'priority' => 70, 370 'show_save_button' => false, 371 'add_section_callback' => [__CLASS__, 'add_section_opportunities'], 372 ]; 313 373 if ( Environment::is_woocommerce_active() ) { 314 self::add_section_diagnostics(); 315 } 316 self::add_section_support(); 317 self::add_section_logs(); 374 $tabs[] = [ 375 'slug' => 'diagnostics', 376 'priority' => 80, 377 'show_save_button' => false, 378 'add_section_callback' => [__CLASS__, 'add_section_diagnostics'], 379 ]; 380 } 381 $tabs[] = [ 382 'slug' => 'support', 383 'priority' => 90, 384 'show_save_button' => false, 385 'add_section_callback' => [__CLASS__, 'add_section_support'], 386 ]; 387 $tabs[] = [ 388 'slug' => 'logger', 389 'priority' => 100, 390 'show_save_button' => true, 391 'add_section_callback' => [__CLASS__, 'add_section_logs'], 392 ]; 393 /** 394 * Filter the admin settings tabs. 395 * 396 * Add-ons can use this filter to register their own tabs with custom 397 * priority, rendering, and save handling. 398 * 399 * @param array $tabs Array of tab configuration arrays. 400 * 401 * @since 1.57.0 402 */ 403 $tabs = apply_filters( 'pmw_admin_tabs', $tabs ); 404 // Sort by priority 405 usort( $tabs, function ( $a, $b ) { 406 return (( isset( $a['priority'] ) ? $a['priority'] : 50 )) - (( isset( $b['priority'] ) ? $b['priority'] : 50 )); 407 } ); 408 return $tabs; 318 409 } 319 410 … … 636 727 $section_ids['settings_name'] 637 728 ); 638 // Add option for tracking PageView events through s2s639 add_settings_field(640 'pmw_setting_track_pageview_events_s2s',641 esc_html__( 'Track PageView Events Server-to-Server', 'woocommerce-google-adwords-conversion-tracking-tag' ) . self::html_beta(),642 [__CLASS__, 'html_track_pageview_events_s2s'],643 'wpm_plugin_options_page',644 $section_ids['settings_name']645 );646 729 } 647 730 // add checkbox for maximum compatibility mode … … 1434 1517 } 1435 1518 1519 /** 1520 * Convert an SSP status slug to a human-readable label. 1521 * 1522 * @param string $status 1523 * 1524 * @return string 1525 * @since 1.57.0 1526 */ 1527 private static function ssp_status_label( $status ) { 1528 $labels = [ 1529 'active' => __( 'Active', 'woocommerce-google-adwords-conversion-tracking-tag' ), 1530 'pending_dns' => __( 'Pending DNS', 'woocommerce-google-adwords-conversion-tracking-tag' ), 1531 'disabled' => __( 'Disabled', 'woocommerce-google-adwords-conversion-tracking-tag' ), 1532 'deleted' => __( 'Deleted', 'woocommerce-google-adwords-conversion-tracking-tag' ), 1533 'waiting_config' => __( 'Waiting for Config', 'woocommerce-google-adwords-conversion-tracking-tag' ), 1534 'synced' => __( 'Synced', 'woocommerce-google-adwords-conversion-tracking-tag' ), 1535 'sync_error' => __( 'Sync Error', 'woocommerce-google-adwords-conversion-tracking-tag' ), 1536 ]; 1537 return ( isset( $labels[$status] ) ? $labels[$status] : __( 'Unknown', 'woocommerce-google-adwords-conversion-tracking-tag' ) ); 1538 } 1539 1436 1540 public static function add_section_support() { 1437 1541 $section_ids = [ … … 1461 1565 } 1462 1566 1567 /** 1568 * Render the section marker div with data attributes for JS tab rendering. 1569 * 1570 * The priority and show-save-button attributes are looked up from the 1571 * registered tabs configuration. If no matching tab is found, defaults 1572 * are used (priority=50, show-save-button=true). 1573 * 1574 * @param array $section_ids Section configuration array with 'title', 'slug', and optional 'badge_count'. 1575 * 1576 * @since 1.57.0 1577 */ 1463 1578 public static function section_generic_opening_div_html( $section_ids ) { 1464 1579 $badge_count = ( isset( $section_ids['badge_count'] ) ? $section_ids['badge_count'] : 0 ); 1465 echo '<div class="section" data-section-title="' . esc_js( $section_ids['title'] ) . '" data-section-slug="' . esc_js( $section_ids['slug'] ) . '" data-badge-count="' . esc_attr( $badge_count ) . '"></div>'; 1580 $priority = 50; 1581 $show_save_button = true; 1582 // Look up priority and show_save_button from the registered tabs 1583 $tabs = self::get_admin_tabs(); 1584 foreach ( $tabs as $tab ) { 1585 if ( $tab['slug'] === $section_ids['slug'] ) { 1586 $priority = ( isset( $tab['priority'] ) ? $tab['priority'] : 50 ); 1587 $show_save_button = ( isset( $tab['show_save_button'] ) ? $tab['show_save_button'] : true ); 1588 break; 1589 } 1590 } 1591 echo '<div class="section"' . ' data-section-title="' . esc_js( $section_ids['title'] ) . '"' . ' data-section-slug="' . esc_js( $section_ids['slug'] ) . '"' . ' data-badge-count="' . esc_attr( $badge_count ) . '"' . ' data-priority="' . esc_attr( $priority ) . '"' . ' data-show-save-button="' . esc_attr( ( $show_save_button ? '1' : '0' ) ) . '"' . '></div>'; 1466 1592 } 1467 1593 … … 1566 1692 <h2 class="nav-tab-wrapper"></h2> 1567 1693 1568 <form id="pmw_settings_form" action="options.php" method="post"> 1569 1570 <?php 1571 settings_fields( 'wpm_plugin_options_group' ); 1694 <form id="pmw_settings_form" method="post"> 1695 1696 <?php 1697 // Keep nonce for REST save validation 1698 wp_nonce_field( 'pmw_settings_save', 'pmw_settings_nonce' ); 1572 1699 do_settings_sections( 'wpm_plugin_options_page' ); 1700 /** 1701 * Fires after PMW's own settings sections have been rendered, 1702 * but before the submit button. Add-on plugins should use 1703 * this hook to output their settings fields. 1704 * 1705 * @since 1.57.0 1706 */ 1707 do_action( 'pmw_admin_settings_after_sections' ); 1573 1708 submit_button(); 1574 1709 self::inject_developer_banner(); … … 5167 5302 5168 5303 /** 5304 * HTML output for the skip empty S2S events toggle. 5305 * 5306 * When enabled, server-side events that contain no destination platform data 5307 * (e.g., no Facebook, TikTok, Snapchat, etc.) will not be sent to the server. 5308 * 5309 * @since 1.57.0 5310 */ 5311 public static function html_skip_empty_s2s_events() { 5312 // adding the hidden input is a hack to make WordPress save the option with the value zero, 5313 // instead of not saving it and remove that array key entirely 5314 // https://stackoverflow.com/a/1992745/4688612 5315 ?> 5316 <label> 5317 <input type="hidden" value="0" name="wgact_plugin_options[general][skip_empty_s2s_events]"> 5318 <input type="checkbox" 5319 id="pmw_setting_skip_empty_s2s_events" 5320 name="wgact_plugin_options[general][skip_empty_s2s_events]" 5321 value="1" 5322 <?php 5323 checked( Options::is_skip_empty_s2s_events_active() ); 5324 ?> 5325 <?php 5326 echo esc_html( self::disable_if_demo() ); 5327 ?> 5328 /> 5329 5330 <?php 5331 esc_html_e( 'Skip server-side events with no destination platforms', 'woocommerce-google-adwords-conversion-tracking-tag' ); 5332 ?> 5333 </label> 5334 <?php 5335 self::display_status_icon( Options::is_skip_empty_s2s_events_active(), true, true ); 5336 ?> 5337 <?php 5338 self::html_pro_feature(); 5339 ?> 5340 5341 <p style="margin-top: 10px"> 5342 <span class="dashicons dashicons-info"></span> 5343 <?php 5344 esc_html_e( 'When enabled, events that have no destination platform (e.g., Facebook, TikTok) in their payload will not be sent to the server. This reduces unnecessary load on your WooCommerce server and the Server-Side Proxy. Disable this if you want all events to be sent regardless of whether a platform processes them.', 'woocommerce-google-adwords-conversion-tracking-tag' ); 5345 ?> 5346 </p> 5347 <?php 5348 } 5349 5350 /** 5351 * HTML output for the always send S2S events toggle. 5352 * 5353 * When enabled, server-side events are sent to ad platforms even when 5354 * browser-side pixels haven't loaded (e.g. due to a consent manager). 5355 * Browser-side tracking remains unaffected. 5356 * 5357 * @since 1.57.0 5358 */ 5359 public static function html_always_send_s2s() { 5360 // adding the hidden input is a hack to make WordPress save the option with the value zero, 5361 // instead of not saving it and remove that array key entirely 5362 // https://stackoverflow.com/a/1992745/4688612 5363 ?> 5364 <label> 5365 <input type="hidden" value="0" name="wgact_plugin_options[general][always_send_s2s]"> 5366 <input type="checkbox" 5367 id="pmw_setting_always_send_s2s" 5368 name="wgact_plugin_options[general][always_send_s2s]" 5369 value="1" 5370 <?php 5371 checked( Options::is_always_send_s2s_active() ); 5372 ?> 5373 <?php 5374 echo esc_html( self::disable_if_demo() ); 5375 ?> 5376 /> 5377 5378 <?php 5379 esc_html_e( 'Always send server-side events, even when browser-side pixels have not loaded', 'woocommerce-google-adwords-conversion-tracking-tag' ); 5380 ?> 5381 </label> 5382 <?php 5383 self::display_status_icon( Options::is_always_send_s2s_active(), Options::server_2_server_enabled(), true ); 5384 ?> 5385 <?php 5386 self::html_pro_feature(); 5387 ?> 5388 5389 <?php 5390 if ( Options::is_always_send_s2s_active() && !Options::server_2_server_enabled() ) { 5391 ?> 5392 <p> 5393 <span class="dashicons dashicons-info"></span> 5394 <?php 5395 esc_html_e( 'For this feature to be used, at least one server-to-server feature, like Facebook CAPI must be enabled.', 'woocommerce-google-adwords-conversion-tracking-tag' ); 5396 ?> 5397 </p> 5398 <?php 5399 } 5400 ?> 5401 <p style="margin-top: 10px"> 5402 <span class="dashicons dashicons-info"></span> 5403 <?php 5404 esc_html_e( 'When enabled, server-side events are sent to ad platforms even when browser-side pixels have not loaded (e.g. due to a consent manager). Browser-side tracking remains unaffected — only server-side events are sent independently. Useful for platforms that support cookieless or limited-data server-side integrations.', 'woocommerce-google-adwords-conversion-tracking-tag' ); 5405 ?> 5406 </p> 5407 <?php 5408 } 5409 5410 /** 5169 5411 * HTML output for the deprecated functions module toggle. 5170 5412 * … … 5830 6072 5831 6073 private static function html_experiment() { 5832 return '<div class="pmw-status-icon beta" >' . esc_html__( 'experiment', 'woocommerce-google-adwords-conversion-tracking-tag' ) . '</div>';6074 return '<div class="pmw-status-icon beta" style="vertical-align: middle; margin-top: -2px">' . esc_html__( 'beta', 'woocommerce-google-adwords-conversion-tracking-tag' ) . '</div>'; 5833 6075 } 5834 6076 -
woocommerce-google-adwords-conversion-tracking-tag/trunk/includes/admin/class-ask-for-rating.php
r3447088 r3468312 95 95 public function ask_for_rating_notice() { 96 96 97 // Don't show if were not an admin98 if (!Environment:: get_user_edit_capability()) {97 // Don't show if the user lacks the required capabilities. 98 if (!Environment::can_current_user_edit_options()) { 99 99 return; 100 100 } … … 133 133 134 134 // For testing purposes 135 if (defined('PMW_ALWAYS_AKS_FOR_RATING') && PMW_ALWAYS_AKS_FOR_RATING) { 135 $force_rating_notice = 136 ( defined('PMW_ALWAYS_ASK_FOR_RATING') && PMW_ALWAYS_ASK_FOR_RATING ) 137 || ( defined('PMW_ALWAYS_AKS_FOR_RATING') && PMW_ALWAYS_AKS_FOR_RATING ); 138 139 if ($force_rating_notice) { 136 140 $this->ask_for_rating_notices($conversions_count); 137 141 return; … … 157 161 private function get_default_settings() { 158 162 return [ 159 'conversions_count' => 1,163 'conversions_count' => 0, 160 164 'rating_threshold' => 10, 161 165 'rating_done' => false, -
woocommerce-google-adwords-conversion-tracking-tag/trunk/includes/admin/class-environment.php
r3451824 r3468312 647 647 public static function is_cookieyes_active() { 648 648 return is_plugin_active('cookie-law-info/cookie-law-info.php'); 649 } 650 651 /** 652 * Check if Google Automated Discounts for WooCommerce (GADWC) is active. 653 * 654 * Checks constant, class, and all known plugin basenames across distributions 655 * (Freemius free, Freemius premium, WooCommerce Marketplace). 656 * 657 * @return bool 658 * @since 1.57.0 659 */ 660 public static function is_gadwc_active() { 661 return defined('SGADWC_CURRENT_VERSION') 662 || class_exists('SGADWC') 663 || is_plugin_active('sgadwc/sgadwc.php') 664 || is_plugin_active('sgadwc-premium/sgadwc.php') 665 || is_plugin_active('google-automated-discounts-pro-for-woocommerce/google-automated-discounts-pro-for-woocommerce.php'); 666 } 667 668 /** 669 * Check if Google Customer Reviews for WooCommerce (GCR) is active. 670 * 671 * Checks constant, class, and all known plugin basenames across distributions 672 * (Freemius free, Freemius premium). 673 * 674 * @return bool 675 * @since 1.57.0 676 */ 677 public static function is_gcr_active() { 678 return defined('GCR_CURRENT_VERSION') 679 || class_exists('GCR') 680 || is_plugin_active('google-customer-reviews-for-woocommerce/google-customer-reviews-for-woocommerce.php') 681 || is_plugin_active('google-customer-reviews-for-woocommerce-premium/google-customer-reviews-for-woocommerce.php'); 649 682 } 650 683 -
woocommerce-google-adwords-conversion-tracking-tag/trunk/includes/admin/class-validations.php
r3451824 r3468312 912 912 ], 913 913 ], 914 'ssp' => isset(Options::get_options()['ssp']) ? Options::get_options()['ssp'] : [], 914 915 ]; 915 916 -
woocommerce-google-adwords-conversion-tracking-tag/trunk/includes/admin/notifications/class-notifications.php
r3447088 r3468312 330 330 <!-- Settings Link end --> 331 331 332 <!-- Portal Link --> 333 <?php 334 if ( isset( $notification_data['portal_link'] ) ) { 335 ?> 336 <a class="notification-card-button-link" 337 href="<?php 338 echo esc_html( $notification_data['portal_link'] ); 339 ?>" 340 target="_blank" 341 > 342 <div class="notification-card-bottom-button"> 343 <?php 344 esc_html_e( 'SSP Portal', 'woocommerce-google-adwords-conversion-tracking-tag' ); 345 ?> 346 </div> 347 </a> 348 <?php 349 } 350 ?> 351 <!-- Portal Link end --> 352 332 353 </div> 333 354 <!-- bottom end --> … … 379 400 if ( $counts_by_impact['high'] > 0 ) { 380 401 ?> 381 <span class="pmw-opportunity-badge pmw-opportunity-badge-high" style="display: inline-flex; align-items: center; padding: 4px 10px; border-radius: 3px; font-size: 12px; font-weight: 500; background: #f de8e8; border: 1px solid #f56565; color: #c53030;">382 <span style="background: #fff; padding: 0 6px; border-radius: 3px; margin-right: 6px; font-size: 12px; font-family: 'Courier New', Courier, monospace; border: 1px solid # f56565; min-width: 12px; height: 18px; display: inline-flex; align-items: center; justify-content: center;"><?php402 <span class="pmw-opportunity-badge pmw-opportunity-badge-high" style="display: inline-flex; align-items: center; padding: 4px 10px; border-radius: 3px; font-size: 12px; font-weight: 500; background: #f3e8ff; border: 1px solid #8b5cf6; color: #5b21b6;"> 403 <span style="background: #fff; padding: 0 6px; border-radius: 3px; margin-right: 6px; font-size: 12px; font-family: 'Courier New', Courier, monospace; border: 1px solid #8b5cf6; min-width: 12px; height: 18px; display: inline-flex; align-items: center; justify-content: center;"><?php 383 404 echo esc_html( $counts_by_impact['high'] ); 384 405 ?></span> … … 394 415 if ( $counts_by_impact['medium'] > 0 ) { 395 416 ?> 396 <span class="pmw-opportunity-badge pmw-opportunity-badge-medium" style="display: inline-flex; align-items: center; padding: 4px 10px; border-radius: 3px; font-size: 12px; font-weight: 500; background: # fef3c7; border: 1px solid #f6ad55; color: #c05621;">397 <span style="background: #fff; padding: 0 6px; border-radius: 3px; margin-right: 6px; font-size: 12px; font-family: 'Courier New', Courier, monospace; border: 1px solid # f6ad55; min-width: 12px; height: 18px; display: inline-flex; align-items: center; justify-content: center;"><?php417 <span class="pmw-opportunity-badge pmw-opportunity-badge-medium" style="display: inline-flex; align-items: center; padding: 4px 10px; border-radius: 3px; font-size: 12px; font-weight: 500; background: #dbeafe; border: 1px solid #3b82f6; color: #1e40af;"> 418 <span style="background: #fff; padding: 0 6px; border-radius: 3px; margin-right: 6px; font-size: 12px; font-family: 'Courier New', Courier, monospace; border: 1px solid #3b82f6; min-width: 12px; height: 18px; display: inline-flex; align-items: center; justify-content: center;"><?php 398 419 echo esc_html( $counts_by_impact['medium'] ); 399 420 ?></span> … … 409 430 if ( $counts_by_impact['low'] > 0 ) { 410 431 ?> 411 <span class="pmw-opportunity-badge pmw-opportunity-badge-low" style="display: inline-flex; align-items: center; padding: 4px 10px; border-radius: 3px; font-size: 12px; font-weight: 500; background: # e6fffa; border: 1px solid #48bb78; color: #276749;">412 <span style="background: #fff; padding: 0 6px; border-radius: 3px; margin-right: 6px; font-size: 12px; font-family: 'Courier New', Courier, monospace; border: 1px solid # 48bb78; min-width: 12px; height: 18px; display: inline-flex; align-items: center; justify-content: center;"><?php432 <span class="pmw-opportunity-badge pmw-opportunity-badge-low" style="display: inline-flex; align-items: center; padding: 4px 10px; border-radius: 3px; font-size: 12px; font-weight: 500; background: #ccfbf1; border: 1px solid #14b8a6; color: #0f766e;"> 433 <span style="background: #fff; padding: 0 6px; border-radius: 3px; margin-right: 6px; font-size: 12px; font-family: 'Courier New', Courier, monospace; border: 1px solid #14b8a6; min-width: 12px; height: 18px; display: inline-flex; align-items: center; justify-content: center;"><?php 413 434 echo esc_html( $counts_by_impact['low'] ); 414 435 ?></span> -
woocommerce-google-adwords-conversion-tracking-tag/trunk/includes/admin/notifications/class-trial-promotion-notification.php
r3447088 r3468312 188 188 189 189 <div style="display: flex; flex-wrap: wrap; gap: 8px; margin-bottom: 12px;"> 190 <span style="display: inline-flex; align-items: center; padding: 4px 10px; border-radius: 3px; font-size: 12px; font-weight: 500; background: # e6fffa; border: 1px solid #48bb78; color: #276749;">190 <span style="display: inline-flex; align-items: center; padding: 4px 10px; border-radius: 3px; font-size: 12px; font-weight: 500; background: #ccfbf1; border: 1px solid #14b8a6; color: #0f766e;"> 191 191 <span class="dashicons dashicons-yes-alt" style="font-size: 14px; width: 14px; height: 14px; margin-right: 4px;"></span> 192 192 <?php esc_html_e('Server-side APIs (CAPI)', 'woocommerce-google-adwords-conversion-tracking-tag'); ?> 193 193 </span> 194 <span style="display: inline-flex; align-items: center; padding: 4px 10px; border-radius: 3px; font-size: 12px; font-weight: 500; background: # e6fffa; border: 1px solid #48bb78; color: #276749;">194 <span style="display: inline-flex; align-items: center; padding: 4px 10px; border-radius: 3px; font-size: 12px; font-weight: 500; background: #ccfbf1; border: 1px solid #14b8a6; color: #0f766e;"> 195 195 <span class="dashicons dashicons-yes-alt" style="font-size: 14px; width: 14px; height: 14px; margin-right: 4px;"></span> 196 196 <?php esc_html_e('Enhanced Conversions', 'woocommerce-google-adwords-conversion-tracking-tag'); ?> 197 197 </span> 198 <span style="display: inline-flex; align-items: center; padding: 4px 10px; border-radius: 3px; font-size: 12px; font-weight: 500; background: # e6fffa; border: 1px solid #48bb78; color: #276749;">198 <span style="display: inline-flex; align-items: center; padding: 4px 10px; border-radius: 3px; font-size: 12px; font-weight: 500; background: #ccfbf1; border: 1px solid #14b8a6; color: #0f766e;"> 199 199 <span class="dashicons dashicons-yes-alt" style="font-size: 14px; width: 14px; height: 14px; margin-right: 4px;"></span> 200 200 <?php esc_html_e('10+ Ad Platforms', 'woocommerce-google-adwords-conversion-tracking-tag'); ?> 201 201 </span> 202 <span style="display: inline-flex; align-items: center; padding: 4px 10px; border-radius: 3px; font-size: 12px; font-weight: 500; background: # e6fffa; border: 1px solid #48bb78; color: #276749;">202 <span style="display: inline-flex; align-items: center; padding: 4px 10px; border-radius: 3px; font-size: 12px; font-weight: 500; background: #ccfbf1; border: 1px solid #14b8a6; color: #0f766e;"> 203 203 <span class="dashicons dashicons-yes-alt" style="font-size: 14px; width: 14px; height: 14px; margin-right: 4px;"></span> 204 204 <?php esc_html_e('Refund Tracking', 'woocommerce-google-adwords-conversion-tracking-tag'); ?> -
woocommerce-google-adwords-conversion-tracking-tag/trunk/includes/admin/opportunities/class-opportunities.php
r3447088 r3468312 148 148 } 149 149 150 /** 151 * Get emoji based on impact level. 152 * 153 * @param string $impact The impact level (high, medium, low). 154 * @return string The corresponding emoji. 155 * @since 1.56.0 156 */ 157 private static function get_impact_emoji( $impact ) { 158 $impact_lower = strtolower($impact); 159 160 switch ($impact_lower) { 161 case 'high': 162 return '🚀'; 163 case 'medium': 164 return '📈'; 165 case 'low': 166 return '💡'; 167 default: 168 return '💡'; 169 } 170 } 171 172 /** 173 * Get border color based on impact level. 174 * 175 * @param string $impact The impact level (high, medium, low). 176 * @return string The corresponding hex color. 177 * @since 1.56.0 178 */ 179 private static function get_impact_border_color( $impact ) { 180 $impact_lower = strtolower($impact); 181 182 switch ($impact_lower) { 183 case 'high': 184 return '#8b5cf6'; 185 case 'medium': 186 return '#3b82f6'; 187 case 'low': 188 return '#14b8a6'; 189 default: 190 return '#2271b1'; 191 } 192 } 193 150 194 public static function card_html( $card_data, $custom_middle_html = null ) { 151 195 152 $main_card_classes = [ 153 'opportunity-card', 154 ]; 155 156 if ($card_data['dismissed']) { 157 $main_card_classes[] = 'dismissed'; 158 } 196 $is_dismissed = !empty($card_data['dismissed']); 197 $impact = isset($card_data['impact']) ? $card_data['impact'] : 'low'; 198 $impact_lower = strtolower($impact); 199 $emoji = self::get_impact_emoji($impact); 200 $border_color = self::get_impact_border_color($impact); 201 $dismissed_opacity = $is_dismissed ? 'opacity: 0.7;' : ''; 159 202 160 203 ?> 161 204 <div class="pmw"> 162 <div id="pmw-opportunity-<?php echo esc_html($card_data['id']); ?>" 163 class="<?php echo esc_html(implode(' ', $main_card_classes)); ?>" 164 > 165 <!-- top --> 166 <div class="opportunity-card-top"> 167 <div><b><?php echo esc_html($card_data['title']); ?></b></div> 168 <div class="opportunity-card-top-right"> 169 <div class="opportunity-card-top-impact"> 170 <?php esc_html_e('Impact', 'woocommerce-google-adwords-conversion-tracking-tag'); ?>: 171 </div> 172 <div class="opportunity-card-top-impact-level impact-<?php echo esc_attr(strtolower($card_data['impact'])); ?>"> 173 <?php echo esc_html($card_data['impact']); ?> 174 </div> 175 </div> 205 <div id="pmw-opportunity-<?php echo esc_attr($card_data['id']); ?>" 206 class="notice notice-info inline opportunity-card-modern <?php echo $is_dismissed ? 'dismissed' : ''; ?>" 207 style="padding: 0; display: flex; flex-direction: column; border-left-color: <?php echo esc_attr($border_color); ?>; margin: 10px 0; border-radius: 5px; <?php echo esc_attr($dismissed_opacity); ?>"> 208 209 <!-- Top: Title and Impact Badge --> 210 <div style="display: flex; align-items: center; justify-content: space-between; flex-wrap: wrap; gap: 8px; padding: 12px 16px;"> 211 <strong style="font-size: 14px; color: #1e1e1e;"> 212 <?php echo esc_html($emoji); ?> <?php echo esc_html($card_data['title']); ?> 213 </strong> 214 <!-- Impact badge --> 215 <span class="opportunity-card-top-impact-level impact-<?php echo esc_attr($impact_lower); ?>" 216 style="display: inline-flex; align-items: center; padding: 4px 10px; border-radius: 3px; font-size: 12px; font-weight: 500;"> 217 <?php 218 /* translators: %s: the impact level (High, Medium, Low) */ 219 printf(esc_html__('Impact: %s', 'woocommerce-google-adwords-conversion-tracking-tag'), esc_html(ucfirst($impact))); 220 ?> 221 </span> 176 222 </div> 177 223 178 <hr class="opportunity-card-hr"> 179 180 <!-- middle --> 181 <div class="opportunity-card-middle"> 182 224 <hr style="margin: 0; border: none; border-top: 1px solid #ddd;"> 225 226 <!-- Middle: Description --> 227 <div style="padding: 12px 16px; color: #444; line-height: 1.5;"> 183 228 <?php if (!empty($custom_middle_html)) : ?> 184 <?php echo esc_html($custom_middle_html); ?>229 <?php echo wp_kses_post($custom_middle_html); ?> 185 230 <?php else : ?> 186 <?php foreach ($card_data['description'] as $description) : ?> 187 <p class="opportunity-card-description"> 188 <?php echo wp_kses_post($description); ?> 189 </p> 231 <?php foreach ($card_data['description'] as $index => $description) : ?> 232 <span><?php echo wp_kses_post($description); ?></span> 233 <?php if ($index < count($card_data['description']) - 1) : ?> 234 <br><br> 235 <?php endif; ?> 190 236 <?php endforeach; ?> 191 237 <?php endif; ?> 192 193 238 </div> 194 239 195 <hr class="opportunity-card-hr"> 196 197 <!-- bottom --> 198 <div class="opportunity-card-bottom"> 199 240 <hr style="margin: 0; border: none; border-top: 1px solid #ddd;"> 241 242 <!-- Bottom: Action buttons (aligned right) --> 243 <div style="display: flex; align-items: center; justify-content: flex-end; gap: 10px; flex-wrap: wrap; padding: 12px 16px;"> 200 244 <?php if (isset($card_data['setup_video'])) : ?> 201 <!-- Video Link--> 202 <div> 203 <script> 204 var script = document.createElement("script"); 205 script.async = true; 206 script.src = 'https://fast.wistia.com/embed/medias/<?php echo esc_html($card_data['setup_video']); ?>.jsonp'; 207 document.getElementsByTagName("head")[0].appendChild(script); 208 </script> 209 210 <div class="opportunities wistia_embed wistia_async_<?php echo esc_html($card_data['setup_video']); ?> popover=true popoverContent=link videoFoam=false" 211 style="display:inline-block;height:123;position:relative;width:150;text-decoration: none; vertical-align: top;"> 212 <span class="dashicons dashicons-video-alt3" style="font-size: 36px"></span> 213 </div> 245 <!-- Video Link --> 246 <script> 247 var script = document.createElement("script"); 248 script.async = true; 249 script.src = 'https://fast.wistia.com/embed/medias/<?php echo esc_attr($card_data['setup_video']); ?>.jsonp'; 250 document.getElementsByTagName("head")[0].appendChild(script); 251 </script> 252 <div class="opportunities wistia_embed wistia_async_<?php echo esc_attr($card_data['setup_video']); ?> popover=true popoverContent=link videoFoam=false" 253 style="display: inline-flex; align-items: center; text-decoration: none; cursor: pointer;"> 254 <span class="dashicons dashicons-video-alt3" style="font-size: 20px; width: 20px; height: 20px; margin-right: 4px;"></span> 255 <span style="color: #2271b1;"><?php esc_html_e('Watch Video', 'woocommerce-google-adwords-conversion-tracking-tag'); ?></span> 214 256 </div> 215 257 <?php endif; ?> 216 258 217 259 <?php if (isset($card_data['setup_link'])) : ?> 218 <!-- Setup Link--> 219 <a class="opportunity-card-button-link" 220 href="<?php echo esc_html($card_data['setup_link']); ?>" 260 <!-- Setup Link --> 261 <a href="<?php echo esc_url($card_data['setup_link']); ?>" 221 262 target="_blank" 222 >223 <div class=" opportunity-card-bottom-button">224 <?php esc_html_e('Setup', 'woocommerce-google-adwords-conversion-tracking-tag'); ?> 263 style="text-decoration: none; box-shadow: none;"> 264 <div class="button button-primary" style="margin: 0;"> 265 <?php esc_html_e('Setup', 'woocommerce-google-adwords-conversion-tracking-tag'); ?> ⚙️ 225 266 </div> 226 267 </a> … … 230 271 <?php foreach ($card_data['custom_buttons'] as $button) : ?> 231 272 <!-- Custom Button --> 232 <a class=" opportunity-card-button-link<?php echo isset($button['class']) ? esc_attr($button['class']) : ''; ?>"273 <a class="<?php echo isset($button['class']) ? esc_attr($button['class']) : ''; ?>" 233 274 href="<?php echo isset($button['url']) ? esc_url($button['url']) : '#'; ?>" 234 275 <?php if (isset($button['target'])) : ?> … … 240 281 <?php endforeach; ?> 241 282 <?php endif; ?> 242 >243 <div class=" opportunity-card-bottom-button">283 style="text-decoration: none; box-shadow: none;"> 284 <div class="button" style="margin: 0;"> 244 285 <?php echo esc_html($button['label']); ?> 245 286 </div> … … 248 289 <?php endif; ?> 249 290 250 251 291 <?php if (isset($card_data['learn_more_link'])) : ?> 252 <!-- Learn More Link--> 253 <a class="opportunity-card-button-link" 254 href="<?php echo esc_html($card_data['learn_more_link']); ?>" 292 <!-- Learn More Link --> 293 <a href="<?php echo esc_url($card_data['learn_more_link']); ?>" 255 294 target="_blank" 256 >257 <div class=" opportunity-card-bottom-button">295 style="text-decoration: none; box-shadow: none;"> 296 <div class="button" style="margin: 0;"> 258 297 <?php esc_html_e('Learn more', 'woocommerce-google-adwords-conversion-tracking-tag'); ?> 259 298 </div> … … 261 300 <?php endif; ?> 262 301 263 <?php if (empty($card_data['dismissed'])) : ?> 264 <!-- Dismiss Link--> 265 <a class="opportunity-card-button-link" 266 href="#" 267 > 268 <div class="opportunity-dismiss opportunity-card-bottom-button" 269 data-opportunity-id="<?php echo esc_html($card_data['id']); ?>"> 270 <?php esc_html_e('Dismiss', 'woocommerce-google-adwords-conversion-tracking-tag'); ?> 271 </div> 272 </a> 302 <?php if (!$is_dismissed) : ?> 303 <!-- Dismiss Link --> 304 <div class="button opportunity-dismiss" 305 style="margin: 0;" 306 data-opportunity-id="<?php echo esc_attr($card_data['id']); ?>"> 307 <?php esc_html_e('Dismiss', 'woocommerce-google-adwords-conversion-tracking-tag'); ?> 308 </div> 273 309 <?php endif; ?> 274 310 </div> 275 311 </div> 276 312 </div> 277 278 313 <?php 279 314 } -
woocommerce-google-adwords-conversion-tracking-tag/trunk/includes/class-options.php
r3451824 r3468312 270 270 ], 271 271 'pageview_events_s2s' => false, 272 'skip_empty_s2s_events' => true, 273 'always_send_s2s' => false, 272 274 'modules' => [ 273 275 'load_deprecated_functions' => true, 274 276 ], 277 ], 278 'ssp' => [ 279 'sync_token' => '', 280 'enabled' => false, 281 'proxy_hostname' => '', 282 'domain_id' => '', 283 'routing_status' => '', 284 'config_status' => '', 285 'last_sync_at' => 0, 286 'last_sync_error' => '', 287 'resync_callback_token' => '', 288 'verification_key' => '', 289 'proxy_failure_behavior' => 'fallback_to_wc', // 'fallback_to_wc' | 'drop_events' 290 'plan_name' => '', 291 'subscription_status' => '', 292 'usage_percent' => 0, 293 'monthly_request_limit' => 0, 294 'billable_this_period' => 0, 295 'quota_exceeded' => false, 275 296 ], 276 297 'db_version' => PMW_DB_VERSION, … … 955 976 public static function is_pageview_events_s2s_active() { 956 977 return (bool) self::get_options_obj()->general->pageview_events_s2s; 978 } 979 980 /** 981 * Check if empty S2S events should be skipped. 982 * 983 * When enabled, server-side events that have no destination platform data 984 * (e.g., no Facebook, TikTok, etc.) will not be sent to the server, 985 * reducing unnecessary load. 986 * 987 * @return bool 988 * @since 1.57.0 989 */ 990 public static function is_skip_empty_s2s_events_active() { 991 return (bool) self::get_options_obj()->general->skip_empty_s2s_events; 992 } 993 994 /** 995 * Check if server-side events should always be sent, even when browser-side pixels haven't loaded. 996 * 997 * When enabled, S2S events are sent to ad platforms independently of browser pixel state. 998 * Browser-side tracking remains unaffected — only server-side events are sent independently. 999 * 1000 * @return bool 1001 * @since 1.57.0 1002 */ 1003 public static function is_always_send_s2s_active() { 1004 return (bool) self::get_options_obj()->general->always_send_s2s; 957 1005 } 958 1006 … … 1383 1431 1384 1432 /** 1433 * Check if purchase events should be routed through the SSP. 1434 * 1435 * Currently returns is_ssp_active() — when SSP is active, purchases go through it. 1436 * Add a toggle here in the future if we want to let users control this separately. 1437 * 1438 * @return bool 1439 * @since 1.57.0 1440 */ 1441 public static function should_process_purchases_via_ssp() { 1442 return self::is_ssp_active(); 1443 } 1444 1445 /** 1446 * Get the SSP purchase events URL. 1447 * 1448 * Uses the SSP API base (supports PMW_SSP_API_BASE override for local dev) 1449 * with the /v1/sync/purchase-events path. 1450 * 1451 * @return string Full URL for the SSP purchase events endpoint. 1452 * @since 1.57.0 1453 */ 1454 public static function get_ssp_purchase_events_url() { 1455 1456 $api_base = defined( 'PMW_SSP_API_BASE' ) ? PMW_SSP_API_BASE : 'https://ssp.sweetcode.cloud'; 1457 1458 return $api_base . '/v1/sync/purchase-events'; 1459 } 1460 1461 /** 1462 * Check if the SSP (Server Side Proxy) is fully active and operational. 1463 * 1464 * Returns true only when all conditions are met: 1465 * - SSP is enabled 1466 * - A sync token is set 1467 * - The proxy domain routing is active 1468 * - Config has been successfully synced 1469 * 1470 * @return bool 1471 * @since 1.57.0 1472 */ 1473 public static function is_ssp_active() { 1474 $options = self::get_options(); 1475 1476 return 1477 !empty($options['ssp']['enabled']) 1478 && !empty($options['ssp']['sync_token']) 1479 && 'active' === ( isset($options['ssp']['routing_status']) ? $options['ssp']['routing_status'] : '' ) 1480 && 'synced' === ( isset($options['ssp']['config_status']) ? $options['ssp']['config_status'] : '' ); 1481 } 1482 1483 /** 1484 * Get the SSP proxy hostname. 1485 * 1486 * @return string The proxy hostname (e.g. "ssp.myshop.com") 1487 * @since 1.57.0 1488 */ 1489 public static function get_ssp_proxy_hostname() { 1490 $options = self::get_options(); 1491 return isset($options['ssp']['proxy_hostname']) ? $options['ssp']['proxy_hostname'] : ''; 1492 } 1493 1494 /** 1495 * Get the SSP events URL for the proxy. 1496 * 1497 * @return string Full URL for the SSP events endpoint (e.g. "https://ssp.myshop.com/v1/pmw-events") 1498 * @since 1.57.0 1499 */ 1500 public static function get_ssp_events_url() { 1501 1502 // Allow overriding for local development: 1503 // define( 'PMW_SSP_EVENTS_URL', 'http://localhost:8787/v1/pmw-events' ); 1504 if ( defined( 'PMW_SSP_EVENTS_URL' ) ) { 1505 return PMW_SSP_EVENTS_URL; 1506 } 1507 1508 $hostname = self::get_ssp_proxy_hostname(); 1509 1510 if (empty($hostname)) { 1511 return ''; 1512 } 1513 1514 return 'https://' . $hostname . '/v1/pmw-events'; 1515 } 1516 1517 /** 1518 * Get the SSP sync token. 1519 * 1520 * @return string 1521 * @since 1.57.0 1522 */ 1523 public static function get_ssp_sync_token() { 1524 $options = self::get_options(); 1525 return isset($options['ssp']['sync_token']) ? $options['ssp']['sync_token'] : ''; 1526 } 1527 1528 /** 1529 * Get the SSP resync callback token. 1530 * 1531 * @return string 1532 * @since 1.57.0 1533 */ 1534 public static function get_ssp_resync_callback_token() { 1535 $options = self::get_options(); 1536 return isset($options['ssp']['resync_callback_token']) ? $options['ssp']['resync_callback_token'] : ''; 1537 } 1538 1539 /** 1540 * Get the SSP pixel verification key. 1541 * 1542 * This key is provisioned by the SSP during domain-config sync 1543 * and used to authenticate proxy requests via X-SSP-Token header. 1544 * 1545 * @return string The 64-char hex verification key, or empty string. 1546 * @since 1.57.0 1547 */ 1548 public static function get_ssp_verification_key() { 1549 $options = self::get_options(); 1550 return isset($options['ssp']['verification_key']) ? $options['ssp']['verification_key'] : ''; 1551 } 1552 1553 /** 1554 * Get the SSP proxy failure behavior setting. 1555 * 1556 * Determines what happens when the SSP proxy is unreachable: 1557 * - 'fallback_to_wc': Fall back to PMW's internal WooCommerce event router (default) 1558 * - 'drop_events': Drop server-side events entirely 1559 * 1560 * @return string 'fallback_to_wc' or 'drop_events' 1561 * @since 1.57.0 1562 */ 1563 public static function get_ssp_proxy_failure_behavior() { 1564 $options = self::get_options(); 1565 $behavior = isset($options['ssp']['proxy_failure_behavior']) ? $options['ssp']['proxy_failure_behavior'] : 'fallback_to_wc'; 1566 1567 // Validate against allowed values 1568 if ( ! in_array( $behavior, [ 'fallback_to_wc', 'drop_events' ], true ) ) { 1569 return 'fallback_to_wc'; 1570 } 1571 1572 return $behavior; 1573 } 1574 1575 /** 1576 * Check if the SSP monthly quota has been exceeded. 1577 * 1578 * When true, PMW should stop sending events to the SSP proxy 1579 * and fall back to WC REST API or drop events per the 1580 * proxy_failure_behavior setting. 1581 * 1582 * @return bool 1583 * @since 1.57.0 1584 */ 1585 public static function is_ssp_quota_exceeded() { 1586 return ! empty( self::get_options()['ssp']['quota_exceeded'] ); 1587 } 1588 1589 /** 1590 * Get or create the SSP session ID for the current visitor. 1591 * 1592 * Uses the WooCommerce session to persist a UUID across page loads. 1593 * The session ID is used for Tier 2 cookie verification. 1594 * 1595 * @return string UUID session ID or empty string if no WC session. 1596 * @since 1.57.0 1597 */ 1598 public static function get_ssp_session_id() { 1599 1600 if ( ! function_exists( 'WC' ) || ! WC()->session ) { 1601 return ''; 1602 } 1603 1604 $session_id = WC()->session->get( 'pmw_ssp_session_id' ); 1605 1606 if ( empty( $session_id ) ) { 1607 $session_id = wp_generate_uuid4(); 1608 WC()->session->set( 'pmw_ssp_session_id', $session_id ); 1609 } 1610 1611 return $session_id; 1612 } 1613 1614 /** 1385 1615 * Get backup retention policy settings. 1386 1616 * This method can be overridden or filtered to customize retention behavior. -
woocommerce-google-adwords-conversion-tracking-tag/trunk/includes/pixels/class-pixel-manager.php
r3451824 r3468312 227 227 add_action( 'woocommerce_mini_cart_contents', [$this, 'woocommerce_mini_cart_contents'] ); 228 228 add_action( 'woocommerce_new_order', [$this, 'pmw_woocommerce_new_order'] ); 229 add_action( 230 'woocommerce_order_status_processing', 231 [$this, 'maybe_increase_conversion_count_for_ratings_on_status'], 232 10, 233 1 234 ); 235 add_action( 236 'woocommerce_order_status_completed', 237 [$this, 'maybe_increase_conversion_count_for_ratings_on_status'], 238 10, 239 1 240 ); 229 241 } 230 242 /** … … 320 332 } 321 333 322 // Extracted the code because the QIT semgrep rule was triggered 334 /** 335 * Permission callback for REST API routes that require the user to have the capability to edit options. 336 * 337 * This function checks if the current user has the 'edit_options' capability, which is typically required 338 * for managing plugin settings. It is used as a permission callback for protected REST API routes. 339 * 340 * Extracted the code because the QIT semgrep rule was triggered 341 * 342 * @return bool Returns true if the current user can edit options, false otherwise. 343 */ 323 344 public function can_current_user_edit_options() { 324 345 return Environment::can_current_user_edit_options(); … … 928 949 $data['tag_id_suppressed'] = Google_Helpers::get_google_tag_id_information()['suppressed']; 929 950 $data['tag_gateway']['measurement_path'] = Options::get_google_tag_gateway_measurement_path(); 930 // Always include proxy_url for JavaScript detection to use as fallback 931 // Server-side detection cannot reliably detect Cloudflare because server-to-server 932 // requests bypass CDN/proxy layers. Let JavaScript detect the handler instead, 933 // since only the browser can correctly detect whether Cloudflare is intercepting. 951 // Pass server-detected handler hint to JavaScript for standalone/wordpress cases. 952 // Server-side detection cannot reliably detect Cloudflare (external) because 953 // server-to-server requests bypass CDN/proxy layers. For external detection, 954 // JavaScript must always check via browser request (Priority 1 in detectGtgHandler). 955 // For standalone/wordpress, the server hint prevents JS from hitting the standalone 956 // proxy health check — eliminating 503/4xx errors when the standalone proxy is 957 // unavailable (e.g., on hosts like WP Engine that block direct PHP file access). 934 958 if ( Options::get_google_tag_gateway_measurement_path() ) { 935 $isolated_url = GTG_Proxy::get_isolated_proxy_url(); 936 if ( $isolated_url ) { 937 $data['tag_gateway']['proxy_url'] = $isolated_url; 938 } 939 // Don't set handler - let JavaScript detect it via browser request 959 $handler = GTG_Config::get_handler(); 960 // Only pass handler for standalone/wordpress — never for external 961 if ( in_array( $handler, ['standalone', 'wordpress'], true ) ) { 962 $data['tag_gateway']['handler'] = $handler; 963 } 964 // Only include proxy_url when the server detected standalone 965 // When handler is 'wordpress', there's no point sending proxy_url 966 // since JS would just get a 503/403 trying to use it 967 if ( 'standalone' === $handler ) { 968 $isolated_url = GTG_Proxy::get_isolated_proxy_url(); 969 if ( $isolated_url ) { 970 $data['tag_gateway']['proxy_url'] = $isolated_url; 971 } 972 } 940 973 } 941 974 $data['tcf_support'] = Options::is_google_tcf_support_active(); … … 1304 1337 1305 1338 private function increase_conversion_count_for_ratings( $order ) { 1306 if ( Shop::can_order_confirmation_be_processed( $order ) ) { 1307 $ratings = get_option( PMW_DB_RATINGS ); 1308 if ( !isset( $ratings['conversions_count'] ) ) { 1309 $ratings['conversions_count'] = 0; 1310 } 1311 $ratings['conversions_count'] = $ratings['conversions_count'] + 1; 1312 update_option( PMW_DB_RATINGS, $ratings ); 1313 } else { 1314 Shop::conversion_pixels_already_fired_html(); 1315 } 1339 $this->maybe_increase_conversion_count_for_ratings( $order, true ); 1340 } 1341 1342 public function maybe_increase_conversion_count_for_ratings_on_status( $order_id ) { 1343 if ( !function_exists( 'wc_get_order' ) ) { 1344 return; 1345 } 1346 $order = wc_get_order( $order_id ); 1347 $this->maybe_increase_conversion_count_for_ratings( $order, false ); 1348 } 1349 1350 private function maybe_increase_conversion_count_for_ratings( $order, $show_duplicate_notice ) { 1351 if ( !$order ) { 1352 return false; 1353 } 1354 if ( $this->rating_notice_already_counted( $order ) ) { 1355 return false; 1356 } 1357 if ( !Shop::can_order_confirmation_be_processed( $order ) ) { 1358 if ( $show_duplicate_notice ) { 1359 Shop::conversion_pixels_already_fired_html(); 1360 } 1361 return false; 1362 } 1363 $ratings = get_option( PMW_DB_RATINGS ); 1364 if ( !is_array( $ratings ) ) { 1365 $ratings = []; 1366 } 1367 if ( !isset( $ratings['conversions_count'] ) ) { 1368 $ratings['conversions_count'] = 0; 1369 } 1370 $ratings['conversions_count'] = $ratings['conversions_count'] + 1; 1371 update_option( PMW_DB_RATINGS, $ratings ); 1372 $this->mark_rating_notice_counted( $order ); 1373 return true; 1374 } 1375 1376 private function rating_notice_already_counted( $order ) { 1377 return $order->meta_exists( '_pmw_rating_notice_counted' ); 1378 } 1379 1380 private function mark_rating_notice_counted( $order ) { 1381 $order->update_meta_data( '_pmw_rating_notice_counted', true ); 1382 $order->save(); 1316 1383 } 1317 1384 … … 1590 1657 'server_2_server' => [ 1591 1658 'active' => Options::server_2_server_enabled(), 1659 'skip_empty_events' => Options::is_skip_empty_s2s_events_active(), 1660 'always_send_s2s' => Options::is_always_send_s2s_active(), 1592 1661 'user_agent_exclude_patterns' => apply_filters( 'pmw_exclude_user_agents_from_server_2_server_events', [] ), 1593 1662 'ip_exclude_list' => apply_filters( 'pmw_exclude_ips_from_server_2_server_events', [] ), … … 1596 1665 'pixels' => Options::pixels_that_require_s2s_pageview_events(), 1597 1666 ], 1667 ], 1668 'ssp' => [ 1669 'active' => Options::is_ssp_active(), 1670 'events_url' => Options::get_ssp_events_url(), 1671 'fallback_to_wc' => Options::get_ssp_proxy_failure_behavior() === 'fallback_to_wc', 1672 'token' => Options::get_ssp_verification_key(), 1673 'session_id' => Options::get_ssp_session_id(), 1674 'quota_exceeded' => Options::is_ssp_quota_exceeded(), 1598 1675 ], 1599 1676 'consent_management' => [ -
woocommerce-google-adwords-conversion-tracking-tag/trunk/includes/pixels/google/class-gtg-config.php
r3451824 r3468312 242 242 // If config file already exists and is not too old, skip 243 243 if ( file_exists( $config_file ) ) { 244 // Check if it's not expired (24 hours) 244 // Check if it's not expired (7 days — matches standalone proxy TTL) 245 // WP-Cron refreshes every 24h, this is a safety net 245 246 $file_age = time() - filemtime( $config_file ); 246 if ( $file_age < DAY_IN_SECONDS ) {247 if ( $file_age < 7 * DAY_IN_SECONDS ) { 247 248 return; 248 249 } -
woocommerce-google-adwords-conversion-tracking-tag/trunk/includes/pixels/google/class-gtg-proxy.php
r3451824 r3468312 105 105 106 106 /** 107 * WP-Cron hook name for periodic config refresh 108 * 109 * @since 1.57.0 110 */ 111 const CRON_HOOK = 'pmw_gtg_config_refresh'; 112 113 /** 107 114 * Initialize the proxy - called from Pixel_Manager 108 115 * … … 122 129 // Ensure isolated proxy file exists and is up to date 123 130 add_action('init', [ __CLASS__, 'ensure_isolated_proxy_file' ], 21); 131 132 // Schedule periodic config refresh via WP-Cron (every 24 hours) 133 // This keeps the standalone proxy config fresh without relying on settings saves or plugin updates 134 self::schedule_config_refresh(); 135 136 // Register the cron callback 137 add_action( self::CRON_HOOK, [ __CLASS__, 'update_proxy_config_cache' ] ); 138 } 139 140 /** 141 * Schedule the periodic config refresh cron event 142 * 143 * Schedules a daily WP-Cron event to refresh the standalone proxy config. 144 * The standalone proxy has a 7-day hard TTL as a safety net, but this cron 145 * keeps the config fresh under normal conditions. 146 * 147 * @return void 148 * @since 1.57.0 149 */ 150 private static function schedule_config_refresh() { 151 if ( ! wp_next_scheduled( self::CRON_HOOK ) ) { 152 wp_schedule_event( time(), 'daily', self::CRON_HOOK ); 153 } 154 } 155 156 /** 157 * Unschedule the periodic config refresh cron event 158 * 159 * Called on plugin deactivation to clean up scheduled events. 160 * 161 * @return void 162 * @since 1.57.0 163 */ 164 public static function unschedule_config_refresh() { 165 $timestamp = wp_next_scheduled( self::CRON_HOOK ); 166 if ( $timestamp ) { 167 wp_unschedule_event( $timestamp, self::CRON_HOOK ); 168 } 124 169 } 125 170 … … 1412 1457 * Get the GTG config directory path in wp-content/uploads 1413 1458 * 1459 * Uses WP_CONTENT_DIR directly instead of wp_upload_dir() to ensure 1460 * a consistent, network-wide path on multisite installations. 1461 * wp_upload_dir() returns site-specific paths on multisite subsites 1462 * (e.g., wp-content/uploads/sites/2/), but the standalone proxy 1463 * only looks in wp-content/uploads/pmw-gtg/. 1464 * 1414 1465 * @return string|false Config directory path or false on failure. 1415 1466 * … … 1417 1468 */ 1418 1469 public static function get_config_directory() { 1419 $upload_dir = wp_upload_dir(); 1420 if ( ! isset( $upload_dir['basedir'] ) ) { 1421 return false; 1422 } 1423 return $upload_dir['basedir'] . '/pmw-gtg'; 1470 if ( ! defined( 'WP_CONTENT_DIR' ) ) { 1471 return false; 1472 } 1473 return WP_CONTENT_DIR . '/uploads/pmw-gtg'; 1424 1474 } 1425 1475 … … 1592 1642 */ 1593 1643 public static function update_proxy_config_cache() { 1594 // Get upload directory for logging path reference 1595 $upload_dir = wp_upload_dir(); 1644 // Get log directory path using WP_CONTENT_DIR for multisite consistency 1645 // wp_upload_dir() returns site-specific paths on multisite, but we need 1646 // a predictable path that the standalone proxy can use 1596 1647 $log_directory = ''; 1597 if ( isset( $upload_dir['basedir']) ) {1598 $log_directory = $upload_dir['basedir'] . '/pmw-logs';1648 if ( defined( 'WP_CONTENT_DIR' ) ) { 1649 $log_directory = WP_CONTENT_DIR . '/uploads/pmw-logs'; 1599 1650 } 1600 1651 … … 1616 1667 } 1617 1668 self::update_site_map( $site_identifier, $config_filename, true ); 1669 1670 // Also clean up fallback config in plugin directory 1671 $fallback_config = __DIR__ . '/pmw-gtg-config/' . $config_filename; 1672 if ( file_exists( $fallback_config ) ) { 1673 @unlink( $fallback_config ); 1674 } 1675 1618 1676 return true; 1619 1677 } … … 1658 1716 'log_level' => $log_level, 1659 1717 'log_directory' => $log_directory, 1718 'wp_content_dir' => defined( 'WP_CONTENT_DIR' ) ? WP_CONTENT_DIR : '', 1660 1719 'updated' => time(), 1661 1720 ]; … … 1707 1766 if ( $result ) { 1708 1767 self::update_site_map( $site_identifier, $config_filename ); 1768 1769 // Also write a fallback copy to the plugin directory 1770 // The standalone proxy can always find __DIR__ reliably, even on hosts 1771 // with non-standard directory layouts (symlinks, WP Engine, etc.) 1772 // This is a redundant fallback — the uploads directory is the primary location. 1773 self::write_fallback_config( $new_config_json, $config_filename, $site_identifier ); 1709 1774 } 1710 1775 1711 1776 return $result; 1712 1777 } 1713 1778 1779 /** 1780 * Write a fallback copy of the config to the plugin directory 1781 * 1782 * The standalone proxy (pmw-gtg-proxy.php) lives in the same directory 1783 * and can always locate __DIR__ reliably, unlike wp-content/uploads/ 1784 * which requires heuristic path discovery that can fail on non-standard hosts. 1785 * 1786 * This fallback config is deleted during plugin updates but gets recreated 1787 * by update_proxy_config_cache() which runs on upgrader_process_complete. 1788 * 1789 * @param string $config_json JSON-encoded config. 1790 * @param string $config_filename Config filename (e.g., "config-1.json"). 1791 * @param string $site_identifier Site identifier for the site map. 1792 * @return bool True on success, false on failure. 1793 * 1794 * @since 1.57.0 1795 */ 1796 private static function write_fallback_config( $config_json, $config_filename, $site_identifier ) { 1797 $fallback_dir = __DIR__ . '/pmw-gtg-config'; 1798 1799 // Create fallback directory if it doesn't exist 1800 if ( ! file_exists( $fallback_dir ) ) { 1801 if ( ! wp_mkdir_p( $fallback_dir ) ) { 1802 return false; 1803 } 1804 1805 // Security files to prevent direct access to config 1806 $htaccess_file = $fallback_dir . '/.htaccess'; 1807 if ( ! file_exists( $htaccess_file ) ) { 1808 file_put_contents( $htaccess_file, "deny from all\n", LOCK_EX ); 1809 } 1810 1811 $index_file = $fallback_dir . '/index.php'; 1812 if ( ! file_exists( $index_file ) ) { 1813 file_put_contents( $index_file, "<?php\n// Silence is golden.\n", LOCK_EX ); 1814 } 1815 } 1816 1817 // Write config file 1818 $fallback_config_file = $fallback_dir . '/' . $config_filename; 1819 $temp_file = $fallback_config_file . '.tmp.' . uniqid(); 1820 $result = false; 1821 1822 if ( false !== file_put_contents( $temp_file, $config_json, LOCK_EX ) ) { 1823 clearstatcache( true, $temp_file ); 1824 if ( file_exists( $temp_file ) ) { 1825 // phpcs:ignore WordPress.PHP.NoSilencedErrors.Discouraged -- Silencing rename errors to prevent warnings in edge cases 1826 $result = @rename( $temp_file, $fallback_config_file ); 1827 } 1828 clearstatcache( true, $temp_file ); 1829 if ( ! $result && file_exists( $temp_file ) ) { 1830 @unlink( $temp_file ); 1831 } 1832 } 1833 1834 // Write fallback site map 1835 if ( $result ) { 1836 $site_map_file = $fallback_dir . '/site-map.json'; 1837 $site_map = []; 1838 1839 if ( file_exists( $site_map_file ) ) { 1840 $content = file_get_contents( $site_map_file ); 1841 if ( false !== $content ) { 1842 $decoded = json_decode( $content, true ); 1843 if ( is_array( $decoded ) ) { 1844 $site_map = $decoded; 1845 } 1846 } 1847 } 1848 1849 $site_map[ $site_identifier ] = $config_filename; 1850 $site_map_json = wp_json_encode( $site_map, JSON_PRETTY_PRINT ); 1851 $temp_file = $site_map_file . '.tmp.' . uniqid(); 1852 1853 if ( false !== file_put_contents( $temp_file, $site_map_json, LOCK_EX ) ) { 1854 clearstatcache( true, $temp_file ); 1855 if ( file_exists( $temp_file ) ) { 1856 // phpcs:ignore WordPress.PHP.NoSilencedErrors.Discouraged 1857 @rename( $temp_file, $site_map_file ); 1858 } 1859 clearstatcache( true, $temp_file ); 1860 if ( file_exists( $temp_file ) ) { 1861 @unlink( $temp_file ); 1862 } 1863 } 1864 } 1865 1866 return $result; 1867 } 1868 1714 1869 /** 1715 1870 * Check if the isolated proxy file exists -
woocommerce-google-adwords-conversion-tracking-tag/trunk/includes/pixels/google/pmw-gtg-proxy.php
r3451824 r3468312 163 163 } 164 164 165 // Method 4: Fallback to plugin directory config 166 // The plugin writes a redundant config copy next to this proxy file. 167 // __DIR__ is always reliable, regardless of hosting configuration 168 // (symlinks, WP Engine, non-standard layouts, etc.) 169 $fallback_dir = __DIR__ . '/pmw-gtg-config'; 170 if ( is_dir( $fallback_dir ) ) { 171 return $fallback_dir; 172 } 173 165 174 return false; 166 175 } … … 289 298 } 290 299 291 // Check config age (24 hours max) 292 if ( ( time() - filemtime( $config_file ) ) >= 86400 ) { 300 // Check config age (7 days max — safety net for when WP-Cron fails) 301 // WP-Cron refreshes the config every 24 hours under normal conditions. 302 // This extended TTL prevents false 503s on hosts where cron is unreliable. 303 if ( ( time() - filemtime( $config_file ) ) >= 604800 ) { 293 304 pmw_gtg_send_fallback_response( 'config-expired' ); 294 305 } … … 306 317 307 318 // Config is valid - log if enabled 308 if ( ! empty( $config['logging_enabled'] ) && ! empty( $config['log_directory'] )) {319 if ( ! empty( $config['logging_enabled'] ) ) { 309 320 $log_level = isset( $config['log_level'] ) ? $config['log_level'] : 'error'; 310 321 $level_priority = [ 'debug' => 7, 'info' => 6, 'notice' => 5, 'warning' => 4, 'error' => 3 ]; … … 312 323 313 324 if ( 6 <= $configured_priority ) { // info level = 6 314 $wp_content = dirname( dirname( $config['log_directory'] ) ); 315 $debug_log = $wp_content . '/debug.log'; 316 $timestamp = gmdate( 'd-M-Y H:i:s \U\T\C' ); 317 $log_entry = "[{$timestamp}] pmw [info] [GTG-Proxy-Standalone] Health check request received - proxy functional\n"; 318 @file_put_contents( $debug_log, $log_entry, FILE_APPEND | LOCK_EX ); 325 // Use wp_content_dir from config (multisite-safe), fallback to log_directory derivation 326 $debug_log = null; 327 if ( ! empty( $config['wp_content_dir'] ) ) { 328 $debug_log = $config['wp_content_dir'] . '/debug.log'; 329 } elseif ( ! empty( $config['log_directory'] ) ) { 330 $debug_log = dirname( dirname( $config['log_directory'] ) ) . '/debug.log'; 331 } 332 if ( $debug_log ) { 333 $timestamp = gmdate( 'd-M-Y H:i:s \U\T\C' ); 334 $log_entry = "[{$timestamp}] pmw [info] [GTG-Proxy-Standalone] Health check request received - proxy functional\n"; 335 @file_put_contents( $debug_log, $log_entry, FILE_APPEND | LOCK_EX ); 336 } 319 337 } 320 338 } … … 356 374 357 375 /** 358 * Cache file max age in seconds (1 hour) 376 * Cache file max age in seconds (7 days) 377 * 378 * WP-Cron refreshes the config every 24 hours under normal conditions. 379 * This extended TTL is a safety net for hosts where cron is unreliable. 359 380 * 360 381 * @var int 361 382 */ 362 const CACHE_MAX_AGE = 86400;383 const CACHE_MAX_AGE = 604800; 363 384 364 385 /** … … 486 507 // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized -- Sanitized by sanitize_geo method 487 508 $geo = isset( $_GET['geo'] ) ? self::sanitize_geo( $_GET['geo'] ) : ''; 488 // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized -- Path is validated against allowed patterns489 $s_path = isset( $_GET['s'] ) ? $_GET['s']: '';490 // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized -- Mpath is used in URL construction only491 $mpath = isset( $_GET['mpath'] ) ? $_GET['mpath']: '';509 // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized -- Sanitized by sanitize_s_path method 510 $s_path = isset( $_GET['s'] ) ? self::sanitize_s_path( $_GET['s'] ) : ''; 511 // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized -- Sanitized by sanitize_mpath method 512 $mpath = isset( $_GET['mpath'] ) ? self::sanitize_mpath( $_GET['mpath'] ) : ''; 492 513 493 514 // Build destination path … … 626 647 // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized -- Sanitized by sanitize_tag_id method 627 648 $tag_id = isset( $_GET['id'] ) ? self::sanitize_tag_id( $_GET['id'] ) : ''; 628 // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized -- Path is validated against allowed patterns629 $s_path = isset( $_GET['s'] ) ? $_GET['s']: '';649 // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized -- Sanitized by sanitize_s_path method 650 $s_path = isset( $_GET['s'] ) ? self::sanitize_s_path( $_GET['s'] ) : ''; 630 651 // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized -- Sanitized by sanitize_geo method 631 652 $geo = isset( $_GET['geo'] ) ? self::sanitize_geo( $_GET['geo'] ) : ''; 632 // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized -- Mpath is used in URL construction only633 $mpath = isset( $_GET['mpath'] ) ? $_GET['mpath']: '';653 // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized -- Sanitized by sanitize_mpath method 654 $mpath = isset( $_GET['mpath'] ) ? self::sanitize_mpath( $_GET['mpath'] ) : ''; 634 655 635 656 self::log( … … 757 778 } 758 779 759 // Step 5: Check config age ( 24 hours max)780 // Step 5: Check config age (7 days max — safety net for WP-Cron failures) 760 781 if ( ( time() - filemtime( $cache_file ) ) >= self::CACHE_MAX_AGE ) { 761 782 pmw_gtg_send_fallback_response( 'config-expired' ); … … 778 799 } 779 800 801 // Step 8: Validate config field contents to prevent abuse via compromised config files 802 if ( ! self::validate_config( $config ) ) { 803 pmw_gtg_send_fallback_response( 'config-validation-failed' ); 804 } 805 780 806 self::$config = $config; 781 807 return $config; 808 } 809 810 /** 811 * Validate config field contents 812 * 813 * Ensures config values are safe before the proxy acts on them. 814 * Prevents a compromised config file from redirecting traffic or 815 * causing writes to arbitrary locations. 816 * 817 * @param array $config The decoded config array. 818 * @return bool True if config is valid, false otherwise. 819 * 820 * @since 1.56.1 821 */ 822 private static function validate_config( $config ) { 823 // Validate measurement_path: must start with /, only safe chars, max 64 chars 824 if ( ! empty( $config['measurement_path'] ) ) { 825 $mp = $config['measurement_path']; 826 if ( '/' !== $mp[0] || strlen( $mp ) > 64 || ! preg_match( '/^\/[a-zA-Z0-9\/_-]+$/', $mp ) ) { 827 return false; 828 } 829 } 830 831 // Validate proxy_url: must be a valid URL, scheme must be http or https 832 if ( ! empty( $config['proxy_url'] ) ) { 833 if ( ! filter_var( $config['proxy_url'], FILTER_VALIDATE_URL ) ) { 834 return false; 835 } 836 $proxy_parsed = parse_url( $config['proxy_url'] ); 837 if ( ! $proxy_parsed || ! isset( $proxy_parsed['scheme'] ) || ! in_array( $proxy_parsed['scheme'], [ 'http', 'https' ], true ) ) { 838 return false; 839 } 840 // proxy_url host must match site_url host to prevent redirect to external domains 841 if ( ! empty( $config['site_url'] ) ) { 842 $site_parsed = parse_url( $config['site_url'] ); 843 if ( $site_parsed && isset( $site_parsed['host'], $proxy_parsed['host'] ) ) { 844 if ( strtolower( $proxy_parsed['host'] ) !== strtolower( $site_parsed['host'] ) ) { 845 return false; 846 } 847 } 848 } 849 } 850 851 // Validate site_url: must be a valid URL with http(s) scheme 852 if ( ! empty( $config['site_url'] ) ) { 853 if ( ! filter_var( $config['site_url'], FILTER_VALIDATE_URL ) ) { 854 return false; 855 } 856 $site_scheme = parse_url( $config['site_url'], PHP_URL_SCHEME ); 857 if ( ! in_array( $site_scheme, [ 'http', 'https' ], true ) ) { 858 return false; 859 } 860 } 861 862 // Validate log_directory: if present, must be absolute path without traversal 863 if ( ! empty( $config['log_directory'] ) ) { 864 $log_dir = $config['log_directory']; 865 if ( '/' !== $log_dir[0] || false !== strpos( $log_dir, '..' ) ) { 866 return false; 867 } 868 } 869 870 // Validate log_level: must be a known level 871 if ( ! empty( $config['log_level'] ) ) { 872 if ( ! isset( self::LOG_LEVELS[ $config['log_level'] ] ) ) { 873 return false; 874 } 875 } 876 877 return true; 782 878 } 783 879 … … 837 933 838 934 // Try to find WordPress debug.log 839 // The log_directory in config points to wp-content/uploads/pmw-logs/840 // WordPress debug.log is at wp-content/debug.log935 // Use wp_content_dir from config (most reliable, especially for multisite) 936 // Fallback to deriving from log_directory for backwards compatibility 841 937 $log_file = null; 842 if ( ! empty( $config['log_directory'] ) ) { 843 // Navigate from pmw-logs to wp-content/debug.log 938 if ( ! empty( $config['wp_content_dir'] ) ) { 939 $debug_log = $config['wp_content_dir'] . '/debug.log'; 940 if ( is_writable( dirname( $debug_log ) ) ) { 941 $log_file = $debug_log; 942 } 943 } elseif ( ! empty( $config['log_directory'] ) ) { 944 // Legacy fallback: navigate from pmw-logs to wp-content/debug.log 844 945 // /path/wp-content/uploads/pmw-logs/ -> /path/wp-content/debug.log 845 946 $wp_content = dirname( dirname( $config['log_directory'] ) ); … … 949 1050 } 950 1051 return $geo; 1052 } 1053 1054 /** 1055 * Sanitize the s (path) parameter 1056 * 1057 * Strips null bytes, non-printable characters, and limits length. 1058 * Defense-in-depth: the FPS URL validation (is_valid_fps_url) is the 1059 * primary gate, but sanitizing inputs prevents unexpected behavior. 1060 * 1061 * @param string $s_path Raw path parameter. 1062 * @return string Sanitized path parameter. 1063 * 1064 * @since 1.56.1 1065 */ 1066 private static function sanitize_s_path( $s_path ) { 1067 // Remove null bytes 1068 $s_path = str_replace( chr( 0 ), '', $s_path ); 1069 // Remove non-printable characters 1070 $s_path = preg_replace( '/[\x00-\x1F\x7F]/', '', $s_path ); 1071 // Limit length to 2048 characters 1072 if ( strlen( $s_path ) > 2048 ) { 1073 $s_path = substr( $s_path, 0, 2048 ); 1074 } 1075 return $s_path; 1076 } 1077 1078 /** 1079 * Sanitize the mpath (measurement path) parameter 1080 * 1081 * Restricts to alphanumeric characters, hyphens, and underscores only, 1082 * matching the measurement path format. Limits to 64 characters. 1083 * 1084 * @param string $mpath Raw mpath parameter. 1085 * @return string Sanitized mpath parameter. 1086 * 1087 * @since 1.56.1 1088 */ 1089 private static function sanitize_mpath( $mpath ) { 1090 // Strip everything except safe characters 1091 $mpath = preg_replace( '/[^A-Za-z0-9_-]/', '', $mpath ); 1092 // Limit length to 64 characters 1093 if ( strlen( $mpath ) > 64 ) { 1094 $mpath = substr( $mpath, 0, 64 ); 1095 } 1096 return $mpath; 951 1097 } 952 1098 -
woocommerce-google-adwords-conversion-tracking-tag/trunk/js/admin/pmw-admin.p1.min.js
r3447088 r3468312 1 /*! Copyright 2025 SweetCode. All rights reserved. */(()=>{var e={ 348(){window.pmwAdminScriptLoaded=!0},605(){jQuery(function(){if("pmw"!==pmwGetPageId())return;let e=[],t={};if(jQuery(".section").closest("tr").hide(),jQuery(".section").each(function(){e.push({slug:jQuery(this).data("sectionSlug"),title:jQuery(this).data("sectionTitle"),badgeCount:jQuery(this).data("badgeCount")||0})}),jQuery(".subsection").each(function(){t[jQuery(this).data("sectionSlug")]=t[jQuery(this).data("sectionSlug")]||[],t[jQuery(this).data("sectionSlug")].push({title:jQuery(this).data("subsectionTitle"),slug:jQuery(this).data("subsectionSlug")})}),e.forEach(function(e){let t=e.badgeCount>0?'<span class="pmw-tab-badge">'+e.badgeCount+"</span>":"";jQuery(".nav-tab-wrapper").append('<a href="#" class="nav-tab" data-section-slug="'+e.slug+'">'+e.title+t+"</a>")}),jQuery(".nav-tab-wrapper").after(pmwCreateSubtabUlHtml(t)),jQuery(".nav-tab-wrapper a").on("click",function(n){n.preventDefault(),jQuery(this).addClass("nav-tab-active").siblings().removeClass("nav-tab-active");let a=jQuery(this).data("section-slug");pmwToggleSections(a,e),a in t&&jQuery("ul[data-section-slug="+a+"]").children(":first").trigger("click")}),jQuery(".pmw-subnav-li").on("click",function(e){e.preventDefault(),e.stopPropagation(),jQuery(this).addClass("pmw-subnav-li-active").removeClass("pmw-subnav-li-inactive").siblings().addClass("pmw-subnav-li-inactive").removeClass("pmw-subnav-li-active"),pmwToggleSubsection(jQuery(this).parent().data("section-slug"),jQuery(this).data("subsection-slug"))}),pmwGetSectionParams()){let e=pmwGetSectionParams();jQuery("a[data-section-slug="+e.section+"]").trigger("click"),!1!==e.subsection&&jQuery("ul[data-section-slug="+e.section+"]").children("[data-subsection-slug="+e.subsection+"]").trigger("click")}else jQuery("a[data-section-slug="+e[0].slug+"]").trigger("click")}),pmwCreateSubtabUlHtml=e=>{let t=Object.keys(e),n="";return t.forEach(function(t){n+='<ul class="pmw-subnav-tabs" data-section-slug="'+t+'">',e[t].forEach(function(e){n+='<li class="pmw-subnav-li pmw-subnav-li-inactive" style="cursor: pointer;" data-subsection-slug="'+e.slug+'">'+e.title+"</li>"}),n+="</ul>"}),n},pmwGetSectionParams=()=>{const e=window.location.search,t=new URLSearchParams(e);return!!t.get("section")&&{section:t.get("section"),subsection:t.get("subsection")}},pmwToggleSections=(e,t)=>{jQuery("#pmw_settings_form > h2").nextUntil(".submit").andSelf().hide(),jQuery(".pmw-subnav-tabs").hide(),jQuery(".pmw-subnav-tabs[data-section-slug="+e+"]").show();let n=t.findIndex(t=>t.slug===e);jQuery("div[data-section-slug="+e+"]").closest("table").prevAll("h2:first").next().nextUntil("h2, .submit").andSelf().show(),pmwSetUrl(t[n].slug)},pmwToggleSubsection=(e,t)=>{jQuery("#pmw_settings_form > h2").nextUntil(".submit").andSelf().hide(),jQuery("[data-section-slug="+e+"][data-subsection-slug="+t+"]").closest("tr").siblings().andSelf().hide(),jQuery("[data-section-slug="+e+"][data-subsection-slug="+t+"]").closest("table").show(),jQuery("[data-section-slug="+e+"][data-subsection-slug="+t+"]").closest("tr").nextUntil(jQuery("[data-section-slug="+e+"][data-subsection-slug]").closest("tr")).show(),pmwSetUrl(e,t)},pmwSetUrl=(e,t="")=>{const n=window.location.search,a=new URLSearchParams(n);a.delete("section"),a.delete("subsection");let s="section="+e;s+=t?"&subsection="+t:"",history.pushState("","pmw"+e,document.location.pathname+"?page=pmw&"+s),jQuery('input[name ="_wp_http_referer"]').val(pmwGetAdminPath()+"?page=pmw&"+s+"&settings-updated=true")},pmwGetAdminPath=()=>new URL(jQuery("#wp-admin-canonical").attr("href")).pathname,pmwGetPageId=()=>{const e=window.location.search;return new URLSearchParams(e).get("page")},jQuery(document).on("click","[data-section-slug]",function(){["opportunities","diagnostics","support"].includes(jQuery(this).data("section-slug"))?jQuery(".submit").hide():jQuery(".submit").show()}),jQuery(document).on("click",".advanced-section-link",e=>{e.preventDefault();let t=jQuery(e.currentTarget).data("as-section"),n=jQuery(e.currentTarget).data("as-subsection");jQuery(`a[data-section-slug=${t}]`).trigger("click"),jQuery(`ul[data-section-slug=${t}]`).children(`[data-subsection-slug=${n}]`).trigger("click")})},992(){jQuery(function(){jQuery("#debug-info-button").on("click",()=>{const e=jQuery("#debug-info-textarea")[0];e.select(),e.setSelectionRange(0,99999),pmw.copyTextToClipboard(jQuery("#debug-info-textarea").val());const t=jQuery("#debug-info-success");t.fadeIn(200),setTimeout(()=>t.fadeOut(200),3e3)}),jQuery("#pmw-pro-version-demo").on("click",function(){jQuery("#submit").trigger("click")}),document.getElementById("json-settings-file-input")&&document.getElementById("json-settings-file-input").addEventListener("change",pmw.readSettingsFile,!1),document.getElementById("ga4-data-api-credentials-upload-button")&&document.getElementById("ga4-data-api-credentials-upload-button").addEventListener("change",pmw.readGa4DataApiCredentials,!1),document.getElementById("ga4-data-api-credentials-delete-button")&&document.getElementById("ga4-data-api-credentials-delete-button").addEventListener("click",()=>{pmw.saveGa4DataApiCredentialsToDb({})},!1),jQuery("#wgact_download_logs_zip").on("click",function(e){if(e.preventDefault(),jQuery(this).prop("disabled"))return;const t=jQuery(this).data("source"),n=jQuery(this),a=n.text();n.prop("disabled",!0).text("Downloading..."),fetch(pmwAdminApi.root+"pmw/v1/logs/download",{method:"POST",headers:{"Content-Type":"application/x-www-form-urlencoded","X-WP-Nonce":pmwAdminApi.nonce},body:new URLSearchParams({source:t}),credentials:"same-origin"}).then(e=>{if(!e.ok)throw new Error(`HTTP error! status: ${e.status}`);return e.blob()}).then(e=>{const t=window.URL.createObjectURL(e),s=document.createElement("a");s.href=t,s.download="pmw-logs-"+(new Date).toISOString().slice(0,19).replace(/:/g,"-")+".zip",document.body.appendChild(s),s.click(),window.URL.revokeObjectURL(t),document.body.removeChild(s),n.prop("disabled",!1).text(a)}).catch(e=>{console.error("Download error:",e),n.prop("disabled",!1).text(a),alert("Error downloading log files. Please try again.")})})}),function(e){e.saveSettingsToDisk=()=>{let t=document.getElementById("export-settings-json").value,n="unknown";try{let e=JSON.parse(t);e.timestamp&&(n=e.timestamp)}catch(e){console.warn("Could not extract timestamp from settings:",e)}t=t.replace(/\n/g,"\r\n");let a=new Blob([t],{type:"text/plain"}),s=document.createElement("a");s.download="pixel-manager-settings_"+n+"_"+e.getDateTimeFromTimestamp(n)+".json",s.href=window.URL.createObjectURL(a),s.target="_blank",s.style.display="none",document.body.appendChild(s),s.click(),document.body.removeChild(s)},e.getDateTimeFromTimestamp=t=>{if("unknown"===t||!t||isNaN(t))return e.getCurrentDateForFileName();let n=new Date(1e3*t);if(pmwAdminApi&&pmwAdminApi.timezone&&"number"==typeof pmwAdminApi.timezone.offset){let e=60*pmwAdminApi.timezone.offset*60*1e3;return n=new Date(n.getTime()+e),n.getUTCFullYear()+"."+("0"+(n.getUTCMonth()+1)).slice(-2)+"."+("0"+n.getUTCDate()).slice(-2)+"_"+("0"+n.getUTCHours()).slice(-2)+"-"+("0"+n.getUTCMinutes()).slice(-2)+"-"+("0"+n.getUTCSeconds()).slice(-2)}return n.getFullYear()+"."+("0"+(n.getMonth()+1)).slice(-2)+"."+("0"+n.getDate()).slice(-2)+"_"+("0"+n.getHours()).slice(-2)+"-"+("0"+n.getMinutes()).slice(-2)+"-"+("0"+n.getSeconds()).slice(-2)},e.getCurrentDateForFileName=()=>{let e=new Date;if(pmwAdminApi&&pmwAdminApi.timezone&&"number"==typeof pmwAdminApi.timezone.offset){let t=60*pmwAdminApi.timezone.offset*60*1e3;return e=new Date(e.getTime()+t),e.getUTCFullYear()+"."+("0"+(e.getUTCMonth()+1)).slice(-2)+"."+("0"+e.getUTCDate()).slice(-2)+"_"+("0"+e.getUTCHours()).slice(-2)+"-"+("0"+e.getUTCMinutes()).slice(-2)+"-"+("0"+e.getUTCSeconds()).slice(-2)}return e.getFullYear()+"."+("0"+(e.getMonth()+1)).slice(-2)+"."+("0"+e.getDate()).slice(-2)+"_"+("0"+e.getHours()).slice(-2)+"-"+("0"+e.getMinutes()).slice(-2)+"-"+("0"+e.getSeconds()).slice(-2)},e.readSettingsFile=t=>{let n=t.target.files[0];if(!n)return;let a=new FileReader;a.onload=function(t){try{JSON.parse(t.target.result)}catch(e){return document.getElementById("settings-upload-status-error").style.display="block",void(document.getElementById("settings-upload-status-error-message").innerHTML="Invalid JSON file.")}let n=JSON.parse(t.target.result);e.saveImportedSettingsToDb(n)},a.readAsText(n)},e.saveImportedSettingsToDb=e=>{fetch(pmwAdminApi.root+"pmw/v1/settings/",{method:"POST",credentials:"same-origin",headers:{"Content-Type":"application/json","X-WP-Nonce":pmwAdminApi.nonce},body:JSON.stringify(e)}).then(e=>e.json()).then(async e=>{e.success?(console.log(e),document.getElementById("settings-upload-status-success").style.display="block",await new Promise(e=>setTimeout(e,1e3)),window.location.reload()):(console.log(e),document.getElementById("settings-upload-status-error").style.display="block")}).catch(e=>{console.error(e),document.getElementById("settings-upload-status-error").style.display="block"})},e.restoreBackup=e=>{console.log("restoreBackup() - timestamp: ",e),fetch(pmwAdminApi.root+"pmw/v1/options-backup/"+e+"/restore",{method:"POST",credentials:"same-origin",headers:{"Content-Type":"application/json","X-WP-Nonce":pmwAdminApi.nonce}}).then(e=>e.json()).then(async e=>{e?.data?.message&&console.log("restoreBackup() - message: ",e.data.message),e.success?window.location.reload():alert(e.data.message)}).catch(e=>{console.error(e),alert(e.message)})},e.readGa4DataApiCredentials=t=>{let n=t.target.files[0];if(!n)return;let a=new FileReader;a.onload=function(t){try{JSON.parse(t.target.result)}catch(e){return document.getElementById("ga4-api-credentials-upload-status-error").style.display="block",void(document.getElementById("ga4-api-credentials-upload-status-error-message").innerHTML="Invalid JSON file.")}let n=JSON.parse(t.target.result);e.saveGa4DataApiCredentialsToDb(n)},a.readAsText(n)},e.deleteGa4DataApiCredentials=t=>{e.saveGa4DataApiCredentialsToDb({})},e.saveGa4DataApiCredentialsToDb=e=>{fetch(pmwAdminApi.root+"pmw/v1/ga4/data-api/credentials",{method:"POST",credentials:"same-origin",headers:{"Content-Type":"application/json","X-WP-Nonce":pmwAdminApi.nonce},body:JSON.stringify(e)}).then(e=>e.json()).then(async e=>{e.success?(console.log(e),document.getElementById("ga4-api-credentials-upload-status-success").style.display="block",window.location.reload()):(console.log(e),document.getElementById("ga4-api-credentials-upload-status-error").style.display="block",document.getElementById("ga4-api-credentials-upload-status-error-message").innerHTML="Error message: "+e.data.message)}).catch(e=>{console.error(e),document.getElementById("ga4-api-credentials-upload-status-error").style.display="block"})},e.getAiBotUrl=()=>{if(pmw_cody?.url)return pmw_cody.url},e.loadAiChatWindow=()=>{const t=document.getElementById("pmw-chatbot-panel"),n=document.getElementById("pmw-chatbot-iframe");t&&n?(n.src=e.getAiBotUrl(),document.body.classList.add("pmw-chatbot-open"),t.classList.add("pmw-chatbot-panel-open")):console.error("Chatbot panel elements not found")},e.closeChatbot=()=>{const e=document.getElementById("pmw-chatbot-panel");e&&(e.classList.remove("pmw-chatbot-panel-open"),document.body.classList.remove("pmw-chatbot-open"))},e.codyAvailable=()=>!(void 0===window.pmw_cody||!window.pmw_cody?.available),e.ltvRecalculation=e=>{const t=e=>{let t=document.getElementsByClassName("ltv-message");for(let e=0;e<t.length;e++)t[e].style.display="none";document.getElementById("ltv-message-error").style.display="block",document.getElementById("ltv-message-error-text").innerHTML=e},n=()=>{let e=document.getElementsByClassName("ltv-message");for(let t=0;t<e.length;t++)e[t].style.display="none";document.getElementById("ltv-message-error").style.display="none"};fetch(pmwAdminApi.root+"pmw/v1/ltv/",{method:"POST",credentials:"same-origin",headers:{"Content-Type":"application/json","X-WP-Nonce":pmwAdminApi.nonce},body:JSON.stringify({action:e.target.dataset.action})}).then(e=>e.json()).then(e=>{e.success?(console.log(e),e.data.status.is_scheduled&&(n(),(()=>{let e=document.getElementsByClassName("ltv-button-text");for(let t=0;t<e.length;t++)e[t].style.display="none";document.getElementById("ltv-instant-recalculation-button-text").style.display="block"})(),document.getElementById("ltv-schedule-recalculation-confirmation-message").style.display="block"),e.data.status.is_running&&(document.getElementById("wgact_ltv_recalculation").disabled=!0,n(),document.getElementById("ltv-running-recalculation-confirmation-message").style.display="block"),e.data.status.is_running||e.data.status.is_scheduled||t(e.data.message)):(console.error(e),t(e.data.message))}).catch(e=>{console.error(e),t(e)})},e.copyTextToClipboard=e=>{navigator.clipboard.writeText(e).catch(e=>{console.error("Failed to copy: ",e)})}}(window.pmw=window.pmw||{},jQuery),document.addEventListener("DOMContentLoaded",()=>{if(pmw.codyAvailable()){const e=document.getElementById("pmw-chatbot-widget");e&&(e.style.display="block");const t=document.getElementById("pmw-chat-li");t&&(t.style.display="list-item");const n=document.getElementById("pmw-chatbot-toggle"),a=document.getElementById("pmw-chatbot-close");n&&n.addEventListener("click",e=>{e.preventDefault(),pmw.loadAiChatWindow()}),a&&a.addEventListener("click",e=>{e.preventDefault(),pmw.closeChatbot()}),document.addEventListener("keydown",e=>{"Escape"===e.key&&pmw.closeChatbot()})}else console.log("DOMContentLoaded - chatbot is not available")},!0),jQuery(()=>{document.querySelector("#wgact_ltv_recalculation")&&document.querySelector("#wgact_ltv_recalculation").addEventListener("click",e=>{e.preventDefault(),pmw.ltvRecalculation(e)}),document.querySelector("#pmw_stop_ltv_calculation")&&document.querySelector("#pmw_stop_ltv_calculation").addEventListener("click",e=>{e.preventDefault(),pmw.ltvRecalculation(e)}),jQuery(()=>{jQuery(document).on("click",".pmw-restore-backup-button",function(e){e.preventDefault();const t=jQuery(this).data("timestamp");t&&pmw.restoreBackup(t)})})}),jQuery(()=>{document.querySelector("#wgact_copy_log_file_links")&&document.querySelector("#wgact_copy_log_file_links").addEventListener("click",e=>{e.preventDefault();const t=JSON.parse(e.target.dataset.links);let n="";for(let e=0,a=t.length;e<a;e++)n+=t[e]+"\n";pmw.copyTextToClipboard(n);let a=document.getElementById("wgact_copy_log_file_links");a.style.width=getComputedStyle(a).width;const s=a.innerHTML;a.innerHTML=e.target.dataset.textCopied,setTimeout(function(){a.innerHTML=s},3e3)})}),jQuery(()=>{jQuery(document).on("keydown","input, textarea, select",function(e){if("Enter"===e.key&&!e.shiftKey&&!e.ctrlKey&&!e.altKey){const t=jQuery(e.target);if(t.is("input")&&t.closest("form").length>0){const n=t.closest("form")[0],a=jQuery(n).find("#submit");a.length>0&&(e.preventDefault(),a.click())}}})})}},t={};function n(a){var s=t[a];if(void 0!==s)return s.exports;var o=t[a]={exports:{}};return e[a](o,o.exports,n),o.exports}n(992),n(348),n(605)})();1 /*! Copyright 2025 SweetCode. All rights reserved. */(()=>{var e={176(){jQuery(function(e){const t=e("#pmw_settings_form");function s(t,s){const n=e('<div class="notice '+("success"===t?"notice-success":"notice-error")+' is-dismissible pmw-save-notice" style="margin: 10px 0;"><p>'+s+'</p><button type="button" class="notice-dismiss"><span class="screen-reader-text">Dismiss this notice.</span></button></div>');e(".nav-tab-wrapper").after(n),n.find(".notice-dismiss").on("click",function(){n.fadeOut(200,function(){e(this).remove()})}),"success"===t&&setTimeout(function(){n.fadeOut(400,function(){e(this).remove()})},5e3),e("html, body").animate({scrollTop:n.offset().top-50},300)}t.length&&t.on("submit",function(n){n.preventDefault();const a=t.find("#submit"),o=a.val();a.prop("disabled",!0).val("Saving…"),e(".pmw-save-notice").remove();const i=t.serialize();fetch(pmwAdminApi.root+"pmw/v1/options/save",{method:"POST",headers:{"Content-Type":"application/x-www-form-urlencoded","X-WP-Nonce":pmwAdminApi.nonce},body:i}).then(e=>e.json()).then(e=>{if(!e.success||e.errors&&0!==e.errors.length){let t=e.message||"Settings saved with errors.";e.errors&&e.errors.length>0&&(t+='<ul style="margin: 4px 0 0 16px; list-style: disc;">',e.errors.forEach(function(e){t+="<li>"+e+"</li>"}),t+="</ul>"),s("error",t)}else window.location.reload()}).catch(e=>{console.error("PMW settings save error:",e),s("error","An unexpected error occurred while saving settings. Please try again.")}).finally(()=>{a.prop("disabled",!1).val(o)})})})},348(){window.pmwAdminScriptLoaded=!0},605(){jQuery(function(){if("pmw"!==pmwGetPageId())return;let e=[],t={};if(jQuery(".section").closest("tr").hide(),jQuery(".section").each(function(){e.push({slug:jQuery(this).data("sectionSlug"),title:jQuery(this).data("sectionTitle"),badgeCount:jQuery(this).data("badgeCount")||0,priority:parseInt(jQuery(this).data("priority"),10)||50,showSaveButton:jQuery(this).data("showSaveButton")})}),e.sort(function(e,t){return e.priority-t.priority}),jQuery(".subsection").each(function(){t[jQuery(this).data("sectionSlug")]=t[jQuery(this).data("sectionSlug")]||[],t[jQuery(this).data("sectionSlug")].push({title:jQuery(this).data("subsectionTitle"),slug:jQuery(this).data("subsectionSlug")})}),e.forEach(function(e){let t=e.badgeCount>0?'<span class="pmw-tab-badge">'+e.badgeCount+"</span>":"";jQuery(".nav-tab-wrapper").append('<a href="#" class="nav-tab" data-section-slug="'+e.slug+'">'+e.title+t+"</a>")}),jQuery(".nav-tab-wrapper").after(pmwCreateSubtabUlHtml(t)),jQuery(".nav-tab-wrapper a").on("click",function(s){s.preventDefault(),jQuery(this).addClass("nav-tab-active").siblings().removeClass("nav-tab-active");let n=jQuery(this).data("section-slug");pmwToggleSections(n,e),n in t&&jQuery("ul[data-section-slug="+n+"]").children(":first").trigger("click")}),jQuery(".pmw-subnav-li").on("click",function(e){e.preventDefault(),e.stopPropagation(),jQuery(this).addClass("pmw-subnav-li-active").removeClass("pmw-subnav-li-inactive").siblings().addClass("pmw-subnav-li-inactive").removeClass("pmw-subnav-li-active"),pmwToggleSubsection(jQuery(this).parent().data("section-slug"),jQuery(this).data("subsection-slug"))}),pmwGetSectionParams()){let e=pmwGetSectionParams();jQuery("a[data-section-slug="+e.section+"]").trigger("click"),!1!==e.subsection&&jQuery("ul[data-section-slug="+e.section+"]").children("[data-subsection-slug="+e.subsection+"]").trigger("click")}else jQuery("a[data-section-slug="+e[0].slug+"]").trigger("click")}),pmwCreateSubtabUlHtml=e=>{let t=Object.keys(e),s="";return t.forEach(function(t){s+='<ul class="pmw-subnav-tabs" data-section-slug="'+t+'">',e[t].forEach(function(e){s+='<li class="pmw-subnav-li pmw-subnav-li-inactive" style="cursor: pointer;" data-subsection-slug="'+e.slug+'">'+e.title+"</li>"}),s+="</ul>"}),s},pmwGetSectionParams=()=>{const e=window.location.search,t=new URLSearchParams(e);return!!t.get("section")&&{section:t.get("section"),subsection:t.get("subsection")}},pmwToggleSections=(e,t)=>{jQuery("#pmw_settings_form > h2").nextUntil(".submit").andSelf().hide(),jQuery(".pmw-subnav-tabs").hide(),jQuery(".pmw-subnav-tabs[data-section-slug="+e+"]").show();let s=t.findIndex(t=>t.slug===e);jQuery("div[data-section-slug="+e+"]").closest("table").prevAll("h2:first").next().nextUntil("h2, .submit").andSelf().show(),pmwSetUrl(t[s].slug)},pmwToggleSubsection=(e,t)=>{jQuery("#pmw_settings_form > h2").nextUntil(".submit").andSelf().hide(),jQuery("[data-section-slug="+e+"][data-subsection-slug="+t+"]").closest("tr").siblings().andSelf().hide(),jQuery("[data-section-slug="+e+"][data-subsection-slug="+t+"]").closest("table").show(),jQuery("[data-section-slug="+e+"][data-subsection-slug="+t+"]").closest("tr").nextUntil(jQuery("[data-section-slug="+e+"][data-subsection-slug]").closest("tr")).show(),pmwSetUrl(e,t)},pmwSetUrl=(e,t="")=>{const s=window.location.search,n=new URLSearchParams(s);n.delete("section"),n.delete("subsection");let a="section="+e;a+=t?"&subsection="+t:"",history.pushState("","pmw"+e,document.location.pathname+"?page=pmw&"+a)},pmwGetPageId=()=>{const e=window.location.search;return new URLSearchParams(e).get("page")},jQuery(document).on("click","[data-section-slug]",function(){const e=jQuery(this).data("sectionSlug")||jQuery(this).data("section-slug"),t=jQuery(".section[data-section-slug='"+e+"']");t.length&&0==t.data("showSaveButton")?jQuery(".submit").hide():jQuery(".submit").show()}),jQuery(document).on("click",".advanced-section-link",e=>{e.preventDefault();let t=jQuery(e.currentTarget).data("as-section"),s=jQuery(e.currentTarget).data("as-subsection");jQuery(`a[data-section-slug=${t}]`).trigger("click"),jQuery(`ul[data-section-slug=${t}]`).children(`[data-subsection-slug=${s}]`).trigger("click")})},939(){jQuery(function(e){const t=e("#pmw-ssp-activate-btn"),s=e("#pmw-ssp-reactivate-btn"),n=e("#pmw-ssp-disable-btn"),a=e("#pmw-ssp-disconnect-btn"),o=e("#pmw-ssp-sync-btn"),i=e("#pmw-ssp-test-btn"),r=e("#pmw-ssp-sync-token"),c=e("#pmw-ssp-failure-behavior");if(!t.length&&!o.length)return;const l=(e,t,s)=>{const n="success"===s?"pmw-ssp-msg-success":"error"===s?"pmw-ssp-msg-error":"pmw-ssp-msg-loading";e.html(`<span class="${n}">${t}</span>`)},d=e=>{e.html("")},u=(e,t,s)=>{const n={method:t,credentials:"same-origin",headers:{"Content-Type":"application/json","X-WP-Nonce":pmwAdminApi.nonce}};return s&&(n.body=JSON.stringify(s)),fetch(pmwAdminApi.root+"pmw/v1/ssp/"+e,n).then(e=>e.json())};t.on("click",function(){const s=e.trim(r.val());s?/^[a-f0-9]{32,64}$/i.test(s)?(t.prop("disabled",!0).text("Activating…"),d(e("#pmw-ssp-activate-status")),u("activate","POST",{sync_token:s}).then(s=>{if(s.success)l(e("#pmw-ssp-activate-status"),"✓ SSP activated successfully. Reloading…","success"),setTimeout(()=>window.location.reload(),1500);else{const n=s.message||s.data?.message||"Activation failed.";l(e("#pmw-ssp-activate-status"),n,"error"),t.prop("disabled",!1).text("Activate")}}).catch(s=>{l(e("#pmw-ssp-activate-status"),"Network error: "+s.message,"error"),t.prop("disabled",!1).text("Activate")})):l(e("#pmw-ssp-activate-status"),"Invalid token format. Expected a hex string (32-64 characters).","error"):l(e("#pmw-ssp-activate-status"),"Please enter a sync token.","error")}),s.on("click",function(){s.prop("disabled",!0).text("Re-activating…"),l(e("#pmw-ssp-toggle-status"),"Re-activating…","loading"),u("enable","POST").then(t=>{if(t.success)l(e("#pmw-ssp-toggle-status"),"✓ "+t.message+" Reloading…","success"),setTimeout(()=>window.location.reload(),1500);else{const n=t.message||t.data?.message||"Re-activation failed.";l(e("#pmw-ssp-toggle-status"),n,"error"),s.prop("disabled",!1).text("Re-activate")}}).catch(t=>{l(e("#pmw-ssp-toggle-status"),"Network error: "+t.message,"error"),s.prop("disabled",!1).text("Re-activate")})}),n.on("click",function(){n.prop("disabled",!0).text("Disabling…"),l(e("#pmw-ssp-toggle-status"),"Disabling…","loading"),u("disable","POST").then(t=>{if(t.success)l(e("#pmw-ssp-toggle-status"),"✓ "+t.message+" Reloading…","success"),setTimeout(()=>window.location.reload(),1500);else{const s=t.message||t.data?.message||"Disable failed.";l(e("#pmw-ssp-toggle-status"),s,"error"),n.prop("disabled",!1).text("Disable")}}).catch(t=>{l(e("#pmw-ssp-toggle-status"),"Network error: "+t.message,"error"),n.prop("disabled",!1).text("Disable")})}),a.on("click",function(){confirm("Disconnect from SSP?\n\nThis will permanently delete the sync token and remove all connection data. You will need to re-enter the token from the SSP portal to reconnect.\n\nContinue?")&&(a.prop("disabled",!0).text("Disconnecting…"),u("disconnect","POST").then(t=>{t.success?(l(e("#pmw-ssp-disconnect-status"),"SSP disconnected. Reloading…","success"),setTimeout(()=>window.location.reload(),1500)):(l(e("#pmw-ssp-disconnect-status"),t.message||"Disconnect failed.","error"),a.prop("disabled",!1).text("Disconnect"))}).catch(t=>{l(e("#pmw-ssp-disconnect-status"),"Network error: "+t.message,"error"),a.prop("disabled",!1).text("Disconnect")}))}),c.on("change",function(){const t=e(this).val();l(e("#pmw-ssp-failure-behavior-status"),"Saving…","loading"),u("save-setting","POST",{key:"proxy_failure_behavior",value:t}).then(t=>{t.success?(l(e("#pmw-ssp-failure-behavior-status"),"✓ Saved","success"),setTimeout(()=>d(e("#pmw-ssp-failure-behavior-status")),3e3)):l(e("#pmw-ssp-failure-behavior-status"),t.message||"Save failed.","error")}).catch(t=>{l(e("#pmw-ssp-failure-behavior-status"),"Network error: "+t.message,"error")})});o.on("click",function(){o.prop("disabled",!0).text("Syncing…"),l(e("#pmw-ssp-action-status"),"Pushing configuration…","loading"),u("sync","POST").then(t=>{t.success?(l(e("#pmw-ssp-action-status"),"✓ Config synced successfully. Reloading…","success"),(t=>{if(t){if(t.last_sync_at_formatted&&e("#pmw-ssp-last-sync").text(t.last_sync_at_formatted),t.plan_name){let s=t.plan_name;t.subscription_status&&"active"!==t.subscription_status&&(s+=` <span class="pmw-ssp-badge pmw-ssp-badge--inactive">${t.subscription_status.charAt(0).toUpperCase()+t.subscription_status.slice(1)}</span>`),e("#pmw-ssp-plan-name").html(s)}if(void 0!==t.monthly_request_limit&&t.monthly_request_limit>0){const s=e=>e.toLocaleString();e("#pmw-ssp-usage").text(`${s(t.billable_this_period)} / ${s(t.monthly_request_limit)} events (${t.usage_percent}%)`)}}})(t.status),setTimeout(()=>window.location.reload(),1500)):(l(e("#pmw-ssp-action-status"),t.message||t.data?.message||"Sync failed.","error"),o.prop("disabled",!1).text("Sync Now"))}).catch(t=>{l(e("#pmw-ssp-action-status"),"Network error: "+t.message,"error"),o.prop("disabled",!1).text("Sync Now")})}),i.on("click",function(){i.prop("disabled",!0).text("Testing…"),l(e("#pmw-ssp-action-status"),"Testing proxy connectivity…","loading"),u("test","POST").then(t=>{t.success?l(e("#pmw-ssp-action-status"),"✓ "+t.message,"success"):l(e("#pmw-ssp-action-status"),t.message||"Connection test failed.","error"),i.prop("disabled",!1).text("Test Connection")}).catch(t=>{l(e("#pmw-ssp-action-status"),"Network error: "+t.message,"error"),i.prop("disabled",!1).text("Test Connection")})})})},992(){jQuery(function(){jQuery("#debug-info-button").on("click",()=>{const e=jQuery("#debug-info-textarea")[0];e.select(),e.setSelectionRange(0,99999),pmw.copyTextToClipboard(jQuery("#debug-info-textarea").val());const t=jQuery("#debug-info-success");t.fadeIn(200),setTimeout(()=>t.fadeOut(200),3e3)}),jQuery("#pmw-pro-version-demo").on("click",function(){jQuery("#submit").trigger("click")}),document.getElementById("json-settings-file-input")&&document.getElementById("json-settings-file-input").addEventListener("change",pmw.readSettingsFile,!1),document.getElementById("ga4-data-api-credentials-upload-button")&&document.getElementById("ga4-data-api-credentials-upload-button").addEventListener("change",pmw.readGa4DataApiCredentials,!1),document.getElementById("ga4-data-api-credentials-delete-button")&&document.getElementById("ga4-data-api-credentials-delete-button").addEventListener("click",()=>{pmw.saveGa4DataApiCredentialsToDb({})},!1),jQuery("#wgact_download_logs_zip").on("click",function(e){if(e.preventDefault(),jQuery(this).prop("disabled"))return;const t=jQuery(this).data("source"),s=jQuery(this),n=s.text();s.prop("disabled",!0).text("Downloading..."),fetch(pmwAdminApi.root+"pmw/v1/logs/download",{method:"POST",headers:{"Content-Type":"application/x-www-form-urlencoded","X-WP-Nonce":pmwAdminApi.nonce},body:new URLSearchParams({source:t}),credentials:"same-origin"}).then(e=>{if(!e.ok)throw new Error(`HTTP error! status: ${e.status}`);return e.blob()}).then(e=>{const t=window.URL.createObjectURL(e),a=document.createElement("a");a.href=t,a.download="pmw-logs-"+(new Date).toISOString().slice(0,19).replace(/:/g,"-")+".zip",document.body.appendChild(a),a.click(),window.URL.revokeObjectURL(t),document.body.removeChild(a),s.prop("disabled",!1).text(n)}).catch(e=>{console.error("Download error:",e),s.prop("disabled",!1).text(n),alert("Error downloading log files. Please try again.")})})}),function(e){e.saveSettingsToDisk=()=>{let t=document.getElementById("export-settings-json").value,s="unknown";try{let e=JSON.parse(t);e.timestamp&&(s=e.timestamp)}catch(e){console.warn("Could not extract timestamp from settings:",e)}t=t.replace(/\n/g,"\r\n");let n=new Blob([t],{type:"text/plain"}),a=document.createElement("a");a.download="pixel-manager-settings_"+s+"_"+e.getDateTimeFromTimestamp(s)+".json",a.href=window.URL.createObjectURL(n),a.target="_blank",a.style.display="none",document.body.appendChild(a),a.click(),document.body.removeChild(a)},e.getDateTimeFromTimestamp=t=>{if("unknown"===t||!t||isNaN(t))return e.getCurrentDateForFileName();let s=new Date(1e3*t);if(pmwAdminApi&&pmwAdminApi.timezone&&"number"==typeof pmwAdminApi.timezone.offset){let e=60*pmwAdminApi.timezone.offset*60*1e3;return s=new Date(s.getTime()+e),s.getUTCFullYear()+"."+("0"+(s.getUTCMonth()+1)).slice(-2)+"."+("0"+s.getUTCDate()).slice(-2)+"_"+("0"+s.getUTCHours()).slice(-2)+"-"+("0"+s.getUTCMinutes()).slice(-2)+"-"+("0"+s.getUTCSeconds()).slice(-2)}return s.getFullYear()+"."+("0"+(s.getMonth()+1)).slice(-2)+"."+("0"+s.getDate()).slice(-2)+"_"+("0"+s.getHours()).slice(-2)+"-"+("0"+s.getMinutes()).slice(-2)+"-"+("0"+s.getSeconds()).slice(-2)},e.getCurrentDateForFileName=()=>{let e=new Date;if(pmwAdminApi&&pmwAdminApi.timezone&&"number"==typeof pmwAdminApi.timezone.offset){let t=60*pmwAdminApi.timezone.offset*60*1e3;return e=new Date(e.getTime()+t),e.getUTCFullYear()+"."+("0"+(e.getUTCMonth()+1)).slice(-2)+"."+("0"+e.getUTCDate()).slice(-2)+"_"+("0"+e.getUTCHours()).slice(-2)+"-"+("0"+e.getUTCMinutes()).slice(-2)+"-"+("0"+e.getUTCSeconds()).slice(-2)}return e.getFullYear()+"."+("0"+(e.getMonth()+1)).slice(-2)+"."+("0"+e.getDate()).slice(-2)+"_"+("0"+e.getHours()).slice(-2)+"-"+("0"+e.getMinutes()).slice(-2)+"-"+("0"+e.getSeconds()).slice(-2)},e.readSettingsFile=t=>{let s=t.target.files[0];if(!s)return;let n=new FileReader;n.onload=function(t){try{JSON.parse(t.target.result)}catch(e){return document.getElementById("settings-upload-status-error").style.display="block",void(document.getElementById("settings-upload-status-error-message").innerHTML="Invalid JSON file.")}let s=JSON.parse(t.target.result);e.saveImportedSettingsToDb(s)},n.readAsText(s)},e.saveImportedSettingsToDb=e=>{fetch(pmwAdminApi.root+"pmw/v1/settings/",{method:"POST",credentials:"same-origin",headers:{"Content-Type":"application/json","X-WP-Nonce":pmwAdminApi.nonce},body:JSON.stringify(e)}).then(e=>e.json()).then(async e=>{e.success?(console.log(e),document.getElementById("settings-upload-status-success").style.display="block",await new Promise(e=>setTimeout(e,1e3)),window.location.reload()):(console.log(e),document.getElementById("settings-upload-status-error").style.display="block")}).catch(e=>{console.error(e),document.getElementById("settings-upload-status-error").style.display="block"})},e.restoreBackup=e=>{console.log("restoreBackup() - timestamp: ",e),fetch(pmwAdminApi.root+"pmw/v1/options-backup/"+e+"/restore",{method:"POST",credentials:"same-origin",headers:{"Content-Type":"application/json","X-WP-Nonce":pmwAdminApi.nonce}}).then(e=>e.json()).then(async e=>{e?.data?.message&&console.log("restoreBackup() - message: ",e.data.message),e.success?window.location.reload():alert(e.data.message)}).catch(e=>{console.error(e),alert(e.message)})},e.readGa4DataApiCredentials=t=>{let s=t.target.files[0];if(!s)return;let n=new FileReader;n.onload=function(t){try{JSON.parse(t.target.result)}catch(e){return document.getElementById("ga4-api-credentials-upload-status-error").style.display="block",void(document.getElementById("ga4-api-credentials-upload-status-error-message").innerHTML="Invalid JSON file.")}let s=JSON.parse(t.target.result);e.saveGa4DataApiCredentialsToDb(s)},n.readAsText(s)},e.deleteGa4DataApiCredentials=t=>{e.saveGa4DataApiCredentialsToDb({})},e.saveGa4DataApiCredentialsToDb=e=>{fetch(pmwAdminApi.root+"pmw/v1/ga4/data-api/credentials",{method:"POST",credentials:"same-origin",headers:{"Content-Type":"application/json","X-WP-Nonce":pmwAdminApi.nonce},body:JSON.stringify(e)}).then(e=>e.json()).then(async e=>{e.success?(console.log(e),document.getElementById("ga4-api-credentials-upload-status-success").style.display="block",window.location.reload()):(console.log(e),document.getElementById("ga4-api-credentials-upload-status-error").style.display="block",document.getElementById("ga4-api-credentials-upload-status-error-message").innerHTML="Error message: "+e.data.message)}).catch(e=>{console.error(e),document.getElementById("ga4-api-credentials-upload-status-error").style.display="block"})},e.getAiBotUrl=()=>{if(pmw_cody?.url)return pmw_cody.url},e.loadAiChatWindow=()=>{const t=document.getElementById("pmw-chatbot-panel"),s=document.getElementById("pmw-chatbot-iframe");t&&s?(s.src=e.getAiBotUrl(),document.body.classList.add("pmw-chatbot-open"),t.classList.add("pmw-chatbot-panel-open")):console.error("Chatbot panel elements not found")},e.closeChatbot=()=>{const e=document.getElementById("pmw-chatbot-panel");e&&(e.classList.remove("pmw-chatbot-panel-open"),document.body.classList.remove("pmw-chatbot-open"))},e.codyAvailable=()=>!(void 0===window.pmw_cody||!window.pmw_cody?.available),e.ltvRecalculation=e=>{const t=e=>{let t=document.getElementsByClassName("ltv-message");for(let e=0;e<t.length;e++)t[e].style.display="none";document.getElementById("ltv-message-error").style.display="block",document.getElementById("ltv-message-error-text").innerHTML=e},s=()=>{let e=document.getElementsByClassName("ltv-message");for(let t=0;t<e.length;t++)e[t].style.display="none";document.getElementById("ltv-message-error").style.display="none"};fetch(pmwAdminApi.root+"pmw/v1/ltv/",{method:"POST",credentials:"same-origin",headers:{"Content-Type":"application/json","X-WP-Nonce":pmwAdminApi.nonce},body:JSON.stringify({action:e.target.dataset.action})}).then(e=>e.json()).then(e=>{e.success?(console.log(e),e.data.status.is_scheduled&&(s(),(()=>{let e=document.getElementsByClassName("ltv-button-text");for(let t=0;t<e.length;t++)e[t].style.display="none";document.getElementById("ltv-instant-recalculation-button-text").style.display="block"})(),document.getElementById("ltv-schedule-recalculation-confirmation-message").style.display="block"),e.data.status.is_running&&(document.getElementById("wgact_ltv_recalculation").disabled=!0,s(),document.getElementById("ltv-running-recalculation-confirmation-message").style.display="block"),e.data.status.is_running||e.data.status.is_scheduled||t(e.data.message)):(console.error(e),t(e.data.message))}).catch(e=>{console.error(e),t(e)})},e.copyTextToClipboard=e=>{navigator.clipboard.writeText(e).catch(e=>{console.error("Failed to copy: ",e)})}}(window.pmw=window.pmw||{},jQuery),document.addEventListener("DOMContentLoaded",()=>{if(pmw.codyAvailable()){const e=document.getElementById("pmw-chatbot-widget");e&&(e.style.display="block");const t=document.getElementById("pmw-chat-li");t&&(t.style.display="list-item");const s=document.getElementById("pmw-chatbot-toggle"),n=document.getElementById("pmw-chatbot-close");s&&s.addEventListener("click",e=>{e.preventDefault(),pmw.loadAiChatWindow()}),n&&n.addEventListener("click",e=>{e.preventDefault(),pmw.closeChatbot()}),document.addEventListener("keydown",e=>{"Escape"===e.key&&pmw.closeChatbot()})}else console.log("DOMContentLoaded - chatbot is not available")},!0),jQuery(()=>{document.querySelector("#wgact_ltv_recalculation")&&document.querySelector("#wgact_ltv_recalculation").addEventListener("click",e=>{e.preventDefault(),pmw.ltvRecalculation(e)}),document.querySelector("#pmw_stop_ltv_calculation")&&document.querySelector("#pmw_stop_ltv_calculation").addEventListener("click",e=>{e.preventDefault(),pmw.ltvRecalculation(e)}),jQuery(()=>{jQuery(document).on("click",".pmw-restore-backup-button",function(e){e.preventDefault();const t=jQuery(this).data("timestamp");t&&pmw.restoreBackup(t)})})}),jQuery(()=>{document.querySelector("#wgact_copy_log_file_links")&&document.querySelector("#wgact_copy_log_file_links").addEventListener("click",e=>{e.preventDefault();const t=JSON.parse(e.target.dataset.links);let s="";for(let e=0,n=t.length;e<n;e++)s+=t[e]+"\n";pmw.copyTextToClipboard(s);let n=document.getElementById("wgact_copy_log_file_links");n.style.width=getComputedStyle(n).width;const a=n.innerHTML;n.innerHTML=e.target.dataset.textCopied,setTimeout(function(){n.innerHTML=a},3e3)})}),jQuery(()=>{jQuery(document).on("keydown","input, textarea, select",function(e){if("Enter"===e.key&&!e.shiftKey&&!e.ctrlKey&&!e.altKey){const t=jQuery(e.target);if(t.is("input")&&t.closest("form").length>0){const s=t.closest("form")[0],n=jQuery(s).find("#submit");n.length>0&&(e.preventDefault(),n.click())}}})})}},t={};function s(n){var a=t[n];if(void 0!==a)return a.exports;var o=t[n]={exports:{}};return e[n](o,o.exports,s),o.exports}s(992),s(348),s(605),s(176),s(939)})(); 2 2 //# sourceMappingURL=pmw-admin.p1.min.js.map -
woocommerce-google-adwords-conversion-tracking-tag/trunk/js/admin/pmw-admin.p1.min.js.map
r3447088 r3468312 1 {"version":3,"file":"pmw-admin.p1.min.js","mappings":"wEA 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","sources":["webpack://Pixel-Manager-for-WooCommerce/./src/js-src/admin/script-blocker-warning.js","webpack://Pixel-Manager-for-WooCommerce/./src/js-src/admin/tabs.js","webpack://Pixel-Manager-for-WooCommerce/./src/js-src/admin/helpers.js","webpack://Pixel-Manager-for-WooCommerce/webpack/bootstrap","webpack://Pixel-Manager-for-WooCommerce/./src/js-src/admin/main.js"],"sourcesContent":["/**\n * Signal that the PMW admin script has loaded successfully.\n *\n * The PHP code sets up a detection mechanism that waits for window.load,\n * then checks if this flag is set. If not, it shows the script blocker warning.\n *\n * This approach ensures:\n * - No false positives on slow-loading pages\n * - Warning only shows when the script is actually blocked\n */\nwindow.pmwAdminScriptLoaded = true;\n","jQuery(function () {\n\n\t// Don't run if we are not one of the\n\t// WPM main tabs\n\tif (\"pmw\" !== pmwGetPageId()) return\n\n\tlet sections = []\n\tlet subsections = {}\n\n\t// Hide unnecessary elements\n\tjQuery(\".section\").closest(\"tr\").hide()\n\n\t// Collect information on sections\n\tjQuery(\".section\").each(function () {\n\t\tsections.push({\n\t\t\t\"slug\" : jQuery(this).data(\"sectionSlug\"),\n\t\t\t\"title\" : jQuery(this).data(\"sectionTitle\"),\n\t\t\t\"badgeCount\": jQuery(this).data(\"badgeCount\") || 0,\n\t\t})\n\t})\n\n\t// Collect information on subsections\n\tjQuery(\".subsection\").each(function () {\n\n\t\tsubsections[jQuery(this).data(\"sectionSlug\")] = subsections[jQuery(this).data(\"sectionSlug\")] || []\n\n\t\tsubsections[jQuery(this).data(\"sectionSlug\")].push({\n\t\t\t\"title\": jQuery(this).data(\"subsectionTitle\"),\n\t\t\t\"slug\" : jQuery(this).data(\"subsectionSlug\"),\n\t\t})\n\t})\n\n\t// Create tabs for sections\n\tsections.forEach(\n\t\tfunction (section) {\n\t\t\tlet badge = section[\"badgeCount\"] > 0 ? \"<span class=\\\"pmw-tab-badge\\\">\" + section[\"badgeCount\"] + \"</span>\" : \"\"\n\t\t\tjQuery(\".nav-tab-wrapper\").append(\"<a href=\\\"#\\\" class=\\\"nav-tab\\\" data-section-slug=\\\"\" + section[\"slug\"] + \"\\\">\" + section[\"title\"] + badge + \"</a>\")\n\t\t})\n\n\t// Create tabs for each subsections\n\tjQuery(\".nav-tab-wrapper\").after(pmwCreateSubtabUlHtml(subsections))\n\n\t// Create on-click events on section tabs that toggle the views\n\tjQuery(\".nav-tab-wrapper a\").on(\"click\", function (e) {\n\n\t\te.preventDefault()\n\n\t\t// show clicked tab as active\n\t\tjQuery(this).addClass(\"nav-tab-active\").siblings().removeClass(\"nav-tab-active\")\n\n\t\t// toggle the sections visible / invisible based on clicked tab\n\n\t\tlet sectionSlug = jQuery(this).data(\"section-slug\")\n\t\tpmwToggleSections(sectionSlug, sections)\n\n\t\t// if subsection exists, click on first subsection\n\t\tif (sectionSlug in subsections) {\n\t\t\tjQuery(\"ul[data-section-slug=\" + sectionSlug + \"]\").children(\":first\").trigger(\"click\")\n\t\t}\n\t})\n\n\t// Create on-click events on subsection tabs that toggle the views\n\tjQuery(\".pmw-subnav-li\").on(\"click\", function (e) {\n\n\t\te.preventDefault()\n\t\te.stopPropagation()\n\n\t\t// jQuery(this).hide();\n\t\tjQuery(this)\n\t\t\t.addClass(\"pmw-subnav-li-active\").removeClass(\"pmw-subnav-li-inactive\")\n\t\t\t.siblings()\n\t\t\t.addClass(\"pmw-subnav-li-inactive\").removeClass(\"pmw-subnav-li-active\")\n\n\t\tpmwToggleSubsection(jQuery(this).parent().data(\"section-slug\"), jQuery(this).data(\"subsection-slug\"))\n\t})\n\n\t/**\n\t * If someone accesses a plugin tab by deep link, open the right tab\n\t * or fallback to default (first tab)\n\t *\n\t * If deeplink is being opened,\n\t * open the according section and subsection\n\t */\n\tif (pmwGetSectionParams()) {\n\n\t\tlet sectionParams = pmwGetSectionParams()\n\n\t\tjQuery(\"a[data-section-slug=\" + sectionParams[\"section\"] + \"]\").trigger(\"click\")\n\n\t\tif (sectionParams[\"subsection\"] !== false) {\n\t\t\tjQuery(\"ul[data-section-slug=\" + sectionParams[\"section\"] + \"]\").children(\"[data-subsection-slug=\" + sectionParams[\"subsection\"] + \"]\").trigger(\"click\")\n\t\t}\n\t} else {\n\t\tjQuery(\"a[data-section-slug=\" + sections[0][\"slug\"] + \"]\").trigger(\"click\")\n\t}\n})\n\n// Creates the html with all subsection elements\npmwCreateSubtabUlHtml = (subsections) => {\n\n\tlet subsectionsKeys = Object.keys(subsections)\n\n\tlet html = \"\"\n\n\tsubsectionsKeys.forEach(function (subsectionKey) {\n\t\thtml += \"<ul class=\\\"pmw-subnav-tabs\\\" data-section-slug=\\\"\" + subsectionKey + \"\\\">\"\n\n\t\tlet subtabs = subsections[subsectionKey]\n\n\t\tsubtabs.forEach(function (subtab) {\n\t\t\thtml += \"<li class=\\\"pmw-subnav-li pmw-subnav-li-inactive\\\" style=\\\"cursor: pointer;\\\" data-subsection-slug=\\\"\" + subtab[\"slug\"] + \"\\\">\" + subtab[\"title\"] + \"</li>\"\n\t\t})\n\n\t\thtml += \"</ul>\"\n\t})\n\n\treturn html\n}\n\n/**\n * If section (and subsection) URL parameters are set,\n * return them, otherwise return false\n */\npmwGetSectionParams = () => {\n\n\tconst queryString = window.location.search\n\tconst urlParams = new URLSearchParams(queryString)\n\n\tif (urlParams.get(\"section\")) {\n\t\treturn {\n\t\t\t\"section\" : urlParams.get(\"section\"),\n\t\t\t\"subsection\": urlParams.get(\"subsection\"),\n\t\t}\n\t} else {\n\t\treturn false\n\t}\n}\n\n// Toggles the sections\npmwToggleSections = (sectionSlug, sections) => {\n\n\tjQuery(\"#pmw_settings_form > h2\").nextUntil(\".submit\").andSelf().hide()\n\tjQuery(\".pmw-subnav-tabs\").hide()\n\tjQuery(\".pmw-subnav-tabs[data-section-slug=\" + sectionSlug + \"]\").show()\n\n\tlet sectionPos = sections.findIndex((arrayElement) => arrayElement[\"slug\"] === sectionSlug)\n\n\tjQuery(\"div[data-section-slug=\" + sectionSlug + \"]\").closest(\"table\").prevAll(\"h2:first\").next().nextUntil(\"h2, .submit\").andSelf().show()\n\n\t// set the URL with the active tab parameter\n\tpmwSetUrl(sections[sectionPos][\"slug\"])\n}\n\npmwToggleSubsection = (sectionSlug, subsectionSlug) => {\n\n\tjQuery(\"#pmw_settings_form > h2\").nextUntil(\".submit\").andSelf().hide()\n\tjQuery(\"[data-section-slug=\" + sectionSlug + \"][data-subsection-slug=\" + subsectionSlug + \"]\").closest(\"tr\").siblings().andSelf().hide()\n\n\tjQuery(\"[data-section-slug=\" + sectionSlug + \"][data-subsection-slug=\" + subsectionSlug + \"]\").closest(\"table\").show()\n\tjQuery(\"[data-section-slug=\" + sectionSlug + \"][data-subsection-slug=\" + subsectionSlug + \"]\").closest(\"tr\").nextUntil(jQuery(\"[data-section-slug=\" + sectionSlug + \"][data-subsection-slug]\").closest(\"tr\")).show()\n\n\t// Set the URL with the active tab parameter\n\tpmwSetUrl(sectionSlug, subsectionSlug)\n}\n\n// Sets the new URL parameters\npmwSetUrl = (sectionSlug, subsectionSlug = \"\") => {\n\n\tconst queryString = window.location.search\n\tconst urlParams = new URLSearchParams(queryString)\n\n\turlParams.delete(\"section\")\n\turlParams.delete(\"subsection\")\n\n\tlet newParams = \"section=\" + sectionSlug\n\tnewParams += subsectionSlug ? \"&subsection=\" + subsectionSlug : \"\"\n\n\thistory.pushState(\"\", \"pmw\" + sectionSlug, document.location.pathname + \"?page=pmw&\" + newParams)\n\n\t// Make WP remember which was the selected tab on a save and return to the same tab after saving\n\tjQuery(\"input[name =\\\"_wp_http_referer\\\"]\").val(pmwGetAdminPath() + \"?page=pmw&\" + newParams + \"&settings-updated=true\")\n}\n\npmwGetAdminPath = () => {\n\tlet url = new URL(jQuery(\"#wp-admin-canonical\").attr(\"href\"))\n\treturn url.pathname\n}\n\npmwGetPageId = () => {\n\n\tconst queryString = window.location.search\n\tconst urlParams = new URLSearchParams(queryString)\n\n\treturn urlParams.get(\"page\")\n}\n\n// On click of an element that contains a data-section-slug with any value show an alert box with the text hello\njQuery(document).on(\"click\", \"[data-section-slug]\", function () {\n\n\tconst infoTabs = [\n\t\t\"opportunities\",\n\t\t\"diagnostics\",\n\t\t\"support\",\n\t]\n\n\t// If the data-section-slug value is one of infoTabs, hide the save button, otherwise show it\n\tif (infoTabs.includes(jQuery(this).data(\"section-slug\"))) {\n\t\t// Hide the element with class submit\n\t\tjQuery(\".submit\").hide()\n\t} else {\n\t\t// Show the element with class submit\n\t\tjQuery(\".submit\").show()\n\t}\n})\n\n\n// if a link with the class advanced-section-link is clicked,\n// get the data-AS-section and the data-AS-subsection values of the clicked element\n// and trigger a click on the element with the data-ssection-slug value and a click on the element with the data-subsection-slug value\njQuery(document).on(\"click\", \".advanced-section-link\", (e) => {\n\n\te.preventDefault()\n\n\tlet sectionSlug = jQuery(e.currentTarget).data(\"as-section\")\n\tlet subsectionSlug = jQuery(e.currentTarget).data(\"as-subsection\")\n\n\tjQuery(`a[data-section-slug=${sectionSlug}]`).trigger(\"click\")\n\n\tjQuery(`ul[data-section-slug=${sectionSlug}]`).children(`[data-subsection-slug=${subsectionSlug}]`).trigger(\"click\")\n})\n","jQuery(function () {\n\n\t/**\n\t * Copy debug info to clipboard when the button is clicked.\n\t */\n\tjQuery(\"#debug-info-button\").on(\"click\", () => {\n\t\t// Select text in textarea\n\t\tconst textarea = jQuery(\"#debug-info-textarea\")[0];\n\t\ttextarea.select();\n\t\ttextarea.setSelectionRange(0, 99999); // For mobile devices\n\n\t\t// Copy selected text to clipboard\n\t\tpmw.copyTextToClipboard(jQuery(\"#debug-info-textarea\").val());\n\n\t\t// Show success message and hide after 3 seconds\n\t\tconst successElement = jQuery(\"#debug-info-success\");\n\t\tsuccessElement.fadeIn(200);\n\t\tsetTimeout(() => successElement.fadeOut(200), 3000);\n\t});\n\n\tjQuery(\"#pmw-pro-version-demo\").on(\"click\", function () {\n\t\tjQuery(\"#submit\").trigger(\"click\");\n\t});\n\n\tif (document.getElementById(\"json-settings-file-input\")) {\n\t\tdocument.getElementById(\"json-settings-file-input\")\n\t\t\t.addEventListener(\"change\", pmw.readSettingsFile, false);\n\t}\n\n\t// if element ga4-data-api-credentials-upload-button exists, then we are on the GA4 settings page\n\tif (document.getElementById(\"ga4-data-api-credentials-upload-button\")) {\n\n\t\tdocument.getElementById(\"ga4-data-api-credentials-upload-button\")\n\t\t\t.addEventListener(\"change\", pmw.readGa4DataApiCredentials, false);\n\t}\n\n\t// if element ga4-data-api-credentials-upload-button exists, then we are on the GA4 settings page\n\tif (document.getElementById(\"ga4-data-api-credentials-delete-button\")) {\n\n\t\tdocument.getElementById(\"ga4-data-api-credentials-delete-button\")\n\t\t\t.addEventListener(\"click\", () => {\n\t\t\t\tpmw.saveGa4DataApiCredentialsToDb({});\n\t\t\t}, false);\n\t}\n\n\t/**\n\t * Handle log files download via REST API\n\t */\n\tjQuery(\"#wgact_download_logs_zip\").on(\"click\", function(e) {\n\t\te.preventDefault();\n\t\t\n\t\tif (jQuery(this).prop(\"disabled\")) {\n\t\t\treturn;\n\t\t}\n\t\t\n\t\tconst source = jQuery(this).data(\"source\");\n\t\tconst button = jQuery(this);\n\t\tconst originalText = button.text();\n\t\t\n\t\t// Disable button and change text\n\t\tbutton.prop(\"disabled\", true).text(\"Downloading...\");\n\t\t\n\t\t// Use fetch with proper authentication\n\t\tfetch(pmwAdminApi.root + \"pmw/v1/logs/download\", {\n\t\t\tmethod: \"POST\",\n\t\t\theaders: {\n\t\t\t\t\"Content-Type\": \"application/x-www-form-urlencoded\",\n\t\t\t\t\"X-WP-Nonce\": pmwAdminApi.nonce\n\t\t\t},\n\t\t\tbody: new URLSearchParams({\n\t\t\t\tsource: source\n\t\t\t}),\n\t\t\tcredentials: 'same-origin'\n\t\t})\n\t\t.then(response => {\n\t\t\tif (!response.ok) {\n\t\t\t\tthrow new Error(`HTTP error! status: ${response.status}`);\n\t\t\t}\n\t\t\treturn response.blob();\n\t\t})\n\t\t.then(blob => {\n\t\t\t// Create download link\n\t\t\tconst url = window.URL.createObjectURL(blob);\n\t\t\tconst a = document.createElement(\"a\");\n\t\t\ta.href = url;\n\t\t\ta.download = \"pmw-logs-\" + new Date().toISOString().slice(0,19).replace(/:/g, \"-\") + \".zip\";\n\t\t\tdocument.body.appendChild(a);\n\t\t\ta.click();\n\t\t\twindow.URL.revokeObjectURL(url);\n\t\t\tdocument.body.removeChild(a);\n\t\t\t\n\t\t\t// Re-enable the button\n\t\t\tbutton.prop(\"disabled\", false).text(originalText);\n\t\t})\n\t\t.catch(error => {\n\t\t\tconsole.error(\"Download error:\", error);\n\t\t\tbutton.prop(\"disabled\", false).text(originalText);\n\t\t\talert(\"Error downloading log files. Please try again.\");\n\t\t});\n\t});\n});\n\n// jQuery(function () {\n//\n// \timport(\"../../../node_modules/@floating-ui/dom/dist/floating-ui.dom.mjs\")\n// \t\t.then(({\n// \t\t\t\t computePosition,\n// \t\t\t\t flip,\n// \t\t\t\t shift,\n// \t\t\t\t offset,\n// \t\t\tarrow,\n// \t\t\t }) => {\n// \t\t\tconsole.log(\"computePosition: \", computePosition)\n//\n// \t\t\tconst button = document.querySelector('#button');\n// \t\t\tconst tooltip = document.querySelector('#tooltip');\n// \t\t\tconst arrowElement = document.querySelector('#arrow');\n//\n// \t\t\tcomputePosition(button, tooltip, {\n// \t\t\t\tplacement: 'top',\n// \t\t\t\tmiddleware: [\n// \t\t\t\t\toffset(6),\n// \t\t\t\t\tflip(),\n// \t\t\t\t\tshift({padding: 5}),\n// \t\t\t\t\tarrow({element: arrowElement}),\n// \t\t\t\t],\n// \t\t\t}).then(({x, y}) => {\n// \t\t\t\tObject.assign(tooltip.style, {\n// \t\t\t\t\tleft: `${x}px`,\n// \t\t\t\t\ttop: `${y}px`,\n// \t\t\t\t});\n// \t\t\t});\n//\n// \t\t})\n// \t\t.catch(err => {\n// \t\t\tconsole.error(err)\n// \t\t})\n//\n// });\n\n\n(function (pmw, $, undefined) {\n\n\tpmw.saveSettingsToDisk = () => {\n\t\tlet text = document.getElementById(\"export-settings-json\").value;\n\n\t\t// Extract timestamp from the settings JSON\n\t\tlet timestamp = \"unknown\";\n\t\ttry {\n\t\t\tlet settings = JSON.parse(text);\n\t\t\tif (settings.timestamp) {\n\t\t\t\ttimestamp = settings.timestamp;\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tconsole.warn(\"Could not extract timestamp from settings:\", error);\n\t\t}\n\n\t\ttext = text.replace(/\\n/g, \"\\r\\n\"); // To retain the Line breaks.\n\t\tlet blob = new Blob([text], {type: \"text/plain\"});\n\t\tlet anchor = document.createElement(\"a\");\n\t\tanchor.download = \"pixel-manager-settings_\" + timestamp + \"_\" + pmw.getDateTimeFromTimestamp(timestamp) + \".json\";\n\t\tanchor.href = window.URL.createObjectURL(blob);\n\t\tanchor.target = \"_blank\";\n\t\tanchor.style.display = \"none\"; // just to be safe!\n\t\tdocument.body.appendChild(anchor);\n\t\tanchor.click();\n\t\tdocument.body.removeChild(anchor);\n\t};\n\n\t// Get date and time from timestamp in year.month.day_hour-minute-second format. All components are zero padded.\n\t// Uses WordPress site timezone to match what's displayed on admin pages.\n\tpmw.getDateTimeFromTimestamp = (timestamp) => {\n\t\t// If timestamp is \"unknown\" or invalid, fall back to current date/time\n\t\tif (timestamp === \"unknown\" || !timestamp || isNaN(timestamp)) {\n\t\t\treturn pmw.getCurrentDateForFileName();\n\t\t}\n\n\t\t// Convert Unix timestamp (seconds) to milliseconds for JavaScript Date\n\t\tlet date = new Date(timestamp * 1000);\n\n\t\t// Apply WordPress timezone offset if available\n\t\tif (pmwAdminApi && pmwAdminApi.timezone && typeof pmwAdminApi.timezone.offset === \"number\") {\n\t\t\t// Create new date in WordPress timezone by adding the offset\n\t\t\tlet wpTimezoneOffsetMs = pmwAdminApi.timezone.offset * 60 * 60 * 1000; // Convert hours to milliseconds\n\t\t\tdate = new Date(date.getTime() + wpTimezoneOffsetMs);\n\n\t\t\t// Get WordPress timezone date/time components using UTC methods\n\t\t\t// (since we've already applied the offset to the date object)\n\t\t\tlet year = date.getUTCFullYear();\n\t\t\tlet month = (\"0\" + (date.getUTCMonth() + 1)).slice(-2);\n\t\t\tlet day = (\"0\" + date.getUTCDate()).slice(-2);\n\t\t\tlet hours = (\"0\" + date.getUTCHours()).slice(-2);\n\t\t\tlet minutes = (\"0\" + date.getUTCMinutes()).slice(-2);\n\t\t\tlet seconds = (\"0\" + date.getUTCSeconds()).slice(-2);\n\n\t\t\treturn year + \".\" + month + \".\" + day + \"_\" + hours + \"-\" + minutes + \"-\" + seconds;\n\t\t} else {\n\t\t\t// Fallback to browser local timezone if WordPress timezone data is not available\n\t\t\tlet year = date.getFullYear();\n\t\t\tlet month = (\"0\" + (date.getMonth() + 1)).slice(-2);\n\t\t\tlet day = (\"0\" + date.getDate()).slice(-2);\n\t\t\tlet hours = (\"0\" + date.getHours()).slice(-2);\n\t\t\tlet minutes = (\"0\" + date.getMinutes()).slice(-2);\n\t\t\tlet seconds = (\"0\" + date.getSeconds()).slice(-2);\n\t\t\treturn year + \".\" + month + \".\" + day + \"_\" + hours + \"-\" + minutes + \"-\" + seconds;\n\t\t}\n\t};\n\n\t// Get current date and time in year.month.day_hour-minute-second format. All components are zero padded.\n\t// Uses WordPress site timezone to match what's displayed on admin pages.\n\tpmw.getCurrentDateForFileName = () => {\n\t\tlet date = new Date();\n\n\t\t// Apply WordPress timezone offset if available\n\t\tif (pmwAdminApi && pmwAdminApi.timezone && typeof pmwAdminApi.timezone.offset === \"number\") {\n\t\t\t// Apply WordPress timezone offset\n\t\t\tlet wpTimezoneOffsetMs = pmwAdminApi.timezone.offset * 60 * 60 * 1000; // Convert hours to milliseconds\n\t\t\tdate = new Date(date.getTime() + wpTimezoneOffsetMs);\n\n\t\t\t// Get WordPress timezone date/time components using UTC methods\n\t\t\t// (since we've already applied the offset to the date object)\n\t\t\tlet year = date.getUTCFullYear();\n\t\t\tlet month = (\"0\" + (date.getUTCMonth() + 1)).slice(-2);\n\t\t\tlet day = (\"0\" + date.getUTCDate()).slice(-2);\n\t\t\tlet hours = (\"0\" + date.getUTCHours()).slice(-2);\n\t\t\tlet minutes = (\"0\" + date.getUTCMinutes()).slice(-2);\n\t\t\tlet seconds = (\"0\" + date.getUTCSeconds()).slice(-2);\n\n\t\t\treturn year + \".\" + month + \".\" + day + \"_\" + hours + \"-\" + minutes + \"-\" + seconds;\n\t\t} else {\n\t\t\t// Fallback to browser local timezone if WordPress timezone data is not available\n\t\t\tlet year = date.getFullYear();\n\t\t\tlet month = (\"0\" + (date.getMonth() + 1)).slice(-2);\n\t\t\tlet day = (\"0\" + date.getDate()).slice(-2);\n\t\t\tlet hours = (\"0\" + date.getHours()).slice(-2);\n\t\t\tlet minutes = (\"0\" + date.getMinutes()).slice(-2);\n\t\t\tlet seconds = (\"0\" + date.getSeconds()).slice(-2);\n\t\t\treturn year + \".\" + month + \".\" + day + \"_\" + hours + \"-\" + minutes + \"-\" + seconds;\n\t\t}\n\n\t\t// return date.toLocaleDateString(\n\t\t// \t\"en-US\", {\n\t\t// \t\tyear : \"numeric\",\n\t\t// \t\tmonth: \"2-digit\",\n\t\t// \t\tday : \"2-digit\",\n\t\t// \t},\n\t\t// )\n\t};\n\n\tpmw.readSettingsFile = e => {\n\n\t\tlet file = e.target.files[0];\n\t\tif (!file) return;\n\t\tlet reader = new FileReader();\n\t\treader.onload = function (e) {\n\n\t\t\t// Check if the file is a valid JSON file\n\t\t\t// If it is not a valid JSON file, display an error message\n\t\t\ttry {\n\t\t\t\tJSON.parse(e.target.result);\n\t\t\t} catch (error) {\n\t\t\t\tdocument.getElementById(\"settings-upload-status-error\").style.display = \"block\";\n\t\t\t\tdocument.getElementById(\"settings-upload-status-error-message\").innerHTML = \"Invalid JSON file.\";\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tlet contents = JSON.parse(e.target.result);\n\n\t\t\t// document.getElementById(\"import-settings-json\").textContent = JSON.stringify(contents)\n\n\t\t\tpmw.saveImportedSettingsToDb(contents);\n\t\t};\n\t\treader.readAsText(file);\n\t};\n\n\tpmw.saveImportedSettingsToDb = settings => {\n\n\t\tfetch(pmwAdminApi.root + \"pmw/v1/settings/\", {\n\t\t\tmethod : \"POST\",\n\t\t\tcredentials: \"same-origin\",\n\t\t\theaders : {\n\t\t\t\t\"Content-Type\": \"application/json\",\n\t\t\t\t\"X-WP-Nonce\" : pmwAdminApi.nonce,\n\t\t\t},\n\t\t\tbody : JSON.stringify(settings),\n\t\t})\n\t\t\t.then(response => response.json())\n\t\t\t.then(async message => {\n\t\t\t\tif (message.success) {\n\t\t\t\t\tconsole.log(message);\n\t\t\t\t\t// reload window\n\t\t\t\t\tdocument.getElementById(\"settings-upload-status-success\").style.display = \"block\";\n\t\t\t\t\t// wait 5 seconds\n\t\t\t\t\tawait new Promise(resolve => setTimeout(resolve, 1000));\n\t\t\t\t\twindow.location.reload();\n\t\t\t\t} else {\n\t\t\t\t\tconsole.log(message);\n\t\t\t\t\tdocument.getElementById(\"settings-upload-status-error\").style.display = \"block\";\n\t\t\t\t}\n\t\t\t})\n\t\t\t.catch(error => {\n\t\t\t\tconsole.error(error);\n\t\t\t\tdocument.getElementById(\"settings-upload-status-error\").style.display = \"block\";\n\t\t\t});\n\t};\n\n\tpmw.restoreBackup = (timestamp) => {\n\n\t\tconsole.log(\"restoreBackup() - timestamp: \", timestamp);\n\n\t\tfetch(pmwAdminApi.root + \"pmw/v1/options-backup/\" + timestamp + \"/restore\", {\n\t\t\tmethod : \"POST\",\n\t\t\tcredentials: \"same-origin\",\n\t\t\theaders : {\n\t\t\t\t\"Content-Type\": \"application/json\",\n\t\t\t\t\"X-WP-Nonce\" : pmwAdminApi.nonce,\n\t\t\t},\n\t\t})\n\t\t\t.then(response => response.json())\n\t\t\t.then(async message => {\n\n\t\t\t\tif (message?.data?.message) {\n\t\t\t\t\tconsole.log(\"restoreBackup() - message: \", message.data.message);\n\t\t\t\t}\n\n\t\t\t\tif (message.success) {\n\t\t\t\t\twindow.location.reload();\n\t\t\t\t} else {\n\t\t\t\t\talert(message.data.message);\n\t\t\t\t}\n\n\t\t\t})\n\t\t\t.catch(error => {\n\t\t\t\tconsole.error(error);\n\t\t\t\talert(error.message);\n\t\t\t});\n\t};\n\n\tpmw.readGa4DataApiCredentials = e => {\n\n\t\tlet file = e.target.files[0];\n\t\tif (!file) return;\n\t\tlet reader = new FileReader();\n\t\treader.onload = function (e) {\n\n\t\t\t// Check if the file is a valid JSON file\n\t\t\t// If it is not a valid JSON file, display an error message\n\t\t\ttry {\n\t\t\t\tJSON.parse(e.target.result);\n\t\t\t} catch (error) {\n\t\t\t\tdocument.getElementById(\"ga4-api-credentials-upload-status-error\").style.display = \"block\";\n\t\t\t\tdocument.getElementById(\"ga4-api-credentials-upload-status-error-message\").innerHTML = \"Invalid JSON file.\";\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tlet contents = JSON.parse(e.target.result);\n\n\t\t\t// document.getElementById(\"import-settings-json\").textContent = JSON.stringify(contents)\n\n\t\t\tpmw.saveGa4DataApiCredentialsToDb(contents);\n\t\t};\n\t\treader.readAsText(file);\n\t};\n\n\tpmw.deleteGa4DataApiCredentials = e => {\n\t\tpmw.saveGa4DataApiCredentialsToDb({});\n\t};\n\n\tpmw.saveGa4DataApiCredentialsToDb = credentials => {\n\n\t\tfetch(pmwAdminApi.root + \"pmw/v1/ga4/data-api/credentials\", {\n\t\t\tmethod : \"POST\",\n\t\t\tcredentials: \"same-origin\",\n\t\t\theaders : {\n\t\t\t\t\"Content-Type\": \"application/json\",\n\t\t\t\t\"X-WP-Nonce\" : pmwAdminApi.nonce,\n\t\t\t},\n\t\t\tbody : JSON.stringify(credentials),\n\t\t})\n\t\t\t.then(response => response.json())\n\t\t\t.then(async responseJson => {\n\t\t\t\tif (responseJson.success) {\n\t\t\t\t\tconsole.log(responseJson);\n\t\t\t\t\t// reload window\n\t\t\t\t\tdocument.getElementById(\"ga4-api-credentials-upload-status-success\").style.display = \"block\";\n\t\t\t\t\t// wait 5 seconds\n\t\t\t\t\t// await new Promise(resolve => setTimeout(resolve, 5000))\n\t\t\t\t\twindow.location.reload();\n\t\t\t\t} else {\n\t\t\t\t\tconsole.log(responseJson);\n\t\t\t\t\tdocument.getElementById(\"ga4-api-credentials-upload-status-error\").style.display = \"block\";\n\t\t\t\t\t// and add the error message\n\t\t\t\t\tdocument.getElementById(\"ga4-api-credentials-upload-status-error-message\").innerHTML = \"Error message: \" + responseJson.data.message;\n\t\t\t\t}\n\t\t\t})\n\t\t\t.catch(error => {\n\t\t\t\tconsole.error(error);\n\t\t\t\tdocument.getElementById(\"ga4-api-credentials-upload-status-error\").style.display = \"block\";\n\t\t\t});\n\t};\n\n\tpmw.getAiBotUrl = () => {\n\t\tif (pmw_cody?.url) {\n\t\t\treturn pmw_cody.url;\n\t\t}\n\t};\n\n\t/**\n\t * Opens the chatbot in a side panel (like n8n)\n\t * The panel slides in from the right side of the screen\n\t */\n\tpmw.loadAiChatWindow = () => {\n\t\tconst panel = document.getElementById(\"pmw-chatbot-panel\");\n\t\tconst iframe = document.getElementById(\"pmw-chatbot-iframe\");\n\n\t\tif (!panel || !iframe) {\n\t\t\tconsole.error(\"Chatbot panel elements not found\");\n\t\t\treturn;\n\t\t}\n\n\t\t// Set the iframe source\n\t\tiframe.src = pmw.getAiBotUrl();\n\n\t\t// Add body class to push content left\n\t\tdocument.body.classList.add(\"pmw-chatbot-open\");\n\n\t\t// Open the panel\n\t\tpanel.classList.add(\"pmw-chatbot-panel-open\");\n\t};\n\n\t/**\n\t * Closes the chatbot side panel\n\t */\n\tpmw.closeChatbot = () => {\n\t\tconst panel = document.getElementById(\"pmw-chatbot-panel\");\n\t\tif (panel) {\n\t\t\tpanel.classList.remove(\"pmw-chatbot-panel-open\");\n\t\t\t// Remove body class to restore content position\n\t\t\tdocument.body.classList.remove(\"pmw-chatbot-open\");\n\t\t}\n\t};\n\n\t/**\n\t * Check if the Cody AI chatbot is available.\n\t *\n\t * @return {boolean}\n\t */\n\tpmw.codyAvailable = () => {\n\t\tif (typeof window.pmw_cody !== \"undefined\" && window.pmw_cody?.available) {\n\t\t\treturn true;\n\t\t}\n\t\treturn false;\n\t};\n\n\t// Schedule a recalculation of the LTV by sending a POST REST request to the server\n\tpmw.ltvRecalculation = event => {\n\n\t\tconst displayStatusMessage = (message) => {\n\t\t\tlet elements = document.getElementsByClassName(\"ltv-message\");\n\t\t\tfor (let i = 0; i < elements.length; i++) {\n\t\t\t\telements[i].style.display = \"none\";\n\t\t\t}\n\t\t\tdocument.getElementById(\"ltv-message-error\").style.display = \"block\";\n\t\t\tdocument.getElementById(\"ltv-message-error-text\").innerHTML = message;\n\t\t};\n\n\t\tconst displayRunImmediatelyButton = () => {\n\t\t\tlet elements = document.getElementsByClassName(\"ltv-button-text\");\n\t\t\tfor (let i = 0; i < elements.length; i++) {\n\t\t\t\telements[i].style.display = \"none\";\n\t\t\t}\n\t\t\tdocument.getElementById(\"ltv-instant-recalculation-button-text\").style.display = \"block\";\n\t\t};\n\n\t\tconst removeAllMessages = () => {\n\t\t\tlet elements = document.getElementsByClassName(\"ltv-message\");\n\t\t\tfor (let i = 0; i < elements.length; i++) {\n\t\t\t\telements[i].style.display = \"none\";\n\t\t\t}\n\n\t\t\tdocument.getElementById(\"ltv-message-error\").style.display = \"none\";\n\t\t};\n\n\t\t// console log the data-action from the nested span element of the clicked element\n\t\t// console.log(\"event.target.dataset.action\", event.target.dataset.action)\n\n\t\tfetch(pmwAdminApi.root + \"pmw/v1/ltv/\", {\n\t\t\tmethod : \"POST\",\n\t\t\tcredentials: \"same-origin\",\n\t\t\theaders : {\n\t\t\t\t\"Content-Type\": \"application/json\",\n\t\t\t\t\"X-WP-Nonce\" : pmwAdminApi.nonce,\n\t\t\t},\n\t\t\tbody : JSON.stringify({\n\t\t\t\t\"action\": event.target.dataset.action,\n\t\t\t}),\n\t\t})\n\t\t\t.then(response => response.json())\n\t\t\t.then(message => {\n\t\t\t\tif (message.success) {\n\t\t\t\t\tconsole.log(message);\n\t\t\t\t\t// reload window\n\n\t\t\t\t\tif (message.data.status.is_scheduled) {\n\t\t\t\t\t\tremoveAllMessages();\n\t\t\t\t\t\tdisplayRunImmediatelyButton();\n\t\t\t\t\t\tdocument.getElementById(\"ltv-schedule-recalculation-confirmation-message\").style.display = \"block\";\n\t\t\t\t\t}\n\n\t\t\t\t\tif (message.data.status.is_running) {\n\t\t\t\t\t\t// Get the button element with the id \"wgact_ltv_recalculation\" and disable it\n\t\t\t\t\t\tdocument.getElementById(\"wgact_ltv_recalculation\").disabled = true;\n\t\t\t\t\t\tremoveAllMessages();\n\t\t\t\t\t\tdocument.getElementById(\"ltv-running-recalculation-confirmation-message\").style.display = \"block\";\n\t\t\t\t\t}\n\n\t\t\t\t\t// if is neither message.data.status.is_running nor message.data.status.is_scheduled\n\t\t\t\t\t// then display the error message\n\t\t\t\t\tif (!message.data.status.is_running && !message.data.status.is_scheduled) {\n\t\t\t\t\t\tdisplayStatusMessage(message.data.message);\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tconsole.error(message);\n\t\t\t\t\tdisplayStatusMessage(message.data.message);\n\t\t\t\t}\n\t\t\t})\n\t\t\t.catch(error => {\n\t\t\t\tconsole.error(error);\n\t\t\t\tdisplayStatusMessage(error);\n\t\t\t});\n\t};\n\n\tpmw.copyTextToClipboard = (text) => {\n\t\tnavigator.clipboard.writeText(text)\n\t\t\t.catch(err => {\n\t\t\t\tconsole.error(\"Failed to copy: \", err);\n\t\t\t});\n\t};\n\n}(window.pmw = window.pmw || {}, jQuery));\n\n/**\n * This script listens for the DOMContentLoaded event. Once the DOM is fully loaded,\n * it checks if the chatbot (pmw.codyAvailable()) is available.\n * If the chatbot is available, it displays the chat widget button.\n * If the chatbot is not available, it logs a message to the console indicating that the chatbot is unavailable.\n *\n * @listens document#DOMContentLoaded\n */\ndocument.addEventListener(\"DOMContentLoaded\", () => {\n\n\tif (pmw.codyAvailable()) {\n\t\tconst chatbotWidget = document.getElementById(\"pmw-chatbot-widget\");\n\t\tif (chatbotWidget) {\n\t\t\tchatbotWidget.style.display = \"block\";\n\t\t}\n\n\t\t// Show the chatbot line in the support section\n\t\tconst chatbotListItem = document.getElementById(\"pmw-chat-li\");\n\t\tif (chatbotListItem) {\n\t\t\tchatbotListItem.style.display = \"list-item\";\n\t\t}\n\n\t\t// Set up event listeners for the chatbot widget\n\t\tconst chatbotToggle = document.getElementById(\"pmw-chatbot-toggle\");\n\t\tconst chatbotClose = document.getElementById(\"pmw-chatbot-close\");\n\n\t\tif (chatbotToggle) {\n\t\t\tchatbotToggle.addEventListener(\"click\", (e) => {\n\t\t\t\te.preventDefault();\n\t\t\t\tpmw.loadAiChatWindow();\n\t\t\t});\n\t\t}\n\n\t\tif (chatbotClose) {\n\t\t\tchatbotClose.addEventListener(\"click\", (e) => {\n\t\t\t\te.preventDefault();\n\t\t\t\tpmw.closeChatbot();\n\t\t\t});\n\t\t}\n\n\t\t// Close chatbot on ESC key\n\t\tdocument.addEventListener(\"keydown\", (event) => {\n\t\t\tif (event.key === \"Escape\") {\n\t\t\t\tpmw.closeChatbot();\n\t\t\t}\n\t\t});\n\t} else {\n\t\tconsole.log(\"DOMContentLoaded - chatbot is not available\");\n\t}\n\n}, true);\n\n// Wait until the DOM is loaded, then console log\n// the message \"DOMContentLoaded - chatbot is not available\"\n// use jquery\njQuery(() => {\n\tif (document.querySelector(\"#wgact_ltv_recalculation\")) {\n\t\tdocument.querySelector(\"#wgact_ltv_recalculation\").addEventListener(\"click\", event => {\n\t\t\tevent.preventDefault();\n\t\t\tpmw.ltvRecalculation(event);\n\t\t});\n\t}\n\n\tif (document.querySelector(\"#pmw_stop_ltv_calculation\")) {\n\t\tdocument.querySelector(\"#pmw_stop_ltv_calculation\").addEventListener(\"click\", event => {\n\t\t\tevent.preventDefault();\n\t\t\tpmw.ltvRecalculation(event);\n\t\t});\n\t}\n\n\t// Add event listeners for backup restore buttons\n\tjQuery(() => {\n\t\tjQuery(document).on(\"click\", \".pmw-restore-backup-button\", function (event) {\n\t\t\tevent.preventDefault();\n\t\t\tconst timestamp = jQuery(this).data(\"timestamp\");\n\t\t\tif (timestamp) {\n\t\t\t\tpmw.restoreBackup(timestamp);\n\t\t\t}\n\t\t});\n\t});\n});\n\n/**\n * add an event listener to the button with the id \"wgact_copy_log_file_links\"\n * when the button is clicked, copy the log file links to the clipboard\n * the data-links attribute of the button contains a json string with the links\n */\njQuery(() => {\n\n\tif (!document.querySelector(\"#wgact_copy_log_file_links\")) {\n\t\treturn;\n\t}\n\n\tdocument.querySelector(\"#wgact_copy_log_file_links\").addEventListener(\"click\", event => {\n\t\tevent.preventDefault();\n\n\t\tconst jsonOfLinks = JSON.parse(event.target.dataset.links);\n\n\t\tlet strOfLinks = \"\";\n\n\t\tfor (let i = 0, len = jsonOfLinks.length; i < len; i++) {\n\t\t\tstrOfLinks += jsonOfLinks[i] + \"\\n\";\n\t\t}\n\n\t\tpmw.copyTextToClipboard(strOfLinks);\n\n\t\t// make the button text change to \"Copied!\" and keep the same width and text for 3 seconds\n\t\tlet button = document.getElementById(\"wgact_copy_log_file_links\");\n\t\tbutton.style.width = getComputedStyle(button).width;\n\t\tconst originalText = button.innerHTML;\n\t\tbutton.innerHTML = event.target.dataset.textCopied;\n\t\tsetTimeout(function () {\n\t\t\tbutton.innerHTML = originalText;\n\t\t}, 3000);\n\t});\n});\n\n// on pressing enter in form inputs, click the submit button\njQuery(() => {\n\tjQuery(document).on(\"keydown\", \"input, textarea, select\", function (event) {\n\t\tif (event.key === \"Enter\" && !event.shiftKey && !event.ctrlKey && !event.altKey) {\n\t\t\t// Only trigger submit if we're in a form and not in a textarea (where Enter should create new lines)\n\t\t\tconst $target = jQuery(event.target);\n\t\t\tif ($target.is(\"input\") && $target.closest(\"form\").length > 0) {\n\t\t\t\tconst form = $target.closest(\"form\")[0];\n\t\t\t\tconst submitButton = jQuery(form).find(\"#submit\");\n\t\t\t\tif (submitButton.length > 0) {\n\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\tsubmitButton.click();\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t});\n});\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","/**\n * Combine all admin scripts\n * (which only run on the wpm pages)\n */\n\n// require(\"./environment-check\")\nrequire(\"./helpers\")\nrequire(\"./script-blocker-warning\")\nrequire(\"./tabs\")\n\n// #if process.env.TIER === 'premium'\n// // require(\"./helpers_premium\")\n// #endif\n\n// console.log('Pixel Manager for WooCommerce admin script')\n"],"names":["window","pmwAdminScriptLoaded","jQuery","pmwGetPageId","sections","subsections","closest","hide","each","push","this","data","forEach","section","badge","append","after","pmwCreateSubtabUlHtml","on","e","preventDefault","addClass","siblings","removeClass","sectionSlug","pmwToggleSections","children","trigger","stopPropagation","pmwToggleSubsection","parent","pmwGetSectionParams","sectionParams","subsectionsKeys","Object","keys","html","subsectionKey","subtab","queryString","location","search","urlParams","URLSearchParams","get","nextUntil","andSelf","show","sectionPos","findIndex","arrayElement","prevAll","next","pmwSetUrl","subsectionSlug","delete","newParams","history","pushState","document","pathname","val","pmwGetAdminPath","URL","attr","includes","currentTarget","textarea","select","setSelectionRange","pmw","copyTextToClipboard","successElement","fadeIn","setTimeout","fadeOut","getElementById","addEventListener","readSettingsFile","readGa4DataApiCredentials","saveGa4DataApiCredentialsToDb","prop","source","button","originalText","text","fetch","pmwAdminApi","root","method","headers","nonce","body","credentials","then","response","ok","Error","status","blob","url","createObjectURL","a","createElement","href","download","Date","toISOString","slice","replace","appendChild","click","revokeObjectURL","removeChild","catch","error","console","alert","saveSettingsToDisk","value","timestamp","settings","JSON","parse","warn","Blob","type","anchor","getDateTimeFromTimestamp","target","style","display","isNaN","getCurrentDateForFileName","date","timezone","offset","wpTimezoneOffsetMs","getTime","getUTCFullYear","getUTCMonth","getUTCDate","getUTCHours","getUTCMinutes","getUTCSeconds","getFullYear","getMonth","getDate","getHours","getMinutes","getSeconds","file","files","reader","FileReader","onload","result","innerHTML","contents","saveImportedSettingsToDb","readAsText","stringify","json","async","message","success","log","Promise","resolve","reload","restoreBackup","deleteGa4DataApiCredentials","responseJson","getAiBotUrl","pmw_cody","loadAiChatWindow","panel","iframe","src","classList","add","closeChatbot","remove","codyAvailable","available","ltvRecalculation","event","displayStatusMessage","elements","getElementsByClassName","i","length","removeAllMessages","dataset","action","is_scheduled","displayRunImmediatelyButton","is_running","disabled","navigator","clipboard","writeText","err","chatbotWidget","chatbotListItem","chatbotToggle","chatbotClose","key","querySelector","jsonOfLinks","links","strOfLinks","len","width","getComputedStyle","textCopied","shiftKey","ctrlKey","altKey","$target","is","form","submitButton","find","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","undefined","exports","module","__webpack_modules__","require"],"ignoreList":[],"sourceRoot":""}1 {"version":3,"file":"pmw-admin.p1.min.js","mappings":"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","sources":["webpack://Pixel-Manager-for-WooCommerce/./src/js-src/admin/save.js","webpack://Pixel-Manager-for-WooCommerce/./src/js-src/admin/script-blocker-warning.js","webpack://Pixel-Manager-for-WooCommerce/./src/js-src/admin/tabs.js","webpack://Pixel-Manager-for-WooCommerce/./src/js-src/admin/ssp.js","webpack://Pixel-Manager-for-WooCommerce/./src/js-src/admin/helpers.js","webpack://Pixel-Manager-for-WooCommerce/webpack/bootstrap","webpack://Pixel-Manager-for-WooCommerce/./src/js-src/admin/main.js"],"sourcesContent":["/**\n * AJAX settings save handler.\n *\n * Intercepts the form submit, serializes all fields (PMW core + add-on tabs),\n * and POSTs to the REST endpoint. Displays success/error notices inline.\n *\n * @since 1.57.0\n */\n\njQuery(function ($) {\n\n\tconst $form = $(\"#pmw_settings_form\")\n\n\tif (!$form.length) return\n\n\t$form.on(\"submit\", function (e) {\n\t\te.preventDefault()\n\n\t\tconst $submitBtn = $form.find(\"#submit\")\n\t\tconst originalLabel = $submitBtn.val()\n\n\t\t// Disable button and show loading state\n\t\t$submitBtn.prop(\"disabled\", true).val(\"Saving…\")\n\n\t\t// Remove any previous notices\n\t\t$(\".pmw-save-notice\").remove()\n\n\t\t// Serialize the entire form (captures all tabs including hidden checkbox fallbacks)\n\t\tconst formData = $form.serialize()\n\n\t\tfetch(pmwAdminApi.root + \"pmw/v1/options/save\", {\n\t\t\tmethod: \"POST\",\n\t\t\theaders: {\n\t\t\t\t\"Content-Type\": \"application/x-www-form-urlencoded\",\n\t\t\t\t\"X-WP-Nonce\": pmwAdminApi.nonce,\n\t\t\t},\n\t\t\tbody: formData,\n\t\t})\n\t\t\t.then(response => response.json())\n\t\t\t.then(data => {\n\n\t\t\t\tif (data.success && (!data.errors || data.errors.length === 0)) {\n\t\t\t\t\t// Reload the page to refresh PHP-rendered dynamic state (active/inactive badges, etc.)\n\t\t\t\t\t// The current tab is preserved via the URL params set by pmwSetUrl()\n\t\t\t\t\twindow.location.reload()\n\t\t\t\t} else {\n\t\t\t\t\tlet errorHtml = data.message || \"Settings saved with errors.\"\n\n\t\t\t\t\tif (data.errors && data.errors.length > 0) {\n\t\t\t\t\t\terrorHtml += \"<ul style=\\\"margin: 4px 0 0 16px; list-style: disc;\\\">\"\n\t\t\t\t\t\tdata.errors.forEach(function (err) {\n\t\t\t\t\t\t\terrorHtml += \"<li>\" + err + \"</li>\"\n\t\t\t\t\t\t})\n\t\t\t\t\t\terrorHtml += \"</ul>\"\n\t\t\t\t\t}\n\n\t\t\t\t\tpmwShowSaveNotice(\"error\", errorHtml)\n\t\t\t\t}\n\t\t\t})\n\t\t\t.catch(err => {\n\t\t\t\tconsole.error(\"PMW settings save error:\", err)\n\t\t\t\tpmwShowSaveNotice(\"error\", \"An unexpected error occurred while saving settings. Please try again.\")\n\t\t\t})\n\t\t\t.finally(() => {\n\t\t\t\t$submitBtn.prop(\"disabled\", false).val(originalLabel)\n\t\t\t})\n\t})\n\n\t/**\n\t * Show a WordPress-style admin notice after save.\n\t *\n\t * @param {string} type \"success\" or \"error\"\n\t * @param {string} message The HTML message to display\n\t */\n\tfunction pmwShowSaveNotice(type, message) {\n\t\tconst noticeClass = type === \"success\" ? \"notice-success\" : \"notice-error\"\n\n\t\tconst $notice = $(\n\t\t\t\"<div class=\\\"notice \" + noticeClass + \" is-dismissible pmw-save-notice\\\" style=\\\"margin: 10px 0;\\\">\" +\n\t\t\t\"<p>\" + message + \"</p>\" +\n\t\t\t\"<button type=\\\"button\\\" class=\\\"notice-dismiss\\\"><span class=\\\"screen-reader-text\\\">Dismiss this notice.</span></button>\" +\n\t\t\t\"</div>\"\n\t\t)\n\n\t\t// Insert after the tab wrapper\n\t\t$(\".nav-tab-wrapper\").after($notice)\n\n\t\t// Dismiss handler\n\t\t$notice.find(\".notice-dismiss\").on(\"click\", function () {\n\t\t\t$notice.fadeOut(200, function () {\n\t\t\t\t$(this).remove()\n\t\t\t})\n\t\t})\n\n\t\t// Auto-dismiss success notices after 5 seconds\n\t\tif (type === \"success\") {\n\t\t\tsetTimeout(function () {\n\t\t\t\t$notice.fadeOut(400, function () {\n\t\t\t\t\t$(this).remove()\n\t\t\t\t})\n\t\t\t}, 5000)\n\t\t}\n\n\t\t// Scroll to notice\n\t\t$(\"html, body\").animate({ scrollTop: $notice.offset().top - 50 }, 300)\n\t}\n})\n","/**\n * Signal that the PMW admin script has loaded successfully.\n *\n * The PHP code sets up a detection mechanism that waits for window.load,\n * then checks if this flag is set. If not, it shows the script blocker warning.\n *\n * This approach ensures:\n * - No false positives on slow-loading pages\n * - Warning only shows when the script is actually blocked\n */\nwindow.pmwAdminScriptLoaded = true;\n","jQuery(function () {\n\n\t// Don't run if we are not one of the\n\t// WPM main tabs\n\tif (\"pmw\" !== pmwGetPageId()) return\n\n\tlet sections = []\n\tlet subsections = {}\n\n\t// Hide unnecessary elements\n\tjQuery(\".section\").closest(\"tr\").hide()\n\n\t// Collect information on sections\n\tjQuery(\".section\").each(function () {\n\t\tsections.push({\n\t\t\t\"slug\" : jQuery(this).data(\"sectionSlug\"),\n\t\t\t\"title\" : jQuery(this).data(\"sectionTitle\"),\n\t\t\t\"badgeCount\" : jQuery(this).data(\"badgeCount\") || 0,\n\t\t\t\"priority\" : parseInt(jQuery(this).data(\"priority\"), 10) || 50,\n\t\t\t\"showSaveButton\": jQuery(this).data(\"showSaveButton\"),\n\t\t})\n\t})\n\n\t// Sort sections by priority (ascending)\n\tsections.sort(function (a, b) {\n\t\treturn a.priority - b.priority\n\t})\n\n\t// Collect information on subsections\n\tjQuery(\".subsection\").each(function () {\n\n\t\tsubsections[jQuery(this).data(\"sectionSlug\")] = subsections[jQuery(this).data(\"sectionSlug\")] || []\n\n\t\tsubsections[jQuery(this).data(\"sectionSlug\")].push({\n\t\t\t\"title\": jQuery(this).data(\"subsectionTitle\"),\n\t\t\t\"slug\" : jQuery(this).data(\"subsectionSlug\"),\n\t\t})\n\t})\n\n\t// Create tabs for sections\n\tsections.forEach(\n\t\tfunction (section) {\n\t\t\tlet badge = section[\"badgeCount\"] > 0 ? \"<span class=\\\"pmw-tab-badge\\\">\" + section[\"badgeCount\"] + \"</span>\" : \"\"\n\t\t\tjQuery(\".nav-tab-wrapper\").append(\"<a href=\\\"#\\\" class=\\\"nav-tab\\\" data-section-slug=\\\"\" + section[\"slug\"] + \"\\\">\" + section[\"title\"] + badge + \"</a>\")\n\t\t})\n\n\t// Create tabs for each subsections\n\tjQuery(\".nav-tab-wrapper\").after(pmwCreateSubtabUlHtml(subsections))\n\n\t// Create on-click events on section tabs that toggle the views\n\tjQuery(\".nav-tab-wrapper a\").on(\"click\", function (e) {\n\n\t\te.preventDefault()\n\n\t\t// show clicked tab as active\n\t\tjQuery(this).addClass(\"nav-tab-active\").siblings().removeClass(\"nav-tab-active\")\n\n\t\t// toggle the sections visible / invisible based on clicked tab\n\n\t\tlet sectionSlug = jQuery(this).data(\"section-slug\")\n\t\tpmwToggleSections(sectionSlug, sections)\n\n\t\t// if subsection exists, click on first subsection\n\t\tif (sectionSlug in subsections) {\n\t\t\tjQuery(\"ul[data-section-slug=\" + sectionSlug + \"]\").children(\":first\").trigger(\"click\")\n\t\t}\n\t})\n\n\t// Create on-click events on subsection tabs that toggle the views\n\tjQuery(\".pmw-subnav-li\").on(\"click\", function (e) {\n\n\t\te.preventDefault()\n\t\te.stopPropagation()\n\n\t\t// jQuery(this).hide();\n\t\tjQuery(this)\n\t\t\t.addClass(\"pmw-subnav-li-active\").removeClass(\"pmw-subnav-li-inactive\")\n\t\t\t.siblings()\n\t\t\t.addClass(\"pmw-subnav-li-inactive\").removeClass(\"pmw-subnav-li-active\")\n\n\t\tpmwToggleSubsection(jQuery(this).parent().data(\"section-slug\"), jQuery(this).data(\"subsection-slug\"))\n\t})\n\n\t/**\n\t * If someone accesses a plugin tab by deep link, open the right tab\n\t * or fallback to default (first tab)\n\t *\n\t * If deeplink is being opened,\n\t * open the according section and subsection\n\t */\n\tif (pmwGetSectionParams()) {\n\n\t\tlet sectionParams = pmwGetSectionParams()\n\n\t\tjQuery(\"a[data-section-slug=\" + sectionParams[\"section\"] + \"]\").trigger(\"click\")\n\n\t\tif (sectionParams[\"subsection\"] !== false) {\n\t\t\tjQuery(\"ul[data-section-slug=\" + sectionParams[\"section\"] + \"]\").children(\"[data-subsection-slug=\" + sectionParams[\"subsection\"] + \"]\").trigger(\"click\")\n\t\t}\n\t} else {\n\t\tjQuery(\"a[data-section-slug=\" + sections[0][\"slug\"] + \"]\").trigger(\"click\")\n\t}\n})\n\n// Creates the html with all subsection elements\npmwCreateSubtabUlHtml = (subsections) => {\n\n\tlet subsectionsKeys = Object.keys(subsections)\n\n\tlet html = \"\"\n\n\tsubsectionsKeys.forEach(function (subsectionKey) {\n\t\thtml += \"<ul class=\\\"pmw-subnav-tabs\\\" data-section-slug=\\\"\" + subsectionKey + \"\\\">\"\n\n\t\tlet subtabs = subsections[subsectionKey]\n\n\t\tsubtabs.forEach(function (subtab) {\n\t\t\thtml += \"<li class=\\\"pmw-subnav-li pmw-subnav-li-inactive\\\" style=\\\"cursor: pointer;\\\" data-subsection-slug=\\\"\" + subtab[\"slug\"] + \"\\\">\" + subtab[\"title\"] + \"</li>\"\n\t\t})\n\n\t\thtml += \"</ul>\"\n\t})\n\n\treturn html\n}\n\n/**\n * If section (and subsection) URL parameters are set,\n * return them, otherwise return false\n */\npmwGetSectionParams = () => {\n\n\tconst queryString = window.location.search\n\tconst urlParams = new URLSearchParams(queryString)\n\n\tif (urlParams.get(\"section\")) {\n\t\treturn {\n\t\t\t\"section\" : urlParams.get(\"section\"),\n\t\t\t\"subsection\": urlParams.get(\"subsection\"),\n\t\t}\n\t} else {\n\t\treturn false\n\t}\n}\n\n// Toggles the sections\npmwToggleSections = (sectionSlug, sections) => {\n\n\tjQuery(\"#pmw_settings_form > h2\").nextUntil(\".submit\").andSelf().hide()\n\tjQuery(\".pmw-subnav-tabs\").hide()\n\tjQuery(\".pmw-subnav-tabs[data-section-slug=\" + sectionSlug + \"]\").show()\n\n\tlet sectionPos = sections.findIndex((arrayElement) => arrayElement[\"slug\"] === sectionSlug)\n\n\tjQuery(\"div[data-section-slug=\" + sectionSlug + \"]\").closest(\"table\").prevAll(\"h2:first\").next().nextUntil(\"h2, .submit\").andSelf().show()\n\n\t// set the URL with the active tab parameter\n\tpmwSetUrl(sections[sectionPos][\"slug\"])\n}\n\npmwToggleSubsection = (sectionSlug, subsectionSlug) => {\n\n\tjQuery(\"#pmw_settings_form > h2\").nextUntil(\".submit\").andSelf().hide()\n\tjQuery(\"[data-section-slug=\" + sectionSlug + \"][data-subsection-slug=\" + subsectionSlug + \"]\").closest(\"tr\").siblings().andSelf().hide()\n\n\tjQuery(\"[data-section-slug=\" + sectionSlug + \"][data-subsection-slug=\" + subsectionSlug + \"]\").closest(\"table\").show()\n\tjQuery(\"[data-section-slug=\" + sectionSlug + \"][data-subsection-slug=\" + subsectionSlug + \"]\").closest(\"tr\").nextUntil(jQuery(\"[data-section-slug=\" + sectionSlug + \"][data-subsection-slug]\").closest(\"tr\")).show()\n\n\t// Set the URL with the active tab parameter\n\tpmwSetUrl(sectionSlug, subsectionSlug)\n}\n\n// Sets the new URL parameters\npmwSetUrl = (sectionSlug, subsectionSlug = \"\") => {\n\n\tconst queryString = window.location.search\n\tconst urlParams = new URLSearchParams(queryString)\n\n\turlParams.delete(\"section\")\n\turlParams.delete(\"subsection\")\n\n\tlet newParams = \"section=\" + sectionSlug\n\tnewParams += subsectionSlug ? \"&subsection=\" + subsectionSlug : \"\"\n\n\thistory.pushState(\"\", \"pmw\" + sectionSlug, document.location.pathname + \"?page=pmw&\" + newParams)\n\n}\n\npmwGetPageId = () => {\n\n\tconst queryString = window.location.search\n\tconst urlParams = new URLSearchParams(queryString)\n\n\treturn urlParams.get(\"page\")\n}\n\n// On click of an element that contains a data-section-slug with any value, toggle save button\njQuery(document).on(\"click\", \"[data-section-slug]\", function () {\n\n\t// Find the section config to check showSaveButton attribute\n\tconst sectionSlug = jQuery(this).data(\"sectionSlug\") || jQuery(this).data(\"section-slug\")\n\tconst $sectionDiv = jQuery(\".section[data-section-slug='\" + sectionSlug + \"']\")\n\n\tif ($sectionDiv.length && $sectionDiv.data(\"showSaveButton\") == 0) {\n\t\tjQuery(\".submit\").hide()\n\t} else {\n\t\tjQuery(\".submit\").show()\n\t}\n})\n\n\n// if a link with the class advanced-section-link is clicked,\n// get the data-AS-section and the data-AS-subsection values of the clicked element\n// and trigger a click on the element with the data-ssection-slug value and a click on the element with the data-subsection-slug value\njQuery(document).on(\"click\", \".advanced-section-link\", (e) => {\n\n\te.preventDefault()\n\n\tlet sectionSlug = jQuery(e.currentTarget).data(\"as-section\")\n\tlet subsectionSlug = jQuery(e.currentTarget).data(\"as-subsection\")\n\n\tjQuery(`a[data-section-slug=${sectionSlug}]`).trigger(\"click\")\n\n\tjQuery(`ul[data-section-slug=${sectionSlug}]`).children(`[data-subsection-slug=${subsectionSlug}]`).trigger(\"click\")\n})\n","/**\n * SSP (Server Side Proxy) admin tab interactions.\n *\n * Handles activate, enable/disable toggle, disconnect,\n * sync, test connection, and proxy failure behavior setting.\n *\n * @since 1.57.0\n */\n\njQuery(function ($) {\n\n\tconst $activateBtn = $(\"#pmw-ssp-activate-btn\")\n\tconst $reactivateBtn = $(\"#pmw-ssp-reactivate-btn\")\n\tconst $disableBtn = $(\"#pmw-ssp-disable-btn\")\n\tconst $disconnectBtn = $(\"#pmw-ssp-disconnect-btn\")\n\tconst $syncBtn = $(\"#pmw-ssp-sync-btn\")\n\tconst $testBtn = $(\"#pmw-ssp-test-btn\")\n\tconst $tokenInput = $(\"#pmw-ssp-sync-token\")\n\tconst $failureBehavior = $(\"#pmw-ssp-failure-behavior\")\n\n\t// If no SSP elements exist on the page, bail early\n\tif (!$activateBtn.length && !$syncBtn.length) return\n\n\tconst showStatus = ($el, message, type) => {\n\t\tconst className = type === \"success\"\n\t\t\t? \"pmw-ssp-msg-success\"\n\t\t\t: type === \"error\"\n\t\t\t\t? \"pmw-ssp-msg-error\"\n\t\t\t\t: \"pmw-ssp-msg-loading\"\n\n\t\t$el.html(`<span class=\"${className}\">${message}</span>`)\n\t}\n\n\tconst clearStatus = ($el) => {\n\t\t$el.html(\"\")\n\t}\n\n\tconst apiCall = (endpoint, method, body) => {\n\t\tconst opts = {\n\t\t\tmethod,\n\t\t\tcredentials: \"same-origin\",\n\t\t\theaders: {\n\t\t\t\t\"Content-Type\": \"application/json\",\n\t\t\t\t\"X-WP-Nonce\": pmwAdminApi.nonce,\n\t\t\t},\n\t\t}\n\n\t\tif (body) {\n\t\t\topts.body = JSON.stringify(body)\n\t\t}\n\n\t\treturn fetch(pmwAdminApi.root + \"pmw/v1/ssp/\" + endpoint, opts)\n\t\t\t.then(response => response.json())\n\t}\n\n\t// ─── Activate ──────────────────────────────────────────\n\n\t$activateBtn.on(\"click\", function () {\n\t\tconst token = $.trim($tokenInput.val())\n\n\t\tif (!token) {\n\t\t\tshowStatus($(\"#pmw-ssp-activate-status\"), \"Please enter a sync token.\", \"error\")\n\t\t\treturn\n\t\t}\n\n\t\t// Basic hex validation\n\t\tif (!/^[a-f0-9]{32,64}$/i.test(token)) {\n\t\t\tshowStatus($(\"#pmw-ssp-activate-status\"), \"Invalid token format. Expected a hex string (32-64 characters).\", \"error\")\n\t\t\treturn\n\t\t}\n\n\t\t$activateBtn.prop(\"disabled\", true).text(\"Activating…\")\n\t\tclearStatus($(\"#pmw-ssp-activate-status\"))\n\n\t\tapiCall(\"activate\", \"POST\", { sync_token: token })\n\t\t\t.then(data => {\n\t\t\t\tif (data.success) {\n\t\t\t\t\tshowStatus($(\"#pmw-ssp-activate-status\"), \"✓ SSP activated successfully. Reloading…\", \"success\")\n\t\t\t\t\tsetTimeout(() => window.location.reload(), 1500)\n\t\t\t\t} else {\n\t\t\t\t\tconst msg = data.message || data.data?.message || \"Activation failed.\"\n\t\t\t\t\tshowStatus($(\"#pmw-ssp-activate-status\"), msg, \"error\")\n\t\t\t\t\t$activateBtn.prop(\"disabled\", false).text(\"Activate\")\n\t\t\t\t}\n\t\t\t})\n\t\t\t.catch(err => {\n\t\t\t\tshowStatus($(\"#pmw-ssp-activate-status\"), \"Network error: \" + err.message, \"error\")\n\t\t\t\t$activateBtn.prop(\"disabled\", false).text(\"Activate\")\n\t\t\t})\n\t})\n\n\t// ─── Enable / Disable Buttons ─────────────────────────\n\n\t$reactivateBtn.on(\"click\", function () {\n\t\t$reactivateBtn.prop(\"disabled\", true).text(\"Re-activating…\")\n\t\tshowStatus($(\"#pmw-ssp-toggle-status\"), \"Re-activating…\", \"loading\")\n\n\t\tapiCall(\"enable\", \"POST\")\n\t\t\t.then(data => {\n\t\t\t\tif (data.success) {\n\t\t\t\t\tshowStatus($(\"#pmw-ssp-toggle-status\"), \"✓ \" + data.message + \" Reloading…\", \"success\")\n\t\t\t\t\tsetTimeout(() => window.location.reload(), 1500)\n\t\t\t\t} else {\n\t\t\t\t\tconst msg = data.message || data.data?.message || \"Re-activation failed.\"\n\t\t\t\t\tshowStatus($(\"#pmw-ssp-toggle-status\"), msg, \"error\")\n\t\t\t\t\t$reactivateBtn.prop(\"disabled\", false).text(\"Re-activate\")\n\t\t\t\t}\n\t\t\t})\n\t\t\t.catch(err => {\n\t\t\t\tshowStatus($(\"#pmw-ssp-toggle-status\"), \"Network error: \" + err.message, \"error\")\n\t\t\t\t$reactivateBtn.prop(\"disabled\", false).text(\"Re-activate\")\n\t\t\t})\n\t})\n\n\t$disableBtn.on(\"click\", function () {\n\t\t$disableBtn.prop(\"disabled\", true).text(\"Disabling…\")\n\t\tshowStatus($(\"#pmw-ssp-toggle-status\"), \"Disabling…\", \"loading\")\n\n\t\tapiCall(\"disable\", \"POST\")\n\t\t\t.then(data => {\n\t\t\t\tif (data.success) {\n\t\t\t\t\tshowStatus($(\"#pmw-ssp-toggle-status\"), \"✓ \" + data.message + \" Reloading…\", \"success\")\n\t\t\t\t\tsetTimeout(() => window.location.reload(), 1500)\n\t\t\t\t} else {\n\t\t\t\t\tconst msg = data.message || data.data?.message || \"Disable failed.\"\n\t\t\t\t\tshowStatus($(\"#pmw-ssp-toggle-status\"), msg, \"error\")\n\t\t\t\t\t$disableBtn.prop(\"disabled\", false).text(\"Disable\")\n\t\t\t\t}\n\t\t\t})\n\t\t\t.catch(err => {\n\t\t\t\tshowStatus($(\"#pmw-ssp-toggle-status\"), \"Network error: \" + err.message, \"error\")\n\t\t\t\t$disableBtn.prop(\"disabled\", false).text(\"Disable\")\n\t\t\t})\n\t})\n\n\t// ─── Disconnect ────────────────────────────────────────\n\n\t$disconnectBtn.on(\"click\", function () {\n\t\tif (!confirm(\n\t\t\t\"Disconnect from SSP?\\n\\n\" +\n\t\t\t\"This will permanently delete the sync token and remove all connection data. \" +\n\t\t\t\"You will need to re-enter the token from the SSP portal to reconnect.\\n\\n\" +\n\t\t\t\"Continue?\"\n\t\t)) {\n\t\t\treturn\n\t\t}\n\n\t\t$disconnectBtn.prop(\"disabled\", true).text(\"Disconnecting…\")\n\n\t\tapiCall(\"disconnect\", \"POST\")\n\t\t\t.then(data => {\n\t\t\t\tif (data.success) {\n\t\t\t\t\tshowStatus($(\"#pmw-ssp-disconnect-status\"), \"SSP disconnected. Reloading…\", \"success\")\n\t\t\t\t\tsetTimeout(() => window.location.reload(), 1500)\n\t\t\t\t} else {\n\t\t\t\t\tshowStatus($(\"#pmw-ssp-disconnect-status\"), data.message || \"Disconnect failed.\", \"error\")\n\t\t\t\t\t$disconnectBtn.prop(\"disabled\", false).text(\"Disconnect\")\n\t\t\t\t}\n\t\t\t})\n\t\t\t.catch(err => {\n\t\t\t\tshowStatus($(\"#pmw-ssp-disconnect-status\"), \"Network error: \" + err.message, \"error\")\n\t\t\t\t$disconnectBtn.prop(\"disabled\", false).text(\"Disconnect\")\n\t\t\t})\n\t})\n\n\t// ─── Proxy Failure Behavior ────────────────────────────\n\n\t$failureBehavior.on(\"change\", function () {\n\t\tconst value = $(this).val()\n\n\t\tshowStatus($(\"#pmw-ssp-failure-behavior-status\"), \"Saving…\", \"loading\")\n\n\t\tapiCall(\"save-setting\", \"POST\", { key: \"proxy_failure_behavior\", value })\n\t\t\t.then(data => {\n\t\t\t\tif (data.success) {\n\t\t\t\t\tshowStatus($(\"#pmw-ssp-failure-behavior-status\"), \"✓ Saved\", \"success\")\n\t\t\t\t\tsetTimeout(() => clearStatus($(\"#pmw-ssp-failure-behavior-status\")), 3000)\n\t\t\t\t} else {\n\t\t\t\t\tshowStatus($(\"#pmw-ssp-failure-behavior-status\"), data.message || \"Save failed.\", \"error\")\n\t\t\t\t}\n\t\t\t})\n\t\t\t.catch(err => {\n\t\t\t\tshowStatus($(\"#pmw-ssp-failure-behavior-status\"), \"Network error: \" + err.message, \"error\")\n\t\t\t})\n\t})\n\n\t/**\n\t * Update plan and usage status fields from a sync response.\n\t */\n\tconst updateSyncMeta = (status) => {\n\t\tif (!status) return\n\n\t\tif (status.last_sync_at_formatted) {\n\t\t\t$(\"#pmw-ssp-last-sync\").text(status.last_sync_at_formatted)\n\t\t}\n\n\t\tif (status.plan_name) {\n\t\t\tlet planHtml = status.plan_name\n\t\t\tif (status.subscription_status && status.subscription_status !== \"active\") {\n\t\t\t\tplanHtml += ` <span class=\"pmw-ssp-badge pmw-ssp-badge--inactive\">${status.subscription_status.charAt(0).toUpperCase() + status.subscription_status.slice(1)}</span>`\n\t\t\t}\n\t\t\t$(\"#pmw-ssp-plan-name\").html(planHtml)\n\t\t}\n\n\t\tif (typeof status.monthly_request_limit !== \"undefined\" && status.monthly_request_limit > 0) {\n\t\t\tconst fmt = (n) => n.toLocaleString()\n\t\t\t$(\"#pmw-ssp-usage\").text(\n\t\t\t\t`${fmt(status.billable_this_period)} / ${fmt(status.monthly_request_limit)} events (${status.usage_percent}%)`\n\t\t\t)\n\t\t}\n\t}\n\n\t// ─── Sync Now ──────────────────────────────────────────\n\n\t$syncBtn.on(\"click\", function () {\n\t\t$syncBtn.prop(\"disabled\", true).text(\"Syncing…\")\n\t\tshowStatus($(\"#pmw-ssp-action-status\"), \"Pushing configuration…\", \"loading\")\n\n\t\tapiCall(\"sync\", \"POST\")\n\t\t\t.then(data => {\n\t\t\t\tif (data.success) {\n\t\t\t\t\tshowStatus($(\"#pmw-ssp-action-status\"), \"✓ Config synced successfully. Reloading…\", \"success\")\n\t\t\t\t\tupdateSyncMeta(data.status)\n\t\t\t\t\tsetTimeout(() => window.location.reload(), 1500)\n\t\t\t\t} else {\n\t\t\t\t\tshowStatus($(\"#pmw-ssp-action-status\"), data.message || data.data?.message || \"Sync failed.\", \"error\")\n\t\t\t\t\t$syncBtn.prop(\"disabled\", false).text(\"Sync Now\")\n\t\t\t\t}\n\t\t\t})\n\t\t\t.catch(err => {\n\t\t\t\tshowStatus($(\"#pmw-ssp-action-status\"), \"Network error: \" + err.message, \"error\")\n\t\t\t\t$syncBtn.prop(\"disabled\", false).text(\"Sync Now\")\n\t\t\t})\n\t})\n\n\t// ─── Test Connection ───────────────────────────────────\n\n\t$testBtn.on(\"click\", function () {\n\t\t$testBtn.prop(\"disabled\", true).text(\"Testing…\")\n\t\tshowStatus($(\"#pmw-ssp-action-status\"), \"Testing proxy connectivity…\", \"loading\")\n\n\t\tapiCall(\"test\", \"POST\")\n\t\t\t.then(data => {\n\t\t\t\tif (data.success) {\n\t\t\t\t\tshowStatus($(\"#pmw-ssp-action-status\"), \"✓ \" + data.message, \"success\")\n\t\t\t\t} else {\n\t\t\t\t\tshowStatus($(\"#pmw-ssp-action-status\"), data.message || \"Connection test failed.\", \"error\")\n\t\t\t\t}\n\t\t\t\t$testBtn.prop(\"disabled\", false).text(\"Test Connection\")\n\t\t\t})\n\t\t\t.catch(err => {\n\t\t\t\tshowStatus($(\"#pmw-ssp-action-status\"), \"Network error: \" + err.message, \"error\")\n\t\t\t\t$testBtn.prop(\"disabled\", false).text(\"Test Connection\")\n\t\t\t})\n\t})\n})\n","jQuery(function () {\n\n\t/**\n\t * Copy debug info to clipboard when the button is clicked.\n\t */\n\tjQuery(\"#debug-info-button\").on(\"click\", () => {\n\t\t// Select text in textarea\n\t\tconst textarea = jQuery(\"#debug-info-textarea\")[0];\n\t\ttextarea.select();\n\t\ttextarea.setSelectionRange(0, 99999); // For mobile devices\n\n\t\t// Copy selected text to clipboard\n\t\tpmw.copyTextToClipboard(jQuery(\"#debug-info-textarea\").val());\n\n\t\t// Show success message and hide after 3 seconds\n\t\tconst successElement = jQuery(\"#debug-info-success\");\n\t\tsuccessElement.fadeIn(200);\n\t\tsetTimeout(() => successElement.fadeOut(200), 3000);\n\t});\n\n\tjQuery(\"#pmw-pro-version-demo\").on(\"click\", function () {\n\t\tjQuery(\"#submit\").trigger(\"click\");\n\t});\n\n\tif (document.getElementById(\"json-settings-file-input\")) {\n\t\tdocument.getElementById(\"json-settings-file-input\")\n\t\t\t.addEventListener(\"change\", pmw.readSettingsFile, false);\n\t}\n\n\t// if element ga4-data-api-credentials-upload-button exists, then we are on the GA4 settings page\n\tif (document.getElementById(\"ga4-data-api-credentials-upload-button\")) {\n\n\t\tdocument.getElementById(\"ga4-data-api-credentials-upload-button\")\n\t\t\t.addEventListener(\"change\", pmw.readGa4DataApiCredentials, false);\n\t}\n\n\t// if element ga4-data-api-credentials-upload-button exists, then we are on the GA4 settings page\n\tif (document.getElementById(\"ga4-data-api-credentials-delete-button\")) {\n\n\t\tdocument.getElementById(\"ga4-data-api-credentials-delete-button\")\n\t\t\t.addEventListener(\"click\", () => {\n\t\t\t\tpmw.saveGa4DataApiCredentialsToDb({});\n\t\t\t}, false);\n\t}\n\n\t/**\n\t * Handle log files download via REST API\n\t */\n\tjQuery(\"#wgact_download_logs_zip\").on(\"click\", function(e) {\n\t\te.preventDefault();\n\t\t\n\t\tif (jQuery(this).prop(\"disabled\")) {\n\t\t\treturn;\n\t\t}\n\t\t\n\t\tconst source = jQuery(this).data(\"source\");\n\t\tconst button = jQuery(this);\n\t\tconst originalText = button.text();\n\t\t\n\t\t// Disable button and change text\n\t\tbutton.prop(\"disabled\", true).text(\"Downloading...\");\n\t\t\n\t\t// Use fetch with proper authentication\n\t\tfetch(pmwAdminApi.root + \"pmw/v1/logs/download\", {\n\t\t\tmethod: \"POST\",\n\t\t\theaders: {\n\t\t\t\t\"Content-Type\": \"application/x-www-form-urlencoded\",\n\t\t\t\t\"X-WP-Nonce\": pmwAdminApi.nonce\n\t\t\t},\n\t\t\tbody: new URLSearchParams({\n\t\t\t\tsource: source\n\t\t\t}),\n\t\t\tcredentials: 'same-origin'\n\t\t})\n\t\t.then(response => {\n\t\t\tif (!response.ok) {\n\t\t\t\tthrow new Error(`HTTP error! status: ${response.status}`);\n\t\t\t}\n\t\t\treturn response.blob();\n\t\t})\n\t\t.then(blob => {\n\t\t\t// Create download link\n\t\t\tconst url = window.URL.createObjectURL(blob);\n\t\t\tconst a = document.createElement(\"a\");\n\t\t\ta.href = url;\n\t\t\ta.download = \"pmw-logs-\" + new Date().toISOString().slice(0,19).replace(/:/g, \"-\") + \".zip\";\n\t\t\tdocument.body.appendChild(a);\n\t\t\ta.click();\n\t\t\twindow.URL.revokeObjectURL(url);\n\t\t\tdocument.body.removeChild(a);\n\t\t\t\n\t\t\t// Re-enable the button\n\t\t\tbutton.prop(\"disabled\", false).text(originalText);\n\t\t})\n\t\t.catch(error => {\n\t\t\tconsole.error(\"Download error:\", error);\n\t\t\tbutton.prop(\"disabled\", false).text(originalText);\n\t\t\talert(\"Error downloading log files. Please try again.\");\n\t\t});\n\t});\n});\n\n// jQuery(function () {\n//\n// \timport(\"../../../node_modules/@floating-ui/dom/dist/floating-ui.dom.mjs\")\n// \t\t.then(({\n// \t\t\t\t computePosition,\n// \t\t\t\t flip,\n// \t\t\t\t shift,\n// \t\t\t\t offset,\n// \t\t\tarrow,\n// \t\t\t }) => {\n// \t\t\tconsole.log(\"computePosition: \", computePosition)\n//\n// \t\t\tconst button = document.querySelector('#button');\n// \t\t\tconst tooltip = document.querySelector('#tooltip');\n// \t\t\tconst arrowElement = document.querySelector('#arrow');\n//\n// \t\t\tcomputePosition(button, tooltip, {\n// \t\t\t\tplacement: 'top',\n// \t\t\t\tmiddleware: [\n// \t\t\t\t\toffset(6),\n// \t\t\t\t\tflip(),\n// \t\t\t\t\tshift({padding: 5}),\n// \t\t\t\t\tarrow({element: arrowElement}),\n// \t\t\t\t],\n// \t\t\t}).then(({x, y}) => {\n// \t\t\t\tObject.assign(tooltip.style, {\n// \t\t\t\t\tleft: `${x}px`,\n// \t\t\t\t\ttop: `${y}px`,\n// \t\t\t\t});\n// \t\t\t});\n//\n// \t\t})\n// \t\t.catch(err => {\n// \t\t\tconsole.error(err)\n// \t\t})\n//\n// });\n\n\n(function (pmw, $, undefined) {\n\n\tpmw.saveSettingsToDisk = () => {\n\t\tlet text = document.getElementById(\"export-settings-json\").value;\n\n\t\t// Extract timestamp from the settings JSON\n\t\tlet timestamp = \"unknown\";\n\t\ttry {\n\t\t\tlet settings = JSON.parse(text);\n\t\t\tif (settings.timestamp) {\n\t\t\t\ttimestamp = settings.timestamp;\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tconsole.warn(\"Could not extract timestamp from settings:\", error);\n\t\t}\n\n\t\ttext = text.replace(/\\n/g, \"\\r\\n\"); // To retain the Line breaks.\n\t\tlet blob = new Blob([text], {type: \"text/plain\"});\n\t\tlet anchor = document.createElement(\"a\");\n\t\tanchor.download = \"pixel-manager-settings_\" + timestamp + \"_\" + pmw.getDateTimeFromTimestamp(timestamp) + \".json\";\n\t\tanchor.href = window.URL.createObjectURL(blob);\n\t\tanchor.target = \"_blank\";\n\t\tanchor.style.display = \"none\"; // just to be safe!\n\t\tdocument.body.appendChild(anchor);\n\t\tanchor.click();\n\t\tdocument.body.removeChild(anchor);\n\t};\n\n\t// Get date and time from timestamp in year.month.day_hour-minute-second format. All components are zero padded.\n\t// Uses WordPress site timezone to match what's displayed on admin pages.\n\tpmw.getDateTimeFromTimestamp = (timestamp) => {\n\t\t// If timestamp is \"unknown\" or invalid, fall back to current date/time\n\t\tif (timestamp === \"unknown\" || !timestamp || isNaN(timestamp)) {\n\t\t\treturn pmw.getCurrentDateForFileName();\n\t\t}\n\n\t\t// Convert Unix timestamp (seconds) to milliseconds for JavaScript Date\n\t\tlet date = new Date(timestamp * 1000);\n\n\t\t// Apply WordPress timezone offset if available\n\t\tif (pmwAdminApi && pmwAdminApi.timezone && typeof pmwAdminApi.timezone.offset === \"number\") {\n\t\t\t// Create new date in WordPress timezone by adding the offset\n\t\t\tlet wpTimezoneOffsetMs = pmwAdminApi.timezone.offset * 60 * 60 * 1000; // Convert hours to milliseconds\n\t\t\tdate = new Date(date.getTime() + wpTimezoneOffsetMs);\n\n\t\t\t// Get WordPress timezone date/time components using UTC methods\n\t\t\t// (since we've already applied the offset to the date object)\n\t\t\tlet year = date.getUTCFullYear();\n\t\t\tlet month = (\"0\" + (date.getUTCMonth() + 1)).slice(-2);\n\t\t\tlet day = (\"0\" + date.getUTCDate()).slice(-2);\n\t\t\tlet hours = (\"0\" + date.getUTCHours()).slice(-2);\n\t\t\tlet minutes = (\"0\" + date.getUTCMinutes()).slice(-2);\n\t\t\tlet seconds = (\"0\" + date.getUTCSeconds()).slice(-2);\n\n\t\t\treturn year + \".\" + month + \".\" + day + \"_\" + hours + \"-\" + minutes + \"-\" + seconds;\n\t\t} else {\n\t\t\t// Fallback to browser local timezone if WordPress timezone data is not available\n\t\t\tlet year = date.getFullYear();\n\t\t\tlet month = (\"0\" + (date.getMonth() + 1)).slice(-2);\n\t\t\tlet day = (\"0\" + date.getDate()).slice(-2);\n\t\t\tlet hours = (\"0\" + date.getHours()).slice(-2);\n\t\t\tlet minutes = (\"0\" + date.getMinutes()).slice(-2);\n\t\t\tlet seconds = (\"0\" + date.getSeconds()).slice(-2);\n\t\t\treturn year + \".\" + month + \".\" + day + \"_\" + hours + \"-\" + minutes + \"-\" + seconds;\n\t\t}\n\t};\n\n\t// Get current date and time in year.month.day_hour-minute-second format. All components are zero padded.\n\t// Uses WordPress site timezone to match what's displayed on admin pages.\n\tpmw.getCurrentDateForFileName = () => {\n\t\tlet date = new Date();\n\n\t\t// Apply WordPress timezone offset if available\n\t\tif (pmwAdminApi && pmwAdminApi.timezone && typeof pmwAdminApi.timezone.offset === \"number\") {\n\t\t\t// Apply WordPress timezone offset\n\t\t\tlet wpTimezoneOffsetMs = pmwAdminApi.timezone.offset * 60 * 60 * 1000; // Convert hours to milliseconds\n\t\t\tdate = new Date(date.getTime() + wpTimezoneOffsetMs);\n\n\t\t\t// Get WordPress timezone date/time components using UTC methods\n\t\t\t// (since we've already applied the offset to the date object)\n\t\t\tlet year = date.getUTCFullYear();\n\t\t\tlet month = (\"0\" + (date.getUTCMonth() + 1)).slice(-2);\n\t\t\tlet day = (\"0\" + date.getUTCDate()).slice(-2);\n\t\t\tlet hours = (\"0\" + date.getUTCHours()).slice(-2);\n\t\t\tlet minutes = (\"0\" + date.getUTCMinutes()).slice(-2);\n\t\t\tlet seconds = (\"0\" + date.getUTCSeconds()).slice(-2);\n\n\t\t\treturn year + \".\" + month + \".\" + day + \"_\" + hours + \"-\" + minutes + \"-\" + seconds;\n\t\t} else {\n\t\t\t// Fallback to browser local timezone if WordPress timezone data is not available\n\t\t\tlet year = date.getFullYear();\n\t\t\tlet month = (\"0\" + (date.getMonth() + 1)).slice(-2);\n\t\t\tlet day = (\"0\" + date.getDate()).slice(-2);\n\t\t\tlet hours = (\"0\" + date.getHours()).slice(-2);\n\t\t\tlet minutes = (\"0\" + date.getMinutes()).slice(-2);\n\t\t\tlet seconds = (\"0\" + date.getSeconds()).slice(-2);\n\t\t\treturn year + \".\" + month + \".\" + day + \"_\" + hours + \"-\" + minutes + \"-\" + seconds;\n\t\t}\n\n\t\t// return date.toLocaleDateString(\n\t\t// \t\"en-US\", {\n\t\t// \t\tyear : \"numeric\",\n\t\t// \t\tmonth: \"2-digit\",\n\t\t// \t\tday : \"2-digit\",\n\t\t// \t},\n\t\t// )\n\t};\n\n\tpmw.readSettingsFile = e => {\n\n\t\tlet file = e.target.files[0];\n\t\tif (!file) return;\n\t\tlet reader = new FileReader();\n\t\treader.onload = function (e) {\n\n\t\t\t// Check if the file is a valid JSON file\n\t\t\t// If it is not a valid JSON file, display an error message\n\t\t\ttry {\n\t\t\t\tJSON.parse(e.target.result);\n\t\t\t} catch (error) {\n\t\t\t\tdocument.getElementById(\"settings-upload-status-error\").style.display = \"block\";\n\t\t\t\tdocument.getElementById(\"settings-upload-status-error-message\").innerHTML = \"Invalid JSON file.\";\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tlet contents = JSON.parse(e.target.result);\n\n\t\t\t// document.getElementById(\"import-settings-json\").textContent = JSON.stringify(contents)\n\n\t\t\tpmw.saveImportedSettingsToDb(contents);\n\t\t};\n\t\treader.readAsText(file);\n\t};\n\n\tpmw.saveImportedSettingsToDb = settings => {\n\n\t\tfetch(pmwAdminApi.root + \"pmw/v1/settings/\", {\n\t\t\tmethod : \"POST\",\n\t\t\tcredentials: \"same-origin\",\n\t\t\theaders : {\n\t\t\t\t\"Content-Type\": \"application/json\",\n\t\t\t\t\"X-WP-Nonce\" : pmwAdminApi.nonce,\n\t\t\t},\n\t\t\tbody : JSON.stringify(settings),\n\t\t})\n\t\t\t.then(response => response.json())\n\t\t\t.then(async message => {\n\t\t\t\tif (message.success) {\n\t\t\t\t\tconsole.log(message);\n\t\t\t\t\t// reload window\n\t\t\t\t\tdocument.getElementById(\"settings-upload-status-success\").style.display = \"block\";\n\t\t\t\t\t// wait 5 seconds\n\t\t\t\t\tawait new Promise(resolve => setTimeout(resolve, 1000));\n\t\t\t\t\twindow.location.reload();\n\t\t\t\t} else {\n\t\t\t\t\tconsole.log(message);\n\t\t\t\t\tdocument.getElementById(\"settings-upload-status-error\").style.display = \"block\";\n\t\t\t\t}\n\t\t\t})\n\t\t\t.catch(error => {\n\t\t\t\tconsole.error(error);\n\t\t\t\tdocument.getElementById(\"settings-upload-status-error\").style.display = \"block\";\n\t\t\t});\n\t};\n\n\tpmw.restoreBackup = (timestamp) => {\n\n\t\tconsole.log(\"restoreBackup() - timestamp: \", timestamp);\n\n\t\tfetch(pmwAdminApi.root + \"pmw/v1/options-backup/\" + timestamp + \"/restore\", {\n\t\t\tmethod : \"POST\",\n\t\t\tcredentials: \"same-origin\",\n\t\t\theaders : {\n\t\t\t\t\"Content-Type\": \"application/json\",\n\t\t\t\t\"X-WP-Nonce\" : pmwAdminApi.nonce,\n\t\t\t},\n\t\t})\n\t\t\t.then(response => response.json())\n\t\t\t.then(async message => {\n\n\t\t\t\tif (message?.data?.message) {\n\t\t\t\t\tconsole.log(\"restoreBackup() - message: \", message.data.message);\n\t\t\t\t}\n\n\t\t\t\tif (message.success) {\n\t\t\t\t\twindow.location.reload();\n\t\t\t\t} else {\n\t\t\t\t\talert(message.data.message);\n\t\t\t\t}\n\n\t\t\t})\n\t\t\t.catch(error => {\n\t\t\t\tconsole.error(error);\n\t\t\t\talert(error.message);\n\t\t\t});\n\t};\n\n\tpmw.readGa4DataApiCredentials = e => {\n\n\t\tlet file = e.target.files[0];\n\t\tif (!file) return;\n\t\tlet reader = new FileReader();\n\t\treader.onload = function (e) {\n\n\t\t\t// Check if the file is a valid JSON file\n\t\t\t// If it is not a valid JSON file, display an error message\n\t\t\ttry {\n\t\t\t\tJSON.parse(e.target.result);\n\t\t\t} catch (error) {\n\t\t\t\tdocument.getElementById(\"ga4-api-credentials-upload-status-error\").style.display = \"block\";\n\t\t\t\tdocument.getElementById(\"ga4-api-credentials-upload-status-error-message\").innerHTML = \"Invalid JSON file.\";\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tlet contents = JSON.parse(e.target.result);\n\n\t\t\t// document.getElementById(\"import-settings-json\").textContent = JSON.stringify(contents)\n\n\t\t\tpmw.saveGa4DataApiCredentialsToDb(contents);\n\t\t};\n\t\treader.readAsText(file);\n\t};\n\n\tpmw.deleteGa4DataApiCredentials = e => {\n\t\tpmw.saveGa4DataApiCredentialsToDb({});\n\t};\n\n\tpmw.saveGa4DataApiCredentialsToDb = credentials => {\n\n\t\tfetch(pmwAdminApi.root + \"pmw/v1/ga4/data-api/credentials\", {\n\t\t\tmethod : \"POST\",\n\t\t\tcredentials: \"same-origin\",\n\t\t\theaders : {\n\t\t\t\t\"Content-Type\": \"application/json\",\n\t\t\t\t\"X-WP-Nonce\" : pmwAdminApi.nonce,\n\t\t\t},\n\t\t\tbody : JSON.stringify(credentials),\n\t\t})\n\t\t\t.then(response => response.json())\n\t\t\t.then(async responseJson => {\n\t\t\t\tif (responseJson.success) {\n\t\t\t\t\tconsole.log(responseJson);\n\t\t\t\t\t// reload window\n\t\t\t\t\tdocument.getElementById(\"ga4-api-credentials-upload-status-success\").style.display = \"block\";\n\t\t\t\t\t// wait 5 seconds\n\t\t\t\t\t// await new Promise(resolve => setTimeout(resolve, 5000))\n\t\t\t\t\twindow.location.reload();\n\t\t\t\t} else {\n\t\t\t\t\tconsole.log(responseJson);\n\t\t\t\t\tdocument.getElementById(\"ga4-api-credentials-upload-status-error\").style.display = \"block\";\n\t\t\t\t\t// and add the error message\n\t\t\t\t\tdocument.getElementById(\"ga4-api-credentials-upload-status-error-message\").innerHTML = \"Error message: \" + responseJson.data.message;\n\t\t\t\t}\n\t\t\t})\n\t\t\t.catch(error => {\n\t\t\t\tconsole.error(error);\n\t\t\t\tdocument.getElementById(\"ga4-api-credentials-upload-status-error\").style.display = \"block\";\n\t\t\t});\n\t};\n\n\tpmw.getAiBotUrl = () => {\n\t\tif (pmw_cody?.url) {\n\t\t\treturn pmw_cody.url;\n\t\t}\n\t};\n\n\t/**\n\t * Opens the chatbot in a side panel (like n8n)\n\t * The panel slides in from the right side of the screen\n\t */\n\tpmw.loadAiChatWindow = () => {\n\t\tconst panel = document.getElementById(\"pmw-chatbot-panel\");\n\t\tconst iframe = document.getElementById(\"pmw-chatbot-iframe\");\n\n\t\tif (!panel || !iframe) {\n\t\t\tconsole.error(\"Chatbot panel elements not found\");\n\t\t\treturn;\n\t\t}\n\n\t\t// Set the iframe source\n\t\tiframe.src = pmw.getAiBotUrl();\n\n\t\t// Add body class to push content left\n\t\tdocument.body.classList.add(\"pmw-chatbot-open\");\n\n\t\t// Open the panel\n\t\tpanel.classList.add(\"pmw-chatbot-panel-open\");\n\t};\n\n\t/**\n\t * Closes the chatbot side panel\n\t */\n\tpmw.closeChatbot = () => {\n\t\tconst panel = document.getElementById(\"pmw-chatbot-panel\");\n\t\tif (panel) {\n\t\t\tpanel.classList.remove(\"pmw-chatbot-panel-open\");\n\t\t\t// Remove body class to restore content position\n\t\t\tdocument.body.classList.remove(\"pmw-chatbot-open\");\n\t\t}\n\t};\n\n\t/**\n\t * Check if the Cody AI chatbot is available.\n\t *\n\t * @return {boolean}\n\t */\n\tpmw.codyAvailable = () => {\n\t\tif (typeof window.pmw_cody !== \"undefined\" && window.pmw_cody?.available) {\n\t\t\treturn true;\n\t\t}\n\t\treturn false;\n\t};\n\n\t// Schedule a recalculation of the LTV by sending a POST REST request to the server\n\tpmw.ltvRecalculation = event => {\n\n\t\tconst displayStatusMessage = (message) => {\n\t\t\tlet elements = document.getElementsByClassName(\"ltv-message\");\n\t\t\tfor (let i = 0; i < elements.length; i++) {\n\t\t\t\telements[i].style.display = \"none\";\n\t\t\t}\n\t\t\tdocument.getElementById(\"ltv-message-error\").style.display = \"block\";\n\t\t\tdocument.getElementById(\"ltv-message-error-text\").innerHTML = message;\n\t\t};\n\n\t\tconst displayRunImmediatelyButton = () => {\n\t\t\tlet elements = document.getElementsByClassName(\"ltv-button-text\");\n\t\t\tfor (let i = 0; i < elements.length; i++) {\n\t\t\t\telements[i].style.display = \"none\";\n\t\t\t}\n\t\t\tdocument.getElementById(\"ltv-instant-recalculation-button-text\").style.display = \"block\";\n\t\t};\n\n\t\tconst removeAllMessages = () => {\n\t\t\tlet elements = document.getElementsByClassName(\"ltv-message\");\n\t\t\tfor (let i = 0; i < elements.length; i++) {\n\t\t\t\telements[i].style.display = \"none\";\n\t\t\t}\n\n\t\t\tdocument.getElementById(\"ltv-message-error\").style.display = \"none\";\n\t\t};\n\n\t\t// console log the data-action from the nested span element of the clicked element\n\t\t// console.log(\"event.target.dataset.action\", event.target.dataset.action)\n\n\t\tfetch(pmwAdminApi.root + \"pmw/v1/ltv/\", {\n\t\t\tmethod : \"POST\",\n\t\t\tcredentials: \"same-origin\",\n\t\t\theaders : {\n\t\t\t\t\"Content-Type\": \"application/json\",\n\t\t\t\t\"X-WP-Nonce\" : pmwAdminApi.nonce,\n\t\t\t},\n\t\t\tbody : JSON.stringify({\n\t\t\t\t\"action\": event.target.dataset.action,\n\t\t\t}),\n\t\t})\n\t\t\t.then(response => response.json())\n\t\t\t.then(message => {\n\t\t\t\tif (message.success) {\n\t\t\t\t\tconsole.log(message);\n\t\t\t\t\t// reload window\n\n\t\t\t\t\tif (message.data.status.is_scheduled) {\n\t\t\t\t\t\tremoveAllMessages();\n\t\t\t\t\t\tdisplayRunImmediatelyButton();\n\t\t\t\t\t\tdocument.getElementById(\"ltv-schedule-recalculation-confirmation-message\").style.display = \"block\";\n\t\t\t\t\t}\n\n\t\t\t\t\tif (message.data.status.is_running) {\n\t\t\t\t\t\t// Get the button element with the id \"wgact_ltv_recalculation\" and disable it\n\t\t\t\t\t\tdocument.getElementById(\"wgact_ltv_recalculation\").disabled = true;\n\t\t\t\t\t\tremoveAllMessages();\n\t\t\t\t\t\tdocument.getElementById(\"ltv-running-recalculation-confirmation-message\").style.display = \"block\";\n\t\t\t\t\t}\n\n\t\t\t\t\t// if is neither message.data.status.is_running nor message.data.status.is_scheduled\n\t\t\t\t\t// then display the error message\n\t\t\t\t\tif (!message.data.status.is_running && !message.data.status.is_scheduled) {\n\t\t\t\t\t\tdisplayStatusMessage(message.data.message);\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tconsole.error(message);\n\t\t\t\t\tdisplayStatusMessage(message.data.message);\n\t\t\t\t}\n\t\t\t})\n\t\t\t.catch(error => {\n\t\t\t\tconsole.error(error);\n\t\t\t\tdisplayStatusMessage(error);\n\t\t\t});\n\t};\n\n\tpmw.copyTextToClipboard = (text) => {\n\t\tnavigator.clipboard.writeText(text)\n\t\t\t.catch(err => {\n\t\t\t\tconsole.error(\"Failed to copy: \", err);\n\t\t\t});\n\t};\n\n}(window.pmw = window.pmw || {}, jQuery));\n\n/**\n * This script listens for the DOMContentLoaded event. Once the DOM is fully loaded,\n * it checks if the chatbot (pmw.codyAvailable()) is available.\n * If the chatbot is available, it displays the chat widget button.\n * If the chatbot is not available, it logs a message to the console indicating that the chatbot is unavailable.\n *\n * @listens document#DOMContentLoaded\n */\ndocument.addEventListener(\"DOMContentLoaded\", () => {\n\n\tif (pmw.codyAvailable()) {\n\t\tconst chatbotWidget = document.getElementById(\"pmw-chatbot-widget\");\n\t\tif (chatbotWidget) {\n\t\t\tchatbotWidget.style.display = \"block\";\n\t\t}\n\n\t\t// Show the chatbot line in the support section\n\t\tconst chatbotListItem = document.getElementById(\"pmw-chat-li\");\n\t\tif (chatbotListItem) {\n\t\t\tchatbotListItem.style.display = \"list-item\";\n\t\t}\n\n\t\t// Set up event listeners for the chatbot widget\n\t\tconst chatbotToggle = document.getElementById(\"pmw-chatbot-toggle\");\n\t\tconst chatbotClose = document.getElementById(\"pmw-chatbot-close\");\n\n\t\tif (chatbotToggle) {\n\t\t\tchatbotToggle.addEventListener(\"click\", (e) => {\n\t\t\t\te.preventDefault();\n\t\t\t\tpmw.loadAiChatWindow();\n\t\t\t});\n\t\t}\n\n\t\tif (chatbotClose) {\n\t\t\tchatbotClose.addEventListener(\"click\", (e) => {\n\t\t\t\te.preventDefault();\n\t\t\t\tpmw.closeChatbot();\n\t\t\t});\n\t\t}\n\n\t\t// Close chatbot on ESC key\n\t\tdocument.addEventListener(\"keydown\", (event) => {\n\t\t\tif (event.key === \"Escape\") {\n\t\t\t\tpmw.closeChatbot();\n\t\t\t}\n\t\t});\n\t} else {\n\t\tconsole.log(\"DOMContentLoaded - chatbot is not available\");\n\t}\n\n}, true);\n\n// Wait until the DOM is loaded, then console log\n// the message \"DOMContentLoaded - chatbot is not available\"\n// use jquery\njQuery(() => {\n\tif (document.querySelector(\"#wgact_ltv_recalculation\")) {\n\t\tdocument.querySelector(\"#wgact_ltv_recalculation\").addEventListener(\"click\", event => {\n\t\t\tevent.preventDefault();\n\t\t\tpmw.ltvRecalculation(event);\n\t\t});\n\t}\n\n\tif (document.querySelector(\"#pmw_stop_ltv_calculation\")) {\n\t\tdocument.querySelector(\"#pmw_stop_ltv_calculation\").addEventListener(\"click\", event => {\n\t\t\tevent.preventDefault();\n\t\t\tpmw.ltvRecalculation(event);\n\t\t});\n\t}\n\n\t// Add event listeners for backup restore buttons\n\tjQuery(() => {\n\t\tjQuery(document).on(\"click\", \".pmw-restore-backup-button\", function (event) {\n\t\t\tevent.preventDefault();\n\t\t\tconst timestamp = jQuery(this).data(\"timestamp\");\n\t\t\tif (timestamp) {\n\t\t\t\tpmw.restoreBackup(timestamp);\n\t\t\t}\n\t\t});\n\t});\n});\n\n/**\n * add an event listener to the button with the id \"wgact_copy_log_file_links\"\n * when the button is clicked, copy the log file links to the clipboard\n * the data-links attribute of the button contains a json string with the links\n */\njQuery(() => {\n\n\tif (!document.querySelector(\"#wgact_copy_log_file_links\")) {\n\t\treturn;\n\t}\n\n\tdocument.querySelector(\"#wgact_copy_log_file_links\").addEventListener(\"click\", event => {\n\t\tevent.preventDefault();\n\n\t\tconst jsonOfLinks = JSON.parse(event.target.dataset.links);\n\n\t\tlet strOfLinks = \"\";\n\n\t\tfor (let i = 0, len = jsonOfLinks.length; i < len; i++) {\n\t\t\tstrOfLinks += jsonOfLinks[i] + \"\\n\";\n\t\t}\n\n\t\tpmw.copyTextToClipboard(strOfLinks);\n\n\t\t// make the button text change to \"Copied!\" and keep the same width and text for 3 seconds\n\t\tlet button = document.getElementById(\"wgact_copy_log_file_links\");\n\t\tbutton.style.width = getComputedStyle(button).width;\n\t\tconst originalText = button.innerHTML;\n\t\tbutton.innerHTML = event.target.dataset.textCopied;\n\t\tsetTimeout(function () {\n\t\t\tbutton.innerHTML = originalText;\n\t\t}, 3000);\n\t});\n});\n\n// on pressing enter in form inputs, click the submit button\njQuery(() => {\n\tjQuery(document).on(\"keydown\", \"input, textarea, select\", function (event) {\n\t\tif (event.key === \"Enter\" && !event.shiftKey && !event.ctrlKey && !event.altKey) {\n\t\t\t// Only trigger submit if we're in a form and not in a textarea (where Enter should create new lines)\n\t\t\tconst $target = jQuery(event.target);\n\t\t\tif ($target.is(\"input\") && $target.closest(\"form\").length > 0) {\n\t\t\t\tconst form = $target.closest(\"form\")[0];\n\t\t\t\tconst submitButton = jQuery(form).find(\"#submit\");\n\t\t\t\tif (submitButton.length > 0) {\n\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\tsubmitButton.click();\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t});\n});\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","/**\n * Combine all admin scripts\n * (which only run on the wpm pages)\n */\n\n// require(\"./environment-check\")\nrequire(\"./helpers\")\nrequire(\"./script-blocker-warning\")\nrequire(\"./tabs\")\nrequire(\"./save\")\nrequire(\"./ssp\")\n\n// #if process.env.TIER === 'premium'\n// // require(\"./helpers_premium\")\n// #endif\n\n// console.log('Pixel Manager for WooCommerce admin script')\n"],"names":["jQuery","$","$form","pmwShowSaveNotice","type","message","$notice","after","find","on","fadeOut","this","remove","setTimeout","animate","scrollTop","offset","top","length","e","preventDefault","$submitBtn","originalLabel","val","prop","formData","serialize","fetch","pmwAdminApi","root","method","headers","nonce","body","then","response","json","data","success","errors","errorHtml","forEach","err","window","location","reload","catch","console","error","finally","pmwAdminScriptLoaded","pmwGetPageId","sections","subsections","closest","hide","each","push","parseInt","sort","a","b","priority","section","badge","append","pmwCreateSubtabUlHtml","addClass","siblings","removeClass","sectionSlug","pmwToggleSections","children","trigger","stopPropagation","pmwToggleSubsection","parent","pmwGetSectionParams","sectionParams","subsectionsKeys","Object","keys","html","subsectionKey","subtab","queryString","search","urlParams","URLSearchParams","get","nextUntil","andSelf","show","sectionPos","findIndex","arrayElement","prevAll","next","pmwSetUrl","subsectionSlug","delete","newParams","history","pushState","document","pathname","$sectionDiv","currentTarget","$activateBtn","$reactivateBtn","$disableBtn","$disconnectBtn","$syncBtn","$testBtn","$tokenInput","$failureBehavior","showStatus","$el","className","clearStatus","apiCall","endpoint","opts","credentials","JSON","stringify","token","trim","test","text","sync_token","msg","confirm","value","key","status","last_sync_at_formatted","plan_name","planHtml","subscription_status","charAt","toUpperCase","slice","monthly_request_limit","fmt","n","toLocaleString","billable_this_period","usage_percent","updateSyncMeta","textarea","select","setSelectionRange","pmw","copyTextToClipboard","successElement","fadeIn","getElementById","addEventListener","readSettingsFile","readGa4DataApiCredentials","saveGa4DataApiCredentialsToDb","source","button","originalText","ok","Error","blob","url","URL","createObjectURL","createElement","href","download","Date","toISOString","replace","appendChild","click","revokeObjectURL","removeChild","alert","saveSettingsToDisk","timestamp","settings","parse","warn","Blob","anchor","getDateTimeFromTimestamp","target","style","display","isNaN","getCurrentDateForFileName","date","timezone","wpTimezoneOffsetMs","getTime","getUTCFullYear","getUTCMonth","getUTCDate","getUTCHours","getUTCMinutes","getUTCSeconds","getFullYear","getMonth","getDate","getHours","getMinutes","getSeconds","file","files","reader","FileReader","onload","result","innerHTML","contents","saveImportedSettingsToDb","readAsText","async","log","Promise","resolve","restoreBackup","deleteGa4DataApiCredentials","responseJson","getAiBotUrl","pmw_cody","loadAiChatWindow","panel","iframe","src","classList","add","closeChatbot","codyAvailable","available","ltvRecalculation","event","displayStatusMessage","elements","getElementsByClassName","i","removeAllMessages","dataset","action","is_scheduled","displayRunImmediatelyButton","is_running","disabled","navigator","clipboard","writeText","chatbotWidget","chatbotListItem","chatbotToggle","chatbotClose","querySelector","jsonOfLinks","links","strOfLinks","len","width","getComputedStyle","textCopied","shiftKey","ctrlKey","altKey","$target","is","form","submitButton","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","undefined","exports","module","__webpack_modules__","require"],"ignoreList":[],"sourceRoot":""} -
woocommerce-google-adwords-conversion-tracking-tag/trunk/js/public/free/pmw-public.p1.min.js
r3451824 r3468312 1 /*! Copyright 2025 SweetCode. All rights reserved. */(()=>{var e,r,t,a,i={50(){const e=e=>e=(e=e.replace(/<[^>]*>?/gm,"").replace(/\n/gm,"").replace(/\t/gm,"")).trim();jQuery("form.woocommerce-checkout").on("change","#shipping_method",t=>{t.target?.value&&t.target?.id&&r({slug:t.target.value,text:e(jQuery("label[for='"+t.target.id+"']").text())})}),jQuery(()=>{if(jQuery("#shipping_method").length){let t=jQuery("#shipping_method").find(":checked");if(t.length){if(!t.val())return;if(!t.attr("id"))return;r({slug:t.val(),text:e(jQuery("label[for='"+t.attr("id")+"']").text())})}}});const r=e=>{jQuery(document).trigger("pmw:add-shipping-info",{shippingTier:e})};let t=!1;jQuery("form.woocommerce-checkout").on("change",'input[name="payment_method"]',r=>{r.target.value&&r.target.id&&(a({slug:r.target.value,text:e(jQuery("label[for='"+r.target.id+"']").text())}),t=!0)}),jQuery(()=>{if(t)return;let r=jQuery('input[name="payment_method"]:checked');if(r.length){if(!r.val())return;if(!r.attr("id"))return;a({slug:r.val(),text:e(jQuery("label[for='"+r.attr("id")+"']").text())})}});const a=e=>{jQuery(document).trigger("pmw:add-payment-info",{paymentType:e})};jQuery(document).on("click",".remove_from_cart_button, .remove",e=>{try{let r=new URL(jQuery(e.currentTarget).attr("href")),t=pmw.getProductIdByCartItemKeyUrl(r);pmw.removeProductFromCart(t)}catch(e){console.error(e)}});const i=pmw.prepareSelectors([".checkout-button",".cart-checkout-button",".button.checkout",".xoo-wsc-ft-btn-checkout",".elementor-button--checkout",".xt_woofc-checkout",".fkcart-checkout--text"],"beginCheckout");jQuery(document).on("click init_checkout",i,()=>{jQuery(document).trigger("pmw:begin-checkout")}),jQuery(document).on("updated_cart_totals",()=>{jQuery(document).trigger("pmw:view-cart")}),jQuery(document).on("pmwLoad",e=>{jQuery(document).on("payment_method_selected",()=>{!1===pmw.paymentMethodSelected&&pmw.fireCheckoutProgress(3),pmw.fireCheckoutOption(3,jQuery("input[name='payment_method']:checked").val()),pmw.paymentMethodSelected=!0})}),jQuery(document).on("pmwLoad",()=>{try{pmw.initCart()}catch(e){console.error(e)}}),jQuery(document).on("pmwLoad",()=>{pmwDataLayer.products=pmwDataLayer.products||{};let e=pmw.getAddToCartLinkProductIds();pmw.getProductsFromBackend(e)}),jQuery(document).on("pmwLoad",()=>{if(!document.referrer)return;if(pmw.retrieveData("referrer"))return;let e=new URL(document.referrer).hostname;e!==window.location.host&&pmw.storeData("referrer",e)}),jQuery(document).on("pmwLoad",()=>{let e=pmw.getUrlParameter("gclid");e&&pmw.storeData("gclid",e);let r=pmw.getUrlParameter("wbraid");r&&pmw.storeData("wbraid",r);let t=pmw.getUrlParameter("gbraid");t&&pmw.storeData("gbraid",t);let a=pmw.getUrlParameter("fbclid");a&&(a="fb.1."+Math.floor(Date.now()/1e3)+"."+a,pmw.storeData("fbclid",a));let i=pmw.getUrlParameter("ttclid");i&&pmw.storeData("ttclid",i);let o=pmw.getUrlParameter("ScCid");o&&pmw.storeData("scid",o);let n=pmw.getUrlParameter("epik");n&&pmw.storeData("epik",n)}),jQuery(document).on("pmwLoad",()=>{try{if("undefined"!=typeof pmwDataLayer&&!pmwDataLayer?.pmw_loaded){if(jQuery(document).trigger("pmw:load-always"),pmwDataLayer?.shop)if("product"===pmwDataLayer.shop.page_type&&"variable"!==pmwDataLayer.shop.product_type&&pmw.getMainProductIdFromProductPage()){let e=pmw.getProductDataForViewItemEvent(pmw.getMainProductIdFromProductPage());jQuery(document).trigger("pmw:view-item",e)}else if("product"===pmwDataLayer.shop.page_type&&"variable"===pmwDataLayer.shop.product_type&&!pmwDataLayer?.shop?.variations_output&&pmw.getMainProductIdFromProductPage()){let e=pmw.getProductDataForViewItemEvent(pmw.getMainProductIdFromProductPage());jQuery(document).trigger("pmw:view-item",e)}else"product_category"===pmwDataLayer.shop.page_type?jQuery(document).trigger("pmw:view-category"):"search"===pmwDataLayer.shop.page_type?jQuery(document).trigger("pmw:search"):"cart"===pmwDataLayer.shop.page_type?jQuery(document).trigger("pmw:view-cart"):"order_received_page"===pmwDataLayer.shop.page_type?pmwDataLayer?.order&&!pmw.isOrderIdStored(pmwDataLayer.order.id)&&(jQuery(document).trigger("pmw:purchase"),pmw.writeOrderIdToStorage(pmwDataLayer.order.id,pmwDataLayer.order.key),"function"==typeof pmw.acrRemoveCookie&&pmw.acrRemoveCookie()):jQuery(document).trigger("pmw:everywhere-else");else jQuery(document).trigger("pmw:everywhere-else");pmwDataLayer?.user?.id&&!pmw.hasLoginEventFired()&&(jQuery(document).trigger("pmw:login"),pmw.setLoginEventFired()),pmwDataLayer .pmw_loaded=!0}}catch(e){console.error(e)}}),pmwDataLayer?.general?.lazy_load_pmw&&pmw.registerShowVariationEventListener(),jQuery(document).on("pmwLoad",()=>{if(pmwDataLayer?.general?.lazy_load_pmw&&pmwDataLayer?.shop?.variations_output)try{const e=jQuery(".variations_form");if(!e.length)return;const r={};if(!e.find("select").toArray().every(e=>{const t=jQuery(e).val();return!!t&&(r[jQuery(e).attr("name")]=t,!0)}))return;const t=e.data("product_variations");if(!t)return;const a=t.find(e=>Object.entries(r).every(([r,t])=>e.attributes[r]===t));a&&pmw.triggerViewItemEventPrep(a.variation_id)}catch(e){pmw.console.error(e)}}),jQuery(document).on("pmwLoad",async()=>{!1===pmw.retrieveData("restEndpointAvailable")&&pmw.console.error("REST endpoint is not available. Using admin-ajax.php instead.")}),jQuery(document).on("pmw:page-view",async e=>{pmw.console.log("pmw:page-view event fired",{event:e});const r=await pmw.processEvent("page_view",{});if(pmwDataLayer?.general?.server_2_server?.pageview_event_s2s?.is_active){const e=pmw.pixelRegistry.getPixelsWithCapability("supportsPageViewS2S");if(e.length>0){const t={event:"page_view"};for(const a of e)r.pixels[a]&&(t[a]=r.pixels[a]);Object.keys(t).length>1&&pmw.sendEventPayloadToServer(t)}}}),jQuery(document).on("pmw:add-to-cart",async(e,r)=>{pmw.console.log("pmw:add-to-cart event fired",{event:e,product:r}),await pmw.processEvent("add_to_cart",{product:r})}),jQuery(document).on("pmw:remove-from-cart",async(e,r)=>{pmw.console.log("pmw:remove-from-cart event fired",{event:e,product:r}),await pmw.processEvent("remove_from_cart",{product:r})}),jQuery(document).on("pmw:select-item",async(e,r)=>{pmw.console.log("pmw:select-item event fired",{event:e,product:r}),await pmw.processEvent("select_item",{product:r})}),jQuery(document).on("pmw:view-cart",e=>{pmw.console.log("pmw:view-cart event fired",{event:e}),pmw.processEvent("view_cart",{})}),jQuery(document).on("pmw:begin-checkout",e=>{pmw.console.log("pmw:begin-checkout event fired",{event:e}),pmw.processEvent("begin_checkout",{})}),jQuery(document).on("pmw:add-payment-info",e=>{pmw.console.log("pmw:add-payment-info event fired",{event:e}),pmw.processEvent("add_payment_info",{})}),jQuery(document).on("pmw:add-to-wishlist",async(e,r)=>{pmw.console.log("pmw:add-to-wishlist event fired",{event:e,product:r}),await pmw.processEvent("add_to_wishlist",{product:r})}),jQuery(document).on("pmw:view-item",(e,r=null)=>{pmw.console.log("pmw:view-item event fired",{event:e,product:r}),pmw.processEvent("view_item",{product:r})}),jQuery(document).on("pmw:view-category",async(e,r=null)=>{pmw.console.log("pmw:view-category event fired",{event:e,product:r}),await pmw.processEvent("view_category",{product:r})}),jQuery(document).on("pmw:search",e=>{pmw.console.log("pmw:search event fired",{event:e}),pmw.processEvent("search",{})}),jQuery(document).on("pmw:place-order",async e=>{pmw.console.log("pmw:place-order event fired",{event:e}),await pmw.processEvent("place_order",{})}),jQuery(document).on("pmw:purchase",async e=>{pmw.console.log("pmw:purchase event fired",{event:e}),await pmw.processEvent("purchase",{order:pmwDataLayer.order})}),jQuery(document).on("pmw:login",async()=>{pmw.console.log("pmw:login event fired"),await pmw.processEvent("login",{})}),jQuery(document).on("pmw:ready",async()=>{pmw.isWooCommerceActive()&&(pmw.startIntersectionObserverToWatch(),pmw.startProductsMutationObserverToWatch())}),jQuery(document).on("pmw:load-pixels",()=>{pmw.waitForPixelsAndTriggerPageView()})},79(e,r,t){t(897),window.pmw.loadConsentModule=async()=>{const e=await t.e(625).then(t.bind(t,383));window.pmw.consent=e;const r=await t.e(968).then(t.bind(t,523));return window.pmw=window.pmw||{},window.pmw.consent=window.pmw.consent||{},window.pmw.consent.api=r,e},window.pmw=window.pmw||{},window.pmw.console=t(91),t(362)},91(e,r,t){"use strict";t.r(r),t.d(r,{error:()=>i,log:()=>a});const a=(e,...r)=>{o()&&("object"==typeof e?console.log("Pixel Manager: ",e,...r):r.length?console.log("Pixel Manager: "+e,...r):console.log("Pixel Manager: "+e))},i=(e,...r)=>{"object"==typeof e?console.error("Pixel Manager: ",e,...r):r.length?console.error("Pixel Manager: "+e,...r):console.error("Pixel Manager: "+e)},o=()=>!n()&&(!!s()||(!!c()||!!pmwDataLayer?.general?.logger?.is_active)),n=()=>(pmw.urlHasParameter("pmwloggeroff")&&pmw.storeData("loggerEnabled",!1),pmw.urlHasParameter("pmwloggeroff")),s=()=>pmw.retrieveData("loggerEnabled"),c=()=>(pmw.urlHasParameter("pmwloggeron")&&pmw.storeData("loggerEnabled",!0),pmw.urlHasParameter("pmwloggeron"))},160(e,r,t){"use strict";var a=this&&this.__spreadArrays||function(){for(var e=0,r=0,t=arguments.length;r<t;r++)e+=arguments[r].length;var a=Array(e),i=0;for(r=0;r<t;r++)for(var o=arguments[r],n=0,s=o.length;n<s;n++,i++)a[i]=o[n];return a};Object.defineProperty(r,"__esModule",{value:!0}),r.isSpecial=r.isReserved=r.isIPv4MappedAddress=r.isLocalhost=r.isPrivate=r.createChecker=r.isInSubnet=r.extractMappedIpv4=void 0;var i=t(609),o=t(503),n=/\./,s=/^(.+:ffff:)(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})(?:%.+)?$/,c=/:/,u=/::/;function p(e){if(!i.isIPv6(e))throw new Error("not a valid IPv6 address: "+e);if(n.test(e))return p(function(e){var r=e.match(s);if(!r||!i.isIPv4(r[2]))throw new Error("not a mapped IPv4 address: "+e);var t=r[1],a=r[2].split(n).map(function(e){return parseInt(e,10)});return""+t+((a[0]<<8)+a[1]).toString(16)+":"+((a[2]<<8)+a[3]).toString(16)}(e));var r=e.split(u),t=r[0],a=r[1],o=t&&t.split(c)||[],d=a&&a.split(c)||[],l=new Array(8-(o.length+d.length));return o.concat(l,d)}function d(e){if(Array.isArray(e)){var r=e.map(function(e){return l(e)});return function(e){var t=p(e);return r.some(function(e){return e(t)})}}var t=l(e);return function(e){var r=p(e);return t(r)}}function l(e){var r=e.split("/"),t=r[0],a=r[1],i=parseInt(a,10);if(!t||!Number.isInteger(i))throw new Error("not a valid IPv6 CIDR subnet: "+e);if(i<0||i>128)throw new Error("not a valid IPv6 prefix length: "+i+" (from "+e+")");var o=p(t);return function(e){for(var r=0;r<8;++r){var t=Math.min(i-16*r,16);if(t<=0)break;if((o[r]&&parseInt(o[r],16)||0)>>16-t!==(e[r]&&parseInt(e[r],16)||0)>>16-t)return!1}return!0}}r.extractMappedIpv4=function(e){var r=e.match(s);if(!r||!i.isIPv4(r[2]))throw new Error("not a mapped IPv4 address: "+e);return r[2]},r.isInSubnet=function(e,r){return d(r)(e)},r.createChecker=d;var m={};r.isPrivate=function(e){return"private"in m==!1&&(m.private=d(o.default.private.ipv6)),m.private(e)},r.isLocalhost=function(e){return"localhost"in m==!1&&(m.localhost=d(o.default.localhost.ipv6)),m.localhost(e)},r.isIPv4MappedAddress=function(e){if("mapped"in m==!1&&(m.mapped=d("::ffff:0:0/96")),m.mapped(e)){var r=e.match(s);return Boolean(r&&i.isIPv4(r[2]))}return!1},r.isReserved=function(e){return"reserved"in m==!1&&(m.reserved=d(o.default.reserved.ipv6)),m.reserved(e)},r.isSpecial=function(e){return"special"in m==!1&&(m.special=d(a(o.default.private.ipv6,o.default.localhost.ipv6,o.default.reserved.ipv6))),m.special(e)}},165(e,r,t){!function(e){e.jQueryExists=async()=>new Promise(e=>{!function r(){if("undefined"!=typeof jQuery)return e();setTimeout(r,100)}()}),e.waitForLibrary=(e,r=5e3,t=100)=>{const a=Date.now();for(;void 0===window[e]&&!(Date.now()-a>r);)setTimeout(()=>{},t)},e.dataLayerFullyLoaded=async()=>{let e=new Promise(e=>{!function r(){if("undefined"!=typeof pmwDataLayer&&void 0!==pmwDataLayer.version)return e();setTimeout(r,100)}()}),r=setTimeout(()=>{console.error("Pixel Manager error: The pmwDataLayer is not defined. Please make sure that the pmwDataLayer script snippet is inserted and not modified by any third-party plugin, such as a consent management platform or a JavaScript optimizer.")},6e3);return e.then(()=>{clearTimeout(r)}),e},e.wpHooksExists=async()=>new Promise(e=>{!function r(){if("undefined"!=typeof wp&&void 0!==wp.hooks)return e();setTimeout(r,50)}()}),e.loadWcHooksFunctions=async()=>{await e.wpHooksExists(),await t.e(194).then(t.t.bind(t,224,23))}}(window.pmw=window.pmw||{},jQuery)},208(){!function(e){window.pmw=window.pmw||{},e.hooks={filters:{},addFilter:function(r,t,a,i=10){r&&"string"==typeof r?t&&"string"==typeof t?"function"==typeof a?(this.filters[r]||(this.filters[r]=[]),this.filters[r].push({namespace:t,callback:a,priority:i}),this.filters[r].sort((e,r)=>e.priority-r.priority),e.console.log(`Filter added: ${r} (${t}) with priority ${i}`)):e.console.error("Invalid callback provided to addFilter"):e.console.error("Invalid namespace provided to addFilter"):e.console.error("Invalid hook name provided to addFilter")},applyFilters:function(r,t,...a){if(!this.filters[r]||0===this.filters[r].length)return t;let i=t;for(const t of this.filters[r])try{const o=t.callback(i,...a);undefined!==o?i=o:e.console.warn(`Filter ${t.namespace} on ${r} returned undefined, keeping previous value`)}catch(a){e.console.error(`Filter error in ${t.namespace} on ${r}:`,a)}return i},removeFilter:function(r,t){if(!this.filters[r])return;const a=this.filters[r].length;this.filters[r]=this.filters[r].filter(e=>e.namespace!==t),this.filters[r].length<a&&e.console.log(`Filter removed: ${r} (${t})`)},removeAllFilters:function(r){this.filters[r]&&(delete this.filters[r],e.console.log(`All filters removed for: ${r}`))},hasFilter:function(e,r=null){return!(!this.filters[e]||0===this.filters[e].length)&&(!r||this.filters[e].some(e=>e.namespace===r))},getFilters:function(e){return this.filters[e]||[]}},e.hooks=e.hooks}(window.pmw=window.pmw||{},jQuery)},265(e,r,t){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.check=r.isSpecial=r.isReserved=r.isIPv4MappedAddress=r.isLocalhost=r.isPrivate=r.createChecker=r.isInSubnet=r.IPv6=r.IPv4=r.isIPv6=r.isIPv4=r.isIP=void 0;var a=t(618);r.IPv4=a;var i=t(160);r.IPv6=i;var o=t(609),n=t(609);function s(e,r){return c(r)(e)}function c(e){if(!Array.isArray(e))return c([e]);var r=e.reduce(function(e,r){var t=r.split("/")[0];return e[o.isIP(t)].push(r),e},{0:[],4:[],6:[]});if(0!==r[0].length)throw new Error("some subnets are not valid IP addresses: "+r[0]);var t=a.createChecker(r[4]),n=i.createChecker(r[6]);return function(e){if(!o.isIP(e))throw new Error("not a valid IPv4 or IPv6 address: "+e);return o.isIPv6(e)&&i.isIPv4MappedAddress(e)?n(e)||t(i.extractMappedIpv4(e)):o.isIPv6(e)?n(e):t(e)}}Object.defineProperty(r,"isIP",{enumerable:!0,get:function(){return n.isIP}}),Object.defineProperty(r,"isIPv4",{enumerable:!0,get:function(){return n.isIPv4}}),Object.defineProperty(r,"isIPv6",{enumerable:!0,get:function(){return n.isIPv6}}),r.isInSubnet=s,r.createChecker=c,r.isPrivate=function(e){return o.isIPv6(e)?i.isIPv4MappedAddress(e)?a.isPrivate(i.extractMappedIpv4(e)):i.isPrivate(e):a.isPrivate(e)},r.isLocalhost=function(e){return o.isIPv6(e)?i.isIPv4MappedAddress(e)?a.isLocalhost(i.extractMappedIpv4(e)):i.isLocalhost(e):a.isLocalhost(e)},r.isIPv4MappedAddress=function(e){return!!o.isIPv6(e)&&i.isIPv4MappedAddress(e)},r.isReserved=function(e){return o.isIPv6(e)?i.isIPv4MappedAddress(e)?a.isReserved(i.extractMappedIpv4(e)):i.isReserved(e):a.isReserved(e)},r.isSpecial=function(e){return o.isIPv6(e)?i.isIPv4MappedAddress(e)?a.isSpecial(i.extractMappedIpv4(e)):i.isSpecial(e):a.isSpecial(e)},r.check=s},341(){!function(e){e.getConsentContext=function(){const r=e.consent?.categories?.get()||{statistics:!0,marketing:!0,preferences:!0,necessary:!0};return{categories:{statistics:r.statistics,marketing:r.marketing,preferences:r.preferences,necessary:r.necessary},visitor_has_chosen:e.consent?.settings?.get()?.visitorHasChosen??!1,explicit_mode:e.consent?.explicitConsentModeActive?.()??!1}},e.getEventContext=function(){return{timestamp:Math.floor(Date.now()/1e3),url:window.location.href,referrer:e.retrieveData("referrer")?e.makeFullUrl(e.retrieveData("referrer")):document.referrer,user_agent:navigator.userAgent,page_type:pmwDataLayer?.shop?.page_type,user_id:pmwDataLayer?.user?.id?.raw||null,consent:e.getConsentContext()}},e.processEvent=async function(r,t){e.console.log(`Processing event: ${r}`,t);try{let a={event:r,event_data:t,pixels:{},context:e.getEventContext()};a=e.hooks.applyFilters("pmw_event_payload_pre",a,r);const i=e.pixelRegistry.getActivePixels();for(const t of i){const i=e.pixelRegistry.getAdapter(t);if(i&&"function"==typeof i.adapt)try{let o=await i.adapt(a.event_data,r,a.context);if(null===o)continue;o=e.hooks.applyFilters(`pmw_pixel_data_${t}`,o,r,a.event_data,a.context),a.pixels[t]=o}catch(r){e.console.error(`Error adapting data for ${t}:`,r)}else e.console.log(`No adapter found for pixel: ${t}`)}a=e.hooks.applyFilters(`pmw_event_payload_${r}`,a,a.event_data),a=e.hooks.applyFilters("pmw_event_payload_post",a,r),a.firing={};for(const t of Object.keys(a.pixels))a.firing[t]=e.pixelRegistry.getFiringDecision(t,r);return await e.dispatchToPixels(a),a}catch(t){throw e.console.error(`Error processing event ${r}:`,t),t}},e.dispatchToPixels=async function(r){const t=r.event;if(e.dispatchUnifiedEvent(r),e.dispatchPublicEvent(r),"purchase"!==t){if(pmwDataLayer?.general?.server_2_server?.active){const a=e.extractS2SData(r);if(Object.keys(a).length>0){const r=e.pixelRegistry.getPixelsForServerFiring(t);e.console.log(`S2S enabled pixels for ${t}:`,r),await e.sendEventPayloadToServer(a)}}}else e.console.log("Purchase event - skipping browser-to-server transmission (handled server-side only)")},e.dispatchUnifiedEvent=function(r){const t=e.pixelRegistry.getActivePixels();if(0===t.length)return;const a=r.event.replace(/_/g,"-");e.console.log(`Dispatching unified event pmw:pixel:${a}`,{activePixels:t,firingStatus:r.firing}),jQuery(document).trigger(`pmw:pixel:${a}`,r)},e.dispatchToBrowserPixels=function(r){const t=e.pixelRegistry.getActiveBrowserOnlyPixels();if(0===t.length)return;e.console.log(`[DEPRECATED] Dispatching to browser-only pixels for ${r.event}:`,t);const a=r.event.replace(/_/g,"-");jQuery(document).trigger(`pmw:browser:${a}`,r)},e.dispatchToS2SPixels=function(r){const t=e.pixelRegistry.getActiveS2SPixels();if(0===t.length)return;e.console.log(`[DEPRECATED] Dispatching to S2S-capable pixels for ${r.event}:`,t);const a=r.event.replace(/_/g,"-");jQuery(document).trigger(`pmw:s2s:${a}`,r)},e.dispatchPublicEvent=function(r){const t=r.event.replace(/_/g,"-");jQuery(document).trigger(`pmw:event:${t}`,r),e.console.log(`Public event dispatched: pmw:event:${t}`,r)},e.extractS2SData=function(r){const t={event:r.event},a=e.pixelRegistry.getPixelsForServerFiring(r.event);for(const e of a)r.pixels[e]&&(t[e]=r.pixels[e]);return r.event_data?.product&&(t.product=r.event_data.product),t},e.shouldFireBrowserPixel=function(e,r){return!0===e.firing?.[r]?.fire_browser},e.shouldFireServerPixel=function(e,r){return!0===e.firing?.[r]?.fire_server},e.adapters||(e.adapters={}),e.registerAdapter=function(r,t,a={}){if(!t||"function"!=typeof t.adapt)return void e.console.error(`Invalid adapter for ${r}: must have an adapt() method`);e.adapters[r]=t,e.pixelCapabilities||(e.pixelCapabilities={});let i="browser_only";a.supportsS2S&&(i="both"),e.pixelCapabilities[r]={mode:a.mode||i,supportsS2S:a.supportsS2S||!1,supportsEventDeduplication:a.supportsEventDeduplication||!1,isActive:a.isActive||null}}}(window.pmw=window.pmw||{},jQuery)},362(e,r,t){!function(e,r,a){const{isRange:i,isIP:o,isV4:n,isV6:s,version:c}=t(723);let u=null,p=!1;const d={cloudflare:{any:"https://www.cloudflare.com/cdn-cgi/trace"},icanhazip:{4:"https://ipv4.icanhazip.com",6:"https://ipv6.icanhazip.com",any:"https://icanhazip.com"},ipinfo:{any:"https://ipinfo.io/ip"},myexternalip:{any:"https://myexternalip.com/raw"},ipify:{4:"https://api4.ipify.org",6:"https://api6.ipify.org",any:"https://api64.ipify.org"},identme:{4:"https://4.ident.me/",6:"https://6.ident.me/",any:"https://ident.me/"}},l=(e,r=3e3)=>{const t=new AbortController,a=setTimeout(()=>t.abort(),r);return fetch(e,{signal:t.signal}).finally(()=>clearTimeout(a))};e.getGeoInfo={cloudflare:async()=>{const e=await l("https://www.cloudflare.com/cdn-cgi/trace");if(!e.ok)throw new Error(`The response from Cloudflare was not OK. Status: ${e.status}`);let r=await e.text();if(!r)throw new Error("No data was returned from Cloudflare");if(r=r.trim().split("\n").reduce((e,r)=>(e[(r=r.split("="))[0]]=r[1],e),{}),!r.ip||!r.loc)throw new Error("The JSON data is missing the ip or loc key from Cloudflare");if(m(r.loc))throw new Error("We have to validate the region, and this service is not returning the region.");return{ip:r.ip,countryCode:r.loc,service:"cloudflare"}},geojs:async()=>{const e=await l("https://get.geojs.io/v1/ip/geo.json");if(!e.ok)throw new Error(`The response from geojs was not OK. Status: ${e.status}`);let r=await e.json();if(!r)throw new Error("No JSON data was returned from geojs");if(!r.ip||!r.country_code||!r.region)throw new Error("The JSON data is missing the ip, country_code, or region key from geojs");return{ip:r.ip,countryCode:r.country_code,region:r.region,service:"geojs"}},ipinfo:async()=>{const e=await l("https://ipinfo.io/json");if(!e.ok)throw new Error(`The response from ipinfo was not OK from ipinfo. Status: ${e.status}`);let r=await e.json();if(!r)throw new Error("No JSON data was returned from ipinfo");if(!r.ip||!r.country||!r.region)throw new Error("The JSON data is missing the ip, country, or region key from ipinfo");return{ip:r.ip,countryCode:r.country,region:r.region,service:"ipinfo"}},ipapi:async()=>{const e=await l("https://ipapi.co/json");if(!e.ok)throw new Error(`The response from ipapi was not OK. Status: ${e.status}`);let r=await e.json();if(!r)throw new Error("No JSON data was returned from ipapi");if(!r.ip||!r.country||!r.region)throw new Error("The JSON data is missing the ip, country, or region key from ipapi");return{ip:r.ip,countryCode:r.country,region:r.region,service:"ipapi"}}};const m=e=>{if("US "!==e)return!1;return["US-CA","US-VA"].some(e=>pmwDataLayer?.general?.consent_management.restricted_regions.includes(e))};e.isVisitorAllowed=async()=>{if(null!==e.retrieveData("visitorAllowed")&&e.retrieveData("visitorAllowed")!==a)return!!JSON.parse(e.retrieveData("visitorAllowed"));if(e.isBotUserAgent())return e.storeData("visitorAllowed",!1),!1;if(Array.isArray(pmwDataLayer?.general?.server_2_server?.ip_exclude_list)&&pmwDataLayer.general.server_2_server.ip_exclude_list.length>0){const r=await e.getIp();if(w(r))return e.storeData("visitorAllowed",!1),!1}return e.storeData("visitorAllowed",!0),!0},e.isValidIpAddress=r=>!(!r||"string"!=typeof r)&&(!!o(r)&&!e.isPrivateOrReservedIp(r)),e.isPrivateOrReservedIp=e=>{if(!e)return!0;const r=n(e)?["10.0.0.0/8","172.16.0.0/12","192.168.0.0/16","127.0.0.0/8","169.254.0.0/16","0.0.0.0/8"]:["::1/128","fc00::/7","fe80::/10","::/128"];try{const a=t(265);for(const t of r)if(a.isInSubnet(e,t))return!0}catch(r){if(n(e)){if(e.startsWith("10.")||e.startsWith("192.168.")||e.startsWith("127.")||e.startsWith("169.254.")||e.startsWith("0."))return!0;const r=e.split(".");if("172"===r[0]){const e=parseInt(r[1],10);if(e>=16&&e<=31)return!0}}else if("::1"===e||e.startsWith("fc")||e.startsWith("fd")||e.startsWith("fe80:"))return!0}return!1},e.getClientIp=async()=>{const r=e.retrieveData("client_ip");return r&&e.isValidIpAddress(r)?r:(u&&!p||(p=!1,u=(async()=>{try{const r=e.getIpWithTimeout("6",2e3),t=e.getIp("any"),[a,i]=await Promise.allSettled([r,t]);let o=null;return"fulfilled"===a.status&&a.value?(o=a.value,e.console.log(`Using IPv6 address: ${o}`)):"fulfilled"===i.status&&i.value&&(o=i.value,e.console.log(`IPv6 not available, using IP: ${o}`)),o&&e.isValidIpAddress(o)?(e.storeData("client_ip",o),p=!0,o):(p=!0,null)}catch(r){return e.console.error("Error detecting client IP:",r),p=!0,null}})()),u)},e.getIpWithTimeout=async(r,t)=>Promise.race([e.getIp(r),new Promise((e,a)=>setTimeout(()=>a(new Error(`IPv${r} detection timed out after ${t}ms`)),t))]).catch(r=>(e.console.log(r.message),null)),e.getIp=async(r="any",t=3)=>{const i=["any","4","6"];if(!i.includes(r))return console.error("The version argument must be one of the following: "+i.join(", ")),null;if("any"===r&&e.retrieveData("ip"))return e.retrieveData("ip");const n=e.retrieveData(`ipv${r}`);if(n!==a)return n;e.console.log("Testing the IP address of the browser because one ore more server-to-server APIs are enabled and require the browser IP. It may trigger connection request errors in the console while testing the IP address. This is normal and expected behavior.");try{const a=await e.getIpFromAnyService(r,t);return a&&!o(a)?(e.console.warn(`Invalid IP address received: ${a}`),null):("any"===r&&a&&e.storeData("ip",a),(4===c(a)||"4"===r&&null===a)&&e.storeData("ipv4",a),(6===c(a)||"6"===r&&null===a)&&e.storeData("ipv6",a),a)}catch(e){return null}},e.getBrowserGeoFromExternalService=async()=>{const r=performance.now();let t=[];Object.keys(e.getGeoInfo).forEach(r=>{t.push(e.getGeoInfo[r]())});try{const a=await Promise.any(t);return a.countryCode=a.countryCode.toUpperCase(),a.region&&"California"===a.region&&(a.regionCode="US-CA"),a.region&&"Virginia"===a.region&&(a.regionCode="US-VA"),e.console.log("Retrieved the browser geo info from an external service: ",a," which took ",(performance.now()-r).toFixed(2)+" ms"),a}catch(r){return e.console.error("error: ",r),null}};e.getBrowserGeo=async()=>{let r={};if(e.retrieveData("geoCountryCode")&&(r.countryCode=e.retrieveData("geoCountryCode")),e.retrieveData("geoRegionCode")&&(r.regionCode=e.retrieveData("geoRegionCode")),e.retrieveData("geoRegion")&&(r.region=e.retrieveData("geoRegion")),r.countryCode)return e.console.log("Retrieved the browser geo location from the cache: ",r),r;let a=await e.getBrowserGeoFromExternalService();if(!a){const r=(()=>{const e=t(473).getLocationByTimeZone();return e.countryCode?e:null})();a={},r&&e.console.log("Retrieved the browser geo location from the timezone: ",r),r.countryCode&&(a.countryCode=r.countryCode),r.regionCode&&(a.regionCode=r.regionCode)}return a?.ip&&e.storeData("ip",a.ip),a?.countryCode&&e.storeData("geoCountryCode",a.countryCode),a?.regionCode&&e.storeData("geoRegionCode",a.regionCode),a?.region&&e.storeData("geoRegion",a.region),a?.countryCode?a:null},e.getIpFromAnyService=async(r="any",t=3)=>{const a=performance.now(),i=Object.keys(d).filter(e=>d[e][r]).slice(0,t).reduce((e,r)=>(e[r]=d[r],e),{});let o=[];if(Object.keys(i).forEach(t=>{i[t][r]&&o.push(e.getIpFromService(t,r))}),!(o.length>0))return e.console.log("No promises to resolve"),null;try{const r=await Promise.any(o),t=(performance.now()-a).toFixed(2);return e.console.log(`Retrieved the IP address ${r.ip} from ${r.service} which took ${t} ms`),r.ip}catch(t){return e.console.log(`Could not retrieve an IP with version ${r} from any of the services.`),null}},e.getIpFromService=async(r,t="any")=>{try{let a={ip:null,service:r,ipVersion:t};if(!d[r][t])return Promise.reject(new Error(`The IP version ${t} is not available for the service ${r}`));e.console.log(`Fetching IP from ${r} using IP version ${t}`);const i=await l(d[r][t]);if(!i.ok)return Promise.reject(new Error(`The response from ${r} was not OK. Status: ${i.status}`));let n=await i.text();return"cloudflare"===r?(n=n.trim().split("\n").reduce((e,r)=>(e[(r=r.split("="))[0]]=r[1],e),{}),a.ip=n.ip):a.ip=n.trim(),o(a.ip)?a:Promise.reject(new Error(`The returned value from ${r} is not an IP address`))}catch(e){return Promise.reject(e)}};e.isVisitorNotAllowed=async()=>!1===await e.isVisitorAllowed(),e.isBotUserAgent=()=>{const e=navigator.userAgent||"";if(!e)return!0;const r=g();for(const t of r)if(e.toLowerCase().includes(t.toLowerCase()))return!0;return!1};const g=()=>{let e=[];Array.isArray(pmwDataLayer?.general?.server_2_server?.user_agent_exclude_patterns)&&(e=pmwDataLayer.general.server_2_server.user_agent_exclude_patterns);return["Googlebot","Google-InspectionTool","Google-Extended","Storebot-Google","bingbot","BingPreview","msnbot","Slurp","DuckDuckBot","Baiduspider","YandexBot","Sogou","facebookexternalhit","FacebookBot","LinkedInBot","Twitterbot","PinterestBot","TikTokBot","SnapchatAds","DiscordBot","InstagramBot","WhatsApp","AhrefsBot","SemrushBot","MJ12bot","DotBot","rogerbot","UptimeRobot","Pingdom","StatusCake","GTmetrix","ClaudeBot","GPTBot","ChatGPT","anthropic-ai","CCBot","PerplexityBot","crawler","spider","scraper","bot/","/bot","bot-"].concat(e)},f=e=>e.includes("/"),w=e=>{const r=pmwDataLayer?.general?.server_2_server?.ip_exclude_list||[];for(const t of r)if(f(t)){if(isInSubnet.isInSubnet(e,t))return!0}else if(e===t)return!0;return!1}}(window.pmw=window.pmw||{},jQuery)},473(e,r,t){"use strict";t.r(r),t.d(r,{getLocationByTimeZone:()=>a});const a=()=>{const e=Intl.DateTimeFormat().resolvedOptions().timeZone;if(""===e||!e)return null;let r={countryCode:{"Africa/Abidjan":["CI","BF","GH","GM","GN","ML","MR","SH","SL","SN","TG"],"Africa/Accra":["GH"],"Africa/Addis_Ababa":["ET"],"Africa/Algiers":["DZ"],"Africa/Asmara":["ER"],"Africa/Asmera":["ER"],"Africa/Bamako":["ML"],"Africa/Bangui":["CF"],"Africa/Banjul":["GM"],"Africa/Bissau":["GW"],"Africa/Blantyre":["MW"],"Africa/Brazzaville":["CG"],"Africa/Bujumbura":["BI"],"Africa/Cairo":["EG"],"Africa/Casablanca":["MA"],"Africa/Ceuta":["ES"],"Africa/Conakry":["GN"],"Africa/Dakar":["SN"],"Africa/Dar_es_Salaam":["TZ"],"Africa/Djibouti":["DJ"],"Africa/Douala":["CM"],"Africa/El_Aaiun":["EH"],"Africa/Freetown":["SL"],"Africa/Gaborone":["BW"],"Africa/Harare":["ZW"],"Africa/Johannesburg":["ZA","LS","SZ"],"Africa/Juba":["SS"],"Africa/Kampala":["UG"],"Africa/Khartoum":["SD"],"Africa/Kigali":["RW"],"Africa/Kinshasa":["CD"],"Africa/Lagos":["NG","AO","BJ","CD","CF","CG","CM","GA","GQ","NE"],"Africa/Libreville":["GA"],"Africa/Lome":["TG"],"Africa/Luanda":["AO"],"Africa/Lubumbashi":["CD"],"Africa/Lusaka":["ZM"],"Africa/Malabo":["GQ"],"Africa/Maputo":["MZ","BI","BW","CD","MW","RW","ZM","ZW"],"Africa/Maseru":["LS"],"Africa/Mbabane":["SZ"],"Africa/Mogadishu":["SO"],"Africa/Monrovia":["LR"],"Africa/Nairobi":["KE","DJ","ER","ET","KM","MG","SO","TZ","UG","YT"],"Africa/Ndjamena":["TD"],"Africa/Niamey":["NE"],"Africa/Nouakchott":["MR"],"Africa/Ouagadougou":["BF"],"Africa/Porto-Novo":["BJ"],"Africa/Sao_Tome":["ST"],"Africa/Timbuktu":["ML"],"Africa/Tripoli":["LY"],"Africa/Tunis":["TN"],"Africa/Windhoek":["NA"],"America/Adak":["US"],"America/Anchorage":["US"],"America/Anguilla":["AI"],"America/Antigua":["AG"],"America/Araguaina":["BR"],"America/Argentina/Buenos_Aires":["AR"],"America/Argentina/Catamarca":["AR"],"America/Argentina/Cordoba":["AR"],"America/Argentina/Jujuy":["AR"],"America/Argentina/La_Rioja":["AR"],"America/Argentina/Mendoza":["AR"],"America/Argentina/Rio_Gallegos":["AR"],"America/Argentina/Salta":["AR"],"America/Argentina/San_Juan":["AR"],"America/Argentina/San_Luis":["AR"],"America/Argentina/Tucuman":["AR"],"America/Argentina/Ushuaia":["AR"],"America/Aruba":["AW"],"America/Asuncion":["PY"],"America/Atikokan":["CA"],"America/Bahia":["BR"],"America/Bahia_Banderas":["MX"],"America/Barbados":["BB"],"America/Belem":["BR"],"America/Belize":["BZ"],"America/Blanc-Sablon":["CA"],"America/Boa_Vista":["BR"],"America/Bogota":["CO"],"America/Boise":["US"],"America/Cambridge_Bay":["CA"],"America/Campo_Grande":["BR"],"America/Cancun":["MX"],"America/Caracas":["VE"],"America/Cayenne":["GF"],"America/Cayman":["KY"],"America/Chicago":["US"],"America/Chihuahua":["MX"],"America/Coral_Harbour":["CA"],"America/Costa_Rica":["CR"],"America/Creston":["CA"],"America/Cuiaba":["BR"],"America/Curacao":["CW"],"America/Danmarkshavn":["GL"],"America/Dawson":["CA"],"America/Dawson_Creek":["CA"],"America/Denver":["US"],"America/Detroit":["US"],"America/Dominica":["DM"],"America/Edmonton":["CA"],"America/Eirunepe":["BR"],"America/El_Salvador":["SV"],"America/Fort_Nelson":["CA"],"America/Fortaleza":["BR"],"America/Glace_Bay":["CA"],"America/Goose_Bay":["CA"],"America/Grand_Turk":["TC"],"America/Grenada":["GD"],"America/Guadeloupe":["GP"],"America/Guatemala":["GT"],"America/Guayaquil":["EC"],"America/Guyana":["GY"],"America/Halifax":["CA"],"America/Havana":["CU"],"America/Hermosillo":["MX"],"America/Indiana/Indianapolis":["US"],"America/Indiana/Knox":["US"],"America/Indiana/Marengo":["US"],"America/Indiana/Petersburg":["US"],"America/Indiana/Tell_City":["US"],"America/Indiana/Vevay":["US"],"America/Indiana/Vincennes":["US"],"America/Indiana/Winamac":["US"],"America/Inuvik":["CA"],"America/Iqaluit":["CA"],"America/Jamaica":["JM"],"America/Juneau":["US"],"America/Kentucky/Louisville":["US"],"America/Kentucky/Monticello":["US"],"America/Kralendijk":["BQ"],"America/La_Paz":["BO"],"America/Lima":["PE"],"America/Los_Angeles":["US"],"America/Lower_Princes":["SX"],"America/Maceio":["BR"],"America/Managua":["NI"],"America/Manaus":["BR"],"America/Marigot":["MF"],"America/Martinique":["MQ"],"America/Matamoros":["MX"],"America/Mazatlan":["MX"],"America/Menominee":["US"],"America/Merida":["MX"],"America/Metlakatla":["US"],"America/Mexico_City":["MX"],"America/Miquelon":["PM"],"America/Moncton":["CA"],"America/Monterrey":["MX"],"America/Montevideo":["UY"],"America/Montreal":["CA"],"America/Montserrat":["MS"],"America/Nassau":["BS"],"America/New_York":["US"],"America/Nipigon":["CA"],"America/Nome":["US"],"America/Noronha":["BR"],"America/North_Dakota/Beulah":["US"],"America/North_Dakota/Center":["US"],"America/North_Dakota/New_Salem":["US"],"America/Nuuk":["GL"],"America/Ojinaga":["MX"],"America/Panama":["PA","CA","KY"],"America/Pangnirtung":["CA"],"America/Paramaribo":["SR"],"America/Phoenix":["US","CA"],"America/Port-au-Prince":["HT"],"America/Port_of_Spain":["TT"],"America/Porto_Velho":["BR"],"America/Puerto_Rico":["PR","AG","CA","AI","AW","BL","BQ","CW","DM","GD","GP","KN","LC","MF","MS","SX","TT","VC","VG","VI"],"America/Punta_Arenas":["CL"],"America/Rainy_River":["CA"],"America/Rankin_Inlet":["CA"],"America/Recife":["BR"],"America/Regina":["CA"],"America/Resolute":["CA"],"America/Rio_Branco":["BR"],"America/Santarem":["BR"],"America/Santiago":["CL"],"America/Santo_Domingo":["DO"],"America/Sao_Paulo":["BR"],"America/Scoresbysund":["GL"],"America/Sitka":["US"],"America/St_Barthelemy":["BL"],"America/St_Johns":["CA"],"America/St_Kitts":["KN"],"America/St_Lucia":["LC"],"America/St_Thomas":["VI"],"America/St_Vincent":["VC"],"America/Swift_Current":["CA"],"America/Tegucigalpa":["HN"],"America/Thule":["GL"],"America/Thunder_Bay":["CA"],"America/Tijuana":["MX"],"America/Toronto":["CA","BS"],"America/Tortola":["VG"],"America/Vancouver":["CA"],"America/Virgin":["VI"],"America/Whitehorse":["CA"],"America/Winnipeg":["CA"],"America/Yakutat":["US"],"America/Yellowknife":["CA"],"Antarctica/Casey":["AQ"],"Antarctica/Davis":["AQ"],"Antarctica/DumontDUrville":["AQ"],"Antarctica/Macquarie":["AU"],"Antarctica/Mawson":["AQ"],"Antarctica/McMurdo":["AQ"],"Antarctica/Palmer":["AQ"],"Antarctica/Rothera":["AQ"],"Antarctica/South_Pole":["AQ"],"Antarctica/Syowa":["AQ"],"Antarctica/Troll":["AQ"],"Antarctica/Vostok":["AQ"],"Arctic/Longyearbyen":["SJ"],"Asia/Aden":["YE"],"Asia/Almaty":["KZ"],"Asia/Amman":["JO"],"Asia/Anadyr":["RU"],"Asia/Aqtau":["KZ"],"Asia/Aqtobe":["KZ"],"Asia/Ashgabat":["TM"],"Asia/Atyrau":["KZ"],"Asia/Baghdad":["IQ"],"Asia/Bahrain":["BH"],"Asia/Baku":["AZ"],"Asia/Bangkok":["TH","KH","LA","VN"],"Asia/Barnaul":["RU"],"Asia/Beirut":["LB"],"Asia/Bishkek":["KG"],"Asia/Brunei":["BN"],"Asia/Chita":["RU"],"Asia/Choibalsan":["MN"],"Asia/Colombo":["LK"],"Asia/Damascus":["SY"],"Asia/Dhaka":["BD"],"Asia/Dili":["TL"],"Asia/Dubai":["AE","OM"],"Asia/Dushanbe":["TJ"],"Asia/Famagusta":["CY"],"Asia/Gaza":["PS"],"Asia/Hebron":["PS"],"Asia/Ho_Chi_Minh":["VN"],"Asia/Hong_Kong":["HK"],"Asia/Hovd":["MN"],"Asia/Irkutsk":["RU"],"Asia/Jakarta":["ID"],"Asia/Jayapura":["ID"],"Asia/Jerusalem":["IL"],"Asia/Kabul":["AF"],"Asia/Kamchatka":["RU"],"Asia/Karachi":["PK"],"Asia/Kathmandu":["NP"],"Asia/Khandyga":["RU"],"Asia/Kolkata":["IN"],"Asia/Krasnoyarsk":["RU"],"Asia/Kuala_Lumpur":["MY"],"Asia/Kuching":["MY"],"Asia/Kuwait":["KW"],"Asia/Macau":["MO"],"Asia/Magadan":["RU"],"Asia/Makassar":["ID"],"Asia/Manila":["PH"],"Asia/Muscat":["OM"],"Asia/Nicosia":["CY"],"Asia/Novokuznetsk":["RU"],"Asia/Novosibirsk":["RU"],"Asia/Omsk":["RU"],"Asia/Oral":["KZ"],"Asia/Phnom_Penh":["KH"],"Asia/Pontianak":["ID"],"Asia/Pyongyang":["KP"],"Asia/Qatar":["QA","BH"],"Asia/Qostanay":["KZ"],"Asia/Qyzylorda":["KZ"],"Asia/Riyadh":["SA","AQ","KW","YE"],"Asia/Sakhalin":["RU"],"Asia/Samarkand":["UZ"],"Asia/Seoul":["KR"],"Asia/Shanghai":["CN"],"Asia/Singapore":["SG","MY"],"Asia/Srednekolymsk":["RU"],"Asia/Taipei":["TW"],"Asia/Tashkent":["UZ"],"Asia/Tbilisi":["GE"],"Asia/Tehran":["IR"],"Asia/Thimphu":["BT"],"Asia/Tokyo":["JP"],"Asia/Tomsk":["RU"],"Asia/Ulaanbaatar":["MN"],"Asia/Urumqi":["CN"],"Asia/Ust-Nera":["RU"],"Asia/Vientiane":["LA"],"Asia/Vladivostok":["RU"],"Asia/Yakutsk":["RU"],"Asia/Yangon":["MM"],"Asia/Yekaterinburg":["RU"],"Asia/Yerevan":["AM"],"Atlantic/Azores":["PT"],"Atlantic/Bermuda":["BM"],"Atlantic/Canary":["ES"],"Atlantic/Cape_Verde":["CV"],"Atlantic/Faroe":["FO"],"Atlantic/Jan_Mayen":["SJ"],"Atlantic/Madeira":["PT"],"Atlantic/Reykjavik":["IS"],"Atlantic/South_Georgia":["GS"],"Atlantic/St_Helena":["SH"],"Atlantic/Stanley":["FK"],"Australia/Adelaide":["AU"],"Australia/Brisbane":["AU"],"Australia/Broken_Hill":["AU"],"Australia/Darwin":["AU"],"Australia/Eucla":["AU"],"Australia/Hobart":["AU"],"Australia/Lindeman":["AU"],"Australia/Lord_Howe":["AU"],"Australia/Melbourne":["AU"],"Australia/Perth":["AU"],"Australia/Sydney":["AU"],"Canada/Eastern":["CA"],"Europe/Amsterdam":["NL"],"Europe/Andorra":["AD"],"Europe/Astrakhan":["RU"],"Europe/Athens":["GR"],"Europe/Belfast":["GB"],"Europe/Belgrade":["RS","BA","HR","ME","MK","SI"],"Europe/Berlin":["DE"],"Europe/Bratislava":["SK"],"Europe/Brussels":["BE"],"Europe/Bucharest":["RO"],"Europe/Budapest":["HU"],"Europe/Busingen":["DE"],"Europe/Chisinau":["MD"],"Europe/Copenhagen":["DK"],"Europe/Dublin":["IE"],"Europe/Gibraltar":["GI"],"Europe/Guernsey":["GG"],"Europe/Helsinki":["FI","AX"],"Europe/Isle_of_Man":["IM"],"Europe/Istanbul":["TR"],"Europe/Jersey":["JE"],"Europe/Kaliningrad":["RU"],"Europe/Kiev":["UA"],"Europe/Kirov":["RU"],"Europe/Lisbon":["PT"],"Europe/Ljubljana":["SI"],"Europe/London":["GB","GG","IM","JE"],"Europe/Luxembourg":["LU"],"Europe/Madrid":["ES"],"Europe/Malta":["MT"],"Europe/Mariehamn":["AX"],"Europe/Minsk":["BY"],"Europe/Monaco":["MC"],"Europe/Moscow":["RU"],"Europe/Oslo":["NO","SJ","BV"],"Europe/Paris":["FR"],"Europe/Podgorica":["ME"],"Europe/Prague":["CZ","SK"],"Europe/Riga":["LV"],"Europe/Rome":["IT","SM","VA"],"Europe/Samara":["RU"],"Europe/San_Marino":["SM"],"Europe/Sarajevo":["BA"],"Europe/Saratov":["RU"],"Europe/Simferopol":["RU","UA"],"Europe/Skopje":["MK"],"Europe/Sofia":["BG"],"Europe/Stockholm":["SE"],"Europe/Tallinn":["EE"],"Europe/Tirane":["AL"],"Europe/Ulyanovsk":["RU"],"Europe/Uzhgorod":["UA"],"Europe/Vaduz":["LI"],"Europe/Vatican":["VA"],"Europe/Vienna":["AT"],"Europe/Vilnius":["LT"],"Europe/Volgograd":["RU"],"Europe/Warsaw":["PL"],"Europe/Zagreb":["HR"],"Europe/Zaporozhye":["UA"],"Europe/Zurich":["CH","DE","LI"],GB:["GB"],"GB-Eire":["GB"],"Indian/Antananarivo":["MG"],"Indian/Chagos":["IO"],"Indian/Christmas":["CX"],"Indian/Cocos":["CC"],"Indian/Comoro":["KM"],"Indian/Kerguelen":["TF","HM"],"Indian/Mahe":["SC"],"Indian/Maldives":["MV"],"Indian/Mauritius":["MU"],"Indian/Mayotte":["YT"],"Indian/Reunion":["RE","TF"],NZ:["NZ"],"Pacific/Apia":["WS"],"Pacific/Auckland":["NZ","AQ"],"Pacific/Bougainville":["PG"],"Pacific/Chatham":["NZ"],"Pacific/Chuuk":["FM"],"Pacific/Easter":["CL"],"Pacific/Efate":["VU"],"Pacific/Fakaofo":["TK"],"Pacific/Fiji":["FJ"],"Pacific/Funafuti":["TV"],"Pacific/Galapagos":["EC"],"Pacific/Gambier":["PF"],"Pacific/Guadalcanal":["SB"],"Pacific/Guam":["GU","MP"],"Pacific/Honolulu":["US","UM"],"Pacific/Johnston":["UM"],"Pacific/Kanton":["KI"],"Pacific/Kiritimati":["KI"],"Pacific/Kosrae":["FM"],"Pacific/Kwajalein":["MH"],"Pacific/Majuro":["MH"],"Pacific/Marquesas":["PF"],"Pacific/Midway":["UM"],"Pacific/Nauru":["NR"],"Pacific/Niue":["NU"],"Pacific/Norfolk":["NF"],"Pacific/Noumea":["NC"],"Pacific/Pago_Pago":["AS","UM"],"Pacific/Palau":["PW"],"Pacific/Pitcairn":["PN"],"Pacific/Pohnpei":["FM"],"Pacific/Port_Moresby":["PG","AQ"],"Pacific/Rarotonga":["CK"],"Pacific/Saipan":["MP"],"Pacific/Samoa":["WS"],"Pacific/Tahiti":["PF"],"Pacific/Tarawa":["KI"],"Pacific/Tongatapu":["TO"],"Pacific/Wake":["UM"],"Pacific/Wallis":["WF"],Singapore:["SG"],"US/Arizona":["US"],"US/Hawaii":["US"],"US/Samoa":["WS"]}[e][0].toUpperCase()};return"America/Los_Angeles"===e&&(r.regionCode="US-CA"),"Europe/Zurich"===e&&(r.regionCode="CH-ZH"),r}},503(e,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.default={localhost:{ipv4:["127.0.0.0/8"],ipv6:["::1/128"]},private:{ipv4:["10.0.0.0/8","172.16.0.0/12","192.168.0.0/16"],ipv6:["fe80::/10","fc00::/7"]},reserved:{ipv4:["0.0.0.0/8","100.64.0.0/10","169.254.0.0/16","192.0.0.0/24","192.0.2.0/24","192.88.99.0/24","198.18.0.0/15","198.51.100.0/24","203.0.113.0/24","224.0.0.0/4","240.0.0.0/4","255.255.255.255/32"],ipv6:["::/128","64:ff9b::/96","100::/64","2001::/32","2001:10::/28","2001:20::/28","2001:db8::/32","2002::/16","ff00::/8"]}}},544(){const e=pmw.prepareSelectors([".add_to_cart_button:not(.product_type_variable)",".ajax_add_to_cart",".single_add_to_cart_button"],"addToCart");jQuery(e).on("click adding_to_cart",(e,r)=>{try{let r=e?.target?.dataset?.quantity?e.target.dataset.quantity:null,t=e?.target?.dataset?.product_id?e.target.dataset.product_id:e?.target?.value?e.target.value:null;if("product"===pmwDataLayer.shop.page_type){if(void 0!==jQuery(e.currentTarget).attr("href")&&jQuery(e.currentTarget).attr("href").includes("add-to-cart"))return t||(t=jQuery(e.currentTarget).data("product_id")),void pmw.addProductToCart(t,1);if("simple"===pmwDataLayer.shop.product_type)return null===r&&(r=Number(jQuery(".input-text.qty").val())?Number(jQuery(".input-text.qty").val()):1),t||(t=jQuery(e.currentTarget).val()),t||(t=jQuery(".product").attr("id").replace("product-","")),void pmw.addProductToCart(t,r);if(["variable","variable-subscription"].indexOf(pmwDataLayer.shop.product_type)>=0)return null===r&&(r=Number(jQuery(".input-text.qty").val())?Number(jQuery(".input-text.qty").val()):1),t||(t=jQuery("[name='variation_id']").val()),void pmw.addProductToCart(t,r);if("grouped"===pmwDataLayer.shop.product_type)return void jQuery(".woocommerce-grouped-product-list-item").each((e,a)=>{r=Number(jQuery(a).find(".input-text.qty").val())?Number(jQuery(a).find(".input-text.qty").val()):1;let i=jQuery(a).attr("class");t=pmw.getPostIdFromString(i),pmw.addProductToCart(t,r)});if("bundle"===pmwDataLayer.shop.product_type)return null===r&&(r=Number(jQuery(".input-text.qty").val())?Number(jQuery(".input-text.qty").val()):1),t||(t=jQuery("input[name=add-to-cart]").val()),void pmw.addProductToCart(t,r);null===r&&(r=Number(jQuery(".input-text.qty").val())?Number(jQuery(".input-text.qty").val()):1),pmw.addProductToCart(t,r)}else null===r&&(r=1),t||(t=jQuery(e.currentTarget).data("product_id")?jQuery(e.currentTarget).data("product_id"):null),t||(t=jQuery(e.currentTarget).val()?jQuery(e.currentTarget).val():null),t&&r&&pmw.addProductToCart(t,r)}catch(e){console.error(e)}}),jQuery("a:not(.add_to_cart_button, .ajax_add_to_cart, .single_add_to_cart_button)").one("click",e=>{try{if(jQuery(e.target).closest("a").attr("href")){let r=new URL(jQuery(e.currentTarget).attr("href"),window.location.origin);if(r.searchParams.has("add-to-cart")){let e=r.searchParams.get("add-to-cart"),t=r.searchParams.has("quantity")?parseInt(r.searchParams.get("quantity"),10):1;pmw.addProductToCart(e,t)}}}catch(e){console.error(e)}}),jQuery(".woocommerce-LoopProduct-link, .wc-block-grid__product, .product, .product-small, .type-product").on("click",e=>{try{let r=jQuery(e.currentTarget).nextAll(".pmwProductId:first").data("id");if(r){if(r=pmw.getIdBasedOndVariationsOutputSetting(r),!r)throw Error("Wasn't able to retrieve a productId");if(pmwDataLayer.products&&pmwDataLayer.products[r]){let e=pmw.getProductDetailsFormattedForEvent(r);jQuery(document).trigger("pmw:select-item",e)}}}catch(e){console.error(e)}}),jQuery("#billing_email").on("input",e=>{pmw.isEmail(jQuery(e.currentTarget).val())&&(pmw.fireCheckoutProgress(2),pmw.emailSelected=!0)}),jQuery("form.checkout").on("checkout_place_order_success",()=>{!1===pmw.emailSelected&&pmw.fireCheckoutProgress(2),!1===pmw.paymentMethodSelected&&(pmw.fireCheckoutProgress(3),pmw.fireCheckoutOption(3,jQuery("input[name='payment_method']:checked").val())),pmw.fireCheckoutProgress(4),jQuery(document).trigger("pmw:place-order",{})}),jQuery(document).on("click","[name='update_cart']",()=>{try{jQuery(".cart_item").each((e,r)=>{const t=pmw.getProductIdByCartItemElement(r);if(!t)return void console.error("Pixel Manager: Wasn't able to retrieve a productId");const a=pmw.getProductQuantityByCartItemElement(r);a?0===a?pmw.removeProductFromCart(t):a<pmwDataLayer.cart[t].quantity?pmw.removeProductFromCart(t,pmwDataLayer.cart[t].quantity-a):a>pmwDataLayer.cart[t].quantity&&pmw.addProductToCart(t,a-pmwDataLayer.cart[t].quantity):console.error("Pixel Manager: Wasn't able to retrieve a quantity")})}catch(e){console.error(e),pmw.getCartItemsFromBackend()}}),jQuery(".add_to_wishlist,.wl-add-to").on("click",e=>{try{let r;if(jQuery(e.currentTarget).data("productid")?r=jQuery(e.currentTarget).data("productid"):jQuery(e.currentTarget).data("product-id")&&(r=jQuery(e.currentTarget).data("product-id")),!r)throw Error("Wasn't able to retrieve a productId");let t=pmw.getProductDetailsFormattedForEvent(r);jQuery(document).trigger("pmw:add-to-wishlist",t)}catch(e){console.error(e)}}),pmwDataLayer?.general?.lazy_load_pmw||pmw.registerShowVariationEventListener()},547(){!function(e){e.getLibraryVersion=()=>"1.56.0",e.checkLibraryVersion=()=>{e.getLibraryVersion()!==pmwDataLayer?.version?.number&&console.error(`Pixel Manager: The library version ${e.getLibraryVersion()} and pmwDataLayer.version.number ${pmwDataLayer.version.number} do not match. Delete the server-side cache and try again.`)}}(window.pmw=window.pmw||{},jQuery)},550(){!function(e){const r=["browser_only","server_only","both","browser_or_server"];e.pixelRegistry={getActivePixels(){const r=[];if(!e.pixelCapabilities)return r;for(const[t,a]of Object.entries(e.pixelCapabilities))if("function"==typeof a.isActive)try{a.isActive()&&r.push(t)}catch(r){e.console.error(`Error checking if ${t} is active:`,r)}return r},getActiveBrowserOnlyPixels(){const r=[],t=this.getActivePixels();for(const a of t)!0!==e.pixelCapabilities?.[a]?.supportsS2S&&r.push(a);return r},getActiveS2SPixels(){const r=[],t=this.getActivePixels();for(const a of t)!0===e.pixelCapabilities?.[a]?.supportsS2S&&r.push(a);return r},getAdapter:r=>e.adapters&&e.adapters[r]||null,getPixelsWithCapability(r){const t=[],a=this.getActivePixels();for(const i of a)!0===e.pixelCapabilities?.[i]?.[r]&&t.push(i);return t},getFiringMode(t){const a=e.pixelCapabilities?.[t]?.mode;return a&&r.includes(a)?a:!0===e.pixelCapabilities?.[t]?.supportsS2S?"both":"browser_only"},getFiringDecision(r,t){const a=this.getFiringMode(r),i=!0===pmwDataLayer?.general?.server_2_server?.active,o=!0===e.pixelCapabilities?.[r]?.supportsS2S;let n={fire_browser:!0,fire_server:!1};switch(a){case"browser_only":n={fire_browser:!0,fire_server:!1};break;case"server_only":n={fire_browser:!1,fire_server:i&&o};break;case"both":n={fire_browser:!0,fire_server:i&&o};break;case"browser_or_server":n=i&&o?{fire_browser:!1,fire_server:!0}:{fire_browser:!0,fire_server:!1}}return n=e.hooks.applyFilters("pmw_pixel_firing_decision",n,r,t,a),n},getPixelsForBrowserFiring(e){const r=[],t=this.getActivePixels();for(const a of t){this.getFiringDecision(a,e).fire_browser&&r.push(a)}return r},getPixelsForServerFiring(e){const r=[],t=this.getActivePixels();for(const a of t){this.getFiringDecision(a,e).fire_server&&r.push(a)}return r}}}(window.pmw=window.pmw||{},jQuery)},609(e,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.isIP=r.isIPv6=r.isIPv4=void 0;var t="(?:[0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])",a="("+t+"[.]){3}"+t,i=new RegExp("^"+a+"$"),o="(?:[0-9a-fA-F]{1,4})",n=new RegExp("^((?:"+o+":){7}(?:"+o+"|:)|(?:"+o+":){6}(?:"+a+"|:"+o+"|:)|(?:"+o+":){5}(?::"+a+"|(:"+o+"){1,2}|:)|(?:"+o+":){4}(?:(:"+o+"){0,1}:"+a+"|(:"+o+"){1,3}|:)|(?:"+o+":){3}(?:(:"+o+"){0,2}:"+a+"|(:"+o+"){1,4}|:)|(?:"+o+":){2}(?:(:"+o+"){0,3}:"+a+"|(:"+o+"){1,5}|:)|(?:"+o+":){1}(?:(:"+o+"){0,4}:"+a+"|(:"+o+"){1,6}|:)|(?::((?::"+o+"){0,5}:"+a+"|(?::"+o+"){1,7}|:)))(%[0-9a-zA-Z]{1,})?$");function s(e){return i.test(e)}function c(e){return n.test(e)}r.isIPv4=s,r.isIPv6=c,r.isIP=function(e){return s(e)?4:c(e)?6:0}},618(e,r,t){"use strict";var a=this&&this.__spreadArrays||function(){for(var e=0,r=0,t=arguments.length;r<t;r++)e+=arguments[r].length;var a=Array(e),i=0;for(r=0;r<t;r++)for(var o=arguments[r],n=0,s=o.length;n<s;n++,i++)a[i]=o[n];return a};Object.defineProperty(r,"__esModule",{value:!0}),r.isSpecial=r.isReserved=r.isLocalhost=r.isPrivate=r.createChecker=r.isInSubnet=void 0;var i=t(609),o=t(503);function n(e){if(!i.isIPv4(e))throw new Error("not a valid IPv4 address: "+e);var r=e.split(".");return(parseInt(r[0],10)<<24)+(parseInt(r[1],10)<<16)+(parseInt(r[2],10)<<8)+parseInt(r[3],10)>>>0}function s(e){if(Array.isArray(e)){var r=e.map(function(e){return c(e)});return function(e){var t=n(e);return r.some(function(e){return e(t)})}}var t=c(e);return function(e){var r=n(e);return t(r)}}function c(e){var r=e.split("/"),t=r[0],a=r[1],i=parseInt(a,10);if(!t||!Number.isInteger(i))throw new Error("not a valid IPv4 subnet: "+e);if(i<0||i>32)throw new Error("not a valid IPv4 prefix length: "+i+" (from "+e+")");var o=n(t);return function(e){return 0===i||o>>32-i===e>>32-i}}r.isInSubnet=function(e,r){return s(r)(e)},r.createChecker=s;var u={};r.isPrivate=function(e){return"private"in u==!1&&(u.private=s(o.default.private.ipv4)),u.private(e)},r.isLocalhost=function(e){return"localhost"in u==!1&&(u.localhost=s(o.default.localhost.ipv4)),u.localhost(e)},r.isReserved=function(e){return"reserved"in u==!1&&(u.reserved=s(o.default.reserved.ipv4)),u.reserved(e)},r.isSpecial=function(e){return"special"in u==!1&&(u.special=s(a(o.default.private.ipv4,o.default.localhost.ipv4,o.default.reserved.ipv4))),u.special(e)}},723(e,r,t){"use strict";t.r(r),t.d(r,{displayIP:()=>g,inRange:()=>l,isIP:()=>s,isRange:()=>d,isV4:()=>u,isV6:()=>p,searchIP:()=>m,storeIP:()=>m,version:()=>c});var a="undefined"!=typeof globalThis?globalThis:"undefined"!=typeof window?window:void 0!==t.g?t.g:"undefined"!=typeof self?self:{};function i(e,r){return e(r={exports:{}},r.exports),r.exports}var o=i(function(e){(function(){var r,t,a,i,o,n,s,c;t={},null!==e&&e.exports?e.exports=t:this.ipaddr=t,s=function(e,r,t,a){var i,o;if(e.length!==r.length)throw new Error("ipaddr: cannot match CIDR for objects with different lengths");for(i=0;a>0;){if((o=t-a)<0&&(o=0),e[i]>>o!==r[i]>>o)return!1;a-=t,i+=1}return!0},t.subnetMatch=function(e,r,t){var a,i,o,n,s;for(o in null==t&&(t="unicast"),r)for(!(n=r[o])[0]||n[0]instanceof Array||(n=[n]),a=0,i=n.length;a<i;a++)if(s=n[a],e.kind()===s[0].kind()&&e.match.apply(e,s))return o;return t},t.IPv4=function(){function e(e){var r,t,a;if(4!==e.length)throw new Error("ipaddr: ipv4 octet count should be 4");for(r=0,t=e.length;r<t;r++)if(!(0<=(a=e[r])&&a<=255))throw new Error("ipaddr: ipv4 octet should fit in 8 bits");this.octets=e}return e.prototype.kind=function(){return"ipv4"},e.prototype.toString=function(){return this.octets.join(".")},e.prototype.toNormalizedString=function(){return this.toString()},e.prototype.toByteArray=function(){return this.octets.slice(0)},e.prototype.match=function(e,r){var t;if(void 0===r&&(e=(t=e)[0],r=t[1]),"ipv4"!==e.kind())throw new Error("ipaddr: cannot match ipv4 address with non-ipv4 one");return s(this.octets,e.octets,8,r)},e.prototype.SpecialRanges={unspecified:[[new e([0,0,0,0]),8]],broadcast:[[new e([255,255,255,255]),32]],multicast:[[new e([224,0,0,0]),4]],linkLocal:[[new e([169,254,0,0]),16]],loopback:[[new e([127,0,0,0]),8]],carrierGradeNat:[[new e([100,64,0,0]),10]],private:[[new e([10,0,0,0]),8],[new e([172,16,0,0]),12],[new e([192,168,0,0]),16]],reserved:[[new e([192,0,0,0]),24],[new e([192,0,2,0]),24],[new e([192,88,99,0]),24],[new e([198,51,100,0]),24],[new e([203,0,113,0]),24],[new e([240,0,0,0]),4]]},e.prototype.range=function(){return t.subnetMatch(this,this.SpecialRanges)},e.prototype.toIPv4MappedAddress=function(){return t.IPv6.parse("::ffff:"+this.toString())},e.prototype.prefixLengthFromSubnetMask=function(){var e,r,t,a,i,o,n;for(n={0:8,128:7,192:6,224:5,240:4,248:3,252:2,254:1,255:0},e=0,i=!1,r=t=3;t>=0;r=t+=-1){if(!((a=this.octets[r])in n))return null;if(o=n[a],i&&0!==o)return null;8!==o&&(i=!0),e+=o}return 32-e},e}(),a="(0?\\d+|0x[a-f0-9]+)",i={fourOctet:new RegExp("^"+a+"\\."+a+"\\."+a+"\\."+a+"$","i"),longValue:new RegExp("^"+a+"$","i")},t.IPv4.parser=function(e){var r,t,a,o,n;if(t=function(e){return"0"===e[0]&&"x"!==e[1]?parseInt(e,8):parseInt(e)},r=e.match(i.fourOctet))return function(){var e,i,o,n;for(n=[],e=0,i=(o=r.slice(1,6)).length;e<i;e++)a=o[e],n.push(t(a));return n}();if(r=e.match(i.longValue)){if((n=t(r[1]))>4294967295||n<0)throw new Error("ipaddr: address outside defined range");return function(){var e,r;for(r=[],o=e=0;e<=24;o=e+=8)r.push(n>>o&255);return r}().reverse()}return null},t.IPv6=function(){function e(e,r){var t,a,i,o,n,s;if(16===e.length)for(this.parts=[],t=a=0;a<=14;t=a+=2)this.parts.push(e[t]<<8|e[t+1]);else{if(8!==e.length)throw new Error("ipaddr: ipv6 part count should be 8 or 16");this.parts=e}for(i=0,o=(s=this.parts).length;i<o;i++)if(!(0<=(n=s[i])&&n<=65535))throw new Error("ipaddr: ipv6 part should fit in 16 bits");r&&(this.zoneId=r)}return e.prototype.kind=function(){return"ipv6"},e.prototype.toString=function(){return this.toNormalizedString().replace(/((^|:)(0(:|$))+)/,"::")},e.prototype.toRFC5952String=function(){var e,r,t,a,i;for(a=/((^|:)(0(:|$)){2,})/g,i=this.toNormalizedString(),e=0,r=-1;t=a.exec(i);)t[0].length>r&&(e=t.index,r=t[0].length);return r<0?i:i.substring(0,e)+"::"+i.substring(e+r)},e.prototype.toByteArray=function(){var e,r,t,a,i;for(e=[],r=0,t=(i=this.parts).length;r<t;r++)a=i[r],e.push(a>>8),e.push(255&a);return e},e.prototype.toNormalizedString=function(){var e,r,t;return e=function(){var e,t,a,i;for(i=[],e=0,t=(a=this.parts).length;e<t;e++)r=a[e],i.push(r.toString(16));return i}.call(this).join(":"),t="",this.zoneId&&(t="%"+this.zoneId),e+t},e.prototype.toFixedLengthString=function(){var e,r,t;return e=function(){var e,t,a,i;for(i=[],e=0,t=(a=this.parts).length;e<t;e++)r=a[e],i.push(r.toString(16).padStart(4,"0"));return i}.call(this).join(":"),t="",this.zoneId&&(t="%"+this.zoneId),e+t},e.prototype.match=function(e,r){var t;if(void 0===r&&(e=(t=e)[0],r=t[1]),"ipv6"!==e.kind())throw new Error("ipaddr: cannot match ipv6 address with non-ipv6 one");return s(this.parts,e.parts,16,r)},e.prototype.SpecialRanges={unspecified:[new e([0,0,0,0,0,0,0,0]),128],linkLocal:[new e([65152,0,0,0,0,0,0,0]),10],multicast:[new e([65280,0,0,0,0,0,0,0]),8],loopback:[new e([0,0,0,0,0,0,0,1]),128],uniqueLocal:[new e([64512,0,0,0,0,0,0,0]),7],ipv4Mapped:[new e([0,0,0,0,0,65535,0,0]),96],rfc6145:[new e([0,0,0,0,65535,0,0,0]),96],rfc6052:[new e([100,65435,0,0,0,0,0,0]),96],"6to4":[new e([8194,0,0,0,0,0,0,0]),16],teredo:[new e([8193,0,0,0,0,0,0,0]),32],reserved:[[new e([8193,3512,0,0,0,0,0,0]),32]]},e.prototype.range=function(){return t.subnetMatch(this,this.SpecialRanges)},e.prototype.isIPv4MappedAddress=function(){return"ipv4Mapped"===this.range()},e.prototype.toIPv4Address=function(){var e,r,a;if(!this.isIPv4MappedAddress())throw new Error("ipaddr: trying to convert a generic ipv6 address to ipv4");return e=(a=this.parts.slice(-2))[0],r=a[1],new t.IPv4([e>>8,255&e,r>>8,255&r])},e.prototype.prefixLengthFromSubnetMask=function(){var e,r,t,a,i,o,n;for(n={0:16,32768:15,49152:14,57344:13,61440:12,63488:11,64512:10,65024:9,65280:8,65408:7,65472:6,65504:5,65520:4,65528:3,65532:2,65534:1,65535:0},e=0,i=!1,r=t=7;t>=0;r=t+=-1){if(!((a=this.parts[r])in n))return null;if(o=n[a],i&&0!==o)return null;16!==o&&(i=!0),e+=o}return 128-e},e}(),o="(?:[0-9a-f]+::?)+",c="%[0-9a-z]{1,}",n={zoneIndex:new RegExp(c,"i"),native:new RegExp("^(::)?("+o+")?([0-9a-f]+)?(::)?("+c+")?$","i"),transitional:new RegExp("^((?:"+o+")|(?:::)(?:"+o+")?)"+a+"\\."+a+"\\."+a+"\\."+a+"("+c+")?$","i")},r=function(e,r){var t,a,i,o,s,c;if(e.indexOf("::")!==e.lastIndexOf("::"))return null;for((c=(e.match(n.zoneIndex)||[])[0])&&(c=c.substring(1),e=e.replace(/%.+$/,"")),t=0,a=-1;(a=e.indexOf(":",a+1))>=0;)t++;if("::"===e.substr(0,2)&&t--,"::"===e.substr(-2,2)&&t--,t>r)return null;for(s=r-t,o=":";s--;)o+="0:";return":"===(e=e.replace("::",o))[0]&&(e=e.slice(1)),":"===e[e.length-1]&&(e=e.slice(0,-1)),{parts:r=function(){var r,t,a,o;for(o=[],r=0,t=(a=e.split(":")).length;r<t;r++)i=a[r],o.push(parseInt(i,16));return o}(),zoneId:c}},t.IPv6.parser=function(e){var t,a,i,o,s,c,u;if(n.native.test(e))return r(e,8);if((o=e.match(n.transitional))&&(u=o[6]||"",(t=r(o[1].slice(0,-1)+u,6)).parts)){for(a=0,i=(c=[parseInt(o[2]),parseInt(o[3]),parseInt(o[4]),parseInt(o[5])]).length;a<i;a++)if(!(0<=(s=c[a])&&s<=255))return null;return t.parts.push(c[0]<<8|c[1]),t.parts.push(c[2]<<8|c[3]),{parts:t.parts,zoneId:t.zoneId}}return null},t.IPv4.isIPv4=t.IPv6.isIPv6=function(e){return null!==this.parser(e)},t.IPv4.isValid=function(e){try{return new this(this.parser(e)),!0}catch(e){return!1}},t.IPv4.isValidFourPartDecimal=function(e){return!(!t.IPv4.isValid(e)||!e.match(/^(0|[1-9]\d*)(\.(0|[1-9]\d*)){3}$/))},t.IPv6.isValid=function(e){var r;if("string"==typeof e&&-1===e.indexOf(":"))return!1;try{return new this((r=this.parser(e)).parts,r.zoneId),!0}catch(e){return!1}},t.IPv4.parse=function(e){var r;if(null===(r=this.parser(e)))throw new Error("ipaddr: string is not formatted like ip address");return new this(r)},t.IPv6.parse=function(e){var r;if(null===(r=this.parser(e)).parts)throw new Error("ipaddr: string is not formatted like ip address");return new this(r.parts,r.zoneId)},t.IPv4.parseCIDR=function(e){var r,t,a;if((t=e.match(/^(.+)\/(\d+)$/))&&(r=parseInt(t[2]))>=0&&r<=32)return a=[this.parse(t[1]),r],Object.defineProperty(a,"toString",{value:function(){return this.join("/")}}),a;throw new Error("ipaddr: string is not formatted like an IPv4 CIDR range")},t.IPv4.subnetMaskFromPrefixLength=function(e){var r,t,a;if((e=parseInt(e))<0||e>32)throw new Error("ipaddr: invalid IPv4 prefix length");for(a=[0,0,0,0],t=0,r=Math.floor(e/8);t<r;)a[t]=255,t++;return r<4&&(a[r]=Math.pow(2,e%8)-1<<8-e%8),new this(a)},t.IPv4.broadcastAddressFromCIDR=function(e){var r,t,a,i,o;try{for(a=(r=this.parseCIDR(e))[0].toByteArray(),o=this.subnetMaskFromPrefixLength(r[1]).toByteArray(),i=[],t=0;t<4;)i.push(parseInt(a[t],10)|255^parseInt(o[t],10)),t++;return new this(i)}catch(e){throw new Error("ipaddr: the address does not have IPv4 CIDR format")}},t.IPv4.networkAddressFromCIDR=function(e){var r,t,a,i,o;try{for(a=(r=this.parseCIDR(e))[0].toByteArray(),o=this.subnetMaskFromPrefixLength(r[1]).toByteArray(),i=[],t=0;t<4;)i.push(parseInt(a[t],10)&parseInt(o[t],10)),t++;return new this(i)}catch(e){throw new Error("ipaddr: the address does not have IPv4 CIDR format")}},t.IPv6.parseCIDR=function(e){var r,t,a;if((t=e.match(/^(.+)\/(\d+)$/))&&(r=parseInt(t[2]))>=0&&r<=128)return a=[this.parse(t[1]),r],Object.defineProperty(a,"toString",{value:function(){return this.join("/")}}),a;throw new Error("ipaddr: string is not formatted like an IPv6 CIDR range")},t.isValid=function(e){return t.IPv6.isValid(e)||t.IPv4.isValid(e)},t.parse=function(e){if(t.IPv6.isValid(e))return t.IPv6.parse(e);if(t.IPv4.isValid(e))return t.IPv4.parse(e);throw new Error("ipaddr: the address has neither IPv6 nor IPv4 format")},t.parseCIDR=function(e){try{return t.IPv6.parseCIDR(e)}catch(r){try{return t.IPv4.parseCIDR(e)}catch(e){throw new Error("ipaddr: the address has neither IPv6 nor IPv4 CIDR format")}}},t.fromByteArray=function(e){var r;if(4===(r=e.length))return new t.IPv4(e);if(16===r)return new t.IPv6(e);throw new Error("ipaddr: the binary input is neither an IPv6 nor IPv4 address")},t.process=function(e){var r;return"ipv6"===(r=this.parse(e)).kind()&&r.isIPv4MappedAddress()?r.toIPv4Address():r}}).call(a)}),n=i(function(e,r){const t=function(e){if(!i(e))throw new Error("Invalid address: "+e);const r=(e=e.toLowerCase()).split(/\:\:/g);if(r.length>2)throw new Error("Invalid address: "+e);let t=[];if(1==r.length){if(t=e.split(/\:/g),8!==t.length)throw new Error("Invalid address: "+e)}else if(2==r.length){const e=r[0],a=r[1],i=e.split(/\:/g),o=a.split(/\:/g);for(let e in i)t[e]=i[e];for(let e=o.length;e>0;--e)t[7-(o.length-e)]=o[e-1]}for(let e=0;e<8;++e)void 0===t[e]&&(t[e]="0000"),t[e]=o(t[e],"0",4);return t.join(":")},a=function(e){if(!i(e))throw new Error("Invalid address: "+e);const r=(e=(e=(e=(e=(e=(e=t(e)).replace(/0000/g,"g")).replace(/\:000/g,":")).replace(/\:00/g,":")).replace(/\:0/g,":")).replace(/g/g,"0")).split(/\:/g);let a=!1,o=-1,n=0,s=-1,c=0;for(let e=0;e<8;++e){const t=r[e];let i="0"===t;i&&!a&&(s=e),!i&&a&&(c=e-s),c>1&&c>n&&(o=s,n=c),a="0"===t}return a&&(c=8-s),c>1&&c>n&&(o=s,n=c),o>=0&&n>1&&r.splice(o,n,"g"),e=(e=(e=(e=(e=r.join(":")).replace(/\:g\:/g,"::")).replace(/\:g/g,"::")).replace(/g\:/g,"::")).replace(/g/g,"::")},i=function(e){return/^[a-f0-9\\:]+$/gi.test(e)},o=function(e,r,t){const a=r.repeat(t);return e.length<a.length&&(e=a.substring(0,a.length-e.length)+e),e},n=function(e){return parseInt(e,16).toString(2)},s=function(e){return parseInt(e,2).toString(16)},c=function(e){const r=t(e).split(":");let a="";for(const e of r)a+=o(n(e),"0",16);return a},u=function(e){const r=[];for(let t=0;t<8;++t){const a=e.substr(16*t,16),i=o(s(a),"0",4);r.push(i)}return r.join(":")},p=function(e,r,t,n,s){if(!i(e))throw new Error("Invalid address: "+e);if(n*=1,t=(t*=1)||128,(r*=1)<1||t<1||r>128||t>128||r>t)throw new Error("Invalid masks.");const p=[],d=c(e).substr(0,r),l="0".repeat(128-t),m=Math.pow(2,t-r);for(let e=0;e<m&&!(n&&e>=n);++e){const i=o(e.toString(2),"0",t-r),n=u(d+i+l);s?p.push(a(n)):p.push(n)}return p},d=function(e,r,t,o){if(!i(e))throw new Error("Invalid address: "+e);if(t=(t*=1)||128,(r*=1)<1||t<1||r>128||t>128||r>t)throw new Error("Invalid masks.");const n=c(e).substr(0,r),s="0".repeat(128-t),p=n+"0".repeat(t-r)+s,d=n+"1".repeat(t-r)+s;return o?{start:a(u(p)),end:a(u(d)),size:Math.pow(2,t-r)}:{start:u(p),end:u(d),size:Math.pow(2,t-r)}},l=function(e,r,t,o,n){if(!i(e))throw new Error("Invalid address: "+e);if(t=(t*=1)||128,o=(o*=1)||1,(r*=1)<1||t<1||r>128||t>128||r>t)throw new Error("Invalid masks.");const s=[],p=c(e).substr(0,r),d="0".repeat(128-t),l=Math.pow(2,t-r);for(let e=0;e<l&&e<o;++e){let e="";for(let a=0;a<t-r;++a)e+=Math.floor(2*Math.random());const i=u(p+e+d);n?s.push(a(i)):s.push(i)}return s},m=function(e,r){if(!i(e))throw new Error("Invalid address: "+e);if((r*=1)<1||r>128||Math.floor(r/4)!=r/4)throw new Error("Invalid masks.");return t(e).replace(/:/g,"").split("").reverse().slice(0,(128-r)/4).join(".")};r.normalize=t,r.abbreviate=a,r.divideSubnet=p,r.range=d,r.randomSubnet=l,r.ptr=m});n.normalize,n.abbreviate,n.divideSubnet,n.range,n.randomSubnet,n.ptr;function s(e){return o.isValid(e)}function c(e){try{var r=o.parse(e).kind();return"ipv4"===r?4:"ipv6"===r?6:0}catch(e){return 0}}function u(e){return 4===c(e)}function p(e){return 6===c(e)}function d(e){try{o.parseCIDR(e);return!0}catch(e){return!1}}function l(e,r){if("string"!=typeof r){if(r&&"object"==typeof r){for(var t in r)if(!0===l(e,r[t]))return!0;return!1}return!1}if(-1===r.indexOf("/"))return e=p(e)?n.normalize(e):e,s(r=p(r)?n.normalize(r):r)&&e===r;try{var a=r.split("/"),i=o.parse(e),c=o.parse(a[0]);return i.match(c,a[1])}catch(e){return!1}}function m(e){try{var r=o.parse(e),t=r.kind();return"ipv4"===t?e:"ipv6"===t?r.isIPv4MappedAddress()?r.toIPv4Address().toString():n.abbreviate(e):null}catch(e){return null}}function g(e){try{var r=o.parse(e),t=r.kind();return"ipv4"===t?e:"ipv6"===t?r.isIPv4MappedAddress()?r.toIPv4Address().toString():n.normalize(e):""}catch(e){return""}}},897(){!function(e){const r="restEndpointAvailable",t="pmw/v1/test/",a=0,i=10;e.emailSelected=!1,e.paymentMethodSelected=!1,e.isBelowRestErrorThreshold=()=>e.retrieveData(a)<=i,e.isRestEndpointAvailable=async()=>e.retrieveData(r)?e.retrieveData(r):await e.testEndpoint(),e.testEndpoint=async(a=e.root+t,i=r)=>{try{const r=await fetch(a,{method:"POST",mode:"cors",cache:"no-cache",keepalive:!0,redirect:"error"});if(!r.ok)return e.storeData(i,!1),e.console.error("Error testing the endpoint. Status: "+r.status+" | response: ",r),!1;const t=await r.json();return t.success?(e.storeData(i,!0),!0):(e.storeData(i,!1),e.console.error("Error testing the endpoint. Response JSON: "+JSON.stringify(t)),!1)}catch(r){return e.storeData(i,!1),e.console.error("Error testing the endpoint. Error: "+r),!1}},e.isPmwRestEndpointAvailable=(t=r)=>!!e.retrieveData(t),e.writeOrderIdToStorage=(r,t,a="thankyou_page")=>{let i=e.retrieveData("orderIds",!0)||[];i.push(r),e.storeData("orderIds",i,!0),"function"==typeof e.storeOrderIdOnServer&&e.storeOrderIdOnServer({orderId:r,orderKey:t,source:a})},e.isOrderIdStored=r=>{if(!pmwDataLayer.shop.order_duplication_prevention)return e.console.log("order duplication prevention is off"),!1;return(e.retrieveData("orderIds",!0)||[]).includes(r)},e.isEmail=e=>new RegExp('^(([^<>()\\[\\]\\\\.,;:\\s@"]+(\\.[^<>()\\[\\]\\\\.,;:\\s@"]+)*)|(".+"))@((\\[[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\])|(([a-zA-Z\\-0-9]+\\.)+[a-zA-Z]{2,}))$').test(e),e.removeProductFromCart=async(r,t=null)=>{try{if(!r)throw Error("Wasn't able to retrieve a productId");if(!(r=e.getIdBasedOndVariationsOutputSetting(r)))throw Error("Wasn't able to retrieve a productId");let a;a=null==t?pmwDataLayer.cart[r].quantity:t,pmwDataLayer.cart[r]||await e.getProductsFromBackend([r]);let i=e.getProductDetailsFormattedForEvent(r,a);jQuery(document).trigger("pmw:remove-from-cart",i),null==t||pmwDataLayer.cart[r].quantity===t?delete pmwDataLayer.cart[r]:pmwDataLayer.cart[r].quantity=pmwDataLayer.cart[r].quantity-a,e.storeCartData(pmwDataLayer.cart)}catch(r){e.console.error("error: ",r)}},e.getIdBasedOndVariationsOutputSetting=e=>{try{return pmwDataLayer?.shop?.variations_output?e:pmwDataLayer.products[e].is_variation?pmwDataLayer.products[e].parent_id:e}catch(e){console.error(e)}},e.prepareSelectors=(e,r)=>(pmwDataLayer?.shop?.selectors?.[r]&&(e=e.concat(pmwDataLayer.shop.selectors[r]),(e=[...new Set(e)]).indexOf("document")>=0&&e.splice(e.indexOf("document"),1),e.indexOf("body")>=0&&(e=["body"])),e.join(", ")),e.addProductToCart=async(r,t)=>{t=Number(t);try{if(!r)throw Error("Wasn't able to retrieve a productId");if(!(r=e.getIdBasedOndVariationsOutputSetting(r)))throw Error("Wasn't able to retrieve a productId");pmwDataLayer?.products[r]||await e.getProductsFromBackend([r]);let a=e.getProductDetailsFormattedForEvent(r,t);jQuery(document).trigger("pmw:add-to-cart",a),pmwDataLayer?.cart[r]?pmwDataLayer.cart[r].quantity=pmwDataLayer.cart[r].quantity+t:("cart"in pmwDataLayer||(pmwDataLayer.cart={}),pmwDataLayer.cart[r]=e.getProductDetailsFormattedForEvent(r,t)),e.storeCartData(pmwDataLayer.cart)}catch(r){console.error(r),e.getCartItemsFromBackend()}},e.initCart=()=>{e.doesWooCommerceCartExist()||0===Object.keys(e.retrieveCartData()).length?e.retrieveCartData()?e.saveCartObjectToDataLayer(e.retrieveCartData()):(e.storeCartData({}),e.getCartItemsFromBackend()):e.storeCartData({})},e.getCartItemsFromBackend=()=>{try{fetch(e.ajax_url,{method:"POST",cache:"no-cache",body:new URLSearchParams({action:"pmw_get_cart_items"}),keepalive:!0,redirect:"error"}).then(e=>{if(e.ok)return e.json();throw Error("Error getting cart items from backend")}).then(r=>{if(!r.success)throw Error("Error getting cart items from backend");r.data.cart||(r.data.cart={}),e.saveCartObjectToDataLayer(r.data.cart),e.storeCartData(r.data.cart),r.data.cart_item_keys&&(pmwDataLayer.cart_item_keys=Object.assign(pmwDataLayer.cart_item_keys||{},r.data.cart_item_keys))})}catch(e){console.error(e)}},e.getProductsFromBackend=async r=>{if(pmwDataLayer?.products&&(r=r.filter(e=>!(e in pmwDataLayer.products))),r&&0!==r.length&&pmwDataLayer.general.page_id&&Array.isArray(r)&&0!==r.length){try{let t={action:"pmw_get_product_ids",page_id:pmwDataLayer.general.page_id,page_type:pmwDataLayer.shop.page_type,product_ids:r};const a=await e.isRestEndpointAvailable(),i=a?e.root+"pmw/v1/products/":e.ajax_url,o={method:"POST",cache:"no-cache",body:a?JSON.stringify(t):new URLSearchParams(t)};a&&(o.headers={"Content-Type":"application/json"});let n=await fetch(i,o);if(!n.ok)throw new Error("Error getting products from backend. Status: "+n.status+" Status text: "+n.statusText);let s=await n.json();if(!s.success)throw new Error("Error getting products from backend: "+s.data);pmwDataLayer.products=Object.assign({},pmwDataLayer.products,s.data)}catch(e){console.error(e)}return!0}},e.saveCartObjectToDataLayer=e=>{pmwDataLayer.cart=e,pmwDataLayer.products=Object.assign({},pmwDataLayer.products,e)},e.triggerViewItemEventPrep=async r=>{pmwDataLayer?.products[r]||await e.getProductsFromBackend([r]),pmwDataLayer?.products[r]?e.triggerViewItemEvent(r):(e.triggerViewItemEventNoProduct(),e.console.log(`Product with ID ${r} not found in the data layer and couldn't be retrieved from the backend. Triggering view-item event without product data.`))},e.triggerViewItemEvent=r=>{let t=e.getProductDetailsFormattedForEvent(r);t&&jQuery(document).trigger("pmw:view-item",t)},e.triggerViewItemEventNoProduct=()=>{jQuery(document).trigger("pmw:view-item")},e.fireCheckoutOption=(e,r=null,t=null)=>{let a={step:e,checkout_option:r,value:t};jQuery(document).trigger("pmw:checkout-option",a)},e.fireCheckoutProgress=e=>{let r={step:e};jQuery(document).trigger("pmw:checkout-progress",r)},e.getPostIdFromString=e=>{try{return e.match(/(post-)(\d+)/)[2]}catch(e){console.error(e)}},e.triggerViewItemList=r=>{if(!r)throw Error("Wasn't able to retrieve a productId");if(!(r=e.getIdBasedOndVariationsOutputSetting(r)))throw Error("Wasn't able to retrieve a productId");jQuery(document).trigger("pmw:view-item-list",e.getProductDataForViewItemEvent(r))},e.getProductDataForViewItemEvent=r=>{if(!r)throw Error("Wasn't able to retrieve a productId");try{if(pmwDataLayer.products[r])return e.getProductDetailsFormattedForEvent(r)}catch(e){console.error(e)}},e.getMainProductIdFromProductPage=()=>{try{return["simple","variable","grouped","composite","bundle"].indexOf(pmwDataLayer.shop.product_type)>=0&&jQuery(".pmwProductId:first").data("id")}catch(e){console.error(e)}},e.viewItemListTriggerTestMode=e=>{jQuery(e).css({position:"relative"}),jQuery(e).append('<div id="viewItemListTriggerOverlay"></div>'),jQuery(e).find("#viewItemListTriggerOverlay").css({"z-index":"10",display:"block",position:"absolute",height:"100%",top:"0",left:"0",right:"0",opacity:pmwDataLayer.shop.view_item_list_trigger.opacity,"background-color":pmwDataLayer.shop.view_item_list_trigger.background_color})},e.getSearchTermFromUrl=()=>{try{return new URLSearchParams(window.location.search).get("s")}catch(e){console.error(e)}};let o,n={};e.observerCallback=(r,t)=>{r.forEach(r=>{try{let a,i=jQuery(r.target).data("ioid");if(a=jQuery(r.target).next(".pmwProductId").length?jQuery(r.target).next(".pmwProductId").data("id"):jQuery(r.target).find(".pmwProductId").data("id"),!a)throw Error("pmwProductId element not found");r.isIntersecting?n[i]=setTimeout(()=>{e.triggerViewItemList(a),pmwDataLayer.shop.view_item_list_trigger.test_mode&&e.viewItemListTriggerTestMode(r.target),!1===pmwDataLayer.shop.view_item_list_trigger.repeat&&t.unobserve(r.target)},pmwDataLayer.shop.view_item_list_trigger.timeout):(clearTimeout(n[i]),pmwDataLayer.shop.view_item_list_trigger.test_mode&&jQuery(r.target).find("#viewItemListTriggerOverlay").remove())}catch(e){console.error(e)}})};let s=0;let c={nested:[],flat:[]};const u=e=>["product","type-product","product-item-inner",...c.nested].some(r=>jQuery(e).closest("."+r).length),p=e=>["wc-block-grid__product","product","product-small","woocommerce-LoopProduct-link",...c.flat].some(r=>jQuery(e).prev().hasClass(r)),d=()=>(c=(()=>{let e={nested:[],flat:[]};try{const r=(e,r)=>jQuery(e).parents().length===jQuery(r).parents().length,t=(e,r)=>jQuery(e).parent().is(jQuery(r).parent())?{node:jQuery(e).parent(),type:"flat"}:{node:jQuery(e).parents().has(jQuery(r).parents()).first(),type:"nested"},a=e=>jQuery(e).find(".pmwProductId").length,i=(e,r)=>e.filter(e=>r.includes(e))[0]||null,o=document.querySelectorAll(".pmwProductId");if(1===o.length)return e;for(let n=0;n<o.length-1;n++){if(!r(o[n],o[n+1])){n++;continue}let s=t(o[n],o[n+1]);if("nested"===s.type){let r=s.node.children().first().attr("class"),t=r?r.split(" "):[],a=s.node.children().first().next().attr("class");const o=i(t,a?a.split(" "):[]);e.nested.push(o)}else if("flat"===s.type){if(!s.node.children().first().attr("class"))continue;let r=s.node.children().first().attr("class").split(" ")[0];e.flat.push(r)}n=n+a(s.node)-1}return e.nested=[...new Set(e.nested)],e.flat=[...new Set(e.flat)],e}catch(r){return console.error(r),e}})(),jQuery(".pmwProductId").map(function(e,r){return u(r)?jQuery(r).parent():p(r)?jQuery(this).prev():jQuery(r).closest(".product").length?jQuery(r).closest(".product"):void 0}));e.startIntersectionObserverToWatch=()=>{try{e.urlHasParameter("vildemomode")&&(pmwDataLayer.shop.view_item_list_trigger.test_mode=!0),o=new IntersectionObserver(e.observerCallback,{root:null,threshold:pmwDataLayer.shop.view_item_list_trigger.threshold}),d().each((e,r)=>{jQuery(r[0]).data("ioid",s++),o.observe(r[0])})}catch(e){console.error(e)}},e.startProductsMutationObserverToWatch=()=>{try{let e=jQuery(".pmwProductId:eq(0)").parents().has(jQuery(".pmwProductId:eq(1)").parents()).first();e.length&&l.observe(e[0],{attributes:!0,childList:!0,characterData:!0})}catch(e){console.error(e)}};const l=new MutationObserver(e=>{e.forEach(e=>{let r=e.addedNodes;if(null!==r){jQuery(r).each((e,r)=>{(u(r)||p(r))&&m(r)&&(jQuery(r).data("ioid",s++),o.observe(r))})}})});let m=e=>!(!jQuery(e).find(".pmwProductId").length&&!jQuery(e).siblings(".pmwProductId").length);e.setCookie=(e,r="",t=null)=>{if(t){let a=new Date;a.setTime(a.getTime()+24*t*60*60*1e3);let i="expires="+a.toUTCString();document.cookie=e+"="+r+";"+i+";path=/"}else document.cookie=e+"="+r+";path=/"},e.getCookie=e=>{let r=e+"=",t=decodeURIComponent(document.cookie).split(";");for(let e=0;e<t.length;e++){let a=t[e];for(;" "==a.charAt(0);)a=a.substring(1);if(0==a.indexOf(r))return a.substring(r.length,a.length)}return""},e.getCookieThatContainsRegex=e=>{let r=document.cookie.split(";");for(let t=0;t<r.length;t++){let a=r[t].trim();if(e.test(a))return a}return!1},e.deleteCookie=r=>{e.setCookie(r,"",-1)},e.storeData=(r,t,a=!1,i=!1)=>{const o=i?r:"";let n=a?e.getPersistentData:e.getSessionData,s=a?e.setPersistentData:e.setSessionData,c=n(o);i?c=t:c[r]=t,s(c,o)},e.retrieveData=(r,t=!1,a=!1)=>{const i=a?r:"";let o=t?e.getPersistentData(i):e.getSessionData(i);return a?o:o[r]},e.deleteDataKey=(r,t=!1,a=!1)=>{const i=a?r:"";let o=t?e.getPersistentData:e.getSessionData,n=t?e.setPersistentData:e.setSessionData,s=o(i);if(a)try{t&&window.localStorage&&window.localStorage.removeItem(e.getPersistentDataKey(i)),!t&&window.sessionStorage&&window.sessionStorage.removeItem(e.getSessionDataKey(i))}catch(e){console.error(e)}else delete s[r],n(s,i)},e.storeCartData=r=>{e.storeData("cart",r,!1,!0)},e.retrieveCartData=()=>e.retrieveData("cart",!1,!0),e.getSessionDataKey=(e="")=>{const r="_pmw_session_data";return e?r+"_"+e:r},e.getPersistentDataKey=e=>{const r="_pmw_persistent_data";return e?r+"_"+e:r},e.getSessionData=(r="")=>{if(window.sessionStorage){let t=window.sessionStorage.getItem(e.getSessionDataKey(r));return null!==t?JSON.parse(t):{}}{let t=e.getCookie(e.getSessionDataKey(r));return""!==t?JSON.parse(t):{}}},e.setSessionData=(r,t="")=>{window.sessionStorage?window.sessionStorage.setItem(e.getSessionDataKey(t),JSON.stringify(r)):e.setCookie(e.getSessionDataKey(t),JSON.stringify(r))},e.getPersistentData=r=>{if(window.localStorage){let t=window.localStorage.getItem(e.getPersistentDataKey(r));return null!==t?JSON.parse(t):{}}{let t=e.getCookie(e.getPersistentDataKey(r));return""!==t?JSON.parse(t):{}}},e.setPersistentData=(r,t="")=>{window.localStorage?window.localStorage.setItem(e.getPersistentDataKey(t),JSON.stringify(r)):e.setCookie(e.getPersistentDataKey(t),JSON.stringify(r),400)},e.storeOrderIdOnServer=async r=>{try{let t;await e.isRestEndpointAvailable()?t=await fetch(e.root+"pmw/v1/pixels-fired/",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({order_id:r.orderId,order_key:r.orderKey,source:r.source}),keepalive:!0,cache:"no-cache",redirect:"error"}):(e.console.log("REST API not available, falling back to AJAX"),t=await fetch(e.ajax_url,{method:"POST",body:new URLSearchParams({action:"pmw_purchase_pixels_fired",order_id:r.orderId,order_key:r.orderKey,source:r.source}),keepalive:!0,redirect:"error"}));const a=await t.json();a.success?e.console.log("",a.data):e.console.error("",a.data)}catch(e){console.error(e)}},e.getProductIdByCartItemElement=r=>{const t=jQuery(r).find(".product-remove").find("a").attr("href");if(t)return e.getProductIdByCartItemKeyUrl(new URL(t));const a=jQuery(r).find("[data-product_id]").first().attr("data-product_id");return a||null},e.getProductQuantityByCartItemElement=e=>jQuery(e).find(".qty").val()||null,e.getProductIdByCartItemKeyUrl=e=>{let r,t=new URLSearchParams(e.search).get("remove_item");return r=0===pmwDataLayer.cart_item_keys[t].variation_id?pmwDataLayer.cart_item_keys[t].product_id:pmwDataLayer.cart_item_keys[t].variation_id,r},e.getAddToCartLinkProductIds=()=>jQuery("a").map(function(){let e=jQuery(this).attr("href");if(e&&e.includes("?add-to-cart=")){let r=e.match(/(add-to-cart=)(\d+)/);if(r)return r[2]}}).get(),e.getProductDetailsFormattedForEvent=(e,r=1)=>{if(!pmwDataLayer.products[e])return null;let t={id:e.toString(),dyn_r_ids:pmwDataLayer.products[e].dyn_r_ids,name:pmwDataLayer.products[e].name,list_name:pmwDataLayer.shop.list_name,brand:pmwDataLayer.products[e].brand,category:pmwDataLayer.products[e].category,variant:pmwDataLayer.products[e].variant,list_position:pmwDataLayer.products[e].position,quantity:r,price:pmwDataLayer.products[e].price,currency:pmwDataLayer.shop.currency,is_variable:pmwDataLayer.products[e].is_variable,is_variation:pmwDataLayer.products[e].is_variation,parent_id:pmwDataLayer.products[e].parent_id};return t.is_variation&&(t.parent_id_dyn_r_ids=pmwDataLayer.products[e].parent_id_dyn_r_ids),t},e.getClidFromBrowser=(r="gclid")=>{let t;if(t={gclid:"_gcl_aw",dclid:"_gcl_dc"},e.getCookie(t[r])){return e.getCookie(t[r]).match(/(GCL.[\d]*.)(.*)/)[2]}return""},e.getUserAgent=()=>navigator.userAgent,e.getViewPort=()=>({width:Math.max(document.documentElement.clientWidth||0,window.innerWidth||0),height:Math.max(document.documentElement.clientHeight||0,window.innerHeight||0)}),e.consoleLogVersion=()=>{console.log(pmwDataLayer.version)};const g=new Set;e.loadScriptAndCacheIt=(r,t)=>{if(g.has(r))return e.console.log("Script already loaded: "+r),Promise.resolve();const a=r=>new Promise((t,a)=>{if(document.querySelector(`script[src="${r}"]`))return g.add(r),e.console.log("Script tag already exists: "+r),void t();const i=document.createElement("script");i.src=r,i.async=!0,i.crossOrigin="anonymous",i.onload=()=>{g.add(r),e.console.log("Successfully loaded script: "+r),t()},i.onerror=()=>{i.remove(),a(new Error("Script failed to load: "+r))},document.head.appendChild(i)});return a(r).catch(()=>{if(t)return e.console.log("Primary script failed, loading fallback: "+t),a(t);throw new Error("Primary script failed to load, and no fallback URL provided.")}).catch(e=>{if(e.message.includes("fallback"))throw e;throw new Error("Both primary and fallback scripts failed to load.")})},e.getOrderItemPrice=e=>(e.total+e.total_tax)/e.quantity,e.hasLoginEventFired=()=>{let r=e.getSessionData();return r?.loginEventFired},e.setLoginEventFired=()=>{let r=e.getSessionData();r.loginEventFired=!0,e.setSessionData(r)},e.pageLoaded=async()=>new Promise(e=>{!function r(){if("complete"===document.readyState)return e();setTimeout(r,50)}()}),e.pageReady=()=>new Promise(e=>{!function r(){if("interactive"===document.readyState||"complete"===document.readyState)return e();setTimeout(r,50)}()}),e.isMiniCartActive=()=>(window.sessionStorage&&Object.keys(window.sessionStorage).forEach(e=>{if(e.includes("wc_fragments"))return!0}),!1),e.doesWooCommerceCartExist=()=>document.cookie.includes("woocommerce_items_in_cart"),e.urlHasParameter=e=>new URLSearchParams(window.location.search).has(e),e.getUrlParameter=e=>new URLSearchParams(window.location.search).get(e),e.hashAsync=(e,r)=>crypto.subtle.digest(e,new TextEncoder("utf-8").encode(r)).then(e=>Array.prototype.map.call(new Uint8Array(e),e=>("00"+e.toString(16)).slice(-2)).join("")),e.getCartValue=()=>{let e=0;if(pmwDataLayer?.cart)for(const r in pmwDataLayer.cart){let t=pmwDataLayer.cart[r];e+=t.quantity*t.price}return e},e.doesUrlContainPatterns=e=>{for(const r of e)if(new RegExp(r).test(window.location.href))return!0;return!1},e.excludeDomainFromTracking=()=>{let e=["appspot.com","translate.google.com"];return pmwDataLayer?.general?.exclude_domains&&(e=[...e,...pmwDataLayer.general.exclude_domains]),!!e.some(e=>window.location.href.includes(e))&&(console.debug("Pixel Manager: Aborted due to excluded domain"),!0)},e.getRandomEventId=(e=16)=>{let r="";for(;r.length<e;)r+=(Math.random()+1).toString(36).substring(2);return r.substring(0,e)},e.pmwConsoleMessage=()=>{let r="Pixel Manager for WooCommerce: ";r+=pmwDataLayer.version.pro?"pro":"free",r+=" | distro: "+pmwDataLayer.version.distro,"fms"===pmwDataLayer.version.distro&&pmwDataLayer.version.pro&&(r+=" | active license: "+(pmwDataLayer.version.eligible_for_updates?"yes":"no")),r+=" | version: "+pmwDataLayer.version.number,!0===pmwDataLayer.version.show?console.log(r):e.console.log(r)},e.canLoadPremiumFeatures=()=>"fms"===pmwDataLayer.version.distro&&pmwDataLayer.version.pro&&pmwDataLayer.version.eligible_for_updates||"wcm"===pmwDataLayer.version.distro;let f=!1;e.triggerPmwDomReadyEvent=()=>{f||("complete"!==document.readyState?(jQuery(()=>{w()}),document.addEventListener("DOMContentLoaded",()=>{w()},!0)):w())};const w=()=>{f||(document.dispatchEvent(new Event("pmw:dom:ready")),f=!0)};e.getEmailFromTarget=r=>{if(r.href){let t=r.href.replace("mailto:","");if(t.indexOf("?")>-1&&(t=t.split("?")[0]),t=t.replace(/\s/g,""),t&&e.isEmail(t))return t}return""},e.sendEventPayloadToServer=r=>{"function"==typeof e.sendEventPayloadToServerPremium&&e.sendEventPayloadToServerPremium(r)},e.waitForPixelsAndTriggerPageView=async()=>new Promise(r=>{if(!pmwDataLayer?.pixels)return e.console.error("pmwDataLayer or pmwDataLayer.pixels is not defined, triggering page view event immediately."),document.dispatchEvent(new Event("pmw:page-view")),void r();let t=pmwDataLayer?.general?.server_2_server?.pageview_event_s2s?.pixels||[];if(t=t.filter(e=>pmwDataLayer.pixels[e]),0===t.length)return e.console.log("No specific pixels to wait for, triggering page view event."),document.dispatchEvent(new Event("pmw:page-view")),void r();const a=()=>{t.every(e=>!pmwDataLayer.pixels[e]||pmwDataLayer.pixels[e].loaded)?(document.dispatchEvent(new Event("pmw:page-view")),r()):setTimeout(a,100)};a()}),e.isWooCommerceActive=()=>!!pmwDataLayer.shop,e.getProductIdForSpecificPixel=(e,r)=>String(e.dyn_r_ids[pmwDataLayer.pixels[r].dynamic_remarketing.id_type]),e.isInWooCommerceSesssion=()=>{if(pmwDataLayer?.shop?.session_active)return!0;let r=new RegExp("woocommerce_cart_hash");return!!e.getCookieThatContainsRegex(r)},e.isNotInWooCommerceSesssion=()=>!e.isInWooCommerceSesssion(),e.makeFullUrl=e=>(e=e.trim(),/^(http:\/\/|https:\/\/)/.test(e)?e:"https://"+(e=e.replace(/^\/+/,""))),e.registerShowVariationEventListener=()=>{let r=null;jQuery(".single_variation_wrap").on("show_variation",(t,a)=>{try{if(!pmwDataLayer?.shop?.variations_output)return;let t=e.getIdBasedOndVariationsOutputSetting(a.variation_id);if(!t)throw Error("Wasn't able to retrieve a productId");r!==a.variation_id&&(e.triggerViewItemEventPrep(t),r=a.variation_id)}catch(e){console.error(e)}})},e.initializeCommandQueue=()=>{const r=window._pmwq=window._pmwq||[];r.forEach(function(r){if("function"==typeof r)try{r()}catch(r){e.console.error("Error executing queued command:",r)}}),r.push=function(r){if("function"==typeof r)try{r()}catch(r){e.console.error("Error executing command from queue:",r)}}}}(window.pmw=window.pmw||{},jQuery)}},o={};function n(e){var r=o[e];if(void 0!==r)return r.exports;var t=o[e]={exports:{}};return i[e].call(t.exports,t,t.exports,n),t.exports}n.m=i,r=Object.getPrototypeOf?e=>Object.getPrototypeOf(e):e=>e.__proto__,n.t=function(t,a){if(1&a&&(t=this(t)),8&a)return t;if("object"==typeof t&&t){if(4&a&&t.__esModule)return t;if(16&a&&"function"==typeof t.then)return t}var i=Object.create(null);n.r(i);var o={};e=e||[null,r({}),r([]),r(r)];for(var s=2&a&&t;("object"==typeof s||"function"==typeof s)&&!~e.indexOf(s);s=r(s))Object.getOwnPropertyNames(s).forEach(e=>o[e]=()=>t[e]);return o.default=()=>t,n.d(i,o),i},n.d=(e,r)=>{for(var t in r)n.o(r,t)&&!n.o(e,t)&&Object.defineProperty(e,t,{enumerable:!0,get:r[t]})},n.f={},n.e=e=>Promise.all(Object.keys(n.f).reduce((r,t)=>(n.f[t](e,r),r),[])),n.u=e=>({194:"wc-hooks",264:"deprecated-functions",526:"pixel-facebook",625:"consent-management",671:"pixel-google",712:"pixel-crazyegg",818:"pixel-hotjar",968:"consent-api",972:"doofinder-listener"}[e]+"."+{194:"c871cc71",264:"08bc16f9",526:"1aad8345",625:"9d45b6cb",671:"87d84819",712:"badd0e8f",818:"c3ec2dc3",968:"c33d5439",972:"5dc21f92"}[e]+".chunk.min.js"),n.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),n.o=(e,r)=>Object.prototype.hasOwnProperty.call(e,r),t={},a="Pixel Manager for WooCommerce:",n.l=(e,r,i,o)=>{if(t[e])t[e].push(r);else{var s,c;if(void 0!==i)for(var u=document.getElementsByTagName("script"),p=0;p<u.length;p++){var d=u[p];if(d.getAttribute("src")==e||d.getAttribute("data-webpack")==a+i){s=d;break}}s||(c=!0,(s=document.createElement("script")).charset="utf-8",n.nc&&s.setAttribute("nonce",n.nc),s.setAttribute("data-webpack",a+i),s.src=e),t[e]=[r];var l=(r,a)=>{s.onerror=s.onload=null,clearTimeout(m);var i=t[e];if(delete t[e],s.parentNode&&s.parentNode.removeChild(s),i&&i.forEach(e=>e(a)),r)return r(a)},m=setTimeout(l.bind(null,void 0,{type:"timeout",target:s}),12e4);s.onerror=l.bind(null,s.onerror),s.onload=l.bind(null,s.onload),c&&document.head.appendChild(s)}},n.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},(()=>{var e;n.g.importScripts&&(e=n.g.location+"");var r=n.g.document;if(!e&&r&&(r.currentScript&&"SCRIPT"===r.currentScript.tagName.toUpperCase()&&(e=r.currentScript.src),!e)){var t=r.getElementsByTagName("script");if(t.length)for(var a=t.length-1;a>-1&&(!e||!/^http(s?):/.test(e));)e=t[a--].src}if(!e)throw new Error("Automatic publicPath is not supported in this browser");e=e.replace(/^blob:/,"").replace(/#.*$/,"").replace(/\?.*$/,"").replace(/\/[^\/]+$/,"/"),n.p=e})(),(()=>{var e={792:0};n.f.j=(r,t)=>{var a=n.o(e,r)?e[r]:void 0;if(0!==a)if(a)t.push(a[2]);else{var i=new Promise((t,i)=>a=e[r]=[t,i]);t.push(a[2]=i);var o=n.p+n.u(r),s=new Error;n.l(o,t=>{if(n.o(e,r)&&(0!==(a=e[r])&&(e[r]=void 0),a)){var i=t&&("load"===t.type?"missing":t.type),o=t&&t.target&&t.target.src;s.message="Loading chunk "+r+" failed.\n("+i+": "+o+")",s.name="ChunkLoadError",s.type=i,s.request=o,a[1](s)}},"chunk-"+r,r)}};var r=(r,t)=>{var a,i,[o,s,c]=t,u=0;if(o.some(r=>0!==e[r])){for(a in s)n.o(s,a)&&(n.m[a]=s[a]);if(c)c(n)}for(r&&r(t);u<o.length;u++)i=o[u],n.o(e,i)&&e[i]&&e[i][0](),e[i]=0},t=self.webpackChunkPixel_Manager_for_WooCommerce=self.webpackChunkPixel_Manager_for_WooCommerce||[];t.forEach(r.bind(null,0)),t.push=r.bind(null,t.push.bind(t))})();(async()=>{if(n(165),n(547),await pmw.jQueryExists(),await pmw.dataLayerFullyLoaded(),pmwDataLayer?.general?.chunk_base_path&&(n.p=pmwDataLayer.general.chunk_base_path),n(79),n(208),n(550),n(341),pmw.initializeCommandQueue(),pmw.pmwConsoleMessage(),await pmw.loadConsentModule(),await pmw.consent.load(),jQuery(()=>{n(544)}),n(50),n.e(972).then(n.t.bind(n,652,23)),pmw.loadWcHooksFunctions(),pmw.excludeDomainFromTracking())return;const e=[];if(pmwDataLayer?.pixels?.google&&e.push(n.e(671).then(n.t.bind(n,62,23))),pmwDataLayer?.pixels?.facebook&&e.push(n.e(526).then(n.t.bind(n,767,23))),pmwDataLayer?.pixels?.hotjar&&e.push(n.e(818).then(n.t.bind(n,155,23))),pmwDataLayer?.pixels?.crazyegg&&e.push(n.e(712).then(n.t.bind(n,49,23))),await Promise.all(e),!1!==pmwDataLayer?.general?.modules?.load_deprecated_functions){const{loadDeprecatedFunctions:e}=await n.e(264).then(n.bind(n,483));e()}document.dispatchEvent(new Event("pmw:load-pixels")),document.dispatchEvent(new Event("pmwLoad")),await pmw.pageLoaded(),document.dispatchEvent(new Event("pmw:ready")),pmw.triggerPmwDomReadyEvent(),pmw.checkLibraryVersion()})()})();1 /*! Copyright 2025 SweetCode. All rights reserved. */(()=>{var e,r,t,a,i={50(){const e=e=>e=(e=e.replace(/<[^>]*>?/gm,"").replace(/\n/gm,"").replace(/\t/gm,"")).trim();jQuery("form.woocommerce-checkout").on("change","#shipping_method",t=>{t.target?.value&&t.target?.id&&r({slug:t.target.value,text:e(jQuery("label[for='"+t.target.id+"']").text())})}),jQuery(()=>{if(jQuery("#shipping_method").length){let t=jQuery("#shipping_method").find(":checked");if(t.length){if(!t.val())return;if(!t.attr("id"))return;r({slug:t.val(),text:e(jQuery("label[for='"+t.attr("id")+"']").text())})}}});const r=e=>{jQuery(document).trigger("pmw:add-shipping-info",{shippingTier:e})};let t=!1;jQuery("form.woocommerce-checkout").on("change",'input[name="payment_method"]',r=>{r.target.value&&r.target.id&&(a({slug:r.target.value,text:e(jQuery("label[for='"+r.target.id+"']").text())}),t=!0)}),jQuery(()=>{if(t)return;let r=jQuery('input[name="payment_method"]:checked');if(r.length){if(!r.val())return;if(!r.attr("id"))return;a({slug:r.val(),text:e(jQuery("label[for='"+r.attr("id")+"']").text())})}});const a=e=>{jQuery(document).trigger("pmw:add-payment-info",{paymentType:e})};jQuery(document).on("click",".remove_from_cart_button, .remove",e=>{try{let r=new URL(jQuery(e.currentTarget).attr("href")),t=pmw.getProductIdByCartItemKeyUrl(r);pmw.removeProductFromCart(t)}catch(e){console.error(e)}});const i=pmw.prepareSelectors([".checkout-button",".cart-checkout-button",".button.checkout",".xoo-wsc-ft-btn-checkout",".elementor-button--checkout",".xt_woofc-checkout",".fkcart-checkout--text"],"beginCheckout");jQuery(document).on("click init_checkout",i,()=>{jQuery(document).trigger("pmw:begin-checkout")}),jQuery(document).on("updated_cart_totals",()=>{jQuery(document).trigger("pmw:view-cart")}),jQuery(document).on("pmwLoad",e=>{jQuery(document).on("payment_method_selected",()=>{!1===pmw.paymentMethodSelected&&pmw.fireCheckoutProgress(3),pmw.fireCheckoutOption(3,jQuery("input[name='payment_method']:checked").val()),pmw.paymentMethodSelected=!0})}),jQuery(document).on("pmwLoad",()=>{try{pmw.initCart()}catch(e){console.error(e)}}),jQuery(document).on("pmwLoad",()=>{pmwDataLayer.products=pmwDataLayer.products||{};let e=pmw.getAddToCartLinkProductIds();pmw.getProductsFromBackend(e)}),jQuery(document).on("pmwLoad",()=>{if(!document.referrer)return;if(pmw.retrieveData("referrer"))return;let e=new URL(document.referrer).hostname;e!==window.location.host&&pmw.storeData("referrer",e)}),jQuery(document).on("pmwLoad",()=>{let e=pmw.getUrlParameter("gclid");e&&pmw.storeData("gclid",e);let r=pmw.getUrlParameter("wbraid");r&&pmw.storeData("wbraid",r);let t=pmw.getUrlParameter("gbraid");t&&pmw.storeData("gbraid",t);let a=pmw.getUrlParameter("fbclid");a&&(a="fb.1."+Math.floor(Date.now()/1e3)+"."+a,pmw.storeData("fbclid",a));let i=pmw.getUrlParameter("ttclid");i&&pmw.storeData("ttclid",i);let o=pmw.getUrlParameter("ScCid");o&&pmw.storeData("scid",o);let n=pmw.getUrlParameter("epik");n&&pmw.storeData("epik",n)}),jQuery(document).on("pmwLoad",()=>{try{if("undefined"!=typeof pmwDataLayer&&!pmwDataLayer?.pmw_loaded){if(jQuery(document).trigger("pmw:load-always"),pmwDataLayer?.shop)if("product"===pmwDataLayer.shop.page_type&&"variable"!==pmwDataLayer.shop.product_type&&pmw.getMainProductIdFromProductPage()){let e=pmw.getProductDataForViewItemEvent(pmw.getMainProductIdFromProductPage());jQuery(document).trigger("pmw:view-item",e)}else if("product"===pmwDataLayer.shop.page_type&&"variable"===pmwDataLayer.shop.product_type&&!pmwDataLayer?.shop?.variations_output&&pmw.getMainProductIdFromProductPage()){let e=pmw.getProductDataForViewItemEvent(pmw.getMainProductIdFromProductPage());jQuery(document).trigger("pmw:view-item",e)}else"product_category"===pmwDataLayer.shop.page_type?jQuery(document).trigger("pmw:view-category"):"search"===pmwDataLayer.shop.page_type?jQuery(document).trigger("pmw:search"):"cart"===pmwDataLayer.shop.page_type?jQuery(document).trigger("pmw:view-cart"):"order_received_page"===pmwDataLayer.shop.page_type?pmwDataLayer?.order&&!pmw.isOrderIdStored(pmwDataLayer.order.id)&&(jQuery(document).trigger("pmw:purchase"),pmw.writeOrderIdToStorage(pmwDataLayer.order.id,pmwDataLayer.order.key),"function"==typeof pmw.acrRemoveCookie&&pmw.acrRemoveCookie()):jQuery(document).trigger("pmw:everywhere-else");else jQuery(document).trigger("pmw:everywhere-else");pmwDataLayer?.user?.id&&!pmw.hasLoginEventFired()&&(jQuery(document).trigger("pmw:login"),pmw.setLoginEventFired()),pmwDataLayer?.user?.account_just_created&&!pmw.hasAccountCreatedEventFired()&&(jQuery(document).trigger("pmw:account-created"),pmw.setAccountCreatedEventFired()),pmwDataLayer.pmw_loaded=!0}}catch(e){console.error(e)}}),pmwDataLayer?.general?.lazy_load_pmw&&pmw.registerShowVariationEventListener(),jQuery(document).on("pmwLoad",()=>{if(pmwDataLayer?.general?.lazy_load_pmw&&pmwDataLayer?.shop?.variations_output)try{const e=jQuery(".variations_form");if(!e.length)return;const r={};if(!e.find("select").toArray().every(e=>{const t=jQuery(e).val();return!!t&&(r[jQuery(e).attr("name")]=t,!0)}))return;const t=e.data("product_variations");if(!t)return;const a=t.find(e=>Object.entries(r).every(([r,t])=>e.attributes[r]===t));a&&pmw.triggerViewItemEventPrep(a.variation_id)}catch(e){pmw.console.error(e)}}),jQuery(document).on("pmwLoad",async()=>{!1===pmw.retrieveData("restEndpointAvailable")&&pmw.console.error("REST endpoint is not available. Using admin-ajax.php instead.")}),jQuery(document).on("pmw:page-view",async e=>{pmw.console.log("pmw:page-view event fired",{event:e});const r=await pmw.processEvent("page_view",{});if(pmwDataLayer?.general?.server_2_server?.pageview_event_s2s?.is_active){const e=pmw.pixelRegistry.getPixelsWithCapability("supportsPageViewS2S");if(e.length>0){const t={event:"page_view"};for(const a of e)r.pixels[a]&&(t[a]=r.pixels[a]);Object.keys(t).length>1&&pmw.sendEventPayloadToServer(t)}}}),jQuery(document).on("pmw:add-to-cart",async(e,r)=>{pmw.console.log("pmw:add-to-cart event fired",{event:e,product:r}),await pmw.processEvent("add_to_cart",{product:r})}),jQuery(document).on("pmw:remove-from-cart",async(e,r)=>{pmw.console.log("pmw:remove-from-cart event fired",{event:e,product:r}),await pmw.processEvent("remove_from_cart",{product:r})}),jQuery(document).on("pmw:select-item",async(e,r)=>{pmw.console.log("pmw:select-item event fired",{event:e,product:r}),await pmw.processEvent("select_item",{product:r})}),jQuery(document).on("pmw:view-cart",e=>{pmw.console.log("pmw:view-cart event fired",{event:e}),pmw.processEvent("view_cart",{})}),jQuery(document).on("pmw:begin-checkout",e=>{pmw.console.log("pmw:begin-checkout event fired",{event:e}),pmw.processEvent("begin_checkout",{})}),jQuery(document).on("pmw:add-payment-info",e=>{pmw.console.log("pmw:add-payment-info event fired",{event:e}),pmw.processEvent("add_payment_info",{})}),jQuery(document).on("pmw:add-to-wishlist",async(e,r)=>{pmw.console.log("pmw:add-to-wishlist event fired",{event:e,product:r}),await pmw.processEvent("add_to_wishlist",{product:r})}),jQuery(document).on("pmw:view-item",(e,r=null)=>{pmw.console.log("pmw:view-item event fired",{event:e,product:r}),pmw.processEvent("view_item",{product:r})}),jQuery(document).on("pmw:view-category",async(e,r=null)=>{pmw.console.log("pmw:view-category event fired",{event:e,product:r}),await pmw.processEvent("view_category",{product:r})}),jQuery(document).on("pmw:search",e=>{pmw.console.log("pmw:search event fired",{event:e}),pmw.processEvent("search",{})}),jQuery(document).on("pmw:place-order",async e=>{pmw.console.log("pmw:place-order event fired",{event:e}),await pmw.processEvent("place_order",{})}),jQuery(document).on("pmw:purchase",async e=>{pmw.console.log("pmw:purchase event fired",{event:e}),await pmw.processEvent("purchase",{order:pmwDataLayer.order})}),jQuery(document).on("pmw:login",async()=>{pmw.console.log("pmw:login event fired"),await pmw.processEvent("login",{})}),jQuery(document).on("pmw:account-created",async()=>{pmw.console.log("pmw:account-created event fired"),await pmw.processEvent("account_created",{})}),jQuery(document).on("pmw:ready",async()=>{pmw.isWooCommerceActive()&&(pmw.startIntersectionObserverToWatch(),pmw.startProductsMutationObserverToWatch())}),jQuery(document).on("pmw:load-pixels",()=>{pmw.waitForPixelsAndTriggerPageView()})},79(e,r,t){t(897),window.pmw.loadConsentModule=async()=>{const e=await t.e(625).then(t.bind(t,383));window.pmw.consent=e;const r=await t.e(968).then(t.bind(t,523));return window.pmw=window.pmw||{},window.pmw.consent=window.pmw.consent||{},window.pmw.consent.api=r,e},window.pmw=window.pmw||{},window.pmw.console=t(91);const a=t(310);window.pmw.crossTabSync=a,t(362)},91(e,r,t){"use strict";t.r(r),t.d(r,{error:()=>i,log:()=>a});const a=(e,...r)=>{o()&&("object"==typeof e?console.log("Pixel Manager: ",e,...r):r.length?console.log("Pixel Manager: "+e,...r):console.log("Pixel Manager: "+e))},i=(e,...r)=>{"object"==typeof e?console.error("Pixel Manager: ",e,...r):r.length?console.error("Pixel Manager: "+e,...r):console.error("Pixel Manager: "+e)},o=()=>!n()&&(!!s()||(!!c()||!!pmwDataLayer?.general?.logger?.is_active)),n=()=>(pmw.urlHasParameter("pmwloggeroff")&&pmw.storeData("loggerEnabled",!1),pmw.urlHasParameter("pmwloggeroff")),s=()=>pmw.retrieveData("loggerEnabled"),c=()=>(pmw.urlHasParameter("pmwloggeron")&&pmw.storeData("loggerEnabled",!0),pmw.urlHasParameter("pmwloggeron"))},160(e,r,t){"use strict";var a=this&&this.__spreadArrays||function(){for(var e=0,r=0,t=arguments.length;r<t;r++)e+=arguments[r].length;var a=Array(e),i=0;for(r=0;r<t;r++)for(var o=arguments[r],n=0,s=o.length;n<s;n++,i++)a[i]=o[n];return a};Object.defineProperty(r,"__esModule",{value:!0}),r.isSpecial=r.isReserved=r.isIPv4MappedAddress=r.isLocalhost=r.isPrivate=r.createChecker=r.isInSubnet=r.extractMappedIpv4=void 0;var i=t(609),o=t(503),n=/\./,s=/^(.+:ffff:)(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})(?:%.+)?$/,c=/:/,u=/::/;function p(e){if(!i.isIPv6(e))throw new Error("not a valid IPv6 address: "+e);if(n.test(e))return p(function(e){var r=e.match(s);if(!r||!i.isIPv4(r[2]))throw new Error("not a mapped IPv4 address: "+e);var t=r[1],a=r[2].split(n).map(function(e){return parseInt(e,10)});return""+t+((a[0]<<8)+a[1]).toString(16)+":"+((a[2]<<8)+a[3]).toString(16)}(e));var r=e.split(u),t=r[0],a=r[1],o=t&&t.split(c)||[],d=a&&a.split(c)||[],l=new Array(8-(o.length+d.length));return o.concat(l,d)}function d(e){if(Array.isArray(e)){var r=e.map(function(e){return l(e)});return function(e){var t=p(e);return r.some(function(e){return e(t)})}}var t=l(e);return function(e){var r=p(e);return t(r)}}function l(e){var r=e.split("/"),t=r[0],a=r[1],i=parseInt(a,10);if(!t||!Number.isInteger(i))throw new Error("not a valid IPv6 CIDR subnet: "+e);if(i<0||i>128)throw new Error("not a valid IPv6 prefix length: "+i+" (from "+e+")");var o=p(t);return function(e){for(var r=0;r<8;++r){var t=Math.min(i-16*r,16);if(t<=0)break;if((o[r]&&parseInt(o[r],16)||0)>>16-t!==(e[r]&&parseInt(e[r],16)||0)>>16-t)return!1}return!0}}r.extractMappedIpv4=function(e){var r=e.match(s);if(!r||!i.isIPv4(r[2]))throw new Error("not a mapped IPv4 address: "+e);return r[2]},r.isInSubnet=function(e,r){return d(r)(e)},r.createChecker=d;var m={};r.isPrivate=function(e){return"private"in m==!1&&(m.private=d(o.default.private.ipv6)),m.private(e)},r.isLocalhost=function(e){return"localhost"in m==!1&&(m.localhost=d(o.default.localhost.ipv6)),m.localhost(e)},r.isIPv4MappedAddress=function(e){if("mapped"in m==!1&&(m.mapped=d("::ffff:0:0/96")),m.mapped(e)){var r=e.match(s);return Boolean(r&&i.isIPv4(r[2]))}return!1},r.isReserved=function(e){return"reserved"in m==!1&&(m.reserved=d(o.default.reserved.ipv6)),m.reserved(e)},r.isSpecial=function(e){return"special"in m==!1&&(m.special=d(a(o.default.private.ipv6,o.default.localhost.ipv6,o.default.reserved.ipv6))),m.special(e)}},165(e,r,t){!function(e){e.jQueryExists=async()=>new Promise(e=>{!function r(){if("undefined"!=typeof jQuery)return e();setTimeout(r,100)}()}),e.waitForLibrary=(e,r=5e3,t=100)=>{const a=Date.now();for(;void 0===window[e]&&!(Date.now()-a>r);)setTimeout(()=>{},t)},e.dataLayerFullyLoaded=async()=>{let e=new Promise(e=>{!function r(){if("undefined"!=typeof pmwDataLayer&&void 0!==pmwDataLayer.version)return e();setTimeout(r,100)}()}),r=setTimeout(()=>{console.error("Pixel Manager error: The pmwDataLayer is not defined. Please make sure that the pmwDataLayer script snippet is inserted and not modified by any third-party plugin, such as a consent management platform or a JavaScript optimizer.")},6e3);return e.then(()=>{clearTimeout(r)}),e},e.wpHooksExists=async()=>new Promise(e=>{!function r(){if("undefined"!=typeof wp&&void 0!==wp.hooks)return e();setTimeout(r,50)}()}),e.loadWcHooksFunctions=async()=>{await e.wpHooksExists(),await t.e(194).then(t.t.bind(t,224,23))}}(window.pmw=window.pmw||{},jQuery)},208(){!function(e){window.pmw=window.pmw||{},e.hooks={filters:{},addFilter:function(r,t,a,i=10){r&&"string"==typeof r?t&&"string"==typeof t?"function"==typeof a?(this.filters[r]||(this.filters[r]=[]),this.filters[r].push({namespace:t,callback:a,priority:i}),this.filters[r].sort((e,r)=>e.priority-r.priority),e.console.log(`Filter added: ${r} (${t}) with priority ${i}`)):e.console.error("Invalid callback provided to addFilter"):e.console.error("Invalid namespace provided to addFilter"):e.console.error("Invalid hook name provided to addFilter")},applyFilters:function(r,t,...a){if(!this.filters[r]||0===this.filters[r].length)return t;let i=t;for(const t of this.filters[r])try{const o=t.callback(i,...a);undefined!==o?i=o:e.console.warn(`Filter ${t.namespace} on ${r} returned undefined, keeping previous value`)}catch(a){e.console.error(`Filter error in ${t.namespace} on ${r}:`,a)}return i},removeFilter:function(r,t){if(!this.filters[r])return;const a=this.filters[r].length;this.filters[r]=this.filters[r].filter(e=>e.namespace!==t),this.filters[r].length<a&&e.console.log(`Filter removed: ${r} (${t})`)},removeAllFilters:function(r){this.filters[r]&&(delete this.filters[r],e.console.log(`All filters removed for: ${r}`))},hasFilter:function(e,r=null){return!(!this.filters[e]||0===this.filters[e].length)&&(!r||this.filters[e].some(e=>e.namespace===r))},getFilters:function(e){return this.filters[e]||[]}},e.hooks=e.hooks}(window.pmw=window.pmw||{},jQuery)},265(e,r,t){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.check=r.isSpecial=r.isReserved=r.isIPv4MappedAddress=r.isLocalhost=r.isPrivate=r.createChecker=r.isInSubnet=r.IPv6=r.IPv4=r.isIPv6=r.isIPv4=r.isIP=void 0;var a=t(618);r.IPv4=a;var i=t(160);r.IPv6=i;var o=t(609),n=t(609);function s(e,r){return c(r)(e)}function c(e){if(!Array.isArray(e))return c([e]);var r=e.reduce(function(e,r){var t=r.split("/")[0];return e[o.isIP(t)].push(r),e},{0:[],4:[],6:[]});if(0!==r[0].length)throw new Error("some subnets are not valid IP addresses: "+r[0]);var t=a.createChecker(r[4]),n=i.createChecker(r[6]);return function(e){if(!o.isIP(e))throw new Error("not a valid IPv4 or IPv6 address: "+e);return o.isIPv6(e)&&i.isIPv4MappedAddress(e)?n(e)||t(i.extractMappedIpv4(e)):o.isIPv6(e)?n(e):t(e)}}Object.defineProperty(r,"isIP",{enumerable:!0,get:function(){return n.isIP}}),Object.defineProperty(r,"isIPv4",{enumerable:!0,get:function(){return n.isIPv4}}),Object.defineProperty(r,"isIPv6",{enumerable:!0,get:function(){return n.isIPv6}}),r.isInSubnet=s,r.createChecker=c,r.isPrivate=function(e){return o.isIPv6(e)?i.isIPv4MappedAddress(e)?a.isPrivate(i.extractMappedIpv4(e)):i.isPrivate(e):a.isPrivate(e)},r.isLocalhost=function(e){return o.isIPv6(e)?i.isIPv4MappedAddress(e)?a.isLocalhost(i.extractMappedIpv4(e)):i.isLocalhost(e):a.isLocalhost(e)},r.isIPv4MappedAddress=function(e){return!!o.isIPv6(e)&&i.isIPv4MappedAddress(e)},r.isReserved=function(e){return o.isIPv6(e)?i.isIPv4MappedAddress(e)?a.isReserved(i.extractMappedIpv4(e)):i.isReserved(e):a.isReserved(e)},r.isSpecial=function(e){return o.isIPv6(e)?i.isIPv4MappedAddress(e)?a.isSpecial(i.extractMappedIpv4(e)):i.isSpecial(e):a.isSpecial(e)},r.check=s},310(e,r,t){"use strict";t.r(r),t.d(r,{broadcastUpdate:()=>y,cleanup:()=>A,init:()=>v,isSyncableKey:()=>l,isSyncing:()=>m});const a="_pmw_cross_tab_sync",i="_pmw_session_data",o="SESSION_REQUEST",n="SESSION_RESPONSE",s="SESSION_UPDATE",c=new Set(["loginEventFired","accountCreatedEventFired","acr_attempted","store_client_ip_in_server_session"]);let u=!1,p=null,d=!1;const l=e=>!c.has(e),m=()=>u,g=()=>{const e={main:{},extensions:{}};if(!window.sessionStorage)return e;try{const r=window.sessionStorage.getItem(i);r&&(e.main=JSON.parse(r));for(let r=0;r<window.sessionStorage.length;r++){const t=window.sessionStorage.key(r);if(t&&t.startsWith(i+"_")){const r=t.substring(18);try{e.extensions[r]=JSON.parse(window.sessionStorage.getItem(t))}catch(e){}}}}catch(e){}return e},f=e=>{if(window.sessionStorage&&e){u=!0;try{if(e.main&&"object"==typeof e.main){const r=(e=>{if(!e||"object"!=typeof e)return{};const r={};for(const t of Object.keys(e))l(t)&&(r[t]=e[t]);return r})(e.main),t=window.sessionStorage.getItem(i),a=t?JSON.parse(t):{},o={...r,...a};window.sessionStorage.setItem(i,JSON.stringify(o))}if(e.extensions&&"object"==typeof e.extensions)for(const[r,t]of Object.entries(e.extensions)){const e=i+"_"+r;window.sessionStorage.getItem(e)||window.sessionStorage.setItem(e,JSON.stringify(t))}}catch(e){}u=!1}},w=e=>{try{p?p.postMessage(e):(window.localStorage.setItem(a,JSON.stringify(e)),window.localStorage.removeItem(a))}catch(e){}},h=e=>{if(e&&e.type)switch(e.type){case o:w({type:n,data:g()});break;case n:f(e.data);break;case s:if(!e.key||!l(e.key))break;u=!0;try{if(e.extension){const r=i+"_"+e.suffix;window.sessionStorage.setItem(r,JSON.stringify(e.value))}else{const r=window.sessionStorage.getItem(i),t=r?JSON.parse(r):{};t[e.key]=e.value,window.sessionStorage.setItem(i,JSON.stringify(t))}}catch(e){}u=!1}},y=(e,r,t=!1,a="")=>{u||(t||l(e))&&w({type:s,key:e,value:r,extension:t,suffix:a})},v=()=>{if(!d){d=!0;try{"undefined"!=typeof BroadcastChannel?(p=new BroadcastChannel("pmw_session_sync"),p.onmessage=e=>h(e.data)):window.addEventListener("storage",e=>{if(e.key===a&&e.newValue)try{const r=JSON.parse(e.newValue);h(r)}catch(e){}}),w({type:o})}catch(e){}}},A=()=>{if(p){try{p.close()}catch(e){}p=null}d=!1}},341(){!function(e){e.getConsentContext=function(){const r=e.consent?.categories?.get()||{statistics:!0,marketing:!0,preferences:!0,necessary:!0};return{categories:{statistics:r.statistics,marketing:r.marketing,preferences:r.preferences,necessary:r.necessary},visitor_has_chosen:e.consent?.settings?.get()?.visitorHasChosen??!1,explicit_mode:e.consent?.explicitConsentModeActive?.()??!1}},e.getEventContext=function(){return{timestamp:Math.floor(Date.now()/1e3),url:window.location.href,referrer:e.retrieveData("referrer")?e.makeFullUrl(e.retrieveData("referrer")):document.referrer,user_agent:navigator.userAgent,page_type:pmwDataLayer?.shop?.page_type,user_id:pmwDataLayer?.user?.id?.raw||null,consent:e.getConsentContext()}},e.processEvent=async function(r,t){e.console.log(`Processing event: ${r}`,t);try{let a={event:r,event_data:t,pixels:{},context:e.getEventContext()};a=e.hooks.applyFilters("pmw_event_payload_pre",a,r);const i=e.pixelRegistry.getProcessablePixels();for(const t of i){const i=e.pixelRegistry.getAdapter(t);if(i&&"function"==typeof i.adapt)try{let o=await i.adapt(a.event_data,r,a.context);if(null===o)continue;o=e.hooks.applyFilters(`pmw_pixel_data_${t}`,o,r,a.event_data,a.context),a.pixels[t]=o}catch(r){e.console.error(`Error adapting data for ${t}:`,r)}else e.console.log(`No adapter found for pixel: ${t}`)}a=e.hooks.applyFilters(`pmw_event_payload_${r}`,a,a.event_data),a=e.hooks.applyFilters("pmw_event_payload_post",a,r),a.firing={};for(const t of Object.keys(a.pixels))a.firing[t]=e.pixelRegistry.getFiringDecision(t,r);return await e.dispatchToPixels(a),a}catch(t){throw e.console.error(`Error processing event ${r}:`,t),t}},e.dispatchToPixels=async function(r){const t=r.event;if(e.dispatchUnifiedEvent(r),e.dispatchPublicEvent(r),"purchase"!==t){if("page_view"!==t&&pmwDataLayer?.general?.server_2_server?.active){const a=e.extractS2SData(r);if(Object.keys(a).length>0){if(pmwDataLayer.general.server_2_server.skip_empty_events){if(0===Object.keys(a).filter(e=>"event"!==e&&"product"!==e).length)return void e.console.log(`Skipping empty S2S event: ${t} — no destination pixels`)}const r=e.pixelRegistry.getPixelsForServerFiring(t);e.console.log(`S2S enabled pixels for ${t}:`,r),await e.sendEventPayloadToServer(a)}}}else e.console.log("Purchase event - skipping browser-to-server transmission (handled server-side only)")},e.dispatchUnifiedEvent=function(r){const t=e.pixelRegistry.getProcessablePixels();if(0===t.length)return;const a=r.event.replace(/_/g,"-");e.console.log(`Dispatching unified event pmw:pixel:${a}`,{processablePixels:t,firingStatus:r.firing}),jQuery(document).trigger(`pmw:pixel:${a}`,r)},e.dispatchToBrowserPixels=function(r){const t=e.pixelRegistry.getActiveBrowserOnlyPixels();if(0===t.length)return;e.console.log(`[DEPRECATED] Dispatching to browser-only pixels for ${r.event}:`,t);const a=r.event.replace(/_/g,"-");jQuery(document).trigger(`pmw:browser:${a}`,r)},e.dispatchToS2SPixels=function(r){const t=e.pixelRegistry.getActiveS2SPixels();if(0===t.length)return;e.console.log(`[DEPRECATED] Dispatching to S2S-capable pixels for ${r.event}:`,t);const a=r.event.replace(/_/g,"-");jQuery(document).trigger(`pmw:s2s:${a}`,r)},e.dispatchPublicEvent=function(r){const t=r.event.replace(/_/g,"-");jQuery(document).trigger(`pmw:event:${t}`,r),e.console.log(`Public event dispatched: pmw:event:${t}`,r)},e.extractS2SData=function(r){const t={event:r.event},a=e.pixelRegistry.getPixelsForServerFiring(r.event);for(const e of a)r.pixels[e]&&(t[e]=r.pixels[e]);return r.event_data?.product&&(t.product=r.event_data.product),t},e.shouldFireBrowserPixel=function(e,r){return!0===e.firing?.[r]?.fire_browser},e.shouldFireServerPixel=function(e,r){return!0===e.firing?.[r]?.fire_server},e.adapters||(e.adapters={}),e.registerAdapter=function(r,t,a={}){if(!t||"function"!=typeof t.adapt)return void e.console.error(`Invalid adapter for ${r}: must have an adapt() method`);e.adapters[r]=t,e.pixelCapabilities||(e.pixelCapabilities={});let i="browser_only";a.supportsS2S&&(i="both"),e.pixelCapabilities[r]={...a,mode:a.mode||i,supportsS2S:a.supportsS2S||!1,supportsEventDeduplication:a.supportsEventDeduplication||!1,isActive:a.isActive||null}}}(window.pmw=window.pmw||{},jQuery)},362(e,r,t){!function(e,r,a){const{isRange:i,isIP:o,isV4:n,isV6:s,version:c}=t(723);let u=null,p=!1;const d={cloudflare:{any:"https://www.cloudflare.com/cdn-cgi/trace"},icanhazip:{4:"https://ipv4.icanhazip.com",6:"https://ipv6.icanhazip.com",any:"https://icanhazip.com"},ipinfo:{any:"https://ipinfo.io/ip"},myexternalip:{any:"https://myexternalip.com/raw"},ipify:{4:"https://api4.ipify.org",6:"https://api6.ipify.org",any:"https://api64.ipify.org"},identme:{4:"https://4.ident.me/",6:"https://6.ident.me/",any:"https://ident.me/"}},l=(e,r=3e3)=>{const t=new AbortController,a=setTimeout(()=>t.abort(),r);return fetch(e,{signal:t.signal}).finally(()=>clearTimeout(a))};e.getGeoInfo={cloudflare:async()=>{const e=await l("https://www.cloudflare.com/cdn-cgi/trace");if(!e.ok)throw new Error(`The response from Cloudflare was not OK. Status: ${e.status}`);let r=await e.text();if(!r)throw new Error("No data was returned from Cloudflare");if(r=r.trim().split("\n").reduce((e,r)=>(e[(r=r.split("="))[0]]=r[1],e),{}),!r.ip||!r.loc)throw new Error("The JSON data is missing the ip or loc key from Cloudflare");if(m(r.loc))throw new Error("We have to validate the region, and this service is not returning the region.");return{ip:r.ip,countryCode:r.loc,service:"cloudflare"}},geojs:async()=>{const e=await l("https://get.geojs.io/v1/ip/geo.json");if(!e.ok)throw new Error(`The response from geojs was not OK. Status: ${e.status}`);let r=await e.json();if(!r)throw new Error("No JSON data was returned from geojs");if(!r.ip||!r.country_code||!r.region)throw new Error("The JSON data is missing the ip, country_code, or region key from geojs");return{ip:r.ip,countryCode:r.country_code,region:r.region,service:"geojs"}},ipinfo:async()=>{const e=await l("https://ipinfo.io/json");if(!e.ok)throw new Error(`The response from ipinfo was not OK from ipinfo. Status: ${e.status}`);let r=await e.json();if(!r)throw new Error("No JSON data was returned from ipinfo");if(!r.ip||!r.country||!r.region)throw new Error("The JSON data is missing the ip, country, or region key from ipinfo");return{ip:r.ip,countryCode:r.country,region:r.region,service:"ipinfo"}},ipapi:async()=>{const e=await l("https://ipapi.co/json");if(!e.ok)throw new Error(`The response from ipapi was not OK. Status: ${e.status}`);let r=await e.json();if(!r)throw new Error("No JSON data was returned from ipapi");if(!r.ip||!r.country||!r.region)throw new Error("The JSON data is missing the ip, country, or region key from ipapi");return{ip:r.ip,countryCode:r.country,region:r.region,service:"ipapi"}}};const m=e=>{if("US "!==e)return!1;return["US-CA","US-VA"].some(e=>pmwDataLayer?.general?.consent_management.restricted_regions.includes(e))};e.isVisitorAllowed=async()=>{if(null!==e.retrieveData("visitorAllowed")&&e.retrieveData("visitorAllowed")!==a)return!!JSON.parse(e.retrieveData("visitorAllowed"));if(e.isBotUserAgent())return e.storeData("visitorAllowed",!1),!1;if(Array.isArray(pmwDataLayer?.general?.server_2_server?.ip_exclude_list)&&pmwDataLayer.general.server_2_server.ip_exclude_list.length>0){const r=await e.getIp();if(w(r))return e.storeData("visitorAllowed",!1),!1}return e.storeData("visitorAllowed",!0),!0},e.isValidIpAddress=r=>!(!r||"string"!=typeof r)&&(!!o(r)&&!e.isPrivateOrReservedIp(r)),e.isPrivateOrReservedIp=e=>{if(!e)return!0;const r=n(e)?["10.0.0.0/8","172.16.0.0/12","192.168.0.0/16","127.0.0.0/8","169.254.0.0/16","0.0.0.0/8"]:["::1/128","fc00::/7","fe80::/10","::/128"];try{const a=t(265);for(const t of r)if(a.isInSubnet(e,t))return!0}catch(r){if(n(e)){if(e.startsWith("10.")||e.startsWith("192.168.")||e.startsWith("127.")||e.startsWith("169.254.")||e.startsWith("0."))return!0;const r=e.split(".");if("172"===r[0]){const e=parseInt(r[1],10);if(e>=16&&e<=31)return!0}}else if("::1"===e||e.startsWith("fc")||e.startsWith("fd")||e.startsWith("fe80:"))return!0}return!1},e.getClientIp=async()=>{const r=e.retrieveData("client_ip");return r&&e.isValidIpAddress(r)?r:(u&&!p||(p=!1,u=(async()=>{try{const r=e.getIpWithTimeout("6",2e3),t=e.getIp("any"),[a,i]=await Promise.allSettled([r,t]);let o=null;return"fulfilled"===a.status&&a.value?(o=a.value,e.console.log(`Using IPv6 address: ${o}`)):"fulfilled"===i.status&&i.value&&(o=i.value,e.console.log(`IPv6 not available, using IP: ${o}`)),o&&e.isValidIpAddress(o)?(e.storeData("client_ip",o),p=!0,o):(p=!0,null)}catch(r){return e.console.error("Error detecting client IP:",r),p=!0,null}})()),u)},e.getIpWithTimeout=async(r,t)=>Promise.race([e.getIp(r),new Promise((e,a)=>setTimeout(()=>a(new Error(`IPv${r} detection timed out after ${t}ms`)),t))]).catch(r=>(e.console.log(r.message),null)),e.getIp=async(r="any",t=3)=>{const i=["any","4","6"];if(!i.includes(r))return console.error("The version argument must be one of the following: "+i.join(", ")),null;if("any"===r&&e.retrieveData("ip"))return e.retrieveData("ip");const n=e.retrieveData(`ipv${r}`);if(n!==a)return n;e.console.log("Testing the IP address of the browser because one ore more server-to-server APIs are enabled and require the browser IP. It may trigger connection request errors in the console while testing the IP address. This is normal and expected behavior.");try{const a=await e.getIpFromAnyService(r,t);return a&&!o(a)?(e.console.warn(`Invalid IP address received: ${a}`),null):("any"===r&&a&&e.storeData("ip",a),(4===c(a)||"4"===r&&null===a)&&e.storeData("ipv4",a),(6===c(a)||"6"===r&&null===a)&&e.storeData("ipv6",a),a)}catch(e){return null}},e.getBrowserGeoFromExternalService=async()=>{const r=performance.now();let t=[];Object.keys(e.getGeoInfo).forEach(r=>{t.push(e.getGeoInfo[r]())});try{const a=await Promise.any(t);return a.countryCode=a.countryCode.toUpperCase(),a.region&&"California"===a.region&&(a.regionCode="US-CA"),a.region&&"Virginia"===a.region&&(a.regionCode="US-VA"),e.console.log("Retrieved the browser geo info from an external service: ",a," which took ",(performance.now()-r).toFixed(2)+" ms"),a}catch(r){return e.console.error("error: ",r),null}};e.getBrowserGeo=async()=>{let r={};if(e.retrieveData("geoCountryCode")&&(r.countryCode=e.retrieveData("geoCountryCode")),e.retrieveData("geoRegionCode")&&(r.regionCode=e.retrieveData("geoRegionCode")),e.retrieveData("geoRegion")&&(r.region=e.retrieveData("geoRegion")),r.countryCode)return e.console.log("Retrieved the browser geo location from the cache: ",r),r;let a=await e.getBrowserGeoFromExternalService();if(!a){const r=(()=>{const e=t(473).getLocationByTimeZone();return e.countryCode?e:null})();a={},r&&e.console.log("Retrieved the browser geo location from the timezone: ",r),r.countryCode&&(a.countryCode=r.countryCode),r.regionCode&&(a.regionCode=r.regionCode)}return a?.ip&&e.storeData("ip",a.ip),a?.countryCode&&e.storeData("geoCountryCode",a.countryCode),a?.regionCode&&e.storeData("geoRegionCode",a.regionCode),a?.region&&e.storeData("geoRegion",a.region),a?.countryCode?a:null},e.getIpFromAnyService=async(r="any",t=3)=>{const a=performance.now(),i=Object.keys(d).filter(e=>d[e][r]).slice(0,t).reduce((e,r)=>(e[r]=d[r],e),{});let o=[];if(Object.keys(i).forEach(t=>{i[t][r]&&o.push(e.getIpFromService(t,r))}),!(o.length>0))return e.console.log("No promises to resolve"),null;try{const r=await Promise.any(o),t=(performance.now()-a).toFixed(2);return e.console.log(`Retrieved the IP address ${r.ip} from ${r.service} which took ${t} ms`),r.ip}catch(t){return e.console.log(`Could not retrieve an IP with version ${r} from any of the services.`),null}},e.getIpFromService=async(r,t="any")=>{try{let a={ip:null,service:r,ipVersion:t};if(!d[r][t])return Promise.reject(new Error(`The IP version ${t} is not available for the service ${r}`));e.console.log(`Fetching IP from ${r} using IP version ${t}`);const i=await l(d[r][t]);if(!i.ok)return Promise.reject(new Error(`The response from ${r} was not OK. Status: ${i.status}`));let n=await i.text();return"cloudflare"===r?(n=n.trim().split("\n").reduce((e,r)=>(e[(r=r.split("="))[0]]=r[1],e),{}),a.ip=n.ip):a.ip=n.trim(),o(a.ip)?a:Promise.reject(new Error(`The returned value from ${r} is not an IP address`))}catch(e){return Promise.reject(e)}};e.isVisitorNotAllowed=async()=>!1===await e.isVisitorAllowed(),e.isBotUserAgent=()=>{const e=navigator.userAgent||"";if(!e)return!0;const r=g();for(const t of r)if(e.toLowerCase().includes(t.toLowerCase()))return!0;return!1};const g=()=>{let e=[];Array.isArray(pmwDataLayer?.general?.server_2_server?.user_agent_exclude_patterns)&&(e=pmwDataLayer.general.server_2_server.user_agent_exclude_patterns);return["Googlebot","Google-InspectionTool","Google-Extended","Storebot-Google","bingbot","BingPreview","msnbot","Slurp","DuckDuckBot","Baiduspider","YandexBot","Sogou","facebookexternalhit","FacebookBot","LinkedInBot","Twitterbot","PinterestBot","TikTokBot","SnapchatAds","DiscordBot","InstagramBot","WhatsApp","AhrefsBot","SemrushBot","MJ12bot","DotBot","rogerbot","UptimeRobot","Pingdom","StatusCake","GTmetrix","ClaudeBot","GPTBot","ChatGPT","anthropic-ai","CCBot","PerplexityBot","crawler","spider","scraper","bot/","/bot","bot-"].concat(e)},f=e=>e.includes("/"),w=e=>{const r=pmwDataLayer?.general?.server_2_server?.ip_exclude_list||[];for(const t of r)if(f(t)){if(isInSubnet.isInSubnet(e,t))return!0}else if(e===t)return!0;return!1}}(window.pmw=window.pmw||{},jQuery)},473(e,r,t){"use strict";t.r(r),t.d(r,{getLocationByTimeZone:()=>a});const a=()=>{const e=Intl.DateTimeFormat().resolvedOptions().timeZone;if(""===e||!e)return null;let r={countryCode:{"Africa/Abidjan":["CI","BF","GH","GM","GN","ML","MR","SH","SL","SN","TG"],"Africa/Accra":["GH"],"Africa/Addis_Ababa":["ET"],"Africa/Algiers":["DZ"],"Africa/Asmara":["ER"],"Africa/Asmera":["ER"],"Africa/Bamako":["ML"],"Africa/Bangui":["CF"],"Africa/Banjul":["GM"],"Africa/Bissau":["GW"],"Africa/Blantyre":["MW"],"Africa/Brazzaville":["CG"],"Africa/Bujumbura":["BI"],"Africa/Cairo":["EG"],"Africa/Casablanca":["MA"],"Africa/Ceuta":["ES"],"Africa/Conakry":["GN"],"Africa/Dakar":["SN"],"Africa/Dar_es_Salaam":["TZ"],"Africa/Djibouti":["DJ"],"Africa/Douala":["CM"],"Africa/El_Aaiun":["EH"],"Africa/Freetown":["SL"],"Africa/Gaborone":["BW"],"Africa/Harare":["ZW"],"Africa/Johannesburg":["ZA","LS","SZ"],"Africa/Juba":["SS"],"Africa/Kampala":["UG"],"Africa/Khartoum":["SD"],"Africa/Kigali":["RW"],"Africa/Kinshasa":["CD"],"Africa/Lagos":["NG","AO","BJ","CD","CF","CG","CM","GA","GQ","NE"],"Africa/Libreville":["GA"],"Africa/Lome":["TG"],"Africa/Luanda":["AO"],"Africa/Lubumbashi":["CD"],"Africa/Lusaka":["ZM"],"Africa/Malabo":["GQ"],"Africa/Maputo":["MZ","BI","BW","CD","MW","RW","ZM","ZW"],"Africa/Maseru":["LS"],"Africa/Mbabane":["SZ"],"Africa/Mogadishu":["SO"],"Africa/Monrovia":["LR"],"Africa/Nairobi":["KE","DJ","ER","ET","KM","MG","SO","TZ","UG","YT"],"Africa/Ndjamena":["TD"],"Africa/Niamey":["NE"],"Africa/Nouakchott":["MR"],"Africa/Ouagadougou":["BF"],"Africa/Porto-Novo":["BJ"],"Africa/Sao_Tome":["ST"],"Africa/Timbuktu":["ML"],"Africa/Tripoli":["LY"],"Africa/Tunis":["TN"],"Africa/Windhoek":["NA"],"America/Adak":["US"],"America/Anchorage":["US"],"America/Anguilla":["AI"],"America/Antigua":["AG"],"America/Araguaina":["BR"],"America/Argentina/Buenos_Aires":["AR"],"America/Argentina/Catamarca":["AR"],"America/Argentina/Cordoba":["AR"],"America/Argentina/Jujuy":["AR"],"America/Argentina/La_Rioja":["AR"],"America/Argentina/Mendoza":["AR"],"America/Argentina/Rio_Gallegos":["AR"],"America/Argentina/Salta":["AR"],"America/Argentina/San_Juan":["AR"],"America/Argentina/San_Luis":["AR"],"America/Argentina/Tucuman":["AR"],"America/Argentina/Ushuaia":["AR"],"America/Aruba":["AW"],"America/Asuncion":["PY"],"America/Atikokan":["CA"],"America/Bahia":["BR"],"America/Bahia_Banderas":["MX"],"America/Barbados":["BB"],"America/Belem":["BR"],"America/Belize":["BZ"],"America/Blanc-Sablon":["CA"],"America/Boa_Vista":["BR"],"America/Bogota":["CO"],"America/Boise":["US"],"America/Cambridge_Bay":["CA"],"America/Campo_Grande":["BR"],"America/Cancun":["MX"],"America/Caracas":["VE"],"America/Cayenne":["GF"],"America/Cayman":["KY"],"America/Chicago":["US"],"America/Chihuahua":["MX"],"America/Coral_Harbour":["CA"],"America/Costa_Rica":["CR"],"America/Creston":["CA"],"America/Cuiaba":["BR"],"America/Curacao":["CW"],"America/Danmarkshavn":["GL"],"America/Dawson":["CA"],"America/Dawson_Creek":["CA"],"America/Denver":["US"],"America/Detroit":["US"],"America/Dominica":["DM"],"America/Edmonton":["CA"],"America/Eirunepe":["BR"],"America/El_Salvador":["SV"],"America/Fort_Nelson":["CA"],"America/Fortaleza":["BR"],"America/Glace_Bay":["CA"],"America/Goose_Bay":["CA"],"America/Grand_Turk":["TC"],"America/Grenada":["GD"],"America/Guadeloupe":["GP"],"America/Guatemala":["GT"],"America/Guayaquil":["EC"],"America/Guyana":["GY"],"America/Halifax":["CA"],"America/Havana":["CU"],"America/Hermosillo":["MX"],"America/Indiana/Indianapolis":["US"],"America/Indiana/Knox":["US"],"America/Indiana/Marengo":["US"],"America/Indiana/Petersburg":["US"],"America/Indiana/Tell_City":["US"],"America/Indiana/Vevay":["US"],"America/Indiana/Vincennes":["US"],"America/Indiana/Winamac":["US"],"America/Inuvik":["CA"],"America/Iqaluit":["CA"],"America/Jamaica":["JM"],"America/Juneau":["US"],"America/Kentucky/Louisville":["US"],"America/Kentucky/Monticello":["US"],"America/Kralendijk":["BQ"],"America/La_Paz":["BO"],"America/Lima":["PE"],"America/Los_Angeles":["US"],"America/Lower_Princes":["SX"],"America/Maceio":["BR"],"America/Managua":["NI"],"America/Manaus":["BR"],"America/Marigot":["MF"],"America/Martinique":["MQ"],"America/Matamoros":["MX"],"America/Mazatlan":["MX"],"America/Menominee":["US"],"America/Merida":["MX"],"America/Metlakatla":["US"],"America/Mexico_City":["MX"],"America/Miquelon":["PM"],"America/Moncton":["CA"],"America/Monterrey":["MX"],"America/Montevideo":["UY"],"America/Montreal":["CA"],"America/Montserrat":["MS"],"America/Nassau":["BS"],"America/New_York":["US"],"America/Nipigon":["CA"],"America/Nome":["US"],"America/Noronha":["BR"],"America/North_Dakota/Beulah":["US"],"America/North_Dakota/Center":["US"],"America/North_Dakota/New_Salem":["US"],"America/Nuuk":["GL"],"America/Ojinaga":["MX"],"America/Panama":["PA","CA","KY"],"America/Pangnirtung":["CA"],"America/Paramaribo":["SR"],"America/Phoenix":["US","CA"],"America/Port-au-Prince":["HT"],"America/Port_of_Spain":["TT"],"America/Porto_Velho":["BR"],"America/Puerto_Rico":["PR","AG","CA","AI","AW","BL","BQ","CW","DM","GD","GP","KN","LC","MF","MS","SX","TT","VC","VG","VI"],"America/Punta_Arenas":["CL"],"America/Rainy_River":["CA"],"America/Rankin_Inlet":["CA"],"America/Recife":["BR"],"America/Regina":["CA"],"America/Resolute":["CA"],"America/Rio_Branco":["BR"],"America/Santarem":["BR"],"America/Santiago":["CL"],"America/Santo_Domingo":["DO"],"America/Sao_Paulo":["BR"],"America/Scoresbysund":["GL"],"America/Sitka":["US"],"America/St_Barthelemy":["BL"],"America/St_Johns":["CA"],"America/St_Kitts":["KN"],"America/St_Lucia":["LC"],"America/St_Thomas":["VI"],"America/St_Vincent":["VC"],"America/Swift_Current":["CA"],"America/Tegucigalpa":["HN"],"America/Thule":["GL"],"America/Thunder_Bay":["CA"],"America/Tijuana":["MX"],"America/Toronto":["CA","BS"],"America/Tortola":["VG"],"America/Vancouver":["CA"],"America/Virgin":["VI"],"America/Whitehorse":["CA"],"America/Winnipeg":["CA"],"America/Yakutat":["US"],"America/Yellowknife":["CA"],"Antarctica/Casey":["AQ"],"Antarctica/Davis":["AQ"],"Antarctica/DumontDUrville":["AQ"],"Antarctica/Macquarie":["AU"],"Antarctica/Mawson":["AQ"],"Antarctica/McMurdo":["AQ"],"Antarctica/Palmer":["AQ"],"Antarctica/Rothera":["AQ"],"Antarctica/South_Pole":["AQ"],"Antarctica/Syowa":["AQ"],"Antarctica/Troll":["AQ"],"Antarctica/Vostok":["AQ"],"Arctic/Longyearbyen":["SJ"],"Asia/Aden":["YE"],"Asia/Almaty":["KZ"],"Asia/Amman":["JO"],"Asia/Anadyr":["RU"],"Asia/Aqtau":["KZ"],"Asia/Aqtobe":["KZ"],"Asia/Ashgabat":["TM"],"Asia/Atyrau":["KZ"],"Asia/Baghdad":["IQ"],"Asia/Bahrain":["BH"],"Asia/Baku":["AZ"],"Asia/Bangkok":["TH","KH","LA","VN"],"Asia/Barnaul":["RU"],"Asia/Beirut":["LB"],"Asia/Bishkek":["KG"],"Asia/Brunei":["BN"],"Asia/Chita":["RU"],"Asia/Choibalsan":["MN"],"Asia/Colombo":["LK"],"Asia/Damascus":["SY"],"Asia/Dhaka":["BD"],"Asia/Dili":["TL"],"Asia/Dubai":["AE","OM"],"Asia/Dushanbe":["TJ"],"Asia/Famagusta":["CY"],"Asia/Gaza":["PS"],"Asia/Hebron":["PS"],"Asia/Ho_Chi_Minh":["VN"],"Asia/Hong_Kong":["HK"],"Asia/Hovd":["MN"],"Asia/Irkutsk":["RU"],"Asia/Jakarta":["ID"],"Asia/Jayapura":["ID"],"Asia/Jerusalem":["IL"],"Asia/Kabul":["AF"],"Asia/Kamchatka":["RU"],"Asia/Karachi":["PK"],"Asia/Kathmandu":["NP"],"Asia/Khandyga":["RU"],"Asia/Kolkata":["IN"],"Asia/Krasnoyarsk":["RU"],"Asia/Kuala_Lumpur":["MY"],"Asia/Kuching":["MY"],"Asia/Kuwait":["KW"],"Asia/Macau":["MO"],"Asia/Magadan":["RU"],"Asia/Makassar":["ID"],"Asia/Manila":["PH"],"Asia/Muscat":["OM"],"Asia/Nicosia":["CY"],"Asia/Novokuznetsk":["RU"],"Asia/Novosibirsk":["RU"],"Asia/Omsk":["RU"],"Asia/Oral":["KZ"],"Asia/Phnom_Penh":["KH"],"Asia/Pontianak":["ID"],"Asia/Pyongyang":["KP"],"Asia/Qatar":["QA","BH"],"Asia/Qostanay":["KZ"],"Asia/Qyzylorda":["KZ"],"Asia/Riyadh":["SA","AQ","KW","YE"],"Asia/Sakhalin":["RU"],"Asia/Samarkand":["UZ"],"Asia/Seoul":["KR"],"Asia/Shanghai":["CN"],"Asia/Singapore":["SG","MY"],"Asia/Srednekolymsk":["RU"],"Asia/Taipei":["TW"],"Asia/Tashkent":["UZ"],"Asia/Tbilisi":["GE"],"Asia/Tehran":["IR"],"Asia/Thimphu":["BT"],"Asia/Tokyo":["JP"],"Asia/Tomsk":["RU"],"Asia/Ulaanbaatar":["MN"],"Asia/Urumqi":["CN"],"Asia/Ust-Nera":["RU"],"Asia/Vientiane":["LA"],"Asia/Vladivostok":["RU"],"Asia/Yakutsk":["RU"],"Asia/Yangon":["MM"],"Asia/Yekaterinburg":["RU"],"Asia/Yerevan":["AM"],"Atlantic/Azores":["PT"],"Atlantic/Bermuda":["BM"],"Atlantic/Canary":["ES"],"Atlantic/Cape_Verde":["CV"],"Atlantic/Faroe":["FO"],"Atlantic/Jan_Mayen":["SJ"],"Atlantic/Madeira":["PT"],"Atlantic/Reykjavik":["IS"],"Atlantic/South_Georgia":["GS"],"Atlantic/St_Helena":["SH"],"Atlantic/Stanley":["FK"],"Australia/Adelaide":["AU"],"Australia/Brisbane":["AU"],"Australia/Broken_Hill":["AU"],"Australia/Darwin":["AU"],"Australia/Eucla":["AU"],"Australia/Hobart":["AU"],"Australia/Lindeman":["AU"],"Australia/Lord_Howe":["AU"],"Australia/Melbourne":["AU"],"Australia/Perth":["AU"],"Australia/Sydney":["AU"],"Canada/Eastern":["CA"],"Europe/Amsterdam":["NL"],"Europe/Andorra":["AD"],"Europe/Astrakhan":["RU"],"Europe/Athens":["GR"],"Europe/Belfast":["GB"],"Europe/Belgrade":["RS","BA","HR","ME","MK","SI"],"Europe/Berlin":["DE"],"Europe/Bratislava":["SK"],"Europe/Brussels":["BE"],"Europe/Bucharest":["RO"],"Europe/Budapest":["HU"],"Europe/Busingen":["DE"],"Europe/Chisinau":["MD"],"Europe/Copenhagen":["DK"],"Europe/Dublin":["IE"],"Europe/Gibraltar":["GI"],"Europe/Guernsey":["GG"],"Europe/Helsinki":["FI","AX"],"Europe/Isle_of_Man":["IM"],"Europe/Istanbul":["TR"],"Europe/Jersey":["JE"],"Europe/Kaliningrad":["RU"],"Europe/Kiev":["UA"],"Europe/Kirov":["RU"],"Europe/Lisbon":["PT"],"Europe/Ljubljana":["SI"],"Europe/London":["GB","GG","IM","JE"],"Europe/Luxembourg":["LU"],"Europe/Madrid":["ES"],"Europe/Malta":["MT"],"Europe/Mariehamn":["AX"],"Europe/Minsk":["BY"],"Europe/Monaco":["MC"],"Europe/Moscow":["RU"],"Europe/Oslo":["NO","SJ","BV"],"Europe/Paris":["FR"],"Europe/Podgorica":["ME"],"Europe/Prague":["CZ","SK"],"Europe/Riga":["LV"],"Europe/Rome":["IT","SM","VA"],"Europe/Samara":["RU"],"Europe/San_Marino":["SM"],"Europe/Sarajevo":["BA"],"Europe/Saratov":["RU"],"Europe/Simferopol":["RU","UA"],"Europe/Skopje":["MK"],"Europe/Sofia":["BG"],"Europe/Stockholm":["SE"],"Europe/Tallinn":["EE"],"Europe/Tirane":["AL"],"Europe/Ulyanovsk":["RU"],"Europe/Uzhgorod":["UA"],"Europe/Vaduz":["LI"],"Europe/Vatican":["VA"],"Europe/Vienna":["AT"],"Europe/Vilnius":["LT"],"Europe/Volgograd":["RU"],"Europe/Warsaw":["PL"],"Europe/Zagreb":["HR"],"Europe/Zaporozhye":["UA"],"Europe/Zurich":["CH","DE","LI"],GB:["GB"],"GB-Eire":["GB"],"Indian/Antananarivo":["MG"],"Indian/Chagos":["IO"],"Indian/Christmas":["CX"],"Indian/Cocos":["CC"],"Indian/Comoro":["KM"],"Indian/Kerguelen":["TF","HM"],"Indian/Mahe":["SC"],"Indian/Maldives":["MV"],"Indian/Mauritius":["MU"],"Indian/Mayotte":["YT"],"Indian/Reunion":["RE","TF"],NZ:["NZ"],"Pacific/Apia":["WS"],"Pacific/Auckland":["NZ","AQ"],"Pacific/Bougainville":["PG"],"Pacific/Chatham":["NZ"],"Pacific/Chuuk":["FM"],"Pacific/Easter":["CL"],"Pacific/Efate":["VU"],"Pacific/Fakaofo":["TK"],"Pacific/Fiji":["FJ"],"Pacific/Funafuti":["TV"],"Pacific/Galapagos":["EC"],"Pacific/Gambier":["PF"],"Pacific/Guadalcanal":["SB"],"Pacific/Guam":["GU","MP"],"Pacific/Honolulu":["US","UM"],"Pacific/Johnston":["UM"],"Pacific/Kanton":["KI"],"Pacific/Kiritimati":["KI"],"Pacific/Kosrae":["FM"],"Pacific/Kwajalein":["MH"],"Pacific/Majuro":["MH"],"Pacific/Marquesas":["PF"],"Pacific/Midway":["UM"],"Pacific/Nauru":["NR"],"Pacific/Niue":["NU"],"Pacific/Norfolk":["NF"],"Pacific/Noumea":["NC"],"Pacific/Pago_Pago":["AS","UM"],"Pacific/Palau":["PW"],"Pacific/Pitcairn":["PN"],"Pacific/Pohnpei":["FM"],"Pacific/Port_Moresby":["PG","AQ"],"Pacific/Rarotonga":["CK"],"Pacific/Saipan":["MP"],"Pacific/Samoa":["WS"],"Pacific/Tahiti":["PF"],"Pacific/Tarawa":["KI"],"Pacific/Tongatapu":["TO"],"Pacific/Wake":["UM"],"Pacific/Wallis":["WF"],Singapore:["SG"],"US/Arizona":["US"],"US/Hawaii":["US"],"US/Samoa":["WS"]}[e][0].toUpperCase()};return"America/Los_Angeles"===e&&(r.regionCode="US-CA"),"Europe/Zurich"===e&&(r.regionCode="CH-ZH"),r}},503(e,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.default={localhost:{ipv4:["127.0.0.0/8"],ipv6:["::1/128"]},private:{ipv4:["10.0.0.0/8","172.16.0.0/12","192.168.0.0/16"],ipv6:["fe80::/10","fc00::/7"]},reserved:{ipv4:["0.0.0.0/8","100.64.0.0/10","169.254.0.0/16","192.0.0.0/24","192.0.2.0/24","192.88.99.0/24","198.18.0.0/15","198.51.100.0/24","203.0.113.0/24","224.0.0.0/4","240.0.0.0/4","255.255.255.255/32"],ipv6:["::/128","64:ff9b::/96","100::/64","2001::/32","2001:10::/28","2001:20::/28","2001:db8::/32","2002::/16","ff00::/8"]}}},544(){const e=pmw.prepareSelectors([".add_to_cart_button:not(.product_type_variable)",".ajax_add_to_cart",".single_add_to_cart_button"],"addToCart");jQuery(e).on("click adding_to_cart",(e,r)=>{try{let r=e?.target?.dataset?.quantity?e.target.dataset.quantity:null,t=e?.target?.dataset?.product_id?e.target.dataset.product_id:e?.target?.value?e.target.value:null;if("product"===pmwDataLayer.shop.page_type){if(void 0!==jQuery(e.currentTarget).attr("href")&&jQuery(e.currentTarget).attr("href").includes("add-to-cart"))return t||(t=jQuery(e.currentTarget).data("product_id")),void pmw.addProductToCart(t,1);if("simple"===pmwDataLayer.shop.product_type)return null===r&&(r=Number(jQuery(".input-text.qty").val())?Number(jQuery(".input-text.qty").val()):1),t||(t=jQuery(e.currentTarget).val()),t||(t=jQuery(".product").attr("id").replace("product-","")),void pmw.addProductToCart(t,r);if(["variable","variable-subscription"].indexOf(pmwDataLayer.shop.product_type)>=0)return null===r&&(r=Number(jQuery(".input-text.qty").val())?Number(jQuery(".input-text.qty").val()):1),t||(t=jQuery("[name='variation_id']").val()),void pmw.addProductToCart(t,r);if("grouped"===pmwDataLayer.shop.product_type)return void jQuery(".woocommerce-grouped-product-list-item").each((e,a)=>{r=Number(jQuery(a).find(".input-text.qty").val())?Number(jQuery(a).find(".input-text.qty").val()):1;let i=jQuery(a).attr("class");t=pmw.getPostIdFromString(i),pmw.addProductToCart(t,r)});if("bundle"===pmwDataLayer.shop.product_type)return null===r&&(r=Number(jQuery(".input-text.qty").val())?Number(jQuery(".input-text.qty").val()):1),t||(t=jQuery("input[name=add-to-cart]").val()),void pmw.addProductToCart(t,r);null===r&&(r=Number(jQuery(".input-text.qty").val())?Number(jQuery(".input-text.qty").val()):1),pmw.addProductToCart(t,r)}else null===r&&(r=1),t||(t=jQuery(e.currentTarget).data("product_id")?jQuery(e.currentTarget).data("product_id"):null),t||(t=jQuery(e.currentTarget).val()?jQuery(e.currentTarget).val():null),t&&r&&pmw.addProductToCart(t,r)}catch(e){console.error(e)}}),jQuery("a:not(.add_to_cart_button, .ajax_add_to_cart, .single_add_to_cart_button)").one("click",e=>{try{if(jQuery(e.target).closest("a").attr("href")){let r=new URL(jQuery(e.currentTarget).attr("href"),window.location.origin);if(r.searchParams.has("add-to-cart")){let e=r.searchParams.get("add-to-cart"),t=r.searchParams.has("quantity")?parseInt(r.searchParams.get("quantity"),10):1;pmw.addProductToCart(e,t)}}}catch(e){console.error(e)}}),jQuery(".woocommerce-LoopProduct-link, .wc-block-grid__product, .product, .product-small, .type-product").on("click",e=>{try{let r=jQuery(e.currentTarget).nextAll(".pmwProductId:first").data("id");if(r){if(r=pmw.getIdBasedOndVariationsOutputSetting(r),!r)throw Error("Wasn't able to retrieve a productId");if(pmwDataLayer.products&&pmwDataLayer.products[r]){let e=pmw.getProductDetailsFormattedForEvent(r);jQuery(document).trigger("pmw:select-item",e)}}}catch(e){console.error(e)}}),jQuery("#billing_email").on("input",e=>{pmw.isEmail(jQuery(e.currentTarget).val())&&(pmw.fireCheckoutProgress(2),pmw.emailSelected=!0)}),jQuery("form.checkout").on("checkout_place_order_success",()=>{!1===pmw.emailSelected&&pmw.fireCheckoutProgress(2),!1===pmw.paymentMethodSelected&&(pmw.fireCheckoutProgress(3),pmw.fireCheckoutOption(3,jQuery("input[name='payment_method']:checked").val())),pmw.fireCheckoutProgress(4),jQuery(document).trigger("pmw:place-order",{})}),jQuery(document).on("click","[name='update_cart']",()=>{try{jQuery(".cart_item").each((e,r)=>{const t=pmw.getProductIdByCartItemElement(r);if(!t)return void console.error("Pixel Manager: Wasn't able to retrieve a productId");const a=pmw.getProductQuantityByCartItemElement(r);a?0===a?pmw.removeProductFromCart(t):a<pmwDataLayer.cart[t].quantity?pmw.removeProductFromCart(t,pmwDataLayer.cart[t].quantity-a):a>pmwDataLayer.cart[t].quantity&&pmw.addProductToCart(t,a-pmwDataLayer.cart[t].quantity):console.error("Pixel Manager: Wasn't able to retrieve a quantity")})}catch(e){console.error(e),pmw.getCartItemsFromBackend()}}),jQuery(".add_to_wishlist,.wl-add-to").on("click",e=>{try{let r;if(jQuery(e.currentTarget).data("productid")?r=jQuery(e.currentTarget).data("productid"):jQuery(e.currentTarget).data("product-id")&&(r=jQuery(e.currentTarget).data("product-id")),!r)throw Error("Wasn't able to retrieve a productId");let t=pmw.getProductDetailsFormattedForEvent(r);jQuery(document).trigger("pmw:add-to-wishlist",t)}catch(e){console.error(e)}}),pmwDataLayer?.general?.lazy_load_pmw||pmw.registerShowVariationEventListener()},547(){!function(e){e.getLibraryVersion=()=>"1.57.0",e.checkLibraryVersion=()=>{e.getLibraryVersion()!==pmwDataLayer?.version?.number&&console.error(`Pixel Manager: The library version ${e.getLibraryVersion()} and pmwDataLayer.version.number ${pmwDataLayer.version.number} do not match. Delete the server-side cache and try again.`)}}(window.pmw=window.pmw||{},jQuery)},550(){!function(e){const r=["browser_only","server_only","both","browser_or_server"];e.pixelRegistry={getActivePixels(){const r=[];if(!e.pixelCapabilities)return r;for(const[t,a]of Object.entries(e.pixelCapabilities))if("function"==typeof a.isActive)try{a.isActive()&&r.push(t)}catch(r){e.console.error(`Error checking if ${t} is active:`,r)}return r},getActiveBrowserOnlyPixels(){const r=[],t=this.getActivePixels();for(const a of t)!0!==e.pixelCapabilities?.[a]?.supportsS2S&&r.push(a);return r},getActiveS2SPixels(){const r=[],t=this.getActivePixels();for(const a of t)!0===e.pixelCapabilities?.[a]?.supportsS2S&&r.push(a);return r},getS2SConfiguredPixels(){const r=[];if(!e.pixelCapabilities)return r;if(!0!==pmwDataLayer?.general?.server_2_server?.always_send_s2s)return r;for(const[t,a]of Object.entries(e.pixelCapabilities))if(!0===a.supportsS2S&&("function"!=typeof a.isActive||!a.isActive())&&"function"==typeof a.isConfigured)try{a.isConfigured()&&r.push(t)}catch(r){e.console.error(`Error checking if ${t} is configured:`,r)}return r},getProcessablePixels(){const e=this.getActivePixels(),r=this.getS2SConfiguredPixels(),t=new Set([...e,...r]);return Array.from(t)},getAdapter:r=>e.adapters&&e.adapters[r]||null,getPixelsWithCapability(r){const t=[],a=this.getActivePixels();for(const i of a)!0===e.pixelCapabilities?.[i]?.[r]&&t.push(i);return t},getFiringMode(t){const a=e.pixelCapabilities?.[t]?.mode;return a&&r.includes(a)?a:!0===e.pixelCapabilities?.[t]?.supportsS2S?"both":"browser_only"},getFiringDecision(r,t){const a=this.getFiringMode(r),i=!0===pmwDataLayer?.general?.server_2_server?.active,o=!0===e.pixelCapabilities?.[r]?.supportsS2S,n="function"==typeof e.pixelCapabilities?.[r]?.isActive&&e.pixelCapabilities[r].isActive(),s=!0===pmwDataLayer?.general?.server_2_server?.always_send_s2s;let c={fire_browser:!0,fire_server:!1};if(!n&&s&&o&&i)c={fire_browser:!1,fire_server:!0};else switch(a){case"browser_only":c={fire_browser:!0,fire_server:!1};break;case"server_only":c={fire_browser:!1,fire_server:i&&o};break;case"both":c={fire_browser:!0,fire_server:i&&o};break;case"browser_or_server":c=i&&o?{fire_browser:!1,fire_server:!0}:{fire_browser:!0,fire_server:!1}}return c=e.hooks.applyFilters("pmw_pixel_firing_decision",c,r,t,a),c},getPixelsForBrowserFiring(e){const r=[],t=this.getProcessablePixels();for(const a of t){this.getFiringDecision(a,e).fire_browser&&r.push(a)}return r},getPixelsForServerFiring(e){const r=[],t=this.getProcessablePixels();for(const a of t){this.getFiringDecision(a,e).fire_server&&r.push(a)}return r}}}(window.pmw=window.pmw||{},jQuery)},609(e,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.isIP=r.isIPv6=r.isIPv4=void 0;var t="(?:[0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])",a="("+t+"[.]){3}"+t,i=new RegExp("^"+a+"$"),o="(?:[0-9a-fA-F]{1,4})",n=new RegExp("^((?:"+o+":){7}(?:"+o+"|:)|(?:"+o+":){6}(?:"+a+"|:"+o+"|:)|(?:"+o+":){5}(?::"+a+"|(:"+o+"){1,2}|:)|(?:"+o+":){4}(?:(:"+o+"){0,1}:"+a+"|(:"+o+"){1,3}|:)|(?:"+o+":){3}(?:(:"+o+"){0,2}:"+a+"|(:"+o+"){1,4}|:)|(?:"+o+":){2}(?:(:"+o+"){0,3}:"+a+"|(:"+o+"){1,5}|:)|(?:"+o+":){1}(?:(:"+o+"){0,4}:"+a+"|(:"+o+"){1,6}|:)|(?::((?::"+o+"){0,5}:"+a+"|(?::"+o+"){1,7}|:)))(%[0-9a-zA-Z]{1,})?$");function s(e){return i.test(e)}function c(e){return n.test(e)}r.isIPv4=s,r.isIPv6=c,r.isIP=function(e){return s(e)?4:c(e)?6:0}},618(e,r,t){"use strict";var a=this&&this.__spreadArrays||function(){for(var e=0,r=0,t=arguments.length;r<t;r++)e+=arguments[r].length;var a=Array(e),i=0;for(r=0;r<t;r++)for(var o=arguments[r],n=0,s=o.length;n<s;n++,i++)a[i]=o[n];return a};Object.defineProperty(r,"__esModule",{value:!0}),r.isSpecial=r.isReserved=r.isLocalhost=r.isPrivate=r.createChecker=r.isInSubnet=void 0;var i=t(609),o=t(503);function n(e){if(!i.isIPv4(e))throw new Error("not a valid IPv4 address: "+e);var r=e.split(".");return(parseInt(r[0],10)<<24)+(parseInt(r[1],10)<<16)+(parseInt(r[2],10)<<8)+parseInt(r[3],10)>>>0}function s(e){if(Array.isArray(e)){var r=e.map(function(e){return c(e)});return function(e){var t=n(e);return r.some(function(e){return e(t)})}}var t=c(e);return function(e){var r=n(e);return t(r)}}function c(e){var r=e.split("/"),t=r[0],a=r[1],i=parseInt(a,10);if(!t||!Number.isInteger(i))throw new Error("not a valid IPv4 subnet: "+e);if(i<0||i>32)throw new Error("not a valid IPv4 prefix length: "+i+" (from "+e+")");var o=n(t);return function(e){return 0===i||o>>32-i===e>>32-i}}r.isInSubnet=function(e,r){return s(r)(e)},r.createChecker=s;var u={};r.isPrivate=function(e){return"private"in u==!1&&(u.private=s(o.default.private.ipv4)),u.private(e)},r.isLocalhost=function(e){return"localhost"in u==!1&&(u.localhost=s(o.default.localhost.ipv4)),u.localhost(e)},r.isReserved=function(e){return"reserved"in u==!1&&(u.reserved=s(o.default.reserved.ipv4)),u.reserved(e)},r.isSpecial=function(e){return"special"in u==!1&&(u.special=s(a(o.default.private.ipv4,o.default.localhost.ipv4,o.default.reserved.ipv4))),u.special(e)}},723(e,r,t){"use strict";t.r(r),t.d(r,{displayIP:()=>g,inRange:()=>l,isIP:()=>s,isRange:()=>d,isV4:()=>u,isV6:()=>p,searchIP:()=>m,storeIP:()=>m,version:()=>c});var a="undefined"!=typeof globalThis?globalThis:"undefined"!=typeof window?window:void 0!==t.g?t.g:"undefined"!=typeof self?self:{};function i(e,r){return e(r={exports:{}},r.exports),r.exports}var o=i(function(e){(function(){var r,t,a,i,o,n,s,c;t={},null!==e&&e.exports?e.exports=t:this.ipaddr=t,s=function(e,r,t,a){var i,o;if(e.length!==r.length)throw new Error("ipaddr: cannot match CIDR for objects with different lengths");for(i=0;a>0;){if((o=t-a)<0&&(o=0),e[i]>>o!==r[i]>>o)return!1;a-=t,i+=1}return!0},t.subnetMatch=function(e,r,t){var a,i,o,n,s;for(o in null==t&&(t="unicast"),r)for(!(n=r[o])[0]||n[0]instanceof Array||(n=[n]),a=0,i=n.length;a<i;a++)if(s=n[a],e.kind()===s[0].kind()&&e.match.apply(e,s))return o;return t},t.IPv4=function(){function e(e){var r,t,a;if(4!==e.length)throw new Error("ipaddr: ipv4 octet count should be 4");for(r=0,t=e.length;r<t;r++)if(!(0<=(a=e[r])&&a<=255))throw new Error("ipaddr: ipv4 octet should fit in 8 bits");this.octets=e}return e.prototype.kind=function(){return"ipv4"},e.prototype.toString=function(){return this.octets.join(".")},e.prototype.toNormalizedString=function(){return this.toString()},e.prototype.toByteArray=function(){return this.octets.slice(0)},e.prototype.match=function(e,r){var t;if(void 0===r&&(e=(t=e)[0],r=t[1]),"ipv4"!==e.kind())throw new Error("ipaddr: cannot match ipv4 address with non-ipv4 one");return s(this.octets,e.octets,8,r)},e.prototype.SpecialRanges={unspecified:[[new e([0,0,0,0]),8]],broadcast:[[new e([255,255,255,255]),32]],multicast:[[new e([224,0,0,0]),4]],linkLocal:[[new e([169,254,0,0]),16]],loopback:[[new e([127,0,0,0]),8]],carrierGradeNat:[[new e([100,64,0,0]),10]],private:[[new e([10,0,0,0]),8],[new e([172,16,0,0]),12],[new e([192,168,0,0]),16]],reserved:[[new e([192,0,0,0]),24],[new e([192,0,2,0]),24],[new e([192,88,99,0]),24],[new e([198,51,100,0]),24],[new e([203,0,113,0]),24],[new e([240,0,0,0]),4]]},e.prototype.range=function(){return t.subnetMatch(this,this.SpecialRanges)},e.prototype.toIPv4MappedAddress=function(){return t.IPv6.parse("::ffff:"+this.toString())},e.prototype.prefixLengthFromSubnetMask=function(){var e,r,t,a,i,o,n;for(n={0:8,128:7,192:6,224:5,240:4,248:3,252:2,254:1,255:0},e=0,i=!1,r=t=3;t>=0;r=t+=-1){if(!((a=this.octets[r])in n))return null;if(o=n[a],i&&0!==o)return null;8!==o&&(i=!0),e+=o}return 32-e},e}(),a="(0?\\d+|0x[a-f0-9]+)",i={fourOctet:new RegExp("^"+a+"\\."+a+"\\."+a+"\\."+a+"$","i"),longValue:new RegExp("^"+a+"$","i")},t.IPv4.parser=function(e){var r,t,a,o,n;if(t=function(e){return"0"===e[0]&&"x"!==e[1]?parseInt(e,8):parseInt(e)},r=e.match(i.fourOctet))return function(){var e,i,o,n;for(n=[],e=0,i=(o=r.slice(1,6)).length;e<i;e++)a=o[e],n.push(t(a));return n}();if(r=e.match(i.longValue)){if((n=t(r[1]))>4294967295||n<0)throw new Error("ipaddr: address outside defined range");return function(){var e,r;for(r=[],o=e=0;e<=24;o=e+=8)r.push(n>>o&255);return r}().reverse()}return null},t.IPv6=function(){function e(e,r){var t,a,i,o,n,s;if(16===e.length)for(this.parts=[],t=a=0;a<=14;t=a+=2)this.parts.push(e[t]<<8|e[t+1]);else{if(8!==e.length)throw new Error("ipaddr: ipv6 part count should be 8 or 16");this.parts=e}for(i=0,o=(s=this.parts).length;i<o;i++)if(!(0<=(n=s[i])&&n<=65535))throw new Error("ipaddr: ipv6 part should fit in 16 bits");r&&(this.zoneId=r)}return e.prototype.kind=function(){return"ipv6"},e.prototype.toString=function(){return this.toNormalizedString().replace(/((^|:)(0(:|$))+)/,"::")},e.prototype.toRFC5952String=function(){var e,r,t,a,i;for(a=/((^|:)(0(:|$)){2,})/g,i=this.toNormalizedString(),e=0,r=-1;t=a.exec(i);)t[0].length>r&&(e=t.index,r=t[0].length);return r<0?i:i.substring(0,e)+"::"+i.substring(e+r)},e.prototype.toByteArray=function(){var e,r,t,a,i;for(e=[],r=0,t=(i=this.parts).length;r<t;r++)a=i[r],e.push(a>>8),e.push(255&a);return e},e.prototype.toNormalizedString=function(){var e,r,t;return e=function(){var e,t,a,i;for(i=[],e=0,t=(a=this.parts).length;e<t;e++)r=a[e],i.push(r.toString(16));return i}.call(this).join(":"),t="",this.zoneId&&(t="%"+this.zoneId),e+t},e.prototype.toFixedLengthString=function(){var e,r,t;return e=function(){var e,t,a,i;for(i=[],e=0,t=(a=this.parts).length;e<t;e++)r=a[e],i.push(r.toString(16).padStart(4,"0"));return i}.call(this).join(":"),t="",this.zoneId&&(t="%"+this.zoneId),e+t},e.prototype.match=function(e,r){var t;if(void 0===r&&(e=(t=e)[0],r=t[1]),"ipv6"!==e.kind())throw new Error("ipaddr: cannot match ipv6 address with non-ipv6 one");return s(this.parts,e.parts,16,r)},e.prototype.SpecialRanges={unspecified:[new e([0,0,0,0,0,0,0,0]),128],linkLocal:[new e([65152,0,0,0,0,0,0,0]),10],multicast:[new e([65280,0,0,0,0,0,0,0]),8],loopback:[new e([0,0,0,0,0,0,0,1]),128],uniqueLocal:[new e([64512,0,0,0,0,0,0,0]),7],ipv4Mapped:[new e([0,0,0,0,0,65535,0,0]),96],rfc6145:[new e([0,0,0,0,65535,0,0,0]),96],rfc6052:[new e([100,65435,0,0,0,0,0,0]),96],"6to4":[new e([8194,0,0,0,0,0,0,0]),16],teredo:[new e([8193,0,0,0,0,0,0,0]),32],reserved:[[new e([8193,3512,0,0,0,0,0,0]),32]]},e.prototype.range=function(){return t.subnetMatch(this,this.SpecialRanges)},e.prototype.isIPv4MappedAddress=function(){return"ipv4Mapped"===this.range()},e.prototype.toIPv4Address=function(){var e,r,a;if(!this.isIPv4MappedAddress())throw new Error("ipaddr: trying to convert a generic ipv6 address to ipv4");return e=(a=this.parts.slice(-2))[0],r=a[1],new t.IPv4([e>>8,255&e,r>>8,255&r])},e.prototype.prefixLengthFromSubnetMask=function(){var e,r,t,a,i,o,n;for(n={0:16,32768:15,49152:14,57344:13,61440:12,63488:11,64512:10,65024:9,65280:8,65408:7,65472:6,65504:5,65520:4,65528:3,65532:2,65534:1,65535:0},e=0,i=!1,r=t=7;t>=0;r=t+=-1){if(!((a=this.parts[r])in n))return null;if(o=n[a],i&&0!==o)return null;16!==o&&(i=!0),e+=o}return 128-e},e}(),o="(?:[0-9a-f]+::?)+",c="%[0-9a-z]{1,}",n={zoneIndex:new RegExp(c,"i"),native:new RegExp("^(::)?("+o+")?([0-9a-f]+)?(::)?("+c+")?$","i"),transitional:new RegExp("^((?:"+o+")|(?:::)(?:"+o+")?)"+a+"\\."+a+"\\."+a+"\\."+a+"("+c+")?$","i")},r=function(e,r){var t,a,i,o,s,c;if(e.indexOf("::")!==e.lastIndexOf("::"))return null;for((c=(e.match(n.zoneIndex)||[])[0])&&(c=c.substring(1),e=e.replace(/%.+$/,"")),t=0,a=-1;(a=e.indexOf(":",a+1))>=0;)t++;if("::"===e.substr(0,2)&&t--,"::"===e.substr(-2,2)&&t--,t>r)return null;for(s=r-t,o=":";s--;)o+="0:";return":"===(e=e.replace("::",o))[0]&&(e=e.slice(1)),":"===e[e.length-1]&&(e=e.slice(0,-1)),{parts:r=function(){var r,t,a,o;for(o=[],r=0,t=(a=e.split(":")).length;r<t;r++)i=a[r],o.push(parseInt(i,16));return o}(),zoneId:c}},t.IPv6.parser=function(e){var t,a,i,o,s,c,u;if(n.native.test(e))return r(e,8);if((o=e.match(n.transitional))&&(u=o[6]||"",(t=r(o[1].slice(0,-1)+u,6)).parts)){for(a=0,i=(c=[parseInt(o[2]),parseInt(o[3]),parseInt(o[4]),parseInt(o[5])]).length;a<i;a++)if(!(0<=(s=c[a])&&s<=255))return null;return t.parts.push(c[0]<<8|c[1]),t.parts.push(c[2]<<8|c[3]),{parts:t.parts,zoneId:t.zoneId}}return null},t.IPv4.isIPv4=t.IPv6.isIPv6=function(e){return null!==this.parser(e)},t.IPv4.isValid=function(e){try{return new this(this.parser(e)),!0}catch(e){return!1}},t.IPv4.isValidFourPartDecimal=function(e){return!(!t.IPv4.isValid(e)||!e.match(/^(0|[1-9]\d*)(\.(0|[1-9]\d*)){3}$/))},t.IPv6.isValid=function(e){var r;if("string"==typeof e&&-1===e.indexOf(":"))return!1;try{return new this((r=this.parser(e)).parts,r.zoneId),!0}catch(e){return!1}},t.IPv4.parse=function(e){var r;if(null===(r=this.parser(e)))throw new Error("ipaddr: string is not formatted like ip address");return new this(r)},t.IPv6.parse=function(e){var r;if(null===(r=this.parser(e)).parts)throw new Error("ipaddr: string is not formatted like ip address");return new this(r.parts,r.zoneId)},t.IPv4.parseCIDR=function(e){var r,t,a;if((t=e.match(/^(.+)\/(\d+)$/))&&(r=parseInt(t[2]))>=0&&r<=32)return a=[this.parse(t[1]),r],Object.defineProperty(a,"toString",{value:function(){return this.join("/")}}),a;throw new Error("ipaddr: string is not formatted like an IPv4 CIDR range")},t.IPv4.subnetMaskFromPrefixLength=function(e){var r,t,a;if((e=parseInt(e))<0||e>32)throw new Error("ipaddr: invalid IPv4 prefix length");for(a=[0,0,0,0],t=0,r=Math.floor(e/8);t<r;)a[t]=255,t++;return r<4&&(a[r]=Math.pow(2,e%8)-1<<8-e%8),new this(a)},t.IPv4.broadcastAddressFromCIDR=function(e){var r,t,a,i,o;try{for(a=(r=this.parseCIDR(e))[0].toByteArray(),o=this.subnetMaskFromPrefixLength(r[1]).toByteArray(),i=[],t=0;t<4;)i.push(parseInt(a[t],10)|255^parseInt(o[t],10)),t++;return new this(i)}catch(e){throw new Error("ipaddr: the address does not have IPv4 CIDR format")}},t.IPv4.networkAddressFromCIDR=function(e){var r,t,a,i,o;try{for(a=(r=this.parseCIDR(e))[0].toByteArray(),o=this.subnetMaskFromPrefixLength(r[1]).toByteArray(),i=[],t=0;t<4;)i.push(parseInt(a[t],10)&parseInt(o[t],10)),t++;return new this(i)}catch(e){throw new Error("ipaddr: the address does not have IPv4 CIDR format")}},t.IPv6.parseCIDR=function(e){var r,t,a;if((t=e.match(/^(.+)\/(\d+)$/))&&(r=parseInt(t[2]))>=0&&r<=128)return a=[this.parse(t[1]),r],Object.defineProperty(a,"toString",{value:function(){return this.join("/")}}),a;throw new Error("ipaddr: string is not formatted like an IPv6 CIDR range")},t.isValid=function(e){return t.IPv6.isValid(e)||t.IPv4.isValid(e)},t.parse=function(e){if(t.IPv6.isValid(e))return t.IPv6.parse(e);if(t.IPv4.isValid(e))return t.IPv4.parse(e);throw new Error("ipaddr: the address has neither IPv6 nor IPv4 format")},t.parseCIDR=function(e){try{return t.IPv6.parseCIDR(e)}catch(r){try{return t.IPv4.parseCIDR(e)}catch(e){throw new Error("ipaddr: the address has neither IPv6 nor IPv4 CIDR format")}}},t.fromByteArray=function(e){var r;if(4===(r=e.length))return new t.IPv4(e);if(16===r)return new t.IPv6(e);throw new Error("ipaddr: the binary input is neither an IPv6 nor IPv4 address")},t.process=function(e){var r;return"ipv6"===(r=this.parse(e)).kind()&&r.isIPv4MappedAddress()?r.toIPv4Address():r}}).call(a)}),n=i(function(e,r){const t=function(e){if(!i(e))throw new Error("Invalid address: "+e);const r=(e=e.toLowerCase()).split(/\:\:/g);if(r.length>2)throw new Error("Invalid address: "+e);let t=[];if(1==r.length){if(t=e.split(/\:/g),8!==t.length)throw new Error("Invalid address: "+e)}else if(2==r.length){const e=r[0],a=r[1],i=e.split(/\:/g),o=a.split(/\:/g);for(let e in i)t[e]=i[e];for(let e=o.length;e>0;--e)t[7-(o.length-e)]=o[e-1]}for(let e=0;e<8;++e)void 0===t[e]&&(t[e]="0000"),t[e]=o(t[e],"0",4);return t.join(":")},a=function(e){if(!i(e))throw new Error("Invalid address: "+e);const r=(e=(e=(e=(e=(e=(e=t(e)).replace(/0000/g,"g")).replace(/\:000/g,":")).replace(/\:00/g,":")).replace(/\:0/g,":")).replace(/g/g,"0")).split(/\:/g);let a=!1,o=-1,n=0,s=-1,c=0;for(let e=0;e<8;++e){const t=r[e];let i="0"===t;i&&!a&&(s=e),!i&&a&&(c=e-s),c>1&&c>n&&(o=s,n=c),a="0"===t}return a&&(c=8-s),c>1&&c>n&&(o=s,n=c),o>=0&&n>1&&r.splice(o,n,"g"),e=(e=(e=(e=(e=r.join(":")).replace(/\:g\:/g,"::")).replace(/\:g/g,"::")).replace(/g\:/g,"::")).replace(/g/g,"::")},i=function(e){return/^[a-f0-9\\:]+$/gi.test(e)},o=function(e,r,t){const a=r.repeat(t);return e.length<a.length&&(e=a.substring(0,a.length-e.length)+e),e},n=function(e){return parseInt(e,16).toString(2)},s=function(e){return parseInt(e,2).toString(16)},c=function(e){const r=t(e).split(":");let a="";for(const e of r)a+=o(n(e),"0",16);return a},u=function(e){const r=[];for(let t=0;t<8;++t){const a=e.substr(16*t,16),i=o(s(a),"0",4);r.push(i)}return r.join(":")},p=function(e,r,t,n,s){if(!i(e))throw new Error("Invalid address: "+e);if(n*=1,t=(t*=1)||128,(r*=1)<1||t<1||r>128||t>128||r>t)throw new Error("Invalid masks.");const p=[],d=c(e).substr(0,r),l="0".repeat(128-t),m=Math.pow(2,t-r);for(let e=0;e<m&&!(n&&e>=n);++e){const i=o(e.toString(2),"0",t-r),n=u(d+i+l);s?p.push(a(n)):p.push(n)}return p},d=function(e,r,t,o){if(!i(e))throw new Error("Invalid address: "+e);if(t=(t*=1)||128,(r*=1)<1||t<1||r>128||t>128||r>t)throw new Error("Invalid masks.");const n=c(e).substr(0,r),s="0".repeat(128-t),p=n+"0".repeat(t-r)+s,d=n+"1".repeat(t-r)+s;return o?{start:a(u(p)),end:a(u(d)),size:Math.pow(2,t-r)}:{start:u(p),end:u(d),size:Math.pow(2,t-r)}},l=function(e,r,t,o,n){if(!i(e))throw new Error("Invalid address: "+e);if(t=(t*=1)||128,o=(o*=1)||1,(r*=1)<1||t<1||r>128||t>128||r>t)throw new Error("Invalid masks.");const s=[],p=c(e).substr(0,r),d="0".repeat(128-t),l=Math.pow(2,t-r);for(let e=0;e<l&&e<o;++e){let e="";for(let a=0;a<t-r;++a)e+=Math.floor(2*Math.random());const i=u(p+e+d);n?s.push(a(i)):s.push(i)}return s},m=function(e,r){if(!i(e))throw new Error("Invalid address: "+e);if((r*=1)<1||r>128||Math.floor(r/4)!=r/4)throw new Error("Invalid masks.");return t(e).replace(/:/g,"").split("").reverse().slice(0,(128-r)/4).join(".")};r.normalize=t,r.abbreviate=a,r.divideSubnet=p,r.range=d,r.randomSubnet=l,r.ptr=m});n.normalize,n.abbreviate,n.divideSubnet,n.range,n.randomSubnet,n.ptr;function s(e){return o.isValid(e)}function c(e){try{var r=o.parse(e).kind();return"ipv4"===r?4:"ipv6"===r?6:0}catch(e){return 0}}function u(e){return 4===c(e)}function p(e){return 6===c(e)}function d(e){try{o.parseCIDR(e);return!0}catch(e){return!1}}function l(e,r){if("string"!=typeof r){if(r&&"object"==typeof r){for(var t in r)if(!0===l(e,r[t]))return!0;return!1}return!1}if(-1===r.indexOf("/"))return e=p(e)?n.normalize(e):e,s(r=p(r)?n.normalize(r):r)&&e===r;try{var a=r.split("/"),i=o.parse(e),c=o.parse(a[0]);return i.match(c,a[1])}catch(e){return!1}}function m(e){try{var r=o.parse(e),t=r.kind();return"ipv4"===t?e:"ipv6"===t?r.isIPv4MappedAddress()?r.toIPv4Address().toString():n.abbreviate(e):null}catch(e){return null}}function g(e){try{var r=o.parse(e),t=r.kind();return"ipv4"===t?e:"ipv6"===t?r.isIPv4MappedAddress()?r.toIPv4Address().toString():n.normalize(e):""}catch(e){return""}}},897(){!function(e){const r="restEndpointAvailable",t="pmw/v1/test/",a=0,i=10;e.emailSelected=!1,e.paymentMethodSelected=!1,e.isBelowRestErrorThreshold=()=>e.retrieveData(a)<=i,e.isRestEndpointAvailable=async()=>e.retrieveData(r)?e.retrieveData(r):await e.testEndpoint(),e.testEndpoint=async(a=e.root+t,i=r)=>{try{const r=await fetch(a,{method:"POST",mode:"cors",cache:"no-cache",keepalive:!0,redirect:"error"});if(!r.ok)return e.storeData(i,!1),e.console.error("Error testing the endpoint. Status: "+r.status+" | response: ",r),!1;const t=await r.json();return t.success?(e.storeData(i,!0),!0):(e.storeData(i,!1),e.console.error("Error testing the endpoint. Response JSON: "+JSON.stringify(t)),!1)}catch(r){return e.storeData(i,!1),e.console.error("Error testing the endpoint. Error: "+r),!1}},e.isPmwRestEndpointAvailable=(t=r)=>!!e.retrieveData(t),e.writeOrderIdToStorage=(r,t,a="thankyou_page")=>{let i=e.retrieveData("orderIds",!0)||[];i.push(r),e.storeData("orderIds",i,!0),"function"==typeof e.storeOrderIdOnServer&&e.storeOrderIdOnServer({orderId:r,orderKey:t,source:a})},e.isOrderIdStored=r=>{if(!pmwDataLayer.shop.order_duplication_prevention)return e.console.log("order duplication prevention is off"),!1;return(e.retrieveData("orderIds",!0)||[]).includes(r)},e.isEmail=e=>new RegExp('^(([^<>()\\[\\]\\\\.,;:\\s@"]+(\\.[^<>()\\[\\]\\\\.,;:\\s@"]+)*)|(".+"))@((\\[[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\])|(([a-zA-Z\\-0-9]+\\.)+[a-zA-Z]{2,}))$').test(e),e.removeProductFromCart=async(r,t=null)=>{try{if(!r)throw Error("Wasn't able to retrieve a productId");if(!(r=e.getIdBasedOndVariationsOutputSetting(r)))throw Error("Wasn't able to retrieve a productId");let a;a=null==t?pmwDataLayer.cart[r].quantity:t,pmwDataLayer.cart[r]||await e.getProductsFromBackend([r]);let i=e.getProductDetailsFormattedForEvent(r,a);jQuery(document).trigger("pmw:remove-from-cart",i),null==t||pmwDataLayer.cart[r].quantity===t?delete pmwDataLayer.cart[r]:pmwDataLayer.cart[r].quantity=pmwDataLayer.cart[r].quantity-a,e.storeCartData(pmwDataLayer.cart)}catch(r){e.console.error("error: ",r)}},e.getIdBasedOndVariationsOutputSetting=e=>{try{return pmwDataLayer?.shop?.variations_output?e:pmwDataLayer.products[e].is_variation?pmwDataLayer.products[e].parent_id:e}catch(e){console.error(e)}},e.prepareSelectors=(e,r)=>(pmwDataLayer?.shop?.selectors?.[r]&&(e=e.concat(pmwDataLayer.shop.selectors[r]),(e=[...new Set(e)]).indexOf("document")>=0&&e.splice(e.indexOf("document"),1),e.indexOf("body")>=0&&(e=["body"])),e.join(", ")),e.addProductToCart=async(r,t)=>{t=Number(t);try{if(!r)throw Error("Wasn't able to retrieve a productId");if(!(r=e.getIdBasedOndVariationsOutputSetting(r)))throw Error("Wasn't able to retrieve a productId");pmwDataLayer?.products[r]||await e.getProductsFromBackend([r]);let a=e.getProductDetailsFormattedForEvent(r,t);jQuery(document).trigger("pmw:add-to-cart",a),pmwDataLayer?.cart[r]?pmwDataLayer.cart[r].quantity=pmwDataLayer.cart[r].quantity+t:("cart"in pmwDataLayer||(pmwDataLayer.cart={}),pmwDataLayer.cart[r]=e.getProductDetailsFormattedForEvent(r,t)),e.storeCartData(pmwDataLayer.cart)}catch(r){console.error(r),e.getCartItemsFromBackend()}},e.initCart=()=>{e.doesWooCommerceCartExist()||0===Object.keys(e.retrieveCartData()).length?e.retrieveCartData()?e.saveCartObjectToDataLayer(e.retrieveCartData()):(e.storeCartData({}),e.getCartItemsFromBackend()):e.storeCartData({})},e.getCartItemsFromBackend=()=>{try{fetch(e.ajax_url,{method:"POST",cache:"no-cache",body:new URLSearchParams({action:"pmw_get_cart_items"}),keepalive:!0,redirect:"error"}).then(e=>{if(e.ok)return e.json();throw Error("Error getting cart items from backend")}).then(r=>{if(!r.success)throw Error("Error getting cart items from backend");r.data.cart||(r.data.cart={}),e.saveCartObjectToDataLayer(r.data.cart),e.storeCartData(r.data.cart),r.data.cart_item_keys&&(pmwDataLayer.cart_item_keys=Object.assign(pmwDataLayer.cart_item_keys||{},r.data.cart_item_keys))})}catch(e){console.error(e)}},e.getProductsFromBackend=async r=>{if(pmwDataLayer?.products&&(r=r.filter(e=>!(e in pmwDataLayer.products))),r&&0!==r.length&&pmwDataLayer.general.page_id&&Array.isArray(r)&&0!==r.length){try{let t={action:"pmw_get_product_ids",page_id:pmwDataLayer.general.page_id,page_type:pmwDataLayer.shop.page_type,product_ids:r};const a=await e.isRestEndpointAvailable(),i=a?e.root+"pmw/v1/products/":e.ajax_url,o={method:"POST",cache:"no-cache",body:a?JSON.stringify(t):new URLSearchParams(t)};a&&(o.headers={"Content-Type":"application/json"});let n=await fetch(i,o);if(!n.ok)throw new Error("Error getting products from backend. Status: "+n.status+" Status text: "+n.statusText);let s=await n.json();if(!s.success)throw new Error("Error getting products from backend: "+s.data);pmwDataLayer.products=Object.assign({},pmwDataLayer.products,s.data)}catch(e){console.error(e)}return!0}},e.saveCartObjectToDataLayer=e=>{pmwDataLayer.cart=e,pmwDataLayer.products=Object.assign({},pmwDataLayer.products,e)},e.triggerViewItemEventPrep=async r=>{pmwDataLayer?.products[r]||await e.getProductsFromBackend([r]),pmwDataLayer?.products[r]?e.triggerViewItemEvent(r):(e.triggerViewItemEventNoProduct(),e.console.log(`Product with ID ${r} not found in the data layer and couldn't be retrieved from the backend. Triggering view-item event without product data.`))},e.triggerViewItemEvent=r=>{let t=e.getProductDetailsFormattedForEvent(r);t&&jQuery(document).trigger("pmw:view-item",t)},e.triggerViewItemEventNoProduct=()=>{jQuery(document).trigger("pmw:view-item")},e.fireCheckoutOption=(e,r=null,t=null)=>{let a={step:e,checkout_option:r,value:t};jQuery(document).trigger("pmw:checkout-option",a)},e.fireCheckoutProgress=e=>{let r={step:e};jQuery(document).trigger("pmw:checkout-progress",r)},e.getPostIdFromString=e=>{try{return e.match(/(post-)(\d+)/)[2]}catch(e){console.error(e)}},e.triggerViewItemList=r=>{if(!r)throw Error("Wasn't able to retrieve a productId");if(!(r=e.getIdBasedOndVariationsOutputSetting(r)))throw Error("Wasn't able to retrieve a productId");jQuery(document).trigger("pmw:view-item-list",e.getProductDataForViewItemEvent(r))},e.getProductDataForViewItemEvent=r=>{if(!r)throw Error("Wasn't able to retrieve a productId");try{if(pmwDataLayer.products[r])return e.getProductDetailsFormattedForEvent(r)}catch(e){console.error(e)}},e.getMainProductIdFromProductPage=()=>{try{return["simple","variable","grouped","composite","bundle"].indexOf(pmwDataLayer.shop.product_type)>=0&&jQuery(".pmwProductId:first").data("id")}catch(e){console.error(e)}},e.viewItemListTriggerTestMode=e=>{jQuery(e).css({position:"relative"}),jQuery(e).append('<div id="viewItemListTriggerOverlay"></div>'),jQuery(e).find("#viewItemListTriggerOverlay").css({"z-index":"10",display:"block",position:"absolute",height:"100%",top:"0",left:"0",right:"0",opacity:pmwDataLayer.shop.view_item_list_trigger.opacity,"background-color":pmwDataLayer.shop.view_item_list_trigger.background_color})},e.getSearchTermFromUrl=()=>{try{return new URLSearchParams(window.location.search).get("s")}catch(e){console.error(e)}};let o,n={};e.observerCallback=(r,t)=>{r.forEach(r=>{try{let a,i=jQuery(r.target).data("ioid");if(a=jQuery(r.target).next(".pmwProductId").length?jQuery(r.target).next(".pmwProductId").data("id"):jQuery(r.target).find(".pmwProductId").data("id"),!a)throw Error("pmwProductId element not found");r.isIntersecting?n[i]=setTimeout(()=>{e.triggerViewItemList(a),pmwDataLayer.shop.view_item_list_trigger.test_mode&&e.viewItemListTriggerTestMode(r.target),!1===pmwDataLayer.shop.view_item_list_trigger.repeat&&t.unobserve(r.target)},pmwDataLayer.shop.view_item_list_trigger.timeout):(clearTimeout(n[i]),pmwDataLayer.shop.view_item_list_trigger.test_mode&&jQuery(r.target).find("#viewItemListTriggerOverlay").remove())}catch(e){console.error(e)}})};let s=0;let c={nested:[],flat:[]};const u=e=>["product","type-product","product-item-inner",...c.nested].some(r=>jQuery(e).closest("."+r).length),p=e=>["wc-block-grid__product","product","product-small","woocommerce-LoopProduct-link",...c.flat].some(r=>jQuery(e).prev().hasClass(r)),d=()=>(c=(()=>{let e={nested:[],flat:[]};try{const r=(e,r)=>jQuery(e).parents().length===jQuery(r).parents().length,t=(e,r)=>jQuery(e).parent().is(jQuery(r).parent())?{node:jQuery(e).parent(),type:"flat"}:{node:jQuery(e).parents().has(jQuery(r).parents()).first(),type:"nested"},a=e=>jQuery(e).find(".pmwProductId").length,i=(e,r)=>e.filter(e=>r.includes(e))[0]||null,o=document.querySelectorAll(".pmwProductId");if(1===o.length)return e;for(let n=0;n<o.length-1;n++){if(!r(o[n],o[n+1])){n++;continue}let s=t(o[n],o[n+1]);if("nested"===s.type){let r=s.node.children().first().attr("class"),t=r?r.split(" "):[],a=s.node.children().first().next().attr("class");const o=i(t,a?a.split(" "):[]);e.nested.push(o)}else if("flat"===s.type){if(!s.node.children().first().attr("class"))continue;let r=s.node.children().first().attr("class").split(" ")[0];e.flat.push(r)}n=n+a(s.node)-1}return e.nested=[...new Set(e.nested)],e.flat=[...new Set(e.flat)],e}catch(r){return console.error(r),e}})(),jQuery(".pmwProductId").map(function(e,r){return u(r)?jQuery(r).parent():p(r)?jQuery(this).prev():jQuery(r).closest(".product").length?jQuery(r).closest(".product"):void 0}));e.startIntersectionObserverToWatch=()=>{try{e.urlHasParameter("vildemomode")&&(pmwDataLayer.shop.view_item_list_trigger.test_mode=!0),o=new IntersectionObserver(e.observerCallback,{root:null,threshold:pmwDataLayer.shop.view_item_list_trigger.threshold}),d().each((e,r)=>{jQuery(r[0]).data("ioid",s++),o.observe(r[0])})}catch(e){console.error(e)}},e.startProductsMutationObserverToWatch=()=>{try{let e=jQuery(".pmwProductId:eq(0)").parents().has(jQuery(".pmwProductId:eq(1)").parents()).first();e.length&&l.observe(e[0],{attributes:!0,childList:!0,characterData:!0})}catch(e){console.error(e)}};const l=new MutationObserver(e=>{e.forEach(e=>{let r=e.addedNodes;if(null!==r){jQuery(r).each((e,r)=>{(u(r)||p(r))&&m(r)&&(jQuery(r).data("ioid",s++),o.observe(r))})}})});let m=e=>!(!jQuery(e).find(".pmwProductId").length&&!jQuery(e).siblings(".pmwProductId").length);e.setCookie=(e,r="",t=null)=>{if(t){let a=new Date;a.setTime(a.getTime()+24*t*60*60*1e3);let i="expires="+a.toUTCString();document.cookie=e+"="+r+";"+i+";path=/"}else document.cookie=e+"="+r+";path=/"},e.getCookie=e=>{let r=e+"=",t=decodeURIComponent(document.cookie).split(";");for(let e=0;e<t.length;e++){let a=t[e];for(;" "==a.charAt(0);)a=a.substring(1);if(0==a.indexOf(r))return a.substring(r.length,a.length)}return""},e.getCookieThatContainsRegex=e=>{let r=document.cookie.split(";");for(let t=0;t<r.length;t++){let a=r[t].trim();if(e.test(a))return a}return!1},e.deleteCookie=r=>{e.setCookie(r,"",-1)},e.storeData=(r,t,a=!1,i=!1)=>{const o=i?r:"";let n=a?e.getPersistentData:e.getSessionData,s=a?e.setPersistentData:e.setSessionData,c=n(o);i?c=t:c[r]=t,s(c,o),a||!e.crossTabSync||e.crossTabSync.isSyncing()||e.crossTabSync.broadcastUpdate(r,t,i,o)},e.retrieveData=(r,t=!1,a=!1)=>{const i=a?r:"";let o=t?e.getPersistentData(i):e.getSessionData(i);return a?o:o[r]},e.deleteDataKey=(r,t=!1,a=!1)=>{const i=a?r:"";let o=t?e.getPersistentData:e.getSessionData,n=t?e.setPersistentData:e.setSessionData,s=o(i);if(a)try{t&&window.localStorage&&window.localStorage.removeItem(e.getPersistentDataKey(i)),!t&&window.sessionStorage&&window.sessionStorage.removeItem(e.getSessionDataKey(i))}catch(e){console.error(e)}else delete s[r],n(s,i)},e.storeCartData=r=>{e.storeData("cart",r,!1,!0)},e.retrieveCartData=()=>e.retrieveData("cart",!1,!0),e.getSessionDataKey=(e="")=>{const r="_pmw_session_data";return e?r+"_"+e:r},e.getPersistentDataKey=e=>{const r="_pmw_persistent_data";return e?r+"_"+e:r},e.getSessionData=(r="")=>{if(window.sessionStorage){let t=window.sessionStorage.getItem(e.getSessionDataKey(r));return null!==t?JSON.parse(t):{}}{let t=e.getCookie(e.getSessionDataKey(r));return""!==t?JSON.parse(t):{}}},e.setSessionData=(r,t="")=>{window.sessionStorage?window.sessionStorage.setItem(e.getSessionDataKey(t),JSON.stringify(r)):e.setCookie(e.getSessionDataKey(t),JSON.stringify(r))},e.getPersistentData=r=>{if(window.localStorage){let t=window.localStorage.getItem(e.getPersistentDataKey(r));return null!==t?JSON.parse(t):{}}{let t=e.getCookie(e.getPersistentDataKey(r));return""!==t?JSON.parse(t):{}}},e.setPersistentData=(r,t="")=>{window.localStorage?window.localStorage.setItem(e.getPersistentDataKey(t),JSON.stringify(r)):e.setCookie(e.getPersistentDataKey(t),JSON.stringify(r),400)},e.storeOrderIdOnServer=async r=>{try{let t;await e.isRestEndpointAvailable()?t=await fetch(e.root+"pmw/v1/pixels-fired/",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({order_id:r.orderId,order_key:r.orderKey,source:r.source}),keepalive:!0,cache:"no-cache",redirect:"error"}):(e.console.log("REST API not available, falling back to AJAX"),t=await fetch(e.ajax_url,{method:"POST",body:new URLSearchParams({action:"pmw_purchase_pixels_fired",order_id:r.orderId,order_key:r.orderKey,source:r.source}),keepalive:!0,redirect:"error"}));const a=await t.json();a.success?e.console.log("",a.data):e.console.error("",a.data)}catch(e){console.error(e)}},e.getProductIdByCartItemElement=r=>{const t=jQuery(r).find(".product-remove").find("a").attr("href");if(t)return e.getProductIdByCartItemKeyUrl(new URL(t));const a=jQuery(r).find("[data-product_id]").first().attr("data-product_id");return a||null},e.getProductQuantityByCartItemElement=e=>jQuery(e).find(".qty").val()||null,e.getProductIdByCartItemKeyUrl=e=>{let r,t=new URLSearchParams(e.search).get("remove_item");return r=0===pmwDataLayer.cart_item_keys[t].variation_id?pmwDataLayer.cart_item_keys[t].product_id:pmwDataLayer.cart_item_keys[t].variation_id,r},e.getAddToCartLinkProductIds=()=>jQuery("a").map(function(){let e=jQuery(this).attr("href");if(e&&e.includes("?add-to-cart=")){let r=e.match(/(add-to-cart=)(\d+)/);if(r)return r[2]}}).get(),e.getProductDetailsFormattedForEvent=(e,r=1)=>{if(!pmwDataLayer.products[e])return null;let t={id:e.toString(),dyn_r_ids:pmwDataLayer.products[e].dyn_r_ids,name:pmwDataLayer.products[e].name,list_name:pmwDataLayer.shop.list_name,brand:pmwDataLayer.products[e].brand,category:pmwDataLayer.products[e].category,variant:pmwDataLayer.products[e].variant,list_position:pmwDataLayer.products[e].position,quantity:r,price:pmwDataLayer.products[e].price,currency:pmwDataLayer.shop.currency,is_variable:pmwDataLayer.products[e].is_variable,is_variation:pmwDataLayer.products[e].is_variation,parent_id:pmwDataLayer.products[e].parent_id};return t.is_variation&&(t.parent_id_dyn_r_ids=pmwDataLayer.products[e].parent_id_dyn_r_ids),t},e.getClidFromBrowser=(r="gclid")=>{let t;if(t={gclid:"_gcl_aw",dclid:"_gcl_dc"},e.getCookie(t[r])){return e.getCookie(t[r]).match(/(GCL.[\d]*.)(.*)/)[2]}return""},e.getUserAgent=()=>navigator.userAgent,e.getViewPort=()=>({width:Math.max(document.documentElement.clientWidth||0,window.innerWidth||0),height:Math.max(document.documentElement.clientHeight||0,window.innerHeight||0)}),e.consoleLogVersion=()=>{console.log(pmwDataLayer.version)};const g=new Set;e.loadScriptAndCacheIt=(r,t)=>{if(g.has(r))return e.console.log("Script already loaded: "+r),Promise.resolve();const a=r=>new Promise((t,a)=>{if(document.querySelector(`script[src="${r}"]`))return g.add(r),e.console.log("Script tag already exists: "+r),void t();const i=document.createElement("script");i.src=r,i.async=!0,i.crossOrigin="anonymous",i.onload=()=>{g.add(r),e.console.log("Successfully loaded script: "+r),t()},i.onerror=()=>{i.remove(),a(new Error("Script failed to load: "+r))},document.head.appendChild(i)});return a(r).catch(()=>{if(t)return e.console.log("Primary script failed, loading fallback: "+t),a(t);throw new Error("Primary script failed to load, and no fallback URL provided.")}).catch(e=>{if(e.message.includes("fallback"))throw e;throw new Error("Both primary and fallback scripts failed to load.")})},e.getOrderItemPrice=e=>(e.total+e.total_tax)/e.quantity,e.hasLoginEventFired=()=>{let r=e.getSessionData();return r?.loginEventFired},e.setLoginEventFired=()=>{let r=e.getSessionData();r.loginEventFired=!0,e.setSessionData(r)},e.hasAccountCreatedEventFired=()=>{let r=e.getSessionData();return r?.accountCreatedEventFired},e.setAccountCreatedEventFired=()=>{let r=e.getSessionData();r.accountCreatedEventFired=!0,e.setSessionData(r)},e.pageLoaded=async()=>new Promise(e=>{!function r(){if("complete"===document.readyState)return e();setTimeout(r,50)}()}),e.pageReady=()=>new Promise(e=>{!function r(){if("interactive"===document.readyState||"complete"===document.readyState)return e();setTimeout(r,50)}()}),e.isMiniCartActive=()=>(window.sessionStorage&&Object.keys(window.sessionStorage).forEach(e=>{if(e.includes("wc_fragments"))return!0}),!1),e.doesWooCommerceCartExist=()=>document.cookie.includes("woocommerce_items_in_cart"),e.urlHasParameter=e=>new URLSearchParams(window.location.search).has(e),e.getUrlParameter=e=>new URLSearchParams(window.location.search).get(e),e.hashAsync=(e,r)=>crypto.subtle.digest(e,new TextEncoder("utf-8").encode(r)).then(e=>Array.prototype.map.call(new Uint8Array(e),e=>("00"+e.toString(16)).slice(-2)).join("")),e.getCartValue=()=>{let e=0;if(pmwDataLayer?.cart)for(const r in pmwDataLayer.cart){let t=pmwDataLayer.cart[r];e+=t.quantity*t.price}return e},e.doesUrlContainPatterns=e=>{for(const r of e)if(new RegExp(r).test(window.location.href))return!0;return!1},e.excludeDomainFromTracking=()=>{let e=["appspot.com","translate.google.com"];return pmwDataLayer?.general?.exclude_domains&&(e=[...e,...pmwDataLayer.general.exclude_domains]),!!e.some(e=>window.location.href.includes(e))&&(console.debug("Pixel Manager: Aborted due to excluded domain"),!0)},e.getRandomEventId=(e=16)=>{let r="";for(;r.length<e;)r+=(Math.random()+1).toString(36).substring(2);return r.substring(0,e)},e.pmwConsoleMessage=()=>{let r="Pixel Manager for WooCommerce: ";r+=pmwDataLayer.version.pro?"pro":"free",r+=" | distro: "+pmwDataLayer.version.distro,"fms"===pmwDataLayer.version.distro&&pmwDataLayer.version.pro&&(r+=" | active license: "+(pmwDataLayer.version.eligible_for_updates?"yes":"no")),r+=" | version: "+pmwDataLayer.version.number,!0===pmwDataLayer.version.show?console.log(r):e.console.log(r)},e.canLoadPremiumFeatures=()=>"fms"===pmwDataLayer.version.distro&&pmwDataLayer.version.pro&&pmwDataLayer.version.eligible_for_updates||"wcm"===pmwDataLayer.version.distro;let f=!1;e.triggerPmwDomReadyEvent=()=>{f||("complete"!==document.readyState?(jQuery(()=>{w()}),document.addEventListener("DOMContentLoaded",()=>{w()},!0)):w())};const w=()=>{f||(document.dispatchEvent(new Event("pmw:dom:ready")),f=!0)};e.getEmailFromTarget=r=>{if(r.href){let t=r.href.replace("mailto:","");if(t.indexOf("?")>-1&&(t=t.split("?")[0]),t=t.replace(/\s/g,""),t&&e.isEmail(t))return t}return""},e.sendEventPayloadToServer=r=>{"function"==typeof e.sendEventPayloadToServerPremium&&e.sendEventPayloadToServerPremium(r)},e.waitForPixelsAndTriggerPageView=async()=>e._pageViewTriggered?(e.console.log("Page view event already triggered, skipping duplicate."),Promise.resolve()):(e._pageViewTriggered=!0,new Promise(r=>{if(!pmwDataLayer?.pixels)return e.console.error("pmwDataLayer or pmwDataLayer.pixels is not defined, triggering page view event immediately."),document.dispatchEvent(new Event("pmw:page-view")),void r();let t=pmwDataLayer?.general?.server_2_server?.pageview_event_s2s?.pixels||[];if(t=t.filter(e=>pmwDataLayer.pixels[e]),0===t.length)return e.console.log("No specific pixels to wait for, triggering page view event."),document.dispatchEvent(new Event("pmw:page-view")),void r();const a=()=>{t.every(e=>!pmwDataLayer.pixels[e]||pmwDataLayer.pixels[e].loaded)?(document.dispatchEvent(new Event("pmw:page-view")),r()):setTimeout(a,100)};a()})),e.isWooCommerceActive=()=>!!pmwDataLayer.shop,e.getProductIdForSpecificPixel=(e,r)=>String(e.dyn_r_ids[pmwDataLayer.pixels[r].dynamic_remarketing.id_type]),e.isInWooCommerceSesssion=()=>{if(pmwDataLayer?.shop?.session_active)return!0;let r=new RegExp("woocommerce_cart_hash");return!!e.getCookieThatContainsRegex(r)},e.isNotInWooCommerceSesssion=()=>!e.isInWooCommerceSesssion(),e.makeFullUrl=e=>(e=e.trim(),/^(http:\/\/|https:\/\/)/.test(e)?e:"https://"+(e=e.replace(/^\/+/,""))),e.registerShowVariationEventListener=()=>{let r=null;jQuery(".single_variation_wrap").on("show_variation",(t,a)=>{try{if(!pmwDataLayer?.shop?.variations_output)return;let t=e.getIdBasedOndVariationsOutputSetting(a.variation_id);if(!t)throw Error("Wasn't able to retrieve a productId");r!==a.variation_id&&(e.triggerViewItemEventPrep(t),r=a.variation_id)}catch(e){console.error(e)}})},e.initializeCommandQueue=()=>{const r=window._pmwq=window._pmwq||[];r.forEach(function(r){if("function"==typeof r)try{r()}catch(r){e.console.error("Error executing queued command:",r)}}),r.push=function(r){if("function"==typeof r)try{r()}catch(r){e.console.error("Error executing command from queue:",r)}}}}(window.pmw=window.pmw||{},jQuery)}},o={};function n(e){var r=o[e];if(void 0!==r)return r.exports;var t=o[e]={exports:{}};return i[e].call(t.exports,t,t.exports,n),t.exports}n.m=i,r=Object.getPrototypeOf?e=>Object.getPrototypeOf(e):e=>e.__proto__,n.t=function(t,a){if(1&a&&(t=this(t)),8&a)return t;if("object"==typeof t&&t){if(4&a&&t.__esModule)return t;if(16&a&&"function"==typeof t.then)return t}var i=Object.create(null);n.r(i);var o={};e=e||[null,r({}),r([]),r(r)];for(var s=2&a&&t;("object"==typeof s||"function"==typeof s)&&!~e.indexOf(s);s=r(s))Object.getOwnPropertyNames(s).forEach(e=>o[e]=()=>t[e]);return o.default=()=>t,n.d(i,o),i},n.d=(e,r)=>{for(var t in r)n.o(r,t)&&!n.o(e,t)&&Object.defineProperty(e,t,{enumerable:!0,get:r[t]})},n.f={},n.e=e=>Promise.all(Object.keys(n.f).reduce((r,t)=>(n.f[t](e,r),r),[])),n.u=e=>({194:"wc-hooks",264:"deprecated-functions",526:"pixel-facebook",625:"consent-management",671:"pixel-google",712:"pixel-crazyegg",818:"pixel-hotjar",968:"consent-api",972:"doofinder-listener"}[e]+"."+{194:"c871cc71",264:"08bc16f9",526:"b4f040d6",625:"9d45b6cb",671:"2dcfb231",712:"badd0e8f",818:"c3ec2dc3",968:"c33d5439",972:"5dc21f92"}[e]+".chunk.min.js"),n.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),n.o=(e,r)=>Object.prototype.hasOwnProperty.call(e,r),t={},a="Pixel Manager for WooCommerce:",n.l=(e,r,i,o)=>{if(t[e])t[e].push(r);else{var s,c;if(void 0!==i)for(var u=document.getElementsByTagName("script"),p=0;p<u.length;p++){var d=u[p];if(d.getAttribute("src")==e||d.getAttribute("data-webpack")==a+i){s=d;break}}s||(c=!0,(s=document.createElement("script")).charset="utf-8",n.nc&&s.setAttribute("nonce",n.nc),s.setAttribute("data-webpack",a+i),s.src=e),t[e]=[r];var l=(r,a)=>{s.onerror=s.onload=null,clearTimeout(m);var i=t[e];if(delete t[e],s.parentNode&&s.parentNode.removeChild(s),i&&i.forEach(e=>e(a)),r)return r(a)},m=setTimeout(l.bind(null,void 0,{type:"timeout",target:s}),12e4);s.onerror=l.bind(null,s.onerror),s.onload=l.bind(null,s.onload),c&&document.head.appendChild(s)}},n.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},(()=>{var e;n.g.importScripts&&(e=n.g.location+"");var r=n.g.document;if(!e&&r&&(r.currentScript&&"SCRIPT"===r.currentScript.tagName.toUpperCase()&&(e=r.currentScript.src),!e)){var t=r.getElementsByTagName("script");if(t.length)for(var a=t.length-1;a>-1&&(!e||!/^http(s?):/.test(e));)e=t[a--].src}if(!e)throw new Error("Automatic publicPath is not supported in this browser");e=e.replace(/^blob:/,"").replace(/#.*$/,"").replace(/\?.*$/,"").replace(/\/[^\/]+$/,"/"),n.p=e})(),(()=>{var e={792:0};n.f.j=(r,t)=>{var a=n.o(e,r)?e[r]:void 0;if(0!==a)if(a)t.push(a[2]);else{var i=new Promise((t,i)=>a=e[r]=[t,i]);t.push(a[2]=i);var o=n.p+n.u(r),s=new Error;n.l(o,t=>{if(n.o(e,r)&&(0!==(a=e[r])&&(e[r]=void 0),a)){var i=t&&("load"===t.type?"missing":t.type),o=t&&t.target&&t.target.src;s.message="Loading chunk "+r+" failed.\n("+i+": "+o+")",s.name="ChunkLoadError",s.type=i,s.request=o,a[1](s)}},"chunk-"+r,r)}};var r=(r,t)=>{var a,i,[o,s,c]=t,u=0;if(o.some(r=>0!==e[r])){for(a in s)n.o(s,a)&&(n.m[a]=s[a]);if(c)c(n)}for(r&&r(t);u<o.length;u++)i=o[u],n.o(e,i)&&e[i]&&e[i][0](),e[i]=0},t=self.webpackChunkPixel_Manager_for_WooCommerce=self.webpackChunkPixel_Manager_for_WooCommerce||[];t.forEach(r.bind(null,0)),t.push=r.bind(null,t.push.bind(t))})();(async()=>{if(n(165),n(547),await pmw.jQueryExists(),await pmw.dataLayerFullyLoaded(),pmwDataLayer?.general?.chunk_base_path&&(n.p=pmwDataLayer.general.chunk_base_path),n(79),pmw.crossTabSync&&(pmw.crossTabSync.init(),window.addEventListener("beforeunload",()=>pmw.crossTabSync.cleanup())),n(208),n(550),n(341),pmw.initializeCommandQueue(),pmw.pmwConsoleMessage(),await pmw.loadConsentModule(),await pmw.consent.load(),jQuery(()=>{n(544)}),n(50),n.e(972).then(n.t.bind(n,652,23)),pmw.loadWcHooksFunctions(),pmw.excludeDomainFromTracking())return;const e=[];if(pmwDataLayer?.pixels?.google&&e.push(n.e(671).then(n.t.bind(n,62,23))),pmwDataLayer?.pixels?.facebook&&e.push(n.e(526).then(n.t.bind(n,767,23))),pmwDataLayer?.pixels?.hotjar&&e.push(n.e(818).then(n.t.bind(n,155,23))),pmwDataLayer?.pixels?.crazyegg&&e.push(n.e(712).then(n.t.bind(n,49,23))),await Promise.all(e),!1!==pmwDataLayer?.general?.modules?.load_deprecated_functions){const{loadDeprecatedFunctions:e}=await n.e(264).then(n.bind(n,483));e()}document.dispatchEvent(new Event("pmw:load-pixels")),document.dispatchEvent(new Event("pmwLoad")),await pmw.pageLoaded(),document.dispatchEvent(new Event("pmw:ready")),pmw.triggerPmwDomReadyEvent(),pmw.checkLibraryVersion()})()})(); 2 2 //# sourceMappingURL=pmw-public.p1.min.js.map -
woocommerce-google-adwords-conversion-tracking-tag/trunk/js/public/free/pmw-public.p1.min.js.map
r3451824 r3468312 1 {"version":3,"file":"pmw-public.p1.min.js","mappings":"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","sources":["webpack://Pixel-Manager-for-WooCommerce/webpack/runtime/create fake namespace object","webpack://Pixel-Manager-for-WooCommerce/webpack/runtime/load script","webpack://Pixel-Manager-for-WooCommerce/./src/js-src/public/pmw/event_listeners.js","webpack://Pixel-Manager-for-WooCommerce/./src/js-src/public/pmw/functions_loader.js","webpack://Pixel-Manager-for-WooCommerce/./src/js-src/public/pmw/console.mjs","webpack://Pixel-Manager-for-WooCommerce/../../src/ipv6.ts","webpack://Pixel-Manager-for-WooCommerce/./src/js-src/public/pmw/functions_main.js","webpack://Pixel-Manager-for-WooCommerce/./src/js-src/public/pmw/hooks.js","webpack://Pixel-Manager-for-WooCommerce/../../src/index.ts","webpack://Pixel-Manager-for-WooCommerce/./src/js-src/public/pmw/event-processor.js","webpack://Pixel-Manager-for-WooCommerce/./src/js-src/public/pmw/ip_services.js","webpack://Pixel-Manager-for-WooCommerce/./src/js-src/public/pmw/geo/geo.mjs","webpack://Pixel-Manager-for-WooCommerce/../../src/ipRange.ts","webpack://Pixel-Manager-for-WooCommerce/./src/js-src/public/pmw/event_listeners_on_ready.js","webpack://Pixel-Manager-for-WooCommerce/./src/js-src/public/version.js","webpack://Pixel-Manager-for-WooCommerce/./src/js-src/public/pmw/pixel-registry.js","webpack://Pixel-Manager-for-WooCommerce/../../src/util.ts","webpack://Pixel-Manager-for-WooCommerce/../../src/ipv4.ts","webpack://Pixel-Manager-for-WooCommerce/../node_modules/ipaddr.js/lib/ipaddr.js","webpack://Pixel-Manager-for-WooCommerce/../node_modules/ip6/ip6.js","webpack://Pixel-Manager-for-WooCommerce/../src/range-check.ts","webpack://Pixel-Manager-for-WooCommerce/./src/js-src/public/pmw/functions.js","webpack://Pixel-Manager-for-WooCommerce/webpack/bootstrap","webpack://Pixel-Manager-for-WooCommerce/webpack/runtime/define property getters","webpack://Pixel-Manager-for-WooCommerce/webpack/runtime/ensure chunk","webpack://Pixel-Manager-for-WooCommerce/webpack/runtime/get javascript chunk filename","webpack://Pixel-Manager-for-WooCommerce/webpack/runtime/global","webpack://Pixel-Manager-for-WooCommerce/webpack/runtime/hasOwnProperty shorthand","webpack://Pixel-Manager-for-WooCommerce/webpack/runtime/make namespace object","webpack://Pixel-Manager-for-WooCommerce/webpack/runtime/publicPath","webpack://Pixel-Manager-for-WooCommerce/webpack/runtime/jsonp chunk loading","webpack://Pixel-Manager-for-WooCommerce/./src/js-src/public/main.js"],"sourcesContent":["var getProto = Object.getPrototypeOf ? (obj) => (Object.getPrototypeOf(obj)) : (obj) => (obj.__proto__);\nvar leafPrototypes;\n// create a fake namespace object\n// mode & 1: value is a module id, require it\n// mode & 2: merge all properties of value into the ns\n// mode & 4: return value when already ns object\n// mode & 16: return value when it's Promise-like\n// mode & 8|1: behave like require\n__webpack_require__.t = function(value, mode) {\n\tif(mode & 1) value = this(value);\n\tif(mode & 8) return value;\n\tif(typeof value === 'object' && value) {\n\t\tif((mode & 4) && value.__esModule) return value;\n\t\tif((mode & 16) && typeof value.then === 'function') return value;\n\t}\n\tvar ns = Object.create(null);\n\t__webpack_require__.r(ns);\n\tvar def = {};\n\tleafPrototypes = leafPrototypes || [null, getProto({}), getProto([]), getProto(getProto)];\n\tfor(var current = mode & 2 && value; (typeof current == 'object' || typeof current == 'function') && !~leafPrototypes.indexOf(current); current = getProto(current)) {\n\t\tObject.getOwnPropertyNames(current).forEach((key) => (def[key] = () => (value[key])));\n\t}\n\tdef['default'] = () => (value);\n\t__webpack_require__.d(ns, def);\n\treturn ns;\n};","var inProgress = {};\nvar dataWebpackPrefix = \"Pixel Manager for WooCommerce:\";\n// loadScript function to load a script via script tag\n__webpack_require__.l = (url, done, key, chunkId) => {\n\tif(inProgress[url]) { inProgress[url].push(done); return; }\n\tvar script, needAttach;\n\tif(key !== undefined) {\n\t\tvar scripts = document.getElementsByTagName(\"script\");\n\t\tfor(var i = 0; i < scripts.length; i++) {\n\t\t\tvar s = scripts[i];\n\t\t\tif(s.getAttribute(\"src\") == url || s.getAttribute(\"data-webpack\") == dataWebpackPrefix + key) { script = s; break; }\n\t\t}\n\t}\n\tif(!script) {\n\t\tneedAttach = true;\n\t\tscript = document.createElement('script');\n\n\t\tscript.charset = 'utf-8';\n\t\tif (__webpack_require__.nc) {\n\t\t\tscript.setAttribute(\"nonce\", __webpack_require__.nc);\n\t\t}\n\t\tscript.setAttribute(\"data-webpack\", dataWebpackPrefix + key);\n\n\t\tscript.src = url;\n\t}\n\tinProgress[url] = [done];\n\tvar onScriptComplete = (prev, event) => {\n\t\t// avoid mem leaks in IE.\n\t\tscript.onerror = script.onload = null;\n\t\tclearTimeout(timeout);\n\t\tvar doneFns = inProgress[url];\n\t\tdelete inProgress[url];\n\t\tscript.parentNode && script.parentNode.removeChild(script);\n\t\tdoneFns && doneFns.forEach((fn) => (fn(event)));\n\t\tif(prev) return prev(event);\n\t}\n\tvar timeout = setTimeout(onScriptComplete.bind(null, undefined, { type: 'timeout', target: script }), 120000);\n\tscript.onerror = onScriptComplete.bind(null, script.onerror);\n\tscript.onload = onScriptComplete.bind(null, script.onload);\n\tneedAttach && document.head.appendChild(script);\n};","// a function that removes all \\n and \\t and html tags from a string\nconst removeHtmlTagsAndWhitespace = string => {\n\n\tstring = string.replace(/<[^>]*>?/gm, \"\").replace(/\\n/gm, \"\").replace(/\\t/gm, \"\");\n\tstring = string.trim();\n\n\treturn string;\n};\n\n/**\n * add_shipping_info event\n */\n\n// trigger when #shipping_method is changed\njQuery(\"form.woocommerce-checkout\").on(\"change\", \"#shipping_method\", (event) => {\n\n\tif (!event.target?.value) return;\n\tif (!event.target?.id) return;\n\n\ttriggerAddShippingInfoEvent({\n\t\tslug: event.target.value,\n\t\ttext: removeHtmlTagsAndWhitespace(jQuery(\"label[for='\" + event.target.id + \"']\").text()),\n\t});\n});\n\n// trigger when a shipping method is already selected on page load\njQuery(() => {\n\tif (jQuery(\"#shipping_method\").length) {\n\n\t\t// get the checked shipping method from #shipping_method\n\t\tlet checkedShippingMethod = jQuery(\"#shipping_method\").find(\":checked\");\n\n\t\t// if there is a checked shipping method\n\t\tif (checkedShippingMethod.length) {\n\n\t\t\tif (!checkedShippingMethod.val()) return;\n\t\t\tif (!checkedShippingMethod.attr(\"id\")) return;\n\n\t\t\ttriggerAddShippingInfoEvent({\n\t\t\t\tslug: checkedShippingMethod.val(),\n\t\t\t\ttext: removeHtmlTagsAndWhitespace(jQuery(\"label[for='\" + checkedShippingMethod.attr(\"id\") + \"']\").text()),\n\t\t\t});\n\t\t}\n\t}\n});\n\n// trigger when a shipping method is selected on page load\nconst triggerAddShippingInfoEvent = shippingTier => {\n\tjQuery(document).trigger(\"pmw:add-shipping-info\", {shippingTier});\n};\n\n/**\n * add_payment_info event\n */\n\n\t // flag to prevent double logging of payment method change on pageload\nlet paymentMethodChangeLogged = false;\n\n// trigger when a payment method is selected\njQuery(\"form.woocommerce-checkout\").on(\"change\", \"input[name=\\\"payment_method\\\"]\", event => {\n\n\tif (!event.target.value) return;\n\tif (!event.target.id) return;\n\n\ttriggerAddPaymentInfoEvent({\n\t\tslug: event.target.value,\n\t\ttext: removeHtmlTagsAndWhitespace(jQuery(\"label[for='\" + event.target.id + \"']\").text()),\n\t});\n\n\tpaymentMethodChangeLogged = true;\n});\n\n// trigger when a payment method is already selected on page load\njQuery(() => {\n\n\t// prevent double logging of payment method change on pageload\n\tif (paymentMethodChangeLogged) return;\n\n\tlet checkedPaymentMethod = jQuery(\"input[name=\\\"payment_method\\\"]:checked\");\n\n\tif (checkedPaymentMethod.length) {\n\n\t\tif (!checkedPaymentMethod.val()) return;\n\t\tif (!checkedPaymentMethod.attr(\"id\")) return;\n\n\t\ttriggerAddPaymentInfoEvent({\n\t\t\tslug: checkedPaymentMethod.val(),\n\t\t\ttext: removeHtmlTagsAndWhitespace(jQuery(\"label[for='\" + checkedPaymentMethod.attr(\"id\") + \"']\").text()),\n\t\t});\n\t}\n});\n\n// trigger when a payment method is selected on page load\nconst triggerAddPaymentInfoEvent = paymentType => {\n\tjQuery(document).trigger(\"pmw:add-payment-info\", {paymentType});\n};\n\n/**\n * remove_from_cart event\n *\n * Cannot be attached directly because the mini cart doesn't necessarily contain the remove button on page load.\n */\njQuery(document).on(\"click\", \".remove_from_cart_button, .remove\", (event) => {\n\n\t// console.log(\"remove_from_cart event\" + new Date().getTime())\n\n\ttry {\n\n\t\tlet url = new URL(jQuery(event.currentTarget).attr(\"href\"));\n\t\tlet productId = pmw.getProductIdByCartItemKeyUrl(url);\n\n\t\tpmw.removeProductFromCart(productId);\n\n\t} catch (e) {\n\t\tconsole.error(e);\n\t}\n});\n\n\n/**\n * begin_checkout event\n *\n * Cannot be attached directly because the mini cart doesn't necessarily contain the remove button on page load.\n */\nlet checkoutButtonClasses = [\n\t// \".checkout\", // this is too generic. It triggers on the checkout page on some themes fore each interaction with the checkout form.\n\t\".checkout-button\",\n\t\".cart-checkout-button\",\n\t\".button.checkout\",\n\t\".xoo-wsc-ft-btn-checkout\", // https://xootix.com/side-cart-for-woocommerce/\n\t\".elementor-button--checkout\",\n\t\".xt_woofc-checkout\", // https://wordpress.org/plugins/woo-floating-cart-lite/\n\t\".fkcart-checkout--text\", // https://funnelkit.com/\n];\n\nconst checkoutButtonSelectors = pmw.prepareSelectors(checkoutButtonClasses, \"beginCheckout\");\n\n// https://wordpress.stackexchange.com/a/352171/68337\njQuery(document).on(\"click init_checkout\", checkoutButtonSelectors, () => {\n\tjQuery(document).trigger(\"pmw:begin-checkout\");\n});\n\njQuery(document).on(\"updated_cart_totals\", () => {\n\tjQuery(document).trigger(\"pmw:view-cart\");\n});\n\n/**\n * Set up PWM events\n */\n\n// track checkout option event: purchase click\n// https://wordpress.stackexchange.com/a/352171/68337\njQuery(document).on(\"pmwLoad\", (event) => {\n\tjQuery(document).on(\"payment_method_selected\", () => {\n\n\t\tif (false === pmw.paymentMethodSelected) {\n\t\t\tpmw.fireCheckoutProgress(3);\n\t\t}\n\n\t\tpmw.fireCheckoutOption(3, jQuery(\"input[name='payment_method']:checked\").val());\n\t\tpmw.paymentMethodSelected = true;\n\t});\n});\n\n// populate the pmwDataLayer with the cart items\njQuery(document).on(\"pmwLoad\", () => {\n\n\ttry {\n\t\tpmw.initCart();\n\t} catch (e) {\n\t\tconsole.error(e);\n\t}\n});\n\n// get all add-to-cart= products from backend\njQuery(document).on(\"pmwLoad\", () => {\n\n\tpmwDataLayer.products = pmwDataLayer.products || {};\n\n\t// scan page for add-to-cart= links\n\tlet productIds = pmw.getAddToCartLinkProductIds();\n\n\tpmw.getProductsFromBackend(productIds);\n});\n\n/**\n * Save the referrer into a cookie\n *\n * @returns {void}\n */\njQuery(document).on(\"pmwLoad\", () => {\n\n\t// If there is no referrer, then return\n\tif (!document.referrer) {\n\t\treturn;\n\t}\n\n\t// If the referrer is already stored, then return\n\tif (pmw.retrieveData(\"referrer\")) {\n\t\treturn;\n\t}\n\n\tlet referrerUrl = new URL(document.referrer);\n\tlet referrerHostname = referrerUrl.hostname;\n\n\tif (referrerHostname !== window.location.host) {\n\t\tpmw.storeData(\"referrer\", referrerHostname);\n\t}\n});\n\n/**\n * Collect parameters from the URL\n * and save them to the PMW session storage.\n * Parameters:\n * - gclid\n * - wbraid\n * - gbraid\n * - fbclid\n * - ttclid\n * - ScCid\n * - epik\n *\n * @returns {void}\n * */\njQuery(document).on(\"pmwLoad\", () => {\n\n\tlet gclid = pmw.getUrlParameter(\"gclid\");\n\tif (gclid) pmw.storeData(\"gclid\", gclid);\n\n\tlet wbraid = pmw.getUrlParameter(\"wbraid\");\n\tif (wbraid) pmw.storeData(\"wbraid\", wbraid);\n\n\tlet gbraid = pmw.getUrlParameter(\"gbraid\");\n\tif (gbraid) pmw.storeData(\"gbraid\", gbraid);\n\n\t// https://developers.facebook.com/docs/marketing-api/conversions-api/parameters/fbp-and-fbc\n\tlet fbclid = pmw.getUrlParameter(\"fbclid\");\n\tif (fbclid) {\n\t\tfbclid = \"fb.1.\" + Math.floor(Date.now() / 1000) + \".\" + fbclid;\n\t\tpmw.storeData(\"fbclid\", fbclid);\n\t}\n\n\tlet ttclid = pmw.getUrlParameter(\"ttclid\");\n\tif (ttclid) pmw.storeData(\"ttclid\", ttclid);\n\n\tlet scid = pmw.getUrlParameter(\"ScCid\");\n\tif (scid) pmw.storeData(\"scid\", scid);\n\n\tlet epik = pmw.getUrlParameter(\"epik\");\n\tif (epik) pmw.storeData(\"epik\", epik);\n});\n\n/**\n * Create our own load event in order to better handle script flow execution when JS \"optimizers\" shuffle the code.\n */\njQuery(document).on(\"pmwLoad\", () => {\n\t// document.addEventListener(\"pmwLoad\", function () {\n\ttry {\n\t\tif (typeof pmwDataLayer != \"undefined\" && !pmwDataLayer?.pmw_loaded) {\n\n\t\t\tjQuery(document).trigger(\"pmw:load-always\");\n\n\t\t\tif (pmwDataLayer?.shop) {\n\t\t\t\tif (\n\t\t\t\t\t\"product\" === pmwDataLayer.shop.page_type &&\n\t\t\t\t\t\"variable\" !== pmwDataLayer.shop.product_type &&\n\t\t\t\t\tpmw.getMainProductIdFromProductPage()\n\t\t\t\t) {\n\t\t\t\t\tlet product = pmw.getProductDataForViewItemEvent(pmw.getMainProductIdFromProductPage());\n\t\t\t\t\tjQuery(document).trigger(\"pmw:view-item\", product);\n\t\t\t\t} else if (\n\t\t\t\t\t\"product\" === pmwDataLayer.shop.page_type &&\n\t\t\t\t\t\"variable\" === pmwDataLayer.shop.product_type &&\n\t\t\t\t\t!pmwDataLayer?.shop?.variations_output &&\n\t\t\t\t\tpmw.getMainProductIdFromProductPage()\n\t\t\t\t) {\n\t\t\t\t\t// For variable products with variations_output disabled, fire view_item with parent product data\n\t\t\t\t\tlet product = pmw.getProductDataForViewItemEvent(pmw.getMainProductIdFromProductPage());\n\t\t\t\t\tjQuery(document).trigger(\"pmw:view-item\", product);\n\t\t\t\t} else if (\"product_category\" === pmwDataLayer.shop.page_type) {\n\t\t\t\t\tjQuery(document).trigger(\"pmw:view-category\");\n\t\t\t\t} else if (\"search\" === pmwDataLayer.shop.page_type) {\n\t\t\t\t\tjQuery(document).trigger(\"pmw:search\");\n\t\t\t\t} else if (\"cart\" === pmwDataLayer.shop.page_type) {\n\t\t\t\t\tjQuery(document).trigger(\"pmw:view-cart\");\n\t\t\t\t} else if (\"order_received_page\" === pmwDataLayer.shop.page_type) {\n\t\t\t\t\tif (pmwDataLayer?.order && !pmw.isOrderIdStored(pmwDataLayer.order.id)) {\n\t\t\t\t\t\tjQuery(document).trigger(\"pmw:purchase\");\n\t\t\t\t\t\tpmw.writeOrderIdToStorage(pmwDataLayer.order.id, pmwDataLayer.order.key);\n\t\t\t\t\t\tif (typeof pmw.acrRemoveCookie === \"function\") pmw.acrRemoveCookie();\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tjQuery(document).trigger(\"pmw:everywhere-else\");\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tjQuery(document).trigger(\"pmw:everywhere-else\");\n\t\t\t}\n\n\t\t\tif (pmwDataLayer?.user?.id && !pmw.hasLoginEventFired()) {\n\t\t\t\tjQuery(document).trigger(\"pmw:login\");\n\t\t\t\tpmw.setLoginEventFired();\n\t\t\t}\n\n\t\t\tpmwDataLayer.pmw_loaded = true;\n\t\t}\n\n\t} catch (e) {\n\t\tconsole.error(e);\n\t}\n});\n\n/**\n * Register the show_variation event listener\n * in case lazy loading is enabled\n * because we have to register it immediately\n * and not after the onready event.\n */\nif (pmwDataLayer?.general?.lazy_load_pmw) {\n\tpmw.registerShowVariationEventListener();\n}\n\n/**\n * In case lazy loading is enabled\n * we need to trigger the view-item event on\n * preselected variations.\n *\n * Check if a variation is selected on a variable product page\n * and trigger the view-item event if a variation is selected\n *\n * Fallback for the jQuery(\".single_variation_wrap\").on(\"show_variation\", (event, variation) => {}) event listener\n * in case lazy loading is enabled and the event listener is not triggered.\n *\n * Only fires if variations_output is enabled, as the parent product view_item\n * is already triggered on page load when variations_output is disabled.\n */\njQuery(document).on(\"pmwLoad\", () => {\n\tif (!pmwDataLayer?.general?.lazy_load_pmw) return;\n\tif (!pmwDataLayer?.shop?.variations_output) return;\n\n\ttry {\n\t\tconst $variationForm = jQuery(\".variations_form\");\n\t\tif (!$variationForm.length) return;\n\n\t\tconst selectedValues = {};\n\t\tconst allSelected = $variationForm.find(\"select\").toArray().every(select => {\n\t\t\tconst value = jQuery(select).val();\n\t\t\tif (value) {\n\t\t\t\tselectedValues[jQuery(select).attr(\"name\")] = value;\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\treturn false;\n\t\t});\n\n\t\tif (!allSelected) return;\n\n\t\tconst productVariations = $variationForm.data(\"product_variations\");\n\t\tif (!productVariations) return;\n\n\t\tconst matchingVariation = productVariations.find(variation =>\n\t\t\tObject.entries(selectedValues).every(([key, value]) =>\n\t\t\t\tvariation.attributes[key] === value,\n\t\t\t),\n\t\t);\n\n\t\tif (matchingVariation) {\n\t\t\tpmw.triggerViewItemEventPrep(matchingVariation.variation_id);\n\t\t}\n\t} catch (e) {\n\t\tpmw.console.error(e);\n\t}\n});\n\n// Check if the REST endpoint is available and log an error if it is not\njQuery(document).on(\"pmwLoad\", async () => {\n\tif (pmw.retrieveData(\"restEndpointAvailable\") === false) pmw.console.error(\"REST endpoint is not available. Using admin-ajax.php instead.\");\n});\n\n/**\n * All s2s events\n */\n\n/**\n * PageView event\n *\n * Uses the unified event processing system with filters.\n * Each pixel's adapter handles the data transformation.\n * S2S transmission is controlled by the supportsPageViewS2S capability.\n */\njQuery(document).on(\"pmw:page-view\", async (event) => {\n\n\tpmw.console.log(\"pmw:page-view event fired\", {event});\n\n\t// Use the unified event processor\n\tconst payload = await pmw.processEvent(\"page_view\", {});\n\n\t// Only send to server if pageview S2S is enabled AND there are pixels with this capability\n\tif (pmwDataLayer?.general?.server_2_server?.pageview_event_s2s?.is_active) {\n\t\tconst pageViewS2SPixels = pmw.pixelRegistry.getPixelsWithCapability(\"supportsPageViewS2S\");\n\n\t\tif (pageViewS2SPixels.length > 0) {\n\t\t\t// Extract S2S data only for pixels that support pageview S2S\n\t\t\tconst s2sData = {event: \"page_view\"};\n\n\t\t\tfor (const pixelName of pageViewS2SPixels) {\n\t\t\t\tif (payload.pixels[pixelName]) {\n\t\t\t\t\ts2sData[pixelName] = payload.pixels[pixelName];\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (Object.keys(s2sData).length > 1) { // More than just 'event' key\n\t\t\t\tpmw.sendEventPayloadToServer(s2sData);\n\t\t\t}\n\t\t}\n\t}\n});\n\n/**\n * Add to cart event\n *\n * Uses the new unified event processing system with filters\n */\njQuery(document).on(\"pmw:add-to-cart\", async (event, product) => {\n\n\tpmw.console.log(\"pmw:add-to-cart event fired\", {event, product});\n\n\t// Use the new unified event processor\n\tawait pmw.processEvent(\"add_to_cart\", {\n\t\tproduct: product,\n\t});\n});\n\n/**\n * Remove from cart event\n * Uses the new unified event processing system with filters\n */\njQuery(document).on(\"pmw:remove-from-cart\", async (event, product) => {\n\n\tpmw.console.log(\"pmw:remove-from-cart event fired\", {event, product});\n\n\t// Use the new unified event processor\n\tawait pmw.processEvent(\"remove_from_cart\", {\n\t\tproduct: product,\n\t});\n});\n\n/**\n * Select item event\n * Uses the new unified event processing system with filters\n */\njQuery(document).on(\"pmw:select-item\", async (event, product) => {\n\n\tpmw.console.log(\"pmw:select-item event fired\", {event, product});\n\n\t// Use the new unified event processor\n\tawait pmw.processEvent(\"select_item\", {\n\t\tproduct: product,\n\t});\n});\n\n/**\n * View cart event\n */\njQuery(document).on(\"pmw:view-cart\", (event) => {\n\n\tpmw.console.log(\"pmw:view-cart event fired\", {event});\n\n\t/**\n\t * Process the event through the unified event processor\n\t */\n\tpmw.processEvent(\"view_cart\", {});\n});\n\n/**\n * Begin checkout event\n */\njQuery(document).on(\"pmw:begin-checkout\", (event) => {\n\n\tpmw.console.log(\"pmw:begin-checkout event fired\", {event});\n\n\t/**\n\t * Process the event through the unified event processor\n\t */\n\tpmw.processEvent(\"begin_checkout\", {});\n});\n\n/**\n * Add Payment Info\n */\njQuery(document).on(\"pmw:add-payment-info\", (event) => {\n\n\tpmw.console.log(\"pmw:add-payment-info event fired\", {event});\n\n\t/**\n\t * Process the event through the unified event processor\n\t */\n\tpmw.processEvent(\"add_payment_info\", {});\n});\n\n/**\n * Add to wishlist event\n *\n * Uses the unified event processing system with filters.\n * Each pixel's adapter handles the data transformation.\n */\njQuery(document).on(\"pmw:add-to-wishlist\", async (event, product) => {\n\n\tpmw.console.log(\"pmw:add-to-wishlist event fired\", {event, product});\n\n\t// Use the unified event processor\n\tawait pmw.processEvent(\"add_to_wishlist\", {\n\t\tproduct: product,\n\t});\n});\n\n/**\n * View Item event\n */\njQuery(document).on(\"pmw:view-item\", (event, product = null) => {\n\n\tpmw.console.log(\"pmw:view-item event fired\", {event, product});\n\n\t/**\n\t * Process the event through the unified event processor\n\t */\n\tpmw.processEvent(\"view_item\", {\n\t\tproduct: product,\n\t});\n});\n\n/**\n * View category event\n *\n * Uses the unified event processing system with filters.\n * Each pixel's adapter handles the data transformation.\n */\njQuery(document).on(\"pmw:view-category\", async (event, product = null) => {\n\n\tpmw.console.log(\"pmw:view-category event fired\", {event, product});\n\n\t// Use the unified event processor\n\tawait pmw.processEvent(\"view_category\", {\n\t\tproduct: product,\n\t});\n});\n\n/**\n * Search event\n */\njQuery(document).on(\"pmw:search\", (event) => {\n\n\tpmw.console.log(\"pmw:search event fired\", {event});\n\n\t/**\n\t * Process the event through the unified event processor\n\t */\n\tpmw.processEvent(\"search\", {});\n});\n\n/**\n * Place order event\n *\n * Uses the unified event processing system with filters.\n * Each pixel's adapter handles the data transformation.\n */\njQuery(document).on(\"pmw:place-order\", async (event) => {\n\n\tpmw.console.log(\"pmw:place-order event fired\", {event});\n\n\t// Use the unified event processor\n\tawait pmw.processEvent(\"place_order\", {});\n});\n\n/**\n * Purchase event\n */\njQuery(document).on(\"pmw:purchase\", async (event) => {\n\n\tpmw.console.log(\"pmw:purchase event fired\", {event});\n\n\t// Use the unified event processor\n\tawait pmw.processEvent(\"purchase\", {\n\t\torder: pmwDataLayer.order,\n\t});\n});\n\n/**\n * Login event\n *\n * Uses the unified event processing system with filters.\n * Each pixel's adapter handles the data transformation.\n */\njQuery(document).on(\"pmw:login\", async () => {\n\n\tpmw.console.log(\"pmw:login event fired\");\n\n\t// Use the unified event processor\n\tawait pmw.processEvent(\"login\", {});\n});\n\n/**\n * Run WooCommerce specific functions\n */\njQuery(document).on(\"pmw:ready\", async () => {\n\n\t// Only run if WooCommerce is active\n\tif (!pmw.isWooCommerceActive()) {\n\t\treturn;\n\t}\n\n\t/**\n\t * Run as soon as wpm namespace is loaded\n\t */\n\n\t// Watch for products visible in viewport\n\tpmw.startIntersectionObserverToWatch();\n\n\t// Watch for lazy loaded products\n\tpmw.startProductsMutationObserverToWatch();\n});\n\njQuery(document).on(\"pmw:load-pixels\", () => {\n\tpmw.waitForPixelsAndTriggerPageView();\n});\n","/**\n * Load all PMW functions\n *\n * Ignore event listeners. They need to be loaded after\n * we made sure that jQuery has been loaded.\n */\n\nrequire(\"./functions\")\n\n/**\n * Load consent management module as a chunk\n * @returns {Promise<void>}\n */\nwindow.pmw.loadConsentModule = async () => {\n\tconst consentModule = await import(/* webpackChunkName: \"consent-management\" */ \"./consent/consent.mjs\")\n\twindow.pmw.consent = consentModule\n\t\n\tconst apiModule = await import(/* webpackChunkName: \"consent-api\" */ \"./consent/api.mjs\")\n\twindow.pmw = window.pmw || {}\n\twindow.pmw.consent = window.pmw.consent || {}\n\twindow.pmw.consent.api = apiModule\n\t\n\treturn consentModule\n}\n\nwindow.pmw = window.pmw || {}\nwindow.pmw.console = require(\"./console.mjs\")\n\nrequire(\"./ip_services\")\n\n// #if process.env.TIER === 'premium'\n// if (pmw.canLoadPremiumFeatures()) {\n// \trequire(\"./functions_premium\")\n// }\n// #endif\n","/**\n * Logs a message to the console if the logger is enabled.\n *\n * @module console\n * @param message\n * @param objects\n * @public\n * @returns {void}\n */\nexport const log = (message, ...objects) => {\n\n\tif (!isLoggerEnabled()) return\n\n\tif (typeof message === \"object\") {\n\t\tconsole.log(\"Pixel Manager: \", message, ...objects)\n\t} else if (objects.length) {\n\t\tconsole.log(\"Pixel Manager: \" + message, ...objects)\n\t} else {\n\t\tconsole.log(\"Pixel Manager: \" + message)\n\t}\n}\n\n/**\n * Logs an error message to the console.\n *\n * @module console\n * @param message\n * @param objects\n * @public\n * @returns {void}\n */\nexport const error = (message, ...objects) => {\n\n\t// if (!isLoggerEnabled()) return\n\n\t// if message is an object, log the keys\n\tif (typeof message === \"object\") {\n\t\tconsole.error(\"Pixel Manager: \", message, ...objects)\n\t} else if (objects.length) {\n\t\tconsole.error(\"Pixel Manager: \" + message, ...objects)\n\t} else {\n\t\tconsole.error(\"Pixel Manager: \" + message)\n\t}\n}\n\n/**\n * Checks if the logger is enabled.\n *\n * @return {boolean}\n */\nconst isLoggerEnabled = () => {\n\n\tif (urlLoggerOff()) return false\n\n\tif (sessionLoggerEnabled()) return true\n\n\tif (urlLoggerOn()) return true\n\n\treturn !!pmwDataLayer?.general?.logger?.is_active\n}\n\n/**\n * Turn off the logger if the URL parameter is set.\n *\n * @return {boolean}\n */\nconst urlLoggerOff = () => {\n\n\tif (pmw.urlHasParameter(\"pmwloggeroff\")) {\n\t\tpmw.storeData(\"loggerEnabled\", false)\n\t}\n\n\treturn pmw.urlHasParameter(\"pmwloggeroff\")\n}\n\n/**\n * Check if the logger is enabled for the session.\n *\n * @return {boolean}\n */\nconst sessionLoggerEnabled = () => {\n\treturn pmw.retrieveData(\"loggerEnabled\")\n}\n\n/**\n * Turn on the logger if the URL parameter is set.\n *\n * @return {boolean}\n */\nconst urlLoggerOn = () => {\n\n\tif (pmw.urlHasParameter(\"pmwloggeron\")) {\n\t\tpmw.storeData(\"loggerEnabled\", true)\n\t}\n\n\treturn pmw.urlHasParameter(\"pmwloggeron\")\n}\n",null,"(function (pmw, $, undefined) {\n\n\tpmw.jQueryExists = async () => new Promise(resolve => {\n\n\t\t(function waitForjQuery() {\n\t\t\tif (typeof jQuery !== \"undefined\") return resolve()\n\t\t\tsetTimeout(waitForjQuery, 100)\n\t\t})()\n\t})\n\n\tpmw.waitForLibrary = (library, timeout = 5000, interval = 100) => {\n\n\t\tconst startTime = Date.now()\n\t\twhile (typeof window[library] === \"undefined\") {\n\t\t\t// Check if timeout in milliseconds has passed\n\t\t\tif (Date.now() - startTime > timeout) {\n\t\t\t\tbreak // Maximum wait time reached, exit the loop\n\t\t\t}\n\t\t\t// Wait for the interval in milliseconds before checking again\n\t\t\tsetTimeout(() => {\n\t\t\t}, interval)\n\t\t}\n\t}\n\n\tpmw.dataLayerFullyLoaded = async () => {\n\n\t\t// Promise that checks if the nested object pmwDataLayer.version is defined.\n\t\t// If so, resolve.\n\t\t// We must check for the nested object pmwDataLayer.version,\n\t\t// because the pmwDataLayer object can be defined early by adding products to the data layer through\n\t\t// template inline scripts. So we need to wait until the pmwDataLayer configuration objects\n\t\t// are defined.\n\t\tlet checkVar = new Promise((resolve) => {\n\t\t\t(function waitForVar() {\n\t\t\t\tif (\n\t\t\t\t\ttypeof pmwDataLayer !== \"undefined\"\n\t\t\t\t\t&& typeof pmwDataLayer.version !== \"undefined\"\n\t\t\t\t) {\n\t\t\t\t\treturn resolve()\n\t\t\t\t}\n\t\t\t\tsetTimeout(waitForVar, 100)\n\t\t\t})()\n\t\t})\n\n\t\t// Set a timeout to log a message after 6 seconds\n\t\tlet logTimeoutId = setTimeout(() => {\n\t\t\tconsole.error(\"Pixel Manager error: The pmwDataLayer is not defined. Please make sure that the pmwDataLayer script snippet is inserted and not modified by any third-party plugin, such as a consent management platform or a JavaScript optimizer.\")\n\n\t\t}, 6000)\n\n\t\tcheckVar.then(() => {\n\t\t\tclearTimeout(logTimeoutId)\n\t\t})\n\n\t\treturn checkVar\n\t}\n\n\tpmw.wpHooksExists = async () => new Promise(resolve => {\n\t\t(function waitForVar() {\n\n\t\t\t// Resolve if wp.hooks is defined\n\t\t\tif (typeof wp !== \"undefined\" && typeof wp.hooks !== \"undefined\") return resolve()\n\t\t\tsetTimeout(waitForVar, 50)\n\t\t})()\n\t})\n\n\t/**\n\t * Load all WooCommerce hooks functions\n\t *\n\t * Includes safeguard in case the user changed the default load order for wp-hooks, or removed it completely.\n\t *\n\t * @returns {Promise<void>}\n\t */\n\tpmw.loadWcHooksFunctions = async () => {\n\t\t// Load all WooCommerce Blocks hooks\n\t\tawait pmw.wpHooksExists()\n\t\tawait import(/* webpackChunkName: \"wc-hooks\" */ \"./wc_hooks\")\n\t}\n\n}(window.pmw = window.pmw || {}, jQuery))\n","/**\n * WordPress-style hooks system for Pixel Manager\n *\n * Provides a filter API that allows developers to modify event data\n * at various points in the event processing pipeline.\n *\n * Available Filters:\n *\n * 1. pmw_event_payload_pre (payload, eventName)\n * - Runs before pixel adaptation\n * - Use case: Add global tracking params, modify core data\n *\n * 2. pmw_pixel_data_{pixelName} (pixelData, eventName, eventData, context)\n * - Runs after each pixel's adapter\n * - Use case: Modify pixel-specific data (e.g., pmw_pixel_data_facebook)\n *\n * 3. pmw_event_payload_{eventName} (payload, eventData)\n * - Runs for specific event types\n * - Use case: Modify all pixels for a specific event (e.g., pmw_event_payload_add_to_cart)\n *\n * 4. pmw_event_payload_post (payload, eventName)\n * - Runs after all processing, before dispatch\n * - Use case: Final validation, logging, debugging\n *\n * 5. pmw_pixel_firing_decision (decision, pixelName, eventName, mode)\n * - Runs when determining whether to fire browser/server\n * - decision: { fire_browser: boolean, fire_server: boolean }\n * - Use case: Force server-only for specific pixels, disable certain pixels per-event\n *\n * @since 1.51.0\n */\n\n(function (pmw, $, undefined) {\n\n\t// Initialize pmw namespace if it doesn't exist\n\twindow.pmw = window.pmw || {};\n\n\t/**\n\t * Hook system for filtering event data\n\t */\n\tpmw.hooks = {\n\t\tfilters: {},\n\n\t\t/**\n\t\t * Add a filter callback\n\t\t *\n\t\t * @param {string} hookName - The filter hook name (e.g., 'pmw_event_payload')\n\t\t * @param {string} namespace - Unique identifier for your filter (e.g., 'my-plugin')\n\t\t * @param {function} callback - The filter function that modifies the value\n\t\t * @param {number} priority - Execution order, lower numbers run first (default: 10)\n\t\t *\n\t\t * @example\n\t\t * // Modify Facebook pixel data\n\t\t * pmw.hooks.addFilter('pmw_pixel_data_facebook', 'my-plugin', (data) => {\n\t\t * data.custom_param = 'my_value';\n\t\t * return data;\n\t\t * }, 10);\n\t\t *\n\t\t * @example\n\t\t * // Force server-only firing for Facebook\n\t\t * pmw.hooks.addFilter('pmw_pixel_firing_decision', 'my-plugin', (decision, pixelName) => {\n\t\t * if (pixelName === 'facebook') {\n\t\t * return { fire_browser: false, fire_server: true };\n\t\t * }\n\t\t * return decision;\n\t\t * });\n\t\t */\n\t\taddFilter: function (hookName, namespace, callback, priority = 10) {\n\t\t\tif (!hookName || typeof hookName !== \"string\") {\n\t\t\t\tpmw.console.error(\"Invalid hook name provided to addFilter\");\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (!namespace || typeof namespace !== \"string\") {\n\t\t\t\tpmw.console.error(\"Invalid namespace provided to addFilter\");\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (typeof callback !== \"function\") {\n\t\t\t\tpmw.console.error(\"Invalid callback provided to addFilter\");\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (!this.filters[hookName]) {\n\t\t\t\tthis.filters[hookName] = [];\n\t\t\t}\n\n\t\t\tthis.filters[hookName].push({\n\t\t\t\tnamespace: namespace,\n\t\t\t\tcallback : callback,\n\t\t\t\tpriority : priority,\n\t\t\t});\n\n\t\t\t// Sort by priority (ascending order)\n\t\t\tthis.filters[hookName].sort((a, b) => a.priority - b.priority);\n\n\t\t\tpmw.console.log(`Filter added: ${hookName} (${namespace}) with priority ${priority}`);\n\t\t},\n\n\t\t/**\n\t\t * Apply all registered filters to a value\n\t\t *\n\t\t * @param {string} hookName - The filter hook name\n\t\t * @param {*} value - The value to filter\n\t\t * @param {...*} args - Additional arguments passed to filter callbacks\n\t\t * @returns {*} The filtered value\n\t\t *\n\t\t * @example\n\t\t * let payload = pmw.hooks.applyFilters('pmw_event_payload_pre', payload, eventName);\n\t\t */\n\t\tapplyFilters: function (hookName, value, ...args) {\n\t\t\tif (!this.filters[hookName] || this.filters[hookName].length === 0) {\n\t\t\t\treturn value;\n\t\t\t}\n\n\t\t\tlet filteredValue = value;\n\n\t\t\tfor (const filter of this.filters[hookName]) {\n\t\t\t\ttry {\n\t\t\t\t\tconst result = filter.callback(filteredValue, ...args);\n\n\t\t\t\t\t// Ensure callback returns a value\n\t\t\t\t\tif (result !== undefined) {\n\t\t\t\t\t\tfilteredValue = result;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tpmw.console.warn(`Filter ${filter.namespace} on ${hookName} returned undefined, keeping previous value`);\n\t\t\t\t\t}\n\t\t\t\t} catch (e) {\n\t\t\t\t\tpmw.console.error(`Filter error in ${filter.namespace} on ${hookName}:`, e);\n\t\t\t\t\t// Continue with the previous value if this filter fails\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn filteredValue;\n\t\t},\n\n\t\t/**\n\t\t * Remove a specific filter\n\t\t *\n\t\t * @param {string} hookName - The filter hook name\n\t\t * @param {string} namespace - The namespace of the filter to remove\n\t\t *\n\t\t * @example\n\t\t * pmw.hooks.removeFilter('pmw_pixel_data_facebook', 'my-plugin');\n\t\t */\n\t\tremoveFilter: function (hookName, namespace) {\n\t\t\tif (!this.filters[hookName]) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst initialLength = this.filters[hookName].length;\n\t\t\tthis.filters[hookName] = this.filters[hookName].filter(f => f.namespace !== namespace);\n\n\t\t\tif (this.filters[hookName].length < initialLength) {\n\t\t\t\tpmw.console.log(`Filter removed: ${hookName} (${namespace})`);\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Remove all filters for a specific hook\n\t\t *\n\t\t * @param {string} hookName - The filter hook name\n\t\t */\n\t\tremoveAllFilters: function (hookName) {\n\t\t\tif (this.filters[hookName]) {\n\t\t\t\tdelete this.filters[hookName];\n\t\t\t\tpmw.console.log(`All filters removed for: ${hookName}`);\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Check if a specific hook has any filters\n\t\t *\n\t\t * @param {string} hookName - The filter hook name\n\t\t * @param {string} namespace - Optional: check for a specific namespace\n\t\t * @returns {boolean}\n\t\t */\n\t\thasFilter: function (hookName, namespace = null) {\n\t\t\tif (!this.filters[hookName] || this.filters[hookName].length === 0) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tif (namespace) {\n\t\t\t\treturn this.filters[hookName].some(f => f.namespace === namespace);\n\t\t\t}\n\n\t\t\treturn true;\n\t\t},\n\n\t\t/**\n\t\t * Get all registered filters for a hook\n\t\t *\n\t\t * @param {string} hookName - The filter hook name\n\t\t * @returns {Array} Array of filter objects\n\t\t */\n\t\tgetFilters: function (hookName) {\n\t\t\treturn this.filters[hookName] || [];\n\t\t},\n\t};\n\n\t// Backward compatibility: create pmw.hooks as an alias to pmw.hooks\n\tpmw.hooks = pmw.hooks;\n\n}(window.pmw = window.pmw || {}, jQuery));\n",null,"/**\n * Event Processor\n *\n * Unified event processing system that orchestrates:\n * - Building standardized event payloads\n * - Applying filters at multiple stages\n * - Adapting data for each active pixel\n * - Dispatching to browser pixels and S2S endpoints\n *\n * @since 1.51.0\n */\n\n(function (pmw, $, undefined) {\n\n\t/**\n\t * Get the current consent context\n\t *\n\t * Provides consent status in a structured format for event payloads.\n\t * This allows third-party integrations to make decisions based on\n\t * the current consent state.\n\t *\n\t * @returns {object} Consent context object\n\t */\n\tpmw.getConsentContext = function () {\n\t\tconst categories = pmw.consent?.categories?.get() || {\n\t\t\tstatistics : true,\n\t\t\tmarketing : true,\n\t\t\tpreferences: true,\n\t\t\tnecessary : true,\n\t\t};\n\n\t\treturn {\n\t\t\t// Category-level consent status\n\t\t\tcategories: {\n\t\t\t\tstatistics : categories.statistics,\n\t\t\t\tmarketing : categories.marketing,\n\t\t\t\tpreferences: categories.preferences,\n\t\t\t\tnecessary : categories.necessary,\n\t\t\t},\n\n\t\t\t// Whether the visitor has actively made a consent choice\n\t\t\tvisitor_has_chosen: pmw.consent?.settings?.get()?.visitorHasChosen ?? false,\n\n\t\t\t// Whether explicit consent mode is active\n\t\t\texplicit_mode: pmw.consent?.explicitConsentModeActive?.() ?? false,\n\t\t};\n\t};\n\n\t/**\n\t * Global event context that's added to all events\n\t *\n\t * @returns {object} Context object with user, session, page, and consent data\n\t */\n\tpmw.getEventContext = function () {\n\t\treturn {\n\t\t\ttimestamp : Math.floor(Date.now() / 1000),\n\t\t\turl : window.location.href,\n\t\t\treferrer : pmw.retrieveData(\"referrer\") ? pmw.makeFullUrl(pmw.retrieveData(\"referrer\")) : document.referrer,\n\t\t\tuser_agent: navigator.userAgent,\n\t\t\tpage_type : pmwDataLayer?.shop?.page_type,\n\t\t\tuser_id : pmwDataLayer?.user?.id?.raw || null,\n\n\t\t\t// Consent status - for third-party integrations and internal use\n\t\t\tconsent: pmw.getConsentContext(),\n\t\t};\n\t};\n\n\t/**\n\t * Process an event through the unified pipeline\n\t *\n\t * This is the main entry point for processing events with the new filter system.\n\t *\n\t * @param {string} eventName - Standardized event name (e.g., 'add_to_cart', 'view_item')\n\t * @param {object} eventData - Core event data (product, cart, order, etc.)\n\t * @returns {Promise<object>} The processed payload\n\t */\n\tpmw.processEvent = async function (eventName, eventData) {\n\n\t\tpmw.console.log(`Processing event: ${eventName}`, eventData);\n\n\t\ttry {\n\t\t\t// 1. Create base payload with standardized structure\n\t\t\tlet payload = {\n\t\t\t\tevent : eventName,\n\t\t\t\tevent_data: eventData,\n\t\t\t\tpixels : {},\n\t\t\t\tcontext : pmw.getEventContext(),\n\t\t\t};\n\n\t\t\t// 2. Apply pre-processing filter\n\t\t\t// Use case: Add global tracking params, modify core data before pixel adaptations\n\t\t\tpayload = pmw.hooks.applyFilters(\"pmw_event_payload_pre\", payload, eventName);\n\n\t\t\t// 3. Transform for each active pixel\n\t\t\tconst activePixels = pmw.pixelRegistry.getActivePixels();\n\n\t\t\tfor (const pixelName of activePixels) {\n\t\t\t\tconst adapter = pmw.pixelRegistry.getAdapter(pixelName);\n\n\t\t\t\tif (!adapter || typeof adapter.adapt !== \"function\") {\n\t\t\t\t\tpmw.console.log(`No adapter found for pixel: ${pixelName}`);\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\ttry {\n\t\t\t\t// Adapt event data to pixel-specific format (supports async adapters)\n\t\t\t\tlet pixelData = await adapter.adapt(payload.event_data, eventName, payload.context);\n\n\t\t\t\t// Adapters return null for events they don't support\n\t\t\t\t// This allows pixels to opt-out of specific events gracefully\n\t\t\t\t// (e.g., TikTok doesn't support page_view, Pinterest doesn't support add_to_wishlist)\n\t\t\t\tif (pixelData === null) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\t// Apply pixel-specific filter\n\t\t\t\t// Use case: Modify Facebook-specific data, add custom parameters per pixel\n\t\t\t\tpixelData = pmw.hooks.applyFilters(\n\t\t\t\t\t`pmw_pixel_data_${pixelName}`,\n\t\t\t\t\tpixelData,\n\t\t\t\t\teventName,\n\t\t\t\t\tpayload.event_data,\n\t\t\t\t\tpayload.context,\n\t\t\t\t);\n\n\t\t\t\tpayload.pixels[pixelName] = pixelData;\n\t\t\t} catch (e) {\n\t\t\t\tpmw.console.error(`Error adapting data for ${pixelName}:`, e);\n\t\t\t}\n\t\t\t}\n\n\t\t\t// 4. Apply event-specific filter\n\t\t\t// Use case: Modify all pixels for a specific event type (e.g., all add_to_cart events)\n\t\t\tpayload = pmw.hooks.applyFilters(\n\t\t\t\t`pmw_event_payload_${eventName}`,\n\t\t\t\tpayload,\n\t\t\t\tpayload.event_data,\n\t\t\t);\n\n\t\t\t// 5. Apply post-processing filter\n\t\t\t// Use case: Final validation, logging, debugging, cross-pixel modifications\n\t\t\tpayload = pmw.hooks.applyFilters(\"pmw_event_payload_post\", payload, eventName);\n\n\t\t\t// 6. Add firing decisions to payload for each pixel\n\t\t\tpayload.firing = {};\n\t\t\tfor (const pixelName of Object.keys(payload.pixels)) {\n\t\t\t\tpayload.firing[pixelName] = pmw.pixelRegistry.getFiringDecision(pixelName, eventName);\n\t\t\t}\n\n\t\t\t// 7. Dispatch to pixels\n\t\t\tawait pmw.dispatchToPixels(payload);\n\n\t\t\treturn payload;\n\n\t\t} catch (e) {\n\t\t\tpmw.console.error(`Error processing event ${eventName}:`, e);\n\t\t\tthrow e;\n\t\t}\n\t};\n\n\t/**\n\t * Dispatch the processed payload to pixels\n\t *\n\t * Unified dispatch system that:\n\t * 1. Dispatches a single pmw:{event} event with firing decisions per pixel\n\t * 2. Sends to server for pixels that need S2S\n\t *\n\t * @param {object} payload - The fully processed event payload with firing decisions\n\t * @returns {Promise<void>}\n\t */\n\tpmw.dispatchToPixels = async function (payload) {\n\n\t\tconst eventName = payload.event;\n\n\t\t// Dispatch unified event (replaces separate browser/s2s events)\n\t\t// Pixels check payload.firing[pixelName].fire_browser to decide if they should fire\n\t\tpmw.dispatchUnifiedEvent(payload);\n\n\t\t// Dispatch PUBLIC event for third-party integrations\n\t\t// This is the official public API - pmw:event:* events\n\t\t// Third parties should listen to these events, not the internal pmw:* events\n\t\tpmw.dispatchPublicEvent(payload);\n\n\t\t// Purchase events are handled entirely server-side and should never be sent from browser to server\n\t\t// to prevent duplicates and race conditions. However, browser-side pixels still need to fire.\n\t\tif (eventName === \"purchase\") {\n\t\t\tpmw.console.log(\"Purchase event - skipping browser-to-server transmission (handled server-side only)\");\n\t\t\treturn; // Return early, but browser pixels have already been dispatched above\n\t\t}\n\n\t\t// Only send to server if S2S is globally enabled\n\t\tif (pmwDataLayer?.general?.server_2_server?.active) {\n\t\t\t// Extract S2S data for server transmission\n\t\t\tconst s2sData = pmw.extractS2SData(payload);\n\n\t\t\t// Send to server if there's S2S data to send\n\t\t\tif (Object.keys(s2sData).length > 0) {\n\t\t\t\tconst serverPixels = pmw.pixelRegistry.getPixelsForServerFiring(eventName);\n\t\t\t\tpmw.console.log(`S2S enabled pixels for ${eventName}:`, serverPixels);\n\t\t\t\tawait pmw.sendEventPayloadToServer(s2sData);\n\t\t\t}\n\t\t}\n\t};\n\n\t/**\n\t * Dispatch unified event to all pixels\n\t *\n\t * This is the new unified event system that replaces the separate pmw:browser:* and pmw:s2s:* events.\n\t * All pixels now listen to pmw:pixel:{event-name} and check payload.firing[pixelName].fire_browser\n\t * to determine if they should fire their browser pixel.\n\t *\n\t * NOTE: This is an INTERNAL event. Third parties should use pmw:event:* events instead.\n\t *\n\t * Event namespace:\n\t * - pmw:{event} - Entry point events (triggers processEvent)\n\t * - pmw:pixel:{event} - Pixel dispatch events (pixels listen to these)\n\t * - pmw:event:{event} - Public API events (third-party integrations)\n\t *\n\t * @param {object} payload - The fully processed event payload with firing decisions\n\t */\n\tpmw.dispatchUnifiedEvent = function (payload) {\n\n\t\tconst activePixels = pmw.pixelRegistry.getActivePixels();\n\n\t\tif (activePixels.length === 0) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Convert underscores to hyphens for event name\n\t\tconst eventName = payload.event.replace(/_/g, \"-\");\n\n\t\tpmw.console.log(`Dispatching unified event pmw:pixel:${eventName}`, {\n\t\t\tactivePixels : activePixels,\n\t\t\tfiringStatus : payload.firing,\n\t\t});\n\n\t\t// Dispatch single unified event to pixel namespace\n\t\t// Pixels check payload.firing[pixelName].fire_browser to decide whether to fire\n\t\tjQuery(document).trigger(`pmw:pixel:${eventName}`, payload);\n\t};\n\n\t/**\n\t * @deprecated Use pmw.dispatchUnifiedEvent() instead\n\t * Dispatch to browser-only pixels (internal) - LEGACY SUPPORT\n\t *\n\t * NOTE: This function is deprecated. Migrate to listening to pmw:* events\n\t * and checking payload.firing[pixelName].fire_browser\n\t *\n\t * @param {object} payload - The fully processed event payload\n\t */\n\tpmw.dispatchToBrowserPixels = function (payload) {\n\n\t\tconst browserPixels = pmw.pixelRegistry.getActiveBrowserOnlyPixels();\n\n\t\tif (browserPixels.length === 0) {\n\t\t\treturn;\n\t\t}\n\n\t\tpmw.console.log(`[DEPRECATED] Dispatching to browser-only pixels for ${payload.event}:`, browserPixels);\n\n\t\t// Trigger browser-specific event that browser-only pixels can listen to (internal)\n\t\t// This allows them to access the filtered, adapted data\n\t\t// Convert underscores to hyphens for event name\n\t\tconst browserEventName = payload.event.replace(/_/g, \"-\");\n\t\tjQuery(document).trigger(`pmw:browser:${browserEventName}`, payload);\n\t};\n\n\t/**\n\t * @deprecated Use pmw.dispatchUnifiedEvent() instead\n\t * Dispatch to S2S-capable pixels (internal) - LEGACY SUPPORT\n\t *\n\t * NOTE: This function is deprecated. Migrate to listening to pmw:* events\n\t * and checking payload.firing[pixelName].fire_browser\n\t *\n\t * @param {object} payload - The fully processed event payload\n\t */\n\tpmw.dispatchToS2SPixels = function (payload) {\n\n\t\tconst s2sPixels = pmw.pixelRegistry.getActiveS2SPixels();\n\n\t\tif (s2sPixels.length === 0) {\n\t\t\treturn;\n\t\t}\n\n\t\tpmw.console.log(`[DEPRECATED] Dispatching to S2S-capable pixels for ${payload.event}:`, s2sPixels);\n\n\t\t// Trigger S2S event that S2S-capable pixels listen to (internal)\n\t\t// This provides adapted data with event_id for deduplication between browser and server\n\t\t// Convert underscores to hyphens for event name\n\t\tconst s2sEventName = payload.event.replace(/_/g, \"-\");\n\t\tjQuery(document).trigger(`pmw:s2s:${s2sEventName}`, payload);\n\t};\n\n\t/**\n\t * Dispatch public event for third-party integrations\n\t *\n\t * This is the official PUBLIC API for third-party integrations.\n\t * Third parties should listen to pmw:event:* events to receive\n\t * fully processed payloads with all data including consent status.\n\t *\n\t * Available events:\n\t * - pmw:event:add-to-cart\n\t * - pmw:event:remove-from-cart\n\t * - pmw:event:view-item\n\t * - pmw:event:view-item-list\n\t * - pmw:event:select-item\n\t * - pmw:event:begin-checkout\n\t * - pmw:event:add-payment-info\n\t * - pmw:event:add-to-wishlist\n\t * - pmw:event:purchase\n\t * - pmw:event:search\n\t * - pmw:event:page-view\n\t *\n\t * @param {object} payload - The fully processed event payload\n\t */\n\tpmw.dispatchPublicEvent = function (payload) {\n\n\t\t// Convert underscores to hyphens for event name (e.g., add_to_cart -> add-to-cart)\n\t\tconst publicEventName = payload.event.replace(/_/g, \"-\");\n\n\t\t// Dispatch the public event that third parties can listen to\n\t\t// This includes all processed data: event_data, pixels, firing, and context (with consent)\n\t\tjQuery(document).trigger(`pmw:event:${publicEventName}`, payload);\n\n\t\tpmw.console.log(`Public event dispatched: pmw:event:${publicEventName}`, payload);\n\t};\n\t/**\n\t * Extract server-to-server data from the payload\n\t *\n\t * Only pixels with fire_server=true in their firing decision should be included.\n\t * This creates a single payload with data for all server-firing pixels.\n\t *\n\t * @param {object} payload - The full event payload with firing decisions\n\t * @returns {object} S2S-only data for server transmission\n\t */\n\tpmw.extractS2SData = function (payload) {\n\n\t\tconst s2sData = {\n\t\t\tevent: payload.event,\n\t\t};\n\n\t\t// Use the new firing decision system\n\t\tconst serverPixels = pmw.pixelRegistry.getPixelsForServerFiring(payload.event);\n\n\t\tfor (const pixelName of serverPixels) {\n\t\t\tif (payload.pixels[pixelName]) {\n\t\t\t\ts2sData[pixelName] = payload.pixels[pixelName];\n\t\t\t}\n\t\t}\n\n\t\t// Add product data if present (for server-side processing)\n\t\tif (payload.event_data?.product) {\n\t\t\ts2sData.product = payload.event_data.product;\n\t\t}\n\n\t\treturn s2sData;\n\t};\n\n\t/**\n\t * Check if a pixel should fire its browser pixel for a given payload\n\t *\n\t * This is a convenience method for pixels to use in their event listeners.\n\t * It checks the payload.firing[pixelName].fire_browser flag.\n\t *\n\t * @param {object} payload - The event payload with firing decisions\n\t * @param {string} pixelName - The pixel name to check\n\t * @returns {boolean} True if the browser pixel should fire\n\t *\n\t * @example\n\t * jQuery(document).on(\"pmw:add-to-cart\", (event, payload) => {\n\t * if (!pmw.shouldFireBrowserPixel(payload, 'facebook')) return;\n\t * // Fire the pixel...\n\t * });\n\t */\n\tpmw.shouldFireBrowserPixel = function (payload, pixelName) {\n\t\treturn payload.firing?.[pixelName]?.fire_browser === true;\n\t};\n\n\t/**\n\t * Check if a pixel should fire server-side for a given payload\n\t *\n\t * @param {object} payload - The event payload with firing decisions\n\t * @param {string} pixelName - The pixel name to check\n\t * @returns {boolean} True if the server-side event should fire\n\t */\n\tpmw.shouldFireServerPixel = function (payload, pixelName) {\n\t\treturn payload.firing?.[pixelName]?.fire_server === true;\n\t};\n\n\t/**\n\t * Initialize adapters namespace\n\t */\n\tif (!pmw.adapters) {\n\t\tpmw.adapters = {};\n\t}\n\n\t/**\n\t * Helper function to register an adapter with optional capabilities\n\t *\n\t * Firing Modes:\n\t * - browser_only: Fire only in browser, no server-side (default for pixels without S2S)\n\t * - server_only: Fire only server-side, suppress browser pixel completely\n\t * - both: Fire browser AND server with event_id deduplication (Facebook, TikTok default)\n\t * - browser_or_server: Fire one OR the other, never both (GA4 purchase)\n\t *\n\t * @param {string} pixelName - The pixel name\n\t * @param {object} adapter - The adapter object with an adapt() method\n\t * @param {object} [options] - Optional capabilities configuration\n\t * @param {string} [options.mode='browser_only'] - Firing mode: browser_only, server_only, both, browser_or_server\n\t * @param {boolean} [options.supportsS2S=false] - Whether pixel supports server-to-server tracking\n\t * @param {boolean} [options.supportsEventDeduplication=false] - Whether pixel supports event deduplication\n\t * @param {function} [options.isActive] - Function that returns true if pixel is active/loaded\n\t *\n\t * @example\n\t * // Browser-only pixel (Microsoft Ads)\n\t * pmw.registerAdapter('bing', BingAdapter, {\n\t * mode: 'browser_only',\n\t * isActive: () => !!pmwDataLayer?.pixels?.bing?.loaded\n\t * });\n\t *\n\t * @example\n\t * // S2S pixel with deduplication (Facebook)\n\t * pmw.registerAdapter('facebook', FacebookAdapter, {\n\t * mode: 'both',\n\t * supportsS2S: true,\n\t * supportsEventDeduplication: true,\n\t * isActive: () => !!pmwDataLayer?.pixels?.facebook?.pixel_id\n\t * });\n\t */\n\tpmw.registerAdapter = function (pixelName, adapter, options = {}) {\n\t\tif (!adapter || typeof adapter.adapt !== \"function\") {\n\t\t\tpmw.console.error(`Invalid adapter for ${pixelName}: must have an adapt() method`);\n\t\t\treturn;\n\t\t}\n\n\t\t// Store the adapter\n\t\tpmw.adapters[pixelName] = adapter;\n\n\t\t// Store pixel capabilities\n\t\tif (!pmw.pixelCapabilities) {\n\t\t\tpmw.pixelCapabilities = {};\n\t\t}\n\n\t\t// Determine default mode based on S2S support\n\t\tlet defaultMode = \"browser_only\";\n\t\tif (options.supportsS2S) {\n\t\t\tdefaultMode = \"both\";\n\t\t}\n\n\t\tpmw.pixelCapabilities[pixelName] = {\n\t\t\tmode : options.mode || defaultMode,\n\t\t\tsupportsS2S : options.supportsS2S || false,\n\t\t\tsupportsEventDeduplication: options.supportsEventDeduplication || false,\n\t\t\tisActive : options.isActive || null,\n\t\t};\n\n\t\t// pmw.console.log(`Adapter registered for: ${pixelName}`, pmw.pixelCapabilities[pixelName]);\n\t};\n\n}(window.pmw = window.pmw || {}, jQuery));","/**\n * IP functions\n */\n\n(function (pmw, $, undefined) {\n\n\tconst {isRange, isIP, isV4, isV6, version: getIpVersion} = require(\"range_check\")\n\n\t// Promise-based IP detection to prevent race conditions\n\t// Stores the ongoing detection promise so multiple callers can await the same result\n\tlet ipDetectionPromise = null\n\t let ipDetectionResolved = false\n\n\tconst ipServices = {\n\t\t\"cloudflare\": {\n\t\t\t\"any\": \"https://www.cloudflare.com/cdn-cgi/trace\",\n\t\t},\n\t\t// icanhazip seems to regularly be added to malware databases, despite being a legitimate service run by Cloudflare\n\t\t// https://blog.apnic.net/2021/06/17/how-a-small-free-ip-tool-survived/\n\t\t// https://major.io/p/a-new-future-for-icanhazip/\n\t\t// https://major.io/p/extra-icanhaz-services-going-offline/\n\t\t\"icanhazip\" : {\n\t\t\t\"4\" : \"https://ipv4.icanhazip.com\",\n\t\t\t\"6\" : \"https://ipv6.icanhazip.com\",\n\t\t\t\"any\": \"https://icanhazip.com\",\n\t\t},\n\t\t\"ipinfo\" : {\n\t\t\t\"any\": \"https://ipinfo.io/ip\",\n\t\t},\n\t\t\"myexternalip\": {\n\t\t\t\"any\": \"https://myexternalip.com/raw\",\n\t\t\t// \"6\": \"https://api-ipv6.myexternalip.com/raw\", // This can return an IPv4 address, so we can't use it\n\t\t},\n\t\t\"ipify\" : {\n\t\t\t\"4\" : \"https://api4.ipify.org\",\n\t\t\t\"6\" : \"https://api6.ipify.org\",\n\t\t\t\"any\": \"https://api64.ipify.org\", // If IPv6 is available, AND the client is configured to prefer IPv6, this will return an IPv6 address\n\t\t},\n\t\t// ident.me - Reliable service with dedicated IPv4 and IPv6 endpoints\n\t\t// https://api.ident.me/\n\t\t\"identme\" : {\n\t\t\t\"4\" : \"https://4.ident.me/\",\n\t\t\t\"6\" : \"https://6.ident.me/\",\n\t\t\t\"any\": \"https://ident.me/\",\n\t\t},\n\t\t// Can't use amazon because its CORS policy blocks requests from the browser\n\t\t// \"amazon\" : {\n\t\t// \t\"any\": \"https://checkip.amazonaws.com/\",\n\t\t// },\n\t\t// Can't use ip.sb because its CORS policy blocks requests from the browser\n\t\t// \"ip.sb\" : {\n\t\t// \t\"any\": \"https://api.ip.sb/ip\",\n\t\t// },\n\t\t// Can't use seeip because its CORS policy blocks requests from the browser\n\t\t// \"seeip\" : {\n\t\t// \t\"any\": \"https://api.seeip.org\",\n\t\t// \t\"4\": \"https://ipv4.seeip.org\",\n\t\t// \t\"6\": \"https://ipv6.seeip.org\",\n\t\t// },\n\t}\n\n\t/**\n\t * Default timeout for IP service requests in milliseconds.\n\t * If a service doesn't respond within this time, the request is aborted.\n\t */\n\tconst IP_SERVICE_TIMEOUT_MS = 3000\n\n\t/**\n\t * Timeout for IPv6 detection in milliseconds.\n\t * IPv6 detection gets a shorter timeout since we fall back to any IP if it fails.\n\t * This prevents long waits for users without IPv6 connectivity.\n\t */\n\tconst IPV6_DETECTION_TIMEOUT_MS = 2000\n\n\t/**\n\t * Fetch with timeout using AbortController.\n\t * Aborts the request if it takes longer than the specified timeout.\n\t *\n\t * @param {string} url - The URL to fetch\n\t * @param {number} timeoutMs - Timeout in milliseconds (default: IP_SERVICE_TIMEOUT_MS)\n\t * @returns {Promise<Response>} The fetch response\n\t * @throws {Error} Throws 'AbortError' if the request times out\n\t */\n\tconst fetchWithTimeout = (url, timeoutMs = IP_SERVICE_TIMEOUT_MS) => {\n\t\tconst controller = new AbortController()\n\t\tconst timeoutId = setTimeout(() => controller.abort(), timeoutMs)\n\n\t\treturn fetch(url, { signal: controller.signal })\n\t\t\t.finally(() => clearTimeout(timeoutId))\n\t}\n\n\tpmw.getGeoInfo = {\n\n\t\tcloudflare: async () => {\n\n\t\t\tconst response = await fetchWithTimeout(\"https://www.cloudflare.com/cdn-cgi/trace\")\n\n\t\t\tif (!response.ok) throw new Error(`The response from Cloudflare was not OK. Status: ${response.status}`)\n\n\t\t\tlet data = await response.text()\n\n\t\t\tif (!data) throw new Error(\"No data was returned from Cloudflare\")\n\n\t\t\t// Convert key-value pairs to JSON\n\t\t\t// https://stackoverflow.com/a/39284735/452587\n\t\t\tdata = data\n\t\t\t\t.trim()\n\t\t\t\t.split(\"\\n\")\n\t\t\t\t.reduce((obj, pair) => {\n\t\t\t\t\tpair = pair.split(\"=\")\n\t\t\t\t\treturn obj[pair[0]] = pair[1], obj\n\t\t\t\t}, {})\n\n\t\t\tif (!data.ip || !data.loc) throw new Error(\"The JSON data is missing the ip or loc key from Cloudflare\")\n\n\t\t\t/**\n\t\t\t * Cloudflare doesn't return the region.\n\t\t\t * If the website manager has set a region such as California in the restricted_regions array,\n\t\t\t * we have to validate the region. This is not possible with the data from Cloudflare.\n\t\t\t * So we have to abort the process and give the other services a chance to return the region.\n\t\t\t */\n\t\t\tif (processRegion(data.loc)) throw new Error(\"We have to validate the region, and this service is not returning the region.\")\n\n\t\t\treturn {\n\t\t\t\tip : data.ip,\n\t\t\t\tcountryCode: data.loc,\n\t\t\t\tservice : \"cloudflare\",\n\t\t\t}\n\t\t},\n\n\t\tgeojs: async () => {\n\n\t\t\tconst response = await fetchWithTimeout(\"https://get.geojs.io/v1/ip/geo.json\")\n\n\t\t\tif (!response.ok) throw new Error(`The response from geojs was not OK. Status: ${response.status}`)\n\n\t\t\tlet data = await response.json()\n\n\t\t\tif (!data) throw new Error(\"No JSON data was returned from geojs\")\n\t\t\tif (!data.ip || !data.country_code || !data.region) throw new Error(\"The JSON data is missing the ip, country_code, or region key from geojs\")\n\n\t\t\treturn {\n\t\t\t\tip : data.ip,\n\t\t\t\tcountryCode: data.country_code,\n\t\t\t\tregion : data.region,\n\t\t\t\tservice : \"geojs\",\n\t\t\t}\n\t\t},\n\n\t\tipinfo: async () => {\n\n\t\t\tconst response = await fetchWithTimeout(\"https://ipinfo.io/json\")\n\n\t\t\tif (!response.ok) throw new Error(`The response from ipinfo was not OK from ipinfo. Status: ${response.status}`)\n\n\t\t\tlet data = await response.json()\n\n\t\t\tif (!data) throw new Error(\"No JSON data was returned from ipinfo\")\n\t\t\tif (!data.ip || !data.country || !data.region) throw new Error(\"The JSON data is missing the ip, country, or region key from ipinfo\")\n\n\t\t\treturn {\n\t\t\t\tip : data.ip,\n\t\t\t\tcountryCode: data.country,\n\t\t\t\tregion : data.region,\n\t\t\t\tservice : \"ipinfo\",\n\t\t\t}\n\t\t},\n\n\t\tipapi: async () => {\n\n\t\t\tconst response = await fetchWithTimeout(\"https://ipapi.co/json\")\n\n\t\t\tif (!response.ok) throw new Error(`The response from ipapi was not OK. Status: ${response.status}`)\n\n\t\t\tlet data = await response.json()\n\n\t\t\tif (!data) throw new Error(\"No JSON data was returned from ipapi\")\n\t\t\tif (!data.ip || !data.country || !data.region) throw new Error(\"The JSON data is missing the ip, country, or region key from ipapi\")\n\n\t\t\treturn {\n\t\t\t\tip : data.ip,\n\t\t\t\tcountryCode: data.country,\n\t\t\t\tregion : data.region,\n\t\t\t\tservice : \"ipapi\",\n\t\t\t}\n\t\t},\n\t}\n\n\t/**\n\t * /**\n\t * Cloudflare doesn't return the region.\n\t * If the website manager has set a region such as California in the restricted_regions array,\n\t * we have to validate the region. This is not possible with the data from Cloudflare.\n\t * So we have to abort the process and give the other services a chance to return the region.\n\t *\n\t * If the country code is US,\n\t * and the restricted_regions array contains \"US-CA\" or \"US-VA\",\n\t * we must process the region.\n\t *\n\t * @param countryCode\n\t * @returns {boolean}\n\t */\n\tconst processRegion = (countryCode) => {\n\n\t\tif (countryCode !== \"US \") return false\n\n\t\tconst regionsToCheck = [\"US-CA\", \"US-VA\"]\n\n\t\treturn regionsToCheck.some(region =>\n\t\t\tpmwDataLayer?.general?.consent_management.restricted_regions.includes(region),\n\t\t)\n\t}\n\n\t/**\n\t * Check if the visitor is allowed to trigger server-to-server events\n\t * This checks both bot user-agent patterns and custom IP exclusion list\n\t *\n\t * @returns {Promise<boolean>} True if the visitor is allowed\n\t */\n\tpmw.isVisitorAllowed = async () => {\n\n\t\t// Check the cache if visitor is allowed\n\t\tif (pmw.retrieveData(\"visitorAllowed\") !== null && pmw.retrieveData(\"visitorAllowed\") !== undefined) {\n\t\t\treturn !!JSON.parse(pmw.retrieveData(\"visitorAllowed\"))\n\t\t}\n\n\t\t// Check if user agent is a bot\n\t\tif (pmw.isBotUserAgent()) {\n\t\t\tpmw.storeData(\"visitorAllowed\", false)\n\t\t\treturn false\n\t\t}\n\n\t\t// Check if IP is on the exclusion list (if custom exclusions are defined)\n\t\tif (Array.isArray(pmwDataLayer?.general?.server_2_server?.ip_exclude_list) \n\t\t\t&& pmwDataLayer.general.server_2_server.ip_exclude_list.length > 0) {\n\t\t\t\n\t\t\tconst ip = await pmw.getIp()\n\t\t\t\n\t\t\tif (isOnIpExclusionList(ip)) {\n\t\t\t\tpmw.storeData(\"visitorAllowed\", false)\n\t\t\t\treturn false\n\t\t\t}\n\t\t}\n\n\t\t// If not a bot and not on IP exclusion list, visitor is allowed\n\t\tpmw.storeData(\"visitorAllowed\", true)\n\t\treturn true\n\t}\n\n\t/**\n\t * Validates an IP address (IPv4 or IPv6)\n\t *\n\t * @param {string} ip - The IP address to validate\n\t * @returns {boolean} True if the IP is valid\n\t */\n\tpmw.isValidIpAddress = (ip) => {\n\t\tif (!ip || typeof ip !== \"string\") return false\n\n\t\t// Use the range_check library's isIP function for accurate validation\n\t\tif (!isIP(ip)) return false\n\n\t\t// Additional validation: ensure it's not a private/reserved IP\n\t\t// This is important for CAPI which needs public IPs\n\t\treturn !pmw.isPrivateOrReservedIp(ip)\n\t}\n\n\t/**\n\t * Check if an IP is private or reserved (not suitable for CAPI)\n\t *\n\t * @param {string} ip - The IP address to check\n\t * @returns {boolean} True if the IP is private or reserved\n\t */\n\tpmw.isPrivateOrReservedIp = (ip) => {\n\t\tif (!ip) return true\n\n\t\t// IPv4 private ranges\n\t\tconst ipv4PrivateRanges = [\n\t\t\t\"10.0.0.0/8\",\n\t\t\t\"172.16.0.0/12\",\n\t\t\t\"192.168.0.0/16\",\n\t\t\t\"127.0.0.0/8\",\n\t\t\t\"169.254.0.0/16\", // Link-local\n\t\t\t\"0.0.0.0/8\",\n\t\t]\n\n\t\t// IPv6 private/reserved ranges\n\t\tconst ipv6PrivateRanges = [\n\t\t\t\"::1/128\", // Loopback\n\t\t\t\"fc00::/7\", // Unique local\n\t\t\t\"fe80::/10\", // Link-local\n\t\t\t\"::/128\", // Unspecified\n\t\t]\n\n\t\tconst privateRanges = isV4(ip) ? ipv4PrivateRanges : ipv6PrivateRanges\n\n\t\t// Use is-in-subnet for accurate range checking\n\t\ttry {\n\t\t\tconst isInSubnet = require(\"is-in-subnet\")\n\t\t\tfor (const range of privateRanges) {\n\t\t\t\tif (isInSubnet.isInSubnet(ip, range)) {\n\t\t\t\t\treturn true\n\t\t\t\t}\n\t\t\t}\n\t\t} catch (e) {\n\t\t\t// If is-in-subnet check fails, fall back to basic checks\n\t\t\t// These cover the most common private ranges\n\t\t\tif (isV4(ip)) {\n\t\t\t\tif (ip.startsWith(\"10.\") || \n\t\t\t\t\tip.startsWith(\"192.168.\") || \n\t\t\t\t\tip.startsWith(\"127.\") ||\n\t\t\t\t\tip.startsWith(\"169.254.\") ||\n\t\t\t\t\tip.startsWith(\"0.\")) {\n\t\t\t\t\treturn true\n\t\t\t\t}\n\t\t\t\t// Check 172.16.0.0/12 range (172.16.x.x - 172.31.x.x)\n\t\t\t\tconst parts = ip.split(\".\")\n\t\t\t\tif (parts[0] === \"172\") {\n\t\t\t\t\tconst second = parseInt(parts[1], 10)\n\t\t\t\t\tif (second >= 16 && second <= 31) {\n\t\t\t\t\t\treturn true\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// IPv6 basic checks\n\t\t\t\tif (ip === \"::1\" || ip.startsWith(\"fc\") || ip.startsWith(\"fd\") || ip.startsWith(\"fe80:\")) {\n\t\t\t\t\treturn true\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn false\n\t}\n\n\t/**\n\t * Get the client IP address, with race condition prevention.\n\t * Detects IPv6 and any IP in parallel, preferring IPv6 when available.\n\t * IPv6 gets a shorter timeout (2s) to avoid long waits for IPv4-only users.\n\t *\n\t * @returns {Promise<string|null>} The client IP address or null\n\t */\n\tpmw.getClientIp = async () => {\n\t\t// If we already have a resolved IP, return it immediately\n\t\tconst cachedIp = pmw.retrieveData(\"client_ip\")\n\t\tif (cachedIp && pmw.isValidIpAddress(cachedIp)) {\n\t\t\treturn cachedIp\n\t\t}\n\n\t\t// If detection is already in progress, wait for it\n\t\tif (ipDetectionPromise && !ipDetectionResolved) {\n\t\t\treturn ipDetectionPromise\n\t\t}\n\n\t\t// Start a new detection process\n\t\tipDetectionResolved = false\n\t\tipDetectionPromise = (async () => {\n\t\t\ttry {\n\t\t\t\t// Start both IPv6 and \"any\" detection in parallel\n\t\t\t\t// IPv6 is preferred by Meta and other CAPIs\n\t\t\t\tconst ipv6Promise = pmw.getIpWithTimeout(\"6\", IPV6_DETECTION_TIMEOUT_MS)\n\t\t\t\tconst anyPromise = pmw.getIp(\"any\")\n\n\t\t\t\t// Wait for both to settle (resolve or reject)\n\t\t\t\tconst [ipv6Result, anyResult] = await Promise.allSettled([ipv6Promise, anyPromise])\n\n\t\t\t\t// Determine which IP to use (prefer IPv6, fall back to any IP)\n\t\t\t\tlet ip = null\n\n\t\t\t\t// Check IPv6 result first (preferred)\n\t\t\t\tif (ipv6Result.status === \"fulfilled\" && ipv6Result.value) {\n\t\t\t\t\tip = ipv6Result.value\n\t\t\t\t\tpmw.console.log(`Using IPv6 address: ${ip}`)\n\t\t\t\t}\n\t\t\t\t// Fall back to any IP if IPv6 failed or wasn't available\n\t\t\t\telse if (anyResult.status === \"fulfilled\" && anyResult.value) {\n\t\t\t\t\tip = anyResult.value\n\t\t\t\t\tpmw.console.log(`IPv6 not available, using IP: ${ip}`)\n\t\t\t\t}\n\n\t\t\t\t// Validate before storing\n\t\t\t\tif (ip && pmw.isValidIpAddress(ip)) {\n\t\t\t\t\tpmw.storeData(\"client_ip\", ip)\n\t\t\t\t\tipDetectionResolved = true\n\t\t\t\t\treturn ip\n\t\t\t\t}\n\n\t\t\t\tipDetectionResolved = true\n\t\t\t\treturn null\n\t\t\t} catch (error) {\n\t\t\t\tpmw.console.error(\"Error detecting client IP:\", error)\n\t\t\t\tipDetectionResolved = true\n\t\t\t\treturn null\n\t\t\t}\n\t\t})()\n\n\t\treturn ipDetectionPromise\n\t}\n\n\t/**\n\t * Get IP with a custom timeout.\n\t * Wraps getIp with a timeout that rejects if the detection takes too long.\n\t *\n\t * @param {string} ipVersion - The IP version to detect (\"4\", \"6\", or \"any\")\n\t * @param {number} timeoutMs - Maximum time to wait in milliseconds\n\t * @returns {Promise<string|null>} The detected IP or null\n\t */\n\tpmw.getIpWithTimeout = async (ipVersion, timeoutMs) => {\n\t\treturn Promise.race([\n\t\t\tpmw.getIp(ipVersion),\n\t\t\tnew Promise((_, reject) => \n\t\t\t\tsetTimeout(() => reject(new Error(`IPv${ipVersion} detection timed out after ${timeoutMs}ms`)), timeoutMs)\n\t\t\t)\n\t\t]).catch(error => {\n\t\t\tpmw.console.log(error.message)\n\t\t\treturn null\n\t\t})\n\t}\n\n\tpmw.getIp = async (ipVersion = \"any\", maxServicesToCheck = 3) => {\n\n\t\tconst validVersions = [\"any\", \"4\", \"6\"]\n\n\t\t// return null if the version is not valid and console log an error\n\t\tif (!validVersions.includes(ipVersion)) {\n\t\t\tconsole.error(\"The version argument must be one of the following: \" + validVersions.join(\", \"))\n\t\t\treturn null\n\t\t}\n\n\t\tif (ipVersion === \"any\" && pmw.retrieveData(\"ip\")) {\n\t\t\treturn pmw.retrieveData(\"ip\")\n\t\t}\n\n\t\t// Get the ipv data from the cache\n\t\tconst ipv = pmw.retrieveData(`ipv${ipVersion}`)\n\n\t\t// Return it if it is not undefined\n\t\t// The value can be an IP\n\t\t// or null if we ran the test but no IP could be retrieved\n\t\t// It is undefined if the ipVersion was not tested yet\n\t\tif (ipv !== undefined) return ipv\n\n\t\tpmw.console.log(\"Testing the IP address of the browser because one ore more server-to-server APIs are enabled and require the browser IP. It may trigger connection request errors in the console while testing the IP address. This is normal and expected behavior.\")\n\n\t\ttry {// Check the cache if the IP is already stored\n\n\t\t\tconst ip = await pmw.getIpFromAnyService(ipVersion, maxServicesToCheck)\n\n\t\t\t// Validate the IP before storing\n\t\t\tif (ip && !isIP(ip)) {\n\t\t\t\tpmw.console.warn(`Invalid IP address received: ${ip}`)\n\t\t\t\treturn null\n\t\t\t}\n\n\t\t\t// Store the IP in the cache\n\t\t\tif (ipVersion === \"any\" && ip) {\n\t\t\t\tpmw.storeData(\"ip\", ip)\n\t\t\t}\n\n\t\t\tif (\n\t\t\t\tgetIpVersion(ip) === 4\n\t\t\t\t|| (ipVersion === \"4\" && ip === null)\n\t\t\t) {\n\t\t\t\tpmw.storeData(\"ipv4\", ip)\n\t\t\t}\n\n\t\t\tif (getIpVersion(ip) === 6\n\t\t\t\t|| (ipVersion === \"6\" && ip === null)\n\t\t\t) {\n\t\t\t\tpmw.storeData(\"ipv6\", ip)\n\t\t\t}\n\n\t\t\treturn ip\n\t\t} catch (error) {\n\t\t\t// console.error(error)\n\t\t\treturn null\n\t\t}\n\t}\n\n\tpmw.getBrowserGeoFromExternalService = async () => {\n\n\t\tconst startTime = performance.now()\n\n\t\tlet promises = []\n\n\t\tObject.keys(pmw.getGeoInfo).forEach(service => {\n\t\t\tpromises.push(pmw.getGeoInfo[service]())\n\t\t})\n\n\t\ttry {\n\t\t\tconst data = await Promise.any(promises)\n\n\t\t\tdata.countryCode = data.countryCode.toUpperCase()\n\n\t\t\tif (data.region && data.region === \"California\") {\n\t\t\t\tdata.regionCode = \"US-CA\"\n\t\t\t}\n\n\t\t\tif (data.region && data.region === \"Virginia\") {\n\t\t\t\tdata.regionCode = \"US-VA\"\n\t\t\t}\n\n\t\t\tpmw.console.log(\n\t\t\t\t\"Retrieved the browser geo info from an external service: \",\n\t\t\t\tdata,\n\t\t\t\t\" which took \",\n\t\t\t\t(performance.now() - startTime).toFixed(2) + \" ms\",\n\t\t\t)\n\n\t\t\t// pmw.storeData(\"countryCode\", data.countryCode)\n\t\t\t// pmw.storeData(\"ip\", data.ip)\n\t\t\treturn data\n\t\t} catch (error) {\n\t\t\tpmw.console.error(\"error: \", error)\n\t\t\treturn null\n\t\t}\n\t}\n\n\tconst getBrowserLocationByTimeZone = () => {\n\n\t\tconst geo = require(\"./geo/geo.mjs\")\n\t\tconst geoLocation = geo.getLocationByTimeZone()\n\n\t\tif (geoLocation.countryCode) {\n\t\t\treturn geoLocation\n\t\t}\n\n\t\treturn null\n\t}\n\n\tpmw.getBrowserGeo = async () => {\n\n\t\tlet geoFromStorage = {}\n\n\t\tif (pmw.retrieveData(\"geoCountryCode\")) geoFromStorage.countryCode = pmw.retrieveData(\"geoCountryCode\")\n\t\tif (pmw.retrieveData(\"geoRegionCode\")) geoFromStorage.regionCode = pmw.retrieveData(\"geoRegionCode\")\n\t\tif (pmw.retrieveData(\"geoRegion\")) geoFromStorage.region = pmw.retrieveData(\"geoRegion\")\n\n\t\tif (geoFromStorage.countryCode) {\n\t\t\tpmw.console.log(\"Retrieved the browser geo location from the cache: \", geoFromStorage)\n\t\t\treturn geoFromStorage\n\t\t}\n\n\t\tlet geoInfo = await pmw.getBrowserGeoFromExternalService()\n\n\t\t// If the external services fail, try to use the timezone fallback to get the country\n\t\tif (!geoInfo) {\n\n\t\t\tconst gepLocationByTimeZone = getBrowserLocationByTimeZone()\n\n\t\t\tgeoInfo = {}\n\n\t\t\tif (gepLocationByTimeZone) pmw.console.log(\"Retrieved the browser geo location from the timezone: \", gepLocationByTimeZone)\n\t\t\tif (gepLocationByTimeZone.countryCode) geoInfo.countryCode = gepLocationByTimeZone.countryCode\n\t\t\tif (gepLocationByTimeZone.regionCode) geoInfo.regionCode = gepLocationByTimeZone.regionCode\n\t\t}\n\n\t\tif (geoInfo?.ip) pmw.storeData(\"ip\", geoInfo.ip)\n\t\tif (geoInfo?.countryCode) pmw.storeData(\"geoCountryCode\", geoInfo.countryCode)\n\t\tif (geoInfo?.regionCode) pmw.storeData(\"geoRegionCode\", geoInfo.regionCode)\n\t\tif (geoInfo?.region) pmw.storeData(\"geoRegion\", geoInfo.region)\n\n\t\tif (geoInfo?.countryCode) {\n\t\t\treturn geoInfo\n\t\t}\n\n\t\treturn null\n\t}\n\n\t/**\n\t * Get the IP from the visitor using different services.\n\t * Return the first valid IP address that can be retrieved the fastest.\n\t *\n\t * @returns {Promise<IP>}\n\t */\n\tpmw.getIpFromAnyService = async (ipVersion = \"any\", maxServicesToCheck = 3) => {\n\n\t\t// start tracking time\n\t\tconst startTime = performance.now()\n\n\t\t// take the ipServices object and filter it to only contain objects with an ipVersion key that matches the ipVersion argument\n\t\t// keep the original order of the ipServices object\n\t\t// also keep only the first maxServicesToCheck objects\n\n\t\tconst ipServicesFiltered = Object.keys(ipServices)\n\t\t\t.filter(service => ipServices[service][ipVersion])\n\t\t\t.slice(0, maxServicesToCheck)\n\t\t\t.reduce((obj, key) => {\n\t\t\t\t\tobj[key] = ipServices[key]\n\t\t\t\t\treturn obj\n\t\t\t\t}\n\t\t\t\t, {})\n\n\t\tlet promises = []\n\n\t\tObject.keys(ipServicesFiltered).forEach(service => {\n\t\t\t// only push if the ipVersion is available for the service\n\t\t\tif (ipServicesFiltered[service][ipVersion]) {\n\t\t\t\t// console.log(`pushing ${service} to promises array with ipVersion ${ipVersion}`)\n\t\t\t\tpromises.push(pmw.getIpFromService(service, ipVersion))\n\t\t\t}\n\t\t})\n\n\t\t// If the promises array is not empty, return the first promise that resolves the fastest\n\t\t// Ignore the promises that reject\n\t\tif (promises.length > 0) {\n\n\t\t\ttry {\n\t\t\t\tconst data = await Promise.any(promises)\n\t\t\t\t// console.log(`The Pixel Manager retrieved the IP address ${data.ip} from ${data.service} using IP version ${data.ipVersion}`)\n\n\t\t\t\t// stop tracking time\n\t\t\t\tconst endTime = performance.now()\n\t\t\t\tconst timeTaken = (endTime - startTime).toFixed(2)\n\n\t\t\t\tpmw.console.log(`Retrieved the IP address ${data.ip} from ${data.service} which took ${timeTaken} ms`)\n\t\t\t\treturn data.ip\n\t\t\t} catch (error) {\n\t\t\t\t// console.error(error)\n\t\t\t\tpmw.console.log(`Could not retrieve an IP with version ${ipVersion} from any of the services.`)\n\t\t\t\treturn null\n\t\t\t}\n\n\t\t} else {\n\t\t\tpmw.console.log(\"No promises to resolve\")\n\t\t\treturn null\n\t\t}\n\t}\n\n\t/**\n\t * Fetches the IP address from a specified service.\n\t *\n\t * @async\n\t * @param {string} service - The name of the service to fetch the IP from.\n\t * @param {string} [ipVersion=\"any\"] - The version of the IP (e.g., \"any\" for global).\n\t * @returns {Promise<Object>} A promise that resolves to an object containing the IP address, service name, and IP version.\n\t * @throws {Error} Will reject the promise with an error if the IP version is not available for the service, the response from the service is not OK, the returned value from the service is not an IP address, or any other error occurs.\n\t */\n\tpmw.getIpFromService = async (service, ipVersion = \"any\") => {\n\t\ttry {\n\n\t\t\tlet data = {\n\t\t\t\tip : null,\n\t\t\t\tservice : service,\n\t\t\t\tipVersion: ipVersion,\n\t\t\t}\n\n\t\t\t// Return reject if the ipVersion is not available for the service\n\t\t\tif (!ipServices[service][ipVersion]) return Promise.reject(new Error(`The IP version ${ipVersion} is not available for the service ${service}`))\n\n\t\t\tpmw.console.log(`Fetching IP from ${service} using IP version ${ipVersion}`)\n\n\t\t\tconst response = await fetchWithTimeout(ipServices[service][ipVersion])\n\n\t\t\tif (!response.ok) {\n\t\t\t\treturn Promise.reject(new Error(`The response from ${service} was not OK. Status: ${response.status}`))\n\t\t\t}\n\n\t\t\tlet serviceResponseData = await response.text()\n\n\t\t\tif (service === \"cloudflare\") {\n\t\t\t\t// Convert key-value pairs to JSON\n\t\t\t\tserviceResponseData = serviceResponseData\n\t\t\t\t\t.trim()\n\t\t\t\t\t.split(\"\\n\")\n\t\t\t\t\t.reduce((obj, pair) => {\n\t\t\t\t\t\tpair = pair.split(\"=\")\n\t\t\t\t\t\treturn (obj[pair[0]] = pair[1]), obj\n\t\t\t\t\t}, {})\n\n\t\t\t\tdata.ip = serviceResponseData.ip\n\t\t\t} else {\n\t\t\t\tdata.ip = serviceResponseData.trim()\n\t\t\t}\n\n\t\t\tif (!isIP(data.ip)) {\n\t\t\t\treturn Promise.reject(new Error(`The returned value from ${service} is not an IP address`))\n\t\t\t}\n\n\t\t\treturn data\n\t\t} catch (error) {\n\t\t\treturn Promise.reject(error)\n\t\t}\n\t}\n\n\t/**\n\t * Cloudflare\n\t *\n\t * Response time: approx. 70ms\n\t * IPv: Returns IPv4 or IPv6 depending on the client\n\t * Dual stack: Doesn't offer dual stack detection\n\t *\n\t * @returns {Promise<*>}\n\t */\n\tconst getIpFromCloudflare = async () => {\n\n\t\tconst response = await fetchWithTimeout(\"https://www.cloudflare.com/cdn-cgi/trace\")\n\t\tlet data = await response.text()\n\n\t\t// Convert key-value pairs to JSON\n\t\t// https://stackoverflow.com/a/39284735/452587\n\t\tdata = data\n\t\t\t.trim()\n\t\t\t.split(\"\\n\")\n\t\t\t.reduce((obj, pair) => {\n\t\t\t\tpair = pair.split(\"=\")\n\t\t\t\treturn obj[pair[0]] = pair[1], obj\n\t\t\t}, {})\n\n\t\t// return the data.ip not a promise\n\t\treturn data.ip\n\t}\n\n\t/**\n\t * Check if the visitor is NOT allowed to trigger server-to-server events\n\t * This checks both bot user-agent patterns and custom IP exclusion list\n\t *\n\t * @returns {Promise<boolean>} True if the visitor should be blocked\n\t */\n\tpmw.isVisitorNotAllowed = async () => {\n\t\treturn await pmw.isVisitorAllowed() === false\n\t}\n\n\t/**\n\t * Check if the current user agent matches known bot patterns\n\t *\n\t * @returns {boolean} True if the user agent is a bot\n\t */\n\tpmw.isBotUserAgent = () => {\n\t\tconst userAgent = navigator.userAgent || ''\n\t\t\n\t\t// If no user agent, assume it might be a bot\n\t\tif (!userAgent) {\n\t\t\treturn true\n\t\t}\n\n\t\tconst botPatterns = getBotPatterns()\n\n\t\t// Check if user agent matches any bot pattern (case-insensitive)\n\t\tfor (const pattern of botPatterns) {\n\t\t\tif (userAgent.toLowerCase().includes(pattern.toLowerCase())) {\n\t\t\t\treturn true\n\t\t\t}\n\t\t}\n\n\t\treturn false\n\t}\n\n\t/**\n\t * Get list of known bot user-agent patterns\n\t *\n\t * @returns {string[]} Array of bot patterns\n\t */\n\tconst getBotPatterns = () => {\n\t\t// Get custom patterns from pmwDataLayer if available\n\t\tlet customPatterns = []\n\t\tif (Array.isArray(pmwDataLayer?.general?.server_2_server?.user_agent_exclude_patterns)) {\n\t\t\tcustomPatterns = pmwDataLayer.general.server_2_server.user_agent_exclude_patterns\n\t\t}\n\n\t\t// Default bot patterns - focusing on legitimate crawlers that identify themselves\n\t\tconst defaultPatterns = [\n\t\t\t// Search engine crawlers\n\t\t\t'Googlebot',\n\t\t\t'Google-InspectionTool',\n\t\t\t'Google-Extended',\n\t\t\t'Storebot-Google',\n\t\t\t'bingbot',\n\t\t\t'BingPreview',\n\t\t\t'msnbot',\n\t\t\t'Slurp',\n\t\t\t'DuckDuckBot',\n\t\t\t'Baiduspider',\n\t\t\t'YandexBot',\n\t\t\t'Sogou',\n\t\t\t\n\t\t\t// Social media crawlers\n\t\t\t'facebookexternalhit',\n\t\t\t'FacebookBot',\n\t\t\t'LinkedInBot',\n\t\t\t'Twitterbot',\n\t\t\t'PinterestBot',\n\t\t\t'TikTokBot',\n\t\t\t'SnapchatAds',\n\t\t\t'DiscordBot',\n\t\t\t'InstagramBot',\n\t\t\t'WhatsApp',\n\t\t\t\n\t\t\t// SEO & Analytics\n\t\t\t'AhrefsBot',\n\t\t\t'SemrushBot',\n\t\t\t'MJ12bot',\n\t\t\t'DotBot',\n\t\t\t'rogerbot',\n\t\t\t\n\t\t\t// Monitoring services\n\t\t\t'UptimeRobot',\n\t\t\t'Pingdom',\n\t\t\t'StatusCake',\n\t\t\t'GTmetrix',\n\t\t\t\n\t\t\t// AI & Research\n\t\t\t'ClaudeBot',\n\t\t\t'GPTBot',\n\t\t\t'ChatGPT',\n\t\t\t'anthropic-ai',\n\t\t\t'CCBot',\n\t\t\t'PerplexityBot',\n\t\t\t\n\t\t\t// Generic patterns\n\t\t\t'crawler',\n\t\t\t'spider',\n\t\t\t'scraper',\n\t\t\t'bot/',\n\t\t\t'/bot',\n\t\t\t'bot-',\n\t\t]\n\n\t\treturn defaultPatterns.concat(customPatterns)\n\t}\n\n\t/**\n\t * Check if an IP address is in CIDR notation\n\t *\n\t * @param {string} ipName - The IP or CIDR notation to check\n\t * @returns {boolean} True if the string contains CIDR notation\n\t */\n\tconst isCidr = (ipName) => {\n\t\treturn ipName.includes('/')\n\t}\n\n\t/**\n\t * Check if an IP address is on the custom exclusion list\n\t *\n\t * @param {string} ip - The IP address to check\n\t * @returns {boolean} True if the IP is on the exclusion list\n\t */\n\tconst isOnIpExclusionList = (ip) => {\n\t\tconst ipExcludeList = pmwDataLayer?.general?.server_2_server?.ip_exclude_list || []\n\n\t\tfor (const ipName of ipExcludeList) {\n\t\t\tif (isCidr(ipName)) {\n\t\t\t\t// Check CIDR range\n\t\t\t\tif (isInSubnet.isInSubnet(ip, ipName)) {\n\t\t\t\t\treturn true\n\t\t\t\t}\n\t\t\t} else if (ip === ipName) {\n\t\t\t\t// Exact IP match\n\t\t\t\treturn true\n\t\t\t}\n\t\t}\n\n\t\treturn false\n\t}\n\n}(window.pmw = window.pmw || {}, jQuery))\n","// https://stackoverflow.com/a/70870895/4688612\nexport const getLocationByTimeZone = () => {\n\n\tconst timezones = {\n\t\t\"Africa/Abidjan\" : [\"CI\", \"BF\", \"GH\", \"GM\", \"GN\", \"ML\", \"MR\", \"SH\", \"SL\", \"SN\", \"TG\"],\n\t\t\"Africa/Accra\" : [\"GH\"],\n\t\t\"Africa/Addis_Ababa\" : [\"ET\"],\n\t\t\"Africa/Algiers\" : [\"DZ\"],\n\t\t\"Africa/Asmara\" : [\"ER\"],\n\t\t\"Africa/Asmera\" : [\"ER\"],\n\t\t\"Africa/Bamako\" : [\"ML\"],\n\t\t\"Africa/Bangui\" : [\"CF\"],\n\t\t\"Africa/Banjul\" : [\"GM\"],\n\t\t\"Africa/Bissau\" : [\"GW\"],\n\t\t\"Africa/Blantyre\" : [\"MW\"],\n\t\t\"Africa/Brazzaville\" : [\"CG\"],\n\t\t\"Africa/Bujumbura\" : [\"BI\"],\n\t\t\"Africa/Cairo\" : [\"EG\"],\n\t\t\"Africa/Casablanca\" : [\"MA\"],\n\t\t\"Africa/Ceuta\" : [\"ES\"],\n\t\t\"Africa/Conakry\" : [\"GN\"],\n\t\t\"Africa/Dakar\" : [\"SN\"],\n\t\t\"Africa/Dar_es_Salaam\" : [\"TZ\"],\n\t\t\"Africa/Djibouti\" : [\"DJ\"],\n\t\t\"Africa/Douala\" : [\"CM\"],\n\t\t\"Africa/El_Aaiun\" : [\"EH\"],\n\t\t\"Africa/Freetown\" : [\"SL\"],\n\t\t\"Africa/Gaborone\" : [\"BW\"],\n\t\t\"Africa/Harare\" : [\"ZW\"],\n\t\t\"Africa/Johannesburg\" : [\"ZA\", \"LS\", \"SZ\"],\n\t\t\"Africa/Juba\" : [\"SS\"],\n\t\t\"Africa/Kampala\" : [\"UG\"],\n\t\t\"Africa/Khartoum\" : [\"SD\"],\n\t\t\"Africa/Kigali\" : [\"RW\"],\n\t\t\"Africa/Kinshasa\" : [\"CD\"],\n\t\t\"Africa/Lagos\" : [\"NG\", \"AO\", \"BJ\", \"CD\", \"CF\", \"CG\", \"CM\", \"GA\", \"GQ\", \"NE\"],\n\t\t\"Africa/Libreville\" : [\"GA\"],\n\t\t\"Africa/Lome\" : [\"TG\"],\n\t\t\"Africa/Luanda\" : [\"AO\"],\n\t\t\"Africa/Lubumbashi\" : [\"CD\"],\n\t\t\"Africa/Lusaka\" : [\"ZM\"],\n\t\t\"Africa/Malabo\" : [\"GQ\"],\n\t\t\"Africa/Maputo\" : [\"MZ\", \"BI\", \"BW\", \"CD\", \"MW\", \"RW\", \"ZM\", \"ZW\"],\n\t\t\"Africa/Maseru\" : [\"LS\"],\n\t\t\"Africa/Mbabane\" : [\"SZ\"],\n\t\t\"Africa/Mogadishu\" : [\"SO\"],\n\t\t\"Africa/Monrovia\" : [\"LR\"],\n\t\t\"Africa/Nairobi\" : [\"KE\", \"DJ\", \"ER\", \"ET\", \"KM\", \"MG\", \"SO\", \"TZ\", \"UG\", \"YT\"],\n\t\t\"Africa/Ndjamena\" : [\"TD\"],\n\t\t\"Africa/Niamey\" : [\"NE\"],\n\t\t\"Africa/Nouakchott\" : [\"MR\"],\n\t\t\"Africa/Ouagadougou\" : [\"BF\"],\n\t\t\"Africa/Porto-Novo\" : [\"BJ\"],\n\t\t\"Africa/Sao_Tome\" : [\"ST\"],\n\t\t\"Africa/Timbuktu\" : [\"ML\"],\n\t\t\"Africa/Tripoli\" : [\"LY\"],\n\t\t\"Africa/Tunis\" : [\"TN\"],\n\t\t\"Africa/Windhoek\" : [\"NA\"],\n\t\t\"America/Adak\" : [\"US\"],\n\t\t\"America/Anchorage\" : [\"US\"],\n\t\t\"America/Anguilla\" : [\"AI\"],\n\t\t\"America/Antigua\" : [\"AG\"],\n\t\t\"America/Araguaina\" : [\"BR\"],\n\t\t\"America/Argentina/Buenos_Aires\": [\"AR\"],\n\t\t\"America/Argentina/Catamarca\" : [\"AR\"],\n\t\t\"America/Argentina/Cordoba\" : [\"AR\"],\n\t\t\"America/Argentina/Jujuy\" : [\"AR\"],\n\t\t\"America/Argentina/La_Rioja\" : [\"AR\"],\n\t\t\"America/Argentina/Mendoza\" : [\"AR\"],\n\t\t\"America/Argentina/Rio_Gallegos\": [\"AR\"],\n\t\t\"America/Argentina/Salta\" : [\"AR\"],\n\t\t\"America/Argentina/San_Juan\" : [\"AR\"],\n\t\t\"America/Argentina/San_Luis\" : [\"AR\"],\n\t\t\"America/Argentina/Tucuman\" : [\"AR\"],\n\t\t\"America/Argentina/Ushuaia\" : [\"AR\"],\n\t\t\"America/Aruba\" : [\"AW\"],\n\t\t\"America/Asuncion\" : [\"PY\"],\n\t\t\"America/Atikokan\" : [\"CA\"],\n\t\t\"America/Bahia\" : [\"BR\"],\n\t\t\"America/Bahia_Banderas\" : [\"MX\"],\n\t\t\"America/Barbados\" : [\"BB\"],\n\t\t\"America/Belem\" : [\"BR\"],\n\t\t\"America/Belize\" : [\"BZ\"],\n\t\t\"America/Blanc-Sablon\" : [\"CA\"],\n\t\t\"America/Boa_Vista\" : [\"BR\"],\n\t\t\"America/Bogota\" : [\"CO\"],\n\t\t\"America/Boise\" : [\"US\"],\n\t\t\"America/Cambridge_Bay\" : [\"CA\"],\n\t\t\"America/Campo_Grande\" : [\"BR\"],\n\t\t\"America/Cancun\" : [\"MX\"],\n\t\t\"America/Caracas\" : [\"VE\"],\n\t\t\"America/Cayenne\" : [\"GF\"],\n\t\t\"America/Cayman\" : [\"KY\"],\n\t\t\"America/Chicago\" : [\"US\"],\n\t\t\"America/Chihuahua\" : [\"MX\"],\n\t\t\"America/Coral_Harbour\" : [\"CA\"],\n\t\t\"America/Costa_Rica\" : [\"CR\"],\n\t\t\"America/Creston\" : [\"CA\"],\n\t\t\"America/Cuiaba\" : [\"BR\"],\n\t\t\"America/Curacao\" : [\"CW\"],\n\t\t\"America/Danmarkshavn\" : [\"GL\"],\n\t\t\"America/Dawson\" : [\"CA\"],\n\t\t\"America/Dawson_Creek\" : [\"CA\"],\n\t\t\"America/Denver\" : [\"US\"],\n\t\t\"America/Detroit\" : [\"US\"],\n\t\t\"America/Dominica\" : [\"DM\"],\n\t\t\"America/Edmonton\" : [\"CA\"],\n\t\t\"America/Eirunepe\" : [\"BR\"],\n\t\t\"America/El_Salvador\" : [\"SV\"],\n\t\t\"America/Fort_Nelson\" : [\"CA\"],\n\t\t\"America/Fortaleza\" : [\"BR\"],\n\t\t\"America/Glace_Bay\" : [\"CA\"],\n\t\t\"America/Goose_Bay\" : [\"CA\"],\n\t\t\"America/Grand_Turk\" : [\"TC\"],\n\t\t\"America/Grenada\" : [\"GD\"],\n\t\t\"America/Guadeloupe\" : [\"GP\"],\n\t\t\"America/Guatemala\" : [\"GT\"],\n\t\t\"America/Guayaquil\" : [\"EC\"],\n\t\t\"America/Guyana\" : [\"GY\"],\n\t\t\"America/Halifax\" : [\"CA\"],\n\t\t\"America/Havana\" : [\"CU\"],\n\t\t\"America/Hermosillo\" : [\"MX\"],\n\t\t\"America/Indiana/Indianapolis\" : [\"US\"],\n\t\t\"America/Indiana/Knox\" : [\"US\"],\n\t\t\"America/Indiana/Marengo\" : [\"US\"],\n\t\t\"America/Indiana/Petersburg\" : [\"US\"],\n\t\t\"America/Indiana/Tell_City\" : [\"US\"],\n\t\t\"America/Indiana/Vevay\" : [\"US\"],\n\t\t\"America/Indiana/Vincennes\" : [\"US\"],\n\t\t\"America/Indiana/Winamac\" : [\"US\"],\n\t\t\"America/Inuvik\" : [\"CA\"],\n\t\t\"America/Iqaluit\" : [\"CA\"],\n\t\t\"America/Jamaica\" : [\"JM\"],\n\t\t\"America/Juneau\" : [\"US\"],\n\t\t\"America/Kentucky/Louisville\" : [\"US\"],\n\t\t\"America/Kentucky/Monticello\" : [\"US\"],\n\t\t\"America/Kralendijk\" : [\"BQ\"],\n\t\t\"America/La_Paz\" : [\"BO\"],\n\t\t\"America/Lima\" : [\"PE\"],\n\t\t\"America/Los_Angeles\" : [\"US\"],\n\t\t\"America/Lower_Princes\" : [\"SX\"],\n\t\t\"America/Maceio\" : [\"BR\"],\n\t\t\"America/Managua\" : [\"NI\"],\n\t\t\"America/Manaus\" : [\"BR\"],\n\t\t\"America/Marigot\" : [\"MF\"],\n\t\t\"America/Martinique\" : [\"MQ\"],\n\t\t\"America/Matamoros\" : [\"MX\"],\n\t\t\"America/Mazatlan\" : [\"MX\"],\n\t\t\"America/Menominee\" : [\"US\"],\n\t\t\"America/Merida\" : [\"MX\"],\n\t\t\"America/Metlakatla\" : [\"US\"],\n\t\t\"America/Mexico_City\" : [\"MX\"],\n\t\t\"America/Miquelon\" : [\"PM\"],\n\t\t\"America/Moncton\" : [\"CA\"],\n\t\t\"America/Monterrey\" : [\"MX\"],\n\t\t\"America/Montevideo\" : [\"UY\"],\n\t\t\"America/Montreal\" : [\"CA\"],\n\t\t\"America/Montserrat\" : [\"MS\"],\n\t\t\"America/Nassau\" : [\"BS\"],\n\t\t\"America/New_York\" : [\"US\"],\n\t\t\"America/Nipigon\" : [\"CA\"],\n\t\t\"America/Nome\" : [\"US\"],\n\t\t\"America/Noronha\" : [\"BR\"],\n\t\t\"America/North_Dakota/Beulah\" : [\"US\"],\n\t\t\"America/North_Dakota/Center\" : [\"US\"],\n\t\t\"America/North_Dakota/New_Salem\": [\"US\"],\n\t\t\"America/Nuuk\" : [\"GL\"],\n\t\t\"America/Ojinaga\" : [\"MX\"],\n\t\t\"America/Panama\" : [\"PA\", \"CA\", \"KY\"],\n\t\t\"America/Pangnirtung\" : [\"CA\"],\n\t\t\"America/Paramaribo\" : [\"SR\"],\n\t\t\"America/Phoenix\" : [\"US\", \"CA\"],\n\t\t\"America/Port-au-Prince\" : [\"HT\"],\n\t\t\"America/Port_of_Spain\" : [\"TT\"],\n\t\t\"America/Porto_Velho\" : [\"BR\"],\n\t\t\"America/Puerto_Rico\" : [\"PR\", \"AG\", \"CA\", \"AI\", \"AW\", \"BL\", \"BQ\", \"CW\", \"DM\", \"GD\", \"GP\", \"KN\", \"LC\", \"MF\", \"MS\", \"SX\", \"TT\", \"VC\", \"VG\", \"VI\"],\n\t\t\"America/Punta_Arenas\" : [\"CL\"],\n\t\t\"America/Rainy_River\" : [\"CA\"],\n\t\t\"America/Rankin_Inlet\" : [\"CA\"],\n\t\t\"America/Recife\" : [\"BR\"],\n\t\t\"America/Regina\" : [\"CA\"],\n\t\t\"America/Resolute\" : [\"CA\"],\n\t\t\"America/Rio_Branco\" : [\"BR\"],\n\t\t\"America/Santarem\" : [\"BR\"],\n\t\t\"America/Santiago\" : [\"CL\"],\n\t\t\"America/Santo_Domingo\" : [\"DO\"],\n\t\t\"America/Sao_Paulo\" : [\"BR\"],\n\t\t\"America/Scoresbysund\" : [\"GL\"],\n\t\t\"America/Sitka\" : [\"US\"],\n\t\t\"America/St_Barthelemy\" : [\"BL\"],\n\t\t\"America/St_Johns\" : [\"CA\"],\n\t\t\"America/St_Kitts\" : [\"KN\"],\n\t\t\"America/St_Lucia\" : [\"LC\"],\n\t\t\"America/St_Thomas\" : [\"VI\"],\n\t\t\"America/St_Vincent\" : [\"VC\"],\n\t\t\"America/Swift_Current\" : [\"CA\"],\n\t\t\"America/Tegucigalpa\" : [\"HN\"],\n\t\t\"America/Thule\" : [\"GL\"],\n\t\t\"America/Thunder_Bay\" : [\"CA\"],\n\t\t\"America/Tijuana\" : [\"MX\"],\n\t\t\"America/Toronto\" : [\"CA\", \"BS\"],\n\t\t\"America/Tortola\" : [\"VG\"],\n\t\t\"America/Vancouver\" : [\"CA\"],\n\t\t\"America/Virgin\" : [\"VI\"],\n\t\t\"America/Whitehorse\" : [\"CA\"],\n\t\t\"America/Winnipeg\" : [\"CA\"],\n\t\t\"America/Yakutat\" : [\"US\"],\n\t\t\"America/Yellowknife\" : [\"CA\"],\n\t\t\"Antarctica/Casey\" : [\"AQ\"],\n\t\t\"Antarctica/Davis\" : [\"AQ\"],\n\t\t\"Antarctica/DumontDUrville\" : [\"AQ\"],\n\t\t\"Antarctica/Macquarie\" : [\"AU\"],\n\t\t\"Antarctica/Mawson\" : [\"AQ\"],\n\t\t\"Antarctica/McMurdo\" : [\"AQ\"],\n\t\t\"Antarctica/Palmer\" : [\"AQ\"],\n\t\t\"Antarctica/Rothera\" : [\"AQ\"],\n\t\t\"Antarctica/South_Pole\" : [\"AQ\"],\n\t\t\"Antarctica/Syowa\" : [\"AQ\"],\n\t\t\"Antarctica/Troll\" : [\"AQ\"],\n\t\t\"Antarctica/Vostok\" : [\"AQ\"],\n\t\t\"Arctic/Longyearbyen\" : [\"SJ\"],\n\t\t\"Asia/Aden\" : [\"YE\"],\n\t\t\"Asia/Almaty\" : [\"KZ\"],\n\t\t\"Asia/Amman\" : [\"JO\"],\n\t\t\"Asia/Anadyr\" : [\"RU\"],\n\t\t\"Asia/Aqtau\" : [\"KZ\"],\n\t\t\"Asia/Aqtobe\" : [\"KZ\"],\n\t\t\"Asia/Ashgabat\" : [\"TM\"],\n\t\t\"Asia/Atyrau\" : [\"KZ\"],\n\t\t\"Asia/Baghdad\" : [\"IQ\"],\n\t\t\"Asia/Bahrain\" : [\"BH\"],\n\t\t\"Asia/Baku\" : [\"AZ\"],\n\t\t\"Asia/Bangkok\" : [\"TH\", \"KH\", \"LA\", \"VN\"],\n\t\t\"Asia/Barnaul\" : [\"RU\"],\n\t\t\"Asia/Beirut\" : [\"LB\"],\n\t\t\"Asia/Bishkek\" : [\"KG\"],\n\t\t\"Asia/Brunei\" : [\"BN\"],\n\t\t\"Asia/Chita\" : [\"RU\"],\n\t\t\"Asia/Choibalsan\" : [\"MN\"],\n\t\t\"Asia/Colombo\" : [\"LK\"],\n\t\t\"Asia/Damascus\" : [\"SY\"],\n\t\t\"Asia/Dhaka\" : [\"BD\"],\n\t\t\"Asia/Dili\" : [\"TL\"],\n\t\t\"Asia/Dubai\" : [\"AE\", \"OM\"],\n\t\t\"Asia/Dushanbe\" : [\"TJ\"],\n\t\t\"Asia/Famagusta\" : [\"CY\"],\n\t\t\"Asia/Gaza\" : [\"PS\"],\n\t\t\"Asia/Hebron\" : [\"PS\"],\n\t\t\"Asia/Ho_Chi_Minh\" : [\"VN\"],\n\t\t\"Asia/Hong_Kong\" : [\"HK\"],\n\t\t\"Asia/Hovd\" : [\"MN\"],\n\t\t\"Asia/Irkutsk\" : [\"RU\"],\n\t\t\"Asia/Jakarta\" : [\"ID\"],\n\t\t\"Asia/Jayapura\" : [\"ID\"],\n\t\t\"Asia/Jerusalem\" : [\"IL\"],\n\t\t\"Asia/Kabul\" : [\"AF\"],\n\t\t\"Asia/Kamchatka\" : [\"RU\"],\n\t\t\"Asia/Karachi\" : [\"PK\"],\n\t\t\"Asia/Kathmandu\" : [\"NP\"],\n\t\t\"Asia/Khandyga\" : [\"RU\"],\n\t\t\"Asia/Kolkata\" : [\"IN\"],\n\t\t\"Asia/Krasnoyarsk\" : [\"RU\"],\n\t\t\"Asia/Kuala_Lumpur\" : [\"MY\"],\n\t\t\"Asia/Kuching\" : [\"MY\"],\n\t\t\"Asia/Kuwait\" : [\"KW\"],\n\t\t\"Asia/Macau\" : [\"MO\"],\n\t\t\"Asia/Magadan\" : [\"RU\"],\n\t\t\"Asia/Makassar\" : [\"ID\"],\n\t\t\"Asia/Manila\" : [\"PH\"],\n\t\t\"Asia/Muscat\" : [\"OM\"],\n\t\t\"Asia/Nicosia\" : [\"CY\"],\n\t\t\"Asia/Novokuznetsk\" : [\"RU\"],\n\t\t\"Asia/Novosibirsk\" : [\"RU\"],\n\t\t\"Asia/Omsk\" : [\"RU\"],\n\t\t\"Asia/Oral\" : [\"KZ\"],\n\t\t\"Asia/Phnom_Penh\" : [\"KH\"],\n\t\t\"Asia/Pontianak\" : [\"ID\"],\n\t\t\"Asia/Pyongyang\" : [\"KP\"],\n\t\t\"Asia/Qatar\" : [\"QA\", \"BH\"],\n\t\t\"Asia/Qostanay\" : [\"KZ\"],\n\t\t\"Asia/Qyzylorda\" : [\"KZ\"],\n\t\t\"Asia/Riyadh\" : [\"SA\", \"AQ\", \"KW\", \"YE\"],\n\t\t\"Asia/Sakhalin\" : [\"RU\"],\n\t\t\"Asia/Samarkand\" : [\"UZ\"],\n\t\t\"Asia/Seoul\" : [\"KR\"],\n\t\t\"Asia/Shanghai\" : [\"CN\"],\n\t\t\"Asia/Singapore\" : [\"SG\", \"MY\"],\n\t\t\"Asia/Srednekolymsk\" : [\"RU\"],\n\t\t\"Asia/Taipei\" : [\"TW\"],\n\t\t\"Asia/Tashkent\" : [\"UZ\"],\n\t\t\"Asia/Tbilisi\" : [\"GE\"],\n\t\t\"Asia/Tehran\" : [\"IR\"],\n\t\t\"Asia/Thimphu\" : [\"BT\"],\n\t\t\"Asia/Tokyo\" : [\"JP\"],\n\t\t\"Asia/Tomsk\" : [\"RU\"],\n\t\t\"Asia/Ulaanbaatar\" : [\"MN\"],\n\t\t\"Asia/Urumqi\" : [\"CN\"],\n\t\t\"Asia/Ust-Nera\" : [\"RU\"],\n\t\t\"Asia/Vientiane\" : [\"LA\"],\n\t\t\"Asia/Vladivostok\" : [\"RU\"],\n\t\t\"Asia/Yakutsk\" : [\"RU\"],\n\t\t\"Asia/Yangon\" : [\"MM\"],\n\t\t\"Asia/Yekaterinburg\" : [\"RU\"],\n\t\t\"Asia/Yerevan\" : [\"AM\"],\n\t\t\"Atlantic/Azores\" : [\"PT\"],\n\t\t\"Atlantic/Bermuda\" : [\"BM\"],\n\t\t\"Atlantic/Canary\" : [\"ES\"],\n\t\t\"Atlantic/Cape_Verde\" : [\"CV\"],\n\t\t\"Atlantic/Faroe\" : [\"FO\"],\n\t\t\"Atlantic/Jan_Mayen\" : [\"SJ\"],\n\t\t\"Atlantic/Madeira\" : [\"PT\"],\n\t\t\"Atlantic/Reykjavik\" : [\"IS\"],\n\t\t\"Atlantic/South_Georgia\" : [\"GS\"],\n\t\t\"Atlantic/St_Helena\" : [\"SH\"],\n\t\t\"Atlantic/Stanley\" : [\"FK\"],\n\t\t\"Australia/Adelaide\" : [\"AU\"],\n\t\t\"Australia/Brisbane\" : [\"AU\"],\n\t\t\"Australia/Broken_Hill\" : [\"AU\"],\n\t\t\"Australia/Darwin\" : [\"AU\"],\n\t\t\"Australia/Eucla\" : [\"AU\"],\n\t\t\"Australia/Hobart\" : [\"AU\"],\n\t\t\"Australia/Lindeman\" : [\"AU\"],\n\t\t\"Australia/Lord_Howe\" : [\"AU\"],\n\t\t\"Australia/Melbourne\" : [\"AU\"],\n\t\t\"Australia/Perth\" : [\"AU\"],\n\t\t\"Australia/Sydney\" : [\"AU\"],\n\t\t\"Canada/Eastern\" : [\"CA\"],\n\t\t\"Europe/Amsterdam\" : [\"NL\"],\n\t\t\"Europe/Andorra\" : [\"AD\"],\n\t\t\"Europe/Astrakhan\" : [\"RU\"],\n\t\t\"Europe/Athens\" : [\"GR\"],\n\t\t\"Europe/Belfast\" : [\"GB\"],\n\t\t\"Europe/Belgrade\" : [\"RS\", \"BA\", \"HR\", \"ME\", \"MK\", \"SI\"],\n\t\t\"Europe/Berlin\" : [\"DE\"],\n\t\t\"Europe/Bratislava\" : [\"SK\"],\n\t\t\"Europe/Brussels\" : [\"BE\"],\n\t\t\"Europe/Bucharest\" : [\"RO\"],\n\t\t\"Europe/Budapest\" : [\"HU\"],\n\t\t\"Europe/Busingen\" : [\"DE\"],\n\t\t\"Europe/Chisinau\" : [\"MD\"],\n\t\t\"Europe/Copenhagen\" : [\"DK\"],\n\t\t\"Europe/Dublin\" : [\"IE\"],\n\t\t\"Europe/Gibraltar\" : [\"GI\"],\n\t\t\"Europe/Guernsey\" : [\"GG\"],\n\t\t\"Europe/Helsinki\" : [\"FI\", \"AX\"],\n\t\t\"Europe/Isle_of_Man\" : [\"IM\"],\n\t\t\"Europe/Istanbul\" : [\"TR\"],\n\t\t\"Europe/Jersey\" : [\"JE\"],\n\t\t\"Europe/Kaliningrad\" : [\"RU\"],\n\t\t\"Europe/Kiev\" : [\"UA\"],\n\t\t\"Europe/Kirov\" : [\"RU\"],\n\t\t\"Europe/Lisbon\" : [\"PT\"],\n\t\t\"Europe/Ljubljana\" : [\"SI\"],\n\t\t\"Europe/London\" : [\"GB\", \"GG\", \"IM\", \"JE\"],\n\t\t\"Europe/Luxembourg\" : [\"LU\"],\n\t\t\"Europe/Madrid\" : [\"ES\"],\n\t\t\"Europe/Malta\" : [\"MT\"],\n\t\t\"Europe/Mariehamn\" : [\"AX\"],\n\t\t\"Europe/Minsk\" : [\"BY\"],\n\t\t\"Europe/Monaco\" : [\"MC\"],\n\t\t\"Europe/Moscow\" : [\"RU\"],\n\t\t\"Europe/Oslo\" : [\"NO\", \"SJ\", \"BV\"],\n\t\t\"Europe/Paris\" : [\"FR\"],\n\t\t\"Europe/Podgorica\" : [\"ME\"],\n\t\t\"Europe/Prague\" : [\"CZ\", \"SK\"],\n\t\t\"Europe/Riga\" : [\"LV\"],\n\t\t\"Europe/Rome\" : [\"IT\", \"SM\", \"VA\"],\n\t\t\"Europe/Samara\" : [\"RU\"],\n\t\t\"Europe/San_Marino\" : [\"SM\"],\n\t\t\"Europe/Sarajevo\" : [\"BA\"],\n\t\t\"Europe/Saratov\" : [\"RU\"],\n\t\t\"Europe/Simferopol\" : [\"RU\", \"UA\"],\n\t\t\"Europe/Skopje\" : [\"MK\"],\n\t\t\"Europe/Sofia\" : [\"BG\"],\n\t\t\"Europe/Stockholm\" : [\"SE\"],\n\t\t\"Europe/Tallinn\" : [\"EE\"],\n\t\t\"Europe/Tirane\" : [\"AL\"],\n\t\t\"Europe/Ulyanovsk\" : [\"RU\"],\n\t\t\"Europe/Uzhgorod\" : [\"UA\"],\n\t\t\"Europe/Vaduz\" : [\"LI\"],\n\t\t\"Europe/Vatican\" : [\"VA\"],\n\t\t\"Europe/Vienna\" : [\"AT\"],\n\t\t\"Europe/Vilnius\" : [\"LT\"],\n\t\t\"Europe/Volgograd\" : [\"RU\"],\n\t\t\"Europe/Warsaw\" : [\"PL\"],\n\t\t\"Europe/Zagreb\" : [\"HR\"],\n\t\t\"Europe/Zaporozhye\" : [\"UA\"],\n\t\t\"Europe/Zurich\" : [\"CH\", \"DE\", \"LI\"],\n\t\t\"GB\" : [\"GB\"],\n\t\t\"GB-Eire\" : [\"GB\"],\n\t\t\"Indian/Antananarivo\" : [\"MG\"],\n\t\t\"Indian/Chagos\" : [\"IO\"],\n\t\t\"Indian/Christmas\" : [\"CX\"],\n\t\t\"Indian/Cocos\" : [\"CC\"],\n\t\t\"Indian/Comoro\" : [\"KM\"],\n\t\t\"Indian/Kerguelen\" : [\"TF\", \"HM\"],\n\t\t\"Indian/Mahe\" : [\"SC\"],\n\t\t\"Indian/Maldives\" : [\"MV\"],\n\t\t\"Indian/Mauritius\" : [\"MU\"],\n\t\t\"Indian/Mayotte\" : [\"YT\"],\n\t\t\"Indian/Reunion\" : [\"RE\", \"TF\"],\n\t\t\"NZ\" : [\"NZ\"],\n\t\t\"Pacific/Apia\" : [\"WS\"],\n\t\t\"Pacific/Auckland\" : [\"NZ\", \"AQ\"],\n\t\t\"Pacific/Bougainville\" : [\"PG\"],\n\t\t\"Pacific/Chatham\" : [\"NZ\"],\n\t\t\"Pacific/Chuuk\" : [\"FM\"],\n\t\t\"Pacific/Easter\" : [\"CL\"],\n\t\t\"Pacific/Efate\" : [\"VU\"],\n\t\t\"Pacific/Fakaofo\" : [\"TK\"],\n\t\t\"Pacific/Fiji\" : [\"FJ\"],\n\t\t\"Pacific/Funafuti\" : [\"TV\"],\n\t\t\"Pacific/Galapagos\" : [\"EC\"],\n\t\t\"Pacific/Gambier\" : [\"PF\"],\n\t\t\"Pacific/Guadalcanal\" : [\"SB\"],\n\t\t\"Pacific/Guam\" : [\"GU\", \"MP\"],\n\t\t\"Pacific/Honolulu\" : [\"US\", \"UM\"],\n\t\t\"Pacific/Johnston\" : [\"UM\"],\n\t\t\"Pacific/Kanton\" : [\"KI\"],\n\t\t\"Pacific/Kiritimati\" : [\"KI\"],\n\t\t\"Pacific/Kosrae\" : [\"FM\"],\n\t\t\"Pacific/Kwajalein\" : [\"MH\"],\n\t\t\"Pacific/Majuro\" : [\"MH\"],\n\t\t\"Pacific/Marquesas\" : [\"PF\"],\n\t\t\"Pacific/Midway\" : [\"UM\"],\n\t\t\"Pacific/Nauru\" : [\"NR\"],\n\t\t\"Pacific/Niue\" : [\"NU\"],\n\t\t\"Pacific/Norfolk\" : [\"NF\"],\n\t\t\"Pacific/Noumea\" : [\"NC\"],\n\t\t\"Pacific/Pago_Pago\" : [\"AS\", \"UM\"],\n\t\t\"Pacific/Palau\" : [\"PW\"],\n\t\t\"Pacific/Pitcairn\" : [\"PN\"],\n\t\t\"Pacific/Pohnpei\" : [\"FM\"],\n\t\t\"Pacific/Port_Moresby\" : [\"PG\", \"AQ\"],\n\t\t\"Pacific/Rarotonga\" : [\"CK\"],\n\t\t\"Pacific/Saipan\" : [\"MP\"],\n\t\t\"Pacific/Samoa\" : [\"WS\"],\n\t\t\"Pacific/Tahiti\" : [\"PF\"],\n\t\t\"Pacific/Tarawa\" : [\"KI\"],\n\t\t\"Pacific/Tongatapu\" : [\"TO\"],\n\t\t\"Pacific/Wake\" : [\"UM\"],\n\t\t\"Pacific/Wallis\" : [\"WF\"],\n\t\t\"Singapore\" : [\"SG\"],\n\t\t\"US/Arizona\" : [\"US\"],\n\t\t\"US/Hawaii\" : [\"US\"],\n\t\t\"US/Samoa\" : [\"WS\"],\n\t}\n\n\tconst timezone = Intl.DateTimeFormat().resolvedOptions().timeZone\n\n\tif (timezone === \"\" || !timezone) {\n\t\treturn null\n\t}\n\n\tlet geoLocation = {\n\t\tcountryCode: timezones[timezone][0].toUpperCase(),\n\t}\n\n\t// if the timezone is equals \"America/Los_Angeles\" then add the regionCode \"US-CA\"\n\tif (timezone === \"America/Los_Angeles\") {\n\t\tgeoLocation.regionCode = \"US-CA\"\n\t}\n\n\tif (timezone === \"Europe/Zurich\") {\n\t\tgeoLocation.regionCode = \"CH-ZH\"\n\t}\n\n\treturn geoLocation\n}\n\n\n\n\n",null,"/**\n * Register event listeners\n */\n\n\n/**\n * add_to_cart event\n *\n * WC is inconsistent with events that emit add-to-cart events.\n * adding_to_cart and added_to_are legacy events. Also, they only work\n * on Ajax buttons on shop pages.\n *\n * Never add document or body selectors.\n * The document selector doesn't work.\n * The body selector will cause the events to fire twice and other erratic behavior if used along with other selectors.\n */\nconst addToCartSelectorsArray = [\n\t// \"document\",\n\t// \"body\",\n\t\".add_to_cart_button:not(.product_type_variable)\",\n\t\".ajax_add_to_cart\",\n\t\".single_add_to_cart_button\",\n];\n\nconst addToCartSelectors = pmw.prepareSelectors(addToCartSelectorsArray, \"addToCart\");\n\njQuery(addToCartSelectors).on(\"click adding_to_cart\", (event, data) => {\n\n\t// console.log(\"add_to_cart event fired at: \" + new Date().getTime())\n\t// console.log('add to cart data', data)\n\t// console.log('add to cart event', event)\n\t// console.log('add to cart jQuery(event.target.dataset)', jQuery(event.target.dataset))\n\t// console.log(\"add to cart event.target.dataset\", event.target.dataset)\n\t// console.log(\"add to cart event.target.dataset.quantity\", event.target.dataset.quantity)\n\t// console.log(\"add to cart event.target.dataset.product_id\", event.target.dataset.product_id)\n\n\ttry {\n\n\t\t// console.log(\"add_to_cart event detected\")\n\n\t\tlet quantity = event?.target?.dataset?.quantity ? event.target.dataset.quantity : null;\n\t\tlet productId = event?.target?.dataset?.product_id ? event.target.dataset.product_id : event?.target?.value ? event.target.value : null;\n\n\t\t// let quantity = event.target.dataset.quantity ? event.target.dataset.quantity : 1\n\t\t// let productId = event.target.dataset.product_id ? event.target.dataset.product_id : null\n\n\t\t// Only process on product pages\n\t\tif (pmwDataLayer.shop.page_type === \"product\") {\n\n\t\t\t// First process related and upsell products\n\t\t\tif (\n\t\t\t\ttypeof jQuery(event.currentTarget).attr(\"href\") !== \"undefined\"\n\t\t\t\t&& jQuery(event.currentTarget).attr(\"href\").includes(\"add-to-cart\")\n\t\t\t) {\n\n\t\t\t\tif (!productId) {\n\t\t\t\t\tproductId = jQuery(event.currentTarget).data(\"product_id\");\n\t\t\t\t}\n\n\t\t\t\tpmw.addProductToCart(productId, 1);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// If is simple product\n\t\t\tif (pmwDataLayer.shop.product_type === \"simple\") {\n\n\t\t\t\tif (quantity === null) {\n\t\t\t\t\tquantity = Number(jQuery(\".input-text.qty\").val()) ? Number(jQuery(\".input-text.qty\").val()) : 1;\n\t\t\t\t}\n\n\t\t\t\tif (!productId) {\n\t\t\t\t\tproductId = jQuery(event.currentTarget).val();\n\t\t\t\t}\n\n\t\t\t\t// Fallback if the body selector is used\n\t\t\t\tif (!productId) {\n\t\t\t\t\t// get the product ID from the element that has the class .product\n\t\t\t\t\t// that element will also have an ID that start with product- and ends with the product ID\n\t\t\t\t\t// example: product-123\n\t\t\t\t\t// save the product ID in the variable productId\n\t\t\t\t\tproductId = jQuery(\".product\").attr(\"id\").replace(\"product-\", \"\");\n\t\t\t\t}\n\n\t\t\t\tpmw.addProductToCart(productId, quantity);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// If is variable product or variable-subscription\n\t\t\tif ([\"variable\", \"variable-subscription\"].indexOf(pmwDataLayer.shop.product_type) >= 0) {\n\n\t\t\t\tif (quantity === null) {\n\t\t\t\t\tquantity = Number(jQuery(\".input-text.qty\").val()) ? Number(jQuery(\".input-text.qty\").val()) : 1;\n\t\t\t\t}\n\n\t\t\t\tif (!productId) {\n\t\t\t\t\tproductId = jQuery(\"[name='variation_id']\").val();\n\t\t\t\t}\n\n\t\t\t\tpmw.addProductToCart(productId, quantity);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// If is grouped product\n\t\t\tif (pmwDataLayer.shop.product_type === \"grouped\") {\n\n\t\t\t\tjQuery(\".woocommerce-grouped-product-list-item\").each((index, element) => {\n\n\t\t\t\t\t// Can't rely on event.target.dataset as it always is sent with the parent product ID and the quantity 1\n\n\t\t\t\t\tquantity = Number(jQuery(element).find(\".input-text.qty\").val()) ? Number(jQuery(element).find(\".input-text.qty\").val()) : 1;\n\n\t\t\t\t\tlet classes = jQuery(element).attr(\"class\");\n\t\t\t\t\tproductId = pmw.getPostIdFromString(classes);\n\n\t\t\t\t\tpmw.addProductToCart(productId, quantity);\n\t\t\t\t});\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// If is bundle product\n\t\t\tif (pmwDataLayer.shop.product_type === \"bundle\") {\n\n\t\t\t\tif (quantity === null) {\n\t\t\t\t\tquantity = Number(jQuery(\".input-text.qty\").val()) ? Number(jQuery(\".input-text.qty\").val()) : 1;\n\t\t\t\t}\n\n\t\t\t\tif (!productId) {\n\t\t\t\t\tproductId = jQuery(\"input[name=add-to-cart]\").val();\n\t\t\t\t}\n\n\t\t\t\tpmw.addProductToCart(productId, quantity);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// everything else\n\t\t\tif (quantity === null) {\n\t\t\t\tquantity = Number(jQuery(\".input-text.qty\").val()) ? Number(jQuery(\".input-text.qty\").val()) : 1;\n\t\t\t}\n\n\t\t\tpmw.addProductToCart(productId, quantity);\n\n\t\t} else {\n\n\t\t\tif (quantity === null) {\n\t\t\t\tquantity = 1;\n\t\t\t}\n\n\t\t\tif (!productId) {\n\t\t\t\t// console.log(\"add to cart event.currentTarget\", event.currentTarget)\n\t\t\t\tproductId = jQuery(event.currentTarget).data(\"product_id\") ? jQuery(event.currentTarget).data(\"product_id\") : null;\n\t\t\t}\n\n\t\t\t// Another fallback to retrieve the product ID in case the ID is saved in the value attribute\n\t\t\tif (!productId) {\n\t\t\t\tproductId = jQuery(event.currentTarget).val() ? jQuery(event.currentTarget).val() : null;\n\t\t\t}\n\n\t\t\tif (\n\t\t\t\tproductId\n\t\t\t\t&& quantity\n\t\t\t) {\n\t\t\t\tpmw.addProductToCart(productId, quantity);\n\t\t\t}\n\t\t}\n\n\t} catch (e) {\n\t\tconsole.error(e);\n\t}\n});\n\n\n/**\n * If someone clicks anywhere on a custom /?add-to-cart=123 link\n * trigger the add to cart event\n */\n\n// jQuery(document).one(\"click\", \"a:not(.add_to_cart_button, .ajax_add_to_cart, .single_add_to_cart_button)\", (event) => {\njQuery(\"a:not(.add_to_cart_button, .ajax_add_to_cart, .single_add_to_cart_button)\").one(\"click\", (event) => {\n\n\ttry {\n\t\tif (jQuery(event.target).closest(\"a\").attr(\"href\")) {\n\n\t\t\tlet url = new URL(jQuery(event.currentTarget).attr(\"href\"), window.location.origin);\n\n\t\t\tif (url.searchParams.has(\"add-to-cart\")) {\n\n\t\t\t\tlet productId = url.searchParams.get(\"add-to-cart\");\n\t\t\t\tlet quantity = url.searchParams.has(\"quantity\") ? parseInt(url.searchParams.get(\"quantity\"), 10) : 1;\n\t\t\t\tpmw.addProductToCart(productId, quantity);\n\t\t\t}\n\t\t}\n\t} catch (e) {\n\t\tconsole.error(e);\n\t}\n});\n\n// select item event\n// jQuery(document).on(\"click\", \".woocommerce-LoopProduct-link, .wc-block-grid__product, .product, .product-small, .type-product\", (event) => {\njQuery(\".woocommerce-LoopProduct-link, .wc-block-grid__product, .product, .product-small, .type-product\").on(\"click\", (event) => {\n\n\ttry {\n\n\t\t/**\n\t\t * On some pages the event fires multiple times, and on product pages\n\t\t * even on page load. Using e.stopPropagation helps to prevent this,\n\t\t * but I don't know why. We don't even have to use this, since only a real\n\t\t * product click yields a valid productId. So we filter the invalid click\n\t\t * events out later down in the code. I'll keep it that way because this is\n\t\t * the most compatible way across shops.\n\t\t *\n\t\t * e.stopPropagation();\n\t\t * */\n\n\t\tlet productId = jQuery(event.currentTarget).nextAll(\".pmwProductId:first\").data(\"id\");\n\n\t\t/**\n\t\t * On product pages, for some reason, the click event is triggered on the main product on page load.\n\t\t * In that case no ID is found. But we can discard it, since we only want to trigger the event on\n\t\t * related products, which are found below.\n\t\t */\n\n\t\tif (productId) {\n\n\t\t\tproductId = pmw.getIdBasedOndVariationsOutputSetting(productId);\n\n\t\t\tif (!productId) throw Error(\"Wasn't able to retrieve a productId\");\n\n\t\t\tif (pmwDataLayer.products && pmwDataLayer.products[productId]) {\n\n\t\t\t\tlet product = pmw.getProductDetailsFormattedForEvent(productId);\n\n\t\t\t\tjQuery(document).trigger(\"pmw:select-item\", product);\n\t\t\t}\n\t\t}\n\t} catch (e) {\n\t\tconsole.error(e);\n\t}\n});\n\n\n// checkout_progress event\n// track checkout option event: entered valid billing email\n// jQuery(document).on(\"input\", \"#billing_email\", (event) => {\njQuery(\"#billing_email\").on(\"input\", (event) => {\n\n\tif (pmw.isEmail(jQuery(event.currentTarget).val())) {\n\t\t// pmw.fireCheckoutOption(2);\n\t\tpmw.fireCheckoutProgress(2);\n\t\tpmw.emailSelected = true;\n\t}\n});\n\n\n/**\n * Place order button\n *\n * Track checkout option event: purchase click\n * https://stackoverflow.com/a/34112407/4688612\n * jQuery(document).one(\"click\", \"#place_order\", () => {\n *\n * Has to be hooked after document ready !\n */\njQuery(\"form.checkout\").on(\"checkout_place_order_success\", () => {\n\n\t// console log current time\n\t// console.log(\"checkout_place_order_success event fired at: \" + new Date().getTime())\n\n\tif (false === pmw.emailSelected) {\n\t\tpmw.fireCheckoutProgress(2);\n\t}\n\n\tif (false === pmw.paymentMethodSelected) {\n\t\tpmw.fireCheckoutProgress(3);\n\t\tpmw.fireCheckoutOption(3, jQuery(\"input[name='payment_method']:checked\").val());\n\t}\n\n\tpmw.fireCheckoutProgress(4);\n\n\tjQuery(document).trigger(\"pmw:place-order\", {});\n});\n\n/**\n * Update cart event\n *\n * Has to be hooked after document ready !\n */\njQuery(document).on(\"click\", \"[name='update_cart']\", () => {\n\n\ttry {\n\t\tjQuery(\".cart_item\").each((index, element) => {\n\n\t\t\tconst productId = pmw.getProductIdByCartItemElement(element);\n\n\t\t\tif (!productId) {\n\t\t\t\tconsole.error(\"Pixel Manager: Wasn't able to retrieve a productId\");\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst quantity = pmw.getProductQuantityByCartItemElement(element);\n\n\t\t\tif (!quantity) {\n\t\t\t\tconsole.error(\"Pixel Manager: Wasn't able to retrieve a quantity\");\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// console.log(\"productId\", productId)\n\t\t\t// console.log(\"quantity\", quantity)\n\n\t\t\tif (quantity === 0) {\n\t\t\t\tpmw.removeProductFromCart(productId);\n\t\t\t} else if (quantity < pmwDataLayer.cart[productId].quantity) {\n\t\t\t\tpmw.removeProductFromCart(productId, pmwDataLayer.cart[productId].quantity - quantity);\n\t\t\t} else if (quantity > pmwDataLayer.cart[productId].quantity) {\n\t\t\t\tpmw.addProductToCart(productId, quantity - pmwDataLayer.cart[productId].quantity);\n\t\t\t}\n\t\t});\n\t} catch (e) {\n\t\tconsole.error(e);\n\t\tpmw.getCartItemsFromBackend();\n\t}\n});\n\n// Supports the following plugins:\n// WooCommerce Wishlist: https://woo.com/products/woocommerce-wishlists/\n// YITH WooCommerce Wishlist: https://wordpress.org/plugins/yith-woocommerce-wishlist/\n// add_to_wishlist\njQuery(\".add_to_wishlist,.wl-add-to\").on(\"click\", event => {\n\n\ttry {\n\n\t\tlet productId;\n\n\t\tif (jQuery(event.currentTarget).data(\"productid\")) { // for the WooCommerce wishlist plugin\n\n\t\t\tproductId = jQuery(event.currentTarget).data(\"productid\");\n\t\t} else if (jQuery(event.currentTarget).data(\"product-id\")) { // for the YITH wishlist plugin\n\n\t\t\tproductId = jQuery(event.currentTarget).data(\"product-id\");\n\t\t}\n\n\t\tif (!productId) throw Error(\"Wasn't able to retrieve a productId\");\n\n\t\tlet product = pmw.getProductDetailsFormattedForEvent(productId);\n\n\n\t\tjQuery(document).trigger(\"pmw:add-to-wishlist\", product);\n\t} catch (e) {\n\t\tconsole.error(e);\n\t}\n});\n\n\n/**\n * Called when the user selects all the required dropdowns / attributes\n *\n * Replaced by code in the event_listeners.js file in case of lazy loading\n *\n * Has to be hooked after document ready !\n *\n * https://stackoverflow.com/a/27849208/4688612\n * https://stackoverflow.com/a/65065335/4688612\n *\n */\n\nif (!pmwDataLayer?.general?.lazy_load_pmw) {\n\tpmw.registerShowVariationEventListener();\n}\n\n\n/**\n * Called on variable products when no selection has been done yet\n * or when the visitor deselects his choice.\n *\n * Has to be hooked after document ready !\n */\n\n// jQuery(function () {\n//\n// \tjQuery(\".single_variation_wrap\").on(\"hide_variation\", function () {\n//\n// \t\ttry {\n// \t\t\tlet classes = jQuery(\"body\").attr(\"class\")\n// \t\t\tlet productId = classes.match(/(postid-)(\\d+)/)[2]\n//\n// \t\t\tif (!productId) throw Error(\"Wasn't able to retrieve a productId\")\n//\n// \t\t\t/**\n// \t\t\t * If we have a variable product with no preset,\n// \t\t\t * and variations output is enabled,\n// \t\t\t * then we send a viewItem event with the first\n// \t\t\t * variation we find for the parent.\n// \t\t\t * If variations output is disabled,\n// \t\t\t * we just send the parent ID.\n// \t\t\t *\n// \t\t\t * And if Facebook microdata is active, use the\n// \t\t\t * microdata product ID.\n// \t\t\t */\n//\n// \t\t\tif (\n// \t\t\t\t\"variable\" === pmwDataLayer.shop.product_type &&\n// \t\t\t\tpmwDataLayer?.shop?.variations_output\n// \t\t\t) {\n// \t\t\t\tfor (const [key, product] of Object.entries(pmwDataLayer.products)) {\n// \t\t\t\t\tif (\"parent_id\" in product) {\n//\n// \t\t\t\t\t\tproductId = product.id\n// \t\t\t\t\t\tbreak\n// \t\t\t\t\t}\n// \t\t\t\t}\n//\n// \t\t\t\tif (pmwDataLayer?.pixels?.facebook?.microdata_product_id) {\n// \t\t\t\t\tproductId = pmwDataLayer.pixels.facebook.microdata_product_id\n// \t\t\t\t}\n// \t\t\t}\n//\n// \t\t\t// console.log(\"hmm\")\n// \t\t\tpmw.triggerViewItemEventPrep(productId)\n//\n// \t\t} catch (e) {\n// \t\t\tconsole.error(e)\n// \t\t}\n// \t})\n// })\n\n// jQuery(function () {\n//\n// \tjQuery(\".single_variation_wrap\").on(\"hide_variation\", function () {\n// \t\tjQuery(document).trigger(\"pmw:view-item\")\n// \t})\n// })\n","(function (pmw, $, undefined) {\n\n\tconst PMW_LIBRARY_VERSION = \"1.56.0\"\n\n\tpmw.getLibraryVersion = () => {\n\t\treturn PMW_LIBRARY_VERSION\n\t}\n\n\tpmw.checkLibraryVersion = () => {\n\n\t\tif (pmw.getLibraryVersion() !== pmwDataLayer?.version?.number) {\n\t\t\tconsole.error(`Pixel Manager: The library version ${pmw.getLibraryVersion()} and pmwDataLayer.version.number ${pmwDataLayer.version.number} do not match. Delete the server-side cache and try again.`)\n\t\t}\n\t}\n\n}(window.pmw = window.pmw || {}, jQuery))\n\n","/**\n * Pixel Registry\n *\n * Central registry for managing pixel configurations and adapters.\n * Provides methods to query which pixels are active and retrieve their adapters.\n *\n * Firing Modes:\n * - browser_only: Fire only in browser (Microsoft Ads, Taboola)\n * - server_only: Fire only server-side, suppress browser pixel (admin choice)\n * - both: Fire both browser and server with event_id for deduplication (Facebook, TikTok)\n * - browser_or_server: Fire one or the other, never both (GA4 purchase)\n *\n * @since 1.51.0\n */\n\n(function (pmw, $, undefined) {\n\n\t/**\n\t * Valid firing modes\n\t * @type {string[]}\n\t */\n\tconst VALID_FIRING_MODES = [\"browser_only\", \"server_only\", \"both\", \"browser_or_server\"];\n\n\t/**\n\t * Default firing mode for pixels that don't specify one\n\t * @type {string}\n\t */\n\tconst DEFAULT_FIRING_MODE = \"browser_only\";\n\n\t/**\n\t * Pixel Registry namespace\n\t */\n\tpmw.pixelRegistry = {\n\n\t\t/**\n\t\t * Get all active pixels (both browser-only and S2S-capable)\n\t\t *\n\t\t * Queries each registered adapter's isActive function to determine\n\t\t * if the pixel should be loaded based on pmwDataLayer configuration.\n\t\t *\n\t\t * @returns {string[]} Array of active pixel names\n\t\t */\n\t\tgetActivePixels() {\n\t\t\tconst activePixels = [];\n\n\t\t\tif (!pmw.pixelCapabilities) {\n\t\t\t\treturn activePixels;\n\t\t\t}\n\n\t\t\t// Check each registered pixel's isActive function\n\t\t\tfor (const [pixelName, capabilities] of Object.entries(pmw.pixelCapabilities)) {\n\t\t\t\tif (typeof capabilities.isActive === \"function\") {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tif (capabilities.isActive()) {\n\t\t\t\t\t\t\tactivePixels.push(pixelName);\n\t\t\t\t\t\t}\n\t\t\t\t\t} catch (e) {\n\t\t\t\t\t\tpmw.console.error(`Error checking if ${pixelName} is active:`, e);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn activePixels;\n\t\t},\n\n\t\t/**\n\t\t * Get browser-only pixels (pixels that don't support S2S)\n\t\t *\n\t\t * @returns {string[]} Array of browser-only pixel names\n\t\t */\n\t\tgetActiveBrowserOnlyPixels() {\n\t\t\tconst browserPixels = [];\n\t\t\tconst activePixels = this.getActivePixels();\n\n\t\t\tfor (const pixelName of activePixels) {\n\t\t\t\t// If pixel doesn't support S2S, it's browser-only\n\t\t\t\tif (pmw.pixelCapabilities?.[pixelName]?.supportsS2S !== true) {\n\t\t\t\t\tbrowserPixels.push(pixelName);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn browserPixels;\n\t\t},\n\n\t\t/**\n\t\t * Get S2S-capable pixels\n\t\t *\n\t\t * Returns pixels that declared supportsS2S capability when registering.\n\t\t * These pixels ALWAYS receive the pmw:s2s:* events to fire their browser pixels (fbq, ttq, etc.),\n\t\t * regardless of whether S2S is actually enabled. They handle their own S2S logic internally.\n\t\t *\n\t\t * @returns {string[]} Array of S2S pixel names\n\t\t */\n\t\tgetActiveS2SPixels() {\n\t\t\tconst s2sPixels = [];\n\t\t\tconst activePixels = this.getActivePixels();\n\n\t\t\t// Check each active pixel's capabilities\n\t\t\tfor (const pixelName of activePixels) {\n\t\t\t\t// Check if this pixel declared supportsS2S capability when registering\n\t\t\t\tif (pmw.pixelCapabilities?.[pixelName]?.supportsS2S === true) {\n\t\t\t\t\ts2sPixels.push(pixelName);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn s2sPixels;\n\t\t},\n\n\t\t/**\n\t\t * Get adapter for a specific pixel\n\t\t *\n\t\t * @param {string} pixelName - The pixel name (e.g., 'facebook', 'google_ads')\n\t\t * @returns {object|null} The adapter object or null if not found\n\t\t */\n\t\tgetAdapter(pixelName) {\n\t\t\tif (!pmw.adapters) {\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\treturn pmw.adapters[pixelName] || null;\n\t\t},\n\n\t\t/**\n\t\t * Get active pixels with a specific capability\n\t\t *\n\t\t * Returns pixels that have the specified capability flag set to true.\n\t\t * This is a generic method that allows querying any capability\n\t\t * without needing dedicated methods for each one.\n\t\t *\n\t\t * @param {string} capabilityName - The capability to check (e.g., 'supportsS2S', 'supportsPageViewS2S')\n\t\t * @returns {string[]} Array of pixel names with the specified capability\n\t\t *\n\t\t * @example\n\t\t * // Get all pixels that support page view S2S\n\t\t * pmw.pixelRegistry.getPixelsWithCapability('supportsPageViewS2S')\n\t\t * // Returns: ['facebook', 'snapchat', 'reddit']\n\t\t */\n\t\tgetPixelsWithCapability(capabilityName) {\n\t\t\tconst pixelsWithCapability = [];\n\t\t\tconst activePixels = this.getActivePixels();\n\n\t\t\tfor (const pixelName of activePixels) {\n\t\t\t\tif (pmw.pixelCapabilities?.[pixelName]?.[capabilityName] === true) {\n\t\t\t\t\tpixelsWithCapability.push(pixelName);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn pixelsWithCapability;\n\t\t},\n\n\t\t/**\n\t\t * Get the firing mode for a specific pixel\n\t\t *\n\t\t * Returns the registered firing mode for the pixel. The mode determines\n\t\t * whether events fire in browser, server, or both.\n\t\t *\n\t\t * @param {string} pixelName - The pixel name\n\t\t * @returns {string} The firing mode (browser_only, server_only, both, browser_or_server)\n\t\t */\n\t\tgetFiringMode(pixelName) {\n\t\t\tconst mode = pmw.pixelCapabilities?.[pixelName]?.mode;\n\n\t\t\t// Validate mode is one of the allowed values\n\t\t\tif (mode && VALID_FIRING_MODES.includes(mode)) {\n\t\t\t\treturn mode;\n\t\t\t}\n\n\t\t\t// Legacy support: if supportsS2S is true but no mode specified, default to 'both'\n\t\t\tif (pmw.pixelCapabilities?.[pixelName]?.supportsS2S === true) {\n\t\t\t\treturn \"both\";\n\t\t\t}\n\n\t\t\treturn DEFAULT_FIRING_MODE;\n\t\t},\n\n\t\t/**\n\t\t * Determine whether browser and/or server should fire for a pixel/event combination\n\t\t *\n\t\t * This is the core method for the unified firing mode system. It considers:\n\t\t * - The pixel's registered firing mode\n\t\t * - Whether S2S is globally enabled\n\t\t * - Any filters that modify firing behavior\n\t\t *\n\t\t * @param {string} pixelName - The pixel name\n\t\t * @param {string} eventName - The event name (e.g., 'add_to_cart', 'purchase')\n\t\t * @returns {object} { fire_browser: boolean, fire_server: boolean }\n\t\t */\n\t\tgetFiringDecision(pixelName, eventName) {\n\t\t\tconst mode = this.getFiringMode(pixelName);\n\t\t\tconst s2sEnabled = pmwDataLayer?.general?.server_2_server?.active === true;\n\t\t\tconst supportsS2S = pmw.pixelCapabilities?.[pixelName]?.supportsS2S === true;\n\n\t\t\tlet decision = {\n\t\t\t\tfire_browser: true,\n\t\t\t\tfire_server : false,\n\t\t\t};\n\n\t\t\tswitch (mode) {\n\t\t\t\tcase \"browser_only\":\n\t\t\t\t\tdecision = {fire_browser: true, fire_server: false};\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase \"server_only\":\n\t\t\t\t\t// Server only fires if S2S is enabled AND pixel supports it\n\t\t\t\t\tdecision = {\n\t\t\t\t\t\tfire_browser: false,\n\t\t\t\t\t\tfire_server : s2sEnabled && supportsS2S,\n\t\t\t\t\t};\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase \"both\":\n\t\t\t\t\t// Browser always fires, server fires if enabled\n\t\t\t\t\tdecision = {\n\t\t\t\t\t\tfire_browser: true,\n\t\t\t\t\t\tfire_server : s2sEnabled && supportsS2S,\n\t\t\t\t\t};\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase \"browser_or_server\":\n\t\t\t\t\t// If S2S enabled and supported, use server; otherwise browser\n\t\t\t\t\tif (s2sEnabled && supportsS2S) {\n\t\t\t\t\t\tdecision = {fire_browser: false, fire_server: true};\n\t\t\t\t\t} else {\n\t\t\t\t\t\tdecision = {fire_browser: true, fire_server: false};\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\t// Apply filter to allow external modification of firing behavior\n\t\t\t// Use case: Force server-only for specific pixels, disable certain pixels per-event\n\t\t\tdecision = pmw.hooks.applyFilters(\n\t\t\t\t\"pmw_pixel_firing_decision\",\n\t\t\t\tdecision,\n\t\t\t\tpixelName,\n\t\t\t\teventName,\n\t\t\t\tmode,\n\t\t\t);\n\n\t\t\treturn decision;\n\t\t},\n\n\t\t/**\n\t\t * Get all pixels that should fire in browser for a specific event\n\t\t *\n\t\t * @param {string} eventName - The event name\n\t\t * @returns {string[]} Array of pixel names that should fire in browser\n\t\t */\n\t\tgetPixelsForBrowserFiring(eventName) {\n\t\t\tconst pixels = [];\n\t\t\tconst activePixels = this.getActivePixels();\n\n\t\t\tfor (const pixelName of activePixels) {\n\t\t\t\tconst decision = this.getFiringDecision(pixelName, eventName);\n\t\t\t\tif (decision.fire_browser) {\n\t\t\t\t\tpixels.push(pixelName);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn pixels;\n\t\t},\n\n\t\t/**\n\t\t * Get all pixels that should fire server-side for a specific event\n\t\t *\n\t\t * @param {string} eventName - The event name\n\t\t * @returns {string[]} Array of pixel names that should fire server-side\n\t\t */\n\t\tgetPixelsForServerFiring(eventName) {\n\t\t\tconst pixels = [];\n\t\t\tconst activePixels = this.getActivePixels();\n\n\t\t\tfor (const pixelName of activePixels) {\n\t\t\t\tconst decision = this.getFiringDecision(pixelName, eventName);\n\t\t\t\tif (decision.fire_server) {\n\t\t\t\t\tpixels.push(pixelName);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn pixels;\n\t\t},\n\t};\n\n}(window.pmw = window.pmw || {}, jQuery));",null,null,"(function() {\n var expandIPv6, ipaddr, ipv4Part, ipv4Regexes, ipv6Part, ipv6Regexes, matchCIDR, root, zoneIndex;\n\n ipaddr = {};\n\n root = this;\n\n if ((typeof module !== \"undefined\" && module !== null) && module.exports) {\n module.exports = ipaddr;\n } else {\n root['ipaddr'] = ipaddr;\n }\n\n matchCIDR = function(first, second, partSize, cidrBits) {\n var part, shift;\n if (first.length !== second.length) {\n throw new Error(\"ipaddr: cannot match CIDR for objects with different lengths\");\n }\n part = 0;\n while (cidrBits > 0) {\n shift = partSize - cidrBits;\n if (shift < 0) {\n shift = 0;\n }\n if (first[part] >> shift !== second[part] >> shift) {\n return false;\n }\n cidrBits -= partSize;\n part += 1;\n }\n return true;\n };\n\n ipaddr.subnetMatch = function(address, rangeList, defaultName) {\n var k, len, rangeName, rangeSubnets, subnet;\n if (defaultName == null) {\n defaultName = 'unicast';\n }\n for (rangeName in rangeList) {\n rangeSubnets = rangeList[rangeName];\n if (rangeSubnets[0] && !(rangeSubnets[0] instanceof Array)) {\n rangeSubnets = [rangeSubnets];\n }\n for (k = 0, len = rangeSubnets.length; k < len; k++) {\n subnet = rangeSubnets[k];\n if (address.kind() === subnet[0].kind()) {\n if (address.match.apply(address, subnet)) {\n return rangeName;\n }\n }\n }\n }\n return defaultName;\n };\n\n ipaddr.IPv4 = (function() {\n function IPv4(octets) {\n var k, len, octet;\n if (octets.length !== 4) {\n throw new Error(\"ipaddr: ipv4 octet count should be 4\");\n }\n for (k = 0, len = octets.length; k < len; k++) {\n octet = octets[k];\n if (!((0 <= octet && octet <= 255))) {\n throw new Error(\"ipaddr: ipv4 octet should fit in 8 bits\");\n }\n }\n this.octets = octets;\n }\n\n IPv4.prototype.kind = function() {\n return 'ipv4';\n };\n\n IPv4.prototype.toString = function() {\n return this.octets.join(\".\");\n };\n\n IPv4.prototype.toNormalizedString = function() {\n return this.toString();\n };\n\n IPv4.prototype.toByteArray = function() {\n return this.octets.slice(0);\n };\n\n IPv4.prototype.match = function(other, cidrRange) {\n var ref;\n if (cidrRange === void 0) {\n ref = other, other = ref[0], cidrRange = ref[1];\n }\n if (other.kind() !== 'ipv4') {\n throw new Error(\"ipaddr: cannot match ipv4 address with non-ipv4 one\");\n }\n return matchCIDR(this.octets, other.octets, 8, cidrRange);\n };\n\n IPv4.prototype.SpecialRanges = {\n unspecified: [[new IPv4([0, 0, 0, 0]), 8]],\n broadcast: [[new IPv4([255, 255, 255, 255]), 32]],\n multicast: [[new IPv4([224, 0, 0, 0]), 4]],\n linkLocal: [[new IPv4([169, 254, 0, 0]), 16]],\n loopback: [[new IPv4([127, 0, 0, 0]), 8]],\n carrierGradeNat: [[new IPv4([100, 64, 0, 0]), 10]],\n \"private\": [[new IPv4([10, 0, 0, 0]), 8], [new IPv4([172, 16, 0, 0]), 12], [new IPv4([192, 168, 0, 0]), 16]],\n reserved: [[new IPv4([192, 0, 0, 0]), 24], [new IPv4([192, 0, 2, 0]), 24], [new IPv4([192, 88, 99, 0]), 24], [new IPv4([198, 51, 100, 0]), 24], [new IPv4([203, 0, 113, 0]), 24], [new IPv4([240, 0, 0, 0]), 4]]\n };\n\n IPv4.prototype.range = function() {\n return ipaddr.subnetMatch(this, this.SpecialRanges);\n };\n\n IPv4.prototype.toIPv4MappedAddress = function() {\n return ipaddr.IPv6.parse(\"::ffff:\" + (this.toString()));\n };\n\n IPv4.prototype.prefixLengthFromSubnetMask = function() {\n var cidr, i, k, octet, stop, zeros, zerotable;\n zerotable = {\n 0: 8,\n 128: 7,\n 192: 6,\n 224: 5,\n 240: 4,\n 248: 3,\n 252: 2,\n 254: 1,\n 255: 0\n };\n cidr = 0;\n stop = false;\n for (i = k = 3; k >= 0; i = k += -1) {\n octet = this.octets[i];\n if (octet in zerotable) {\n zeros = zerotable[octet];\n if (stop && zeros !== 0) {\n return null;\n }\n if (zeros !== 8) {\n stop = true;\n }\n cidr += zeros;\n } else {\n return null;\n }\n }\n return 32 - cidr;\n };\n\n return IPv4;\n\n })();\n\n ipv4Part = \"(0?\\\\d+|0x[a-f0-9]+)\";\n\n ipv4Regexes = {\n fourOctet: new RegExp(\"^\" + ipv4Part + \"\\\\.\" + ipv4Part + \"\\\\.\" + ipv4Part + \"\\\\.\" + ipv4Part + \"$\", 'i'),\n longValue: new RegExp(\"^\" + ipv4Part + \"$\", 'i')\n };\n\n ipaddr.IPv4.parser = function(string) {\n var match, parseIntAuto, part, shift, value;\n parseIntAuto = function(string) {\n if (string[0] === \"0\" && string[1] !== \"x\") {\n return parseInt(string, 8);\n } else {\n return parseInt(string);\n }\n };\n if (match = string.match(ipv4Regexes.fourOctet)) {\n return (function() {\n var k, len, ref, results;\n ref = match.slice(1, 6);\n results = [];\n for (k = 0, len = ref.length; k < len; k++) {\n part = ref[k];\n results.push(parseIntAuto(part));\n }\n return results;\n })();\n } else if (match = string.match(ipv4Regexes.longValue)) {\n value = parseIntAuto(match[1]);\n if (value > 0xffffffff || value < 0) {\n throw new Error(\"ipaddr: address outside defined range\");\n }\n return ((function() {\n var k, results;\n results = [];\n for (shift = k = 0; k <= 24; shift = k += 8) {\n results.push((value >> shift) & 0xff);\n }\n return results;\n })()).reverse();\n } else {\n return null;\n }\n };\n\n ipaddr.IPv6 = (function() {\n function IPv6(parts, zoneId) {\n var i, k, l, len, part, ref;\n if (parts.length === 16) {\n this.parts = [];\n for (i = k = 0; k <= 14; i = k += 2) {\n this.parts.push((parts[i] << 8) | parts[i + 1]);\n }\n } else if (parts.length === 8) {\n this.parts = parts;\n } else {\n throw new Error(\"ipaddr: ipv6 part count should be 8 or 16\");\n }\n ref = this.parts;\n for (l = 0, len = ref.length; l < len; l++) {\n part = ref[l];\n if (!((0 <= part && part <= 0xffff))) {\n throw new Error(\"ipaddr: ipv6 part should fit in 16 bits\");\n }\n }\n if (zoneId) {\n this.zoneId = zoneId;\n }\n }\n\n IPv6.prototype.kind = function() {\n return 'ipv6';\n };\n\n IPv6.prototype.toString = function() {\n return this.toNormalizedString().replace(/((^|:)(0(:|$))+)/, '::');\n };\n\n IPv6.prototype.toRFC5952String = function() {\n var bestMatchIndex, bestMatchLength, match, regex, string;\n regex = /((^|:)(0(:|$)){2,})/g;\n string = this.toNormalizedString();\n bestMatchIndex = 0;\n bestMatchLength = -1;\n while ((match = regex.exec(string))) {\n if (match[0].length > bestMatchLength) {\n bestMatchIndex = match.index;\n bestMatchLength = match[0].length;\n }\n }\n if (bestMatchLength < 0) {\n return string;\n }\n return string.substring(0, bestMatchIndex) + '::' + string.substring(bestMatchIndex + bestMatchLength);\n };\n\n IPv6.prototype.toByteArray = function() {\n var bytes, k, len, part, ref;\n bytes = [];\n ref = this.parts;\n for (k = 0, len = ref.length; k < len; k++) {\n part = ref[k];\n bytes.push(part >> 8);\n bytes.push(part & 0xff);\n }\n return bytes;\n };\n\n IPv6.prototype.toNormalizedString = function() {\n var addr, part, suffix;\n addr = ((function() {\n var k, len, ref, results;\n ref = this.parts;\n results = [];\n for (k = 0, len = ref.length; k < len; k++) {\n part = ref[k];\n results.push(part.toString(16));\n }\n return results;\n }).call(this)).join(\":\");\n suffix = '';\n if (this.zoneId) {\n suffix = '%' + this.zoneId;\n }\n return addr + suffix;\n };\n\n IPv6.prototype.toFixedLengthString = function() {\n var addr, part, suffix;\n addr = ((function() {\n var k, len, ref, results;\n ref = this.parts;\n results = [];\n for (k = 0, len = ref.length; k < len; k++) {\n part = ref[k];\n results.push(part.toString(16).padStart(4, '0'));\n }\n return results;\n }).call(this)).join(\":\");\n suffix = '';\n if (this.zoneId) {\n suffix = '%' + this.zoneId;\n }\n return addr + suffix;\n };\n\n IPv6.prototype.match = function(other, cidrRange) {\n var ref;\n if (cidrRange === void 0) {\n ref = other, other = ref[0], cidrRange = ref[1];\n }\n if (other.kind() !== 'ipv6') {\n throw new Error(\"ipaddr: cannot match ipv6 address with non-ipv6 one\");\n }\n return matchCIDR(this.parts, other.parts, 16, cidrRange);\n };\n\n IPv6.prototype.SpecialRanges = {\n unspecified: [new IPv6([0, 0, 0, 0, 0, 0, 0, 0]), 128],\n linkLocal: [new IPv6([0xfe80, 0, 0, 0, 0, 0, 0, 0]), 10],\n multicast: [new IPv6([0xff00, 0, 0, 0, 0, 0, 0, 0]), 8],\n loopback: [new IPv6([0, 0, 0, 0, 0, 0, 0, 1]), 128],\n uniqueLocal: [new IPv6([0xfc00, 0, 0, 0, 0, 0, 0, 0]), 7],\n ipv4Mapped: [new IPv6([0, 0, 0, 0, 0, 0xffff, 0, 0]), 96],\n rfc6145: [new IPv6([0, 0, 0, 0, 0xffff, 0, 0, 0]), 96],\n rfc6052: [new IPv6([0x64, 0xff9b, 0, 0, 0, 0, 0, 0]), 96],\n '6to4': [new IPv6([0x2002, 0, 0, 0, 0, 0, 0, 0]), 16],\n teredo: [new IPv6([0x2001, 0, 0, 0, 0, 0, 0, 0]), 32],\n reserved: [[new IPv6([0x2001, 0xdb8, 0, 0, 0, 0, 0, 0]), 32]]\n };\n\n IPv6.prototype.range = function() {\n return ipaddr.subnetMatch(this, this.SpecialRanges);\n };\n\n IPv6.prototype.isIPv4MappedAddress = function() {\n return this.range() === 'ipv4Mapped';\n };\n\n IPv6.prototype.toIPv4Address = function() {\n var high, low, ref;\n if (!this.isIPv4MappedAddress()) {\n throw new Error(\"ipaddr: trying to convert a generic ipv6 address to ipv4\");\n }\n ref = this.parts.slice(-2), high = ref[0], low = ref[1];\n return new ipaddr.IPv4([high >> 8, high & 0xff, low >> 8, low & 0xff]);\n };\n\n IPv6.prototype.prefixLengthFromSubnetMask = function() {\n var cidr, i, k, part, stop, zeros, zerotable;\n zerotable = {\n 0: 16,\n 32768: 15,\n 49152: 14,\n 57344: 13,\n 61440: 12,\n 63488: 11,\n 64512: 10,\n 65024: 9,\n 65280: 8,\n 65408: 7,\n 65472: 6,\n 65504: 5,\n 65520: 4,\n 65528: 3,\n 65532: 2,\n 65534: 1,\n 65535: 0\n };\n cidr = 0;\n stop = false;\n for (i = k = 7; k >= 0; i = k += -1) {\n part = this.parts[i];\n if (part in zerotable) {\n zeros = zerotable[part];\n if (stop && zeros !== 0) {\n return null;\n }\n if (zeros !== 16) {\n stop = true;\n }\n cidr += zeros;\n } else {\n return null;\n }\n }\n return 128 - cidr;\n };\n\n return IPv6;\n\n })();\n\n ipv6Part = \"(?:[0-9a-f]+::?)+\";\n\n zoneIndex = \"%[0-9a-z]{1,}\";\n\n ipv6Regexes = {\n zoneIndex: new RegExp(zoneIndex, 'i'),\n \"native\": new RegExp(\"^(::)?(\" + ipv6Part + \")?([0-9a-f]+)?(::)?(\" + zoneIndex + \")?$\", 'i'),\n transitional: new RegExp((\"^((?:\" + ipv6Part + \")|(?:::)(?:\" + ipv6Part + \")?)\") + (ipv4Part + \"\\\\.\" + ipv4Part + \"\\\\.\" + ipv4Part + \"\\\\.\" + ipv4Part) + (\"(\" + zoneIndex + \")?$\"), 'i')\n };\n\n expandIPv6 = function(string, parts) {\n var colonCount, lastColon, part, replacement, replacementCount, zoneId;\n if (string.indexOf('::') !== string.lastIndexOf('::')) {\n return null;\n }\n zoneId = (string.match(ipv6Regexes['zoneIndex']) || [])[0];\n if (zoneId) {\n zoneId = zoneId.substring(1);\n string = string.replace(/%.+$/, '');\n }\n colonCount = 0;\n lastColon = -1;\n while ((lastColon = string.indexOf(':', lastColon + 1)) >= 0) {\n colonCount++;\n }\n if (string.substr(0, 2) === '::') {\n colonCount--;\n }\n if (string.substr(-2, 2) === '::') {\n colonCount--;\n }\n if (colonCount > parts) {\n return null;\n }\n replacementCount = parts - colonCount;\n replacement = ':';\n while (replacementCount--) {\n replacement += '0:';\n }\n string = string.replace('::', replacement);\n if (string[0] === ':') {\n string = string.slice(1);\n }\n if (string[string.length - 1] === ':') {\n string = string.slice(0, -1);\n }\n parts = (function() {\n var k, len, ref, results;\n ref = string.split(\":\");\n results = [];\n for (k = 0, len = ref.length; k < len; k++) {\n part = ref[k];\n results.push(parseInt(part, 16));\n }\n return results;\n })();\n return {\n parts: parts,\n zoneId: zoneId\n };\n };\n\n ipaddr.IPv6.parser = function(string) {\n var addr, k, len, match, octet, octets, zoneId;\n if (ipv6Regexes['native'].test(string)) {\n return expandIPv6(string, 8);\n } else if (match = string.match(ipv6Regexes['transitional'])) {\n zoneId = match[6] || '';\n addr = expandIPv6(match[1].slice(0, -1) + zoneId, 6);\n if (addr.parts) {\n octets = [parseInt(match[2]), parseInt(match[3]), parseInt(match[4]), parseInt(match[5])];\n for (k = 0, len = octets.length; k < len; k++) {\n octet = octets[k];\n if (!((0 <= octet && octet <= 255))) {\n return null;\n }\n }\n addr.parts.push(octets[0] << 8 | octets[1]);\n addr.parts.push(octets[2] << 8 | octets[3]);\n return {\n parts: addr.parts,\n zoneId: addr.zoneId\n };\n }\n }\n return null;\n };\n\n ipaddr.IPv4.isIPv4 = ipaddr.IPv6.isIPv6 = function(string) {\n return this.parser(string) !== null;\n };\n\n ipaddr.IPv4.isValid = function(string) {\n var e;\n try {\n new this(this.parser(string));\n return true;\n } catch (error1) {\n e = error1;\n return false;\n }\n };\n\n ipaddr.IPv4.isValidFourPartDecimal = function(string) {\n if (ipaddr.IPv4.isValid(string) && string.match(/^(0|[1-9]\\d*)(\\.(0|[1-9]\\d*)){3}$/)) {\n return true;\n } else {\n return false;\n }\n };\n\n ipaddr.IPv6.isValid = function(string) {\n var addr, e;\n if (typeof string === \"string\" && string.indexOf(\":\") === -1) {\n return false;\n }\n try {\n addr = this.parser(string);\n new this(addr.parts, addr.zoneId);\n return true;\n } catch (error1) {\n e = error1;\n return false;\n }\n };\n\n ipaddr.IPv4.parse = function(string) {\n var parts;\n parts = this.parser(string);\n if (parts === null) {\n throw new Error(\"ipaddr: string is not formatted like ip address\");\n }\n return new this(parts);\n };\n\n ipaddr.IPv6.parse = function(string) {\n var addr;\n addr = this.parser(string);\n if (addr.parts === null) {\n throw new Error(\"ipaddr: string is not formatted like ip address\");\n }\n return new this(addr.parts, addr.zoneId);\n };\n\n ipaddr.IPv4.parseCIDR = function(string) {\n var maskLength, match, parsed;\n if (match = string.match(/^(.+)\\/(\\d+)$/)) {\n maskLength = parseInt(match[2]);\n if (maskLength >= 0 && maskLength <= 32) {\n parsed = [this.parse(match[1]), maskLength];\n Object.defineProperty(parsed, 'toString', {\n value: function() {\n return this.join('/');\n }\n });\n return parsed;\n }\n }\n throw new Error(\"ipaddr: string is not formatted like an IPv4 CIDR range\");\n };\n\n ipaddr.IPv4.subnetMaskFromPrefixLength = function(prefix) {\n var filledOctetCount, j, octets;\n prefix = parseInt(prefix);\n if (prefix < 0 || prefix > 32) {\n throw new Error('ipaddr: invalid IPv4 prefix length');\n }\n octets = [0, 0, 0, 0];\n j = 0;\n filledOctetCount = Math.floor(prefix / 8);\n while (j < filledOctetCount) {\n octets[j] = 255;\n j++;\n }\n if (filledOctetCount < 4) {\n octets[filledOctetCount] = Math.pow(2, prefix % 8) - 1 << 8 - (prefix % 8);\n }\n return new this(octets);\n };\n\n ipaddr.IPv4.broadcastAddressFromCIDR = function(string) {\n var cidr, error, i, ipInterfaceOctets, octets, subnetMaskOctets;\n try {\n cidr = this.parseCIDR(string);\n ipInterfaceOctets = cidr[0].toByteArray();\n subnetMaskOctets = this.subnetMaskFromPrefixLength(cidr[1]).toByteArray();\n octets = [];\n i = 0;\n while (i < 4) {\n octets.push(parseInt(ipInterfaceOctets[i], 10) | parseInt(subnetMaskOctets[i], 10) ^ 255);\n i++;\n }\n return new this(octets);\n } catch (error1) {\n error = error1;\n throw new Error('ipaddr: the address does not have IPv4 CIDR format');\n }\n };\n\n ipaddr.IPv4.networkAddressFromCIDR = function(string) {\n var cidr, error, i, ipInterfaceOctets, octets, subnetMaskOctets;\n try {\n cidr = this.parseCIDR(string);\n ipInterfaceOctets = cidr[0].toByteArray();\n subnetMaskOctets = this.subnetMaskFromPrefixLength(cidr[1]).toByteArray();\n octets = [];\n i = 0;\n while (i < 4) {\n octets.push(parseInt(ipInterfaceOctets[i], 10) & parseInt(subnetMaskOctets[i], 10));\n i++;\n }\n return new this(octets);\n } catch (error1) {\n error = error1;\n throw new Error('ipaddr: the address does not have IPv4 CIDR format');\n }\n };\n\n ipaddr.IPv6.parseCIDR = function(string) {\n var maskLength, match, parsed;\n if (match = string.match(/^(.+)\\/(\\d+)$/)) {\n maskLength = parseInt(match[2]);\n if (maskLength >= 0 && maskLength <= 128) {\n parsed = [this.parse(match[1]), maskLength];\n Object.defineProperty(parsed, 'toString', {\n value: function() {\n return this.join('/');\n }\n });\n return parsed;\n }\n }\n throw new Error(\"ipaddr: string is not formatted like an IPv6 CIDR range\");\n };\n\n ipaddr.isValid = function(string) {\n return ipaddr.IPv6.isValid(string) || ipaddr.IPv4.isValid(string);\n };\n\n ipaddr.parse = function(string) {\n if (ipaddr.IPv6.isValid(string)) {\n return ipaddr.IPv6.parse(string);\n } else if (ipaddr.IPv4.isValid(string)) {\n return ipaddr.IPv4.parse(string);\n } else {\n throw new Error(\"ipaddr: the address has neither IPv6 nor IPv4 format\");\n }\n };\n\n ipaddr.parseCIDR = function(string) {\n var e;\n try {\n return ipaddr.IPv6.parseCIDR(string);\n } catch (error1) {\n e = error1;\n try {\n return ipaddr.IPv4.parseCIDR(string);\n } catch (error1) {\n e = error1;\n throw new Error(\"ipaddr: the address has neither IPv6 nor IPv4 CIDR format\");\n }\n }\n };\n\n ipaddr.fromByteArray = function(bytes) {\n var length;\n length = bytes.length;\n if (length === 4) {\n return new ipaddr.IPv4(bytes);\n } else if (length === 16) {\n return new ipaddr.IPv6(bytes);\n } else {\n throw new Error(\"ipaddr: the binary input is neither an IPv6 nor IPv4 address\");\n }\n };\n\n ipaddr.process = function(string) {\n var addr;\n addr = this.parse(string);\n if (addr.kind() === 'ipv6' && addr.isIPv4MappedAddress()) {\n return addr.toIPv4Address();\n } else {\n return addr;\n }\n };\n\n}).call(this);\n","/**\n * Created by elgs on 3/5/16.\n */\nconst normalize = function (a) {\n if (!_validate(a)) {\n throw new Error('Invalid address: ' + a);\n }\n a = a.toLowerCase()\n\n const nh = a.split(/\\:\\:/g);\n if (nh.length > 2) {\n throw new Error('Invalid address: ' + a);\n }\n\n let sections = [];\n if (nh.length == 1) {\n // full mode\n sections = a.split(/\\:/g);\n if (sections.length !== 8) {\n throw new Error('Invalid address: ' + a);\n }\n } else if (nh.length == 2) {\n // compact mode\n const n = nh[0];\n const h = nh[1];\n const ns = n.split(/\\:/g);\n const hs = h.split(/\\:/g);\n for (let i in ns) {\n sections[i] = ns[i];\n }\n for (let i = hs.length; i > 0; --i) {\n sections[7 - (hs.length - i)] = hs[i - 1];\n }\n }\n for (let i = 0; i < 8; ++i) {\n if (sections[i] === undefined) {\n sections[i] = '0000';\n }\n sections[i] = _leftPad(sections[i], '0', 4);\n }\n return sections.join(':');\n};\n\nconst abbreviate = function (a) {\n if (!_validate(a)) {\n throw new Error('Invalid address: ' + a);\n }\n a = normalize(a);\n a = a.replace(/0000/g, 'g');\n a = a.replace(/\\:000/g, ':');\n a = a.replace(/\\:00/g, ':');\n a = a.replace(/\\:0/g, ':');\n a = a.replace(/g/g, '0');\n const sections = a.split(/\\:/g);\n let zPreviousFlag = false;\n let zeroStartIndex = -1;\n let zeroLength = 0;\n let zStartIndex = -1;\n let zLength = 0;\n for (let i = 0; i < 8; ++i) {\n const section = sections[i];\n let zFlag = (section === '0');\n if (zFlag && !zPreviousFlag) {\n zStartIndex = i;\n }\n if (!zFlag && zPreviousFlag) {\n zLength = i - zStartIndex;\n }\n if (zLength > 1 && zLength > zeroLength) {\n zeroStartIndex = zStartIndex;\n zeroLength = zLength;\n }\n zPreviousFlag = (section === '0');\n }\n if (zPreviousFlag) {\n zLength = 8 - zStartIndex;\n }\n if (zLength > 1 && zLength > zeroLength) {\n zeroStartIndex = zStartIndex;\n zeroLength = zLength;\n }\n //console.log(zeroStartIndex, zeroLength);\n //console.log(sections);\n if (zeroStartIndex >= 0 && zeroLength > 1) {\n sections.splice(zeroStartIndex, zeroLength, 'g');\n }\n //console.log(sections);\n a = sections.join(':');\n //console.log(a);\n a = a.replace(/\\:g\\:/g, '::');\n a = a.replace(/\\:g/g, '::');\n a = a.replace(/g\\:/g, '::');\n a = a.replace(/g/g, '::');\n //console.log(a);\n return a;\n};\n\n// Basic validation\nconst _validate = function (a) {\n return /^[a-f0-9\\\\:]+$/ig.test(a);\n};\n\nconst _leftPad = function (d, p, n) {\n const padding = p.repeat(n);\n if (d.length < padding.length) {\n d = padding.substring(0, padding.length - d.length) + d;\n }\n return d;\n};\n\nconst _hex2bin = function (hex) {\n return parseInt(hex, 16).toString(2)\n};\nconst _bin2hex = function (bin) {\n return parseInt(bin, 2).toString(16)\n};\n\nconst _addr2bin = function (addr) {\n const nAddr = normalize(addr);\n const sections = nAddr.split(\":\");\n let binAddr = '';\n for (const section of sections) {\n binAddr += _leftPad(_hex2bin(section), '0', 16);\n }\n return binAddr;\n};\n\nconst _bin2addr = function (bin) {\n const addr = [];\n for (let i = 0; i < 8; ++i) {\n const binPart = bin.substr(i * 16, 16);\n const hexSection = _leftPad(_bin2hex(binPart), '0', 4);\n addr.push(hexSection);\n }\n return addr.join(':');\n};\n\nconst divideSubnet = function (addr, mask0, mask1, limit, abbr) {\n if (!_validate(addr)) {\n throw new Error('Invalid address: ' + addr);\n }\n mask0 *= 1;\n mask1 *= 1;\n limit *= 1;\n mask1 = mask1 || 128;\n if (mask0 < 1 || mask1 < 1 || mask0 > 128 || mask1 > 128 || mask0 > mask1) {\n throw new Error('Invalid masks.');\n }\n const ret = [];\n const binAddr = _addr2bin(addr);\n const binNetPart = binAddr.substr(0, mask0);\n const binHostPart = '0'.repeat(128 - mask1);\n const numSubnets = Math.pow(2, mask1 - mask0);\n for (let i = 0; i < numSubnets; ++i) {\n if (!!limit && i >= limit) {\n break;\n }\n const binSubnet = _leftPad(i.toString(2), '0', mask1 - mask0);\n const binSubAddr = binNetPart + binSubnet + binHostPart;\n const hexAddr = _bin2addr(binSubAddr);\n if (!!abbr) {\n ret.push(abbreviate(hexAddr));\n } else {\n ret.push(hexAddr);\n }\n\n }\n // console.log(numSubnets);\n // console.log(binNetPart, binSubnetPart, binHostPart);\n // console.log(binNetPart.length, binSubnetPart.length, binHostPart.length);\n // console.log(ret.length);\n return ret;\n};\n\nconst range = function (addr, mask0, mask1, abbr) {\n if (!_validate(addr)) {\n throw new Error('Invalid address: ' + addr);\n }\n mask0 *= 1;\n mask1 *= 1;\n mask1 = mask1 || 128;\n if (mask0 < 1 || mask1 < 1 || mask0 > 128 || mask1 > 128 || mask0 > mask1) {\n throw new Error('Invalid masks.');\n }\n const binAddr = _addr2bin(addr);\n const binNetPart = binAddr.substr(0, mask0);\n const binHostPart = '0'.repeat(128 - mask1);\n const binStartAddr = binNetPart + '0'.repeat(mask1 - mask0) + binHostPart;\n const binEndAddr = binNetPart + '1'.repeat(mask1 - mask0) + binHostPart;\n if (!!abbr) {\n return {\n start: abbreviate(_bin2addr(binStartAddr)),\n end: abbreviate(_bin2addr(binEndAddr)),\n size: Math.pow(2, mask1 - mask0)\n };\n } else {\n return {\n start: _bin2addr(binStartAddr),\n end: _bin2addr(binEndAddr),\n size: Math.pow(2, mask1 - mask0)\n };\n }\n};\n\nconst randomSubnet = function (addr, mask0, mask1, limit, abbr) {\n if (!_validate(addr)) {\n throw new Error('Invalid address: ' + addr);\n }\n mask0 *= 1;\n mask1 *= 1;\n limit *= 1;\n mask1 = mask1 || 128;\n limit = limit || 1;\n if (mask0 < 1 || mask1 < 1 || mask0 > 128 || mask1 > 128 || mask0 > mask1) {\n throw new Error('Invalid masks.');\n }\n const ret = [];\n const binAddr = _addr2bin(addr);\n const binNetPart = binAddr.substr(0, mask0);\n const binHostPart = '0'.repeat(128 - mask1);\n const numSubnets = Math.pow(2, mask1 - mask0);\n for (let i = 0; i < numSubnets && i < limit; ++i) {\n // generate an binary string with length of mask1 - mask0\n let binSubnet = '';\n for (let j = 0; j < mask1 - mask0; ++j) {\n binSubnet += Math.floor(Math.random() * 2);\n }\n const binSubAddr = binNetPart + binSubnet + binHostPart;\n const hexAddr = _bin2addr(binSubAddr);\n if (!!abbr) {\n ret.push(abbreviate(hexAddr));\n } else {\n ret.push(hexAddr);\n }\n }\n // console.log(numSubnets);\n // console.log(binNetPart, binSubnetPart, binHostPart);\n // console.log(binNetPart.length, binSubnetPart.length, binHostPart.length);\n // console.log(ret.length);\n return ret;\n};\n\nconst ptr = function (addr, mask) {\n if (!_validate(addr)) {\n throw new Error('Invalid address: ' + addr);\n }\n mask *= 1;\n if (mask < 1 || mask > 128 || Math.floor(mask / 4) != mask / 4) {\n throw new Error('Invalid masks.');\n }\n const fullAddr = normalize(addr);\n const reverse = fullAddr.replace(/:/g, '').split('').reverse();\n return reverse.slice(0, (128 - mask) / 4).join('.');\n};\n\nif (typeof module !== 'undefined' && typeof module.exports !== 'undefined') {\n exports.normalize = normalize;\n exports.abbreviate = abbreviate;\n exports.divideSubnet = divideSubnet;\n exports.range = range;\n exports.randomSubnet = randomSubnet;\n exports.ptr = ptr;\n} else {\n window.normalize = normalize;\n window.abbreviate = abbreviate;\n window.divideSubnet = divideSubnet;\n window.range = range;\n window.randomSubnet = randomSubnet;\n window.ptr = ptr;\n}\n","import ipaddr from 'ipaddr.js';\n// @ts-ignore: Can't find a @types/ip6 package\nimport ip6 from 'ip6';\n\nexport function isIP(addr: string) {\n return ipaddr.isValid(addr);\n}\n\nexport function version(addr: string): number {\n try {\n const parse_addr = ipaddr.parse(addr);\n const kind = parse_addr.kind();\n\n if (kind === 'ipv4') {\n return 4; //IPv4\n } else if (kind === 'ipv6') {\n return 6; //IPv6\n } else {\n /* istanbul ignore next */\n return 0; //not 4 or 6\n }\n } catch (err) {\n return 0; //not 4 or 6\n }\n}\n\nexport function isV4(addr: string) {\n return version(addr) === 4;\n}\n\nexport function isV6(addr: string) {\n return version(addr) === 6;\n}\n\nexport function isRange(range: string) {\n try {\n const cidr = ipaddr.parseCIDR(range);\n return true;\n } catch (err) {\n return false;\n }\n}\n\nexport function inRange(addr: string, range: string | string[]) {\n if (typeof range === 'string') {\n if (range.indexOf('/') !== -1) {\n try {\n const range_data = range.split('/');\n\n const parse_addr = ipaddr.parse(addr);\n const parse_range = ipaddr.parse(range_data[0]);\n\n //@ts-ignore: It works.\n return parse_addr.match(parse_range, range_data[1]);\n } catch (err) {\n return false;\n }\n } else {\n addr = isV6(addr) ? ip6.normalize(addr) : addr; //v6 normalize addr\n range = isV6(range) ? ip6.normalize(range) : range; //v6 normalize range\n\n return isIP(range as string) && addr === range;\n }\n } else if (range && typeof range === 'object') {\n //list\n for (const check_range in range) {\n if (inRange(addr, range[check_range]) === true) {\n return true;\n }\n }\n return false;\n } else {\n return false;\n }\n}\n\nexport function storeIP(addr: string) {\n try {\n var parse_addr = ipaddr.parse(addr);\n var kind = parse_addr.kind();\n\n if (kind === 'ipv4') {\n //is a plain v4 address\n return addr;\n } else if (kind === 'ipv6') {\n //@ts-ignore: it exists!\n if (parse_addr.isIPv4MappedAddress()) {\n //convert v4 mapped to v6 addresses to a v4 in it's original format\n //@ts-ignore: it exists!\n return parse_addr.toIPv4Address().toString();\n } //is a v6, abbreviate it\n else {\n return ip6.abbreviate(addr);\n }\n } else {\n return null; //invalid IP address\n }\n } catch (err) {\n return null; //invalid IP address\n }\n}\n\n// searchIP is a aliases of storeIP\nexport { storeIP as searchIP };\n\nexport function displayIP(addr: string) {\n try {\n var parse_addr = ipaddr.parse(addr);\n var kind = parse_addr.kind();\n\n if (kind === 'ipv4') {\n //is a plain v4 address\n return addr;\n } else if (kind === 'ipv6') {\n //@ts-ignore: it exists!\n if (parse_addr.isIPv4MappedAddress()) {\n //convert v4 mapped to v6 addresses to a v4 in it's original format\n //@ts-ignore: it exists!\n return parse_addr.toIPv4Address().toString();\n } //is a v6, normalize it\n else {\n return ip6.normalize(addr);\n }\n } else {\n return ''; //invalid IP address\n }\n } catch (err) {\n return ''; //invalid IP address\n }\n}\n","/**\n * Create a wpm namespace under which all functions are declared\n */\n\n// https://stackoverflow.com/a/5947280/4688612\n\n(function (pmw, $, undefined) {\n\n\tconst pmwDeduper = {\n\t\tkeyName : \"_wpm_order_ids\",\n\t\tcookieExpiresDays: 365,\n\t};\n\n\tconst pmwRestSettings = {\n\t\t// cookiesAvailable : '_wpm_cookies_are_available',\n\t\tcookiePmwRestEndpointAvailable: \"restEndpointAvailable\",\n\t\trestEndpointPost : \"pmw/v1/test/\",\n\t\trestFails : 0,\n\t\trestFailsThreshold : 10,\n\t};\n\n\tpmw.emailSelected = false;\n\tpmw.paymentMethodSelected = false;\n\n\tpmw.isBelowRestErrorThreshold = () => pmw.retrieveData(pmwRestSettings.restFails) <= pmwRestSettings.restFailsThreshold;\n\n\tpmw.isRestEndpointAvailable = async () => {\n\n\t\t// If we already tested the endpoint and have a stored value, return it\n\t\tif (pmw.retrieveData(pmwRestSettings.cookiePmwRestEndpointAvailable)) {\n\t\t\treturn pmw.retrieveData(pmwRestSettings.cookiePmwRestEndpointAvailable);\n\t\t}\n\n\t\treturn await pmw.testEndpoint();\n\t};\n\n\t/**\n\t * Tests a given endpoint by sending a POST request. If the response status is 200, it stores `true` in the dataStorage with given cookie name; else it stores `false`.\n\t *\n\t * @param {string} url - The URL of the endpoint to test. Defaults to concatenation of `pmw.root` and `wpmRestSettings.restEndpointPost`.\n\t * @param {string} cookieName - The name of the cookie where the test result will be stored. Defaults to `wpmRestSettings.cookiePmwRestEndpointAvailable`.\n\t * @returns {Promise<boolean>} - Returns a promise that resolves to `true` if the response status is 200, and `false` otherwise.\n\t * @async\n\t */\n\tpmw.testEndpoint = async (\n\t\turl = pmw.root + pmwRestSettings.restEndpointPost,\n\t\tcookieName = pmwRestSettings.cookiePmwRestEndpointAvailable,\n\t) => {\n\n\t\ttry {\n\n\t\t\tconst response = await fetch(url, {\n\t\t\t\tmethod : \"POST\",\n\t\t\t\tmode : \"cors\",\n\t\t\t\tcache : \"no-cache\",\n\t\t\t\tkeepalive: true,\n\t\t\t\tredirect : \"error\",\t// don't follow redirects\n\t\t\t});\n\n\t\t\tif (!response.ok) {\n\t\t\t\tpmw.storeData(cookieName, false);\n\t\t\t\tpmw.console.error(\"Error testing the endpoint. Status: \" + response.status + \" | response: \", response);\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tconst responseJson = await response.json();\n\n\t\t\t// Return false if responseJson.success is not true\n\t\t\tif (!responseJson.success) {\n\t\t\t\tpmw.storeData(cookieName, false);\n\t\t\t\tpmw.console.error(\"Error testing the endpoint. Response JSON: \" + JSON.stringify(responseJson));\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tpmw.storeData(cookieName, true);\n\t\t\treturn true;\n\n\t\t} catch (e) {\n\t\t\tpmw.storeData(cookieName, false);\n\t\t\tpmw.console.error(\"Error testing the endpoint. Error: \" + e);\n\t\t\treturn false;\n\t\t}\n\t};\n\n\tpmw.isPmwRestEndpointAvailable = (cookieName = pmwRestSettings.cookiePmwRestEndpointAvailable) => !!pmw.retrieveData(cookieName);\n\n\t/**\n\t * This function writes the provided orderId into storage. It will first retrieve the existing orderIds\n\t * from the storage if any, then add the new orderId into this existing array of orderIds and stores\n\t * the updated array back to the storage.\n\t * If the function pmw.storeOrderIdOnServer exists and order_duplication_prevention is set to true in pmwDataLayer.shop,\n\t * this function will also store the orderId, orderKey and source on the server side using pmw.storeOrderIdOnServer.\n\t *\n\t * @param {String} orderId - The ID of the order to be stored.\n\t * @param {String} orderKey - The Key of the order to be stored.\n\t * @param {String} source - The source from which the order originated (default: 'thankyou_page').\n\t */\n\tpmw.writeOrderIdToStorage = (orderId, orderKey, source = \"thankyou_page\") => {\n\n\t\t// Get existing order ids\n\t\tlet orderIds = pmw.retrieveData(\"orderIds\", true) || [];\n\n\t\t// Add the new order id\n\t\torderIds.push(orderId);\n\n\t\t// Store the order ids\n\t\tpmw.storeData(\"orderIds\", orderIds, true);\n\n\t\tif (typeof pmw.storeOrderIdOnServer === \"function\") {\n\t\t\tpmw.storeOrderIdOnServer({\n\t\t\t\torderId : orderId,\n\t\t\t\torderKey: orderKey,\n\t\t\t\tsource : source,\n\t\t\t});\n\t\t}\n\t};\n\n\tpmw.isOrderIdStored = orderId => {\n\n\t\t// If order deduplication is disabled, return false\n\t\tif (!pmwDataLayer.shop.order_duplication_prevention) {\n\t\t\tpmw.console.log(\"order duplication prevention is off\");\n\t\t\treturn false;\n\t\t}\n\n\t\tconst orderIds = pmw.retrieveData(\"orderIds\", true) || [];\n\t\treturn orderIds.includes(orderId);\n\t};\n\n\t/**\n\t * Check if the email address is valid\n\t *\n\t * https://stackoverflow.com/questions/201323/how-can-i-validate-an-email-address-using-a-regular-expression\n\t * https://www.w3.org/TR/html5/forms.html#valid-e-mail-address\n\t * https://fightingforalostcause.net/content/misc/2006/compare-email-regex.php\n\t *\n\t * @param email\n\t * @returns {boolean}\n\t */\n\tpmw.isEmail = email => {\n\n\t\t/**\n\t\t * GitHub Copilot generated RFC 5322 compliant regex\n\t\t * - Don't allow emails without a top-level domain like \"john@localhost\"\n\t\t * - Don't allow emails with dots at the end of the name like \"[email protected]\"\n\t\t */\n\t\tconst regex = new RegExp(\n\t\t\t\"^(([^<>()\\\\[\\\\]\\\\\\\\.,;:\\\\s@\\\"]+(\\\\.[^<>()\\\\[\\\\]\\\\\\\\.,;:\\\\s@\\\"]+)*)|(\\\".+\\\"))\"\n\t\t\t+ \"@\"\n\t\t\t+ \"((\\\\[[0-9]{1,3}\\\\.[0-9]{1,3}\\\\.[0-9]{1,3}\\\\.[0-9]{1,3}\\\\])\"\n\t\t\t+ \"|(([a-zA-Z\\\\-0-9]+\\\\.)+[a-zA-Z]{2,}))$\",\n\t\t);\n\n\t\treturn regex.test(email);\n\t};\n\n\tpmw.removeProductFromCart = async (productId, quantityToRemove = null) => {\n\n\t\ttry {\n\n\t\t\tif (!productId) throw Error(\"Wasn't able to retrieve a productId\");\n\n\t\t\tproductId = pmw.getIdBasedOndVariationsOutputSetting(productId);\n\n\t\t\tif (!productId) throw Error(\"Wasn't able to retrieve a productId\");\n\n\t\t\tlet quantity;\n\n\t\t\tif (quantityToRemove == null) {\n\t\t\t\tquantity = pmwDataLayer.cart[productId].quantity;\n\t\t\t} else {\n\t\t\t\tquantity = quantityToRemove;\n\t\t\t}\n\n\t\t\tif (!pmwDataLayer.cart[productId]) {\n\t\t\t\tawait pmw.getProductsFromBackend([productId]);\n\t\t\t}\n\n\t\t\tlet product = pmw.getProductDetailsFormattedForEvent(productId, quantity);\n\n\t\t\tjQuery(document).trigger(\"pmw:remove-from-cart\", product);\n\n\t\t\tif (quantityToRemove == null || pmwDataLayer.cart[productId].quantity === quantityToRemove) {\n\t\t\t\tdelete pmwDataLayer.cart[productId];\n\t\t\t} else {\n\t\t\t\tpmwDataLayer.cart[productId].quantity = pmwDataLayer.cart[productId].quantity - quantity;\n\t\t\t}\n\n\t\t\tpmw.storeCartData(pmwDataLayer.cart);\n\n\t\t} catch (e) {\n\t\t\tpmw.console.error(\"error: \", e);\n\t\t}\n\t};\n\n\tpmw.getIdBasedOndVariationsOutputSetting = productId => {\n\n\t\ttry {\n\t\t\tif (pmwDataLayer?.shop?.variations_output) return productId;\n\n\t\t\tif (pmwDataLayer.products[productId].is_variation) return pmwDataLayer.products[productId].parent_id;\n\n\t\t\treturn productId;\n\n\t\t} catch (e) {\n\t\t\tconsole.error(e);\n\t\t}\n\t};\n\n\tpmw.prepareSelectors = (selectors, type) => {\n\n\t\tif (pmwDataLayer?.shop?.selectors?.[type]) {\n\n\t\t\t// merge the selectors from the addToCartSelectors array with the selectors from the pmwDataLayer.shop.selectors.addToCart array\n\t\t\tselectors = selectors.concat(pmwDataLayer.shop.selectors[type]);\n\n\t\t\t// Remove duplicates\n\t\t\tselectors = [...new Set(selectors)];\n\n\t\t\t// If one of the selectors is document, remove it\n\t\t\tif (selectors.indexOf(\"document\") >= 0) {\n\t\t\t\tselectors.splice(selectors.indexOf(\"document\"), 1);\n\t\t\t}\n\n\t\t\t// If one of the selectors is body, remove all others\n\t\t\tif (selectors.indexOf(\"body\") >= 0) {\n\t\t\t\tselectors = [\"body\"];\n\t\t\t}\n\t\t}\n\n\t\treturn selectors.join(\", \");\n\t};\n\n\t// add_to_cart\n\tpmw.addProductToCart = async (productId, quantity) => {\n\n\t\t// Cast quantity to number to make sure it's a number\n\t\tquantity = Number(quantity);\n\n\t\ttry {\n\n\t\t\tif (!productId) throw Error(\"Wasn't able to retrieve a productId\");\n\n\t\t\tproductId = pmw.getIdBasedOndVariationsOutputSetting(productId);\n\n\t\t\tif (!productId) throw Error(\"Wasn't able to retrieve a productId\");\n\n\t\t\tif (!pmwDataLayer?.products[productId]) {\n\t\t\t\tawait pmw.getProductsFromBackend([productId]);\n\t\t\t}\n\n\t\t\tlet product = pmw.getProductDetailsFormattedForEvent(productId, quantity);\n\n\t\t\tjQuery(document).trigger(\"pmw:add-to-cart\", product);\n\n\t\t\t// add product to cart pmwDataLayer['cart']\n\n\t\t\t// if the product already exists in the object, only add the additional quantity\n\t\t\t// otherwise create that product object in the pmwDataLayer['cart']\n\t\t\tif (pmwDataLayer?.cart[productId]) {\n\n\t\t\t\tpmwDataLayer.cart[productId].quantity = pmwDataLayer.cart[productId].quantity + quantity;\n\t\t\t} else {\n\n\t\t\t\tif (!(\"cart\" in pmwDataLayer)) pmwDataLayer.cart = {};\n\n\t\t\t\tpmwDataLayer.cart[productId] = pmw.getProductDetailsFormattedForEvent(productId, quantity);\n\t\t\t}\n\n\t\t\tpmw.storeCartData(pmwDataLayer.cart);\n\n\t\t} catch (e) {\n\t\t\tconsole.error(e);\n\n\t\t\t// fallback if pmwDataLayer.cart and pmwDataLayer.products got out of sync in case cart caching has an issue\n\t\t\tpmw.getCartItemsFromBackend();\n\t\t}\n\t};\n\n\tpmw.initCart = () => {\n\n\t\t// If the WC cart doesn't exist, eg. after a confirmed purchase,\n\t\t// and we still have a cart object in the storage, reset it.\n\t\tif (\n\t\t\t!pmw.doesWooCommerceCartExist()\n\t\t\t&& Object.keys(pmw.retrieveCartData()).length !== 0\n\t\t) {\n\t\t\tpmw.storeCartData({});\n\t\t\treturn;\n\t\t}\n\n\t\t// If the cart object is in the storage, use it\n\t\tif (pmw.retrieveCartData()) {\n\t\t\tpmw.saveCartObjectToDataLayer(pmw.retrieveCartData());\n\t\t\treturn;\n\t\t}\n\n\t\t// If the cart object is missing in the storage, create an empty one and get the cart items from the backend\n\t\tpmw.storeCartData({});\n\t\tpmw.getCartItemsFromBackend();\n\t};\n\n\t// get all cart items from the backend\n\tpmw.getCartItemsFromBackend = () => {\n\t\ttry {\n\n\t\t\t/**\n\t\t\t * Can't use a REST API endpoint, as the cart session will not be loaded if the\n\t\t\t * endpoint is called.\n\t\t\t *\n\t\t\t * https://wordpress.org/support/topic/wc-cart-is-null-in-custom-rest-api/#post-11442843\n\t\t\t */\n\n\t\t\t/**\n\t\t\t * Get the cart items from the backend the data object using fetch API\n\t\t\t * and log success or error messages\n\t\t\t * and url encoded data\n\t\t\t */\n\t\t\tfetch(pmw.ajax_url, {\n\t\t\t\tmethod : \"POST\",\n\t\t\t\tcache : \"no-cache\",\n\t\t\t\tbody : new URLSearchParams({action: \"pmw_get_cart_items\"}),\n\t\t\t\tkeepalive: true,\n\t\t\t\tredirect : \"error\",\n\t\t\t})\n\t\t\t\t.then(response => {\n\t\t\t\t\tif (response.ok) {\n\t\t\t\t\t\treturn response.json();\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthrow Error(\"Error getting cart items from backend\");\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t\t.then(data => {\n\n\t\t\t\t\tif (data.success) {\n\n\t\t\t\t\t\tif (!data.data[\"cart\"]) data.data[\"cart\"] = {};\n\t\t\t\t\t\tpmw.saveCartObjectToDataLayer(data.data[\"cart\"]);\n\t\t\t\t\t\tpmw.storeCartData(data.data[\"cart\"]);\n\n\t\t\t\t\t\t// Save cart_item_keys from AJAX response for remove_from_cart tracking\n\t\t\t\t\t\t// This provides fallback when inline scripts are suppressed via pmw_output_cart_item_data filter\n\t\t\t\t\t\tif (data.data[\"cart_item_keys\"]) {\n\t\t\t\t\t\t\tpmwDataLayer.cart_item_keys = Object.assign(\n\t\t\t\t\t\t\t\tpmwDataLayer.cart_item_keys || {},\n\t\t\t\t\t\t\t\tdata.data[\"cart_item_keys\"]\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthrow Error(\"Error getting cart items from backend\");\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t} catch (e) {\n\t\t\tconsole.error(e);\n\t\t}\n\t};\n\n\t// Get product IDs from the backend\n\tpmw.getProductsFromBackend = async productIds => {\n\n\t\tif (pmwDataLayer?.products) {\n\t\t\t// If productIds already exists as key in pmwDataLayer.products, remove it from the array\n\t\t\tproductIds = productIds.filter(productId => !(productId in pmwDataLayer.products));\n\t\t}\n\n\t\t// If no product IDs are in the object, don't try to get anything from the server\n\t\tif (!productIds || productIds.length === 0) return;\n\n\t\t// if no page_id is set, don't try to get anything from the server\n\t\tif (!pmwDataLayer.general.page_id) return;\n\n\t\t// if productIds is not an array, or it's an empty array, don't try to get anything from the server\n\t\tif (!Array.isArray(productIds) || productIds.length === 0) return;\n\n\t\ttry {\n\n\t\t\tlet data = {\n\t\t\t\taction : \"pmw_get_product_ids\", // for the AJAX call\n\t\t\t\tpage_id : pmwDataLayer.general.page_id,\n\t\t\t\tpage_type : pmwDataLayer.shop.page_type,\n\t\t\t\tproduct_ids: productIds,\n\t\t\t};\n\n\t\t\tconst isRestEndpointAvailable = await pmw.isRestEndpointAvailable();\n\t\t\tconst url = isRestEndpointAvailable ? pmw.root + \"pmw/v1/products/\" : pmw.ajax_url;\n\n\t\t\tconst options = {\n\t\t\t\tmethod: \"POST\",\n\t\t\t\tcache : \"no-cache\",\n\t\t\t\tbody : isRestEndpointAvailable ? JSON.stringify(data) : new URLSearchParams(data),\n\t\t\t};\n\n\t\t\t// If the REST API is available, set the headers to JSON\n\t\t\tif (isRestEndpointAvailable) {\n\t\t\t\toptions.headers = {\"Content-Type\": \"application/json\"};\n\t\t\t}\n\n\t\t\tlet response = await fetch(url, options);\n\n\t\t\tif (!response.ok) {\n\t\t\t\tthrow new Error(\"Error getting products from backend. Status: \" + response.status + \" Status text: \" + response.statusText);\n\t\t\t}\n\n\t\t\tlet responseData = await response.json();\n\n\t\t\tif (!responseData.success) {\n\t\t\t\tthrow new Error(\"Error getting products from backend: \" + responseData.data);\n\t\t\t}\n\n\t\t\tpmwDataLayer.products = Object.assign({}, pmwDataLayer.products, responseData.data);\n\n\t\t} catch (e) {\n\t\t\tconsole.error(e);\n\t\t}\n\n\t\treturn true;\n\t};\n\n\tpmw.saveCartObjectToDataLayer = cartObject => {\n\n\t\tpmwDataLayer.cart = cartObject;\n\t\tpmwDataLayer.products = Object.assign({}, pmwDataLayer.products, cartObject);\n\t};\n\n\tpmw.triggerViewItemEventPrep = async productId => {\n\n\t\tif (!pmwDataLayer?.products[productId]) {\n\t\t\tawait pmw.getProductsFromBackend([productId]);\n\t\t}\n\n\t\tif (!pmwDataLayer?.products[productId]) {\n\t\t\tpmw.triggerViewItemEventNoProduct();\n\t\t\tpmw.console.log(`Product with ID ${productId} not found in the data layer and couldn't be retrieved from the backend. Triggering view-item event without product data.`);\n\t\t} else {\n\t\t\tpmw.triggerViewItemEvent(productId);\n\t\t}\n\t};\n\n\tpmw.triggerViewItemEvent = productId => {\n\n\t\tlet product = pmw.getProductDetailsFormattedForEvent(productId);\n\n\t\tif (!product) return;\n\n\t\tjQuery(document).trigger(\"pmw:view-item\", product);\n\t};\n\n\tpmw.triggerViewItemEventNoProduct = () => {\n\t\tjQuery(document).trigger(\"pmw:view-item\");\n\t};\n\n\tpmw.fireCheckoutOption = (step, checkout_option = null, value = null) => {\n\n\t\tlet data = {\n\t\t\tstep : step,\n\t\t\tcheckout_option: checkout_option,\n\t\t\tvalue : value,\n\t\t};\n\n\t\tjQuery(document).trigger(\"pmw:checkout-option\", data);\n\t};\n\n\tpmw.fireCheckoutProgress = step => {\n\n\t\tlet data = {\n\t\t\tstep: step,\n\t\t};\n\n\t\tjQuery(document).trigger(\"pmw:checkout-progress\", data);\n\t};\n\n\tpmw.getPostIdFromString = string => {\n\n\t\ttry {\n\t\t\treturn string.match(/(post-)(\\d+)/)[2];\n\t\t} catch (e) {\n\t\t\tconsole.error(e);\n\t\t}\n\t};\n\n\tpmw.triggerViewItemList = productId => {\n\n\t\tif (!productId) throw Error(\"Wasn't able to retrieve a productId\");\n\n\t\tproductId = pmw.getIdBasedOndVariationsOutputSetting(productId);\n\n\t\tif (!productId) throw Error(\"Wasn't able to retrieve a productId\");\n\n\t\tjQuery(document).trigger(\"pmw:view-item-list\", pmw.getProductDataForViewItemEvent(productId));\n\t};\n\n\tpmw.getProductDataForViewItemEvent = productId => {\n\n\t\tif (!productId) throw Error(\"Wasn't able to retrieve a productId\");\n\n\t\ttry {\n\t\t\tif (pmwDataLayer.products[productId]) {\n\n\t\t\t\treturn pmw.getProductDetailsFormattedForEvent(productId);\n\t\t\t}\n\t\t} catch (e) {\n\t\t\tconsole.error(e);\n\t\t}\n\t};\n\n\tpmw.getMainProductIdFromProductPage = () => {\n\n\t\ttry {\n\t\t\tif ([\"simple\", \"variable\", \"grouped\", \"composite\", \"bundle\"].indexOf(pmwDataLayer.shop.product_type) >= 0) {\n\t\t\t\treturn jQuery(\".pmwProductId:first\").data(\"id\");\n\t\t\t} else {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t} catch (e) {\n\t\t\tconsole.error(e);\n\t\t}\n\t};\n\n\tpmw.viewItemListTriggerTestMode = target => {\n\n\t\tjQuery(target).css({\"position\": \"relative\"});\n\t\tjQuery(target).append(\"<div id=\\\"viewItemListTriggerOverlay\\\"></div>\");\n\t\tjQuery(target).find(\"#viewItemListTriggerOverlay\").css({\n\t\t\t\"z-index\" : \"10\",\n\t\t\t\"display\" : \"block\",\n\t\t\t\"position\" : \"absolute\",\n\t\t\t\"height\" : \"100%\",\n\t\t\t\"top\" : \"0\",\n\t\t\t\"left\" : \"0\",\n\t\t\t\"right\" : \"0\",\n\t\t\t\"opacity\" : pmwDataLayer.shop.view_item_list_trigger.opacity,\n\t\t\t\"background-color\": pmwDataLayer.shop.view_item_list_trigger.background_color,\n\t\t});\n\t};\n\n\tpmw.getSearchTermFromUrl = () => {\n\n\t\ttry {\n\t\t\tlet urlParameters = new URLSearchParams(window.location.search);\n\t\t\treturn urlParameters.get(\"s\");\n\t\t} catch (e) {\n\t\t\tconsole.error(e);\n\t\t}\n\t};\n\n\t// we need this to track timeouts for intersection observers\n\tlet ioTimeouts = {};\n\n\tpmw.observerCallback = (entries, observer) => {\n\n\t\tentries.forEach((entry) => {\n\n\t\t\ttry {\n\t\t\t\tlet productId;\n\n\t\t\t\tlet elementId = jQuery(entry.target).data(\"ioid\");\n\n\t\t\t\t// Get the productId from next element, if wpmProductId is a sibling, like in Gutenberg blocks\n\t\t\t\t// otherwise go search in children, like in regular WC loop items\n\t\t\t\tif (jQuery(entry.target).next(\".pmwProductId\").length) {\n\t\t\t\t\t// console.log('test 1');\n\t\t\t\t\tproductId = jQuery(entry.target).next(\".pmwProductId\").data(\"id\");\n\t\t\t\t} else {\n\t\t\t\t\tproductId = jQuery(entry.target).find(\".pmwProductId\").data(\"id\");\n\t\t\t\t}\n\n\n\t\t\t\tif (!productId) throw Error(\"pmwProductId element not found\");\n\n\t\t\t\tif (entry.isIntersecting) {\n\n\t\t\t\t\tioTimeouts[elementId] = setTimeout(() => {\n\n\t\t\t\t\t\tpmw.triggerViewItemList(productId);\n\t\t\t\t\t\tif (pmwDataLayer.shop.view_item_list_trigger.test_mode) pmw.viewItemListTriggerTestMode(entry.target);\n\t\t\t\t\t\tif (pmwDataLayer.shop.view_item_list_trigger.repeat === false) observer.unobserve(entry.target);\n\t\t\t\t\t}, pmwDataLayer.shop.view_item_list_trigger.timeout);\n\n\t\t\t\t} else {\n\n\t\t\t\t\tclearTimeout(ioTimeouts[elementId]);\n\t\t\t\t\tif (pmwDataLayer.shop.view_item_list_trigger.test_mode) jQuery(entry.target).find(\"#viewItemListTriggerOverlay\").remove();\n\t\t\t\t}\n\t\t\t} catch (e) {\n\t\t\t\tconsole.error(e);\n\t\t\t}\n\t\t});\n\t};\n\n\t// fire view_item_list only on products that have become visible\n\tlet io;\n\tlet ioid = 0;\n\n\tconst getCommonIdentifiersToWatch = () => {\n\n\t\tlet listOfClassNames = {\n\t\t\tnested: [],\n\t\t\tflat : [],\n\t\t};\n\n\t\ttry {\n\n\t\t\tconst haveSameNestingDepth = (element1, element2) => {\n\n\t\t\t\t// If both are the same, return the parent\n\t\t\t\treturn jQuery(element1).parents().length === jQuery(element2).parents().length;\n\t\t\t};\n\n\t\t\tconst findCommonParentElement = (element1, element2) => {\n\t\t\t\t// If both are the same, return the parent\n\t\t\t\tif (jQuery(element1).parent().is(jQuery(element2).parent())) {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tnode: jQuery(element1).parent(),\n\t\t\t\t\t\ttype: \"flat\",\n\t\t\t\t\t};\n\t\t\t\t}\n\n\t\t\t\treturn {\n\t\t\t\t\tnode: jQuery(element1).parents().has(jQuery(element2).parents()).first(),\n\t\t\t\t\ttype: \"nested\",\n\t\t\t\t};\n\t\t\t};\n\n\t\t\tconst countOfChildren = (element) => {\n\t\t\t\t// Return the count of \"wpmProductId\" elements\n\t\t\t\treturn jQuery(element).find(\".pmwProductId\").length;\n\t\t\t};\n\n\t\t\tconst getCommonClass = (classes1, classes2) => {\n\n\t\t\t\t// console.log(\"classes1\", classes1);\n\t\t\t\t// console.log(\"classes2\", classes2);\n\t\t\t\t// classes 1 and 2 are arrays of classes\n\t\t\t\t// They may contain the same classes, but not in the same order\n\t\t\t\t// Return the first common class that's present in both arrays\n\n\t\t\t\treturn classes1.filter(value => classes2.includes(value))[0] || null;\n\t\t\t};\n\n\t\t\tconst pmwProductIds = document.querySelectorAll(\".pmwProductId\");\n\n\t\t\t// If zero or only one product template is found, then we can't run the algorithm\n\t\t\tif (pmwProductIds.length === 1) {\n\t\t\t\t// console.log(\"No product or too few templates found\")\n\t\t\t\treturn listOfClassNames;\n\t\t\t}\n\n\t\t\t// console.log(\"wpmProductIds\", wpmProductIds);\n\t\t\t// console.log(\"looping\")\n\n\t\t\tfor (let i = 0; i < pmwProductIds.length - 1; i++) {\n\n\t\t\t\t// console.log(\"i\", i)\n\n\t\t\t\tif (!haveSameNestingDepth(pmwProductIds[i], pmwProductIds[i + 1])) {\n\t\t\t\t\t// console.log(\"The nesting depth is not the same\")\n\t\t\t\t\ti++;\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tlet productsNode = findCommonParentElement(pmwProductIds[i], pmwProductIds[i + 1]);\n\t\t\t\t// console.log(\"productsNode.node\", productsNode.node)\n\t\t\t\t// console.log(\"productsNode.type\", productsNode.type)\n\n\t\t\t\t// If the productsNode is nested, get the first class of the first child. Then console log the class\n\t\t\t\tif (productsNode.type === \"nested\") {\n\n\t\t\t\t\tlet firstChildClassAttr = productsNode.node.children().first().attr(\"class\");\n\t\t\t\t\tlet firstChildClasses = firstChildClassAttr ? firstChildClassAttr.split(\" \") : [];\n\n\t\t\t\t\tlet secondChildClassAttr = productsNode.node.children().first().next().attr(\"class\");\n\t\t\t\t\tlet secondChildClasses = secondChildClassAttr ? secondChildClassAttr.split(\" \") : [];\n\n\t\t\t\t\tconst commonClass = getCommonClass(firstChildClasses, secondChildClasses);\n\n\t\t\t\t\tlistOfClassNames.nested.push(commonClass);\n\t\t\t\t} else if (productsNode.type === \"flat\") {\n\n\t\t\t\t\t// If class is not found, continue\n\t\t\t\t\tif (!productsNode.node.children().first().attr(\"class\")) continue;\n\n\t\t\t\t\t// firstProductTemplateClasses is the classes of the first child element of the productsNode\n\t\t\t\t\tlet firstProductTemplateClasses = productsNode.node.children().first().attr(\"class\").split(\" \")[0];\n\n\t\t\t\t\tlistOfClassNames.flat.push(firstProductTemplateClasses);\n\t\t\t\t}\n\n\t\t\t\t// which wpmProductIds is the last one in the productsNode? console log the index of the last wpmProductId in the productsNode\n\t\t\t\t// console.log(\"productsNode.children().length\", countOfChildren(productsNode));\n\n\t\t\t\ti = i + countOfChildren(productsNode.node) - 1;\n\t\t\t}\n\n\t\t\t// Make the list of class names unique\n\t\t\tlistOfClassNames.nested = [...new Set(listOfClassNames.nested)];\n\t\t\tlistOfClassNames.flat = [...new Set(listOfClassNames.flat)];\n\n\t\t\treturn listOfClassNames;\n\n\t\t} catch (e) {\n\t\t\tconsole.error(e);\n\t\t\treturn listOfClassNames;\n\t\t}\n\t};\n\n\n\tlet detectedProductTemplateClasses = {\n\t\tnested: [],\n\t\tflat : [],\n\t};\n\n\tconst isNestedClass = (elem) => {\n\t\tlet nestedClassNames = [\n\t\t\t\"product\",\n\t\t\t\"type-product\",\n\t\t\t\"product-item-inner\",\n\t\t\t...detectedProductTemplateClasses.nested,\n\t\t];\n\n\t\treturn nestedClassNames.some(className => jQuery(elem).closest(\".\" + className).length);\n\t};\n\n\tconst isFlatClass = (elem) => {\n\n\t\tlet flatClassNames = [\n\t\t\t\"wc-block-grid__product\",\n\t\t\t\"product\",\n\t\t\t\"product-small\",\n\t\t\t\"woocommerce-LoopProduct-link\",\n\t\t\t...detectedProductTemplateClasses.flat,\n\t\t];\n\n\t\treturn flatClassNames.some(className => jQuery(elem).prev().hasClass(className));\n\t};\n\n\tconst getAllElementsToWatch = () => {\n\n\t\tdetectedProductTemplateClasses = getCommonIdentifiersToWatch();\n\n\t\treturn jQuery(\".pmwProductId\")\n\t\t\t.map(function (i, elem) {\n\n\t\t\t\tif (isNestedClass(elem)) {\n\t\t\t\t\treturn jQuery(elem).parent();\n\t\t\t\t} else if (isFlatClass(elem)) {\n\t\t\t\t\treturn jQuery(this).prev();\n\t\t\t\t} else if (jQuery(elem).closest(\".product\").length) {\n\t\t\t\t\treturn jQuery(elem).closest(\".product\");\n\t\t\t\t}\n\t\t\t});\n\t};\n\n\tpmw.startIntersectionObserverToWatch = () => {\n\n\t\ttry {\n\t\t\t// enable view_item_list test mode from browser\n\t\t\tif (pmw.urlHasParameter(\"vildemomode\")) pmwDataLayer.shop.view_item_list_trigger.test_mode = true;\n\n\t\t\t// set up intersection observer\n\t\t\t// https://stackoverflow.com/questions/62084306/intersectionobserver-not-working-in-safari-or-ios\n\t\t\tio = new IntersectionObserver(pmw.observerCallback, {\n\t\t\t\troot: null,\n\t\t\t\t// root : document.body,\n\t\t\t\tthreshold: pmwDataLayer.shop.view_item_list_trigger.threshold,\n\t\t\t});\n\n\t\t\tgetAllElementsToWatch().each((i, elem) => {\n\n\t\t\t\tjQuery(elem[0]).data(\"ioid\", ioid++);\n\n\t\t\t\tio.observe(elem[0]);\n\t\t\t});\n\t\t} catch (e) {\n\t\t\tconsole.error(e);\n\t\t}\n\t};\n\n\t// Watch DOM for new lazy loaded products and add them to the intersection observer\n\tpmw.startProductsMutationObserverToWatch = () => {\n\n\t\ttry {\n\t\t\t// Pass in the target node, as well as the observer options\n\n\t\t\t// selects the most common parent node\n\t\t\t// https://stackoverflow.com/a/7648323/4688612\n\t\t\tlet productsNode = jQuery(\".pmwProductId:eq(0)\").parents().has(jQuery(\".pmwProductId:eq(1)\").parents()).first();\n\n\t\t\tif (productsNode.length) {\n\t\t\t\tproductsMutationObserver.observe(productsNode[0], {\n\t\t\t\t\tattributes : true,\n\t\t\t\t\tchildList : true,\n\t\t\t\t\tcharacterData: true,\n\t\t\t\t});\n\t\t\t}\n\t\t} catch (e) {\n\t\t\tconsole.error(e);\n\t\t}\n\t};\n\n\t// Create an observer instance\n\tconst productsMutationObserver = new MutationObserver(mutations => {\n\n\t\tmutations.forEach(mutation => {\n\t\t\tlet newNodes = mutation.addedNodes; // DOM NodeList\n\t\t\tif (newNodes !== null) { // If there are new nodes added\n\t\t\t\tlet nodes = jQuery(newNodes); // jQuery set\n\t\t\t\tnodes.each((i, node) => {\n\t\t\t\t\tif (\n\t\t\t\t\t\t// jQuery(this).hasClass(\"type-product\") ||\n\t\t\t\t\t\t// jQuery(this).hasClass(\"product-small\") ||\n\t\t\t\t\t\t// jQuery(this).hasClass(\"wc-block-grid__product\")\n\t\t\t\t\t\t// jQuery(this).hasClass(\"type-product\")\n\t\t\t\t\t\tisNestedClass(node) || isFlatClass(node)\n\t\t\t\t\t) {\n\t\t\t\t\t\t// check if the node has a child or sibling wpmProductId\n\t\t\t\t\t\t// if yes add it to the intersectionObserver\n\t\t\t\t\t\tif (hasPmwProductIdElement(node)) {\n\t\t\t\t\t\t\tjQuery(node).data(\"ioid\", ioid++);\n\t\t\t\t\t\t\tio.observe(node);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\t\t});\n\t});\n\n\tlet hasPmwProductIdElement = elem =>\n\t\t!!(jQuery(elem).find(\".pmwProductId\").length ||\n\t\t\tjQuery(elem).siblings(\".pmwProductId\").length);\n\n\t/**\n\t * Sets a new cookie or updates an existing one with the provided name and value.\n\t *\n\t * @function setCookie\n\t * @global\n\t * @param {string} cookieName - The name of the cookie.\n\t * @param {string} [cookieValue=\"\"] - The value to set for the cookie. Default value is an empty string.\n\t * @param {number|null} [expiryDays=null] - The number of days until the cookie expires. If not provided, the cookie will last until the end of the session.\n\t * @returns {void}\n\t *\n\t * @example\n\t * // This will create a cookie \"username\" with the value \"JohnDoe\" that expires in 7 days\n\t * pmw.setCookie(\"username\", \"JohnDoe\", 7);\n\t */\n\tpmw.setCookie = (cookieName, cookieValue = \"\", expiryDays = null) => {\n\n\t\tif (expiryDays) {\n\n\t\t\tlet d = new Date();\n\t\t\td.setTime(d.getTime() + (expiryDays * 24 * 60 * 60 * 1000));\n\t\t\tlet expires = \"expires=\" + d.toUTCString();\n\t\t\tdocument.cookie = cookieName + \"=\" + cookieValue + \";\" + expires + \";path=/\";\n\t\t} else {\n\t\t\tdocument.cookie = cookieName + \"=\" + cookieValue + \";path=/\";\n\t\t}\n\t};\n\n\t/**\n\t * Retrieves the value of a specific cookie from the document's cookie string.\n\t *\n\t * @param {String} cookieName - The name of the cookie to retrieve.\n\t * @returns {String} - The value of the cookie if found, an empty string otherwise.\n\t *\n\t * @example\n\t * // returns 'value' if 'cookieName=value' exists in document.cookie\n\t * pmw.getCookie('cookieName')\n\t */\n\tpmw.getCookie = cookieName => {\n\n\t\tlet name = cookieName + \"=\";\n\t\tlet decodedCookie = decodeURIComponent(document.cookie);\n\t\tlet ca = decodedCookie.split(\";\");\n\n\t\tfor (let i = 0; i < ca.length; i++) {\n\n\t\t\tlet c = ca[i];\n\n\t\t\twhile (c.charAt(0) == \" \") {\n\t\t\t\tc = c.substring(1);\n\t\t\t}\n\n\t\t\tif (c.indexOf(name) == 0) {\n\t\t\t\treturn c.substring(name.length, c.length);\n\t\t\t}\n\t\t}\n\n\t\treturn \"\";\n\t};\n\n\t/**\n\t * Find and get the cookie with a name that contains the string.\n\t * If one is found, then return the cookie.\n\t * If none is found, then return false.\n\t *\n\t * @param string\n\t * @returns {boolean|string}\n\t *\n\t * @since 1.32.5\n\t */\n\tpmw.getCookieThatContainsRegex = (regex) => {\n\n\t\tlet cookies = document.cookie.split(\";\");\n\n\t\tfor (let i = 0; i < cookies.length; i++) {\n\t\t\tlet cookie = cookies[i].trim();\n\n\t\t\tif (regex.test(cookie)) {\n\t\t\t\treturn cookie;\n\t\t\t}\n\t\t}\n\n\t\treturn false;\n\t};\n\n\tpmw.deleteCookie = cookieName => {\n\t\tpmw.setCookie(cookieName, \"\", -1);\n\t};\n\n\t/**\n\t * Store data in the browser\n\t *\n\t * Try to store the data in the local storage (session or persistent) if available.\n\t * If not available, store the data in the cookie.\n\t *\n\t * Max cookie expiry is 400 days as specified by Google Chrome: https://developer.chrome.com/blog/cookie-max-age-expires/\n\t *\n\t * @param key\n\t * @param value\n\t * @param persistent\n\t * @param extension - If true, this will be saved in a separate key\n\t */\n\tpmw.storeData = (key, value, persistent = false, extension = false) => {\n\n\t\tconst suffix = extension ? key : \"\";\n\n\t\tlet dataGetter = persistent ? pmw.getPersistentData : pmw.getSessionData;\n\t\tlet dataSetter = persistent ? pmw.setPersistentData : pmw.setSessionData;\n\n\t\tlet data = dataGetter(suffix);\n\t\textension ? data = value : data[key] = value;\n\n\t\tdataSetter(data, suffix);\n\t};\n\n\tpmw.retrieveData = (key, persistent = false, extension = false) => {\n\n\t\tconst suffix = extension ? key : \"\";\n\n\t\tlet data = persistent ? pmw.getPersistentData(suffix) : pmw.getSessionData(suffix);\n\n\t\treturn extension ? data : data[key];\n\t};\n\n\tpmw.deleteDataKey = (key, persistent = false, extension = false) => {\n\n\t\tconst suffix = extension ? key : \"\";\n\n\t\tlet dataGetter = persistent ? pmw.getPersistentData : pmw.getSessionData;\n\t\tlet dataSetter = persistent ? pmw.setPersistentData : pmw.setSessionData;\n\n\t\tlet data = dataGetter(suffix);\n\t\t// extension ? delete data : delete data[key]\n\n\t\tif (extension) {\n\n\t\t\ttry {\n\t\t\t\tif (persistent && window.localStorage) window.localStorage.removeItem(pmw.getPersistentDataKey(suffix));\n\t\t\t\tif (!persistent && window.sessionStorage) window.sessionStorage.removeItem(pmw.getSessionDataKey(suffix));\n\n\t\t\t} catch (e) {\n\t\t\t\tconsole.error(e);\n\t\t\t}\n\n\t\t\treturn;\n\t\t}\n\n\t\tdelete data[key];\n\n\t\tdataSetter(data, suffix);\n\t};\n\n\tpmw.storeCartData = data => {\n\t\tpmw.storeData(\"cart\", data, false, true);\n\t};\n\n\tpmw.retrieveCartData = () => {\n\t\treturn pmw.retrieveData(\"cart\", false, true);\n\t};\n\n\tpmw.getSessionDataKey = (suffix = \"\") => {\n\t\tconst defaultStorageKey = \"_pmw_session_data\";\n\n\t\tif (suffix) {\n\t\t\treturn defaultStorageKey + \"_\" + suffix;\n\t\t}\n\n\t\treturn defaultStorageKey;\n\t};\n\n\tpmw.getPersistentDataKey = (storageKeySuffix) => {\n\n\t\tconst defaultStorageKey = \"_pmw_persistent_data\";\n\n\t\tif (storageKeySuffix) {\n\t\t\treturn defaultStorageKey + \"_\" + storageKeySuffix;\n\t\t}\n\n\t\treturn defaultStorageKey;\n\t};\n\n\tpmw.getSessionData = (suffix = \"\") => {\n\n\t\tif (window.sessionStorage) {\n\n\t\t\tlet data = window.sessionStorage.getItem(pmw.getSessionDataKey(suffix));\n\n\t\t\treturn data !== null ? JSON.parse(data) : {};\n\t\t} else {\n\t\t\t// fallback to cookie\n\t\t\tlet data = pmw.getCookie(pmw.getSessionDataKey(suffix));\n\n\t\t\treturn data !== \"\" ? JSON.parse(data) : {};\n\t\t}\n\t};\n\n\tpmw.setSessionData = (data, storageKeySuffix = \"\") => {\n\t\tif (window.sessionStorage) {\n\t\t\twindow.sessionStorage.setItem(pmw.getSessionDataKey(storageKeySuffix), JSON.stringify(data));\n\t\t} else {\n\t\t\t// fallback to cookie\n\t\t\tpmw.setCookie(pmw.getSessionDataKey(storageKeySuffix), JSON.stringify(data));\n\t\t}\n\t};\n\n\tpmw.getPersistentData = (storageKeySuffix) => {\n\n\t\tif (window.localStorage) {\n\n\t\t\tlet data = window.localStorage.getItem(pmw.getPersistentDataKey(storageKeySuffix));\n\n\t\t\treturn data !== null ? JSON.parse(data) : {};\n\t\t} else {\n\t\t\t// fallback to cookie\n\t\t\tlet data = pmw.getCookie(pmw.getPersistentDataKey(storageKeySuffix));\n\n\t\t\treturn data !== \"\" ? JSON.parse(data) : {};\n\t\t}\n\t};\n\n\tpmw.setPersistentData = (data, storageKeySuffix = \"\") => {\n\n\t\tif (window.localStorage) {\n\t\t\twindow.localStorage.setItem(pmw.getPersistentDataKey(storageKeySuffix), JSON.stringify(data));\n\t\t} else {\n\t\t\t// fallback to cookie\n\t\t\tpmw.setCookie(pmw.getPersistentDataKey(storageKeySuffix), JSON.stringify(data), 400);\n\t\t}\n\t};\n\n\tpmw.storeOrderIdOnServer = async (orderDetails) => {\n\n\t\ttry {\n\n\t\t\tlet response;\n\n\t\t\tif (await pmw.isRestEndpointAvailable()) {\n\n\t\t\t\tresponse = await fetch(pmw.root + \"pmw/v1/pixels-fired/\", {\n\t\t\t\t\tmethod : \"POST\",\n\t\t\t\t\theaders : {\n\t\t\t\t\t\t\"Content-Type\": \"application/json\",\n\t\t\t\t\t\t// \"X-WP-Nonce\" : pmw.nonce_wp_rest,\n\t\t\t\t\t},\n\t\t\t\t\tbody : JSON.stringify({\n\t\t\t\t\t\torder_id : orderDetails.orderId,\n\t\t\t\t\t\torder_key: orderDetails.orderKey,\n\t\t\t\t\t\tsource : orderDetails.source,\n\t\t\t\t\t\t// nonce : pmw.pmw_nonce,\n\t\t\t\t\t}),\n\t\t\t\t\tkeepalive: true,\n\t\t\t\t\tcache : \"no-cache\",\n\t\t\t\t\tredirect : \"error\",\n\t\t\t\t});\n\n\t\t\t} else {\n\n\t\t\t\tpmw.console.log(\"REST API not available, falling back to AJAX\");\n\n\t\t\t\t// save the state in the database\n\n\t\t\t\t// Send the data object with ajax request\n\t\t\t\t// and log success or error using fetch API and url encoded\n\t\t\t\tresponse = await fetch(pmw.ajax_url, {\n\t\t\t\t\tmethod : \"POST\",\n\t\t\t\t\tbody : new URLSearchParams({\n\t\t\t\t\t\taction : \"pmw_purchase_pixels_fired\",\n\t\t\t\t\t\torder_id : orderDetails.orderId,\n\t\t\t\t\t\torder_key: orderDetails.orderKey,\n\t\t\t\t\t\tsource : orderDetails.source,\n\t\t\t\t\t\t// nonce_ajax: pmw.nonce_ajax,\n\t\t\t\t\t}),\n\t\t\t\t\tkeepalive: true,\n\t\t\t\t\tredirect : \"error\",\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tconst responseJson = await response.json();\n\n\t\t\tif (responseJson.success) {\n\t\t\t\tpmw.console.log(\"\", responseJson.data);\n\t\t\t} else {\n\t\t\t\tpmw.console.error(\"\", responseJson.data);\n\t\t\t}\n\n\t\t} catch (e) {\n\t\t\tconsole.error(e);\n\t\t}\n\t};\n\n\tpmw.getProductIdByCartItemElement = element => {\n\n\t\tconst href = jQuery(element).find(\".product-remove\").find(\"a\").attr(\"href\");\n\t\tif (href) return pmw.getProductIdByCartItemKeyUrl(new URL(href));\n\n\t\tconst productId = jQuery(element).find(\"[data-product_id]\").first().attr(\"data-product_id\");\n\t\treturn productId ? productId : null;\n\t};\n\n\tpmw.getProductQuantityByCartItemElement = element => {\n\n\t\treturn jQuery(element).find(\".qty\").val() || null;\n\t};\n\n\tpmw.getProductIdByCartItemKeyUrl = url => {\n\n\t\tlet searchParams = new URLSearchParams(url.search);\n\t\tlet cartItemKey = searchParams.get(\"remove_item\");\n\n\t\tlet productId;\n\n\t\tif (pmwDataLayer.cart_item_keys[cartItemKey][\"variation_id\"] === 0) {\n\t\t\tproductId = pmwDataLayer.cart_item_keys[cartItemKey][\"product_id\"];\n\t\t} else {\n\t\t\tproductId = pmwDataLayer.cart_item_keys[cartItemKey][\"variation_id\"];\n\t\t}\n\n\t\treturn productId;\n\t};\n\n\tpmw.getAddToCartLinkProductIds = () =>\n\t\tjQuery(\"a\").map(function () {\n\t\t\tlet href = jQuery(this).attr(\"href\");\n\n\t\t\tif (href && href.includes(\"?add-to-cart=\")) {\n\t\t\t\tlet matches = href.match(/(add-to-cart=)(\\d+)/);\n\t\t\t\tif (matches) return matches[2];\n\t\t\t}\n\t\t}).get();\n\n\tpmw.getProductDetailsFormattedForEvent = (productId, quantity = 1) => {\n\n\t\t// If pmwDataLayer.products[productId] doesn't exist, return an empty object\n\t\tif (!pmwDataLayer.products[productId]) return null;\n\n\t\tlet product = {\n\t\t\tid : productId.toString(),\n\t\t\tdyn_r_ids : pmwDataLayer.products[productId].dyn_r_ids,\n\t\t\tname : pmwDataLayer.products[productId].name,\n\t\t\tlist_name : pmwDataLayer.shop.list_name,\n\t\t\tbrand : pmwDataLayer.products[productId].brand,\n\t\t\tcategory : pmwDataLayer.products[productId].category,\n\t\t\tvariant : pmwDataLayer.products[productId].variant,\n\t\t\tlist_position: pmwDataLayer.products[productId].position,\n\t\t\tquantity : quantity,\n\t\t\tprice : pmwDataLayer.products[productId].price,\n\t\t\tcurrency : pmwDataLayer.shop.currency,\n\t\t\tis_variable : pmwDataLayer.products[productId].is_variable,\n\t\t\tis_variation : pmwDataLayer.products[productId].is_variation,\n\t\t\tparent_id : pmwDataLayer.products[productId].parent_id,\n\t\t};\n\n\t\tif (product.is_variation) product[\"parent_id_dyn_r_ids\"] = pmwDataLayer.products[productId].parent_id_dyn_r_ids;\n\n\t\treturn product;\n\t};\n\n\tpmw.getClidFromBrowser = (clidId = \"gclid\") => {\n\n\t\tlet clidCookieId;\n\n\t\tclidCookieId = {\n\t\t\tgclid: \"_gcl_aw\",\n\t\t\tdclid: \"_gcl_dc\",\n\t\t};\n\n\t\tif (pmw.getCookie(clidCookieId[clidId])) {\n\n\t\t\tlet clidCookie = pmw.getCookie(clidCookieId[clidId]);\n\t\t\tlet matches = clidCookie.match(/(GCL.[\\d]*.)(.*)/);\n\t\t\treturn matches[2];\n\t\t} else {\n\t\t\treturn \"\";\n\t\t}\n\t};\n\n\tpmw.getUserAgent = () => navigator.userAgent;\n\n\tpmw.getViewPort = () => ({\n\t\twidth : Math.max(document.documentElement.clientWidth || 0, window.innerWidth || 0),\n\t\theight: Math.max(document.documentElement.clientHeight || 0, window.innerHeight || 0),\n\t});\n\n\n\tpmw.consoleLogVersion = () => {\n\t\tconsole.log(pmwDataLayer.version);\n\t};\n\n\t/**\n\t * Loads a script and caches it using native browser caching.\n\t *\n\t * Uses script tag injection which:\n\t * - Leverages browser's HTTP cache (respects Cache-Control headers)\n\t * - Avoids CORS preflight issues (no custom headers sent)\n\t * - Auto-executes the script on load\n\t * - Prevents duplicate script loading\n\t *\n\t * This code is .thenable\n\t */\n\n\tconst loadedScripts = new Set();\n\n\tpmw.loadScriptAndCacheIt = (url, fallbackUrl) => {\n\n\t\t// Return resolved promise if script already loaded\n\t\tif (loadedScripts.has(url)) {\n\t\t\tpmw.console.log(\"Script already loaded: \" + url);\n\t\t\treturn Promise.resolve();\n\t\t}\n\n\t\tconst loadScript = (scriptUrl) => {\n\t\t\treturn new Promise((resolve, reject) => {\n\n\t\t\t\t// Check if script tag already exists in DOM\n\t\t\t\tif (document.querySelector(`script[src=\"${scriptUrl}\"]`)) {\n\t\t\t\t\tloadedScripts.add(scriptUrl);\n\t\t\t\t\tpmw.console.log(\"Script tag already exists: \" + scriptUrl);\n\t\t\t\t\tresolve();\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tconst script = document.createElement(\"script\");\n\t\t\t\tscript.src = scriptUrl;\n\t\t\t\tscript.async = true;\n\t\t\t\tscript.crossOrigin = \"anonymous\"; // Enables CORS without sending credentials, avoids preflight issues\n\n\t\t\t\tscript.onload = () => {\n\t\t\t\t\tloadedScripts.add(scriptUrl);\n\t\t\t\t\tpmw.console.log(\"Successfully loaded script: \" + scriptUrl);\n\t\t\t\t\tresolve();\n\t\t\t\t};\n\n\t\t\t\tscript.onerror = () => {\n\t\t\t\t\tscript.remove(); // Clean up failed script tag\n\t\t\t\t\treject(new Error(\"Script failed to load: \" + scriptUrl));\n\t\t\t\t};\n\n\t\t\t\tdocument.head.appendChild(script);\n\t\t\t});\n\t\t};\n\n\t\treturn loadScript(url)\n\t\t\t.catch(() => {\n\t\t\t\tif (fallbackUrl) {\n\t\t\t\t\tpmw.console.log(\"Primary script failed, loading fallback: \" + fallbackUrl);\n\t\t\t\t\treturn loadScript(fallbackUrl);\n\t\t\t\t}\n\t\t\t\tthrow new Error(\"Primary script failed to load, and no fallback URL provided.\");\n\t\t\t})\n\t\t\t.catch((error) => {\n\t\t\t\tif (error.message.includes(\"fallback\")) {\n\t\t\t\t\tthrow error; // Re-throw if it's already the \"no fallback\" error\n\t\t\t\t}\n\t\t\t\tthrow new Error(\"Both primary and fallback scripts failed to load.\");\n\t\t\t});\n\t};\n\n\tpmw.getOrderItemPrice = orderItem => (orderItem.total + orderItem.total_tax) / orderItem.quantity;\n\n\tpmw.hasLoginEventFired = () => {\n\t\tlet data = pmw.getSessionData();\n\t\treturn data?.loginEventFired;\n\t};\n\n\tpmw.setLoginEventFired = () => {\n\t\tlet data = pmw.getSessionData();\n\t\tdata[\"loginEventFired\"] = true;\n\t\tpmw.setSessionData(data);\n\t};\n\n\tpmw.pageLoaded = async () => new Promise(resolve => {\n\t\t(function waitForVar() {\n\t\t\tif (\"complete\" === document.readyState) return resolve();\n\t\t\tsetTimeout(waitForVar, 50);\n\t\t})();\n\t});\n\n\tpmw.pageReady = () => {\n\t\treturn new Promise(resolve => {\n\t\t\t(function waitForVar() {\n\t\t\t\tif (\"interactive\" === document.readyState || \"complete\" === document.readyState) return resolve();\n\t\t\t\tsetTimeout(waitForVar, 50);\n\t\t\t})();\n\t\t});\n\t};\n\n\tpmw.isMiniCartActive = () => {\n\t\tif (window.sessionStorage) {\n\t\t\tObject.keys(window.sessionStorage).forEach(key => {\n\t\t\t\tif (key.includes(\"wc_fragments\")) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\n\t\treturn false;\n\t};\n\n\tpmw.doesWooCommerceCartExist = () => document.cookie.includes(\"woocommerce_items_in_cart\");\n\n\tpmw.urlHasParameter = parameter => {\n\t\tlet urlParams = new URLSearchParams(window.location.search);\n\t\treturn urlParams.has(parameter);\n\t};\n\n\tpmw.getUrlParameter = parameter => {\n\t\tlet urlParams = new URLSearchParams(window.location.search);\n\t\treturn urlParams.get(parameter);\n\t};\n\n\t// https://stackoverflow.com/a/60606893/4688612\n\tpmw.hashAsync = (algo, str) => {\n\t\treturn crypto.subtle.digest(algo, new TextEncoder(\"utf-8\").encode(str)).then(buf => {\n\t\t\treturn Array.prototype.map.call(new Uint8Array(buf), x => ((\"00\" + x.toString(16)).slice(-2))).join(\"\");\n\t\t});\n\t};\n\n\tpmw.getCartValue = () => {\n\n\t\tlet value = 0;\n\n\t\tif (pmwDataLayer?.cart) {\n\n\t\t\tfor (const key in pmwDataLayer.cart) {\n\t\t\t\t// content_ids.push(pmwDataLayer.products[key].dyn_r_ids[pmwDataLayer.pixels.facebook.dynamic_remarketing.id_type])\n\n\t\t\t\tlet product = pmwDataLayer.cart[key];\n\n\t\t\t\tvalue += product.quantity * product.price;\n\t\t\t}\n\t\t}\n\n\t\treturn value;\n\t};\n\n\t/**\n\t * Detect if the current URL contains at least one pattern\n\t *\n\t * @param patterns\n\t * @returns {boolean}\n\t */\n\tpmw.doesUrlContainPatterns = patterns => {\n\n\t\tfor (const pattern of patterns) {\n\t\t\tif (new RegExp(pattern).test(window.location.href)) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\n\t\treturn false;\n\t};\n\n\t/**\n\t * Detect if the current URL contains at least one pattern that is on the tracking exclusion list\n\t *\n\t * https://www.linkedin.com/pulse/how-remove-google-robot-problem-via-gtm-facebook-pixel-hjelpdahl/\n\t * https://www.youtube.com/watch?v=b4I1ePZt8Z0\n\t *\n\t * @returns {boolean}\n\t */\n\tpmw.excludeDomainFromTracking = () => {\n\n\t\tlet exclude_domains = [\n\t\t\t\"appspot.com\",\n\t\t\t\"translate.google.com\",\n\t\t];\n\n\t\tif (pmwDataLayer?.general?.exclude_domains) {\n\t\t\texclude_domains = [...exclude_domains, ...pmwDataLayer.general.exclude_domains];\n\t\t}\n\n\t\t// Abort if URL contains excluded domains\n\t\tif (exclude_domains.some(domain => window.location.href.includes(domain))) {\n\t\t\tconsole.debug(\"Pixel Manager: Aborted due to excluded domain\");\n\t\t\treturn true;\n\t\t}\n\n\t\treturn false;\n\t};\n\n\t/**\n\t * Get a random event ID\n\t *\n\t * @param length\n\t * @return {string}\n\t */\n\tpmw.getRandomEventId = (length = 16) => {\n\t\tlet id = \"\";\n\t\twhile (id.length < length) {\n\t\t\tid += (Math.random() + 1).toString(36).substring(2);\n\t\t}\n\t\treturn id.substring(0, length);\n\t};\n\n\tpmw.pmwConsoleMessage = () => {\n\t\tlet message = \"Pixel Manager for WooCommerce: \";\n\t\tmessage += pmwDataLayer.version.pro ? \"pro\" : \"free\";\n\t\tmessage += \" | distro: \" + pmwDataLayer.version.distro;\n\t\tif (pmwDataLayer.version.distro === \"fms\" && pmwDataLayer.version.pro) {\n\t\t\tmessage += \" | active license: \" + (pmwDataLayer.version.eligible_for_updates ? \"yes\" : \"no\");\n\t\t}\n\t\tmessage += \" | version: \" + pmwDataLayer.version.number;\n\n\t\tif (pmwDataLayer.version.show === true) {\n\t\t\tconsole.log(message);\n\t\t} else {\n\t\t\tpmw.console.log(message);\n\t\t}\n\t};\n\n\tpmw.canLoadPremiumFeatures = () => {\n\t\treturn (pmwDataLayer.version.distro === \"fms\" && pmwDataLayer.version.pro && pmwDataLayer.version.eligible_for_updates) || pmwDataLayer.version.distro === \"wcm\";\n\t};\n\n\t/**\n\t * State if the pmw:dom:ready event has been fired\n\t *\n\t * @type {boolean}\n\t */\n\tlet pmwDomReadyFired = false;\n\n\n\t/**\n\t * Trigger the pmw:dom:ready event\n\t *\n\t * @returns {void}\n\t */\n\tpmw.triggerPmwDomReadyEvent = () => {\n\n\t\t// If the event has already been fired, return\n\t\tif (pmwDomReadyFired) return;\n\n\t\t// If the document is already loaded, fire the event\n\t\tif (document.readyState === \"complete\") {\n\t\t\tfirePmwDomReadyEvent();\n\t\t\treturn;\n\t\t}\n\n\t\t// Continue processing if the DOM has not yet been loaded\n\t\t// and attach the event listener to the DOMContentLoaded,\n\t\t// once through jQuery and once through the native DOM API\n\t\t// to maximize compatibility\n\n\t\t// If jQuery is available, use it to fire add the event listener\n\t\tjQuery(() => {\n\t\t\tfirePmwDomReadyEvent();\n\t\t});\n\n\t\t// Also add the event listener using the native DOM API\n\t\tdocument.addEventListener(\"DOMContentLoaded\", () => {\n\t\t\tfirePmwDomReadyEvent();\n\t\t}, true);\n\t};\n\n\t/**\n\t * Fire the pmw:dom:ready event\n\t *\n\t * @returns {void}\n\t */\n\tconst firePmwDomReadyEvent = () => {\n\n\t\t// If the event has already been fired, return\n\t\tif (pmwDomReadyFired) return;\n\n\t\t// Fire the event\n\t\tdocument.dispatchEvent(new Event(\"pmw:dom:ready\"));\n\n\t\t// Set the flag to true to indicate that the event has been fired\n\t\tpmwDomReadyFired = true;\n\t};\n\n\tpmw.getEmailFromTarget = target => {\n\n\t\t// Only try to add the clicked email if href is set\n\t\tif (target.href) {\n\n\t\t\t// Get the email from the link\n\t\t\t// But only if there is a valid email address in the link\n\t\t\t// Also, the href may contain other parameters, so we need to check for that and remove them\n\t\t\tlet email = target.href.replace(\"mailto:\", \"\");\n\n\n\t\t\tif (email.indexOf(\"?\") > -1) {\n\t\t\t\temail = email.split(\"?\")[0];\n\t\t\t}\n\n\t\t\t// Trim the email and remove all whitespaces\n\t\t\temail = email.replace(/\\s/g, \"\");\n\n\t\t\t// If the email is not empty and valid, add it to the data object\n\t\t\tif (email && pmw.isEmail(email)) {\n\t\t\t\treturn email;\n\t\t\t}\n\t\t}\n\n\t\treturn \"\";\n\t};\n\n\tpmw.sendEventPayloadToServer = payload => {\n\t\tif (typeof pmw.sendEventPayloadToServerPremium === \"function\") {\n\t\t\tpmw.sendEventPayloadToServerPremium(payload);\n\t\t}\n\t};\n\n\t/**\n\t * Waits for all active pixels to load and then triggers the page view event.\n\t *\n\t * @return {Promise<unknown>}\n\t *\n\t * @since 1.49.0\n\t */\n\tpmw.waitForPixelsAndTriggerPageView = async () => {\n\n\t\treturn new Promise(resolve => {\n\n\t\t\t// Check if at least one pixel is active in the data layer\n\t\t\tif (!pmwDataLayer?.pixels) {\n\t\t\t\tpmw.console.error(\"pmwDataLayer or pmwDataLayer.pixels is not defined, triggering page view event immediately.\");\n\t\t\t\tdocument.dispatchEvent(new Event(\"pmw:page-view\"));\n\t\t\t\tresolve();\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tlet activePixels = pmwDataLayer?.general?.server_2_server?.pageview_event_s2s?.pixels || [];\n\n\t\t\t// This line filters the activePixels array, keeping only those pixel names that exist as keys\n\t\t\t// in the pmwDataLayer.pixels object (i.e., only pixels that are currently defined/active in the data layer)\n\t\t\tactivePixels = activePixels.filter(pixelName => pmwDataLayer.pixels[pixelName]);\n\n\t\t\t// If no pixels to check, trigger event immediately\n\t\t\tif (activePixels.length === 0) {\n\t\t\t\tpmw.console.log(\"No specific pixels to wait for, triggering page view event.\");\n\t\t\t\tdocument.dispatchEvent(new Event(\"pmw:page-view\"));\n\t\t\t\tresolve();\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Check if all active pixels are loaded\n\t\t\tconst checkPixelsLoaded = () => {\n\t\t\t\tconst allLoaded = activePixels.every(pixelName =>\n\t\t\t\t\t!pmwDataLayer.pixels[pixelName] || pmwDataLayer.pixels[pixelName].loaded);\n\n\t\t\t\tif (allLoaded) {\n\t\t\t\t\t// pmw.console.log(\"All specified pixels to track s2s page-view events have been loaded. Triggering page-view event.\");\n\t\t\t\t\tdocument.dispatchEvent(new Event(\"pmw:page-view\"));\n\t\t\t\t\tresolve();\n\t\t\t\t} else {\n\t\t\t\t\tsetTimeout(checkPixelsLoaded, 100);\n\t\t\t\t}\n\t\t\t};\n\n\t\t\tcheckPixelsLoaded();\n\t\t});\n\t};\n\n\tpmw.isWooCommerceActive = () => {\n\t\treturn !!pmwDataLayer.shop;\n\t};\n\n\t/**\n\t * Retrieves the product ID associated with a specific pixel.\n\t *\n\t * @param {string} pixelId - The ID of the pixel to get the product ID for.\n\t * @returns {string|null} - The product ID associated with the given pixel ID,\n\t * or null if no product ID is found.\n\t */\n\tpmw.getProductIdForSpecificPixel = (product, pixelName) => {\n\t\treturn String(product.dyn_r_ids[pmwDataLayer.pixels[pixelName].dynamic_remarketing.id_type]);\n\t};\n\n\tpmw.isInWooCommerceSesssion = () => {\n\n\t\tif (pmwDataLayer?.shop?.session_active) return true;\n\n\t\tlet regex = new RegExp(\"woocommerce_cart_hash\");\n\t\tlet wcSessionCookie = pmw.getCookieThatContainsRegex(regex);\n\n\t\tif (wcSessionCookie) return true;\n\n\t\treturn false;\n\t};\n\n\tpmw.isNotInWooCommerceSesssion = () => {\n\t\treturn !pmw.isInWooCommerceSesssion();\n\t};\n\n\tpmw.makeFullUrl = url => {\n\n\t\t// Trim any leading or trailing whitespace\n\t\turl = url.trim();\n\n\t\t// Check if the URL already contains a protocol\n\t\tif (/^(http:\\/\\/|https:\\/\\/)/.test(url)) {\n\t\t\treturn url;\n\t\t}\n\n\t\t// Remove leading slashes\n\t\turl = url.replace(/^\\/+/, \"\");\n\n\t\t// Add 'https://' as default protocol\n\t\treturn \"https://\" + url;\n\t};\n\n\tpmw.registerShowVariationEventListener = () => {\n\t\tlet previousVariationId = null;\n\n\t\tjQuery(\".single_variation_wrap\").on(\"show_variation\", (event, variation) => {\n\n\t\t\t// Abort if lazy loading is enabled\n\t\t\t// if (pmwDataLayer?.general?.lazy_load_pmw) return;\n\n\t\t\ttry {\n\t\t\t\t// If variations_output is disabled, don't fire view_item events from show_variation\n\t\t\t\t// because the parent product view_item is already triggered on page load\n\t\t\t\tif (!pmwDataLayer?.shop?.variations_output) return;\n\n\t\t\t\tlet productId = pmw.getIdBasedOndVariationsOutputSetting(variation.variation_id);\n\n\t\t\t\tif (!productId) throw Error(\"Wasn't able to retrieve a productId\");\n\n\t\t\t\t// If the variation id is not the same as the previous one, run the function\n\t\t\t\tif (previousVariationId !== variation.variation_id) {\n\t\t\t\t\tpmw.triggerViewItemEventPrep(productId);\n\t\t\t\t\tpreviousVariationId = variation.variation_id;\n\t\t\t\t}\n\n\t\t\t} catch (e) {\n\t\t\t\tconsole.error(e);\n\t\t\t}\n\t\t});\n\t};\n\n\t/**\n\t * Initializes the command queue for the application to ensure that commands\n\t * are queued and executed in a controlled manner. This function sets up\n\t * the underlying mechanism to manage and process commands effectively.\n\t *\n\t * Typically, the command queue is used by external developers\n\t * who want to make sure that their Pixel Manager API calls safely get executed,\n\t * no matter if the initialization order of the Pixel Manager is shuffled,\n\t * delayed, or lazy loaded.\n\t *\n\t * @since 1.49.0\n\t */\n\tpmw.initializeCommandQueue = () => {\n\n\t\tconst queue = window._pmwq = window._pmwq || [];\n\n\t\tqueue.forEach(function (fn) {\n\t\t\tif (typeof fn === \"function\") {\n\t\t\t\ttry {\n\t\t\t\t\tfn();\n\t\t\t\t} catch (e) {\n\t\t\t\t\tpmw.console.error(\"Error executing queued command:\", e);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t\t// Override push to execute commands immediately now that PMW is ready\n\t\tqueue.push = function (fn) {\n\t\t\tif (typeof fn === \"function\") {\n\t\t\t\ttry {\n\t\t\t\t\tfn();\n\t\t\t\t} catch (e) {\n\t\t\t\t\tpmw.console.error(\"Error executing command from queue:\", e);\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t};\n\n}(window.pmw = window.pmw || {}, jQuery));\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n// expose the modules object (__webpack_modules__)\n__webpack_require__.m = __webpack_modules__;\n\n","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.f = {};\n// This file contains only the entry chunk.\n// The chunk loading function for additional chunks\n__webpack_require__.e = (chunkId) => {\n\treturn Promise.all(Object.keys(__webpack_require__.f).reduce((promises, key) => {\n\t\t__webpack_require__.f[key](chunkId, promises);\n\t\treturn promises;\n\t}, []));\n};","// This function allow to reference async chunks\n__webpack_require__.u = (chunkId) => {\n\t// return url for filenames based on template\n\treturn \"\" + {\"194\":\"wc-hooks\",\"264\":\"deprecated-functions\",\"526\":\"pixel-facebook\",\"625\":\"consent-management\",\"671\":\"pixel-google\",\"712\":\"pixel-crazyegg\",\"818\":\"pixel-hotjar\",\"968\":\"consent-api\",\"972\":\"doofinder-listener\"}[chunkId] + \".\" + {\"194\":\"c871cc71\",\"264\":\"08bc16f9\",\"526\":\"1aad8345\",\"625\":\"9d45b6cb\",\"671\":\"87d84819\",\"712\":\"badd0e8f\",\"818\":\"c3ec2dc3\",\"968\":\"c33d5439\",\"972\":\"5dc21f92\"}[chunkId] + \".chunk.min.js\";\n};","__webpack_require__.g = (function() {\n\tif (typeof globalThis === 'object') return globalThis;\n\ttry {\n\t\treturn this || new Function('return this')();\n\t} catch (e) {\n\t\tif (typeof window === 'object') return window;\n\t}\n})();","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","var scriptUrl;\nif (__webpack_require__.g.importScripts) scriptUrl = __webpack_require__.g.location + \"\";\nvar document = __webpack_require__.g.document;\nif (!scriptUrl && document) {\n\tif (document.currentScript && document.currentScript.tagName.toUpperCase() === 'SCRIPT')\n\t\tscriptUrl = document.currentScript.src;\n\tif (!scriptUrl) {\n\t\tvar scripts = document.getElementsByTagName(\"script\");\n\t\tif(scripts.length) {\n\t\t\tvar i = scripts.length - 1;\n\t\t\twhile (i > -1 && (!scriptUrl || !/^http(s?):/.test(scriptUrl))) scriptUrl = scripts[i--].src;\n\t\t}\n\t}\n}\n// When supporting browsers where an automatic publicPath is not supported you must specify an output.publicPath manually via configuration\n// or pass an empty string (\"\") and set the __webpack_public_path__ variable from your code to use your own logic.\nif (!scriptUrl) throw new Error(\"Automatic publicPath is not supported in this browser\");\nscriptUrl = scriptUrl.replace(/^blob:/, \"\").replace(/#.*$/, \"\").replace(/\\?.*$/, \"\").replace(/\\/[^\\/]+$/, \"/\");\n__webpack_require__.p = scriptUrl;","// no baseURI\n\n// object to store loaded and loading chunks\n// undefined = chunk not loaded, null = chunk preloaded/prefetched\n// [resolve, reject, Promise] = chunk loading, 0 = chunk loaded\nvar installedChunks = {\n\t792: 0\n};\n\n__webpack_require__.f.j = (chunkId, promises) => {\n\t\t// JSONP chunk loading for javascript\n\t\tvar installedChunkData = __webpack_require__.o(installedChunks, chunkId) ? installedChunks[chunkId] : undefined;\n\t\tif(installedChunkData !== 0) { // 0 means \"already installed\".\n\n\t\t\t// a Promise means \"currently loading\".\n\t\t\tif(installedChunkData) {\n\t\t\t\tpromises.push(installedChunkData[2]);\n\t\t\t} else {\n\t\t\t\tif(true) { // all chunks have JS\n\t\t\t\t\t// setup Promise in chunk cache\n\t\t\t\t\tvar promise = new Promise((resolve, reject) => (installedChunkData = installedChunks[chunkId] = [resolve, reject]));\n\t\t\t\t\tpromises.push(installedChunkData[2] = promise);\n\n\t\t\t\t\t// start chunk loading\n\t\t\t\t\tvar url = __webpack_require__.p + __webpack_require__.u(chunkId);\n\t\t\t\t\t// create error before stack unwound to get useful stacktrace later\n\t\t\t\t\tvar error = new Error();\n\t\t\t\t\tvar loadingEnded = (event) => {\n\t\t\t\t\t\tif(__webpack_require__.o(installedChunks, chunkId)) {\n\t\t\t\t\t\t\tinstalledChunkData = installedChunks[chunkId];\n\t\t\t\t\t\t\tif(installedChunkData !== 0) installedChunks[chunkId] = undefined;\n\t\t\t\t\t\t\tif(installedChunkData) {\n\t\t\t\t\t\t\t\tvar errorType = event && (event.type === 'load' ? 'missing' : event.type);\n\t\t\t\t\t\t\t\tvar realSrc = event && event.target && event.target.src;\n\t\t\t\t\t\t\t\terror.message = 'Loading chunk ' + chunkId + ' failed.\\n(' + errorType + ': ' + realSrc + ')';\n\t\t\t\t\t\t\t\terror.name = 'ChunkLoadError';\n\t\t\t\t\t\t\t\terror.type = errorType;\n\t\t\t\t\t\t\t\terror.request = realSrc;\n\t\t\t\t\t\t\t\tinstalledChunkData[1](error);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\t\t\t\t\t__webpack_require__.l(url, loadingEnded, \"chunk-\" + chunkId, chunkId);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n};\n\n// no prefetching\n\n// no preloaded\n\n// no HMR\n\n// no HMR manifest\n\n// no on chunks loaded\n\n// install a JSONP callback for chunk loading\nvar webpackJsonpCallback = (parentChunkLoadingFunction, data) => {\n\tvar [chunkIds, moreModules, runtime] = data;\n\t// add \"moreModules\" to the modules object,\n\t// then flag all \"chunkIds\" as loaded and fire callback\n\tvar moduleId, chunkId, i = 0;\n\tif(chunkIds.some((id) => (installedChunks[id] !== 0))) {\n\t\tfor(moduleId in moreModules) {\n\t\t\tif(__webpack_require__.o(moreModules, moduleId)) {\n\t\t\t\t__webpack_require__.m[moduleId] = moreModules[moduleId];\n\t\t\t}\n\t\t}\n\t\tif(runtime) var result = runtime(__webpack_require__);\n\t}\n\tif(parentChunkLoadingFunction) parentChunkLoadingFunction(data);\n\tfor(;i < chunkIds.length; i++) {\n\t\tchunkId = chunkIds[i];\n\t\tif(__webpack_require__.o(installedChunks, chunkId) && installedChunks[chunkId]) {\n\t\t\tinstalledChunks[chunkId][0]();\n\t\t}\n\t\tinstalledChunks[chunkId] = 0;\n\t}\n\n}\n\nvar chunkLoadingGlobal = self[\"webpackChunkPixel_Manager_for_WooCommerce\"] = self[\"webpackChunkPixel_Manager_for_WooCommerce\"] || [];\nchunkLoadingGlobal.forEach(webpackJsonpCallback.bind(null, 0));\nchunkLoadingGlobal.push = webpackJsonpCallback.bind(null, chunkLoadingGlobal.push.bind(chunkLoadingGlobal));","/**\n * Run PMW main loader\n */\n\nconst main = async () => {\n\n\trequire(\"./pmw/functions_main\");\n\trequire(\"./version.js\");\n\n\t// Wait until jQuery is loaded\n\tawait pmw.jQueryExists();\n\n\t// Wait until pmwDataLayer is loaded\n\tawait pmw.dataLayerFullyLoaded();\n\n\t/**\n\t * Set webpack public path for chunk loading\n\t * This ensures chunks load correctly even when scripts are combined/moved \n\t * by optimization plugins (SiteGround, Autoptimize, WP Rocket, etc.)\n\t */\n\tif (pmwDataLayer?.general?.chunk_base_path) {\n\t\t// eslint-disable-next-line no-undef, camelcase\n\t\t__webpack_public_path__ = pmwDataLayer.general.chunk_base_path;\n\t}\n\n\t// wait 1000ms\n\t// await new Promise(resolve => setTimeout(resolve, 1000))\n\n\t// Load all essential scripts first\n\trequire(\"./pmw/functions_loader\");\n\t\n\t// Load new event filtering system\n\trequire(\"./pmw/hooks\");\n\trequire(\"./pmw/pixel-registry\");\n\trequire(\"./pmw/event-processor\");\n\n\t// Initialize command queue early so filters can be registered before events fire\n\tpmw.initializeCommandQueue();\n\n\t// Output PMW console message\n\tpmw.pmwConsoleMessage();\n\n\t// Load the consent management module as a chunk\n\tawait pmw.loadConsentModule();\n\tawait pmw.consent.load();\n\n\t// Doesn't work if we listen to pmw:dom:ready because it runs too late\n\t// (at the end of the main.js file)\n\t// TODO: Find out why that order is important and optimize it. It is also difficult to test. In Cypress it works just with \"pmw:dom:ready\"\n\tjQuery(() => {\n\t\trequire(\"./pmw/event_listeners_on_ready\");\n\t});\n\n\t// Load remaining event listeners\n\trequire(\"./pmw/event_listeners\");\n\t\n\t// Load doofinder listener as a chunk\n\timport(/* webpackChunkName: \"doofinder-listener\" */ \"./pmw/listeners/doofinder\");\n\n\tpmw.loadWcHooksFunctions();\n\n\t// Check if domain is excluded from tracking\n\t// If so, return\n\tif (pmw.excludeDomainFromTracking()) return;\n\n\t// Load pixels dynamically based on configuration\n\tconst pixelLoaders = [];\n\n\t// Load free pixels conditionally\n\tif (pmwDataLayer?.pixels?.google) {\n\t\tpixelLoaders.push(\n\t\t\timport(/* webpackChunkName: \"pixel-google\" */ \"./pixels/google/loader\")\n\t\t);\n\t}\n\t\n\tif (pmwDataLayer?.pixels?.facebook) {\n\t\tpixelLoaders.push(\n\t\t\timport(/* webpackChunkName: \"pixel-facebook\" */ \"./pixels/facebook/loader\")\n\t\t);\n\t}\n\t\n\tif (pmwDataLayer?.pixels?.hotjar) {\n\t\tpixelLoaders.push(\n\t\t\timport(/* webpackChunkName: \"pixel-hotjar\" */ \"./pixels/hotjar/loader\")\n\t\t);\n\t}\n\n\tif (pmwDataLayer?.pixels?.crazyegg) {\n\t\tpixelLoaders.push(\n\t\t\timport(/* webpackChunkName: \"pixel-crazyegg\" */ \"./pixels/crazyegg/loader\")\n\t\t);\n\t}\n\n\t// #if process.env.TIER === 'premium'\n// \t/**\n// \t * Load premium pixels conditionally\n// \t */\n// \tif (pmw.canLoadPremiumFeatures()) {\n// \t\tpixelLoaders.push(\n// \t\t\timport(/* webpackChunkName: \"pmw-premium-events\" */ \"./pmw/event_listeners_premium\")\n// \t\t);\n// \n// \t\tif (pmwDataLayer?.pixels?.contentsquare) {\n// \t\t\tpixelLoaders.push(\n// \t\t\t\timport(/* webpackChunkName: \"pixel-contentsquare\" */ \"./pixels/contentsquare/loader\")\n// \t\t\t);\n// \t\t}\n// \n// \t\tif (pmwDataLayer?.pixels?.adroll) {\n// \t\t\tpixelLoaders.push(\n// \t\t\t\timport(/* webpackChunkName: \"pixel-adroll\" */ \"./pixels/adroll/loader\")\n// \t\t\t);\n// \t\t}\n// \t\t\n// \t\tif (pmwDataLayer?.pixels?.linkedin) {\n// \t\t\tpixelLoaders.push(\n// \t\t\t\timport(/* webpackChunkName: \"pixel-linkedin\" */ \"./pixels/linkedin/loader\")\n// \t\t\t);\n// \t\t}\n// \t\t\n// \t\tif (pmwDataLayer?.pixels?.bing) {\n// \t\t\tpixelLoaders.push(\n// \t\t\t\timport(/* webpackChunkName: \"pixel-microsoft\" */ \"./pixels/microsoft-ads/loader\")\n// \t\t\t);\n// \t\t}\n// \t\t\n// \t\tif (pmwDataLayer?.pixels?.outbrain) {\n// \t\t\tpixelLoaders.push(\n// \t\t\t\timport(/* webpackChunkName: \"pixel-outbrain\" */ \"./pixels/outbrain/loader\")\n// \t\t\t);\n// \t\t}\n// \t\t\n// \t\tif (pmwDataLayer?.pixels?.pinterest) {\n// \t\t\tpixelLoaders.push(\n// \t\t\t\timport(/* webpackChunkName: \"pixel-pinterest\" */ \"./pixels/pinterest/loader\")\n// \t\t\t);\n// \t\t}\n// \t\t\n// \t\tif (pmwDataLayer?.pixels?.snapchat) {\n// \t\t\tpixelLoaders.push(\n// \t\t\t\timport(/* webpackChunkName: \"pixel-snapchat\" */ \"./pixels/snapchat/loader\")\n// \t\t\t);\n// \t\t}\n// \t\t\n// \t\tif (pmwDataLayer?.pixels?.taboola) {\n// \t\t\tpixelLoaders.push(\n// \t\t\t\timport(/* webpackChunkName: \"pixel-taboola\" */ \"./pixels/taboola/loader\")\n// \t\t\t);\n// \t\t}\n// \t\t\n// \t\tif (pmwDataLayer?.pixels?.tiktok) {\n// \t\t\tpixelLoaders.push(\n// \t\t\t\timport(/* webpackChunkName: \"pixel-tiktok\" */ \"./pixels/tiktok/loader\")\n// \t\t\t);\n// \t\t}\n// \t\t\n// \t\tif (pmwDataLayer?.pixels?.twitter) {\n// \t\t\tpixelLoaders.push(\n// \t\t\t\timport(/* webpackChunkName: \"pixel-twitter\" */ \"./pixels/twitter/loader\")\n// \t\t\t);\n// \t\t}\n// \t\t\n// \t\tif (pmwDataLayer?.pixels?.reddit) {\n// \t\t\tpixelLoaders.push(\n// \t\t\t\timport(/* webpackChunkName: \"pixel-reddit\" */ \"./pixels/reddit/loader\")\n// \t\t\t);\n// \t\t}\n// \t\t\n// \t\tif (pmwDataLayer?.pixels?.vwo) {\n// \t\t\tpixelLoaders.push(\n// \t\t\t\timport(/* webpackChunkName: \"pixel-vwo\" */ \"./pixels/vwo/loader\")\n// \t\t\t);\n// \t\t}\n// \t}\n\t// #endif\n\n\t// Load all active pixels in parallel\n\tawait Promise.all(pixelLoaders);\n\n\t/** Load the deprecated functions as a chunk (if enabled) */\n\tif (pmwDataLayer?.general?.modules?.load_deprecated_functions !== false) {\n\t\tconst {loadDeprecatedFunctions} = await import(/* webpackChunkName: \"deprecated-functions\" */ \"./pmw/deprecated.mjs\");\n\t\tloadDeprecatedFunctions();\n\t}\n\n\t// Preload pixels\n\tdocument.dispatchEvent(new Event(\"pmw:load-pixels\"));\n\n\t// Trigger pmwLoad event\n\tdocument.dispatchEvent(new Event(\"pmwLoad\"));\n\n\t// Wait until page is loaded\n\tawait pmw.pageLoaded();\n\n\tdocument.dispatchEvent(new Event(\"pmw:ready\"));\n\tpmw.triggerPmwDomReadyEvent();\n\n\t// Check if the library version matches the PMW version that's installed on the server\n\tpmw.checkLibraryVersion();\n};\n\nmain();\n\n\n\n\n\n\n\n\n"],"names":["leafPrototypes","getProto","inProgress","dataWebpackPrefix","removeHtmlTagsAndWhitespace","string","replace","trim","jQuery","on","event","target","value","id","triggerAddShippingInfoEvent","slug","text","length","checkedShippingMethod","find","val","attr","shippingTier","document","trigger","paymentMethodChangeLogged","triggerAddPaymentInfoEvent","checkedPaymentMethod","paymentType","url","URL","currentTarget","productId","pmw","getProductIdByCartItemKeyUrl","removeProductFromCart","e","console","error","checkoutButtonSelectors","prepareSelectors","paymentMethodSelected","fireCheckoutProgress","fireCheckoutOption","initCart","pmwDataLayer","products","productIds","getAddToCartLinkProductIds","getProductsFromBackend","referrer","retrieveData","referrerHostname","hostname","window","location","host","storeData","gclid","getUrlParameter","wbraid","gbraid","fbclid","Math","floor","Date","now","ttclid","scid","epik","pmw_loaded","shop","page_type","product_type","getMainProductIdFromProductPage","product","getProductDataForViewItemEvent","variations_output","order","isOrderIdStored","writeOrderIdToStorage","key","acrRemoveCookie","user","hasLoginEventFired","setLoginEventFired","general","lazy_load_pmw","registerShowVariationEventListener","$variationForm","selectedValues","toArray","every","select","productVariations","data","matchingVariation","variation","Object","entries","attributes","triggerViewItemEventPrep","variation_id","async","log","payload","processEvent","server_2_server","pageview_event_s2s","is_active","pageViewS2SPixels","pixelRegistry","getPixelsWithCapability","s2sData","pixelName","pixels","keys","sendEventPayloadToServer","isWooCommerceActive","startIntersectionObserverToWatch","startProductsMutationObserverToWatch","waitForPixelsAndTriggerPageView","require","loadConsentModule","consentModule","consent","apiModule","api","message","objects","isLoggerEnabled","urlLoggerOff","sessionLoggerEnabled","urlLoggerOn","logger","urlHasParameter","util","ipRange_1","dot","mappedIpv4","colon","doubleColon","getIpv6Segments","ip","isIPv6","Error","test","matches","match","isIPv4","prefix","parts","split","map","x","parseInt","toString","mappedIpv4ToIpv6","_a","beforeChunk","afterChunk","beforeParts","afterParts","missingSegments","Array","concat","createChecker","subnetOrSubnets","isArray","checks_1","subnet","createSegmentChecker","address","segments","some","check","subnetAddress","prefixLengthString","prefixLength","Number","isInteger","subnetSegments","addressSegments","i","bitCount","min","exports","specialNetsCache","default","private","ipv6","localhost","Boolean","reserved","__spreadArrays","jQueryExists","Promise","resolve","waitForjQuery","setTimeout","waitForLibrary","library","timeout","interval","startTime","dataLayerFullyLoaded","checkVar","waitForVar","version","logTimeoutId","then","clearTimeout","wpHooksExists","wp","hooks","loadWcHooksFunctions","filters","addFilter","hookName","namespace","callback","priority","this","push","sort","a","b","applyFilters","args","filteredValue","filter","result","warn","removeFilter","initialLength","f","removeAllFilters","hasFilter","getFilters","IPv4","IPv6","util_1","isInSubnet","subnetsByVersion","reduce","acc","isIP","check4","check6","isIPv4MappedAddress","extractMappedIpv4","enumerable","get","isPrivate","isLocalhost","isReserved","isSpecial","getConsentContext","categories","statistics","marketing","preferences","necessary","visitor_has_chosen","settings","visitorHasChosen","explicit_mode","explicitConsentModeActive","getEventContext","timestamp","href","makeFullUrl","user_agent","navigator","userAgent","user_id","raw","eventName","eventData","event_data","context","activePixels","getActivePixels","adapter","getAdapter","adapt","pixelData","firing","getFiringDecision","dispatchToPixels","dispatchUnifiedEvent","dispatchPublicEvent","active","extractS2SData","serverPixels","getPixelsForServerFiring","firingStatus","dispatchToBrowserPixels","browserPixels","getActiveBrowserOnlyPixels","browserEventName","dispatchToS2SPixels","s2sPixels","getActiveS2SPixels","s2sEventName","publicEventName","shouldFireBrowserPixel","fire_browser","shouldFireServerPixel","fire_server","adapters","registerAdapter","options","pixelCapabilities","defaultMode","supportsS2S","mode","supportsEventDeduplication","isActive","$","undefined","isRange","isV4","isV6","getIpVersion","ipDetectionPromise","ipDetectionResolved","ipServices","fetchWithTimeout","timeoutMs","controller","AbortController","timeoutId","abort","fetch","signal","finally","getGeoInfo","cloudflare","response","ok","status","obj","pair","loc","processRegion","countryCode","service","geojs","json","country_code","region","ipinfo","country","ipapi","consent_management","restricted_regions","includes","isVisitorAllowed","JSON","parse","isBotUserAgent","ip_exclude_list","getIp","isOnIpExclusionList","isValidIpAddress","isPrivateOrReservedIp","privateRanges","range","startsWith","second","getClientIp","cachedIp","ipv6Promise","getIpWithTimeout","anyPromise","ipv6Result","anyResult","allSettled","ipVersion","race","_","reject","catch","maxServicesToCheck","validVersions","join","ipv","getIpFromAnyService","getBrowserGeoFromExternalService","performance","promises","forEach","any","toUpperCase","regionCode","toFixed","getBrowserGeo","geoFromStorage","geoInfo","gepLocationByTimeZone","getBrowserLocationByTimeZone","geoLocation","getLocationByTimeZone","ipServicesFiltered","slice","getIpFromService","timeTaken","serviceResponseData","isVisitorNotAllowed","botPatterns","getBotPatterns","pattern","toLowerCase","customPatterns","user_agent_exclude_patterns","isCidr","ipName","ipExcludeList","timezone","Intl","DateTimeFormat","resolvedOptions","timeZone","ipv4","addToCartSelectors","quantity","dataset","product_id","addProductToCart","indexOf","each","index","element","classes","getPostIdFromString","one","closest","origin","searchParams","has","nextAll","getIdBasedOndVariationsOutputSetting","getProductDetailsFormattedForEvent","isEmail","emailSelected","getProductIdByCartItemElement","getProductQuantityByCartItemElement","cart","getCartItemsFromBackend","getLibraryVersion","checkLibraryVersion","number","VALID_FIRING_MODES","capabilities","capabilityName","pixelsWithCapability","getFiringMode","s2sEnabled","decision","getPixelsForBrowserFiring","v4Seg","v4Str","IPv4Reg","RegExp","v6Seg","IPv6Reg","s","ipv4ToLong","octets","createLongChecker","addressLong","subnetLong","expandIPv6","ipaddr","ipv4Part","ipv4Regexes","ipv6Part","ipv6Regexes","matchCIDR","zoneIndex","module","first","partSize","cidrBits","part","shift","subnetMatch","rangeList","defaultName","k","len","rangeName","rangeSubnets","kind","apply","octet","prototype","toNormalizedString","toByteArray","other","cidrRange","ref","SpecialRanges","unspecified","broadcast","multicast","linkLocal","loopback","carrierGradeNat","toIPv4MappedAddress","prefixLengthFromSubnetMask","cidr","stop","zeros","zerotable","fourOctet","longValue","parser","parseIntAuto","results","reverse","zoneId","l","toRFC5952String","bestMatchIndex","bestMatchLength","regex","exec","substring","bytes","addr","suffix","call","toFixedLengthString","padStart","uniqueLocal","ipv4Mapped","rfc6145","rfc6052","teredo","toIPv4Address","high","low","transitional","colonCount","lastColon","replacement","replacementCount","lastIndexOf","substr","isValid","error1","isValidFourPartDecimal","parseCIDR","maskLength","parsed","defineProperty","subnetMaskFromPrefixLength","filledOctetCount","j","pow","broadcastAddressFromCIDR","ipInterfaceOctets","subnetMaskOctets","networkAddressFromCIDR","fromByteArray","process","commonjsGlobal","normalize","_validate","nh","sections","n","h","ns","hs","_leftPad","abbreviate","zPreviousFlag","zeroStartIndex","zeroLength","zStartIndex","zLength","section","zFlag","splice","d","p","padding","repeat","_hex2bin","hex","_bin2hex","bin","_addr2bin","binAddr","_bin2addr","binPart","hexSection","divideSubnet","mask0","mask1","limit","abbr","ret","binNetPart","binHostPart","numSubnets","binSubnet","hexAddr","binStartAddr","binEndAddr","start","end","size","randomSubnet","random","ptr","mask","err","inRange","check_range","ip6","range_data","parse_addr","parse_range","storeIP","displayIP","pmwRestSettings","isBelowRestErrorThreshold","isRestEndpointAvailable","testEndpoint","root","cookieName","method","cache","keepalive","redirect","responseJson","success","stringify","isPmwRestEndpointAvailable","orderId","orderKey","source","orderIds","storeOrderIdOnServer","order_duplication_prevention","email","quantityToRemove","storeCartData","is_variation","parent_id","selectors","type","Set","doesWooCommerceCartExist","retrieveCartData","saveCartObjectToDataLayer","ajax_url","body","URLSearchParams","action","cart_item_keys","assign","page_id","product_ids","headers","statusText","responseData","cartObject","triggerViewItemEvent","triggerViewItemEventNoProduct","step","checkout_option","triggerViewItemList","viewItemListTriggerTestMode","css","append","view_item_list_trigger","opacity","background_color","getSearchTermFromUrl","search","io","ioTimeouts","observerCallback","observer","entry","elementId","next","isIntersecting","test_mode","unobserve","remove","ioid","detectedProductTemplateClasses","nested","flat","isNestedClass","elem","className","isFlatClass","prev","hasClass","getAllElementsToWatch","getCommonIdentifiersToWatch","listOfClassNames","haveSameNestingDepth","element1","element2","parents","findCommonParentElement","parent","is","node","countOfChildren","getCommonClass","classes1","classes2","pmwProductIds","querySelectorAll","productsNode","firstChildClassAttr","children","firstChildClasses","secondChildClassAttr","commonClass","firstProductTemplateClasses","IntersectionObserver","threshold","observe","productsMutationObserver","childList","characterData","MutationObserver","mutations","mutation","newNodes","addedNodes","hasPmwProductIdElement","siblings","setCookie","cookieValue","expiryDays","setTime","getTime","expires","toUTCString","cookie","getCookie","name","ca","decodeURIComponent","c","charAt","getCookieThatContainsRegex","cookies","deleteCookie","persistent","extension","dataGetter","getPersistentData","getSessionData","dataSetter","setPersistentData","setSessionData","deleteDataKey","localStorage","removeItem","getPersistentDataKey","sessionStorage","getSessionDataKey","defaultStorageKey","storageKeySuffix","getItem","setItem","order_id","orderDetails","order_key","cartItemKey","dyn_r_ids","list_name","brand","category","variant","list_position","position","price","currency","is_variable","parent_id_dyn_r_ids","getClidFromBrowser","clidId","clidCookieId","dclid","getUserAgent","getViewPort","width","max","documentElement","clientWidth","innerWidth","height","clientHeight","innerHeight","consoleLogVersion","loadedScripts","loadScriptAndCacheIt","fallbackUrl","loadScript","scriptUrl","querySelector","add","script","createElement","src","crossOrigin","onload","onerror","head","appendChild","getOrderItemPrice","orderItem","total","total_tax","loginEventFired","pageLoaded","readyState","pageReady","isMiniCartActive","parameter","hashAsync","algo","str","crypto","subtle","digest","TextEncoder","encode","buf","Uint8Array","getCartValue","doesUrlContainPatterns","patterns","excludeDomainFromTracking","exclude_domains","domain","debug","getRandomEventId","pmwConsoleMessage","pro","distro","eligible_for_updates","show","canLoadPremiumFeatures","pmwDomReadyFired","triggerPmwDomReadyEvent","firePmwDomReadyEvent","addEventListener","dispatchEvent","Event","getEmailFromTarget","sendEventPayloadToServerPremium","checkPixelsLoaded","loaded","getProductIdForSpecificPixel","String","dynamic_remarketing","id_type","isInWooCommerceSesssion","session_active","isNotInWooCommerceSesssion","previousVariationId","initializeCommandQueue","queue","_pmwq","fn","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","__webpack_modules__","m","getPrototypeOf","t","__esModule","create","r","def","current","getOwnPropertyNames","definition","o","chunkId","all","u","g","globalThis","Function","prop","hasOwnProperty","done","needAttach","scripts","getElementsByTagName","getAttribute","charset","nc","setAttribute","onScriptComplete","doneFns","parentNode","removeChild","bind","Symbol","toStringTag","importScripts","currentScript","tagName","installedChunks","installedChunkData","promise","errorType","realSrc","request","webpackJsonpCallback","parentChunkLoadingFunction","chunkIds","moreModules","runtime","chunkLoadingGlobal","self","chunk_base_path","__webpack_public_path__","load","pixelLoaders","google","facebook","hotjar","crazyegg","modules","load_deprecated_functions","loadDeprecatedFunctions","main"],"ignoreList":[],"sourceRoot":""}1 {"version":3,"file":"pmw-public.p1.min.js","mappings":"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","sources":["webpack://Pixel-Manager-for-WooCommerce/webpack/runtime/create fake namespace object","webpack://Pixel-Manager-for-WooCommerce/webpack/runtime/load script","webpack://Pixel-Manager-for-WooCommerce/./src/js-src/public/pmw/event_listeners.js","webpack://Pixel-Manager-for-WooCommerce/./src/js-src/public/pmw/functions_loader.js","webpack://Pixel-Manager-for-WooCommerce/./src/js-src/public/pmw/console.mjs","webpack://Pixel-Manager-for-WooCommerce/../../src/ipv6.ts","webpack://Pixel-Manager-for-WooCommerce/./src/js-src/public/pmw/functions_main.js","webpack://Pixel-Manager-for-WooCommerce/./src/js-src/public/pmw/hooks.js","webpack://Pixel-Manager-for-WooCommerce/../../src/index.ts","webpack://Pixel-Manager-for-WooCommerce/./src/js-src/public/pmw/cross-tab-sync.mjs","webpack://Pixel-Manager-for-WooCommerce/./src/js-src/public/pmw/event-processor.js","webpack://Pixel-Manager-for-WooCommerce/./src/js-src/public/pmw/ip_services.js","webpack://Pixel-Manager-for-WooCommerce/./src/js-src/public/pmw/geo/geo.mjs","webpack://Pixel-Manager-for-WooCommerce/../../src/ipRange.ts","webpack://Pixel-Manager-for-WooCommerce/./src/js-src/public/pmw/event_listeners_on_ready.js","webpack://Pixel-Manager-for-WooCommerce/./src/js-src/public/version.js","webpack://Pixel-Manager-for-WooCommerce/./src/js-src/public/pmw/pixel-registry.js","webpack://Pixel-Manager-for-WooCommerce/../../src/util.ts","webpack://Pixel-Manager-for-WooCommerce/../../src/ipv4.ts","webpack://Pixel-Manager-for-WooCommerce/../node_modules/ipaddr.js/lib/ipaddr.js","webpack://Pixel-Manager-for-WooCommerce/../node_modules/ip6/ip6.js","webpack://Pixel-Manager-for-WooCommerce/../src/range-check.ts","webpack://Pixel-Manager-for-WooCommerce/./src/js-src/public/pmw/functions.js","webpack://Pixel-Manager-for-WooCommerce/webpack/bootstrap","webpack://Pixel-Manager-for-WooCommerce/webpack/runtime/define property getters","webpack://Pixel-Manager-for-WooCommerce/webpack/runtime/ensure chunk","webpack://Pixel-Manager-for-WooCommerce/webpack/runtime/get javascript chunk filename","webpack://Pixel-Manager-for-WooCommerce/webpack/runtime/global","webpack://Pixel-Manager-for-WooCommerce/webpack/runtime/hasOwnProperty shorthand","webpack://Pixel-Manager-for-WooCommerce/webpack/runtime/make namespace object","webpack://Pixel-Manager-for-WooCommerce/webpack/runtime/publicPath","webpack://Pixel-Manager-for-WooCommerce/webpack/runtime/jsonp chunk loading","webpack://Pixel-Manager-for-WooCommerce/./src/js-src/public/main.js"],"sourcesContent":["var getProto = Object.getPrototypeOf ? (obj) => (Object.getPrototypeOf(obj)) : (obj) => (obj.__proto__);\nvar leafPrototypes;\n// create a fake namespace object\n// mode & 1: value is a module id, require it\n// mode & 2: merge all properties of value into the ns\n// mode & 4: return value when already ns object\n// mode & 16: return value when it's Promise-like\n// mode & 8|1: behave like require\n__webpack_require__.t = function(value, mode) {\n\tif(mode & 1) value = this(value);\n\tif(mode & 8) return value;\n\tif(typeof value === 'object' && value) {\n\t\tif((mode & 4) && value.__esModule) return value;\n\t\tif((mode & 16) && typeof value.then === 'function') return value;\n\t}\n\tvar ns = Object.create(null);\n\t__webpack_require__.r(ns);\n\tvar def = {};\n\tleafPrototypes = leafPrototypes || [null, getProto({}), getProto([]), getProto(getProto)];\n\tfor(var current = mode & 2 && value; (typeof current == 'object' || typeof current == 'function') && !~leafPrototypes.indexOf(current); current = getProto(current)) {\n\t\tObject.getOwnPropertyNames(current).forEach((key) => (def[key] = () => (value[key])));\n\t}\n\tdef['default'] = () => (value);\n\t__webpack_require__.d(ns, def);\n\treturn ns;\n};","var inProgress = {};\nvar dataWebpackPrefix = \"Pixel Manager for WooCommerce:\";\n// loadScript function to load a script via script tag\n__webpack_require__.l = (url, done, key, chunkId) => {\n\tif(inProgress[url]) { inProgress[url].push(done); return; }\n\tvar script, needAttach;\n\tif(key !== undefined) {\n\t\tvar scripts = document.getElementsByTagName(\"script\");\n\t\tfor(var i = 0; i < scripts.length; i++) {\n\t\t\tvar s = scripts[i];\n\t\t\tif(s.getAttribute(\"src\") == url || s.getAttribute(\"data-webpack\") == dataWebpackPrefix + key) { script = s; break; }\n\t\t}\n\t}\n\tif(!script) {\n\t\tneedAttach = true;\n\t\tscript = document.createElement('script');\n\n\t\tscript.charset = 'utf-8';\n\t\tif (__webpack_require__.nc) {\n\t\t\tscript.setAttribute(\"nonce\", __webpack_require__.nc);\n\t\t}\n\t\tscript.setAttribute(\"data-webpack\", dataWebpackPrefix + key);\n\n\t\tscript.src = url;\n\t}\n\tinProgress[url] = [done];\n\tvar onScriptComplete = (prev, event) => {\n\t\t// avoid mem leaks in IE.\n\t\tscript.onerror = script.onload = null;\n\t\tclearTimeout(timeout);\n\t\tvar doneFns = inProgress[url];\n\t\tdelete inProgress[url];\n\t\tscript.parentNode && script.parentNode.removeChild(script);\n\t\tdoneFns && doneFns.forEach((fn) => (fn(event)));\n\t\tif(prev) return prev(event);\n\t}\n\tvar timeout = setTimeout(onScriptComplete.bind(null, undefined, { type: 'timeout', target: script }), 120000);\n\tscript.onerror = onScriptComplete.bind(null, script.onerror);\n\tscript.onload = onScriptComplete.bind(null, script.onload);\n\tneedAttach && document.head.appendChild(script);\n};","// a function that removes all \\n and \\t and html tags from a string\nconst removeHtmlTagsAndWhitespace = string => {\n\n\tstring = string.replace(/<[^>]*>?/gm, \"\").replace(/\\n/gm, \"\").replace(/\\t/gm, \"\");\n\tstring = string.trim();\n\n\treturn string;\n};\n\n/**\n * add_shipping_info event\n */\n\n// trigger when #shipping_method is changed\njQuery(\"form.woocommerce-checkout\").on(\"change\", \"#shipping_method\", (event) => {\n\n\tif (!event.target?.value) return;\n\tif (!event.target?.id) return;\n\n\ttriggerAddShippingInfoEvent({\n\t\tslug: event.target.value,\n\t\ttext: removeHtmlTagsAndWhitespace(jQuery(\"label[for='\" + event.target.id + \"']\").text()),\n\t});\n});\n\n// trigger when a shipping method is already selected on page load\njQuery(() => {\n\tif (jQuery(\"#shipping_method\").length) {\n\n\t\t// get the checked shipping method from #shipping_method\n\t\tlet checkedShippingMethod = jQuery(\"#shipping_method\").find(\":checked\");\n\n\t\t// if there is a checked shipping method\n\t\tif (checkedShippingMethod.length) {\n\n\t\t\tif (!checkedShippingMethod.val()) return;\n\t\t\tif (!checkedShippingMethod.attr(\"id\")) return;\n\n\t\t\ttriggerAddShippingInfoEvent({\n\t\t\t\tslug: checkedShippingMethod.val(),\n\t\t\t\ttext: removeHtmlTagsAndWhitespace(jQuery(\"label[for='\" + checkedShippingMethod.attr(\"id\") + \"']\").text()),\n\t\t\t});\n\t\t}\n\t}\n});\n\n// trigger when a shipping method is selected on page load\nconst triggerAddShippingInfoEvent = shippingTier => {\n\tjQuery(document).trigger(\"pmw:add-shipping-info\", {shippingTier});\n};\n\n/**\n * add_payment_info event\n */\n\n\t // flag to prevent double logging of payment method change on pageload\nlet paymentMethodChangeLogged = false;\n\n// trigger when a payment method is selected\njQuery(\"form.woocommerce-checkout\").on(\"change\", \"input[name=\\\"payment_method\\\"]\", event => {\n\n\tif (!event.target.value) return;\n\tif (!event.target.id) return;\n\n\ttriggerAddPaymentInfoEvent({\n\t\tslug: event.target.value,\n\t\ttext: removeHtmlTagsAndWhitespace(jQuery(\"label[for='\" + event.target.id + \"']\").text()),\n\t});\n\n\tpaymentMethodChangeLogged = true;\n});\n\n// trigger when a payment method is already selected on page load\njQuery(() => {\n\n\t// prevent double logging of payment method change on pageload\n\tif (paymentMethodChangeLogged) return;\n\n\tlet checkedPaymentMethod = jQuery(\"input[name=\\\"payment_method\\\"]:checked\");\n\n\tif (checkedPaymentMethod.length) {\n\n\t\tif (!checkedPaymentMethod.val()) return;\n\t\tif (!checkedPaymentMethod.attr(\"id\")) return;\n\n\t\ttriggerAddPaymentInfoEvent({\n\t\t\tslug: checkedPaymentMethod.val(),\n\t\t\ttext: removeHtmlTagsAndWhitespace(jQuery(\"label[for='\" + checkedPaymentMethod.attr(\"id\") + \"']\").text()),\n\t\t});\n\t}\n});\n\n// trigger when a payment method is selected on page load\nconst triggerAddPaymentInfoEvent = paymentType => {\n\tjQuery(document).trigger(\"pmw:add-payment-info\", {paymentType});\n};\n\n/**\n * remove_from_cart event\n *\n * Cannot be attached directly because the mini cart doesn't necessarily contain the remove button on page load.\n */\njQuery(document).on(\"click\", \".remove_from_cart_button, .remove\", (event) => {\n\n\t// console.log(\"remove_from_cart event\" + new Date().getTime())\n\n\ttry {\n\n\t\tlet url = new URL(jQuery(event.currentTarget).attr(\"href\"));\n\t\tlet productId = pmw.getProductIdByCartItemKeyUrl(url);\n\n\t\tpmw.removeProductFromCart(productId);\n\n\t} catch (e) {\n\t\tconsole.error(e);\n\t}\n});\n\n\n/**\n * begin_checkout event\n *\n * Cannot be attached directly because the mini cart doesn't necessarily contain the remove button on page load.\n */\nlet checkoutButtonClasses = [\n\t// \".checkout\", // this is too generic. It triggers on the checkout page on some themes fore each interaction with the checkout form.\n\t\".checkout-button\",\n\t\".cart-checkout-button\",\n\t\".button.checkout\",\n\t\".xoo-wsc-ft-btn-checkout\", // https://xootix.com/side-cart-for-woocommerce/\n\t\".elementor-button--checkout\",\n\t\".xt_woofc-checkout\", // https://wordpress.org/plugins/woo-floating-cart-lite/\n\t\".fkcart-checkout--text\", // https://funnelkit.com/\n];\n\nconst checkoutButtonSelectors = pmw.prepareSelectors(checkoutButtonClasses, \"beginCheckout\");\n\n// https://wordpress.stackexchange.com/a/352171/68337\njQuery(document).on(\"click init_checkout\", checkoutButtonSelectors, () => {\n\tjQuery(document).trigger(\"pmw:begin-checkout\");\n});\n\njQuery(document).on(\"updated_cart_totals\", () => {\n\tjQuery(document).trigger(\"pmw:view-cart\");\n});\n\n/**\n * Set up PWM events\n */\n\n// track checkout option event: purchase click\n// https://wordpress.stackexchange.com/a/352171/68337\njQuery(document).on(\"pmwLoad\", (event) => {\n\tjQuery(document).on(\"payment_method_selected\", () => {\n\n\t\tif (false === pmw.paymentMethodSelected) {\n\t\t\tpmw.fireCheckoutProgress(3);\n\t\t}\n\n\t\tpmw.fireCheckoutOption(3, jQuery(\"input[name='payment_method']:checked\").val());\n\t\tpmw.paymentMethodSelected = true;\n\t});\n});\n\n// populate the pmwDataLayer with the cart items\njQuery(document).on(\"pmwLoad\", () => {\n\n\ttry {\n\t\tpmw.initCart();\n\t} catch (e) {\n\t\tconsole.error(e);\n\t}\n});\n\n// get all add-to-cart= products from backend\njQuery(document).on(\"pmwLoad\", () => {\n\n\tpmwDataLayer.products = pmwDataLayer.products || {};\n\n\t// scan page for add-to-cart= links\n\tlet productIds = pmw.getAddToCartLinkProductIds();\n\n\tpmw.getProductsFromBackend(productIds);\n});\n\n/**\n * Save the referrer into a cookie\n *\n * @returns {void}\n */\njQuery(document).on(\"pmwLoad\", () => {\n\n\t// If there is no referrer, then return\n\tif (!document.referrer) {\n\t\treturn;\n\t}\n\n\t// If the referrer is already stored, then return\n\tif (pmw.retrieveData(\"referrer\")) {\n\t\treturn;\n\t}\n\n\tlet referrerUrl = new URL(document.referrer);\n\tlet referrerHostname = referrerUrl.hostname;\n\n\tif (referrerHostname !== window.location.host) {\n\t\tpmw.storeData(\"referrer\", referrerHostname);\n\t}\n});\n\n/**\n * Collect parameters from the URL\n * and save them to the PMW session storage.\n * Parameters:\n * - gclid\n * - wbraid\n * - gbraid\n * - fbclid\n * - ttclid\n * - ScCid\n * - epik\n *\n * @returns {void}\n * */\njQuery(document).on(\"pmwLoad\", () => {\n\n\tlet gclid = pmw.getUrlParameter(\"gclid\");\n\tif (gclid) pmw.storeData(\"gclid\", gclid);\n\n\tlet wbraid = pmw.getUrlParameter(\"wbraid\");\n\tif (wbraid) pmw.storeData(\"wbraid\", wbraid);\n\n\tlet gbraid = pmw.getUrlParameter(\"gbraid\");\n\tif (gbraid) pmw.storeData(\"gbraid\", gbraid);\n\n\t// https://developers.facebook.com/docs/marketing-api/conversions-api/parameters/fbp-and-fbc\n\tlet fbclid = pmw.getUrlParameter(\"fbclid\");\n\tif (fbclid) {\n\t\tfbclid = \"fb.1.\" + Math.floor(Date.now() / 1000) + \".\" + fbclid;\n\t\tpmw.storeData(\"fbclid\", fbclid);\n\t}\n\n\tlet ttclid = pmw.getUrlParameter(\"ttclid\");\n\tif (ttclid) pmw.storeData(\"ttclid\", ttclid);\n\n\tlet scid = pmw.getUrlParameter(\"ScCid\");\n\tif (scid) pmw.storeData(\"scid\", scid);\n\n\tlet epik = pmw.getUrlParameter(\"epik\");\n\tif (epik) pmw.storeData(\"epik\", epik);\n});\n\n/**\n * Create our own load event in order to better handle script flow execution when JS \"optimizers\" shuffle the code.\n */\njQuery(document).on(\"pmwLoad\", () => {\n\t// document.addEventListener(\"pmwLoad\", function () {\n\ttry {\n\t\tif (typeof pmwDataLayer != \"undefined\" && !pmwDataLayer?.pmw_loaded) {\n\n\t\t\tjQuery(document).trigger(\"pmw:load-always\");\n\n\t\t\tif (pmwDataLayer?.shop) {\n\t\t\t\tif (\n\t\t\t\t\t\"product\" === pmwDataLayer.shop.page_type &&\n\t\t\t\t\t\"variable\" !== pmwDataLayer.shop.product_type &&\n\t\t\t\t\tpmw.getMainProductIdFromProductPage()\n\t\t\t\t) {\n\t\t\t\t\tlet product = pmw.getProductDataForViewItemEvent(pmw.getMainProductIdFromProductPage());\n\t\t\t\t\tjQuery(document).trigger(\"pmw:view-item\", product);\n\t\t\t\t} else if (\n\t\t\t\t\t\"product\" === pmwDataLayer.shop.page_type &&\n\t\t\t\t\t\"variable\" === pmwDataLayer.shop.product_type &&\n\t\t\t\t\t!pmwDataLayer?.shop?.variations_output &&\n\t\t\t\t\tpmw.getMainProductIdFromProductPage()\n\t\t\t\t) {\n\t\t\t\t\t// For variable products with variations_output disabled, fire view_item with parent product data\n\t\t\t\t\tlet product = pmw.getProductDataForViewItemEvent(pmw.getMainProductIdFromProductPage());\n\t\t\t\t\tjQuery(document).trigger(\"pmw:view-item\", product);\n\t\t\t\t} else if (\"product_category\" === pmwDataLayer.shop.page_type) {\n\t\t\t\t\tjQuery(document).trigger(\"pmw:view-category\");\n\t\t\t\t} else if (\"search\" === pmwDataLayer.shop.page_type) {\n\t\t\t\t\tjQuery(document).trigger(\"pmw:search\");\n\t\t\t\t} else if (\"cart\" === pmwDataLayer.shop.page_type) {\n\t\t\t\t\tjQuery(document).trigger(\"pmw:view-cart\");\n\t\t\t\t} else if (\"order_received_page\" === pmwDataLayer.shop.page_type) {\n\t\t\t\t\tif (pmwDataLayer?.order && !pmw.isOrderIdStored(pmwDataLayer.order.id)) {\n\t\t\t\t\t\tjQuery(document).trigger(\"pmw:purchase\");\n\t\t\t\t\t\tpmw.writeOrderIdToStorage(pmwDataLayer.order.id, pmwDataLayer.order.key);\n\t\t\t\t\t\tif (typeof pmw.acrRemoveCookie === \"function\") pmw.acrRemoveCookie();\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tjQuery(document).trigger(\"pmw:everywhere-else\");\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tjQuery(document).trigger(\"pmw:everywhere-else\");\n\t\t\t}\n\n\t\t\tif (pmwDataLayer?.user?.id && !pmw.hasLoginEventFired()) {\n\t\t\t\tjQuery(document).trigger(\"pmw:login\");\n\t\t\t\tpmw.setLoginEventFired();\n\t\t\t}\n\n\t\t\tif (pmwDataLayer?.user?.account_just_created && !pmw.hasAccountCreatedEventFired()) {\n\t\t\t\tjQuery(document).trigger(\"pmw:account-created\");\n\t\t\t\tpmw.setAccountCreatedEventFired();\n\t\t\t}\n\n\t\t\tpmwDataLayer.pmw_loaded = true;\n\t\t}\n\n\t} catch (e) {\n\t\tconsole.error(e);\n\t}\n});\n\n/**\n * Register the show_variation event listener\n * in case lazy loading is enabled\n * because we have to register it immediately\n * and not after the onready event.\n */\nif (pmwDataLayer?.general?.lazy_load_pmw) {\n\tpmw.registerShowVariationEventListener();\n}\n\n/**\n * In case lazy loading is enabled\n * we need to trigger the view-item event on\n * preselected variations.\n *\n * Check if a variation is selected on a variable product page\n * and trigger the view-item event if a variation is selected\n *\n * Fallback for the jQuery(\".single_variation_wrap\").on(\"show_variation\", (event, variation) => {}) event listener\n * in case lazy loading is enabled and the event listener is not triggered.\n *\n * Only fires if variations_output is enabled, as the parent product view_item\n * is already triggered on page load when variations_output is disabled.\n */\njQuery(document).on(\"pmwLoad\", () => {\n\tif (!pmwDataLayer?.general?.lazy_load_pmw) return;\n\tif (!pmwDataLayer?.shop?.variations_output) return;\n\n\ttry {\n\t\tconst $variationForm = jQuery(\".variations_form\");\n\t\tif (!$variationForm.length) return;\n\n\t\tconst selectedValues = {};\n\t\tconst allSelected = $variationForm.find(\"select\").toArray().every(select => {\n\t\t\tconst value = jQuery(select).val();\n\t\t\tif (value) {\n\t\t\t\tselectedValues[jQuery(select).attr(\"name\")] = value;\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\treturn false;\n\t\t});\n\n\t\tif (!allSelected) return;\n\n\t\tconst productVariations = $variationForm.data(\"product_variations\");\n\t\tif (!productVariations) return;\n\n\t\tconst matchingVariation = productVariations.find(variation =>\n\t\t\tObject.entries(selectedValues).every(([key, value]) =>\n\t\t\t\tvariation.attributes[key] === value,\n\t\t\t),\n\t\t);\n\n\t\tif (matchingVariation) {\n\t\t\tpmw.triggerViewItemEventPrep(matchingVariation.variation_id);\n\t\t}\n\t} catch (e) {\n\t\tpmw.console.error(e);\n\t}\n});\n\n// Check if the REST endpoint is available and log an error if it is not\njQuery(document).on(\"pmwLoad\", async () => {\n\tif (pmw.retrieveData(\"restEndpointAvailable\") === false) pmw.console.error(\"REST endpoint is not available. Using admin-ajax.php instead.\");\n});\n\n/**\n * All s2s events\n */\n\n/**\n * PageView event\n *\n * Uses the unified event processing system with filters.\n * Each pixel's adapter handles the data transformation.\n * S2S transmission is controlled by the supportsPageViewS2S capability.\n */\njQuery(document).on(\"pmw:page-view\", async (event) => {\n\n\tpmw.console.log(\"pmw:page-view event fired\", {event});\n\n\t// Use the unified event processor\n\tconst payload = await pmw.processEvent(\"page_view\", {});\n\n\t// Only send to server if pageview S2S is enabled AND there are pixels with this capability\n\tif (pmwDataLayer?.general?.server_2_server?.pageview_event_s2s?.is_active) {\n\t\tconst pageViewS2SPixels = pmw.pixelRegistry.getPixelsWithCapability(\"supportsPageViewS2S\");\n\n\t\tif (pageViewS2SPixels.length > 0) {\n\t\t\t// Extract S2S data only for pixels that support pageview S2S\n\t\t\tconst s2sData = {event: \"page_view\"};\n\n\t\t\tfor (const pixelName of pageViewS2SPixels) {\n\t\t\t\tif (payload.pixels[pixelName]) {\n\t\t\t\t\ts2sData[pixelName] = payload.pixels[pixelName];\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (Object.keys(s2sData).length > 1) { // More than just 'event' key\n\t\t\t\tpmw.sendEventPayloadToServer(s2sData);\n\t\t\t}\n\t\t}\n\t}\n});\n\n/**\n * Add to cart event\n *\n * Uses the new unified event processing system with filters\n */\njQuery(document).on(\"pmw:add-to-cart\", async (event, product) => {\n\n\tpmw.console.log(\"pmw:add-to-cart event fired\", {event, product});\n\n\t// Use the new unified event processor\n\tawait pmw.processEvent(\"add_to_cart\", {\n\t\tproduct: product,\n\t});\n});\n\n/**\n * Remove from cart event\n * Uses the new unified event processing system with filters\n */\njQuery(document).on(\"pmw:remove-from-cart\", async (event, product) => {\n\n\tpmw.console.log(\"pmw:remove-from-cart event fired\", {event, product});\n\n\t// Use the new unified event processor\n\tawait pmw.processEvent(\"remove_from_cart\", {\n\t\tproduct: product,\n\t});\n});\n\n/**\n * Select item event\n * Uses the new unified event processing system with filters\n */\njQuery(document).on(\"pmw:select-item\", async (event, product) => {\n\n\tpmw.console.log(\"pmw:select-item event fired\", {event, product});\n\n\t// Use the new unified event processor\n\tawait pmw.processEvent(\"select_item\", {\n\t\tproduct: product,\n\t});\n});\n\n/**\n * View cart event\n */\njQuery(document).on(\"pmw:view-cart\", (event) => {\n\n\tpmw.console.log(\"pmw:view-cart event fired\", {event});\n\n\t/**\n\t * Process the event through the unified event processor\n\t */\n\tpmw.processEvent(\"view_cart\", {});\n});\n\n/**\n * Begin checkout event\n */\njQuery(document).on(\"pmw:begin-checkout\", (event) => {\n\n\tpmw.console.log(\"pmw:begin-checkout event fired\", {event});\n\n\t/**\n\t * Process the event through the unified event processor\n\t */\n\tpmw.processEvent(\"begin_checkout\", {});\n});\n\n/**\n * Add Payment Info\n */\njQuery(document).on(\"pmw:add-payment-info\", (event) => {\n\n\tpmw.console.log(\"pmw:add-payment-info event fired\", {event});\n\n\t/**\n\t * Process the event through the unified event processor\n\t */\n\tpmw.processEvent(\"add_payment_info\", {});\n});\n\n/**\n * Add to wishlist event\n *\n * Uses the unified event processing system with filters.\n * Each pixel's adapter handles the data transformation.\n */\njQuery(document).on(\"pmw:add-to-wishlist\", async (event, product) => {\n\n\tpmw.console.log(\"pmw:add-to-wishlist event fired\", {event, product});\n\n\t// Use the unified event processor\n\tawait pmw.processEvent(\"add_to_wishlist\", {\n\t\tproduct: product,\n\t});\n});\n\n/**\n * View Item event\n */\njQuery(document).on(\"pmw:view-item\", (event, product = null) => {\n\n\tpmw.console.log(\"pmw:view-item event fired\", {event, product});\n\n\t/**\n\t * Process the event through the unified event processor\n\t */\n\tpmw.processEvent(\"view_item\", {\n\t\tproduct: product,\n\t});\n});\n\n/**\n * View category event\n *\n * Uses the unified event processing system with filters.\n * Each pixel's adapter handles the data transformation.\n */\njQuery(document).on(\"pmw:view-category\", async (event, product = null) => {\n\n\tpmw.console.log(\"pmw:view-category event fired\", {event, product});\n\n\t// Use the unified event processor\n\tawait pmw.processEvent(\"view_category\", {\n\t\tproduct: product,\n\t});\n});\n\n/**\n * Search event\n */\njQuery(document).on(\"pmw:search\", (event) => {\n\n\tpmw.console.log(\"pmw:search event fired\", {event});\n\n\t/**\n\t * Process the event through the unified event processor\n\t */\n\tpmw.processEvent(\"search\", {});\n});\n\n/**\n * Place order event\n *\n * Uses the unified event processing system with filters.\n * Each pixel's adapter handles the data transformation.\n */\njQuery(document).on(\"pmw:place-order\", async (event) => {\n\n\tpmw.console.log(\"pmw:place-order event fired\", {event});\n\n\t// Use the unified event processor\n\tawait pmw.processEvent(\"place_order\", {});\n});\n\n/**\n * Purchase event\n */\njQuery(document).on(\"pmw:purchase\", async (event) => {\n\n\tpmw.console.log(\"pmw:purchase event fired\", {event});\n\n\t// Use the unified event processor\n\tawait pmw.processEvent(\"purchase\", {\n\t\torder: pmwDataLayer.order,\n\t});\n});\n\n/**\n * Login event\n *\n * Uses the unified event processing system with filters.\n * Each pixel's adapter handles the data transformation.\n */\njQuery(document).on(\"pmw:login\", async () => {\n\n\tpmw.console.log(\"pmw:login event fired\");\n\n\t// Use the unified event processor\n\tawait pmw.processEvent(\"login\", {});\n});\n\n/**\n * Account created event\n *\n * Uses the unified event processing system with filters.\n * Each pixel's adapter handles the data transformation.\n */\njQuery(document).on(\"pmw:account-created\", async () => {\n\n\tpmw.console.log(\"pmw:account-created event fired\");\n\n\t// Use the unified event processor\n\tawait pmw.processEvent(\"account_created\", {});\n});\n\n/**\n * Run WooCommerce specific functions\n */\njQuery(document).on(\"pmw:ready\", async () => {\n\n\t// Only run if WooCommerce is active\n\tif (!pmw.isWooCommerceActive()) {\n\t\treturn;\n\t}\n\n\t/**\n\t * Run as soon as wpm namespace is loaded\n\t */\n\n\t// Watch for products visible in viewport\n\tpmw.startIntersectionObserverToWatch();\n\n\t// Watch for lazy loaded products\n\tpmw.startProductsMutationObserverToWatch();\n});\n\njQuery(document).on(\"pmw:load-pixels\", () => {\n\tpmw.waitForPixelsAndTriggerPageView();\n});\n","/**\n * Load all PMW functions\n *\n * Ignore event listeners. They need to be loaded after\n * we made sure that jQuery has been loaded.\n */\n\nrequire(\"./functions\")\n\n/**\n * Load consent management module as a chunk\n * @returns {Promise<void>}\n */\nwindow.pmw.loadConsentModule = async () => {\n\tconst consentModule = await import(/* webpackChunkName: \"consent-management\" */ \"./consent/consent.mjs\")\n\twindow.pmw.consent = consentModule\n\t\n\tconst apiModule = await import(/* webpackChunkName: \"consent-api\" */ \"./consent/api.mjs\")\n\twindow.pmw = window.pmw || {}\n\twindow.pmw.consent = window.pmw.consent || {}\n\twindow.pmw.consent.api = apiModule\n\t\n\treturn consentModule\n}\n\nwindow.pmw = window.pmw || {}\nwindow.pmw.console = require(\"./console.mjs\")\n\n// Load cross-tab session sync module\nconst crossTabSync = require(\"./cross-tab-sync.mjs\")\nwindow.pmw.crossTabSync = crossTabSync\n\nrequire(\"./ip_services\")\n\n// #if process.env.TIER === 'premium'\n// if (pmw.canLoadPremiumFeatures()) {\n// \trequire(\"./functions_premium\")\n// }\n// #endif\n","/**\n * Logs a message to the console if the logger is enabled.\n *\n * @module console\n * @param message\n * @param objects\n * @public\n * @returns {void}\n */\nexport const log = (message, ...objects) => {\n\n\tif (!isLoggerEnabled()) return\n\n\tif (typeof message === \"object\") {\n\t\tconsole.log(\"Pixel Manager: \", message, ...objects)\n\t} else if (objects.length) {\n\t\tconsole.log(\"Pixel Manager: \" + message, ...objects)\n\t} else {\n\t\tconsole.log(\"Pixel Manager: \" + message)\n\t}\n}\n\n/**\n * Logs an error message to the console.\n *\n * @module console\n * @param message\n * @param objects\n * @public\n * @returns {void}\n */\nexport const error = (message, ...objects) => {\n\n\t// if (!isLoggerEnabled()) return\n\n\t// if message is an object, log the keys\n\tif (typeof message === \"object\") {\n\t\tconsole.error(\"Pixel Manager: \", message, ...objects)\n\t} else if (objects.length) {\n\t\tconsole.error(\"Pixel Manager: \" + message, ...objects)\n\t} else {\n\t\tconsole.error(\"Pixel Manager: \" + message)\n\t}\n}\n\n/**\n * Checks if the logger is enabled.\n *\n * @return {boolean}\n */\nconst isLoggerEnabled = () => {\n\n\tif (urlLoggerOff()) return false\n\n\tif (sessionLoggerEnabled()) return true\n\n\tif (urlLoggerOn()) return true\n\n\treturn !!pmwDataLayer?.general?.logger?.is_active\n}\n\n/**\n * Turn off the logger if the URL parameter is set.\n *\n * @return {boolean}\n */\nconst urlLoggerOff = () => {\n\n\tif (pmw.urlHasParameter(\"pmwloggeroff\")) {\n\t\tpmw.storeData(\"loggerEnabled\", false)\n\t}\n\n\treturn pmw.urlHasParameter(\"pmwloggeroff\")\n}\n\n/**\n * Check if the logger is enabled for the session.\n *\n * @return {boolean}\n */\nconst sessionLoggerEnabled = () => {\n\treturn pmw.retrieveData(\"loggerEnabled\")\n}\n\n/**\n * Turn on the logger if the URL parameter is set.\n *\n * @return {boolean}\n */\nconst urlLoggerOn = () => {\n\n\tif (pmw.urlHasParameter(\"pmwloggeron\")) {\n\t\tpmw.storeData(\"loggerEnabled\", true)\n\t}\n\n\treturn pmw.urlHasParameter(\"pmwloggeron\")\n}\n",null,"(function (pmw, $, undefined) {\n\n\tpmw.jQueryExists = async () => new Promise(resolve => {\n\n\t\t(function waitForjQuery() {\n\t\t\tif (typeof jQuery !== \"undefined\") return resolve()\n\t\t\tsetTimeout(waitForjQuery, 100)\n\t\t})()\n\t})\n\n\tpmw.waitForLibrary = (library, timeout = 5000, interval = 100) => {\n\n\t\tconst startTime = Date.now()\n\t\twhile (typeof window[library] === \"undefined\") {\n\t\t\t// Check if timeout in milliseconds has passed\n\t\t\tif (Date.now() - startTime > timeout) {\n\t\t\t\tbreak // Maximum wait time reached, exit the loop\n\t\t\t}\n\t\t\t// Wait for the interval in milliseconds before checking again\n\t\t\tsetTimeout(() => {\n\t\t\t}, interval)\n\t\t}\n\t}\n\n\tpmw.dataLayerFullyLoaded = async () => {\n\n\t\t// Promise that checks if the nested object pmwDataLayer.version is defined.\n\t\t// If so, resolve.\n\t\t// We must check for the nested object pmwDataLayer.version,\n\t\t// because the pmwDataLayer object can be defined early by adding products to the data layer through\n\t\t// template inline scripts. So we need to wait until the pmwDataLayer configuration objects\n\t\t// are defined.\n\t\tlet checkVar = new Promise((resolve) => {\n\t\t\t(function waitForVar() {\n\t\t\t\tif (\n\t\t\t\t\ttypeof pmwDataLayer !== \"undefined\"\n\t\t\t\t\t&& typeof pmwDataLayer.version !== \"undefined\"\n\t\t\t\t) {\n\t\t\t\t\treturn resolve()\n\t\t\t\t}\n\t\t\t\tsetTimeout(waitForVar, 100)\n\t\t\t})()\n\t\t})\n\n\t\t// Set a timeout to log a message after 6 seconds\n\t\tlet logTimeoutId = setTimeout(() => {\n\t\t\tconsole.error(\"Pixel Manager error: The pmwDataLayer is not defined. Please make sure that the pmwDataLayer script snippet is inserted and not modified by any third-party plugin, such as a consent management platform or a JavaScript optimizer.\")\n\n\t\t}, 6000)\n\n\t\tcheckVar.then(() => {\n\t\t\tclearTimeout(logTimeoutId)\n\t\t})\n\n\t\treturn checkVar\n\t}\n\n\tpmw.wpHooksExists = async () => new Promise(resolve => {\n\t\t(function waitForVar() {\n\n\t\t\t// Resolve if wp.hooks is defined\n\t\t\tif (typeof wp !== \"undefined\" && typeof wp.hooks !== \"undefined\") return resolve()\n\t\t\tsetTimeout(waitForVar, 50)\n\t\t})()\n\t})\n\n\t/**\n\t * Load all WooCommerce hooks functions\n\t *\n\t * Includes safeguard in case the user changed the default load order for wp-hooks, or removed it completely.\n\t *\n\t * @returns {Promise<void>}\n\t */\n\tpmw.loadWcHooksFunctions = async () => {\n\t\t// Load all WooCommerce Blocks hooks\n\t\tawait pmw.wpHooksExists()\n\t\tawait import(/* webpackChunkName: \"wc-hooks\" */ \"./wc_hooks\")\n\t}\n\n}(window.pmw = window.pmw || {}, jQuery))\n","/**\n * WordPress-style hooks system for Pixel Manager\n *\n * Provides a filter API that allows developers to modify event data\n * at various points in the event processing pipeline.\n *\n * Available Filters:\n *\n * 1. pmw_event_payload_pre (payload, eventName)\n * - Runs before pixel adaptation\n * - Use case: Add global tracking params, modify core data\n *\n * 2. pmw_pixel_data_{pixelName} (pixelData, eventName, eventData, context)\n * - Runs after each pixel's adapter\n * - Use case: Modify pixel-specific data (e.g., pmw_pixel_data_facebook)\n *\n * 3. pmw_event_payload_{eventName} (payload, eventData)\n * - Runs for specific event types\n * - Use case: Modify all pixels for a specific event (e.g., pmw_event_payload_add_to_cart)\n *\n * 4. pmw_event_payload_post (payload, eventName)\n * - Runs after all processing, before dispatch\n * - Use case: Final validation, logging, debugging\n *\n * 5. pmw_pixel_firing_decision (decision, pixelName, eventName, mode)\n * - Runs when determining whether to fire browser/server\n * - decision: { fire_browser: boolean, fire_server: boolean }\n * - Use case: Force server-only for specific pixels, disable certain pixels per-event\n *\n * @since 1.51.0\n */\n\n(function (pmw, $, undefined) {\n\n\t// Initialize pmw namespace if it doesn't exist\n\twindow.pmw = window.pmw || {};\n\n\t/**\n\t * Hook system for filtering event data\n\t */\n\tpmw.hooks = {\n\t\tfilters: {},\n\n\t\t/**\n\t\t * Add a filter callback\n\t\t *\n\t\t * @param {string} hookName - The filter hook name (e.g., 'pmw_event_payload')\n\t\t * @param {string} namespace - Unique identifier for your filter (e.g., 'my-plugin')\n\t\t * @param {function} callback - The filter function that modifies the value\n\t\t * @param {number} priority - Execution order, lower numbers run first (default: 10)\n\t\t *\n\t\t * @example\n\t\t * // Modify Facebook pixel data\n\t\t * pmw.hooks.addFilter('pmw_pixel_data_facebook', 'my-plugin', (data) => {\n\t\t * data.custom_param = 'my_value';\n\t\t * return data;\n\t\t * }, 10);\n\t\t *\n\t\t * @example\n\t\t * // Force server-only firing for Facebook\n\t\t * pmw.hooks.addFilter('pmw_pixel_firing_decision', 'my-plugin', (decision, pixelName) => {\n\t\t * if (pixelName === 'facebook') {\n\t\t * return { fire_browser: false, fire_server: true };\n\t\t * }\n\t\t * return decision;\n\t\t * });\n\t\t */\n\t\taddFilter: function (hookName, namespace, callback, priority = 10) {\n\t\t\tif (!hookName || typeof hookName !== \"string\") {\n\t\t\t\tpmw.console.error(\"Invalid hook name provided to addFilter\");\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (!namespace || typeof namespace !== \"string\") {\n\t\t\t\tpmw.console.error(\"Invalid namespace provided to addFilter\");\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (typeof callback !== \"function\") {\n\t\t\t\tpmw.console.error(\"Invalid callback provided to addFilter\");\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (!this.filters[hookName]) {\n\t\t\t\tthis.filters[hookName] = [];\n\t\t\t}\n\n\t\t\tthis.filters[hookName].push({\n\t\t\t\tnamespace: namespace,\n\t\t\t\tcallback : callback,\n\t\t\t\tpriority : priority,\n\t\t\t});\n\n\t\t\t// Sort by priority (ascending order)\n\t\t\tthis.filters[hookName].sort((a, b) => a.priority - b.priority);\n\n\t\t\tpmw.console.log(`Filter added: ${hookName} (${namespace}) with priority ${priority}`);\n\t\t},\n\n\t\t/**\n\t\t * Apply all registered filters to a value\n\t\t *\n\t\t * @param {string} hookName - The filter hook name\n\t\t * @param {*} value - The value to filter\n\t\t * @param {...*} args - Additional arguments passed to filter callbacks\n\t\t * @returns {*} The filtered value\n\t\t *\n\t\t * @example\n\t\t * let payload = pmw.hooks.applyFilters('pmw_event_payload_pre', payload, eventName);\n\t\t */\n\t\tapplyFilters: function (hookName, value, ...args) {\n\t\t\tif (!this.filters[hookName] || this.filters[hookName].length === 0) {\n\t\t\t\treturn value;\n\t\t\t}\n\n\t\t\tlet filteredValue = value;\n\n\t\t\tfor (const filter of this.filters[hookName]) {\n\t\t\t\ttry {\n\t\t\t\t\tconst result = filter.callback(filteredValue, ...args);\n\n\t\t\t\t\t// Ensure callback returns a value\n\t\t\t\t\tif (result !== undefined) {\n\t\t\t\t\t\tfilteredValue = result;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tpmw.console.warn(`Filter ${filter.namespace} on ${hookName} returned undefined, keeping previous value`);\n\t\t\t\t\t}\n\t\t\t\t} catch (e) {\n\t\t\t\t\tpmw.console.error(`Filter error in ${filter.namespace} on ${hookName}:`, e);\n\t\t\t\t\t// Continue with the previous value if this filter fails\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn filteredValue;\n\t\t},\n\n\t\t/**\n\t\t * Remove a specific filter\n\t\t *\n\t\t * @param {string} hookName - The filter hook name\n\t\t * @param {string} namespace - The namespace of the filter to remove\n\t\t *\n\t\t * @example\n\t\t * pmw.hooks.removeFilter('pmw_pixel_data_facebook', 'my-plugin');\n\t\t */\n\t\tremoveFilter: function (hookName, namespace) {\n\t\t\tif (!this.filters[hookName]) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst initialLength = this.filters[hookName].length;\n\t\t\tthis.filters[hookName] = this.filters[hookName].filter(f => f.namespace !== namespace);\n\n\t\t\tif (this.filters[hookName].length < initialLength) {\n\t\t\t\tpmw.console.log(`Filter removed: ${hookName} (${namespace})`);\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Remove all filters for a specific hook\n\t\t *\n\t\t * @param {string} hookName - The filter hook name\n\t\t */\n\t\tremoveAllFilters: function (hookName) {\n\t\t\tif (this.filters[hookName]) {\n\t\t\t\tdelete this.filters[hookName];\n\t\t\t\tpmw.console.log(`All filters removed for: ${hookName}`);\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Check if a specific hook has any filters\n\t\t *\n\t\t * @param {string} hookName - The filter hook name\n\t\t * @param {string} namespace - Optional: check for a specific namespace\n\t\t * @returns {boolean}\n\t\t */\n\t\thasFilter: function (hookName, namespace = null) {\n\t\t\tif (!this.filters[hookName] || this.filters[hookName].length === 0) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tif (namespace) {\n\t\t\t\treturn this.filters[hookName].some(f => f.namespace === namespace);\n\t\t\t}\n\n\t\t\treturn true;\n\t\t},\n\n\t\t/**\n\t\t * Get all registered filters for a hook\n\t\t *\n\t\t * @param {string} hookName - The filter hook name\n\t\t * @returns {Array} Array of filter objects\n\t\t */\n\t\tgetFilters: function (hookName) {\n\t\t\treturn this.filters[hookName] || [];\n\t\t},\n\t};\n\n\t// Backward compatibility: create pmw.hooks as an alias to pmw.hooks\n\tpmw.hooks = pmw.hooks;\n\n}(window.pmw = window.pmw || {}, jQuery));\n",null,"/**\n * Cross-Tab Session Sync Module\n *\n * Synchronizes PMW session storage data across browser tabs using\n * BroadcastChannel (primary) with a localStorage event fallback.\n *\n * This ensures that click identifiers (gclid, fbclid, ttclid, etc.),\n * IP/geo data, and other session state are available in all tabs,\n * including tabs opened via right-click → \"Open in New Tab\".\n *\n * @since 1.57.0\n * @module cross-tab-sync\n */\n\nconst CHANNEL_NAME = \"pmw_session_sync\"\nconst LOCALSTORAGE_KEY = \"_pmw_cross_tab_sync\"\nconst SESSION_DATA_PREFIX = \"_pmw_session_data\"\n\n/**\n * Message types for cross-tab communication\n */\nconst MSG = {\n\tSESSION_REQUEST : \"SESSION_REQUEST\",\n\tSESSION_RESPONSE: \"SESSION_RESPONSE\",\n\tSESSION_UPDATE : \"SESSION_UPDATE\",\n}\n\n/**\n * Keys that should NOT be synced across tabs.\n * These are per-tab behavioral flags that represent\n * one-time actions or tab-specific state.\n */\nconst EXCLUDED_KEYS = new Set([\n\t\"loginEventFired\",\n\t\"accountCreatedEventFired\",\n\t\"acr_attempted\",\n\t\"store_client_ip_in_server_session\",\n])\n\n/**\n * Guard flag to prevent re-broadcasting data\n * that was received from another tab.\n */\nlet _isSyncing = false\n\n/**\n * Reference to the BroadcastChannel instance (if supported)\n * @type {BroadcastChannel|null}\n */\nlet _channel = null\n\n/**\n * Whether the sync module has been initialized\n */\nlet _initialized = false\n\n/**\n * Check if a session data key should be synced across tabs.\n *\n * @param {string} key - The session data key\n * @return {boolean}\n */\nexport const isSyncableKey = (key) => {\n\treturn !EXCLUDED_KEYS.has(key)\n}\n\n/**\n * Check if we're currently applying synced data (to prevent re-broadcast loops).\n *\n * @return {boolean}\n */\nexport const isSyncing = () => _isSyncing\n\n/**\n * Filter an object to remove excluded keys.\n *\n * @param {Object} data - The session data object\n * @return {Object} Filtered data with excluded keys removed\n */\nconst filterSyncableData = (data) => {\n\tif (!data || typeof data !== \"object\") return {}\n\n\tconst filtered = {}\n\tfor (const key of Object.keys(data)) {\n\t\tif (isSyncableKey(key)) {\n\t\t\tfiltered[key] = data[key]\n\t\t}\n\t}\n\treturn filtered\n}\n\n/**\n * Read all session data from sessionStorage, including extension keys.\n *\n * @return {Object} Object with `main` (the default session data) and `extensions` (map of suffix → data)\n */\nconst readAllSessionData = () => {\n\tconst result = {\n\t\tmain : {},\n\t\textensions: {},\n\t}\n\n\tif (!window.sessionStorage) return result\n\n\ttry {\n\t\t// Read main session data\n\t\tconst mainRaw = window.sessionStorage.getItem(SESSION_DATA_PREFIX)\n\t\tif (mainRaw) {\n\t\t\tresult.main = JSON.parse(mainRaw)\n\t\t}\n\n\t\t// Scan for extension keys (_pmw_session_data_*)\n\t\tfor (let i = 0; i < window.sessionStorage.length; i++) {\n\t\t\tconst storageKey = window.sessionStorage.key(i)\n\t\t\tif (storageKey && storageKey.startsWith(SESSION_DATA_PREFIX + \"_\")) {\n\t\t\t\tconst suffix = storageKey.substring(SESSION_DATA_PREFIX.length + 1)\n\t\t\t\ttry {\n\t\t\t\t\tresult.extensions[suffix] = JSON.parse(window.sessionStorage.getItem(storageKey))\n\t\t\t\t} catch (e) {\n\t\t\t\t\t// Skip malformed extension data\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t} catch (e) {\n\t\t// sessionStorage access failed\n\t}\n\n\treturn result\n}\n\n/**\n * Merge remote session data into local session storage.\n * Local data takes precedence (local-wins strategy).\n *\n * @param {Object} remoteSnapshot - { main: {}, extensions: {} }\n */\nconst mergeRemoteData = (remoteSnapshot) => {\n\tif (!window.sessionStorage || !remoteSnapshot) return\n\n\t_isSyncing = true\n\n\ttry {\n\t\t// Merge main session data (local wins)\n\t\tif (remoteSnapshot.main && typeof remoteSnapshot.main === \"object\") {\n\t\t\tconst filteredRemote = filterSyncableData(remoteSnapshot.main)\n\t\t\tconst localRaw = window.sessionStorage.getItem(SESSION_DATA_PREFIX)\n\t\t\tconst localData = localRaw ? JSON.parse(localRaw) : {}\n\t\t\tconst merged = {...filteredRemote, ...localData}\n\n\t\t\twindow.sessionStorage.setItem(SESSION_DATA_PREFIX, JSON.stringify(merged))\n\t\t}\n\n\t\t// Merge extension keys (local wins)\n\t\tif (remoteSnapshot.extensions && typeof remoteSnapshot.extensions === \"object\") {\n\t\t\tfor (const [suffix, remoteData] of Object.entries(remoteSnapshot.extensions)) {\n\t\t\t\tconst extKey = SESSION_DATA_PREFIX + \"_\" + suffix\n\t\t\t\tconst localRaw = window.sessionStorage.getItem(extKey)\n\n\t\t\t\tif (!localRaw) {\n\t\t\t\t\t// No local data for this extension — use remote\n\t\t\t\t\twindow.sessionStorage.setItem(extKey, JSON.stringify(remoteData))\n\t\t\t\t}\n\t\t\t\t// If local data exists, keep it (local wins)\n\t\t\t}\n\t\t}\n\t} catch (e) {\n\t\t// Merge failed silently\n\t}\n\n\t_isSyncing = false\n}\n\n/**\n * Send a message to other tabs.\n *\n * @param {Object} message - The message object to send\n */\nconst sendMessage = (message) => {\n\ttry {\n\t\tif (_channel) {\n\t\t\t_channel.postMessage(message)\n\t\t} else {\n\t\t\t// Fallback: use localStorage event\n\t\t\t// Write → remove pattern ensures the storage event fires every time,\n\t\t\t// even if the message content is the same\n\t\t\twindow.localStorage.setItem(LOCALSTORAGE_KEY, JSON.stringify(message))\n\t\t\twindow.localStorage.removeItem(LOCALSTORAGE_KEY)\n\t\t}\n\t} catch (e) {\n\t\t// Send failed silently\n\t}\n}\n\n/**\n * Handle an incoming message from another tab.\n *\n * @param {Object} message - The received message\n */\nconst handleMessage = (message) => {\n\tif (!message || !message.type) return\n\n\tswitch (message.type) {\n\n\t\tcase MSG.SESSION_REQUEST:\n\t\t\t// Another tab is requesting session data — send ours\n\t\t\tsendMessage({\n\t\t\t\ttype: MSG.SESSION_RESPONSE,\n\t\t\t\tdata: readAllSessionData(),\n\t\t\t})\n\t\t\tbreak\n\n\t\tcase MSG.SESSION_RESPONSE:\n\t\t\t// We received session data from another tab — merge it\n\t\t\tmergeRemoteData(message.data)\n\t\t\tbreak\n\n\t\tcase MSG.SESSION_UPDATE: {\n\t\t\t// A specific key was updated in another tab — apply it locally\n\t\t\tif (!message.key || !isSyncableKey(message.key)) break\n\n\t\t\t_isSyncing = true\n\n\t\t\ttry {\n\t\t\t\tif (message.extension) {\n\t\t\t\t\t// Extension key update\n\t\t\t\t\tconst extKey = SESSION_DATA_PREFIX + \"_\" + message.suffix\n\t\t\t\t\twindow.sessionStorage.setItem(extKey, JSON.stringify(message.value))\n\t\t\t\t} else {\n\t\t\t\t\t// Main session data key update\n\t\t\t\t\tconst localRaw = window.sessionStorage.getItem(SESSION_DATA_PREFIX)\n\t\t\t\t\tconst localData = localRaw ? JSON.parse(localRaw) : {}\n\t\t\t\t\tlocalData[message.key] = message.value\n\t\t\t\t\twindow.sessionStorage.setItem(SESSION_DATA_PREFIX, JSON.stringify(localData))\n\t\t\t\t}\n\t\t\t} catch (e) {\n\t\t\t\t// Update failed silently\n\t\t\t}\n\n\t\t\t_isSyncing = false\n\t\t\tbreak\n\t\t}\n\t}\n}\n\n/**\n * Broadcast a session data update to other tabs.\n * Called from pmw.storeData() when a key is written.\n *\n * @param {string} key - The session data key that was updated\n * @param {*} value - The new value\n * @param {boolean} extension - Whether this is an extension key\n * @param {string} suffix - The extension suffix (if extension=true)\n */\nexport const broadcastUpdate = (key, value, extension = false, suffix = \"\") => {\n\tif (_isSyncing) return\n\tif (!extension && !isSyncableKey(key)) return\n\n\tsendMessage({\n\t\ttype: MSG.SESSION_UPDATE,\n\t\tkey,\n\t\tvalue,\n\t\textension,\n\t\tsuffix,\n\t})\n}\n\n/**\n * Request session data from existing tabs.\n * Called when a new tab initializes.\n */\nconst requestSessionData = () => {\n\tsendMessage({type: MSG.SESSION_REQUEST})\n}\n\n/**\n * Initialize the cross-tab sync module.\n * Sets up either BroadcastChannel or localStorage event listener,\n * then requests session data from existing tabs.\n *\n * @since 1.57.0\n */\nexport const init = () => {\n\tif (_initialized) return\n\t_initialized = true\n\n\ttry {\n\t\tif (typeof BroadcastChannel !== \"undefined\") {\n\t\t\t// Primary transport: BroadcastChannel\n\t\t\t_channel = new BroadcastChannel(CHANNEL_NAME)\n\t\t\t_channel.onmessage = (event) => handleMessage(event.data)\n\t\t} else {\n\t\t\t// Fallback transport: localStorage storage events\n\t\t\twindow.addEventListener(\"storage\", (event) => {\n\t\t\t\tif (event.key !== LOCALSTORAGE_KEY || !event.newValue) return\n\n\t\t\t\ttry {\n\t\t\t\t\tconst message = JSON.parse(event.newValue)\n\t\t\t\t\thandleMessage(message)\n\t\t\t\t} catch (e) {\n\t\t\t\t\t// Malformed message\n\t\t\t\t}\n\t\t\t})\n\t\t}\n\n\t\t// Request session data from any existing tabs\n\t\trequestSessionData()\n\t} catch (e) {\n\t\t// Initialization failed — sync won't be available but PMW still works\n\t}\n}\n\n/**\n * Clean up the cross-tab sync resources.\n * Called on page unload.\n *\n * @since 1.57.0\n */\nexport const cleanup = () => {\n\tif (_channel) {\n\t\ttry {\n\t\t\t_channel.close()\n\t\t} catch (e) {\n\t\t\t// Close failed silently\n\t\t}\n\t\t_channel = null\n\t}\n\t_initialized = false\n}\n","/**\n * Event Processor\n *\n * Unified event processing system that orchestrates:\n * - Building standardized event payloads\n * - Applying filters at multiple stages\n * - Adapting data for each active pixel\n * - Dispatching to browser pixels and S2S endpoints\n *\n * @since 1.51.0\n */\n\n(function (pmw, $, undefined) {\n\n\t/**\n\t * Get the current consent context\n\t *\n\t * Provides consent status in a structured format for event payloads.\n\t * This allows third-party integrations to make decisions based on\n\t * the current consent state.\n\t *\n\t * @returns {object} Consent context object\n\t */\n\tpmw.getConsentContext = function () {\n\t\tconst categories = pmw.consent?.categories?.get() || {\n\t\t\tstatistics : true,\n\t\t\tmarketing : true,\n\t\t\tpreferences: true,\n\t\t\tnecessary : true,\n\t\t};\n\n\t\treturn {\n\t\t\t// Category-level consent status\n\t\t\tcategories: {\n\t\t\t\tstatistics : categories.statistics,\n\t\t\t\tmarketing : categories.marketing,\n\t\t\t\tpreferences: categories.preferences,\n\t\t\t\tnecessary : categories.necessary,\n\t\t\t},\n\n\t\t\t// Whether the visitor has actively made a consent choice\n\t\t\tvisitor_has_chosen: pmw.consent?.settings?.get()?.visitorHasChosen ?? false,\n\n\t\t\t// Whether explicit consent mode is active\n\t\t\texplicit_mode: pmw.consent?.explicitConsentModeActive?.() ?? false,\n\t\t};\n\t};\n\n\t/**\n\t * Global event context that's added to all events\n\t *\n\t * @returns {object} Context object with user, session, page, and consent data\n\t */\n\tpmw.getEventContext = function () {\n\t\treturn {\n\t\t\ttimestamp : Math.floor(Date.now() / 1000),\n\t\t\turl : window.location.href,\n\t\t\treferrer : pmw.retrieveData(\"referrer\") ? pmw.makeFullUrl(pmw.retrieveData(\"referrer\")) : document.referrer,\n\t\t\tuser_agent: navigator.userAgent,\n\t\t\tpage_type : pmwDataLayer?.shop?.page_type,\n\t\t\tuser_id : pmwDataLayer?.user?.id?.raw || null,\n\n\t\t\t// Consent status - for third-party integrations and internal use\n\t\t\tconsent: pmw.getConsentContext(),\n\t\t};\n\t};\n\n\t/**\n\t * Process an event through the unified pipeline\n\t *\n\t * This is the main entry point for processing events with the new filter system.\n\t *\n\t * @param {string} eventName - Standardized event name (e.g., 'add_to_cart', 'view_item')\n\t * @param {object} eventData - Core event data (product, cart, order, etc.)\n\t * @returns {Promise<object>} The processed payload\n\t */\n\tpmw.processEvent = async function (eventName, eventData) {\n\n\t\tpmw.console.log(`Processing event: ${eventName}`, eventData);\n\n\t\ttry {\n\t\t\t// 1. Create base payload with standardized structure\n\t\t\tlet payload = {\n\t\t\t\tevent : eventName,\n\t\t\t\tevent_data: eventData,\n\t\t\t\tpixels : {},\n\t\t\t\tcontext : pmw.getEventContext(),\n\t\t\t};\n\n\t\t\t// 2. Apply pre-processing filter\n\t\t\t// Use case: Add global tracking params, modify core data before pixel adaptations\n\t\t\tpayload = pmw.hooks.applyFilters(\"pmw_event_payload_pre\", payload, eventName);\n\n\t\t\t// 3. Transform for each processable pixel (active + S2S-configured-but-not-loaded)\n\t\t\tconst activePixels = pmw.pixelRegistry.getProcessablePixels();\n\n\t\t\tfor (const pixelName of activePixels) {\n\t\t\t\tconst adapter = pmw.pixelRegistry.getAdapter(pixelName);\n\n\t\t\t\tif (!adapter || typeof adapter.adapt !== \"function\") {\n\t\t\t\t\tpmw.console.log(`No adapter found for pixel: ${pixelName}`);\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\ttry {\n\t\t\t\t// Adapt event data to pixel-specific format (supports async adapters)\n\t\t\t\tlet pixelData = await adapter.adapt(payload.event_data, eventName, payload.context);\n\n\t\t\t\t// Adapters return null for events they don't support\n\t\t\t\t// This allows pixels to opt-out of specific events gracefully\n\t\t\t\t// (e.g., TikTok doesn't support page_view, Pinterest doesn't support add_to_wishlist)\n\t\t\t\tif (pixelData === null) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\t// Apply pixel-specific filter\n\t\t\t\t// Use case: Modify Facebook-specific data, add custom parameters per pixel\n\t\t\t\tpixelData = pmw.hooks.applyFilters(\n\t\t\t\t\t`pmw_pixel_data_${pixelName}`,\n\t\t\t\t\tpixelData,\n\t\t\t\t\teventName,\n\t\t\t\t\tpayload.event_data,\n\t\t\t\t\tpayload.context,\n\t\t\t\t);\n\n\t\t\t\tpayload.pixels[pixelName] = pixelData;\n\t\t\t} catch (e) {\n\t\t\t\tpmw.console.error(`Error adapting data for ${pixelName}:`, e);\n\t\t\t}\n\t\t\t}\n\n\t\t\t// 4. Apply event-specific filter\n\t\t\t// Use case: Modify all pixels for a specific event type (e.g., all add_to_cart events)\n\t\t\tpayload = pmw.hooks.applyFilters(\n\t\t\t\t`pmw_event_payload_${eventName}`,\n\t\t\t\tpayload,\n\t\t\t\tpayload.event_data,\n\t\t\t);\n\n\t\t\t// 5. Apply post-processing filter\n\t\t\t// Use case: Final validation, logging, debugging, cross-pixel modifications\n\t\t\tpayload = pmw.hooks.applyFilters(\"pmw_event_payload_post\", payload, eventName);\n\n\t\t\t// 6. Add firing decisions to payload for each pixel\n\t\t\tpayload.firing = {};\n\t\t\tfor (const pixelName of Object.keys(payload.pixels)) {\n\t\t\t\tpayload.firing[pixelName] = pmw.pixelRegistry.getFiringDecision(pixelName, eventName);\n\t\t\t}\n\n\t\t\t// 7. Dispatch to pixels\n\t\t\tawait pmw.dispatchToPixels(payload);\n\n\t\t\treturn payload;\n\n\t\t} catch (e) {\n\t\t\tpmw.console.error(`Error processing event ${eventName}:`, e);\n\t\t\tthrow e;\n\t\t}\n\t};\n\n\t/**\n\t * Dispatch the processed payload to pixels\n\t *\n\t * Unified dispatch system that:\n\t * 1. Dispatches a single pmw:{event} event with firing decisions per pixel\n\t * 2. Sends to server for pixels that need S2S\n\t *\n\t * @param {object} payload - The fully processed event payload with firing decisions\n\t * @returns {Promise<void>}\n\t */\n\tpmw.dispatchToPixels = async function (payload) {\n\n\t\tconst eventName = payload.event;\n\n\t\t// Dispatch unified event (replaces separate browser/s2s events)\n\t\t// Pixels check payload.firing[pixelName].fire_browser to decide if they should fire\n\t\tpmw.dispatchUnifiedEvent(payload);\n\n\t\t// Dispatch PUBLIC event for third-party integrations\n\t\t// This is the official public API - pmw:event:* events\n\t\t// Third parties should listen to these events, not the internal pmw:* events\n\t\tpmw.dispatchPublicEvent(payload);\n\n\t\t// Purchase events are handled entirely server-side and should never be sent from browser to server\n\t\t// to prevent duplicates and race conditions. However, browser-side pixels still need to fire.\n\t\tif (eventName === \"purchase\") {\n\t\t\tpmw.console.log(\"Purchase event - skipping browser-to-server transmission (handled server-side only)\");\n\t\t\treturn; // Return early, but browser pixels have already been dispatched above\n\t\t}\n\n\t\t// Page view S2S is handled separately in the pmw:page-view event listener\n\t\t// which respects the pageview_event_s2s.is_active setting\n\t\tif (eventName === \"page_view\") {\n\t\t\treturn; // Return early, S2S handled in event_listeners.js with proper settings check\n\t\t}\n\n\t\t// Only send to server if S2S is globally enabled\n\t\tif (pmwDataLayer?.general?.server_2_server?.active) {\n\t\t\t// Extract S2S data for server transmission\n\t\t\tconst s2sData = pmw.extractS2SData(payload);\n\n\t\t\t// Send to server if there's S2S data to send\n\t\t\tif (Object.keys(s2sData).length > 0) {\n\n\t\t\t\t// Check if the event has actual destination pixel data (not just metadata like 'event' and 'product')\n\t\t\t\tif (pmwDataLayer.general.server_2_server.skip_empty_events) {\n\t\t\t\t\tconst destinationKeys = Object.keys(s2sData).filter(key => key !== \"event\" && key !== \"product\");\n\t\t\t\t\tif (destinationKeys.length === 0) {\n\t\t\t\t\t\tpmw.console.log(`Skipping empty S2S event: ${eventName} — no destination pixels`);\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tconst serverPixels = pmw.pixelRegistry.getPixelsForServerFiring(eventName);\n\t\t\t\tpmw.console.log(`S2S enabled pixels for ${eventName}:`, serverPixels);\n\t\t\t\tawait pmw.sendEventPayloadToServer(s2sData);\n\t\t\t}\n\t\t}\n\t};\n\n\t/**\n\t * Dispatch unified event to all pixels\n\t *\n\t * This is the new unified event system that replaces the separate pmw:browser:* and pmw:s2s:* events.\n\t * All pixels now listen to pmw:pixel:{event-name} and check payload.firing[pixelName].fire_browser\n\t * to determine if they should fire their browser pixel.\n\t *\n\t * NOTE: This is an INTERNAL event. Third parties should use pmw:event:* events instead.\n\t *\n\t * Event namespace:\n\t * - pmw:{event} - Entry point events (triggers processEvent)\n\t * - pmw:pixel:{event} - Pixel dispatch events (pixels listen to these)\n\t * - pmw:event:{event} - Public API events (third-party integrations)\n\t *\n\t * @param {object} payload - The fully processed event payload with firing decisions\n\t */\n\tpmw.dispatchUnifiedEvent = function (payload) {\n\n\t\tconst processablePixels = pmw.pixelRegistry.getProcessablePixels();\n\n\t\tif (processablePixels.length === 0) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Convert underscores to hyphens for event name\n\t\tconst eventName = payload.event.replace(/_/g, \"-\");\n\n\t\tpmw.console.log(`Dispatching unified event pmw:pixel:${eventName}`, {\n\t\t\tprocessablePixels: processablePixels,\n\t\t\tfiringStatus : payload.firing,\n\t\t});\n\n\t\t// Dispatch single unified event to pixel namespace\n\t\t// Pixels check payload.firing[pixelName].fire_browser to decide whether to fire\n\t\tjQuery(document).trigger(`pmw:pixel:${eventName}`, payload);\n\t};\n\n\t/**\n\t * @deprecated Use pmw.dispatchUnifiedEvent() instead\n\t * Dispatch to browser-only pixels (internal) - LEGACY SUPPORT\n\t *\n\t * NOTE: This function is deprecated. Migrate to listening to pmw:* events\n\t * and checking payload.firing[pixelName].fire_browser\n\t *\n\t * @param {object} payload - The fully processed event payload\n\t */\n\tpmw.dispatchToBrowserPixels = function (payload) {\n\n\t\tconst browserPixels = pmw.pixelRegistry.getActiveBrowserOnlyPixels();\n\n\t\tif (browserPixels.length === 0) {\n\t\t\treturn;\n\t\t}\n\n\t\tpmw.console.log(`[DEPRECATED] Dispatching to browser-only pixels for ${payload.event}:`, browserPixels);\n\n\t\t// Trigger browser-specific event that browser-only pixels can listen to (internal)\n\t\t// This allows them to access the filtered, adapted data\n\t\t// Convert underscores to hyphens for event name\n\t\tconst browserEventName = payload.event.replace(/_/g, \"-\");\n\t\tjQuery(document).trigger(`pmw:browser:${browserEventName}`, payload);\n\t};\n\n\t/**\n\t * @deprecated Use pmw.dispatchUnifiedEvent() instead\n\t * Dispatch to S2S-capable pixels (internal) - LEGACY SUPPORT\n\t *\n\t * NOTE: This function is deprecated. Migrate to listening to pmw:* events\n\t * and checking payload.firing[pixelName].fire_browser\n\t *\n\t * @param {object} payload - The fully processed event payload\n\t */\n\tpmw.dispatchToS2SPixels = function (payload) {\n\n\t\tconst s2sPixels = pmw.pixelRegistry.getActiveS2SPixels();\n\n\t\tif (s2sPixels.length === 0) {\n\t\t\treturn;\n\t\t}\n\n\t\tpmw.console.log(`[DEPRECATED] Dispatching to S2S-capable pixels for ${payload.event}:`, s2sPixels);\n\n\t\t// Trigger S2S event that S2S-capable pixels listen to (internal)\n\t\t// This provides adapted data with event_id for deduplication between browser and server\n\t\t// Convert underscores to hyphens for event name\n\t\tconst s2sEventName = payload.event.replace(/_/g, \"-\");\n\t\tjQuery(document).trigger(`pmw:s2s:${s2sEventName}`, payload);\n\t};\n\n\t/**\n\t * Dispatch public event for third-party integrations\n\t *\n\t * This is the official PUBLIC API for third-party integrations.\n\t * Third parties should listen to pmw:event:* events to receive\n\t * fully processed payloads with all data including consent status.\n\t *\n\t * Available events:\n\t * - pmw:event:add-to-cart\n\t * - pmw:event:remove-from-cart\n\t * - pmw:event:view-item\n\t * - pmw:event:view-item-list\n\t * - pmw:event:select-item\n\t * - pmw:event:begin-checkout\n\t * - pmw:event:add-payment-info\n\t * - pmw:event:add-to-wishlist\n\t * - pmw:event:purchase\n\t * - pmw:event:search\n\t * - pmw:event:page-view\n\t *\n\t * @param {object} payload - The fully processed event payload\n\t */\n\tpmw.dispatchPublicEvent = function (payload) {\n\n\t\t// Convert underscores to hyphens for event name (e.g., add_to_cart -> add-to-cart)\n\t\tconst publicEventName = payload.event.replace(/_/g, \"-\");\n\n\t\t// Dispatch the public event that third parties can listen to\n\t\t// This includes all processed data: event_data, pixels, firing, and context (with consent)\n\t\tjQuery(document).trigger(`pmw:event:${publicEventName}`, payload);\n\n\t\tpmw.console.log(`Public event dispatched: pmw:event:${publicEventName}`, payload);\n\t};\n\t/**\n\t * Extract server-to-server data from the payload\n\t *\n\t * Only pixels with fire_server=true in their firing decision should be included.\n\t * This creates a single payload with data for all server-firing pixels.\n\t *\n\t * @param {object} payload - The full event payload with firing decisions\n\t * @returns {object} S2S-only data for server transmission\n\t */\n\tpmw.extractS2SData = function (payload) {\n\n\t\tconst s2sData = {\n\t\t\tevent: payload.event,\n\t\t};\n\n\t\t// Use the new firing decision system\n\t\tconst serverPixels = pmw.pixelRegistry.getPixelsForServerFiring(payload.event);\n\n\t\tfor (const pixelName of serverPixels) {\n\t\t\tif (payload.pixels[pixelName]) {\n\t\t\t\ts2sData[pixelName] = payload.pixels[pixelName];\n\t\t\t}\n\t\t}\n\n\t\t// Add product data if present (for server-side processing)\n\t\tif (payload.event_data?.product) {\n\t\t\ts2sData.product = payload.event_data.product;\n\t\t}\n\n\t\treturn s2sData;\n\t};\n\n\t/**\n\t * Check if a pixel should fire its browser pixel for a given payload\n\t *\n\t * This is a convenience method for pixels to use in their event listeners.\n\t * It checks the payload.firing[pixelName].fire_browser flag.\n\t *\n\t * @param {object} payload - The event payload with firing decisions\n\t * @param {string} pixelName - The pixel name to check\n\t * @returns {boolean} True if the browser pixel should fire\n\t *\n\t * @example\n\t * jQuery(document).on(\"pmw:add-to-cart\", (event, payload) => {\n\t * if (!pmw.shouldFireBrowserPixel(payload, 'facebook')) return;\n\t * // Fire the pixel...\n\t * });\n\t */\n\tpmw.shouldFireBrowserPixel = function (payload, pixelName) {\n\t\treturn payload.firing?.[pixelName]?.fire_browser === true;\n\t};\n\n\t/**\n\t * Check if a pixel should fire server-side for a given payload\n\t *\n\t * @param {object} payload - The event payload with firing decisions\n\t * @param {string} pixelName - The pixel name to check\n\t * @returns {boolean} True if the server-side event should fire\n\t */\n\tpmw.shouldFireServerPixel = function (payload, pixelName) {\n\t\treturn payload.firing?.[pixelName]?.fire_server === true;\n\t};\n\n\t/**\n\t * Initialize adapters namespace\n\t */\n\tif (!pmw.adapters) {\n\t\tpmw.adapters = {};\n\t}\n\n\t/**\n\t * Helper function to register an adapter with optional capabilities\n\t *\n\t * Firing Modes:\n\t * - browser_only: Fire only in browser, no server-side (default for pixels without S2S)\n\t * - server_only: Fire only server-side, suppress browser pixel completely\n\t * - both: Fire browser AND server with event_id deduplication (Facebook, TikTok default)\n\t * - browser_or_server: Fire one OR the other, never both (GA4 purchase)\n\t *\n\t * @param {string} pixelName - The pixel name\n\t * @param {object} adapter - The adapter object with an adapt() method\n\t * @param {object} [options] - Optional capabilities configuration\n\t * @param {string} [options.mode='browser_only'] - Firing mode: browser_only, server_only, both, browser_or_server\n\t * @param {boolean} [options.supportsS2S=false] - Whether pixel supports server-to-server tracking\n\t * @param {boolean} [options.supportsEventDeduplication=false] - Whether pixel supports event deduplication\n\t * @param {function} [options.isActive] - Function that returns true if pixel is active/loaded\n\t *\n\t * @example\n\t * // Browser-only pixel (Microsoft Ads)\n\t * pmw.registerAdapter('bing', BingAdapter, {\n\t * mode: 'browser_only',\n\t * isActive: () => !!pmwDataLayer?.pixels?.bing?.loaded\n\t * });\n\t *\n\t * @example\n\t * // S2S pixel with deduplication (Facebook)\n\t * pmw.registerAdapter('facebook', FacebookAdapter, {\n\t * mode: 'both',\n\t * supportsS2S: true,\n\t * supportsEventDeduplication: true,\n\t * isActive: () => !!pmwDataLayer?.pixels?.facebook?.pixel_id\n\t * });\n\t */\n\tpmw.registerAdapter = function (pixelName, adapter, options = {}) {\n\t\tif (!adapter || typeof adapter.adapt !== \"function\") {\n\t\t\tpmw.console.error(`Invalid adapter for ${pixelName}: must have an adapt() method`);\n\t\t\treturn;\n\t\t}\n\n\t\t// Store the adapter\n\t\tpmw.adapters[pixelName] = adapter;\n\n\t\t// Store pixel capabilities\n\t\tif (!pmw.pixelCapabilities) {\n\t\t\tpmw.pixelCapabilities = {};\n\t\t}\n\n\t\t// Determine default mode based on S2S support\n\t\tlet defaultMode = \"browser_only\";\n\t\tif (options.supportsS2S) {\n\t\t\tdefaultMode = \"both\";\n\t\t}\n\n\t\tpmw.pixelCapabilities[pixelName] = {\n\t\t\t...options,\n\t\t\tmode : options.mode || defaultMode,\n\t\t\tsupportsS2S : options.supportsS2S || false,\n\t\t\tsupportsEventDeduplication: options.supportsEventDeduplication || false,\n\t\t\tisActive : options.isActive || null,\n\t\t};\n\n\t\t// pmw.console.log(`Adapter registered for: ${pixelName}`, pmw.pixelCapabilities[pixelName]);\n\t};\n\n}(window.pmw = window.pmw || {}, jQuery));","/**\n * IP functions\n */\n\n(function (pmw, $, undefined) {\n\n\tconst {isRange, isIP, isV4, isV6, version: getIpVersion} = require(\"range_check\")\n\n\t// Promise-based IP detection to prevent race conditions\n\t// Stores the ongoing detection promise so multiple callers can await the same result\n\tlet ipDetectionPromise = null\n\t let ipDetectionResolved = false\n\n\tconst ipServices = {\n\t\t\"cloudflare\": {\n\t\t\t\"any\": \"https://www.cloudflare.com/cdn-cgi/trace\",\n\t\t},\n\t\t// icanhazip seems to regularly be added to malware databases, despite being a legitimate service run by Cloudflare\n\t\t// https://blog.apnic.net/2021/06/17/how-a-small-free-ip-tool-survived/\n\t\t// https://major.io/p/a-new-future-for-icanhazip/\n\t\t// https://major.io/p/extra-icanhaz-services-going-offline/\n\t\t\"icanhazip\" : {\n\t\t\t\"4\" : \"https://ipv4.icanhazip.com\",\n\t\t\t\"6\" : \"https://ipv6.icanhazip.com\",\n\t\t\t\"any\": \"https://icanhazip.com\",\n\t\t},\n\t\t\"ipinfo\" : {\n\t\t\t\"any\": \"https://ipinfo.io/ip\",\n\t\t},\n\t\t\"myexternalip\": {\n\t\t\t\"any\": \"https://myexternalip.com/raw\",\n\t\t\t// \"6\": \"https://api-ipv6.myexternalip.com/raw\", // This can return an IPv4 address, so we can't use it\n\t\t},\n\t\t\"ipify\" : {\n\t\t\t\"4\" : \"https://api4.ipify.org\",\n\t\t\t\"6\" : \"https://api6.ipify.org\",\n\t\t\t\"any\": \"https://api64.ipify.org\", // If IPv6 is available, AND the client is configured to prefer IPv6, this will return an IPv6 address\n\t\t},\n\t\t// ident.me - Reliable service with dedicated IPv4 and IPv6 endpoints\n\t\t// https://api.ident.me/\n\t\t\"identme\" : {\n\t\t\t\"4\" : \"https://4.ident.me/\",\n\t\t\t\"6\" : \"https://6.ident.me/\",\n\t\t\t\"any\": \"https://ident.me/\",\n\t\t},\n\t\t// Can't use amazon because its CORS policy blocks requests from the browser\n\t\t// \"amazon\" : {\n\t\t// \t\"any\": \"https://checkip.amazonaws.com/\",\n\t\t// },\n\t\t// Can't use ip.sb because its CORS policy blocks requests from the browser\n\t\t// \"ip.sb\" : {\n\t\t// \t\"any\": \"https://api.ip.sb/ip\",\n\t\t// },\n\t\t// Can't use seeip because its CORS policy blocks requests from the browser\n\t\t// \"seeip\" : {\n\t\t// \t\"any\": \"https://api.seeip.org\",\n\t\t// \t\"4\": \"https://ipv4.seeip.org\",\n\t\t// \t\"6\": \"https://ipv6.seeip.org\",\n\t\t// },\n\t}\n\n\t/**\n\t * Default timeout for IP service requests in milliseconds.\n\t * If a service doesn't respond within this time, the request is aborted.\n\t */\n\tconst IP_SERVICE_TIMEOUT_MS = 3000\n\n\t/**\n\t * Timeout for IPv6 detection in milliseconds.\n\t * IPv6 detection gets a shorter timeout since we fall back to any IP if it fails.\n\t * This prevents long waits for users without IPv6 connectivity.\n\t */\n\tconst IPV6_DETECTION_TIMEOUT_MS = 2000\n\n\t/**\n\t * Fetch with timeout using AbortController.\n\t * Aborts the request if it takes longer than the specified timeout.\n\t *\n\t * @param {string} url - The URL to fetch\n\t * @param {number} timeoutMs - Timeout in milliseconds (default: IP_SERVICE_TIMEOUT_MS)\n\t * @returns {Promise<Response>} The fetch response\n\t * @throws {Error} Throws 'AbortError' if the request times out\n\t */\n\tconst fetchWithTimeout = (url, timeoutMs = IP_SERVICE_TIMEOUT_MS) => {\n\t\tconst controller = new AbortController()\n\t\tconst timeoutId = setTimeout(() => controller.abort(), timeoutMs)\n\n\t\treturn fetch(url, { signal: controller.signal })\n\t\t\t.finally(() => clearTimeout(timeoutId))\n\t}\n\n\tpmw.getGeoInfo = {\n\n\t\tcloudflare: async () => {\n\n\t\t\tconst response = await fetchWithTimeout(\"https://www.cloudflare.com/cdn-cgi/trace\")\n\n\t\t\tif (!response.ok) throw new Error(`The response from Cloudflare was not OK. Status: ${response.status}`)\n\n\t\t\tlet data = await response.text()\n\n\t\t\tif (!data) throw new Error(\"No data was returned from Cloudflare\")\n\n\t\t\t// Convert key-value pairs to JSON\n\t\t\t// https://stackoverflow.com/a/39284735/452587\n\t\t\tdata = data\n\t\t\t\t.trim()\n\t\t\t\t.split(\"\\n\")\n\t\t\t\t.reduce((obj, pair) => {\n\t\t\t\t\tpair = pair.split(\"=\")\n\t\t\t\t\treturn obj[pair[0]] = pair[1], obj\n\t\t\t\t}, {})\n\n\t\t\tif (!data.ip || !data.loc) throw new Error(\"The JSON data is missing the ip or loc key from Cloudflare\")\n\n\t\t\t/**\n\t\t\t * Cloudflare doesn't return the region.\n\t\t\t * If the website manager has set a region such as California in the restricted_regions array,\n\t\t\t * we have to validate the region. This is not possible with the data from Cloudflare.\n\t\t\t * So we have to abort the process and give the other services a chance to return the region.\n\t\t\t */\n\t\t\tif (processRegion(data.loc)) throw new Error(\"We have to validate the region, and this service is not returning the region.\")\n\n\t\t\treturn {\n\t\t\t\tip : data.ip,\n\t\t\t\tcountryCode: data.loc,\n\t\t\t\tservice : \"cloudflare\",\n\t\t\t}\n\t\t},\n\n\t\tgeojs: async () => {\n\n\t\t\tconst response = await fetchWithTimeout(\"https://get.geojs.io/v1/ip/geo.json\")\n\n\t\t\tif (!response.ok) throw new Error(`The response from geojs was not OK. Status: ${response.status}`)\n\n\t\t\tlet data = await response.json()\n\n\t\t\tif (!data) throw new Error(\"No JSON data was returned from geojs\")\n\t\t\tif (!data.ip || !data.country_code || !data.region) throw new Error(\"The JSON data is missing the ip, country_code, or region key from geojs\")\n\n\t\t\treturn {\n\t\t\t\tip : data.ip,\n\t\t\t\tcountryCode: data.country_code,\n\t\t\t\tregion : data.region,\n\t\t\t\tservice : \"geojs\",\n\t\t\t}\n\t\t},\n\n\t\tipinfo: async () => {\n\n\t\t\tconst response = await fetchWithTimeout(\"https://ipinfo.io/json\")\n\n\t\t\tif (!response.ok) throw new Error(`The response from ipinfo was not OK from ipinfo. Status: ${response.status}`)\n\n\t\t\tlet data = await response.json()\n\n\t\t\tif (!data) throw new Error(\"No JSON data was returned from ipinfo\")\n\t\t\tif (!data.ip || !data.country || !data.region) throw new Error(\"The JSON data is missing the ip, country, or region key from ipinfo\")\n\n\t\t\treturn {\n\t\t\t\tip : data.ip,\n\t\t\t\tcountryCode: data.country,\n\t\t\t\tregion : data.region,\n\t\t\t\tservice : \"ipinfo\",\n\t\t\t}\n\t\t},\n\n\t\tipapi: async () => {\n\n\t\t\tconst response = await fetchWithTimeout(\"https://ipapi.co/json\")\n\n\t\t\tif (!response.ok) throw new Error(`The response from ipapi was not OK. Status: ${response.status}`)\n\n\t\t\tlet data = await response.json()\n\n\t\t\tif (!data) throw new Error(\"No JSON data was returned from ipapi\")\n\t\t\tif (!data.ip || !data.country || !data.region) throw new Error(\"The JSON data is missing the ip, country, or region key from ipapi\")\n\n\t\t\treturn {\n\t\t\t\tip : data.ip,\n\t\t\t\tcountryCode: data.country,\n\t\t\t\tregion : data.region,\n\t\t\t\tservice : \"ipapi\",\n\t\t\t}\n\t\t},\n\t}\n\n\t/**\n\t * /**\n\t * Cloudflare doesn't return the region.\n\t * If the website manager has set a region such as California in the restricted_regions array,\n\t * we have to validate the region. This is not possible with the data from Cloudflare.\n\t * So we have to abort the process and give the other services a chance to return the region.\n\t *\n\t * If the country code is US,\n\t * and the restricted_regions array contains \"US-CA\" or \"US-VA\",\n\t * we must process the region.\n\t *\n\t * @param countryCode\n\t * @returns {boolean}\n\t */\n\tconst processRegion = (countryCode) => {\n\n\t\tif (countryCode !== \"US \") return false\n\n\t\tconst regionsToCheck = [\"US-CA\", \"US-VA\"]\n\n\t\treturn regionsToCheck.some(region =>\n\t\t\tpmwDataLayer?.general?.consent_management.restricted_regions.includes(region),\n\t\t)\n\t}\n\n\t/**\n\t * Check if the visitor is allowed to trigger server-to-server events\n\t * This checks both bot user-agent patterns and custom IP exclusion list\n\t *\n\t * @returns {Promise<boolean>} True if the visitor is allowed\n\t */\n\tpmw.isVisitorAllowed = async () => {\n\n\t\t// Check the cache if visitor is allowed\n\t\tif (pmw.retrieveData(\"visitorAllowed\") !== null && pmw.retrieveData(\"visitorAllowed\") !== undefined) {\n\t\t\treturn !!JSON.parse(pmw.retrieveData(\"visitorAllowed\"))\n\t\t}\n\n\t\t// Check if user agent is a bot\n\t\tif (pmw.isBotUserAgent()) {\n\t\t\tpmw.storeData(\"visitorAllowed\", false)\n\t\t\treturn false\n\t\t}\n\n\t\t// Check if IP is on the exclusion list (if custom exclusions are defined)\n\t\tif (Array.isArray(pmwDataLayer?.general?.server_2_server?.ip_exclude_list) \n\t\t\t&& pmwDataLayer.general.server_2_server.ip_exclude_list.length > 0) {\n\t\t\t\n\t\t\tconst ip = await pmw.getIp()\n\t\t\t\n\t\t\tif (isOnIpExclusionList(ip)) {\n\t\t\t\tpmw.storeData(\"visitorAllowed\", false)\n\t\t\t\treturn false\n\t\t\t}\n\t\t}\n\n\t\t// If not a bot and not on IP exclusion list, visitor is allowed\n\t\tpmw.storeData(\"visitorAllowed\", true)\n\t\treturn true\n\t}\n\n\t/**\n\t * Validates an IP address (IPv4 or IPv6)\n\t *\n\t * @param {string} ip - The IP address to validate\n\t * @returns {boolean} True if the IP is valid\n\t */\n\tpmw.isValidIpAddress = (ip) => {\n\t\tif (!ip || typeof ip !== \"string\") return false\n\n\t\t// Use the range_check library's isIP function for accurate validation\n\t\tif (!isIP(ip)) return false\n\n\t\t// Additional validation: ensure it's not a private/reserved IP\n\t\t// This is important for CAPI which needs public IPs\n\t\treturn !pmw.isPrivateOrReservedIp(ip)\n\t}\n\n\t/**\n\t * Check if an IP is private or reserved (not suitable for CAPI)\n\t *\n\t * @param {string} ip - The IP address to check\n\t * @returns {boolean} True if the IP is private or reserved\n\t */\n\tpmw.isPrivateOrReservedIp = (ip) => {\n\t\tif (!ip) return true\n\n\t\t// IPv4 private ranges\n\t\tconst ipv4PrivateRanges = [\n\t\t\t\"10.0.0.0/8\",\n\t\t\t\"172.16.0.0/12\",\n\t\t\t\"192.168.0.0/16\",\n\t\t\t\"127.0.0.0/8\",\n\t\t\t\"169.254.0.0/16\", // Link-local\n\t\t\t\"0.0.0.0/8\",\n\t\t]\n\n\t\t// IPv6 private/reserved ranges\n\t\tconst ipv6PrivateRanges = [\n\t\t\t\"::1/128\", // Loopback\n\t\t\t\"fc00::/7\", // Unique local\n\t\t\t\"fe80::/10\", // Link-local\n\t\t\t\"::/128\", // Unspecified\n\t\t]\n\n\t\tconst privateRanges = isV4(ip) ? ipv4PrivateRanges : ipv6PrivateRanges\n\n\t\t// Use is-in-subnet for accurate range checking\n\t\ttry {\n\t\t\tconst isInSubnet = require(\"is-in-subnet\")\n\t\t\tfor (const range of privateRanges) {\n\t\t\t\tif (isInSubnet.isInSubnet(ip, range)) {\n\t\t\t\t\treturn true\n\t\t\t\t}\n\t\t\t}\n\t\t} catch (e) {\n\t\t\t// If is-in-subnet check fails, fall back to basic checks\n\t\t\t// These cover the most common private ranges\n\t\t\tif (isV4(ip)) {\n\t\t\t\tif (ip.startsWith(\"10.\") || \n\t\t\t\t\tip.startsWith(\"192.168.\") || \n\t\t\t\t\tip.startsWith(\"127.\") ||\n\t\t\t\t\tip.startsWith(\"169.254.\") ||\n\t\t\t\t\tip.startsWith(\"0.\")) {\n\t\t\t\t\treturn true\n\t\t\t\t}\n\t\t\t\t// Check 172.16.0.0/12 range (172.16.x.x - 172.31.x.x)\n\t\t\t\tconst parts = ip.split(\".\")\n\t\t\t\tif (parts[0] === \"172\") {\n\t\t\t\t\tconst second = parseInt(parts[1], 10)\n\t\t\t\t\tif (second >= 16 && second <= 31) {\n\t\t\t\t\t\treturn true\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// IPv6 basic checks\n\t\t\t\tif (ip === \"::1\" || ip.startsWith(\"fc\") || ip.startsWith(\"fd\") || ip.startsWith(\"fe80:\")) {\n\t\t\t\t\treturn true\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn false\n\t}\n\n\t/**\n\t * Get the client IP address, with race condition prevention.\n\t * Detects IPv6 and any IP in parallel, preferring IPv6 when available.\n\t * IPv6 gets a shorter timeout (2s) to avoid long waits for IPv4-only users.\n\t *\n\t * @returns {Promise<string|null>} The client IP address or null\n\t */\n\tpmw.getClientIp = async () => {\n\t\t// If we already have a resolved IP, return it immediately\n\t\tconst cachedIp = pmw.retrieveData(\"client_ip\")\n\t\tif (cachedIp && pmw.isValidIpAddress(cachedIp)) {\n\t\t\treturn cachedIp\n\t\t}\n\n\t\t// If detection is already in progress, wait for it\n\t\tif (ipDetectionPromise && !ipDetectionResolved) {\n\t\t\treturn ipDetectionPromise\n\t\t}\n\n\t\t// Start a new detection process\n\t\tipDetectionResolved = false\n\t\tipDetectionPromise = (async () => {\n\t\t\ttry {\n\t\t\t\t// Start both IPv6 and \"any\" detection in parallel\n\t\t\t\t// IPv6 is preferred by Meta and other CAPIs\n\t\t\t\tconst ipv6Promise = pmw.getIpWithTimeout(\"6\", IPV6_DETECTION_TIMEOUT_MS)\n\t\t\t\tconst anyPromise = pmw.getIp(\"any\")\n\n\t\t\t\t// Wait for both to settle (resolve or reject)\n\t\t\t\tconst [ipv6Result, anyResult] = await Promise.allSettled([ipv6Promise, anyPromise])\n\n\t\t\t\t// Determine which IP to use (prefer IPv6, fall back to any IP)\n\t\t\t\tlet ip = null\n\n\t\t\t\t// Check IPv6 result first (preferred)\n\t\t\t\tif (ipv6Result.status === \"fulfilled\" && ipv6Result.value) {\n\t\t\t\t\tip = ipv6Result.value\n\t\t\t\t\tpmw.console.log(`Using IPv6 address: ${ip}`)\n\t\t\t\t}\n\t\t\t\t// Fall back to any IP if IPv6 failed or wasn't available\n\t\t\t\telse if (anyResult.status === \"fulfilled\" && anyResult.value) {\n\t\t\t\t\tip = anyResult.value\n\t\t\t\t\tpmw.console.log(`IPv6 not available, using IP: ${ip}`)\n\t\t\t\t}\n\n\t\t\t\t// Validate before storing\n\t\t\t\tif (ip && pmw.isValidIpAddress(ip)) {\n\t\t\t\t\tpmw.storeData(\"client_ip\", ip)\n\t\t\t\t\tipDetectionResolved = true\n\t\t\t\t\treturn ip\n\t\t\t\t}\n\n\t\t\t\tipDetectionResolved = true\n\t\t\t\treturn null\n\t\t\t} catch (error) {\n\t\t\t\tpmw.console.error(\"Error detecting client IP:\", error)\n\t\t\t\tipDetectionResolved = true\n\t\t\t\treturn null\n\t\t\t}\n\t\t})()\n\n\t\treturn ipDetectionPromise\n\t}\n\n\t/**\n\t * Get IP with a custom timeout.\n\t * Wraps getIp with a timeout that rejects if the detection takes too long.\n\t *\n\t * @param {string} ipVersion - The IP version to detect (\"4\", \"6\", or \"any\")\n\t * @param {number} timeoutMs - Maximum time to wait in milliseconds\n\t * @returns {Promise<string|null>} The detected IP or null\n\t */\n\tpmw.getIpWithTimeout = async (ipVersion, timeoutMs) => {\n\t\treturn Promise.race([\n\t\t\tpmw.getIp(ipVersion),\n\t\t\tnew Promise((_, reject) => \n\t\t\t\tsetTimeout(() => reject(new Error(`IPv${ipVersion} detection timed out after ${timeoutMs}ms`)), timeoutMs)\n\t\t\t)\n\t\t]).catch(error => {\n\t\t\tpmw.console.log(error.message)\n\t\t\treturn null\n\t\t})\n\t}\n\n\tpmw.getIp = async (ipVersion = \"any\", maxServicesToCheck = 3) => {\n\n\t\tconst validVersions = [\"any\", \"4\", \"6\"]\n\n\t\t// return null if the version is not valid and console log an error\n\t\tif (!validVersions.includes(ipVersion)) {\n\t\t\tconsole.error(\"The version argument must be one of the following: \" + validVersions.join(\", \"))\n\t\t\treturn null\n\t\t}\n\n\t\tif (ipVersion === \"any\" && pmw.retrieveData(\"ip\")) {\n\t\t\treturn pmw.retrieveData(\"ip\")\n\t\t}\n\n\t\t// Get the ipv data from the cache\n\t\tconst ipv = pmw.retrieveData(`ipv${ipVersion}`)\n\n\t\t// Return it if it is not undefined\n\t\t// The value can be an IP\n\t\t// or null if we ran the test but no IP could be retrieved\n\t\t// It is undefined if the ipVersion was not tested yet\n\t\tif (ipv !== undefined) return ipv\n\n\t\tpmw.console.log(\"Testing the IP address of the browser because one ore more server-to-server APIs are enabled and require the browser IP. It may trigger connection request errors in the console while testing the IP address. This is normal and expected behavior.\")\n\n\t\ttry {// Check the cache if the IP is already stored\n\n\t\t\tconst ip = await pmw.getIpFromAnyService(ipVersion, maxServicesToCheck)\n\n\t\t\t// Validate the IP before storing\n\t\t\tif (ip && !isIP(ip)) {\n\t\t\t\tpmw.console.warn(`Invalid IP address received: ${ip}`)\n\t\t\t\treturn null\n\t\t\t}\n\n\t\t\t// Store the IP in the cache\n\t\t\tif (ipVersion === \"any\" && ip) {\n\t\t\t\tpmw.storeData(\"ip\", ip)\n\t\t\t}\n\n\t\t\tif (\n\t\t\t\tgetIpVersion(ip) === 4\n\t\t\t\t|| (ipVersion === \"4\" && ip === null)\n\t\t\t) {\n\t\t\t\tpmw.storeData(\"ipv4\", ip)\n\t\t\t}\n\n\t\t\tif (getIpVersion(ip) === 6\n\t\t\t\t|| (ipVersion === \"6\" && ip === null)\n\t\t\t) {\n\t\t\t\tpmw.storeData(\"ipv6\", ip)\n\t\t\t}\n\n\t\t\treturn ip\n\t\t} catch (error) {\n\t\t\t// console.error(error)\n\t\t\treturn null\n\t\t}\n\t}\n\n\tpmw.getBrowserGeoFromExternalService = async () => {\n\n\t\tconst startTime = performance.now()\n\n\t\tlet promises = []\n\n\t\tObject.keys(pmw.getGeoInfo).forEach(service => {\n\t\t\tpromises.push(pmw.getGeoInfo[service]())\n\t\t})\n\n\t\ttry {\n\t\t\tconst data = await Promise.any(promises)\n\n\t\t\tdata.countryCode = data.countryCode.toUpperCase()\n\n\t\t\tif (data.region && data.region === \"California\") {\n\t\t\t\tdata.regionCode = \"US-CA\"\n\t\t\t}\n\n\t\t\tif (data.region && data.region === \"Virginia\") {\n\t\t\t\tdata.regionCode = \"US-VA\"\n\t\t\t}\n\n\t\t\tpmw.console.log(\n\t\t\t\t\"Retrieved the browser geo info from an external service: \",\n\t\t\t\tdata,\n\t\t\t\t\" which took \",\n\t\t\t\t(performance.now() - startTime).toFixed(2) + \" ms\",\n\t\t\t)\n\n\t\t\t// pmw.storeData(\"countryCode\", data.countryCode)\n\t\t\t// pmw.storeData(\"ip\", data.ip)\n\t\t\treturn data\n\t\t} catch (error) {\n\t\t\tpmw.console.error(\"error: \", error)\n\t\t\treturn null\n\t\t}\n\t}\n\n\tconst getBrowserLocationByTimeZone = () => {\n\n\t\tconst geo = require(\"./geo/geo.mjs\")\n\t\tconst geoLocation = geo.getLocationByTimeZone()\n\n\t\tif (geoLocation.countryCode) {\n\t\t\treturn geoLocation\n\t\t}\n\n\t\treturn null\n\t}\n\n\tpmw.getBrowserGeo = async () => {\n\n\t\tlet geoFromStorage = {}\n\n\t\tif (pmw.retrieveData(\"geoCountryCode\")) geoFromStorage.countryCode = pmw.retrieveData(\"geoCountryCode\")\n\t\tif (pmw.retrieveData(\"geoRegionCode\")) geoFromStorage.regionCode = pmw.retrieveData(\"geoRegionCode\")\n\t\tif (pmw.retrieveData(\"geoRegion\")) geoFromStorage.region = pmw.retrieveData(\"geoRegion\")\n\n\t\tif (geoFromStorage.countryCode) {\n\t\t\tpmw.console.log(\"Retrieved the browser geo location from the cache: \", geoFromStorage)\n\t\t\treturn geoFromStorage\n\t\t}\n\n\t\tlet geoInfo = await pmw.getBrowserGeoFromExternalService()\n\n\t\t// If the external services fail, try to use the timezone fallback to get the country\n\t\tif (!geoInfo) {\n\n\t\t\tconst gepLocationByTimeZone = getBrowserLocationByTimeZone()\n\n\t\t\tgeoInfo = {}\n\n\t\t\tif (gepLocationByTimeZone) pmw.console.log(\"Retrieved the browser geo location from the timezone: \", gepLocationByTimeZone)\n\t\t\tif (gepLocationByTimeZone.countryCode) geoInfo.countryCode = gepLocationByTimeZone.countryCode\n\t\t\tif (gepLocationByTimeZone.regionCode) geoInfo.regionCode = gepLocationByTimeZone.regionCode\n\t\t}\n\n\t\tif (geoInfo?.ip) pmw.storeData(\"ip\", geoInfo.ip)\n\t\tif (geoInfo?.countryCode) pmw.storeData(\"geoCountryCode\", geoInfo.countryCode)\n\t\tif (geoInfo?.regionCode) pmw.storeData(\"geoRegionCode\", geoInfo.regionCode)\n\t\tif (geoInfo?.region) pmw.storeData(\"geoRegion\", geoInfo.region)\n\n\t\tif (geoInfo?.countryCode) {\n\t\t\treturn geoInfo\n\t\t}\n\n\t\treturn null\n\t}\n\n\t/**\n\t * Get the IP from the visitor using different services.\n\t * Return the first valid IP address that can be retrieved the fastest.\n\t *\n\t * @returns {Promise<IP>}\n\t */\n\tpmw.getIpFromAnyService = async (ipVersion = \"any\", maxServicesToCheck = 3) => {\n\n\t\t// start tracking time\n\t\tconst startTime = performance.now()\n\n\t\t// take the ipServices object and filter it to only contain objects with an ipVersion key that matches the ipVersion argument\n\t\t// keep the original order of the ipServices object\n\t\t// also keep only the first maxServicesToCheck objects\n\n\t\tconst ipServicesFiltered = Object.keys(ipServices)\n\t\t\t.filter(service => ipServices[service][ipVersion])\n\t\t\t.slice(0, maxServicesToCheck)\n\t\t\t.reduce((obj, key) => {\n\t\t\t\t\tobj[key] = ipServices[key]\n\t\t\t\t\treturn obj\n\t\t\t\t}\n\t\t\t\t, {})\n\n\t\tlet promises = []\n\n\t\tObject.keys(ipServicesFiltered).forEach(service => {\n\t\t\t// only push if the ipVersion is available for the service\n\t\t\tif (ipServicesFiltered[service][ipVersion]) {\n\t\t\t\t// console.log(`pushing ${service} to promises array with ipVersion ${ipVersion}`)\n\t\t\t\tpromises.push(pmw.getIpFromService(service, ipVersion))\n\t\t\t}\n\t\t})\n\n\t\t// If the promises array is not empty, return the first promise that resolves the fastest\n\t\t// Ignore the promises that reject\n\t\tif (promises.length > 0) {\n\n\t\t\ttry {\n\t\t\t\tconst data = await Promise.any(promises)\n\t\t\t\t// console.log(`The Pixel Manager retrieved the IP address ${data.ip} from ${data.service} using IP version ${data.ipVersion}`)\n\n\t\t\t\t// stop tracking time\n\t\t\t\tconst endTime = performance.now()\n\t\t\t\tconst timeTaken = (endTime - startTime).toFixed(2)\n\n\t\t\t\tpmw.console.log(`Retrieved the IP address ${data.ip} from ${data.service} which took ${timeTaken} ms`)\n\t\t\t\treturn data.ip\n\t\t\t} catch (error) {\n\t\t\t\t// console.error(error)\n\t\t\t\tpmw.console.log(`Could not retrieve an IP with version ${ipVersion} from any of the services.`)\n\t\t\t\treturn null\n\t\t\t}\n\n\t\t} else {\n\t\t\tpmw.console.log(\"No promises to resolve\")\n\t\t\treturn null\n\t\t}\n\t}\n\n\t/**\n\t * Fetches the IP address from a specified service.\n\t *\n\t * @async\n\t * @param {string} service - The name of the service to fetch the IP from.\n\t * @param {string} [ipVersion=\"any\"] - The version of the IP (e.g., \"any\" for global).\n\t * @returns {Promise<Object>} A promise that resolves to an object containing the IP address, service name, and IP version.\n\t * @throws {Error} Will reject the promise with an error if the IP version is not available for the service, the response from the service is not OK, the returned value from the service is not an IP address, or any other error occurs.\n\t */\n\tpmw.getIpFromService = async (service, ipVersion = \"any\") => {\n\t\ttry {\n\n\t\t\tlet data = {\n\t\t\t\tip : null,\n\t\t\t\tservice : service,\n\t\t\t\tipVersion: ipVersion,\n\t\t\t}\n\n\t\t\t// Return reject if the ipVersion is not available for the service\n\t\t\tif (!ipServices[service][ipVersion]) return Promise.reject(new Error(`The IP version ${ipVersion} is not available for the service ${service}`))\n\n\t\t\tpmw.console.log(`Fetching IP from ${service} using IP version ${ipVersion}`)\n\n\t\t\tconst response = await fetchWithTimeout(ipServices[service][ipVersion])\n\n\t\t\tif (!response.ok) {\n\t\t\t\treturn Promise.reject(new Error(`The response from ${service} was not OK. Status: ${response.status}`))\n\t\t\t}\n\n\t\t\tlet serviceResponseData = await response.text()\n\n\t\t\tif (service === \"cloudflare\") {\n\t\t\t\t// Convert key-value pairs to JSON\n\t\t\t\tserviceResponseData = serviceResponseData\n\t\t\t\t\t.trim()\n\t\t\t\t\t.split(\"\\n\")\n\t\t\t\t\t.reduce((obj, pair) => {\n\t\t\t\t\t\tpair = pair.split(\"=\")\n\t\t\t\t\t\treturn (obj[pair[0]] = pair[1]), obj\n\t\t\t\t\t}, {})\n\n\t\t\t\tdata.ip = serviceResponseData.ip\n\t\t\t} else {\n\t\t\t\tdata.ip = serviceResponseData.trim()\n\t\t\t}\n\n\t\t\tif (!isIP(data.ip)) {\n\t\t\t\treturn Promise.reject(new Error(`The returned value from ${service} is not an IP address`))\n\t\t\t}\n\n\t\t\treturn data\n\t\t} catch (error) {\n\t\t\treturn Promise.reject(error)\n\t\t}\n\t}\n\n\t/**\n\t * Cloudflare\n\t *\n\t * Response time: approx. 70ms\n\t * IPv: Returns IPv4 or IPv6 depending on the client\n\t * Dual stack: Doesn't offer dual stack detection\n\t *\n\t * @returns {Promise<*>}\n\t */\n\tconst getIpFromCloudflare = async () => {\n\n\t\tconst response = await fetchWithTimeout(\"https://www.cloudflare.com/cdn-cgi/trace\")\n\t\tlet data = await response.text()\n\n\t\t// Convert key-value pairs to JSON\n\t\t// https://stackoverflow.com/a/39284735/452587\n\t\tdata = data\n\t\t\t.trim()\n\t\t\t.split(\"\\n\")\n\t\t\t.reduce((obj, pair) => {\n\t\t\t\tpair = pair.split(\"=\")\n\t\t\t\treturn obj[pair[0]] = pair[1], obj\n\t\t\t}, {})\n\n\t\t// return the data.ip not a promise\n\t\treturn data.ip\n\t}\n\n\t/**\n\t * Check if the visitor is NOT allowed to trigger server-to-server events\n\t * This checks both bot user-agent patterns and custom IP exclusion list\n\t *\n\t * @returns {Promise<boolean>} True if the visitor should be blocked\n\t */\n\tpmw.isVisitorNotAllowed = async () => {\n\t\treturn await pmw.isVisitorAllowed() === false\n\t}\n\n\t/**\n\t * Check if the current user agent matches known bot patterns\n\t *\n\t * @returns {boolean} True if the user agent is a bot\n\t */\n\tpmw.isBotUserAgent = () => {\n\t\tconst userAgent = navigator.userAgent || ''\n\t\t\n\t\t// If no user agent, assume it might be a bot\n\t\tif (!userAgent) {\n\t\t\treturn true\n\t\t}\n\n\t\tconst botPatterns = getBotPatterns()\n\n\t\t// Check if user agent matches any bot pattern (case-insensitive)\n\t\tfor (const pattern of botPatterns) {\n\t\t\tif (userAgent.toLowerCase().includes(pattern.toLowerCase())) {\n\t\t\t\treturn true\n\t\t\t}\n\t\t}\n\n\t\treturn false\n\t}\n\n\t/**\n\t * Get list of known bot user-agent patterns\n\t *\n\t * @returns {string[]} Array of bot patterns\n\t */\n\tconst getBotPatterns = () => {\n\t\t// Get custom patterns from pmwDataLayer if available\n\t\tlet customPatterns = []\n\t\tif (Array.isArray(pmwDataLayer?.general?.server_2_server?.user_agent_exclude_patterns)) {\n\t\t\tcustomPatterns = pmwDataLayer.general.server_2_server.user_agent_exclude_patterns\n\t\t}\n\n\t\t// Default bot patterns - focusing on legitimate crawlers that identify themselves\n\t\tconst defaultPatterns = [\n\t\t\t// Search engine crawlers\n\t\t\t'Googlebot',\n\t\t\t'Google-InspectionTool',\n\t\t\t'Google-Extended',\n\t\t\t'Storebot-Google',\n\t\t\t'bingbot',\n\t\t\t'BingPreview',\n\t\t\t'msnbot',\n\t\t\t'Slurp',\n\t\t\t'DuckDuckBot',\n\t\t\t'Baiduspider',\n\t\t\t'YandexBot',\n\t\t\t'Sogou',\n\t\t\t\n\t\t\t// Social media crawlers\n\t\t\t'facebookexternalhit',\n\t\t\t'FacebookBot',\n\t\t\t'LinkedInBot',\n\t\t\t'Twitterbot',\n\t\t\t'PinterestBot',\n\t\t\t'TikTokBot',\n\t\t\t'SnapchatAds',\n\t\t\t'DiscordBot',\n\t\t\t'InstagramBot',\n\t\t\t'WhatsApp',\n\t\t\t\n\t\t\t// SEO & Analytics\n\t\t\t'AhrefsBot',\n\t\t\t'SemrushBot',\n\t\t\t'MJ12bot',\n\t\t\t'DotBot',\n\t\t\t'rogerbot',\n\t\t\t\n\t\t\t// Monitoring services\n\t\t\t'UptimeRobot',\n\t\t\t'Pingdom',\n\t\t\t'StatusCake',\n\t\t\t'GTmetrix',\n\t\t\t\n\t\t\t// AI & Research\n\t\t\t'ClaudeBot',\n\t\t\t'GPTBot',\n\t\t\t'ChatGPT',\n\t\t\t'anthropic-ai',\n\t\t\t'CCBot',\n\t\t\t'PerplexityBot',\n\t\t\t\n\t\t\t// Generic patterns\n\t\t\t'crawler',\n\t\t\t'spider',\n\t\t\t'scraper',\n\t\t\t'bot/',\n\t\t\t'/bot',\n\t\t\t'bot-',\n\t\t]\n\n\t\treturn defaultPatterns.concat(customPatterns)\n\t}\n\n\t/**\n\t * Check if an IP address is in CIDR notation\n\t *\n\t * @param {string} ipName - The IP or CIDR notation to check\n\t * @returns {boolean} True if the string contains CIDR notation\n\t */\n\tconst isCidr = (ipName) => {\n\t\treturn ipName.includes('/')\n\t}\n\n\t/**\n\t * Check if an IP address is on the custom exclusion list\n\t *\n\t * @param {string} ip - The IP address to check\n\t * @returns {boolean} True if the IP is on the exclusion list\n\t */\n\tconst isOnIpExclusionList = (ip) => {\n\t\tconst ipExcludeList = pmwDataLayer?.general?.server_2_server?.ip_exclude_list || []\n\n\t\tfor (const ipName of ipExcludeList) {\n\t\t\tif (isCidr(ipName)) {\n\t\t\t\t// Check CIDR range\n\t\t\t\tif (isInSubnet.isInSubnet(ip, ipName)) {\n\t\t\t\t\treturn true\n\t\t\t\t}\n\t\t\t} else if (ip === ipName) {\n\t\t\t\t// Exact IP match\n\t\t\t\treturn true\n\t\t\t}\n\t\t}\n\n\t\treturn false\n\t}\n\n}(window.pmw = window.pmw || {}, jQuery))\n","// https://stackoverflow.com/a/70870895/4688612\nexport const getLocationByTimeZone = () => {\n\n\tconst timezones = {\n\t\t\"Africa/Abidjan\" : [\"CI\", \"BF\", \"GH\", \"GM\", \"GN\", \"ML\", \"MR\", \"SH\", \"SL\", \"SN\", \"TG\"],\n\t\t\"Africa/Accra\" : [\"GH\"],\n\t\t\"Africa/Addis_Ababa\" : [\"ET\"],\n\t\t\"Africa/Algiers\" : [\"DZ\"],\n\t\t\"Africa/Asmara\" : [\"ER\"],\n\t\t\"Africa/Asmera\" : [\"ER\"],\n\t\t\"Africa/Bamako\" : [\"ML\"],\n\t\t\"Africa/Bangui\" : [\"CF\"],\n\t\t\"Africa/Banjul\" : [\"GM\"],\n\t\t\"Africa/Bissau\" : [\"GW\"],\n\t\t\"Africa/Blantyre\" : [\"MW\"],\n\t\t\"Africa/Brazzaville\" : [\"CG\"],\n\t\t\"Africa/Bujumbura\" : [\"BI\"],\n\t\t\"Africa/Cairo\" : [\"EG\"],\n\t\t\"Africa/Casablanca\" : [\"MA\"],\n\t\t\"Africa/Ceuta\" : [\"ES\"],\n\t\t\"Africa/Conakry\" : [\"GN\"],\n\t\t\"Africa/Dakar\" : [\"SN\"],\n\t\t\"Africa/Dar_es_Salaam\" : [\"TZ\"],\n\t\t\"Africa/Djibouti\" : [\"DJ\"],\n\t\t\"Africa/Douala\" : [\"CM\"],\n\t\t\"Africa/El_Aaiun\" : [\"EH\"],\n\t\t\"Africa/Freetown\" : [\"SL\"],\n\t\t\"Africa/Gaborone\" : [\"BW\"],\n\t\t\"Africa/Harare\" : [\"ZW\"],\n\t\t\"Africa/Johannesburg\" : [\"ZA\", \"LS\", \"SZ\"],\n\t\t\"Africa/Juba\" : [\"SS\"],\n\t\t\"Africa/Kampala\" : [\"UG\"],\n\t\t\"Africa/Khartoum\" : [\"SD\"],\n\t\t\"Africa/Kigali\" : [\"RW\"],\n\t\t\"Africa/Kinshasa\" : [\"CD\"],\n\t\t\"Africa/Lagos\" : [\"NG\", \"AO\", \"BJ\", \"CD\", \"CF\", \"CG\", \"CM\", \"GA\", \"GQ\", \"NE\"],\n\t\t\"Africa/Libreville\" : [\"GA\"],\n\t\t\"Africa/Lome\" : [\"TG\"],\n\t\t\"Africa/Luanda\" : [\"AO\"],\n\t\t\"Africa/Lubumbashi\" : [\"CD\"],\n\t\t\"Africa/Lusaka\" : [\"ZM\"],\n\t\t\"Africa/Malabo\" : [\"GQ\"],\n\t\t\"Africa/Maputo\" : [\"MZ\", \"BI\", \"BW\", \"CD\", \"MW\", \"RW\", \"ZM\", \"ZW\"],\n\t\t\"Africa/Maseru\" : [\"LS\"],\n\t\t\"Africa/Mbabane\" : [\"SZ\"],\n\t\t\"Africa/Mogadishu\" : [\"SO\"],\n\t\t\"Africa/Monrovia\" : [\"LR\"],\n\t\t\"Africa/Nairobi\" : [\"KE\", \"DJ\", \"ER\", \"ET\", \"KM\", \"MG\", \"SO\", \"TZ\", \"UG\", \"YT\"],\n\t\t\"Africa/Ndjamena\" : [\"TD\"],\n\t\t\"Africa/Niamey\" : [\"NE\"],\n\t\t\"Africa/Nouakchott\" : [\"MR\"],\n\t\t\"Africa/Ouagadougou\" : [\"BF\"],\n\t\t\"Africa/Porto-Novo\" : [\"BJ\"],\n\t\t\"Africa/Sao_Tome\" : [\"ST\"],\n\t\t\"Africa/Timbuktu\" : [\"ML\"],\n\t\t\"Africa/Tripoli\" : [\"LY\"],\n\t\t\"Africa/Tunis\" : [\"TN\"],\n\t\t\"Africa/Windhoek\" : [\"NA\"],\n\t\t\"America/Adak\" : [\"US\"],\n\t\t\"America/Anchorage\" : [\"US\"],\n\t\t\"America/Anguilla\" : [\"AI\"],\n\t\t\"America/Antigua\" : [\"AG\"],\n\t\t\"America/Araguaina\" : [\"BR\"],\n\t\t\"America/Argentina/Buenos_Aires\": [\"AR\"],\n\t\t\"America/Argentina/Catamarca\" : [\"AR\"],\n\t\t\"America/Argentina/Cordoba\" : [\"AR\"],\n\t\t\"America/Argentina/Jujuy\" : [\"AR\"],\n\t\t\"America/Argentina/La_Rioja\" : [\"AR\"],\n\t\t\"America/Argentina/Mendoza\" : [\"AR\"],\n\t\t\"America/Argentina/Rio_Gallegos\": [\"AR\"],\n\t\t\"America/Argentina/Salta\" : [\"AR\"],\n\t\t\"America/Argentina/San_Juan\" : [\"AR\"],\n\t\t\"America/Argentina/San_Luis\" : [\"AR\"],\n\t\t\"America/Argentina/Tucuman\" : [\"AR\"],\n\t\t\"America/Argentina/Ushuaia\" : [\"AR\"],\n\t\t\"America/Aruba\" : [\"AW\"],\n\t\t\"America/Asuncion\" : [\"PY\"],\n\t\t\"America/Atikokan\" : [\"CA\"],\n\t\t\"America/Bahia\" : [\"BR\"],\n\t\t\"America/Bahia_Banderas\" : [\"MX\"],\n\t\t\"America/Barbados\" : [\"BB\"],\n\t\t\"America/Belem\" : [\"BR\"],\n\t\t\"America/Belize\" : [\"BZ\"],\n\t\t\"America/Blanc-Sablon\" : [\"CA\"],\n\t\t\"America/Boa_Vista\" : [\"BR\"],\n\t\t\"America/Bogota\" : [\"CO\"],\n\t\t\"America/Boise\" : [\"US\"],\n\t\t\"America/Cambridge_Bay\" : [\"CA\"],\n\t\t\"America/Campo_Grande\" : [\"BR\"],\n\t\t\"America/Cancun\" : [\"MX\"],\n\t\t\"America/Caracas\" : [\"VE\"],\n\t\t\"America/Cayenne\" : [\"GF\"],\n\t\t\"America/Cayman\" : [\"KY\"],\n\t\t\"America/Chicago\" : [\"US\"],\n\t\t\"America/Chihuahua\" : [\"MX\"],\n\t\t\"America/Coral_Harbour\" : [\"CA\"],\n\t\t\"America/Costa_Rica\" : [\"CR\"],\n\t\t\"America/Creston\" : [\"CA\"],\n\t\t\"America/Cuiaba\" : [\"BR\"],\n\t\t\"America/Curacao\" : [\"CW\"],\n\t\t\"America/Danmarkshavn\" : [\"GL\"],\n\t\t\"America/Dawson\" : [\"CA\"],\n\t\t\"America/Dawson_Creek\" : [\"CA\"],\n\t\t\"America/Denver\" : [\"US\"],\n\t\t\"America/Detroit\" : [\"US\"],\n\t\t\"America/Dominica\" : [\"DM\"],\n\t\t\"America/Edmonton\" : [\"CA\"],\n\t\t\"America/Eirunepe\" : [\"BR\"],\n\t\t\"America/El_Salvador\" : [\"SV\"],\n\t\t\"America/Fort_Nelson\" : [\"CA\"],\n\t\t\"America/Fortaleza\" : [\"BR\"],\n\t\t\"America/Glace_Bay\" : [\"CA\"],\n\t\t\"America/Goose_Bay\" : [\"CA\"],\n\t\t\"America/Grand_Turk\" : [\"TC\"],\n\t\t\"America/Grenada\" : [\"GD\"],\n\t\t\"America/Guadeloupe\" : [\"GP\"],\n\t\t\"America/Guatemala\" : [\"GT\"],\n\t\t\"America/Guayaquil\" : [\"EC\"],\n\t\t\"America/Guyana\" : [\"GY\"],\n\t\t\"America/Halifax\" : [\"CA\"],\n\t\t\"America/Havana\" : [\"CU\"],\n\t\t\"America/Hermosillo\" : [\"MX\"],\n\t\t\"America/Indiana/Indianapolis\" : [\"US\"],\n\t\t\"America/Indiana/Knox\" : [\"US\"],\n\t\t\"America/Indiana/Marengo\" : [\"US\"],\n\t\t\"America/Indiana/Petersburg\" : [\"US\"],\n\t\t\"America/Indiana/Tell_City\" : [\"US\"],\n\t\t\"America/Indiana/Vevay\" : [\"US\"],\n\t\t\"America/Indiana/Vincennes\" : [\"US\"],\n\t\t\"America/Indiana/Winamac\" : [\"US\"],\n\t\t\"America/Inuvik\" : [\"CA\"],\n\t\t\"America/Iqaluit\" : [\"CA\"],\n\t\t\"America/Jamaica\" : [\"JM\"],\n\t\t\"America/Juneau\" : [\"US\"],\n\t\t\"America/Kentucky/Louisville\" : [\"US\"],\n\t\t\"America/Kentucky/Monticello\" : [\"US\"],\n\t\t\"America/Kralendijk\" : [\"BQ\"],\n\t\t\"America/La_Paz\" : [\"BO\"],\n\t\t\"America/Lima\" : [\"PE\"],\n\t\t\"America/Los_Angeles\" : [\"US\"],\n\t\t\"America/Lower_Princes\" : [\"SX\"],\n\t\t\"America/Maceio\" : [\"BR\"],\n\t\t\"America/Managua\" : [\"NI\"],\n\t\t\"America/Manaus\" : [\"BR\"],\n\t\t\"America/Marigot\" : [\"MF\"],\n\t\t\"America/Martinique\" : [\"MQ\"],\n\t\t\"America/Matamoros\" : [\"MX\"],\n\t\t\"America/Mazatlan\" : [\"MX\"],\n\t\t\"America/Menominee\" : [\"US\"],\n\t\t\"America/Merida\" : [\"MX\"],\n\t\t\"America/Metlakatla\" : [\"US\"],\n\t\t\"America/Mexico_City\" : [\"MX\"],\n\t\t\"America/Miquelon\" : [\"PM\"],\n\t\t\"America/Moncton\" : [\"CA\"],\n\t\t\"America/Monterrey\" : [\"MX\"],\n\t\t\"America/Montevideo\" : [\"UY\"],\n\t\t\"America/Montreal\" : [\"CA\"],\n\t\t\"America/Montserrat\" : [\"MS\"],\n\t\t\"America/Nassau\" : [\"BS\"],\n\t\t\"America/New_York\" : [\"US\"],\n\t\t\"America/Nipigon\" : [\"CA\"],\n\t\t\"America/Nome\" : [\"US\"],\n\t\t\"America/Noronha\" : [\"BR\"],\n\t\t\"America/North_Dakota/Beulah\" : [\"US\"],\n\t\t\"America/North_Dakota/Center\" : [\"US\"],\n\t\t\"America/North_Dakota/New_Salem\": [\"US\"],\n\t\t\"America/Nuuk\" : [\"GL\"],\n\t\t\"America/Ojinaga\" : [\"MX\"],\n\t\t\"America/Panama\" : [\"PA\", \"CA\", \"KY\"],\n\t\t\"America/Pangnirtung\" : [\"CA\"],\n\t\t\"America/Paramaribo\" : [\"SR\"],\n\t\t\"America/Phoenix\" : [\"US\", \"CA\"],\n\t\t\"America/Port-au-Prince\" : [\"HT\"],\n\t\t\"America/Port_of_Spain\" : [\"TT\"],\n\t\t\"America/Porto_Velho\" : [\"BR\"],\n\t\t\"America/Puerto_Rico\" : [\"PR\", \"AG\", \"CA\", \"AI\", \"AW\", \"BL\", \"BQ\", \"CW\", \"DM\", \"GD\", \"GP\", \"KN\", \"LC\", \"MF\", \"MS\", \"SX\", \"TT\", \"VC\", \"VG\", \"VI\"],\n\t\t\"America/Punta_Arenas\" : [\"CL\"],\n\t\t\"America/Rainy_River\" : [\"CA\"],\n\t\t\"America/Rankin_Inlet\" : [\"CA\"],\n\t\t\"America/Recife\" : [\"BR\"],\n\t\t\"America/Regina\" : [\"CA\"],\n\t\t\"America/Resolute\" : [\"CA\"],\n\t\t\"America/Rio_Branco\" : [\"BR\"],\n\t\t\"America/Santarem\" : [\"BR\"],\n\t\t\"America/Santiago\" : [\"CL\"],\n\t\t\"America/Santo_Domingo\" : [\"DO\"],\n\t\t\"America/Sao_Paulo\" : [\"BR\"],\n\t\t\"America/Scoresbysund\" : [\"GL\"],\n\t\t\"America/Sitka\" : [\"US\"],\n\t\t\"America/St_Barthelemy\" : [\"BL\"],\n\t\t\"America/St_Johns\" : [\"CA\"],\n\t\t\"America/St_Kitts\" : [\"KN\"],\n\t\t\"America/St_Lucia\" : [\"LC\"],\n\t\t\"America/St_Thomas\" : [\"VI\"],\n\t\t\"America/St_Vincent\" : [\"VC\"],\n\t\t\"America/Swift_Current\" : [\"CA\"],\n\t\t\"America/Tegucigalpa\" : [\"HN\"],\n\t\t\"America/Thule\" : [\"GL\"],\n\t\t\"America/Thunder_Bay\" : [\"CA\"],\n\t\t\"America/Tijuana\" : [\"MX\"],\n\t\t\"America/Toronto\" : [\"CA\", \"BS\"],\n\t\t\"America/Tortola\" : [\"VG\"],\n\t\t\"America/Vancouver\" : [\"CA\"],\n\t\t\"America/Virgin\" : [\"VI\"],\n\t\t\"America/Whitehorse\" : [\"CA\"],\n\t\t\"America/Winnipeg\" : [\"CA\"],\n\t\t\"America/Yakutat\" : [\"US\"],\n\t\t\"America/Yellowknife\" : [\"CA\"],\n\t\t\"Antarctica/Casey\" : [\"AQ\"],\n\t\t\"Antarctica/Davis\" : [\"AQ\"],\n\t\t\"Antarctica/DumontDUrville\" : [\"AQ\"],\n\t\t\"Antarctica/Macquarie\" : [\"AU\"],\n\t\t\"Antarctica/Mawson\" : [\"AQ\"],\n\t\t\"Antarctica/McMurdo\" : [\"AQ\"],\n\t\t\"Antarctica/Palmer\" : [\"AQ\"],\n\t\t\"Antarctica/Rothera\" : [\"AQ\"],\n\t\t\"Antarctica/South_Pole\" : [\"AQ\"],\n\t\t\"Antarctica/Syowa\" : [\"AQ\"],\n\t\t\"Antarctica/Troll\" : [\"AQ\"],\n\t\t\"Antarctica/Vostok\" : [\"AQ\"],\n\t\t\"Arctic/Longyearbyen\" : [\"SJ\"],\n\t\t\"Asia/Aden\" : [\"YE\"],\n\t\t\"Asia/Almaty\" : [\"KZ\"],\n\t\t\"Asia/Amman\" : [\"JO\"],\n\t\t\"Asia/Anadyr\" : [\"RU\"],\n\t\t\"Asia/Aqtau\" : [\"KZ\"],\n\t\t\"Asia/Aqtobe\" : [\"KZ\"],\n\t\t\"Asia/Ashgabat\" : [\"TM\"],\n\t\t\"Asia/Atyrau\" : [\"KZ\"],\n\t\t\"Asia/Baghdad\" : [\"IQ\"],\n\t\t\"Asia/Bahrain\" : [\"BH\"],\n\t\t\"Asia/Baku\" : [\"AZ\"],\n\t\t\"Asia/Bangkok\" : [\"TH\", \"KH\", \"LA\", \"VN\"],\n\t\t\"Asia/Barnaul\" : [\"RU\"],\n\t\t\"Asia/Beirut\" : [\"LB\"],\n\t\t\"Asia/Bishkek\" : [\"KG\"],\n\t\t\"Asia/Brunei\" : [\"BN\"],\n\t\t\"Asia/Chita\" : [\"RU\"],\n\t\t\"Asia/Choibalsan\" : [\"MN\"],\n\t\t\"Asia/Colombo\" : [\"LK\"],\n\t\t\"Asia/Damascus\" : [\"SY\"],\n\t\t\"Asia/Dhaka\" : [\"BD\"],\n\t\t\"Asia/Dili\" : [\"TL\"],\n\t\t\"Asia/Dubai\" : [\"AE\", \"OM\"],\n\t\t\"Asia/Dushanbe\" : [\"TJ\"],\n\t\t\"Asia/Famagusta\" : [\"CY\"],\n\t\t\"Asia/Gaza\" : [\"PS\"],\n\t\t\"Asia/Hebron\" : [\"PS\"],\n\t\t\"Asia/Ho_Chi_Minh\" : [\"VN\"],\n\t\t\"Asia/Hong_Kong\" : [\"HK\"],\n\t\t\"Asia/Hovd\" : [\"MN\"],\n\t\t\"Asia/Irkutsk\" : [\"RU\"],\n\t\t\"Asia/Jakarta\" : [\"ID\"],\n\t\t\"Asia/Jayapura\" : [\"ID\"],\n\t\t\"Asia/Jerusalem\" : [\"IL\"],\n\t\t\"Asia/Kabul\" : [\"AF\"],\n\t\t\"Asia/Kamchatka\" : [\"RU\"],\n\t\t\"Asia/Karachi\" : [\"PK\"],\n\t\t\"Asia/Kathmandu\" : [\"NP\"],\n\t\t\"Asia/Khandyga\" : [\"RU\"],\n\t\t\"Asia/Kolkata\" : [\"IN\"],\n\t\t\"Asia/Krasnoyarsk\" : [\"RU\"],\n\t\t\"Asia/Kuala_Lumpur\" : [\"MY\"],\n\t\t\"Asia/Kuching\" : [\"MY\"],\n\t\t\"Asia/Kuwait\" : [\"KW\"],\n\t\t\"Asia/Macau\" : [\"MO\"],\n\t\t\"Asia/Magadan\" : [\"RU\"],\n\t\t\"Asia/Makassar\" : [\"ID\"],\n\t\t\"Asia/Manila\" : [\"PH\"],\n\t\t\"Asia/Muscat\" : [\"OM\"],\n\t\t\"Asia/Nicosia\" : [\"CY\"],\n\t\t\"Asia/Novokuznetsk\" : [\"RU\"],\n\t\t\"Asia/Novosibirsk\" : [\"RU\"],\n\t\t\"Asia/Omsk\" : [\"RU\"],\n\t\t\"Asia/Oral\" : [\"KZ\"],\n\t\t\"Asia/Phnom_Penh\" : [\"KH\"],\n\t\t\"Asia/Pontianak\" : [\"ID\"],\n\t\t\"Asia/Pyongyang\" : [\"KP\"],\n\t\t\"Asia/Qatar\" : [\"QA\", \"BH\"],\n\t\t\"Asia/Qostanay\" : [\"KZ\"],\n\t\t\"Asia/Qyzylorda\" : [\"KZ\"],\n\t\t\"Asia/Riyadh\" : [\"SA\", \"AQ\", \"KW\", \"YE\"],\n\t\t\"Asia/Sakhalin\" : [\"RU\"],\n\t\t\"Asia/Samarkand\" : [\"UZ\"],\n\t\t\"Asia/Seoul\" : [\"KR\"],\n\t\t\"Asia/Shanghai\" : [\"CN\"],\n\t\t\"Asia/Singapore\" : [\"SG\", \"MY\"],\n\t\t\"Asia/Srednekolymsk\" : [\"RU\"],\n\t\t\"Asia/Taipei\" : [\"TW\"],\n\t\t\"Asia/Tashkent\" : [\"UZ\"],\n\t\t\"Asia/Tbilisi\" : [\"GE\"],\n\t\t\"Asia/Tehran\" : [\"IR\"],\n\t\t\"Asia/Thimphu\" : [\"BT\"],\n\t\t\"Asia/Tokyo\" : [\"JP\"],\n\t\t\"Asia/Tomsk\" : [\"RU\"],\n\t\t\"Asia/Ulaanbaatar\" : [\"MN\"],\n\t\t\"Asia/Urumqi\" : [\"CN\"],\n\t\t\"Asia/Ust-Nera\" : [\"RU\"],\n\t\t\"Asia/Vientiane\" : [\"LA\"],\n\t\t\"Asia/Vladivostok\" : [\"RU\"],\n\t\t\"Asia/Yakutsk\" : [\"RU\"],\n\t\t\"Asia/Yangon\" : [\"MM\"],\n\t\t\"Asia/Yekaterinburg\" : [\"RU\"],\n\t\t\"Asia/Yerevan\" : [\"AM\"],\n\t\t\"Atlantic/Azores\" : [\"PT\"],\n\t\t\"Atlantic/Bermuda\" : [\"BM\"],\n\t\t\"Atlantic/Canary\" : [\"ES\"],\n\t\t\"Atlantic/Cape_Verde\" : [\"CV\"],\n\t\t\"Atlantic/Faroe\" : [\"FO\"],\n\t\t\"Atlantic/Jan_Mayen\" : [\"SJ\"],\n\t\t\"Atlantic/Madeira\" : [\"PT\"],\n\t\t\"Atlantic/Reykjavik\" : [\"IS\"],\n\t\t\"Atlantic/South_Georgia\" : [\"GS\"],\n\t\t\"Atlantic/St_Helena\" : [\"SH\"],\n\t\t\"Atlantic/Stanley\" : [\"FK\"],\n\t\t\"Australia/Adelaide\" : [\"AU\"],\n\t\t\"Australia/Brisbane\" : [\"AU\"],\n\t\t\"Australia/Broken_Hill\" : [\"AU\"],\n\t\t\"Australia/Darwin\" : [\"AU\"],\n\t\t\"Australia/Eucla\" : [\"AU\"],\n\t\t\"Australia/Hobart\" : [\"AU\"],\n\t\t\"Australia/Lindeman\" : [\"AU\"],\n\t\t\"Australia/Lord_Howe\" : [\"AU\"],\n\t\t\"Australia/Melbourne\" : [\"AU\"],\n\t\t\"Australia/Perth\" : [\"AU\"],\n\t\t\"Australia/Sydney\" : [\"AU\"],\n\t\t\"Canada/Eastern\" : [\"CA\"],\n\t\t\"Europe/Amsterdam\" : [\"NL\"],\n\t\t\"Europe/Andorra\" : [\"AD\"],\n\t\t\"Europe/Astrakhan\" : [\"RU\"],\n\t\t\"Europe/Athens\" : [\"GR\"],\n\t\t\"Europe/Belfast\" : [\"GB\"],\n\t\t\"Europe/Belgrade\" : [\"RS\", \"BA\", \"HR\", \"ME\", \"MK\", \"SI\"],\n\t\t\"Europe/Berlin\" : [\"DE\"],\n\t\t\"Europe/Bratislava\" : [\"SK\"],\n\t\t\"Europe/Brussels\" : [\"BE\"],\n\t\t\"Europe/Bucharest\" : [\"RO\"],\n\t\t\"Europe/Budapest\" : [\"HU\"],\n\t\t\"Europe/Busingen\" : [\"DE\"],\n\t\t\"Europe/Chisinau\" : [\"MD\"],\n\t\t\"Europe/Copenhagen\" : [\"DK\"],\n\t\t\"Europe/Dublin\" : [\"IE\"],\n\t\t\"Europe/Gibraltar\" : [\"GI\"],\n\t\t\"Europe/Guernsey\" : [\"GG\"],\n\t\t\"Europe/Helsinki\" : [\"FI\", \"AX\"],\n\t\t\"Europe/Isle_of_Man\" : [\"IM\"],\n\t\t\"Europe/Istanbul\" : [\"TR\"],\n\t\t\"Europe/Jersey\" : [\"JE\"],\n\t\t\"Europe/Kaliningrad\" : [\"RU\"],\n\t\t\"Europe/Kiev\" : [\"UA\"],\n\t\t\"Europe/Kirov\" : [\"RU\"],\n\t\t\"Europe/Lisbon\" : [\"PT\"],\n\t\t\"Europe/Ljubljana\" : [\"SI\"],\n\t\t\"Europe/London\" : [\"GB\", \"GG\", \"IM\", \"JE\"],\n\t\t\"Europe/Luxembourg\" : [\"LU\"],\n\t\t\"Europe/Madrid\" : [\"ES\"],\n\t\t\"Europe/Malta\" : [\"MT\"],\n\t\t\"Europe/Mariehamn\" : [\"AX\"],\n\t\t\"Europe/Minsk\" : [\"BY\"],\n\t\t\"Europe/Monaco\" : [\"MC\"],\n\t\t\"Europe/Moscow\" : [\"RU\"],\n\t\t\"Europe/Oslo\" : [\"NO\", \"SJ\", \"BV\"],\n\t\t\"Europe/Paris\" : [\"FR\"],\n\t\t\"Europe/Podgorica\" : [\"ME\"],\n\t\t\"Europe/Prague\" : [\"CZ\", \"SK\"],\n\t\t\"Europe/Riga\" : [\"LV\"],\n\t\t\"Europe/Rome\" : [\"IT\", \"SM\", \"VA\"],\n\t\t\"Europe/Samara\" : [\"RU\"],\n\t\t\"Europe/San_Marino\" : [\"SM\"],\n\t\t\"Europe/Sarajevo\" : [\"BA\"],\n\t\t\"Europe/Saratov\" : [\"RU\"],\n\t\t\"Europe/Simferopol\" : [\"RU\", \"UA\"],\n\t\t\"Europe/Skopje\" : [\"MK\"],\n\t\t\"Europe/Sofia\" : [\"BG\"],\n\t\t\"Europe/Stockholm\" : [\"SE\"],\n\t\t\"Europe/Tallinn\" : [\"EE\"],\n\t\t\"Europe/Tirane\" : [\"AL\"],\n\t\t\"Europe/Ulyanovsk\" : [\"RU\"],\n\t\t\"Europe/Uzhgorod\" : [\"UA\"],\n\t\t\"Europe/Vaduz\" : [\"LI\"],\n\t\t\"Europe/Vatican\" : [\"VA\"],\n\t\t\"Europe/Vienna\" : [\"AT\"],\n\t\t\"Europe/Vilnius\" : [\"LT\"],\n\t\t\"Europe/Volgograd\" : [\"RU\"],\n\t\t\"Europe/Warsaw\" : [\"PL\"],\n\t\t\"Europe/Zagreb\" : [\"HR\"],\n\t\t\"Europe/Zaporozhye\" : [\"UA\"],\n\t\t\"Europe/Zurich\" : [\"CH\", \"DE\", \"LI\"],\n\t\t\"GB\" : [\"GB\"],\n\t\t\"GB-Eire\" : [\"GB\"],\n\t\t\"Indian/Antananarivo\" : [\"MG\"],\n\t\t\"Indian/Chagos\" : [\"IO\"],\n\t\t\"Indian/Christmas\" : [\"CX\"],\n\t\t\"Indian/Cocos\" : [\"CC\"],\n\t\t\"Indian/Comoro\" : [\"KM\"],\n\t\t\"Indian/Kerguelen\" : [\"TF\", \"HM\"],\n\t\t\"Indian/Mahe\" : [\"SC\"],\n\t\t\"Indian/Maldives\" : [\"MV\"],\n\t\t\"Indian/Mauritius\" : [\"MU\"],\n\t\t\"Indian/Mayotte\" : [\"YT\"],\n\t\t\"Indian/Reunion\" : [\"RE\", \"TF\"],\n\t\t\"NZ\" : [\"NZ\"],\n\t\t\"Pacific/Apia\" : [\"WS\"],\n\t\t\"Pacific/Auckland\" : [\"NZ\", \"AQ\"],\n\t\t\"Pacific/Bougainville\" : [\"PG\"],\n\t\t\"Pacific/Chatham\" : [\"NZ\"],\n\t\t\"Pacific/Chuuk\" : [\"FM\"],\n\t\t\"Pacific/Easter\" : [\"CL\"],\n\t\t\"Pacific/Efate\" : [\"VU\"],\n\t\t\"Pacific/Fakaofo\" : [\"TK\"],\n\t\t\"Pacific/Fiji\" : [\"FJ\"],\n\t\t\"Pacific/Funafuti\" : [\"TV\"],\n\t\t\"Pacific/Galapagos\" : [\"EC\"],\n\t\t\"Pacific/Gambier\" : [\"PF\"],\n\t\t\"Pacific/Guadalcanal\" : [\"SB\"],\n\t\t\"Pacific/Guam\" : [\"GU\", \"MP\"],\n\t\t\"Pacific/Honolulu\" : [\"US\", \"UM\"],\n\t\t\"Pacific/Johnston\" : [\"UM\"],\n\t\t\"Pacific/Kanton\" : [\"KI\"],\n\t\t\"Pacific/Kiritimati\" : [\"KI\"],\n\t\t\"Pacific/Kosrae\" : [\"FM\"],\n\t\t\"Pacific/Kwajalein\" : [\"MH\"],\n\t\t\"Pacific/Majuro\" : [\"MH\"],\n\t\t\"Pacific/Marquesas\" : [\"PF\"],\n\t\t\"Pacific/Midway\" : [\"UM\"],\n\t\t\"Pacific/Nauru\" : [\"NR\"],\n\t\t\"Pacific/Niue\" : [\"NU\"],\n\t\t\"Pacific/Norfolk\" : [\"NF\"],\n\t\t\"Pacific/Noumea\" : [\"NC\"],\n\t\t\"Pacific/Pago_Pago\" : [\"AS\", \"UM\"],\n\t\t\"Pacific/Palau\" : [\"PW\"],\n\t\t\"Pacific/Pitcairn\" : [\"PN\"],\n\t\t\"Pacific/Pohnpei\" : [\"FM\"],\n\t\t\"Pacific/Port_Moresby\" : [\"PG\", \"AQ\"],\n\t\t\"Pacific/Rarotonga\" : [\"CK\"],\n\t\t\"Pacific/Saipan\" : [\"MP\"],\n\t\t\"Pacific/Samoa\" : [\"WS\"],\n\t\t\"Pacific/Tahiti\" : [\"PF\"],\n\t\t\"Pacific/Tarawa\" : [\"KI\"],\n\t\t\"Pacific/Tongatapu\" : [\"TO\"],\n\t\t\"Pacific/Wake\" : [\"UM\"],\n\t\t\"Pacific/Wallis\" : [\"WF\"],\n\t\t\"Singapore\" : [\"SG\"],\n\t\t\"US/Arizona\" : [\"US\"],\n\t\t\"US/Hawaii\" : [\"US\"],\n\t\t\"US/Samoa\" : [\"WS\"],\n\t}\n\n\tconst timezone = Intl.DateTimeFormat().resolvedOptions().timeZone\n\n\tif (timezone === \"\" || !timezone) {\n\t\treturn null\n\t}\n\n\tlet geoLocation = {\n\t\tcountryCode: timezones[timezone][0].toUpperCase(),\n\t}\n\n\t// if the timezone is equals \"America/Los_Angeles\" then add the regionCode \"US-CA\"\n\tif (timezone === \"America/Los_Angeles\") {\n\t\tgeoLocation.regionCode = \"US-CA\"\n\t}\n\n\tif (timezone === \"Europe/Zurich\") {\n\t\tgeoLocation.regionCode = \"CH-ZH\"\n\t}\n\n\treturn geoLocation\n}\n\n\n\n\n",null,"/**\n * Register event listeners\n */\n\n\n/**\n * add_to_cart event\n *\n * WC is inconsistent with events that emit add-to-cart events.\n * adding_to_cart and added_to_are legacy events. Also, they only work\n * on Ajax buttons on shop pages.\n *\n * Never add document or body selectors.\n * The document selector doesn't work.\n * The body selector will cause the events to fire twice and other erratic behavior if used along with other selectors.\n */\nconst addToCartSelectorsArray = [\n\t// \"document\",\n\t// \"body\",\n\t\".add_to_cart_button:not(.product_type_variable)\",\n\t\".ajax_add_to_cart\",\n\t\".single_add_to_cart_button\",\n];\n\nconst addToCartSelectors = pmw.prepareSelectors(addToCartSelectorsArray, \"addToCart\");\n\njQuery(addToCartSelectors).on(\"click adding_to_cart\", (event, data) => {\n\n\t// console.log(\"add_to_cart event fired at: \" + new Date().getTime())\n\t// console.log('add to cart data', data)\n\t// console.log('add to cart event', event)\n\t// console.log('add to cart jQuery(event.target.dataset)', jQuery(event.target.dataset))\n\t// console.log(\"add to cart event.target.dataset\", event.target.dataset)\n\t// console.log(\"add to cart event.target.dataset.quantity\", event.target.dataset.quantity)\n\t// console.log(\"add to cart event.target.dataset.product_id\", event.target.dataset.product_id)\n\n\ttry {\n\n\t\t// console.log(\"add_to_cart event detected\")\n\n\t\tlet quantity = event?.target?.dataset?.quantity ? event.target.dataset.quantity : null;\n\t\tlet productId = event?.target?.dataset?.product_id ? event.target.dataset.product_id : event?.target?.value ? event.target.value : null;\n\n\t\t// let quantity = event.target.dataset.quantity ? event.target.dataset.quantity : 1\n\t\t// let productId = event.target.dataset.product_id ? event.target.dataset.product_id : null\n\n\t\t// Only process on product pages\n\t\tif (pmwDataLayer.shop.page_type === \"product\") {\n\n\t\t\t// First process related and upsell products\n\t\t\tif (\n\t\t\t\ttypeof jQuery(event.currentTarget).attr(\"href\") !== \"undefined\"\n\t\t\t\t&& jQuery(event.currentTarget).attr(\"href\").includes(\"add-to-cart\")\n\t\t\t) {\n\n\t\t\t\tif (!productId) {\n\t\t\t\t\tproductId = jQuery(event.currentTarget).data(\"product_id\");\n\t\t\t\t}\n\n\t\t\t\tpmw.addProductToCart(productId, 1);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// If is simple product\n\t\t\tif (pmwDataLayer.shop.product_type === \"simple\") {\n\n\t\t\t\tif (quantity === null) {\n\t\t\t\t\tquantity = Number(jQuery(\".input-text.qty\").val()) ? Number(jQuery(\".input-text.qty\").val()) : 1;\n\t\t\t\t}\n\n\t\t\t\tif (!productId) {\n\t\t\t\t\tproductId = jQuery(event.currentTarget).val();\n\t\t\t\t}\n\n\t\t\t\t// Fallback if the body selector is used\n\t\t\t\tif (!productId) {\n\t\t\t\t\t// get the product ID from the element that has the class .product\n\t\t\t\t\t// that element will also have an ID that start with product- and ends with the product ID\n\t\t\t\t\t// example: product-123\n\t\t\t\t\t// save the product ID in the variable productId\n\t\t\t\t\tproductId = jQuery(\".product\").attr(\"id\").replace(\"product-\", \"\");\n\t\t\t\t}\n\n\t\t\t\tpmw.addProductToCart(productId, quantity);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// If is variable product or variable-subscription\n\t\t\tif ([\"variable\", \"variable-subscription\"].indexOf(pmwDataLayer.shop.product_type) >= 0) {\n\n\t\t\t\tif (quantity === null) {\n\t\t\t\t\tquantity = Number(jQuery(\".input-text.qty\").val()) ? Number(jQuery(\".input-text.qty\").val()) : 1;\n\t\t\t\t}\n\n\t\t\t\tif (!productId) {\n\t\t\t\t\tproductId = jQuery(\"[name='variation_id']\").val();\n\t\t\t\t}\n\n\t\t\t\tpmw.addProductToCart(productId, quantity);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// If is grouped product\n\t\t\tif (pmwDataLayer.shop.product_type === \"grouped\") {\n\n\t\t\t\tjQuery(\".woocommerce-grouped-product-list-item\").each((index, element) => {\n\n\t\t\t\t\t// Can't rely on event.target.dataset as it always is sent with the parent product ID and the quantity 1\n\n\t\t\t\t\tquantity = Number(jQuery(element).find(\".input-text.qty\").val()) ? Number(jQuery(element).find(\".input-text.qty\").val()) : 1;\n\n\t\t\t\t\tlet classes = jQuery(element).attr(\"class\");\n\t\t\t\t\tproductId = pmw.getPostIdFromString(classes);\n\n\t\t\t\t\tpmw.addProductToCart(productId, quantity);\n\t\t\t\t});\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// If is bundle product\n\t\t\tif (pmwDataLayer.shop.product_type === \"bundle\") {\n\n\t\t\t\tif (quantity === null) {\n\t\t\t\t\tquantity = Number(jQuery(\".input-text.qty\").val()) ? Number(jQuery(\".input-text.qty\").val()) : 1;\n\t\t\t\t}\n\n\t\t\t\tif (!productId) {\n\t\t\t\t\tproductId = jQuery(\"input[name=add-to-cart]\").val();\n\t\t\t\t}\n\n\t\t\t\tpmw.addProductToCart(productId, quantity);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// everything else\n\t\t\tif (quantity === null) {\n\t\t\t\tquantity = Number(jQuery(\".input-text.qty\").val()) ? Number(jQuery(\".input-text.qty\").val()) : 1;\n\t\t\t}\n\n\t\t\tpmw.addProductToCart(productId, quantity);\n\n\t\t} else {\n\n\t\t\tif (quantity === null) {\n\t\t\t\tquantity = 1;\n\t\t\t}\n\n\t\t\tif (!productId) {\n\t\t\t\t// console.log(\"add to cart event.currentTarget\", event.currentTarget)\n\t\t\t\tproductId = jQuery(event.currentTarget).data(\"product_id\") ? jQuery(event.currentTarget).data(\"product_id\") : null;\n\t\t\t}\n\n\t\t\t// Another fallback to retrieve the product ID in case the ID is saved in the value attribute\n\t\t\tif (!productId) {\n\t\t\t\tproductId = jQuery(event.currentTarget).val() ? jQuery(event.currentTarget).val() : null;\n\t\t\t}\n\n\t\t\tif (\n\t\t\t\tproductId\n\t\t\t\t&& quantity\n\t\t\t) {\n\t\t\t\tpmw.addProductToCart(productId, quantity);\n\t\t\t}\n\t\t}\n\n\t} catch (e) {\n\t\tconsole.error(e);\n\t}\n});\n\n\n/**\n * If someone clicks anywhere on a custom /?add-to-cart=123 link\n * trigger the add to cart event\n */\n\n// jQuery(document).one(\"click\", \"a:not(.add_to_cart_button, .ajax_add_to_cart, .single_add_to_cart_button)\", (event) => {\njQuery(\"a:not(.add_to_cart_button, .ajax_add_to_cart, .single_add_to_cart_button)\").one(\"click\", (event) => {\n\n\ttry {\n\t\tif (jQuery(event.target).closest(\"a\").attr(\"href\")) {\n\n\t\t\tlet url = new URL(jQuery(event.currentTarget).attr(\"href\"), window.location.origin);\n\n\t\t\tif (url.searchParams.has(\"add-to-cart\")) {\n\n\t\t\t\tlet productId = url.searchParams.get(\"add-to-cart\");\n\t\t\t\tlet quantity = url.searchParams.has(\"quantity\") ? parseInt(url.searchParams.get(\"quantity\"), 10) : 1;\n\t\t\t\tpmw.addProductToCart(productId, quantity);\n\t\t\t}\n\t\t}\n\t} catch (e) {\n\t\tconsole.error(e);\n\t}\n});\n\n// select item event\n// jQuery(document).on(\"click\", \".woocommerce-LoopProduct-link, .wc-block-grid__product, .product, .product-small, .type-product\", (event) => {\njQuery(\".woocommerce-LoopProduct-link, .wc-block-grid__product, .product, .product-small, .type-product\").on(\"click\", (event) => {\n\n\ttry {\n\n\t\t/**\n\t\t * On some pages the event fires multiple times, and on product pages\n\t\t * even on page load. Using e.stopPropagation helps to prevent this,\n\t\t * but I don't know why. We don't even have to use this, since only a real\n\t\t * product click yields a valid productId. So we filter the invalid click\n\t\t * events out later down in the code. I'll keep it that way because this is\n\t\t * the most compatible way across shops.\n\t\t *\n\t\t * e.stopPropagation();\n\t\t * */\n\n\t\tlet productId = jQuery(event.currentTarget).nextAll(\".pmwProductId:first\").data(\"id\");\n\n\t\t/**\n\t\t * On product pages, for some reason, the click event is triggered on the main product on page load.\n\t\t * In that case no ID is found. But we can discard it, since we only want to trigger the event on\n\t\t * related products, which are found below.\n\t\t */\n\n\t\tif (productId) {\n\n\t\t\tproductId = pmw.getIdBasedOndVariationsOutputSetting(productId);\n\n\t\t\tif (!productId) throw Error(\"Wasn't able to retrieve a productId\");\n\n\t\t\tif (pmwDataLayer.products && pmwDataLayer.products[productId]) {\n\n\t\t\t\tlet product = pmw.getProductDetailsFormattedForEvent(productId);\n\n\t\t\t\tjQuery(document).trigger(\"pmw:select-item\", product);\n\t\t\t}\n\t\t}\n\t} catch (e) {\n\t\tconsole.error(e);\n\t}\n});\n\n\n// checkout_progress event\n// track checkout option event: entered valid billing email\n// jQuery(document).on(\"input\", \"#billing_email\", (event) => {\njQuery(\"#billing_email\").on(\"input\", (event) => {\n\n\tif (pmw.isEmail(jQuery(event.currentTarget).val())) {\n\t\t// pmw.fireCheckoutOption(2);\n\t\tpmw.fireCheckoutProgress(2);\n\t\tpmw.emailSelected = true;\n\t}\n});\n\n\n/**\n * Place order button\n *\n * Track checkout option event: purchase click\n * https://stackoverflow.com/a/34112407/4688612\n * jQuery(document).one(\"click\", \"#place_order\", () => {\n *\n * Has to be hooked after document ready !\n */\njQuery(\"form.checkout\").on(\"checkout_place_order_success\", () => {\n\n\t// console log current time\n\t// console.log(\"checkout_place_order_success event fired at: \" + new Date().getTime())\n\n\tif (false === pmw.emailSelected) {\n\t\tpmw.fireCheckoutProgress(2);\n\t}\n\n\tif (false === pmw.paymentMethodSelected) {\n\t\tpmw.fireCheckoutProgress(3);\n\t\tpmw.fireCheckoutOption(3, jQuery(\"input[name='payment_method']:checked\").val());\n\t}\n\n\tpmw.fireCheckoutProgress(4);\n\n\tjQuery(document).trigger(\"pmw:place-order\", {});\n});\n\n/**\n * Update cart event\n *\n * Has to be hooked after document ready !\n */\njQuery(document).on(\"click\", \"[name='update_cart']\", () => {\n\n\ttry {\n\t\tjQuery(\".cart_item\").each((index, element) => {\n\n\t\t\tconst productId = pmw.getProductIdByCartItemElement(element);\n\n\t\t\tif (!productId) {\n\t\t\t\tconsole.error(\"Pixel Manager: Wasn't able to retrieve a productId\");\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst quantity = pmw.getProductQuantityByCartItemElement(element);\n\n\t\t\tif (!quantity) {\n\t\t\t\tconsole.error(\"Pixel Manager: Wasn't able to retrieve a quantity\");\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// console.log(\"productId\", productId)\n\t\t\t// console.log(\"quantity\", quantity)\n\n\t\t\tif (quantity === 0) {\n\t\t\t\tpmw.removeProductFromCart(productId);\n\t\t\t} else if (quantity < pmwDataLayer.cart[productId].quantity) {\n\t\t\t\tpmw.removeProductFromCart(productId, pmwDataLayer.cart[productId].quantity - quantity);\n\t\t\t} else if (quantity > pmwDataLayer.cart[productId].quantity) {\n\t\t\t\tpmw.addProductToCart(productId, quantity - pmwDataLayer.cart[productId].quantity);\n\t\t\t}\n\t\t});\n\t} catch (e) {\n\t\tconsole.error(e);\n\t\tpmw.getCartItemsFromBackend();\n\t}\n});\n\n// Supports the following plugins:\n// WooCommerce Wishlist: https://woo.com/products/woocommerce-wishlists/\n// YITH WooCommerce Wishlist: https://wordpress.org/plugins/yith-woocommerce-wishlist/\n// add_to_wishlist\njQuery(\".add_to_wishlist,.wl-add-to\").on(\"click\", event => {\n\n\ttry {\n\n\t\tlet productId;\n\n\t\tif (jQuery(event.currentTarget).data(\"productid\")) { // for the WooCommerce wishlist plugin\n\n\t\t\tproductId = jQuery(event.currentTarget).data(\"productid\");\n\t\t} else if (jQuery(event.currentTarget).data(\"product-id\")) { // for the YITH wishlist plugin\n\n\t\t\tproductId = jQuery(event.currentTarget).data(\"product-id\");\n\t\t}\n\n\t\tif (!productId) throw Error(\"Wasn't able to retrieve a productId\");\n\n\t\tlet product = pmw.getProductDetailsFormattedForEvent(productId);\n\n\n\t\tjQuery(document).trigger(\"pmw:add-to-wishlist\", product);\n\t} catch (e) {\n\t\tconsole.error(e);\n\t}\n});\n\n\n/**\n * Called when the user selects all the required dropdowns / attributes\n *\n * Replaced by code in the event_listeners.js file in case of lazy loading\n *\n * Has to be hooked after document ready !\n *\n * https://stackoverflow.com/a/27849208/4688612\n * https://stackoverflow.com/a/65065335/4688612\n *\n */\n\nif (!pmwDataLayer?.general?.lazy_load_pmw) {\n\tpmw.registerShowVariationEventListener();\n}\n\n\n/**\n * Called on variable products when no selection has been done yet\n * or when the visitor deselects his choice.\n *\n * Has to be hooked after document ready !\n */\n\n// jQuery(function () {\n//\n// \tjQuery(\".single_variation_wrap\").on(\"hide_variation\", function () {\n//\n// \t\ttry {\n// \t\t\tlet classes = jQuery(\"body\").attr(\"class\")\n// \t\t\tlet productId = classes.match(/(postid-)(\\d+)/)[2]\n//\n// \t\t\tif (!productId) throw Error(\"Wasn't able to retrieve a productId\")\n//\n// \t\t\t/**\n// \t\t\t * If we have a variable product with no preset,\n// \t\t\t * and variations output is enabled,\n// \t\t\t * then we send a viewItem event with the first\n// \t\t\t * variation we find for the parent.\n// \t\t\t * If variations output is disabled,\n// \t\t\t * we just send the parent ID.\n// \t\t\t *\n// \t\t\t * And if Facebook microdata is active, use the\n// \t\t\t * microdata product ID.\n// \t\t\t */\n//\n// \t\t\tif (\n// \t\t\t\t\"variable\" === pmwDataLayer.shop.product_type &&\n// \t\t\t\tpmwDataLayer?.shop?.variations_output\n// \t\t\t) {\n// \t\t\t\tfor (const [key, product] of Object.entries(pmwDataLayer.products)) {\n// \t\t\t\t\tif (\"parent_id\" in product) {\n//\n// \t\t\t\t\t\tproductId = product.id\n// \t\t\t\t\t\tbreak\n// \t\t\t\t\t}\n// \t\t\t\t}\n//\n// \t\t\t\tif (pmwDataLayer?.pixels?.facebook?.microdata_product_id) {\n// \t\t\t\t\tproductId = pmwDataLayer.pixels.facebook.microdata_product_id\n// \t\t\t\t}\n// \t\t\t}\n//\n// \t\t\t// console.log(\"hmm\")\n// \t\t\tpmw.triggerViewItemEventPrep(productId)\n//\n// \t\t} catch (e) {\n// \t\t\tconsole.error(e)\n// \t\t}\n// \t})\n// })\n\n// jQuery(function () {\n//\n// \tjQuery(\".single_variation_wrap\").on(\"hide_variation\", function () {\n// \t\tjQuery(document).trigger(\"pmw:view-item\")\n// \t})\n// })\n","(function (pmw, $, undefined) {\n\n\tconst PMW_LIBRARY_VERSION = \"1.57.0\"\n\n\tpmw.getLibraryVersion = () => {\n\t\treturn PMW_LIBRARY_VERSION\n\t}\n\n\tpmw.checkLibraryVersion = () => {\n\n\t\tif (pmw.getLibraryVersion() !== pmwDataLayer?.version?.number) {\n\t\t\tconsole.error(`Pixel Manager: The library version ${pmw.getLibraryVersion()} and pmwDataLayer.version.number ${pmwDataLayer.version.number} do not match. Delete the server-side cache and try again.`)\n\t\t}\n\t}\n\n}(window.pmw = window.pmw || {}, jQuery))\n\n","/**\n * Pixel Registry\n *\n * Central registry for managing pixel configurations and adapters.\n * Provides methods to query which pixels are active and retrieve their adapters.\n *\n * Firing Modes:\n * - browser_only: Fire only in browser (Microsoft Ads, Taboola)\n * - server_only: Fire only server-side, suppress browser pixel (admin choice)\n * - both: Fire both browser and server with event_id for deduplication (Facebook, TikTok)\n * - browser_or_server: Fire one or the other, never both (GA4 purchase)\n *\n * @since 1.51.0\n */\n\n(function (pmw, $, undefined) {\n\n\t/**\n\t * Valid firing modes\n\t * @type {string[]}\n\t */\n\tconst VALID_FIRING_MODES = [\"browser_only\", \"server_only\", \"both\", \"browser_or_server\"];\n\n\t/**\n\t * Default firing mode for pixels that don't specify one\n\t * @type {string}\n\t */\n\tconst DEFAULT_FIRING_MODE = \"browser_only\";\n\n\t/**\n\t * Pixel Registry namespace\n\t */\n\tpmw.pixelRegistry = {\n\n\t\t/**\n\t\t * Get all active pixels (both browser-only and S2S-capable)\n\t\t *\n\t\t * Queries each registered adapter's isActive function to determine\n\t\t * if the pixel should be loaded based on pmwDataLayer configuration.\n\t\t *\n\t\t * @returns {string[]} Array of active pixel names\n\t\t */\n\t\tgetActivePixels() {\n\t\t\tconst activePixels = [];\n\n\t\t\tif (!pmw.pixelCapabilities) {\n\t\t\t\treturn activePixels;\n\t\t\t}\n\n\t\t\t// Check each registered pixel's isActive function\n\t\t\tfor (const [pixelName, capabilities] of Object.entries(pmw.pixelCapabilities)) {\n\t\t\t\tif (typeof capabilities.isActive === \"function\") {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tif (capabilities.isActive()) {\n\t\t\t\t\t\t\tactivePixels.push(pixelName);\n\t\t\t\t\t\t}\n\t\t\t\t\t} catch (e) {\n\t\t\t\t\t\tpmw.console.error(`Error checking if ${pixelName} is active:`, e);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn activePixels;\n\t\t},\n\n\t\t/**\n\t\t * Get browser-only pixels (pixels that don't support S2S)\n\t\t *\n\t\t * @returns {string[]} Array of browser-only pixel names\n\t\t */\n\t\tgetActiveBrowserOnlyPixels() {\n\t\t\tconst browserPixels = [];\n\t\t\tconst activePixels = this.getActivePixels();\n\n\t\t\tfor (const pixelName of activePixels) {\n\t\t\t\t// If pixel doesn't support S2S, it's browser-only\n\t\t\t\tif (pmw.pixelCapabilities?.[pixelName]?.supportsS2S !== true) {\n\t\t\t\t\tbrowserPixels.push(pixelName);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn browserPixels;\n\t\t},\n\n\t\t/**\n\t\t * Get S2S-capable pixels\n\t\t *\n\t\t * Returns pixels that declared supportsS2S capability when registering.\n\t\t * These pixels ALWAYS receive the pmw:s2s:* events to fire their browser pixels (fbq, ttq, etc.),\n\t\t * regardless of whether S2S is actually enabled. They handle their own S2S logic internally.\n\t\t *\n\t\t * @returns {string[]} Array of S2S pixel names\n\t\t */\n\t\tgetActiveS2SPixels() {\n\t\t\tconst s2sPixels = [];\n\t\t\tconst activePixels = this.getActivePixels();\n\n\t\t\t// Check each active pixel's capabilities\n\t\t\tfor (const pixelName of activePixels) {\n\t\t\t\t// Check if this pixel declared supportsS2S capability when registering\n\t\t\t\tif (pmw.pixelCapabilities?.[pixelName]?.supportsS2S === true) {\n\t\t\t\t\ts2sPixels.push(pixelName);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn s2sPixels;\n\t\t},\n\n\t\t/**\n\t\t * Get S2S-configured pixels that are not active (browser pixel not loaded)\n\t\t *\n\t\t * Returns pixels where:\n\t\t * - supportsS2S === true\n\t\t * - isConfigured() returns true (pixel has valid config in the data layer)\n\t\t * - isActive() returns false (browser pixel hasn't loaded, e.g. due to consent manager)\n\t\t *\n\t\t * Only returns results when the \"Always Send Server-Side Events\" setting is enabled.\n\t\t *\n\t\t * @returns {string[]} Array of configured-but-not-loaded S2S pixel names\n\t\t * @since 1.57.0\n\t\t */\n\t\tgetS2SConfiguredPixels() {\n\t\t\tconst configuredPixels = [];\n\n\t\t\tif (!pmw.pixelCapabilities) {\n\t\t\t\treturn configuredPixels;\n\t\t\t}\n\n\t\t\t// Only return results when always_send_s2s is enabled\n\t\t\tif (pmwDataLayer?.general?.server_2_server?.always_send_s2s !== true) {\n\t\t\t\treturn configuredPixels;\n\t\t\t}\n\n\t\t\tfor (const [pixelName, capabilities] of Object.entries(pmw.pixelCapabilities)) {\n\t\t\t\t// Skip pixels that don't support S2S\n\t\t\t\tif (capabilities.supportsS2S !== true) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\t// Skip pixels that are already active (loaded normally with consent)\n\t\t\t\tif (typeof capabilities.isActive === \"function\" && capabilities.isActive()) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\t// Check if pixel has valid configuration (but browser pixel hasn't loaded)\n\t\t\t\tif (typeof capabilities.isConfigured === \"function\") {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tif (capabilities.isConfigured()) {\n\t\t\t\t\t\t\tconfiguredPixels.push(pixelName);\n\t\t\t\t\t\t}\n\t\t\t\t\t} catch (e) {\n\t\t\t\t\t\tpmw.console.error(`Error checking if ${pixelName} is configured:`, e);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn configuredPixels;\n\t\t},\n\n\t\t/**\n\t\t * Get all processable pixels: active pixels + S2S-configured-but-not-loaded pixels\n\t\t *\n\t\t * This is the union of getActivePixels() and getS2SConfiguredPixels().\n\t\t * Used by the event processor to ensure S2S-configured pixels get their\n\t\t * adapters called even when browser consent has blocked the pixel from loading.\n\t\t *\n\t\t * @returns {string[]} Deduplicated array of processable pixel names\n\t\t * @since 1.57.0\n\t\t */\n\t\tgetProcessablePixels() {\n\t\t\tconst activePixels = this.getActivePixels();\n\t\t\tconst configuredPixels = this.getS2SConfiguredPixels();\n\n\t\t\t// Deduplicate (configuredPixels shouldn't overlap with activePixels, but be safe)\n\t\t\tconst allPixels = new Set([...activePixels, ...configuredPixels]);\n\t\t\treturn Array.from(allPixels);\n\t\t},\n\n\t\t/**\n\t\t * Get adapter for a specific pixel\n\t\t *\n\t\t * @param {string} pixelName - The pixel name (e.g., 'facebook', 'google_ads')\n\t\t * @returns {object|null} The adapter object or null if not found\n\t\t */\n\t\tgetAdapter(pixelName) {\n\t\t\tif (!pmw.adapters) {\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\treturn pmw.adapters[pixelName] || null;\n\t\t},\n\n\t\t/**\n\t\t * Get active pixels with a specific capability\n\t\t *\n\t\t * Returns pixels that have the specified capability flag set to true.\n\t\t * This is a generic method that allows querying any capability\n\t\t * without needing dedicated methods for each one.\n\t\t *\n\t\t * @param {string} capabilityName - The capability to check (e.g., 'supportsS2S', 'supportsPageViewS2S')\n\t\t * @returns {string[]} Array of pixel names with the specified capability\n\t\t *\n\t\t * @example\n\t\t * // Get all pixels that support page view S2S\n\t\t * pmw.pixelRegistry.getPixelsWithCapability('supportsPageViewS2S')\n\t\t * // Returns: ['facebook', 'snapchat', 'reddit']\n\t\t */\n\t\tgetPixelsWithCapability(capabilityName) {\n\t\t\tconst pixelsWithCapability = [];\n\t\t\tconst activePixels = this.getActivePixels();\n\n\t\t\tfor (const pixelName of activePixels) {\n\t\t\t\tif (pmw.pixelCapabilities?.[pixelName]?.[capabilityName] === true) {\n\t\t\t\t\tpixelsWithCapability.push(pixelName);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn pixelsWithCapability;\n\t\t},\n\n\t\t/**\n\t\t * Get the firing mode for a specific pixel\n\t\t *\n\t\t * Returns the registered firing mode for the pixel. The mode determines\n\t\t * whether events fire in browser, server, or both.\n\t\t *\n\t\t * @param {string} pixelName - The pixel name\n\t\t * @returns {string} The firing mode (browser_only, server_only, both, browser_or_server)\n\t\t */\n\t\tgetFiringMode(pixelName) {\n\t\t\tconst mode = pmw.pixelCapabilities?.[pixelName]?.mode;\n\n\t\t\t// Validate mode is one of the allowed values\n\t\t\tif (mode && VALID_FIRING_MODES.includes(mode)) {\n\t\t\t\treturn mode;\n\t\t\t}\n\n\t\t\t// Legacy support: if supportsS2S is true but no mode specified, default to 'both'\n\t\t\tif (pmw.pixelCapabilities?.[pixelName]?.supportsS2S === true) {\n\t\t\t\treturn \"both\";\n\t\t\t}\n\n\t\t\treturn DEFAULT_FIRING_MODE;\n\t\t},\n\n\t\t/**\n\t\t * Determine whether browser and/or server should fire for a pixel/event combination\n\t\t *\n\t\t * This is the core method for the unified firing mode system. It considers:\n\t\t * - The pixel's registered firing mode\n\t\t * - Whether S2S is globally enabled\n\t\t * - Any filters that modify firing behavior\n\t\t *\n\t\t * @param {string} pixelName - The pixel name\n\t\t * @param {string} eventName - The event name (e.g., 'add_to_cart', 'purchase')\n\t\t * @returns {object} { fire_browser: boolean, fire_server: boolean }\n\t\t */\n\t\tgetFiringDecision(pixelName, eventName) {\n\t\t\tconst mode = this.getFiringMode(pixelName);\n\t\t\tconst s2sEnabled = pmwDataLayer?.general?.server_2_server?.active === true;\n\t\t\tconst supportsS2S = pmw.pixelCapabilities?.[pixelName]?.supportsS2S === true;\n\n\t\t\t// Check if this pixel is S2S-configured but not active (browser pixel not loaded)\n\t\t\tconst isActive = typeof pmw.pixelCapabilities?.[pixelName]?.isActive === \"function\" && pmw.pixelCapabilities[pixelName].isActive();\n\t\t\tconst alwaysSendS2S = pmwDataLayer?.general?.server_2_server?.always_send_s2s === true;\n\t\t\tconst isS2SOnlyPixel = !isActive && alwaysSendS2S && supportsS2S && s2sEnabled;\n\n\t\t\tlet decision = {\n\t\t\t\tfire_browser: true,\n\t\t\t\tfire_server : false,\n\t\t\t};\n\n\t\t\t// If the pixel is not active (browser pixel not loaded) but always_send_s2s is enabled,\n\t\t\t// force server-only firing regardless of the declared mode\n\t\t\tif (isS2SOnlyPixel) {\n\t\t\t\tdecision = {fire_browser: false, fire_server: true};\n\t\t\t} else {\n\t\t\t\tswitch (mode) {\n\t\t\t\t\tcase \"browser_only\":\n\t\t\t\t\t\tdecision = {fire_browser: true, fire_server: false};\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase \"server_only\":\n\t\t\t\t\t\t// Server only fires if S2S is enabled AND pixel supports it\n\t\t\t\t\t\tdecision = {\n\t\t\t\t\t\t\tfire_browser: false,\n\t\t\t\t\t\t\tfire_server : s2sEnabled && supportsS2S,\n\t\t\t\t\t\t};\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase \"both\":\n\t\t\t\t\t\t// Browser always fires, server fires if enabled\n\t\t\t\t\t\tdecision = {\n\t\t\t\t\t\t\tfire_browser: true,\n\t\t\t\t\t\t\tfire_server : s2sEnabled && supportsS2S,\n\t\t\t\t\t\t};\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase \"browser_or_server\":\n\t\t\t\t\t\t// If S2S enabled and supported, use server; otherwise browser\n\t\t\t\t\t\tif (s2sEnabled && supportsS2S) {\n\t\t\t\t\t\t\tdecision = {fire_browser: false, fire_server: true};\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tdecision = {fire_browser: true, fire_server: false};\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Apply filter to allow external modification of firing behavior\n\t\t\t// Use case: Force server-only for specific pixels, disable certain pixels per-event\n\t\t\tdecision = pmw.hooks.applyFilters(\n\t\t\t\t\"pmw_pixel_firing_decision\",\n\t\t\t\tdecision,\n\t\t\t\tpixelName,\n\t\t\t\teventName,\n\t\t\t\tmode,\n\t\t\t);\n\n\t\t\treturn decision;\n\t\t},\n\n\t\t/**\n\t\t * Get all pixels that should fire in browser for a specific event\n\t\t *\n\t\t * @param {string} eventName - The event name\n\t\t * @returns {string[]} Array of pixel names that should fire in browser\n\t\t */\n\t\tgetPixelsForBrowserFiring(eventName) {\n\t\t\tconst pixels = [];\n\t\t\tconst activePixels = this.getProcessablePixels();\n\n\t\t\tfor (const pixelName of activePixels) {\n\t\t\t\tconst decision = this.getFiringDecision(pixelName, eventName);\n\t\t\t\tif (decision.fire_browser) {\n\t\t\t\t\tpixels.push(pixelName);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn pixels;\n\t\t},\n\n\t\t/**\n\t\t * Get all pixels that should fire server-side for a specific event\n\t\t *\n\t\t * @param {string} eventName - The event name\n\t\t * @returns {string[]} Array of pixel names that should fire server-side\n\t\t */\n\t\tgetPixelsForServerFiring(eventName) {\n\t\t\tconst pixels = [];\n\t\t\tconst activePixels = this.getProcessablePixels();\n\n\t\t\tfor (const pixelName of activePixels) {\n\t\t\t\tconst decision = this.getFiringDecision(pixelName, eventName);\n\t\t\t\tif (decision.fire_server) {\n\t\t\t\t\tpixels.push(pixelName);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn pixels;\n\t\t},\n\t};\n\n}(window.pmw = window.pmw || {}, jQuery));",null,null,"(function() {\n var expandIPv6, ipaddr, ipv4Part, ipv4Regexes, ipv6Part, ipv6Regexes, matchCIDR, root, zoneIndex;\n\n ipaddr = {};\n\n root = this;\n\n if ((typeof module !== \"undefined\" && module !== null) && module.exports) {\n module.exports = ipaddr;\n } else {\n root['ipaddr'] = ipaddr;\n }\n\n matchCIDR = function(first, second, partSize, cidrBits) {\n var part, shift;\n if (first.length !== second.length) {\n throw new Error(\"ipaddr: cannot match CIDR for objects with different lengths\");\n }\n part = 0;\n while (cidrBits > 0) {\n shift = partSize - cidrBits;\n if (shift < 0) {\n shift = 0;\n }\n if (first[part] >> shift !== second[part] >> shift) {\n return false;\n }\n cidrBits -= partSize;\n part += 1;\n }\n return true;\n };\n\n ipaddr.subnetMatch = function(address, rangeList, defaultName) {\n var k, len, rangeName, rangeSubnets, subnet;\n if (defaultName == null) {\n defaultName = 'unicast';\n }\n for (rangeName in rangeList) {\n rangeSubnets = rangeList[rangeName];\n if (rangeSubnets[0] && !(rangeSubnets[0] instanceof Array)) {\n rangeSubnets = [rangeSubnets];\n }\n for (k = 0, len = rangeSubnets.length; k < len; k++) {\n subnet = rangeSubnets[k];\n if (address.kind() === subnet[0].kind()) {\n if (address.match.apply(address, subnet)) {\n return rangeName;\n }\n }\n }\n }\n return defaultName;\n };\n\n ipaddr.IPv4 = (function() {\n function IPv4(octets) {\n var k, len, octet;\n if (octets.length !== 4) {\n throw new Error(\"ipaddr: ipv4 octet count should be 4\");\n }\n for (k = 0, len = octets.length; k < len; k++) {\n octet = octets[k];\n if (!((0 <= octet && octet <= 255))) {\n throw new Error(\"ipaddr: ipv4 octet should fit in 8 bits\");\n }\n }\n this.octets = octets;\n }\n\n IPv4.prototype.kind = function() {\n return 'ipv4';\n };\n\n IPv4.prototype.toString = function() {\n return this.octets.join(\".\");\n };\n\n IPv4.prototype.toNormalizedString = function() {\n return this.toString();\n };\n\n IPv4.prototype.toByteArray = function() {\n return this.octets.slice(0);\n };\n\n IPv4.prototype.match = function(other, cidrRange) {\n var ref;\n if (cidrRange === void 0) {\n ref = other, other = ref[0], cidrRange = ref[1];\n }\n if (other.kind() !== 'ipv4') {\n throw new Error(\"ipaddr: cannot match ipv4 address with non-ipv4 one\");\n }\n return matchCIDR(this.octets, other.octets, 8, cidrRange);\n };\n\n IPv4.prototype.SpecialRanges = {\n unspecified: [[new IPv4([0, 0, 0, 0]), 8]],\n broadcast: [[new IPv4([255, 255, 255, 255]), 32]],\n multicast: [[new IPv4([224, 0, 0, 0]), 4]],\n linkLocal: [[new IPv4([169, 254, 0, 0]), 16]],\n loopback: [[new IPv4([127, 0, 0, 0]), 8]],\n carrierGradeNat: [[new IPv4([100, 64, 0, 0]), 10]],\n \"private\": [[new IPv4([10, 0, 0, 0]), 8], [new IPv4([172, 16, 0, 0]), 12], [new IPv4([192, 168, 0, 0]), 16]],\n reserved: [[new IPv4([192, 0, 0, 0]), 24], [new IPv4([192, 0, 2, 0]), 24], [new IPv4([192, 88, 99, 0]), 24], [new IPv4([198, 51, 100, 0]), 24], [new IPv4([203, 0, 113, 0]), 24], [new IPv4([240, 0, 0, 0]), 4]]\n };\n\n IPv4.prototype.range = function() {\n return ipaddr.subnetMatch(this, this.SpecialRanges);\n };\n\n IPv4.prototype.toIPv4MappedAddress = function() {\n return ipaddr.IPv6.parse(\"::ffff:\" + (this.toString()));\n };\n\n IPv4.prototype.prefixLengthFromSubnetMask = function() {\n var cidr, i, k, octet, stop, zeros, zerotable;\n zerotable = {\n 0: 8,\n 128: 7,\n 192: 6,\n 224: 5,\n 240: 4,\n 248: 3,\n 252: 2,\n 254: 1,\n 255: 0\n };\n cidr = 0;\n stop = false;\n for (i = k = 3; k >= 0; i = k += -1) {\n octet = this.octets[i];\n if (octet in zerotable) {\n zeros = zerotable[octet];\n if (stop && zeros !== 0) {\n return null;\n }\n if (zeros !== 8) {\n stop = true;\n }\n cidr += zeros;\n } else {\n return null;\n }\n }\n return 32 - cidr;\n };\n\n return IPv4;\n\n })();\n\n ipv4Part = \"(0?\\\\d+|0x[a-f0-9]+)\";\n\n ipv4Regexes = {\n fourOctet: new RegExp(\"^\" + ipv4Part + \"\\\\.\" + ipv4Part + \"\\\\.\" + ipv4Part + \"\\\\.\" + ipv4Part + \"$\", 'i'),\n longValue: new RegExp(\"^\" + ipv4Part + \"$\", 'i')\n };\n\n ipaddr.IPv4.parser = function(string) {\n var match, parseIntAuto, part, shift, value;\n parseIntAuto = function(string) {\n if (string[0] === \"0\" && string[1] !== \"x\") {\n return parseInt(string, 8);\n } else {\n return parseInt(string);\n }\n };\n if (match = string.match(ipv4Regexes.fourOctet)) {\n return (function() {\n var k, len, ref, results;\n ref = match.slice(1, 6);\n results = [];\n for (k = 0, len = ref.length; k < len; k++) {\n part = ref[k];\n results.push(parseIntAuto(part));\n }\n return results;\n })();\n } else if (match = string.match(ipv4Regexes.longValue)) {\n value = parseIntAuto(match[1]);\n if (value > 0xffffffff || value < 0) {\n throw new Error(\"ipaddr: address outside defined range\");\n }\n return ((function() {\n var k, results;\n results = [];\n for (shift = k = 0; k <= 24; shift = k += 8) {\n results.push((value >> shift) & 0xff);\n }\n return results;\n })()).reverse();\n } else {\n return null;\n }\n };\n\n ipaddr.IPv6 = (function() {\n function IPv6(parts, zoneId) {\n var i, k, l, len, part, ref;\n if (parts.length === 16) {\n this.parts = [];\n for (i = k = 0; k <= 14; i = k += 2) {\n this.parts.push((parts[i] << 8) | parts[i + 1]);\n }\n } else if (parts.length === 8) {\n this.parts = parts;\n } else {\n throw new Error(\"ipaddr: ipv6 part count should be 8 or 16\");\n }\n ref = this.parts;\n for (l = 0, len = ref.length; l < len; l++) {\n part = ref[l];\n if (!((0 <= part && part <= 0xffff))) {\n throw new Error(\"ipaddr: ipv6 part should fit in 16 bits\");\n }\n }\n if (zoneId) {\n this.zoneId = zoneId;\n }\n }\n\n IPv6.prototype.kind = function() {\n return 'ipv6';\n };\n\n IPv6.prototype.toString = function() {\n return this.toNormalizedString().replace(/((^|:)(0(:|$))+)/, '::');\n };\n\n IPv6.prototype.toRFC5952String = function() {\n var bestMatchIndex, bestMatchLength, match, regex, string;\n regex = /((^|:)(0(:|$)){2,})/g;\n string = this.toNormalizedString();\n bestMatchIndex = 0;\n bestMatchLength = -1;\n while ((match = regex.exec(string))) {\n if (match[0].length > bestMatchLength) {\n bestMatchIndex = match.index;\n bestMatchLength = match[0].length;\n }\n }\n if (bestMatchLength < 0) {\n return string;\n }\n return string.substring(0, bestMatchIndex) + '::' + string.substring(bestMatchIndex + bestMatchLength);\n };\n\n IPv6.prototype.toByteArray = function() {\n var bytes, k, len, part, ref;\n bytes = [];\n ref = this.parts;\n for (k = 0, len = ref.length; k < len; k++) {\n part = ref[k];\n bytes.push(part >> 8);\n bytes.push(part & 0xff);\n }\n return bytes;\n };\n\n IPv6.prototype.toNormalizedString = function() {\n var addr, part, suffix;\n addr = ((function() {\n var k, len, ref, results;\n ref = this.parts;\n results = [];\n for (k = 0, len = ref.length; k < len; k++) {\n part = ref[k];\n results.push(part.toString(16));\n }\n return results;\n }).call(this)).join(\":\");\n suffix = '';\n if (this.zoneId) {\n suffix = '%' + this.zoneId;\n }\n return addr + suffix;\n };\n\n IPv6.prototype.toFixedLengthString = function() {\n var addr, part, suffix;\n addr = ((function() {\n var k, len, ref, results;\n ref = this.parts;\n results = [];\n for (k = 0, len = ref.length; k < len; k++) {\n part = ref[k];\n results.push(part.toString(16).padStart(4, '0'));\n }\n return results;\n }).call(this)).join(\":\");\n suffix = '';\n if (this.zoneId) {\n suffix = '%' + this.zoneId;\n }\n return addr + suffix;\n };\n\n IPv6.prototype.match = function(other, cidrRange) {\n var ref;\n if (cidrRange === void 0) {\n ref = other, other = ref[0], cidrRange = ref[1];\n }\n if (other.kind() !== 'ipv6') {\n throw new Error(\"ipaddr: cannot match ipv6 address with non-ipv6 one\");\n }\n return matchCIDR(this.parts, other.parts, 16, cidrRange);\n };\n\n IPv6.prototype.SpecialRanges = {\n unspecified: [new IPv6([0, 0, 0, 0, 0, 0, 0, 0]), 128],\n linkLocal: [new IPv6([0xfe80, 0, 0, 0, 0, 0, 0, 0]), 10],\n multicast: [new IPv6([0xff00, 0, 0, 0, 0, 0, 0, 0]), 8],\n loopback: [new IPv6([0, 0, 0, 0, 0, 0, 0, 1]), 128],\n uniqueLocal: [new IPv6([0xfc00, 0, 0, 0, 0, 0, 0, 0]), 7],\n ipv4Mapped: [new IPv6([0, 0, 0, 0, 0, 0xffff, 0, 0]), 96],\n rfc6145: [new IPv6([0, 0, 0, 0, 0xffff, 0, 0, 0]), 96],\n rfc6052: [new IPv6([0x64, 0xff9b, 0, 0, 0, 0, 0, 0]), 96],\n '6to4': [new IPv6([0x2002, 0, 0, 0, 0, 0, 0, 0]), 16],\n teredo: [new IPv6([0x2001, 0, 0, 0, 0, 0, 0, 0]), 32],\n reserved: [[new IPv6([0x2001, 0xdb8, 0, 0, 0, 0, 0, 0]), 32]]\n };\n\n IPv6.prototype.range = function() {\n return ipaddr.subnetMatch(this, this.SpecialRanges);\n };\n\n IPv6.prototype.isIPv4MappedAddress = function() {\n return this.range() === 'ipv4Mapped';\n };\n\n IPv6.prototype.toIPv4Address = function() {\n var high, low, ref;\n if (!this.isIPv4MappedAddress()) {\n throw new Error(\"ipaddr: trying to convert a generic ipv6 address to ipv4\");\n }\n ref = this.parts.slice(-2), high = ref[0], low = ref[1];\n return new ipaddr.IPv4([high >> 8, high & 0xff, low >> 8, low & 0xff]);\n };\n\n IPv6.prototype.prefixLengthFromSubnetMask = function() {\n var cidr, i, k, part, stop, zeros, zerotable;\n zerotable = {\n 0: 16,\n 32768: 15,\n 49152: 14,\n 57344: 13,\n 61440: 12,\n 63488: 11,\n 64512: 10,\n 65024: 9,\n 65280: 8,\n 65408: 7,\n 65472: 6,\n 65504: 5,\n 65520: 4,\n 65528: 3,\n 65532: 2,\n 65534: 1,\n 65535: 0\n };\n cidr = 0;\n stop = false;\n for (i = k = 7; k >= 0; i = k += -1) {\n part = this.parts[i];\n if (part in zerotable) {\n zeros = zerotable[part];\n if (stop && zeros !== 0) {\n return null;\n }\n if (zeros !== 16) {\n stop = true;\n }\n cidr += zeros;\n } else {\n return null;\n }\n }\n return 128 - cidr;\n };\n\n return IPv6;\n\n })();\n\n ipv6Part = \"(?:[0-9a-f]+::?)+\";\n\n zoneIndex = \"%[0-9a-z]{1,}\";\n\n ipv6Regexes = {\n zoneIndex: new RegExp(zoneIndex, 'i'),\n \"native\": new RegExp(\"^(::)?(\" + ipv6Part + \")?([0-9a-f]+)?(::)?(\" + zoneIndex + \")?$\", 'i'),\n transitional: new RegExp((\"^((?:\" + ipv6Part + \")|(?:::)(?:\" + ipv6Part + \")?)\") + (ipv4Part + \"\\\\.\" + ipv4Part + \"\\\\.\" + ipv4Part + \"\\\\.\" + ipv4Part) + (\"(\" + zoneIndex + \")?$\"), 'i')\n };\n\n expandIPv6 = function(string, parts) {\n var colonCount, lastColon, part, replacement, replacementCount, zoneId;\n if (string.indexOf('::') !== string.lastIndexOf('::')) {\n return null;\n }\n zoneId = (string.match(ipv6Regexes['zoneIndex']) || [])[0];\n if (zoneId) {\n zoneId = zoneId.substring(1);\n string = string.replace(/%.+$/, '');\n }\n colonCount = 0;\n lastColon = -1;\n while ((lastColon = string.indexOf(':', lastColon + 1)) >= 0) {\n colonCount++;\n }\n if (string.substr(0, 2) === '::') {\n colonCount--;\n }\n if (string.substr(-2, 2) === '::') {\n colonCount--;\n }\n if (colonCount > parts) {\n return null;\n }\n replacementCount = parts - colonCount;\n replacement = ':';\n while (replacementCount--) {\n replacement += '0:';\n }\n string = string.replace('::', replacement);\n if (string[0] === ':') {\n string = string.slice(1);\n }\n if (string[string.length - 1] === ':') {\n string = string.slice(0, -1);\n }\n parts = (function() {\n var k, len, ref, results;\n ref = string.split(\":\");\n results = [];\n for (k = 0, len = ref.length; k < len; k++) {\n part = ref[k];\n results.push(parseInt(part, 16));\n }\n return results;\n })();\n return {\n parts: parts,\n zoneId: zoneId\n };\n };\n\n ipaddr.IPv6.parser = function(string) {\n var addr, k, len, match, octet, octets, zoneId;\n if (ipv6Regexes['native'].test(string)) {\n return expandIPv6(string, 8);\n } else if (match = string.match(ipv6Regexes['transitional'])) {\n zoneId = match[6] || '';\n addr = expandIPv6(match[1].slice(0, -1) + zoneId, 6);\n if (addr.parts) {\n octets = [parseInt(match[2]), parseInt(match[3]), parseInt(match[4]), parseInt(match[5])];\n for (k = 0, len = octets.length; k < len; k++) {\n octet = octets[k];\n if (!((0 <= octet && octet <= 255))) {\n return null;\n }\n }\n addr.parts.push(octets[0] << 8 | octets[1]);\n addr.parts.push(octets[2] << 8 | octets[3]);\n return {\n parts: addr.parts,\n zoneId: addr.zoneId\n };\n }\n }\n return null;\n };\n\n ipaddr.IPv4.isIPv4 = ipaddr.IPv6.isIPv6 = function(string) {\n return this.parser(string) !== null;\n };\n\n ipaddr.IPv4.isValid = function(string) {\n var e;\n try {\n new this(this.parser(string));\n return true;\n } catch (error1) {\n e = error1;\n return false;\n }\n };\n\n ipaddr.IPv4.isValidFourPartDecimal = function(string) {\n if (ipaddr.IPv4.isValid(string) && string.match(/^(0|[1-9]\\d*)(\\.(0|[1-9]\\d*)){3}$/)) {\n return true;\n } else {\n return false;\n }\n };\n\n ipaddr.IPv6.isValid = function(string) {\n var addr, e;\n if (typeof string === \"string\" && string.indexOf(\":\") === -1) {\n return false;\n }\n try {\n addr = this.parser(string);\n new this(addr.parts, addr.zoneId);\n return true;\n } catch (error1) {\n e = error1;\n return false;\n }\n };\n\n ipaddr.IPv4.parse = function(string) {\n var parts;\n parts = this.parser(string);\n if (parts === null) {\n throw new Error(\"ipaddr: string is not formatted like ip address\");\n }\n return new this(parts);\n };\n\n ipaddr.IPv6.parse = function(string) {\n var addr;\n addr = this.parser(string);\n if (addr.parts === null) {\n throw new Error(\"ipaddr: string is not formatted like ip address\");\n }\n return new this(addr.parts, addr.zoneId);\n };\n\n ipaddr.IPv4.parseCIDR = function(string) {\n var maskLength, match, parsed;\n if (match = string.match(/^(.+)\\/(\\d+)$/)) {\n maskLength = parseInt(match[2]);\n if (maskLength >= 0 && maskLength <= 32) {\n parsed = [this.parse(match[1]), maskLength];\n Object.defineProperty(parsed, 'toString', {\n value: function() {\n return this.join('/');\n }\n });\n return parsed;\n }\n }\n throw new Error(\"ipaddr: string is not formatted like an IPv4 CIDR range\");\n };\n\n ipaddr.IPv4.subnetMaskFromPrefixLength = function(prefix) {\n var filledOctetCount, j, octets;\n prefix = parseInt(prefix);\n if (prefix < 0 || prefix > 32) {\n throw new Error('ipaddr: invalid IPv4 prefix length');\n }\n octets = [0, 0, 0, 0];\n j = 0;\n filledOctetCount = Math.floor(prefix / 8);\n while (j < filledOctetCount) {\n octets[j] = 255;\n j++;\n }\n if (filledOctetCount < 4) {\n octets[filledOctetCount] = Math.pow(2, prefix % 8) - 1 << 8 - (prefix % 8);\n }\n return new this(octets);\n };\n\n ipaddr.IPv4.broadcastAddressFromCIDR = function(string) {\n var cidr, error, i, ipInterfaceOctets, octets, subnetMaskOctets;\n try {\n cidr = this.parseCIDR(string);\n ipInterfaceOctets = cidr[0].toByteArray();\n subnetMaskOctets = this.subnetMaskFromPrefixLength(cidr[1]).toByteArray();\n octets = [];\n i = 0;\n while (i < 4) {\n octets.push(parseInt(ipInterfaceOctets[i], 10) | parseInt(subnetMaskOctets[i], 10) ^ 255);\n i++;\n }\n return new this(octets);\n } catch (error1) {\n error = error1;\n throw new Error('ipaddr: the address does not have IPv4 CIDR format');\n }\n };\n\n ipaddr.IPv4.networkAddressFromCIDR = function(string) {\n var cidr, error, i, ipInterfaceOctets, octets, subnetMaskOctets;\n try {\n cidr = this.parseCIDR(string);\n ipInterfaceOctets = cidr[0].toByteArray();\n subnetMaskOctets = this.subnetMaskFromPrefixLength(cidr[1]).toByteArray();\n octets = [];\n i = 0;\n while (i < 4) {\n octets.push(parseInt(ipInterfaceOctets[i], 10) & parseInt(subnetMaskOctets[i], 10));\n i++;\n }\n return new this(octets);\n } catch (error1) {\n error = error1;\n throw new Error('ipaddr: the address does not have IPv4 CIDR format');\n }\n };\n\n ipaddr.IPv6.parseCIDR = function(string) {\n var maskLength, match, parsed;\n if (match = string.match(/^(.+)\\/(\\d+)$/)) {\n maskLength = parseInt(match[2]);\n if (maskLength >= 0 && maskLength <= 128) {\n parsed = [this.parse(match[1]), maskLength];\n Object.defineProperty(parsed, 'toString', {\n value: function() {\n return this.join('/');\n }\n });\n return parsed;\n }\n }\n throw new Error(\"ipaddr: string is not formatted like an IPv6 CIDR range\");\n };\n\n ipaddr.isValid = function(string) {\n return ipaddr.IPv6.isValid(string) || ipaddr.IPv4.isValid(string);\n };\n\n ipaddr.parse = function(string) {\n if (ipaddr.IPv6.isValid(string)) {\n return ipaddr.IPv6.parse(string);\n } else if (ipaddr.IPv4.isValid(string)) {\n return ipaddr.IPv4.parse(string);\n } else {\n throw new Error(\"ipaddr: the address has neither IPv6 nor IPv4 format\");\n }\n };\n\n ipaddr.parseCIDR = function(string) {\n var e;\n try {\n return ipaddr.IPv6.parseCIDR(string);\n } catch (error1) {\n e = error1;\n try {\n return ipaddr.IPv4.parseCIDR(string);\n } catch (error1) {\n e = error1;\n throw new Error(\"ipaddr: the address has neither IPv6 nor IPv4 CIDR format\");\n }\n }\n };\n\n ipaddr.fromByteArray = function(bytes) {\n var length;\n length = bytes.length;\n if (length === 4) {\n return new ipaddr.IPv4(bytes);\n } else if (length === 16) {\n return new ipaddr.IPv6(bytes);\n } else {\n throw new Error(\"ipaddr: the binary input is neither an IPv6 nor IPv4 address\");\n }\n };\n\n ipaddr.process = function(string) {\n var addr;\n addr = this.parse(string);\n if (addr.kind() === 'ipv6' && addr.isIPv4MappedAddress()) {\n return addr.toIPv4Address();\n } else {\n return addr;\n }\n };\n\n}).call(this);\n","/**\n * Created by elgs on 3/5/16.\n */\nconst normalize = function (a) {\n if (!_validate(a)) {\n throw new Error('Invalid address: ' + a);\n }\n a = a.toLowerCase()\n\n const nh = a.split(/\\:\\:/g);\n if (nh.length > 2) {\n throw new Error('Invalid address: ' + a);\n }\n\n let sections = [];\n if (nh.length == 1) {\n // full mode\n sections = a.split(/\\:/g);\n if (sections.length !== 8) {\n throw new Error('Invalid address: ' + a);\n }\n } else if (nh.length == 2) {\n // compact mode\n const n = nh[0];\n const h = nh[1];\n const ns = n.split(/\\:/g);\n const hs = h.split(/\\:/g);\n for (let i in ns) {\n sections[i] = ns[i];\n }\n for (let i = hs.length; i > 0; --i) {\n sections[7 - (hs.length - i)] = hs[i - 1];\n }\n }\n for (let i = 0; i < 8; ++i) {\n if (sections[i] === undefined) {\n sections[i] = '0000';\n }\n sections[i] = _leftPad(sections[i], '0', 4);\n }\n return sections.join(':');\n};\n\nconst abbreviate = function (a) {\n if (!_validate(a)) {\n throw new Error('Invalid address: ' + a);\n }\n a = normalize(a);\n a = a.replace(/0000/g, 'g');\n a = a.replace(/\\:000/g, ':');\n a = a.replace(/\\:00/g, ':');\n a = a.replace(/\\:0/g, ':');\n a = a.replace(/g/g, '0');\n const sections = a.split(/\\:/g);\n let zPreviousFlag = false;\n let zeroStartIndex = -1;\n let zeroLength = 0;\n let zStartIndex = -1;\n let zLength = 0;\n for (let i = 0; i < 8; ++i) {\n const section = sections[i];\n let zFlag = (section === '0');\n if (zFlag && !zPreviousFlag) {\n zStartIndex = i;\n }\n if (!zFlag && zPreviousFlag) {\n zLength = i - zStartIndex;\n }\n if (zLength > 1 && zLength > zeroLength) {\n zeroStartIndex = zStartIndex;\n zeroLength = zLength;\n }\n zPreviousFlag = (section === '0');\n }\n if (zPreviousFlag) {\n zLength = 8 - zStartIndex;\n }\n if (zLength > 1 && zLength > zeroLength) {\n zeroStartIndex = zStartIndex;\n zeroLength = zLength;\n }\n //console.log(zeroStartIndex, zeroLength);\n //console.log(sections);\n if (zeroStartIndex >= 0 && zeroLength > 1) {\n sections.splice(zeroStartIndex, zeroLength, 'g');\n }\n //console.log(sections);\n a = sections.join(':');\n //console.log(a);\n a = a.replace(/\\:g\\:/g, '::');\n a = a.replace(/\\:g/g, '::');\n a = a.replace(/g\\:/g, '::');\n a = a.replace(/g/g, '::');\n //console.log(a);\n return a;\n};\n\n// Basic validation\nconst _validate = function (a) {\n return /^[a-f0-9\\\\:]+$/ig.test(a);\n};\n\nconst _leftPad = function (d, p, n) {\n const padding = p.repeat(n);\n if (d.length < padding.length) {\n d = padding.substring(0, padding.length - d.length) + d;\n }\n return d;\n};\n\nconst _hex2bin = function (hex) {\n return parseInt(hex, 16).toString(2)\n};\nconst _bin2hex = function (bin) {\n return parseInt(bin, 2).toString(16)\n};\n\nconst _addr2bin = function (addr) {\n const nAddr = normalize(addr);\n const sections = nAddr.split(\":\");\n let binAddr = '';\n for (const section of sections) {\n binAddr += _leftPad(_hex2bin(section), '0', 16);\n }\n return binAddr;\n};\n\nconst _bin2addr = function (bin) {\n const addr = [];\n for (let i = 0; i < 8; ++i) {\n const binPart = bin.substr(i * 16, 16);\n const hexSection = _leftPad(_bin2hex(binPart), '0', 4);\n addr.push(hexSection);\n }\n return addr.join(':');\n};\n\nconst divideSubnet = function (addr, mask0, mask1, limit, abbr) {\n if (!_validate(addr)) {\n throw new Error('Invalid address: ' + addr);\n }\n mask0 *= 1;\n mask1 *= 1;\n limit *= 1;\n mask1 = mask1 || 128;\n if (mask0 < 1 || mask1 < 1 || mask0 > 128 || mask1 > 128 || mask0 > mask1) {\n throw new Error('Invalid masks.');\n }\n const ret = [];\n const binAddr = _addr2bin(addr);\n const binNetPart = binAddr.substr(0, mask0);\n const binHostPart = '0'.repeat(128 - mask1);\n const numSubnets = Math.pow(2, mask1 - mask0);\n for (let i = 0; i < numSubnets; ++i) {\n if (!!limit && i >= limit) {\n break;\n }\n const binSubnet = _leftPad(i.toString(2), '0', mask1 - mask0);\n const binSubAddr = binNetPart + binSubnet + binHostPart;\n const hexAddr = _bin2addr(binSubAddr);\n if (!!abbr) {\n ret.push(abbreviate(hexAddr));\n } else {\n ret.push(hexAddr);\n }\n\n }\n // console.log(numSubnets);\n // console.log(binNetPart, binSubnetPart, binHostPart);\n // console.log(binNetPart.length, binSubnetPart.length, binHostPart.length);\n // console.log(ret.length);\n return ret;\n};\n\nconst range = function (addr, mask0, mask1, abbr) {\n if (!_validate(addr)) {\n throw new Error('Invalid address: ' + addr);\n }\n mask0 *= 1;\n mask1 *= 1;\n mask1 = mask1 || 128;\n if (mask0 < 1 || mask1 < 1 || mask0 > 128 || mask1 > 128 || mask0 > mask1) {\n throw new Error('Invalid masks.');\n }\n const binAddr = _addr2bin(addr);\n const binNetPart = binAddr.substr(0, mask0);\n const binHostPart = '0'.repeat(128 - mask1);\n const binStartAddr = binNetPart + '0'.repeat(mask1 - mask0) + binHostPart;\n const binEndAddr = binNetPart + '1'.repeat(mask1 - mask0) + binHostPart;\n if (!!abbr) {\n return {\n start: abbreviate(_bin2addr(binStartAddr)),\n end: abbreviate(_bin2addr(binEndAddr)),\n size: Math.pow(2, mask1 - mask0)\n };\n } else {\n return {\n start: _bin2addr(binStartAddr),\n end: _bin2addr(binEndAddr),\n size: Math.pow(2, mask1 - mask0)\n };\n }\n};\n\nconst randomSubnet = function (addr, mask0, mask1, limit, abbr) {\n if (!_validate(addr)) {\n throw new Error('Invalid address: ' + addr);\n }\n mask0 *= 1;\n mask1 *= 1;\n limit *= 1;\n mask1 = mask1 || 128;\n limit = limit || 1;\n if (mask0 < 1 || mask1 < 1 || mask0 > 128 || mask1 > 128 || mask0 > mask1) {\n throw new Error('Invalid masks.');\n }\n const ret = [];\n const binAddr = _addr2bin(addr);\n const binNetPart = binAddr.substr(0, mask0);\n const binHostPart = '0'.repeat(128 - mask1);\n const numSubnets = Math.pow(2, mask1 - mask0);\n for (let i = 0; i < numSubnets && i < limit; ++i) {\n // generate an binary string with length of mask1 - mask0\n let binSubnet = '';\n for (let j = 0; j < mask1 - mask0; ++j) {\n binSubnet += Math.floor(Math.random() * 2);\n }\n const binSubAddr = binNetPart + binSubnet + binHostPart;\n const hexAddr = _bin2addr(binSubAddr);\n if (!!abbr) {\n ret.push(abbreviate(hexAddr));\n } else {\n ret.push(hexAddr);\n }\n }\n // console.log(numSubnets);\n // console.log(binNetPart, binSubnetPart, binHostPart);\n // console.log(binNetPart.length, binSubnetPart.length, binHostPart.length);\n // console.log(ret.length);\n return ret;\n};\n\nconst ptr = function (addr, mask) {\n if (!_validate(addr)) {\n throw new Error('Invalid address: ' + addr);\n }\n mask *= 1;\n if (mask < 1 || mask > 128 || Math.floor(mask / 4) != mask / 4) {\n throw new Error('Invalid masks.');\n }\n const fullAddr = normalize(addr);\n const reverse = fullAddr.replace(/:/g, '').split('').reverse();\n return reverse.slice(0, (128 - mask) / 4).join('.');\n};\n\nif (typeof module !== 'undefined' && typeof module.exports !== 'undefined') {\n exports.normalize = normalize;\n exports.abbreviate = abbreviate;\n exports.divideSubnet = divideSubnet;\n exports.range = range;\n exports.randomSubnet = randomSubnet;\n exports.ptr = ptr;\n} else {\n window.normalize = normalize;\n window.abbreviate = abbreviate;\n window.divideSubnet = divideSubnet;\n window.range = range;\n window.randomSubnet = randomSubnet;\n window.ptr = ptr;\n}\n","import ipaddr from 'ipaddr.js';\n// @ts-ignore: Can't find a @types/ip6 package\nimport ip6 from 'ip6';\n\nexport function isIP(addr: string) {\n return ipaddr.isValid(addr);\n}\n\nexport function version(addr: string): number {\n try {\n const parse_addr = ipaddr.parse(addr);\n const kind = parse_addr.kind();\n\n if (kind === 'ipv4') {\n return 4; //IPv4\n } else if (kind === 'ipv6') {\n return 6; //IPv6\n } else {\n /* istanbul ignore next */\n return 0; //not 4 or 6\n }\n } catch (err) {\n return 0; //not 4 or 6\n }\n}\n\nexport function isV4(addr: string) {\n return version(addr) === 4;\n}\n\nexport function isV6(addr: string) {\n return version(addr) === 6;\n}\n\nexport function isRange(range: string) {\n try {\n const cidr = ipaddr.parseCIDR(range);\n return true;\n } catch (err) {\n return false;\n }\n}\n\nexport function inRange(addr: string, range: string | string[]) {\n if (typeof range === 'string') {\n if (range.indexOf('/') !== -1) {\n try {\n const range_data = range.split('/');\n\n const parse_addr = ipaddr.parse(addr);\n const parse_range = ipaddr.parse(range_data[0]);\n\n //@ts-ignore: It works.\n return parse_addr.match(parse_range, range_data[1]);\n } catch (err) {\n return false;\n }\n } else {\n addr = isV6(addr) ? ip6.normalize(addr) : addr; //v6 normalize addr\n range = isV6(range) ? ip6.normalize(range) : range; //v6 normalize range\n\n return isIP(range as string) && addr === range;\n }\n } else if (range && typeof range === 'object') {\n //list\n for (const check_range in range) {\n if (inRange(addr, range[check_range]) === true) {\n return true;\n }\n }\n return false;\n } else {\n return false;\n }\n}\n\nexport function storeIP(addr: string) {\n try {\n var parse_addr = ipaddr.parse(addr);\n var kind = parse_addr.kind();\n\n if (kind === 'ipv4') {\n //is a plain v4 address\n return addr;\n } else if (kind === 'ipv6') {\n //@ts-ignore: it exists!\n if (parse_addr.isIPv4MappedAddress()) {\n //convert v4 mapped to v6 addresses to a v4 in it's original format\n //@ts-ignore: it exists!\n return parse_addr.toIPv4Address().toString();\n } //is a v6, abbreviate it\n else {\n return ip6.abbreviate(addr);\n }\n } else {\n return null; //invalid IP address\n }\n } catch (err) {\n return null; //invalid IP address\n }\n}\n\n// searchIP is a aliases of storeIP\nexport { storeIP as searchIP };\n\nexport function displayIP(addr: string) {\n try {\n var parse_addr = ipaddr.parse(addr);\n var kind = parse_addr.kind();\n\n if (kind === 'ipv4') {\n //is a plain v4 address\n return addr;\n } else if (kind === 'ipv6') {\n //@ts-ignore: it exists!\n if (parse_addr.isIPv4MappedAddress()) {\n //convert v4 mapped to v6 addresses to a v4 in it's original format\n //@ts-ignore: it exists!\n return parse_addr.toIPv4Address().toString();\n } //is a v6, normalize it\n else {\n return ip6.normalize(addr);\n }\n } else {\n return ''; //invalid IP address\n }\n } catch (err) {\n return ''; //invalid IP address\n }\n}\n","/**\n * Create a wpm namespace under which all functions are declared\n */\n\n// https://stackoverflow.com/a/5947280/4688612\n\n(function (pmw, $, undefined) {\n\n\tconst pmwDeduper = {\n\t\tkeyName : \"_wpm_order_ids\",\n\t\tcookieExpiresDays: 365,\n\t};\n\n\tconst pmwRestSettings = {\n\t\t// cookiesAvailable : '_wpm_cookies_are_available',\n\t\tcookiePmwRestEndpointAvailable: \"restEndpointAvailable\",\n\t\trestEndpointPost : \"pmw/v1/test/\",\n\t\trestFails : 0,\n\t\trestFailsThreshold : 10,\n\t};\n\n\tpmw.emailSelected = false;\n\tpmw.paymentMethodSelected = false;\n\n\tpmw.isBelowRestErrorThreshold = () => pmw.retrieveData(pmwRestSettings.restFails) <= pmwRestSettings.restFailsThreshold;\n\n\tpmw.isRestEndpointAvailable = async () => {\n\n\t\t// If we already tested the endpoint and have a stored value, return it\n\t\tif (pmw.retrieveData(pmwRestSettings.cookiePmwRestEndpointAvailable)) {\n\t\t\treturn pmw.retrieveData(pmwRestSettings.cookiePmwRestEndpointAvailable);\n\t\t}\n\n\t\treturn await pmw.testEndpoint();\n\t};\n\n\t/**\n\t * Tests a given endpoint by sending a POST request. If the response status is 200, it stores `true` in the dataStorage with given cookie name; else it stores `false`.\n\t *\n\t * @param {string} url - The URL of the endpoint to test. Defaults to concatenation of `pmw.root` and `wpmRestSettings.restEndpointPost`.\n\t * @param {string} cookieName - The name of the cookie where the test result will be stored. Defaults to `wpmRestSettings.cookiePmwRestEndpointAvailable`.\n\t * @returns {Promise<boolean>} - Returns a promise that resolves to `true` if the response status is 200, and `false` otherwise.\n\t * @async\n\t */\n\tpmw.testEndpoint = async (\n\t\turl = pmw.root + pmwRestSettings.restEndpointPost,\n\t\tcookieName = pmwRestSettings.cookiePmwRestEndpointAvailable,\n\t) => {\n\n\t\ttry {\n\n\t\t\tconst response = await fetch(url, {\n\t\t\t\tmethod : \"POST\",\n\t\t\t\tmode : \"cors\",\n\t\t\t\tcache : \"no-cache\",\n\t\t\t\tkeepalive: true,\n\t\t\t\tredirect : \"error\",\t// don't follow redirects\n\t\t\t});\n\n\t\t\tif (!response.ok) {\n\t\t\t\tpmw.storeData(cookieName, false);\n\t\t\t\tpmw.console.error(\"Error testing the endpoint. Status: \" + response.status + \" | response: \", response);\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tconst responseJson = await response.json();\n\n\t\t\t// Return false if responseJson.success is not true\n\t\t\tif (!responseJson.success) {\n\t\t\t\tpmw.storeData(cookieName, false);\n\t\t\t\tpmw.console.error(\"Error testing the endpoint. Response JSON: \" + JSON.stringify(responseJson));\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tpmw.storeData(cookieName, true);\n\t\t\treturn true;\n\n\t\t} catch (e) {\n\t\t\tpmw.storeData(cookieName, false);\n\t\t\tpmw.console.error(\"Error testing the endpoint. Error: \" + e);\n\t\t\treturn false;\n\t\t}\n\t};\n\n\tpmw.isPmwRestEndpointAvailable = (cookieName = pmwRestSettings.cookiePmwRestEndpointAvailable) => !!pmw.retrieveData(cookieName);\n\n\t/**\n\t * This function writes the provided orderId into storage. It will first retrieve the existing orderIds\n\t * from the storage if any, then add the new orderId into this existing array of orderIds and stores\n\t * the updated array back to the storage.\n\t * If the function pmw.storeOrderIdOnServer exists and order_duplication_prevention is set to true in pmwDataLayer.shop,\n\t * this function will also store the orderId, orderKey and source on the server side using pmw.storeOrderIdOnServer.\n\t *\n\t * @param {String} orderId - The ID of the order to be stored.\n\t * @param {String} orderKey - The Key of the order to be stored.\n\t * @param {String} source - The source from which the order originated (default: 'thankyou_page').\n\t */\n\tpmw.writeOrderIdToStorage = (orderId, orderKey, source = \"thankyou_page\") => {\n\n\t\t// Get existing order ids\n\t\tlet orderIds = pmw.retrieveData(\"orderIds\", true) || [];\n\n\t\t// Add the new order id\n\t\torderIds.push(orderId);\n\n\t\t// Store the order ids\n\t\tpmw.storeData(\"orderIds\", orderIds, true);\n\n\t\tif (typeof pmw.storeOrderIdOnServer === \"function\") {\n\t\t\tpmw.storeOrderIdOnServer({\n\t\t\t\torderId : orderId,\n\t\t\t\torderKey: orderKey,\n\t\t\t\tsource : source,\n\t\t\t});\n\t\t}\n\t};\n\n\tpmw.isOrderIdStored = orderId => {\n\n\t\t// If order deduplication is disabled, return false\n\t\tif (!pmwDataLayer.shop.order_duplication_prevention) {\n\t\t\tpmw.console.log(\"order duplication prevention is off\");\n\t\t\treturn false;\n\t\t}\n\n\t\tconst orderIds = pmw.retrieveData(\"orderIds\", true) || [];\n\t\treturn orderIds.includes(orderId);\n\t};\n\n\t/**\n\t * Check if the email address is valid\n\t *\n\t * https://stackoverflow.com/questions/201323/how-can-i-validate-an-email-address-using-a-regular-expression\n\t * https://www.w3.org/TR/html5/forms.html#valid-e-mail-address\n\t * https://fightingforalostcause.net/content/misc/2006/compare-email-regex.php\n\t *\n\t * @param email\n\t * @returns {boolean}\n\t */\n\tpmw.isEmail = email => {\n\n\t\t/**\n\t\t * GitHub Copilot generated RFC 5322 compliant regex\n\t\t * - Don't allow emails without a top-level domain like \"john@localhost\"\n\t\t * - Don't allow emails with dots at the end of the name like \"[email protected]\"\n\t\t */\n\t\tconst regex = new RegExp(\n\t\t\t\"^(([^<>()\\\\[\\\\]\\\\\\\\.,;:\\\\s@\\\"]+(\\\\.[^<>()\\\\[\\\\]\\\\\\\\.,;:\\\\s@\\\"]+)*)|(\\\".+\\\"))\"\n\t\t\t+ \"@\"\n\t\t\t+ \"((\\\\[[0-9]{1,3}\\\\.[0-9]{1,3}\\\\.[0-9]{1,3}\\\\.[0-9]{1,3}\\\\])\"\n\t\t\t+ \"|(([a-zA-Z\\\\-0-9]+\\\\.)+[a-zA-Z]{2,}))$\",\n\t\t);\n\n\t\treturn regex.test(email);\n\t};\n\n\tpmw.removeProductFromCart = async (productId, quantityToRemove = null) => {\n\n\t\ttry {\n\n\t\t\tif (!productId) throw Error(\"Wasn't able to retrieve a productId\");\n\n\t\t\tproductId = pmw.getIdBasedOndVariationsOutputSetting(productId);\n\n\t\t\tif (!productId) throw Error(\"Wasn't able to retrieve a productId\");\n\n\t\t\tlet quantity;\n\n\t\t\tif (quantityToRemove == null) {\n\t\t\t\tquantity = pmwDataLayer.cart[productId].quantity;\n\t\t\t} else {\n\t\t\t\tquantity = quantityToRemove;\n\t\t\t}\n\n\t\t\tif (!pmwDataLayer.cart[productId]) {\n\t\t\t\tawait pmw.getProductsFromBackend([productId]);\n\t\t\t}\n\n\t\t\tlet product = pmw.getProductDetailsFormattedForEvent(productId, quantity);\n\n\t\t\tjQuery(document).trigger(\"pmw:remove-from-cart\", product);\n\n\t\t\tif (quantityToRemove == null || pmwDataLayer.cart[productId].quantity === quantityToRemove) {\n\t\t\t\tdelete pmwDataLayer.cart[productId];\n\t\t\t} else {\n\t\t\t\tpmwDataLayer.cart[productId].quantity = pmwDataLayer.cart[productId].quantity - quantity;\n\t\t\t}\n\n\t\t\tpmw.storeCartData(pmwDataLayer.cart);\n\n\t\t} catch (e) {\n\t\t\tpmw.console.error(\"error: \", e);\n\t\t}\n\t};\n\n\tpmw.getIdBasedOndVariationsOutputSetting = productId => {\n\n\t\ttry {\n\t\t\tif (pmwDataLayer?.shop?.variations_output) return productId;\n\n\t\t\tif (pmwDataLayer.products[productId].is_variation) return pmwDataLayer.products[productId].parent_id;\n\n\t\t\treturn productId;\n\n\t\t} catch (e) {\n\t\t\tconsole.error(e);\n\t\t}\n\t};\n\n\tpmw.prepareSelectors = (selectors, type) => {\n\n\t\tif (pmwDataLayer?.shop?.selectors?.[type]) {\n\n\t\t\t// merge the selectors from the addToCartSelectors array with the selectors from the pmwDataLayer.shop.selectors.addToCart array\n\t\t\tselectors = selectors.concat(pmwDataLayer.shop.selectors[type]);\n\n\t\t\t// Remove duplicates\n\t\t\tselectors = [...new Set(selectors)];\n\n\t\t\t// If one of the selectors is document, remove it\n\t\t\tif (selectors.indexOf(\"document\") >= 0) {\n\t\t\t\tselectors.splice(selectors.indexOf(\"document\"), 1);\n\t\t\t}\n\n\t\t\t// If one of the selectors is body, remove all others\n\t\t\tif (selectors.indexOf(\"body\") >= 0) {\n\t\t\t\tselectors = [\"body\"];\n\t\t\t}\n\t\t}\n\n\t\treturn selectors.join(\", \");\n\t};\n\n\t// add_to_cart\n\tpmw.addProductToCart = async (productId, quantity) => {\n\n\t\t// Cast quantity to number to make sure it's a number\n\t\tquantity = Number(quantity);\n\n\t\ttry {\n\n\t\t\tif (!productId) throw Error(\"Wasn't able to retrieve a productId\");\n\n\t\t\tproductId = pmw.getIdBasedOndVariationsOutputSetting(productId);\n\n\t\t\tif (!productId) throw Error(\"Wasn't able to retrieve a productId\");\n\n\t\t\tif (!pmwDataLayer?.products[productId]) {\n\t\t\t\tawait pmw.getProductsFromBackend([productId]);\n\t\t\t}\n\n\t\t\tlet product = pmw.getProductDetailsFormattedForEvent(productId, quantity);\n\n\t\t\tjQuery(document).trigger(\"pmw:add-to-cart\", product);\n\n\t\t\t// add product to cart pmwDataLayer['cart']\n\n\t\t\t// if the product already exists in the object, only add the additional quantity\n\t\t\t// otherwise create that product object in the pmwDataLayer['cart']\n\t\t\tif (pmwDataLayer?.cart[productId]) {\n\n\t\t\t\tpmwDataLayer.cart[productId].quantity = pmwDataLayer.cart[productId].quantity + quantity;\n\t\t\t} else {\n\n\t\t\t\tif (!(\"cart\" in pmwDataLayer)) pmwDataLayer.cart = {};\n\n\t\t\t\tpmwDataLayer.cart[productId] = pmw.getProductDetailsFormattedForEvent(productId, quantity);\n\t\t\t}\n\n\t\t\tpmw.storeCartData(pmwDataLayer.cart);\n\n\t\t} catch (e) {\n\t\t\tconsole.error(e);\n\n\t\t\t// fallback if pmwDataLayer.cart and pmwDataLayer.products got out of sync in case cart caching has an issue\n\t\t\tpmw.getCartItemsFromBackend();\n\t\t}\n\t};\n\n\tpmw.initCart = () => {\n\n\t\t// If the WC cart doesn't exist, eg. after a confirmed purchase,\n\t\t// and we still have a cart object in the storage, reset it.\n\t\tif (\n\t\t\t!pmw.doesWooCommerceCartExist()\n\t\t\t&& Object.keys(pmw.retrieveCartData()).length !== 0\n\t\t) {\n\t\t\tpmw.storeCartData({});\n\t\t\treturn;\n\t\t}\n\n\t\t// If the cart object is in the storage, use it\n\t\tif (pmw.retrieveCartData()) {\n\t\t\tpmw.saveCartObjectToDataLayer(pmw.retrieveCartData());\n\t\t\treturn;\n\t\t}\n\n\t\t// If the cart object is missing in the storage, create an empty one and get the cart items from the backend\n\t\tpmw.storeCartData({});\n\t\tpmw.getCartItemsFromBackend();\n\t};\n\n\t// get all cart items from the backend\n\tpmw.getCartItemsFromBackend = () => {\n\t\ttry {\n\n\t\t\t/**\n\t\t\t * Can't use a REST API endpoint, as the cart session will not be loaded if the\n\t\t\t * endpoint is called.\n\t\t\t *\n\t\t\t * https://wordpress.org/support/topic/wc-cart-is-null-in-custom-rest-api/#post-11442843\n\t\t\t */\n\n\t\t\t/**\n\t\t\t * Get the cart items from the backend the data object using fetch API\n\t\t\t * and log success or error messages\n\t\t\t * and url encoded data\n\t\t\t */\n\t\t\tfetch(pmw.ajax_url, {\n\t\t\t\tmethod : \"POST\",\n\t\t\t\tcache : \"no-cache\",\n\t\t\t\tbody : new URLSearchParams({action: \"pmw_get_cart_items\"}),\n\t\t\t\tkeepalive: true,\n\t\t\t\tredirect : \"error\",\n\t\t\t})\n\t\t\t\t.then(response => {\n\t\t\t\t\tif (response.ok) {\n\t\t\t\t\t\treturn response.json();\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthrow Error(\"Error getting cart items from backend\");\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t\t.then(data => {\n\n\t\t\t\t\tif (data.success) {\n\n\t\t\t\t\t\tif (!data.data[\"cart\"]) data.data[\"cart\"] = {};\n\t\t\t\t\t\tpmw.saveCartObjectToDataLayer(data.data[\"cart\"]);\n\t\t\t\t\t\tpmw.storeCartData(data.data[\"cart\"]);\n\n\t\t\t\t\t\t// Save cart_item_keys from AJAX response for remove_from_cart tracking\n\t\t\t\t\t\t// This provides fallback when inline scripts are suppressed via pmw_output_cart_item_data filter\n\t\t\t\t\t\tif (data.data[\"cart_item_keys\"]) {\n\t\t\t\t\t\t\tpmwDataLayer.cart_item_keys = Object.assign(\n\t\t\t\t\t\t\t\tpmwDataLayer.cart_item_keys || {},\n\t\t\t\t\t\t\t\tdata.data[\"cart_item_keys\"]\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthrow Error(\"Error getting cart items from backend\");\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t} catch (e) {\n\t\t\tconsole.error(e);\n\t\t}\n\t};\n\n\t// Get product IDs from the backend\n\tpmw.getProductsFromBackend = async productIds => {\n\n\t\tif (pmwDataLayer?.products) {\n\t\t\t// If productIds already exists as key in pmwDataLayer.products, remove it from the array\n\t\t\tproductIds = productIds.filter(productId => !(productId in pmwDataLayer.products));\n\t\t}\n\n\t\t// If no product IDs are in the object, don't try to get anything from the server\n\t\tif (!productIds || productIds.length === 0) return;\n\n\t\t// if no page_id is set, don't try to get anything from the server\n\t\tif (!pmwDataLayer.general.page_id) return;\n\n\t\t// if productIds is not an array, or it's an empty array, don't try to get anything from the server\n\t\tif (!Array.isArray(productIds) || productIds.length === 0) return;\n\n\t\ttry {\n\n\t\t\tlet data = {\n\t\t\t\taction : \"pmw_get_product_ids\", // for the AJAX call\n\t\t\t\tpage_id : pmwDataLayer.general.page_id,\n\t\t\t\tpage_type : pmwDataLayer.shop.page_type,\n\t\t\t\tproduct_ids: productIds,\n\t\t\t};\n\n\t\t\tconst isRestEndpointAvailable = await pmw.isRestEndpointAvailable();\n\t\t\tconst url = isRestEndpointAvailable ? pmw.root + \"pmw/v1/products/\" : pmw.ajax_url;\n\n\t\t\tconst options = {\n\t\t\t\tmethod: \"POST\",\n\t\t\t\tcache : \"no-cache\",\n\t\t\t\tbody : isRestEndpointAvailable ? JSON.stringify(data) : new URLSearchParams(data),\n\t\t\t};\n\n\t\t\t// If the REST API is available, set the headers to JSON\n\t\t\tif (isRestEndpointAvailable) {\n\t\t\t\toptions.headers = {\"Content-Type\": \"application/json\"};\n\t\t\t}\n\n\t\t\tlet response = await fetch(url, options);\n\n\t\t\tif (!response.ok) {\n\t\t\t\tthrow new Error(\"Error getting products from backend. Status: \" + response.status + \" Status text: \" + response.statusText);\n\t\t\t}\n\n\t\t\tlet responseData = await response.json();\n\n\t\t\tif (!responseData.success) {\n\t\t\t\tthrow new Error(\"Error getting products from backend: \" + responseData.data);\n\t\t\t}\n\n\t\t\tpmwDataLayer.products = Object.assign({}, pmwDataLayer.products, responseData.data);\n\n\t\t} catch (e) {\n\t\t\tconsole.error(e);\n\t\t}\n\n\t\treturn true;\n\t};\n\n\tpmw.saveCartObjectToDataLayer = cartObject => {\n\n\t\tpmwDataLayer.cart = cartObject;\n\t\tpmwDataLayer.products = Object.assign({}, pmwDataLayer.products, cartObject);\n\t};\n\n\tpmw.triggerViewItemEventPrep = async productId => {\n\n\t\tif (!pmwDataLayer?.products[productId]) {\n\t\t\tawait pmw.getProductsFromBackend([productId]);\n\t\t}\n\n\t\tif (!pmwDataLayer?.products[productId]) {\n\t\t\tpmw.triggerViewItemEventNoProduct();\n\t\t\tpmw.console.log(`Product with ID ${productId} not found in the data layer and couldn't be retrieved from the backend. Triggering view-item event without product data.`);\n\t\t} else {\n\t\t\tpmw.triggerViewItemEvent(productId);\n\t\t}\n\t};\n\n\tpmw.triggerViewItemEvent = productId => {\n\n\t\tlet product = pmw.getProductDetailsFormattedForEvent(productId);\n\n\t\tif (!product) return;\n\n\t\tjQuery(document).trigger(\"pmw:view-item\", product);\n\t};\n\n\tpmw.triggerViewItemEventNoProduct = () => {\n\t\tjQuery(document).trigger(\"pmw:view-item\");\n\t};\n\n\tpmw.fireCheckoutOption = (step, checkout_option = null, value = null) => {\n\n\t\tlet data = {\n\t\t\tstep : step,\n\t\t\tcheckout_option: checkout_option,\n\t\t\tvalue : value,\n\t\t};\n\n\t\tjQuery(document).trigger(\"pmw:checkout-option\", data);\n\t};\n\n\tpmw.fireCheckoutProgress = step => {\n\n\t\tlet data = {\n\t\t\tstep: step,\n\t\t};\n\n\t\tjQuery(document).trigger(\"pmw:checkout-progress\", data);\n\t};\n\n\tpmw.getPostIdFromString = string => {\n\n\t\ttry {\n\t\t\treturn string.match(/(post-)(\\d+)/)[2];\n\t\t} catch (e) {\n\t\t\tconsole.error(e);\n\t\t}\n\t};\n\n\tpmw.triggerViewItemList = productId => {\n\n\t\tif (!productId) throw Error(\"Wasn't able to retrieve a productId\");\n\n\t\tproductId = pmw.getIdBasedOndVariationsOutputSetting(productId);\n\n\t\tif (!productId) throw Error(\"Wasn't able to retrieve a productId\");\n\n\t\tjQuery(document).trigger(\"pmw:view-item-list\", pmw.getProductDataForViewItemEvent(productId));\n\t};\n\n\tpmw.getProductDataForViewItemEvent = productId => {\n\n\t\tif (!productId) throw Error(\"Wasn't able to retrieve a productId\");\n\n\t\ttry {\n\t\t\tif (pmwDataLayer.products[productId]) {\n\n\t\t\t\treturn pmw.getProductDetailsFormattedForEvent(productId);\n\t\t\t}\n\t\t} catch (e) {\n\t\t\tconsole.error(e);\n\t\t}\n\t};\n\n\tpmw.getMainProductIdFromProductPage = () => {\n\n\t\ttry {\n\t\t\tif ([\"simple\", \"variable\", \"grouped\", \"composite\", \"bundle\"].indexOf(pmwDataLayer.shop.product_type) >= 0) {\n\t\t\t\treturn jQuery(\".pmwProductId:first\").data(\"id\");\n\t\t\t} else {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t} catch (e) {\n\t\t\tconsole.error(e);\n\t\t}\n\t};\n\n\tpmw.viewItemListTriggerTestMode = target => {\n\n\t\tjQuery(target).css({\"position\": \"relative\"});\n\t\tjQuery(target).append(\"<div id=\\\"viewItemListTriggerOverlay\\\"></div>\");\n\t\tjQuery(target).find(\"#viewItemListTriggerOverlay\").css({\n\t\t\t\"z-index\" : \"10\",\n\t\t\t\"display\" : \"block\",\n\t\t\t\"position\" : \"absolute\",\n\t\t\t\"height\" : \"100%\",\n\t\t\t\"top\" : \"0\",\n\t\t\t\"left\" : \"0\",\n\t\t\t\"right\" : \"0\",\n\t\t\t\"opacity\" : pmwDataLayer.shop.view_item_list_trigger.opacity,\n\t\t\t\"background-color\": pmwDataLayer.shop.view_item_list_trigger.background_color,\n\t\t});\n\t};\n\n\tpmw.getSearchTermFromUrl = () => {\n\n\t\ttry {\n\t\t\tlet urlParameters = new URLSearchParams(window.location.search);\n\t\t\treturn urlParameters.get(\"s\");\n\t\t} catch (e) {\n\t\t\tconsole.error(e);\n\t\t}\n\t};\n\n\t// we need this to track timeouts for intersection observers\n\tlet ioTimeouts = {};\n\n\tpmw.observerCallback = (entries, observer) => {\n\n\t\tentries.forEach((entry) => {\n\n\t\t\ttry {\n\t\t\t\tlet productId;\n\n\t\t\t\tlet elementId = jQuery(entry.target).data(\"ioid\");\n\n\t\t\t\t// Get the productId from next element, if wpmProductId is a sibling, like in Gutenberg blocks\n\t\t\t\t// otherwise go search in children, like in regular WC loop items\n\t\t\t\tif (jQuery(entry.target).next(\".pmwProductId\").length) {\n\t\t\t\t\t// console.log('test 1');\n\t\t\t\t\tproductId = jQuery(entry.target).next(\".pmwProductId\").data(\"id\");\n\t\t\t\t} else {\n\t\t\t\t\tproductId = jQuery(entry.target).find(\".pmwProductId\").data(\"id\");\n\t\t\t\t}\n\n\n\t\t\t\tif (!productId) throw Error(\"pmwProductId element not found\");\n\n\t\t\t\tif (entry.isIntersecting) {\n\n\t\t\t\t\tioTimeouts[elementId] = setTimeout(() => {\n\n\t\t\t\t\t\tpmw.triggerViewItemList(productId);\n\t\t\t\t\t\tif (pmwDataLayer.shop.view_item_list_trigger.test_mode) pmw.viewItemListTriggerTestMode(entry.target);\n\t\t\t\t\t\tif (pmwDataLayer.shop.view_item_list_trigger.repeat === false) observer.unobserve(entry.target);\n\t\t\t\t\t}, pmwDataLayer.shop.view_item_list_trigger.timeout);\n\n\t\t\t\t} else {\n\n\t\t\t\t\tclearTimeout(ioTimeouts[elementId]);\n\t\t\t\t\tif (pmwDataLayer.shop.view_item_list_trigger.test_mode) jQuery(entry.target).find(\"#viewItemListTriggerOverlay\").remove();\n\t\t\t\t}\n\t\t\t} catch (e) {\n\t\t\t\tconsole.error(e);\n\t\t\t}\n\t\t});\n\t};\n\n\t// fire view_item_list only on products that have become visible\n\tlet io;\n\tlet ioid = 0;\n\n\tconst getCommonIdentifiersToWatch = () => {\n\n\t\tlet listOfClassNames = {\n\t\t\tnested: [],\n\t\t\tflat : [],\n\t\t};\n\n\t\ttry {\n\n\t\t\tconst haveSameNestingDepth = (element1, element2) => {\n\n\t\t\t\t// If both are the same, return the parent\n\t\t\t\treturn jQuery(element1).parents().length === jQuery(element2).parents().length;\n\t\t\t};\n\n\t\t\tconst findCommonParentElement = (element1, element2) => {\n\t\t\t\t// If both are the same, return the parent\n\t\t\t\tif (jQuery(element1).parent().is(jQuery(element2).parent())) {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tnode: jQuery(element1).parent(),\n\t\t\t\t\t\ttype: \"flat\",\n\t\t\t\t\t};\n\t\t\t\t}\n\n\t\t\t\treturn {\n\t\t\t\t\tnode: jQuery(element1).parents().has(jQuery(element2).parents()).first(),\n\t\t\t\t\ttype: \"nested\",\n\t\t\t\t};\n\t\t\t};\n\n\t\t\tconst countOfChildren = (element) => {\n\t\t\t\t// Return the count of \"wpmProductId\" elements\n\t\t\t\treturn jQuery(element).find(\".pmwProductId\").length;\n\t\t\t};\n\n\t\t\tconst getCommonClass = (classes1, classes2) => {\n\n\t\t\t\t// console.log(\"classes1\", classes1);\n\t\t\t\t// console.log(\"classes2\", classes2);\n\t\t\t\t// classes 1 and 2 are arrays of classes\n\t\t\t\t// They may contain the same classes, but not in the same order\n\t\t\t\t// Return the first common class that's present in both arrays\n\n\t\t\t\treturn classes1.filter(value => classes2.includes(value))[0] || null;\n\t\t\t};\n\n\t\t\tconst pmwProductIds = document.querySelectorAll(\".pmwProductId\");\n\n\t\t\t// If zero or only one product template is found, then we can't run the algorithm\n\t\t\tif (pmwProductIds.length === 1) {\n\t\t\t\t// console.log(\"No product or too few templates found\")\n\t\t\t\treturn listOfClassNames;\n\t\t\t}\n\n\t\t\t// console.log(\"wpmProductIds\", wpmProductIds);\n\t\t\t// console.log(\"looping\")\n\n\t\t\tfor (let i = 0; i < pmwProductIds.length - 1; i++) {\n\n\t\t\t\t// console.log(\"i\", i)\n\n\t\t\t\tif (!haveSameNestingDepth(pmwProductIds[i], pmwProductIds[i + 1])) {\n\t\t\t\t\t// console.log(\"The nesting depth is not the same\")\n\t\t\t\t\ti++;\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tlet productsNode = findCommonParentElement(pmwProductIds[i], pmwProductIds[i + 1]);\n\t\t\t\t// console.log(\"productsNode.node\", productsNode.node)\n\t\t\t\t// console.log(\"productsNode.type\", productsNode.type)\n\n\t\t\t\t// If the productsNode is nested, get the first class of the first child. Then console log the class\n\t\t\t\tif (productsNode.type === \"nested\") {\n\n\t\t\t\t\tlet firstChildClassAttr = productsNode.node.children().first().attr(\"class\");\n\t\t\t\t\tlet firstChildClasses = firstChildClassAttr ? firstChildClassAttr.split(\" \") : [];\n\n\t\t\t\t\tlet secondChildClassAttr = productsNode.node.children().first().next().attr(\"class\");\n\t\t\t\t\tlet secondChildClasses = secondChildClassAttr ? secondChildClassAttr.split(\" \") : [];\n\n\t\t\t\t\tconst commonClass = getCommonClass(firstChildClasses, secondChildClasses);\n\n\t\t\t\t\tlistOfClassNames.nested.push(commonClass);\n\t\t\t\t} else if (productsNode.type === \"flat\") {\n\n\t\t\t\t\t// If class is not found, continue\n\t\t\t\t\tif (!productsNode.node.children().first().attr(\"class\")) continue;\n\n\t\t\t\t\t// firstProductTemplateClasses is the classes of the first child element of the productsNode\n\t\t\t\t\tlet firstProductTemplateClasses = productsNode.node.children().first().attr(\"class\").split(\" \")[0];\n\n\t\t\t\t\tlistOfClassNames.flat.push(firstProductTemplateClasses);\n\t\t\t\t}\n\n\t\t\t\t// which wpmProductIds is the last one in the productsNode? console log the index of the last wpmProductId in the productsNode\n\t\t\t\t// console.log(\"productsNode.children().length\", countOfChildren(productsNode));\n\n\t\t\t\ti = i + countOfChildren(productsNode.node) - 1;\n\t\t\t}\n\n\t\t\t// Make the list of class names unique\n\t\t\tlistOfClassNames.nested = [...new Set(listOfClassNames.nested)];\n\t\t\tlistOfClassNames.flat = [...new Set(listOfClassNames.flat)];\n\n\t\t\treturn listOfClassNames;\n\n\t\t} catch (e) {\n\t\t\tconsole.error(e);\n\t\t\treturn listOfClassNames;\n\t\t}\n\t};\n\n\n\tlet detectedProductTemplateClasses = {\n\t\tnested: [],\n\t\tflat : [],\n\t};\n\n\tconst isNestedClass = (elem) => {\n\t\tlet nestedClassNames = [\n\t\t\t\"product\",\n\t\t\t\"type-product\",\n\t\t\t\"product-item-inner\",\n\t\t\t...detectedProductTemplateClasses.nested,\n\t\t];\n\n\t\treturn nestedClassNames.some(className => jQuery(elem).closest(\".\" + className).length);\n\t};\n\n\tconst isFlatClass = (elem) => {\n\n\t\tlet flatClassNames = [\n\t\t\t\"wc-block-grid__product\",\n\t\t\t\"product\",\n\t\t\t\"product-small\",\n\t\t\t\"woocommerce-LoopProduct-link\",\n\t\t\t...detectedProductTemplateClasses.flat,\n\t\t];\n\n\t\treturn flatClassNames.some(className => jQuery(elem).prev().hasClass(className));\n\t};\n\n\tconst getAllElementsToWatch = () => {\n\n\t\tdetectedProductTemplateClasses = getCommonIdentifiersToWatch();\n\n\t\treturn jQuery(\".pmwProductId\")\n\t\t\t.map(function (i, elem) {\n\n\t\t\t\tif (isNestedClass(elem)) {\n\t\t\t\t\treturn jQuery(elem).parent();\n\t\t\t\t} else if (isFlatClass(elem)) {\n\t\t\t\t\treturn jQuery(this).prev();\n\t\t\t\t} else if (jQuery(elem).closest(\".product\").length) {\n\t\t\t\t\treturn jQuery(elem).closest(\".product\");\n\t\t\t\t}\n\t\t\t});\n\t};\n\n\tpmw.startIntersectionObserverToWatch = () => {\n\n\t\ttry {\n\t\t\t// enable view_item_list test mode from browser\n\t\t\tif (pmw.urlHasParameter(\"vildemomode\")) pmwDataLayer.shop.view_item_list_trigger.test_mode = true;\n\n\t\t\t// set up intersection observer\n\t\t\t// https://stackoverflow.com/questions/62084306/intersectionobserver-not-working-in-safari-or-ios\n\t\t\tio = new IntersectionObserver(pmw.observerCallback, {\n\t\t\t\troot: null,\n\t\t\t\t// root : document.body,\n\t\t\t\tthreshold: pmwDataLayer.shop.view_item_list_trigger.threshold,\n\t\t\t});\n\n\t\t\tgetAllElementsToWatch().each((i, elem) => {\n\n\t\t\t\tjQuery(elem[0]).data(\"ioid\", ioid++);\n\n\t\t\t\tio.observe(elem[0]);\n\t\t\t});\n\t\t} catch (e) {\n\t\t\tconsole.error(e);\n\t\t}\n\t};\n\n\t// Watch DOM for new lazy loaded products and add them to the intersection observer\n\tpmw.startProductsMutationObserverToWatch = () => {\n\n\t\ttry {\n\t\t\t// Pass in the target node, as well as the observer options\n\n\t\t\t// selects the most common parent node\n\t\t\t// https://stackoverflow.com/a/7648323/4688612\n\t\t\tlet productsNode = jQuery(\".pmwProductId:eq(0)\").parents().has(jQuery(\".pmwProductId:eq(1)\").parents()).first();\n\n\t\t\tif (productsNode.length) {\n\t\t\t\tproductsMutationObserver.observe(productsNode[0], {\n\t\t\t\t\tattributes : true,\n\t\t\t\t\tchildList : true,\n\t\t\t\t\tcharacterData: true,\n\t\t\t\t});\n\t\t\t}\n\t\t} catch (e) {\n\t\t\tconsole.error(e);\n\t\t}\n\t};\n\n\t// Create an observer instance\n\tconst productsMutationObserver = new MutationObserver(mutations => {\n\n\t\tmutations.forEach(mutation => {\n\t\t\tlet newNodes = mutation.addedNodes; // DOM NodeList\n\t\t\tif (newNodes !== null) { // If there are new nodes added\n\t\t\t\tlet nodes = jQuery(newNodes); // jQuery set\n\t\t\t\tnodes.each((i, node) => {\n\t\t\t\t\tif (\n\t\t\t\t\t\t// jQuery(this).hasClass(\"type-product\") ||\n\t\t\t\t\t\t// jQuery(this).hasClass(\"product-small\") ||\n\t\t\t\t\t\t// jQuery(this).hasClass(\"wc-block-grid__product\")\n\t\t\t\t\t\t// jQuery(this).hasClass(\"type-product\")\n\t\t\t\t\t\tisNestedClass(node) || isFlatClass(node)\n\t\t\t\t\t) {\n\t\t\t\t\t\t// check if the node has a child or sibling wpmProductId\n\t\t\t\t\t\t// if yes add it to the intersectionObserver\n\t\t\t\t\t\tif (hasPmwProductIdElement(node)) {\n\t\t\t\t\t\t\tjQuery(node).data(\"ioid\", ioid++);\n\t\t\t\t\t\t\tio.observe(node);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\t\t});\n\t});\n\n\tlet hasPmwProductIdElement = elem =>\n\t\t!!(jQuery(elem).find(\".pmwProductId\").length ||\n\t\t\tjQuery(elem).siblings(\".pmwProductId\").length);\n\n\t/**\n\t * Sets a new cookie or updates an existing one with the provided name and value.\n\t *\n\t * @function setCookie\n\t * @global\n\t * @param {string} cookieName - The name of the cookie.\n\t * @param {string} [cookieValue=\"\"] - The value to set for the cookie. Default value is an empty string.\n\t * @param {number|null} [expiryDays=null] - The number of days until the cookie expires. If not provided, the cookie will last until the end of the session.\n\t * @returns {void}\n\t *\n\t * @example\n\t * // This will create a cookie \"username\" with the value \"JohnDoe\" that expires in 7 days\n\t * pmw.setCookie(\"username\", \"JohnDoe\", 7);\n\t */\n\tpmw.setCookie = (cookieName, cookieValue = \"\", expiryDays = null) => {\n\n\t\tif (expiryDays) {\n\n\t\t\tlet d = new Date();\n\t\t\td.setTime(d.getTime() + (expiryDays * 24 * 60 * 60 * 1000));\n\t\t\tlet expires = \"expires=\" + d.toUTCString();\n\t\t\tdocument.cookie = cookieName + \"=\" + cookieValue + \";\" + expires + \";path=/\";\n\t\t} else {\n\t\t\tdocument.cookie = cookieName + \"=\" + cookieValue + \";path=/\";\n\t\t}\n\t};\n\n\t/**\n\t * Retrieves the value of a specific cookie from the document's cookie string.\n\t *\n\t * @param {String} cookieName - The name of the cookie to retrieve.\n\t * @returns {String} - The value of the cookie if found, an empty string otherwise.\n\t *\n\t * @example\n\t * // returns 'value' if 'cookieName=value' exists in document.cookie\n\t * pmw.getCookie('cookieName')\n\t */\n\tpmw.getCookie = cookieName => {\n\n\t\tlet name = cookieName + \"=\";\n\t\tlet decodedCookie = decodeURIComponent(document.cookie);\n\t\tlet ca = decodedCookie.split(\";\");\n\n\t\tfor (let i = 0; i < ca.length; i++) {\n\n\t\t\tlet c = ca[i];\n\n\t\t\twhile (c.charAt(0) == \" \") {\n\t\t\t\tc = c.substring(1);\n\t\t\t}\n\n\t\t\tif (c.indexOf(name) == 0) {\n\t\t\t\treturn c.substring(name.length, c.length);\n\t\t\t}\n\t\t}\n\n\t\treturn \"\";\n\t};\n\n\t/**\n\t * Find and get the cookie with a name that contains the string.\n\t * If one is found, then return the cookie.\n\t * If none is found, then return false.\n\t *\n\t * @param string\n\t * @returns {boolean|string}\n\t *\n\t * @since 1.32.5\n\t */\n\tpmw.getCookieThatContainsRegex = (regex) => {\n\n\t\tlet cookies = document.cookie.split(\";\");\n\n\t\tfor (let i = 0; i < cookies.length; i++) {\n\t\t\tlet cookie = cookies[i].trim();\n\n\t\t\tif (regex.test(cookie)) {\n\t\t\t\treturn cookie;\n\t\t\t}\n\t\t}\n\n\t\treturn false;\n\t};\n\n\tpmw.deleteCookie = cookieName => {\n\t\tpmw.setCookie(cookieName, \"\", -1);\n\t};\n\n\t/**\n\t * Store data in the browser\n\t *\n\t * Try to store the data in the local storage (session or persistent) if available.\n\t * If not available, store the data in the cookie.\n\t *\n\t * Max cookie expiry is 400 days as specified by Google Chrome: https://developer.chrome.com/blog/cookie-max-age-expires/\n\t *\n\t * @param key\n\t * @param value\n\t * @param persistent\n\t * @param extension - If true, this will be saved in a separate key\n\t */\n\tpmw.storeData = (key, value, persistent = false, extension = false) => {\n\n\t\tconst suffix = extension ? key : \"\";\n\n\t\tlet dataGetter = persistent ? pmw.getPersistentData : pmw.getSessionData;\n\t\tlet dataSetter = persistent ? pmw.setPersistentData : pmw.setSessionData;\n\n\t\tlet data = dataGetter(suffix);\n\t\textension ? data = value : data[key] = value;\n\n\t\tdataSetter(data, suffix);\n\n\t\t// Broadcast session data changes to other tabs\n\t\tif (!persistent && pmw.crossTabSync && !pmw.crossTabSync.isSyncing()) {\n\t\t\tpmw.crossTabSync.broadcastUpdate(key, value, extension, suffix);\n\t\t}\n\t};\n\n\tpmw.retrieveData = (key, persistent = false, extension = false) => {\n\n\t\tconst suffix = extension ? key : \"\";\n\n\t\tlet data = persistent ? pmw.getPersistentData(suffix) : pmw.getSessionData(suffix);\n\n\t\treturn extension ? data : data[key];\n\t};\n\n\tpmw.deleteDataKey = (key, persistent = false, extension = false) => {\n\n\t\tconst suffix = extension ? key : \"\";\n\n\t\tlet dataGetter = persistent ? pmw.getPersistentData : pmw.getSessionData;\n\t\tlet dataSetter = persistent ? pmw.setPersistentData : pmw.setSessionData;\n\n\t\tlet data = dataGetter(suffix);\n\t\t// extension ? delete data : delete data[key]\n\n\t\tif (extension) {\n\n\t\t\ttry {\n\t\t\t\tif (persistent && window.localStorage) window.localStorage.removeItem(pmw.getPersistentDataKey(suffix));\n\t\t\t\tif (!persistent && window.sessionStorage) window.sessionStorage.removeItem(pmw.getSessionDataKey(suffix));\n\n\t\t\t} catch (e) {\n\t\t\t\tconsole.error(e);\n\t\t\t}\n\n\t\t\treturn;\n\t\t}\n\n\t\tdelete data[key];\n\n\t\tdataSetter(data, suffix);\n\t};\n\n\tpmw.storeCartData = data => {\n\t\tpmw.storeData(\"cart\", data, false, true);\n\t};\n\n\tpmw.retrieveCartData = () => {\n\t\treturn pmw.retrieveData(\"cart\", false, true);\n\t};\n\n\tpmw.getSessionDataKey = (suffix = \"\") => {\n\t\tconst defaultStorageKey = \"_pmw_session_data\";\n\n\t\tif (suffix) {\n\t\t\treturn defaultStorageKey + \"_\" + suffix;\n\t\t}\n\n\t\treturn defaultStorageKey;\n\t};\n\n\tpmw.getPersistentDataKey = (storageKeySuffix) => {\n\n\t\tconst defaultStorageKey = \"_pmw_persistent_data\";\n\n\t\tif (storageKeySuffix) {\n\t\t\treturn defaultStorageKey + \"_\" + storageKeySuffix;\n\t\t}\n\n\t\treturn defaultStorageKey;\n\t};\n\n\tpmw.getSessionData = (suffix = \"\") => {\n\n\t\tif (window.sessionStorage) {\n\n\t\t\tlet data = window.sessionStorage.getItem(pmw.getSessionDataKey(suffix));\n\n\t\t\treturn data !== null ? JSON.parse(data) : {};\n\t\t} else {\n\t\t\t// fallback to cookie\n\t\t\tlet data = pmw.getCookie(pmw.getSessionDataKey(suffix));\n\n\t\t\treturn data !== \"\" ? JSON.parse(data) : {};\n\t\t}\n\t};\n\n\tpmw.setSessionData = (data, storageKeySuffix = \"\") => {\n\t\tif (window.sessionStorage) {\n\t\t\twindow.sessionStorage.setItem(pmw.getSessionDataKey(storageKeySuffix), JSON.stringify(data));\n\t\t} else {\n\t\t\t// fallback to cookie\n\t\t\tpmw.setCookie(pmw.getSessionDataKey(storageKeySuffix), JSON.stringify(data));\n\t\t}\n\t};\n\n\tpmw.getPersistentData = (storageKeySuffix) => {\n\n\t\tif (window.localStorage) {\n\n\t\t\tlet data = window.localStorage.getItem(pmw.getPersistentDataKey(storageKeySuffix));\n\n\t\t\treturn data !== null ? JSON.parse(data) : {};\n\t\t} else {\n\t\t\t// fallback to cookie\n\t\t\tlet data = pmw.getCookie(pmw.getPersistentDataKey(storageKeySuffix));\n\n\t\t\treturn data !== \"\" ? JSON.parse(data) : {};\n\t\t}\n\t};\n\n\tpmw.setPersistentData = (data, storageKeySuffix = \"\") => {\n\n\t\tif (window.localStorage) {\n\t\t\twindow.localStorage.setItem(pmw.getPersistentDataKey(storageKeySuffix), JSON.stringify(data));\n\t\t} else {\n\t\t\t// fallback to cookie\n\t\t\tpmw.setCookie(pmw.getPersistentDataKey(storageKeySuffix), JSON.stringify(data), 400);\n\t\t}\n\t};\n\n\tpmw.storeOrderIdOnServer = async (orderDetails) => {\n\n\t\ttry {\n\n\t\t\tlet response;\n\n\t\t\tif (await pmw.isRestEndpointAvailable()) {\n\n\t\t\t\tresponse = await fetch(pmw.root + \"pmw/v1/pixels-fired/\", {\n\t\t\t\t\tmethod : \"POST\",\n\t\t\t\t\theaders : {\n\t\t\t\t\t\t\"Content-Type\": \"application/json\",\n\t\t\t\t\t\t// \"X-WP-Nonce\" : pmw.nonce_wp_rest,\n\t\t\t\t\t},\n\t\t\t\t\tbody : JSON.stringify({\n\t\t\t\t\t\torder_id : orderDetails.orderId,\n\t\t\t\t\t\torder_key: orderDetails.orderKey,\n\t\t\t\t\t\tsource : orderDetails.source,\n\t\t\t\t\t\t// nonce : pmw.pmw_nonce,\n\t\t\t\t\t}),\n\t\t\t\t\tkeepalive: true,\n\t\t\t\t\tcache : \"no-cache\",\n\t\t\t\t\tredirect : \"error\",\n\t\t\t\t});\n\n\t\t\t} else {\n\n\t\t\t\tpmw.console.log(\"REST API not available, falling back to AJAX\");\n\n\t\t\t\t// save the state in the database\n\n\t\t\t\t// Send the data object with ajax request\n\t\t\t\t// and log success or error using fetch API and url encoded\n\t\t\t\tresponse = await fetch(pmw.ajax_url, {\n\t\t\t\t\tmethod : \"POST\",\n\t\t\t\t\tbody : new URLSearchParams({\n\t\t\t\t\t\taction : \"pmw_purchase_pixels_fired\",\n\t\t\t\t\t\torder_id : orderDetails.orderId,\n\t\t\t\t\t\torder_key: orderDetails.orderKey,\n\t\t\t\t\t\tsource : orderDetails.source,\n\t\t\t\t\t\t// nonce_ajax: pmw.nonce_ajax,\n\t\t\t\t\t}),\n\t\t\t\t\tkeepalive: true,\n\t\t\t\t\tredirect : \"error\",\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tconst responseJson = await response.json();\n\n\t\t\tif (responseJson.success) {\n\t\t\t\tpmw.console.log(\"\", responseJson.data);\n\t\t\t} else {\n\t\t\t\tpmw.console.error(\"\", responseJson.data);\n\t\t\t}\n\n\t\t} catch (e) {\n\t\t\tconsole.error(e);\n\t\t}\n\t};\n\n\tpmw.getProductIdByCartItemElement = element => {\n\n\t\tconst href = jQuery(element).find(\".product-remove\").find(\"a\").attr(\"href\");\n\t\tif (href) return pmw.getProductIdByCartItemKeyUrl(new URL(href));\n\n\t\tconst productId = jQuery(element).find(\"[data-product_id]\").first().attr(\"data-product_id\");\n\t\treturn productId ? productId : null;\n\t};\n\n\tpmw.getProductQuantityByCartItemElement = element => {\n\n\t\treturn jQuery(element).find(\".qty\").val() || null;\n\t};\n\n\tpmw.getProductIdByCartItemKeyUrl = url => {\n\n\t\tlet searchParams = new URLSearchParams(url.search);\n\t\tlet cartItemKey = searchParams.get(\"remove_item\");\n\n\t\tlet productId;\n\n\t\tif (pmwDataLayer.cart_item_keys[cartItemKey][\"variation_id\"] === 0) {\n\t\t\tproductId = pmwDataLayer.cart_item_keys[cartItemKey][\"product_id\"];\n\t\t} else {\n\t\t\tproductId = pmwDataLayer.cart_item_keys[cartItemKey][\"variation_id\"];\n\t\t}\n\n\t\treturn productId;\n\t};\n\n\tpmw.getAddToCartLinkProductIds = () =>\n\t\tjQuery(\"a\").map(function () {\n\t\t\tlet href = jQuery(this).attr(\"href\");\n\n\t\t\tif (href && href.includes(\"?add-to-cart=\")) {\n\t\t\t\tlet matches = href.match(/(add-to-cart=)(\\d+)/);\n\t\t\t\tif (matches) return matches[2];\n\t\t\t}\n\t\t}).get();\n\n\tpmw.getProductDetailsFormattedForEvent = (productId, quantity = 1) => {\n\n\t\t// If pmwDataLayer.products[productId] doesn't exist, return an empty object\n\t\tif (!pmwDataLayer.products[productId]) return null;\n\n\t\tlet product = {\n\t\t\tid : productId.toString(),\n\t\t\tdyn_r_ids : pmwDataLayer.products[productId].dyn_r_ids,\n\t\t\tname : pmwDataLayer.products[productId].name,\n\t\t\tlist_name : pmwDataLayer.shop.list_name,\n\t\t\tbrand : pmwDataLayer.products[productId].brand,\n\t\t\tcategory : pmwDataLayer.products[productId].category,\n\t\t\tvariant : pmwDataLayer.products[productId].variant,\n\t\t\tlist_position: pmwDataLayer.products[productId].position,\n\t\t\tquantity : quantity,\n\t\t\tprice : pmwDataLayer.products[productId].price,\n\t\t\tcurrency : pmwDataLayer.shop.currency,\n\t\t\tis_variable : pmwDataLayer.products[productId].is_variable,\n\t\t\tis_variation : pmwDataLayer.products[productId].is_variation,\n\t\t\tparent_id : pmwDataLayer.products[productId].parent_id,\n\t\t};\n\n\t\tif (product.is_variation) product[\"parent_id_dyn_r_ids\"] = pmwDataLayer.products[productId].parent_id_dyn_r_ids;\n\n\t\treturn product;\n\t};\n\n\tpmw.getClidFromBrowser = (clidId = \"gclid\") => {\n\n\t\tlet clidCookieId;\n\n\t\tclidCookieId = {\n\t\t\tgclid: \"_gcl_aw\",\n\t\t\tdclid: \"_gcl_dc\",\n\t\t};\n\n\t\tif (pmw.getCookie(clidCookieId[clidId])) {\n\n\t\t\tlet clidCookie = pmw.getCookie(clidCookieId[clidId]);\n\t\t\tlet matches = clidCookie.match(/(GCL.[\\d]*.)(.*)/);\n\t\t\treturn matches[2];\n\t\t} else {\n\t\t\treturn \"\";\n\t\t}\n\t};\n\n\tpmw.getUserAgent = () => navigator.userAgent;\n\n\tpmw.getViewPort = () => ({\n\t\twidth : Math.max(document.documentElement.clientWidth || 0, window.innerWidth || 0),\n\t\theight: Math.max(document.documentElement.clientHeight || 0, window.innerHeight || 0),\n\t});\n\n\n\tpmw.consoleLogVersion = () => {\n\t\tconsole.log(pmwDataLayer.version);\n\t};\n\n\t/**\n\t * Loads a script and caches it using native browser caching.\n\t *\n\t * Uses script tag injection which:\n\t * - Leverages browser's HTTP cache (respects Cache-Control headers)\n\t * - Avoids CORS preflight issues (no custom headers sent)\n\t * - Auto-executes the script on load\n\t * - Prevents duplicate script loading\n\t *\n\t * This code is .thenable\n\t */\n\n\tconst loadedScripts = new Set();\n\n\tpmw.loadScriptAndCacheIt = (url, fallbackUrl) => {\n\n\t\t// Return resolved promise if script already loaded\n\t\tif (loadedScripts.has(url)) {\n\t\t\tpmw.console.log(\"Script already loaded: \" + url);\n\t\t\treturn Promise.resolve();\n\t\t}\n\n\t\tconst loadScript = (scriptUrl) => {\n\t\t\treturn new Promise((resolve, reject) => {\n\n\t\t\t\t// Check if script tag already exists in DOM\n\t\t\t\tif (document.querySelector(`script[src=\"${scriptUrl}\"]`)) {\n\t\t\t\t\tloadedScripts.add(scriptUrl);\n\t\t\t\t\tpmw.console.log(\"Script tag already exists: \" + scriptUrl);\n\t\t\t\t\tresolve();\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tconst script = document.createElement(\"script\");\n\t\t\t\tscript.src = scriptUrl;\n\t\t\t\tscript.async = true;\n\t\t\t\tscript.crossOrigin = \"anonymous\"; // Enables CORS without sending credentials, avoids preflight issues\n\n\t\t\t\tscript.onload = () => {\n\t\t\t\t\tloadedScripts.add(scriptUrl);\n\t\t\t\t\tpmw.console.log(\"Successfully loaded script: \" + scriptUrl);\n\t\t\t\t\tresolve();\n\t\t\t\t};\n\n\t\t\t\tscript.onerror = () => {\n\t\t\t\t\tscript.remove(); // Clean up failed script tag\n\t\t\t\t\treject(new Error(\"Script failed to load: \" + scriptUrl));\n\t\t\t\t};\n\n\t\t\t\tdocument.head.appendChild(script);\n\t\t\t});\n\t\t};\n\n\t\treturn loadScript(url)\n\t\t\t.catch(() => {\n\t\t\t\tif (fallbackUrl) {\n\t\t\t\t\tpmw.console.log(\"Primary script failed, loading fallback: \" + fallbackUrl);\n\t\t\t\t\treturn loadScript(fallbackUrl);\n\t\t\t\t}\n\t\t\t\tthrow new Error(\"Primary script failed to load, and no fallback URL provided.\");\n\t\t\t})\n\t\t\t.catch((error) => {\n\t\t\t\tif (error.message.includes(\"fallback\")) {\n\t\t\t\t\tthrow error; // Re-throw if it's already the \"no fallback\" error\n\t\t\t\t}\n\t\t\t\tthrow new Error(\"Both primary and fallback scripts failed to load.\");\n\t\t\t});\n\t};\n\n\tpmw.getOrderItemPrice = orderItem => (orderItem.total + orderItem.total_tax) / orderItem.quantity;\n\n\tpmw.hasLoginEventFired = () => {\n\t\tlet data = pmw.getSessionData();\n\t\treturn data?.loginEventFired;\n\t};\n\n\tpmw.setLoginEventFired = () => {\n\t\tlet data = pmw.getSessionData();\n\t\tdata[\"loginEventFired\"] = true;\n\t\tpmw.setSessionData(data);\n\t};\n\n\tpmw.hasAccountCreatedEventFired = () => {\n\t\tlet data = pmw.getSessionData();\n\t\treturn data?.accountCreatedEventFired;\n\t};\n\n\tpmw.setAccountCreatedEventFired = () => {\n\t\tlet data = pmw.getSessionData();\n\t\tdata[\"accountCreatedEventFired\"] = true;\n\t\tpmw.setSessionData(data);\n\t};\n\n\tpmw.pageLoaded = async () => new Promise(resolve => {\n\t\t(function waitForVar() {\n\t\t\tif (\"complete\" === document.readyState) return resolve();\n\t\t\tsetTimeout(waitForVar, 50);\n\t\t})();\n\t});\n\n\tpmw.pageReady = () => {\n\t\treturn new Promise(resolve => {\n\t\t\t(function waitForVar() {\n\t\t\t\tif (\"interactive\" === document.readyState || \"complete\" === document.readyState) return resolve();\n\t\t\t\tsetTimeout(waitForVar, 50);\n\t\t\t})();\n\t\t});\n\t};\n\n\tpmw.isMiniCartActive = () => {\n\t\tif (window.sessionStorage) {\n\t\t\tObject.keys(window.sessionStorage).forEach(key => {\n\t\t\t\tif (key.includes(\"wc_fragments\")) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\n\t\treturn false;\n\t};\n\n\tpmw.doesWooCommerceCartExist = () => document.cookie.includes(\"woocommerce_items_in_cart\");\n\n\tpmw.urlHasParameter = parameter => {\n\t\tlet urlParams = new URLSearchParams(window.location.search);\n\t\treturn urlParams.has(parameter);\n\t};\n\n\tpmw.getUrlParameter = parameter => {\n\t\tlet urlParams = new URLSearchParams(window.location.search);\n\t\treturn urlParams.get(parameter);\n\t};\n\n\t// https://stackoverflow.com/a/60606893/4688612\n\tpmw.hashAsync = (algo, str) => {\n\t\treturn crypto.subtle.digest(algo, new TextEncoder(\"utf-8\").encode(str)).then(buf => {\n\t\t\treturn Array.prototype.map.call(new Uint8Array(buf), x => ((\"00\" + x.toString(16)).slice(-2))).join(\"\");\n\t\t});\n\t};\n\n\tpmw.getCartValue = () => {\n\n\t\tlet value = 0;\n\n\t\tif (pmwDataLayer?.cart) {\n\n\t\t\tfor (const key in pmwDataLayer.cart) {\n\t\t\t\t// content_ids.push(pmwDataLayer.products[key].dyn_r_ids[pmwDataLayer.pixels.facebook.dynamic_remarketing.id_type])\n\n\t\t\t\tlet product = pmwDataLayer.cart[key];\n\n\t\t\t\tvalue += product.quantity * product.price;\n\t\t\t}\n\t\t}\n\n\t\treturn value;\n\t};\n\n\t/**\n\t * Detect if the current URL contains at least one pattern\n\t *\n\t * @param patterns\n\t * @returns {boolean}\n\t */\n\tpmw.doesUrlContainPatterns = patterns => {\n\n\t\tfor (const pattern of patterns) {\n\t\t\tif (new RegExp(pattern).test(window.location.href)) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\n\t\treturn false;\n\t};\n\n\t/**\n\t * Detect if the current URL contains at least one pattern that is on the tracking exclusion list\n\t *\n\t * https://www.linkedin.com/pulse/how-remove-google-robot-problem-via-gtm-facebook-pixel-hjelpdahl/\n\t * https://www.youtube.com/watch?v=b4I1ePZt8Z0\n\t *\n\t * @returns {boolean}\n\t */\n\tpmw.excludeDomainFromTracking = () => {\n\n\t\tlet exclude_domains = [\n\t\t\t\"appspot.com\",\n\t\t\t\"translate.google.com\",\n\t\t];\n\n\t\tif (pmwDataLayer?.general?.exclude_domains) {\n\t\t\texclude_domains = [...exclude_domains, ...pmwDataLayer.general.exclude_domains];\n\t\t}\n\n\t\t// Abort if URL contains excluded domains\n\t\tif (exclude_domains.some(domain => window.location.href.includes(domain))) {\n\t\t\tconsole.debug(\"Pixel Manager: Aborted due to excluded domain\");\n\t\t\treturn true;\n\t\t}\n\n\t\treturn false;\n\t};\n\n\t/**\n\t * Get a random event ID\n\t *\n\t * @param length\n\t * @return {string}\n\t */\n\tpmw.getRandomEventId = (length = 16) => {\n\t\tlet id = \"\";\n\t\twhile (id.length < length) {\n\t\t\tid += (Math.random() + 1).toString(36).substring(2);\n\t\t}\n\t\treturn id.substring(0, length);\n\t};\n\n\tpmw.pmwConsoleMessage = () => {\n\t\tlet message = \"Pixel Manager for WooCommerce: \";\n\t\tmessage += pmwDataLayer.version.pro ? \"pro\" : \"free\";\n\t\tmessage += \" | distro: \" + pmwDataLayer.version.distro;\n\t\tif (pmwDataLayer.version.distro === \"fms\" && pmwDataLayer.version.pro) {\n\t\t\tmessage += \" | active license: \" + (pmwDataLayer.version.eligible_for_updates ? \"yes\" : \"no\");\n\t\t}\n\t\tmessage += \" | version: \" + pmwDataLayer.version.number;\n\n\t\tif (pmwDataLayer.version.show === true) {\n\t\t\tconsole.log(message);\n\t\t} else {\n\t\t\tpmw.console.log(message);\n\t\t}\n\t};\n\n\tpmw.canLoadPremiumFeatures = () => {\n\t\treturn (pmwDataLayer.version.distro === \"fms\" && pmwDataLayer.version.pro && pmwDataLayer.version.eligible_for_updates) || pmwDataLayer.version.distro === \"wcm\";\n\t};\n\n\t/**\n\t * State if the pmw:dom:ready event has been fired\n\t *\n\t * @type {boolean}\n\t */\n\tlet pmwDomReadyFired = false;\n\n\n\t/**\n\t * Trigger the pmw:dom:ready event\n\t *\n\t * @returns {void}\n\t */\n\tpmw.triggerPmwDomReadyEvent = () => {\n\n\t\t// If the event has already been fired, return\n\t\tif (pmwDomReadyFired) return;\n\n\t\t// If the document is already loaded, fire the event\n\t\tif (document.readyState === \"complete\") {\n\t\t\tfirePmwDomReadyEvent();\n\t\t\treturn;\n\t\t}\n\n\t\t// Continue processing if the DOM has not yet been loaded\n\t\t// and attach the event listener to the DOMContentLoaded,\n\t\t// once through jQuery and once through the native DOM API\n\t\t// to maximize compatibility\n\n\t\t// If jQuery is available, use it to fire add the event listener\n\t\tjQuery(() => {\n\t\t\tfirePmwDomReadyEvent();\n\t\t});\n\n\t\t// Also add the event listener using the native DOM API\n\t\tdocument.addEventListener(\"DOMContentLoaded\", () => {\n\t\t\tfirePmwDomReadyEvent();\n\t\t}, true);\n\t};\n\n\t/**\n\t * Fire the pmw:dom:ready event\n\t *\n\t * @returns {void}\n\t */\n\tconst firePmwDomReadyEvent = () => {\n\n\t\t// If the event has already been fired, return\n\t\tif (pmwDomReadyFired) return;\n\n\t\t// Fire the event\n\t\tdocument.dispatchEvent(new Event(\"pmw:dom:ready\"));\n\n\t\t// Set the flag to true to indicate that the event has been fired\n\t\tpmwDomReadyFired = true;\n\t};\n\n\tpmw.getEmailFromTarget = target => {\n\n\t\t// Only try to add the clicked email if href is set\n\t\tif (target.href) {\n\n\t\t\t// Get the email from the link\n\t\t\t// But only if there is a valid email address in the link\n\t\t\t// Also, the href may contain other parameters, so we need to check for that and remove them\n\t\t\tlet email = target.href.replace(\"mailto:\", \"\");\n\n\n\t\t\tif (email.indexOf(\"?\") > -1) {\n\t\t\t\temail = email.split(\"?\")[0];\n\t\t\t}\n\n\t\t\t// Trim the email and remove all whitespaces\n\t\t\temail = email.replace(/\\s/g, \"\");\n\n\t\t\t// If the email is not empty and valid, add it to the data object\n\t\t\tif (email && pmw.isEmail(email)) {\n\t\t\t\treturn email;\n\t\t\t}\n\t\t}\n\n\t\treturn \"\";\n\t};\n\n\tpmw.sendEventPayloadToServer = payload => {\n\t\tif (typeof pmw.sendEventPayloadToServerPremium === \"function\") {\n\t\t\tpmw.sendEventPayloadToServerPremium(payload);\n\t\t}\n\t};\n\n\t/**\n\t * Waits for all active pixels to load and then triggers the page view event.\n\t *\n\t * @return {Promise<unknown>}\n\t *\n\t * @since 1.49.0\n\t */\n\tpmw.waitForPixelsAndTriggerPageView = async () => {\n\n\t\t// Guard against duplicate page view events (e.g. when consent API re-triggers pmw:load-pixels)\n\t\tif (pmw._pageViewTriggered) {\n\t\t\tpmw.console.log(\"Page view event already triggered, skipping duplicate.\");\n\t\t\treturn Promise.resolve();\n\t\t}\n\t\tpmw._pageViewTriggered = true;\n\n\t\treturn new Promise(resolve => {\n\n\t\t\t// Check if at least one pixel is active in the data layer\n\t\t\tif (!pmwDataLayer?.pixels) {\n\t\t\t\tpmw.console.error(\"pmwDataLayer or pmwDataLayer.pixels is not defined, triggering page view event immediately.\");\n\t\t\t\tdocument.dispatchEvent(new Event(\"pmw:page-view\"));\n\t\t\t\tresolve();\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tlet activePixels = pmwDataLayer?.general?.server_2_server?.pageview_event_s2s?.pixels || [];\n\n\t\t\t// This line filters the activePixels array, keeping only those pixel names that exist as keys\n\t\t\t// in the pmwDataLayer.pixels object (i.e., only pixels that are currently defined/active in the data layer)\n\t\t\tactivePixels = activePixels.filter(pixelName => pmwDataLayer.pixels[pixelName]);\n\n\t\t\t// If no pixels to check, trigger event immediately\n\t\t\tif (activePixels.length === 0) {\n\t\t\t\tpmw.console.log(\"No specific pixels to wait for, triggering page view event.\");\n\t\t\t\tdocument.dispatchEvent(new Event(\"pmw:page-view\"));\n\t\t\t\tresolve();\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Check if all active pixels are loaded\n\t\t\tconst checkPixelsLoaded = () => {\n\t\t\t\tconst allLoaded = activePixels.every(pixelName =>\n\t\t\t\t\t!pmwDataLayer.pixels[pixelName] || pmwDataLayer.pixels[pixelName].loaded);\n\n\t\t\t\tif (allLoaded) {\n\t\t\t\t\t// pmw.console.log(\"All specified pixels to track s2s page-view events have been loaded. Triggering page-view event.\");\n\t\t\t\t\tdocument.dispatchEvent(new Event(\"pmw:page-view\"));\n\t\t\t\t\tresolve();\n\t\t\t\t} else {\n\t\t\t\t\tsetTimeout(checkPixelsLoaded, 100);\n\t\t\t\t}\n\t\t\t};\n\n\t\t\tcheckPixelsLoaded();\n\t\t});\n\t};\n\n\tpmw.isWooCommerceActive = () => {\n\t\treturn !!pmwDataLayer.shop;\n\t};\n\n\t/**\n\t * Retrieves the product ID associated with a specific pixel.\n\t *\n\t * @param {string} pixelId - The ID of the pixel to get the product ID for.\n\t * @returns {string|null} - The product ID associated with the given pixel ID,\n\t * or null if no product ID is found.\n\t */\n\tpmw.getProductIdForSpecificPixel = (product, pixelName) => {\n\t\treturn String(product.dyn_r_ids[pmwDataLayer.pixels[pixelName].dynamic_remarketing.id_type]);\n\t};\n\n\tpmw.isInWooCommerceSesssion = () => {\n\n\t\tif (pmwDataLayer?.shop?.session_active) return true;\n\n\t\tlet regex = new RegExp(\"woocommerce_cart_hash\");\n\t\tlet wcSessionCookie = pmw.getCookieThatContainsRegex(regex);\n\n\t\tif (wcSessionCookie) return true;\n\n\t\treturn false;\n\t};\n\n\tpmw.isNotInWooCommerceSesssion = () => {\n\t\treturn !pmw.isInWooCommerceSesssion();\n\t};\n\n\tpmw.makeFullUrl = url => {\n\n\t\t// Trim any leading or trailing whitespace\n\t\turl = url.trim();\n\n\t\t// Check if the URL already contains a protocol\n\t\tif (/^(http:\\/\\/|https:\\/\\/)/.test(url)) {\n\t\t\treturn url;\n\t\t}\n\n\t\t// Remove leading slashes\n\t\turl = url.replace(/^\\/+/, \"\");\n\n\t\t// Add 'https://' as default protocol\n\t\treturn \"https://\" + url;\n\t};\n\n\tpmw.registerShowVariationEventListener = () => {\n\t\tlet previousVariationId = null;\n\n\t\tjQuery(\".single_variation_wrap\").on(\"show_variation\", (event, variation) => {\n\n\t\t\t// Abort if lazy loading is enabled\n\t\t\t// if (pmwDataLayer?.general?.lazy_load_pmw) return;\n\n\t\t\ttry {\n\t\t\t\t// If variations_output is disabled, don't fire view_item events from show_variation\n\t\t\t\t// because the parent product view_item is already triggered on page load\n\t\t\t\tif (!pmwDataLayer?.shop?.variations_output) return;\n\n\t\t\t\tlet productId = pmw.getIdBasedOndVariationsOutputSetting(variation.variation_id);\n\n\t\t\t\tif (!productId) throw Error(\"Wasn't able to retrieve a productId\");\n\n\t\t\t\t// If the variation id is not the same as the previous one, run the function\n\t\t\t\tif (previousVariationId !== variation.variation_id) {\n\t\t\t\t\tpmw.triggerViewItemEventPrep(productId);\n\t\t\t\t\tpreviousVariationId = variation.variation_id;\n\t\t\t\t}\n\n\t\t\t} catch (e) {\n\t\t\t\tconsole.error(e);\n\t\t\t}\n\t\t});\n\t};\n\n\t/**\n\t * Initializes the command queue for the application to ensure that commands\n\t * are queued and executed in a controlled manner. This function sets up\n\t * the underlying mechanism to manage and process commands effectively.\n\t *\n\t * Typically, the command queue is used by external developers\n\t * who want to make sure that their Pixel Manager API calls safely get executed,\n\t * no matter if the initialization order of the Pixel Manager is shuffled,\n\t * delayed, or lazy loaded.\n\t *\n\t * @since 1.49.0\n\t */\n\tpmw.initializeCommandQueue = () => {\n\n\t\tconst queue = window._pmwq = window._pmwq || [];\n\n\t\tqueue.forEach(function (fn) {\n\t\t\tif (typeof fn === \"function\") {\n\t\t\t\ttry {\n\t\t\t\t\tfn();\n\t\t\t\t} catch (e) {\n\t\t\t\t\tpmw.console.error(\"Error executing queued command:\", e);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t\t// Override push to execute commands immediately now that PMW is ready\n\t\tqueue.push = function (fn) {\n\t\t\tif (typeof fn === \"function\") {\n\t\t\t\ttry {\n\t\t\t\t\tfn();\n\t\t\t\t} catch (e) {\n\t\t\t\t\tpmw.console.error(\"Error executing command from queue:\", e);\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t};\n\n}(window.pmw = window.pmw || {}, jQuery));\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n// expose the modules object (__webpack_modules__)\n__webpack_require__.m = __webpack_modules__;\n\n","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.f = {};\n// This file contains only the entry chunk.\n// The chunk loading function for additional chunks\n__webpack_require__.e = (chunkId) => {\n\treturn Promise.all(Object.keys(__webpack_require__.f).reduce((promises, key) => {\n\t\t__webpack_require__.f[key](chunkId, promises);\n\t\treturn promises;\n\t}, []));\n};","// This function allow to reference async chunks\n__webpack_require__.u = (chunkId) => {\n\t// return url for filenames based on template\n\treturn \"\" + {\"194\":\"wc-hooks\",\"264\":\"deprecated-functions\",\"526\":\"pixel-facebook\",\"625\":\"consent-management\",\"671\":\"pixel-google\",\"712\":\"pixel-crazyegg\",\"818\":\"pixel-hotjar\",\"968\":\"consent-api\",\"972\":\"doofinder-listener\"}[chunkId] + \".\" + {\"194\":\"c871cc71\",\"264\":\"08bc16f9\",\"526\":\"b4f040d6\",\"625\":\"9d45b6cb\",\"671\":\"2dcfb231\",\"712\":\"badd0e8f\",\"818\":\"c3ec2dc3\",\"968\":\"c33d5439\",\"972\":\"5dc21f92\"}[chunkId] + \".chunk.min.js\";\n};","__webpack_require__.g = (function() {\n\tif (typeof globalThis === 'object') return globalThis;\n\ttry {\n\t\treturn this || new Function('return this')();\n\t} catch (e) {\n\t\tif (typeof window === 'object') return window;\n\t}\n})();","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","var scriptUrl;\nif (__webpack_require__.g.importScripts) scriptUrl = __webpack_require__.g.location + \"\";\nvar document = __webpack_require__.g.document;\nif (!scriptUrl && document) {\n\tif (document.currentScript && document.currentScript.tagName.toUpperCase() === 'SCRIPT')\n\t\tscriptUrl = document.currentScript.src;\n\tif (!scriptUrl) {\n\t\tvar scripts = document.getElementsByTagName(\"script\");\n\t\tif(scripts.length) {\n\t\t\tvar i = scripts.length - 1;\n\t\t\twhile (i > -1 && (!scriptUrl || !/^http(s?):/.test(scriptUrl))) scriptUrl = scripts[i--].src;\n\t\t}\n\t}\n}\n// When supporting browsers where an automatic publicPath is not supported you must specify an output.publicPath manually via configuration\n// or pass an empty string (\"\") and set the __webpack_public_path__ variable from your code to use your own logic.\nif (!scriptUrl) throw new Error(\"Automatic publicPath is not supported in this browser\");\nscriptUrl = scriptUrl.replace(/^blob:/, \"\").replace(/#.*$/, \"\").replace(/\\?.*$/, \"\").replace(/\\/[^\\/]+$/, \"/\");\n__webpack_require__.p = scriptUrl;","// no baseURI\n\n// object to store loaded and loading chunks\n// undefined = chunk not loaded, null = chunk preloaded/prefetched\n// [resolve, reject, Promise] = chunk loading, 0 = chunk loaded\nvar installedChunks = {\n\t792: 0\n};\n\n__webpack_require__.f.j = (chunkId, promises) => {\n\t\t// JSONP chunk loading for javascript\n\t\tvar installedChunkData = __webpack_require__.o(installedChunks, chunkId) ? installedChunks[chunkId] : undefined;\n\t\tif(installedChunkData !== 0) { // 0 means \"already installed\".\n\n\t\t\t// a Promise means \"currently loading\".\n\t\t\tif(installedChunkData) {\n\t\t\t\tpromises.push(installedChunkData[2]);\n\t\t\t} else {\n\t\t\t\tif(true) { // all chunks have JS\n\t\t\t\t\t// setup Promise in chunk cache\n\t\t\t\t\tvar promise = new Promise((resolve, reject) => (installedChunkData = installedChunks[chunkId] = [resolve, reject]));\n\t\t\t\t\tpromises.push(installedChunkData[2] = promise);\n\n\t\t\t\t\t// start chunk loading\n\t\t\t\t\tvar url = __webpack_require__.p + __webpack_require__.u(chunkId);\n\t\t\t\t\t// create error before stack unwound to get useful stacktrace later\n\t\t\t\t\tvar error = new Error();\n\t\t\t\t\tvar loadingEnded = (event) => {\n\t\t\t\t\t\tif(__webpack_require__.o(installedChunks, chunkId)) {\n\t\t\t\t\t\t\tinstalledChunkData = installedChunks[chunkId];\n\t\t\t\t\t\t\tif(installedChunkData !== 0) installedChunks[chunkId] = undefined;\n\t\t\t\t\t\t\tif(installedChunkData) {\n\t\t\t\t\t\t\t\tvar errorType = event && (event.type === 'load' ? 'missing' : event.type);\n\t\t\t\t\t\t\t\tvar realSrc = event && event.target && event.target.src;\n\t\t\t\t\t\t\t\terror.message = 'Loading chunk ' + chunkId + ' failed.\\n(' + errorType + ': ' + realSrc + ')';\n\t\t\t\t\t\t\t\terror.name = 'ChunkLoadError';\n\t\t\t\t\t\t\t\terror.type = errorType;\n\t\t\t\t\t\t\t\terror.request = realSrc;\n\t\t\t\t\t\t\t\tinstalledChunkData[1](error);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\t\t\t\t\t__webpack_require__.l(url, loadingEnded, \"chunk-\" + chunkId, chunkId);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n};\n\n// no prefetching\n\n// no preloaded\n\n// no HMR\n\n// no HMR manifest\n\n// no on chunks loaded\n\n// install a JSONP callback for chunk loading\nvar webpackJsonpCallback = (parentChunkLoadingFunction, data) => {\n\tvar [chunkIds, moreModules, runtime] = data;\n\t// add \"moreModules\" to the modules object,\n\t// then flag all \"chunkIds\" as loaded and fire callback\n\tvar moduleId, chunkId, i = 0;\n\tif(chunkIds.some((id) => (installedChunks[id] !== 0))) {\n\t\tfor(moduleId in moreModules) {\n\t\t\tif(__webpack_require__.o(moreModules, moduleId)) {\n\t\t\t\t__webpack_require__.m[moduleId] = moreModules[moduleId];\n\t\t\t}\n\t\t}\n\t\tif(runtime) var result = runtime(__webpack_require__);\n\t}\n\tif(parentChunkLoadingFunction) parentChunkLoadingFunction(data);\n\tfor(;i < chunkIds.length; i++) {\n\t\tchunkId = chunkIds[i];\n\t\tif(__webpack_require__.o(installedChunks, chunkId) && installedChunks[chunkId]) {\n\t\t\tinstalledChunks[chunkId][0]();\n\t\t}\n\t\tinstalledChunks[chunkId] = 0;\n\t}\n\n}\n\nvar chunkLoadingGlobal = self[\"webpackChunkPixel_Manager_for_WooCommerce\"] = self[\"webpackChunkPixel_Manager_for_WooCommerce\"] || [];\nchunkLoadingGlobal.forEach(webpackJsonpCallback.bind(null, 0));\nchunkLoadingGlobal.push = webpackJsonpCallback.bind(null, chunkLoadingGlobal.push.bind(chunkLoadingGlobal));","/**\n * Run PMW main loader\n */\n\nconst main = async () => {\n\n\trequire(\"./pmw/functions_main\");\n\trequire(\"./version.js\");\n\n\t// Wait until jQuery is loaded\n\tawait pmw.jQueryExists();\n\n\t// Wait until pmwDataLayer is loaded\n\tawait pmw.dataLayerFullyLoaded();\n\n\t/**\n\t * Set webpack public path for chunk loading\n\t * This ensures chunks load correctly even when scripts are combined/moved \n\t * by optimization plugins (SiteGround, Autoptimize, WP Rocket, etc.)\n\t */\n\tif (pmwDataLayer?.general?.chunk_base_path) {\n\t\t// eslint-disable-next-line no-undef, camelcase\n\t\t__webpack_public_path__ = pmwDataLayer.general.chunk_base_path;\n\t}\n\n\t// wait 1000ms\n\t// await new Promise(resolve => setTimeout(resolve, 1000))\n\n\t// Load all essential scripts first\n\trequire(\"./pmw/functions_loader\");\n\n\t// Initialize cross-tab session sync early so that session data\n\t// from existing tabs is available before event listeners run\n\tif (pmw.crossTabSync) {\n\t\tpmw.crossTabSync.init();\n\t\twindow.addEventListener(\"beforeunload\", () => pmw.crossTabSync.cleanup());\n\t}\n\t\n\t// Load new event filtering system\n\trequire(\"./pmw/hooks\");\n\trequire(\"./pmw/pixel-registry\");\n\trequire(\"./pmw/event-processor\");\n\n\t// Initialize command queue early so filters can be registered before events fire\n\tpmw.initializeCommandQueue();\n\n\t// Output PMW console message\n\tpmw.pmwConsoleMessage();\n\n\t// Load the consent management module as a chunk\n\tawait pmw.loadConsentModule();\n\tawait pmw.consent.load();\n\n\t// Doesn't work if we listen to pmw:dom:ready because it runs too late\n\t// (at the end of the main.js file)\n\t// TODO: Find out why that order is important and optimize it. It is also difficult to test. In Cypress it works just with \"pmw:dom:ready\"\n\tjQuery(() => {\n\t\trequire(\"./pmw/event_listeners_on_ready\");\n\t});\n\n\t// Load remaining event listeners\n\trequire(\"./pmw/event_listeners\");\n\t\n\t// Load doofinder listener as a chunk\n\timport(/* webpackChunkName: \"doofinder-listener\" */ \"./pmw/listeners/doofinder\");\n\n\tpmw.loadWcHooksFunctions();\n\n\t// Check if domain is excluded from tracking\n\t// If so, return\n\tif (pmw.excludeDomainFromTracking()) return;\n\n\t// Load pixels dynamically based on configuration\n\tconst pixelLoaders = [];\n\n\t// Load free pixels conditionally\n\tif (pmwDataLayer?.pixels?.google) {\n\t\tpixelLoaders.push(\n\t\t\timport(/* webpackChunkName: \"pixel-google\" */ \"./pixels/google/loader\")\n\t\t);\n\t}\n\t\n\tif (pmwDataLayer?.pixels?.facebook) {\n\t\tpixelLoaders.push(\n\t\t\timport(/* webpackChunkName: \"pixel-facebook\" */ \"./pixels/facebook/loader\")\n\t\t);\n\t}\n\t\n\tif (pmwDataLayer?.pixels?.hotjar) {\n\t\tpixelLoaders.push(\n\t\t\timport(/* webpackChunkName: \"pixel-hotjar\" */ \"./pixels/hotjar/loader\")\n\t\t);\n\t}\n\n\tif (pmwDataLayer?.pixels?.crazyegg) {\n\t\tpixelLoaders.push(\n\t\t\timport(/* webpackChunkName: \"pixel-crazyegg\" */ \"./pixels/crazyegg/loader\")\n\t\t);\n\t}\n\n\t// #if process.env.TIER === 'premium'\n// \t/**\n// \t * Load premium pixels conditionally\n// \t */\n// \tif (pmw.canLoadPremiumFeatures()) {\n// \t\tpixelLoaders.push(\n// \t\t\timport(/* webpackChunkName: \"pmw-premium-events\" */ \"./pmw/event_listeners_premium\")\n// \t\t);\n// \n// \t\tif (pmwDataLayer?.pixels?.contentsquare) {\n// \t\t\tpixelLoaders.push(\n// \t\t\t\timport(/* webpackChunkName: \"pixel-contentsquare\" */ \"./pixels/contentsquare/loader\")\n// \t\t\t);\n// \t\t}\n// \n// \t\tif (pmwDataLayer?.pixels?.adroll) {\n// \t\t\tpixelLoaders.push(\n// \t\t\t\timport(/* webpackChunkName: \"pixel-adroll\" */ \"./pixels/adroll/loader\")\n// \t\t\t);\n// \t\t}\n// \t\t\n// \t\tif (pmwDataLayer?.pixels?.linkedin) {\n// \t\t\tpixelLoaders.push(\n// \t\t\t\timport(/* webpackChunkName: \"pixel-linkedin\" */ \"./pixels/linkedin/loader\")\n// \t\t\t);\n// \t\t}\n// \t\t\n// \t\tif (pmwDataLayer?.pixels?.bing) {\n// \t\t\tpixelLoaders.push(\n// \t\t\t\timport(/* webpackChunkName: \"pixel-microsoft\" */ \"./pixels/microsoft-ads/loader\")\n// \t\t\t);\n// \t\t}\n// \t\t\n// \t\tif (pmwDataLayer?.pixels?.outbrain) {\n// \t\t\tpixelLoaders.push(\n// \t\t\t\timport(/* webpackChunkName: \"pixel-outbrain\" */ \"./pixels/outbrain/loader\")\n// \t\t\t);\n// \t\t}\n// \t\t\n// \t\tif (pmwDataLayer?.pixels?.pinterest) {\n// \t\t\tpixelLoaders.push(\n// \t\t\t\timport(/* webpackChunkName: \"pixel-pinterest\" */ \"./pixels/pinterest/loader\")\n// \t\t\t);\n// \t\t}\n// \t\t\n// \t\tif (pmwDataLayer?.pixels?.snapchat) {\n// \t\t\tpixelLoaders.push(\n// \t\t\t\timport(/* webpackChunkName: \"pixel-snapchat\" */ \"./pixels/snapchat/loader\")\n// \t\t\t);\n// \t\t}\n// \t\t\n// \t\tif (pmwDataLayer?.pixels?.taboola) {\n// \t\t\tpixelLoaders.push(\n// \t\t\t\timport(/* webpackChunkName: \"pixel-taboola\" */ \"./pixels/taboola/loader\")\n// \t\t\t);\n// \t\t}\n// \t\t\n// \t\tif (pmwDataLayer?.pixels?.tiktok) {\n// \t\t\tpixelLoaders.push(\n// \t\t\t\timport(/* webpackChunkName: \"pixel-tiktok\" */ \"./pixels/tiktok/loader\")\n// \t\t\t);\n// \t\t}\n// \t\t\n// \t\tif (pmwDataLayer?.pixels?.twitter) {\n// \t\t\tpixelLoaders.push(\n// \t\t\t\timport(/* webpackChunkName: \"pixel-twitter\" */ \"./pixels/twitter/loader\")\n// \t\t\t);\n// \t\t}\n// \t\t\n// \t\tif (pmwDataLayer?.pixels?.reddit) {\n// \t\t\tpixelLoaders.push(\n// \t\t\t\timport(/* webpackChunkName: \"pixel-reddit\" */ \"./pixels/reddit/loader\")\n// \t\t\t);\n// \t\t}\n// \t\t\n// \t\tif (pmwDataLayer?.pixels?.vwo) {\n// \t\t\tpixelLoaders.push(\n// \t\t\t\timport(/* webpackChunkName: \"pixel-vwo\" */ \"./pixels/vwo/loader\")\n// \t\t\t);\n// \t\t}\n// \t}\n\t// #endif\n\n\t// Load all active pixels in parallel\n\tawait Promise.all(pixelLoaders);\n\n\t/** Load the deprecated functions as a chunk (if enabled) */\n\tif (pmwDataLayer?.general?.modules?.load_deprecated_functions !== false) {\n\t\tconst {loadDeprecatedFunctions} = await import(/* webpackChunkName: \"deprecated-functions\" */ \"./pmw/deprecated.mjs\");\n\t\tloadDeprecatedFunctions();\n\t}\n\n\t// Preload pixels\n\tdocument.dispatchEvent(new Event(\"pmw:load-pixels\"));\n\n\t// Trigger pmwLoad event\n\tdocument.dispatchEvent(new Event(\"pmwLoad\"));\n\n\t// Wait until page is loaded\n\tawait pmw.pageLoaded();\n\n\tdocument.dispatchEvent(new Event(\"pmw:ready\"));\n\tpmw.triggerPmwDomReadyEvent();\n\n\t// Check if the library version matches the PMW version that's installed on the server\n\tpmw.checkLibraryVersion();\n};\n\nmain();\n\n\n\n\n\n\n\n\n"],"names":["leafPrototypes","getProto","inProgress","dataWebpackPrefix","removeHtmlTagsAndWhitespace","string","replace","trim","jQuery","on","event","target","value","id","triggerAddShippingInfoEvent","slug","text","length","checkedShippingMethod","find","val","attr","shippingTier","document","trigger","paymentMethodChangeLogged","triggerAddPaymentInfoEvent","checkedPaymentMethod","paymentType","url","URL","currentTarget","productId","pmw","getProductIdByCartItemKeyUrl","removeProductFromCart","e","console","error","checkoutButtonSelectors","prepareSelectors","paymentMethodSelected","fireCheckoutProgress","fireCheckoutOption","initCart","pmwDataLayer","products","productIds","getAddToCartLinkProductIds","getProductsFromBackend","referrer","retrieveData","referrerHostname","hostname","window","location","host","storeData","gclid","getUrlParameter","wbraid","gbraid","fbclid","Math","floor","Date","now","ttclid","scid","epik","pmw_loaded","shop","page_type","product_type","getMainProductIdFromProductPage","product","getProductDataForViewItemEvent","variations_output","order","isOrderIdStored","writeOrderIdToStorage","key","acrRemoveCookie","user","hasLoginEventFired","setLoginEventFired","account_just_created","hasAccountCreatedEventFired","setAccountCreatedEventFired","general","lazy_load_pmw","registerShowVariationEventListener","$variationForm","selectedValues","toArray","every","select","productVariations","data","matchingVariation","variation","Object","entries","attributes","triggerViewItemEventPrep","variation_id","async","log","payload","processEvent","server_2_server","pageview_event_s2s","is_active","pageViewS2SPixels","pixelRegistry","getPixelsWithCapability","s2sData","pixelName","pixels","keys","sendEventPayloadToServer","isWooCommerceActive","startIntersectionObserverToWatch","startProductsMutationObserverToWatch","waitForPixelsAndTriggerPageView","require","loadConsentModule","consentModule","consent","apiModule","api","crossTabSync","message","objects","isLoggerEnabled","urlLoggerOff","sessionLoggerEnabled","urlLoggerOn","logger","urlHasParameter","util","ipRange_1","dot","mappedIpv4","colon","doubleColon","getIpv6Segments","ip","isIPv6","Error","test","matches","match","isIPv4","prefix","parts","split","map","x","parseInt","toString","mappedIpv4ToIpv6","_a","beforeChunk","afterChunk","beforeParts","afterParts","missingSegments","Array","concat","createChecker","subnetOrSubnets","isArray","checks_1","subnet","createSegmentChecker","address","segments","some","check","subnetAddress","prefixLengthString","prefixLength","Number","isInteger","subnetSegments","addressSegments","i","bitCount","min","exports","specialNetsCache","default","private","ipv6","localhost","Boolean","reserved","__spreadArrays","jQueryExists","Promise","resolve","waitForjQuery","setTimeout","waitForLibrary","library","timeout","interval","startTime","dataLayerFullyLoaded","checkVar","waitForVar","version","logTimeoutId","then","clearTimeout","wpHooksExists","wp","hooks","loadWcHooksFunctions","filters","addFilter","hookName","namespace","callback","priority","this","push","sort","a","b","applyFilters","args","filteredValue","filter","result","warn","removeFilter","initialLength","f","removeAllFilters","hasFilter","getFilters","IPv4","IPv6","util_1","isInSubnet","subnetsByVersion","reduce","acc","isIP","check4","check6","isIPv4MappedAddress","extractMappedIpv4","enumerable","get","isPrivate","isLocalhost","isReserved","isSpecial","LOCALSTORAGE_KEY","SESSION_DATA_PREFIX","MSG","EXCLUDED_KEYS","Set","_isSyncing","_channel","_initialized","isSyncableKey","has","isSyncing","readAllSessionData","main","extensions","sessionStorage","mainRaw","getItem","JSON","parse","storageKey","startsWith","suffix","substring","mergeRemoteData","remoteSnapshot","filteredRemote","filtered","filterSyncableData","localRaw","localData","merged","setItem","stringify","remoteData","extKey","sendMessage","postMessage","localStorage","removeItem","handleMessage","type","extension","broadcastUpdate","init","BroadcastChannel","onmessage","addEventListener","newValue","cleanup","close","getConsentContext","categories","statistics","marketing","preferences","necessary","visitor_has_chosen","settings","visitorHasChosen","explicit_mode","explicitConsentModeActive","getEventContext","timestamp","href","makeFullUrl","user_agent","navigator","userAgent","user_id","raw","eventName","eventData","event_data","context","activePixels","getProcessablePixels","adapter","getAdapter","adapt","pixelData","firing","getFiringDecision","dispatchToPixels","dispatchUnifiedEvent","dispatchPublicEvent","active","extractS2SData","skip_empty_events","serverPixels","getPixelsForServerFiring","processablePixels","firingStatus","dispatchToBrowserPixels","browserPixels","getActiveBrowserOnlyPixels","browserEventName","dispatchToS2SPixels","s2sPixels","getActiveS2SPixels","s2sEventName","publicEventName","shouldFireBrowserPixel","fire_browser","shouldFireServerPixel","fire_server","adapters","registerAdapter","options","pixelCapabilities","defaultMode","supportsS2S","mode","supportsEventDeduplication","isActive","$","undefined","isRange","isV4","isV6","getIpVersion","ipDetectionPromise","ipDetectionResolved","ipServices","fetchWithTimeout","timeoutMs","controller","AbortController","timeoutId","abort","fetch","signal","finally","getGeoInfo","cloudflare","response","ok","status","obj","pair","loc","processRegion","countryCode","service","geojs","json","country_code","region","ipinfo","country","ipapi","consent_management","restricted_regions","includes","isVisitorAllowed","isBotUserAgent","ip_exclude_list","getIp","isOnIpExclusionList","isValidIpAddress","isPrivateOrReservedIp","privateRanges","range","second","getClientIp","cachedIp","ipv6Promise","getIpWithTimeout","anyPromise","ipv6Result","anyResult","allSettled","ipVersion","race","_","reject","catch","maxServicesToCheck","validVersions","join","ipv","getIpFromAnyService","getBrowserGeoFromExternalService","performance","promises","forEach","any","toUpperCase","regionCode","toFixed","getBrowserGeo","geoFromStorage","geoInfo","gepLocationByTimeZone","getBrowserLocationByTimeZone","geoLocation","getLocationByTimeZone","ipServicesFiltered","slice","getIpFromService","timeTaken","serviceResponseData","isVisitorNotAllowed","botPatterns","getBotPatterns","pattern","toLowerCase","customPatterns","user_agent_exclude_patterns","isCidr","ipName","ipExcludeList","timezone","Intl","DateTimeFormat","resolvedOptions","timeZone","ipv4","addToCartSelectors","quantity","dataset","product_id","addProductToCart","indexOf","each","index","element","classes","getPostIdFromString","one","closest","origin","searchParams","nextAll","getIdBasedOndVariationsOutputSetting","getProductDetailsFormattedForEvent","isEmail","emailSelected","getProductIdByCartItemElement","getProductQuantityByCartItemElement","cart","getCartItemsFromBackend","getLibraryVersion","checkLibraryVersion","number","VALID_FIRING_MODES","getActivePixels","capabilities","getS2SConfiguredPixels","configuredPixels","always_send_s2s","isConfigured","allPixels","from","capabilityName","pixelsWithCapability","getFiringMode","s2sEnabled","alwaysSendS2S","decision","getPixelsForBrowserFiring","v4Seg","v4Str","IPv4Reg","RegExp","v6Seg","IPv6Reg","s","ipv4ToLong","octets","createLongChecker","addressLong","subnetLong","expandIPv6","ipaddr","ipv4Part","ipv4Regexes","ipv6Part","ipv6Regexes","matchCIDR","zoneIndex","module","first","partSize","cidrBits","part","shift","subnetMatch","rangeList","defaultName","k","len","rangeName","rangeSubnets","kind","apply","octet","prototype","toNormalizedString","toByteArray","other","cidrRange","ref","SpecialRanges","unspecified","broadcast","multicast","linkLocal","loopback","carrierGradeNat","toIPv4MappedAddress","prefixLengthFromSubnetMask","cidr","stop","zeros","zerotable","fourOctet","longValue","parser","parseIntAuto","results","reverse","zoneId","l","toRFC5952String","bestMatchIndex","bestMatchLength","regex","exec","bytes","addr","call","toFixedLengthString","padStart","uniqueLocal","ipv4Mapped","rfc6145","rfc6052","teredo","toIPv4Address","high","low","transitional","colonCount","lastColon","replacement","replacementCount","lastIndexOf","substr","isValid","error1","isValidFourPartDecimal","parseCIDR","maskLength","parsed","defineProperty","subnetMaskFromPrefixLength","filledOctetCount","j","pow","broadcastAddressFromCIDR","ipInterfaceOctets","subnetMaskOctets","networkAddressFromCIDR","fromByteArray","process","commonjsGlobal","normalize","_validate","nh","sections","n","h","ns","hs","_leftPad","abbreviate","zPreviousFlag","zeroStartIndex","zeroLength","zStartIndex","zLength","section","zFlag","splice","d","p","padding","repeat","_hex2bin","hex","_bin2hex","bin","_addr2bin","binAddr","_bin2addr","binPart","hexSection","divideSubnet","mask0","mask1","limit","abbr","ret","binNetPart","binHostPart","numSubnets","binSubnet","hexAddr","binStartAddr","binEndAddr","start","end","size","randomSubnet","random","ptr","mask","err","inRange","check_range","ip6","range_data","parse_addr","parse_range","storeIP","displayIP","pmwRestSettings","isBelowRestErrorThreshold","isRestEndpointAvailable","testEndpoint","root","cookieName","method","cache","keepalive","redirect","responseJson","success","isPmwRestEndpointAvailable","orderId","orderKey","source","orderIds","storeOrderIdOnServer","order_duplication_prevention","email","quantityToRemove","storeCartData","is_variation","parent_id","selectors","doesWooCommerceCartExist","retrieveCartData","saveCartObjectToDataLayer","ajax_url","body","URLSearchParams","action","cart_item_keys","assign","page_id","product_ids","headers","statusText","responseData","cartObject","triggerViewItemEvent","triggerViewItemEventNoProduct","step","checkout_option","triggerViewItemList","viewItemListTriggerTestMode","css","append","view_item_list_trigger","opacity","background_color","getSearchTermFromUrl","search","io","ioTimeouts","observerCallback","observer","entry","elementId","next","isIntersecting","test_mode","unobserve","remove","ioid","detectedProductTemplateClasses","nested","flat","isNestedClass","elem","className","isFlatClass","prev","hasClass","getAllElementsToWatch","getCommonIdentifiersToWatch","listOfClassNames","haveSameNestingDepth","element1","element2","parents","findCommonParentElement","parent","is","node","countOfChildren","getCommonClass","classes1","classes2","pmwProductIds","querySelectorAll","productsNode","firstChildClassAttr","children","firstChildClasses","secondChildClassAttr","commonClass","firstProductTemplateClasses","IntersectionObserver","threshold","observe","productsMutationObserver","childList","characterData","MutationObserver","mutations","mutation","newNodes","addedNodes","hasPmwProductIdElement","siblings","setCookie","cookieValue","expiryDays","setTime","getTime","expires","toUTCString","cookie","getCookie","name","ca","decodeURIComponent","c","charAt","getCookieThatContainsRegex","cookies","deleteCookie","persistent","dataGetter","getPersistentData","getSessionData","dataSetter","setPersistentData","setSessionData","deleteDataKey","getPersistentDataKey","getSessionDataKey","defaultStorageKey","storageKeySuffix","order_id","orderDetails","order_key","cartItemKey","dyn_r_ids","list_name","brand","category","variant","list_position","position","price","currency","is_variable","parent_id_dyn_r_ids","getClidFromBrowser","clidId","clidCookieId","dclid","getUserAgent","getViewPort","width","max","documentElement","clientWidth","innerWidth","height","clientHeight","innerHeight","consoleLogVersion","loadedScripts","loadScriptAndCacheIt","fallbackUrl","loadScript","scriptUrl","querySelector","add","script","createElement","src","crossOrigin","onload","onerror","head","appendChild","getOrderItemPrice","orderItem","total","total_tax","loginEventFired","accountCreatedEventFired","pageLoaded","readyState","pageReady","isMiniCartActive","parameter","hashAsync","algo","str","crypto","subtle","digest","TextEncoder","encode","buf","Uint8Array","getCartValue","doesUrlContainPatterns","patterns","excludeDomainFromTracking","exclude_domains","domain","debug","getRandomEventId","pmwConsoleMessage","pro","distro","eligible_for_updates","show","canLoadPremiumFeatures","pmwDomReadyFired","triggerPmwDomReadyEvent","firePmwDomReadyEvent","dispatchEvent","Event","getEmailFromTarget","sendEventPayloadToServerPremium","_pageViewTriggered","checkPixelsLoaded","loaded","getProductIdForSpecificPixel","String","dynamic_remarketing","id_type","isInWooCommerceSesssion","session_active","isNotInWooCommerceSesssion","previousVariationId","initializeCommandQueue","queue","_pmwq","fn","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","__webpack_modules__","m","getPrototypeOf","t","__esModule","create","r","def","current","getOwnPropertyNames","definition","o","chunkId","all","u","g","globalThis","Function","prop","hasOwnProperty","done","needAttach","scripts","getElementsByTagName","getAttribute","charset","nc","setAttribute","onScriptComplete","doneFns","parentNode","removeChild","bind","Symbol","toStringTag","importScripts","currentScript","tagName","installedChunks","installedChunkData","promise","errorType","realSrc","request","webpackJsonpCallback","parentChunkLoadingFunction","chunkIds","moreModules","runtime","chunkLoadingGlobal","self","chunk_base_path","__webpack_public_path__","load","pixelLoaders","google","facebook","hotjar","crazyegg","modules","load_deprecated_functions","loadDeprecatedFunctions"],"ignoreList":[],"sourceRoot":""} -
woocommerce-google-adwords-conversion-tracking-tag/trunk/readme.txt
r3451824 r3468312 5 5 Tested up to: 6.9 6 6 Requires PHP: 7.3 7 Stable tag: 1.5 6.07 Stable tag: 1.57.0 8 8 License: GPLv3 or later 9 9 License URI: http://www.gnu.org/licenses/gpl-3.0.html … … 328 328 == Changelog == 329 329 330 = 1.57.0 = 331 *Release date - 24.02.2026* 332 333 * New: Implemented account created event tracking 334 * New: Added Abilities API integration 335 * Tweak: Implement cross-tab session synchronization for improved data consistency 336 * Tweak: Added modern styling and impact indicators to opportunity cards 337 * Tweak: Bumped up WC version compatibility to 10.5 338 * Tweak: Enhanced GTG Proxy: Improved config resilience, reduced unnecessary health check requests, and added periodic config refresh 339 * Tweak: Implemented REST API for saving settings via AJAX; refactored admin tabs and enhance section rendering 340 * Tweak: Update styles for impact badges and add Google Automated Discounts and Customer Reviews opportunities 341 330 342 = 1.56.0 = 331 343 *Release date - 02.02.2026* -
woocommerce-google-adwords-conversion-tracking-tag/trunk/vendor/composer/autoload_static.php
r3219444 r3468312 14 14 15 15 public static $prefixLengthsPsr4 = array ( 16 'l' => 16 'l' => 17 17 array ( 18 18 'libphonenumber\\' => 15, 19 19 ), 20 'S' => 20 'S' => 21 21 array ( 22 22 'Symfony\\Polyfill\\Mbstring\\' => 26, … … 24 24 'Swpm\\WoocommercePixelManager\\' => 29, 25 25 ), 26 'G' => 26 'G' => 27 27 array ( 28 28 'Giggsey\\Locale\\' => 15, … … 31 31 32 32 public static $prefixDirsPsr4 = array ( 33 'libphonenumber\\' => 33 'libphonenumber\\' => 34 34 array ( 35 35 0 => __DIR__ . '/..' . '/giggsey/libphonenumber-for-php/src', 36 36 ), 37 'Symfony\\Polyfill\\Mbstring\\' => 37 'Symfony\\Polyfill\\Mbstring\\' => 38 38 array ( 39 39 0 => __DIR__ . '/..' . '/symfony/polyfill-mbstring', 40 40 ), 41 'Symfony\\Polyfill\\Iconv\\' => 41 'Symfony\\Polyfill\\Iconv\\' => 42 42 array ( 43 43 0 => __DIR__ . '/..' . '/symfony/polyfill-iconv', 44 44 ), 45 'Swpm\\WoocommercePixelManager\\' => 45 'Swpm\\WoocommercePixelManager\\' => 46 46 array ( 47 47 0 => __DIR__ . '/../..' . '/src', 48 48 ), 49 'Giggsey\\Locale\\' => 49 'Giggsey\\Locale\\' => 50 50 array ( 51 51 0 => __DIR__ . '/..' . '/giggsey/locale/src', -
woocommerce-google-adwords-conversion-tracking-tag/trunk/vendor/composer/installed.php
r3451824 r3468312 4 4 'pretty_version' => 'dev-master', 5 5 'version' => 'dev-master', 6 'reference' => ' 3656eba32544289ea9284f47927508bff8d76edc',6 'reference' => '0b9db2f4cdcb40177ed1bbf772f19736e918838e', 7 7 'type' => 'wordpress-plugin', 8 8 'install_path' => __DIR__ . '/../../', … … 56 56 'pretty_version' => 'dev-master', 57 57 'version' => 'dev-master', 58 'reference' => ' 3656eba32544289ea9284f47927508bff8d76edc',58 'reference' => '0b9db2f4cdcb40177ed1bbf772f19736e918838e', 59 59 'type' => 'wordpress-plugin', 60 60 'install_path' => __DIR__ . '/../../', -
woocommerce-google-adwords-conversion-tracking-tag/trunk/wgact.php
r3451824 r3468312 11 11 * Text Domain: woocommerce-google-adwords-conversion-tracking-tag 12 12 * Domain path: /languages 13 * Version: 1.5 6.013 * Version: 1.57.0 14 14 * 15 15 * WC requires at least: 3.7 16 * WC tested up to: 10. 216 * WC tested up to: 10.5 17 17 * 18 18 * License: GNU General Public License v3.0 … … 23 23 defined('ABSPATH') || exit; // Exit if accessed directly 24 24 25 $pmw_version = '1.5 6.0';25 $pmw_version = '1.57.0'; 26 26 $plugin_basename = plugin_basename(__FILE__); 27 27
Note: See TracChangeset
for help on using the changeset viewer.