["<!-- Facebook Pixel Code -->\n    <script>\n        function getFBCookie(cname) {\n            let name = cname + \"=\";\n            let decodedCookie = decodeURIComponent(document.cookie);\n            let ca = decodedCookie.split(';');\n            for (let i = 0; i < ca.length; i++) {\n                let c = ca[i];\n                while (c.charAt(0) == ' ') {\n                    c = c.substring(1);\n                }\n                if (c.indexOf(name) == 0) {\n                    return c.substring(name.length, c.length);\n                }\n            }\n            return \"\";\n        }\n\n        function setFBCookie(cname, cvalue, exdays) {\n            const d = new Date();\n            d.setTime(d.getTime() + (exdays * 24 * 60 * 60 * 1000));\n            let expires = \"expires=\" + d.toUTCString();\n            document.cookie = cname + \"=\" + cvalue + \";\" + expires + \";path=/\";\n        }\n\n        function getUrlParameter(param) {\n            const urlParams = new URLSearchParams(window.location.search);\n            return urlParams.get(param);\n        }\n\n                \n        !function (f, b, e, v, n, t, s) {\n            if (f.fbq) return;\n            n = f.fbq = function () {\n                n.callMethod ?\n                    n.callMethod.apply(n, arguments) : n.queue.push(arguments);\n            };\n            if (!f._fbq) f._fbq = n;\n            n.push = n;\n            n.loaded = !0;\n            n.version = \"2.0\";\n            n.queue = [];\n            t = b.createElement(e);\n            t.async = !0;\n            t.src = v;\n            s = b.getElementsByTagName(e)[0];\n            s.parentNode.insertBefore(t, s);\n        }(window, document, \"script\",\n            \"https://connect.facebook.net/en_US/fbevents.js\");\n\n        fbq(\"init\", '1160945128867032');\n        let eventTime = Date.now();\n        let fbp = getFBCookie('_fbp');\n        let fbc = getFBCookie('_fbc');\n\n                        let txId = getUrlParameter('form_submission_id') ?? eventTime;\n\n                    let event = getUrlParameter('form_submission_id') ? 'Lead' : 'PageView';\n        \n                    eventID = `page.${event}.tx_${txId}`;\n        \n        \n        if (event) {\n            // Check if this event has already been tracked to prevent duplicate tracking\n            let eventCookieName = 'fb_event_' + eventID;\n            let eventTracked = getFBCookie(eventCookieName);\n\n            if (!eventTracked) {\n                let fbData = {};\n\n                if (fbp !== \"\") {\n                    fbData.fbp = fbp;\n                }\n\n                if (fbc !== \"\") {\n                    fbData.fbc = fbc;\n                }\n\n                \n                fbq(\"track\", 'PageView', fbData, { eventID: eventID });\n\n                // Set cookie to mark this event as tracked (expires in 30 days)\n                setFBCookie(eventCookieName, '1', 30);\n            }\n        }\n\n    </script>\n    <!-- End Facebook Pixel Code -->\n",{"name":"fb","location":"head","consentType":"statistical","content":"<!-- Facebook Pixel Code -->\n    <script>\n        function getFBCookie(cname) {\n            let name = cname + \"=\";\n            let decodedCookie = decodeURIComponent(document.cookie);\n            let ca = decodedCookie.split(';');\n            for (let i = 0; i < ca.length; i++) {\n                let c = ca[i];\n                while (c.charAt(0) == ' ') {\n                    c = c.substring(1);\n                }\n                if (c.indexOf(name) == 0) {\n                    return c.substring(name.length, c.length);\n                }\n            }\n            return \"\";\n        }\n\n        function setFBCookie(cname, cvalue, exdays) {\n            const d = new Date();\n            d.setTime(d.getTime() + (exdays * 24 * 60 * 60 * 1000));\n            let expires = \"expires=\" + d.toUTCString();\n            document.cookie = cname + \"=\" + cvalue + \";\" + expires + \";path=/\";\n        }\n\n        function getUrlParameter(param) {\n            const urlParams = new URLSearchParams(window.location.search);\n            return urlParams.get(param);\n        }\n\n                \n        !function (f, b, e, v, n, t, s) {\n            if (f.fbq) return;\n            n = f.fbq = function () {\n                n.callMethod ?\n                    n.callMethod.apply(n, arguments) : n.queue.push(arguments);\n            };\n            if (!f._fbq) f._fbq = n;\n            n.push = n;\n            n.loaded = !0;\n            n.version = \"2.0\";\n            n.queue = [];\n            t = b.createElement(e);\n            t.async = !0;\n            t.src = v;\n            s = b.getElementsByTagName(e)[0];\n            s.parentNode.insertBefore(t, s);\n        }(window, document, \"script\",\n            \"https://connect.facebook.net/en_US/fbevents.js\");\n\n        fbq(\"init\", '1160945128867032');\n        let eventTime = Date.now();\n        let fbp = getFBCookie('_fbp');\n        let fbc = getFBCookie('_fbc');\n\n                        let txId = getUrlParameter('form_submission_id') ?? eventTime;\n\n                    let event = getUrlParameter('form_submission_id') ? 'Lead' : 'PageView';\n        \n                    eventID = `page.${event}.tx_${txId}`;\n        \n        \n        if (event) {\n            // Check if this event has already been tracked to prevent duplicate tracking\n            let eventCookieName = 'fb_event_' + eventID;\n            let eventTracked = getFBCookie(eventCookieName);\n\n            if (!eventTracked) {\n                let fbData = {};\n\n                if (fbp !== \"\") {\n                    fbData.fbp = fbp;\n                }\n\n                if (fbc !== \"\") {\n                    fbData.fbc = fbc;\n                }\n\n                \n                fbq(\"track\", 'PageView', fbData, { eventID: eventID });\n\n                // Set cookie to mark this event as tracked (expires in 30 days)\n                setFBCookie(eventCookieName, '1', 30);\n            }\n        }\n\n    </script>\n    <!-- End Facebook Pixel Code -->\n","attributes":null},{"name":"convertbox landingpagina","location":"head","consentType":"marketing","content":"<script type=\"text/javascript\">!function(e,t){(e=t.createElement(\"script\")).src=\"https://cdn.convertbox.com/convertbox/js/embed.js\",e.id=\"app-convertbox-script\",e.async=true,e.dataset.uuid=\"bbb757e1-b3c3-4541-a901-5eb511145c98\",document.getElementsByTagName(\"head\")[0].appendChild(e)}(window,document);</script>\n","attributes":{"type":"text/javascript"}}]