{
  "exportFormatVersion": 2,
  "exportTime": "2026-05-07 08:50:12",
  "containerVersion": {
    "path": "accounts/6353828409/containers/251606233/versions/0",
    "accountId": "6353828409",
    "containerId": "251606233",
    "containerVersionId": "0",
    "container": {
      "path": "accounts/6353828409/containers/251606233",
      "accountId": "6353828409",
      "containerId": "251606233",
      "name": "www.suhanduman.com",
      "publicId": "GTM-MPB2VGT9",
      "usageContext": [
        "WEB"
      ],
      "fingerprint": "1778088608652",
      "tagManagerUrl": "https://tagmanager.google.com/#/container/accounts/6353828409/containers/251606233/workspaces?apiLink=container",
      "features": {
        "supportUserPermissions": true,
        "supportEnvironments": true,
        "supportWorkspaces": true,
        "supportGtagConfigs": false,
        "supportBuiltInVariables": true,
        "supportClients": false,
        "supportFolders": true,
        "supportTags": true,
        "supportTemplates": true,
        "supportTriggers": true,
        "supportVariables": true,
        "supportVersions": true,
        "supportZones": true,
        "supportTransformations": false
      },
      "tagIds": [
        "GTM-MPB2VGT9"
      ]
    },
    "tag": [
      {
        "accountId": "6353828409",
        "containerId": "251606233",
        "tagId": "20",
        "name": "GA4 - Event - ViewCart",
        "type": "gaawe",
        "parameter": [
          {
            "type": "BOOLEAN",
            "key": "sendEcommerceData",
            "value": "true"
          },
          {
            "type": "LIST",
            "key": "eventSettingsTable",
            "list": [
              {
                "type": "MAP",
                "map": [
                  {
                    "type": "TEMPLATE",
                    "key": "parameter",
                    "value": "currency"
                  },
                  {
                    "type": "TEMPLATE",
                    "key": "parameterValue",
                    "value": "{{DLV - ecommerce.currency}}"
                  }
                ]
              },
              {
                "type": "MAP",
                "map": [
                  {
                    "type": "TEMPLATE",
                    "key": "parameter",
                    "value": "value"
                  },
                  {
                    "type": "TEMPLATE",
                    "key": "parameterValue",
                    "value": "{{DLV - ecommerce.value}}"
                  }
                ]
              },
              {
                "type": "MAP",
                "map": [
                  {
                    "type": "TEMPLATE",
                    "key": "parameter",
                    "value": "items"
                  },
                  {
                    "type": "TEMPLATE",
                    "key": "parameterValue",
                    "value": "{{DLV - ecommerce.items}}"
                  }
                ]
              }
            ]
          },
          {
            "type": "TEMPLATE",
            "key": "eventName",
            "value": "view_cart"
          },
          {
            "type": "TEMPLATE",
            "key": "measurementIdOverride",
            "value": "{{CONST - GA4 Measurement ID}}"
          }
        ],
        "fingerprint": "1778094521792",
        "firingTriggerId": [
          "17"
        ],
        "tagFiringOption": "ONCE_PER_EVENT",
        "consentSettings": {
          "consentStatus": "NOT_SET"
        }
      },
      {
        "accountId": "6353828409",
        "containerId": "251606233",
        "tagId": "23",
        "name": "GA4 - Event - AddPaymentInfo",
        "type": "gaawe",
        "parameter": [
          {
            "type": "BOOLEAN",
            "key": "sendEcommerceData",
            "value": "true"
          },
          {
            "type": "LIST",
            "key": "eventSettingsTable",
            "list": [
              {
                "type": "MAP",
                "map": [
                  {
                    "type": "TEMPLATE",
                    "key": "parameter",
                    "value": "payment_type"
                  },
                  {
                    "type": "TEMPLATE",
                    "key": "parameterValue",
                    "value": "{{DLV - ecommerce.payment_method}}"
                  }
                ]
              }
            ]
          },
          {
            "type": "TEMPLATE",
            "key": "eventName",
            "value": "add_payment_info"
          },
          {
            "type": "TEMPLATE",
            "key": "measurementIdOverride",
            "value": "{{CONST - GA4 Measurement ID}}"
          }
        ],
        "fingerprint": "1778094521793",
        "firingTriggerId": [
          "22"
        ],
        "tagFiringOption": "ONCE_PER_EVENT",
        "consentSettings": {
          "consentStatus": "NOT_SET"
        }
      },
      {
        "accountId": "6353828409",
        "containerId": "251606233",
        "tagId": "28",
        "name": "Meta - ViewCategory",
        "type": "cvt_5RM3Q",
        "parameter": [
          {
            "type": "BOOLEAN",
            "key": "disablePushState",
            "value": "false"
          },
          {
            "type": "TEMPLATE",
            "key": "pixelId",
            "value": "{{CONST - Meta Pixel ID}}"
          },
          {
            "type": "TEMPLATE",
            "key": "eventId",
            "value": "{{DLV - event_id}}"
          },
          {
            "type": "BOOLEAN",
            "key": "disableAutoConfig",
            "value": "false"
          },
          {
            "type": "BOOLEAN",
            "key": "useGA4Ecommerce",
            "value": "true"
          },
          {
            "type": "BOOLEAN",
            "key": "enhancedEcommerce",
            "value": "false"
          },
          {
            "type": "BOOLEAN",
            "key": "dpoLDU",
            "value": "false"
          },
          {
            "type": "TEMPLATE",
            "key": "eventName",
            "value": "custom"
          },
          {
            "type": "BOOLEAN",
            "key": "objectPropertiesFromVariable",
            "value": "false"
          },
          {
            "type": "TEMPLATE",
            "key": "customEventName",
            "value": "ViewCategory"
          },
          {
            "type": "BOOLEAN",
            "key": "consent",
            "value": "true"
          },
          {
            "type": "BOOLEAN",
            "key": "advancedMatching",
            "value": "false"
          }
        ],
        "fingerprint": "1778094521906",
        "firingTriggerId": [
          "24"
        ],
        "consentSettings": {
          "consentStatus": "NOT_SET"
        }
      },
      {
        "accountId": "6353828409",
        "containerId": "251606233",
        "tagId": "35",
        "name": "Meta - Purchase",
        "type": "cvt_5RM3Q",
        "parameter": [
          {
            "type": "BOOLEAN",
            "key": "disablePushState",
            "value": "false"
          },
          {
            "type": "TEMPLATE",
            "key": "pixelId",
            "value": "{{CONST - Meta Pixel ID}}"
          },
          {
            "type": "TEMPLATE",
            "key": "eventId",
            "value": "{{DLV - event_id}}"
          },
          {
            "type": "TEMPLATE",
            "key": "standardEventName",
            "value": "Purchase"
          },
          {
            "type": "BOOLEAN",
            "key": "disableAutoConfig",
            "value": "false"
          },
          {
            "type": "BOOLEAN",
            "key": "useGA4Ecommerce",
            "value": "true"
          },
          {
            "type": "BOOLEAN",
            "key": "enhancedEcommerce",
            "value": "false"
          },
          {
            "type": "BOOLEAN",
            "key": "dpoLDU",
            "value": "false"
          },
          {
            "type": "TEMPLATE",
            "key": "eventName",
            "value": "standard"
          },
          {
            "type": "BOOLEAN",
            "key": "objectPropertiesFromVariable",
            "value": "false"
          },
          {
            "type": "BOOLEAN",
            "key": "consent",
            "value": "true"
          },
          {
            "type": "BOOLEAN",
            "key": "advancedMatching",
            "value": "false"
          }
        ],
        "fingerprint": "1778094521907",
        "firingTriggerId": [
          "34"
        ],
        "consentSettings": {
          "consentStatus": "NOT_SET"
        }
      },
      {
        "accountId": "6353828409",
        "containerId": "251606233",
        "tagId": "39",
        "name": "GA4 - Event - ViewItem",
        "type": "gaawe",
        "parameter": [
          {
            "type": "BOOLEAN",
            "key": "sendEcommerceData",
            "value": "true"
          },
          {
            "type": "LIST",
            "key": "eventSettingsTable",
            "list": [
              {
                "type": "MAP",
                "map": [
                  {
                    "type": "TEMPLATE",
                    "key": "parameter",
                    "value": "currency"
                  },
                  {
                    "type": "TEMPLATE",
                    "key": "parameterValue",
                    "value": "{{DLV - ecommerce.currency}}"
                  }
                ]
              },
              {
                "type": "MAP",
                "map": [
                  {
                    "type": "TEMPLATE",
                    "key": "parameter",
                    "value": "value"
                  },
                  {
                    "type": "TEMPLATE",
                    "key": "parameterValue",
                    "value": "{{DLV - ecommerce.value}}"
                  }
                ]
              },
              {
                "type": "MAP",
                "map": [
                  {
                    "type": "TEMPLATE",
                    "key": "parameter",
                    "value": "items"
                  },
                  {
                    "type": "TEMPLATE",
                    "key": "parameterValue",
                    "value": "{{DLV - ecommerce.items}}"
                  }
                ]
              }
            ]
          },
          {
            "type": "TEMPLATE",
            "key": "eventName",
            "value": "view_item"
          },
          {
            "type": "TEMPLATE",
            "key": "measurementIdOverride",
            "value": "{{CONST - GA4 Measurement ID}}"
          }
        ],
        "fingerprint": "1778094521907",
        "firingTriggerId": [
          "38"
        ],
        "tagFiringOption": "ONCE_PER_EVENT",
        "consentSettings": {
          "consentStatus": "NOT_SET"
        }
      },
      {
        "accountId": "6353828409",
        "containerId": "251606233",
        "tagId": "41",
        "name": "Meta - ViewContent",
        "type": "cvt_5RM3Q",
        "parameter": [
          {
            "type": "BOOLEAN",
            "key": "disablePushState",
            "value": "false"
          },
          {
            "type": "TEMPLATE",
            "key": "pixelId",
            "value": "{{CONST - Meta Pixel ID}}"
          },
          {
            "type": "TEMPLATE",
            "key": "eventId",
            "value": "{{DLV - event_id}}"
          },
          {
            "type": "TEMPLATE",
            "key": "standardEventName",
            "value": "ViewContent"
          },
          {
            "type": "BOOLEAN",
            "key": "disableAutoConfig",
            "value": "false"
          },
          {
            "type": "BOOLEAN",
            "key": "useGA4Ecommerce",
            "value": "true"
          },
          {
            "type": "BOOLEAN",
            "key": "enhancedEcommerce",
            "value": "false"
          },
          {
            "type": "BOOLEAN",
            "key": "dpoLDU",
            "value": "false"
          },
          {
            "type": "TEMPLATE",
            "key": "eventName",
            "value": "standard"
          },
          {
            "type": "BOOLEAN",
            "key": "objectPropertiesFromVariable",
            "value": "false"
          },
          {
            "type": "BOOLEAN",
            "key": "consent",
            "value": "true"
          },
          {
            "type": "BOOLEAN",
            "key": "advancedMatching",
            "value": "false"
          }
        ],
        "fingerprint": "1778094521907",
        "firingTriggerId": [
          "38"
        ],
        "consentSettings": {
          "consentStatus": "NOT_SET"
        }
      },
      {
        "accountId": "6353828409",
        "containerId": "251606233",
        "tagId": "42",
        "name": "GA4 - Event - Purchase",
        "type": "gaawe",
        "parameter": [
          {
            "type": "BOOLEAN",
            "key": "sendEcommerceData",
            "value": "true"
          },
          {
            "type": "LIST",
            "key": "eventSettingsTable",
            "list": [
              {
                "type": "MAP",
                "map": [
                  {
                    "type": "TEMPLATE",
                    "key": "parameter",
                    "value": "transaction_id"
                  },
                  {
                    "type": "TEMPLATE",
                    "key": "parameterValue",
                    "value": "{{DLV - ecommerce.transaction_id}}"
                  }
                ]
              },
              {
                "type": "MAP",
                "map": [
                  {
                    "type": "TEMPLATE",
                    "key": "parameter",
                    "value": "currency"
                  },
                  {
                    "type": "TEMPLATE",
                    "key": "parameterValue",
                    "value": "{{DLV - ecommerce.currency}}"
                  }
                ]
              },
              {
                "type": "MAP",
                "map": [
                  {
                    "type": "TEMPLATE",
                    "key": "parameter",
                    "value": "value"
                  },
                  {
                    "type": "TEMPLATE",
                    "key": "parameterValue",
                    "value": "{{DLV - ecommerce.value}}"
                  }
                ]
              },
              {
                "type": "MAP",
                "map": [
                  {
                    "type": "TEMPLATE",
                    "key": "parameter",
                    "value": "items"
                  },
                  {
                    "type": "TEMPLATE",
                    "key": "parameterValue",
                    "value": "{{DLV - ecommerce.items}}"
                  }
                ]
              }
            ]
          },
          {
            "type": "TEMPLATE",
            "key": "eventName",
            "value": "purchase"
          },
          {
            "type": "TEMPLATE",
            "key": "measurementIdOverride",
            "value": "{{CONST - GA4 Measurement ID}}"
          }
        ],
        "fingerprint": "1778094521907",
        "firingTriggerId": [
          "34"
        ],
        "tagFiringOption": "ONCE_PER_EVENT",
        "consentSettings": {
          "consentStatus": "NOT_SET"
        }
      },
      {
        "accountId": "6353828409",
        "containerId": "251606233",
        "tagId": "43",
        "name": "GA4 - Event - PageView",
        "type": "gaawe",
        "parameter": [
          {
            "type": "BOOLEAN",
            "key": "sendEcommerceData",
            "value": "false"
          },
          {
            "type": "TEMPLATE",
            "key": "eventName",
            "value": "page_view"
          },
          {
            "type": "TEMPLATE",
            "key": "measurementIdOverride",
            "value": "{{CONST - GA4 Measurement ID}}"
          }
        ],
        "fingerprint": "1778094521907",
        "firingTriggerId": [
          "40"
        ],
        "tagFiringOption": "ONCE_PER_EVENT",
        "consentSettings": {
          "consentStatus": "NOT_SET"
        }
      },
      {
        "accountId": "6353828409",
        "containerId": "251606233",
        "tagId": "45",
        "name": "Meta - AddToCart",
        "type": "cvt_5RM3Q",
        "parameter": [
          {
            "type": "BOOLEAN",
            "key": "disablePushState",
            "value": "false"
          },
          {
            "type": "TEMPLATE",
            "key": "pixelId",
            "value": "{{CONST - Meta Pixel ID}}"
          },
          {
            "type": "TEMPLATE",
            "key": "eventId",
            "value": "{{DLV - event_id}}"
          },
          {
            "type": "TEMPLATE",
            "key": "standardEventName",
            "value": "AddToCart"
          },
          {
            "type": "BOOLEAN",
            "key": "disableAutoConfig",
            "value": "false"
          },
          {
            "type": "BOOLEAN",
            "key": "useGA4Ecommerce",
            "value": "true"
          },
          {
            "type": "BOOLEAN",
            "key": "enhancedEcommerce",
            "value": "false"
          },
          {
            "type": "BOOLEAN",
            "key": "dpoLDU",
            "value": "false"
          },
          {
            "type": "TEMPLATE",
            "key": "eventName",
            "value": "standard"
          },
          {
            "type": "BOOLEAN",
            "key": "objectPropertiesFromVariable",
            "value": "false"
          },
          {
            "type": "BOOLEAN",
            "key": "consent",
            "value": "true"
          },
          {
            "type": "BOOLEAN",
            "key": "advancedMatching",
            "value": "false"
          }
        ],
        "fingerprint": "1778094521907",
        "firingTriggerId": [
          "44"
        ],
        "consentSettings": {
          "consentStatus": "NOT_SET"
        }
      },
      {
        "accountId": "6353828409",
        "containerId": "251606233",
        "tagId": "46",
        "name": "Meta - InitiateCheckout",
        "type": "cvt_5RM3Q",
        "parameter": [
          {
            "type": "BOOLEAN",
            "key": "disablePushState",
            "value": "false"
          },
          {
            "type": "TEMPLATE",
            "key": "pixelId",
            "value": "{{CONST - Meta Pixel ID}}"
          },
          {
            "type": "TEMPLATE",
            "key": "eventId",
            "value": "{{DLV - event_id}}"
          },
          {
            "type": "TEMPLATE",
            "key": "standardEventName",
            "value": "InitiateCheckout"
          },
          {
            "type": "BOOLEAN",
            "key": "disableAutoConfig",
            "value": "false"
          },
          {
            "type": "BOOLEAN",
            "key": "useGA4Ecommerce",
            "value": "true"
          },
          {
            "type": "BOOLEAN",
            "key": "enhancedEcommerce",
            "value": "false"
          },
          {
            "type": "BOOLEAN",
            "key": "dpoLDU",
            "value": "false"
          },
          {
            "type": "TEMPLATE",
            "key": "eventName",
            "value": "standard"
          },
          {
            "type": "BOOLEAN",
            "key": "objectPropertiesFromVariable",
            "value": "false"
          },
          {
            "type": "BOOLEAN",
            "key": "consent",
            "value": "true"
          },
          {
            "type": "BOOLEAN",
            "key": "advancedMatching",
            "value": "false"
          }
        ],
        "fingerprint": "1778094521908",
        "firingTriggerId": [
          "29"
        ],
        "consentSettings": {
          "consentStatus": "NOT_SET"
        }
      },
      {
        "accountId": "6353828409",
        "containerId": "251606233",
        "tagId": "47",
        "name": "GA4 - Event - ViewItemList",
        "type": "gaawe",
        "parameter": [
          {
            "type": "BOOLEAN",
            "key": "sendEcommerceData",
            "value": "true"
          },
          {
            "type": "LIST",
            "key": "eventSettingsTable",
            "list": [
              {
                "type": "MAP",
                "map": [
                  {
                    "type": "TEMPLATE",
                    "key": "parameter",
                    "value": "item_list_name"
                  },
                  {
                    "type": "TEMPLATE",
                    "key": "parameterValue",
                    "value": "{{DLV - ecommerce.item_list_name}}"
                  }
                ]
              },
              {
                "type": "MAP",
                "map": [
                  {
                    "type": "TEMPLATE",
                    "key": "parameter",
                    "value": "items"
                  },
                  {
                    "type": "TEMPLATE",
                    "key": "parameterValue",
                    "value": "{{DLV - ecommerce.items}}"
                  }
                ]
              }
            ]
          },
          {
            "type": "TEMPLATE",
            "key": "eventName",
            "value": "view_item_list"
          },
          {
            "type": "TEMPLATE",
            "key": "measurementIdOverride",
            "value": "{{CONST - GA4 Measurement ID}}"
          }
        ],
        "fingerprint": "1778094521908",
        "firingTriggerId": [
          "24"
        ],
        "tagFiringOption": "ONCE_PER_EVENT",
        "consentSettings": {
          "consentStatus": "NOT_SET"
        }
      },
      {
        "accountId": "6353828409",
        "containerId": "251606233",
        "tagId": "48",
        "name": "GA4 - Event - AddToCart",
        "type": "gaawe",
        "parameter": [
          {
            "type": "BOOLEAN",
            "key": "sendEcommerceData",
            "value": "true"
          },
          {
            "type": "LIST",
            "key": "eventSettingsTable",
            "list": [
              {
                "type": "MAP",
                "map": [
                  {
                    "type": "TEMPLATE",
                    "key": "parameter",
                    "value": "currency"
                  },
                  {
                    "type": "TEMPLATE",
                    "key": "parameterValue",
                    "value": "{{DLV - ecommerce.currency}}"
                  }
                ]
              },
              {
                "type": "MAP",
                "map": [
                  {
                    "type": "TEMPLATE",
                    "key": "parameter",
                    "value": "value"
                  },
                  {
                    "type": "TEMPLATE",
                    "key": "parameterValue",
                    "value": "{{DLV - ecommerce.value}}"
                  }
                ]
              },
              {
                "type": "MAP",
                "map": [
                  {
                    "type": "TEMPLATE",
                    "key": "parameter",
                    "value": "items"
                  },
                  {
                    "type": "TEMPLATE",
                    "key": "parameterValue",
                    "value": "{{DLV - ecommerce.items}}"
                  }
                ]
              }
            ]
          },
          {
            "type": "TEMPLATE",
            "key": "eventName",
            "value": "add_to_cart"
          },
          {
            "type": "TEMPLATE",
            "key": "measurementIdOverride",
            "value": "{{CONST - GA4 Measurement ID}}"
          }
        ],
        "fingerprint": "1778094521908",
        "firingTriggerId": [
          "44"
        ],
        "tagFiringOption": "ONCE_PER_EVENT",
        "consentSettings": {
          "consentStatus": "NOT_SET"
        }
      },
      {
        "accountId": "6353828409",
        "containerId": "251606233",
        "tagId": "49",
        "name": "Meta - PageView",
        "type": "cvt_5RM3Q",
        "parameter": [
          {
            "type": "BOOLEAN",
            "key": "disablePushState",
            "value": "false"
          },
          {
            "type": "TEMPLATE",
            "key": "pixelId",
            "value": "{{CONST - Meta Pixel ID}}"
          },
          {
            "type": "TEMPLATE",
            "key": "eventId",
            "value": "{{DLV - event_id}}"
          },
          {
            "type": "TEMPLATE",
            "key": "standardEventName",
            "value": "PageView"
          },
          {
            "type": "BOOLEAN",
            "key": "disableAutoConfig",
            "value": "false"
          },
          {
            "type": "BOOLEAN",
            "key": "useGA4Ecommerce",
            "value": "false"
          },
          {
            "type": "BOOLEAN",
            "key": "enhancedEcommerce",
            "value": "false"
          },
          {
            "type": "BOOLEAN",
            "key": "dpoLDU",
            "value": "false"
          },
          {
            "type": "TEMPLATE",
            "key": "eventName",
            "value": "standard"
          },
          {
            "type": "BOOLEAN",
            "key": "objectPropertiesFromVariable",
            "value": "false"
          },
          {
            "type": "BOOLEAN",
            "key": "consent",
            "value": "true"
          },
          {
            "type": "BOOLEAN",
            "key": "advancedMatching",
            "value": "false"
          }
        ],
        "fingerprint": "1778094521908",
        "firingTriggerId": [
          "40"
        ],
        "consentSettings": {
          "consentStatus": "NOT_SET"
        }
      },
      {
        "accountId": "6353828409",
        "containerId": "251606233",
        "tagId": "50",
        "name": "Consent Defaults (Pre-CMP) \u2014 Disabled, see readme",
        "type": "html",
        "parameter": [
          {
            "type": "TEMPLATE",
            "key": "html",
            "value": "<script>\n  // Consent Mode v2 defaults \u2014 sets all consent types to 'denied' before any\n  // tracking tag fires. Once your CMP loads, it should call gtag('consent','update',...)\n  // to grant the categories the visitor approved. Cookieless pings flow even when denied.\n  // Only enable this tag if your CMP does NOT call gtag('consent','default',...) on its own.\n  // After enabling, change the firing trigger to the built-in 'Consent Initialization - All Pages'.\n  window.dataLayer = window.dataLayer || [];\n  function gtag(){ dataLayer.push(arguments); }\n  gtag('consent', 'default', {\n    'ad_storage': 'denied',\n    'ad_user_data': 'denied',\n    'ad_personalization': 'denied',\n    'analytics_storage': 'denied',\n    'wait_for_update': 500\n  });\n</script>"
          },
          {
            "type": "BOOLEAN",
            "key": "supportDocumentWrite",
            "value": "false"
          }
        ],
        "fingerprint": "1778094521908",
        "firingTriggerId": [
          "40"
        ],
        "paused": true,
        "consentSettings": {
          "consentStatus": "NOT_SET"
        }
      },
      {
        "accountId": "6353828409",
        "containerId": "251606233",
        "tagId": "53",
        "name": "GA4 - Event - BeginCheckout",
        "type": "gaawe",
        "parameter": [
          {
            "type": "BOOLEAN",
            "key": "sendEcommerceData",
            "value": "true"
          },
          {
            "type": "LIST",
            "key": "eventSettingsTable",
            "list": [
              {
                "type": "MAP",
                "map": [
                  {
                    "type": "TEMPLATE",
                    "key": "parameter",
                    "value": "currency"
                  },
                  {
                    "type": "TEMPLATE",
                    "key": "parameterValue",
                    "value": "{{DLV - ecommerce.currency}}"
                  }
                ]
              },
              {
                "type": "MAP",
                "map": [
                  {
                    "type": "TEMPLATE",
                    "key": "parameter",
                    "value": "value"
                  },
                  {
                    "type": "TEMPLATE",
                    "key": "parameterValue",
                    "value": "{{DLV - ecommerce.value}}"
                  }
                ]
              },
              {
                "type": "MAP",
                "map": [
                  {
                    "type": "TEMPLATE",
                    "key": "parameter",
                    "value": "items"
                  },
                  {
                    "type": "TEMPLATE",
                    "key": "parameterValue",
                    "value": "{{DLV - ecommerce.items}}"
                  }
                ]
              }
            ]
          },
          {
            "type": "TEMPLATE",
            "key": "eventName",
            "value": "begin_checkout"
          },
          {
            "type": "TEMPLATE",
            "key": "measurementIdOverride",
            "value": "{{CONST - GA4 Measurement ID}}"
          }
        ],
        "fingerprint": "1778094521908",
        "firingTriggerId": [
          "29"
        ],
        "tagFiringOption": "ONCE_PER_EVENT",
        "consentSettings": {
          "consentStatus": "NOT_SET"
        }
      },
      {
        "accountId": "6353828409",
        "containerId": "251606233",
        "tagId": "54",
        "name": "GA4 - Event - SelectItem",
        "type": "gaawe",
        "parameter": [
          {
            "type": "BOOLEAN",
            "key": "sendEcommerceData",
            "value": "true"
          },
          {
            "type": "LIST",
            "key": "eventSettingsTable",
            "list": [
              {
                "type": "MAP",
                "map": [
                  {
                    "type": "TEMPLATE",
                    "key": "parameter",
                    "value": "items"
                  },
                  {
                    "type": "TEMPLATE",
                    "key": "parameterValue",
                    "value": "{{DLV - ecommerce.items}}"
                  }
                ]
              }
            ]
          },
          {
            "type": "TEMPLATE",
            "key": "eventName",
            "value": "select_item"
          },
          {
            "type": "TEMPLATE",
            "key": "measurementIdOverride",
            "value": "{{CONST - GA4 Measurement ID}}"
          }
        ],
        "fingerprint": "1778094521908",
        "firingTriggerId": [
          "33"
        ],
        "tagFiringOption": "ONCE_PER_EVENT",
        "consentSettings": {
          "consentStatus": "NOT_SET"
        }
      },
      {
        "accountId": "6353828409",
        "containerId": "251606233",
        "tagId": "55",
        "name": "GA4 - Event - AddShippingInfo",
        "type": "gaawe",
        "parameter": [
          {
            "type": "BOOLEAN",
            "key": "sendEcommerceData",
            "value": "true"
          },
          {
            "type": "LIST",
            "key": "eventSettingsTable",
            "list": [
              {
                "type": "MAP",
                "map": [
                  {
                    "type": "TEMPLATE",
                    "key": "parameter",
                    "value": "shipping_tier"
                  },
                  {
                    "type": "TEMPLATE",
                    "key": "parameterValue",
                    "value": "{{DLV - ecommerce.shipping_method}}"
                  }
                ]
              }
            ]
          },
          {
            "type": "TEMPLATE",
            "key": "eventName",
            "value": "add_shipping_info"
          },
          {
            "type": "TEMPLATE",
            "key": "measurementIdOverride",
            "value": "{{CONST - GA4 Measurement ID}}"
          }
        ],
        "fingerprint": "1778094521908",
        "firingTriggerId": [
          "51"
        ],
        "tagFiringOption": "ONCE_PER_EVENT",
        "consentSettings": {
          "consentStatus": "NOT_SET"
        }
      },
      {
        "accountId": "6353828409",
        "containerId": "251606233",
        "tagId": "56",
        "name": "Meta - AddPaymentInfo",
        "type": "cvt_5RM3Q",
        "parameter": [
          {
            "type": "BOOLEAN",
            "key": "disablePushState",
            "value": "false"
          },
          {
            "type": "TEMPLATE",
            "key": "pixelId",
            "value": "{{CONST - Meta Pixel ID}}"
          },
          {
            "type": "TEMPLATE",
            "key": "eventId",
            "value": "{{DLV - event_id}}"
          },
          {
            "type": "TEMPLATE",
            "key": "standardEventName",
            "value": "AddPaymentInfo"
          },
          {
            "type": "BOOLEAN",
            "key": "disableAutoConfig",
            "value": "false"
          },
          {
            "type": "BOOLEAN",
            "key": "useGA4Ecommerce",
            "value": "true"
          },
          {
            "type": "BOOLEAN",
            "key": "enhancedEcommerce",
            "value": "false"
          },
          {
            "type": "BOOLEAN",
            "key": "dpoLDU",
            "value": "false"
          },
          {
            "type": "TEMPLATE",
            "key": "eventName",
            "value": "standard"
          },
          {
            "type": "BOOLEAN",
            "key": "objectPropertiesFromVariable",
            "value": "false"
          },
          {
            "type": "BOOLEAN",
            "key": "consent",
            "value": "true"
          },
          {
            "type": "BOOLEAN",
            "key": "advancedMatching",
            "value": "false"
          }
        ],
        "fingerprint": "1778094521909",
        "firingTriggerId": [
          "22"
        ],
        "consentSettings": {
          "consentStatus": "NOT_SET"
        }
      },
      {
        "accountId": "6353828409",
        "containerId": "251606233",
        "tagId": "57",
        "name": "GA4 - Google Tag (Configuration)",
        "type": "googtag",
        "parameter": [
          {
            "type": "TEMPLATE",
            "key": "tagId",
            "value": "{{CONST - GA4 Measurement ID}}"
          }
        ],
        "fingerprint": "1778094521909",
        "firingTriggerId": [
          "2147479553"
        ],
        "consentSettings": {
          "consentStatus": "NOT_SET"
        }
      },
      {
        "accountId": "6353828409",
        "containerId": "251606233",
        "tagId": "58",
        "name": "TikTok - PageView",
        "type": "cvt_MRQN8",
        "firingTriggerId": [
          "40"
        ],
        "tagFiringOption": "ONCE_PER_EVENT",
        "parameter": [
          {
            "type": "TEMPLATE",
            "key": "pixel_code",
            "value": "{{CONST - TikTok Pixel Code}}"
          },
          {
            "type": "TEMPLATE",
            "key": "event",
            "value": "Pageview"
          },
          {
            "type": "TEMPLATE",
            "key": "event_id",
            "value": "{{DLV - event_id}}"
          },
          {
            "type": "BOOLEAN",
            "key": "enhance_ecomm",
            "value": "true"
          },
          {
            "type": "TEMPLATE",
            "key": "ga_ecomm",
            "value": "enhance_ecomm"
          },
          {
            "type": "TEMPLATE",
            "key": "content_type",
            "value": "product"
          }
        ],
        "fingerprint": "58",
        "monitoringMetadata": {
          "type": "MAP"
        },
        "consentSettings": {
          "consentStatus": "NOT_SET"
        }
      },
      {
        "accountId": "6353828409",
        "containerId": "251606233",
        "tagId": "59",
        "name": "TikTok - ViewContent",
        "type": "cvt_MRQN8",
        "firingTriggerId": [
          "38"
        ],
        "tagFiringOption": "ONCE_PER_EVENT",
        "parameter": [
          {
            "type": "TEMPLATE",
            "key": "pixel_code",
            "value": "{{CONST - TikTok Pixel Code}}"
          },
          {
            "type": "TEMPLATE",
            "key": "event",
            "value": "ViewContent"
          },
          {
            "type": "TEMPLATE",
            "key": "event_id",
            "value": "{{DLV - event_id}}"
          },
          {
            "type": "BOOLEAN",
            "key": "enhance_ecomm",
            "value": "true"
          },
          {
            "type": "TEMPLATE",
            "key": "ga_ecomm",
            "value": "enhance_ecomm"
          },
          {
            "type": "TEMPLATE",
            "key": "content_type",
            "value": "product"
          }
        ],
        "fingerprint": "59",
        "monitoringMetadata": {
          "type": "MAP"
        },
        "consentSettings": {
          "consentStatus": "NOT_SET"
        }
      },
      {
        "accountId": "6353828409",
        "containerId": "251606233",
        "tagId": "60",
        "name": "TikTok - ViewCategory",
        "type": "cvt_MRQN8",
        "firingTriggerId": [
          "24"
        ],
        "tagFiringOption": "ONCE_PER_EVENT",
        "parameter": [
          {
            "type": "TEMPLATE",
            "key": "pixel_code",
            "value": "{{CONST - TikTok Pixel Code}}"
          },
          {
            "type": "TEMPLATE",
            "key": "event",
            "value": "Pageview"
          },
          {
            "type": "TEMPLATE",
            "key": "event_id",
            "value": "{{DLV - event_id}}"
          },
          {
            "type": "BOOLEAN",
            "key": "enhance_ecomm",
            "value": "true"
          },
          {
            "type": "TEMPLATE",
            "key": "ga_ecomm",
            "value": "enhance_ecomm"
          },
          {
            "type": "TEMPLATE",
            "key": "content_type",
            "value": "product"
          }
        ],
        "fingerprint": "60",
        "monitoringMetadata": {
          "type": "MAP"
        },
        "consentSettings": {
          "consentStatus": "NOT_SET"
        }
      },
      {
        "accountId": "6353828409",
        "containerId": "251606233",
        "tagId": "61",
        "name": "TikTok - AddToCart",
        "type": "cvt_MRQN8",
        "firingTriggerId": [
          "44"
        ],
        "tagFiringOption": "ONCE_PER_EVENT",
        "parameter": [
          {
            "type": "TEMPLATE",
            "key": "pixel_code",
            "value": "{{CONST - TikTok Pixel Code}}"
          },
          {
            "type": "TEMPLATE",
            "key": "event",
            "value": "AddToCart"
          },
          {
            "type": "TEMPLATE",
            "key": "event_id",
            "value": "{{DLV - event_id}}"
          },
          {
            "type": "BOOLEAN",
            "key": "enhance_ecomm",
            "value": "true"
          },
          {
            "type": "TEMPLATE",
            "key": "ga_ecomm",
            "value": "enhance_ecomm"
          },
          {
            "type": "TEMPLATE",
            "key": "content_type",
            "value": "product"
          }
        ],
        "fingerprint": "61",
        "monitoringMetadata": {
          "type": "MAP"
        },
        "consentSettings": {
          "consentStatus": "NOT_SET"
        }
      },
      {
        "accountId": "6353828409",
        "containerId": "251606233",
        "tagId": "62",
        "name": "TikTok - InitiateCheckout",
        "type": "cvt_MRQN8",
        "firingTriggerId": [
          "29"
        ],
        "tagFiringOption": "ONCE_PER_EVENT",
        "parameter": [
          {
            "type": "TEMPLATE",
            "key": "pixel_code",
            "value": "{{CONST - TikTok Pixel Code}}"
          },
          {
            "type": "TEMPLATE",
            "key": "event",
            "value": "InitiateCheckout"
          },
          {
            "type": "TEMPLATE",
            "key": "event_id",
            "value": "{{DLV - event_id}}"
          },
          {
            "type": "BOOLEAN",
            "key": "enhance_ecomm",
            "value": "true"
          },
          {
            "type": "TEMPLATE",
            "key": "ga_ecomm",
            "value": "enhance_ecomm"
          },
          {
            "type": "TEMPLATE",
            "key": "content_type",
            "value": "product"
          }
        ],
        "fingerprint": "62",
        "monitoringMetadata": {
          "type": "MAP"
        },
        "consentSettings": {
          "consentStatus": "NOT_SET"
        }
      },
      {
        "accountId": "6353828409",
        "containerId": "251606233",
        "tagId": "63",
        "name": "TikTok - AddPaymentInfo",
        "type": "cvt_MRQN8",
        "firingTriggerId": [
          "22"
        ],
        "tagFiringOption": "ONCE_PER_EVENT",
        "parameter": [
          {
            "type": "TEMPLATE",
            "key": "pixel_code",
            "value": "{{CONST - TikTok Pixel Code}}"
          },
          {
            "type": "TEMPLATE",
            "key": "event",
            "value": "AddPaymentInfo"
          },
          {
            "type": "TEMPLATE",
            "key": "event_id",
            "value": "{{DLV - event_id}}"
          },
          {
            "type": "BOOLEAN",
            "key": "enhance_ecomm",
            "value": "true"
          },
          {
            "type": "TEMPLATE",
            "key": "ga_ecomm",
            "value": "enhance_ecomm"
          },
          {
            "type": "TEMPLATE",
            "key": "content_type",
            "value": "product"
          }
        ],
        "fingerprint": "63",
        "monitoringMetadata": {
          "type": "MAP"
        },
        "consentSettings": {
          "consentStatus": "NOT_SET"
        }
      },
      {
        "accountId": "6353828409",
        "containerId": "251606233",
        "tagId": "64",
        "name": "TikTok - Purchase",
        "type": "cvt_MRQN8",
        "firingTriggerId": [
          "34"
        ],
        "tagFiringOption": "ONCE_PER_EVENT",
        "parameter": [
          {
            "type": "TEMPLATE",
            "key": "pixel_code",
            "value": "{{CONST - TikTok Pixel Code}}"
          },
          {
            "type": "TEMPLATE",
            "key": "event",
            "value": "CompletePayment"
          },
          {
            "type": "TEMPLATE",
            "key": "event_id",
            "value": "{{DLV - event_id}}"
          },
          {
            "type": "BOOLEAN",
            "key": "enhance_ecomm",
            "value": "true"
          },
          {
            "type": "TEMPLATE",
            "key": "ga_ecomm",
            "value": "enhance_ecomm"
          },
          {
            "type": "TEMPLATE",
            "key": "content_type",
            "value": "product"
          }
        ],
        "fingerprint": "64",
        "monitoringMetadata": {
          "type": "MAP"
        },
        "consentSettings": {
          "consentStatus": "NOT_SET"
        }
      },
      {
        "accountId": "6353828409",
        "containerId": "251606233",
        "tagId": "65",
        "name": "TikTok - Search",
        "type": "cvt_MRQN8",
        "firingTriggerId": [
          "52"
        ],
        "tagFiringOption": "ONCE_PER_EVENT",
        "parameter": [
          {
            "type": "TEMPLATE",
            "key": "pixel_code",
            "value": "{{CONST - TikTok Pixel Code}}"
          },
          {
            "type": "TEMPLATE",
            "key": "event",
            "value": "Search"
          },
          {
            "type": "TEMPLATE",
            "key": "event_id",
            "value": "{{DLV - event_id}}"
          },
          {
            "type": "BOOLEAN",
            "key": "enhance_ecomm",
            "value": "true"
          },
          {
            "type": "TEMPLATE",
            "key": "ga_ecomm",
            "value": "enhance_ecomm"
          },
          {
            "type": "TEMPLATE",
            "key": "content_type",
            "value": "product"
          }
        ],
        "fingerprint": "65",
        "monitoringMetadata": {
          "type": "MAP"
        },
        "consentSettings": {
          "consentStatus": "NOT_SET"
        }
      },
      {
        "accountId": "6353828409",
        "containerId": "251606233",
        "tagId": "67",
        "name": "Google Ads - Purchase Conversion",
        "type": "awct",
        "parameter": [
          {
            "type": "TEMPLATE",
            "key": "conversionId",
            "value": "{{CONST - Google Ads Conversion ID}}"
          },
          {
            "type": "TEMPLATE",
            "key": "conversionLabel",
            "value": "{{CONST - Google Ads Purchase Label}}"
          },
          {
            "type": "TEMPLATE",
            "key": "conversionValue",
            "value": "{{DLV - ecommerce.value}}"
          },
          {
            "type": "TEMPLATE",
            "key": "currencyCode",
            "value": "{{DLV - ecommerce.currency}}"
          },
          {
            "type": "TEMPLATE",
            "key": "orderId",
            "value": "{{DLV - ecommerce.transaction_id}}"
          },
          {
            "type": "BOOLEAN",
            "key": "enableConversionLinker",
            "value": "true"
          }
        ],
        "fingerprint": "1778600000000",
        "firingTriggerId": [
          "34"
        ],
        "tagFiringOption": "ONCE_PER_EVENT",
        "consentSettings": {
          "consentStatus": "NOT_SET"
        },
        "notes": "Fires on Purchase. Sends conversion value + transaction_id to Google Ads. Enhanced Conversions enabled with AUTO mode \u2014 Google Ads scrapes hashed email/phone from checkout form fields. Edit CONST - Google Ads Conversion ID and CONST - Google Ads Purchase Label to your Google Ads values before publishing."
      },
      {
        "accountId": "6353828409",
        "containerId": "251606233",
        "tagId": "68",
        "name": "Google Ads - Google Tag (Conversion Linker)",
        "type": "googtag",
        "parameter": [
          {
            "type": "TEMPLATE",
            "key": "tagId",
            "value": "{{CONST - Google Ads Conversion ID}}"
          }
        ],
        "fingerprint": "1778600000001",
        "firingTriggerId": [
          "2147479553"
        ],
        "tagFiringOption": "ONCE_PER_EVENT",
        "consentSettings": {
          "consentStatus": "NOT_SET"
        },
        "notes": "Fires on all pages. Loads gtag.js with the Google Ads Conversion ID, which auto-captures gclid/gbraid/wbraid into the _gcl_aw 1st-party cookie. Replaces the deprecated standalone Conversion Linker tag."
      }
    ],
    "trigger": [
      {
        "accountId": "6353828409",
        "containerId": "251606233",
        "triggerId": "17",
        "name": "CE - View Cart",
        "type": "CUSTOM_EVENT",
        "customEventFilter": [
          {
            "type": "EQUALS",
            "parameter": [
              {
                "type": "TEMPLATE",
                "key": "arg0",
                "value": "{{_event}}"
              },
              {
                "type": "TEMPLATE",
                "key": "arg1",
                "value": "view_cart"
              }
            ]
          }
        ],
        "fingerprint": "1778094521792"
      },
      {
        "accountId": "6353828409",
        "containerId": "251606233",
        "triggerId": "22",
        "name": "CE - Add Payment Info",
        "type": "CUSTOM_EVENT",
        "customEventFilter": [
          {
            "type": "EQUALS",
            "parameter": [
              {
                "type": "TEMPLATE",
                "key": "arg0",
                "value": "{{_event}}"
              },
              {
                "type": "TEMPLATE",
                "key": "arg1",
                "value": "add_payment_info"
              }
            ]
          }
        ],
        "fingerprint": "1778094521793"
      },
      {
        "accountId": "6353828409",
        "containerId": "251606233",
        "triggerId": "24",
        "name": "CE - View Item List",
        "type": "CUSTOM_EVENT",
        "customEventFilter": [
          {
            "type": "EQUALS",
            "parameter": [
              {
                "type": "TEMPLATE",
                "key": "arg0",
                "value": "{{_event}}"
              },
              {
                "type": "TEMPLATE",
                "key": "arg1",
                "value": "view_item_list"
              }
            ]
          }
        ],
        "fingerprint": "1778094521793"
      },
      {
        "accountId": "6353828409",
        "containerId": "251606233",
        "triggerId": "29",
        "name": "CE - Begin Checkout",
        "type": "CUSTOM_EVENT",
        "customEventFilter": [
          {
            "type": "EQUALS",
            "parameter": [
              {
                "type": "TEMPLATE",
                "key": "arg0",
                "value": "{{_event}}"
              },
              {
                "type": "TEMPLATE",
                "key": "arg1",
                "value": "begin_checkout"
              }
            ]
          }
        ],
        "fingerprint": "1778094521906"
      },
      {
        "accountId": "6353828409",
        "containerId": "251606233",
        "triggerId": "33",
        "name": "CE - Select Item",
        "type": "CUSTOM_EVENT",
        "customEventFilter": [
          {
            "type": "EQUALS",
            "parameter": [
              {
                "type": "TEMPLATE",
                "key": "arg0",
                "value": "{{_event}}"
              },
              {
                "type": "TEMPLATE",
                "key": "arg1",
                "value": "select_item"
              }
            ]
          }
        ],
        "fingerprint": "1778094521906"
      },
      {
        "accountId": "6353828409",
        "containerId": "251606233",
        "triggerId": "34",
        "name": "CE - Purchase",
        "type": "CUSTOM_EVENT",
        "customEventFilter": [
          {
            "type": "EQUALS",
            "parameter": [
              {
                "type": "TEMPLATE",
                "key": "arg0",
                "value": "{{_event}}"
              },
              {
                "type": "TEMPLATE",
                "key": "arg1",
                "value": "purchase"
              }
            ]
          }
        ],
        "fingerprint": "1778094521906"
      },
      {
        "accountId": "6353828409",
        "containerId": "251606233",
        "triggerId": "38",
        "name": "CE - View Item",
        "type": "CUSTOM_EVENT",
        "customEventFilter": [
          {
            "type": "EQUALS",
            "parameter": [
              {
                "type": "TEMPLATE",
                "key": "arg0",
                "value": "{{_event}}"
              },
              {
                "type": "TEMPLATE",
                "key": "arg1",
                "value": "view_item"
              }
            ]
          }
        ],
        "fingerprint": "1778094521907"
      },
      {
        "accountId": "6353828409",
        "containerId": "251606233",
        "triggerId": "40",
        "name": "CE - PageView Meta",
        "type": "CUSTOM_EVENT",
        "customEventFilter": [
          {
            "type": "EQUALS",
            "parameter": [
              {
                "type": "TEMPLATE",
                "key": "arg0",
                "value": "{{_event}}"
              },
              {
                "type": "TEMPLATE",
                "key": "arg1",
                "value": "page_view_meta"
              }
            ]
          }
        ],
        "fingerprint": "1778094521907"
      },
      {
        "accountId": "6353828409",
        "containerId": "251606233",
        "triggerId": "44",
        "name": "CE - Add to Cart",
        "type": "CUSTOM_EVENT",
        "customEventFilter": [
          {
            "type": "EQUALS",
            "parameter": [
              {
                "type": "TEMPLATE",
                "key": "arg0",
                "value": "{{_event}}"
              },
              {
                "type": "TEMPLATE",
                "key": "arg1",
                "value": "add_to_cart"
              }
            ]
          }
        ],
        "fingerprint": "1778094521907"
      },
      {
        "accountId": "6353828409",
        "containerId": "251606233",
        "triggerId": "51",
        "name": "CE - Add Shipping Info",
        "type": "CUSTOM_EVENT",
        "customEventFilter": [
          {
            "type": "EQUALS",
            "parameter": [
              {
                "type": "TEMPLATE",
                "key": "arg0",
                "value": "{{_event}}"
              },
              {
                "type": "TEMPLATE",
                "key": "arg1",
                "value": "add_shipping_info"
              }
            ]
          }
        ],
        "fingerprint": "1778094521908"
      },
      {
        "accountId": "6353828409",
        "containerId": "251606233",
        "triggerId": "52",
        "name": "CE - Search",
        "type": "CUSTOM_EVENT",
        "customEventFilter": [
          {
            "type": "EQUALS",
            "parameter": [
              {
                "type": "TEMPLATE",
                "key": "arg0",
                "value": "{{_event}}"
              },
              {
                "type": "TEMPLATE",
                "key": "arg1",
                "value": "search"
              }
            ]
          }
        ],
        "fingerprint": "52"
      }
    ],
    "variable": [
      {
        "accountId": "6353828409",
        "containerId": "251606233",
        "variableId": "15",
        "name": "DLV - ecommerce.items",
        "type": "v",
        "parameter": [
          {
            "type": "INTEGER",
            "key": "dataLayerVersion",
            "value": "2"
          },
          {
            "type": "BOOLEAN",
            "key": "setDefaultValue",
            "value": "false"
          },
          {
            "type": "TEMPLATE",
            "key": "name",
            "value": "ecommerce.items"
          }
        ],
        "fingerprint": "1778094521791"
      },
      {
        "accountId": "6353828409",
        "containerId": "251606233",
        "variableId": "16",
        "name": "DLV - ecommerce.currency",
        "type": "v",
        "parameter": [
          {
            "type": "INTEGER",
            "key": "dataLayerVersion",
            "value": "2"
          },
          {
            "type": "BOOLEAN",
            "key": "setDefaultValue",
            "value": "false"
          },
          {
            "type": "TEMPLATE",
            "key": "name",
            "value": "ecommerce.currency"
          }
        ],
        "fingerprint": "1778094521792"
      },
      {
        "accountId": "6353828409",
        "containerId": "251606233",
        "variableId": "18",
        "name": "CONST - GA4 Measurement ID",
        "type": "c",
        "parameter": [
          {
            "type": "TEMPLATE",
            "key": "value",
            "value": "GA4_MEASUREMENT_ID"
          }
        ],
        "fingerprint": "1778094521792"
      },
      {
        "accountId": "6353828409",
        "containerId": "251606233",
        "variableId": "19",
        "name": "DLV - ecommerce.value",
        "type": "v",
        "parameter": [
          {
            "type": "INTEGER",
            "key": "dataLayerVersion",
            "value": "2"
          },
          {
            "type": "BOOLEAN",
            "key": "setDefaultValue",
            "value": "false"
          },
          {
            "type": "TEMPLATE",
            "key": "name",
            "value": "ecommerce.value"
          }
        ],
        "fingerprint": "1778094521792"
      },
      {
        "accountId": "6353828409",
        "containerId": "251606233",
        "variableId": "21",
        "name": "DLV - ecommerce.payment_method",
        "type": "v",
        "parameter": [
          {
            "type": "INTEGER",
            "key": "dataLayerVersion",
            "value": "2"
          },
          {
            "type": "BOOLEAN",
            "key": "setDefaultValue",
            "value": "false"
          },
          {
            "type": "TEMPLATE",
            "key": "name",
            "value": "ecommerce.payment_method"
          }
        ],
        "fingerprint": "1778094521793"
      },
      {
        "accountId": "6353828409",
        "containerId": "251606233",
        "variableId": "26",
        "name": "DLV - event_id",
        "type": "v",
        "parameter": [
          {
            "type": "INTEGER",
            "key": "dataLayerVersion",
            "value": "2"
          },
          {
            "type": "BOOLEAN",
            "key": "setDefaultValue",
            "value": "false"
          },
          {
            "type": "TEMPLATE",
            "key": "name",
            "value": "event_id"
          }
        ],
        "fingerprint": "1778094521906"
      },
      {
        "accountId": "6353828409",
        "containerId": "251606233",
        "variableId": "27",
        "name": "CONST - Meta Pixel ID",
        "type": "c",
        "parameter": [
          {
            "type": "TEMPLATE",
            "key": "value",
            "value": "META_PIXEL_ID"
          }
        ],
        "fingerprint": "1778094521906"
      },
      {
        "accountId": "6353828409",
        "containerId": "251606233",
        "variableId": "30",
        "name": "DLV - ecommerce",
        "type": "v",
        "parameter": [
          {
            "type": "INTEGER",
            "key": "dataLayerVersion",
            "value": "2"
          },
          {
            "type": "BOOLEAN",
            "key": "setDefaultValue",
            "value": "false"
          },
          {
            "type": "TEMPLATE",
            "key": "name",
            "value": "ecommerce"
          }
        ],
        "fingerprint": "1778094521906"
      },
      {
        "accountId": "6353828409",
        "containerId": "251606233",
        "variableId": "32",
        "name": "DLV - Hashed Email",
        "type": "v",
        "parameter": [
          {
            "type": "INTEGER",
            "key": "dataLayerVersion",
            "value": "2"
          },
          {
            "type": "BOOLEAN",
            "key": "setDefaultValue",
            "value": "false"
          },
          {
            "type": "TEMPLATE",
            "key": "name",
            "value": "user_data.email"
          }
        ],
        "fingerprint": "1778094521906"
      },
      {
        "accountId": "6353828409",
        "containerId": "251606233",
        "variableId": "36",
        "name": "DLV - ecommerce.transaction_id",
        "type": "v",
        "parameter": [
          {
            "type": "INTEGER",
            "key": "dataLayerVersion",
            "value": "2"
          },
          {
            "type": "BOOLEAN",
            "key": "setDefaultValue",
            "value": "false"
          },
          {
            "type": "TEMPLATE",
            "key": "name",
            "value": "ecommerce.transaction_id"
          }
        ],
        "fingerprint": "1778094521907"
      },
      {
        "accountId": "6353828409",
        "containerId": "251606233",
        "variableId": "37",
        "name": "DLV - ecommerce.item_list_name",
        "type": "v",
        "parameter": [
          {
            "type": "INTEGER",
            "key": "dataLayerVersion",
            "value": "2"
          },
          {
            "type": "BOOLEAN",
            "key": "setDefaultValue",
            "value": "false"
          },
          {
            "type": "TEMPLATE",
            "key": "name",
            "value": "ecommerce.item_list_name"
          }
        ],
        "fingerprint": "1778094521907"
      },
      {
        "accountId": "6353828409",
        "containerId": "251606233",
        "variableId": "52",
        "name": "DLV - ecommerce.shipping_method",
        "type": "v",
        "parameter": [
          {
            "type": "INTEGER",
            "key": "dataLayerVersion",
            "value": "2"
          },
          {
            "type": "BOOLEAN",
            "key": "setDefaultValue",
            "value": "false"
          },
          {
            "type": "TEMPLATE",
            "key": "name",
            "value": "ecommerce.shipping_method"
          }
        ],
        "fingerprint": "1778094521908"
      },
      {
        "accountId": "6353828409",
        "containerId": "251606233",
        "variableId": "53",
        "name": "CONST - TikTok Pixel Code",
        "type": "c",
        "parameter": [
          {
            "type": "TEMPLATE",
            "key": "value",
            "value": "YOUR_TIKTOK_PIXEL_CODE"
          }
        ],
        "fingerprint": "53",
        "formatValue": {}
      },
      {
        "accountId": "6353828409",
        "containerId": "251606233",
        "variableId": "54",
        "name": "CONST - Google Ads Conversion ID",
        "type": "c",
        "parameter": [
          {
            "type": "TEMPLATE",
            "key": "value",
            "value": "AW-CONVERSION_ID"
          }
        ],
        "fingerprint": "1778600000000",
        "notes": "Your Google Ads Conversion ID, e.g. AW-1234567890. Find it in Google Ads \u2192 Goals \u2192 Conversions \u2192 your Purchase conversion action \u2192 Tag setup \u2192 Install the tag yourself."
      },
      {
        "accountId": "6353828409",
        "containerId": "251606233",
        "variableId": "55",
        "name": "CONST - Google Ads Purchase Label",
        "type": "c",
        "parameter": [
          {
            "type": "TEMPLATE",
            "key": "value",
            "value": "PURCHASE_LABEL"
          }
        ],
        "fingerprint": "1778600000000",
        "notes": "Google Ads Conversion Label for your Purchase conversion, e.g. abc123XYZ. Found alongside the Conversion ID in the same Goals \u2192 Conversions screen."
      }
    ],
    "builtInVariable": [
      {
        "accountId": "6353828409",
        "containerId": "251606233",
        "type": "PAGE_URL",
        "name": "Page URL"
      },
      {
        "accountId": "6353828409",
        "containerId": "251606233",
        "type": "PAGE_HOSTNAME",
        "name": "Page Hostname"
      },
      {
        "accountId": "6353828409",
        "containerId": "251606233",
        "type": "PAGE_PATH",
        "name": "Page Path"
      },
      {
        "accountId": "6353828409",
        "containerId": "251606233",
        "type": "REFERRER",
        "name": "Referrer"
      }
    ],
    "fingerprint": "1778143811694",
    "tagManagerUrl": "https://tagmanager.google.com/#/versions/accounts/6353828409/containers/251606233/versions/0?apiLink=version",
    "customTemplate": [
      {
        "accountId": "6353828409",
        "containerId": "251606233",
        "templateId": "25",
        "name": "Meta Pixel",
        "fingerprint": "1778094521793",
        "templateData": "___TERMS_OF_SERVICE___\n\nBy creating or modifying this file you agree to Google Tag Manager's Community\nTemplate Gallery Developer Terms of Service available at\nhttps://developers.google.com/tag-manager/gallery-tos (or such other URL as\nGoogle may provide), as modified from time to time.\n\n\n___INFO___\n\n{\n  \"displayName\": \"Meta Pixel\",\n  \"__wm\": \"VGVtcGxhdGUtQXV0aG9yX0ZhY2Vib29rLVNpbW8tQWhhdmE\\u003d\",\n  \"description\": \"Integrate your GTM with Meta Pixel for a streamlined way to connect your data to Meta and help maximize your advertising and measurement by understanding the actions people take on your website.\",\n  \"categories\": [\n    \"ADVERTISING\",\n    \"ANALYTICS\"\n  ],\n  \"id\": \"cvt_5RM3Q\",\n  \"type\": \"TAG\",\n  \"version\": 1,\n  \"brand\": {\n    \"displayName\": \"facebook\",\n    \"id\": \"github.com_facebook\",\n    \"thumbnail\": \"data:image/png;base64,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\\u003d\\u003d\"\n  },\n  \"containerContexts\": [\n    \"WEB\"\n  ]\n}\n\n\n___TEMPLATE_PARAMETERS___\n\n[\n  {\n    \"alwaysInSummary\": true,\n    \"valueValidators\": [\n      {\n        \"errorMessage\": \"You must provide a Pixel ID\",\n        \"type\": \"NON_EMPTY\"\n      },\n      {\n        \"args\": [\n          \"^[0-9,]+$\"\n        ],\n        \"errorMessage\": \"Invalid Pixel ID format\",\n        \"type\": \"REGEX\"\n      }\n    ],\n    \"displayName\": \"Facebook Pixel ID(s)\",\n    \"simpleValueType\": true,\n    \"name\": \"pixelId\",\n    \"type\": \"TEXT\",\n    \"valueHint\": \"e.g. 12345678910\"\n  },\n  {\n    \"type\": \"CHECKBOX\",\n    \"name\": \"enhancedEcommerce\",\n    \"checkboxText\": \"Enhanced Ecommerce dataLayer Integration\",\n    \"simpleValueType\": true,\n    \"help\": \"If you check this, then the Facebook pixel will populate \\u003cstrong\\u003eEvent Name\\u003c/strong\\u003e and \\u003cstrong\\u003eObject Properties\\u003c/strong\\u003e automatically from the last \\u003ca href\\u003d\\\"https://developers.google.com/tag-manager/enhanced-ecommerce\\\"\\u003eecommerce\\u003c/a\\u003e object pushed into the dataLayer array.\"\n  },\n  {\n    \"type\": \"CHECKBOX\",\n    \"name\": \"useGA4Ecommerce\",\n    \"checkboxText\": \"Use GA4 dataLayer Integration\",\n    \"simpleValueType\": true,\n    \"help\": \"**Use GA4 Ecommerce:**\\u003cbr/\\u003e\\n\\u003cbr/\\u003e\\nIf this feature is enabled, please push an **eventModel** object containing the required parameters into the dataLayer.\\u003cbr/\\u003e\\n\\u003cbr/\\u003e\\nExample:\\u003cbr/\\u003e\\n\\u003cbr/\\u003e\\nwindow.dataLayer \\u003d window.dataLayer || [];\\u003cbr/\\u003e\\n\\u003cbr/\\u003e\\nwindow.dataLayer.push({\\u003cbr/\\u003e\\n\\u0026nbsp;\\u0026nbsp;\\\"event\\\": \\\"add_to_cart\\\",\\u003cbr/\\u003e\\n\\u0026nbsp;\\u0026nbsp;\\\"eventModel\\\": {\\u003cbr/\\u003e\\n\\u0026nbsp;\\u0026nbsp;\\u0026nbsp;\\u0026nbsp;\\\"currency\\\": \\\"USD\\\",\\u003cbr/\\u003e\\n\\u0026nbsp;\\u0026nbsp;\\u0026nbsp;\\u0026nbsp;\\\"value\\\": 30,\\u003cbr/\\u003e\\n\\u0026nbsp;\\u0026nbsp;\\u0026nbsp;\\u0026nbsp;\\\"items\\\": [\\u003cbr/\\u003e\\n\\u0026nbsp;\\u0026nbsp;\\u0026nbsp;\\u0026nbsp;\\u0026nbsp;\\u0026nbsp;{\\u003cbr/\\u003e\\n\\u0026nbsp;\\u0026nbsp;\\u0026nbsp;\\u0026nbsp;\\u0026nbsp;\\u0026nbsp;\\u0026nbsp;\\u0026nbsp;\\\"item_id\\\": \\\"item_id\\\",\\u003cbr/\\u003e\\n\\u0026nbsp;\\u0026nbsp;\\u0026nbsp;\\u0026nbsp;\\u0026nbsp;\\u0026nbsp;\\u0026nbsp;\\u0026nbsp;\\\"item_name\\\": \\\"item_name\\\",\\u003cbr/\\u003e\\n\\u0026nbsp;\\u0026nbsp;\\u0026nbsp;\\u0026nbsp;\\u0026nbsp;\\u0026nbsp;\\u0026nbsp;\\u0026nbsp;\\\"price\\\": 30\\u003cbr/\\u003e\\n\\u0026nbsp;\\u0026nbsp;\\u0026nbsp;\\u0026nbsp;\\u0026nbsp;\\u0026nbsp;}\\u003cbr/\\u003e\\n\\u0026nbsp;\\u0026nbsp;\\u0026nbsp;\\u0026nbsp;]\\u003cbr/\\u003e\\n\\u0026nbsp;\\u0026nbsp;}\\u003cbr/\\u003e\\n});\"\n  },\n  {\n    \"type\": \"RADIO\",\n    \"name\": \"eventName\",\n    \"displayName\": \"Event Name\",\n    \"radioItems\": [\n      {\n        \"value\": \"standard\",\n        \"displayValue\": \"Standard\",\n        \"subParams\": [\n          {\n            \"type\": \"SELECT\",\n            \"name\": \"standardEventName\",\n            \"macrosInSelect\": false,\n            \"selectItems\": [\n              {\n                \"displayValue\": \"PageView\",\n                \"value\": \"PageView\"\n              },\n              {\n                \"displayValue\": \"AddPaymentInfo\",\n                \"value\": \"AddPaymentInfo\"\n              },\n              {\n                \"displayValue\": \"AddToCart\",\n                \"value\": \"AddToCart\"\n              },\n              {\n                \"displayValue\": \"AddToWishlist\",\n                \"value\": \"AddToWishlist\"\n              },\n              {\n                \"displayValue\": \"CompleteRegistration\",\n                \"value\": \"CompleteRegistration\"\n              },\n              {\n                \"displayValue\": \"Contact\",\n                \"value\": \"Contact\"\n              },\n              {\n                \"displayValue\": \"CustomizeProduct\",\n                \"value\": \"CustomizeProduct\"\n              },\n              {\n                \"displayValue\": \"Donate\",\n                \"value\": \"Donate\"\n              },\n              {\n                \"displayValue\": \"FindLocation\",\n                \"value\": \"FindLocation\"\n              },\n              {\n                \"displayValue\": \"InitiateCheckout\",\n                \"value\": \"InitiateCheckout\"\n              },\n              {\n                \"displayValue\": \"Lead\",\n                \"value\": \"Lead\"\n              },\n              {\n                \"displayValue\": \"Purchase\",\n                \"value\": \"Purchase\"\n              },\n              {\n                \"displayValue\": \"Schedule\",\n                \"value\": \"Schedule\"\n              },\n              {\n                \"displayValue\": \"Search\",\n                \"value\": \"Search\"\n              },\n              {\n                \"displayValue\": \"StartTrial\",\n                \"value\": \"StartTrial\"\n              },\n              {\n                \"displayValue\": \"SubmitApplication\",\n                \"value\": \"SubmitApplication\"\n              },\n              {\n                \"displayValue\": \"Subscribe\",\n                \"value\": \"Subscribe\"\n              },\n              {\n                \"displayValue\": \"ViewContent\",\n                \"value\": \"ViewContent\"\n              }\n            ],\n            \"simpleValueType\": true,\n            \"defaultValue\": \"PageView\"\n          }\n        ]\n      },\n      {\n        \"value\": \"custom\",\n        \"displayValue\": \"Custom\",\n        \"subParams\": [\n          {\n            \"type\": \"TEXT\",\n            \"name\": \"customEventName\",\n            \"displayName\": \"\",\n            \"simpleValueType\": true\n          }\n        ]\n      },\n      {\n        \"value\": \"variable\",\n        \"displayValue\": \"Variable\",\n        \"subParams\": [\n          {\n            \"type\": \"SELECT\",\n            \"name\": \"variableEventName\",\n            \"macrosInSelect\": true,\n            \"selectItems\": [],\n            \"simpleValueType\": true\n          }\n        ]\n      }\n    ],\n    \"simpleValueType\": true,\n    \"enablingConditions\": [\n      {\n        \"paramName\": \"enhancedEcommerce\",\n        \"paramValue\": true,\n        \"type\": \"NOT_EQUALS\"\n      }\n    ]\n  },\n  {\n    \"type\": \"RADIO\",\n    \"name\": \"eecEventName\",\n    \"displayName\": \"Event Name\",\n    \"radioItems\": [\n      {\n        \"value\": \"eec\",\n        \"displayValue\": \"Set automatically from dataLayer\"\n      }\n    ],\n    \"simpleValueType\": true,\n    \"help\": \"The Enhanced Ecommerce integration populates the Event Name automatically depending on what type of \\u003cstrong\\u003eecommerce\\u003c/strong\\u003e object was last pushed into dataLayer (\\\"detail\\\" -\\u003e \\\"ViewContent\\\", \\\"add\\\" -\\u003e \\\"AddToCart\\\", \\\"checkout\\\" -\\u003e \\\"InitiateCheckout\\\", \\\"purchase\\\" -\\u003e \\\"Purchase\\\").\",\n    \"enablingConditions\": [\n      {\n        \"paramName\": \"enhancedEcommerce\",\n        \"paramValue\": true,\n        \"type\": \"EQUALS\"\n      }\n    ]\n  },\n  {\n    \"type\": \"SELECT\",\n    \"name\": \"consent\",\n    \"displayName\": \"Consent Granted (GDPR)\",\n    \"macrosInSelect\": true,\n    \"selectItems\": [\n      {\n        \"value\": true,\n        \"displayValue\": \"True\"\n      },\n      {\n        \"value\": false,\n        \"displayValue\": \"False\"\n      }\n    ],\n    \"simpleValueType\": true,\n    \"help\": \"If you set Consent Granted to \\u003cstrong\\u003efalse\\u003c/strong\\u003e, the pixel will not send any hits until a tag is fired where Consent Granted is set to \\u003cstrong\\u003etrue\\u003c/strong\\u003e. See \\u003ca href\\u003d\\\"https://developers.facebook.com/docs/facebook-pixel/implementation/gdpr/\\\"\\u003ethis article\\u003c/a\\u003e for more information.\"\n  },\n  {\n    \"simpleValueType\": true,\n    \"name\": \"advancedMatching\",\n    \"checkboxText\": \"Enable Advanced Matching\",\n    \"type\": \"CHECKBOX\"\n  },\n  {\n    \"type\": \"GROUP\",\n    \"name\": \"dataProcessingOptionsGroup\",\n    \"displayName\": \"Data Processing Options\",\n    \"groupStyle\": \"ZIPPY_CLOSED\",\n    \"subParams\": [\n      {\n        \"type\": \"LABEL\",\n        \"name\": \"dpoInfo\",\n        \"displayName\": \"Data Processing Options force this Facebook event to comply to regional regulations with regard to the processing and selling of user data. Read \\u003ca href\\u003d\\\"https://developers.facebook.com/docs/marketing-apis/data-processing-options\\\"\\u003ethis\\u003c/a\\u003e for more information about how to configure this section.\"\n      },\n      {\n        \"type\": \"CHECKBOX\",\n        \"name\": \"dpoLDU\",\n        \"checkboxText\": \"Limited Data Use (LDU)\",\n        \"simpleValueType\": true\n      },\n      {\n        \"type\": \"TEXT\",\n        \"name\": \"dpoCountry\",\n        \"displayName\": \"Country\",\n        \"simpleValueType\": true,\n        \"defaultValue\": 0,\n        \"enablingConditions\": [\n          {\n            \"paramName\": \"dpoLDU\",\n            \"paramValue\": true,\n            \"type\": \"EQUALS\"\n          }\n        ],\n        \"valueValidators\": [\n          {\n            \"type\": \"NUMBER\"\n          }\n        ]\n      },\n      {\n        \"type\": \"TEXT\",\n        \"name\": \"dpoState\",\n        \"displayName\": \"State\",\n        \"simpleValueType\": true,\n        \"defaultValue\": 0,\n        \"enablingConditions\": [\n          {\n            \"paramName\": \"dpoLDU\",\n            \"paramValue\": true,\n            \"type\": \"EQUALS\"\n          }\n        ],\n        \"valueValidators\": [\n          {\n            \"type\": \"NUMBER\"\n          }\n        ]\n      }\n    ]\n  },\n  {\n    \"enablingConditions\": [\n      {\n        \"paramName\": \"advancedMatching\",\n        \"type\": \"EQUALS\",\n        \"paramValue\": true\n      }\n    ],\n    \"displayName\": \"Customer Information Data Parameters\",\n    \"name\": \"advancedMatchingGroup\",\n    \"groupStyle\": \"ZIPPY_CLOSED\",\n    \"type\": \"GROUP\",\n    \"subParams\": [\n      {\n        \"displayName\": \"\",\n        \"name\": \"advancedMatchingList\",\n        \"simpleTableColumns\": [\n          {\n            \"selectItems\": [\n              {\n                \"displayValue\": \"City\",\n                \"value\": \"ct\"\n              },\n              {\n                \"displayValue\": \"Country\",\n                \"value\": \"cn\"\n              },\n              {\n                \"displayValue\": \"Date of Birth\",\n                \"value\": \"db\"\n              },\n              {\n                \"displayValue\": \"Email\",\n                \"value\": \"em\"\n              },\n              {\n                \"displayValue\": \"External ID\",\n                \"value\": \"external_id\"\n              },\n              {\n                \"displayValue\": \"First Name\",\n                \"value\": \"fn\"\n              },\n              {\n                \"displayValue\": \"Gender\",\n                \"value\": \"ge\"\n              },\n              {\n                \"displayValue\": \"Last Name\",\n                \"value\": \"ln\"\n              },\n              {\n                \"displayValue\": \"Phone\",\n                \"value\": \"ph\"\n              },\n              {\n                \"displayValue\": \"State\",\n                \"value\": \"st\"\n              },\n              {\n                \"displayValue\": \"Zip Code\",\n                \"value\": \"zp\"\n              }\n            ],\n            \"defaultValue\": \"\",\n            \"displayName\": \"Parameter name\",\n            \"name\": \"name\",\n            \"isUnique\": true,\n            \"type\": \"SELECT\"\n          },\n          {\n            \"defaultValue\": \"\",\n            \"displayName\": \"Parameter value\",\n            \"name\": \"value\",\n            \"type\": \"TEXT\"\n          }\n        ],\n        \"type\": \"SIMPLE_TABLE\",\n        \"newRowButtonText\": \"Add parameter\",\n        \"valueValidators\": [\n          {\n            \"type\": \"NON_EMPTY\"\n          }\n        ]\n      }\n    ]\n  },\n  {\n    \"displayName\": \"Object Properties\",\n    \"name\": \"objectPropertiesGroup\",\n    \"groupStyle\": \"ZIPPY_CLOSED\",\n    \"type\": \"GROUP\",\n    \"subParams\": [\n      {\n        \"type\": \"LABEL\",\n        \"name\": \"enhancedEcommerceObject\",\n        \"displayName\": \"\\u003cstrong\\u003eWarning!\\u003c/strong\\u003e Object properties are populated automatically based on the most recent \\u003cstrong\\u003eecommerce\\u003c/strong\\u003e object pushed into dataLayer. If you add properties here that are already set by the integration (content_type, contents, num_items, value, currency), then the properties you add here will override those set automatically by the integration!\",\n        \"enablingConditions\": [\n          {\n            \"paramName\": \"enhancedEcommerce\",\n            \"paramValue\": true,\n            \"type\": \"EQUALS\"\n          }\n        ]\n      },\n      {\n        \"type\": \"SELECT\",\n        \"name\": \"objectPropertiesFromVariable\",\n        \"displayName\": \"Load Properties From Variable\",\n        \"macrosInSelect\": true,\n        \"selectItems\": [\n          {\n            \"value\": false,\n            \"displayValue\": \"False\"\n          }\n        ],\n        \"simpleValueType\": true,\n        \"help\": \"You can use a variable that returns a JavaScript object with the properties you want to use. This object will be merged with any additional properties you add via the table below. Any conflicts will be resolved in favor of the properties you add to the table.\"\n      },\n      {\n        \"name\": \"objectPropertyList\",\n        \"simpleTableColumns\": [\n          {\n            \"valueValidators\": [],\n            \"defaultValue\": \"\",\n            \"displayName\": \"Property Name\",\n            \"name\": \"name\",\n            \"isUnique\": true,\n            \"type\": \"TEXT\"\n          },\n          {\n            \"defaultValue\": \"\",\n            \"displayName\": \"Property Value\",\n            \"name\": \"value\",\n            \"type\": \"TEXT\"\n          }\n        ],\n        \"type\": \"SIMPLE_TABLE\",\n        \"newRowButtonText\": \"Add property\"\n      }\n    ]\n  },\n  {\n    \"displayName\": \"More Settings\",\n    \"name\": \"moreSettingsGroup\",\n    \"groupStyle\": \"ZIPPY_CLOSED\",\n    \"type\": \"GROUP\",\n    \"subParams\": [\n      {\n        \"help\": \"Facebook collects some metadata (e.g. structured data) and user interactions (e.g. clicks) automatically. Check this box to disable this automatic configuration of the pixel.\",\n        \"simpleValueType\": true,\n        \"name\": \"disableAutoConfig\",\n        \"checkboxText\": \"Disable Automatic Configuration\",\n        \"type\": \"CHECKBOX\"\n      },\n      {\n        \"type\": \"CHECKBOX\",\n        \"name\": \"disablePushState\",\n        \"checkboxText\": \"Disable History Event Tracking\",\n        \"simpleValueType\": true,\n        \"help\": \"The Facebook Pixel tracks history events (pushState and replaceState) automatically as PageViews. Check this box to prevent the pixel from tracking such events automatically.\"\n      },\n      {\n        \"type\": \"TEXT\",\n        \"name\": \"eventId\",\n        \"displayName\": \"Event ID\",\n        \"simpleValueType\": true,\n        \"help\": \"Set the Event ID parameter in case you are tracking the same event server-side as well. The Event ID can be used to deduplicate the same event if sent from multiple sources. See more \\u003ca href\\u003d\\\"https://developers.facebook.com/docs/marketing-api/conversions-api/deduplicate-pixel-and-server-events/\\\"\\u003ehere\\u003c/a\\u003e.\"\n      }\n    ]\n  }\n]\n\n\n___SANDBOXED_JS_FOR_WEB_TEMPLATE___\n\nconst createQueue = require('createQueue');\nconst callInWindow = require('callInWindow');\nconst aliasInWindow = require('aliasInWindow');\nconst copyFromWindow = require('copyFromWindow');\nconst setInWindow = require('setInWindow');\nconst injectScript = require('injectScript');\nconst makeTableMap = require('makeTableMap');\nconst makeNumber = require('makeNumber');\nconst getType = require('getType');\nconst copyFromDataLayer = require('copyFromDataLayer');\nconst math = require('Math');\nconst log = require('logToConsole');\nconst getUrl = require('getUrl');\n\nconst PARAM_BUILDER_SCRIPT_URL = 'https://capi-automation.s3.us-east-2.amazonaws.com/public/client_js/capiParamBuilder/clientParamBuilder.bundle.js';\n\nconst initIds = copyFromWindow('_fbq_gtm_ids') || [];\nconst pixelIds = data.pixelId;\nconst standardEventNames = ['AddPaymentInfo', 'AddToCart', 'AddToWishlist', 'CompleteRegistration', 'Contact', 'CustomizeProduct', 'Donate', 'FindLocation', 'InitiateCheckout', 'Lead', 'PageView', 'Purchase', 'Schedule', 'Search', 'StartTrial', 'SubmitApplication', 'Subscribe', 'ViewContent'];\nconst ecommerce = copyFromDataLayer('ecommerce', 1);\nconst eventModel = copyFromDataLayer('eventModel', 1);\n\n// Helper methods\nconst fail = msg => {\n  log(msg);\n  data.gtmOnFailure();\n};\n\nconst mergeObj = (obj, obj2) => {\n  for (let key in obj2) {\n    if (obj2.hasOwnProperty(key)) {\n      obj[key] = obj2[key];\n    }\n  }\n  return obj;\n};\n\nconst parseEecObj = prod => {\n  return {\n    id: prod.id,\n    quantity: prod.quantity\n  };\n};\n\n// Initialize EEC integration\nlet eventName, action, eecObjectProps;\nif (data.enhancedEcommerce) {\n  if (!ecommerce) return fail('Facebook Pixel: No valid \"ecommerce\" object found in dataLayer');\n  if (ecommerce.detail) { eventName = 'ViewContent'; action = 'detail'; }\n  else if (ecommerce.add) { eventName = 'AddToCart'; action = 'add'; }\n  else if (ecommerce.checkout) { eventName = 'InitiateCheckout'; action = 'checkout'; }\n  else if (ecommerce.purchase) { eventName = 'Purchase'; action = 'purchase'; }\n  else return fail('Facebook Pixel: Most recently pushed \"ecommerce\" object must be one of types \"detail\", \"add\", \"checkout\" or \"purchase\".');\n\n  if (!ecommerce[action].products || getType(ecommerce[action].products) !== 'array') return fail('Facebook pixel: Most recently pushed \"ecommerce\" object did not have a valid \"products\" array.');\n  eecObjectProps = {\n    content_type: 'product',\n    contents: ecommerce[action].products.map(parseEecObj),\n    value: ecommerce[action].products.reduce((acc, cur) => {\n      const curVal = math.round(makeNumber(cur.price || 0) * (cur.quantity || 1) * 100) / 100;\n      return acc + curVal;\n    }, 0.0),\n    currency: ecommerce.currencyCode || 'USD'\n  };\n  if (['InitiateCheckout', 'Purchase'].indexOf(eventName) > -1) eecObjectProps.num_items = ecommerce[action].products.reduce((acc,cur) => {\n    return acc + makeNumber(cur.quantity || 1);\n  }, 0);\n}\n\n// Prepare event variables\nconst cidParams = data.advancedMatchingList && data.advancedMatchingList.length ? makeTableMap(data.advancedMatchingList, 'name', 'value') : {};\nconst objectProps = data.objectPropertyList && data.objectPropertyList.length ? makeTableMap(data.objectPropertyList, 'name', 'value') : {};\nconst objectPropsFromVar = getType(data.objectPropertiesFromVariable) === 'object' ? data.objectPropertiesFromVariable : {};\nlet customData = {};\n\neventName = eventName || (data.eventName === 'custom' ? data.customEventName : (data.eventName === 'variable' ? data.variableEventName : data.standardEventName));\n\nconst command = standardEventNames.indexOf(eventName) === -1 ? 'trackSingleCustom' : 'trackSingle';\nconst consent = data.consent === false ? 'revoke' : 'grant';\n\n// Utility function to use either fbq.queue[]\n// (if the FB SDK hasn't loaded yet), or fbq.callMethod()\n// if the SDK has loaded.\nconst getFbq = () => {\n  // Return the existing 'fbq' global method if available\n  let fbq = copyFromWindow('fbq');\n  if (fbq) {\n    return fbq;\n  }\n\n  // Initialize the 'fbq' global method to either use\n  // fbq.callMethod or fbq.queue)\n  setInWindow('fbq', function() {\n    const callMethod = copyFromWindow('fbq.callMethod.apply');\n    if (callMethod) {\n      callInWindow('fbq.callMethod.apply', null, arguments);\n    } else {\n      callInWindow('fbq.queue.push', arguments);\n    }\n  });\n  aliasInWindow('_fbq', 'fbq');\n\n  // Create the fbq.queue\n  createQueue('fbq.queue');\n\n  // Return the global 'fbq' method, created above\n  return copyFromWindow('fbq');\n};\n\n// Get reference to the global method\nconst fbq = getFbq();\n\nfbq('consent', consent);\n\n // Set Data Processing Options\nif (data.dpoLDU) {\n  fbq('dataProcessingOptions', ['LDU'], makeNumber(data.dpoCountry), makeNumber(data.dpoState));\n}\n\n// Monitoring agent string for Tag Setup\nconst agentName = 'tmSimo-GTM-WebTemplate';\nconst version = '2.0.5';\nconst agentSuffix = (data.enhancedEcommerce ? '-EEC' : '') + (data.useGA4Ecommerce ? '-GA4' : '');\n\n// Handle multiple, comma-separated pixel IDs,\n// and initialize each ID if not done already.\npixelIds.split(',').forEach(pixelId => {\n  if (initIds.indexOf(pixelId) === -1) {\n\n    // If the user has chosen to disable automatic configuration\n    if (data.disableAutoConfig) {\n      fbq('set', 'autoConfig', false, pixelId);\n    }\n\n    // If the user has chosen to disable pushState and replaceState tracking\n    if (data.disablePushState) {\n      setInWindow('fbq.disablePushState', true);\n    }\n\n\n    // Initialize pixel and store in global array\n    fbq('init', pixelId, cidParams);\n\n    // Monitoring agent string for Tag Setup\n    const agentString = agentName + '-' + version + agentSuffix;\n    fbq('set','agent', agentString, pixelId);\n\n    initIds.push(pixelId);\n    setInWindow('_fbq_gtm_ids', initIds, true);\n\n    // If this first-time init included cidParams, mark the page as\n    // already-initialized-with-cidParams so we never re-init for it.\n    if (data.advancedMatchingList && data.advancedMatchingList.length) {\n      setInWindow('_fbq_gtm_cidparams_initialized', true, true);\n    }\n  }\n});\n\n// Re-init pixels with cidParams when:\n//   - this tag fire actually has Advanced Matching data, AND\n//   - we have NOT yet initialized any pixel with cidParams on this page.\nif (data.advancedMatchingList && data.advancedMatchingList.length) {\n  const cidParamsInitialized = copyFromWindow('_fbq_gtm_cidparams_initialized') === true;\n  if (!cidParamsInitialized) {\n    setInWindow('_fbq_gtm_cidparams_initialized', true, true);\n\n    const firstPixelId = pixelIds.split(',')[0];\n    callInWindow(\n      'fbq',\n      'gateCheck',\n      'enable_reinit_cidparams2',\n      function(gateName, pixelID) {\n        pixelIds.split(',').forEach(pixelId => {\n          if (initIds.indexOf(pixelId) !== -1) {\n            fbq('init', pixelId, cidParams);\n            const reinitAgentString = agentName + '-' + version + agentSuffix + '-REINIT';\n            fbq('set', 'agent', reinitAgentString, pixelId);\n          }\n        });\n      },\n      function(gateName, pixelID) {},\n      firstPixelId\n    );\n  }\n}\n\nconst fireEvent = (resolvedCustomData) => {\n  const mergedCustom = mergeObj(resolvedCustomData, eecObjectProps || {});\n  const mergedObjectProps = mergeObj(objectPropsFromVar, objectProps);\n  const finalObjectProps = mergeObj(mergedCustom, mergedObjectProps);\n\n  pixelIds.split(',').forEach(pixelId => {\n    if (data.eventId) {\n      fbq(command, pixelId, eventName, finalObjectProps, {eventID: data.eventId});\n    } else {\n      fbq(command, pixelId, eventName, finalObjectProps);\n    }\n  });\n};\n\nif (data.useGA4Ecommerce) {\n  const firstPixelId = pixelIds.split(',')[0];\n  callInWindow(\n    'fbq',\n    'gateCheck',\n    'enable_gtm_ga4_structure',\n    function(gateName, pixelID) {\n      // Set user_data from eventModel into cidParams\n      if (eventModel && eventModel.user_data) {\n        var ud = eventModel.user_data;\n        if (ud.email_address && !cidParams.em) cidParams.em = ud.email_address;\n        if (ud.phone_number && !cidParams.ph) cidParams.ph = ud.phone_number;\n        if (ud.address) {\n          if (ud.address.first_name && !cidParams.fn) cidParams.fn = ud.address.first_name;\n          if (ud.address.last_name && !cidParams.ln) cidParams.ln = ud.address.last_name;\n          if (ud.address.city && !cidParams.ct) cidParams.ct = ud.address.city;\n          if (ud.address.region && !cidParams.st) cidParams.st = ud.address.region;\n          if (ud.address.postal_code && !cidParams.zp) cidParams.zp = ud.address.postal_code;\n          if (ud.address.country && !cidParams.country) cidParams.country = ud.address.country;\n        }\n        if (ud.fb_login_id && !cidParams.fb_login_id) cidParams.fb_login_id = ud.fb_login_id;\n\n        pixelIds.split(',').forEach(function(pixelId) {\n          fbq('init', pixelId, cidParams);\n        });\n      }\n\n      // Set custom_data from eventModel\n      if (eventModel) {\n        if (eventModel.currency) customData.currency = eventModel.currency;\n        if (eventModel.value) customData.value = eventModel.value;\n        if (eventModel.search_term) customData.search_string = eventModel.search_term;\n        if (eventModel.transaction_id) customData.order_id = eventModel.transaction_id;\n        if (eventModel.items && getType(eventModel.items) === 'array') {\n          customData.contents = eventModel.items.map(function(item) {\n            return {\n              id: (item.item_id || item.item_name) || undefined,\n              item_price: item.price || undefined,\n              quantity: item.quantity || undefined\n            };\n          });\n        }\n      }\n\n      fireEvent(customData);\n    },\n    function(gateName, pixelID) {\n      fireEvent(customData);\n    },\n    firstPixelId\n  );\n} else {\n  fireEvent(customData);\n}\n\n// Inject Param Builder script if enabled\nconst onParamBuilderFailure = () => {\n  log('Facebook Pixel: Failed to load clientParamBuilder script');\n};\n\n// Param Builder callback - called after script loads\nconst processAndCollectAllParams = () => {\n  log(\"ParamBuilder script loaded successfully, processing and collecting all params...\");\n  const clientParamBuilder = copyFromWindow('clientParamBuilder');\n  if (!clientParamBuilder) {\n    log(\"ERROR: clientParamBuilder wasn't loaded correctly.\");\n    return;\n  }\n\n  const currentPageUrl = getUrl();\n\n  // Check which method exists and call it via callInWindow\n  const hasProcessAndCollectAllParams = copyFromWindow('clientParamBuilder.processAndCollectAllParams');\n  const hasProcessAndCollectParams = copyFromWindow('clientParamBuilder.processAndCollectParams');\n\n  if (hasProcessAndCollectAllParams) {\n    callInWindow('clientParamBuilder.processAndCollectAllParams', currentPageUrl);\n    log(\"processAndCollectAllParams completed successfully.\");\n    setInWindow('_fbq_param_builder_status', 'complete', true);\n    data.gtmOnSuccess();\n  } else if (hasProcessAndCollectParams) {\n    callInWindow('clientParamBuilder.processAndCollectParams', currentPageUrl);\n    log(\"processAndCollectParams completed successfully.\");\n    setInWindow('_fbq_param_builder_status', 'complete', true);\n    data.gtmOnSuccess();\n  } else {\n    log(\"ERROR: Neither processAndCollectAllParams nor processAndCollectParams methods found.\");\n    data.gtmOnFailure();\n  }\n};\n\n\nfunction gtmSuccess() {\n  const status = copyFromWindow('_fbq_param_builder_status');\n\n  // If it's done OR currently downloading, skip injecting it again!\n  if (status === 'complete' || status === 'loading') {\n    return data.gtmOnSuccess();\n  }\n\n  // Immediately lock the state synchronously so Tag 2 doesn't enter this block\n  setInWindow('_fbq_param_builder_status', 'loading', true);\n\n  var firstPixelId = pixelIds.split(',')[0];\n\n  callInWindow(\n    'fbq',\n    'gateCheck',\n    'enable_gtm_parambuilder',\n    function(gateName, pixelID) {\n      injectScript(PARAM_BUILDER_SCRIPT_URL, processAndCollectAllParams, onParamBuilderFailure, PARAM_BUILDER_SCRIPT_URL);\n    },\n    function(gateName, pixelID) {\n      data.gtmOnSuccess();\n    },\n    firstPixelId\n  );\n}\n\n// Use the URL as the cache token (matches original paramBuilder template)\n\ninjectScript('https://connect.facebook.net/en_US/fbevents.js', gtmSuccess, data.gtmOnFailure, 'fbPixel');\n\n\n___WEB_PERMISSIONS___\n\n[\n  {\n    \"instance\": {\n      \"key\": {\n        \"publicId\": \"access_globals\",\n        \"versionId\": \"1\"\n      },\n      \"param\": [\n        {\n          \"key\": \"keys\",\n          \"value\": {\n            \"type\": 2,\n            \"listItem\": [\n              {\n                \"type\": 3,\n                \"mapKey\": [\n                  {\n                    \"type\": 1,\n                    \"string\": \"key\"\n                  },\n                  {\n                    \"type\": 1,\n                    \"string\": \"read\"\n                  },\n                  {\n                    \"type\": 1,\n                    \"string\": \"write\"\n                  },\n                  {\n                    \"type\": 1,\n                    \"string\": \"execute\"\n                  }\n                ],\n                \"mapValue\": [\n                  {\n                    \"type\": 1,\n                    \"string\": \"fbq\"\n                  },\n                  {\n                    \"type\": 8,\n                    \"boolean\": true\n                  },\n                  {\n                    \"type\": 8,\n                    \"boolean\": true\n                  },\n                  {\n                    \"type\": 8,\n                    \"boolean\": true\n                  }\n                ]\n              },\n              {\n                \"type\": 3,\n                \"mapKey\": [\n                  {\n                    \"type\": 1,\n                    \"string\": \"key\"\n                  },\n                  {\n                    \"type\": 1,\n                    \"string\": \"read\"\n                  },\n                  {\n                    \"type\": 1,\n                    \"string\": \"write\"\n                  },\n                  {\n                    \"type\": 1,\n                    \"string\": \"execute\"\n                  }\n                ],\n                \"mapValue\": [\n                  {\n                    \"type\": 1,\n                    \"string\": \"_fbq_gtm\"\n                  },\n                  {\n                    \"type\": 8,\n                    \"boolean\": true\n                  },\n                  {\n                    \"type\": 8,\n                    \"boolean\": true\n                  },\n                  {\n                    \"type\": 8,\n                    \"boolean\": false\n                  }\n                ]\n              },\n              {\n                \"type\": 3,\n                \"mapKey\": [\n                  {\n                    \"type\": 1,\n                    \"string\": \"key\"\n                  },\n                  {\n                    \"type\": 1,\n                    \"string\": \"read\"\n                  },\n                  {\n                    \"type\": 1,\n                    \"string\": \"write\"\n                  },\n                  {\n                    \"type\": 1,\n                    \"string\": \"execute\"\n                  }\n                ],\n                \"mapValue\": [\n                  {\n                    \"type\": 1,\n                    \"string\": \"_fbq\"\n                  },\n                  {\n                    \"type\": 8,\n                    \"boolean\": false\n                  },\n                  {\n                    \"type\": 8,\n                    \"boolean\": true\n                  },\n                  {\n                    \"type\": 8,\n                    \"boolean\": false\n                  }\n                ]\n              },\n              {\n                \"type\": 3,\n                \"mapKey\": [\n                  {\n                    \"type\": 1,\n                    \"string\": \"key\"\n                  },\n                  {\n                    \"type\": 1,\n                    \"string\": \"read\"\n                  },\n                  {\n                    \"type\": 1,\n                    \"string\": \"write\"\n                  },\n                  {\n                    \"type\": 1,\n                    \"string\": \"execute\"\n                  }\n                ],\n                \"mapValue\": [\n                  {\n                    \"type\": 1,\n                    \"string\": \"_fbq_gtm_ids\"\n                  },\n                  {\n                    \"type\": 8,\n                    \"boolean\": true\n                  },\n                  {\n                    \"type\": 8,\n                    \"boolean\": true\n                  },\n                  {\n                    \"type\": 8,\n                    \"boolean\": false\n                  }\n                ]\n              },\n              {\n                \"type\": 3,\n                \"mapKey\": [\n                  {\n                    \"type\": 1,\n                    \"string\": \"key\"\n                  },\n                  {\n                    \"type\": 1,\n                    \"string\": \"read\"\n                  },\n                  {\n                    \"type\": 1,\n                    \"string\": \"write\"\n                  },\n                  {\n                    \"type\": 1,\n                    \"string\": \"execute\"\n                  }\n                ],\n                \"mapValue\": [\n                  {\n                    \"type\": 1,\n                    \"string\": \"_fbq_gtm_cidparams_initialized\"\n                  },\n                  {\n                    \"type\": 8,\n                    \"boolean\": true\n                  },\n                  {\n                    \"type\": 8,\n                    \"boolean\": true\n                  },\n                  {\n                    \"type\": 8,\n                    \"boolean\": false\n                  }\n                ]\n              },\n              {\n                \"type\": 3,\n                \"mapKey\": [\n                  {\n                    \"type\": 1,\n                    \"string\": \"key\"\n                  },\n                  {\n                    \"type\": 1,\n                    \"string\": \"read\"\n                  },\n                  {\n                    \"type\": 1,\n                    \"string\": \"write\"\n                  },\n                  {\n                    \"type\": 1,\n                    \"string\": \"execute\"\n                  }\n                ],\n                \"mapValue\": [\n                  {\n                    \"type\": 1,\n                    \"string\": \"fbq.callMethod.apply\"\n                  },\n                  {\n                    \"type\": 8,\n                    \"boolean\": true\n                  },\n                  {\n                    \"type\": 8,\n                    \"boolean\": false\n                  },\n                  {\n                    \"type\": 8,\n                    \"boolean\": true\n                  }\n                ]\n              },\n              {\n                \"type\": 3,\n                \"mapKey\": [\n                  {\n                    \"type\": 1,\n                    \"string\": \"key\"\n                  },\n                  {\n                    \"type\": 1,\n                    \"string\": \"read\"\n                  },\n                  {\n                    \"type\": 1,\n                    \"string\": \"write\"\n                  },\n                  {\n                    \"type\": 1,\n                    \"string\": \"execute\"\n                  }\n                ],\n                \"mapValue\": [\n                  {\n                    \"type\": 1,\n                    \"string\": \"fbq.queue.push\"\n                  },\n                  {\n                    \"type\": 8,\n                    \"boolean\": false\n                  },\n                  {\n                    \"type\": 8,\n                    \"boolean\": false\n                  },\n                  {\n                    \"type\": 8,\n                    \"boolean\": true\n                  }\n                ]\n              },\n              {\n                \"type\": 3,\n                \"mapKey\": [\n                  {\n                    \"type\": 1,\n                    \"string\": \"key\"\n                  },\n                  {\n                    \"type\": 1,\n                    \"string\": \"read\"\n                  },\n                  {\n                    \"type\": 1,\n                    \"string\": \"write\"\n                  },\n                  {\n                    \"type\": 1,\n                    \"string\": \"execute\"\n                  }\n                ],\n                \"mapValue\": [\n                  {\n                    \"type\": 1,\n                    \"string\": \"fbq.queue\"\n                  },\n                  {\n                    \"type\": 8,\n                    \"boolean\": true\n                  },\n                  {\n                    \"type\": 8,\n                    \"boolean\": true\n                  },\n                  {\n                    \"type\": 8,\n                    \"boolean\": false\n                  }\n                ]\n              },\n              {\n                \"type\": 3,\n                \"mapKey\": [\n                  {\n                    \"type\": 1,\n                    \"string\": \"key\"\n                  },\n                  {\n                    \"type\": 1,\n                    \"string\": \"read\"\n                  },\n                  {\n                    \"type\": 1,\n                    \"string\": \"write\"\n                  },\n                  {\n                    \"type\": 1,\n                    \"string\": \"execute\"\n                  }\n                ],\n                \"mapValue\": [\n                  {\n                    \"type\": 1,\n                    \"string\": \"fbq.disablePushState\"\n                  },\n                  {\n                    \"type\": 8,\n                    \"boolean\": true\n                  },\n                  {\n                    \"type\": 8,\n                    \"boolean\": true\n                  },\n                  {\n                    \"type\": 8,\n                    \"boolean\": false\n                  }\n                ]\n              },\n              {\n                \"type\": 3,\n                \"mapKey\": [\n                  {\n                    \"type\": 1,\n                    \"string\": \"key\"\n                  },\n                  {\n                    \"type\": 1,\n                    \"string\": \"read\"\n                  },\n                  {\n                    \"type\": 1,\n                    \"string\": \"write\"\n                  },\n                  {\n                    \"type\": 1,\n                    \"string\": \"execute\"\n                  }\n                ],\n                \"mapValue\": [\n                  {\n                    \"type\": 1,\n                    \"string\": \"_fbq_param_builder_status\"\n                  },\n                  {\n                    \"type\": 8,\n                    \"boolean\": true\n                  },\n                  {\n                    \"type\": 8,\n                    \"boolean\": true\n                  },\n                  {\n                    \"type\": 8,\n                    \"boolean\": false\n                  }\n                ]\n              },\n              {\n                \"type\": 3,\n                \"mapKey\": [\n                  {\n                    \"type\": 1,\n                    \"string\": \"key\"\n                  },\n                  {\n                    \"type\": 1,\n                    \"string\": \"read\"\n                  },\n                  {\n                    \"type\": 1,\n                    \"string\": \"write\"\n                  },\n                  {\n                    \"type\": 1,\n                    \"string\": \"execute\"\n                  }\n                ],\n                \"mapValue\": [\n                  {\n                    \"type\": 1,\n                    \"string\": \"clientParamBuilder\"\n                  },\n                  {\n                    \"type\": 8,\n                    \"boolean\": true\n                  },\n                  {\n                    \"type\": 8,\n                    \"boolean\": true\n                  },\n                  {\n                    \"type\": 8,\n                    \"boolean\": true\n                  }\n                ]\n              },\n              {\n                \"type\": 3,\n                \"mapKey\": [\n                  {\n                    \"type\": 1,\n                    \"string\": \"key\"\n                  },\n                  {\n                    \"type\": 1,\n                    \"string\": \"read\"\n                  },\n                  {\n                    \"type\": 1,\n                    \"string\": \"write\"\n                  },\n                  {\n                    \"type\": 1,\n                    \"string\": \"execute\"\n                  }\n                ],\n                \"mapValue\": [\n                  {\n                    \"type\": 1,\n                    \"string\": \"clientParamBuilder.processAndCollectAllParams\"\n                  },\n                  {\n                    \"type\": 8,\n                    \"boolean\": true\n                  },\n                  {\n                    \"type\": 8,\n                    \"boolean\": false\n                  },\n                  {\n                    \"type\": 8,\n                    \"boolean\": true\n                  }\n                ]\n              },\n              {\n                \"type\": 3,\n                \"mapKey\": [\n                  {\n                    \"type\": 1,\n                    \"string\": \"key\"\n                  },\n                  {\n                    \"type\": 1,\n                    \"string\": \"read\"\n                  },\n                  {\n                    \"type\": 1,\n                    \"string\": \"write\"\n                  },\n                  {\n                    \"type\": 1,\n                    \"string\": \"execute\"\n                  }\n                ],\n                \"mapValue\": [\n                  {\n                    \"type\": 1,\n                    \"string\": \"clientParamBuilder.processAndCollectParams\"\n                  },\n                  {\n                    \"type\": 8,\n                    \"boolean\": true\n                  },\n                  {\n                    \"type\": 8,\n                    \"boolean\": false\n                  },\n                  {\n                    \"type\": 8,\n                    \"boolean\": true\n                  }\n                ]\n              }\n            ]\n          }\n        }\n      ]\n    },\n    \"clientAnnotations\": {\n      \"isEditedByUser\": true\n    },\n    \"isRequired\": true\n  },\n  {\n    \"instance\": {\n      \"key\": {\n        \"publicId\": \"inject_script\",\n        \"versionId\": \"1\"\n      },\n      \"param\": [\n        {\n          \"key\": \"urls\",\n          \"value\": {\n            \"type\": 2,\n            \"listItem\": [\n              {\n                \"type\": 1,\n                \"string\": \"https://connect.facebook.net/en_US/fbevents.js\"\n              },\n              {\n                \"type\": 1,\n                \"string\": \"https://capi-automation.s3.us-east-2.amazonaws.com/public/client_js/capiParamBuilder/clientParamBuilder.bundle.js\"\n              }\n            ]\n          }\n        }\n      ]\n    },\n    \"clientAnnotations\": {\n      \"isEditedByUser\": true\n    },\n    \"isRequired\": true\n  },\n  {\n    \"instance\": {\n      \"key\": {\n        \"publicId\": \"logging\",\n        \"versionId\": \"1\"\n      },\n      \"param\": [\n        {\n          \"key\": \"environments\",\n          \"value\": {\n            \"type\": 1,\n            \"string\": \"debug\"\n          }\n        }\n      ]\n    },\n    \"isRequired\": true\n  },\n  {\n    \"instance\": {\n      \"key\": {\n        \"publicId\": \"read_data_layer\",\n        \"versionId\": \"1\"\n      },\n      \"param\": [\n        {\n          \"key\": \"allowedKeys\",\n          \"value\": {\n            \"type\": 1,\n            \"string\": \"specific\"\n          }\n        },\n        {\n          \"key\": \"keyPatterns\",\n          \"value\": {\n            \"type\": 2,\n            \"listItem\": [\n              {\n                \"type\": 1,\n                \"string\": \"ecommerce\"\n              },\n              {\n                \"type\": 1,\n                \"string\": \"eventModel\"\n              }\n            ]\n          }\n        }\n      ]\n    },\n    \"clientAnnotations\": {\n      \"isEditedByUser\": true\n    },\n    \"isRequired\": true\n  },\n  {\n    \"instance\": {\n      \"key\": {\n        \"publicId\": \"get_url\",\n        \"versionId\": \"1\"\n      },\n      \"param\": [\n        {\n          \"key\": \"urlParts\",\n          \"value\": {\n            \"type\": 1,\n            \"string\": \"any\"\n          }\n        },\n        {\n          \"key\": \"queriesAllowed\",\n          \"value\": {\n            \"type\": 1,\n            \"string\": \"any\"\n          }\n        }\n      ]\n    },\n    \"isRequired\": true\n  }\n]\n\n\n___TESTS___\n\nscenarios:\n- name: Library is injected\n  code: |+\n    // Call runCode to run the template's code.\n    runCode(mockData);\n\n    // 1. Verify the Facebook Pixel URL was requested\n    assertThat(injectedUrls).contains('https://connect.facebook.net/en_US/fbevents.js');\n\n    // 2. Verify the Param Builder URL was requested\n    assertThat(injectedUrls).contains('https://capi-automation.s3.us-east-2.amazonaws.com/public/client_js/capiParamBuilder/clientParamBuilder.bundle.js');\n\n    // 3. Verify the template finished successfully\n    assertApi('gtmOnSuccess').wasCalled();\n\n- name: fbq does not exist - method created\n  code: |-\n    let fbq;\n\n    mock('copyFromWindow', key => {\n      // 1. The specific logic for this test (mocking fbq absence)\n      if (key === 'fbq') return fbq;\n\n      // 2. The required logic for the template to finish (ParamBuilder mocks)\n      if (key === 'clientParamBuilder') return {};\n      if (key === 'clientParamBuilder.processAndCollectAllParams') return () => {};\n    });\n\n    mock('createQueue', key => {});\n\n    mock('setInWindow', (key, val) => {\n      if (key === 'fbq') fbq = val;\n    });\n\n    // Call runCode to run the template's code.\n    runCode(mockData);\n\n    // Verify that the tag finished successfully.\n    assertApi('aliasInWindow').wasCalledWith('_fbq', 'fbq');\n    assertApi('setInWindow').wasCalled();\n    assertApi('gtmOnSuccess').wasCalled();\n- name: fbq exists - method copied\n  code: |-\n    mock('setInWindow', key => {\n      if (key === 'fbq') fail('setInWindow called with fbq even though variable exists');\n    });\n\n    mock('createQueue', key => {});\n\n    // Call runCode to run the template's code.\n    runCode(mockData);\n\n    // Verify that the tag finished successfully.\n    assertApi('gtmOnSuccess').wasCalled();\n- name: makeTableMap called\n  code: |-\n    mockData.advancedMatching = true;\n\n    // Call runCode to run the template's code.\n    runCode(mockData);\n\n    // Verify that the tag finished successfully.\n    assertApi('makeTableMap').wasCalledWith(mockData.advancedMatchingList, 'name', 'value');\n    assertApi('makeTableMap').wasCalledWith(mockData.objectPropertyList, 'name', 'value');\n    assertApi('gtmOnSuccess').wasCalled();\n- name: Consent set\n  code: |-\n    mock('copyFromWindow', key => {\n      // 1. The specific logic for this test (checking fbq consent)\n      if (key === 'fbq') return function() {\n        if (arguments[0] === 'consent') {\n          assertThat(arguments[1], 'Consent set incorrectly').isEqualTo('grant');\n        }\n      };\n\n      // 2. The required logic for the template to finish (ParamBuilder mocks)\n      if (key === 'clientParamBuilder') return {};\n      if (key === 'clientParamBuilder.processAndCollectAllParams') return () => {};\n    });\n\n    // Call runCode to run the template's code.\n    runCode(mockData);\n\n    // Verify that the tag finished successfully.\n    assertApi('gtmOnSuccess').wasCalled();\n- name: DPO LDU set\n  code: |-\n    mockData.dpoLDU = true;\n    mockData.dpoCountry = '0';\n    mockData.dpoState = '0';\n\n    mock('copyFromWindow', key => {\n      // 1. The specific logic for this test (checking fbq DPO options)\n      if (key === 'fbq') return function() {\n        if (arguments[0] === 'consent') {\n          assertThat(arguments[1], 'Consent set incorrectly').isEqualTo('grant');\n        }\n        if (arguments[0] === 'dataProcessingOptions') {\n          assertThat(arguments[1], 'LDU array value not set').isEqualTo(['LDU']);\n          assertThat(arguments[2], 'LDU country not set').isEqualTo(0);\n          assertThat(arguments[3], 'LDU state not set').isEqualTo(0);\n        }\n      };\n\n      // 2. The required logic for the template to finish (ParamBuilder mocks)\n      if (key === 'clientParamBuilder') return {};\n      if (key === 'clientParamBuilder.processAndCollectAllParams') return () => {};\n    });\n\n    // Call runCode to run the template's code.\n    runCode(mockData);\n\n    // Verify that the tag finished successfully.\n    assertApi('gtmOnSuccess').wasCalled();\n- name: DPO LDU not set\n  code: |-\n    mock('copyFromWindow', key => {\n      // 1. The specific logic for this test (checking fbq consent and ensuring DPO is NOT called)\n      if (key === 'fbq') return function() {\n        if (arguments[0] === 'consent') {\n          assertThat(arguments[1], 'Consent set incorrectly').isEqualTo('grant');\n        }\n        if (arguments[0] === 'dataProcessingOptions') {\n          fail('dataProcessingOptions called even though DPO was not set');\n        }\n      };\n\n      // 2. The required logic for the template to finish (ParamBuilder mocks)\n      if (key === 'clientParamBuilder') return {};\n      if (key === 'clientParamBuilder.processAndCollectAllParams') return () => {};\n    });\n\n    // Call runCode to run the template's code.\n    runCode(mockData);\n\n    // Verify that the tag finished successfully.\n    assertApi('gtmOnSuccess').wasCalled();\n- name: Pixel IDs set - do not initialize\n  code: |-\n    // Clear advancedMatchingList so the cidParams update block is skipped,\n    // isolating the init guard behavior.\n    mockData.advancedMatchingList = [];\n\n    mock('copyFromWindow', key => {\n      // 1. The specific logic for this test (checking initialized IDs and preventing re-init)\n      if (key === '_fbq_gtm_ids') return ['12345', '23456'];\n      if (key === 'fbq') return function() {\n        if (arguments[0] === 'init') fail('init called even though pixel IDs already initialized');\n      };\n\n      // 2. The required logic for the template to finish (ParamBuilder mocks)\n      if (key === 'clientParamBuilder') return {};\n      if (key === 'clientParamBuilder.processAndCollectAllParams') return () => {};\n    });\n\n    // Call runCode to run the template's code.\n    runCode(mockData);\n\n    // Verify that the tag finished successfully.\n    assertApi('gtmOnSuccess').wasCalled();\n- name: Pixel IDs not set - run init process\n  code: \"mockData.enhancedEcommerce = true;\\n\\nmockData.objectPropertyList = {};\\n\\\n    \\n\\n\\nmock('copyFromDataLayer', key => {\\n\\n  if (key === 'ecommerce') return\\\n    \\ {\\n\\n    currencyCode: 'EUR',\\n\\n    detail: {\\n\\n      products: mockEec.gtm.products\\n\\\n    \\n    }\\n\\n  };\\n\\n});\\n\\n\\n\\nlet index = 0;\\n\\nmock('copyFromWindow', key =>\\\n    \\ {\\n\\n  // 1. The specific logic for this test (checking fbq trackSingle calls)\\n\\\n    \\n  if (key === 'fbq') return function() {\\n\\n    if (arguments[0] === 'trackSingle')\\\n    \\ {\\n\\n      assertThat(arguments[1], 'trackSingle called with incorrect pixel\\\n    \\ ID').isEqualTo(mockData.pixelId.split(',')[index]);\\n\\n      assertThat(arguments[2],\\\n    \\ 'trackSingle called with incorrect event name').isEqualTo('ViewContent');\\n\\n\\\n    \\      assertThat(arguments[3], 'trackSingle called with incorrect event parameters').isEqualTo(mockEec.fb);\\n\\\n    \\n      index += 1;\\n\\n    }\\n\\n  };\\n\\n\\n\\n  // 2. The required logic for the\\\n    \\ template to finish (ParamBuilder mocks)\\n\\n  if (key === 'clientParamBuilder')\\\n    \\ return {};\\n\\n  if (key === 'clientParamBuilder.processAndCollectAllParams')\\\n    \\ return () => {};\\n\\n});\\n\\n      \\n\\n// Call runCode to run the template's code.\\n\\\n    \\nrunCode(mockData);\\n\\n\\n\\n// Verify that the tag finished successfully.\\n\\n\\\n    assertThat(index, 'trackSingle called incorrect number of times').isEqualTo(2);\\n\\\n    \\nassertApi('gtmOnSuccess').wasCalled();\"\n- name: cidParams updated on subsequent fire when pixel already initialized\n  code: |-\n    mockData.advancedMatchingList = [\n      {name: 'em', value: 'user@example.com'}\n    ];\n\n    let initCalls = [];\n    mock('copyFromWindow', key => {\n      // Pixels already initialized, but no init-with-cidParams happened yet\n      if (key === '_fbq_gtm_ids') return ['12345', '23456'];\n      if (key === '_fbq_gtm_cidparams_initialized') return false;\n      if (key === 'fbq') return function() {\n        if (arguments[0] === 'init') {\n          initCalls.push({pixelId: arguments[1], cidParams: arguments[2]});\n        }\n      };\n\n      // Required ParamBuilder mocks\n      if (key === 'clientParamBuilder') return {};\n      if (key === 'clientParamBuilder.processAndCollectAllParams') return () => {};\n    });\n\n    runCode(mockData);\n\n    // Init guard skipped (pixels already initialized).\n    // Re-init block fires init for each already-initialized pixel with cidParams.\n    assertThat(initCalls.length).isEqualTo(2);\n    assertThat(initCalls[0].pixelId).isEqualTo('12345');\n    assertThat(initCalls[0].cidParams.em).isEqualTo('user@example.com');\n    assertThat(initCalls[1].pixelId).isEqualTo('23456');\n    assertThat(initCalls[1].cidParams.em).isEqualTo('user@example.com');\n    assertApi('gtmOnSuccess').wasCalled();\n- name: cidParams not updated on subsequent fire when advancedMatchingList is empty\n  code: |-\n    mockData.advancedMatchingList = [];\n\n    mock('copyFromWindow', key => {\n      // Simulate pixel already initialized\n      if (key === '_fbq_gtm_ids') return ['12345', '23456'];\n      if (key === 'fbq') return function() {\n        if (arguments[0] === 'init') {\n          fail('init called even though advancedMatchingList is empty and pixels are already initialized');\n        }\n      };\n\n      // Required ParamBuilder mocks\n      if (key === 'clientParamBuilder') return {};\n      if (key === 'clientParamBuilder.processAndCollectAllParams') return () => {};\n    });\n\n    runCode(mockData);\n\n    assertApi('gtmOnSuccess').wasCalled();\n- name: cidParams updated on first fire only initializes once with cidParams\n  code: |-\n    mockData.advancedMatchingList = [\n      {name: 'em', value: 'user@example.com'},\n      {name: 'ph', value: '5551234567'}\n    ];\n\n    let initCalls = [];\n    mock('copyFromWindow', key => {\n      // Pixels not yet initialized\n      if (key === '_fbq_gtm_ids') return [];\n      if (key === '_fbq_gtm_cidparams_initialized') return false;\n      if (key === 'fbq') return function() {\n        if (arguments[0] === 'init') {\n          initCalls.push({pixelId: arguments[1], cidParams: arguments[2]});\n        }\n      };\n\n      // Required ParamBuilder mocks\n      if (key === 'clientParamBuilder') return {};\n      if (key === 'clientParamBuilder.processAndCollectAllParams') return () => {};\n    });\n\n    runCode(mockData);\n\n    // Init guard runs once per pixel with cidParams.\n    // Re-init block is also entered (cidParamsInitialized was false at read time)\n    // and re-runs init for each pixel that is now in initIds \u2014 that is the\n    // intended idempotent behavior; both pixels end up correctly initialized.\n    assertThat(initCalls.length).isEqualTo(4);\n    assertThat(initCalls[0].cidParams.em).isEqualTo('user@example.com');\n    assertThat(initCalls[0].cidParams.ph).isEqualTo('5551234567');\n    assertApi('gtmOnSuccess').wasCalled();\n- name: cidParams not re-initialized when already initialized with cidParams on a\n    previous fire\n  code: |-\n    mockData.advancedMatchingList = [\n      {name: 'em', value: 'newuser@example.com'}\n    ];\n\n    mock('copyFromWindow', key => {\n      // Pixels already initialized AND a previous fire already pushed cidParams\n      if (key === '_fbq_gtm_ids') return ['12345', '23456'];\n      if (key === '_fbq_gtm_cidparams_initialized') return true;\n      if (key === 'fbq') return function() {\n        if (arguments[0] === 'init') {\n          fail('init called even though cidParams were already initialized on a prior fire');\n        }\n      };\n\n      // Required ParamBuilder mocks\n      if (key === 'clientParamBuilder') return {};\n      if (key === 'clientParamBuilder.processAndCollectAllParams') return () => {};\n    });\n\n    runCode(mockData);\n\n    assertApi('gtmOnSuccess').wasCalled();\n- name: cidParams re-init skipped when enable_reinit_cidparams2 gate is disabled\n  code: |-\n    mockData.advancedMatchingList = [\n      {name: 'em', value: 'user@example.com'}\n    ];\n\n    // Override the default callInWindow mock so the re-init gateCheck calls\n    // onDisabled, while the param builder gateCheck still calls onEnabled.\n    mock('callInWindow', (propName, arg1, arg2, arg3, arg4, arg5) => {\n      if (propName === 'fbq' && arg1 === 'gateCheck') {\n        if (arg2 === 'enable_reinit_cidparams2') {\n          if (typeof arg4 === 'function') arg4(arg2, arg5);\n        } else {\n          if (typeof arg3 === 'function') arg3(arg2, arg5);\n        }\n      }\n      return true;\n    });\n\n    mock('copyFromWindow', key => {\n      // Pixel previously initialized without cidParams\n      if (key === '_fbq_gtm_ids') return ['12345', '23456'];\n      if (key === '_fbq_gtm_cidparams_initialized') return false;\n      if (key === 'fbq') return function() {\n        if (arguments[0] === 'init') {\n          fail('init called even though enable_reinit_cidparams2 gate is disabled');\n        }\n      };\n\n      // Required ParamBuilder mocks\n      if (key === 'clientParamBuilder') return {};\n      if (key === 'clientParamBuilder.processAndCollectAllParams') return () => {};\n    });\n\n    runCode(mockData);\n\n    assertApi('gtmOnSuccess').wasCalled();\n- name: Send standard event\n  code: \"const eventParams = {\\n  prop1: 'val1',\\n  prop2: 'val2'\\n};\\n\\nlet index\\\n    \\ = 0;\\nmock('copyFromWindow', key => {\\n  // 1. The specific logic for this test\\\n    \\ (checking fbq trackSingle calls)\\n  if (key === 'fbq') return function() {\\n\\\n    \\    if (arguments[0] === 'trackSingle') {\\n      assertThat(arguments[1], 'trackSingle\\\n    \\ called with incorrect pixel ID').isEqualTo(mockData.pixelId.split(',')[index]);\\n\\\n    \\      assertThat(arguments[2], 'trackSingle called with incorrect event name').isEqualTo(mockData.standardEventName);\\n\\\n    \\      assertThat(arguments[3], 'trackSingle called with incorrect event parameters').isEqualTo(eventParams);\\n\\\n    \\      index += 1;\\n    }\\n  };\\n\\n  // 2. The required logic for the template\\\n    \\ to finish (ParamBuilder mocks)\\n  if (key === 'clientParamBuilder') return {};\\n\\\n    \\  if (key === 'clientParamBuilder.processAndCollectAllParams') return () => {};\\n\\\n    });\\n      \\n// Call runCode to run the template's code.\\nrunCode(mockData);\\n\\\n    \\n// Verify that the tag finished successfully.\\nassertThat(index, 'trackSingle\\\n    \\ called incorrect number of times').isEqualTo(2);\\nassertApi('gtmOnSuccess').wasCalled();\"\n- name: Send custom event\n  code: \"mockData.eventName = 'custom';\\n\\nconst eventParams = {\\n  prop1: 'val1',\\n\\\n    \\  prop2: 'val2'\\n};\\n\\nlet index = 0;\\nmock('copyFromWindow', key => {\\n  //\\\n    \\ 1. The specific logic for this test (checking fbq trackSingleCustom calls)\\n\\\n    \\  if (key === 'fbq') return function() {\\n    if (arguments[0] === 'trackSingleCustom')\\\n    \\ {\\n      assertThat(arguments[1], 'trackSingleCustom called with incorrect pixel\\\n    \\ ID').isEqualTo(mockData.pixelId.split(',')[index]);\\n      assertThat(arguments[2],\\\n    \\ 'trackSingleCustom called with incorrect event name').isEqualTo(mockData.customEventName);\\n\\\n    \\      assertThat(arguments[3], 'trackSingleCustom called with incorrect event\\\n    \\ parameters').isEqualTo(eventParams);\\n      index += 1;\\n    }\\n  };\\n\\n  //\\\n    \\ 2. The required logic for the template to finish (ParamBuilder mocks)\\n  if\\\n    \\ (key === 'clientParamBuilder') return {};\\n  if (key === 'clientParamBuilder.processAndCollectAllParams')\\\n    \\ return () => {};\\n});\\n      \\n// Call runCode to run the template's code.\\n\\\n    runCode(mockData);\\n\\n// Verify that the tag finished successfully.\\nassertThat(index,\\\n    \\ 'trackSingleCustom called incorrect number of times').isEqualTo(2);\\nassertApi('gtmOnSuccess').wasCalled();\"\n- name: Send variable event with standard name\n  code: \"mockData.eventName = 'variable';\\nmockData.variableEventName = 'PageView';\\n\\\n    \\nconst eventParams = {\\n  prop1: 'val1',\\n  prop2: 'val2'\\n};\\n\\nlet index =\\\n    \\ 0;\\nmock('copyFromWindow', key => {\\n  if (key === 'fbq') return function()\\\n    \\ {\\n    if (arguments[0] === 'trackSingle') {\\n      assertThat(arguments[1],\\\n    \\ 'trackSingle called with incorrect pixel ID').isEqualTo(mockData.pixelId.split(',')[index]);\\n\\\n    \\      assertThat(arguments[2], 'trackSingle called with incorrect event name').isEqualTo(mockData.variableEventName);\\n\\\n    \\      assertThat(arguments[3], 'trackSingle called with incorrect event parameters').isEqualTo(eventParams);\\n\\\n    \\      index += 1;\\n    }\\n  };\\n  if (key === 'clientParamBuilder') return {};\\n\\\n    \\  if (key === 'clientParamBuilder.processAndCollectAllParams') return () => {};\\n\\\n    });\\n     \\n// Call runCode to run the template's code.\\nrunCode(mockData);\\n\\n\\\n    // Verify that the tag finished successfully.\\nassertThat(index, 'trackSingle\\\n    \\ called incorrect number of times').isEqualTo(2);\\nassertApi('gtmOnSuccess').wasCalled();\"\n- name: Send variable event with custom name\n  code: \"mockData.eventName = 'variable';\\nmockData.variableEventName = 'custom';\\n\\\n    \\nconst eventParams = {\\n  prop1: 'val1',\\n  prop2: 'val2'\\n};\\n\\nlet index =\\\n    \\ 0;\\nmock('copyFromWindow', key => {\\n  if (key === 'fbq') return function()\\\n    \\ {\\n    if (arguments[0] === 'trackSingleCustom') {\\n      assertThat(arguments[1],\\\n    \\ 'trackSingleCustom called with incorrect pixel ID').isEqualTo(mockData.pixelId.split(',')[index]);\\n\\\n    \\      assertThat(arguments[2], 'trackSingleCustom called with incorrect event\\\n    \\ name').isEqualTo(mockData.variableEventName);\\n      assertThat(arguments[3],\\\n    \\ 'trackSingleCustom called with incorrect event parameters').isEqualTo(eventParams);\\n\\\n    \\      index += 1;\\n    }\\n  };\\n  if (key === 'clientParamBuilder') return {};\\n\\\n    \\  if (key === 'clientParamBuilder.processAndCollectAllParams') return () => {};\\n\\\n    });\\n     \\n// Call runCode to run the template's code.\\nrunCode(mockData);\\n\\n\\\n    // Verify that the tag finished successfully.\\nassertThat(index, 'trackSingleCustom\\\n    \\ called incorrect number of times').isEqualTo(2);\\nassertApi('gtmOnSuccess').wasCalled();\"\n- name: Send event parameters from a variable\n  code: \"mockData.objectPropertiesFromVariable = {\\n  prop1: 'val1',\\n  prop2: 'val2'\\n\\\n    };\\n\\nlet index = 0;\\nmock('copyFromWindow', key => {\\n  if (key === 'fbq') return\\\n    \\ function() {\\n    if (arguments[0] === 'trackSingle') {\\n      assertThat(arguments[1],\\\n    \\ 'trackSingle called with incorrect pixel ID').isEqualTo(mockData.pixelId.split(',')[index]);\\n\\\n    \\      assertThat(arguments[2], 'trackSingle called with incorrect event name').isEqualTo(mockData.standardEventName);\\n\\\n    \\      assertThat(arguments[3], 'trackSingle called with incorrect event parameters').isEqualTo(mockData.objectPropertiesFromVariable);\\n\\\n    \\      index += 1;\\n    }\\n  };\\n  if (key === 'clientParamBuilder') return {};\\n\\\n    \\  if (key === 'clientParamBuilder.processAndCollectAllParams') return () => {};\\n\\\n    });\\n     \\n// Call runCode to run the template's code.\\nrunCode(mockData);\\n\\n\\\n    // Verify that the tag finished successfully.\\nassertThat(index, 'trackSingle\\\n    \\ called incorrect number of times').isEqualTo(2);\\nassertApi('gtmOnSuccess').wasCalled();\"\n- name: Enhanced Ecommerce integration fails with invalid object\n  code: \"mockData.enhancedEcommerce = true;\\n\\n// Override the global setup for this\\\n    \\ specific test so it returns undefined\\nmock('copyFromDataLayer', (key) => {\\n\\\n    \\  return undefined; \\n});\\n\\n// Call runCode to run the template's code.\\nrunCode(mockData);\\n\\\n    \\n// Verify that the tag finished successfully.\\nassertApi('logToConsole').wasCalledWith('Facebook\\\n    \\ Pixel: No valid \\\"ecommerce\\\" object found in dataLayer');\\nassertApi('gtmOnFailure').wasCalled();\\n\\\n    assertApi('gtmOnSuccess').wasNotCalled();\"\n- name: Enhanced Ecommerce integration fails with invalid action\n  code: |-\n    mockData.enhancedEcommerce = true;\n\n    mock('copyFromDataLayer', key => {\n      if (key === 'ecommerce') return {\n        invalid: true\n      };\n    });\n\n    // Call runCode to run the template's code.\n    runCode(mockData);\n\n    // Verify that the tag finished successfully.\n    assertApi('logToConsole').wasCalledWith('Facebook Pixel: Most recently pushed \"ecommerce\" object must be one of types \"detail\", \"add\", \"checkout\" or \"purchase\".');\n    assertApi('gtmOnFailure').wasCalled();\n    assertApi('gtmOnSuccess').wasNotCalled();\n- name: Enhanced Ecommerce ViewContent works\n  code: \"mockData.enhancedEcommerce = true;\\nmockData.objectPropertyList = {};\\n\\n\\\n    mock('copyFromDataLayer', key => {\\n  if (key === 'ecommerce') return {\\n    currencyCode:\\\n    \\ 'EUR',\\n    detail: {\\n      products: mockEec.gtm.products\\n    }\\n  };\\n});\\n\\\n    \\nlet index = 0;\\nmock('copyFromWindow', key => {\\n  // 1. The specific logic\\\n    \\ for this test (checking fbq trackSingle calls)\\n  if (key === 'fbq') return\\\n    \\ function() {\\n    if (arguments[0] === 'trackSingle') {\\n      assertThat(arguments[1],\\\n    \\ 'trackSingle called with incorrect pixel ID').isEqualTo(mockData.pixelId.split(',')[index]);\\n\\\n    \\      assertThat(arguments[2], 'trackSingle called with incorrect event name').isEqualTo('ViewContent');\\n\\\n    \\      assertThat(arguments[3], 'trackSingle called with incorrect event parameters').isEqualTo(mockEec.fb);\\n\\\n    \\      index += 1;\\n    }\\n  };\\n\\n  // 2. The required logic for the template\\\n    \\ to finish (ParamBuilder mocks)\\n  if (key === 'clientParamBuilder') return {};\\n\\\n    \\  if (key === 'clientParamBuilder.processAndCollectAllParams') return () => {};\\n\\\n    });\\n      \\n// Call runCode to run the template's code.\\nrunCode(mockData);\\n\\\n    \\n// Verify that the tag finished successfully.\\nassertThat(index, 'trackSingle\\\n    \\ called incorrect number of times').isEqualTo(2);\\nassertApi('gtmOnSuccess').wasCalled();\"\n- name: Enhanced Ecommerce AddToCart works\n  code: \"mockData.enhancedEcommerce = true;\\nmockData.objectPropertyList = {};\\n\\n\\\n    mock('copyFromDataLayer', key => {\\n  if (key === 'ecommerce') return {\\n    currencyCode:\\\n    \\ 'EUR',\\n    add: {\\n      products: mockEec.gtm.products\\n    }\\n  };\\n});\\n\\\n    \\nlet index = 0;\\nmock('copyFromWindow', key => {\\n  if (key === 'fbq') return\\\n    \\ function() {\\n    if (arguments[0] === 'trackSingle') {\\n      assertThat(arguments[1],\\\n    \\ 'trackSingle called with incorrect pixel ID').isEqualTo(mockData.pixelId.split(',')[index]);\\n\\\n    \\      assertThat(arguments[2], 'trackSingle called with incorrect event name').isEqualTo('AddToCart');\\n\\\n    \\      assertThat(arguments[3], 'trackSingle called with incorrect event parameters').isEqualTo(mockEec.fb);\\n\\\n    \\      index += 1;\\n    }\\n  };\\n  if (key === 'clientParamBuilder') return {};\\n\\\n    \\  if (key === 'clientParamBuilder.processAndCollectAllParams') return () => {};\\n\\\n    });\\n     \\n// Call runCode to run the template's code.\\nrunCode(mockData);\\n\\n\\\n    // Verify that the tag finished successfully.\\nassertThat(index, 'trackSingle\\\n    \\ called incorrect number of times').isEqualTo(2);\\nassertApi('gtmOnSuccess').wasCalled();\"\n- name: Enhanced Ecommerce InitiateCheckout works\n  code: \"mockData.enhancedEcommerce = true;\\nmockEec.fb.num_items = 3;\\nmockData.objectPropertyList\\\n    \\ = {};\\n\\nmock('copyFromDataLayer', key => {\\n  if (key === 'ecommerce') return\\\n    \\ {\\n    currencyCode: 'EUR',\\n    checkout: {\\n      products: mockEec.gtm.products\\n\\\n    \\    }\\n  };\\n});\\n\\nlet index = 0;\\nmock('copyFromWindow', key => {\\n  if (key\\\n    \\ === 'fbq') return function() {\\n    if (arguments[0] === 'trackSingle') {\\n\\\n    \\      assertThat(arguments[1], 'trackSingle called with incorrect pixel ID').isEqualTo(mockData.pixelId.split(',')[index]);\\n\\\n    \\      assertThat(arguments[2], 'trackSingle called with incorrect event name').isEqualTo('InitiateCheckout');\\n\\\n    \\      assertThat(arguments[3], 'trackSingle called with incorrect event parameters').isEqualTo(mockEec.fb);\\n\\\n    \\      index += 1;\\n    }\\n  };\\n  if (key === 'clientParamBuilder') return {};\\n\\\n    \\  if (key === 'clientParamBuilder.processAndCollectAllParams') return () => {};\\n\\\n    });\\n     \\n// Call runCode to run the template's code.\\nrunCode(mockData);\\n\\n\\\n    // Verify that the tag finished successfully.\\nassertThat(index, 'trackSingle\\\n    \\ called incorrect number of times').isEqualTo(2);\\nassertApi('gtmOnSuccess').wasCalled();\"\n- name: Enhanced Ecommerce Purchase works\n  code: \"mockData.enhancedEcommerce = true;\\nmockEec.fb.num_items = 3;\\nmockData.objectPropertyList\\\n    \\ = {};\\n\\nmock('copyFromDataLayer', key => {\\n  if (key === 'ecommerce') return\\\n    \\ {\\n    currencyCode: 'EUR',\\n    purchase: {\\n      products: mockEec.gtm.products\\n\\\n    \\    }\\n  };\\n});\\n\\nlet index = 0;\\nmock('copyFromWindow', key => {\\n  if (key\\\n    \\ === 'fbq') return function() {\\n    if (arguments[0] === 'trackSingle') {\\n\\\n    \\      assertThat(arguments[1], 'trackSingle called with incorrect pixel ID').isEqualTo(mockData.pixelId.split(',')[index]);\\n\\\n    \\      assertThat(arguments[2], 'trackSingle called with incorrect event name').isEqualTo('Purchase');\\n\\\n    \\      assertThat(arguments[3], 'trackSingle called with incorrect event parameters').isEqualTo(mockEec.fb);\\n\\\n    \\      index += 1;\\n    }\\n  };\\n  if (key === 'clientParamBuilder') return {};\\n\\\n    \\  if (key === 'clientParamBuilder.processAndCollectAllParams') return () => {};\\n\\\n    });\\n     \\n// Call runCode to run the template's code.\\nrunCode(mockData);\\n\\n\\\n    // Verify that the tag finished successfully.\\nassertThat(index, 'trackSingle\\\n    \\ called incorrect number of times').isEqualTo(2);\\nassertApi('gtmOnSuccess').wasCalled();\"\n- name: Object merge with variable and list works\n  code: \"mockData.objectPropertiesFromVariable = {\\n  prop1: 'var1',\\n  prop2: 'var2',\\n\\\n    \\  prop3: 'var3'\\n};\\n\\nconst expected = {\\n  prop1: 'val1',\\n  prop2: 'val2',\\n\\\n    \\  prop3: 'var3'\\n};\\n\\nlet index = 0;\\nmock('copyFromWindow', key => {\\n  if\\\n    \\ (key === 'fbq') return function() {\\n    if (arguments[0] === 'trackSingle')\\\n    \\ {\\n      assertThat(arguments[1], 'trackSingle called with incorrect pixel ID').isEqualTo(mockData.pixelId.split(',')[index]);\\n\\\n    \\      assertThat(arguments[2], 'trackSingle called with incorrect event name').isEqualTo('PageView');\\n\\\n    \\      assertThat(arguments[3], 'trackSingle called with incorrect event parameters').isEqualTo(expected);\\n\\\n    \\      index += 1;\\n    }\\n  };\\n  if (key === 'clientParamBuilder') return {};\\n\\\n    \\  if (key === 'clientParamBuilder.processAndCollectAllParams') return () => {};\\n\\\n    });\\n     \\n// Call runCode to run the template's code.\\nrunCode(mockData);\\n\\n\\\n    // Verify that the tag finished successfully.\\nassertThat(index, 'trackSingle\\\n    \\ called incorrect number of times').isEqualTo(2);\\nassertApi('gtmOnSuccess').wasCalled();\"\n- name: Object merge with variable, list and eec works\n  code: \"mockData.enhancedEcommerce = true;\\nmockData.objectPropertiesFromVariable\\\n    \\ = {\\n  content_type: 'product_group'\\n};\\nmockData.objectPropertyList = [{\\n\\\n    \\  name: 'currency',\\n  value: 'USD'\\n}];\\nmockEec.fb.num_items = 3;\\nmockEec.fb.content_type\\\n    \\ = 'product_group';\\nmockEec.fb.currency = 'USD';\\n\\nmock('copyFromDataLayer',\\\n    \\ key => {\\n  if (key === 'ecommerce') return {\\n    currencyCode: 'EUR',\\n  \\\n    \\  purchase: {\\n      products: mockEec.gtm.products\\n    }\\n  };\\n});\\n\\nlet\\\n    \\ index = 0;\\nmock('copyFromWindow', key => {\\n  if (key === 'fbq') return function()\\\n    \\ {\\n    if (arguments[0] === 'trackSingle') {\\n      assertThat(arguments[1],\\\n    \\ 'trackSingle called with incorrect pixel ID').isEqualTo(mockData.pixelId.split(',')[index]);\\n\\\n    \\      assertThat(arguments[2], 'trackSingle called with incorrect event name').isEqualTo('Purchase');\\n\\\n    \\      assertThat(arguments[3], 'trackSingle called with incorrect event parameters').isEqualTo(mockEec.fb);\\n\\\n    \\      index += 1;\\n    }\\n  };\\n  if (key === 'clientParamBuilder') return {};\\n\\\n    \\  if (key === 'clientParamBuilder.processAndCollectAllParams') return () => {};\\n\\\n    });\\n     \\n// Call runCode to run the template's code.\\nrunCode(mockData);\\n\\n\\\n    // Verify that the tag finished successfully.\\nassertThat(index, 'trackSingle\\\n    \\ called incorrect number of times').isEqualTo(2);\\nassertApi('gtmOnSuccess').wasCalled();\"\n- name: Send event ID\n  code: \"mockData.eventId = 'eventId';\\n\\nmock('copyFromWindow', key => {\\n  if (key\\\n    \\ === 'fbq') return function() {\\n    if (arguments[0] === 'trackSingle') {\\n\\\n    \\      assertThat(arguments[4], 'eventID not included in hit').isEqualTo({eventID:\\\n    \\ mockData.eventId});\\n    }\\n  };\\n  if (key === 'clientParamBuilder') return\\\n    \\ {};\\n  if (key === 'clientParamBuilder.processAndCollectAllParams') return ()\\\n    \\ => {};\\n});\\n     \\n// Call runCode to run the template's code.\\nrunCode(mockData);\\n\\\n    \\n// Verify that the tag finished successfully.\\nassertApi('gtmOnSuccess').wasCalled();\"\n- name: ParamBuilder processAndCollectAllParams success\n  code: \"mock('injectScript', (url, onsuccess, onfailure, token) => {\\n  onsuccess();\\n\\\n    });\\n\\n// Replaced the basic mock with the callback-triggering mock\\nmock('callInWindow',\\\n    \\ (propName, arg1, arg2, arg3) => {\\n  if (propName === 'fbq' && arg1 === 'gateCheck')\\\n    \\ {\\n    if (typeof arg3 === 'function') {\\n      arg3(true);\\n    }\\n  }\\n  return\\\n    \\ true; \\n});\\n\\nmock('copyFromWindow', key => {\\n  if (key === 'fbq') return\\\n    \\ () => {};\\n  if (key === 'clientParamBuilder') return {};\\n  if (key === 'clientParamBuilder.processAndCollectAllParams')\\\n    \\ return () => {};\\n  if (key === 'clientParamBuilder.processAndCollectParams')\\\n    \\ return undefined;\\n});\\n\\nrunCode(mockData);\\n\\nassertApi('gtmOnSuccess').wasCalled();\\n\\\n    assertApi('gtmOnFailure').wasNotCalled();\"\n- name: ParamBuilder processAndCollectParams success\n  code: \"mock('injectScript', (url, onsuccess, onfailure, token) => {\\n  onsuccess();\\n\\\n    });\\n\\n// Use the upgraded mock that triggers the callback\\nmock('callInWindow',\\\n    \\ (propName, arg1, arg2, arg3) => {\\n  if (propName === 'fbq' && arg1 === 'gateCheck')\\\n    \\ {\\n    if (typeof arg3 === 'function') {\\n      arg3(true);\\n    }\\n  }\\n  return\\\n    \\ true; \\n});\\n\\nmock('copyFromWindow', key => {\\n  if (key === 'fbq') return\\\n    \\ () => {};\\n  if (key === 'clientParamBuilder') return {};\\n  if (key === 'clientParamBuilder.processAndCollectAllParams')\\\n    \\ return undefined;\\n  if (key === 'clientParamBuilder.processAndCollectParams')\\\n    \\ return () => {};\\n});\\n\\nrunCode(mockData);\\n\\nassertApi('gtmOnSuccess').wasCalled();\\n\\\n    assertApi('gtmOnFailure').wasNotCalled();\"\n- name: ParamBuilder loaded failed\n  code: \"mock('injectScript', (url, onsuccess, onfailure, token) => {\\n  onsuccess();\\n\\\n    });\\n\\n// Use the upgraded mock that triggers the callback\\nmock('callInWindow',\\\n    \\ (propName, arg1, arg2, arg3) => {\\n  if (propName === 'fbq' && arg1 === 'gateCheck')\\\n    \\ {\\n    if (typeof arg3 === 'function') {\\n      arg3(true);\\n    }\\n  }\\n  return\\\n    \\ true; \\n});\\n\\nmock('copyFromWindow', key => {\\n  if (key === 'fbq') return\\\n    \\ () => {};\\n  if (key === 'clientParamBuilder') return {};\\n  // Both methods\\\n    \\ return undefined to trigger the failure block\\n  if (key === 'clientParamBuilder.processAndCollectAllParams')\\\n    \\ return undefined;\\n  if (key === 'clientParamBuilder.processAndCollectParams')\\\n    \\ return undefined;\\n});\\n\\nrunCode(mockData);\\n\\nassertApi('gtmOnSuccess').wasNotCalled();\\n\\\n    assertApi('gtmOnFailure').wasCalled();\"\n- name: GK off pixel load successfully\n  code: \"// Reset the array instead of re-declaring it\\ninjectedUrls = [];\\n\\nmock('injectScript',\\\n    \\ (url, onsuccess, onfailure, token) => {\\n  injectedUrls.push(url);\\n  if (onsuccess)\\\n    \\ {\\n    onsuccess();\\n  }\\n});\\n\\n// Correctly target arg4 (onDisabled) to simulate\\\n    \\ the gateCheck failing\\nmock('callInWindow', (propName, arg1, arg2, arg3, arg4,\\\n    \\ arg5) => {\\n  if (propName === 'fbq' && arg1 === 'gateCheck') {\\n    const onDisabled\\\n    \\ = arg4; // arg4 is the onDisabled callback\\n    if (typeof onDisabled === 'function')\\\n    \\ {\\n      onDisabled(arg2, arg5); // Pass gateName and pixelID back to the callback\\n\\\n    \\    }\\n  }\\n  return true; \\n});\\n\\n// Run the template\\nrunCode(mockData);\\n\\\n    \\n// 1. Verify the template finished successfully\\nassertApi('gtmOnSuccess').wasCalled();\\n\\\n    assertApi('gtmOnFailure').wasNotCalled();\\n\\n// 2. Verify the Param Builder script\\\n    \\ was skipped\\nassertThat(injectedUrls).doesNotContain('https://capi-automation.s3.us-east-2.amazonaws.com/public/client_js/capiParamBuilder/clientParamBuilder.bundle.js');\"\n- name: GA4 gate enabled - eventModel merged into tracking\n  code: |-\n    mockData.useGA4Ecommerce = true;\n    mockData.objectPropertyList = {};\n\n    var mockEventModel = {\n      currency: 'USD',\n      value: '99.99',\n      search_term: 'shoes',\n      transaction_id: 'order_abc',\n      items: [\n        { item_id: 'SKU1', price: 49.99, quantity: 2 },\n        { item_id: 'SKU2', item_name: 'Hat', price: 10.00, quantity: 1 }\n      ]\n    };\n\n    mock('copyFromDataLayer', key => {\n      if (key === 'eventModel') return mockEventModel;\n      return undefined;\n    });\n\n    var trackedProps = null;\n    let index = 0;\n    mock('copyFromWindow', key => {\n      if (key === 'fbq') return function() {\n        if (arguments[0] === 'trackSingle') {\n          trackedProps = arguments[3];\n          index += 1;\n        }\n      };\n      if (key === 'fbq.callMethod.apply') return () => {};\n      if (key === '_fbq_gtm_ids') return [];\n      if (key === 'clientParamBuilder') return { processAndCollectAllParams: () => {} };\n      if (key === 'clientParamBuilder.processAndCollectAllParams') return () => {};\n      if (key === 'clientParamBuilder.processAndCollectParams') return () => {};\n      return undefined;\n    });\n\n    runCode(mockData);\n\n    assertThat(index).isGreaterThan(0);\n    assertThat(trackedProps.currency).isEqualTo('USD');\n    assertThat(trackedProps.value).isEqualTo('99.99');\n    assertThat(trackedProps.search_string).isEqualTo('shoes');\n    assertThat(trackedProps.order_id).isEqualTo('order_abc');\n    assertThat(trackedProps.contents.length).isEqualTo(2);\n    assertThat(trackedProps.contents[0].id).isEqualTo('SKU1');\n    assertThat(trackedProps.contents[1].id).isEqualTo('SKU2');\n    assertApi('gtmOnSuccess').wasCalled();\n- name: GA4 gate disabled - standard props used\n  code: |-\n    mockData.useGA4Ecommerce = true;\n    mockData.objectPropertyList = {};\n\n    mock('copyFromDataLayer', key => {\n      if (key === 'eventModel') return { currency: 'EUR', value: '50.00' };\n      return undefined;\n    });\n\n    // Mock gateCheck to call onDisabled for enable_gtm_ga4_structure\n    mock('callInWindow', (propName, arg1, arg2, arg3, arg4, arg5) => {\n      if (propName === 'fbq' && arg1 === 'gateCheck') {\n        if (arg2 === 'enable_gtm_ga4_structure') {\n          if (typeof arg4 === 'function') arg4(arg2, arg5);\n        } else {\n          if (typeof arg3 === 'function') arg3(arg2, arg5);\n        }\n      }\n      return true;\n    });\n\n    var trackedProps = null;\n    mock('copyFromWindow', key => {\n      if (key === 'fbq') return function() {\n        if (arguments[0] === 'trackSingle') {\n          trackedProps = arguments[3];\n        }\n      };\n      if (key === 'fbq.callMethod.apply') return () => {};\n      if (key === '_fbq_gtm_ids') return [];\n      if (key === 'clientParamBuilder') return { processAndCollectAllParams: () => {} };\n      if (key === 'clientParamBuilder.processAndCollectAllParams') return () => {};\n      if (key === 'clientParamBuilder.processAndCollectParams') return () => {};\n      return undefined;\n    });\n\n    runCode(mockData);\n\n    // Should NOT have GA4 fields since gate was disabled\n    assertThat(trackedProps.currency).isUndefined();\n    assertThat(trackedProps.search_string).isUndefined();\n    assertApi('gtmOnSuccess').wasCalled();\n- name: GA4 not enabled - unchanged behavior\n  code: |-\n    mockData.useGA4Ecommerce = false;\n\n    var trackCount = 0;\n    mock('copyFromWindow', key => {\n      if (key === 'fbq') return function() {\n        if (arguments[0] === 'trackSingle') trackCount += 1;\n      };\n      if (key === 'fbq.callMethod.apply') return () => {};\n      if (key === '_fbq_gtm_ids') return [];\n      if (key === 'clientParamBuilder') return { processAndCollectAllParams: () => {} };\n      if (key === 'clientParamBuilder.processAndCollectAllParams') return () => {};\n      if (key === 'clientParamBuilder.processAndCollectParams') return () => {};\n      return undefined;\n    });\n\n    runCode(mockData);\n\n    assertThat(trackCount).isEqualTo(2);\n    assertApi('gtmOnSuccess').wasCalled();\n- name: GA4 user_data merged into cidParams\n  code: |-\n    mockData.useGA4Ecommerce = true;\n    mockData.advancedMatchingList = [\n      {name: 'em', value: 'override@test.com'}\n    ];\n\n    var mockEventModel = {\n      user_data: {\n        email_address: 'ga4@test.com',\n        phone_number: '5551234567',\n        address: {\n          first_name: 'John',\n          last_name: 'Doe',\n          city: 'Menlo Park',\n          region: 'CA',\n          postal_code: '94025',\n          country: 'US'\n        }\n      }\n    };\n\n    mock('copyFromDataLayer', key => {\n      if (key === 'eventModel') return mockEventModel;\n      return undefined;\n    });\n\n    var initCidParams = null;\n    mock('copyFromWindow', key => {\n      if (key === 'fbq') return function() {\n        if (arguments[0] === 'init') initCidParams = arguments[2];\n      };\n      if (key === 'fbq.callMethod.apply') return () => {};\n      if (key === '_fbq_gtm_ids') return [];\n      if (key === 'clientParamBuilder') return { processAndCollectAllParams: () => {} };\n      if (key === 'clientParamBuilder.processAndCollectAllParams') return () => {};\n      if (key === 'clientParamBuilder.processAndCollectParams') return () => {};\n      return undefined;\n    });\n\n    runCode(mockData);\n\n    // advancedMatchingList 'em' should override ga4 user_data email_address\n    assertThat(initCidParams.em).isEqualTo('override@test.com');\n    // GA4 user_data fields should be present\n    assertThat(initCidParams.ph).isEqualTo('5551234567');\n    assertThat(initCidParams.fn).isEqualTo('John');\n    assertThat(initCidParams.ln).isEqualTo('Doe');\n    assertThat(initCidParams.ct).isEqualTo('Menlo Park');\n    assertThat(initCidParams.st).isEqualTo('CA');\n    assertThat(initCidParams.zp).isEqualTo('94025');\n    assertThat(initCidParams.country).isEqualTo('US');\n    assertApi('gtmOnSuccess').wasCalled();\n- name: GK off pixel load failed\n  code: \"// Reset the array\\ninjectedUrls = [];\\n\\n// Mock injectScript to simulate\\\n    \\ a network error / loading failure\\nmock('injectScript', (url, onsuccess, onfailure,\\\n    \\ token) => {\\n  injectedUrls.push(url);\\n  \\n  // Notice we are calling onfailure()\\\n    \\ this time instead of onsuccess()\\n  if (onfailure) {\\n    onfailure(); \\n  }\\n\\\n    });\\n\\n// Run the template\\nrunCode(mockData);\\n\\n// 1. Verify failure was called\\\n    \\ and success was not\\nassertApi('gtmOnFailure').wasCalled();\\nassertApi('gtmOnSuccess').wasNotCalled();\\n\\\n    \\n// 2. Verify only the first script was attempted\\nassertThat(injectedUrls).contains('https://connect.facebook.net/en_US/fbevents.js');\\n\\\n    assertThat(injectedUrls).doesNotContain('https://capi-automation.s3.us-east-2.amazonaws.com/public/client_js/capiParamBuilder/clientParamBuilder.bundle.js');\"\n- name: ParamBuilder already called in proc - loading state\n  code: \"// Simulate that the flag is already set from a previous event\\nmock('copyFromWindow',\\\n    \\ key => {\\n  if (key === '_fbq_param_builder_status') return 'loading'; \\n  if\\\n    \\ (key === 'fbq') return () => {};\\n  if (key === '_fbq_gtm_ids') return [];\\n\\\n    \\  return undefined;\\n});\\n\\ninjectedUrls = [];\\nlet processCalled = false;\\n\\n\\\n    // Monitor callInWindow to see if the param builder is executed\\nmock('callInWindow',\\\n    \\ (propName) => {\\n   if (propName === 'clientParamBuilder.processAndCollectAllParams'\\\n    \\ || \\n       propName === 'clientParamBuilder.processAndCollectParams') {\\n \\\n    \\    processCalled = true;\\n   }\\n   return true;\\n});\\n\\n// Run the template\\n\\\n    runCode(mockData);\\n\\n// 1. Verify it did NOT attempt to inject the script\\nassertThat(injectedUrls).doesNotContain('https://capi-automation.s3.us-east-2.amazonaws.com/public/client_js/capiParamBuilder/clientParamBuilder.bundle.js');\\n\\\n    \\n// 2. Verify it did NOT call the function (saving the cookie write)\\nassertThat(processCalled).isFalse();\\n\\\n    \\n// 3. Verify the tag still finished successfully\\nassertApi('gtmOnSuccess').wasCalled();\"\n- name: ParamBuilder already called in proc - complete state\n  code: \"// Simulate that the flag is already set from a previous event\\nmock('copyFromWindow',\\\n    \\ key => {\\n  if (key === '_fbq_param_builder_status') return 'complete'; \\n \\\n    \\ if (key === 'fbq') return () => {};\\n  if (key === '_fbq_gtm_ids') return [];\\n\\\n    \\  return undefined;\\n});\\n\\ninjectedUrls = [];\\nlet processCalled = false;\\n\\n\\\n    // Monitor callInWindow to see if the param builder is executed\\nmock('callInWindow',\\\n    \\ (propName) => {\\n   if (propName === 'clientParamBuilder.processAndCollectAllParams'\\\n    \\ || \\n       propName === 'clientParamBuilder.processAndCollectParams') {\\n \\\n    \\    processCalled = true;\\n   }\\n   return true;\\n});\\n\\n// Run the template\\n\\\n    runCode(mockData);\\n\\n// 1. Verify it did NOT attempt to inject the script\\nassertThat(injectedUrls).doesNotContain('https://capi-automation.s3.us-east-2.amazonaws.com/public/client_js/capiParamBuilder/clientParamBuilder.bundle.js');\\n\\\n    \\n// 2. Verify it did NOT call the function (saving the cookie write)\\nassertThat(processCalled).isFalse();\\n\\\n    \\n// 3. Verify the tag still finished successfully\\nassertApi('gtmOnSuccess').wasCalled();\"\nsetup: \"const mockData = {\\n  pixelId: '12345,23456',\\n  eventName: 'standard',\\n\\\n  \\  standardEventName: 'PageView',\\n  customEventName: 'custom',\\n  variableEventName:\\\n  \\ 'standard',\\n  consent: true,\\n  advancedMatching: false,\\n  advancedMatchingList:\\\n  \\ [\\n    {name: 'ct', value: 'Helsinki'},\\n    {name: 'cn', value: 'Finland'}\\n\\\n  \\  ],\\n  objectPropertiesFromVariable: false,\\n  objectPropertyList: [\\n    {name:\\\n  \\ 'prop1', value: 'val1'},\\n    {name: 'prop2', value: 'val2'}\\n  ],\\n  disableAutoConfig:\\\n  \\ false,\\n  disablePushState: false,\\n  enhancedEcommerce: false,\\n  eventId: '',\\n\\\n  \\  gtmOnSuccess: () => {},\\n  gtmOnFailure: () => {}\\n};\\n\\n// Restored to YOUR\\\n  \\ original structure!\\nconst mockEec = {\\n  gtm: {  \\n    products: [{\\n      id:\\\n  \\ 'i1',\\n      name: 'n1',\\n      category: 'c1',\\n      price: '1.00',\\n      quantity:\\\n  \\ 1\\n    },{\\n      id: 'i2',\\n      name: 'n2',\\n      category: 'c2',\\n      price:\\\n  \\ '2.00',\\n      quantity: 2\\n    }]\\n  },\\n  fb: {\\n    content_type: 'product',\\n\\\n  \\    contents: [{\\n      id: 'i1',\\n      quantity: 1\\n    },{\\n      id: 'i2',\\n\\\n  \\      quantity: 2\\n    }],\\n    currency: 'EUR',\\n    value: 5.00\\n  }\\n};\\n\\n\\\n  let injectedUrls = [];\\n\\nmock('injectScript', (url, onsuccess, onfailure, token)\\\n  \\ => {\\n  injectedUrls.push(url);\\n  if (onsuccess) {\\n    onsuccess();\\n  }\\n});\\n\\\n  \\nmock('callInWindow', (propName, arg1, arg2, arg3, arg4, arg5) => {\\n  if (propName\\\n  \\ === 'fbq' && arg1 === 'gateCheck') {\\n    const gateName = arg2;\\n    const onEnabled\\\n  \\ = arg3;\\n    const onDisabled = arg4;\\n    const pixelID = arg5;\\n    \\n    if\\\n  \\ (typeof onEnabled === 'function') {\\n      onEnabled(gateName, pixelID); \\n  \\\n  \\  }\\n  }\\n  return true; \\n});\\n\\nmock('copyFromWindow', key => {\\n  if (key ===\\\n  \\ 'fbq') return () => {};\\n  if (key === 'fbq.callMethod.apply') return () => {};\\n\\\n  \\  if (key === '_fbq_gtm_ids') return [];\\n  \\n  if (key === 'clientParamBuilder')\\\n  \\ {\\n    return {\\n      processAndCollectAllParams: () => {},\\n      processAndCollectParams:\\\n  \\ () => {}\\n    };\\n  }\\n  if (key === 'clientParamBuilder.processAndCollectAllParams')\\\n  \\ return () => {};\\n  if (key === 'clientParamBuilder.processAndCollectParams')\\\n  \\ return () => {};\\n  \\n  return undefined;\\n});\\n\\n// We return a dummy object\\\n  \\ here, but your tests will override it to use mockEec.gtm\\nmock('copyFromDataLayer',\\\n  \\ (key) => { \\n  return undefined;\\n});\\n\\nmock('getUrl', () => 'https://example.com');\\n\\\n  mock('logToConsole', () => {});\\nmock('createQueue', () => {});\\nmock('setInWindow',\\\n  \\ () => {});\\nmock('aliasInWindow', () => {});\"\n\n\n___NOTES___\n\nCreated on 18/05/2019, 21:57:16\n\n\n",
        "galleryReference": {
          "host": "github.com",
          "owner": "facebook",
          "repository": "GoogleTagManager-WebTemplate-For-FacebookPixel",
          "version": "8c5197c2870088bb9c45ffc76537ee4b24b91014",
          "signature": "794ff643a55f1e2a4f8d965509e7e2a5929fac26ea21bb68cf7cebc4698f3c2a",
          "galleryTemplateId": "5RM3Q"
        }
      },
      {
        "accountId": "6353828409",
        "containerId": "251606233",
        "templateId": "58",
        "name": "TikTok Pixel",
        "fingerprint": "1778143779445",
        "templateData": "___TERMS_OF_SERVICE___\n\nBy creating or modifying this file you agree to Google Tag Manager's Community\nTemplate Gallery Developer Terms of Service available at\nhttps://developers.google.com/tag-manager/gallery-tos (or such other URL as\nGoogle may provide), as modified from time to time.\n\n\n___INFO___\n\n{\n  \"type\": \"TAG\",\n  \"id\": \"cvt_MRQN8\",\n  \"version\": 1,\n  \"displayName\": \"TikTok Pixel\",\n  \"categories\": [\n    \"ADVERTISING\",\n    \"ANALYTICS\"\n  ],\n  \"brand\": {\n    \"id\": \"github.com_tiktok\",\n    \"displayName\": \"tiktok\",\n    \"thumbnail\": \"data:image/png;base64,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\\u003d\\u003d\"\n  },\n  \"description\": \"Install TikTok Pixel easily to your site without the need to write a line of code.\",\n  \"containerContexts\": [\n    \"WEB\"\n  ]\n}\n\n\n___TEMPLATE_PARAMETERS___\n\n[\n  {\n    \"type\": \"GROUP\",\n    \"name\": \"Section 1 - TikTok Event Configuration\",\n    \"displayName\": \"TikTok Event Configuration\",\n    \"groupStyle\": \"NO_ZIPPY\",\n    \"subParams\": [\n      {\n        \"type\": \"TEXT\",\n        \"name\": \"pixel_code\",\n        \"displayName\": \"Pixel ID\",\n        \"simpleValueType\": true,\n        \"valueValidators\": [],\n        \"help\": \"You can find your Pixel ID in Events Manager\",\n        \"valueHint\": \"CD9079RC77U0N3GBV16Y\"\n      },\n      {\n        \"type\": \"SELECT\",\n        \"name\": \"event\",\n        \"displayName\": \"Event Name\",\n        \"macrosInSelect\": true,\n        \"selectItems\": [\n          {\n            \"value\": \"CompletePayment\",\n            \"displayValue\": \"CompletePayment\"\n          },\n          {\n            \"value\": \"AddToCart\",\n            \"displayValue\": \"AddToCart\"\n          },\n          {\n            \"value\": \"ViewContent\",\n            \"displayValue\": \"ViewContent\"\n          },\n          {\n            \"value\": \"InitiateCheckout\",\n            \"displayValue\": \"InitiateCheckout\"\n          },\n          {\n            \"value\": \"AddToWishlist\",\n            \"displayValue\": \"AddToWishlist\"\n          },\n          {\n            \"value\": \"AddPaymentInfo\",\n            \"displayValue\": \"AddPaymentInfo\"\n          },\n          {\n            \"value\": \"PlaceAnOrder\",\n            \"displayValue\": \"PlaceAnOrder\"\n          },\n          {\n            \"value\": \"Contact\",\n            \"displayValue\": \"Contact\"\n          },\n          {\n            \"value\": \"Download\",\n            \"displayValue\": \"Download\"\n          },\n          {\n            \"value\": \"SubmitForm\",\n            \"displayValue\": \"SubmitForm\"\n          },\n          {\n            \"value\": \"CompleteRegistration\",\n            \"displayValue\": \"CompleteRegistration\"\n          },\n          {\n            \"value\": \"Subscribe\",\n            \"displayValue\": \"Subscribe\"\n          },\n          {\n            \"value\": \"ClickButton\",\n            \"displayValue\": \"ClickButton\"\n          },\n          {\n            \"value\": \"Search\",\n            \"displayValue\": \"Search\"\n          }\n        ],\n        \"simpleValueType\": true,\n        \"help\": \"TikTok supports 14 standard events. You may refer to our \\u003ca href\\u003d\\\"https://ads.tiktok.com/help/article?aid\\u003d10028\\\" target\\u003d\\\"_blank\\\"\\u003edocumentation\\u003c/a\\u003e and choose a suitable event to tag.\",\n        \"defaultValue\": \"{{Event}}\"\n      }\n    ],\n    \"help\": \"\\u003ca href\\u003d\\\"https://business-api.tiktok.com/portal/docs?id\\u003d1799004006287425\\\" target\\u003d\\\"_blank\\\"\\u003eLearn more\\u003c/a\\u003e about using TikTok Pixel with Google Tag Manager.\"\n  },\n  {\n    \"type\": \"GROUP\",\n    \"name\": \"Section 3 - Parameter Override\",\n    \"displayName\": \"Parameter Override\",\n    \"groupStyle\": \"ZIPPY_CLOSED\",\n    \"subParams\": [\n      {\n        \"type\": \"LABEL\",\n        \"name\": \"Parameter Override Description\",\n        \"displayName\": \"\\u003ca target\\u003d\\\"_blank\\\" href\\u003d\\\"https://business-api.tiktok.com/portal/docs?id\\u003d1799004110681154#item-link-How%20to%20set%20up%20deduplication\\\"\\u003eLearn more\\u003c/a\\u003e about how to manually configure event parameters with \\\"Parameter Override\\\".\"\n      },\n      {\n        \"type\": \"GROUP\",\n        \"name\": \"Advanced Matching Configurations\",\n        \"displayName\": \"Advanced Matching Configurations\",\n        \"groupStyle\": \"NO_ZIPPY\",\n        \"subParams\": [\n          {\n            \"type\": \"RADIO\",\n            \"name\": \"hash\",\n            \"displayName\": \"Hashed / Non-Hashed AM Parameters\",\n            \"radioItems\": [\n              {\n                \"value\": \"hashed\",\n                \"displayValue\": \"SHA256 AM Parameters\"\n              },\n              {\n                \"value\": \"non-hashed\",\n                \"displayValue\": \"Plain AM Parameters\",\n                \"help\": \"TikTok Pixel will hash plain email and phone for you\"\n              }\n            ],\n            \"simpleValueType\": true,\n            \"help\": \"Tell us if your AM parameters have been hashed.\"\n          },\n          {\n            \"type\": \"TEXT\",\n            \"name\": \"email\",\n            \"displayName\": \"Email\",\n            \"simpleValueType\": true,\n            \"enablingConditions\": [\n              {\n                \"paramName\": \"hash\",\n                \"paramValue\": \"non-hashed\",\n                \"type\": \"EQUALS\"\n              }\n            ]\n          },\n          {\n            \"type\": \"TEXT\",\n            \"name\": \"phone\",\n            \"displayName\": \"Phone\",\n            \"simpleValueType\": true,\n            \"enablingConditions\": [\n              {\n                \"paramName\": \"hash\",\n                \"paramValue\": \"non-hashed\",\n                \"type\": \"EQUALS\"\n              }\n            ],\n            \"help\": \"If the country code is 86, then do not include country code (example: 13800000000). Otherwise, include country code with + and remove any other characters (spaces, \\u0027-\\u0027) between numbers (example for US: +12133734253).\"\n          },\n          {\n            \"type\": \"TEXT\",\n            \"name\": \"external_id\",\n            \"displayName\": \"External ID\",\n            \"simpleValueType\": true,\n            \"enablingConditions\": [\n              {\n                \"paramName\": \"hash\",\n                \"paramValue\": \"non-hashed\",\n                \"type\": \"EQUALS\"\n              }\n            ],\n            \"help\": \"Any unique identifier on the advertiser\\u0027s side, such as loyalty membership ID, user ID, or external cookie ID.\"\n          },\n          {\n            \"type\": \"TEXT\",\n            \"name\": \"sha256_email\",\n            \"displayName\": \"SHA256 Hashed Email\",\n            \"simpleValueType\": true,\n            \"enablingConditions\": [\n              {\n                \"paramName\": \"hash\",\n                \"paramValue\": \"hashed\",\n                \"type\": \"EQUALS\"\n              }\n            ]\n          },\n          {\n            \"type\": \"TEXT\",\n            \"name\": \"sha256_phone\",\n            \"displayName\": \"SHA256 Hashed Phone\",\n            \"simpleValueType\": true,\n            \"enablingConditions\": [\n              {\n                \"paramName\": \"hash\",\n                \"paramValue\": \"hashed\",\n                \"type\": \"EQUALS\"\n              }\n            ],\n            \"help\": \"If the country code is 86, then do not include country code (example: 13800000000). Otherwise, include country code with + and remove any other characters (spaces, \\u0027-\\u0027) between numbers (example for US: +12133734253).\"\n          },\n          {\n            \"type\": \"TEXT\",\n            \"name\": \"sha256_external_id\",\n            \"displayName\": \"SHA256 Hashed External ID\",\n            \"simpleValueType\": true,\n            \"enablingConditions\": [\n              {\n                \"paramName\": \"hash\",\n                \"paramValue\": \"hashed\",\n                \"type\": \"EQUALS\"\n              }\n            ],\n            \"help\": \"Any unique identifier on the advertiser\\u0027s side, such as loyalty membership ID, user ID, or external cookie ID.\"\n          }\n        ],\n        \"help\": \"Advance matching parameters are hashed and then shared with TikTok to help attribute more conversions to your ads and improve ad retargeting. \\u003cbr\\u003e \\u003ca target\\u003d\\\"_blank\\\" href\\u003d\\\"https://business-api.tiktok.com/portal/docs?id\\u003d1799004110681154#item-link-User%20data\\\"\\u003eLearn more\\u003c/a\\u003e about how to format Advanced Matching parameters.\"\n      },\n      {\n        \"type\": \"GROUP\",\n        \"name\": \"Properties\",\n        \"displayName\": \"Properties (e.g. product data)\",\n        \"groupStyle\": \"NO_ZIPPY\",\n        \"subParams\": [\n          {\n            \"type\": \"CHECKBOX\",\n            \"name\": \"enhance_ecomm\",\n            \"checkboxText\": \"Use Google Analytics E-commerce Data Layers (Recommended)\",\n            \"simpleValueType\": true,\n            \"help\": \"If you have Google\\u0027s \\u003ca href\\u003d\\\"https://developers.google.com/analytics/devguides/collection/ga4/ecommerce?client_type\\u003dgtm#implementation\\\" target\\u003d\\\"_blank\\\"\\u003eEnhanced E-Commerce\\u003c/a\\u003e or \\u003ca href\\u003d\\\"https://support.google.com/tagmanager/answer/6107169?hl\\u003den#standard-ecommerce\\\" target\\u003d\\\"_blank\\\"\\u003e Standard E-Commerce\\u003c/a\\u003e Data Layers set up to collect information about the shopping behavior of your users. TikTok will automatically collect these data as parameters to help you improve your ad performance.\",\n            \"defaultValue\": true\n          },\n          {\n            \"type\": \"RADIO\",\n            \"name\": \"ga_ecomm\",\n            \"displayName\": \"Google Analytics E-commerce Data Layers\",\n            \"radioItems\": [\n              {\n                \"value\": \"ecomm\",\n                \"displayValue\": \"Standard Ecommerce\"\n              },\n              {\n                \"value\": \"enhance_ecomm\",\n                \"displayValue\": \"Enhanced Ecommerce\"\n              }\n            ],\n            \"simpleValueType\": true,\n            \"enablingConditions\": [\n              {\n                \"paramName\": \"enhance_ecomm\",\n                \"paramValue\": true,\n                \"type\": \"EQUALS\"\n              }\n            ],\n            \"defaultValue\": \"ecomm\"\n          },\n          {\n            \"type\": \"TEXT\",\n            \"name\": \"ecomm_currency\",\n            \"displayName\": \"Currency\",\n            \"simpleValueType\": true,\n            \"valueHint\": \"USD\",\n            \"help\": \"If you haven\\u0027t added the currency to the e-commerce data layer, add the current code here. Note: Adding the code will replace the \\u0027currency code\\u0027 or \\u0027currency\\u0027 field from your data layer.\",\n            \"enablingConditions\": [\n              {\n                \"paramName\": \"enhance_ecomm\",\n                \"paramValue\": true,\n                \"type\": \"EQUALS\"\n              }\n            ]\n          },\n          {\n            \"type\": \"RADIO\",\n            \"name\": \"single_multi_product\",\n            \"displayName\": \"Manually Input Single / Multiple Products from Data Layer\",\n            \"radioItems\": [\n              {\n                \"value\": \"single\",\n                \"displayValue\": \"Single Content\"\n              },\n              {\n                \"value\": \"multiple\",\n                \"displayValue\": \"Multiple Contents\",\n                \"help\": \"Send a list of contents as a JSON string. \\u003ca href\\u003d\\\"https://developer.mozilla.org/en-US/docs/Learn/JavaScript/Objects/JSON\\\" target\\u003d\\\"_blank\\\"\\u003eLearn more about JSON\\u003c/a\\u003e\"\n              },\n              {\n                \"value\": \"empty\",\n                \"displayValue\": \"No Contents\"\n              }\n            ],\n            \"simpleValueType\": true,\n            \"enablingConditions\": [\n              {\n                \"paramName\": \"enhance_ecomm\",\n                \"paramValue\": false,\n                \"type\": \"EQUALS\"\n              }\n            ]\n          },\n          {\n            \"type\": \"TEXT\",\n            \"name\": \"contents\",\n            \"displayName\": \"contents\",\n            \"simpleValueType\": true,\n            \"enablingConditions\": [\n              {\n                \"paramName\": \"single_multi_product\",\n                \"paramValue\": \"multiple\",\n                \"type\": \"EQUALS\"\n              }\n            ],\n            \"help\": \"Please make sure \\\"contents\\\" is \\u003ca href\\u003d\\\"https://business-api.tiktok.com/portal/docs?id\\u003d1799004110681154#item-link-contents%20parameters\\\" target\\u003d\\\"_blank\\\"\\u003ea list of valid content objects\\u003c/a\\u003e or encoded as \\u003ca href\\u003d\\\"https://developer.mozilla.org/en-US/docs/Learn/JavaScript/Objects/JSON\\\" target\\u003d\\\"_blank\\\"\\u003ea valid JSON string\\u003c/a\\u003e.\",\n            \"valueHint\": \"[{\\\"content_id\\\": \\\"abc\\\", \\\"price\\\": 10, \\\"quantity\\\": 1}]\"\n          },\n          {\n            \"type\": \"TEXT\",\n            \"name\": \"content_id\",\n            \"displayName\": \"content_id\",\n            \"simpleValueType\": true,\n            \"enablingConditions\": [\n              {\n                \"paramName\": \"single_multi_product\",\n                \"paramValue\": \"single\",\n                \"type\": \"EQUALS\"\n              }\n            ],\n            \"help\": \"Recommended: Unique ID of the item, either SKU ID or item group ID\"\n          },\n          {\n            \"type\": \"SELECT\",\n            \"name\": \"content_type\",\n            \"displayName\": \"content_type\",\n            \"macrosInSelect\": false,\n            \"selectItems\": [\n              {\n                \"value\": \"product\",\n                \"displayValue\": \"product\"\n              },\n              {\n                \"value\": \"product_group\",\n                \"displayValue\": \"product_group\"\n              }\n            ],\n            \"simpleValueType\": true,\n            \"enablingConditions\": [\n              {\n                \"paramName\": \"single_multi_product\",\n                \"paramValue\": \"single\",\n                \"type\": \"EQUALS\"\n              }\n            ],\n            \"help\": \"Recommended: Select \\\"product\\\" if your content_id is SKU ID, or select \\\"product_group\\\" if your content_id is item group ID\",\n            \"notSetText\": \"\"\n          },\n          {\n            \"type\": \"TEXT\",\n            \"name\": \"content_name\",\n            \"displayName\": \"content_name\",\n            \"simpleValueType\": true,\n            \"enablingConditions\": [\n              {\n                \"paramName\": \"single_multi_product\",\n                \"paramValue\": \"single\",\n                \"type\": \"EQUALS\"\n              }\n            ],\n            \"help\": \"Recommended: Title of your product or page\"\n          },\n          {\n            \"type\": \"TEXT\",\n            \"name\": \"content_category\",\n            \"displayName\": \"content_category\",\n            \"simpleValueType\": true,\n            \"help\": \"Recommended: Category of the product or page\",\n            \"enablingConditions\": [\n              {\n                \"paramName\": \"single_multi_product\",\n                \"paramValue\": \"single\",\n                \"type\": \"EQUALS\"\n              }\n            ]\n          },\n          {\n            \"type\": \"TEXT\",\n            \"name\": \"price\",\n            \"displayName\": \"price\",\n            \"simpleValueType\": true,\n            \"enablingConditions\": [\n              {\n                \"paramName\": \"single_multi_product\",\n                \"paramValue\": \"single\",\n                \"type\": \"EQUALS\"\n              }\n            ],\n            \"help\": \"Recommended: Price of this item\"\n          },\n          {\n            \"type\": \"TEXT\",\n            \"name\": \"quantity\",\n            \"displayName\": \"quantity\",\n            \"simpleValueType\": true,\n            \"enablingConditions\": [\n              {\n                \"paramName\": \"single_multi_product\",\n                \"paramValue\": \"single\",\n                \"type\": \"EQUALS\"\n              }\n            ],\n            \"help\": \"Recommended: Quantity of this item\"\n          },\n          {\n            \"type\": \"TEXT\",\n            \"name\": \"value\",\n            \"displayName\": \"value\",\n            \"simpleValueType\": true,\n            \"enablingConditions\": [\n              {\n                \"paramName\": \"enhance_ecomm\",\n                \"paramValue\": false,\n                \"type\": \"EQUALS\"\n              }\n            ],\n            \"help\": \"Recommended: Total value of the order\"\n          },\n          {\n            \"type\": \"TEXT\",\n            \"name\": \"currency\",\n            \"displayName\": \"currency\",\n            \"simpleValueType\": true,\n            \"enablingConditions\": [\n              {\n                \"paramName\": \"enhance_ecomm\",\n                \"paramValue\": false,\n                \"type\": \"EQUALS\"\n              }\n            ],\n            \"help\": \"Recommended: ISO 4217 code. Examples: \\\"EUR\\\", \\\"USD\\\", \\\"JPY\\\". See \\u003ca href\\u003d\\\"https://ads.tiktok.com/help/article/about-parameters?lang\\u003den\\\" target\\u003d\\\"_blank\\\"\\u003ehere\\u003c/a\\u003e for a list of currencies supported.\"\n          },\n          {\n            \"type\": \"TEXT\",\n            \"name\": \"description\",\n            \"displayName\": \"description\",\n            \"simpleValueType\": true,\n            \"help\": \"Recommended: Description of the product or page\",\n            \"enablingConditions\": [\n              {\n                \"paramName\": \"enhance_ecomm\",\n                \"paramValue\": false,\n                \"type\": \"EQUALS\"\n              }\n            ]\n          },\n          {\n            \"type\": \"TEXT\",\n            \"name\": \"brand\",\n            \"displayName\": \"brand\",\n            \"simpleValueType\": true,\n            \"help\": \"Recommended: Brand name of the product\",\n            \"enablingConditions\": [\n              {\n                \"paramName\": \"enhance_ecomm\",\n                \"paramValue\": false,\n                \"type\": \"EQUALS\"\n              }\n            ]\n          },\n          {\n            \"type\": \"TEXT\",\n            \"name\": \"query\",\n            \"displayName\": \"query\",\n            \"simpleValueType\": true,\n            \"help\": \"Recommended for Search events: The text string that was searched for. For instance, a person searches for a product on your website, you can forward the keyword being searched here.\",\n            \"enablingConditions\": [\n              {\n                \"paramName\": \"enhance_ecomm\",\n                \"paramValue\": false,\n                \"type\": \"EQUALS\"\n              }\n            ]\n          },\n          {\n            \"type\": \"TEXT\",\n            \"name\": \"status\",\n            \"displayName\": \"status\",\n            \"simpleValueType\": true,\n            \"help\": \"Optional: Status of an order, item, or service.\",\n            \"enablingConditions\": [\n              {\n                \"paramName\": \"enhance_ecomm\",\n                \"paramValue\": false,\n                \"type\": \"EQUALS\"\n              }\n            ]\n          }\n        ],\n        \"help\": \"Configure and send \\u003ca href\\u003d\\\"https://business-api.tiktok.com/portal/docs?id\\u003d1799004110681154#item-link-Product%20data\\\" target\\u003d\\\"_blank\\\"\\u003eadditional parameters\\u003c/a\\u003e to TikTok for to improve Ad performance and unlock Ad features.\"\n      },\n      {\n        \"type\": \"GROUP\",\n        \"name\": \"De-duplication Configurations\",\n        \"displayName\": \"De-duplication Configurations\",\n        \"groupStyle\": \"NO_ZIPPY\",\n        \"subParams\": [\n          {\n            \"type\": \"TEXT\",\n            \"name\": \"event_id\",\n            \"displayName\": \"Event ID\",\n            \"simpleValueType\": true\n          }\n        ],\n        \"help\": \"If you use both TikTok Pixel template and Events API template to send events, you can set up Event ID to deduplicate the two sources. \\u003ca target\\u003d\\\"_blank\\\" href\\u003d\\\"https://business-api.tiktok.com/portal/docs?id\\u003d1799004097478658#item-link-How%20to%20set%20up%20deduplication\\\"\\u003eLearn more\\u003c/a\\u003e about how to set up deduplication.\"\n      }\n    ]\n  },\n  {\n    \"type\": \"GROUP\",\n    \"name\": \"Section 2 - Additional Properties\",\n    \"displayName\": \"Additional Properties\",\n    \"groupStyle\": \"ZIPPY_CLOSED\",\n    \"subParams\": [\n      {\n        \"type\": \"LABEL\",\n        \"name\": \"Description\",\n        \"displayName\": \"You may configure and send more custom parameters to TikTok to unlock additional Ad features targeted at specific verticals (i.e. Travel)\"\n      },\n      {\n        \"type\": \"PARAM_TABLE\",\n        \"name\": \"custom_properties\",\n        \"displayName\": \"\",\n        \"paramTableColumns\": [\n          {\n            \"param\": {\n              \"type\": \"TEXT\",\n              \"name\": \"key\",\n              \"displayName\": \"Key\",\n              \"simpleValueType\": true,\n              \"canBeEmptyString\": false\n            },\n            \"isUnique\": true\n          },\n          {\n            \"param\": {\n              \"type\": \"TEXT\",\n              \"name\": \"value\",\n              \"displayName\": \"Value\",\n              \"simpleValueType\": true\n            },\n            \"isUnique\": false\n          }\n        ]\n      }\n    ]\n  }\n]\n\n\n___SANDBOXED_JS_FOR_WEB_TEMPLATE___\n\n/*\n * Copyright 2022 ByteDance Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nconst version = \"0_2_01\";\n\nconst log = require(\"logToConsole\");\nconst copyFromWindow = require(\"copyFromWindow\");\nconst copyFromDataLayer = require(\"copyFromDataLayer\");\nconst makeNumber = require(\"makeNumber\");\nconst callInWindow = require(\"callInWindow\");\nconst Object = require(\"Object\");\nconst JSON = require(\"JSON\");\n\nconst ecommerce = copyFromDataLayer(\"ecommerce\");\nconst eventModel = copyFromDataLayer(\"eventModel\");\nconst userDataFromDataLayer = copyFromDataLayer(\"user_data\");\nconst ttContents = copyFromDataLayer('tt_contents') || (eventModel && eventModel.tt_contents);\nconst ttContentType = copyFromDataLayer('tt_content_type') || (eventModel && eventModel.tt_content_type);\nconst ttExternalId = copyFromDataLayer('tt_external_id') || (eventModel && eventModel.tt_external_id);\n\nconst ValidEvents = {\n  ViewContent: 1,\n  ClickButton: 1,\n  Search: 1,\n  AddToWishlist: 1,\n  AddToCart: 1,\n  InitiateCheckout: 1,\n  AddPaymentInfo: 1,\n  CompletePayment: 1,\n  PlaceAnOrder: 1,\n  Contact: 1,\n  Download: 1,\n  SubmitForm: 1,\n  CompleteRegistration: 1,\n  Subscribe: 1,\n};\n\nconst TTEventMap = {\n  'add_payment_info': 'AddPaymentInfo',\n  'add_to_cart': 'AddToCart',\n  'add_to_wishlist': 'AddToWishlist',\n  'begin_checkout': 'InitiateCheckout',\n  'page_view': 'Pageview',\n  'purchase': 'CompletePayment',\n  'search': 'Search',\n  'sign_up': 'CompleteRegistration',\n  'view_item': 'ViewContent',\n};\n\nconst checkExistence = (key) => {\n  return typeof copyFromWindow(key) !== \"undefined\";\n};\n\nconst looksLikeSHA256 = (s) => {\n  return s && s.length == 64;\n};\n\nconst getConfigHash = (data) => {\n  // What API is used. 0: None, 1: Tag Manager, 2: Google Tag, 3: Both\n  var apiVersion = 0;\n  if (ecommerce || userDataFromDataLayer) apiVersion += 1;\n  if (eventModel && (eventModel.items || eventModel.value || eventModel.currency || eventModel.user_data)) apiVersion += 2;\n\n  var contents = 0;\n  if (data.enhance_ecomm == false && data.single_multi_product == \"empty\") contents = 1;\n  else if (data.enhance_ecomm == false && data.single_multi_product == \"single\") contents = 2;\n  else if (data.enhance_ecomm == false && data.single_multi_product == \"multiple\") contents = 3;\n  else if (data.enhance_ecomm == true && data.ga_ecomm == \"enhance_ecomm\") contents = 4;\n  else if (data.enhance_ecomm == true && data.ga_ecomm == \"ecomm\") contents = 5;\n\n  return '' + apiVersion + contents;\n};\n\nconst getEnhancedEcommerceData = (data, ecommerce) => {\n  if (!ecommerce) {\n    return null;\n  }\n\n  if (data.event == \"ViewContent\" && ecommerce.detail && ecommerce.detail.products) {\n    return ecommerce.detail.products;\n  } else if (data.event == \"AddToCart\" && ecommerce.add && ecommerce.add.products) {\n    return ecommerce.add.products;\n  } else if ((data.event == \"InitiateCheckout\" || data.event == \"AddPaymentInfo\") && ecommerce.checkout && ecommerce.checkout.products) {\n    return ecommerce.checkout.products;\n  } else if ((data.event == \"CompletePayment\" || data.event == \"PlaceAnOrder\" || data.event == \"Subscribe\") && ecommerce.purchase && ecommerce.purchase.products) {\n    return ecommerce.purchase.products;\n  } else {\n    if (ecommerce.detail && ecommerce.detail.products)\n      return ecommerce.detail.products;\n    if (ecommerce.add && ecommerce.add.products)\n      return ecommerce.add.products;\n    if (ecommerce.checkout && ecommerce.checkout.products)\n      return ecommerce.checkout.products;\n    if (ecommerce.purchase && ecommerce.purchase.products)\n      return ecommerce.purchase.products;\n  }\n  return null;\n};\n\nconst getItemCategories = (item) => {\n  var categories = [];\n  if (item.item_category) categories.push(item.item_category);\n  if (item.item_category2) categories.push(item.item_category2);\n  if (item.item_category3) categories.push(item.item_category3);\n  if (item.item_category4) categories.push(item.item_category4);\n  if (item.item_category5) categories.push(item.item_category5);\n\n  if (categories.length > 0) {\n    return categories.join(',');\n  }\n\n  return null;\n};\n\nconst getEcommerceData = (data, ecommerce) => {\n  var value = 0;\n  var currency = \"USD\"; // default value\n  var contents = [];\n\n  /* \n    Standard Ecommerce Support. For more details on Ecommerce Data Structure\n    https://developers.google.com/analytics/devguides/collection/ga4/ecommerce?client_type=gtm\n    We will need to check for standard ecommerce events if Enhanced Ecommerce doesnt work\n  */\n  const secData = (ecommerce && ecommerce.items) || (eventModel && eventModel.items) || ttContents;\n  if (secData) {\n    log(\"1a. Standard Ecommerce - Data layers detected\");\n    secData.map(function (ed) {\n      // Form the TikTok Parameter Object\n      var content = {};\n      if (ed.item_id) content.content_id = ed.item_id;\n      if (!ed.item_id && ed.id) content.content_id = ed.id;\n      if (ed.item_name) content.content_name = ed.item_name;\n      if (ed.item_brand) content.brand = ed.item_brand;\n      var categoryString = getItemCategories(ed);\n      if (categoryString) content.content_category = categoryString;\n      if (ed.price) content.price = makeNumber(ed.price);\n      if (ed.quantity) {\n        content.quantity = makeNumber(ed.quantity);\n      } else {\n        content.quantity = 1;\n      }\n      content.content_type = ttContentType || \"product\";\n      contents.push(content);\n      // Calulate the total value shown\n      if (ed.price) {\n        if (!ed.quantity) ed.quantity = 1;\n        value += ed.price * ed.quantity;\n      }\n    });\n  } else if (data.ga_ecomm == \"ecomm\") {\n    log(\"1a. Standard Ecommerce - Unable to detect any Data Layers\");\n  }\n\n  /* \n    Enhanced Ecommerce Support. Fore more details on Enhanced Ecommerce Data Structure\n    https://developers.google.com/analytics/devguides/collection/ua/gtm/enhanced-ecommerce#details\n    ViewContent = detail\n    AddToCart = add\n    InitiateCheckout, AddPaymentInfo = checkout\n    CompletePayment, PlaceAnOrder, Subscribe = purchase\n  */\n  const eecData = getEnhancedEcommerceData(data, ecommerce);\n  if (eecData !== null && contents.length == 0) {\n    log(\"1b. Enhanced Ecommerce - Data layers detected\");\n    eecData.map(function (ed) {\n      // Form the TikTok Parameter Object\n      var content = {};\n      if (ed.id) content.content_id = ed.id;\n      if (ed.name) content.content_name = ed.name;\n      if (ed.brand) content.brand = ed.brand;\n      if (ed.category) content.content_category = ed.category;\n      if (ed.price) content.price = makeNumber(ed.price);\n      if (ed.quantity) {\n        content.quantity = makeNumber(ed.quantity);\n      } else {\n        content.quantity = 1;\n      }\n      content.content_type = ttContentType || \"product\";\n      contents.push(content);\n      // Calulate the total value shown\n      if (ed.price) {\n        if (!ed.quantity) ed.quantity = 1;\n        value += ed.price * ed.quantity;\n      }\n    });\n  } else if (data.ga_ecomm == \"enhance_ecomm\") {\n    log(\"1b. Enhanced Ecommerce - Unable to detect any ecommerce data layers\");\n  }\n\n  if (data.ecomm_currency)\n    currency = data.ecomm_currency;\n  else if (ecommerce && ecommerce.currencyCode)\n    currency = ecommerce.currencyCode;\n  else if (ecommerce && ecommerce.currency)\n    currency = ecommerce.currency;\n  else if (eventModel && eventModel.currency)\n    currency = eventModel.currency;\n\n  if (ecommerce && ecommerce.value) {\n    value = ecommerce.value;\n  } else if (\n    ecommerce &&\n    ecommerce.purchase &&\n    ecommerce.purchase.actionField &&\n    ecommerce.purchase.actionField.revenue\n  ) {\n    value = ecommerce.purchase.actionField.revenue;\n  } else if (eventModel && eventModel.value) {\n    value = eventModel.value;\n  }\n\n  return {\n    value: value,\n    currency: currency,\n    contents: contents\n  };\n};\n\nconst isHashed = (val) => {\n  return val && val.match(\"^[A-Fa-f0-9]{64}$\") != null;\n};\n\nconst getUserDataFromDataLayer = () => {\n  var userData = {};\n  const email = (userDataFromDataLayer && (userDataFromDataLayer.email_address || userDataFromDataLayer.sha256_email_address)) ||\n    (eventModel && eventModel.user_data && (eventModel.user_data.email_address || eventModel.user_data.sha256_email_address));\n  if (email) {\n    if (isHashed(email)) {\n      userData.sha256_email = email;\n    } else {\n      userData.email = email;\n    }\n  }\n\n  const phone = (userDataFromDataLayer && (userDataFromDataLayer.phone_number || userDataFromDataLayer.sha256_phone_number)) ||\n    (eventModel && eventModel.user_data && (eventModel.user_data.phone_number || eventModel.user_data.sha256_phone_number));\n  if (phone) {\n    if (isHashed(phone)) {\n      userData.sha256_phone_number = phone;\n    } else {\n      userData.phone_number = phone;\n    }\n  }\n\n  if (ttExternalId) {\n    userData.external_id = ttExternalId;\n  }\n\n  return userData;\n};\n\nconst main = () => {\n  // Forming the passed in parameters\n  var parameters = {\n    gtm_version: version + ':' + getConfigHash(data),\n    event_trigger_source: 'GoogleTagManagerClient',\n  };\n  const ttEvent = TTEventMap[data.event] || data.event;\n\n  // Check if enhance ecomm is enabled.\n  if (data.enhance_ecomm == true) {\n    const ecomData = getEcommerceData(data, ecommerce);\n    parameters.currency = ecomData.currency;\n    parameters.value = ecomData.value;\n    if (ecomData.contents && ecomData.contents.length > 0) {\n      parameters.contents = ecomData.contents;\n    }\n  } else {\n    if (data.single_multi_product == \"single\") {\n      // Single Content\n      if (data.content_id) parameters.content_id = data.content_id;\n      if (data.content_type || ttContentType) parameters.content_type = data.content_type || ttContentType;\n      if (data.content_name) parameters.content_name = data.content_name;\n      if (data.price) parameters.price = makeNumber(data.price);\n      if (data.quantity) parameters.quantity = makeNumber(data.quantity);\n      if (data.currency) parameters.currency = data.currency;\n      if (data.value) {\n        parameters.value = makeNumber(data.value);\n      } else {\n        if (data.price && data.quantity) {\n          parameters.value = makeNumber(data.price) * makeNumber(data.quantity);\n        }\n      }\n      if (data.content_category)\n        parameters.content_category = data.content_category;\n      if (data.description) parameters.description = data.description;\n      if (data.query) parameters.query = data.query;\n      if (data.status) parameters.status = data.status;\n    } else if (data.single_multi_product == \"multiple\") {\n      // Multiple Content\n      if (data.contents) {\n        const parsedContents = JSON.parse(data.contents);\n        if (parsedContents !== undefined) {\n          parameters.contents = parsedContents;\n        } else {\n          parameters.contents = data.contents;\n        }\n      }\n      if (data.currency) parameters.currency = data.currency;\n      if (data.value) parameters.value = makeNumber(data.value);\n      if (data.description) parameters.description = data.description;\n      if (data.query) parameters.query = data.query;\n      if (data.status) parameters.status = data.status;\n    } else if (data.single_multi_product == \"empty\") {\n      // No Content\n      if (data.currency) parameters.currency = data.currency;\n      if (data.value) parameters.value = makeNumber(data.value);\n      if (data.description) parameters.description = data.description;\n      if (data.query) parameters.query = data.query;\n      if (data.status) parameters.status = data.status;\n    }\n  }\n\n  // Additional Object Properties\n  if (data.custom_properties && data.custom_properties.length > 0) {\n    for (let i = 0; i < data.custom_properties.length; i++) {\n      let objectParam = data.custom_properties[i];\n      if (objectParam.key) {\n        parameters[objectParam.key] = objectParam.value;\n      }\n    }\n  }\n\n  // Advanced Matching and sending TT events\n  var userData = getUserDataFromDataLayer();\n\n  if (data.hash == \"hashed\") {\n    // Send hashed data\n    if (data.sha256_email) userData.sha256_email = data.sha256_email;\n    if (data.sha256_phone)\n      userData.sha256_phone_number = data.sha256_phone;\n    // Note: The key is still \"external_id\"\n    if (data.sha256_external_id)\n      userData.external_id = data.sha256_external_id;\n    log(\"2a. Advanced matching with hashed PII\");\n  } else if (data.hash == \"non-hashed\") {\n    // Send non-hashed data and TikTok Pixel will hash it for you.\n    if (data.email) userData.email = data.email;\n    if (data.phone) userData.phone_number = data.phone;\n    if (data.external_id) userData.external_id = data.external_id;\n    log(\n      \"2b. Advanced matching without hashed data, TikTok Pixel will hash the data for you.\"\n    );\n  }\n\n  if (Object.keys(userData).length > 0) {\n    callInWindow(\"ttq.identify\", userData);\n  }\n\n  log(\n    \"3. Base code found, sending \",\n    ttEvent,\n    \"event with\",\n    parameters,\n    data.event_id\n  );\n\n  if (data.pixel_code) {\n    callInWindow(\"ttq.track\", ttEvent, parameters, {\n      event_id: data.event_id,\n      pixel_code: data.pixel_code\n    });\n  } else {\n    callInWindow(\"ttq.track\", ttEvent, parameters, {\n      event_id: data.event_id\n    });\n  }\n};\n\nconst validate = (data) => {\n  const errors = [];\n  const warnings = [];\n\n  // errors\n  if (!checkExistence(\"ttq\")) {\n    errors.push(\"ttq not found\");\n  }\n\n  // clean up\n  if (data.external_id) {\n    data.external_id = data.external_id.trim();\n  }\n\n  // warnings\n  // 1. Prevent user from passing in SHA256 hash as \"email\" or \"phone\" to avoid double-hashing.\n  // 2. Prevent user from passing in non-hash as \"sha256_email\" or \"sha256_phone\".\n  if (data.email) {\n    if (data.email.indexOf(\"@\") === -1)\n      warnings.push(\"data.email is not an email\");\n    if (looksLikeSHA256(data.email))\n      warnings.push(\"data.email appears to be a SHA256 hash\");\n  }\n  if (data.phone) {\n    if (looksLikeSHA256(data.phone))\n      warnings.push(\"data.phone appears to be a SHA256 hash\");\n  }\n  if (data.sha256_email) {\n    if (!looksLikeSHA256(data.sha256_email))\n      warnings.push(\"data.sha256_email is not a SHA256 hash\");\n  }\n  if (data.sha256_phone) {\n    if (!looksLikeSHA256(data.sha256_phone))\n      warnings.push(\"data.sha256_phone is not a SHA256 hash\");\n  }\n\n  if (TTEventMap[data.event] == undefined && ValidEvents[data.event] === undefined) {\n    warnings.push('data.event \"' + data.event + '\" is not a valid event');\n  }\n\n  for (const msg of warnings) {\n    log(\"[WARN] \" + msg);\n  }\n  for (const msg of errors) {\n    log(\"[ERROR] \" + msg);\n  }\n  return errors;\n};\n\nconst start = () => {\n  const errors = validate(data);\n  if (errors.length > 0) {\n    data.gtmOnFailure();\n    return;\n  }\n\n  main();\n\n  data.gtmOnSuccess();\n};\n\nstart();\n\n\n___WEB_PERMISSIONS___\n\n[\n  {\n    \"instance\": {\n      \"key\": {\n        \"publicId\": \"logging\",\n        \"versionId\": \"1\"\n      },\n      \"param\": [\n        {\n          \"key\": \"environments\",\n          \"value\": {\n            \"type\": 1,\n            \"string\": \"debug\"\n          }\n        }\n      ]\n    },\n    \"clientAnnotations\": {\n      \"isEditedByUser\": true\n    },\n    \"isRequired\": true\n  },\n  {\n    \"instance\": {\n      \"key\": {\n        \"publicId\": \"access_globals\",\n        \"versionId\": \"1\"\n      },\n      \"param\": [\n        {\n          \"key\": \"keys\",\n          \"value\": {\n            \"type\": 2,\n            \"listItem\": [\n              {\n                \"type\": 3,\n                \"mapKey\": [\n                  {\n                    \"type\": 1,\n                    \"string\": \"key\"\n                  },\n                  {\n                    \"type\": 1,\n                    \"string\": \"read\"\n                  },\n                  {\n                    \"type\": 1,\n                    \"string\": \"write\"\n                  },\n                  {\n                    \"type\": 1,\n                    \"string\": \"execute\"\n                  }\n                ],\n                \"mapValue\": [\n                  {\n                    \"type\": 1,\n                    \"string\": \"ttq\"\n                  },\n                  {\n                    \"type\": 8,\n                    \"boolean\": true\n                  },\n                  {\n                    \"type\": 8,\n                    \"boolean\": false\n                  },\n                  {\n                    \"type\": 8,\n                    \"boolean\": false\n                  }\n                ]\n              },\n              {\n                \"type\": 3,\n                \"mapKey\": [\n                  {\n                    \"type\": 1,\n                    \"string\": \"key\"\n                  },\n                  {\n                    \"type\": 1,\n                    \"string\": \"read\"\n                  },\n                  {\n                    \"type\": 1,\n                    \"string\": \"write\"\n                  },\n                  {\n                    \"type\": 1,\n                    \"string\": \"execute\"\n                  }\n                ],\n                \"mapValue\": [\n                  {\n                    \"type\": 1,\n                    \"string\": \"ttq.identify\"\n                  },\n                  {\n                    \"type\": 8,\n                    \"boolean\": false\n                  },\n                  {\n                    \"type\": 8,\n                    \"boolean\": false\n                  },\n                  {\n                    \"type\": 8,\n                    \"boolean\": true\n                  }\n                ]\n              },\n              {\n                \"type\": 3,\n                \"mapKey\": [\n                  {\n                    \"type\": 1,\n                    \"string\": \"key\"\n                  },\n                  {\n                    \"type\": 1,\n                    \"string\": \"read\"\n                  },\n                  {\n                    \"type\": 1,\n                    \"string\": \"write\"\n                  },\n                  {\n                    \"type\": 1,\n                    \"string\": \"execute\"\n                  }\n                ],\n                \"mapValue\": [\n                  {\n                    \"type\": 1,\n                    \"string\": \"ttq.track\"\n                  },\n                  {\n                    \"type\": 8,\n                    \"boolean\": false\n                  },\n                  {\n                    \"type\": 8,\n                    \"boolean\": false\n                  },\n                  {\n                    \"type\": 8,\n                    \"boolean\": true\n                  }\n                ]\n              }\n            ]\n          }\n        }\n      ]\n    },\n    \"clientAnnotations\": {\n      \"isEditedByUser\": true\n    },\n    \"isRequired\": true\n  },\n  {\n    \"instance\": {\n      \"key\": {\n        \"publicId\": \"read_data_layer\",\n        \"versionId\": \"1\"\n      },\n      \"param\": [\n        {\n          \"key\": \"allowedKeys\",\n          \"value\": {\n            \"type\": 1,\n            \"string\": \"any\"\n          }\n        }\n      ]\n    },\n    \"clientAnnotations\": {\n      \"isEditedByUser\": true\n    },\n    \"isRequired\": true\n  }\n]\n\n\n___TESTS___\n\nscenarios:\n- name: Basic\n  code: \"const mockData = {\\n  event: 'view_item',\\n  pixel_code: 'my_pixel_code',\\n\\\n    \\  \\n  advance_matching: true,\\n  hash: \\\"non-hashed\\\",\\n  external_id: '   abc\\\n    \\   ',\\n  \\n  single_multi_product: 'single',\\n  content_type: 'product',\\n  content_id:\\\n    \\ 'abc123',\\n};\\nrunCode(mockData);\\n\\nassertThat(Calls['ttq.identify'].length).isStrictlyEqualTo(1);\\n\\\n    assertThat(Calls['ttq.identify'][0].params).isEqualTo({\\n  \\\"external_id\\\": \\\"\\\n    abc\\\"\\n});\\n\\nassertThat(Calls['ttq.track'].length).isStrictlyEqualTo(1);\\nassertThat(Calls['ttq.track'][0].params.gtm_version).isEqualTo(\\\"\\\n    0_2_01:00\\\");\\nassertThat(Calls['ttq.track'][0].params.content_type).isEqualTo(\\\"\\\n    product\\\");\\nassertThat(Calls['ttq.track'][0].params.content_id).isEqualTo(\\\"\\\n    abc123\\\");\\nassertThat(Calls['ttq.track'][0].params.event_trigger_source).isEqualTo(\\\"\\\n    GoogleTagManagerClient\\\");\\nassertThat(Calls['ttq.track'][0].pixel.pixel_code).isEqualTo(\\\"\\\n    my_pixel_code\\\");\\nassertThat(Calls['ttq.track'][0].eventName).isEqualTo(\\\"ViewContent\\\"\\\n    );\\n\\nassertApi('gtmOnSuccess').wasCalled();\"\n- name: MissingPixelCode\n  code: |-\n    const mockData = {\n      event: 'ViewContent',\n    };\n    runCode(mockData);\n\n    assertThat(LogsError.length).isStrictlyEqualTo(0);\n    assertThat(Calls['ttq.track'][0].pixel.pixel_code).isEqualTo(undefined);\n- name: InvalidPII\n  code: \"const mockData = {\\n  event: 'CompletePayment',\\n  pixel_code: 'my_pixel_code',\\n\\\n    \\  \\n  email: 'ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad',\\n\\\n    \\  phone: 'ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad',\\n\\\n    \\  sha256_email: 'a@a.com',\\n  sha256_phone: '+11231231234',\\n};\\nrunCode(mockData);\\n\\\n    \\n// Check hashed PII not passed into plain PII fields\\nassertThat(LogsWarn).contains(\\\"\\\n    [WARN] data.email is not an email\\\");\\nassertThat(LogsWarn).contains(\\\"[WARN]\\\n    \\ data.email appears to be a SHA256 hash\\\");\\nassertThat(LogsWarn).contains(\\\"\\\n    [WARN] data.phone appears to be a SHA256 hash\\\");\\n\\n// Check plain PII not passed\\\n    \\ into hashed PII fields\\nassertThat(LogsWarn).contains(\\\"[WARN] data.sha256_email\\\n    \\ is not a SHA256 hash\\\");\\nassertThat(LogsWarn).contains(\\\"[WARN] data.sha256_phone\\\n    \\ is not a SHA256 hash\\\");\\n\\n\"\n- name: InvalidEvent\n  code: |\n    const mockData = {\n      event: 'InvalidEvent',\n      pixel_code: 'my_pixel_code',\n    };\n    runCode(mockData);\n\n    // Check we warn about invalid event name\n    assertThat(LogsWarn).contains('[WARN] data.event \"InvalidEvent\" is not a valid event');\n- name: ValidPIIHashed\n  code: \"const mockData = {\\n  event: 'CompletePayment',\\n  pixel_code: 'my_pixel_code',\\n\\\n    \\  \\n  hash: 'hashed',\\n  sha256_email: 'ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad',\\n\\\n    \\  sha256_phone: 'ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad',\\n\\\n    };\\nrunCode(mockData);\\n\\nassertThat(Calls['ttq.identify'].length).isStrictlyEqualTo(1);\\n\\\n    assertThat(Calls['ttq.identify'][0].params).isEqualTo({\\n  \\\"sha256_email\\\": 'ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad',\\n\\\n    \\  \\\"sha256_phone_number\\\": 'ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad'\\n\\\n    });\\n\"\n- name: ValidPIIPlain\n  code: \"const mockData = {\\n  event: 'CompletePayment',\\n  pixel_code: 'my_pixel_code',\\n\\\n    \\  \\n  hash: 'non-hashed',\\n  email: 'a@a.com',\\n  phone: '+11231231234',\\n};\\n\\\n    runCode(mockData);\\n\\nassertThat(Calls['ttq.identify'].length).isStrictlyEqualTo(1);\\n\\\n    assertThat(Calls['ttq.identify'][0].params).isEqualTo({\\n  \\\"email\\\": 'a@a.com',\\n\\\n    \\  \\\"phone_number\\\": '+11231231234'\\n});\\n\\n\"\n- name: MultipleProducts\n  code: |-\n    const mockData = {\n      event: 'CompletePayment',\n      pixel_code: 'my_pixel_code',\n      single_multi_product: 'multiple',\n      contents: '[{\"content_id\": \"abc123\", \"price\": 1.23}]',\n    };\n    runCode(mockData);\n\n    assertThat(Calls['ttq.track'].length).isStrictlyEqualTo(1);\n    assertThat(Calls['ttq.track'][0].params.contents[0].content_id).isEqualTo(\"abc123\");\n    assertThat(Calls['ttq.track'][0].params.contents[0].price).isEqualTo(1.23);\n\n    // Verify that the tag finished successfully.\n    assertApi('gtmOnSuccess').wasCalled();\n- name: MultipleProductsInvalidContentsJSON\n  code: |-\n    const mockData = {\n      event: 'CompletePayment',\n      event_id: '1234',\n      pixel_code: 'my_pixel_code',\n      single_multi_product: 'multiple',\n      contents: '[{\"content_id\": \"abc123\", \"price\": 1.23}]]]]]',\n    };\n    runCode(mockData);\n\n    assertThat(Calls['ttq.track'].length).isStrictlyEqualTo(1);\n    // Parsing failure should just forward the event to Pixel.\n    assertThat(Calls['ttq.track'][0].params.contents).isEqualTo('[{\"content_id\": \"abc123\", \"price\": 1.23}]]]]]');\n\n    // Verify that the tag finished successfully.\n    assertApi('gtmOnSuccess').wasCalled();\n- name: SingleProduct\n  code: |-\n    const mockData = {\n      event: 'CompletePayment',\n      pixel_code: 'my_pixel_code',\n      single_multi_product: 'single',\n      content_id: 'abc123',\n      content_type: 'product',\n      content_name: 'tee shirt',\n      price: '12.34',\n      quantity: '2',\n      currency: 'USD',\n      value: '24.68',\n      custom_properties: [\n        {\n          key: 'custom_property_1',\n          value: 1,\n        },\n        {\n          key: 'custom_property_2',\n          value: '2',\n        },\n        {\n          key: '',\n          value: '3',\n        },\n      ],\n    };\n    runCode(mockData);\n\n    assertThat(Calls['ttq.track'].length).isStrictlyEqualTo(1);\n    assertThat(Calls['ttq.track'][0].params.content_id).isEqualTo(\"abc123\");\n    assertThat(Calls['ttq.track'][0].params.content_type).isEqualTo(\"product\");\n    assertThat(Calls['ttq.track'][0].params.content_name).isEqualTo(\"tee shirt\");\n    assertThat(Calls['ttq.track'][0].params.price).isEqualTo(12.34);\n    assertThat(Calls['ttq.track'][0].params.quantity).isEqualTo(2);\n    assertThat(Calls['ttq.track'][0].params.currency).isEqualTo(\"USD\");\n    assertThat(Calls['ttq.track'][0].params.value).isEqualTo(24.68);\n    assertThat(Calls['ttq.track'][0].params.custom_property_1).isEqualTo(1);\n    assertThat(Calls['ttq.track'][0].params.custom_property_2).isEqualTo('2');\n    assertThat(Calls['ttq.track'][0].params['']).isUndefined();\n\n    // Verify that the tag finished successfully.\n    assertApi('gtmOnSuccess').wasCalled();\n- name: StandardEcommerce\n  code: |-\n    const mockData = {\n      event: 'CompletePayment',\n      pixel_code: 'my_pixel_code',\n      enhance_ecomm: true,\n      ecommerce: {\n        currency: 'CAD',\n        value: 7.77,\n        items: [\n          {\n              item_id: 'abc123',\n              item_name: 'tee shirt',\n              item_brand: 'mybrand',\n              item_category: \"Apparel\",\n              item_category2: \"Adult\",\n              item_category4: \"Crew\",\n              price: 9.99,\n              discount: 2.22,\n              quantity: 1\n          }\n        ]\n      }\n    };\n\n    runCode(mockData);\n\n    assertThat(Calls['ttq.track'].length).isStrictlyEqualTo(1);\n    assertThat(Calls['ttq.track'][0].params.contents.length).isStrictlyEqualTo(1);\n    assertThat(Calls['ttq.track'][0].params.contents[0].content_id).isEqualTo(\"abc123\");\n    assertThat(Calls['ttq.track'][0].params.contents[0].content_type).isEqualTo(\"product\");\n    assertThat(Calls['ttq.track'][0].params.contents[0].content_name).isEqualTo(\"tee shirt\");\n    assertThat(Calls['ttq.track'][0].params.contents[0].content_category).isEqualTo(\"Apparel,Adult,Crew\");\n    assertThat(Calls['ttq.track'][0].params.contents[0].brand).isEqualTo(\"mybrand\");\n    assertThat(Calls['ttq.track'][0].params.contents[0].price).isEqualTo(9.99);\n    assertThat(Calls['ttq.track'][0].params.contents[0].quantity).isEqualTo(1);\n    assertThat(Calls['ttq.track'][0].params.currency).isEqualTo(\"CAD\");\n    assertThat(Calls['ttq.track'][0].params.value).isEqualTo(7.77);\n\n    assertApi('gtmOnSuccess').wasCalled();\n- name: EnhancedEcommerce\n  code: |-\n    const mockData = {\n      event: 'CompletePayment',\n      pixel_code: 'my_pixel_code',\n      enhance_ecomm: true,\n      ecomm_currency: 'CNY',\n      ecommerce: {\n        detail: {\n          products: [{\n            name: 'tee shirt',\n            id: 'abc123',\n            price: '9.99',\n            brand: 'mybrand',\n            category: 'apparel',\n            variant: 'blue'\n           }]\n         }\n      }\n    };\n\n    runCode(mockData);\n\n    assertThat(Calls['ttq.track'].length).isStrictlyEqualTo(1);\n    assertThat(Calls['ttq.track'][0].params.contents.length).isStrictlyEqualTo(1);\n    assertThat(Calls['ttq.track'][0].params.contents[0].content_id).isEqualTo(\"abc123\");\n    assertThat(Calls['ttq.track'][0].params.contents[0].content_type).isEqualTo(\"product\");\n    assertThat(Calls['ttq.track'][0].params.contents[0].content_name).isEqualTo(\"tee shirt\");\n    assertThat(Calls['ttq.track'][0].params.contents[0].content_category).isEqualTo(\"apparel\");\n    assertThat(Calls['ttq.track'][0].params.contents[0].brand).isEqualTo(\"mybrand\");\n    assertThat(Calls['ttq.track'][0].params.contents[0].price).isEqualTo(9.99);\n    assertThat(Calls['ttq.track'][0].params.contents[0].quantity).isEqualTo(1);\n    assertThat(Calls['ttq.track'][0].params.currency).isEqualTo(\"CNY\");\n    assertThat(Calls['ttq.track'][0].params.value).isEqualTo(9.99);\n\n    assertApi('gtmOnSuccess').wasCalled();\nsetup: \"const log = require('logToConsole');\\n\\nconst LogsError = [];\\nconst LogsWarn\\\n  \\ = []; \\nconst Calls = {};\\n\\nmock('logToConsole', function() {\\n  if (arguments.length\\\n  \\ > 0 && arguments[0].substring(0, 7) == '[ERROR]') {\\n    LogsError.push(arguments[0]);\\n\\\n  \\  }\\n  if (arguments.length > 0 && arguments[0].substring(0, 6) == '[WARN]') {\\n\\\n  \\    LogsWarn.push(arguments[0]);\\n  }\\n  // Print out logs, as normally as possible\\n\\\n  \\  log(arguments); // Note: bind and call not available\\n});\\n\\nmock('callInWindow',\\\n  \\ function() {\\n  const fnName = arguments[0];\\n  Calls[fnName] = Calls[fnName]\\\n  \\ || [];\\n  const call = {};\\n  call.arguments = arguments;\\n  Calls[fnName].push(call);\\n\\\n  \\  \\n  if (fnName === 'ttq.identify') {\\n    call.params = arguments[1];\\n  } else\\\n  \\ if (fnName === 'ttq.track') {\\n    call.eventName = arguments[1];\\n    call.params\\\n  \\ = arguments[2];\\n    call.pixel = arguments[3];\\n  }\\n});\\n\\nmock('copyFromWindow',\\\n  \\ function(name) {\\n  // Assume base code always exists.\\n  return {};\\n});\\n\\n\\\n  mock('copyFromDataLayer', function(name) {\\n  if (name == \\\"ecommerce\\\") {\\n   \\\n  \\ return mockData.ecommerce;\\n  }\\n  \\n  return undefined;\\n});\"\n\n\n___NOTES___\n\nCreated on 19/08/2022, 17:04:57\n\n\n",
        "galleryReference": {
          "host": "github.com",
          "owner": "tiktok",
          "repository": "gtm-template-pixel",
          "version": "cfe618d563a596ca92bc2fe1002332ea8a752064",
          "signature": "dc266f7c7b567a4d00dd3ea4d9742c409816d2be678413fac7d9a4977c55aae1",
          "galleryTemplateId": "MRQN8"
        }
      }
    ],
    "name": "CAPI Suite \u2014 Meta + TikTok + Pinterest + GA4 \u2014 3.6.0",
    "description": "Bundled with CAPI Suite plugin v3.6.0. Adds TikTok Pixel tags alongside Meta Pixel and GA4. Custom Templates: Meta Pixel, TikTok Pixel."
  }
}