Plugin Directory


Ignore:
Timestamp:
01/14/2026 03:34:05 PM (2 months ago)
Author:
termageddon
Message:

Update to version 1.9.0 from GitHub

Location:
termageddon-usercentrics
Files:
26 edited
1 copied

Legend:

Unmodified
Added
Removed
  • termageddon-usercentrics/tags/1.9.0/README.txt

    r3366825 r3439658  
    55Tested up to: 6.8.1
    66Requires PHP: 7.2
    7 Stable tag: 1.8.2
     7Stable tag: 1.9.0
    88License: GPLv2 or later
    99License URI: http://www.gnu.org/licenses/gpl-2.0.html
     
    189189== Changelog ==
    190190
     191= 1.9.0 =
     192
     193**✨ New Features:**
     194* Added "Manual Script Controller" allowing users to add any script and have it automatically be configured for Cookie Consent with automatic privacy blocking in mind.
     195
     196**🔧 Improvements:**
     197* Updated list of supported Smart Data Protector technologies for use with Advanced Configurations under Integrations.
     198* Added support for Delaware (DPDPA) & Indiana (ICDPA) for Geolocation.
     199
    191200= 1.8.2 =
    192201
  • termageddon-usercentrics/tags/1.9.0/admin/class-termageddon-usercentrics-admin.php

    r3362792 r3439658  
    129129        wp_enqueue_script( 'select2', 'https://cdn.jsdelivr.net/npm/select2@4.1.0-rc.0/dist/js/select2.min.js', array( 'jquery' ), '4.1.0', true );
    130130
    131         // Initialize select2 for our multi-select fields
     131        // Initialize select2 for our multi-select and single-select fields
    132132        wp_add_inline_script( 'select2', '
    133133            jQuery(document).ready(function($) {
     
    135135                    width: "100%",
    136136                    placeholder: "Select providers...",
     137                    allowClear: true
     138                });
     139                $(".termageddon-singleselect").select2({
     140                    width: "100%",
     141                    placeholder: "Select a service...",
    137142                    allowClear: true
    138143                });
     
    289294    public function add_new_subsection( string $section, array $options = array() ) {
    290295
    291         $name        = ( isset( $options['name'] ) ? $options['name'] : false );
    292         $description = ( isset( $options['description'] ) ? $options['description'] : false );
     296        $name        = $options['name'] ?? false;
     297        $tags        = isset( $options['tags'] ) ? ' ' . $options['tags'] : '';
     298        $description = $options['description'] ?? false;
    293299        // Indent specifies whether or not the subsection should be indented.
    294         $indent = ( isset( $options['indent'] ) ? true === $options['indent'] : false );
     300        $indent = ( $options['indent'] ?? false ) === true;
    295301
    296302        // Slim slims down the column width for the initial options.
    297         $slim = ( isset( $options['slim'] ) ? true === $options['slim'] : false );
     303        $slim = ( $options['slim'] ?? false ) === true;
    298304
    299305        // Helper slims down the divider and displays a helper text by itself.
    300         $helper = ( isset( $options['helper'] ) ? true === $options['helper'] : false );
     306        $helper = ( $options['helper'] ?? false ) === true;
    301307
    302308        $section_contents = $helper ?
    303309        '
    304                     <span class="tu-section-title-helper">' . esc_html( $name ) . ':</span>
     310                    <span class="tu-section-title-helper">' . esc_html( $name ) . ':' . $tags . '</span>
    305311                    ' . ( empty( $description ) ? '' : '<p>' . wp_kses_post( $description ) . '</p>' )
    306312        : ' </div>
    307313                <div class="tu-toggle-section">
    308                     <span class="tu-section-title">' . esc_html( $name ) . ':</span>
     314                    <span class="tu-section-title">' . esc_html( $name ) . ':' . $tags . '</span>
    309315                    ' . ( empty( $description ) ? '' : '<p>' . wp_kses_post( $description ) . '</p>' ) . '
    310316                </div>
     
    343349
    344350    /**
     351     * Gets the Usercentrics providers array.
     352     *
     353     * Caches the result to avoid multiple file includes.
     354     *
     355     * @return array Array of provider IDs and names.
     356     */
     357    public static function get_usercentrics_providers(): array {
     358        static $providers = null;
     359
     360        if ( null === $providers ) {
     361            $providers = include TERMAGEDDON_COOKIE_PATH . 'admin/usercentrics-providers.php';
     362        }
     363
     364        return $providers;
     365    }
     366
     367
     368    /**
    345369     * Buildout all settings sections in prep for registering the settings.
    346370     *
     
    461485            'termageddon_usercentrics_embed_code', // option name.
    462486            '' // sanitization function.
     487        );
     488
     489        // BREAK SECTION FOR MANUAL SCRIPT CONTROLLER.
     490        $this->add_new_subsection(
     491            'termageddon_usercentrics_section_embed',
     492            array(
     493                'name'        => __( 'Manual Script Controller', 'termageddon-usercentrics' ),
     494                'tags' => $this->mark_as_beta(),
     495                'description' => __( 'This feature helps add the', 'termageddon-usercentrics' )
     496                .' <a href="https://termageddon.freshdesk.com/support/solutions/articles/66000529802-embedding-the-cookie-consent-solution-and-cookie-policy#:~:text=for%20simplicity%20purposes.-,Manual%20script%20control,-%2D%20You%20can%20also" target="_blank">'.__( 'manual control snippet', 'termageddon-usercentrics' ).'</a> '
     497                .__( 'into third party scripts (Google Analytics, Facebook Pixel, LinkedIn Insights Tag, etc.), which can help ensure that consent is obtained first prior to the script loading.', 'termageddon-usercentrics' )
     498                .'<br/><br/>'
     499                .__( 'Simply add a new snippet, enter the Service name (same name as the Service you listed in your Cookie Policy and Consent Tool questionnaire), and paste your embed code into the provided field. The plugin will then set up manual control of the script, helping ensure that it is blocked until consent is obtained by the user.', 'termageddon-usercentrics' )
     500                .'<br/><br/><em>'
     501                .__( 'Very important: be sure to', 'termageddon-usercentrics' )
     502                .' <a href="https://termageddon.freshdesk.com/support/solutions/articles/66000529802-embedding-the-cookie-consent-solution-and-cookie-policy" target="_blank">'.__( 'test the consent solution', 'termageddon-usercentrics' ).'</a> '
     503                .__( 'just in general, but also after making this update to ensure that scripts do not fire until consent is provided.', 'termageddon-usercentrics' )
     504                .'</em>',
     505            )
     506        );
     507
     508        // Import providers for script snippets
     509        $providers = self::get_usercentrics_providers();
     510
     511        // Script snippets field (full width, no label)
     512        add_settings_field(
     513            'termageddon_usercentrics_script_snippets',
     514            '',
     515            array( &$this, 'script_snippets_html' ),
     516            'termageddon-usercentrics',
     517            'termageddon_usercentrics_section_embed',
     518            array(
     519                'label_for'   => 'termageddon_usercentrics_script_snippets',
     520                'options'     => $providers,
     521                'class'       => 'tu-table-full-width',
     522            )
     523        );
     524
     525        register_setting(
     526            'termageddon_usercentrics_settings',
     527            'termageddon_usercentrics_script_snippets',
     528            array(
     529                'type'              => 'array',
     530                'sanitize_callback' => array( &$this, 'sanitize_script_snippets' ),
     531                'default'           => array(),
     532            )
    463533        );
    464534
     
    670740                'default'           => 'v2',
    671741            )
     742        );
     743
     744        // Disable Usercentrics Auto-blocking script
     745        add_settings_field(
     746            'termageddon_usercentrics_manual_script_control',
     747            __( 'Disable Usercentrics Auto-blocking script', 'termageddon-usercentrics' ),
     748            array( &$this, 'manual_script_control_html' ), // function which prints the field.
     749            'termageddon-usercentrics', // page slug.
     750            'termageddon_usercentrics_section_settings', // section ID.
     751            array(
     752                'label_for'   => 'termageddon_usercentrics_manual_script_control',
     753                'description' => __( 'By updating all external scripts to use the <a href="https://termageddon.freshdesk.com/support/solutions/articles/66000529802-embedding-the-cookie-consent-solution-and-cookie-policy#:~:text=for%20simplicity%20purposes.-,Manual%20script%20control,-%2D%20You%20can%20also" target="_blank">manual script controller</a>, you can disable usercentrics block script which will improve site-loading performance and improve reliability. Once enabled, please ensure you <a href="https://termageddon.freshdesk.com/support/solutions/articles/66000529802-embedding-the-cookie-consent-solution-and-cookie-policy" target="_blank">validate</a> that any external services are working as expected.', 'termageddon-usercentrics' ),
     754            )
     755        );
     756
     757        register_setting(
     758            'termageddon_usercentrics_settings', // settings group name.
     759            'termageddon_usercentrics_manual_script_control', // option name.
     760            '' // sanitization function.
    672761        );
    673762
     
    893982
    894983        // Import providers
    895         $providers = include TERMAGEDDON_COOKIE_PATH . 'admin/usercentrics-providers.php';
     984        $providers = self::get_usercentrics_providers();
    896985
    897986        // Auto-refresh on consent field
     
    12681357
    12691358    /**
     1359     * The HTML field for the manual script control checkbox.
     1360     *
     1361     * @param array $args The arguments provided by the add_settings_field() method.
     1362     * @return void
     1363     */
     1364    public function manual_script_control_html( array $args ) {
     1365        self::generate_checkbox( 'manual_script_control', '', $args );
     1366    }
     1367
     1368    /**
    12701369     * The HTML field for the disable CDN checkbox.
    12711370     *
     
    13821481
    13831482        echo '
    1384         <div class="tu-section-settings">
    1385             <div class="tu-section">';
     1483        <div class="tu-settings-section">
     1484            <div class="tu-toggle-section">';
    13861485
    13871486    }
     
    14181517
    14191518        echo '<p>' .
    1420             esc_html__( 'Not sure what to select? Review', 'termageddon-usercentrics' ) . ' <a href="https://termageddon.freshdesk.com/support/solutions/articles/66000503289-how-to-activate-a-cookie-policy-and-cookie-consent-solution" target="_blank">' . esc_html__( 'this article', 'termageddon-usercentrics' ) . '</a> ' . esc_html__( 'along with page 1 of your Privacy Policy questionnaire within ', 'termageddon-usercentrics' ) . '<a href="https://app.termageddon.com/home" target="_blank">app.termageddon.com</a>.' .
     1519            esc_html__( 'Not sure what to select? Review', 'termageddon-usercentrics' ) . ' <a href="https://termageddon.freshdesk.com/support/solutions/articles/66000530091-how-to-activate-the-cookie-policy-and-consent-solution" target="_blank">' . esc_html__( 'this article', 'termageddon-usercentrics' ) . '</a> ' . esc_html__( 'along with page 1 of your Privacy Policy questionnaire within ', 'termageddon-usercentrics' ) . '<a href="https://policies.termageddon.com/home" target="_blank">policies.termageddon.com</a>.' .
    14211520        '</p>';
    14221521
     
    14581557        }
    14591558        return array_map( 'sanitize_text_field', $value );
     1559    }
     1560
     1561    /**
     1562     * Sanitize script snippets array
     1563     *
     1564     * Validates each snippet for proper service ID and script tag presence.
     1565     * Invalid snippets are skipped with appropriate error messages.
     1566     *
     1567     * @param mixed $value The script snippets array to sanitize.
     1568     * @return array The sanitized script snippets array.
     1569     */
     1570    public function sanitize_script_snippets( $value ): array {
     1571        if ( ! is_array( $value ) ) {
     1572            return array();
     1573        }
     1574
     1575        $providers = self::get_usercentrics_providers();
     1576        $sanitized = array();
     1577
     1578        foreach ( $value as $index => $snippet ) {
     1579            if ( ! is_array( $snippet ) ) {
     1580                continue;
     1581            }
     1582
     1583            // Validate and sanitize service_id
     1584            $service_id = sanitize_text_field( $snippet['service_id'] ?? '' );
     1585            if ( empty( $service_id ) || ! isset( $providers[ $service_id ] ) ) {
     1586                $this->add_snippet_error(
     1587                    'invalid_service_' . $index,
     1588                    sprintf(
     1589                        /* translators: %d: snippet index number */
     1590                        __( 'Script snippet #%d was not saved: Please select a valid service.', 'termageddon-usercentrics' ),
     1591                        $index + 1
     1592                    )
     1593                );
     1594                continue;
     1595            }
     1596
     1597            // Get script content - don't sanitize here, will be processed via augment_script_for_usercentrics on output
     1598            // Similar to how embed_code is handled (no sanitization callback)
     1599            $script = trim( $snippet['script'] ?? '' );
     1600
     1601            // Validate that the script is not empty
     1602            if ( empty( $script ) ) {
     1603                $this->add_snippet_error(
     1604                    'empty_script_' . $index,
     1605                    sprintf(
     1606                        /* translators: %1$s: service name, %2$d: snippet index number */
     1607                        __( 'Script snippet for "%1$s" (#%2$d) was not saved: The script code field cannot be empty.', 'termageddon-usercentrics' ),
     1608                        $providers[ $service_id ],
     1609                        $index + 1
     1610                    )
     1611                );
     1612                continue;
     1613            }
     1614
     1615            // Check if content contains script tags
     1616            if ( ! preg_match( '/<script[^>]*>/i', $script ) ) {
     1617                $service_name = $providers[ $service_id ];
     1618
     1619                // Check if it contains other HTML tags (like div, span, etc.)
     1620                if ( preg_match( '/<(div|span|p|a|img|iframe|button|input|form|table|ul|ol|li|h[1-6])[^>]*>/i', $script ) ) {
     1621                    $error_message = sprintf(
     1622                        /* translators: %1$s: service name, %2$d: snippet index number */
     1623                        __( 'Script snippet for "%1$s" (#%2$d) was not saved: Only script tags are allowed. Please remove any HTML elements (div, span, etc.) and use only &lt;script&gt; tags.', 'termageddon-usercentrics' ),
     1624                        $service_name,
     1625                        $index + 1
     1626                    );
     1627                } else {
     1628                    $error_message = sprintf(
     1629                        /* translators: %1$s: service name, %2$d: snippet index number */
     1630                        __( 'Script snippet for "%1$s" (#%2$d) was not saved: The script code must contain at least one &lt;script&gt; tag.', 'termageddon-usercentrics' ),
     1631                        $service_name,
     1632                        $index + 1
     1633                    );
     1634                }
     1635
     1636                $this->add_snippet_error( 'invalid_content_' . $index, $error_message );
     1637                continue;
     1638            }
     1639
     1640            $sanitized[] = array(
     1641                'script'     => $script,
     1642                'service_id' => $service_id,
     1643            );
     1644        }
     1645
     1646        return $sanitized;
     1647    }
     1648
     1649    /**
     1650     * Helper method to add settings errors for script snippets
     1651     *
     1652     * @param string $code    Error code.
     1653     * @param string $message Error message.
     1654     * @return void
     1655     */
     1656    private function add_snippet_error( string $code, string $message ): void {
     1657        add_settings_error(
     1658            'termageddon_usercentrics_script_snippets',
     1659            $code,
     1660            $message,
     1661            'error'
     1662        );
    14601663    }
    14611664
     
    15061709    }
    15071710
     1711    /**
     1712     * The HTML field for the script snippets repeater
     1713     *
     1714     * @param array $args The arguments provided by the add_settings_field() method.
     1715     * @return void
     1716     */
     1717    public function script_snippets_html( array $args ) {
     1718        $options = $args['options'];
     1719        $snippets = get_option( 'termageddon_usercentrics_script_snippets', array() );
     1720
     1721        // Ensure snippets is an array
     1722        if ( ! is_array( $snippets ) ) {
     1723            $snippets = array();
     1724        }
     1725        ?>
     1726        <div id="termageddon-script-snippets-container">
     1727            <?php if ( ! empty( $snippets ) ) : ?>
     1728                <?php foreach ( $snippets as $index => $snippet ) : ?>
     1729                    <?php
     1730                    // Get service name for header
     1731                    $service_id = isset( $snippet['service_id'] ) ? $snippet['service_id'] : '';
     1732                    $service_name = '';
     1733                    if ( ! empty( $service_id ) && isset( $options[ $service_id ] ) ) {
     1734                        $service_name = $options[ $service_id ];
     1735                    } else {
     1736                        $service_name = __( 'New Script Snippet', 'termageddon-usercentrics' );
     1737                    }
     1738
     1739                    // Count script tags
     1740                    $script_content = isset( $snippet['script'] ) ? $snippet['script'] : '';
     1741                    $script_count = preg_match_all( '/<script/i', $script_content );
     1742                    ?>
     1743                    <div class="termageddon-script-snippet-row" data-index="<?php echo esc_attr( $index ); ?>">
     1744                        <div class="termageddon-snippet-accordion-item" style="margin-bottom: 15px; border: 1px solid #ddd; background: #f9f9f9;">
     1745                            <div class="termageddon-snippet-accordion-header" style="display: flex; justify-content: space-between; align-items: center; padding: 15px; cursor: pointer; user-select: none;">
     1746                                <div style="display: flex; align-items: center; gap: 10px; flex: 1;">
     1747                                    <span class="termageddon-snippet-service-name"><?php echo esc_html( $service_name ); ?></span>
     1748                                    <span class="termageddon-snippet-badge<?php echo $script_count > 0 ? ' termageddon-snippet-badge-success' : ''; ?>"><?php echo esc_html( $script_count . ' script' . ( $script_count !== 1 ? 's' : '' ) . ' identified' ); ?></span>
     1749                                </div>
     1750                                <div style="display: flex; align-items: center; gap: 10px;">
     1751                                    <span class="termageddon-snippet-caret dashicons dashicons-arrow-down-alt2" style="transition: transform 0.3s ease;"></span>
     1752                                    <button type="button" class="button termageddon-remove-snippet" style="color: #dc3232; margin: 0;"><?php esc_html_e( 'Remove', 'termageddon-usercentrics' ); ?></button>
     1753                                </div>
     1754                            </div>
     1755                            <div class="termageddon-snippet-accordion-content collapsed" style="padding: 0 15px 15px 15px; display: none;">
     1756                                <div style="margin-top: 15px; margin-bottom: 10px;">
     1757                                    <label for="termageddon_usercentrics_script_snippets_<?php echo esc_attr( $index ); ?>_service_id">
     1758                                        <strong><?php esc_html_e( 'Service', 'termageddon-usercentrics' ); ?></strong>
     1759                                    </label>
     1760                                    <select
     1761                                        name="termageddon_usercentrics_script_snippets[<?php echo esc_attr( $index ); ?>][service_id]"
     1762                                        id="termageddon_usercentrics_script_snippets_<?php echo esc_attr( $index ); ?>_service_id"
     1763                                        class="termageddon-singleselect"
     1764                                        style="width: 100%;"
     1765                                    >
     1766                                        <option value=""><?php esc_html_e( 'Select a service...', 'termageddon-usercentrics' ); ?></option>
     1767                                        <?php foreach ( $options as $key => $label ) : ?>
     1768                                            <option value="<?php echo esc_attr( $key ); ?>" <?php selected( $service_id, $key ); ?>>
     1769                                                <?php echo esc_html( $label ); ?>
     1770                                            </option>
     1771                                        <?php endforeach; ?>
     1772                                    </select>
     1773                                </div>
     1774                                <div>
     1775                                    <label for="termageddon_usercentrics_script_snippets_<?php echo esc_attr( $index ); ?>_script">
     1776                                        <strong><?php esc_html_e( 'Script Code', 'termageddon-usercentrics' ); ?></strong>
     1777                                    </label>
     1778                                    <textarea
     1779                                        class="termageddon-embed-code termageddon-script-textarea"
     1780                                        name="termageddon_usercentrics_script_snippets[<?php echo esc_attr( $index ); ?>][script]"
     1781                                        id="termageddon_usercentrics_script_snippets_<?php echo esc_attr( $index ); ?>_script"
     1782                                        rows="7"
     1783                                        style="width: 100%;"
     1784                                        placeholder="Both external and inline scripts are supported.&#10;&#10;External Script:&#10;&lt;script src=&quot;https://example.com/script.js&quot;&gt;&lt;/script&gt;&#10;&#10;Inline script:&#10;&lt;script&gt;console.log(&quot;Loaded&quot;)&lt;/script&gt;"
     1785                                    ><?php echo esc_textarea( $script_content ); ?></textarea>
     1786                                </div>
     1787                            </div>
     1788                        </div>
     1789                    </div>
     1790                <?php endforeach; ?>
     1791            <?php endif; ?>
     1792        </div>
     1793        <button type="button" class="button termageddon-add-snippet" style="margin-top: 10px;"><?php esc_html_e( '+ Add Script Snippet', 'termageddon-usercentrics' ); ?></button>
     1794        <?php
     1795        // Generate options HTML for template
     1796        $options_html = '<option value="">' . esc_html__( 'Select a service...', 'termageddon-usercentrics' ) . '</option>';
     1797        foreach ( $options as $key => $label ) {
     1798            $options_html .= '<option value="' . esc_attr( $key ) . '">' . esc_html( $label ) . '</option>';
     1799        }
     1800        ?>
     1801        <script type="text/template" id="termageddon-script-snippet-template" data-options="<?php echo esc_attr( $options_html ); ?>">
     1802            <div class="termageddon-script-snippet-row" data-index="{{INDEX}}">
     1803                <div class="termageddon-snippet-accordion-item" style="margin-bottom: 15px; border: 1px solid #ddd; background: #f9f9f9;">
     1804                    <div class="termageddon-snippet-accordion-header" style="display: flex; justify-content: space-between; align-items: center; padding: 15px; cursor: pointer; user-select: none;">
     1805                        <div style="display: flex; align-items: center; gap: 10px; flex: 1;">
     1806                            <span class="termageddon-snippet-service-name"><?php echo esc_html__( 'New Script Snippet', 'termageddon-usercentrics' ); ?></span>
     1807                            <span class="termageddon-snippet-badge">0 scripts identified</span>
     1808                        </div>
     1809                        <div style="display: flex; align-items: center; gap: 10px;">
     1810                            <span class="termageddon-snippet-caret dashicons dashicons-arrow-down-alt2" style="transition: transform 0.3s ease;"></span>
     1811                            <button type="button" class="button termageddon-remove-snippet" style="color: #dc3232; margin: 0;"><?php echo esc_html__( 'Remove', 'termageddon-usercentrics' ); ?></button>
     1812                        </div>
     1813                    </div>
     1814                    <div class="termageddon-snippet-accordion-content" style="padding: 0 15px 15px 15px;">
     1815                        <div style="margin-top: 15px; margin-bottom: 10px;">
     1816                            <label for="termageddon_usercentrics_script_snippets_{{INDEX}}_service_id">
     1817                                <strong><?php echo esc_html__( 'Service', 'termageddon-usercentrics' ); ?></strong>
     1818                            </label>
     1819                            <select
     1820                                name="termageddon_usercentrics_script_snippets[{{INDEX}}][service_id]"
     1821                                id="termageddon_usercentrics_script_snippets_{{INDEX}}_service_id"
     1822                                class="termageddon-singleselect"
     1823                                style="width: 100%;"
     1824                            >
     1825                                <?php echo $options_html; ?>
     1826                            </select>
     1827                        </div>
     1828                        <div>
     1829                            <label for="termageddon_usercentrics_script_snippets_{{INDEX}}_script">
     1830                                <strong><?php echo esc_html__( 'Script Code', 'termageddon-usercentrics' ); ?></strong>
     1831                            </label>
     1832                            <textarea
     1833                                class="termageddon-embed-code termageddon-script-textarea"
     1834                                name="termageddon_usercentrics_script_snippets[{{INDEX}}][script]"
     1835                                id="termageddon_usercentrics_script_snippets_{{INDEX}}_script"
     1836                                rows="7"
     1837                                style="width: 100%;"
     1838                                placeholder="Both external and inline scripts are supported.&#10;&#10;External Script:&#10;&lt;script src=&quot;https://example.com/script.js&quot;&gt;&lt;/script&gt;&#10;&#10;Inline script:&#10;&lt;script&gt;console.log(&quot;Loaded&quot;)&lt;/script&gt;"
     1839                            ></textarea>
     1840                        </div>
     1841                    </div>
     1842                </div>
     1843            </div>
     1844        </script>
     1845        <?php
     1846    }
     1847
    15081848}
  • termageddon-usercentrics/tags/1.9.0/admin/css/termageddon-usercentrics-admin.css

    r3326335 r3439658  
    66textarea.termageddon-embed-code {
    77    width: 100%;
    8     height: 250px;
     8    height: 150px;
    99}
    1010
    1111/* Section Settings */
    1212.tu-toggle-section,
    13 .tu-section-settings {
     13.tu-section-settings,
     14.tu-settings-section {
    1415    margin-top: 2rem;
    1516}
     
    3637    pointer-events: none;
    3738}
    38 .tu-toggle-section .form-table,
    39 .tu-tab-integrations .tu-settings-section .form-table {
     39.tu-toggle-section .form-table {
    4040    margin-left: 2rem;
    4141}
     
    5252
    5353/* Settings Section */
     54#termageddon-script-snippets-container,
     55.tu-settings-section {
     56    padding-left: 2rem;
     57    padding-right: 2rem;
     58}
     59
     60.tu-settings-tab.tu-tab-config .tu-settings-section {
     61    padding-left: 0;
     62    padding-right: 0;
     63}
     64
    5465.tu-settings-section .form-table th {
    5566    width: 300px;
     
    251262    margin-bottom: 8px;
    252263}
     264
     265/* Full-width settings field (for script snippets) */
     266.form-table tr.tu-table-full-width th {
     267    display: none;
     268}
     269
     270.form-table tr.tu-table-full-width td {
     271    display: block;
     272    padding: 0;
     273}
     274
     275/* Script Snippets Accordion */
     276.termageddon-snippet-accordion-item {
     277    border-radius: 4px;
     278    overflow: hidden;
     279}
     280
     281.termageddon-snippet-accordion-header {
     282    background: #fff;
     283    border-bottom: 1px solid #ddd;
     284    transition: background-color 0.2s ease;
     285}
     286
     287.termageddon-snippet-accordion-header:hover {
     288    background: #f5f5f5;
     289}
     290
     291.termageddon-snippet-service-name {
     292    font-weight: 600;
     293    font-size: 14px;
     294    color: #23282d;
     295}
     296
     297.termageddon-snippet-badge {
     298    display: inline-flex;
     299    align-items: center;
     300    justify-content: center;
     301    min-width: 24px;
     302    height: 24px;
     303    padding: 0 8px;
     304    background-color: #ccc;
     305    color: #fff;
     306    border-radius: 12px;
     307    font-size: 12px;
     308    font-weight: 600;
     309    line-height: 1;
     310    white-space: nowrap;
     311}
     312
     313.termageddon-snippet-badge-success {
     314    background-color: #00a32a !important;
     315}
     316
     317.termageddon-snippet-caret {
     318    color: #646970;
     319    font-size: 20px;
     320    width: 20px;
     321    height: 20px;
     322}
     323
     324.termageddon-snippet-accordion-content {
     325    background: #f9f9f9;
     326    transition: all 0.3s ease;
     327}
     328
     329.termageddon-snippet-accordion-content.collapsed {
     330    display: none !important;
     331}
     332
     333.termageddon-snippet-accordion-content:not(.collapsed) {
     334    display: block !important;
     335}
  • termageddon-usercentrics/tags/1.9.0/admin/css/termageddon-usercentrics-admin.min.css

    r3266555 r3439658  
    1 textarea.termageddon-embed-code{width:100%;height:250px}.tu-section-settings,.tu-toggle-section{margin-top:2rem}.tu-settings-tab.tu-tab-integrations .tu-section{display:none}.tu-toggle-section .tu-section-title{font-size:125%;font-weight:800}.tu-toggle-section .tu-section-title-helper{padding:1rem;color:#6c6c6c;font-style:italic}.tu-toggle-section input[readonly]{opacity:50%;pointer-events:none}.tu-toggle-section .form-table{margin-left:2rem}.tu-toggle-section .form-table td,.tu-toggle-section .form-table th{padding:.5rem 0}.tu-toggle-section .form-table th{width:300px}.tu-toggle-section.slim-section .form-table th{width:125px}.tu-settings-section .form-table th{width:300px}.tu-section-hidden{display:none}.tu-label-success{background-color:#3db44c;color:#fff;padding:3px 5px;border-radius:5px;font-size:60%}.tu-label-info{background-color:#019ed5;color:#fff;padding:3px 5px;border-radius:5px;font-size:60%}.tu-label-warning{background-color:orange;color:#fff;padding:3px 5px;border-radius:5px;font-size:60%}input[type=checkbox].wppd-ui-toggle{-webkit-appearance:none;-moz-appearance:none;appearance:none;-webkit-tap-highlight-color:transparent;width:auto;height:auto;vertical-align:middle;position:relative;border:0;outline:0;cursor:pointer;margin:0 4px;background:0 0;box-shadow:none}input[type=checkbox].wppd-ui-toggle:focus{box-shadow:none}input[type=checkbox].wppd-ui-toggle:after{content:"";font-size:6px;font-weight:400;line-height:18px;text-indent:-14px;color:#fff;width:36px;height:18px;display:inline-block;background-color:#a7aaad;border-radius:72px;box-shadow:0 0 12px rgb(0 0 0 / 15%) inset}input[type=checkbox].wppd-ui-toggle:before{content:"";width:14px;height:14px;display:block;position:absolute;top:2px;left:2px;margin:0;border-radius:50%;background-color:#fff}input[type=checkbox].wppd-ui-toggle:checked:before{left:20px;margin:0;background-color:#fff}input[type=checkbox].wppd-ui-toggle,input[type=checkbox].wppd-ui-toggle:after,input[type=checkbox].wppd-ui-toggle:before,input[type=checkbox].wppd-ui-toggle:checked:after,input[type=checkbox].wppd-ui-toggle:checked:before{transition:ease .15s}input[type=checkbox].wppd-ui-toggle:checked:after{content:"ON";background-color:#2271b1}input[type=checkbox].wppd-ui-toggle.label-hidden:after{width:48px}input[type=checkbox].wppd-ui-toggle.label-hidden:checked:before{left:32px}input[type=checkbox].wppd-ui-toggle.label-hidden:checked:after{content:"HIDDEN"}input[type=checkbox].wppd-ui-toggle.label-enabled:after{font-size:8px;width:60px;content:"DISABLED";text-indent:15px}input[type=checkbox].wppd-ui-toggle.label-enabled:checked:before{left:44px}input[type=checkbox].wppd-ui-toggle.label-enabled:checked:after{background-color:#1ed14b;content:"ENABLED";text-indent:-14px}.notice-inline{border-top:1px solid #c3c4c7;border-bottom:1px solid #c3c4c7;border-right:1px solid #c3c4c7;border-left-width:4px;border-left-style:solid;background:#fff;box-shadow:0 1px 1px rgba(0,0,0,.04);margin:5px 15px 2px;padding:1px 12px}.tu-settings-section label em{font-size:12px;font-weight:400}.tu-alert-error{color:#d63638;background:#fcf0f1;padding:10px;border-left:4px solid #d63638;margin:10px 0}.tu-alert-warning{color:#856404;background:#fff3cd;padding:10px;border-left:4px solid #ffc107;margin:10px 0}.tu-alert-success{color:#00a32a;background:#edfaef;padding:10px;border-left:4px solid #00a32a;margin:10px 0}.button-danger{background:#d63638!important;border-color:#d63638!important;color:#fff!important}.button-danger:focus,.button-danger:hover{background:#b32d2e!important;border-color:#b32d2e!important;color:#fff!important}.button-warning{background:#ffc107!important;border-color:#ffc107!important;color:#333!important;font-weight:700}.button-warning:focus,.button-warning:hover{background:#e0a800!important;border-color:#e0a800!important;color:#000!important}textarea.select2-search__field{margin-bottom:8px}
     1textarea.termageddon-embed-code{width:100%;height:150px}.tu-section-settings,.tu-settings-section,.tu-toggle-section{margin-top:2rem}.tu-settings-tab.tu-tab-integrations .tu-section{display:none}.tu-toggle-section .tu-section-title{font-size:125%;font-weight:800}.tu-toggle-section .tu-section-title-helper{padding:1rem;color:#6c6c6c;font-style:italic}.tu-toggle-section input[readonly]{opacity:50%;pointer-events:none}.tu-toggle-section .form-table{margin-left:2rem}.tu-toggle-section .form-table td,.tu-toggle-section .form-table th{padding:.5rem 0}.tu-toggle-section .form-table th{width:300px}.tu-toggle-section.slim-section .form-table th{width:125px}#termageddon-script-snippets-container,.tu-settings-section{padding-left:2rem;padding-right:2rem}.tu-settings-tab.tu-tab-config .tu-settings-section{padding-left:0;padding-right:0}.tu-settings-section .form-table th{width:300px}.tu-tab-integrations .tu-settings-section .form-table th{width:500px}.tu-section-hidden{display:none}.tu-label-success{background-color:#3db44c;color:#fff;padding:3px 5px;border-radius:5px;font-size:60%}.tu-label-info{background-color:#019ed5;color:#fff;padding:3px 5px;border-radius:5px;font-size:60%}.tu-label-warning{background-color:orange;color:#fff;padding:3px 5px;border-radius:5px;font-size:60%}input[type=checkbox].wppd-ui-toggle{-webkit-appearance:none;-moz-appearance:none;appearance:none;-webkit-tap-highlight-color:transparent;width:auto;height:auto;vertical-align:middle;position:relative;border:0;outline:0;cursor:pointer;margin:0 4px;background:0 0;box-shadow:none}input[type=checkbox].wppd-ui-toggle:focus{box-shadow:none}input[type=checkbox].wppd-ui-toggle:after{content:"";font-size:6px;font-weight:400;line-height:18px;text-indent:-14px;color:#fff;width:36px;height:18px;display:inline-block;background-color:#a7aaad;border-radius:72px;box-shadow:0 0 12px rgb(0 0 0 / 15%) inset}input[type=checkbox].wppd-ui-toggle:before{content:"";width:14px;height:14px;display:block;position:absolute;top:2px;left:2px;margin:0;border-radius:50%;background-color:#fff}input[type=checkbox].wppd-ui-toggle:checked:before{left:20px;margin:0;background-color:#fff}input[type=checkbox].wppd-ui-toggle,input[type=checkbox].wppd-ui-toggle:after,input[type=checkbox].wppd-ui-toggle:before,input[type=checkbox].wppd-ui-toggle:checked:after,input[type=checkbox].wppd-ui-toggle:checked:before{transition:ease .15s}input[type=checkbox].wppd-ui-toggle:checked:after{content:"ON";background-color:#2271b1}input[type=checkbox].wppd-ui-toggle.label-hidden:after{width:48px}input[type=checkbox].wppd-ui-toggle.label-hidden:checked:before{left:32px}input[type=checkbox].wppd-ui-toggle.label-hidden:checked:after{content:"HIDDEN"}input[type=checkbox].wppd-ui-toggle.label-enabled:after{font-size:8px;width:60px;content:"DISABLED";text-indent:15px}input[type=checkbox].wppd-ui-toggle.label-enabled:checked:before{left:44px}input[type=checkbox].wppd-ui-toggle.label-enabled:checked:after{background-color:#1ed14b;content:"ENABLED";text-indent:-14px}.notice-inline{border-top:1px solid #c3c4c7;border-bottom:1px solid #c3c4c7;border-right:1px solid #c3c4c7;border-left-width:4px;border-left-style:solid;background:#fff;box-shadow:0 1px 1px rgba(0,0,0,.04);margin:5px 15px 2px;padding:1px 12px}.tu-settings-section label em{font-size:12px;font-weight:400}.tu-alert-error{color:#d63638;background:#fcf0f1;padding:10px;border-left:4px solid #d63638;margin:10px 0}.tu-alert-warning{color:#856404;background:#fff3cd;padding:10px;border-left:4px solid #ffc107;margin:10px 0}.tu-alert-success{color:#00a32a;background:#edfaef;padding:10px;border-left:4px solid #00a32a;margin:10px 0}.button-danger{background:#d63638!important;border-color:#d63638!important;color:#fff!important}.button-danger:focus,.button-danger:hover{background:#b32d2e!important;border-color:#b32d2e!important;color:#fff!important}.button-warning{background:#ffc107!important;border-color:#ffc107!important;color:#333!important;font-weight:700}.button-warning:focus,.button-warning:hover{background:#e0a800!important;border-color:#e0a800!important;color:#000!important}textarea.select2-search__field{margin-bottom:8px}.form-table tr.tu-table-full-width th{display:none}.form-table tr.tu-table-full-width td{display:block;padding:0}.termageddon-snippet-accordion-item{border-radius:4px;overflow:hidden}.termageddon-snippet-accordion-header{background:#fff;border-bottom:1px solid #ddd;transition:background-color .2s ease}.termageddon-snippet-accordion-header:hover{background:#f5f5f5}.termageddon-snippet-service-name{font-weight:600;font-size:14px;color:#23282d}.termageddon-snippet-badge{display:inline-flex;align-items:center;justify-content:center;min-width:24px;height:24px;padding:0 8px;background-color:#ccc;color:#fff;border-radius:12px;font-size:12px;font-weight:600;line-height:1;white-space:nowrap}.termageddon-snippet-badge-success{background-color:#00a32a!important}.termageddon-snippet-caret{color:#646970;font-size:20px;width:20px;height:20px}.termageddon-snippet-accordion-content{background:#f9f9f9;transition:all .3s ease}.termageddon-snippet-accordion-content.collapsed{display:none!important}.termageddon-snippet-accordion-content:not(.collapsed){display:block!important}
  • termageddon-usercentrics/tags/1.9.0/admin/js/termageddon-usercentrics-admin.js

    r3284346 r3439658  
    141141                    ""
    142142                )
    143                 .replace(
    144                     /<script>uc.setCustomTranslations.*<\/script>/g,
    145                     ""
    146                 )
     143                .replace(/<script>uc.setCustomTranslations.*<\/script>/g, "")
    147144                .trim();
    148145
     
    163160        });
    164161    }
     162
     163    // ============================================ //
     164    // ======== Script Snippets Repeater ========== //
     165    // ============================================ //
     166
     167    // Constants
     168    const SNIPPET_CONSTANTS = {
     169        ANIMATION_DURATION: 300,
     170        CARET_ROTATION: {
     171            COLLAPSED: "rotate(0deg)",
     172            EXPANDED: "rotate(180deg)",
     173        },
     174        SELECT2_OPTIONS: {
     175            width: "100%",
     176            placeholder: "Select a service...",
     177            allowClear: true,
     178        },
     179        DEFAULT_SERVICE_TEXT: "New Script Snippet",
     180    };
     181
     182    const snippetsContainer = $("#termageddon-script-snippets-container");
     183    const addSnippetButton = $(".termageddon-add-snippet");
     184    const template = $("#termageddon-script-snippet-template");
     185
     186    /**
     187     * Count script tags in textarea
     188     * @param {HTMLElement} textarea - The textarea element
     189     * @returns {number} Number of script tags found
     190     */
     191    function countScriptTags(textarea) {
     192        const content = $(textarea).val() || "";
     193        const matches = content.match(/<script/gi);
     194        return matches ? matches.length : 0;
     195    }
     196
     197    /**
     198     * Update badge with script count
     199     * @param {jQuery} $row - The row element
     200     */
     201    function updateScriptBadge($row) {
     202        const $textarea = $row.find(".termageddon-script-textarea");
     203        const $badge = $row.find(".termageddon-snippet-badge");
     204        const count = countScriptTags($textarea[0]);
     205
     206        if (count > 0) {
     207            $badge.text(`${count} script${count !== 1 ? "s" : ""} identified`);
     208            $badge.addClass("termageddon-snippet-badge-success");
     209        } else {
     210            $badge.text("0 scripts identified");
     211            $badge.removeClass("termageddon-snippet-badge-success");
     212        }
     213    }
     214
     215    /**
     216     * Update service name in header
     217     * @param {jQuery} $row - The row element
     218     */
     219    function updateServiceName($row) {
     220        const $select = $row.find(".termageddon-singleselect");
     221        const $serviceName = $row.find(".termageddon-snippet-service-name");
     222        const selectedText = $select.find("option:selected").text();
     223
     224        $serviceName.text(
     225            $select.val() && selectedText
     226                ? selectedText
     227                : SNIPPET_CONSTANTS.DEFAULT_SERVICE_TEXT
     228        );
     229    }
     230
     231    /**
     232     * Toggle accordion open/closed state
     233     * @param {jQuery} $header - The accordion header element
     234     */
     235    function toggleAccordion($header) {
     236        const $content = $header.siblings(
     237            ".termageddon-snippet-accordion-content"
     238        );
     239        const $caret = $header.find(".termageddon-snippet-caret");
     240
     241        if ($content.is(":visible")) {
     242            // Collapsing
     243            $content.slideUp(SNIPPET_CONSTANTS.ANIMATION_DURATION, function () {
     244                $(this).addClass("collapsed");
     245            });
     246            $caret.css("transform", SNIPPET_CONSTANTS.CARET_ROTATION.COLLAPSED);
     247        } else {
     248            // Expanding
     249            $content
     250                .removeClass("collapsed")
     251                .slideDown(SNIPPET_CONSTANTS.ANIMATION_DURATION);
     252            $caret.css("transform", SNIPPET_CONSTANTS.CARET_ROTATION.EXPANDED);
     253        }
     254    }
     255
     256    /**
     257     * Set accordion state without animation
     258     * @param {jQuery} $content - The accordion content element
     259     * @param {jQuery} $caret - The caret icon element
     260     * @param {boolean} isCollapsed - Whether the accordion should be collapsed
     261     */
     262    function setAccordionState($content, $caret, isCollapsed) {
     263        if (isCollapsed) {
     264            $content.hide();
     265            $caret.css("transform", SNIPPET_CONSTANTS.CARET_ROTATION.COLLAPSED);
     266        } else {
     267            $content.show();
     268            $caret.css("transform", SNIPPET_CONSTANTS.CARET_ROTATION.EXPANDED);
     269        }
     270    }
     271
     272    /**
     273     * Initialize accordion for a row
     274     * @param {jQuery} $row - The row element
     275     */
     276    function initAccordionRow($row) {
     277        // Update badge and service name on load
     278        updateScriptBadge($row);
     279        updateServiceName($row);
     280
     281        // Set initial caret rotation based on collapsed state
     282        const $content = $row.find(".termageddon-snippet-accordion-content");
     283        const $caret = $row.find(".termageddon-snippet-caret");
     284        setAccordionState($content, $caret, $content.hasClass("collapsed"));
     285    }
     286
     287    /**
     288     * Initialize Select2 for single-select fields
     289     * @param {jQuery} $element - Optional specific element to initialize, or all if not provided
     290     */
     291    function initSelect2($element) {
     292        const $targets = $element || $(".termageddon-singleselect");
     293
     294        $targets.each(function () {
     295            if (!$(this).hasClass("select2-hidden-accessible")) {
     296                $(this).select2(SNIPPET_CONSTANTS.SELECT2_OPTIONS);
     297            }
     298        });
     299    }
     300
     301    // Initialize on page load
     302    if (snippetsContainer.length) {
     303        initSelect2();
     304        snippetsContainer
     305            .find(".termageddon-script-snippet-row")
     306            .each(function () {
     307                initAccordionRow($(this));
     308            });
     309    }
     310
     311    // Accordion header click handler
     312    $(document).on(
     313        "click.tu",
     314        ".termageddon-snippet-accordion-header",
     315        function (e) {
     316            // Don't toggle if clicking on remove button
     317            if ($(e.target).closest(".termageddon-remove-snippet").length) {
     318                return;
     319            }
     320            toggleAccordion($(this));
     321        }
     322    );
     323
     324    // Update service name when dropdown changes (handles both regular and Select2)
     325    $(document).on(
     326        "change.tu select2:select.tu select2:clear.tu",
     327        ".termageddon-singleselect",
     328        function () {
     329            const $row = $(this).closest(".termageddon-script-snippet-row");
     330            updateServiceName($row);
     331        }
     332    );
     333
     334    // Update badge when textarea changes
     335    $(document).on(
     336        "input.tu change.tu",
     337        ".termageddon-script-textarea",
     338        function () {
     339            const $row = $(this).closest(".termageddon-script-snippet-row");
     340            updateScriptBadge($row);
     341        }
     342    );
     343
     344    /**
     345     * Get the next available index for a new snippet
     346     * @returns {number} The next index to use
     347     */
     348    function getNextSnippetIndex() {
     349        let maxIndex = -1;
     350        snippetsContainer
     351            .find(".termageddon-script-snippet-row")
     352            .each(function () {
     353                const index = parseInt($(this).attr("data-index"), 10);
     354                if (!isNaN(index) && index > maxIndex) {
     355                    maxIndex = index;
     356                }
     357            });
     358        return maxIndex + 1;
     359    }
     360
     361    // Add new snippet
     362    if (addSnippetButton.length) {
     363        addSnippetButton.off("click.tu").on("click.tu", function (e) {
     364            e.preventDefault();
     365
     366            const newIndex = getNextSnippetIndex();
     367
     368            // Get template HTML
     369            let templateHtml = template.html();
     370            if (!templateHtml) {
     371                console.error("Template not found");
     372                return;
     373            }
     374
     375            // Replace template placeholders
     376            templateHtml = templateHtml
     377                .replace(/\{\{INDEX\}\}/g, newIndex)
     378                .replace(/\{\{INDEX_PLUS_ONE\}\}/g, newIndex + 1);
     379
     380            // Append new row
     381            const $newRow = $(templateHtml);
     382            snippetsContainer.append($newRow);
     383
     384            // Initialize Select2 for the new select field
     385            const $newSelect = $newRow.find(".termageddon-singleselect");
     386            initSelect2($newSelect);
     387
     388            // Update badge and service name
     389            updateScriptBadge($newRow);
     390            updateServiceName($newRow);
     391
     392            // Set to expanded state (no collapsed class, ensure visible)
     393            const $content = $newRow.find(
     394                ".termageddon-snippet-accordion-content"
     395            );
     396            const $caret = $newRow.find(".termageddon-snippet-caret");
     397            setAccordionState($content, $caret, false);
     398        });
     399    }
     400
     401    /**
     402     * Update an attribute by replacing old index with new index
     403     * @param {jQuery} $elem - The element to update
     404     * @param {string} attrName - The attribute name (id, name, for)
     405     * @param {number} oldIndex - The old index to replace
     406     * @param {number} newIndex - The new index to use
     407     * @param {string} pattern - The pattern to match ('_' for ids, '[' for names)
     408     */
     409    function updateIndexInAttribute(
     410        $elem,
     411        attrName,
     412        oldIndex,
     413        newIndex,
     414        pattern
     415    ) {
     416        const attrValue = $elem.attr(attrName);
     417        if (!attrValue) return;
     418
     419        let searchStr, replaceStr;
     420        if (pattern === "_") {
     421            searchStr = `_${oldIndex}_`;
     422            replaceStr = `_${newIndex}_`;
     423        } else if (pattern === "[") {
     424            searchStr = `[${oldIndex}]`;
     425            replaceStr = `[${newIndex}]`;
     426        }
     427
     428        if (attrValue.includes(searchStr)) {
     429            $elem.attr(attrName, attrValue.replace(searchStr, replaceStr));
     430            return attrValue; // Return old value for label updates
     431        }
     432        return null;
     433    }
     434
     435    /**
     436     * Re-index all snippet rows after removal
     437     */
     438    function reindexSnippets() {
     439        snippetsContainer
     440            .find(".termageddon-script-snippet-row")
     441            .each(function (index) {
     442                const $currentRow = $(this);
     443                const oldIndex = parseInt($currentRow.attr("data-index"), 10);
     444
     445                if (isNaN(oldIndex) || oldIndex === index) {
     446                    return; // Skip if already correct
     447                }
     448
     449                // Update data-index
     450                $currentRow.attr("data-index", index);
     451
     452                // Update IDs, names, and labels
     453                $currentRow.find("select, textarea, label").each(function () {
     454                    const $elem = $(this);
     455
     456                    // Update ID and corresponding labels
     457                    const oldId = updateIndexInAttribute(
     458                        $elem,
     459                        "id",
     460                        oldIndex,
     461                        index,
     462                        "_"
     463                    );
     464                    if (oldId) {
     465                        const $label = $currentRow.find(
     466                            `label[for="${oldId}"]`
     467                        );
     468                        if ($label.length) {
     469                            const newId = $elem.attr("id");
     470                            $label.attr("for", newId);
     471                        }
     472                    }
     473
     474                    // Update name attribute
     475                    updateIndexInAttribute($elem, "name", oldIndex, index, "[");
     476
     477                    // Update for attribute
     478                    updateIndexInAttribute($elem, "for", oldIndex, index, "_");
     479                });
     480
     481                // Re-initialize accordion after re-indexing
     482                initAccordionRow($currentRow);
     483            });
     484    }
     485
     486    // Remove snippet
     487    $(document).on("click.tu", ".termageddon-remove-snippet", function (e) {
     488        e.preventDefault();
     489        e.stopPropagation(); // Prevent accordion from toggling
     490
     491        if (
     492            confirm(
     493                "Are you sure you want to remove this script snippet? This action cannot be undone."
     494            )
     495        ) {
     496            const $row = $(this).closest(".termageddon-script-snippet-row");
     497            $row.remove();
     498            reindexSnippets();
     499        }
     500    });
    165501});
  • termageddon-usercentrics/tags/1.9.0/admin/js/termageddon-usercentrics-admin.min.js

    r3284346 r3439658  
    1 jQuery((function($){let animationSpeed=0,initialLoad=!1,loggedIn=$(".tu-tab-settings .tu-toggle-section input#termageddon_usercentrics_disable_logged_in"),editor=$(".tu-tab-settings .tu-toggle-section input#termageddon_usercentrics_disable_editor"),admin=$(".tu-tab-settings .tu-toggle-section input#termageddon_usercentrics_disable_admin");const check=(elem,checked=!0)=>{console.log(elem,checked),elem.prop("checked",checked).attr("readonly",checked).trigger("change")};1===loggedIn.length&&loggedIn.off("change.tu").on("change.tu",(function(){($(this).is(":checked")||initialLoad)&&(check(editor,$(this).is(":checked")),check(admin,$(this).is(":checked")))})).trigger("change");let geolocationToggle=$("input#termageddon_usercentrics_toggle_geolocation"),policyToggles=$(".tu-tab-geolocation .tu-toggle-section input");1===geolocationToggle.length&&(geolocationToggle.off("change.tu").on("change.tu",(function(){$(this).is(":checked")?$(".tu-tab-geolocation .tu-section-settings > div").slideDown(animationSpeed):$(".tu-tab-geolocation .tu-section-settings > div").slideUp(animationSpeed)})).trigger("change"),policyToggles.off("change.tu").on("change.tu",(function(){policyToggles.is(":checked")?jQuery("#no-geolocation-locations-selected,#no-geolocation-locations-selected-top").slideUp(animationSpeed):jQuery("#no-geolocation-locations-selected").slideDown(animationSpeed)})).trigger("change")),animationSpeed=300,initialLoad=!0;let migrationButton=$("#run_settings_migration");1===migrationButton.length&&migrationButton.off("click.tu").on("click.tu",(function(){const embedCode=document.querySelector("#termageddon_usercentrics_embed_code").value,settingsIdMatch=embedCode.match(/data-settings-id="([^"]+)"/);if(!settingsIdMatch||!settingsIdMatch[1])return void alert("Unable to find settings ID in embed code. Please ensure your embed code section contains a data-settings-id attribute. Please contact our support team if would like assistance.");const settingsId=settingsIdMatch[1];document.querySelector("#termageddon_usercentrics_settings_id").value=settingsId,document.querySelector("#termageddon_usercentrics_embed_code").value=embedCode.replace('<link rel="preconnect" href="https://plugins.trac.wordpress.org//privacy-proxy.usercentrics.eu">',"").replace('<link rel="preload" href="https://plugins.trac.wordpress.org//privacy-proxy.usercentrics.eu/latest/uc-block.bundle.js" as="script">',"").replace('<script type="application/javascript" src="https://privacy-proxy.usercentrics.eu/latest/uc-block.bundle.js"><\/script>',"").replace(/<script.*id="usercentrics-cmp".*async>.*<\/script>/g,"").replace(/<script>uc.setCustomTranslations.*<\/script>/g,"").trim();const migrationMessage=$(".migration-message");migrationMessage.removeClass("tu-alert-error").addClass("tu-alert-success"),migrationMessage.find("strong").text("Conversion Complete"),migrationMessage.find("p.alert-description").html("The embed code has been converted to a settings ID. All custom scripts outside of the original embed code have been maintained.<br/></br>\n\t\t\t\t\t<strong><em>The changes have been submitted.</em></strong>"),$(".tab-content form input.button").click()}))}));
     1jQuery((function($){let animationSpeed=0,initialLoad=!1,loggedIn=$(".tu-tab-settings .tu-toggle-section input#termageddon_usercentrics_disable_logged_in"),editor=$(".tu-tab-settings .tu-toggle-section input#termageddon_usercentrics_disable_editor"),admin=$(".tu-tab-settings .tu-toggle-section input#termageddon_usercentrics_disable_admin");const check=(elem,checked=!0)=>{console.log(elem,checked),elem.prop("checked",checked).attr("readonly",checked).trigger("change")};1===loggedIn.length&&loggedIn.off("change.tu").on("change.tu",(function(){($(this).is(":checked")||initialLoad)&&(check(editor,$(this).is(":checked")),check(admin,$(this).is(":checked")))})).trigger("change");let geolocationToggle=$("input#termageddon_usercentrics_toggle_geolocation"),policyToggles=$(".tu-tab-geolocation .tu-toggle-section input");1===geolocationToggle.length&&(geolocationToggle.off("change.tu").on("change.tu",(function(){$(this).is(":checked")?$(".tu-tab-geolocation .tu-section-settings > div").slideDown(animationSpeed):$(".tu-tab-geolocation .tu-section-settings > div").slideUp(animationSpeed)})).trigger("change"),policyToggles.off("change.tu").on("change.tu",(function(){policyToggles.is(":checked")?jQuery("#no-geolocation-locations-selected,#no-geolocation-locations-selected-top").slideUp(animationSpeed):jQuery("#no-geolocation-locations-selected").slideDown(animationSpeed)})).trigger("change")),animationSpeed=300,initialLoad=!0;let migrationButton=$("#run_settings_migration");1===migrationButton.length&&migrationButton.off("click.tu").on("click.tu",(function(){const embedCode=document.querySelector("#termageddon_usercentrics_embed_code").value,settingsIdMatch=embedCode.match(/data-settings-id="([^"]+)"/);if(!settingsIdMatch||!settingsIdMatch[1])return void alert("Unable to find settings ID in embed code. Please ensure your embed code section contains a data-settings-id attribute. Please contact our support team if would like assistance.");const settingsId=settingsIdMatch[1];document.querySelector("#termageddon_usercentrics_settings_id").value=settingsId,document.querySelector("#termageddon_usercentrics_embed_code").value=embedCode.replace('<link rel="preconnect" href="https://plugins.trac.wordpress.org//privacy-proxy.usercentrics.eu">',"").replace('<link rel="preload" href="https://plugins.trac.wordpress.org//privacy-proxy.usercentrics.eu/latest/uc-block.bundle.js" as="script">',"").replace('<script type="application/javascript" src="https://privacy-proxy.usercentrics.eu/latest/uc-block.bundle.js"><\/script>',"").replace(/<script.*id="usercentrics-cmp".*async>.*<\/script>/g,"").replace(/<script>uc.setCustomTranslations.*<\/script>/g,"").trim();const migrationMessage=$(".migration-message");migrationMessage.removeClass("tu-alert-error").addClass("tu-alert-success"),migrationMessage.find("strong").text("Conversion Complete"),migrationMessage.find("p.alert-description").html("The embed code has been converted to a settings ID. All custom scripts outside of the original embed code have been maintained.<br/></br>\n\t\t\t\t\t<strong><em>The changes have been submitted.</em></strong>"),$(".tab-content form input.button").click()}));const SNIPPET_CONSTANTS_ANIMATION_DURATION=300,SNIPPET_CONSTANTS_CARET_ROTATION={COLLAPSED:"rotate(0deg)",EXPANDED:"rotate(180deg)"},SNIPPET_CONSTANTS_SELECT2_OPTIONS={width:"100%",placeholder:"Select a service...",allowClear:!0},SNIPPET_CONSTANTS_DEFAULT_SERVICE_TEXT="New Script Snippet",snippetsContainer=$("#termageddon-script-snippets-container"),addSnippetButton=$(".termageddon-add-snippet"),template=$("#termageddon-script-snippet-template");function countScriptTags(textarea){const content=$(textarea).val()||"",matches=content.match(/<script/gi);return matches?matches.length:0}function updateScriptBadge($row){const $textarea=$row.find(".termageddon-script-textarea"),$badge=$row.find(".termageddon-snippet-badge"),count=countScriptTags($textarea[0]);count>0?($badge.text(`${count} script${1!==count?"s":""} identified`),$badge.addClass("termageddon-snippet-badge-success")):($badge.text("0 scripts identified"),$badge.removeClass("termageddon-snippet-badge-success"))}function updateServiceName($row){const $select=$row.find(".termageddon-singleselect"),$serviceName=$row.find(".termageddon-snippet-service-name"),selectedText=$select.find("option:selected").text();$serviceName.text($select.val()&&selectedText?selectedText:SNIPPET_CONSTANTS_DEFAULT_SERVICE_TEXT)}function toggleAccordion($header){const $content=$header.siblings(".termageddon-snippet-accordion-content"),$caret=$header.find(".termageddon-snippet-caret");$content.is(":visible")?($content.slideUp(SNIPPET_CONSTANTS_ANIMATION_DURATION,(function(){$(this).addClass("collapsed")})),$caret.css("transform",SNIPPET_CONSTANTS_CARET_ROTATION.COLLAPSED)):($content.removeClass("collapsed").slideDown(SNIPPET_CONSTANTS_ANIMATION_DURATION),$caret.css("transform",SNIPPET_CONSTANTS_CARET_ROTATION.EXPANDED))}function setAccordionState($content,$caret,isCollapsed){isCollapsed?($content.hide(),$caret.css("transform",SNIPPET_CONSTANTS_CARET_ROTATION.COLLAPSED)):($content.show(),$caret.css("transform",SNIPPET_CONSTANTS_CARET_ROTATION.EXPANDED))}function initAccordionRow($row){updateScriptBadge($row),updateServiceName($row);const $content=$row.find(".termageddon-snippet-accordion-content"),$caret=$row.find(".termageddon-snippet-caret");setAccordionState($content,$caret,$content.hasClass("collapsed"))}function initSelect2($element){const $targets=$element||$(".termageddon-singleselect");$targets.each((function(){$(this).hasClass("select2-hidden-accessible")||$(this).select2(SNIPPET_CONSTANTS_SELECT2_OPTIONS)}))}function getNextSnippetIndex(){let maxIndex=-1;return snippetsContainer.find(".termageddon-script-snippet-row").each((function(){const index=parseInt($(this).attr("data-index"),10);!isNaN(index)&&index>maxIndex&&(maxIndex=index)})),maxIndex+1}function updateIndexInAttribute($elem,attrName,oldIndex,newIndex,pattern){const attrValue=$elem.attr(attrName);if(!attrValue)return;let searchStr,replaceStr;return"_"===pattern?(searchStr=`_${oldIndex}_`,replaceStr=`_${newIndex}_`):"["===pattern&&(searchStr=`[${oldIndex}]`,replaceStr=`[${newIndex}]`),attrValue.includes(searchStr)?($elem.attr(attrName,attrValue.replace(searchStr,replaceStr)),attrValue):null}function reindexSnippets(){snippetsContainer.find(".termageddon-script-snippet-row").each((function(index){const $currentRow=$(this),oldIndex=parseInt($currentRow.attr("data-index"),10);isNaN(oldIndex)||oldIndex===index||($currentRow.attr("data-index",index),$currentRow.find("select, textarea, label").each((function(){const $elem=$(this),oldId=updateIndexInAttribute($elem,"id",oldIndex,index,"_");if(oldId){const $label=$currentRow.find(`label[for="${oldId}"]`);if($label.length){const newId=$elem.attr("id");$label.attr("for",newId)}}updateIndexInAttribute($elem,"name",oldIndex,index,"["),updateIndexInAttribute($elem,"for",oldIndex,index,"_")})),initAccordionRow($currentRow))}))}snippetsContainer.length&&(initSelect2(),snippetsContainer.find(".termageddon-script-snippet-row").each((function(){initAccordionRow($(this))}))),$(document).on("click.tu",".termageddon-snippet-accordion-header",(function(e){$(e.target).closest(".termageddon-remove-snippet").length||toggleAccordion($(this))})),$(document).on("change.tu select2:select.tu select2:clear.tu",".termageddon-singleselect",(function(){const $row=$(this).closest(".termageddon-script-snippet-row");updateServiceName($row)})),$(document).on("input.tu change.tu",".termageddon-script-textarea",(function(){const $row=$(this).closest(".termageddon-script-snippet-row");updateScriptBadge($row)})),addSnippetButton.length&&addSnippetButton.off("click.tu").on("click.tu",(function(e){e.preventDefault();const newIndex=getNextSnippetIndex();let templateHtml=template.html();if(!templateHtml)return void console.error("Template not found");templateHtml=templateHtml.replace(/\{\{INDEX\}\}/g,newIndex).replace(/\{\{INDEX_PLUS_ONE\}\}/g,newIndex+1);const $newRow=$(templateHtml);snippetsContainer.append($newRow);const $newSelect=$newRow.find(".termageddon-singleselect");initSelect2($newSelect),updateScriptBadge($newRow),updateServiceName($newRow);const $content=$newRow.find(".termageddon-snippet-accordion-content"),$caret=$newRow.find(".termageddon-snippet-caret");setAccordionState($content,$caret,!1)})),$(document).on("click.tu",".termageddon-remove-snippet",(function(e){if(e.preventDefault(),e.stopPropagation(),confirm("Are you sure you want to remove this script snippet? This action cannot be undone.")){const $row=$(this).closest(".termageddon-script-snippet-row");$row.remove(),reindexSnippets()}}))}));
  • termageddon-usercentrics/tags/1.9.0/admin/usercentrics-providers.php

    r3266555 r3439658  
    11<?php
     2// List is populated from https://policies.termageddon.com/api/usercentrics/services
     3
    24return [
    3     "ByOJZ54odjW7" => "Add This",
     5    "wqpKH6gNO" => "1&1 Ionos",
     6    "BpfGDA6d" => "1&1-WebAnalytics",
     7    "BJCrgq4iuiWQ" => "1020. dba Placecast and Ericsson Emodo",
     8    "NAFUNuBAX" => "123FormBuilder",
     9    "ZYtfbi7Cy" => "152 Media",
     10    "H1MvxcVjOoZ7" => "1plusX",
     11    "-KqxGSaVx" => "1und1 Premiumpartner Service",
     12    "7I2eh_kBp" => "23 degrees",
     13    "rkt8g9Niuo-7" => "2KDirect",
     14    "s0YTrTGL0" => "2Performant",
     15    "E4m6On5UY0Wg3S" => "321MED",
     16    "BksBg9VjOsZQ" => "33Across",
     17    "hzZS-hs9m" => "360 Grad",
     18    "6YbgPIgRm" => "3CX",
     19    "kXg9DeFEK" => "3Q",
     20    "qxiCD5aN_" => "3Q Video",
     21    "GWR6Okt5" => "42ads",
     22    "FgkB3cpW" => "4w MarketPlace",
     23    "D1_CKTzWP" => "6sense",
     24    "r1N_g5Vj_oZQ" => "7Hops",
     25    "cB1C-CWY0" => "8Select",
     26    "Rj7NtbZLIyj6CO" => "A European Perspective",
     27    "HJqwlcEi_j-Q" => "A Million Ads",
     28    "W5aCtyNa" => "a-net",
     29    "S1oqeqVsdob7" => "A.Mob",
     30    "MNvgqiAGK" => "A8.net",
     31    "r1oD9Eoujbm" => "AB Tasty",
     32    "own4GrdkBajHvL" => "ABlyft",
     33    "mcMqee5z51IrK1" => "ABlyft - Weboptimisation",
     34    "6GBGwDrQe" => "Accelerize",
     35    "93B80nQzj" => "Accengage",
     36    "qzdvfwREE" => "AcceptableAds Exchange",
     37    "4C_H9fAmRKeo3Y" => "AccessGo",
     38    "gYLHfz4Lg2RKMU" => "accessiBe",
     39    "SyosgcNsds-Q" => "Accorp",
     40    "j0a1nV69uzbeh6" => "AccountInsight",
     41    "0N5YK1cW1" => "Ackee",
     42    "gSTvUFpVi" => "Acoustic",
     43    "4ybPfavU" => "Acquia Lift",
     44    "SkzZlqVs_sWX" => "Active Agent",
     45    "HDA6XNFs" => "ActiveCampaign",
     46    "S1Z5Esdsbm" => "Acuity Scheduling",
     47    "SJFRgc4sOo-m" => "Acuityads",
     48    "Sy_FQ5SRm" => "Ad Alliance",
     49    "hv3CkcEHZ9EQ_j" => "Ad Quality by ironSource",
     50    "nxlcZXzLr" => "Ad Unity",
     51    "Bkk254o_o-7" => "ad-srv.net",
     52    "rkdYcVsdoW7" => "ad:C Media",
     53    "UCS8eT_Pz" => "ad.plus",
     54    "PtvsQPsXKT-OwG" => "Ad360",
     55    "HJxLc4odiWQ" => "Ad4Mat",
     56    "Hy4ax9Ni_sZm" => "ad6media",
     57    "O0dPUkSwE" => "Adabra",
     58    "S1CQe54sOs-X" => "Adacado",
     59    "EwR_7MJGk" => "Adagio",
     60    "NKwDOvvN" => "Adality",
     61    "IE1JeSDLF" => "Adalyser",
     62    "H1IyeqEjdsbX" => "ADARA MEDIA",
     63    "u7C0LiW7f" => "adbility media",
     64    "oGR_Jnx50" => "ADC Media Adserver",
     65    "9o_f3BYaL" => "ADCELL",
     66    "B1Wac4oOjZm" => "AdClear",
     67    "J64M6DKwx" => "AdColony",
     68    "nr60PuO2s" => "AddApptr",
     69    "BkwLqNjOsZm" => "AdDefend",
     70    "9y-4-D2PG" => "AddEvent",
     71    "vGbt4De0o" => "Additive",
     72    "PrhpqbDB_" => "AddSearch",
     73    "ByOJZ54odjW7" => "AddThis",
     74    "kkgrP2G8D" => "AddToAny",
     75    "lEXAlQ-NW" => "AdElement Media Solutions",
     76    "BkD_eqEsuiZ7" => "Adello Group",
     77    "r1T6l9EoujbQ" => "Adelphic",
     78    "Pzgqsq9kN" => "AdFit",
     79    "H1dDqVjOjWX" => "Adform",
     80    "pXdG1SmmN" => "Adhese",
     81    "UBalUr7TT" => "Adhesive Solocal AdExchange",
     82    "06CKth4Dv" => "Adhood",
     83    "WSoAQvMRZ" => "adhood.com",
     84    "BkJylc4s_iW7" => "Adikteev",
     85    "CiailyIiu" => "Adimo",
     86    "p_-A50o2DYqIah" => "AdInMo",
    487    "SJFe9NousWX" => "Adition",
     88    "B1gD94sdsbm" => "Adition Dynamic Bannering",
     89    "ry-vqVsdiW7" => "Adition Erfolgsspot",
     90    "Hy1PqEidobQ" => "Adition Lead",
     91    "rkGPcEi_i-Q" => "Adition Offsite",
     92    "By7DqEsuj-X" => "Adition Onsite",
     93    "3Kg4aoMY5ZlAJB" => "adjoe",
     94    "Jy6PlrM3" => "Adjust",
     95    "Hk24xqVsdo-m" => "Adkernel",
     96    "PF3fFUwwd" => "adledge",
     97    "oIxiBh98" => "AdLib",
     98    "T0zF5X5bk" => "Adloox",
     99    "FgdDaKh69" => "Adludio",
     100    "BJDig5NsusWQ" => "ADMAN",
     101    "BJUQe5NjujWX" => "ADman Interactive",
     102    "cD9B0dFVP" => "adMarketplace",
     103    "CTwDBP5rd" => "Admat",
     104    "Hy8C9ViusZQ" => "AdMaxim",
     105    "H1wmg9Esdj-Q" => "Admedo",
     106    "SySflcNjdjbX" => "admetrics",
     107    "-FzaiGsbx" => "Admixer",
     108    "85RFiZ5cV" => "Admixer EU GmbH",
     109    "32Br3kD2M" => "admo.tv",
     110    "r7rvuoyDz" => "Admob",
     111    "Dw8tBVuw1-ixeG" => "Admost",
     112    "BJjzlq4j_j-m" => "Admotion",
     113    "E8oLmBZtn" => "Adnami",
     114    "kDswg2QFY" => "Adnanny AdServer",
     115    "H1dzc4suj-Q" => "Adnymics",
     116    "SywhgcVjdiZX" => "Adobe Advertising Cloud",
     117    "xl1hqS1F" => "Adobe Advertising Cloud DSP",
     118    "Ood3MFN7v" => "Adobe Advertising Cloud Search",
     119    "KNfCWlL4E" => "Adobe Analytics",
     120    "BJf5EjOi-X" => "Adobe Analytics",
     121    "0vHbD98mH" => "Adobe Audience Manager",
     122    "_l9yJWKF" => "Adobe Creative Cloud",
     123    "JxJRp3je4bOWSr" => "Adobe Dimension",
    5124    "f6nkjdUL" => "Adobe Experience Cloud",
     125    "PrJkr3BMv" => "Adobe Experience Cloud Identity Service",
     126    "MIJtFTuUD" => "Adobe Experience Manager",
     127    "xmvi6h6iXlHuEl" => "Adobe Experience Platform",
     128    "zIJ0t6El" => "Adobe Fonts",
     129    "gMYO_vhh" => "Adobe Fonts",
     130    "MjwgMdSe7" => "Adobe Launch",
     131    "nGKcQgAF" => "Adobe Launch",
     132    "aWNjZCMVTvO8Oj" => "Adobe Marketing Cloud",
     133    "xRLAmHZ3A" => "Adobe Target",
     134    "8L9bkqYbV" => "Adobe Target",
     135    "bkp7ea4UH" => "Adobe Test & Target",
    6136    "HJy4c4s_jbX" => "Adobe Typekit",
     137    "jaWccj1u5MCwMT" => "Adobe Web SDK",
     138    "R4eezxWkE" => "Adpepper",
     139    "4oh9iKqPJ" => "Adpone",
     140    "ULBcFrjZGb4mXW" => "Adrenalead",
     141    "r11Ex9EodjZQ" => "AdRoll",
     142    "S1Kvg9ViOoZm" => "adrule",
     143    "B1n6AkRJ3KFheP" => "Ads Defender",
     144    "-AdDAiqxj" => "Adscale",
     145    "rkKt9Vo_j-Q" => "adscale.de (ströer)",
     146    "SJX4cEjOjZQ" => "AdSense for Search (AFS)",
     147    "DRpPVP2uv" => "Adserve.zone",
     148    "cBkFKxFip" => "Adservice Media",
     149    "Bk3ZqNsujWQ" => "AdSpirit",
     150    "SJU-x9Vj_jZQ" => "adsquare",
     151    "HHnOG47_6" => "adsrvr",
     152    "HJ1wx9Ns_ob7" => "Adssets",
     153    "514xGqzuB" => "AdsWizz",
     154    "BJCc9EouiZm" => "AdTech",
     155    "t91zsmgUO" => "Adtelligence Platform",
     156    "qj9AM4gO5" => "Adtelligent",
     157    "9YZOzHmmo" => "AdTheorent",
     158    "S1qdgcVoOjZ7" => "AdTheorent,",
     159    "e-L9j7jq" => "AdTiger",
     160    "UFByDVoY5" => "AdTiming",
     161    "S1MpgcNjOo-X" => "AdTiming Technology Company",
     162    "-z6aobHdz" => "AdTonos",
     163    "4ca59IYt1" => "Adtraction",
     164    "FVFF_XFS" => "Adtriba",
     165    "FNM5zS5SO" => "adtrue",
     166    "_LPDpmRU" => "AdUp Technology",
     167    "BynslcEoOjbm" => "ADUX",
     168    "B1-UecVodj-7" => "advanced store",
     169    "r1v094j_o-m" => "AdVentori",
     170    "B1_-l9Ns_ob7" => "Adverline",
     171    "rkCnmccCX" => "Advertising.com",
     172    "C4osiHMfJJalmp" => "AdvertServe",
     173    "eNkSkb6JBaOC-P" => "Adverty",
     174    "B1OHg9VousbX" => "AdWords Remarketing",
     175    "fQdyrzSvN" => "Adxperience",
     176    "5EZTiCeMV" => "Adyen",
     177    "H1Y9e94j_i-m" => "ADYOULIKE",
     178    "D4y1cqu5W" => "Adzymic",
     179    "ryATgqEs_s-Q" => "Aerserv",
     180    "peSGp09sS" => "Affectv",
     181    "whFtCSxUiX3epV" => "AffilBox",
     182    "lBgLIDi9e" => "Affiliate Window",
     183    "SyTbcViOsWX" => "affilinet (Webmasterplan)",
     184    "tAvOzCRGW" => "Affiliprint",
     185    "LZjko4J2aIxtT3" => "Affirm",
     186    "ecyNbRiQcMwO2n" => "Afterpay",
     187    "YsjGpUh22" => "agof services",
     188    "Exmh2-AJb" => "Ahrefs",
     189    "9Ac-SGp9hgKMdE" => "AidaForm",
     190    "_B-oCEzqILvvng" => "Airbnb Reviews by MarketPushApps",
     191    "1k_ljMZc28DDOc" => "Airbridge",
     192    "hFLVABpNP" => "Airship",
    7193    "IdaQw5cVN" => "Airtable",
     194    "ARbqBwC5J" => "Ajax Search Pro",
     195    "uQiyefbRi" => "Akamai",
     196    "nQ90ZSbOB" => "Akamai Bot Manager",
     197    "H1L1cloh4" => "Akanoo",
     198    "SyWN9Esdjb7" => "Akismet",
     199    "By49NjusWQ" => "Akismet (WordPress Plugin)",
     200    "hMXFZSbaI" => "Aklamio",
     201    "e2c47r_bZ25pQC" => "Alangu Gebärdensprache Avatar",
     202    "YWbHHDowH" => "Albacross",
     203    "Wom6s1CtF" => "Alchemer",
     204    "jeiaELau" => "Alexa",
     205    "tnfBi7gwe" => "Algolia",
     206    "EJxYBUV-f" => "Algonomy",
     207    "K-qn-Ibapdt9QB" => "AlgoriX",
     208    "JNqGjolMX03W_P" => "Alibaba Cloud CDN",
     209    "zBE_rJMqbU5Zib" => "Alipay",
     210    "AZ0oBKUpsf7deu" => "All-In-One Security",
     211    "72E977tUP" => "ALL-INKL",
     212    "5A5djPisF" => "Allgemeine Website-Tag",
     213    "Drt3RRE-u" => "Alliance Gravity Data Media",
     214    "HkwrqEi_sZ7" => "allincl",
     215    "VnQLQ7uoL" => "AllMediaDesk",
     216    "4wiORY5pVpGffd" => "Alphalyr Digital Studio",
     217    "fUfvROWdtFsw1K" => "AltBeacon",
     218    "_2g2r-p1n" => "Altruja",
     219    "2qBrzO0223X1Zt" => "Amadeus Hospitality/TravelClick",
     220    "gvWsZJmVT" => "Amazon Adsystems",
    8221    "N2spyFPL" => "Amazon advertising",
     222    "NELEFokrd" => "Amazon Associates",
     223    "t1QnIrTMGuERFa" => "Amazon AWS Amplify",
     224    "S1sdpVyEX" => "Amazon Cloudfront",
     225    "1dArEN3cO" => "Amazon Mobile Ads",
     226    "BkBN6xyV7" => "Amazon Partners",
     227    "rJ6D5Eous-Q" => "Amazon Pay",
     228    "24I-tjBlAIR5TS" => "Amazon Pinpoint",
     229    "IUyljv4X5" => "Amazon Publisher Service",
     230    "Bkdj2xyEX" => "Amazon S3",
     231    "J39GyuWQq" => "Amazon Web Services",
     232    "mF6syhpYV" => "Amnet",
     233    "JchR4jxjXCqTiu" => "AmoAd",
     234    "HJRgx54jusbm" => "Amobee",
     235    "Sk9kb5VoOi-7" => "Amplitude",
     236    "R6qwZ11iZ" => "ampproject.org",
    9237    "6znewg1hW" => "anchor.fm",
    10     "aXnTc_Y3n" => "ArcGIS Map",
    11     "fiQX6mqi" => "AT Internet",
     238    "HJRUlvEVQ" => "Ankit 24-07",
     239    "_VWVLDbYO" => "annalect",
     240    "xRy2gd--" => "AnswerDash",
     241    "rymwxcNsOsb7" => "AntVoice",
     242    "FSbhnJKw5" => "Anwaltauskunft.de",
     243    "ebhLyMWCg" => "Anwaltverein.de",
     244    "vUHdGBoDHNu6_2" => "Anythingabout",
     245    "KWDizwCvI" => "Anzu",
     246    "3sJWccp-h" => "AOL",
     247    "ApbuXSl8r" => "AOL Cloud",
     248    "B1AUNmyEm" => "Apester",
     249    "H1n6lcVj_s-7" => "Apester",
     250    "yYVZ3FfUoXT_tj" => "Appcast",
     251    "oPWBSL3AJ" => "Appcues",
     252    "-ijhTWLQV" => "AppDynamics",
     253    "UkROORpAd" => "AppDynamics",
     254    "_lk1S0d9OF47je" => "Appfigures",
     255    "jzH7HjBXb" => "Appier",
     256    "P1h384FMQ" => "Apple Pay",
     257    "r9Vq_aY3t7tJWJ" => "Apple Podcasts",
     258    "weoN4Lb_MjWLuu" => "Apple Search Ads",
     259    "cBl03wBXG" => "Apple Sign-in",
     260    "H1dpBjeMV" => "Applied Technologies Internet SAS",
     261    "7CJ_BpQ_C" => "AppLift",
     262    "fHczTMzX8" => "AppLovin",
     263    "v324c3_9o" => "AppLovin Max SDK",
     264    "7p47Xsg-i" => "AppMetrica",
     265    "Syg-54jdiZX" => "AppNexus (adnxs.com)",
     266    "XFAdcSj-7Jc-JJ" => "Appodeal",
     267    "_RMuMZnYU" => "Approov",
     268    "WWe3pIgdt0UDOJ" => "AppSamurai",
     269    "CRKoGaeDVbo2l1" => "Appsell",
     270    "Gx9iMF__f" => "AppsFlyer",
     271    "n2slZDmyp" => "AppSignal",
     272    "BJZX5EjdibX" => "AppStore Widget",
     273    "XI0dAskrcDPVB-" => "Arcade",
     274    "aXnTc_Y3n" => "ArcGIS Map Tool",
     275    "eoUHS8Nwm" => "Arcspire",
     276    "mSKd6UMp_" => "Arkflux",
     277    "Byz_xq4s_o-X" => "ARMIS",
     278    "codpeWIqV" => "Arrivalist",
     279    "Bk9OBXJ4Q" => "Ars Technica",
     280    "H1au00yZT9ugFI" => "ART19",
     281    "NTb2hlOJdn95k4" => "Artefact",
     282    "q6G6H17TR" => "AskMe",
     283    "fiQX6mqi" => "AT INTERNET",
     284    "lyQYRN-Xmt_BBZ" => "AtData",
     285    "yWgiH3xQZ" => "ATG Ad Tech Group GmbH",
     286    "rJ6L9VsdjWm" => "Atlas Solutions",
     287    "a8XLoeVA0" => "Audience Project",
     288    "zBwUvUoJ0" => "Audience Trading Platform",
     289    "FOrCeplkQ" => "Audiencecreate",
     290    "zRmrOPZzd" => "Audiencerate",
     291    "BkXdl9Njujbm" => "Audiens",
     292    "SX52NsAPC" => "Audigent",
     293    "UVMdI89fm" => "Audio CC",
     294    "yt0Ir6e9H" => "audio content &amp; control GmbH",
     295    "euL-m8Kv" => "Audio Now",
    12296    "c6lt-aZ0" => "Audioboom",
    13297    "mdM6tHJ4s" => "Audiocon",
     298    "RLFJwpZoj" => "AudioMob",
     299    "_-eZ2iyMj_0Nip" => "Audiomob in-game",
     300    "BV-1qlQ7" => "AudioNow",
     301    "QLTBuExAXZP-Ac" => "Audiopixel",
     302    "vFJX03YEz" => "Aumago",
     303    "7mOrpUraa" => "Auth0",
     304    "AshuZ5jzB" => "authorized.by",
     305    "WLHxEc2Up" => "Autohauskenner",
     306    "8JWoogwUY" => "Automattic",
     307    "yqLEQaghO" => "AutoUncle Aps",
     308    "57lcUUrlt" => "Avantio VRMS",
     309    "8eg0IuPZ8wkcg7" => "Avature",
     310    "_Y_UCbcZ0" => "Avazu",
     311    "r1YzeqVs_jbQ" => "Avid Media",
     312    "zATcqR5A-" => "Avis Vérifiés",
     313    "H1vkx9Ni_s-7" => "Avocet Systems",
     314    "BJkGAh2mX" => "Awesome",
     315    "zI4LKzU_q_rizP" => "Awesome Table",
     316    "p6k0WAvkwZ4GDb" => "AwesomeAds",
     317    "SyfKc4oOjWQ" => "AWIN",
     318    "Bkn55EsOoW7" => "AWS",
     319    "NYsmsUE9VcXEGy" => "AWS WAF",
     320    "kgyk8fbU" => "AWSELB",
     321    "wSJngRiYEJcL8C" => "ayeT Studios",
     322    "jHHkTxbZOK9LU0" => "ayeT-Studios",
     323    "zGUZoF3Ve" => "Azerion",
     324    "MSVdV2h-6nYJ7X" => "Azure Active Directory",
     325    "EVhPGKuTEOecfG" => "Azure Active Directory B2C",
     326    "GlxT-TcjOgbGhc" => "Azure App Service",
     327    "9q69bs1_uqZieZ" => "Azure Application Gateway (Azure WAF)",
     328    "UiXdWB_l" => "Azure Application Insights",
     329    "oz3w0zM75" => "Azure Maps",
     330    "dx07_9ciJ" => "B2B Media",
     331    "kxs3IM_Vu" => "B2B Media Group EMEA",
     332    "Tw8zmKpSP" => "Bahn",
     333    "r144c4odsbm" => "Baidu Ads",
     334    "pFPZLFiOD" => "Baidu Advertising",
     335    "aZvWLczh" => "Baidu Analytics",
     336    "3-tkHSouq" => "Bakehouse",
     337    "jkyepXkyR" => "Bambuser",
     338    "BJ_d5EsusWm" => "Bandcamp",
     339    "447gNkP7E" => "Bandsintown",
     340    "rkn_g5No_iZQ" => "Bannerflow",
     341    "i8thRAILQ" => "Bannersnack",
     342    "uSTP7MDLGFP3kV" => "Barilliance",
     343    "RXEft47eH" => "Barzahlen",
     344    "EWWivI-np" => "Basis Technologies",
     345    "OD38XMAFy" => "Batch",
     346    "XbzVLbj6w" => "BazaarVoice",
     347    "fXMTXQOLX" => "bd4travel",
     348    "WDR3LyVpo" => "Beachfront Media",
     349    "LCM5ZqgPa" => "Beamer",
     350    "NPwHeL-JC" => "Beampulse",
     351    "rkEXx9Vo_obX" => "Beemray",
     352    "B1NA5VjdjbX" => "Beeswax",
     353    "o2q55Aa0Q" => "Behamics",
     354    "DxVnzwLiH" => "Beintoo",
     355    "BJRdcNsuibm" => "Belboon",
     356    "tRDGo5MH8tSYso" => "bento Forward GmbH & Co KG",
     357    "01z9S71rU4Hn-D" => "Beslist.nl Tracking",
     358    "MNJpzh2av" => "Betgenius",
     359    "9EH_yrRpk" => "Better Banners",
     360    "NlKtp6bJulcVps" => "Bettermode",
     361    "a384FoyLB" => "Betterplace.org",
     362    "LYIjPmlzB7ta5I" => "BeyondWords",
     363    "a_N5P8uw" => "BIC media",
     364    "t4800ChaZVtBVR" => "BidMachine",
     365    "lAqkVMAk7" => "Bidmanagement",
     366    "PGVmlH7ex" => "Bidstack",
     367    "BJb4e5NjOjb7" => "BIDSWITCH",
     368    "HyU_xc4oOoZQ" => "Bidtellect",
     369    "rkj0qEsusWm" => "BidTheatre",
     370    "zDG4jNnkx" => "BidTheatre",
     371    "Y3BUl6Fb5" => "BigaBid",
     372    "-QcL-vWtUwTmEw" => "BigCommerce CDN",
     373    "naN37N2CRJvG2W" => "BigCommerce Checkout",
     374    "p34bURcC2mKqdZ" => "Billie",
     375    "ryiH3439N" => "Billiger.de",
     376    "HJ0w9Vs_jWm" => "Billpay",
     377    "Hysgc4odiZ7" => "Bing Ads",
     378    "SJwfMvizE" => "Bing Ads Retargeting",
     379    "rJhhqVs_ob7" => "Bing Conversion",
     380    "7n82fbu3X" => "Bing Maps",
    14381    "abGHajF1" => "Bing Maps",
    15     "SkdccNsdj-X" => "Bitmovin",
    16     "Ewb9uz1Rp" => "Bookingkit",
    17     "A91MHlBY6" => "Bryter",
     382    "S14J-qNjujZX" => "Bing Remarketing",
     383    "rJBkZ94sdjWm" => "Bing Remarketing Conversion",
     384    "S3LWGzBCG" => "Bit Q Holdings",
     385    "z03bVFpFh" => "BITE",
     386    "SkdccNsdj-X" => "bitmovin",
     387    "H-5ybEnazK_Nr_" => "Blackfire.io",
     388    "9GgCbkF1X" => "Blau",
     389    "LT7cTFaUy" => "blingby",
     390    "HkgxeqNiusW7" => "Blis Media",
     391    "u1M5M8ss4" => "BloomReach",
     392    "adry5guRKaqWsa" => "Bluecore",
     393    "H1cuc4jds-m" => "BlueKai",
     394    "FSn8bGxEM7pDWf" => "Bluesky Social",
     395    "w_VI5g0m9" => "Bmind a Sales Maker Company",
     396    "rJVVe94jusZ7" => "Bombora",
     397    "fGsLLp5V" => "Bonial connect",
     398    "r_7IfSwj" => "book2look",
     399    "g-lEHEZi" => "Bookatable",
     400    "tGMdaeC7cSYLyO" => "Bookeo Widget",
     401    "4Ce4r1C3b" => "Booking Südtirol",
     402    "cSRMLG-9J" => "Booking.com",
     403    "padqNOq8_pNHbF" => "Booking.com Reviews by MarketPushApps",
     404    "Ewb9uz1Rp" => "bookingkit",
     405    "97rh3ePvleSqGz" => "Boom Form",
     406    "3L4qRZSFNbX1A-" => "Boost",
     407    "8eIqa_sKr" => "BootstrapCDN",
     408    "wdjNExCpwgd0mA" => "botBrains",
     409    "2s7OLtD31lVpPp" => "BotDetect Captcha",
     410    "6_AaKITrsMijT_" => "BOTfriends",
     411    "cu-I7EeYRGHBYH" => "Bounce Commerce",
     412    "B1aDxq4iuj-Q" => "Bounce Exchange",
     413    "H11_qNsujb7" => "Braintree",
     414    "Me_LwKiEK" => "Branch SDK",
     415    "Oadn03JMr" => "Brand Advance",
     416    "_XeDI-poS" => "Brand Metrics Sweden",
     417    "MMgpupdb_" => "Braze",
     418    "dQwK0_tGzCTAY1" => "Brevo",
     419    "7m8ANzilagj--S" => "Bright SDK",
     420    "_P8Dj4_id" => "Brightcove",
     421    "dzqlMOvA3" => "Browser-Update",
     422    "zwX6TKIqe" => "Browsi Mobile",
     423    "A91MHlBY6" => "BRYTER",
     424    "SkBdl94j_o-7" => "Bucksense",
     425    "OIryTCdy" => "Bugherd",
     426    "HJMSxqVj_ibm" => "Bugsnag",
     427    "m3HPkp-03" => "Burt",
     428    "bj4SQZiaZKJ0Sl" => "BusinessBike",
     429    "3uVXyQAEl" => "Buzzsprout",
     430    "rJeSRIt3E" => "bwin",
     431    "qm6aGgqn1" => "Byggfakta Analytics Pro",
     432    "M7hs1204w" => "Bynder",
     433    "lAVu7za7YOX6Wz" => "ByteBrew",
     434    "pJpZXVNi3" => "Cablato",
     435    "KISulZHIbBr3mT" => "Calconic",
    18436    "vdUe2GDtm" => "Calendly",
     437    "nWwIqfnhR" => "Calenso",
     438    "mKiYp1G2D" => "Callbell",
     439    "M2HlfHoRv" => "CallTrackingMetrics",
     440    "eL9NgeAYVMVnLF" => "CamBuildr Plugin",
     441    "k-PZrnDTu" => "Candidate Application Form",
     442    "t9P753bof" => "Canva",
     443    "2-m-3sqMKQdc-e" => "Captcha",
     444    "gf1221hzK" => "Capterra",
     445    "SyMke9NsdsW7" => "Captify Technologies",
     446    "jTmrAXElBrQnYW" => "Captivate",
     447    "uOYlP6SYB" => "CARAT",
     448    "ptLtnnoWD" => "CarbonCare",
     449    "CxlGIPVZZQoZEy" => "Cardinal Mobile",
     450    "a7PrUQ-6P" => "Caro",
     451    "iiCbzWw6F" => "CarObserver",
     452    "s1uhnr4d" => "CAS",
     453    "4R_3s-N0l" => "Cavai",
     454    "aMS3tHs64OnpBp" => "CBOT",
     455    "8QW9ZIyK" => "Celebros",
     456    "5AGhJ-ZyCplhCq" => "Cell Rebel",
     457    "HkBsx54iOj-X" => "Celtra",
     458    "Hk9Lx5VoOoWQ" => "Centro",
     459    "gIB2IbDlp" => "CerebroAd",
     460    "OquVCK6VO" => "Chameleon Lead Generation",
     461    "S1m2cVsOobm" => "ChannelPilot",
     462    "t_QU7p3R5" => "ChannelSight",
     463    "vTg02iIVV" => "Chargeads",
     464    "wPKv-wn7Q" => "Chargebee",
     465    "HJbZqVodjZX" => "Chartbeat",
     466    "IEbRp3saT" => "Chartboost",
     467    "A5oCgmHFtQgIg4" => "Chat Essential",
     468    "BO3dx6Mra1k9GA" => "Chat Metrics",
     469    "C66l3JRfAxdGQA" => "Chatbase",
     470    "6HgPXo1si" => "ChatBot4You",
     471    "fNX9aue_W" => "Chatchamp",
     472    "5uf4Ob3t1XN-Cj" => "ChatLab",
     473    "T8aQwGQAa" => "ChatLingual",
     474    "K7k356nB" => "Chatra",
     475    "fnSyKoUyR" => "ChatShipper",
     476    "b2HHpjQUE" => "Chatshipper| AE",
     477    "--MzGIqMG" => "Chatshipper| AR",
     478    "NoqlDY0oz" => "Chatshipper| AU",
     479    "84dzCu7Kj" => "Chatshipper| BR",
     480    "IbXoCTUii" => "Chatshipper| CO",
     481    "9LJEo_2rb" => "Chatshipper| NZ",
     482    "CwCThuokI" => "Chatshipper| RU",
     483    "ux0Lcy9ys" => "Chatshipper| RU",
     484    "4_nMRPZtr" => "Chatshipper| TR",
     485    "RLsuv0ttX" => "Chatshipper| ZY",
     486    "-sibI7br0O_Dcz" => "Checkfront",
     487    "un6JwcgQG5VcK1" => "Checkout.com",
     488    "q4KssvUm-" => "Cheq",
     489    "9dvY4sSZi" => "Cheq AI Technologies Ltd.",
     490    "QcjN2V8k_TV76l" => "Chili Piper",
     491    "Bk9xx5VsdoWm" => "Chocolate Platform",
     492    "gdvSff1hg" => "Cint Network",
     493    "acSvos0XNztx4Y" => "CitrusAd",
     494    "6smMKIWrt" => "Cituro",
     495    "F3bB6q6wfNgmQ6" => "CityPilot App",
    19496    "xI9qM4Yhk" => "Civey",
     497    "iONrYLmnn" => "CJ affiliate",
     498    "SyCE0KqAQ" => "Clarium",
     499    "tC9q5J7xA" => "CleanTalk",
     500    "F6YatvySOXyKxg" => "Clearbit",
     501    "ZmHxg0LX2cTSly" => "Clerk.io",
     502    "P4_bu9j4" => "Clever Elements",
     503    "Hkq1Xar5V" => "CleverPush",
     504    "o5fE3ybZ" => "CleverReach",
     505    "qQhJaxvd34pUx8" => "CleverTap",
     506    "TOyxVvzIw" => "Click Dimensions",
     507    "BP1atj7Yr" => "Click Guardian",
     508    "sGB-VG0Cw" => "Click2buy",
     509    "jgGgfqxe0" => "Clickcease",
     510    "HT8vkhwg2" => "Clicksco Digital",
     511    "rJW2xqEsuibX" => "Clipcentric",
     512    "_9GUFiQ9W" => "Cloud Functions for Firebase",
     513    "FzVAet4ub" => "Cloud Storage for Firebase",
     514    "7R7chEXGs" => "Cloud Technologies",
     515    "DNxukinmg" => "Cloud.IQ",
     516    "HkIVcNiuoZX" => "Cloudflare",
     517    "xQ7R_MtouldLmR" => "Cloudflare Turnstile",
     518    "xFh43inVo" => "Cloudflare, Inc.",
     519    "BJ_ocNjds-X" => "cloudfront.net",
     520    "B1CDTgJEX" => "CloudImage",
     521    "XpPsZvVN6" => "Cloudimage",
     522    "r1HocEjOiWm" => "Cloudinary",
     523    "SO2GHGVL9" => "co2online",
     524    "1kuoX1MnGbbZld" => "CoChat",
     525    "lSDamg0Dz" => "CodePen",
     526    "uGBKGpLwqq1CQb" => "CodePush",
     527    "S1d9eqVodsWQ" => "Codewise",
     528    "n8sUMtfze" => "Codigo",
     529    "4HJCCD0uI" => "COFORM",
     530    "EiStTLS8P" => "Cognigy",
     531    "rJFFlc4j_sZ7" => "Collective",
     532    "rJlwgqEsujbQ" => "Collective Europe",
     533    "Sk85e94s_ibQ" => "Comcast International France",
     534    "qKULVqrY_" => "Commanders Act",
     535    "Wx3IbW48OzUDEp" => "Comments",
     536    "WF-8JwSlq" => "commerce connector",
     537    "nK-Uqoy-f" => "commercetools",
     538    "6EVVAXCBR5ngVu" => "Common Ninja",
     539    "V0HX9cPeQ" => "communication Ads",
     540    "1drdvuWXO" => "Computop",
     541    "B1WMgcNodi-7" => "comScore",
     542    "859gL6rBS" => "Concludis",
     543    "SkzQlc4oOj-Q" => "Confiant",
     544    "BJknx9Nius-Q" => "Connatix Native Exchange",
     545    "SynGg5VsOiWQ" => "ConnectAd Realtime",
     546    "HNEN0Bg_y" => "Connects",
     547    "66kNuj2_n" => "Connexity",
     548    "GaSh0RTk2" => "Consentric",
     549    "8ctYI_8U3" => "Consors Finanz",
     550    "_GgHCK3ZEpGAao" => "Constant Contact",
     551    "cphN9wqOfmJOnf" => "Constructor",
     552    "z4cR3afxG" => "Consumable",
     553    "yRjH5CoGrlqnkc" => "Contact Collection",
     554    "4OUatCDhD" => "Contact Form 7",
     555    "YFigsoh4HN9sWt" => "Contact Form by Powr",
     556    "SJoW5NiOiZX" => "Contact Impact",
     557    "q19Crnv3" => "Contao",
     558    "S1MTc4o_oWX" => "Content Garden",
     559    "vs7lkZ5Rt41qri" => "Contentfry",
     560    "PYggIh6xB" => "Contentful",
     561    "Ki2RMQPHf" => "contentignite",
     562    "w8rDkjxj" => "ContentSquare",
     563    "ie5SAaPq_" => "Continually",
     564    "SJ45xcEj_sZQ" => "Converge-Digital",
     565    "Jj-cSioru" => "Converify",
     566    "Bk3A9VoOsZQ" => "Conversant Europe",
     567    "LykAT-gy" => "Conversion Linker",
     568    "drDqUw9P" => "Conversional",
     569    "hMRPcifE3" => "Conversions API",
     570    "NEwiuQ7p9" => "Convert",
     571    "gK4ciedfd" => "Convert Plus",
     572    "gWaBe7seEZL3PC" => "ConvertKit",
     573    "T5DNZUae" => "Converto",
     574    "w3F-dGB9Rc5tGI" => "Conword",
     575    "rJpK9VjusWX" => "Cookie Consent",
     576    "8TziAnlg5SJF0U" => "Cookiebot",
     577    "u4pd6DxYHG7QGL" => "Cookiebot for Wix",
     578    "0tftWyie-nlUI6" => "Copper Banking",
     579    "4QcJIWh7" => "Corazon",
     580    "JZb-2_sb0qbBPt" => "Coveo",
     581    "8K4QDDTlf" => "Crashlytics",
     582    "H1RKcVjuo-X" => "Crazy Egg",
     583    "ryntqNi_oZm" => "createjs",
     584    "eOxs7vkZ5cIbRn" => "Creditreform",
     585    "bo1eQYBqE" => "Crefopay",
     586    "rkT1x5Eo_ibm" => "Crimtan Holdings",
     587    "B1fDhaZcE" => "Crisp Chat",
    20588    "HyeqVsdjWX" => "Criteo",
     589    "SystcNs_i-X" => "Criteo OneTag",
     590    "ir7QpAGI" => "CrossEngage",
     591    "NaBqSG56ozyl3f" => "Crossplan",
     592    "xWwGfga9W" => "Cuebiq",
     593    "P4TRMHYULjn2JH" => "Cuenect",
     594    "lkM9hmqWWT3Lzk" => "Curalate",
     595    "ZHU4a5mZPVMuoP" => "Currency Converter",
     596    "M8wT_v7Yf" => "Custobar",
     597    "vDIn19n9F" => "Customer Alliance",
     598    "ki0bzRVWKZovIj" => "Customer Reviews by WACR",
     599    "mC-lKBOTZ" => "Customer.io",
     600    "_MbxwST_7Mu62J" => "Customerly",
     601    "I99Vzl6mZ" => "Cxense",
     602    "06NhSHkb5" => "Cybba",
     603    "Divc-nzbk" => "Cydersoft",
     604    "Ek_i8cfWU" => "Czech Publisher Exchange",
     605    "20R0KrKk8" => "d.vinci",
     606    "Vd4jf_bW9" => "DailyGo",
    21607    "VJNO26pZe" => "Dailymotion",
     608    "H9bIKf_i" => "dailypoint",
     609    "_OIm7GxyZ" => "Daisycon",
     610    "nLWGjXeAyJHTJu" => "Daktela Webchats",
     611    "SyxfH7JN7" => "Danubius",
     612    "IoSfrTR1p5Sxpo" => "Daon",
     613    "r1G0NXJEX" => "DAT Group",
     614    "Flf8kP0XXc_ubD" => "Data Circle",
     615    "BJL48D74Q" => "data22",
     616    "P7XVa18qr" => "Datadog",
     617    "Xl0HIOViY" => "Datadog Real User Monitoring",
     618    "NeWsJito4aPrFK" => "DataDome",
     619    "edd8bsMOg" => "Dataseat",
     620    "78h78kgEz" => "Datatrans",
    22621    "8Nxb4ZtSa" => "DataWrapper",
     622    "7tNwk5fZ9" => "dataXtrade",
     623    "H10nc4s_iWX" => "DataXu",
     624    "XnGRMsNDp" => "DatoCMS",
     625    "HJIBxqVsOo-Q" => "DCMN",
     626    "MQJ6TX04ENV3Du" => "Dealfront",
     627    "fGLl3IvZA" => "DeepIntent",
     628    "LlTSS4MfNQfOAf" => "DeepL",
     629    "xK8kAxsif" => "Define Media",
     630    "wZ5JcfjYw" => "Delivery Hero",
     631    "HylUe9NsOs-7" => "Delta Projects",
     632    "yLsP4len5" => "Demandbase",
     633    "JPsksE_6U" => "Demex.net",
     634    "2SoPnIWSY" => "Demodesk",
     635    "yBRIQt31I" => "DemoUp",
     636    "PcyIFVx6_" => "Densou Trading Desk ApS",
     637    "KY9kEd5AV" => "Dentsu Aegis Network",
     638    "6lTC1aNep" => "Desiretec",
     639    "H1MxcVsujbm" => "Deutsche Post",
     640    "yRdgviIjf" => "Devatics",
     641    "NzIW86WRUkmZJK" => "devtodev",
     642    "ry7d5Njui-m" => "DFP Traffective AdServer",
     643    "-XvEgJd2S7TpTO" => "Dialogbits",
     644    "ISpYFA-TbtD2KZ" => "DialogShift",
     645    "QtXuaSW-k" => "didFind",
     646    "HyMRe54juibQ" => "Digilant Spain",
     647    "DnsfUym0nruTtI" => "DigiMember",
     648    "RxO91a70" => "Digistore24",
     649    "zmbCFQIKk" => "Digital Control",
     650    "_BRxakDwo" => "Digital East",
     651    "S1RUqVodiWX" => "Digital Media",
     652    "q6FEv3jcYyYunG" => "Digital Turbine Ignite",
     653    "rJo4xcEo_s-Q" => "digitalAudience",
     654    "S11RqVoOoWQ" => "Digitalberatung",
     655    "2riF-7vlWnhFAT" => "Digitale Adventskalender",
     656    "XX-JdeS24Gxyiq" => "DigitalTurbine",
     657    "B1DCgqEjdiZ7" => "DIGITEKA Technologies",
     658    "BJiugcEjOjZm" => "Digitize New Media",
     659    "H1oi94o_o-m" => "digitru.st",
     660    "Yq0xUHB4NC2SQl" => "DirectTv",
     661    "6MZkp0plA" => "Dirs21",
    23662    "hvWNhpF0T" => "Discord",
    24     "r1rX94i_iZX" => "Disqus",
     663    "UekC8ye4S" => "Display & Video 360",
     664    "r1rX94i_iZX" => "disqus",
     665    "SJmVgqNjOjbX" => "district m",
     666    "XtPJZdv6Y" => "DistroScale",
     667    "B4KTdM5zY" => "Ditto",
     668    "1vgHQcJdZ" => "DocCheck",
     669    "Vp6CXtilHrxUso" => "Doctify Platform",
     670    "AlNuXsio8mtmSD" => "Document360",
     671    "Cv-mVwOQr" => "DomainFactory",
     672    "4DFjRax1u" => "Domodi",
     673    "W8RaJ9nUzwh8Qk" => "DonDominio",
     674    "yF3NAOIAC" => "Doo",
     675    "1Pj8F8p0" => "Doofinder",
     676    "pbkhrW6yd" => "dooshop",
     677    "htA-a07qq" => "dotdigital",
     678    "gMfEyvJhF" => "DotNetNuke",
     679    "HJIWBc5RQ" => "Dotomi",
     680    "HkMzqiL4X" => "DoubleClick",
     681    "9V8bg4D63" => "DoubleClick Ad",
     682    "S1ulcVjdiWQ" => "DoubleClick Bid Manager",
     683    "ByzZ5EsOsZX" => "DoubleClick Floodlight",
     684    "YBSUcZx1z4_B6S" => "DoubleClick Floodlight Enhanced Attribution",
     685    "BkjG6N1EQ" => "DoubleClick for Publishers",
     686    "rJBPg9Ns_sWQ" => "DoubleVerify",
     687    "wCMfrJcWb" => "Download Monitor",
     688    "JUf4KxMBj" => "dpa Deutsche Presse-Agentur GmbH",
     689    "zXXgkRFuF" => "dpa Infocom",
     690    "dHZwdhDYf" => "Dr. Banner",
     691    "PJrrqs5FSZYIkc" => "Dr. Free Gift on Cart",
     692    "95xVXSDLf" => "Drawbridge",
     693    "jE46pSyKb4wx8z" => "Dreamdata",
     694    "mv27ouXUn" => "Drees & Sommer",
     695    "hQROV2qf7" => "Drift",
     696    "P0OtsPiRJ" => "Drift Functional",
     697    "rycQc4s_iW7" => "Drip",
     698    "BJND31jnE" => "Droid",
     699    "vZH7Ountd" => "DTS",
     700    "Yh1B51rBx" => "DTS (Filiale de Solocal Group)",
     701    "Bkwk09UD6" => "Duda",
     702    "jvgVtyDjK" => "Duende Software",
     703    "khUD-KNccif_BD" => "dun & bradstreet",
     704    "SUNfUpZFc" => "dunnhumby Germany",
     705    "aV-3rrwlW" => "dunnhumby Germany",
     706    "N78lgT6yb" => "Duplo Media",
     707    "qWONIIQl0" => "Duration Media",
     708    "SyCj9Es_o-m" => "dwin1.com",
     709    "URfCDWgXN" => "DynAdmic",
     710    "4ItmQyYeJqhqbk" => "Dynalyst",
     711    "1qrLQTCTp" => "Dynamic 1001",
     712    "S1krl5Eo_obm" => "Dynamic Yield",
     713    "BJbSg94i_o-X" => "Dynamic Yield Analytics",
     714    "ZkQjr_Hc_" => "Dynata",
     715    "M6Q7giJoz" => "Dynatrace",
     716    "eFVSmqvj_" => "E wie einfach",
     717    "vu3PSfZe4" => "E WIE EINFACH Freunde werben",
     718    "8K-4oFu8y" => "e-bot7",
     719    "X9yTQ_PyX" => "e-guma",
     720    "M2_r1ASsBScyR0" => "e-vendo Notice",
     721    "MiTDMANqJjOBd2" => "e-vendo Recommendation",
     722    "bizRMOL9e" => "Easy Channel HGV",
     723    "AzN28O17" => "easy.tracking",
     724    "EP8lLzINO" => "easybill",
     725    "juzOkXqXf" => "EasyCredit (Ratenkauf)",
     726    "LMNyVEnn6" => "Easyfeedback",
     727    "H1z4gqEidjW7" => "EASYmedia",
     728    "lsgoV13iJr6Thb" => "eBay Store by Mindbulbs",
     729    "L2vWsDOr4W34eH" => "Ecommerce Store by Powr",
     730    "SJXtq4iOoZX" => "Econda",
     731    "T9d835M3" => "econda Analytics",
     732    "wGNsI0zJ" => "econda Analytics Essential",
     733    "20BzO8h3" => "econda ARP",
     734    "nWVAamrH" => "econda Cross Sell",
     735    "FOFHxPa22" => "Ecwid",
     736    "6GmJR3rzo" => "EDA",
     737    "K_7pBvUQf" => "Edadata",
     738    "9dKk-fQDXRfJCs" => "eDesk",
     739    "aNpyKNtfO1853l" => "Editorify - Product Reviews",
     740    "S0nozGN1_" => "edoobox",
     741    "4qK0LMP3J" => "Effiliation",
     742    "Ci1XLVUSI" => "eGain",
     743    "TYi_Ik7-x" => "eGovernment Podcast",
     744    "WwZYS9xvA" => "EHI-Siegel",
     745    "8mYD5MWhP7f_fR" => "Eightfold",
    25746    "MEXztGXoM" => "eKomi",
    26     "rkUcEjuoWm" => "Facebook Audience",
     747    "6hTRb4RkSrDSHf" => "Elastic App Search",
     748    "3CHxj_Uea" => "Elementor",
     749    "dCQTj1ryb" => "Elfsight",
     750    "zTRmwB89UzXzW3" => "elopage",
     751    "ByBFq4idoZQ" => "Eloqua",
     752    "Q0sjsdWCVe9THW" => "eMarketeer",
     753    "S16u54s_i-Q" => "Emarsys",
     754    "XULebj6Iz" => "Embedly",
     755    "tLxmZ4lJ0ELfBT" => "EmbedSocial",
     756    "5yZ6vvmjj74g5n" => "Embrace",
     757    "F2X0mUlze" => "Emerse",
     758    "gPX7VyXhz6JZs9" => "Emersya",
     759    "BJmZ9Nids-m" => "emetriq",
     760    "4ENZ2_2hS" => "Emodo",
     761    "ByRVl9ViuoZ7" => "EMX Digital",
     762    "lJw-5t0vr8pM99" => "Endereco",
     763    "L20cjXk4q" => "energyAds",
     764    "WS9UinNyJ" => "EngageYa",
     765    "l-0ygHVr" => "Episerver",
     766    "Vhp0w3eBr" => "epoq",
     767    "0pVo537JLlx-_n" => "EQS IR Cockpit",
     768    "qN-ur-FZOgSdK6" => "EQS News",
     769    "vK54WQhrgnvTFf" => "EQS Stock",
     770    "t3wYmwf7Q" => "eQuota",
     771    "H1gr85C7m" => "Erweitertes Tracking",
     772    "CAh-PzD4" => "esome",
     773    "fy2y1l5NK1ndoP" => "Estheticon",
     774    "ByaC5EsdoWX" => "Etarget",
     775    "B4MOBvmAw" => "eTermin",
     776    "PPkCxv14a" => "etracker",
     777    "BIRApgk3o" => "etracker without cookies",
     778    "-3xZ3_oSf" => "Eulerian",
     779    "jmK4ZP8o" => "Evalanche",
     780    "JpZJ7GnSYRXDyx" => "eveeno",
     781    "HkVrlqEiuibX" => "Eventbrite",
     782    "T2EliczcxLrvtP" => "Events by Wix",
     783    "k-PkpuXOBGi7gq" => "Events Calendar",
     784    "MF2a0ec4R" => "Eventscase",
     785    "BgFFtPqMi" => "Everesttech",
     786    "4eHuZ3Liz9rqUH" => "Everflow",
     787    "SHVGb93oC" => "Eversttech.net",
     788    "r-PDe4a85" => "Evidon",
     789    "JtPFO0Vkb" => "Evm3",
     790    "Ww1bNfD-i" => "EX.CO",
     791    "HJZU9Nj_iZX" => "exactag",
     792    "qE3WE4Wam4ORVF" => "Excentos",
     793    "WpYODjaRP42z7F" => "experian",
     794    "xX46ae_h9" => "Exponea",
     795    "rkKC5EsusWQ" => "Exponential Interactive",
     796    "FXe3euJljI0uJY" => "Eye-Able® Assist",
     797    "n1hCTnCxy" => "Eyeota",
     798    "By7zl9NiOoWX" => "Eyeota Ptd",
     799    "lmAfJPg6InvRFZ" => "Eyepin",
     800    "SkmkZ9Vj_jW7" => "Ezoic",
     801    "rmtXcYS_B" => "f5",
     802    "DJCKNxpeW" => "f5 Networks",
     803    "PNtPBL1Zd" => "Faaren",
     804    "jrUnstvLKeFnIS" => "Fabric Answers",
     805    "Pqk3AsAS7" => "Facebook",
     806    "1XvFW-Y2k" => "Facebook",
     807    "Ug1jBcZJq" => "Facebook App Events",
     808    "ax0Nljnj2szF_r" => "Facebook Audience Network",
     809    "tavJ1OKSj" => "Facebook Audiencenetwork",
     810    "SJKM9Ns_ibQ" => "Facebook Connect",
     811    "rkUcEjuoWm" => "Facebook Custom Audiences",
     812    "SxdpEPwQn" => "Facebook Messenger",
    27813    "ko1w5PpFl" => "Facebook Pixel",
    28     "XYQZBUojc" => "Facebook Social Plugin",
     814    "ocv9HNX_g" => "Facebook SDK",
     815    "XYQZBUojc" => "Facebook Social Plugins",
    29816    "r5-Z_erQ0" => "Facebook Videos",
     817    "DkJsSfr-W" => "Facelift",
     818    "u0ATqylf" => "FACT Finder",
     819    "53QoLB6h1" => "Factfox",
     820    "8keiDlAsDeQBrQ" => "Factors.ai",
     821    "Sp827hBaKKNmEN" => "Fairing",
     822    "TcEBCmnTm" => "Falstaff",
     823    "dDq2_ZEKk" => "fast.fonts.net",
     824    "LRKhbMoNF" => "Fastly",
     825    "SkEscVsusbX" => "FBCDN Facebook",
     826    "5x9QA2VHs" => "Feathr",
     827    "U_4ErlVw0" => "Feed Dynamix",
     828    "ev7yTEG2Z" => "Feed Dynamix",
     829    "ipC9qVnU1ddE8_" => "Feedad Outstream Video",
     830    "VQOf5Oqz6E9gq0" => "Fera Reviews",
     831    "EW5XbVRw3" => "Feratel",
     832    "wP9Wrr5vRCEg4J" => "Fibbl",
     833    "2gB839qN3" => "Fidzup",
     834    "H1Tbl5Nj_iZX" => "Fifty Technology",
     835    "WpRTuyrux" => "FiksuDSP",
     836    "suqC04krG1L4T9" => "Filial & Händlersuche - StoreLocator",
     837    "IEx-Tjzmp2Lq8W" => "Fillout",
     838    "W64b12ODh" => "Filmcentralen",
     839    "HyiV94juoW7" => "FinanceAds",
     840    "Hym5udh9V" => "Findologic",
     841    "oGxSC1QCs" => "Findologic",
     842    "NqUzbHHebkb71p" => "Fingerprint JS",
     843    "IbhfQQbkb" => "Finiative",
     844    "42vRvlulK96R-F" => "Firebase",
     845    "ytzFgf-eM" => "Firebase A/B Testing",
     846    "VX76uyyzy73YYV" => "Firebase App Check",
     847    "R7lR9am_W" => "Firebase App Distribution",
     848    "smOQ7x8wu" => "Firebase Authentication",
     849    "RKCvoZ--rtLVPw" => "Firebase Cloud Functions",
     850    "Mp0TG-j8k" => "Firebase Cloud Messaging (FCM)",
     851    "GdR8b4tr2aKf3E" => "Firebase Cloud Storage",
     852    "cE0B0wy4Z" => "Firebase Crashlytics",
     853    "ecngP6eEs" => "Firebase Dynamic Links",
     854    "OO202MrWM" => "Firebase Firestore",
     855    "uPYPx7TC_" => "Firebase Hosting",
     856    "Qsn-_VTnI" => "Firebase In-App Messaging",
     857    "HY2wFEsVsGfqBR" => "Firebase Installations",
     858    "w7hiUTrsU" => "Firebase Machine Learning",
     859    "2rhWushaj" => "Firebase Performance Monitoring",
     860    "E6zvFdb6n" => "Firebase Predictions",
     861    "iRXREsVii" => "Firebase Predictions",
     862    "eM-uPjak6" => "Firebase Realtime Database",
     863    "2nEos-2ls" => "Firebase Remote Config",
     864    "FBW01l7Nh" => "FirebaseInstallations",
     865    "_Ncf9yLnC" => "Firebot",
     866    "S6nAK-l_I" => "FirstSpirit ICE",
     867    "dJuNHeMq3" => "Fitanalytics",
     868    "AtX7Q3-g9" => "Fittingbox",
     869    "W0C1VS2NZJn2XC" => "FiveAd",
     870    "cSprKh7fQ" => "Flamingo",
     871    "3ksSixTl" => "Flash Player",
     872    "ByP4x94sdsW7" => "Flashtalking",
     873    "-03ZuckNu" => "FlexOffers",
    30874    "X0wJtpzqX" => "Flickr",
     875    "_hpE1bAQKrT7hL" => "Flipbook by Simplebooklet",
     876    "5C8JIjq1K" => "Flipsnack",
     877    "Vy26WddoN" => "Flixmedia",
    31878    "uJyv6-Nm" => "Flockler",
    32879    "kbmJpLAUf" => "Flourish",
    33     "RuWQqICz" => "Giphy",
     880    "S1vXDBFnE" => "Flowbox",
     881    "FlrO-MzKx" => "Flowplayer",
     882    "WZDb3Q2TF" => "Fluid Ads",
     883    "X5abD8nSKYLKSi" => "Flurry Analytics",
     884    "kGLSrGE2j" => "Flurry SDK",
     885    "B1A-5Eiuj-m" => "FLXONE",
     886    "qVPcPO8cJ" => "FM Labs",
     887    "3U8XzcZ2T" => "FOMO",
     888    "SdIj7BUI5" => "Font Squirrel",
     889    "H1GSqEodjZX" => "Fontawesome",
     890    "jhZPu5Km" => "fonts.com",
     891    "H1vi54o_obQ" => "fonts.net",
     892    "LYBjinTii" => "Fontshop",
     893    "BBcvE5Eg0" => "Fontspring",
     894    "8G7U3J2Xc" => "Forensic",
     895    "SzrLr6NAN" => "Forio",
     896    "ljEMGR6jJ" => "Formsite",
     897    "4mEDHCPTjXMa4C" => "Formulayt",
     898    "BDfdw1ennsN5y3" => "Forter",
     899    "r15El9VjusZ7" => "FORTVISION",
     900    "_VBgTrSfZ" => "FouAnalytics",
     901    "yQYmNEilvDTNX0" => "Fourthline",
     902    "gLB9P_wjr" => "Foxydesk",
     903    "q-_eu2X2d" => "Fraud0",
     904    "SJIIt5hl1" => "fraud0",
     905    "CVliYs1Zn" => "Freewheel",
     906    "acYUto9R" => "Freshchat",
     907    "qMGENEB_g" => "Freshdesk",
     908    "bUYUwB3z" => "Freshsales",
     909    "WXuCIEBGA" => "Friendly Captcha",
     910    "Dhu44_2kxD4V0Y" => "Frontnow Advisor",
     911    "BkZ_qViOj-7" => "Fullstory",
     912    "0fl-lzlGczJYge" => "Fundraise Up",
     913    "OQ_YoPScl" => "Fundraisingbox",
     914    "7gS0Vjsc" => "Funnelcockpit",
     915    "fWasnrcz" => "Funnelytics",
     916    "Hk5MAfAmQ" => "Für das Funktionieren der Website wesentliche Funktionen",
     917    "S1GOL9RQm" => "Für das Funktionieren der Website wesentliche Funktionen",
     918    "z1lodDq19s5dV8" => "Fusedeck",
     919    "VpcE6ZZO4mRgTu" => "FuxCDN",
     920    "H17alcVo_iZ7" => "Fyber",
     921    "SSTYcu33F" => "G+J Electronic Media Sales",
     922    "3AwSqkFPz_OCMx" => "G2 - Track Your Prospects",
     923    "QU1vpIg7p" => "G2.com",
     924    "Ju0u0ZSRbkYa3-" => "GA 18: Age Verification 18+",
     925    "b5UwVqnTvXtU4Q" => "Gadsme",
     926    "bQTbuxnTb" => "GameAnalytics SDK",
     927    "By5ogq4oOsZm" => "Gamned",
     928    "fsfWgMGrz" => "Gastronovi Speisekarte",
     929    "dnpN08x5B" => "Gastronovi Tischreservierung",
     930    "Rypthk1_I" => "GeistM",
     931    "hcX1QxmPB" => "Geizhals",
     932    "-Fx1BJClc" => "Geizhals",
     933    "rycTeqVoOiZm" => "Gemius",
     934    "65JrtAVaP" => "Genesys Cloud",
     935    "sfYIpjlx9" => "Genesys Cloud Services B.V",
     936    "S1dFecNjOjW7" => "Genius Sports Media",
     937    "HyTFy29M" => "Gepruefter-webshop.de",
     938    "GH5Ng8oGl0gkAB" => "Getback",
     939    "TvEA5AW-k" => "GetIntent",
     940    "iHduqoTR" => "GetResponse",
     941    "pOEDWfrf0" => "getsitecontrol",
     942    "utDoyjic3psr82" => "GetSocial",
     943    "JgTrA1wBt" => "GetYourGuide",
     944    "i7OSekjkM" => "GetYourGuide Deutschland GmbH",
     945    "PTbb7kx6I" => "GfK",
     946    "vFb6fBLXT-yqQA" => "Gifted",
     947    "oaos1k2AC" => "Giggle Tips",
     948    "RuWQqICz" => "GIPHY",
     949    "42AYnGBRj" => "Giropay",
     950    "Ofh7aUnv" => "GiroSolution",
     951    "ess_H8_2okW3hZ" => "GK AIR",
     952    "Om08aijRzk_SiQ" => "Gleap",
     953    "B1N594jOiZQ" => "Glimr",
     954    "3aIaQuY5b" => "GlobalWebIndex",
    34955    "BySu54sOjZQ" => "Glomex",
    35     "S1_9Vsuj-Q" => "Google Ads/Google AdWords Remarketing",
     956    "HoT8o7YlzZmZ27" => "Goaffpro",
     957    "BJ8rq4jdjWm" => "GoDaddy",
     958    "6AdzXjKpi" => "Goldbach Group",
     959    "rkRFl94j_i-m" => "Golden Bees",
     960    "r1ztecNjdjZm" => "Goodway Group",
     961    "n9pGpcK5L" => "Google Ad Exchange",
     962    "7M0cXS2pQ" => "Google Ad Manager",
     963    "hK_vxTwL-" => "Google Ads",
     964    "S1_9Vsuj-Q" => "Google Ads",
     965    "8ScDZDmU" => "Google Ads Conversion",
     966    "twMyStLkn" => "Google Ads Conversion Tracking",
     967    "dqFgQeZH" => "Google Ads Dynamic Remarketing",
     968    "9rIQbZIzb" => "Google Ads Measurement",
     969    "B1Hk_zoTX" => "Google Ads Remarketing",
     970    "yjqNcpbNY" => "Google Adsense",
     971    "rJ99c4oOo-X" => "Google AdServices",
     972    "rySiXprN7" => "Google AdWords",
     973    "r19MqVjdoW7" => "Google AdWords Conversion",
     974    "SylacVousbm" => "Google AdWords Remarketing",
     975    "H1PKqNodoWQ" => "Google AJAX",
     976    "r1wSlcEjOsbm" => "Google AMP",
     977    "pnDuLUTpa" => "Google Analytics",
    36978    "HkocEodjb7" => "Google Analytics",
    37979    "87JYasXPF" => "Google Analytics 4",
     980    "ABsocZLBQ" => "Google Analytics Advertising",
     981    "GqhZxB-iiydzEk" => "Google Analytics Advertising for Firebase",
     982    "Skr99EiujbX" => "Google Analytics Audiences",
     983    "ge3hQ3zM" => "Google Analytics Event Tracking",
     984    "diWdt4yLB" => "Google Analytics for Firebase",
     985    "b8FM5DHv-" => "Google Analytics Statistics",
     986    "QPYQDujT" => "Google Analytics Youtube Event Tracking",
    38987    "n1jiXg1v" => "Google Calendar",
     988    "pxiRY9112" => "Google Campaign Manager",
     989    "dyHOCwp5Y" => "Google Campaign Manager 360",
     990    "f4iZ3mAm5" => "Google Captcha",
     991    "isJO61p0b" => "Google Charts",
     992    "xr0lbwprU4Tf-L" => "Google Chatbot",
     993    "bms_SDJMG" => "Google Cloud",
     994    "VOjHS1w7aCn0rN" => "Google Cloud Retail API",
     995    "qo3iMe_aP" => "Google Cloud Search",
     996    "Sq_WmUhZ8_bD21" => "Google Consent Mode",
     997    "0-UDzyKi" => "Google CSS",
     998    "S1GV5Ei_oW7" => "Google Custom Search Engine",
     999    "IactbkdI7A1cZU" => "Google Customer Match",
     1000    "CRfCqvYA" => "Google Customer Reviews",
     1001    "rqJvtDVvp" => "Google Display & Video 360",
     1002    "1DhORJFj9" => "Google Docs",
     1003    "HkF9Eo_jbX" => "Google Dynamic Remarketing",
     1004    "vPKlLp_Oh" => "Google Enhanced Conversions",
     1005    "uNl9XGnZC" => "Google Firebase",
     1006    "kjk3gPD2cxt_Ea" => "Google Firebase Analytics",
     1007    "HkPBYFofN" => "Google Fonts",
    391008    "wgTnPe7i1" => "Google Forms",
     1009    "BJMh5NodoZQ" => "Google Global Site Tag",
     1010    "R2gyvn3ugawW0t" => "Google Hosted Libraries",
     1011    "S1Lgx59AX" => "Google IMA",
     1012    "kW5VliBMC5SXQi" => "Google Interactive Media Ads",
     1013    "2Xx3hZ77" => "Google Knowledge Panel",
    401014    "S1pcEj_jZX" => "Google Maps",
     1015    "JyhVKNPZN" => "Google Maps Geocoding",
     1016    "IH_MYjRFv" => "Google Maps Geometry",
     1017    "EkWrVcjOS" => "Google Maps Places",
     1018    "IVQgOy4oSKdrn1" => "Google Maps SDK",
     1019    "t-TPeXsRi" => "Google Marketing Platform",
     1020    "uPcXW8VQTm0CS_" => "Google Merchant Center",
     1021    "B1hcEjdoZ7" => "Google OAuth",
     1022    "gkEBFID-V" => "Google Optimize",
     1023    "iaSHYiqA2" => "Google Partner Badge",
     1024    "HgIfWleMF1Pl7a" => "Google Pay",
     1025    "8ibG8wB1t" => "Google Photo",
     1026    "rw4DyFQcg6s3-W" => "Google Play",
     1027    "A2k5o3ZTtrHZ5w" => "Google Play Services",
     1028    "r1WocNous-X" => "Google Publisher Tags",
     1029    "u3ZX02zVXhJwUG" => "Google Retail Search",
     1030    "C7Yai5mE" => "Google Safeframe",
     1031    "XJGT8f-58" => "Google Sign-In",
     1032    "4Ab1BgiB7" => "Google Signals",
    411033    "SkPc5EjOsWm" => "Google Syndication",
    421034    "BJ59EidsWQ" => "Google Tag Manager",
    43     "HkPBYFofN" => "Google Fonts",
     1035    "pMqnvms3Z" => "Google Tag Services",
     1036    "qvkzz7qPe" => "Google Translate",
     1037    "HkYNq4sdjbm" => "Google Webfonts",
     1038    "fFQ_WmYdQ" => "Google Website Call Conversion",
     1039    "rJAM9EodoWX" => "Google+ Plugin",
     1040    "QNFauzL0-3RUH8" => "Gorgias",
     1041    "rJsTfqq0X" => "GoSquared",
     1042    "O5FoJTAdc" => "GoToWebinar",
     1043    "BkWrc4j_s-Q" => "Gravatar",
     1044    "Bklbg5NodobQ" => "Greenhouse Group",
     1045    "Do1uNYTJTCmuTa" => "GreenSock GSAP",
     1046    "O5oJehm0M-egZz" => "Grin Technologies Inc.",
     1047    "iMp2AEZw8" => "Groove",
     1048    "HJOygqNo_sZX" => "GroundTruth",
     1049    "XHX7M-Bh_" => "GroupM Server",
     1050    "A68gX6mE" => "GroupM Server",
     1051    "wcqBhh7Sy4VYE9" => "Groupride",
     1052    "oSn0j1WChZGGov" => "Grouprides",
     1053    "4NIAkZsNE" => "GSI",
     1054    "EQvwGtc_N" => "gskinner",
     1055    "rJJjcVouoZ7" => "gstatic.com",
     1056    "5e4bAIMiRztWL_" => "Guardsquare DexGuard",
     1057    "e7v_XPJ4OUMY0g" => "Guenstiger.de Sales Radar",
     1058    "HJswr_n5V" => "GuJ_microConversion",
     1059    "rybbeq4sOjWm" => "GumGum",
     1060    "DJHxyS7qFRbRGy" => "Gunosy",
     1061    "nlI_IPK8j" => "Guuru",
     1062    "Z1kX6W6_O" => "Haensel AMS",
     1063    "spx5TfAGR" => "Happy Contests",
     1064    "hkSd1AFG3" => "Happydemics",
     1065    "5o386WKuo" => "hbfsTech",
     1066    "QjO6LaiOd" => "hCaptcha",
     1067    "4nofr3ZKv" => "HCL Commerce",
     1068    "PCM3ENiM_" => "Heap",
     1069    "V2JLZ6oXx" => "Hearken",
     1070    "ZsL20fBoL" => "Hearts & Science",
     1071    "jm2uRvXdcCaHvX" => "Heatclix",
     1072    "wPWaLxeau" => "heidelpay",
     1073    "uMCsHr86c" => "HelloBar",
     1074    "sQyCGhMu7" => "HelpfulCrowd",
     1075    "2gOY3sPPJ" => "Helpscout",
     1076    "DFT9QDJE_BFA3n" => "Helpshift",
    441077    "0V-E5N_GQ" => "Here",
     1078    "S1-CRlIJF" => "Heroku",
     1079    "Cg5EwBm57" => "Hetzner",
     1080    "PWceAZDtb" => "Heyflow",
     1081    "eTZ86zNa7" => "HGV Anfragewidget",
     1082    "pVIUV5bwU" => "hii",
     1083    "ZfbhHSYur" => "HIRO Media",
     1084    "hDr0yM-VkyVPmH" => "Hit Counter by Powr",
     1085    "jgfe089-f" => "Hivestack",
     1086    "cAPqoIgOqoT_Ot" => "Hockeystack",
     1087    "12Rp61cy9" => "hogast",
     1088    "xfC-0NlfB" => "HolaSpark",
     1089    "-xTGk4UJW" => "HolidayCheck",
     1090    "aP9cMixHcEGFB1" => "Homie",
     1091    "aQEevvUcQ" => "Hootsuite",
     1092    "ByOH9EoOsZQ" => "hostgator",
     1093    "M4l7NUrLF" => "Hotel Barometer",
     1094    "3R9IURKfa" => "Hotelchamp",
     1095    "R41epsTpY" => "HotelQuelle",
     1096    "S1kgcNo_j-m" => "Hotjar",
     1097    "S1AZgq4jOsZX" => "Hottraffic",
     1098    "OKaP1ocl" => "HR4YOU",
     1099    "Xs8BSD3DO" => "HRS",
     1100    "ro2Qr0JwU" => "https://www.flashtalking.com/optout",
     1101    "ntynkMgmojs56x" => "HUAWEI Ads",
     1102    "g-00DwuBhiwqye" => "HUAWEI AppGallery Connect",
     1103    "aTTBwjYV-ZLpl-" => "HUAWEI Mobile Services",
    451104    "ry0QcNodoWQ" => "HubSpot",
    46     "r1Fhc4iOoWX" => "HubSpot forms",
     1105    "GVxz5M93SoINWc" => "HubSpot by SyncSmart",
     1106    "B0yp01393" => "HubSpot Essential",
     1107    "r1Fhc4iOoWX" => "HubSpot Forms",
     1108    "q6YYRb_V9AxuuY" => "Humm",
     1109    "QZPPPW641" => "Huq Industries Limited",
     1110    "No50R7Wr" => "Hurra.com",
     1111    "Ie2tI6I8A" => "Hybrid Adtech",
     1112    "ROCBK21nx" => "HyprMX",
     1113    "i1sbFas6IXyQ1c" => "I-mobile",
     1114    "XMTWUaeze" => "IAB Open Measurement SDK",
     1115    "HJanx9NoOjb7" => "IAB Technology Laboratory",
     1116    "V7Aw0ubTPes8vT" => "iAd",
     1117    "BykM5Vodi-X" => "iAdvize",
     1118    "TE1p4rbif" => "Ibexa DXP",
     1119    "8t91Hdo8W" => "Iconfinder",
     1120    "xSkLLZByv" => "Icons8",
     1121    "Hy2XlcEi_ibQ" => "ID5 Technology",
     1122    "HytuM2Hq4" => "Idealo",
     1123    "iO7pDk0MCbOpOD" => "If-So Dynamic Content",
     1124    "e9v8TIcig" => "ignitionAi",
     1125    "HJPPe9VjOsZX" => "IgnitionOne",
     1126    "DJgoqmnpF" => "Illuma Technology Limited",
     1127    "2DeBAlZBPce0Np" => "ImBox",
     1128    "XZ6buX0Z2" => "Imgix",
     1129    "-7aWGVtV7" => "Immobilienwertanalyse",
     1130    "eDtR-Qpyr" => "ImmoScout24",
     1131    "ha-q9XBo" => "Impact Radius",
     1132    "Db4YwX8aalX3oG" => "Impact.com",
     1133    "0Xgr5Vwth" => "Impactify",
     1134    "Y4NL-RXQQ" => "Imperva",
     1135    "SJwZxc4sOsZQ" => "Impression Desk Technologies",
     1136    "S1a9gqNj_iZ7" => "Improve Digital International",
     1137    "gjsI_E28r" => "Incert",
     1138    "HyldcVsOo-m" => "Indeed",
     1139    "HJr1gqVsOjbm" => "Index Exchange",
     1140    "PAess3fOL" => "Indoqa Search-Analytics",
     1141    "CVBUWHOL8" => "INFINIA MOBILE",
     1142    "KxDKFEzQHcHKvi" => "Influence mobile",
     1143    "F9geCQdkM" => "Infogram",
     1144    "BXU3bgwQNXkz2a" => "Infomax Websolutions",
     1145    "r1qWcNoOsW7" => "INFOnline",
     1146    "AJC7siicR" => "Ingenious Technologies AG",
     1147    "ykdq8J5a9MExGT" => "InMobi",
     1148    "Hyu6e9VjdoWQ" => "InMobi Pte",
     1149    "IWEry9w3j" => "INNITY",
     1150    "1On4iIz0pXPB7x" => "Innkeepr",
     1151    "kDgm-HFUj" => "Innovid",
     1152    "KpyTD7UX8HJ_xi" => "Insider",
     1153    "HkGcl5Viuo-7" => "Inskin Media",
     1154    "-Gj2r8bd6" => "Instabug",
    471155    "SyUQ54odobQ" => "Instagram Content",
     1156    "sHCH_ftzBIyJfN" => "Instana",
     1157    "AOgl5ztxY" => "Instapage",
     1158    "rkkCx9EjuiZQ" => "Instinctive",
     1159    "gstWfFWQ4" => "Instreamatic",
     1160    "uceCBKaoi" => "InsurAds Technologies",
     1161    "B8AYJ-S6i" => "intedia",
     1162    "C1w4LIzQZ" => "Integral Ad Science",
     1163    "0B8fT5-8O" => "Integral Ad Science",
     1164    "ByiGqViusWX" => "intelliAd",
     1165    "Qv2yE-JQd" => "intelliAd Privacy Safe Analytics",
     1166    "r1KkV5tb8" => "intelliAd Tracking",
     1167    "jdFcD8NQuNYIy_" => "Intellimize",
     1168    "r1Klg5VjOoW7" => "Intent Media",
     1169    "ZPBtlhwwj" => "Interactive Performance",
     1170    "oAGTwTX0" => "Interactive Performance",
    481171    "ryDQcVoOoZQ" => "Intercom",
     1172    "XERJaRzZN" => "Internet BillBoard",
     1173    "RkzHS-jLm" => "Interrogare",
     1174    "rJ4tecEoOoZ7" => "Intowow Innovation",
     1175    "uHbOWgCQJ" => "Invibes",
     1176    "6reLOgXs1" => "Inxmail",
     1177    "SyBR15Ly4" => "Ioam",
     1178    "vBT3xziaP" => "IOL-BODY",
     1179    "r1xKx94jusZ7" => "iotec global",
     1180    "mHEhMFFdV" => "IP Stack",
     1181    "AcG0jQhhzztYxU" => "ip-api",
     1182    "5R7MB_6N0" => "IP2Company",
     1183    "zZoDj4IdOx8lGp" => "iPages Flipbook",
     1184    "Y3S3Cjlht" => "iPaper",
     1185    "95bcFdZvH" => "Ipapi",
     1186    "D5DUswh2fMIkg5" => "Ipify",
     1187    "B16Q9VodjbQ" => "Ipinfo",
     1188    "BnK1tfEC6R1Qrl" => "iPlayerHD",
     1189    "rklNe9NjOiWm" => "IPONWEB",
     1190    "ry6p5NiujW7" => "iProm Remarketing",
     1191    "WGTklT4Im" => "iProov",
     1192    "Mii4b2CFl7rgK1" => "IQzone",
     1193    "hY-4uY34I" => "Iridion",
     1194    "9dchbL797" => "ironSource",
     1195    "qMW-1y9VZncgxO" => "iSenseLabs",
    491196    "dwkRM0PG" => "Issuu",
     1197    "lx8ViIae4q6Ho2" => "Iterable",
     1198    "u34eMAoRD" => "iThemes Security Pro",
     1199    "R6bu3Q3X4" => "iTunes Coverbilder",
     1200    "Bk79g5EjuoZX" => "Jaduda",
     1201    "t9GHg5xFu" => "Jameda",
     1202    "wT2IxHKzZ" => "Jampp LTD",
     1203    "V4QOOdntTmS07U" => "Jentis",
     1204    "SJNrcVo_o-7" => "JetPack (WordPress Plugin)",
     1205    "B1mACbkCb" => "Jimdo",
     1206    "UZOZDGJER" => "Jira Service Desk",
     1207    "bWGt72FTi" => "Jivochat",
     1208    "ByAje9No_j-m" => "Jivox",
     1209    "GLIuvNhzfKbWEI" => "JobRad",
     1210    "JIK6n-FV9RuDQ6" => "JobRad Österreich",
     1211    "49Xa8jsyH5rSfo" => "JobRad-Rechner",
     1212    "VQfUiTGEr" => "Join",
     1213    "am5lpKiXP" => "Joomla",
    501214    "J9V5VBp3y" => "JotForm",
     1215    "Sy7BcNo_ib7" => "jQuery",
     1216    "YFfQgeL1F" => "jQueryUI",
     1217    "F-REmjGq7" => "JSDelivr",
     1218    "c85glKPAc" => "JTL Shop",
     1219    "13MNOMVk-l3Ngn" => "Judge.me",
    511220    "-ONUgPRHp" => "Juicer",
     1221    "w-6YwMJPGxMGoM" => "Julep Media",
     1222    "XshkkGRyb" => "Jumio",
     1223    "7VMQjmth-zQrAt" => "Jumpseat",
    521224    "YiVeMG4Ma" => "Juris",
     1225    "CTaQ5h7W8UxLLV" => "Juspay",
     1226    "sTLR41-Y-" => "Justix",
     1227    "Hk_el94sdsZQ" => "Justpremium",
     1228    "XPNynwmsY" => "Justtag",
    531229    "ppPIzs4e" => "JW Player",
     1230    "yJh98UvrN" => "jweiland.net",
     1231    "Q6QFEEKXW" => "Kadermanager",
     1232    "w-cwb3XM" => "Kairion",
     1233    "Yck-LLwy0" => "Kairion Instore",
     1234    "d0-kDutgg" => "Kairion Instore & Out-of-Store",
     1235    "XAUageUTd" => "Kairion Out-of-Store",
     1236    "onMhbpYZn" => "Kairos Fire",
     1237    "g6bEKM3Hs" => "Kakao",
     1238    "S1MLTlkEX" => "Kaltura",
     1239    "H1yDxp7JN" => "Kameleoon",
     1240    "9FYjH37-J" => "Kameleoon A/B Testing",
     1241    "2lh8-reEz" => "Kameleoon Personalization",
     1242    "07EU8bMnixRXgH" => "Kayak",
     1243    "C2a4_R3z6" => "Keen IO",
     1244    "BkDKHsV5N" => "Kelkoo",
     1245    "mmVz-j_tr" => "KennstDuEinen",
     1246    "SJ7T9NjOjZX" => "KenShoo",
     1247    "eoVgXrQuQ" => "Kentico CMS",
     1248    "HJBSqEido-X" => "keyCDN",
     1249    "zB-0M4f30" => "Keycloak",
     1250    "SJysx5Nodj-X" => "Keymantics",
     1251    "2kcwp9XMK" => "Khoros",
     1252    "Snx31FWS16T7HN" => "Kickbite",
     1253    "zf-7LGQ2" => "Kickfire",
     1254    "BqOkNFgpbLczMs" => "Kicktipp",
     1255    "JiXMaMGfGU0AMm" => "Kidoz",
     1256    "zbwYM1LoEJZynZ" => "Kiko Chatbot",
     1257    "ko6wPAMieDctcU" => "Kindly",
     1258    "U7XTUDFas" => "Kiosked",
     1259    "loZk__DQmtCVlO" => "Klar Insights",
     1260    "x8yJ18Vy-pXRWV" => "Klar Pixel",
     1261    "7x35Xo7A" => "Klarna",
     1262    "JuU9Uc996" => "Klarna On-site messaging",
    541263    "m5uB6gnoW" => "Klaviyo",
     1264    "t0R7w63eu" => "Klear",
     1265    "hPrNlr3oRSQ3Av" => "Klevu",
     1266    "OrQTMdFE" => "Klick-Tipp",
     1267    "b8m6H4Eyp" => "Knexus",
     1268    "ABb8d45Rx" => "Knight Lab",
     1269    "w2KKV5_Fk" => "Knorex",
     1270    "r1KoxqNi_sZX" => "Knorex Pte",
     1271    "J9GIhipl2cGDEL" => "Koalendar",
     1272    "cMbvCxbnW" => "Kochava",
     1273    "xybUsnxey" => "Kognitiv",
     1274    "yP7Kbu7nw" => "Koko Analytics",
     1275    "mBFMre9KsMbdyA" => "Komoot",
     1276    "LobSoYzEM" => "Königsteiner Digital",
     1277    "es91dXvv5" => "Konsole Labs",
     1278    "Idm31to_c" => "Konsta",
     1279    "9Q7Bc1oNz" => "kr3m",
     1280    "gTaR1wkJyo9R86" => "Krones",
     1281    "GYCSUJaZd" => "ksu",
     1282    "tiFs2oYxt" => "kulea",
     1283    "PGQo494D" => "kununu",
     1284    "g4cu7oq5C" => "Kupona",
     1285    "70rpl4n2FyxuMX" => "Kuula",
     1286    "FAbLkZ3Tx" => "Kwanko",
     1287    "JH7NZIVIn" => "KXCDN",
     1288    "HyETcEoOjbQ" => "Ladenzeile",
     1289    "Tau9-tfH_" => "LamaPoll",
     1290    "FugOpEoJ7" => "Landbot",
     1291    "MV-UxJe2MAGfUW" => "Lasso Analytics",
     1292    "By5v5Vo_ibX" => "Lead Alliance",
     1293    "CIYR_A-Kh" => "Lead Forensics",
     1294    "v8EoM4g_YlhQch" => "Lead Onion",
     1295    "mfODT12AJ" => "Leadfamly",
     1296    "mbL6QSpmZ" => "Leadfeeder",
    551297    "eSE_HHXnI" => "Leadinfo",
     1298    "HkdvTCJTN" => "LeadLab",
     1299    "mjyIByaUN" => "Leadlander",
     1300    "ToKFtuZCS" => "Leadoo",
     1301    "E4CTElGAt" => "Leady",
     1302    "UpfsXTdEl" => "Leanplum",
     1303    "iESVWUYYXXPd7l" => "LearnWorlds",
     1304    "swhrlNC1JhYd8Q" => "Legejobber",
     1305    "YlhLJPcIk" => "Leiki",
     1306    "-ZG-GiW7s" => "Lemo Media Group",
     1307    "zRMtP5wY-" => "Lengow",
     1308    "gj_ifGDMW" => "Libsyn",
     1309    "loY267uTc" => "LifeSite",
     1310    "H1GgxqNsuibQ" => "LifeStreet",
     1311    "EMD3qUMa8" => "Liftoff",
     1312    "Hke994oui-7" => "Ligatus",
     1313    "FDiqvMBm0" => "LightWidget",
     1314    "AjOoxG0fkmHrmf" => "Lime Connect",
     1315    "--PErZkDm" => "LimeSpot",
     1316    "HDZy5SBI8bwYro" => "LINE",
     1317    "bkhjDXJzLlHFNY" => "Linexo",
     1318    "vsPo8NP4j4VJFB" => "Link11",
     1319    "aRZacFiPZ" => "LinkConnector",
     1320    "rk-nqEj_o-m" => "LinkedIn Ads",
     1321    "BJikbq4iujWQ" => "LinkedIn Analytics",
     1322    "PZZPKRUZvR-WGG" => "LinkedIn Conversions API",
     1323    "JQ2XQxIk" => "LinkedIn Insight Tag",
    561324    "Hkx754i_iWm" => "LinkedIn Plugin",
     1325    "KlgP751_a" => "Linkpulse",
     1326    "Te5E2yroW0raV6" => "Linkster",
     1327    "BJZOeqEjOs-m" => "LiquidM Technology",
     1328    "Gq3CKeAHP" => "LIQWID",
     1329    "0TSO2KqwdGcKZq" => "LiSA",
     1330    "OTnvvCqHZwyzg_" => "Live Chat by Text",
     1331    "5fsm8AQ864Jf4A" => "Live Intent",
     1332    "fmq5LxcxX" => "LiveAgent",
     1333    "LNZGBYJCq" => "LiveChat",
     1334    "Skh2lcVsusWX" => "Liveintent",
     1335    "H-Ph11IG" => "LivePerson",
     1336    "BkqzgqNiOiWm" => "LiveRamp",
     1337    "Ub9GLCn2Q" => "LiveRate",
     1338    "gkAMkDthN" => "Livereach",
    571339    "KpU9UXKjc" => "Livestorm.io",
     1340    "ryTKg9Vjdibm" => "LKQD",
     1341    "gqlgap7z" => "Loadbee",
     1342    "wlw9L37WhiR0cD" => "Locally",
     1343    "NnzcTZOVY" => "Localsensor",
     1344    "dysR7qv-pDSNJY" => "Localytics",
     1345    "Byr8gcEidiZQ" => "Location Sciences AI",
     1346    "91Upq6kl0" => "Login with Amazon",
     1347    "YPfKe97FZUx-Ve" => "LogRocket",
     1348    "HkdUgcUJE" => "Lokale Internetwerbung",
     1349    "UbQqceRWO" => "Lokalleads",
     1350    "An5QLDtKdj0xm4" => "Loom",
     1351    "Sgkhva2fl" => "Loopingo",
     1352    "ryMzxqNjujZQ" => "LoopMe",
     1353    "_asujRjnh5cKeW" => "Loqate",
     1354    "9sO0BIT2L" => "LotaData",
     1355    "BkpMg9NidsZ7" => "Lotame Solutions",
     1356    "whVd0dVxDf0z-8" => "LoyaltyLion",
     1357    "Cl5QZ8H3D" => "LoyJoy",
     1358    "NNjm99KyT" => "LTS (Landesverband der Tourismusorganisationen Südtirols)",
     1359    "MDcI496A3" => "Lucid Holdings",
     1360    "EIAR4eOXr" => "Lucky Orange",
     1361    "k87Dze248BM6A_" => "Luigi’s Box",
     1362    "wajcSFWhjyXa4Y" => "Lunio",
     1363    "j71PcgQVV" => "LUX Marketing Automation",
     1364    "tLcW3mJYZk6RDO" => "Lyft",
     1365    "OV4ohrdfO" => "m-pathy",
     1366    "S1Jbl9EiOo-7" => "M32 Media",
     1367    "uhH_E-xE0W0A2U" => "Mable.ai",
    581368    "ukU5jpn0K" => "Machineseeker",
     1369    "ukrh2nEMY" => "Madington",
     1370    "S1Veeq4oOjbm" => "Madison Logic",
     1371    "rk_QecEoui-X" => "MADVERTISE MEDIA",
     1372    "f8YBSIync" => "Magebird",
     1373    "harQzo_Qz" => "Magento",
     1374    "Hk6V3Z367" => "Magento Persistent Shopping Cart",
     1375    "3csbuOW2G" => "Magic Toolbox",
     1376    "TIA_KQy80" => "Magnite",
     1377    "wG7JE3IK" => "Magnolia CMS",
     1378    "SJggqNsOi-m" => "Mailchimp",
     1379    "Hb4cXZ62" => "MailerLite",
     1380    "hMBCbMMRj" => "Mailgun Technologies Inc.",
     1381    "-y8Iryeh" => "Mailingwork",
     1382    "njy_AxqKG" => "Mailjet",
     1383    "Rb9_GOhdl" => "Mailmunch",
     1384    "xvQ9rrBdK" => "Mailocator",
     1385    "CvYyhHihHVjzsX" => "mailworx",
     1386    "HJWse9Es_sWX" => "mainADV",
     1387    "T7Dp7SESu" => "Mairdumont Netletix",
     1388    "DeK0Hv2ii71Lt6" => "Make",
     1389    "Ek1i784CL" => "Mandrill",
     1390    "Bk0CpKIkN" => "Map and Route",
    591391    "U8QkTd2W" => "Mapbox",
     1392    "QmkqgbGhi" => "Mapp",
     1393    "30sq7vsLd" => "Mapp Intelligence Anonymous Tracking",
     1394    "Ouzxu26Rv" => "Mapp Intelligence Full Feature Tracking",
     1395    "HpFI85vq-" => "Mapp Intelligence Tag Integration",
     1396    "RO1d0uR2fCybGj" => "MapTiler",
     1397    "qySmlP-Vg" => "Maptoolkit",
     1398    "IKEv1F3uL" => "Marfeel",
     1399    "r1Pae9VjusbQ" => "Marfeel Slutions",
     1400    "ISdS_fz6apf_0L" => "Marker.io",
     1401    "fJGKXqdGb" => "Market Resource Partners",
     1402    "BqrjsapwE7B08L" => "Marketing Cloud Einstein",
     1403    "rkBBg94sdiW7" => "Marketo",
     1404    "B1Z8aG07Q" => "Maßnahmen für Werbung und Remarketing",
     1405    "v8O815I--b-cCs" => "Mastercard Masterpass Checkout",
     1406    "S1We94i_oZ7" => "MaTelSo",
     1407    "Ez5p9gJN0" => "Mathtag",
    601408    "zqWojrT0P" => "Matomo",
    611409    "u6fxocwTs" => "Matomo (self hosted)",
     1410    "vtoY2LcrVB4gHm" => "Matomo Tag Manager",
     1411    "B1a0x54jdiZX" => "Matomy Media",
    621412    "7bFNv7DLf" => "Matterport",
    63     "SJ6xqVidi-X" => "Media Math",
     1413    "WZLx_vBAc5RyAP" => "MATTRZ",
     1414    "pwrC1OMft" => "Mautic",
     1415    "kLzaFClx3VhlBb" => "Maven360",
     1416    "MshQNhTYu" => "Maximus",
     1417    "H627Q19Ki" => "Maximus Live LLC",
     1418    "qCSlzFQB" => "MaxMind",
     1419    "Hyhgq4sOs-m" => "Maxymiser",
     1420    "rJlGx5Nidi-m" => "Maytrics",
     1421    "cK1mt5-o8v2-n6" => "Maze",
     1422    "qJcqahB57" => "MBR Targeting",
     1423    "O2r8FJT1x" => "MBR Targeting",
     1424    "XW5k34f8D" => "Meazy",
     1425    "dT7B8jWWx" => "Medallia",
     1426    "ByJLxcEidi-7" => "Media.net Advertising FZ",
     1427    "PrIbCsXKXhIW7M" => "media.ventive GmbH",
     1428    "SJ6xqVidi-X" => "MediaMath",
     1429    "ajpf8UKi" => "Medianest",
     1430    "YpOIHF5QF" => "Mediards",
     1431    "QKvvrc0tp" => "mediarithmics",
     1432    "HJUDeqVouob7" => "Mediasmart Mobile",
     1433    "QNbB6Hh1c" => "Mediaventive - Performance Channel",
     1434    "dtbMASFU35tp0m" => "Meetfox",
     1435    "SJyyb9Ei_i-7" => "Meetrics",
     1436    "cyt4lSUfdIXHXK" => "mein.toubiz #elements",
     1437    "Hm1WEDosEsNT9h" => "Melibo",
     1438    "AySJdLTYA" => "Meltwater",
     1439    "OV7USFA2A" => "MentionMe",
     1440    "Hy8srQ1NX" => "MessengerPeople",
     1441    "J05PmJuvt36qTe" => "Meta Pixel",
     1442    "kzjRvWOMlxuf63" => "Meta Pixel Advanced Matching",
     1443    "tq9_N4UgZ4PbEC" => "Meta social plug-ins",
     1444    "fcI2orHMJ" => "Meteonomiqs",
     1445    "x6_ma5zhCB77Nx" => "Metricool",
     1446    "rkRAg94jdjWm" => "MGID",
     1447    "4kJyPLaV2" => "MicroMovieMedia",
     1448    "BkeKqEjuoZQ" => "Microsoft Advertising",
     1449    "dsS7z9Hv4" => "Microsoft Advertising Remarketing",
     1450    "XB0GBAmWEQ7Spr" => "Microsoft App Center",
     1451    "PrLTkYnq" => "Microsoft Azure",
     1452    "rmmkUdkcF" => "Microsoft Bookings",
     1453    "0XIfeH9qx" => "Microsoft Bot Framework",
     1454    "jzMEq56vW" => "Microsoft Clarity",
     1455    "EOF_F-ezQ" => "Microsoft Conversion Tracking",
     1456    "dUzxiHb6Q" => "Microsoft Conversion Tracking",
     1457    "31OpY_Rd1dJTKf" => "Microsoft Dynamics 365",
     1458    "IlIwO5vXHCMore" => "Microsoft Dynamics 365 Customer Insights",
     1459    "M9Nj9klGy" => "Microsoft Dynamics CRM",
     1460    "J1gBN9Q0PBFEMj" => "Microsoft Enhanced Conversions",
     1461    "s-jP9Kxa1" => "Microsoft Forms",
     1462    "00xb_vkGq" => "Microsoft Omnichannel",
     1463    "2AMblLg3I" => "Microsoft Remarketing",
     1464    "l5j0HxFqd" => "Microsoft Remarketing Conversion",
     1465    "sCZcGGgbJ2HWIe" => "Microsoft SharePoint",
     1466    "j0Avo0TiCxkRW8" => "Microsoft Sway",
     1467    "G9mTwsAcP" => "Microsoft Teams",
     1468    "cPmgADKv" => "Midas-network",
     1469    "_hV5dqnpKeOQNh" => "Mindbody",
     1470    "Ms6JA9Xtr" => "Mindbox",
     1471    "7v_Mn--q_" => "Mindbreeze",
     1472    "rkL9c4i_sW7" => "MindTake",
     1473    "E6AgqirYV" => "Mintegral SDK",
     1474    "MPeKZ-_89" => "Minubo",
     1475    "S1SQxqViOoWX" => "MiQ",
     1476    "aC63kDbno" => "Mirando",
     1477    "rkSKecEi_sW7" => "Mirando & amp",
     1478    "WLykcwG3u" => "MirrAR",
     1479    "ZLmgJFVK7" => "Missena",
     1480    "d-6PZM5hs9NdOo" => "Mistplay",
     1481    "6DErRaKm0m6N66" => "Mitek MiSnap",
     1482    "5FNHm-uj5" => "Mittwald",
     1483    "8Gvo_h2Qd" => "Mittwald CM Service GmbH & Co. KG",
    641484    "4UGBLUJUN" => "Mixcloud",
     1485    "rkUK5EsOsWm" => "Mixpanel",
     1486    "N5uvpK-j" => "Mixpanel",
     1487    "w2ZQ7uy-F" => "Moat",
     1488    "S1qqeq4oOsWQ" => "mobalo",
     1489    "SJ-KqViOj-7" => "Möbel.de",
     1490    "wqtPHyrXz" => "Mobfox",
     1491    "ElDYt1RdN" => "mobilApp Face2Face",
     1492    "oOSi59gyP" => "Mobile Journey",
     1493    "B1Hnlq4ido-X" => "Mobile Professionals",
     1494    "OEXRoXIU5" => "mobile.de Ratingwidget",
     1495    "VPSyZyTbYPSHpF" => "MobileFuse",
     1496    "EHXPzs_EI" => "Mobilewalla, Inc.",
     1497    "eHZ7kxgTA" => "mobsuccess",
     1498    "sf09FFoYV" => "Mobusi Mobile Advertising",
     1499    "GSkFelKJW" => "Moebelix (Möbelix)",
     1500    "Yd407miCX" => "Moemax (mömax)",
     1501    "sQj54uQRhTIydb" => "MoEngage",
     1502    "DTG2HYCG-" => "moin",
     1503    "DXrpyA5c" => "mollie",
     1504    "p0b03PgiffqmVQ" => "Moloco Ad Cloud",
     1505    "MEC7egXDb" => "Monet Engine",
     1506    "5z9PmqMLFGdFpH" => "Monetate",
     1507    "sFO4O-1jS" => "Monotype - Web Font Tracking",
     1508    "g6P2QSiL" => "Moodle",
     1509    "m_hq1fmBw" => "Mopinion",
     1510    "asj2W6ayi" => "MoPub",
     1511    "QxRYWv5Un7Qt9g" => "Morayne",
     1512    "rJgz9Nj_o-m" => "Mouseflow",
     1513    "-aZCjz9q6" => "Movinga Affiliate Programme",
     1514    "ASCgon9qg" => "MovingImage",
     1515    "Nrr2EkxPm1TEEi" => "Mozaik App",
     1516    "r1OI9EjdjWX" => "MP Newmedia",
     1517    "0UlsDKnXZYxJt2" => "mParticle",
     1518    "HkPlxcNjdiWm" => "mPlatform",
     1519    "B1QLcNsujb7" => "MPNew Media",
     1520    "p1R8Y8LKN" => "MSO Digital",
     1521    "qEyFq-wLS" => "MTCaptcha",
     1522    "Tc6Kcc4x" => "Multiconnect",
     1523    "GThDWmHZqyFXWH" => "Munchkin",
     1524    "WszJp1rdV6DcVb" => "Mux",
     1525    "f_zaWX7mB" => "my.com",
     1526    "S1zkWcVi_oWm" => "My6sense",
     1527    "6hrW9SIEz" => "myclimate",
     1528    "TgQQ_7vG" => "MyFonts",
     1529    "aA58s2wH" => "MyFonts Counter",
     1530    "6Kri8R7YN" => "Myhotelshop",
     1531    "UuZ8TZaDEZ0ieL" => "MyNewsDesk",
     1532    "vmiLms-lD" => "Myntelligence",
     1533    "DCPRuvbW9JNl9o" => "Myra Security",
     1534    "ez0g7yzny" => "MySQL",
     1535    "S0i4seKvH" => "myTarget SDK",
     1536    "bxAsF3_QIKPzIV" => "myTracker",
     1537    "46In7qkId" => "MyTraffic",
     1538    "dO_4AQnvq" => "myvisualiq",
     1539    "r1Xgl9NjOiZ7" => "N Technologies",
     1540    "Bytrq4suoWQ" => "namecheap",
     1541    "rkRGx54sOsbm" => "Nano Interactive",
     1542    "Bf10TXRhw" => "Nativo",
     1543    "IKYHCoHcZHbo3z" => "Navattic",
     1544    "XLKA6E3pa" => "Navdmp",
     1545    "auPCN9tDL" => "Navegg",
     1546    "N2vwT-gQn" => "Naver Analytics",
     1547    "r1uh5Es_sZ7" => "Nayoki",
     1548    "DODaHKMSN" => "Near",
     1549    "9Bdi4IkPi" => "Near Pte Ltd",
     1550    "m4c9HetowgSdWb" => "Nearest",
     1551    "twRDa3OIX" => "Neccton",
     1552    "iVpNpvjDe" => "Neodata",
     1553    "Uu7TSzcsV" => "Neodata Group",
     1554    "r1DpCbD4Q" => "NEORY",
     1555    "MNzdVMVOa" => "Netdna-SSL",
     1556    "zp6C6pVg7" => "netID",
     1557    "u6zRdbuSRm68CQ" => "netID Privacy Settings",
     1558    "gxeBVKiMaS1f4I" => "netID Privatsphaere-Einstellungen",
     1559    "rkhNcEiOiWm" => "Netigate",
     1560    "H1mYx54sOjWm" => "Netsprint",
     1561    "S13Wec4oOj-m" => "NetSuccess",
     1562    "cg4DF2Tf3" => "netzeffekt",
     1563    "H1mJlcEoOsWQ" => "NEURAL.ONE",
     1564    "zWcIXL1Vo" => "Neustar",
     1565    "obaJPtBH-" => "Neustar on behalf of The Procter &amp; Gamble Company",
     1566    "rJMsqEj_iZQ" => "New Relic",
    651567    "SJ_6Qo9DJ" => "News Anwaltblatt",
    66     "ctDbl6j2y" => "Onlyfy",
     1568    "1KYWj02vF" => "News IQ",
     1569    "MsFie1C8" => "Newsletter2Go",
     1570    "Kvst06Fp6" => "Nexcess Edge CDN",
     1571    "67jCxq477" => "NEXD",
     1572    "rJvn9Ei_i-m" => "NeXeps",
     1573    "9QzVFkXfuKGQDq" => "NextLevel Defend",
     1574    "rkBaq4j_jZX" => "NextPerformance",
     1575    "kX5CQ9GyhBOw4d" => "NICE inContact",
     1576    "F2ydLVmlw" => "Nielsen Audience Measurement",
     1577    "jNl0iqYyR" => "Nielsen Marketing Cloud",
     1578    "OECc5DF7N" => "Ninja Forms",
     1579    "Rz9YZM2_q" => "NitroPack",
     1580    "YIIh84btf" => "Nobilia",
     1581    "vyO2xoFlk" => "Nosto",
     1582    "_NP347b6x" => "Novomind",
     1583    "cacONmLO0y2Vs2" => "NPAW",
     1584    "HJQo5EjOoW7" => "nr-data.net",
     1585    "WNxVOkJj6Bd8Lf" => "Nudgify",
     1586    "H1zqqVjOjZ7" => "Nugg Ad",
     1587    "I8nSaqdpx" => "Numberly",
     1588    "xJtOMgc-4" => "o9",
     1589    "sq_4H0evI" => "o9 Solutions",
     1590    "rJEIq4suiWQ" => "Oath",
     1591    "UD9IMlWyy" => "Oct8ne",
     1592    "M8wnlqZvUAkxEv" => "odeeo",
     1593    "90nYEa22C" => "Odoo",
     1594    "j-5dzGJY_" => "Odoscope",
     1595    "QO4LqnO8l" => "Ogulo",
     1596    "rJ-vecVo_s-m" => "Ogury",
     1597    "L_bj20Jo1OWggP" => "Okendo",
     1598    "W_5gGyZbH" => "Okta",
     1599    "uM6Xg1b-5" => "Oktopost",
     1600    "q7WZXgONy" => "Olark",
     1601    "LNxiCu4IM" => "Omnicom",
     1602    "CVgj3mZSSWNCJZ" => "Omniconvert",
     1603    "6fvpak_ta" => "Omnisend",
     1604    "GEGzlSe9N" => "Omniture",
     1605    "7O1UQJ3fESc3Ld" => "OMQ",
     1606    "Hy4uqVsuiWX" => "OMS Nativendo",
     1607    "Sy05g5NodsWQ" => "On Device Research",
     1608    "tqc3yijj8rf1JC" => "Onapply",
     1609    "O-K_7XAEd" => "OnAudience",
     1610    "bDNvyjTof" => "Onboard",
     1611    "4YyVB9Jh91uLQ-" => "Onclusive",
     1612    "OiFuV1hpk" => "one.com",
     1613    "ZZSNphdpA" => "Onedash",
     1614    "RVtztac32h7njd" => "OneFootball Player",
     1615    "_SUFlQuxf" => "OneSignal",
     1616    "BkgueqNjuo-m" => "OneTag",
     1617    "pd-3srkxrnEqFL" => "OneTrust",
     1618    "b2hQkv9wp" => "Onlim",
     1619    "PKJPsVvrW" => "Online Solutions Group",
     1620    "ctDbl6j2y" => "onlyfy",
     1621    "-CprOBtOX" => "OnMacOn",
     1622    "HJcteqEiuiWm" => "Onnetwork",
     1623    "saIWttSqY" => "onOffice",
     1624    "gYmzZn2CH" => "Ooyala",
     1625    "PGmWNqGwK" => "Ooyala (formerly Videoplaza)",
     1626    "DaPDMRM49" => "OPAC",
     1627    "xh-l8DkyC" => "Open AdStream",
     1628    "nTiHcYnDd" => "Open as App",
     1629    "W1pThiOU-6QLon" => "Opensignal",
     1630    "j7Igy6o8D" => "OpenStreetMap",
     1631    "IUvZYr7UZ" => "OpenTable",
     1632    "ODw7zueQc" => "OpenWeather",
     1633    "HJIge94oOi-7" => "OpenX Software",
     1634    "tLtDHkQDe" => "Opinary",
     1635    "pNOkVRbV6" => "Opinion Stage",
     1636    "k5B3jAr_w" => "Opt-in Monster",
     1637    "7Y-9fkhVBOnDYf" => "Optibase.io",
     1638    "Pi633RLM" => "Optimise-it",
     1639    "3HtWcG9EbUQIRF" => "Optimise-it (Ströer X)",
     1640    "BJSN54susZX" => "Optimizely",
     1641    "-ZqBkrVsKC2rQp" => "Optimizely Data Platform (ODP)",
     1642    "Y1nveY7Vy" => "Optimonk",
     1643    "WKMwvSKm7jC3cL" => "Optimus – iPinYou",
     1644    "H1giW5JV7" => "Optin",
     1645    "HJI5SmLm7" => "Optin",
     1646    "SJZvUaJVQ" => "Optin",
     1647    "rkVxVS1NQ" => "Optin",
     1648    "MDWF9sj-6" => "optinmonster",
     1649    "PPpL7pXsf" => "OptinMonster",
     1650    "padROq-M" => "Optivo",
     1651    "rJx0x5VjujbQ" => "Optomaton",
     1652    "-TmM76s1U" => "Oracle",
     1653    "QM-Jo32tt" => "Oracle AddThis",
     1654    "HySP1b_1r" => "Oracle Infinity IQ",
     1655    "KRiD3iESUwRVKW" => "Orbitvu -  360° product photography",
     1656    "eAYrlt0w" => "Oribi",
     1657    "H1FnWqHRm" => "Oriel WordPress Plugin",
     1658    "SkNRl9NidjZm" => "Orion Semantics",
     1659    "H10Lx9Nj_sZm" => "ORTEC",
     1660    "H17uVFcVB" => "Otto",
     1661    "z2Q0N4jr-" => "Our World in Data",
     1662    "r1EWc4iuj-X" => "Outbrain",
     1663    "HkrZ5NjusWX" => "Outbrain Amplify",
     1664    "AH6TVUNbT" => "Outbrain Conversion Tracking",
    671665    "15h3IBCa8" => "Outdooractive",
    68     "nTiHcYnDd" => "Open as App",
    69     "j7Igy6o8D" => "Open Street Map",
    70     "pNOkVRbV6" => "Opinion Stage",
    71     "JiFH1ubU" => "Paypal",
     1666    "RZpG2ccmLg16fF" => "Outrank",
     1667    "RCd5jeTnb" => "Overheat",
     1668    "By159NoOjbQ" => "OWA",
     1669    "LAfacyOBx" => "Oxid",
     1670    "Md-L8ZYII" => "OXID eShop",
     1671    "IZ87SC9KA6YPy5" => "Oxomi",
     1672    "BAVEMPsb_" => "Paddle",
     1673    "wXZ9L7_OW" => "Pamyra",
     1674    "HWSNU_Ll1" => "Pangle SDK",
     1675    "4B62fWico" => "Paperform",
     1676    "VIpyP1_39" => "PaperG, Inc. dba Thunder Industries",
     1677    "xDD3hzjiB" => "Paqato",
     1678    "8VrQI_a0FQr9Fa" => "Parcel Perform",
     1679    "HkYd5VjOiZm" => "Pardot",
     1680    "sjAWaw1cW" => "Parse.ly",
     1681    "RL5JLZJfG" => "Parsec Media",
     1682    "FulJqehY" => "Partnerize",
     1683    "L4PbbiR2L" => "Passkit Wallet",
     1684    "hBNf9ZMYz" => "PassKit Wallet - Payments",
     1685    "JbpMzs3b-" => "Passolution",
     1686    "dno4UTZAH" => "PATHADVICE",
     1687    "xkX3CPY1ZRUcmD" => "Pathfactory",
     1688    "kLzLxy6IpXc1M1" => "PathMotion",
     1689    "hg8bm_ryN4QXRh" => "Payback",
     1690    "Gh7rn6Q3" => "Paydirekt",
     1691    "p9dKRzCQG1YDs_" => "Payever",
     1692    "XdHcWCbb6" => "Paylike",
     1693    "dj5raa82hsw1K3" => "Payment Icons by Spark Apps",
     1694    "dmhkr4BE" => "Payone",
     1695    "JiFH1ubU" => "PayPal",
     1696    "Ag4q4HEgK" => "PaySafe",
     1697    "8crQza5v6" => "PaySafe",
     1698    "FwJPIA--rtTBwb" => "Pearl Diver",
     1699    "SyVf9NousW7" => "Peerius",
     1700    "Db6tG4Q7z" => "Pega",
     1701    "E9HH0S6fn49xSa" => "Pendo",
     1702    "SyNFcEi_iZQ" => "Perfect Audience",
     1703    "B17neqNido-Q" => "Perform Media Services",
     1704    "B1hI9VjdjW7" => "Performance Advertising/Performance Profiles",
     1705    "V1ENirOT6" => "Performance Media Deutschland",
     1706    "c5jdEIoF" => "Performance Media UTT",
     1707    "HkII54i_s-7" => "Performance Werk",
     1708    "ryzIqVjdo-Q" => "PerformanceAds (über Neory)",
     1709    "JSp_jw2Dp" => "PerimeterX",
     1710    "-fYEmVEnP" => "Permaleads",
     1711    "r1W6ec4o_jWm" => "Permodo",
     1712    "BJiRlc4sOjZm" => "Permutive",
     1713    "SknCx5Njdi-m" => "Permutive",
     1714    "Vuy5t138I" => "Perseus",
     1715    "dGpMz-t3P" => "Personalics",
     1716    "NgXCCrOoE" => "Personalics| AR",
     1717    "mn077nDsD" => "Personalics| AU",
     1718    "U5oS-R63I" => "Personalics| BR",
     1719    "sbJyvmeqf" => "Personalics| CO",
     1720    "DnbYCtyZA" => "Personalics| NZ",
     1721    "fCQ-RsavU" => "Personalics| RU",
     1722    "QaV_DAWO6" => "Personalics| RU",
     1723    "Bg5a1Cx8N" => "Personalics| TH",
     1724    "c6rmTegQL" => "Personalics| TR",
     1725    "_eKXsIOaU" => "Personalics| ZY",
     1726    "o5siH7r7" => "Personio",
     1727    "PFvmDE69X" => "Personyze",
     1728    "iSYTvvtko95bht" => "Petal Ads",
     1729    "18wNuq2Q9" => "Pexi",
     1730    "IUs3PuZd-" => "PhotoEditor SDK",
     1731    "eZ7ZUhb8RcWBr1" => "PIA Advertising",
     1732    "B7dIEuvmU3N3Z5" => "PIA Media UTT",
     1733    "8pTth9A2B" => "Piano",
     1734    "Emcyk1Oc" => "picalike",
     1735    "o6gOrAuVP" => "Pilotx",
     1736    "E1RcKTp-i" => "pilotx.tv",
     1737    "lEAV2WxHj" => "Pimcore",
     1738    "rynr5EsujZQ" => "Pingdom",
     1739    "SkpB54sdiZQ" => "Pingdom (with Performance Tracking)",
     1740    "ozz3_rzr7" => "Pinpoll",
    721741    "9Q2qrmB3" => "Pinterest",
    73     "ze3Iyetr" => "Piwik Pro - Duda",
     1742    "hFsp0FZO1" => "Pinterest Ads",
     1743    "QIekDhgZRq1nIk" => "Pinterest Enhanced Match",
     1744    "hsyqb7Jk8" => "Pinterest Rich Pins",
     1745    "a_Dw7zFT7" => "Pinterest Tags",
     1746    "ZRIsJO12R" => "Pinterest Widget Builder",
     1747    "rL2ZmR7Wv" => "Pipedrive",
     1748    "ze3Iyetr" => "Piwik Pro",
     1749    "FFD0h7L9VZCA4m" => "Piwik PRO",
     1750    "0xw-O6TDwbm3gh" => "Piwik PRO (without cookies)",
     1751    "Z4KZxdWuV" => "Pixalate",
     1752    "6oW2boAdO" => "Pixfuture",
     1753    "B1kXg9NsOiWQ" => "PIXIMEDIA",
     1754    "TLuhGVXN" => "Pixlee",
     1755    "MczN3PJf0jdy4a" => "Plandisc",
     1756    "H12Se54jdj-X" => "Platform161",
     1757    "D1VA0cn81" => "Plausible Analytics",
     1758    "ZAjjjV-N8HTrPz" => "Playable",
    741759    "cv9bw3QAq" => "Playbuzz",
     1760    "9eJHT4SVg" => "Playground xyz EMEA",
     1761    "oviePVHrThIzCI" => "PLCrashReporter",
     1762    "ByDEc4sOjbm" => "Plista",
     1763    "sZAqOmbXv" => "plyr.io",
     1764    "cQ9G55y1T" => "Podbean",
     1765    "MQdVb1Ths" => "Podcaster",
    751766    "nhLMP6qX" => "Podigee",
     1767    "QrBxtTBc" => "Podlove",
     1768    "B1enx94idi-Q" => "Polar Mobile Group",
     1769    "jn7PuNE7ryR50p" => "Pollfish",
     1770    "_YzvH8nm2" => "Polyfill",
     1771    "qu0LnIaEx" => "Polylang",
     1772    "-At_u-eGh" => "poptin",
     1773    "UIYX_IrT67qCy6" => "Popupsmart",
     1774    "1nLXz6_jQwTVQj" => "PostFinance",
     1775    "V-HDotieTmnIIE" => "Powerfront",
     1776    "SJaix54sOsWm" => "PowerLinks Media",
     1777    "pAFmwQtUE" => "Powerspace",
     1778    "q0KL21Inu" => "POWR",
     1779    "EErS5Csc2gexDK" => "Prebid",
     1780    "MJB4jjb2m" => "Predicio",
     1781    "PRiMfNq9AmjBUL" => "Prenly",
    761782    "Sy1naC5nN" => "Prescreen",
     1783    "yX_RJArXk" => "Prestashop",
     1784    "LTzbMGXbB" => "PREX Programmatic Exchange",
     1785    "sXv0xv6Yg" => "Price Spider",
    771786    "FB_cLNwjQ" => "PriceHubble",
    78     "Hko_qNsui-Q" => "reCAPTCHA v1/v2/v3",
     1787    "cpdk77FuK" => "PriceSpider - Where to buy",
     1788    "ukt9D2w0slYSve" => "PRIMAVERA Affiliate",
     1789    "BJP9l9VsOjW7" => "Primis Tech",
     1790    "TKSllwIah" => "Prisjakt",
     1791    "U7QP-YYXyp5dqT" => "Prismic",
     1792    "6I5EMvvT" => "Privy",
     1793    "ChYBnsIC" => "ProductsUp",
     1794    "S-NGEvTX" => "Profity",
     1795    "oMwRt9S6b" => "Programatica de publicidad S.L.",
     1796    "NVE2j0evx" => "Prospect Herkenning",
     1797    "rk7gq4ous-7" => "Proven Expert",
     1798    "lAupl5pjM" => "Proxi.cloud",
     1799    "LKrQnwfhc" => "Proxistore",
     1800    "Wut37MVpc" => "Prudsys",
     1801    "St3XajXXd" => "Psyma",
     1802    "ROECN-Tyg" => "PUB OCEAN LIMITED",
     1803    "1kHrJq8Xf" => "Pubfinity",
     1804    "Hy2Ul5ViuoWX" => "Publicis Media",
     1805    "uMYoFacdK" => "Publishers Internationale Pty",
     1806    "ux1WtRswgXpWjg" => "Publitas",
     1807    "HEgfggF6K" => "Publizon",
     1808    "Bym-eqViuo-X" => "PubMatic",
     1809    "rA6pW36V6" => "PubNative",
     1810    "8YiTreu69" => "PubNub",
     1811    "SyaxeqEi_oWX" => "PulsePoint",
     1812    "Bk3ke9EoOjbX" => "Purch Group",
     1813    "fVenI8qZaiSDea" => "Purchasely",
     1814    "8tlwKrz7nBRwqd" => "Purchasely (analytics)",
     1815    "8qm4v7INutTL5q" => "Puriphy",
     1816    "BjEeUdoqs" => "PurposeLab",
     1817    "6x7O_cifFWqG8K" => "PushAlert",
     1818    "YGm2DPCil" => "PushEngage",
     1819    "wk2G_sYvM" => "Pusher Channels",
     1820    "4TKnHohTW" => "Pushpanda",
     1821    "Rhtsr8xYL" => "PushPushGo",
     1822    "I1BtuRjhnMkx0T" => "Pushwoosh",
     1823    "mrhx7zrre" => "Q division",
     1824    "l7ugIzopI" => "Qriously",
     1825    "pbFdS9IDl" => "Qualaroo",
     1826    "UWP2ySm2" => "Qualifio",
     1827    "O3yJTmq2cFZi7R" => "Qualimero",
     1828    "UsJU9k1K" => "QualityClick",
     1829    "0QVzRHXZX" => "Qualtrics",
     1830    "nfWrRs_XrJzPPW" => "Quanos",
     1831    "rkd49ViuoWQ" => "Quantcast",
     1832    "By0R9EjOo-7" => "Quantcast International",
     1833    "RHM3MD-dj" => "Quantum Advertising",
     1834    "LgERgxPgV" => "Quantum Metric",
     1835    "bbIs1mTX" => "Quantyoo",
     1836    "1ba4yQk0W" => "Qubit Opentag",
     1837    "onZhj5dcS" => "questFON",
     1838    "BlCRucxYKUN24b" => "Queue-it",
     1839    "ByvlGc5Rm" => "Quibit Opentag",
     1840    "cWXfgtNb78StQ2" => "Quick Polls",
     1841    "vB4wCpDc4WHSI3" => "Quickchat AI",
     1842    "VntU07p5kt4ixN" => "QuinBook",
     1843    "wtNtlXMxU_jv1k" => "Quizell",
     1844    "7AevQBoe" => "Quora pixel",
     1845    "Bymslc4iuib7" => "Qwertize",
     1846    "mM03_dNAW" => "R-Advertising",
     1847    "E1PsKwwrnI7bh2" => "RadimDienst",
     1848    "AydEzuFOw" => "RadioKing",
     1849    "QsbWW7EG" => "Radioplayer",
     1850    "HyqWxcEidoWm" => "Rakuten Marketing",
     1851    "qkz61GF-" => "rapidmail",
     1852    "_gSpdOB_t24AdV" => "Raptive",
     1853    "3YCp1ywWCtQZyp" => "Raptor Services",
     1854    "b2SmwZic" => "RatePay",
     1855    "lZWfdL45y" => "Raute Musik",
     1856    "9bTrLVvcd" => "Ravelin Mobile SDK",
     1857    "SkMETCDgN" => "RawGit",
     1858    "-umDZrwm6" => "RAWR",
     1859    "BAvtRUiRy" => "Raygun",
     1860    "Zwg-7XqvakSTNv" => "Razorpay",
     1861    "bBw1uQaNp" => "RD STATION",
     1862    "ZdLT87Qd" => "re:amaze",
     1863    "veqs-kAz4" => "Reachnet",
     1864    "o1FozBbqhgx3bN" => "React Native Firebase",
     1865    "H1f2xc4odj-X" => "Readpeak",
     1866    "ufhUMr6D2" => "ReadSpeaker",
     1867    "f7LFah18V" => "Realeyes OÜ",
     1868    "V0CshHa57" => "Realytics",
     1869    "dGPun6EbN" => "realzeit",
     1870    "SCRjaw0XPoMdSl" => "Rebuy",
     1871    "Hko_qNsui-Q" => "reCAPTCHA",
     1872    "cfADcn3E3" => "reCaptcha v3",
     1873    "QNqdZMWL0l_zKv" => "Recharge.com",
     1874    "ncJlxV2ywWo2vN" => "RecoBounce",
     1875    "S1Qe-Pn54" => "recognified-microConversion",
     1876    "h3nMfxCs7" => "Recolize",
     1877    "H_j03b6g" => "Reddit",
     1878    "ZglHJrjn" => "Reddit Advertising",
     1879    "5JKj-J9nH" => "Redintelligence",
     1880    "SyIP9Njdib7" => "Refined Ads",
     1881    "_SBGD5koD" => "Refiner",
     1882    "vYsMhlFj5" => "Reguest Messenger",
     1883    "M66CCVZlE" => "ReigNN Platform",
     1884    "ibuf4p3P" => "releva.nz",
     1885    "7PmlLEs2t" => "ReMailMe",
     1886    "rkjDe94oui-X" => "remerge",
     1887    "gTYHewBsK" => "Remintrex",
     1888    "H1j9cEoOi-m" => "remintrex.com",
     1889    "0jco2jXId" => "Reonic",
     1890    "qxQaPHctt" => "Reppublika",
     1891    "PXcN3Ui_H" => "Research and Analysis of Media",
     1892    "vKwiCret2" => "Research International",
     1893    "HkbKeq4o_oZm" => "Research Now Group",
     1894    "zy78g-j8KmE0gf" => "resmio",
     1895    "193T921PXm" => "Resolution Media smartTracking",
     1896    "7cPw4kU75" => "retailAds",
     1897    "yGf7yJQfkQaKS_" => "Retarget Online Ads",
     1898    "_sJYRyHIwToAJM" => "retargeted.ai",
     1899    "6_AoTqxaRDHK-Z" => "ReturnGO",
     1900    "r1sKg9VoOjW7" => "Revcontent",
     1901    "SJp7xc4iOoWm" => "Reveal Mobile",
     1902    "2LQcBGGtLPkeZx" => "RevenueCat",
     1903    "5buNZ_jBP" => "Reviews on my website",
     1904    "UN5TbrOXlDB1wG" => "Reviews.io",
     1905    "Wq0D2klq" => "Revive Adserver",
     1906    "OheZEKjS_" => "RevJet",
     1907    "wbhw2dV3G" => "RevLifter",
     1908    "QtkhD3Pi6i_j-J" => "Revscale AI",
     1909    "_-TUZWgAe" => "RevX",
     1910    "HymNBQk4m" => "Rexx Recruitment",
     1911    "ByoLgqVo_i-m" => "Rezonence",
     1912    "H1oll9Njui-X" => "RhythmOne",
     1913    "H1wzlq4idoWm" => "Rich Audience",
     1914    "pl3anzrRv" => "Riddle",
     1915    "U4ZIzraAi3LxA2" => "RingCentral",
     1916    "eO9JKghU6" => "Riskine Chatbot",
     1917    "J6nsg-J4U" => "Ritzau",
     1918    "t1xCHtccq30hUI" => "Riverty",
     1919    "9NUDWWc6l" => "RMSi Radio Marketing Service interactive",
     1920    "HkLplcNjdiWm" => "Rockabox Media",
     1921    "SkhPxcNouoW7" => "Rockerbox",
     1922    "BJiLqVo_i-m" => "Rocket Fuel",
     1923    "yTeUMhYeyD9YrO" => "Roku",
     1924    "HylJecEoOsbQ" => "Roq.Ad",
     1925    "FUpg_dxj2uaKzo" => "Roxxad",
     1926    "B1Ayg5Es_s-X" => "RTB House",
     1927    "4nDnFKAvHCBrwV" => "RTB House - Enhanced Conversions",
     1928    "H18p9NjOjZQ" => "RTB Markt",
     1929    "HJOdlqVsOjWm" => "RTK",
     1930    "M3Tjth_cjh-29B" => "RudderStack",
     1931    "9wX039_lO" => "RUN",
     1932    "K67zfwHGU" => "S-Public Services",
     1933    "BJV2xq4idsZQ" => "S4M",
     1934    "fjijtSPA" => "Saferpay",
     1935    "uCqSi0hm" => "Sajari",
     1936    "te8pKz1mP6gdIS" => "Salenti",
     1937    "K7AsmUJ265KOlw" => "salenti GmbH",
     1938    "RTLA4o2i1-ia2L" => "Sales Cloud Einstein",
     1939    "d_5HNF7Yc" => "Salesforce",
     1940    "-tsNPQtMM" => "Salesforce Audience Studio",
     1941    "vLUpOAxR" => "Salesforce Audience Studio",
     1942    "VTR8E9ZL5" => "Salesforce Chat",
     1943    "WTYMoieIB" => "Salesforce Commerce Cloud",
     1944    "hku02w1qx9YLjR" => "Salesforce Commerce Cloud Einstein",
     1945    "D2cQY5lPghyteN" => "Salesforce Data Cloud",
     1946    "IQMIegSQF" => "Salesforce Interaction Studio",
     1947    "lgXw0VvDj" => "Salesforce Live Agent",
     1948    "Cf2NHO6q5" => "Salesforce Marketing Cloud",
     1949    "lX960FalA68X38" => "Salesforce Marketing Cloud Account Engagement",
     1950    "wFxuQvYX8MhkWv" => "Salesforce Marketing Cloud Personalisation",
     1951    "5VMTG-ihf" => "Salesforce Marketing Cloud Platform SDK",
     1952    "8Sp6myo2" => "Salesmanago",
     1953    "Gd0bshOBs" => "SalesViewer",
     1954    "1dBEu_-G9" => "Samba TV",
     1955    "ysjzW_WYo" => "Samba TV UK",
     1956    "fz4U3rgPW" => "Samedi",
     1957    "iVSrfIuRjlKTE8" => "Samsung Pay",
     1958    "t0mg4QEts" => "Sanoma",
     1959    "BJUKgqNoOiZm" => "Sanoma Media Finland",
     1960    "JKFeC1o3L" => "SAP Commerce Cloud",
     1961    "zbnIgVJ7L" => "SAP Customer Data Cloud",
     1962    "nhuKp2VDxEIrfq" => "SAP Intelligent Selling Services",
     1963    "FonOilDmI" => "SAP SuccessFactors",
     1964    "wj4bKa72Og-Ao9" => "Sardine.ai Device Intelligence",
     1965    "ixbmcJR2z" => "ScaleMonk",
     1966    "JaB_qsJk0" => "Scanblue",
     1967    "SkhG5EiOjZ7" => "Scarab Personalized Ads",
     1968    "_PDFz0c6-" => "Scarab Research",
     1969    "NsaxqX_hah-qfW" => "Scayle",
     1970    "S11eg9EjdjW7" => "Scene Stealer",
     1971    "Qj4tFgzD1" => "Schedule Demo Form",
     1972    "HSmRlcKuL" => "Schibsted",
     1973    "dDpujlqia" => "Schibsted Product and Tech UK",
     1974    "SyX95Eodi-Q" => "Scorecard Research",
     1975    "l4w2eXcvO" => "ScreenOnDemand",
     1976    "DHS2sEi4b" => "Search Ads 360",
     1977    "--kY7PHHl" => "SearchHub",
     1978    "ByZk-qVj_sZX" => "Seeding Alliance",
     1979    "Hkq7eqEj_ibm" => "Seedtag Advertising",
     1980    "JMsFnFMX2" => "Seenthis",
     1981    "O97xcRJFR" => "Segment",
     1982    "ByKyW9Ni_sZX" => "Segment.io",
     1983    "p6WMXrd8O" => "Segmentify",
     1984    "Brj0m8FfV" => "Selit Produktfinder",
     1985    "0rhoGZi2z" => "Selligent",
     1986    "Syu8e5Nouj-7" => "Sellpoints",
     1987    "rJNLgqEidib7" => "Semasio",
     1988    "ASSQFNQYB" => "semknox",
     1989    "Y7U73xDqH" => "Sendbird",
     1990    "JH-hXkWhk" => "SendGrid",
     1991    "oozO4Himv" => "Sendinblue",
     1992    "6moU2ZMVJ" => "Sendpulse",
     1993    "2lK0qen63VUUjL" => "Sensors Data",
     1994    "rH1vNPCFR" => "Sentry",
     1995    "IBUUElGXQ" => "Service-Chat NRW",
     1996    "rcL95kb3d" => "Seznam",
     1997    "RHq8V_JEP" => "Sezzle",
    791998    "B1639EiOs-7" => "ShareThis",
     1999    "B13glqEsOiZm" => "Sharethrough",
     2000    "alWL-1Ah-" => "Shariff Wrapper",
     2001    "ZO_66uRS7D-wV4" => "Sherpa",
     2002    "1O5D3XaL" => "Shipcloud",
     2003    "BWv175brAL0uSK" => "ShoeAI",
     2004    "jkCDUWD-U55JT3" => "Shop Pay",
     2005    "7biaTe2Aq" => "Shopalyst",
     2006    "QWdMfFJSrw85P7" => "Shopauskunft",
     2007    "BMs9IG0jx" => "Shopgate",
     2008    "r19SxcEs_o-X" => "Shopify",
     2009    "ZQOx-TM97Y3rLe" => "Shopify Analytics",
     2010    "1xNAouVLz" => "Shopify CDN",
     2011    "zixK7I8y1mhf1D" => "Shopify Marketing",
     2012    "T4PQQdTkrEofhd" => "Shopify Preferences",
     2013    "HqbXMnOcUaTVOQ" => "Shopify Product Reviews",
     2014    "_GO5yfszm" => "Shopify Storefront",
     2015    "BNMuzQjTe" => "Shopify Tracking",
     2016    "H1yt9Vsdib7" => "shopping24",
     2017    "oEKsiywjW" => "Shopstyle",
     2018    "9CfO0Zlo" => "ShopSync",
     2019    "JYW8pOMD" => "ShopVote",
     2020    "bt_SD1xU" => "Shopware",
     2021    "xXFRJRUUvCnYD3" => "Shopware Analytics",
    802022    "W0apH00t" => "Shore",
    81     "wkt-Vgmf7" => "Site Analytics - Duda",
    82     "8u-otMeLg" => "Site Personalization - Duda",
     2023    "SyZQgcEiujZ7" => "ShowHeroes",
     2024    "r1k9NOn5N" => "showheroes-microConversion",
     2025    "v5RU0B301" => "Sift",
     2026    "S1_4g54odoWQ" => "Sift Media",
     2027    "ryHRg5NoOibm" => "Signal Digital",
     2028    "Ub2GaUXtOJAkTV" => "SignalFx",
     2029    "m0XTF89HN" => "Signals",
     2030    "hStXBwHBZ" => "Simplecast",
     2031    "B1Zxe5EoOjbm" => "Simplifi Holdings",
     2032    "AnXv7C3G8yFHKP" => "SimplyBook.me",
     2033    "6pgVDH6Gec8UIb" => "Sinch",
     2034    "r928ZrE_0" => "Singlespot",
     2035    "PLYgpdqL7" => "SingleView",
     2036    "OxsYgtMfe7aP8u" => "Singular",
     2037    "uHT_iM2Pw" => "Sipgate",
     2038    "H1BxlqNs_i-7" => "Sirdata",
     2039    "wkt-Vgmf7" => "Site Analytics",
     2040    "8u-otMeLg" => "Site Personalization",
     2041    "WQaLkh_S7vX97i" => "Site Search",
     2042    "jB0PK7c11" => "Site Search 360",
     2043    "ryTAjE_nN" => "Sitecore",
     2044    "xzhTGdLgLBITjQ" => "Sitefinity Insight",
     2045    "HyCsIAwJV" => "Siteimprove",
     2046    "NT4pjQB3M" => "SiteSpect",
     2047    "0BpGJbtEU" => "SITU8ED",
     2048    "hUecQKeCcR8d65" => "Sizekick",
     2049    "SJH25No_oWX" => "Sizmek",
     2050    "hxGpiJBe-" => "SK Media Group",
     2051    "SAKiVpSK7USpIP" => "Skeepers",
     2052    "S1rWg5VsOsWQ" => "Skimbit",
     2053    "AO6etk8c-" => "Skirentalresorts",
     2054    "H1w654suoWX" => "Sklik",
     2055    "S1d6cEiuibQ" => "Sklik Conversion",
     2056    "HkK69Nsuibm" => "Sklik remarketing",
     2057    "4ZVaI4eEq5PV8z" => "Skyflag",
     2058    "xmU9xun5Osd5Lt" => "Skyscanner",
     2059    "goExmiSU_" => "Sleeknote",
    832060    "jhJqRRPUe" => "Slideshare",
    84     "lr0gmwVMY" => "Smart-rechner",
     2061    "pyS8WWsy3" => "Slido",
     2062    "B1Ifgq4odsZQ" => "SlimCut Media",
     2063    "PE9Ed3gets41WV" => "SlimStat Analytics",
     2064    "Byt-l54i_i-Q" => "Smaato",
     2065    "ByScgqVj_iZX" => "Smadex",
     2066    "HJLZqNi_iZQ" => "SMART AdServer",
     2067    "wMMcvc9VH" => "Smart Traffik",
     2068    "lr0gmwVMY" => "smart-rechner",
     2069    "14G4bs7jk" => "Smartclip Hispania SL",
     2070    "S1VvgcVoOs-7" => "Smartclip Holding",
     2071    "r1kS7uh5N" => "smartclip-microConversion",
     2072    "rkFWLTB9E" => "Smartlook",
     2073    "7EtqIjUsfcjX5g" => "Smartnews Ads",
     2074    "r1J_e5Vo_o-7" => "Smartology",
     2075    "HkTU364VQ" => "smartphoto",
     2076    "SJuil9EsdsZQ" => "SMARTSTREAM",
     2077    "Skljd5VoN" => "Smartsupp Chat",
     2078    "wd4FBU7FF" => "SmartTag",
     2079    "36ieROIp0" => "SmartyAds",
     2080    "PN62OUjSL" => "Smash Balloon",
     2081    "9xlKwSEzW5L8cD" => "Smile Points & Rewards",
     2082    "SJ8J-94sdob7" => "Smind",
     2083    "XQxLeJYgJGhitg" => "Smoobu",
     2084    "Aytn62TR" => "Snap Pixel",
     2085    "QcD9GVNXZ" => "Snapchat",
     2086    "s2NmgIZR" => "Snapchat Advertising",
     2087    "QyQDBoUQg" => "Snapchat Advertising|  BR",
     2088    "Vgv6UrFab" => "Snapchat Advertising| AR",
     2089    "-Ue0ZFXop" => "Snapchat Advertising| AU",
     2090    "xWnKQt3oW" => "Snapchat Advertising| CO",
     2091    "jq1wQFwhg" => "Snapchat Advertising| NZ",
     2092    "vOuHc-NPG" => "Snapchat Advertising| RU",
     2093    "xY7o0b9w1" => "Snapchat Advertising| TH",
     2094    "L2RgYWdWK" => "Snapchat Advertising| TR",
     2095    "TtCGGQDIR" => "Snapchat Advertising| TW",
     2096    "oqcTvme_4" => "Snapchat Advertising| ZY",
     2097    "MMH99u1RZD85L6" => "SnapEngage",
     2098    "ryo7lcEoOsW7" => "Snapsort",
    852099    "t-J9SUrOD" => "Snatchbot",
    86     "HyP_q4sdobm" => "SoundCloud",
     2100    "rk9hqEjujWm" => "Snazzy Maps",
     2101    "HJhd5Vodj-m" => "SnowPlow",
     2102    "4RDUc6rQCXeg2G" => "SociableKIT",
     2103    "FFHGOeImK6mYmb" => "Social Intents",
     2104    "7YQmKOWTZC3qFU" => "Social Media Icons by Powr",
     2105    "OuPgkQpTxx3WnQ" => "Social Media Stream",
     2106    "or3Fv0pUyCrNOq" => "Social Stream by Powr",
     2107    "C9j3siwSa" => "Social9",
     2108    "r1KU9EjOs-m" => "Sociomantic",
     2109    "dr7NVhfO" => "Sofortüberweisung",
     2110    "IVJaVuGhO" => "Softgarden",
     2111    "S14iecEjus-m" => "Sojern",
     2112    "qMiAvmQaRvZEvW" => "SolarWinds",
     2113    "nxPvymx_wmYVW9" => "Solute",
     2114    "J9Kke_pd" => "SOMA 2",
     2115    "Gm3wofk4X" => "SoMo Audience",
     2116    "Nqlc4OkV_1wCbn" => "Songkick",
     2117    "Sy6ug5Ei_sWQ" => "Sonobi",
     2118    "HyP_q4sdobm" => "Soundcloud",
     2119    "CkAdOlUti" => "Sourcepoint Technologies",
    872120    "Di_NMaFOX" => "Sovendus",
     2121    "SwfsIIp0w" => "Sovido",
     2122    "r1VJl9Eodj-X" => "Sovrn Holdings",
     2123    "t7HmZssR_" => "Spectrio",
     2124    "jmMFHnB6mrfk-e" => "Speed Kit",
     2125    "Sy7BxqEo_oZQ" => "SpeedCurve",
    882126    "1dU2WuKlq" => "Splicky",
     2127    "BJyte9Eodsb7" => "Spolecznosci",
     2128    "S1UO94s_j-m" => "Spoods",
     2129    "bpghsHfYq" => "Sportradar",
     2130    "6GGTzqxmW" => "sporttotal.tv",
     2131    "Syk9xqEjOjb7" => "Spot",
     2132    "r1Fdg5VidoZm" => "Spotad",
     2133    "rkTwqfqG4" => "Spoteffects",
    892134    "CguMb4Rq" => "Spotify",
     2135    "5UjJeo5b76bLbG" => "Spotify Pixel",
     2136    "ByLolcNs_i-m" => "SpotX",
     2137    "4wrpWvmJG" => "Spreaker",
     2138    "ib1Ev0zRq" => "Sprig",
     2139    "5B-RNJj74" => "Springserve",
     2140    "Hxzjma-sr4cVM2" => "Sprinklr",
     2141    "DKf7fKfS3" => "Squarelovin",
     2142    "D899zyhv" => "Squarespace",
     2143    "HJ5nxcEiOjZm" => "StackAdapt",
     2144    "1YtjwdeNS" => "StackPath LLC",
     2145    "b67YnSAu9CLgAu" => "Stape",
     2146    "ubNMO2xR0" => "Start.io",
     2147    "4_kDVB0G_" => "StartApp",
     2148    "lZ1Yj0x9eu-o4J" => "Stationista",
     2149    "dp5ilPzrh" => "Statscore",
     2150    "MEwyBx0CP" => "Statsperform",
     2151    "MXdXD1aLX" => "Statuspage",
     2152    "Byn9eqVouiW7" => "Steel House",
     2153    "DJKdYm2OT" => "StepStone",
     2154    "qZABWrf6" => "Stetic",
     2155    "t6wsB2fC_2sSOU" => "Störung24",
     2156    "lh6FOG7pr" => "Störungsauskunft",
     2157    "BkW7DxlpN" => "Storyblok",
     2158    "DZgkFbk_nmmNES" => "Storylane",
     2159    "pkhfgyEdb" => "StoryStream",
     2160    "Msopw0_StEf_bD" => "Strandbutler",
     2161    "H1qBqEsuoW7" => "STRATO",
     2162    "Pl56GO5A4GZxRO" => "StreamElements",
     2163    "ry3w9Vo_oZ7" => "Stripe",
     2164    "rkl-G_39E" => "stroeer-microConversion",
     2165    "BylXlqNjOiWX" => "Stroer",
     2166    "ZTcsIow_F" => "Ströer",
     2167    "fRgMuO9BL" => "Ströer Mobile Performance",
     2168    "kso842_9e" => "Styla",
     2169    "By62WruhN" => "Stylight",
     2170    "v09zSZYpp" => "Sub2 Technologies",
     2171    "KxVYGUG4yKjEsH" => "Subi",
     2172    "SkKNl9Vi_iZQ" => "Sublime Skinz",
     2173    "BI4Y-f3Wv" => "SunMedia",
     2174    "4NlDVAKQn" => "Sunnysales",
     2175    "bUoWvj7_8drtjq" => "Supademo",
     2176    "vSIINyq1z" => "Superchat",
     2177    "xLgL2b0bmU-RT_" => "Supersonic",
     2178    "GAM9YGKr" => "SurveyMonkey",
     2179    "8aGfNIzjr" => "Swiftype",
     2180    "Dr1UU3xeZEx72S" => "Swrve",
     2181    "4hxLtM08VF9C2l" => "symplr",
     2182    "XVMS7DXMIqBGYS" => "Syndigo",
     2183    "gWbBsn1RYwH_lx" => "Synerise",
     2184    "lQ5e6dfAz" => "T-Mobile",
     2185    "v9tJSJ08Y" => "Tableau",
     2186    "SkyTg5Ns_i-X" => "TabMo",
    902187    "HkMucNoOjWX" => "Taboola",
     2188    "Sy1zg5Vs_sW7" => "Taboola Europe",
     2189    "FhDiEVqHC" => "TAC Webshop Essenzielle Cookies",
     2190    "hIeVmYL9N" => "TAC Webshop Funktionelle Cookies",
     2191    "5ZrVbTw7b" => "TACTIC Real-Time Marketing",
     2192    "_tshR74x" => "Tagboard",
     2193    "ryi2qNjOsbX" => "TagCommander Reporting",
    912194    "RyDAUe7cq" => "Taggbox",
    92     "T7-yEXGyq" => "Thinglink",
     2195    "kyVR8HsYW" => "Taggstar",
     2196    "qy3H-XjIfbtJWD" => "Talkable",
     2197    "6Xqz7ZnXC" => "tanke-günstig",
     2198    "S1N-x54o_oW7" => "Tapad",
     2199    "C_KUwwiYRfbe-i" => "Tapfiliate",
     2200    "B1DLe54jui-X" => "Tapjoy",
     2201    "z4TbaRIIC0brTu" => "Tapjoy offerwall",
     2202    "RJCAlbdBc" => "Tappx",
     2203    "MCIll-bt4PqHy6" => "TapResearch",
     2204    "Xr7yRmfanhOWQE" => "Tapstream",
     2205    "V4chy2PIoJJZjy" => "TapTap Developer Services",
     2206    "rCxd-Bnaa" => "TapTap Networks",
     2207    "EJYIUb6BF" => "Target 2 Sell",
     2208    "v6tSxbOVH" => "Target Circle",
     2209    "HkPv9Es_jbQ" => "targeting360",
     2210    "B1tP9Nodo-m" => "TargetPerformance",
     2211    "1UQKjRoGT" => "Targetspot",
     2212    "6Dv6h2w5n" => "Targetspot Belgium",
     2213    "BJJ854o_j-Q" => "tawk.to",
     2214    "HkVMl54s_o-Q" => "Teads",
     2215    "Wl1S8uKS-" => "Teads (Advertiser)",
     2216    "B1Pb9NoOiZQ" => "Tealium AudienceStream",
     2217    "s8nQgU9A5" => "Tealium Inc",
     2218    "p4WgtHjOT" => "Tealium iQ Tag Management",
     2219    "QqzXCO9VP" => "Tealium| AR",
     2220    "BfqgBI84c" => "Tealium| AU",
     2221    "j1SGOMDqk" => "Tealium| BR",
     2222    "2IQwco7dT" => "Tealium| NZ",
     2223    "cm5VE-yQ0" => "Tealium| RU",
     2224    "X6JJe1FkL" => "Tealium| TR",
     2225    "rcYm1yzZK" => "Tealium| ZY",
     2226    "4-jVGw3EB" => "Teamleader",
     2227    "B8yveZ4au" => "Teburio",
     2228    "P3VIjrbk4" => "techstage",
     2229    "aMyJcSkV4" => "tectumedia",
     2230    "3q2DGFRrLVqdep" => "TeeGschwendner Digital Assistant",
     2231    "rJX7gcNouibQ" => "Teemo",
     2232    "SJF6l9NjuibQ" => "Telaria",
     2233    "ea-xVf3MC" => "Telecash IPG",
     2234    "6GtvRE0ff" => "Telecoming",
     2235    "2wlDEfon" => "Tellja",
     2236    "r1q8cEiOjZQ" => "Teltarif",
     2237    "tMLzMavbHZoxW0" => "Tencent",
     2238    "koA9N7uWiA_hub" => "Tencent Cloud",
     2239    "XIQgHfhvd" => "Tenjin SDK",
     2240    "BJ6Sx5Ej_sbQ" => "Teroa",
     2241    "tdEZhT6cG" => "test",
     2242    "0c3vKE023" => "Test Inc.",
     2243    "2n8RK-smZ" => "Test Lang",
     2244    "sL4-Ck-Sx" => "test Vinzent",
     2245    "SJJZ5Eo_sWm" => "The Adex",
     2246    "_9it-YkNL" => "The Fork",
     2247    "f4a6F1Hm" => "The Hotels Network",
     2248    "r1BTxcEiuibQ" => "The Kantar Group",
     2249    "8FyAz-7bl" => "The MediaGrid",
     2250    "Ewa5m2ssH" => "The Ozone Project",
     2251    "C2Evy60pW" => "The Ozone Project Limited",
     2252    "rBPQDekS" => "The Performance Network Group",
     2253    "H1oylqNodiWm" => "The Rubicon Project",
     2254    "OzDyoQHcv7fkNe" => "The UK Trade Desk",
     2255    "B1SI9Nsus-Q" => "TheReachGroup",
     2256    "YwzRJ2YSSul9Pu" => "THG-Quote",
     2257    "T7-yEXGyq" => "ThingLink",
     2258    "4r6R0KGQr" => "Thinkific",
     2259    "Byp4x94jdj-7" => "Thirdpresence",
     2260    "0heqn2Evr" => "Tickaroo",
     2261    "oLePnlfdKezncd" => "TicketPilot App",
     2262    "37aIQwT9" => "Tidio",
    932263    "Z0TcXjY0P" => "TikTok",
    94     "1rXAPWvo" => "TwentyThree",
     2264    "lIWYtXOZYJmqeh" => "TikTok Advanced Matching",
     2265    "6-qobRfu" => "TikTok Advertising",
     2266    "UUHnYR2KjbsJxD" => "TikTok Customer Files Audiences",
     2267    "S1-9eq4s_i-X" => "TimeOne",
     2268    "eK1KmD4tp-3_ql" => "TimeOne Cashback",
     2269    "cqQ73nkHZ" => "Timify",
     2270    "r1FBgcNsOjbX" => "tisoomi",
     2271    "KAkHLuaii" => "tisoomi",
     2272    "eONR_nohcxjqOm" => "TiXel: TikTok Pixel Installer",
     2273    "VmTZ3pQFm" => "TNS",
     2274    "goefqkpwt-EBoc" => "Tockify",
     2275    "ZRwzjOHVTeOdzL" => "Toornament",
     2276    "4RtuUue1OFVsLb" => "TopOn Mediation",
     2277    "w2Oa_gut0" => "Totaljobs Group",
     2278    "HJsTqEjdi-m" => "Tracdelight",
     2279    "UvrL7X7P" => "Tracdelight",
     2280    "2LMFkTl43ochrm" => "TraceParts",
     2281    "LE7HJ4PSr5f_xP" => "Tracify",
     2282    "qmRBk_tGyVYkSw" => "Trackingplan",
     2283    "1jX4G1uhc" => "TrackJS",
     2284    "xIWtwj3zQ" => "Trade Tracker",
     2285    "H1QMcEsusbm" => "TradeDesk",
     2286    "5LFVxHGKz" => "TradeDoubler",
     2287    "K89uca-E" => "TraDeers",
     2288    "S1tJeq4idibQ" => "Tradelab",
     2289    "3V4pWi5-v9IUlA" => "TradingView",
     2290    "Zg-G0ubDKrhaGl" => "TrafficGuard",
     2291    "M86L0YB5Y" => "Transparent Ad Marketplace",
     2292    "X97yqPV4_" => "TransUnion Pixel",
     2293    "45yNDW9XQ" => "travel audience",
     2294    "xO_ngqGtE" => "Travel Data Collective",
     2295    "ryxCCtrEX" => "trbo",
     2296    "SJMM5Niuibm" => "trbo (only Banner)",
     2297    "ByWM9EidoW7" => "trbo (with Profiling)",
     2298    "BJLVe9Vs_o-7" => "TreSensa",
     2299    "2CGv-fVCb" => "Triapodi",
     2300    "GZ2ECdXMt" => "Triboo Data Analytics",
     2301    "5oVj_u8vk" => "Trifelsland",
     2302    "fo8JRhlLx" => "Tripadvisor",
     2303    "rJB0qNiuiWX" => "TripleLift",
     2304    "f2Xhlu1kwL6wud" => "Triptease Meta",
     2305    "SJe9ecEjOoZm" => "Triton Digital Canada",
     2306    "VCNvYtxn" => "Trivago",
     2307    "LXEK37SBs11A6L" => "TruConversion",
     2308    "BDi0AjrMZ" => "TrueData",
     2309    "jxwVTpxsC" => "Trustami",
     2310    "HJrGqEs_i-Q" => "Trusted Shops",
     2311    "euTxF4hQ" => "Trusted Shops Trustbadge",
     2312    "ukD8BZWBj3LFOY" => "Trustindex",
     2313    "qEs4t49Rg" => "Trustpilot",
     2314    "6jYKEgwhU" => "TrustYou",
     2315    "I9i1N9PI" => "Tumblr",
     2316    "JJeggfnFB" => "Tunnl",
     2317    "ckK7ZKfRComWrB" => "TV Scientific",
     2318    "1G1_Btll" => "TVSquared",
     2319    "ckfz7Oq4V" => "TVTY",
     2320    "1rXAPWvo" => "Twentythree",
     2321    "lXv9W6DaC" => "twiago",
     2322    "Iq25S_pX--J_hW" => "Twik Analytics",
     2323    "hEGw72h9Kfd6Id" => "TWIPLA",
    952324    "FPZz1xJI" => "Twitch",
     2325    "Skj79NodobQ" => "Twitter Advertising",
     2326    "S1hmcVouiZm" => "Twitter Analytics",
     2327    "S1tqOzjaX" => "Twitter Button",
     2328    "W-HOHMTVq" => "Twitter Conversion Tracking",
     2329    "2PLSJfB9b" => "Twitter Embed",
     2330    "l6zPfvPkjsPnAz" => "Twitter Feed by Powr",
    962331    "BJTzqNi_i-m" => "Twitter Plugin",
     2332    "HLap0udLC" => "Twitter Syndication",
     2333    "tFz4Cw7VT" => "Type Network",
    972334    "r1PkZcEs_iWQ" => "Typeform",
     2335    "RjoygBzf" => "TYPO3",
     2336    "1ZHq-qRzK" => "Typotheque",
     2337    "aorF_ElSL" => "uberall",
     2338    "nA2KQ61iE" => "UberMedia",
     2339    "aKntdawA_" => "UberMedia, Inc.",
     2340    "nTcBEybQf" => "Ucfunnel",
     2341    "Qs12mrYFcBzmvb" => "Umami",
     2342    "gT1Q1VFEmY8Et7" => "Umlaut",
     2343    "G47k4Ne9E" => "Unbounce",
     2344    "BkFXx5Vj_jWX" => "Underdog Media",
     2345    "iW3MGmyfUxZ7HF" => "Unibuddy",
     2346    "mHoPzPj5" => "UNiDAYS",
     2347    "MlmXX71g2" => "United Internet Media",
     2348    "hpb62D82I" => "Unity Ads",
     2349    "RXkipVe3xznWMq" => "Unity Analytics",
     2350    "u5OQ-l0wp" => "Unity Engine",
     2351    "tQGcwFWxSytrne" => "Unleash",
     2352    "K6r10fdN3" => "unpkg",
     2353    "tVPe8YXLM" => "Unruly",
     2354    "B1Cul54oOsWQ" => "Unruly Group",
     2355    "ZEWPQ-W1toVviz" => "Unsplash",
     2356    "Ql2nuxpSW" => "unzer",
     2357    "53V4PdUMx" => "uppr",
     2358    "R7khlI4W_" => "UpPromote",
     2359    "8rY_il3xD" => "Uprival",
     2360    "1YFXOzPGu" => "Upscope",
     2361    "4JA3zqWR" => "UpScore",
     2362    "3YMnUfi7b" => "Uptain",
     2363    "33R-IpmHz" => "Uptain",
     2364    "tLc9QWcWb" => "uptain",
     2365    "Kg8CQlqnM" => "Uptain",
     2366    "ATdSW9eQ" => "Uptime.com",
     2367    "ZnwVCTXb7" => "Urban Media",
     2368    "ByvxcNj_jWm" => "Usabilla",
     2369    "bysopElpKKOau0" => "Useberry",
     2370    "SkL3gqEiujbX" => "usemax advertisement",
     2371    "Hk8e94jOjWX" => "Usercentrics",
     2372    "Hk9SicTN7" => "Usercentrics Consent Management Platform",
     2373    "SkfHqqa4Q" => "Usercentrics Consent Management Platform",
     2374    "H1Vl5NidjWX" => "Usercentrics Consent Management Platform",
     2375    "oblP60NVHBW" => "Usercentrics Consent Management Platform + Bridge",
     2376    "BlGhk0Zr76YlS3" => "Usercentrics for Wix",
     2377    "_of52Ktc_4R8-e" => "Usercentrics Preference Manager",
     2378    "IYwkrVwaVHh-we" => "Usercentrics Server-Side Tracking",
     2379    "5wohJ1Vz9" => "Userlane",
     2380    "So-uj5T0g" => "UserLeap",
     2381    "xyKq_EfQf" => "Userlike",
     2382    "GlnJWNMwY" => "Userpilot",
     2383    "q6v0dSqJn" => "UserReport",
     2384    "VNCe4TzBR" => "Usersnap",
     2385    "p23Qzm_ifVHR0s" => "Userway",
     2386    "deFBzsgiE" => "Userzoom",
     2387    "1YUf8deyM" => "Userzoom| AU",
     2388    "j6hcnPivn" => "Userzoom| BR",
     2389    "pGck39PMA" => "Userzoom| CO",
     2390    "pIGg_nv5V" => "Userzoom| NZ",
     2391    "bthHXueSG" => "Userzoom| RU",
     2392    "dHpqcqCrK" => "Userzoom| TH",
     2393    "Sri8kf_aM" => "Userzoom| TR",
     2394    "bZlvKs_IMR" => "Userzoom| ZY",
     2395    "ZFZZSibrq9O4Tp" => "Utiq",
     2396    "xCpJ_gp0s" => "Uxcam",
     2397    "orppvjxZm" => "V LLC \"V Kontakte\"Kontakte",
     2398    "DgK0ku83emM6Qz" => "Varify.io",
     2399    "IVj4RQ5FGnW6rW" => "vchfy",
     2400    "HLoyNqJcN" => "vcita",
     2401    "B1UG5NoOoZQ" => "Ve interactive",
     2402    "Qi8jadltE" => "Vectaury",
     2403    "HyZ59NjOoZm" => "Veeseo",
     2404    "mD3tyKxok" => "VELUX Dachfenster-Konfigurator",
     2405    "B1_CqNoOoZ7" => "Venatus Media",
     2406    "I1OcL3FNP" => "Vercel",
     2407    "ryipsERQm" => "Verivox",
     2408    "_B2wa6TgU" => "verizon media",
     2409    "5bv4OvSwoXKh-G" => "Verve HyBid (PubNative)",
     2410    "II_bo7LXx" => "VG Wort",
     2411    "aLHtZ1nd2" => "Viafree",
     2412    "NqJSRFYHn" => "Vibrant",
     2413    "BybJx5Ej_sbQ" => "Vibrant Media",
     2414    "-vsBRkUb-" => "Vidazoo",
     2415    "H1XLx5NidjZX" => "Video intelligence",
     2416    "MFWPBPuDV" => "Video Reach",
     2417    "an461XYFW" => "Video-Stream-Hosting",
    982418    "VtnVCeUzx" => "Videoask",
     2419    "o3IOVN-EL" => "VideoForce",
     2420    "rJOne94sOsZQ" => "Videology",
     2421    "OKc8nSquCFOa9g" => "Videoly",
    992422    "SDFUIfvK_" => "Videolyser",
     2423    "1bOkjhWvT" => "Vidoomy",
    1002424    "KRDJ6FLgY" => "Vidyard",
     2425    "4BYAmnO9m" => "ViewPay",
    1012426    "HyEX5Nidi-m" => "Vimeo",
    102     "FtE1AC6zU" => "Walls.io",
    103     "Ouzxu26Rv" => "Mapp Intelligence Full Feature Tracking",
    104     "rerXlW9h2" => "Wetter",
     2427    "H1DFlcEsdibQ" => "Viralize",
     2428    "sdZuVwP32" => "Virtuelles Kraftwerk",
     2429    "QYHT8hHQChD1q-" => "VIS.X",
     2430    "rrRNlc3vT" => "Visable",
     2431    "HyU0ecEoui-m" => "Visarity Technologies",
     2432    "TYeEKVs18" => "Visiolink",
     2433    "mv69J5pRC" => "Visitlead",
     2434    "q0TXDmYmHH_JJg" => "Visitor Analytics",
     2435    "zD9kWrMoLrklZS" => "Visual Studio App Center",
     2436    "SJDM9Niuo-X" => "Visual Website Optimizer (VWO)",
     2437    "Jn9c7Tfq0" => "Vivalu",
     2438    "8smf-hSjP" => "Vivocha",
     2439    "HyLs5Eo_o-X" => "Vivocha.com",
     2440    "XLgahyVP4" => "VK",
     2441    "kkM0HzB51" => "VKontakte",
     2442    "SyzGit9AQ" => "Vlyby",
     2443    "VhrUzGOecZCpsG" => "Vonage",
     2444    "Og6R2HVi_" => "Vorabs",
     2445    "LHXgL1cqAdwFmY" => "Voyado",
     2446    "Y73tAnhSEmf5qf" => "VRS-Fahrplanauskunft",
     2447    "smfJjwmyhQUnOG" => "VRS-Services",
     2448    "ryXAe5Vidi-m" => "Vuble",
     2449    "lLUj_XgKu" => "Vue Storefront",
     2450    "jk3jF2tpw" => "Vungle",
     2451    "rJWa8AwkN" => "Vuture",
     2452    "tjhfqDKU7WDHGY" => "Vviinn",
     2453    "JelIv_yAko16fL" => "Wallee",
     2454    "FtE1AC6zU" => "walls.io",
     2455    "iXbVZ7fa6r8maG" => "Wappier",
     2456    "e29f8Vdyp4W57i" => "Warmly",
     2457    "L8d0nv7aV0fQxV" => "WEB-STAT",
     2458    "HLIDnkMQM" => "WebAds",
     2459    "zPNaggrXq" => "WebClient Deskline",
     2460    "E4wl_G9bA" => "Webedia",
     2461    "BJ0H5NjOjWX" => "webflow",
     2462    "-kU4dND5" => "Webgains",
     2463    "AEyJyq5ye" => "Webinaris",
     2464    "W3K_bLFj8" => "WebinarJam",
     2465    "0k0AUcHfb" => "Webinterpret",
     2466    "PLTUN6yyF" => "Weblication CMS",
     2467    "W23lERozKtYsY3" => "Webmetic",
     2468    "r1onecNi_o-m" => "WEBORAMA",
     2469    "HkOM1990X" => "Webpack",
     2470    "yzKKqTsr_" => "Website Analytics",
     2471    "RnMemAEwY" => "Website Personalization",
     2472    "OeCcKwIQw" => "Website-Check.de",
     2473    "rJOZc4jOiWQ" => "Webtrekk",
     2474    "rktWq4jdiZ7" => "Webtrekk Control Cookie",
     2475    "Arsb_Ah3_" => "Webtrends",
     2476    "6SMuld8jm" => "Webtype",
     2477    "Eqhn6waf4" => "Webtype LLC",
     2478    "jHX52v1GWN-mv1" => "WeChat",
     2479    "73581zoQJ" => "Weglot",
     2480    "Ni9WZOaz-" => "wein.cc Tracking Services",
     2481    "15c60FWkdsHa_a" => "Welcome Bar by Hero Apps",
     2482    "B1FhxcNs_jZX" => "Welect",
     2483    "fxHSiaLhw" => "Wellness-Heaven",
     2484    "UnsLGXKCAkzLRk" => "WellnessLiving",
     2485    "2Oy_TIoZw6KE7B" => "Wer Kennt Den Besten",
     2486    "hT9JFtMVtpwyoB" => "Wertgarantie",
     2487    "2vCMNRtu_" => "Wesko Decor",
     2488    "rerXlW9h2" => "wetter.com",
     2489    "0Btb-gow1" => "Whatchado",
     2490    "UqEPxPN80fKztp" => "WhatConverts",
     2491    "8WG3bXn65" => "WhatRocks",
     2492    "BJ1Q5NoOj-7" => "WhatsApp Share",
     2493    "JznZhvhYd" => "Whenever Media",
     2494    "pv0mpMZ1a" => "White Ops",
     2495    "N3-I--tsKeuX8a" => "WhosOn",
     2496    "Sydfec4suo-m" => "Widespace",
    1052497    "uJRRy9uiQ" => "Wigeogis",
     2498    "3tUk2XsJ" => "WIHP",
     2499    "NcaPcM6wxi6yty" => "Wildjar",
     2500    "BJca3KUJE" => "Wipe",
     2501    "1e020ptamFlYNx" => "Wirtualna Polska",
     2502    "BysTm2K2V" => "WisePops",
    1062503    "SJ1aqNjOs-m" => "Wistia",
     2504    "hJD19HAQd" => "WIX",
     2505    "jJ7xSGep4HrYql" => "Wix Hotels",
     2506    "GhhPJ0pkKqijxb" => "Wix Music",
     2507    "H1jae94jOoZ7" => "Wizaly",
     2508    "SbGWQWAkC" => "WooCommerce",
     2509    "WiN426fmGX3NxG" => "Woopra",
     2510    "SkaV9Eidjbm" => "Wordfence (WordPress Plugin)",
     2511    "SygB9VsdobX" => "Wordpress Emoji",
     2512    "y0Ayg3nf" => "WordPress Stats",
     2513    "HytX5Voui-7" => "WordPress.com Stats",
     2514    "ByjH5VouiZ7" => "WordPress.org",
     2515    "GTUjO35prc0xaj" => "wowing",
     2516    "nVm_-J1dTCWj_9" => "WP Rocket",
     2517    "QXfH7DP2W" => "WP YouTube Lyte",
     2518    "3KcwTMyqr" => "WP-Immomakler",
     2519    "wV2laX_4P" => "WPML",
     2520    "8RizN1mnI" => "Wufoo",
     2521    "nkoosEfzR" => "wurfl.io",
     2522    "W15mfImvRq7bmp" => "X advertising",
     2523    "mf1x-DJT0A_XJE" => "X Plugin",
     2524    "JXYrspYMA" => "X-mode Social",
     2525    "78MDtp5w7phvUv" => "X2M",
     2526    "CLUJ3MUWcXBYDk" => "X3M",
     2527    "S0P0EnP81RqAX2" => "XAD spoteffects",
     2528    "mNyhYVmpE" => "Xandr",
     2529    "rkqVqNoOib7" => "Xaxis",
     2530    "eR2DWcpGpkzmCc" => "Xing Ads",
     2531    "dcAIXV5pe" => "Xing Events",
    1072532    "BJREqEiOiZQ" => "Xing Plugin",
     2533    "r3RuKbcl_" => "XiTi",
     2534    "S1g2cNjdi-m" => "xiti.com",
     2535    "HJNhqEidiW7" => "XPlosion",
     2536    "oghGv-_Yn" => "Xpose360",
     2537    "HyLh5EsdiZQ" => "XQueue",
     2538    "M6-1NWY_b" => "XTCsid",
     2539    "xtJckP3kEUqMx_" => "Xtremepush",
     2540    "HDgHqlS_c" => "Yahoo",
     2541    "vVG5mOxie" => "Yahoo Ad Manager Plus",
     2542    "MG6mo4hTJ" => "Yahoo Analytics",
     2543    "HJSPc4ids-Q" => "Yahoo Gemini",
     2544    "gUbemZYaQwqxss" => "Yahoo Japan Ads Search Ads",
     2545    "7pEXodGkwM6LwJ" => "Yahoo Mobile Ads",
     2546    "gHY2exdu" => "Yandex",
     2547    "N3DoyeVrpJk9X3" => "Yandex Mobile Ads",
     2548    "Fglp04Xrc" => "Yandex| AU",
     2549    "a3-2F7fCP" => "Yandex| BR",
     2550    "1RZFuLF8w" => "Yandex| CO",
     2551    "z71b76KUP" => "Yandex| NZ",
     2552    "Yph6TvdYO" => "Yandex| RU",
     2553    "cnYnIVV75" => "Yandex| RU",
     2554    "5BEOUpIJ1" => "Yandex| TR",
     2555    "537m4QAx3" => "Yandex| ZY",
     2556    "vAk2cSOol" => "YellowHammer Media Group",
     2557    "DWFwsBMnR4XG-u" => "YellowMap",
    1082558    "5qKtc_BS" => "Yelp",
     2559    "_dq05UfFA" => "Yext Analytics",
     2560    "BCQ3njl_S" => "Yext Listings & Pages",
     2561    "mIq9zoltz" => "YieldKit",
     2562    "Hk5F5VsdoZ7" => "Yieldlab",
     2563    "H1lyZq4s_i-Q" => "Yieldlove",
     2564    "ryHNeqEsdjWX" => "Yieldmo",
     2565    "426xkJRu_" => "Yieldr",
     2566    "k5N5bLgoY" => "yntro",
     2567    "cFuPZkrqz" => "YOC",
     2568    "ZaV13iE2OA5yor" => "Yodo1",
     2569    "dYr0Ee0Fs" => "Yormedia Solutions",
     2570    "VmzO5ZUJA" => "Yotpo",
     2571    "O3JScppCm" => "YouGov",
     2572    "2uI5Zl7Qn" => "Youku",
     2573    "EROmFc3DZXzv2k" => "Yousty",
     2574    "pJiqJb5S" => "YOUTH ID",
     2575    "r1ejcEi_jZ7" => "Youtube Cookies (ytimg)",
     2576    "rPnCiKpia" => "YouTube Subscribe Button",
     2577    "iVTAGV51C" => "YouTube Video",
    1092578    "BJz7qNsdj-7" => "YouTube Video",
    110     "6LdBYXdAl" => "Yumpu",
     2579    "6LdBYXdAl" => "yumpu",
     2580    "9BBsmV62" => "yumpu.com",
     2581    "HrufLEgkd" => "Zanox",
     2582    "BJhj94o_iZ7" => "zanox.com",
     2583    "ln6ss5Vvy" => "Zapier",
     2584    "jGIQ1S51deZrW4" => "Zapnito",
     2585    "invbogd4InL28O" => "ZBO Media",
     2586    "H1Rwgc4juiZX" => "Zebestof",
     2587    "rkL8e5No_iZX" => "Zemanta",
     2588    "ryxNqNjOiW7" => "Zendesk",
     2589    "54s8nFgf" => "Zendesk",
     2590    "ZvGdwtkk1x3HFI" => "Zendesk Widget",
     2591    "GhNn13gjt" => "Zenfulfillment",
     2592    "kl7s_U3CC" => "zenloop",
     2593    "ryA3xc4jOoWQ" => "zeotap",
     2594    "9ok9Ki3RomUf6w" => "Zeppelin Source",
     2595    "HklR5Ei_jbX" => "Zepto",
     2596    "a2XkayMLT" => "Zeta Global",
     2597    "2R7ed_s3_" => "Ziff Davis",
     2598    "TgVifUWF" => "zoho",
     2599    "pRCG-Aryd" => "Zoho Forms",
     2600    "WHwIYgGJH" => "Zoho PageSense",
    1112601    "sKBym34ck" => "Zoho SalesIQ",
    112     "qxiCD5aN_" => "3Q Video",
     2602    "6gPvpOSkp" => "Zoom",
     2603    "XL7559yNs" => "ZoomInfo",
     2604    "J4VjROu2H" => "Zoovu",
     2605    "r1haqNidjbm" => "Zoovu (formerly SmartAssistant)",
     2606    "S1lrx54sdj-m" => "Zopim",
     2607    "ArOvK3Q2" => "Zotabox",
     2608    "-N_eXmLYAuwOe4" => "Zucks",
    1132609];
  • termageddon-usercentrics/tags/1.9.0/includes/class-termageddon-usercentrics.php

    r3366825 r3439658  
    146146                'popular' => false,
    147147            ),
     148            'delaware'    => array(
     149                'title'   => __( 'Delaware (DPDPA)', 'termageddon-usercentrics' ),
     150                'popular' => false,
     151            ),
     152            'indiana'     => array(
     153                'title'   => __( 'Indiana (ICDPA)', 'termageddon-usercentrics' ),
     154                'popular' => false,
     155            ),
    148156            'oregon'      => array(
    149157                'title'   => __( 'Oregon (OCPA)', 'termageddon-usercentrics' ),
     
    189197        'utah'        => 'Utah',
    190198        'virginia'    => 'Virginia',
     199        'delaware'    => 'Delaware',
     200        'indiana'     => 'Indiana',
    191201    );
    192202
     
    633643        }
    634644
    635         $embed_version   = self::get_embed_script_version();
    636         $loader_url      = ( 'v2' === $embed_version ) ? '//app.usercentrics.eu/browser-ui/latest/loader.js' : '//web.cmp.usercentrics.eu/ui/loader.js';
    637         $translations_url = self::get_translations_url();
     645        $embed_version        = self::get_embed_script_version();
     646        $loader_url           = ( 'v2' === $embed_version ) ? '//app.usercentrics.eu/browser-ui/latest/loader.js' : '//web.cmp.usercentrics.eu/ui/loader.js';
     647        $translations_url     = self::get_translations_url();
     648        $use_manual_control   = self::is_manual_script_control_enabled();
    638649
    639650        $new_embed_code  = '<link rel="preconnect" href="https://plugins.trac.wordpress.org//privacy-proxy.usercentrics.eu">' . PHP_EOL;
    640         $new_embed_code .= '<link rel="preload" href="https://plugins.trac.wordpress.org//privacy-proxy.usercentrics.eu/latest/uc-block.bundle.js" as="script">' . PHP_EOL;
    641         $new_embed_code .= '<script type="application/javascript" src="https://plugins.trac.wordpress.org//privacy-proxy.usercentrics.eu/latest/uc-block.bundle.js" data-no-optimize="1" data-no-defer="1"></script>' . PHP_EOL;
     651       
     652        // Only include the auto-blocking script if manual control is disabled
     653        if ( ! $use_manual_control ) {
     654            $new_embed_code .= '<link rel="preload" href="https://plugins.trac.wordpress.org//privacy-proxy.usercentrics.eu/latest/uc-block.bundle.js" as="script">' . PHP_EOL;
     655            $new_embed_code .= '<script type="application/javascript" src="https://plugins.trac.wordpress.org//privacy-proxy.usercentrics.eu/latest/uc-block.bundle.js" data-no-optimize="1" data-no-defer="1"></script>' . PHP_EOL;
     656        }
     657       
    642658        $new_embed_code .= '<script id="usercentrics-cmp" data-cmp-version="' . esc_attr( self::get_embed_script_version() ) . '" src="' . esc_url( $loader_url ) . '" data-settings-id="' . self::get_settings_id() . '" data-no-optimize="1" data-no-defer="1" async></script>' . PHP_EOL;
    643659        $new_embed_code .= '<script data-no-optimize="1" data-no-defer="1">uc.setCustomTranslations(\'' . $translations_url . '\');</script>' . PHP_EOL;
     
    15771593    }
    15781594
     1595    /**
     1596     * Check if manual script control is enabled (disables auto-blocking)
     1597     *
     1598     * @return bool True if manual script control should be used, false otherwise
     1599     */
     1600    public static function is_manual_script_control_enabled(): bool {
     1601        return get_option( 'termageddon_usercentrics_manual_script_control', false ) ? true : false;
     1602    }
     1603
     1604    /**
     1605     * Get the script snippets from the database
     1606     *
     1607     * @return array Array of snippet objects, each containing 'script' and 'service_id'
     1608     */
     1609    public static function get_script_snippets(): array {
     1610        return get_option( 'termageddon_usercentrics_script_snippets', array() );
     1611    }
     1612
     1613    /**
     1614     * Get the provider name by ID from the providers list
     1615     *
     1616     * @param string $service_id The provider ID to look up.
     1617     * @return string The provider name, or empty string if not found.
     1618     */
     1619    public static function get_provider_name_by_id( string $service_id ): string {
     1620        // Use cached providers from admin class to avoid duplicate loading
     1621        if ( ! class_exists( 'Termageddon_Usercentrics_Admin' ) ) {
     1622            require_once TERMAGEDDON_COOKIE_PATH . 'admin/class-termageddon-usercentrics-admin.php';
     1623        }
     1624        $providers = Termageddon_Usercentrics_Admin::get_usercentrics_providers();
     1625        return $providers[ $service_id ] ?? '';
     1626    }
     1627
     1628    /**
     1629     * Augment script tags with Usercentrics blocking attributes
     1630     *
     1631     * Takes script HTML and augments all <script> tags with type="text/plain"
     1632     * and data-usercentrics attributes for cookie consent blocking.
     1633     *
     1634     * @param string $script_html The raw script HTML to augment.
     1635     * @param string $service_id  The provider ID to look up the service name.
     1636     * @return string The augmented script HTML, or original if service not found.
     1637     */
     1638    public static function augment_script_for_usercentrics( string $script_html, string $service_id ): string {
     1639        // Get service name from service_id
     1640        $service_name = self::get_provider_name_by_id( $service_id );
     1641        if ( empty( $service_name ) ) {
     1642            // Log warning if service not found
     1643            if ( function_exists( 'error_log' ) ) {
     1644                error_log( sprintf( 'Termageddon Usercentrics: Invalid service_id "%s" provided to augment_script_for_usercentrics', $service_id ) );
     1645            }
     1646            return $script_html; // Return original if service not found
     1647        }
     1648
     1649        // Pattern to match script tags (both with src and inline)
     1650        $pattern = '/<script([^>]*)>([\s\S]*?)<\/script>/i';
     1651
     1652        $augmented = preg_replace_callback(
     1653            $pattern,
     1654            function( $matches ) use ( $service_name ) {
     1655                $attributes = trim( $matches[1] );
     1656                $content    = $matches[2];
     1657
     1658                // Replace or add type="text/plain"
     1659                if ( preg_match( '/type\s*=\s*["\'][^"\']*["\']/i', $attributes ) ) {
     1660                    // Replace existing type attribute
     1661                    $attributes = preg_replace(
     1662                        '/type\s*=\s*["\'][^"\']*["\']/i',
     1663                        'type="text/plain"',
     1664                        $attributes
     1665                    );
     1666                } else {
     1667                    // Add type="text/plain" attribute
     1668                    $attributes = ( $attributes ? $attributes . ' ' : '' ) . 'type="text/plain"';
     1669                }
     1670
     1671                // Add or update data-usercentrics attribute
     1672                $usercentrics_attr = 'data-usercentrics="' . esc_attr( $service_name ) . '"';
     1673                if ( preg_match( '/data-usercentrics\s*=\s*["\'][^"\']*["\']/i', $attributes ) ) {
     1674                    // Replace existing data-usercentrics
     1675                    $attributes = preg_replace(
     1676                        '/data-usercentrics\s*=\s*["\'][^"\']*["\']/i',
     1677                        $usercentrics_attr,
     1678                        $attributes
     1679                    );
     1680                } else {
     1681                    // Add data-usercentrics attribute
     1682                    $attributes .= ' ' . $usercentrics_attr;
     1683                }
     1684
     1685                return '<script' . ( $attributes ? ' ' . $attributes : '' ) . '>' . $content . '</script>';
     1686            },
     1687            $script_html
     1688        );
     1689
     1690        $service_name_upper = strtoupper( $service_name );
     1691        return PHP_EOL . '<!-- ' . esc_html( $service_name_upper ) . ' SCRIPT -->' . PHP_EOL . ( $augmented ?? $script_html ) . PHP_EOL;
     1692    }
     1693
    15791694}
  • termageddon-usercentrics/tags/1.9.0/languages/termageddon-usercentrics.pot

    r3362792 r3439658  
    44"Project-Id-Version: Termageddon + Usercentrics\n"
    55"Report-Msgid-Bugs-To: \n"
    6 "POT-Creation-Date: 2025-09-16 00:31+0000\n"
     6"POT-Creation-Date: 2026-01-13 22:13+0000\n"
    77"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
    88"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
     
    1717"X-Domain: termageddon-usercentrics"
    1818
    19 #: admin/class-termageddon-usercentrics-admin.php:1216
     19#: admin/class-termageddon-usercentrics-admin.php:1793
     20msgid "+ Add Script Snippet"
     21msgstr ""
     22
     23#: admin/class-termageddon-usercentrics-admin.php:1305
    2024msgid "Action Needed"
    2125msgstr ""
    2226
    23 #: admin/class-termageddon-usercentrics-admin.php:449
     27#: admin/class-termageddon-usercentrics-admin.php:473
    2428msgid "Additional Scripts"
    2529msgstr ""
    2630
    27 #: admin/class-termageddon-usercentrics-admin.php:486
     31#: admin/class-termageddon-usercentrics-admin.php:556
    2832msgid "Administrators"
    2933msgstr ""
    3034
    31 #: admin/class-termageddon-usercentrics-admin.php:889
     35#: admin/class-termageddon-usercentrics-admin.php:978
    3236msgid "Advanced Configuration"
    3337msgstr ""
    3438
    3539#: admin/class-termageddon-usercentrics-admin.php:90
    36 #: admin/class-termageddon-usercentrics-admin.php:229
     40#: admin/class-termageddon-usercentrics-admin.php:234
    3741msgid "Advanced Configuration & Troubleshooting"
    3842msgstr ""
    3943
    40 #: admin/class-termageddon-usercentrics-admin.php:239
     44#: admin/class-termageddon-usercentrics-admin.php:244
    4145msgid "Allowed HTML Tags"
    4246msgstr ""
    4347
    44 #: admin/class-termageddon-usercentrics-admin.php:1420
     48#: admin/class-termageddon-usercentrics-admin.php:1519
    4549msgid "along with page 1 of your Privacy Policy questionnaire within "
    4650msgstr ""
    4751
    48 #: admin/class-termageddon-usercentrics-admin.php:543
     52#: admin/class-termageddon-usercentrics-admin.php:613
    4953msgid ""
    5054"As an alternative to that additional script, you can simply use the [uc-"
     
    5559msgstr ""
    5660
    57 #: admin/class-termageddon-usercentrics-admin.php:900
     61#: admin/class-termageddon-usercentrics-admin.php:989
    5862msgid "Auto-refresh on consent"
    5963msgstr ""
    6064
    61 #: admin/class-termageddon-usercentrics-admin.php:1427
     65#: admin/class-termageddon-usercentrics-admin.php:1526
    6266msgid "based on which privacy laws apply to you"
    6367msgstr ""
    6468
    65 #: admin/class-termageddon-usercentrics-admin.php:1225
     69#: admin/class-termageddon-usercentrics-admin.php:1314
    6670msgid ""
    6771"Behind the scenes, we will remove the Usercentrics embed code from the field "
     
    6973msgstr ""
    7074
     75#: admin/class-termageddon-usercentrics-admin.php:753
     76msgid ""
     77"By updating all external scripts to use the <a href=\"https://termageddon."
     78"freshdesk.com/support/solutions/articles/66000529802-embedding-the-cookie-"
     79"consent-solution-and-cookie-policy#:~:text=for%20simplicity%20purposes.-,"
     80"Manual%20script%20control,-%2D%20You%20can%20also\" target=\"_blank\">manual "
     81"script controller</a>, you can disable usercentrics block script which will "
     82"improve site-loading performance and improve reliability. Once enabled, "
     83"please ensure you <a href=\"https://termageddon.freshdesk."
     84"com/support/solutions/articles/66000529802-embedding-the-cookie-consent-"
     85"solution-and-cookie-policy\" target=\"_blank\">validate</a> that any "
     86"external services are working as expected."
     87msgstr ""
     88
    7189#: includes/class-termageddon-usercentrics.php:137
    7290msgid "California (CPRA, CIPA)"
     
    7795msgstr ""
    7896
    79 #: admin/class-termageddon-usercentrics-admin.php:890
     97#: admin/class-termageddon-usercentrics-admin.php:979
    8098msgid ""
    8199"Certain integrations may require a more custom approach to integrating with "
     
    96114
    97115#. section ID.
    98 #: admin/class-termageddon-usercentrics-admin.php:972
     116#: admin/class-termageddon-usercentrics-admin.php:1061
    99117msgid "Control Panel"
    100118msgstr ""
    101119
    102 #: admin/class-termageddon-usercentrics-admin.php:1222
     120#: admin/class-termageddon-usercentrics-admin.php:1311
    103121msgid "Conversion Needed:"
    104122msgstr ""
    105123
    106 #: admin/class-termageddon-usercentrics-admin.php:1226
     124#: admin/class-termageddon-usercentrics-admin.php:1315
    107125msgid "Convert"
    108126msgstr ""
    109127
    110 #: admin/class-termageddon-usercentrics-admin.php:1380
     128#: admin/class-termageddon-usercentrics-admin.php:1479
    111129msgid "Cookie Policy and Consent Solution"
    112130msgstr ""
    113131
    114 #: admin/class-termageddon-usercentrics-admin.php:231
     132#: admin/class-termageddon-usercentrics-admin.php:236
    115133msgid "Debug Information"
    116134msgstr ""
    117135
    118 #: admin/class-termageddon-usercentrics-admin.php:924
     136#: includes/class-termageddon-usercentrics.php:149
     137msgid "Delaware (DPDPA)"
     138msgstr ""
     139
     140#: admin/class-termageddon-usercentrics-admin.php:1013
    119141msgid "Disable blocking for providers"
    120142msgstr ""
    121143
    122 #: admin/class-termageddon-usercentrics-admin.php:677
     144#: admin/class-termageddon-usercentrics-admin.php:766
    123145msgid "Disable CDN for Translations Script"
    124146msgstr ""
    125147
    126 #: admin/class-termageddon-usercentrics-admin.php:696
     148#: admin/class-termageddon-usercentrics-admin.php:785
    127149msgid "Disable for Troubleshooting"
    128150msgstr ""
    129151
    130 #: includes/class-termageddon-usercentrics.php:1300
     152#: admin/class-termageddon-usercentrics-admin.php:747
     153msgid "Disable Usercentrics Auto-blocking script"
     154msgstr ""
     155
     156#: includes/class-termageddon-usercentrics.php:1321
    131157msgid "Divi Video"
    132158msgstr ""
     
    138164msgstr ""
    139165
    140 #: admin/class-termageddon-usercentrics-admin.php:504
     166#: admin/class-termageddon-usercentrics-admin.php:574
    141167msgid "Editors"
    142168msgstr ""
    143169
    144 #: includes/class-termageddon-usercentrics.php:1306
     170#: includes/class-termageddon-usercentrics.php:1327
    145171msgid "Elementor Video"
    146172msgstr ""
    147173
    148 #: admin/class-termageddon-usercentrics-admin.php:449
     174#: admin/class-termageddon-usercentrics-admin.php:473
    149175msgid "Embed Code (Legacy)"
    150176msgstr ""
    151177
    152 #: admin/class-termageddon-usercentrics-admin.php:621
     178#: admin/class-termageddon-usercentrics-admin.php:691
    153179msgid "Embed Code Injection Method"
    154180msgstr ""
    155181
    156 #: admin/class-termageddon-usercentrics-admin.php:598
     182#: admin/class-termageddon-usercentrics-admin.php:668
    157183msgid "Embed Code Priority"
    158184msgstr ""
    159185
    160 #: admin/class-termageddon-usercentrics-admin.php:649
     186#: admin/class-termageddon-usercentrics-admin.php:719
    161187msgid "Embed Code Version"
    162188msgstr ""
    163189
    164 #: admin/class-termageddon-usercentrics-admin.php:799
     190#: admin/class-termageddon-usercentrics-admin.php:888
    165191msgid "Enable location logging"
    166192msgstr ""
    167193
    168 #: admin/class-termageddon-usercentrics-admin.php:819
     194#: admin/class-termageddon-usercentrics-admin.php:908
    169195msgid "Enable page caching support via AJAX"
    170196msgstr ""
    171197
    172 #: admin/class-termageddon-usercentrics-admin.php:431
     198#: admin/class-termageddon-usercentrics-admin.php:455
    173199msgid ""
    174200"Enter your Usercentrics Settings ID. This can be found on the \"View Embed "
     
    176202msgstr ""
    177203
    178 #: admin/class-termageddon-usercentrics-admin.php:986
     204#: admin/class-termageddon-usercentrics-admin.php:1075
    179205msgid "Error Count"
    180206msgstr ""
    181207
    182 #: admin/class-termageddon-usercentrics-admin.php:243
     208#: admin/class-termageddon-usercentrics-admin.php:248
    183209msgid "Error Information"
    184210msgstr ""
    185211
    186 #: admin/class-termageddon-usercentrics-admin.php:1004
     212#: admin/class-termageddon-usercentrics-admin.php:1093
    187213msgid "Error List"
    188214msgstr ""
     
    192218msgstr ""
    193219
    194 #: includes/class-termageddon-usercentrics.php:311
     220#: includes/class-termageddon-usercentrics.php:302
    195221msgid "Every Month"
    196222msgstr ""
    197223
    198 #: admin/class-termageddon-usercentrics-admin.php:576
     224#: admin/class-termageddon-usercentrics-admin.php:646
    199225msgid ""
    200226"For some theme builders including Divi, the footer (bottom bar) does not "
     
    206232#. section ID.
    207233#: admin/class-termageddon-usercentrics-admin.php:82
    208 #: admin/class-termageddon-usercentrics-admin.php:724
     234#: admin/class-termageddon-usercentrics-admin.php:813
    209235msgid "Geo-Location"
    210236msgstr ""
    211237
    212 #: admin/class-termageddon-usercentrics-admin.php:190
    213 #: admin/class-termageddon-usercentrics-admin.php:1429
     238#: admin/class-termageddon-usercentrics-admin.php:195
     239#: admin/class-termageddon-usercentrics-admin.php:1528
    214240msgid ""
    215241"Geo-Location is enabled, but no locations have been toggled on. This means "
     
    217243msgstr ""
    218244
    219 #: admin/class-termageddon-usercentrics-admin.php:236
     245#: admin/class-termageddon-usercentrics-admin.php:241
    220246msgid "Geolocation Database Directory Writable"
    221247msgstr ""
    222248
    223 #: admin/class-termageddon-usercentrics-admin.php:234
     249#: admin/class-termageddon-usercentrics-admin.php:239
    224250msgid "Geolocation Database Exists"
    225251msgstr ""
    226252
    227 #: admin/class-termageddon-usercentrics-admin.php:237
     253#: admin/class-termageddon-usercentrics-admin.php:242
    228254msgid "Geolocation Database Last Updated"
    229255msgstr ""
    230256
     257#: admin/class-termageddon-usercentrics-admin.php:243
     258msgid "Geolocation Database Next Update"
     259msgstr ""
     260
    231261#: admin/class-termageddon-usercentrics-admin.php:238
    232 msgid "Geolocation Database Next Update"
    233 msgstr ""
    234 
    235 #: admin/class-termageddon-usercentrics-admin.php:233
    236262msgid "Geolocation Database Path"
    237263msgstr ""
    238264
    239 #: admin/class-termageddon-usercentrics-admin.php:235
     265#: admin/class-termageddon-usercentrics-admin.php:240
    240266msgid "Geolocation Database Readable"
    241267msgstr ""
    242268
    243 #: admin/class-termageddon-usercentrics-admin.php:542
     269#: admin/class-termageddon-usercentrics-admin.php:612
    244270msgid ""
    245271"Giving users the ability to change their privacy/consent settings is a "
     
    251277msgstr ""
    252278
    253 #: admin/class-termageddon-usercentrics-admin.php:1218
     279#: admin/class-termageddon-usercentrics-admin.php:1307
    254280msgid "Go to Configuration"
    255281msgstr ""
    256282
    257 #: admin/class-termageddon-usercentrics-admin.php:551
     283#: admin/class-termageddon-usercentrics-admin.php:621
    258284msgid "Hide Privacy Settings Link when cookie consent tool is disabled"
    259285msgstr ""
     
    263289msgstr ""
    264290
    265 #: admin/class-termageddon-usercentrics-admin.php:1398
     291#: admin/class-termageddon-usercentrics-admin.php:1497
    266292msgid "If you are using the Divi theme"
    267293msgstr ""
    268294
    269 #: admin/class-termageddon-usercentrics-admin.php:856
     295#: admin/class-termageddon-usercentrics-admin.php:945
    270296msgid ""
    271297"If you have a script or code snippet to share, would like to improve support "
     
    274300msgstr ""
    275301
    276 #: admin/class-termageddon-usercentrics-admin.php:1397
     302#: admin/class-termageddon-usercentrics-admin.php:1496
    277303msgid ""
    278304"If you would like to remove Usercentrics for logged in users such as admins, "
     
    280306msgstr ""
    281307
    282 #: admin/class-termageddon-usercentrics-admin.php:866
     308#: includes/class-termageddon-usercentrics.php:153
     309msgid "Indiana (ICDPA)"
     310msgstr ""
     311
     312#: admin/class-termageddon-usercentrics-admin.php:955
    283313msgid "Integration"
    284314msgstr ""
     
    286316#. section ID.
    287317#: admin/class-termageddon-usercentrics-admin.php:78
    288 #: admin/class-termageddon-usercentrics-admin.php:845
     318#: admin/class-termageddon-usercentrics-admin.php:934
    289319msgid "Integrations"
    290320msgstr ""
    291321
    292 #: admin/class-termageddon-usercentrics-admin.php:209
     322#: admin/class-termageddon-usercentrics-admin.php:497
     323msgid ""
     324"into third party scripts (Google Analytics, Facebook Pixel, LinkedIn "
     325"Insights Tag, etc.), which can help ensure that consent is obtained first "
     326"prior to the script loading."
     327msgstr ""
     328
     329#: admin/class-termageddon-usercentrics-admin.php:214
    293330msgid "Invalid tab. Please check the link and try again."
    294331msgstr ""
    295332
    296 #: admin/class-termageddon-usercentrics-admin.php:1224
     333#: admin/class-termageddon-usercentrics-admin.php:1313
    297334msgid ""
    298335"It looks like you are still using the old embed code (below) instead of the "
     
    301338msgstr ""
    302339
    303 #: admin/class-termageddon-usercentrics-admin.php:198
     340#: admin/class-termageddon-usercentrics-admin.php:503
     341msgid ""
     342"just in general, but also after making this update to ensure that scripts do "
     343"not fire until consent is provided."
     344msgstr ""
     345
     346#: admin/class-termageddon-usercentrics-admin.php:203
    304347msgid "Location logging is enabled."
    305348msgstr ""
    306349
    307 #: admin/class-termageddon-usercentrics-admin.php:522
     350#: admin/class-termageddon-usercentrics-admin.php:592
    308351msgid "Logged-in Users"
    309352msgstr ""
    310353
    311 #: admin/class-termageddon-usercentrics-admin.php:1427
     354#: admin/class-termageddon-usercentrics-admin.php:496
     355msgid "manual control snippet"
     356msgstr ""
     357
     358#: admin/class-termageddon-usercentrics-admin.php:493
     359msgid "Manual Script Controller"
     360msgstr ""
     361
     362#: admin/class-termageddon-usercentrics-admin.php:1736
     363#: admin/class-termageddon-usercentrics-admin.php:1806
     364msgid "New Script Snippet"
     365msgstr ""
     366
     367#: admin/class-termageddon-usercentrics-admin.php:1526
    312368msgid "Not sure what to select?"
    313369msgstr ""
    314370
    315 #: admin/class-termageddon-usercentrics-admin.php:1420
     371#: admin/class-termageddon-usercentrics-admin.php:1519
    316372msgid "Not sure what to select? Review"
    317373msgstr ""
    318374
    319 #: admin/class-termageddon-usercentrics-admin.php:953
     375#: admin/class-termageddon-usercentrics-admin.php:1042
    320376msgid ""
    321377"On this page, you can find custom implementation to improve support and "
     
    323379msgstr ""
    324380
    325 #: includes/class-termageddon-usercentrics.php:149
     381#: includes/class-termageddon-usercentrics.php:157
    326382msgid "Oregon (OCPA)"
    327383msgstr ""
    328384
    329 #: admin/class-termageddon-usercentrics-admin.php:604
     385#: admin/class-termageddon-usercentrics-admin.php:674
    330386msgid ""
    331387"Override the default priority of the embed code (Defaults to 1). By "
     
    336392msgstr ""
    337393
    338 #: admin/class-termageddon-usercentrics-admin.php:191
     394#: admin/class-termageddon-usercentrics-admin.php:196
    339395msgid ""
    340396"Please go to geo-location settings to enable at least one location or to "
     
    342398msgstr ""
    343399
    344 #: admin/class-termageddon-usercentrics-admin.php:855
     400#: admin/class-termageddon-usercentrics-admin.php:944
    345401msgid "Plugin & Theme Integrations"
    346402msgstr ""
    347403
    348 #: includes/class-termageddon-usercentrics.php:1312
     404#: includes/class-termageddon-usercentrics.php:1333
    349405msgid "PowerPack Video"
    350406msgstr ""
    351407
    352 #: includes/class-termageddon-usercentrics.php:1318
     408#: includes/class-termageddon-usercentrics.php:1339
    353409msgid "Presto Player"
    354410msgstr ""
    355411
    356 #: admin/class-termageddon-usercentrics-admin.php:570
     412#: admin/class-termageddon-usercentrics-admin.php:640
    357413msgid "Privacy Settings Link - Alternative Implementation"
    358414msgstr ""
    359415
    360 #: admin/class-termageddon-usercentrics-admin.php:655
     416#: admin/class-termageddon-usercentrics-admin.php:1752
     417#: admin/class-termageddon-usercentrics-admin.php:1811
     418msgid "Remove"
     419msgstr ""
     420
     421#: admin/class-termageddon-usercentrics-admin.php:1776
     422#: admin/class-termageddon-usercentrics-admin.php:1830
     423msgid "Script Code"
     424msgstr ""
     425
     426#. %d: snippet index number
     427#: admin/class-termageddon-usercentrics-admin.php:1590
     428msgid "Script snippet #%d was not saved: Please select a valid service."
     429msgstr ""
     430
     431#. %1$s: service name, %2$d: snippet index number
     432#: admin/class-termageddon-usercentrics-admin.php:1623
     433#, php-format
     434msgid ""
     435"Script snippet for \"%1$s\" (#%2$d) was not saved: Only script tags are "
     436"allowed. Please remove any HTML elements (div, span, etc.) and use only &lt;"
     437"script&gt; tags."
     438msgstr ""
     439
     440#. %1$s: service name, %2$d: snippet index number
     441#: admin/class-termageddon-usercentrics-admin.php:1607
     442#, php-format
     443msgid ""
     444"Script snippet for \"%1$s\" (#%2$d) was not saved: The script code field "
     445"cannot be empty."
     446msgstr ""
     447
     448#. %1$s: service name, %2$d: snippet index number
     449#: admin/class-termageddon-usercentrics-admin.php:1630
     450#, php-format
     451msgid ""
     452"Script snippet for \"%1$s\" (#%2$d) was not saved: The script code must "
     453"contain at least one &lt;script&gt; tag."
     454msgstr ""
     455
     456#: admin/class-termageddon-usercentrics-admin.php:1766
     457#: admin/class-termageddon-usercentrics-admin.php:1796
     458msgid "Select a service..."
     459msgstr ""
     460
     461#: admin/class-termageddon-usercentrics-admin.php:725
    361462msgid ""
    362463"Select which version of the Usercentrics embed code you would like to use."
    363464msgstr ""
    364465
     466#: admin/class-termageddon-usercentrics-admin.php:1758
     467#: admin/class-termageddon-usercentrics-admin.php:1817
     468msgid "Service"
     469msgstr ""
     470
    365471#. section ID.
    366 #: includes/class-termageddon-usercentrics.php:521
     472#: includes/class-termageddon-usercentrics.php:536
    367473#: admin/class-termageddon-usercentrics-admin.php:86
    368 #: admin/class-termageddon-usercentrics-admin.php:477
     474#: admin/class-termageddon-usercentrics-admin.php:547
    369475msgid "Settings"
    370476msgstr ""
    371477
    372 #: admin/class-termageddon-usercentrics-admin.php:425
     478#: admin/class-termageddon-usercentrics-admin.php:449
    373479msgid "Settings ID"
    374480msgstr ""
    375481
    376 #: admin/class-termageddon-usercentrics-admin.php:1426
     482#: admin/class-termageddon-usercentrics-admin.php:1525
    377483msgid "Show widget if visitor is located in"
     484msgstr ""
     485
     486#: admin/class-termageddon-usercentrics-admin.php:499
     487msgid ""
     488"Simply add a new snippet, enter the Service name (same name as the Service "
     489"you listed in your Cookie Policy and Consent Tool questionnaire), and paste "
     490"your embed code into the provided field. The plugin will then set up manual "
     491"control of the script, helping ensure that it is blocked until consent is "
     492"obtained by the user."
    378493msgstr ""
    379494
     
    383498msgstr ""
    384499
    385 #: admin/class-termageddon-usercentrics-admin.php:203
     500#: admin/class-termageddon-usercentrics-admin.php:208
    386501msgid "Termageddon + Usercentrics"
    387502msgstr ""
    388503
    389 #: includes/class-termageddon-usercentrics.php:153
     504#: admin/class-termageddon-usercentrics-admin.php:502
     505msgid "test the consent solution"
     506msgstr ""
     507
     508#: includes/class-termageddon-usercentrics.php:161
    390509msgid "Texas (TDPSA)"
    391510msgstr ""
    392511
    393 #: admin/class-termageddon-usercentrics-admin.php:627
     512#: admin/class-termageddon-usercentrics-admin.php:697
    394513msgid ""
    395514"The default injection option, wp_head, will inject the embed code in the "
     
    399518msgstr ""
    400519
    401 #: admin/class-termageddon-usercentrics-admin.php:1420
     520#: admin/class-termageddon-usercentrics-admin.php:1519
    402521msgid "this article"
    403522msgstr ""
    404523
    405 #: admin/class-termageddon-usercentrics-admin.php:1427
     524#: admin/class-termageddon-usercentrics-admin.php:1526
    406525msgid "This article outlines which regions to select"
    407526msgstr ""
    408527
    409 #: admin/class-termageddon-usercentrics-admin.php:229
     528#: admin/class-termageddon-usercentrics-admin.php:495
     529msgid "This feature helps add the"
     530msgstr ""
     531
     532#: admin/class-termageddon-usercentrics-admin.php:234
    410533msgid ""
    411534"This panel is for advanced configuration and troubleshooting. Please contact "
     
    413536msgstr ""
    414537
    415 #: admin/class-termageddon-usercentrics-admin.php:906
     538#: admin/class-termageddon-usercentrics-admin.php:995
    416539msgid ""
    417540"This particular feature is not needed for most websites. This feature is "
     
    423546msgstr ""
    424547
    425 #: includes/class-termageddon-usercentrics.php:1301
     548#: includes/class-termageddon-usercentrics.php:1322
    426549msgid ""
    427550"This resolves and improves the cookie-consent implementation when using an "
     
    429552msgstr ""
    430553
    431 #: includes/class-termageddon-usercentrics.php:1307
     554#: includes/class-termageddon-usercentrics.php:1328
    432555msgid ""
    433556"This resolves and improves the cookie-consent implementation when using an "
     
    435558msgstr ""
    436559
    437 #: includes/class-termageddon-usercentrics.php:1313
     560#: includes/class-termageddon-usercentrics.php:1334
    438561msgid ""
    439562"This resolves and improves the cookie-consent implementation when using an "
     
    443566msgstr ""
    444567
    445 #: includes/class-termageddon-usercentrics.php:1319
     568#: includes/class-termageddon-usercentrics.php:1340
    446569msgid ""
    447570"This resolves and improves the cookie-consent implementation when using an "
     
    449572msgstr ""
    450573
    451 #: includes/class-termageddon-usercentrics.php:1325
     574#: includes/class-termageddon-usercentrics.php:1346
    452575msgid ""
    453576"This resolves and improves the cookie-consent implementation when using an "
     
    456579msgstr ""
    457580
    458 #: admin/class-termageddon-usercentrics-admin.php:455
     581#: admin/class-termageddon-usercentrics-admin.php:479
    459582msgid ""
    460583"This section can be used to add customizations to your Usercentrics embed "
     
    463586msgstr ""
    464587
    465 #: admin/class-termageddon-usercentrics-admin.php:455
     588#: admin/class-termageddon-usercentrics-admin.php:479
    466589msgid ""
    467590"This section should no longer be used for the embed code from the "
     
    470593msgstr ""
    471594
    472 #: admin/class-termageddon-usercentrics-admin.php:1217
     595#: admin/class-termageddon-usercentrics-admin.php:1306
    473596msgid "This update will take a few seconds to complete."
    474597msgstr ""
    475598
    476 #: admin/class-termageddon-usercentrics-admin.php:683
     599#: admin/class-termageddon-usercentrics-admin.php:772
    477600msgid ""
    478601"This will switch the URL used for the Usercentrics translations script from "
     
    481604msgstr ""
    482605
    483 #: admin/class-termageddon-usercentrics-admin.php:1441
     606#: admin/class-termageddon-usercentrics-admin.php:1540
    484607msgid ""
    485608"To reset any of the backend variables, update the values below and save your "
     
    487610msgstr ""
    488611
    489 #: includes/class-termageddon-usercentrics.php:1324
     612#: includes/class-termageddon-usercentrics.php:1345
    490613msgid "Ultimate Addons for Beaver Builder Video"
    491614msgstr ""
     
    499622msgstr ""
    500623
    501 #: admin/class-termageddon-usercentrics-admin.php:1379
     624#: admin/class-termageddon-usercentrics-admin.php:1478
    502625msgid "Upon generating your "
    503626msgstr ""
    504627
    505 #: admin/class-termageddon-usercentrics-admin.php:1366
     628#: admin/class-termageddon-usercentrics-admin.php:1465
    506629msgid "Upon saving, all previous errors in the log will be deleted."
    507630msgstr ""
    508631
    509 #: includes/class-termageddon-usercentrics.php:157
     632#: includes/class-termageddon-usercentrics.php:165
    510633msgid "Utah (UCPA)"
    511634msgstr ""
    512635
    513 #: admin/class-termageddon-usercentrics-admin.php:657
     636#: admin/class-termageddon-usercentrics-admin.php:727
    514637msgid "v2"
    515638msgstr ""
    516639
    517 #: admin/class-termageddon-usercentrics-admin.php:658
     640#: admin/class-termageddon-usercentrics-admin.php:728
    518641msgid "v3 (Beta)"
    519642msgstr ""
    520643
    521 #: includes/class-termageddon-usercentrics.php:161
     644#: admin/class-termageddon-usercentrics-admin.php:501
     645msgid "Very important: be sure to"
     646msgstr ""
     647
     648#: includes/class-termageddon-usercentrics.php:169
    522649msgid "Virginia (VCDPA)"
    523650msgstr ""
    524651
    525 #: admin/class-termageddon-usercentrics-admin.php:930
     652#: admin/class-termageddon-usercentrics-admin.php:1019
    526653msgid ""
    527654"WARNING: By adding providers to this list, you are choosing for Usercentrics "
     
    530657msgstr ""
    531658
    532 #: admin/class-termageddon-usercentrics-admin.php:544
     659#: admin/class-termageddon-usercentrics-admin.php:614
    533660msgid ""
    534661"We also offer a button version of the Privacy Settings link, which can be "
     
    538665msgstr ""
    539666
    540 #: admin/class-termageddon-usercentrics-admin.php:1217
     667#: admin/class-termageddon-usercentrics-admin.php:1306
    541668msgid ""
    542669"We are moving to using a Settings ID instead of an embed code format to "
     
    544671msgstr ""
    545672
    546 #: admin/class-termageddon-usercentrics-admin.php:183
     673#: admin/class-termageddon-usercentrics-admin.php:188
    547674msgid ""
    548675"We were unable to download the database necessary for geolocation to your "
     
    551678msgstr ""
    552679
    553 #: admin/class-termageddon-usercentrics-admin.php:557
     680#: admin/class-termageddon-usercentrics-admin.php:627
    554681msgid ""
    555682"When enabled, the Privacy Settings link will be hidden from certain users, "
     
    564691msgstr ""
    565692
    566 #: admin/class-termageddon-usercentrics-admin.php:805
     693#: admin/class-termageddon-usercentrics-admin.php:894
    567694msgid ""
    568695"When enabled, the visitor's location can be viewed in the browser console, "
     
    570697msgstr ""
    571698
    572 #: admin/class-termageddon-usercentrics-admin.php:825
     699#: admin/class-termageddon-usercentrics-admin.php:914
    573700msgid ""
    574701"When enabled, the visitor's location is checked via javascript to allow "
     
    576703msgstr ""
    577704
    578 #: admin/class-termageddon-usercentrics-admin.php:702
     705#: admin/class-termageddon-usercentrics-admin.php:791
    579706msgid ""
    580707"When enabled, this feature allows you to turn off the consent tool for all "
     
    585712msgstr ""
    586713
    587 #: admin/class-termageddon-usercentrics-admin.php:1416
     714#: admin/class-termageddon-usercentrics-admin.php:1515
    588715msgid ""
    589716"When enabled, you will be collecting IP addresses for the purposes of "
     
    597724msgstr ""
    598725
    599 #: admin/class-termageddon-usercentrics-admin.php:198
     726#: admin/class-termageddon-usercentrics-admin.php:203
    600727msgid "with the IP Address of"
    601728msgstr ""
    602729
    603 #: admin/class-termageddon-usercentrics-admin.php:1381
     730#: admin/class-termageddon-usercentrics-admin.php:1480
    604731msgid ""
    605732"within your Termageddon account, you will be brought to the \"View embed "
     
    608735msgstr ""
    609736
    610 #: admin/class-termageddon-usercentrics-admin.php:630
     737#: admin/class-termageddon-usercentrics-admin.php:700
    611738msgid "wp_enqueue_scripts"
    612739msgstr ""
    613740
    614 #: admin/class-termageddon-usercentrics-admin.php:629
     741#: admin/class-termageddon-usercentrics-admin.php:699
    615742msgid "wp_head (Default)"
    616743msgstr ""
    617744
    618 #: admin/class-termageddon-usercentrics-admin.php:1399
     745#: admin/class-termageddon-usercentrics-admin.php:1498
    619746msgid ""
    620747"you will need to enable at least one of the settings below to ensure logged "
     
    623750msgstr ""
    624751
    625 #: admin/class-termageddon-usercentrics-admin.php:198
     752#: admin/class-termageddon-usercentrics-admin.php:203
    626753msgid "Your location"
    627754msgstr ""
  • termageddon-usercentrics/tags/1.9.0/public/class-termageddon-usercentrics-public.php

    r3326335 r3439658  
    222222
    223223    /**
     224     * Get augmented script snippets for output
     225     *
     226     * Retrieves script snippets from database, augments them with Usercentrics attributes,
     227     * and returns the concatenated result.
     228     *
     229     * @return string The concatenated augmented script snippets.
     230     */
     231    public function get_augmented_script_snippets(): string {
     232        $snippets = Termageddon_Usercentrics::get_script_snippets();
     233        if ( empty( $snippets ) || ! is_array( $snippets ) ) {
     234            return '';
     235        }
     236
     237        $augmented_scripts = array();
     238        foreach ( $snippets as $snippet ) {
     239            // Validate snippet structure
     240            if ( ! is_array( $snippet ) || ! isset( $snippet['script'], $snippet['service_id'] ) ) {
     241                continue;
     242            }
     243
     244            $script     = trim( $snippet['script'] );
     245            $service_id = $snippet['service_id'];
     246
     247            // Skip empty scripts
     248            if ( empty( $script ) ) {
     249                continue;
     250            }
     251
     252            // Augment the script with Usercentrics attributes
     253            $augmented = Termageddon_Usercentrics::augment_script_for_usercentrics( $script, $service_id );
     254            $augmented_scripts[] = $augmented;
     255        }
     256
     257        return ! empty( $augmented_scripts ) ? implode( PHP_EOL, $augmented_scripts ) : '';
     258    }
     259
     260    /**
    224261     * Dynamically hide or show the termageddon script based on settings. Outputs directly to script tag.
    225262     */
     
    274311        }
    275312
     313        // Append augmented script snippets
     314        $augmented_snippets = $this->get_augmented_script_snippets();
     315        if ( ! empty( $augmented_snippets ) ) {
     316            $script .= PHP_EOL . $augmented_snippets;
     317        }
     318
    276319        if ( empty( $script ) ) {
    277320            return;
     
    300343
    301344        if ( $settings_id && $should_enqueue_scripts ) {
    302             // Enqueue Embed Script.
    303             wp_enqueue_script( $this->plugin_name . '-scripts', '//privacy-proxy.usercentrics.eu/latest/uc-block.bundle.js', array(), $this->version, false );
    304             // note: this URL is placed here to "play by the rules"... but it doesn't actually do anything.
    305             // the whole thing will be overwritten by the script_loader_tag filter.
     345            // Only enqueue the auto-blocking script if manual control is disabled
     346            if ( ! Termageddon_Usercentrics::is_manual_script_control_enabled() ) {
     347                wp_enqueue_script( $this->plugin_name . '-scripts', '//privacy-proxy.usercentrics.eu/latest/uc-block.bundle.js', array(), $this->version, false );
     348                // note: this URL is placed here to "play by the rules"... but it doesn't actually do anything.
     349                // the whole thing will be overwritten by the script_loader_tag filter.
     350            }
    306351        }
    307352
  • termageddon-usercentrics/tags/1.9.0/termageddon-usercentrics.php

    r3366825 r3439658  
    1515 * Plugin Name:       Termageddon
    1616 * Description:       Each Termageddon license includes a consent solution. This plugin helps you install the consent solution with ease, while offering additional features.
    17  * Version:           1.8.2
     17 * Version:           1.9.0
    1818 * Author:            Termageddon
    1919 * Author URI:        https://termageddon.com
     
    3434 * Rename this for your plugin and update it as you release new versions.
    3535 */
    36 define( 'TERMAGEDDON_COOKIE_VERSION', '1.8.2' );
     36define( 'TERMAGEDDON_COOKIE_VERSION', '1.9.0' );
    3737
    3838define( 'TERMAGEDDON_COOKIE_PLUGIN_PATH', dirname( __FILE__ ) );// No trailing slash.
  • termageddon-usercentrics/tags/1.9.0/vendor/composer/autoload_static.php

    r3326335 r3439658  
    88{
    99    public static $prefixLengthsPsr4 = array (
    10         'M' => 
     10        'M' =>
    1111        array (
    1212            'MaxMind\\WebService\\' => 19,
     
    1414            'MaxMind\\Db\\' => 11,
    1515        ),
    16         'G' => 
     16        'G' =>
    1717        array (
    1818            'GeoIp2\\' => 7,
    1919        ),
    20         'C' => 
     20        'C' =>
    2121        array (
    2222            'Composer\\CaBundle\\' => 18,
     
    2525
    2626    public static $prefixDirsPsr4 = array (
    27         'MaxMind\\WebService\\' => 
     27        'MaxMind\\WebService\\' =>
    2828        array (
    2929            0 => __DIR__ . '/..' . '/maxmind/web-service-common/src/WebService',
    3030        ),
    31         'MaxMind\\Exception\\' => 
     31        'MaxMind\\Exception\\' =>
    3232        array (
    3333            0 => __DIR__ . '/..' . '/maxmind/web-service-common/src/Exception',
    3434        ),
    35         'MaxMind\\Db\\' => 
     35        'MaxMind\\Db\\' =>
    3636        array (
    3737            0 => __DIR__ . '/..' . '/maxmind-db/reader/src/MaxMind/Db',
    3838        ),
    39         'GeoIp2\\' => 
     39        'GeoIp2\\' =>
    4040        array (
    4141            0 => __DIR__ . '/..' . '/geoip2/geoip2/src',
    4242        ),
    43         'Composer\\CaBundle\\' => 
     43        'Composer\\CaBundle\\' =>
    4444        array (
    4545            0 => __DIR__ . '/..' . '/composer/ca-bundle/src',
  • termageddon-usercentrics/tags/1.9.0/vendor/composer/installed.php

    r3366825 r3439658  
    44        'pretty_version' => 'dev-main',
    55        'version' => 'dev-main',
    6         'reference' => '8c98b9ca2d8ab64221beecdd7d94295be96b6dbb',
     6        'reference' => 'a175036bc29629db0942e5f85c30b2438e887925',
    77        'type' => 'library',
    88        'install_path' => __DIR__ . '/../../',
     
    5050            'pretty_version' => 'dev-main',
    5151            'version' => 'dev-main',
    52             'reference' => '8c98b9ca2d8ab64221beecdd7d94295be96b6dbb',
     52            'reference' => 'a175036bc29629db0942e5f85c30b2438e887925',
    5353            'type' => 'library',
    5454            'install_path' => __DIR__ . '/../../',
  • termageddon-usercentrics/trunk/README.txt

    r3366825 r3439658  
    55Tested up to: 6.8.1
    66Requires PHP: 7.2
    7 Stable tag: 1.8.2
     7Stable tag: 1.9.0
    88License: GPLv2 or later
    99License URI: http://www.gnu.org/licenses/gpl-2.0.html
     
    189189== Changelog ==
    190190
     191= 1.9.0 =
     192
     193**✨ New Features:**
     194* Added "Manual Script Controller" allowing users to add any script and have it automatically be configured for Cookie Consent with automatic privacy blocking in mind.
     195
     196**🔧 Improvements:**
     197* Updated list of supported Smart Data Protector technologies for use with Advanced Configurations under Integrations.
     198* Added support for Delaware (DPDPA) & Indiana (ICDPA) for Geolocation.
     199
    191200= 1.8.2 =
    192201
  • termageddon-usercentrics/trunk/admin/class-termageddon-usercentrics-admin.php

    r3362792 r3439658  
    129129        wp_enqueue_script( 'select2', 'https://cdn.jsdelivr.net/npm/select2@4.1.0-rc.0/dist/js/select2.min.js', array( 'jquery' ), '4.1.0', true );
    130130
    131         // Initialize select2 for our multi-select fields
     131        // Initialize select2 for our multi-select and single-select fields
    132132        wp_add_inline_script( 'select2', '
    133133            jQuery(document).ready(function($) {
     
    135135                    width: "100%",
    136136                    placeholder: "Select providers...",
     137                    allowClear: true
     138                });
     139                $(".termageddon-singleselect").select2({
     140                    width: "100%",
     141                    placeholder: "Select a service...",
    137142                    allowClear: true
    138143                });
     
    289294    public function add_new_subsection( string $section, array $options = array() ) {
    290295
    291         $name        = ( isset( $options['name'] ) ? $options['name'] : false );
    292         $description = ( isset( $options['description'] ) ? $options['description'] : false );
     296        $name        = $options['name'] ?? false;
     297        $tags        = isset( $options['tags'] ) ? ' ' . $options['tags'] : '';
     298        $description = $options['description'] ?? false;
    293299        // Indent specifies whether or not the subsection should be indented.
    294         $indent = ( isset( $options['indent'] ) ? true === $options['indent'] : false );
     300        $indent = ( $options['indent'] ?? false ) === true;
    295301
    296302        // Slim slims down the column width for the initial options.
    297         $slim = ( isset( $options['slim'] ) ? true === $options['slim'] : false );
     303        $slim = ( $options['slim'] ?? false ) === true;
    298304
    299305        // Helper slims down the divider and displays a helper text by itself.
    300         $helper = ( isset( $options['helper'] ) ? true === $options['helper'] : false );
     306        $helper = ( $options['helper'] ?? false ) === true;
    301307
    302308        $section_contents = $helper ?
    303309        '
    304                     <span class="tu-section-title-helper">' . esc_html( $name ) . ':</span>
     310                    <span class="tu-section-title-helper">' . esc_html( $name ) . ':' . $tags . '</span>
    305311                    ' . ( empty( $description ) ? '' : '<p>' . wp_kses_post( $description ) . '</p>' )
    306312        : ' </div>
    307313                <div class="tu-toggle-section">
    308                     <span class="tu-section-title">' . esc_html( $name ) . ':</span>
     314                    <span class="tu-section-title">' . esc_html( $name ) . ':' . $tags . '</span>
    309315                    ' . ( empty( $description ) ? '' : '<p>' . wp_kses_post( $description ) . '</p>' ) . '
    310316                </div>
     
    343349
    344350    /**
     351     * Gets the Usercentrics providers array.
     352     *
     353     * Caches the result to avoid multiple file includes.
     354     *
     355     * @return array Array of provider IDs and names.
     356     */
     357    public static function get_usercentrics_providers(): array {
     358        static $providers = null;
     359
     360        if ( null === $providers ) {
     361            $providers = include TERMAGEDDON_COOKIE_PATH . 'admin/usercentrics-providers.php';
     362        }
     363
     364        return $providers;
     365    }
     366
     367
     368    /**
    345369     * Buildout all settings sections in prep for registering the settings.
    346370     *
     
    461485            'termageddon_usercentrics_embed_code', // option name.
    462486            '' // sanitization function.
     487        );
     488
     489        // BREAK SECTION FOR MANUAL SCRIPT CONTROLLER.
     490        $this->add_new_subsection(
     491            'termageddon_usercentrics_section_embed',
     492            array(
     493                'name'        => __( 'Manual Script Controller', 'termageddon-usercentrics' ),
     494                'tags' => $this->mark_as_beta(),
     495                'description' => __( 'This feature helps add the', 'termageddon-usercentrics' )
     496                .' <a href="https://termageddon.freshdesk.com/support/solutions/articles/66000529802-embedding-the-cookie-consent-solution-and-cookie-policy#:~:text=for%20simplicity%20purposes.-,Manual%20script%20control,-%2D%20You%20can%20also" target="_blank">'.__( 'manual control snippet', 'termageddon-usercentrics' ).'</a> '
     497                .__( 'into third party scripts (Google Analytics, Facebook Pixel, LinkedIn Insights Tag, etc.), which can help ensure that consent is obtained first prior to the script loading.', 'termageddon-usercentrics' )
     498                .'<br/><br/>'
     499                .__( 'Simply add a new snippet, enter the Service name (same name as the Service you listed in your Cookie Policy and Consent Tool questionnaire), and paste your embed code into the provided field. The plugin will then set up manual control of the script, helping ensure that it is blocked until consent is obtained by the user.', 'termageddon-usercentrics' )
     500                .'<br/><br/><em>'
     501                .__( 'Very important: be sure to', 'termageddon-usercentrics' )
     502                .' <a href="https://termageddon.freshdesk.com/support/solutions/articles/66000529802-embedding-the-cookie-consent-solution-and-cookie-policy" target="_blank">'.__( 'test the consent solution', 'termageddon-usercentrics' ).'</a> '
     503                .__( 'just in general, but also after making this update to ensure that scripts do not fire until consent is provided.', 'termageddon-usercentrics' )
     504                .'</em>',
     505            )
     506        );
     507
     508        // Import providers for script snippets
     509        $providers = self::get_usercentrics_providers();
     510
     511        // Script snippets field (full width, no label)
     512        add_settings_field(
     513            'termageddon_usercentrics_script_snippets',
     514            '',
     515            array( &$this, 'script_snippets_html' ),
     516            'termageddon-usercentrics',
     517            'termageddon_usercentrics_section_embed',
     518            array(
     519                'label_for'   => 'termageddon_usercentrics_script_snippets',
     520                'options'     => $providers,
     521                'class'       => 'tu-table-full-width',
     522            )
     523        );
     524
     525        register_setting(
     526            'termageddon_usercentrics_settings',
     527            'termageddon_usercentrics_script_snippets',
     528            array(
     529                'type'              => 'array',
     530                'sanitize_callback' => array( &$this, 'sanitize_script_snippets' ),
     531                'default'           => array(),
     532            )
    463533        );
    464534
     
    670740                'default'           => 'v2',
    671741            )
     742        );
     743
     744        // Disable Usercentrics Auto-blocking script
     745        add_settings_field(
     746            'termageddon_usercentrics_manual_script_control',
     747            __( 'Disable Usercentrics Auto-blocking script', 'termageddon-usercentrics' ),
     748            array( &$this, 'manual_script_control_html' ), // function which prints the field.
     749            'termageddon-usercentrics', // page slug.
     750            'termageddon_usercentrics_section_settings', // section ID.
     751            array(
     752                'label_for'   => 'termageddon_usercentrics_manual_script_control',
     753                'description' => __( 'By updating all external scripts to use the <a href="https://termageddon.freshdesk.com/support/solutions/articles/66000529802-embedding-the-cookie-consent-solution-and-cookie-policy#:~:text=for%20simplicity%20purposes.-,Manual%20script%20control,-%2D%20You%20can%20also" target="_blank">manual script controller</a>, you can disable usercentrics block script which will improve site-loading performance and improve reliability. Once enabled, please ensure you <a href="https://termageddon.freshdesk.com/support/solutions/articles/66000529802-embedding-the-cookie-consent-solution-and-cookie-policy" target="_blank">validate</a> that any external services are working as expected.', 'termageddon-usercentrics' ),
     754            )
     755        );
     756
     757        register_setting(
     758            'termageddon_usercentrics_settings', // settings group name.
     759            'termageddon_usercentrics_manual_script_control', // option name.
     760            '' // sanitization function.
    672761        );
    673762
     
    893982
    894983        // Import providers
    895         $providers = include TERMAGEDDON_COOKIE_PATH . 'admin/usercentrics-providers.php';
     984        $providers = self::get_usercentrics_providers();
    896985
    897986        // Auto-refresh on consent field
     
    12681357
    12691358    /**
     1359     * The HTML field for the manual script control checkbox.
     1360     *
     1361     * @param array $args The arguments provided by the add_settings_field() method.
     1362     * @return void
     1363     */
     1364    public function manual_script_control_html( array $args ) {
     1365        self::generate_checkbox( 'manual_script_control', '', $args );
     1366    }
     1367
     1368    /**
    12701369     * The HTML field for the disable CDN checkbox.
    12711370     *
     
    13821481
    13831482        echo '
    1384         <div class="tu-section-settings">
    1385             <div class="tu-section">';
     1483        <div class="tu-settings-section">
     1484            <div class="tu-toggle-section">';
    13861485
    13871486    }
     
    14181517
    14191518        echo '<p>' .
    1420             esc_html__( 'Not sure what to select? Review', 'termageddon-usercentrics' ) . ' <a href="https://termageddon.freshdesk.com/support/solutions/articles/66000503289-how-to-activate-a-cookie-policy-and-cookie-consent-solution" target="_blank">' . esc_html__( 'this article', 'termageddon-usercentrics' ) . '</a> ' . esc_html__( 'along with page 1 of your Privacy Policy questionnaire within ', 'termageddon-usercentrics' ) . '<a href="https://app.termageddon.com/home" target="_blank">app.termageddon.com</a>.' .
     1519            esc_html__( 'Not sure what to select? Review', 'termageddon-usercentrics' ) . ' <a href="https://termageddon.freshdesk.com/support/solutions/articles/66000530091-how-to-activate-the-cookie-policy-and-consent-solution" target="_blank">' . esc_html__( 'this article', 'termageddon-usercentrics' ) . '</a> ' . esc_html__( 'along with page 1 of your Privacy Policy questionnaire within ', 'termageddon-usercentrics' ) . '<a href="https://policies.termageddon.com/home" target="_blank">policies.termageddon.com</a>.' .
    14211520        '</p>';
    14221521
     
    14581557        }
    14591558        return array_map( 'sanitize_text_field', $value );
     1559    }
     1560
     1561    /**
     1562     * Sanitize script snippets array
     1563     *
     1564     * Validates each snippet for proper service ID and script tag presence.
     1565     * Invalid snippets are skipped with appropriate error messages.
     1566     *
     1567     * @param mixed $value The script snippets array to sanitize.
     1568     * @return array The sanitized script snippets array.
     1569     */
     1570    public function sanitize_script_snippets( $value ): array {
     1571        if ( ! is_array( $value ) ) {
     1572            return array();
     1573        }
     1574
     1575        $providers = self::get_usercentrics_providers();
     1576        $sanitized = array();
     1577
     1578        foreach ( $value as $index => $snippet ) {
     1579            if ( ! is_array( $snippet ) ) {
     1580                continue;
     1581            }
     1582
     1583            // Validate and sanitize service_id
     1584            $service_id = sanitize_text_field( $snippet['service_id'] ?? '' );
     1585            if ( empty( $service_id ) || ! isset( $providers[ $service_id ] ) ) {
     1586                $this->add_snippet_error(
     1587                    'invalid_service_' . $index,
     1588                    sprintf(
     1589                        /* translators: %d: snippet index number */
     1590                        __( 'Script snippet #%d was not saved: Please select a valid service.', 'termageddon-usercentrics' ),
     1591                        $index + 1
     1592                    )
     1593                );
     1594                continue;
     1595            }
     1596
     1597            // Get script content - don't sanitize here, will be processed via augment_script_for_usercentrics on output
     1598            // Similar to how embed_code is handled (no sanitization callback)
     1599            $script = trim( $snippet['script'] ?? '' );
     1600
     1601            // Validate that the script is not empty
     1602            if ( empty( $script ) ) {
     1603                $this->add_snippet_error(
     1604                    'empty_script_' . $index,
     1605                    sprintf(
     1606                        /* translators: %1$s: service name, %2$d: snippet index number */
     1607                        __( 'Script snippet for "%1$s" (#%2$d) was not saved: The script code field cannot be empty.', 'termageddon-usercentrics' ),
     1608                        $providers[ $service_id ],
     1609                        $index + 1
     1610                    )
     1611                );
     1612                continue;
     1613            }
     1614
     1615            // Check if content contains script tags
     1616            if ( ! preg_match( '/<script[^>]*>/i', $script ) ) {
     1617                $service_name = $providers[ $service_id ];
     1618
     1619                // Check if it contains other HTML tags (like div, span, etc.)
     1620                if ( preg_match( '/<(div|span|p|a|img|iframe|button|input|form|table|ul|ol|li|h[1-6])[^>]*>/i', $script ) ) {
     1621                    $error_message = sprintf(
     1622                        /* translators: %1$s: service name, %2$d: snippet index number */
     1623                        __( 'Script snippet for "%1$s" (#%2$d) was not saved: Only script tags are allowed. Please remove any HTML elements (div, span, etc.) and use only &lt;script&gt; tags.', 'termageddon-usercentrics' ),
     1624                        $service_name,
     1625                        $index + 1
     1626                    );
     1627                } else {
     1628                    $error_message = sprintf(
     1629                        /* translators: %1$s: service name, %2$d: snippet index number */
     1630                        __( 'Script snippet for "%1$s" (#%2$d) was not saved: The script code must contain at least one &lt;script&gt; tag.', 'termageddon-usercentrics' ),
     1631                        $service_name,
     1632                        $index + 1
     1633                    );
     1634                }
     1635
     1636                $this->add_snippet_error( 'invalid_content_' . $index, $error_message );
     1637                continue;
     1638            }
     1639
     1640            $sanitized[] = array(
     1641                'script'     => $script,
     1642                'service_id' => $service_id,
     1643            );
     1644        }
     1645
     1646        return $sanitized;
     1647    }
     1648
     1649    /**
     1650     * Helper method to add settings errors for script snippets
     1651     *
     1652     * @param string $code    Error code.
     1653     * @param string $message Error message.
     1654     * @return void
     1655     */
     1656    private function add_snippet_error( string $code, string $message ): void {
     1657        add_settings_error(
     1658            'termageddon_usercentrics_script_snippets',
     1659            $code,
     1660            $message,
     1661            'error'
     1662        );
    14601663    }
    14611664
     
    15061709    }
    15071710
     1711    /**
     1712     * The HTML field for the script snippets repeater
     1713     *
     1714     * @param array $args The arguments provided by the add_settings_field() method.
     1715     * @return void
     1716     */
     1717    public function script_snippets_html( array $args ) {
     1718        $options = $args['options'];
     1719        $snippets = get_option( 'termageddon_usercentrics_script_snippets', array() );
     1720
     1721        // Ensure snippets is an array
     1722        if ( ! is_array( $snippets ) ) {
     1723            $snippets = array();
     1724        }
     1725        ?>
     1726        <div id="termageddon-script-snippets-container">
     1727            <?php if ( ! empty( $snippets ) ) : ?>
     1728                <?php foreach ( $snippets as $index => $snippet ) : ?>
     1729                    <?php
     1730                    // Get service name for header
     1731                    $service_id = isset( $snippet['service_id'] ) ? $snippet['service_id'] : '';
     1732                    $service_name = '';
     1733                    if ( ! empty( $service_id ) && isset( $options[ $service_id ] ) ) {
     1734                        $service_name = $options[ $service_id ];
     1735                    } else {
     1736                        $service_name = __( 'New Script Snippet', 'termageddon-usercentrics' );
     1737                    }
     1738
     1739                    // Count script tags
     1740                    $script_content = isset( $snippet['script'] ) ? $snippet['script'] : '';
     1741                    $script_count = preg_match_all( '/<script/i', $script_content );
     1742                    ?>
     1743                    <div class="termageddon-script-snippet-row" data-index="<?php echo esc_attr( $index ); ?>">
     1744                        <div class="termageddon-snippet-accordion-item" style="margin-bottom: 15px; border: 1px solid #ddd; background: #f9f9f9;">
     1745                            <div class="termageddon-snippet-accordion-header" style="display: flex; justify-content: space-between; align-items: center; padding: 15px; cursor: pointer; user-select: none;">
     1746                                <div style="display: flex; align-items: center; gap: 10px; flex: 1;">
     1747                                    <span class="termageddon-snippet-service-name"><?php echo esc_html( $service_name ); ?></span>
     1748                                    <span class="termageddon-snippet-badge<?php echo $script_count > 0 ? ' termageddon-snippet-badge-success' : ''; ?>"><?php echo esc_html( $script_count . ' script' . ( $script_count !== 1 ? 's' : '' ) . ' identified' ); ?></span>
     1749                                </div>
     1750                                <div style="display: flex; align-items: center; gap: 10px;">
     1751                                    <span class="termageddon-snippet-caret dashicons dashicons-arrow-down-alt2" style="transition: transform 0.3s ease;"></span>
     1752                                    <button type="button" class="button termageddon-remove-snippet" style="color: #dc3232; margin: 0;"><?php esc_html_e( 'Remove', 'termageddon-usercentrics' ); ?></button>
     1753                                </div>
     1754                            </div>
     1755                            <div class="termageddon-snippet-accordion-content collapsed" style="padding: 0 15px 15px 15px; display: none;">
     1756                                <div style="margin-top: 15px; margin-bottom: 10px;">
     1757                                    <label for="termageddon_usercentrics_script_snippets_<?php echo esc_attr( $index ); ?>_service_id">
     1758                                        <strong><?php esc_html_e( 'Service', 'termageddon-usercentrics' ); ?></strong>
     1759                                    </label>
     1760                                    <select
     1761                                        name="termageddon_usercentrics_script_snippets[<?php echo esc_attr( $index ); ?>][service_id]"
     1762                                        id="termageddon_usercentrics_script_snippets_<?php echo esc_attr( $index ); ?>_service_id"
     1763                                        class="termageddon-singleselect"
     1764                                        style="width: 100%;"
     1765                                    >
     1766                                        <option value=""><?php esc_html_e( 'Select a service...', 'termageddon-usercentrics' ); ?></option>
     1767                                        <?php foreach ( $options as $key => $label ) : ?>
     1768                                            <option value="<?php echo esc_attr( $key ); ?>" <?php selected( $service_id, $key ); ?>>
     1769                                                <?php echo esc_html( $label ); ?>
     1770                                            </option>
     1771                                        <?php endforeach; ?>
     1772                                    </select>
     1773                                </div>
     1774                                <div>
     1775                                    <label for="termageddon_usercentrics_script_snippets_<?php echo esc_attr( $index ); ?>_script">
     1776                                        <strong><?php esc_html_e( 'Script Code', 'termageddon-usercentrics' ); ?></strong>
     1777                                    </label>
     1778                                    <textarea
     1779                                        class="termageddon-embed-code termageddon-script-textarea"
     1780                                        name="termageddon_usercentrics_script_snippets[<?php echo esc_attr( $index ); ?>][script]"
     1781                                        id="termageddon_usercentrics_script_snippets_<?php echo esc_attr( $index ); ?>_script"
     1782                                        rows="7"
     1783                                        style="width: 100%;"
     1784                                        placeholder="Both external and inline scripts are supported.&#10;&#10;External Script:&#10;&lt;script src=&quot;https://example.com/script.js&quot;&gt;&lt;/script&gt;&#10;&#10;Inline script:&#10;&lt;script&gt;console.log(&quot;Loaded&quot;)&lt;/script&gt;"
     1785                                    ><?php echo esc_textarea( $script_content ); ?></textarea>
     1786                                </div>
     1787                            </div>
     1788                        </div>
     1789                    </div>
     1790                <?php endforeach; ?>
     1791            <?php endif; ?>
     1792        </div>
     1793        <button type="button" class="button termageddon-add-snippet" style="margin-top: 10px;"><?php esc_html_e( '+ Add Script Snippet', 'termageddon-usercentrics' ); ?></button>
     1794        <?php
     1795        // Generate options HTML for template
     1796        $options_html = '<option value="">' . esc_html__( 'Select a service...', 'termageddon-usercentrics' ) . '</option>';
     1797        foreach ( $options as $key => $label ) {
     1798            $options_html .= '<option value="' . esc_attr( $key ) . '">' . esc_html( $label ) . '</option>';
     1799        }
     1800        ?>
     1801        <script type="text/template" id="termageddon-script-snippet-template" data-options="<?php echo esc_attr( $options_html ); ?>">
     1802            <div class="termageddon-script-snippet-row" data-index="{{INDEX}}">
     1803                <div class="termageddon-snippet-accordion-item" style="margin-bottom: 15px; border: 1px solid #ddd; background: #f9f9f9;">
     1804                    <div class="termageddon-snippet-accordion-header" style="display: flex; justify-content: space-between; align-items: center; padding: 15px; cursor: pointer; user-select: none;">
     1805                        <div style="display: flex; align-items: center; gap: 10px; flex: 1;">
     1806                            <span class="termageddon-snippet-service-name"><?php echo esc_html__( 'New Script Snippet', 'termageddon-usercentrics' ); ?></span>
     1807                            <span class="termageddon-snippet-badge">0 scripts identified</span>
     1808                        </div>
     1809                        <div style="display: flex; align-items: center; gap: 10px;">
     1810                            <span class="termageddon-snippet-caret dashicons dashicons-arrow-down-alt2" style="transition: transform 0.3s ease;"></span>
     1811                            <button type="button" class="button termageddon-remove-snippet" style="color: #dc3232; margin: 0;"><?php echo esc_html__( 'Remove', 'termageddon-usercentrics' ); ?></button>
     1812                        </div>
     1813                    </div>
     1814                    <div class="termageddon-snippet-accordion-content" style="padding: 0 15px 15px 15px;">
     1815                        <div style="margin-top: 15px; margin-bottom: 10px;">
     1816                            <label for="termageddon_usercentrics_script_snippets_{{INDEX}}_service_id">
     1817                                <strong><?php echo esc_html__( 'Service', 'termageddon-usercentrics' ); ?></strong>
     1818                            </label>
     1819                            <select
     1820                                name="termageddon_usercentrics_script_snippets[{{INDEX}}][service_id]"
     1821                                id="termageddon_usercentrics_script_snippets_{{INDEX}}_service_id"
     1822                                class="termageddon-singleselect"
     1823                                style="width: 100%;"
     1824                            >
     1825                                <?php echo $options_html; ?>
     1826                            </select>
     1827                        </div>
     1828                        <div>
     1829                            <label for="termageddon_usercentrics_script_snippets_{{INDEX}}_script">
     1830                                <strong><?php echo esc_html__( 'Script Code', 'termageddon-usercentrics' ); ?></strong>
     1831                            </label>
     1832                            <textarea
     1833                                class="termageddon-embed-code termageddon-script-textarea"
     1834                                name="termageddon_usercentrics_script_snippets[{{INDEX}}][script]"
     1835                                id="termageddon_usercentrics_script_snippets_{{INDEX}}_script"
     1836                                rows="7"
     1837                                style="width: 100%;"
     1838                                placeholder="Both external and inline scripts are supported.&#10;&#10;External Script:&#10;&lt;script src=&quot;https://example.com/script.js&quot;&gt;&lt;/script&gt;&#10;&#10;Inline script:&#10;&lt;script&gt;console.log(&quot;Loaded&quot;)&lt;/script&gt;"
     1839                            ></textarea>
     1840                        </div>
     1841                    </div>
     1842                </div>
     1843            </div>
     1844        </script>
     1845        <?php
     1846    }
     1847
    15081848}
  • termageddon-usercentrics/trunk/admin/css/termageddon-usercentrics-admin.css

    r3326335 r3439658  
    66textarea.termageddon-embed-code {
    77    width: 100%;
    8     height: 250px;
     8    height: 150px;
    99}
    1010
    1111/* Section Settings */
    1212.tu-toggle-section,
    13 .tu-section-settings {
     13.tu-section-settings,
     14.tu-settings-section {
    1415    margin-top: 2rem;
    1516}
     
    3637    pointer-events: none;
    3738}
    38 .tu-toggle-section .form-table,
    39 .tu-tab-integrations .tu-settings-section .form-table {
     39.tu-toggle-section .form-table {
    4040    margin-left: 2rem;
    4141}
     
    5252
    5353/* Settings Section */
     54#termageddon-script-snippets-container,
     55.tu-settings-section {
     56    padding-left: 2rem;
     57    padding-right: 2rem;
     58}
     59
     60.tu-settings-tab.tu-tab-config .tu-settings-section {
     61    padding-left: 0;
     62    padding-right: 0;
     63}
     64
    5465.tu-settings-section .form-table th {
    5566    width: 300px;
     
    251262    margin-bottom: 8px;
    252263}
     264
     265/* Full-width settings field (for script snippets) */
     266.form-table tr.tu-table-full-width th {
     267    display: none;
     268}
     269
     270.form-table tr.tu-table-full-width td {
     271    display: block;
     272    padding: 0;
     273}
     274
     275/* Script Snippets Accordion */
     276.termageddon-snippet-accordion-item {
     277    border-radius: 4px;
     278    overflow: hidden;
     279}
     280
     281.termageddon-snippet-accordion-header {
     282    background: #fff;
     283    border-bottom: 1px solid #ddd;
     284    transition: background-color 0.2s ease;
     285}
     286
     287.termageddon-snippet-accordion-header:hover {
     288    background: #f5f5f5;
     289}
     290
     291.termageddon-snippet-service-name {
     292    font-weight: 600;
     293    font-size: 14px;
     294    color: #23282d;
     295}
     296
     297.termageddon-snippet-badge {
     298    display: inline-flex;
     299    align-items: center;
     300    justify-content: center;
     301    min-width: 24px;
     302    height: 24px;
     303    padding: 0 8px;
     304    background-color: #ccc;
     305    color: #fff;
     306    border-radius: 12px;
     307    font-size: 12px;
     308    font-weight: 600;
     309    line-height: 1;
     310    white-space: nowrap;
     311}
     312
     313.termageddon-snippet-badge-success {
     314    background-color: #00a32a !important;
     315}
     316
     317.termageddon-snippet-caret {
     318    color: #646970;
     319    font-size: 20px;
     320    width: 20px;
     321    height: 20px;
     322}
     323
     324.termageddon-snippet-accordion-content {
     325    background: #f9f9f9;
     326    transition: all 0.3s ease;
     327}
     328
     329.termageddon-snippet-accordion-content.collapsed {
     330    display: none !important;
     331}
     332
     333.termageddon-snippet-accordion-content:not(.collapsed) {
     334    display: block !important;
     335}
  • termageddon-usercentrics/trunk/admin/css/termageddon-usercentrics-admin.min.css

    r3266555 r3439658  
    1 textarea.termageddon-embed-code{width:100%;height:250px}.tu-section-settings,.tu-toggle-section{margin-top:2rem}.tu-settings-tab.tu-tab-integrations .tu-section{display:none}.tu-toggle-section .tu-section-title{font-size:125%;font-weight:800}.tu-toggle-section .tu-section-title-helper{padding:1rem;color:#6c6c6c;font-style:italic}.tu-toggle-section input[readonly]{opacity:50%;pointer-events:none}.tu-toggle-section .form-table{margin-left:2rem}.tu-toggle-section .form-table td,.tu-toggle-section .form-table th{padding:.5rem 0}.tu-toggle-section .form-table th{width:300px}.tu-toggle-section.slim-section .form-table th{width:125px}.tu-settings-section .form-table th{width:300px}.tu-section-hidden{display:none}.tu-label-success{background-color:#3db44c;color:#fff;padding:3px 5px;border-radius:5px;font-size:60%}.tu-label-info{background-color:#019ed5;color:#fff;padding:3px 5px;border-radius:5px;font-size:60%}.tu-label-warning{background-color:orange;color:#fff;padding:3px 5px;border-radius:5px;font-size:60%}input[type=checkbox].wppd-ui-toggle{-webkit-appearance:none;-moz-appearance:none;appearance:none;-webkit-tap-highlight-color:transparent;width:auto;height:auto;vertical-align:middle;position:relative;border:0;outline:0;cursor:pointer;margin:0 4px;background:0 0;box-shadow:none}input[type=checkbox].wppd-ui-toggle:focus{box-shadow:none}input[type=checkbox].wppd-ui-toggle:after{content:"";font-size:6px;font-weight:400;line-height:18px;text-indent:-14px;color:#fff;width:36px;height:18px;display:inline-block;background-color:#a7aaad;border-radius:72px;box-shadow:0 0 12px rgb(0 0 0 / 15%) inset}input[type=checkbox].wppd-ui-toggle:before{content:"";width:14px;height:14px;display:block;position:absolute;top:2px;left:2px;margin:0;border-radius:50%;background-color:#fff}input[type=checkbox].wppd-ui-toggle:checked:before{left:20px;margin:0;background-color:#fff}input[type=checkbox].wppd-ui-toggle,input[type=checkbox].wppd-ui-toggle:after,input[type=checkbox].wppd-ui-toggle:before,input[type=checkbox].wppd-ui-toggle:checked:after,input[type=checkbox].wppd-ui-toggle:checked:before{transition:ease .15s}input[type=checkbox].wppd-ui-toggle:checked:after{content:"ON";background-color:#2271b1}input[type=checkbox].wppd-ui-toggle.label-hidden:after{width:48px}input[type=checkbox].wppd-ui-toggle.label-hidden:checked:before{left:32px}input[type=checkbox].wppd-ui-toggle.label-hidden:checked:after{content:"HIDDEN"}input[type=checkbox].wppd-ui-toggle.label-enabled:after{font-size:8px;width:60px;content:"DISABLED";text-indent:15px}input[type=checkbox].wppd-ui-toggle.label-enabled:checked:before{left:44px}input[type=checkbox].wppd-ui-toggle.label-enabled:checked:after{background-color:#1ed14b;content:"ENABLED";text-indent:-14px}.notice-inline{border-top:1px solid #c3c4c7;border-bottom:1px solid #c3c4c7;border-right:1px solid #c3c4c7;border-left-width:4px;border-left-style:solid;background:#fff;box-shadow:0 1px 1px rgba(0,0,0,.04);margin:5px 15px 2px;padding:1px 12px}.tu-settings-section label em{font-size:12px;font-weight:400}.tu-alert-error{color:#d63638;background:#fcf0f1;padding:10px;border-left:4px solid #d63638;margin:10px 0}.tu-alert-warning{color:#856404;background:#fff3cd;padding:10px;border-left:4px solid #ffc107;margin:10px 0}.tu-alert-success{color:#00a32a;background:#edfaef;padding:10px;border-left:4px solid #00a32a;margin:10px 0}.button-danger{background:#d63638!important;border-color:#d63638!important;color:#fff!important}.button-danger:focus,.button-danger:hover{background:#b32d2e!important;border-color:#b32d2e!important;color:#fff!important}.button-warning{background:#ffc107!important;border-color:#ffc107!important;color:#333!important;font-weight:700}.button-warning:focus,.button-warning:hover{background:#e0a800!important;border-color:#e0a800!important;color:#000!important}textarea.select2-search__field{margin-bottom:8px}
     1textarea.termageddon-embed-code{width:100%;height:150px}.tu-section-settings,.tu-settings-section,.tu-toggle-section{margin-top:2rem}.tu-settings-tab.tu-tab-integrations .tu-section{display:none}.tu-toggle-section .tu-section-title{font-size:125%;font-weight:800}.tu-toggle-section .tu-section-title-helper{padding:1rem;color:#6c6c6c;font-style:italic}.tu-toggle-section input[readonly]{opacity:50%;pointer-events:none}.tu-toggle-section .form-table{margin-left:2rem}.tu-toggle-section .form-table td,.tu-toggle-section .form-table th{padding:.5rem 0}.tu-toggle-section .form-table th{width:300px}.tu-toggle-section.slim-section .form-table th{width:125px}#termageddon-script-snippets-container,.tu-settings-section{padding-left:2rem;padding-right:2rem}.tu-settings-tab.tu-tab-config .tu-settings-section{padding-left:0;padding-right:0}.tu-settings-section .form-table th{width:300px}.tu-tab-integrations .tu-settings-section .form-table th{width:500px}.tu-section-hidden{display:none}.tu-label-success{background-color:#3db44c;color:#fff;padding:3px 5px;border-radius:5px;font-size:60%}.tu-label-info{background-color:#019ed5;color:#fff;padding:3px 5px;border-radius:5px;font-size:60%}.tu-label-warning{background-color:orange;color:#fff;padding:3px 5px;border-radius:5px;font-size:60%}input[type=checkbox].wppd-ui-toggle{-webkit-appearance:none;-moz-appearance:none;appearance:none;-webkit-tap-highlight-color:transparent;width:auto;height:auto;vertical-align:middle;position:relative;border:0;outline:0;cursor:pointer;margin:0 4px;background:0 0;box-shadow:none}input[type=checkbox].wppd-ui-toggle:focus{box-shadow:none}input[type=checkbox].wppd-ui-toggle:after{content:"";font-size:6px;font-weight:400;line-height:18px;text-indent:-14px;color:#fff;width:36px;height:18px;display:inline-block;background-color:#a7aaad;border-radius:72px;box-shadow:0 0 12px rgb(0 0 0 / 15%) inset}input[type=checkbox].wppd-ui-toggle:before{content:"";width:14px;height:14px;display:block;position:absolute;top:2px;left:2px;margin:0;border-radius:50%;background-color:#fff}input[type=checkbox].wppd-ui-toggle:checked:before{left:20px;margin:0;background-color:#fff}input[type=checkbox].wppd-ui-toggle,input[type=checkbox].wppd-ui-toggle:after,input[type=checkbox].wppd-ui-toggle:before,input[type=checkbox].wppd-ui-toggle:checked:after,input[type=checkbox].wppd-ui-toggle:checked:before{transition:ease .15s}input[type=checkbox].wppd-ui-toggle:checked:after{content:"ON";background-color:#2271b1}input[type=checkbox].wppd-ui-toggle.label-hidden:after{width:48px}input[type=checkbox].wppd-ui-toggle.label-hidden:checked:before{left:32px}input[type=checkbox].wppd-ui-toggle.label-hidden:checked:after{content:"HIDDEN"}input[type=checkbox].wppd-ui-toggle.label-enabled:after{font-size:8px;width:60px;content:"DISABLED";text-indent:15px}input[type=checkbox].wppd-ui-toggle.label-enabled:checked:before{left:44px}input[type=checkbox].wppd-ui-toggle.label-enabled:checked:after{background-color:#1ed14b;content:"ENABLED";text-indent:-14px}.notice-inline{border-top:1px solid #c3c4c7;border-bottom:1px solid #c3c4c7;border-right:1px solid #c3c4c7;border-left-width:4px;border-left-style:solid;background:#fff;box-shadow:0 1px 1px rgba(0,0,0,.04);margin:5px 15px 2px;padding:1px 12px}.tu-settings-section label em{font-size:12px;font-weight:400}.tu-alert-error{color:#d63638;background:#fcf0f1;padding:10px;border-left:4px solid #d63638;margin:10px 0}.tu-alert-warning{color:#856404;background:#fff3cd;padding:10px;border-left:4px solid #ffc107;margin:10px 0}.tu-alert-success{color:#00a32a;background:#edfaef;padding:10px;border-left:4px solid #00a32a;margin:10px 0}.button-danger{background:#d63638!important;border-color:#d63638!important;color:#fff!important}.button-danger:focus,.button-danger:hover{background:#b32d2e!important;border-color:#b32d2e!important;color:#fff!important}.button-warning{background:#ffc107!important;border-color:#ffc107!important;color:#333!important;font-weight:700}.button-warning:focus,.button-warning:hover{background:#e0a800!important;border-color:#e0a800!important;color:#000!important}textarea.select2-search__field{margin-bottom:8px}.form-table tr.tu-table-full-width th{display:none}.form-table tr.tu-table-full-width td{display:block;padding:0}.termageddon-snippet-accordion-item{border-radius:4px;overflow:hidden}.termageddon-snippet-accordion-header{background:#fff;border-bottom:1px solid #ddd;transition:background-color .2s ease}.termageddon-snippet-accordion-header:hover{background:#f5f5f5}.termageddon-snippet-service-name{font-weight:600;font-size:14px;color:#23282d}.termageddon-snippet-badge{display:inline-flex;align-items:center;justify-content:center;min-width:24px;height:24px;padding:0 8px;background-color:#ccc;color:#fff;border-radius:12px;font-size:12px;font-weight:600;line-height:1;white-space:nowrap}.termageddon-snippet-badge-success{background-color:#00a32a!important}.termageddon-snippet-caret{color:#646970;font-size:20px;width:20px;height:20px}.termageddon-snippet-accordion-content{background:#f9f9f9;transition:all .3s ease}.termageddon-snippet-accordion-content.collapsed{display:none!important}.termageddon-snippet-accordion-content:not(.collapsed){display:block!important}
  • termageddon-usercentrics/trunk/admin/js/termageddon-usercentrics-admin.js

    r3284346 r3439658  
    141141                    ""
    142142                )
    143                 .replace(
    144                     /<script>uc.setCustomTranslations.*<\/script>/g,
    145                     ""
    146                 )
     143                .replace(/<script>uc.setCustomTranslations.*<\/script>/g, "")
    147144                .trim();
    148145
     
    163160        });
    164161    }
     162
     163    // ============================================ //
     164    // ======== Script Snippets Repeater ========== //
     165    // ============================================ //
     166
     167    // Constants
     168    const SNIPPET_CONSTANTS = {
     169        ANIMATION_DURATION: 300,
     170        CARET_ROTATION: {
     171            COLLAPSED: "rotate(0deg)",
     172            EXPANDED: "rotate(180deg)",
     173        },
     174        SELECT2_OPTIONS: {
     175            width: "100%",
     176            placeholder: "Select a service...",
     177            allowClear: true,
     178        },
     179        DEFAULT_SERVICE_TEXT: "New Script Snippet",
     180    };
     181
     182    const snippetsContainer = $("#termageddon-script-snippets-container");
     183    const addSnippetButton = $(".termageddon-add-snippet");
     184    const template = $("#termageddon-script-snippet-template");
     185
     186    /**
     187     * Count script tags in textarea
     188     * @param {HTMLElement} textarea - The textarea element
     189     * @returns {number} Number of script tags found
     190     */
     191    function countScriptTags(textarea) {
     192        const content = $(textarea).val() || "";
     193        const matches = content.match(/<script/gi);
     194        return matches ? matches.length : 0;
     195    }
     196
     197    /**
     198     * Update badge with script count
     199     * @param {jQuery} $row - The row element
     200     */
     201    function updateScriptBadge($row) {
     202        const $textarea = $row.find(".termageddon-script-textarea");
     203        const $badge = $row.find(".termageddon-snippet-badge");
     204        const count = countScriptTags($textarea[0]);
     205
     206        if (count > 0) {
     207            $badge.text(`${count} script${count !== 1 ? "s" : ""} identified`);
     208            $badge.addClass("termageddon-snippet-badge-success");
     209        } else {
     210            $badge.text("0 scripts identified");
     211            $badge.removeClass("termageddon-snippet-badge-success");
     212        }
     213    }
     214
     215    /**
     216     * Update service name in header
     217     * @param {jQuery} $row - The row element
     218     */
     219    function updateServiceName($row) {
     220        const $select = $row.find(".termageddon-singleselect");
     221        const $serviceName = $row.find(".termageddon-snippet-service-name");
     222        const selectedText = $select.find("option:selected").text();
     223
     224        $serviceName.text(
     225            $select.val() && selectedText
     226                ? selectedText
     227                : SNIPPET_CONSTANTS.DEFAULT_SERVICE_TEXT
     228        );
     229    }
     230
     231    /**
     232     * Toggle accordion open/closed state
     233     * @param {jQuery} $header - The accordion header element
     234     */
     235    function toggleAccordion($header) {
     236        const $content = $header.siblings(
     237            ".termageddon-snippet-accordion-content"
     238        );
     239        const $caret = $header.find(".termageddon-snippet-caret");
     240
     241        if ($content.is(":visible")) {
     242            // Collapsing
     243            $content.slideUp(SNIPPET_CONSTANTS.ANIMATION_DURATION, function () {
     244                $(this).addClass("collapsed");
     245            });
     246            $caret.css("transform", SNIPPET_CONSTANTS.CARET_ROTATION.COLLAPSED);
     247        } else {
     248            // Expanding
     249            $content
     250                .removeClass("collapsed")
     251                .slideDown(SNIPPET_CONSTANTS.ANIMATION_DURATION);
     252            $caret.css("transform", SNIPPET_CONSTANTS.CARET_ROTATION.EXPANDED);
     253        }
     254    }
     255
     256    /**
     257     * Set accordion state without animation
     258     * @param {jQuery} $content - The accordion content element
     259     * @param {jQuery} $caret - The caret icon element
     260     * @param {boolean} isCollapsed - Whether the accordion should be collapsed
     261     */
     262    function setAccordionState($content, $caret, isCollapsed) {
     263        if (isCollapsed) {
     264            $content.hide();
     265            $caret.css("transform", SNIPPET_CONSTANTS.CARET_ROTATION.COLLAPSED);
     266        } else {
     267            $content.show();
     268            $caret.css("transform", SNIPPET_CONSTANTS.CARET_ROTATION.EXPANDED);
     269        }
     270    }
     271
     272    /**
     273     * Initialize accordion for a row
     274     * @param {jQuery} $row - The row element
     275     */
     276    function initAccordionRow($row) {
     277        // Update badge and service name on load
     278        updateScriptBadge($row);
     279        updateServiceName($row);
     280
     281        // Set initial caret rotation based on collapsed state
     282        const $content = $row.find(".termageddon-snippet-accordion-content");
     283        const $caret = $row.find(".termageddon-snippet-caret");
     284        setAccordionState($content, $caret, $content.hasClass("collapsed"));
     285    }
     286
     287    /**
     288     * Initialize Select2 for single-select fields
     289     * @param {jQuery} $element - Optional specific element to initialize, or all if not provided
     290     */
     291    function initSelect2($element) {
     292        const $targets = $element || $(".termageddon-singleselect");
     293
     294        $targets.each(function () {
     295            if (!$(this).hasClass("select2-hidden-accessible")) {
     296                $(this).select2(SNIPPET_CONSTANTS.SELECT2_OPTIONS);
     297            }
     298        });
     299    }
     300
     301    // Initialize on page load
     302    if (snippetsContainer.length) {
     303        initSelect2();
     304        snippetsContainer
     305            .find(".termageddon-script-snippet-row")
     306            .each(function () {
     307                initAccordionRow($(this));
     308            });
     309    }
     310
     311    // Accordion header click handler
     312    $(document).on(
     313        "click.tu",
     314        ".termageddon-snippet-accordion-header",
     315        function (e) {
     316            // Don't toggle if clicking on remove button
     317            if ($(e.target).closest(".termageddon-remove-snippet").length) {
     318                return;
     319            }
     320            toggleAccordion($(this));
     321        }
     322    );
     323
     324    // Update service name when dropdown changes (handles both regular and Select2)
     325    $(document).on(
     326        "change.tu select2:select.tu select2:clear.tu",
     327        ".termageddon-singleselect",
     328        function () {
     329            const $row = $(this).closest(".termageddon-script-snippet-row");
     330            updateServiceName($row);
     331        }
     332    );
     333
     334    // Update badge when textarea changes
     335    $(document).on(
     336        "input.tu change.tu",
     337        ".termageddon-script-textarea",
     338        function () {
     339            const $row = $(this).closest(".termageddon-script-snippet-row");
     340            updateScriptBadge($row);
     341        }
     342    );
     343
     344    /**
     345     * Get the next available index for a new snippet
     346     * @returns {number} The next index to use
     347     */
     348    function getNextSnippetIndex() {
     349        let maxIndex = -1;
     350        snippetsContainer
     351            .find(".termageddon-script-snippet-row")
     352            .each(function () {
     353                const index = parseInt($(this).attr("data-index"), 10);
     354                if (!isNaN(index) && index > maxIndex) {
     355                    maxIndex = index;
     356                }
     357            });
     358        return maxIndex + 1;
     359    }
     360
     361    // Add new snippet
     362    if (addSnippetButton.length) {
     363        addSnippetButton.off("click.tu").on("click.tu", function (e) {
     364            e.preventDefault();
     365
     366            const newIndex = getNextSnippetIndex();
     367
     368            // Get template HTML
     369            let templateHtml = template.html();
     370            if (!templateHtml) {
     371                console.error("Template not found");
     372                return;
     373            }
     374
     375            // Replace template placeholders
     376            templateHtml = templateHtml
     377                .replace(/\{\{INDEX\}\}/g, newIndex)
     378                .replace(/\{\{INDEX_PLUS_ONE\}\}/g, newIndex + 1);
     379
     380            // Append new row
     381            const $newRow = $(templateHtml);
     382            snippetsContainer.append($newRow);
     383
     384            // Initialize Select2 for the new select field
     385            const $newSelect = $newRow.find(".termageddon-singleselect");
     386            initSelect2($newSelect);
     387
     388            // Update badge and service name
     389            updateScriptBadge($newRow);
     390            updateServiceName($newRow);
     391
     392            // Set to expanded state (no collapsed class, ensure visible)
     393            const $content = $newRow.find(
     394                ".termageddon-snippet-accordion-content"
     395            );
     396            const $caret = $newRow.find(".termageddon-snippet-caret");
     397            setAccordionState($content, $caret, false);
     398        });
     399    }
     400
     401    /**
     402     * Update an attribute by replacing old index with new index
     403     * @param {jQuery} $elem - The element to update
     404     * @param {string} attrName - The attribute name (id, name, for)
     405     * @param {number} oldIndex - The old index to replace
     406     * @param {number} newIndex - The new index to use
     407     * @param {string} pattern - The pattern to match ('_' for ids, '[' for names)
     408     */
     409    function updateIndexInAttribute(
     410        $elem,
     411        attrName,
     412        oldIndex,
     413        newIndex,
     414        pattern
     415    ) {
     416        const attrValue = $elem.attr(attrName);
     417        if (!attrValue) return;
     418
     419        let searchStr, replaceStr;
     420        if (pattern === "_") {
     421            searchStr = `_${oldIndex}_`;
     422            replaceStr = `_${newIndex}_`;
     423        } else if (pattern === "[") {
     424            searchStr = `[${oldIndex}]`;
     425            replaceStr = `[${newIndex}]`;
     426        }
     427
     428        if (attrValue.includes(searchStr)) {
     429            $elem.attr(attrName, attrValue.replace(searchStr, replaceStr));
     430            return attrValue; // Return old value for label updates
     431        }
     432        return null;
     433    }
     434
     435    /**
     436     * Re-index all snippet rows after removal
     437     */
     438    function reindexSnippets() {
     439        snippetsContainer
     440            .find(".termageddon-script-snippet-row")
     441            .each(function (index) {
     442                const $currentRow = $(this);
     443                const oldIndex = parseInt($currentRow.attr("data-index"), 10);
     444
     445                if (isNaN(oldIndex) || oldIndex === index) {
     446                    return; // Skip if already correct
     447                }
     448
     449                // Update data-index
     450                $currentRow.attr("data-index", index);
     451
     452                // Update IDs, names, and labels
     453                $currentRow.find("select, textarea, label").each(function () {
     454                    const $elem = $(this);
     455
     456                    // Update ID and corresponding labels
     457                    const oldId = updateIndexInAttribute(
     458                        $elem,
     459                        "id",
     460                        oldIndex,
     461                        index,
     462                        "_"
     463                    );
     464                    if (oldId) {
     465                        const $label = $currentRow.find(
     466                            `label[for="${oldId}"]`
     467                        );
     468                        if ($label.length) {
     469                            const newId = $elem.attr("id");
     470                            $label.attr("for", newId);
     471                        }
     472                    }
     473
     474                    // Update name attribute
     475                    updateIndexInAttribute($elem, "name", oldIndex, index, "[");
     476
     477                    // Update for attribute
     478                    updateIndexInAttribute($elem, "for", oldIndex, index, "_");
     479                });
     480
     481                // Re-initialize accordion after re-indexing
     482                initAccordionRow($currentRow);
     483            });
     484    }
     485
     486    // Remove snippet
     487    $(document).on("click.tu", ".termageddon-remove-snippet", function (e) {
     488        e.preventDefault();
     489        e.stopPropagation(); // Prevent accordion from toggling
     490
     491        if (
     492            confirm(
     493                "Are you sure you want to remove this script snippet? This action cannot be undone."
     494            )
     495        ) {
     496            const $row = $(this).closest(".termageddon-script-snippet-row");
     497            $row.remove();
     498            reindexSnippets();
     499        }
     500    });
    165501});
  • termageddon-usercentrics/trunk/admin/js/termageddon-usercentrics-admin.min.js

    r3284346 r3439658  
    1 jQuery((function($){let animationSpeed=0,initialLoad=!1,loggedIn=$(".tu-tab-settings .tu-toggle-section input#termageddon_usercentrics_disable_logged_in"),editor=$(".tu-tab-settings .tu-toggle-section input#termageddon_usercentrics_disable_editor"),admin=$(".tu-tab-settings .tu-toggle-section input#termageddon_usercentrics_disable_admin");const check=(elem,checked=!0)=>{console.log(elem,checked),elem.prop("checked",checked).attr("readonly",checked).trigger("change")};1===loggedIn.length&&loggedIn.off("change.tu").on("change.tu",(function(){($(this).is(":checked")||initialLoad)&&(check(editor,$(this).is(":checked")),check(admin,$(this).is(":checked")))})).trigger("change");let geolocationToggle=$("input#termageddon_usercentrics_toggle_geolocation"),policyToggles=$(".tu-tab-geolocation .tu-toggle-section input");1===geolocationToggle.length&&(geolocationToggle.off("change.tu").on("change.tu",(function(){$(this).is(":checked")?$(".tu-tab-geolocation .tu-section-settings > div").slideDown(animationSpeed):$(".tu-tab-geolocation .tu-section-settings > div").slideUp(animationSpeed)})).trigger("change"),policyToggles.off("change.tu").on("change.tu",(function(){policyToggles.is(":checked")?jQuery("#no-geolocation-locations-selected,#no-geolocation-locations-selected-top").slideUp(animationSpeed):jQuery("#no-geolocation-locations-selected").slideDown(animationSpeed)})).trigger("change")),animationSpeed=300,initialLoad=!0;let migrationButton=$("#run_settings_migration");1===migrationButton.length&&migrationButton.off("click.tu").on("click.tu",(function(){const embedCode=document.querySelector("#termageddon_usercentrics_embed_code").value,settingsIdMatch=embedCode.match(/data-settings-id="([^"]+)"/);if(!settingsIdMatch||!settingsIdMatch[1])return void alert("Unable to find settings ID in embed code. Please ensure your embed code section contains a data-settings-id attribute. Please contact our support team if would like assistance.");const settingsId=settingsIdMatch[1];document.querySelector("#termageddon_usercentrics_settings_id").value=settingsId,document.querySelector("#termageddon_usercentrics_embed_code").value=embedCode.replace('<link rel="preconnect" href="https://plugins.trac.wordpress.org//privacy-proxy.usercentrics.eu">',"").replace('<link rel="preload" href="https://plugins.trac.wordpress.org//privacy-proxy.usercentrics.eu/latest/uc-block.bundle.js" as="script">',"").replace('<script type="application/javascript" src="https://privacy-proxy.usercentrics.eu/latest/uc-block.bundle.js"><\/script>',"").replace(/<script.*id="usercentrics-cmp".*async>.*<\/script>/g,"").replace(/<script>uc.setCustomTranslations.*<\/script>/g,"").trim();const migrationMessage=$(".migration-message");migrationMessage.removeClass("tu-alert-error").addClass("tu-alert-success"),migrationMessage.find("strong").text("Conversion Complete"),migrationMessage.find("p.alert-description").html("The embed code has been converted to a settings ID. All custom scripts outside of the original embed code have been maintained.<br/></br>\n\t\t\t\t\t<strong><em>The changes have been submitted.</em></strong>"),$(".tab-content form input.button").click()}))}));
     1jQuery((function($){let animationSpeed=0,initialLoad=!1,loggedIn=$(".tu-tab-settings .tu-toggle-section input#termageddon_usercentrics_disable_logged_in"),editor=$(".tu-tab-settings .tu-toggle-section input#termageddon_usercentrics_disable_editor"),admin=$(".tu-tab-settings .tu-toggle-section input#termageddon_usercentrics_disable_admin");const check=(elem,checked=!0)=>{console.log(elem,checked),elem.prop("checked",checked).attr("readonly",checked).trigger("change")};1===loggedIn.length&&loggedIn.off("change.tu").on("change.tu",(function(){($(this).is(":checked")||initialLoad)&&(check(editor,$(this).is(":checked")),check(admin,$(this).is(":checked")))})).trigger("change");let geolocationToggle=$("input#termageddon_usercentrics_toggle_geolocation"),policyToggles=$(".tu-tab-geolocation .tu-toggle-section input");1===geolocationToggle.length&&(geolocationToggle.off("change.tu").on("change.tu",(function(){$(this).is(":checked")?$(".tu-tab-geolocation .tu-section-settings > div").slideDown(animationSpeed):$(".tu-tab-geolocation .tu-section-settings > div").slideUp(animationSpeed)})).trigger("change"),policyToggles.off("change.tu").on("change.tu",(function(){policyToggles.is(":checked")?jQuery("#no-geolocation-locations-selected,#no-geolocation-locations-selected-top").slideUp(animationSpeed):jQuery("#no-geolocation-locations-selected").slideDown(animationSpeed)})).trigger("change")),animationSpeed=300,initialLoad=!0;let migrationButton=$("#run_settings_migration");1===migrationButton.length&&migrationButton.off("click.tu").on("click.tu",(function(){const embedCode=document.querySelector("#termageddon_usercentrics_embed_code").value,settingsIdMatch=embedCode.match(/data-settings-id="([^"]+)"/);if(!settingsIdMatch||!settingsIdMatch[1])return void alert("Unable to find settings ID in embed code. Please ensure your embed code section contains a data-settings-id attribute. Please contact our support team if would like assistance.");const settingsId=settingsIdMatch[1];document.querySelector("#termageddon_usercentrics_settings_id").value=settingsId,document.querySelector("#termageddon_usercentrics_embed_code").value=embedCode.replace('<link rel="preconnect" href="https://plugins.trac.wordpress.org//privacy-proxy.usercentrics.eu">',"").replace('<link rel="preload" href="https://plugins.trac.wordpress.org//privacy-proxy.usercentrics.eu/latest/uc-block.bundle.js" as="script">',"").replace('<script type="application/javascript" src="https://privacy-proxy.usercentrics.eu/latest/uc-block.bundle.js"><\/script>',"").replace(/<script.*id="usercentrics-cmp".*async>.*<\/script>/g,"").replace(/<script>uc.setCustomTranslations.*<\/script>/g,"").trim();const migrationMessage=$(".migration-message");migrationMessage.removeClass("tu-alert-error").addClass("tu-alert-success"),migrationMessage.find("strong").text("Conversion Complete"),migrationMessage.find("p.alert-description").html("The embed code has been converted to a settings ID. All custom scripts outside of the original embed code have been maintained.<br/></br>\n\t\t\t\t\t<strong><em>The changes have been submitted.</em></strong>"),$(".tab-content form input.button").click()}));const SNIPPET_CONSTANTS_ANIMATION_DURATION=300,SNIPPET_CONSTANTS_CARET_ROTATION={COLLAPSED:"rotate(0deg)",EXPANDED:"rotate(180deg)"},SNIPPET_CONSTANTS_SELECT2_OPTIONS={width:"100%",placeholder:"Select a service...",allowClear:!0},SNIPPET_CONSTANTS_DEFAULT_SERVICE_TEXT="New Script Snippet",snippetsContainer=$("#termageddon-script-snippets-container"),addSnippetButton=$(".termageddon-add-snippet"),template=$("#termageddon-script-snippet-template");function countScriptTags(textarea){const content=$(textarea).val()||"",matches=content.match(/<script/gi);return matches?matches.length:0}function updateScriptBadge($row){const $textarea=$row.find(".termageddon-script-textarea"),$badge=$row.find(".termageddon-snippet-badge"),count=countScriptTags($textarea[0]);count>0?($badge.text(`${count} script${1!==count?"s":""} identified`),$badge.addClass("termageddon-snippet-badge-success")):($badge.text("0 scripts identified"),$badge.removeClass("termageddon-snippet-badge-success"))}function updateServiceName($row){const $select=$row.find(".termageddon-singleselect"),$serviceName=$row.find(".termageddon-snippet-service-name"),selectedText=$select.find("option:selected").text();$serviceName.text($select.val()&&selectedText?selectedText:SNIPPET_CONSTANTS_DEFAULT_SERVICE_TEXT)}function toggleAccordion($header){const $content=$header.siblings(".termageddon-snippet-accordion-content"),$caret=$header.find(".termageddon-snippet-caret");$content.is(":visible")?($content.slideUp(SNIPPET_CONSTANTS_ANIMATION_DURATION,(function(){$(this).addClass("collapsed")})),$caret.css("transform",SNIPPET_CONSTANTS_CARET_ROTATION.COLLAPSED)):($content.removeClass("collapsed").slideDown(SNIPPET_CONSTANTS_ANIMATION_DURATION),$caret.css("transform",SNIPPET_CONSTANTS_CARET_ROTATION.EXPANDED))}function setAccordionState($content,$caret,isCollapsed){isCollapsed?($content.hide(),$caret.css("transform",SNIPPET_CONSTANTS_CARET_ROTATION.COLLAPSED)):($content.show(),$caret.css("transform",SNIPPET_CONSTANTS_CARET_ROTATION.EXPANDED))}function initAccordionRow($row){updateScriptBadge($row),updateServiceName($row);const $content=$row.find(".termageddon-snippet-accordion-content"),$caret=$row.find(".termageddon-snippet-caret");setAccordionState($content,$caret,$content.hasClass("collapsed"))}function initSelect2($element){const $targets=$element||$(".termageddon-singleselect");$targets.each((function(){$(this).hasClass("select2-hidden-accessible")||$(this).select2(SNIPPET_CONSTANTS_SELECT2_OPTIONS)}))}function getNextSnippetIndex(){let maxIndex=-1;return snippetsContainer.find(".termageddon-script-snippet-row").each((function(){const index=parseInt($(this).attr("data-index"),10);!isNaN(index)&&index>maxIndex&&(maxIndex=index)})),maxIndex+1}function updateIndexInAttribute($elem,attrName,oldIndex,newIndex,pattern){const attrValue=$elem.attr(attrName);if(!attrValue)return;let searchStr,replaceStr;return"_"===pattern?(searchStr=`_${oldIndex}_`,replaceStr=`_${newIndex}_`):"["===pattern&&(searchStr=`[${oldIndex}]`,replaceStr=`[${newIndex}]`),attrValue.includes(searchStr)?($elem.attr(attrName,attrValue.replace(searchStr,replaceStr)),attrValue):null}function reindexSnippets(){snippetsContainer.find(".termageddon-script-snippet-row").each((function(index){const $currentRow=$(this),oldIndex=parseInt($currentRow.attr("data-index"),10);isNaN(oldIndex)||oldIndex===index||($currentRow.attr("data-index",index),$currentRow.find("select, textarea, label").each((function(){const $elem=$(this),oldId=updateIndexInAttribute($elem,"id",oldIndex,index,"_");if(oldId){const $label=$currentRow.find(`label[for="${oldId}"]`);if($label.length){const newId=$elem.attr("id");$label.attr("for",newId)}}updateIndexInAttribute($elem,"name",oldIndex,index,"["),updateIndexInAttribute($elem,"for",oldIndex,index,"_")})),initAccordionRow($currentRow))}))}snippetsContainer.length&&(initSelect2(),snippetsContainer.find(".termageddon-script-snippet-row").each((function(){initAccordionRow($(this))}))),$(document).on("click.tu",".termageddon-snippet-accordion-header",(function(e){$(e.target).closest(".termageddon-remove-snippet").length||toggleAccordion($(this))})),$(document).on("change.tu select2:select.tu select2:clear.tu",".termageddon-singleselect",(function(){const $row=$(this).closest(".termageddon-script-snippet-row");updateServiceName($row)})),$(document).on("input.tu change.tu",".termageddon-script-textarea",(function(){const $row=$(this).closest(".termageddon-script-snippet-row");updateScriptBadge($row)})),addSnippetButton.length&&addSnippetButton.off("click.tu").on("click.tu",(function(e){e.preventDefault();const newIndex=getNextSnippetIndex();let templateHtml=template.html();if(!templateHtml)return void console.error("Template not found");templateHtml=templateHtml.replace(/\{\{INDEX\}\}/g,newIndex).replace(/\{\{INDEX_PLUS_ONE\}\}/g,newIndex+1);const $newRow=$(templateHtml);snippetsContainer.append($newRow);const $newSelect=$newRow.find(".termageddon-singleselect");initSelect2($newSelect),updateScriptBadge($newRow),updateServiceName($newRow);const $content=$newRow.find(".termageddon-snippet-accordion-content"),$caret=$newRow.find(".termageddon-snippet-caret");setAccordionState($content,$caret,!1)})),$(document).on("click.tu",".termageddon-remove-snippet",(function(e){if(e.preventDefault(),e.stopPropagation(),confirm("Are you sure you want to remove this script snippet? This action cannot be undone.")){const $row=$(this).closest(".termageddon-script-snippet-row");$row.remove(),reindexSnippets()}}))}));
  • termageddon-usercentrics/trunk/admin/usercentrics-providers.php

    r3266555 r3439658  
    11<?php
     2// List is populated from https://policies.termageddon.com/api/usercentrics/services
     3
    24return [
    3     "ByOJZ54odjW7" => "Add This",
     5    "wqpKH6gNO" => "1&1 Ionos",
     6    "BpfGDA6d" => "1&1-WebAnalytics",
     7    "BJCrgq4iuiWQ" => "1020. dba Placecast and Ericsson Emodo",
     8    "NAFUNuBAX" => "123FormBuilder",
     9    "ZYtfbi7Cy" => "152 Media",
     10    "H1MvxcVjOoZ7" => "1plusX",
     11    "-KqxGSaVx" => "1und1 Premiumpartner Service",
     12    "7I2eh_kBp" => "23 degrees",
     13    "rkt8g9Niuo-7" => "2KDirect",
     14    "s0YTrTGL0" => "2Performant",
     15    "E4m6On5UY0Wg3S" => "321MED",
     16    "BksBg9VjOsZQ" => "33Across",
     17    "hzZS-hs9m" => "360 Grad",
     18    "6YbgPIgRm" => "3CX",
     19    "kXg9DeFEK" => "3Q",
     20    "qxiCD5aN_" => "3Q Video",
     21    "GWR6Okt5" => "42ads",
     22    "FgkB3cpW" => "4w MarketPlace",
     23    "D1_CKTzWP" => "6sense",
     24    "r1N_g5Vj_oZQ" => "7Hops",
     25    "cB1C-CWY0" => "8Select",
     26    "Rj7NtbZLIyj6CO" => "A European Perspective",
     27    "HJqwlcEi_j-Q" => "A Million Ads",
     28    "W5aCtyNa" => "a-net",
     29    "S1oqeqVsdob7" => "A.Mob",
     30    "MNvgqiAGK" => "A8.net",
     31    "r1oD9Eoujbm" => "AB Tasty",
     32    "own4GrdkBajHvL" => "ABlyft",
     33    "mcMqee5z51IrK1" => "ABlyft - Weboptimisation",
     34    "6GBGwDrQe" => "Accelerize",
     35    "93B80nQzj" => "Accengage",
     36    "qzdvfwREE" => "AcceptableAds Exchange",
     37    "4C_H9fAmRKeo3Y" => "AccessGo",
     38    "gYLHfz4Lg2RKMU" => "accessiBe",
     39    "SyosgcNsds-Q" => "Accorp",
     40    "j0a1nV69uzbeh6" => "AccountInsight",
     41    "0N5YK1cW1" => "Ackee",
     42    "gSTvUFpVi" => "Acoustic",
     43    "4ybPfavU" => "Acquia Lift",
     44    "SkzZlqVs_sWX" => "Active Agent",
     45    "HDA6XNFs" => "ActiveCampaign",
     46    "S1Z5Esdsbm" => "Acuity Scheduling",
     47    "SJFRgc4sOo-m" => "Acuityads",
     48    "Sy_FQ5SRm" => "Ad Alliance",
     49    "hv3CkcEHZ9EQ_j" => "Ad Quality by ironSource",
     50    "nxlcZXzLr" => "Ad Unity",
     51    "Bkk254o_o-7" => "ad-srv.net",
     52    "rkdYcVsdoW7" => "ad:C Media",
     53    "UCS8eT_Pz" => "ad.plus",
     54    "PtvsQPsXKT-OwG" => "Ad360",
     55    "HJxLc4odiWQ" => "Ad4Mat",
     56    "Hy4ax9Ni_sZm" => "ad6media",
     57    "O0dPUkSwE" => "Adabra",
     58    "S1CQe54sOs-X" => "Adacado",
     59    "EwR_7MJGk" => "Adagio",
     60    "NKwDOvvN" => "Adality",
     61    "IE1JeSDLF" => "Adalyser",
     62    "H1IyeqEjdsbX" => "ADARA MEDIA",
     63    "u7C0LiW7f" => "adbility media",
     64    "oGR_Jnx50" => "ADC Media Adserver",
     65    "9o_f3BYaL" => "ADCELL",
     66    "B1Wac4oOjZm" => "AdClear",
     67    "J64M6DKwx" => "AdColony",
     68    "nr60PuO2s" => "AddApptr",
     69    "BkwLqNjOsZm" => "AdDefend",
     70    "9y-4-D2PG" => "AddEvent",
     71    "vGbt4De0o" => "Additive",
     72    "PrhpqbDB_" => "AddSearch",
     73    "ByOJZ54odjW7" => "AddThis",
     74    "kkgrP2G8D" => "AddToAny",
     75    "lEXAlQ-NW" => "AdElement Media Solutions",
     76    "BkD_eqEsuiZ7" => "Adello Group",
     77    "r1T6l9EoujbQ" => "Adelphic",
     78    "Pzgqsq9kN" => "AdFit",
     79    "H1dDqVjOjWX" => "Adform",
     80    "pXdG1SmmN" => "Adhese",
     81    "UBalUr7TT" => "Adhesive Solocal AdExchange",
     82    "06CKth4Dv" => "Adhood",
     83    "WSoAQvMRZ" => "adhood.com",
     84    "BkJylc4s_iW7" => "Adikteev",
     85    "CiailyIiu" => "Adimo",
     86    "p_-A50o2DYqIah" => "AdInMo",
    487    "SJFe9NousWX" => "Adition",
     88    "B1gD94sdsbm" => "Adition Dynamic Bannering",
     89    "ry-vqVsdiW7" => "Adition Erfolgsspot",
     90    "Hy1PqEidobQ" => "Adition Lead",
     91    "rkGPcEi_i-Q" => "Adition Offsite",
     92    "By7DqEsuj-X" => "Adition Onsite",
     93    "3Kg4aoMY5ZlAJB" => "adjoe",
     94    "Jy6PlrM3" => "Adjust",
     95    "Hk24xqVsdo-m" => "Adkernel",
     96    "PF3fFUwwd" => "adledge",
     97    "oIxiBh98" => "AdLib",
     98    "T0zF5X5bk" => "Adloox",
     99    "FgdDaKh69" => "Adludio",
     100    "BJDig5NsusWQ" => "ADMAN",
     101    "BJUQe5NjujWX" => "ADman Interactive",
     102    "cD9B0dFVP" => "adMarketplace",
     103    "CTwDBP5rd" => "Admat",
     104    "Hy8C9ViusZQ" => "AdMaxim",
     105    "H1wmg9Esdj-Q" => "Admedo",
     106    "SySflcNjdjbX" => "admetrics",
     107    "-FzaiGsbx" => "Admixer",
     108    "85RFiZ5cV" => "Admixer EU GmbH",
     109    "32Br3kD2M" => "admo.tv",
     110    "r7rvuoyDz" => "Admob",
     111    "Dw8tBVuw1-ixeG" => "Admost",
     112    "BJjzlq4j_j-m" => "Admotion",
     113    "E8oLmBZtn" => "Adnami",
     114    "kDswg2QFY" => "Adnanny AdServer",
     115    "H1dzc4suj-Q" => "Adnymics",
     116    "SywhgcVjdiZX" => "Adobe Advertising Cloud",
     117    "xl1hqS1F" => "Adobe Advertising Cloud DSP",
     118    "Ood3MFN7v" => "Adobe Advertising Cloud Search",
     119    "KNfCWlL4E" => "Adobe Analytics",
     120    "BJf5EjOi-X" => "Adobe Analytics",
     121    "0vHbD98mH" => "Adobe Audience Manager",
     122    "_l9yJWKF" => "Adobe Creative Cloud",
     123    "JxJRp3je4bOWSr" => "Adobe Dimension",
    5124    "f6nkjdUL" => "Adobe Experience Cloud",
     125    "PrJkr3BMv" => "Adobe Experience Cloud Identity Service",
     126    "MIJtFTuUD" => "Adobe Experience Manager",
     127    "xmvi6h6iXlHuEl" => "Adobe Experience Platform",
     128    "zIJ0t6El" => "Adobe Fonts",
     129    "gMYO_vhh" => "Adobe Fonts",
     130    "MjwgMdSe7" => "Adobe Launch",
     131    "nGKcQgAF" => "Adobe Launch",
     132    "aWNjZCMVTvO8Oj" => "Adobe Marketing Cloud",
     133    "xRLAmHZ3A" => "Adobe Target",
     134    "8L9bkqYbV" => "Adobe Target",
     135    "bkp7ea4UH" => "Adobe Test & Target",
    6136    "HJy4c4s_jbX" => "Adobe Typekit",
     137    "jaWccj1u5MCwMT" => "Adobe Web SDK",
     138    "R4eezxWkE" => "Adpepper",
     139    "4oh9iKqPJ" => "Adpone",
     140    "ULBcFrjZGb4mXW" => "Adrenalead",
     141    "r11Ex9EodjZQ" => "AdRoll",
     142    "S1Kvg9ViOoZm" => "adrule",
     143    "B1n6AkRJ3KFheP" => "Ads Defender",
     144    "-AdDAiqxj" => "Adscale",
     145    "rkKt9Vo_j-Q" => "adscale.de (ströer)",
     146    "SJX4cEjOjZQ" => "AdSense for Search (AFS)",
     147    "DRpPVP2uv" => "Adserve.zone",
     148    "cBkFKxFip" => "Adservice Media",
     149    "Bk3ZqNsujWQ" => "AdSpirit",
     150    "SJU-x9Vj_jZQ" => "adsquare",
     151    "HHnOG47_6" => "adsrvr",
     152    "HJ1wx9Ns_ob7" => "Adssets",
     153    "514xGqzuB" => "AdsWizz",
     154    "BJCc9EouiZm" => "AdTech",
     155    "t91zsmgUO" => "Adtelligence Platform",
     156    "qj9AM4gO5" => "Adtelligent",
     157    "9YZOzHmmo" => "AdTheorent",
     158    "S1qdgcVoOjZ7" => "AdTheorent,",
     159    "e-L9j7jq" => "AdTiger",
     160    "UFByDVoY5" => "AdTiming",
     161    "S1MpgcNjOo-X" => "AdTiming Technology Company",
     162    "-z6aobHdz" => "AdTonos",
     163    "4ca59IYt1" => "Adtraction",
     164    "FVFF_XFS" => "Adtriba",
     165    "FNM5zS5SO" => "adtrue",
     166    "_LPDpmRU" => "AdUp Technology",
     167    "BynslcEoOjbm" => "ADUX",
     168    "B1-UecVodj-7" => "advanced store",
     169    "r1v094j_o-m" => "AdVentori",
     170    "B1_-l9Ns_ob7" => "Adverline",
     171    "rkCnmccCX" => "Advertising.com",
     172    "C4osiHMfJJalmp" => "AdvertServe",
     173    "eNkSkb6JBaOC-P" => "Adverty",
     174    "B1OHg9VousbX" => "AdWords Remarketing",
     175    "fQdyrzSvN" => "Adxperience",
     176    "5EZTiCeMV" => "Adyen",
     177    "H1Y9e94j_i-m" => "ADYOULIKE",
     178    "D4y1cqu5W" => "Adzymic",
     179    "ryATgqEs_s-Q" => "Aerserv",
     180    "peSGp09sS" => "Affectv",
     181    "whFtCSxUiX3epV" => "AffilBox",
     182    "lBgLIDi9e" => "Affiliate Window",
     183    "SyTbcViOsWX" => "affilinet (Webmasterplan)",
     184    "tAvOzCRGW" => "Affiliprint",
     185    "LZjko4J2aIxtT3" => "Affirm",
     186    "ecyNbRiQcMwO2n" => "Afterpay",
     187    "YsjGpUh22" => "agof services",
     188    "Exmh2-AJb" => "Ahrefs",
     189    "9Ac-SGp9hgKMdE" => "AidaForm",
     190    "_B-oCEzqILvvng" => "Airbnb Reviews by MarketPushApps",
     191    "1k_ljMZc28DDOc" => "Airbridge",
     192    "hFLVABpNP" => "Airship",
    7193    "IdaQw5cVN" => "Airtable",
     194    "ARbqBwC5J" => "Ajax Search Pro",
     195    "uQiyefbRi" => "Akamai",
     196    "nQ90ZSbOB" => "Akamai Bot Manager",
     197    "H1L1cloh4" => "Akanoo",
     198    "SyWN9Esdjb7" => "Akismet",
     199    "By49NjusWQ" => "Akismet (WordPress Plugin)",
     200    "hMXFZSbaI" => "Aklamio",
     201    "e2c47r_bZ25pQC" => "Alangu Gebärdensprache Avatar",
     202    "YWbHHDowH" => "Albacross",
     203    "Wom6s1CtF" => "Alchemer",
     204    "jeiaELau" => "Alexa",
     205    "tnfBi7gwe" => "Algolia",
     206    "EJxYBUV-f" => "Algonomy",
     207    "K-qn-Ibapdt9QB" => "AlgoriX",
     208    "JNqGjolMX03W_P" => "Alibaba Cloud CDN",
     209    "zBE_rJMqbU5Zib" => "Alipay",
     210    "AZ0oBKUpsf7deu" => "All-In-One Security",
     211    "72E977tUP" => "ALL-INKL",
     212    "5A5djPisF" => "Allgemeine Website-Tag",
     213    "Drt3RRE-u" => "Alliance Gravity Data Media",
     214    "HkwrqEi_sZ7" => "allincl",
     215    "VnQLQ7uoL" => "AllMediaDesk",
     216    "4wiORY5pVpGffd" => "Alphalyr Digital Studio",
     217    "fUfvROWdtFsw1K" => "AltBeacon",
     218    "_2g2r-p1n" => "Altruja",
     219    "2qBrzO0223X1Zt" => "Amadeus Hospitality/TravelClick",
     220    "gvWsZJmVT" => "Amazon Adsystems",
    8221    "N2spyFPL" => "Amazon advertising",
     222    "NELEFokrd" => "Amazon Associates",
     223    "t1QnIrTMGuERFa" => "Amazon AWS Amplify",
     224    "S1sdpVyEX" => "Amazon Cloudfront",
     225    "1dArEN3cO" => "Amazon Mobile Ads",
     226    "BkBN6xyV7" => "Amazon Partners",
     227    "rJ6D5Eous-Q" => "Amazon Pay",
     228    "24I-tjBlAIR5TS" => "Amazon Pinpoint",
     229    "IUyljv4X5" => "Amazon Publisher Service",
     230    "Bkdj2xyEX" => "Amazon S3",
     231    "J39GyuWQq" => "Amazon Web Services",
     232    "mF6syhpYV" => "Amnet",
     233    "JchR4jxjXCqTiu" => "AmoAd",
     234    "HJRgx54jusbm" => "Amobee",
     235    "Sk9kb5VoOi-7" => "Amplitude",
     236    "R6qwZ11iZ" => "ampproject.org",
    9237    "6znewg1hW" => "anchor.fm",
    10     "aXnTc_Y3n" => "ArcGIS Map",
    11     "fiQX6mqi" => "AT Internet",
     238    "HJRUlvEVQ" => "Ankit 24-07",
     239    "_VWVLDbYO" => "annalect",
     240    "xRy2gd--" => "AnswerDash",
     241    "rymwxcNsOsb7" => "AntVoice",
     242    "FSbhnJKw5" => "Anwaltauskunft.de",
     243    "ebhLyMWCg" => "Anwaltverein.de",
     244    "vUHdGBoDHNu6_2" => "Anythingabout",
     245    "KWDizwCvI" => "Anzu",
     246    "3sJWccp-h" => "AOL",
     247    "ApbuXSl8r" => "AOL Cloud",
     248    "B1AUNmyEm" => "Apester",
     249    "H1n6lcVj_s-7" => "Apester",
     250    "yYVZ3FfUoXT_tj" => "Appcast",
     251    "oPWBSL3AJ" => "Appcues",
     252    "-ijhTWLQV" => "AppDynamics",
     253    "UkROORpAd" => "AppDynamics",
     254    "_lk1S0d9OF47je" => "Appfigures",
     255    "jzH7HjBXb" => "Appier",
     256    "P1h384FMQ" => "Apple Pay",
     257    "r9Vq_aY3t7tJWJ" => "Apple Podcasts",
     258    "weoN4Lb_MjWLuu" => "Apple Search Ads",
     259    "cBl03wBXG" => "Apple Sign-in",
     260    "H1dpBjeMV" => "Applied Technologies Internet SAS",
     261    "7CJ_BpQ_C" => "AppLift",
     262    "fHczTMzX8" => "AppLovin",
     263    "v324c3_9o" => "AppLovin Max SDK",
     264    "7p47Xsg-i" => "AppMetrica",
     265    "Syg-54jdiZX" => "AppNexus (adnxs.com)",
     266    "XFAdcSj-7Jc-JJ" => "Appodeal",
     267    "_RMuMZnYU" => "Approov",
     268    "WWe3pIgdt0UDOJ" => "AppSamurai",
     269    "CRKoGaeDVbo2l1" => "Appsell",
     270    "Gx9iMF__f" => "AppsFlyer",
     271    "n2slZDmyp" => "AppSignal",
     272    "BJZX5EjdibX" => "AppStore Widget",
     273    "XI0dAskrcDPVB-" => "Arcade",
     274    "aXnTc_Y3n" => "ArcGIS Map Tool",
     275    "eoUHS8Nwm" => "Arcspire",
     276    "mSKd6UMp_" => "Arkflux",
     277    "Byz_xq4s_o-X" => "ARMIS",
     278    "codpeWIqV" => "Arrivalist",
     279    "Bk9OBXJ4Q" => "Ars Technica",
     280    "H1au00yZT9ugFI" => "ART19",
     281    "NTb2hlOJdn95k4" => "Artefact",
     282    "q6G6H17TR" => "AskMe",
     283    "fiQX6mqi" => "AT INTERNET",
     284    "lyQYRN-Xmt_BBZ" => "AtData",
     285    "yWgiH3xQZ" => "ATG Ad Tech Group GmbH",
     286    "rJ6L9VsdjWm" => "Atlas Solutions",
     287    "a8XLoeVA0" => "Audience Project",
     288    "zBwUvUoJ0" => "Audience Trading Platform",
     289    "FOrCeplkQ" => "Audiencecreate",
     290    "zRmrOPZzd" => "Audiencerate",
     291    "BkXdl9Njujbm" => "Audiens",
     292    "SX52NsAPC" => "Audigent",
     293    "UVMdI89fm" => "Audio CC",
     294    "yt0Ir6e9H" => "audio content &amp; control GmbH",
     295    "euL-m8Kv" => "Audio Now",
    12296    "c6lt-aZ0" => "Audioboom",
    13297    "mdM6tHJ4s" => "Audiocon",
     298    "RLFJwpZoj" => "AudioMob",
     299    "_-eZ2iyMj_0Nip" => "Audiomob in-game",
     300    "BV-1qlQ7" => "AudioNow",
     301    "QLTBuExAXZP-Ac" => "Audiopixel",
     302    "vFJX03YEz" => "Aumago",
     303    "7mOrpUraa" => "Auth0",
     304    "AshuZ5jzB" => "authorized.by",
     305    "WLHxEc2Up" => "Autohauskenner",
     306    "8JWoogwUY" => "Automattic",
     307    "yqLEQaghO" => "AutoUncle Aps",
     308    "57lcUUrlt" => "Avantio VRMS",
     309    "8eg0IuPZ8wkcg7" => "Avature",
     310    "_Y_UCbcZ0" => "Avazu",
     311    "r1YzeqVs_jbQ" => "Avid Media",
     312    "zATcqR5A-" => "Avis Vérifiés",
     313    "H1vkx9Ni_s-7" => "Avocet Systems",
     314    "BJkGAh2mX" => "Awesome",
     315    "zI4LKzU_q_rizP" => "Awesome Table",
     316    "p6k0WAvkwZ4GDb" => "AwesomeAds",
     317    "SyfKc4oOjWQ" => "AWIN",
     318    "Bkn55EsOoW7" => "AWS",
     319    "NYsmsUE9VcXEGy" => "AWS WAF",
     320    "kgyk8fbU" => "AWSELB",
     321    "wSJngRiYEJcL8C" => "ayeT Studios",
     322    "jHHkTxbZOK9LU0" => "ayeT-Studios",
     323    "zGUZoF3Ve" => "Azerion",
     324    "MSVdV2h-6nYJ7X" => "Azure Active Directory",
     325    "EVhPGKuTEOecfG" => "Azure Active Directory B2C",
     326    "GlxT-TcjOgbGhc" => "Azure App Service",
     327    "9q69bs1_uqZieZ" => "Azure Application Gateway (Azure WAF)",
     328    "UiXdWB_l" => "Azure Application Insights",
     329    "oz3w0zM75" => "Azure Maps",
     330    "dx07_9ciJ" => "B2B Media",
     331    "kxs3IM_Vu" => "B2B Media Group EMEA",
     332    "Tw8zmKpSP" => "Bahn",
     333    "r144c4odsbm" => "Baidu Ads",
     334    "pFPZLFiOD" => "Baidu Advertising",
     335    "aZvWLczh" => "Baidu Analytics",
     336    "3-tkHSouq" => "Bakehouse",
     337    "jkyepXkyR" => "Bambuser",
     338    "BJ_d5EsusWm" => "Bandcamp",
     339    "447gNkP7E" => "Bandsintown",
     340    "rkn_g5No_iZQ" => "Bannerflow",
     341    "i8thRAILQ" => "Bannersnack",
     342    "uSTP7MDLGFP3kV" => "Barilliance",
     343    "RXEft47eH" => "Barzahlen",
     344    "EWWivI-np" => "Basis Technologies",
     345    "OD38XMAFy" => "Batch",
     346    "XbzVLbj6w" => "BazaarVoice",
     347    "fXMTXQOLX" => "bd4travel",
     348    "WDR3LyVpo" => "Beachfront Media",
     349    "LCM5ZqgPa" => "Beamer",
     350    "NPwHeL-JC" => "Beampulse",
     351    "rkEXx9Vo_obX" => "Beemray",
     352    "B1NA5VjdjbX" => "Beeswax",
     353    "o2q55Aa0Q" => "Behamics",
     354    "DxVnzwLiH" => "Beintoo",
     355    "BJRdcNsuibm" => "Belboon",
     356    "tRDGo5MH8tSYso" => "bento Forward GmbH & Co KG",
     357    "01z9S71rU4Hn-D" => "Beslist.nl Tracking",
     358    "MNJpzh2av" => "Betgenius",
     359    "9EH_yrRpk" => "Better Banners",
     360    "NlKtp6bJulcVps" => "Bettermode",
     361    "a384FoyLB" => "Betterplace.org",
     362    "LYIjPmlzB7ta5I" => "BeyondWords",
     363    "a_N5P8uw" => "BIC media",
     364    "t4800ChaZVtBVR" => "BidMachine",
     365    "lAqkVMAk7" => "Bidmanagement",
     366    "PGVmlH7ex" => "Bidstack",
     367    "BJb4e5NjOjb7" => "BIDSWITCH",
     368    "HyU_xc4oOoZQ" => "Bidtellect",
     369    "rkj0qEsusWm" => "BidTheatre",
     370    "zDG4jNnkx" => "BidTheatre",
     371    "Y3BUl6Fb5" => "BigaBid",
     372    "-QcL-vWtUwTmEw" => "BigCommerce CDN",
     373    "naN37N2CRJvG2W" => "BigCommerce Checkout",
     374    "p34bURcC2mKqdZ" => "Billie",
     375    "ryiH3439N" => "Billiger.de",
     376    "HJ0w9Vs_jWm" => "Billpay",
     377    "Hysgc4odiZ7" => "Bing Ads",
     378    "SJwfMvizE" => "Bing Ads Retargeting",
     379    "rJhhqVs_ob7" => "Bing Conversion",
     380    "7n82fbu3X" => "Bing Maps",
    14381    "abGHajF1" => "Bing Maps",
    15     "SkdccNsdj-X" => "Bitmovin",
    16     "Ewb9uz1Rp" => "Bookingkit",
    17     "A91MHlBY6" => "Bryter",
     382    "S14J-qNjujZX" => "Bing Remarketing",
     383    "rJBkZ94sdjWm" => "Bing Remarketing Conversion",
     384    "S3LWGzBCG" => "Bit Q Holdings",
     385    "z03bVFpFh" => "BITE",
     386    "SkdccNsdj-X" => "bitmovin",
     387    "H-5ybEnazK_Nr_" => "Blackfire.io",
     388    "9GgCbkF1X" => "Blau",
     389    "LT7cTFaUy" => "blingby",
     390    "HkgxeqNiusW7" => "Blis Media",
     391    "u1M5M8ss4" => "BloomReach",
     392    "adry5guRKaqWsa" => "Bluecore",
     393    "H1cuc4jds-m" => "BlueKai",
     394    "FSn8bGxEM7pDWf" => "Bluesky Social",
     395    "w_VI5g0m9" => "Bmind a Sales Maker Company",
     396    "rJVVe94jusZ7" => "Bombora",
     397    "fGsLLp5V" => "Bonial connect",
     398    "r_7IfSwj" => "book2look",
     399    "g-lEHEZi" => "Bookatable",
     400    "tGMdaeC7cSYLyO" => "Bookeo Widget",
     401    "4Ce4r1C3b" => "Booking Südtirol",
     402    "cSRMLG-9J" => "Booking.com",
     403    "padqNOq8_pNHbF" => "Booking.com Reviews by MarketPushApps",
     404    "Ewb9uz1Rp" => "bookingkit",
     405    "97rh3ePvleSqGz" => "Boom Form",
     406    "3L4qRZSFNbX1A-" => "Boost",
     407    "8eIqa_sKr" => "BootstrapCDN",
     408    "wdjNExCpwgd0mA" => "botBrains",
     409    "2s7OLtD31lVpPp" => "BotDetect Captcha",
     410    "6_AaKITrsMijT_" => "BOTfriends",
     411    "cu-I7EeYRGHBYH" => "Bounce Commerce",
     412    "B1aDxq4iuj-Q" => "Bounce Exchange",
     413    "H11_qNsujb7" => "Braintree",
     414    "Me_LwKiEK" => "Branch SDK",
     415    "Oadn03JMr" => "Brand Advance",
     416    "_XeDI-poS" => "Brand Metrics Sweden",
     417    "MMgpupdb_" => "Braze",
     418    "dQwK0_tGzCTAY1" => "Brevo",
     419    "7m8ANzilagj--S" => "Bright SDK",
     420    "_P8Dj4_id" => "Brightcove",
     421    "dzqlMOvA3" => "Browser-Update",
     422    "zwX6TKIqe" => "Browsi Mobile",
     423    "A91MHlBY6" => "BRYTER",
     424    "SkBdl94j_o-7" => "Bucksense",
     425    "OIryTCdy" => "Bugherd",
     426    "HJMSxqVj_ibm" => "Bugsnag",
     427    "m3HPkp-03" => "Burt",
     428    "bj4SQZiaZKJ0Sl" => "BusinessBike",
     429    "3uVXyQAEl" => "Buzzsprout",
     430    "rJeSRIt3E" => "bwin",
     431    "qm6aGgqn1" => "Byggfakta Analytics Pro",
     432    "M7hs1204w" => "Bynder",
     433    "lAVu7za7YOX6Wz" => "ByteBrew",
     434    "pJpZXVNi3" => "Cablato",
     435    "KISulZHIbBr3mT" => "Calconic",
    18436    "vdUe2GDtm" => "Calendly",
     437    "nWwIqfnhR" => "Calenso",
     438    "mKiYp1G2D" => "Callbell",
     439    "M2HlfHoRv" => "CallTrackingMetrics",
     440    "eL9NgeAYVMVnLF" => "CamBuildr Plugin",
     441    "k-PZrnDTu" => "Candidate Application Form",
     442    "t9P753bof" => "Canva",
     443    "2-m-3sqMKQdc-e" => "Captcha",
     444    "gf1221hzK" => "Capterra",
     445    "SyMke9NsdsW7" => "Captify Technologies",
     446    "jTmrAXElBrQnYW" => "Captivate",
     447    "uOYlP6SYB" => "CARAT",
     448    "ptLtnnoWD" => "CarbonCare",
     449    "CxlGIPVZZQoZEy" => "Cardinal Mobile",
     450    "a7PrUQ-6P" => "Caro",
     451    "iiCbzWw6F" => "CarObserver",
     452    "s1uhnr4d" => "CAS",
     453    "4R_3s-N0l" => "Cavai",
     454    "aMS3tHs64OnpBp" => "CBOT",
     455    "8QW9ZIyK" => "Celebros",
     456    "5AGhJ-ZyCplhCq" => "Cell Rebel",
     457    "HkBsx54iOj-X" => "Celtra",
     458    "Hk9Lx5VoOoWQ" => "Centro",
     459    "gIB2IbDlp" => "CerebroAd",
     460    "OquVCK6VO" => "Chameleon Lead Generation",
     461    "S1m2cVsOobm" => "ChannelPilot",
     462    "t_QU7p3R5" => "ChannelSight",
     463    "vTg02iIVV" => "Chargeads",
     464    "wPKv-wn7Q" => "Chargebee",
     465    "HJbZqVodjZX" => "Chartbeat",
     466    "IEbRp3saT" => "Chartboost",
     467    "A5oCgmHFtQgIg4" => "Chat Essential",
     468    "BO3dx6Mra1k9GA" => "Chat Metrics",
     469    "C66l3JRfAxdGQA" => "Chatbase",
     470    "6HgPXo1si" => "ChatBot4You",
     471    "fNX9aue_W" => "Chatchamp",
     472    "5uf4Ob3t1XN-Cj" => "ChatLab",
     473    "T8aQwGQAa" => "ChatLingual",
     474    "K7k356nB" => "Chatra",
     475    "fnSyKoUyR" => "ChatShipper",
     476    "b2HHpjQUE" => "Chatshipper| AE",
     477    "--MzGIqMG" => "Chatshipper| AR",
     478    "NoqlDY0oz" => "Chatshipper| AU",
     479    "84dzCu7Kj" => "Chatshipper| BR",
     480    "IbXoCTUii" => "Chatshipper| CO",
     481    "9LJEo_2rb" => "Chatshipper| NZ",
     482    "CwCThuokI" => "Chatshipper| RU",
     483    "ux0Lcy9ys" => "Chatshipper| RU",
     484    "4_nMRPZtr" => "Chatshipper| TR",
     485    "RLsuv0ttX" => "Chatshipper| ZY",
     486    "-sibI7br0O_Dcz" => "Checkfront",
     487    "un6JwcgQG5VcK1" => "Checkout.com",
     488    "q4KssvUm-" => "Cheq",
     489    "9dvY4sSZi" => "Cheq AI Technologies Ltd.",
     490    "QcjN2V8k_TV76l" => "Chili Piper",
     491    "Bk9xx5VsdoWm" => "Chocolate Platform",
     492    "gdvSff1hg" => "Cint Network",
     493    "acSvos0XNztx4Y" => "CitrusAd",
     494    "6smMKIWrt" => "Cituro",
     495    "F3bB6q6wfNgmQ6" => "CityPilot App",
    19496    "xI9qM4Yhk" => "Civey",
     497    "iONrYLmnn" => "CJ affiliate",
     498    "SyCE0KqAQ" => "Clarium",
     499    "tC9q5J7xA" => "CleanTalk",
     500    "F6YatvySOXyKxg" => "Clearbit",
     501    "ZmHxg0LX2cTSly" => "Clerk.io",
     502    "P4_bu9j4" => "Clever Elements",
     503    "Hkq1Xar5V" => "CleverPush",
     504    "o5fE3ybZ" => "CleverReach",
     505    "qQhJaxvd34pUx8" => "CleverTap",
     506    "TOyxVvzIw" => "Click Dimensions",
     507    "BP1atj7Yr" => "Click Guardian",
     508    "sGB-VG0Cw" => "Click2buy",
     509    "jgGgfqxe0" => "Clickcease",
     510    "HT8vkhwg2" => "Clicksco Digital",
     511    "rJW2xqEsuibX" => "Clipcentric",
     512    "_9GUFiQ9W" => "Cloud Functions for Firebase",
     513    "FzVAet4ub" => "Cloud Storage for Firebase",
     514    "7R7chEXGs" => "Cloud Technologies",
     515    "DNxukinmg" => "Cloud.IQ",
     516    "HkIVcNiuoZX" => "Cloudflare",
     517    "xQ7R_MtouldLmR" => "Cloudflare Turnstile",
     518    "xFh43inVo" => "Cloudflare, Inc.",
     519    "BJ_ocNjds-X" => "cloudfront.net",
     520    "B1CDTgJEX" => "CloudImage",
     521    "XpPsZvVN6" => "Cloudimage",
     522    "r1HocEjOiWm" => "Cloudinary",
     523    "SO2GHGVL9" => "co2online",
     524    "1kuoX1MnGbbZld" => "CoChat",
     525    "lSDamg0Dz" => "CodePen",
     526    "uGBKGpLwqq1CQb" => "CodePush",
     527    "S1d9eqVodsWQ" => "Codewise",
     528    "n8sUMtfze" => "Codigo",
     529    "4HJCCD0uI" => "COFORM",
     530    "EiStTLS8P" => "Cognigy",
     531    "rJFFlc4j_sZ7" => "Collective",
     532    "rJlwgqEsujbQ" => "Collective Europe",
     533    "Sk85e94s_ibQ" => "Comcast International France",
     534    "qKULVqrY_" => "Commanders Act",
     535    "Wx3IbW48OzUDEp" => "Comments",
     536    "WF-8JwSlq" => "commerce connector",
     537    "nK-Uqoy-f" => "commercetools",
     538    "6EVVAXCBR5ngVu" => "Common Ninja",
     539    "V0HX9cPeQ" => "communication Ads",
     540    "1drdvuWXO" => "Computop",
     541    "B1WMgcNodi-7" => "comScore",
     542    "859gL6rBS" => "Concludis",
     543    "SkzQlc4oOj-Q" => "Confiant",
     544    "BJknx9Nius-Q" => "Connatix Native Exchange",
     545    "SynGg5VsOiWQ" => "ConnectAd Realtime",
     546    "HNEN0Bg_y" => "Connects",
     547    "66kNuj2_n" => "Connexity",
     548    "GaSh0RTk2" => "Consentric",
     549    "8ctYI_8U3" => "Consors Finanz",
     550    "_GgHCK3ZEpGAao" => "Constant Contact",
     551    "cphN9wqOfmJOnf" => "Constructor",
     552    "z4cR3afxG" => "Consumable",
     553    "yRjH5CoGrlqnkc" => "Contact Collection",
     554    "4OUatCDhD" => "Contact Form 7",
     555    "YFigsoh4HN9sWt" => "Contact Form by Powr",
     556    "SJoW5NiOiZX" => "Contact Impact",
     557    "q19Crnv3" => "Contao",
     558    "S1MTc4o_oWX" => "Content Garden",
     559    "vs7lkZ5Rt41qri" => "Contentfry",
     560    "PYggIh6xB" => "Contentful",
     561    "Ki2RMQPHf" => "contentignite",
     562    "w8rDkjxj" => "ContentSquare",
     563    "ie5SAaPq_" => "Continually",
     564    "SJ45xcEj_sZQ" => "Converge-Digital",
     565    "Jj-cSioru" => "Converify",
     566    "Bk3A9VoOsZQ" => "Conversant Europe",
     567    "LykAT-gy" => "Conversion Linker",
     568    "drDqUw9P" => "Conversional",
     569    "hMRPcifE3" => "Conversions API",
     570    "NEwiuQ7p9" => "Convert",
     571    "gK4ciedfd" => "Convert Plus",
     572    "gWaBe7seEZL3PC" => "ConvertKit",
     573    "T5DNZUae" => "Converto",
     574    "w3F-dGB9Rc5tGI" => "Conword",
     575    "rJpK9VjusWX" => "Cookie Consent",
     576    "8TziAnlg5SJF0U" => "Cookiebot",
     577    "u4pd6DxYHG7QGL" => "Cookiebot for Wix",
     578    "0tftWyie-nlUI6" => "Copper Banking",
     579    "4QcJIWh7" => "Corazon",
     580    "JZb-2_sb0qbBPt" => "Coveo",
     581    "8K4QDDTlf" => "Crashlytics",
     582    "H1RKcVjuo-X" => "Crazy Egg",
     583    "ryntqNi_oZm" => "createjs",
     584    "eOxs7vkZ5cIbRn" => "Creditreform",
     585    "bo1eQYBqE" => "Crefopay",
     586    "rkT1x5Eo_ibm" => "Crimtan Holdings",
     587    "B1fDhaZcE" => "Crisp Chat",
    20588    "HyeqVsdjWX" => "Criteo",
     589    "SystcNs_i-X" => "Criteo OneTag",
     590    "ir7QpAGI" => "CrossEngage",
     591    "NaBqSG56ozyl3f" => "Crossplan",
     592    "xWwGfga9W" => "Cuebiq",
     593    "P4TRMHYULjn2JH" => "Cuenect",
     594    "lkM9hmqWWT3Lzk" => "Curalate",
     595    "ZHU4a5mZPVMuoP" => "Currency Converter",
     596    "M8wT_v7Yf" => "Custobar",
     597    "vDIn19n9F" => "Customer Alliance",
     598    "ki0bzRVWKZovIj" => "Customer Reviews by WACR",
     599    "mC-lKBOTZ" => "Customer.io",
     600    "_MbxwST_7Mu62J" => "Customerly",
     601    "I99Vzl6mZ" => "Cxense",
     602    "06NhSHkb5" => "Cybba",
     603    "Divc-nzbk" => "Cydersoft",
     604    "Ek_i8cfWU" => "Czech Publisher Exchange",
     605    "20R0KrKk8" => "d.vinci",
     606    "Vd4jf_bW9" => "DailyGo",
    21607    "VJNO26pZe" => "Dailymotion",
     608    "H9bIKf_i" => "dailypoint",
     609    "_OIm7GxyZ" => "Daisycon",
     610    "nLWGjXeAyJHTJu" => "Daktela Webchats",
     611    "SyxfH7JN7" => "Danubius",
     612    "IoSfrTR1p5Sxpo" => "Daon",
     613    "r1G0NXJEX" => "DAT Group",
     614    "Flf8kP0XXc_ubD" => "Data Circle",
     615    "BJL48D74Q" => "data22",
     616    "P7XVa18qr" => "Datadog",
     617    "Xl0HIOViY" => "Datadog Real User Monitoring",
     618    "NeWsJito4aPrFK" => "DataDome",
     619    "edd8bsMOg" => "Dataseat",
     620    "78h78kgEz" => "Datatrans",
    22621    "8Nxb4ZtSa" => "DataWrapper",
     622    "7tNwk5fZ9" => "dataXtrade",
     623    "H10nc4s_iWX" => "DataXu",
     624    "XnGRMsNDp" => "DatoCMS",
     625    "HJIBxqVsOo-Q" => "DCMN",
     626    "MQJ6TX04ENV3Du" => "Dealfront",
     627    "fGLl3IvZA" => "DeepIntent",
     628    "LlTSS4MfNQfOAf" => "DeepL",
     629    "xK8kAxsif" => "Define Media",
     630    "wZ5JcfjYw" => "Delivery Hero",
     631    "HylUe9NsOs-7" => "Delta Projects",
     632    "yLsP4len5" => "Demandbase",
     633    "JPsksE_6U" => "Demex.net",
     634    "2SoPnIWSY" => "Demodesk",
     635    "yBRIQt31I" => "DemoUp",
     636    "PcyIFVx6_" => "Densou Trading Desk ApS",
     637    "KY9kEd5AV" => "Dentsu Aegis Network",
     638    "6lTC1aNep" => "Desiretec",
     639    "H1MxcVsujbm" => "Deutsche Post",
     640    "yRdgviIjf" => "Devatics",
     641    "NzIW86WRUkmZJK" => "devtodev",
     642    "ry7d5Njui-m" => "DFP Traffective AdServer",
     643    "-XvEgJd2S7TpTO" => "Dialogbits",
     644    "ISpYFA-TbtD2KZ" => "DialogShift",
     645    "QtXuaSW-k" => "didFind",
     646    "HyMRe54juibQ" => "Digilant Spain",
     647    "DnsfUym0nruTtI" => "DigiMember",
     648    "RxO91a70" => "Digistore24",
     649    "zmbCFQIKk" => "Digital Control",
     650    "_BRxakDwo" => "Digital East",
     651    "S1RUqVodiWX" => "Digital Media",
     652    "q6FEv3jcYyYunG" => "Digital Turbine Ignite",
     653    "rJo4xcEo_s-Q" => "digitalAudience",
     654    "S11RqVoOoWQ" => "Digitalberatung",
     655    "2riF-7vlWnhFAT" => "Digitale Adventskalender",
     656    "XX-JdeS24Gxyiq" => "DigitalTurbine",
     657    "B1DCgqEjdiZ7" => "DIGITEKA Technologies",
     658    "BJiugcEjOjZm" => "Digitize New Media",
     659    "H1oi94o_o-m" => "digitru.st",
     660    "Yq0xUHB4NC2SQl" => "DirectTv",
     661    "6MZkp0plA" => "Dirs21",
    23662    "hvWNhpF0T" => "Discord",
    24     "r1rX94i_iZX" => "Disqus",
     663    "UekC8ye4S" => "Display & Video 360",
     664    "r1rX94i_iZX" => "disqus",
     665    "SJmVgqNjOjbX" => "district m",
     666    "XtPJZdv6Y" => "DistroScale",
     667    "B4KTdM5zY" => "Ditto",
     668    "1vgHQcJdZ" => "DocCheck",
     669    "Vp6CXtilHrxUso" => "Doctify Platform",
     670    "AlNuXsio8mtmSD" => "Document360",
     671    "Cv-mVwOQr" => "DomainFactory",
     672    "4DFjRax1u" => "Domodi",
     673    "W8RaJ9nUzwh8Qk" => "DonDominio",
     674    "yF3NAOIAC" => "Doo",
     675    "1Pj8F8p0" => "Doofinder",
     676    "pbkhrW6yd" => "dooshop",
     677    "htA-a07qq" => "dotdigital",
     678    "gMfEyvJhF" => "DotNetNuke",
     679    "HJIWBc5RQ" => "Dotomi",
     680    "HkMzqiL4X" => "DoubleClick",
     681    "9V8bg4D63" => "DoubleClick Ad",
     682    "S1ulcVjdiWQ" => "DoubleClick Bid Manager",
     683    "ByzZ5EsOsZX" => "DoubleClick Floodlight",
     684    "YBSUcZx1z4_B6S" => "DoubleClick Floodlight Enhanced Attribution",
     685    "BkjG6N1EQ" => "DoubleClick for Publishers",
     686    "rJBPg9Ns_sWQ" => "DoubleVerify",
     687    "wCMfrJcWb" => "Download Monitor",
     688    "JUf4KxMBj" => "dpa Deutsche Presse-Agentur GmbH",
     689    "zXXgkRFuF" => "dpa Infocom",
     690    "dHZwdhDYf" => "Dr. Banner",
     691    "PJrrqs5FSZYIkc" => "Dr. Free Gift on Cart",
     692    "95xVXSDLf" => "Drawbridge",
     693    "jE46pSyKb4wx8z" => "Dreamdata",
     694    "mv27ouXUn" => "Drees & Sommer",
     695    "hQROV2qf7" => "Drift",
     696    "P0OtsPiRJ" => "Drift Functional",
     697    "rycQc4s_iW7" => "Drip",
     698    "BJND31jnE" => "Droid",
     699    "vZH7Ountd" => "DTS",
     700    "Yh1B51rBx" => "DTS (Filiale de Solocal Group)",
     701    "Bkwk09UD6" => "Duda",
     702    "jvgVtyDjK" => "Duende Software",
     703    "khUD-KNccif_BD" => "dun & bradstreet",
     704    "SUNfUpZFc" => "dunnhumby Germany",
     705    "aV-3rrwlW" => "dunnhumby Germany",
     706    "N78lgT6yb" => "Duplo Media",
     707    "qWONIIQl0" => "Duration Media",
     708    "SyCj9Es_o-m" => "dwin1.com",
     709    "URfCDWgXN" => "DynAdmic",
     710    "4ItmQyYeJqhqbk" => "Dynalyst",
     711    "1qrLQTCTp" => "Dynamic 1001",
     712    "S1krl5Eo_obm" => "Dynamic Yield",
     713    "BJbSg94i_o-X" => "Dynamic Yield Analytics",
     714    "ZkQjr_Hc_" => "Dynata",
     715    "M6Q7giJoz" => "Dynatrace",
     716    "eFVSmqvj_" => "E wie einfach",
     717    "vu3PSfZe4" => "E WIE EINFACH Freunde werben",
     718    "8K-4oFu8y" => "e-bot7",
     719    "X9yTQ_PyX" => "e-guma",
     720    "M2_r1ASsBScyR0" => "e-vendo Notice",
     721    "MiTDMANqJjOBd2" => "e-vendo Recommendation",
     722    "bizRMOL9e" => "Easy Channel HGV",
     723    "AzN28O17" => "easy.tracking",
     724    "EP8lLzINO" => "easybill",
     725    "juzOkXqXf" => "EasyCredit (Ratenkauf)",
     726    "LMNyVEnn6" => "Easyfeedback",
     727    "H1z4gqEidjW7" => "EASYmedia",
     728    "lsgoV13iJr6Thb" => "eBay Store by Mindbulbs",
     729    "L2vWsDOr4W34eH" => "Ecommerce Store by Powr",
     730    "SJXtq4iOoZX" => "Econda",
     731    "T9d835M3" => "econda Analytics",
     732    "wGNsI0zJ" => "econda Analytics Essential",
     733    "20BzO8h3" => "econda ARP",
     734    "nWVAamrH" => "econda Cross Sell",
     735    "FOFHxPa22" => "Ecwid",
     736    "6GmJR3rzo" => "EDA",
     737    "K_7pBvUQf" => "Edadata",
     738    "9dKk-fQDXRfJCs" => "eDesk",
     739    "aNpyKNtfO1853l" => "Editorify - Product Reviews",
     740    "S0nozGN1_" => "edoobox",
     741    "4qK0LMP3J" => "Effiliation",
     742    "Ci1XLVUSI" => "eGain",
     743    "TYi_Ik7-x" => "eGovernment Podcast",
     744    "WwZYS9xvA" => "EHI-Siegel",
     745    "8mYD5MWhP7f_fR" => "Eightfold",
    25746    "MEXztGXoM" => "eKomi",
    26     "rkUcEjuoWm" => "Facebook Audience",
     747    "6hTRb4RkSrDSHf" => "Elastic App Search",
     748    "3CHxj_Uea" => "Elementor",
     749    "dCQTj1ryb" => "Elfsight",
     750    "zTRmwB89UzXzW3" => "elopage",
     751    "ByBFq4idoZQ" => "Eloqua",
     752    "Q0sjsdWCVe9THW" => "eMarketeer",
     753    "S16u54s_i-Q" => "Emarsys",
     754    "XULebj6Iz" => "Embedly",
     755    "tLxmZ4lJ0ELfBT" => "EmbedSocial",
     756    "5yZ6vvmjj74g5n" => "Embrace",
     757    "F2X0mUlze" => "Emerse",
     758    "gPX7VyXhz6JZs9" => "Emersya",
     759    "BJmZ9Nids-m" => "emetriq",
     760    "4ENZ2_2hS" => "Emodo",
     761    "ByRVl9ViuoZ7" => "EMX Digital",
     762    "lJw-5t0vr8pM99" => "Endereco",
     763    "L20cjXk4q" => "energyAds",
     764    "WS9UinNyJ" => "EngageYa",
     765    "l-0ygHVr" => "Episerver",
     766    "Vhp0w3eBr" => "epoq",
     767    "0pVo537JLlx-_n" => "EQS IR Cockpit",
     768    "qN-ur-FZOgSdK6" => "EQS News",
     769    "vK54WQhrgnvTFf" => "EQS Stock",
     770    "t3wYmwf7Q" => "eQuota",
     771    "H1gr85C7m" => "Erweitertes Tracking",
     772    "CAh-PzD4" => "esome",
     773    "fy2y1l5NK1ndoP" => "Estheticon",
     774    "ByaC5EsdoWX" => "Etarget",
     775    "B4MOBvmAw" => "eTermin",
     776    "PPkCxv14a" => "etracker",
     777    "BIRApgk3o" => "etracker without cookies",
     778    "-3xZ3_oSf" => "Eulerian",
     779    "jmK4ZP8o" => "Evalanche",
     780    "JpZJ7GnSYRXDyx" => "eveeno",
     781    "HkVrlqEiuibX" => "Eventbrite",
     782    "T2EliczcxLrvtP" => "Events by Wix",
     783    "k-PkpuXOBGi7gq" => "Events Calendar",
     784    "MF2a0ec4R" => "Eventscase",
     785    "BgFFtPqMi" => "Everesttech",
     786    "4eHuZ3Liz9rqUH" => "Everflow",
     787    "SHVGb93oC" => "Eversttech.net",
     788    "r-PDe4a85" => "Evidon",
     789    "JtPFO0Vkb" => "Evm3",
     790    "Ww1bNfD-i" => "EX.CO",
     791    "HJZU9Nj_iZX" => "exactag",
     792    "qE3WE4Wam4ORVF" => "Excentos",
     793    "WpYODjaRP42z7F" => "experian",
     794    "xX46ae_h9" => "Exponea",
     795    "rkKC5EsusWQ" => "Exponential Interactive",
     796    "FXe3euJljI0uJY" => "Eye-Able® Assist",
     797    "n1hCTnCxy" => "Eyeota",
     798    "By7zl9NiOoWX" => "Eyeota Ptd",
     799    "lmAfJPg6InvRFZ" => "Eyepin",
     800    "SkmkZ9Vj_jW7" => "Ezoic",
     801    "rmtXcYS_B" => "f5",
     802    "DJCKNxpeW" => "f5 Networks",
     803    "PNtPBL1Zd" => "Faaren",
     804    "jrUnstvLKeFnIS" => "Fabric Answers",
     805    "Pqk3AsAS7" => "Facebook",
     806    "1XvFW-Y2k" => "Facebook",
     807    "Ug1jBcZJq" => "Facebook App Events",
     808    "ax0Nljnj2szF_r" => "Facebook Audience Network",
     809    "tavJ1OKSj" => "Facebook Audiencenetwork",
     810    "SJKM9Ns_ibQ" => "Facebook Connect",
     811    "rkUcEjuoWm" => "Facebook Custom Audiences",
     812    "SxdpEPwQn" => "Facebook Messenger",
    27813    "ko1w5PpFl" => "Facebook Pixel",
    28     "XYQZBUojc" => "Facebook Social Plugin",
     814    "ocv9HNX_g" => "Facebook SDK",
     815    "XYQZBUojc" => "Facebook Social Plugins",
    29816    "r5-Z_erQ0" => "Facebook Videos",
     817    "DkJsSfr-W" => "Facelift",
     818    "u0ATqylf" => "FACT Finder",
     819    "53QoLB6h1" => "Factfox",
     820    "8keiDlAsDeQBrQ" => "Factors.ai",
     821    "Sp827hBaKKNmEN" => "Fairing",
     822    "TcEBCmnTm" => "Falstaff",
     823    "dDq2_ZEKk" => "fast.fonts.net",
     824    "LRKhbMoNF" => "Fastly",
     825    "SkEscVsusbX" => "FBCDN Facebook",
     826    "5x9QA2VHs" => "Feathr",
     827    "U_4ErlVw0" => "Feed Dynamix",
     828    "ev7yTEG2Z" => "Feed Dynamix",
     829    "ipC9qVnU1ddE8_" => "Feedad Outstream Video",
     830    "VQOf5Oqz6E9gq0" => "Fera Reviews",
     831    "EW5XbVRw3" => "Feratel",
     832    "wP9Wrr5vRCEg4J" => "Fibbl",
     833    "2gB839qN3" => "Fidzup",
     834    "H1Tbl5Nj_iZX" => "Fifty Technology",
     835    "WpRTuyrux" => "FiksuDSP",
     836    "suqC04krG1L4T9" => "Filial & Händlersuche - StoreLocator",
     837    "IEx-Tjzmp2Lq8W" => "Fillout",
     838    "W64b12ODh" => "Filmcentralen",
     839    "HyiV94juoW7" => "FinanceAds",
     840    "Hym5udh9V" => "Findologic",
     841    "oGxSC1QCs" => "Findologic",
     842    "NqUzbHHebkb71p" => "Fingerprint JS",
     843    "IbhfQQbkb" => "Finiative",
     844    "42vRvlulK96R-F" => "Firebase",
     845    "ytzFgf-eM" => "Firebase A/B Testing",
     846    "VX76uyyzy73YYV" => "Firebase App Check",
     847    "R7lR9am_W" => "Firebase App Distribution",
     848    "smOQ7x8wu" => "Firebase Authentication",
     849    "RKCvoZ--rtLVPw" => "Firebase Cloud Functions",
     850    "Mp0TG-j8k" => "Firebase Cloud Messaging (FCM)",
     851    "GdR8b4tr2aKf3E" => "Firebase Cloud Storage",
     852    "cE0B0wy4Z" => "Firebase Crashlytics",
     853    "ecngP6eEs" => "Firebase Dynamic Links",
     854    "OO202MrWM" => "Firebase Firestore",
     855    "uPYPx7TC_" => "Firebase Hosting",
     856    "Qsn-_VTnI" => "Firebase In-App Messaging",
     857    "HY2wFEsVsGfqBR" => "Firebase Installations",
     858    "w7hiUTrsU" => "Firebase Machine Learning",
     859    "2rhWushaj" => "Firebase Performance Monitoring",
     860    "E6zvFdb6n" => "Firebase Predictions",
     861    "iRXREsVii" => "Firebase Predictions",
     862    "eM-uPjak6" => "Firebase Realtime Database",
     863    "2nEos-2ls" => "Firebase Remote Config",
     864    "FBW01l7Nh" => "FirebaseInstallations",
     865    "_Ncf9yLnC" => "Firebot",
     866    "S6nAK-l_I" => "FirstSpirit ICE",
     867    "dJuNHeMq3" => "Fitanalytics",
     868    "AtX7Q3-g9" => "Fittingbox",
     869    "W0C1VS2NZJn2XC" => "FiveAd",
     870    "cSprKh7fQ" => "Flamingo",
     871    "3ksSixTl" => "Flash Player",
     872    "ByP4x94sdsW7" => "Flashtalking",
     873    "-03ZuckNu" => "FlexOffers",
    30874    "X0wJtpzqX" => "Flickr",
     875    "_hpE1bAQKrT7hL" => "Flipbook by Simplebooklet",
     876    "5C8JIjq1K" => "Flipsnack",
     877    "Vy26WddoN" => "Flixmedia",
    31878    "uJyv6-Nm" => "Flockler",
    32879    "kbmJpLAUf" => "Flourish",
    33     "RuWQqICz" => "Giphy",
     880    "S1vXDBFnE" => "Flowbox",
     881    "FlrO-MzKx" => "Flowplayer",
     882    "WZDb3Q2TF" => "Fluid Ads",
     883    "X5abD8nSKYLKSi" => "Flurry Analytics",
     884    "kGLSrGE2j" => "Flurry SDK",
     885    "B1A-5Eiuj-m" => "FLXONE",
     886    "qVPcPO8cJ" => "FM Labs",
     887    "3U8XzcZ2T" => "FOMO",
     888    "SdIj7BUI5" => "Font Squirrel",
     889    "H1GSqEodjZX" => "Fontawesome",
     890    "jhZPu5Km" => "fonts.com",
     891    "H1vi54o_obQ" => "fonts.net",
     892    "LYBjinTii" => "Fontshop",
     893    "BBcvE5Eg0" => "Fontspring",
     894    "8G7U3J2Xc" => "Forensic",
     895    "SzrLr6NAN" => "Forio",
     896    "ljEMGR6jJ" => "Formsite",
     897    "4mEDHCPTjXMa4C" => "Formulayt",
     898    "BDfdw1ennsN5y3" => "Forter",
     899    "r15El9VjusZ7" => "FORTVISION",
     900    "_VBgTrSfZ" => "FouAnalytics",
     901    "yQYmNEilvDTNX0" => "Fourthline",
     902    "gLB9P_wjr" => "Foxydesk",
     903    "q-_eu2X2d" => "Fraud0",
     904    "SJIIt5hl1" => "fraud0",
     905    "CVliYs1Zn" => "Freewheel",
     906    "acYUto9R" => "Freshchat",
     907    "qMGENEB_g" => "Freshdesk",
     908    "bUYUwB3z" => "Freshsales",
     909    "WXuCIEBGA" => "Friendly Captcha",
     910    "Dhu44_2kxD4V0Y" => "Frontnow Advisor",
     911    "BkZ_qViOj-7" => "Fullstory",
     912    "0fl-lzlGczJYge" => "Fundraise Up",
     913    "OQ_YoPScl" => "Fundraisingbox",
     914    "7gS0Vjsc" => "Funnelcockpit",
     915    "fWasnrcz" => "Funnelytics",
     916    "Hk5MAfAmQ" => "Für das Funktionieren der Website wesentliche Funktionen",
     917    "S1GOL9RQm" => "Für das Funktionieren der Website wesentliche Funktionen",
     918    "z1lodDq19s5dV8" => "Fusedeck",
     919    "VpcE6ZZO4mRgTu" => "FuxCDN",
     920    "H17alcVo_iZ7" => "Fyber",
     921    "SSTYcu33F" => "G+J Electronic Media Sales",
     922    "3AwSqkFPz_OCMx" => "G2 - Track Your Prospects",
     923    "QU1vpIg7p" => "G2.com",
     924    "Ju0u0ZSRbkYa3-" => "GA 18: Age Verification 18+",
     925    "b5UwVqnTvXtU4Q" => "Gadsme",
     926    "bQTbuxnTb" => "GameAnalytics SDK",
     927    "By5ogq4oOsZm" => "Gamned",
     928    "fsfWgMGrz" => "Gastronovi Speisekarte",
     929    "dnpN08x5B" => "Gastronovi Tischreservierung",
     930    "Rypthk1_I" => "GeistM",
     931    "hcX1QxmPB" => "Geizhals",
     932    "-Fx1BJClc" => "Geizhals",
     933    "rycTeqVoOiZm" => "Gemius",
     934    "65JrtAVaP" => "Genesys Cloud",
     935    "sfYIpjlx9" => "Genesys Cloud Services B.V",
     936    "S1dFecNjOjW7" => "Genius Sports Media",
     937    "HyTFy29M" => "Gepruefter-webshop.de",
     938    "GH5Ng8oGl0gkAB" => "Getback",
     939    "TvEA5AW-k" => "GetIntent",
     940    "iHduqoTR" => "GetResponse",
     941    "pOEDWfrf0" => "getsitecontrol",
     942    "utDoyjic3psr82" => "GetSocial",
     943    "JgTrA1wBt" => "GetYourGuide",
     944    "i7OSekjkM" => "GetYourGuide Deutschland GmbH",
     945    "PTbb7kx6I" => "GfK",
     946    "vFb6fBLXT-yqQA" => "Gifted",
     947    "oaos1k2AC" => "Giggle Tips",
     948    "RuWQqICz" => "GIPHY",
     949    "42AYnGBRj" => "Giropay",
     950    "Ofh7aUnv" => "GiroSolution",
     951    "ess_H8_2okW3hZ" => "GK AIR",
     952    "Om08aijRzk_SiQ" => "Gleap",
     953    "B1N594jOiZQ" => "Glimr",
     954    "3aIaQuY5b" => "GlobalWebIndex",
    34955    "BySu54sOjZQ" => "Glomex",
    35     "S1_9Vsuj-Q" => "Google Ads/Google AdWords Remarketing",
     956    "HoT8o7YlzZmZ27" => "Goaffpro",
     957    "BJ8rq4jdjWm" => "GoDaddy",
     958    "6AdzXjKpi" => "Goldbach Group",
     959    "rkRFl94j_i-m" => "Golden Bees",
     960    "r1ztecNjdjZm" => "Goodway Group",
     961    "n9pGpcK5L" => "Google Ad Exchange",
     962    "7M0cXS2pQ" => "Google Ad Manager",
     963    "hK_vxTwL-" => "Google Ads",
     964    "S1_9Vsuj-Q" => "Google Ads",
     965    "8ScDZDmU" => "Google Ads Conversion",
     966    "twMyStLkn" => "Google Ads Conversion Tracking",
     967    "dqFgQeZH" => "Google Ads Dynamic Remarketing",
     968    "9rIQbZIzb" => "Google Ads Measurement",
     969    "B1Hk_zoTX" => "Google Ads Remarketing",
     970    "yjqNcpbNY" => "Google Adsense",
     971    "rJ99c4oOo-X" => "Google AdServices",
     972    "rySiXprN7" => "Google AdWords",
     973    "r19MqVjdoW7" => "Google AdWords Conversion",
     974    "SylacVousbm" => "Google AdWords Remarketing",
     975    "H1PKqNodoWQ" => "Google AJAX",
     976    "r1wSlcEjOsbm" => "Google AMP",
     977    "pnDuLUTpa" => "Google Analytics",
    36978    "HkocEodjb7" => "Google Analytics",
    37979    "87JYasXPF" => "Google Analytics 4",
     980    "ABsocZLBQ" => "Google Analytics Advertising",
     981    "GqhZxB-iiydzEk" => "Google Analytics Advertising for Firebase",
     982    "Skr99EiujbX" => "Google Analytics Audiences",
     983    "ge3hQ3zM" => "Google Analytics Event Tracking",
     984    "diWdt4yLB" => "Google Analytics for Firebase",
     985    "b8FM5DHv-" => "Google Analytics Statistics",
     986    "QPYQDujT" => "Google Analytics Youtube Event Tracking",
    38987    "n1jiXg1v" => "Google Calendar",
     988    "pxiRY9112" => "Google Campaign Manager",
     989    "dyHOCwp5Y" => "Google Campaign Manager 360",
     990    "f4iZ3mAm5" => "Google Captcha",
     991    "isJO61p0b" => "Google Charts",
     992    "xr0lbwprU4Tf-L" => "Google Chatbot",
     993    "bms_SDJMG" => "Google Cloud",
     994    "VOjHS1w7aCn0rN" => "Google Cloud Retail API",
     995    "qo3iMe_aP" => "Google Cloud Search",
     996    "Sq_WmUhZ8_bD21" => "Google Consent Mode",
     997    "0-UDzyKi" => "Google CSS",
     998    "S1GV5Ei_oW7" => "Google Custom Search Engine",
     999    "IactbkdI7A1cZU" => "Google Customer Match",
     1000    "CRfCqvYA" => "Google Customer Reviews",
     1001    "rqJvtDVvp" => "Google Display & Video 360",
     1002    "1DhORJFj9" => "Google Docs",
     1003    "HkF9Eo_jbX" => "Google Dynamic Remarketing",
     1004    "vPKlLp_Oh" => "Google Enhanced Conversions",
     1005    "uNl9XGnZC" => "Google Firebase",
     1006    "kjk3gPD2cxt_Ea" => "Google Firebase Analytics",
     1007    "HkPBYFofN" => "Google Fonts",
    391008    "wgTnPe7i1" => "Google Forms",
     1009    "BJMh5NodoZQ" => "Google Global Site Tag",
     1010    "R2gyvn3ugawW0t" => "Google Hosted Libraries",
     1011    "S1Lgx59AX" => "Google IMA",
     1012    "kW5VliBMC5SXQi" => "Google Interactive Media Ads",
     1013    "2Xx3hZ77" => "Google Knowledge Panel",
    401014    "S1pcEj_jZX" => "Google Maps",
     1015    "JyhVKNPZN" => "Google Maps Geocoding",
     1016    "IH_MYjRFv" => "Google Maps Geometry",
     1017    "EkWrVcjOS" => "Google Maps Places",
     1018    "IVQgOy4oSKdrn1" => "Google Maps SDK",
     1019    "t-TPeXsRi" => "Google Marketing Platform",
     1020    "uPcXW8VQTm0CS_" => "Google Merchant Center",
     1021    "B1hcEjdoZ7" => "Google OAuth",
     1022    "gkEBFID-V" => "Google Optimize",
     1023    "iaSHYiqA2" => "Google Partner Badge",
     1024    "HgIfWleMF1Pl7a" => "Google Pay",
     1025    "8ibG8wB1t" => "Google Photo",
     1026    "rw4DyFQcg6s3-W" => "Google Play",
     1027    "A2k5o3ZTtrHZ5w" => "Google Play Services",
     1028    "r1WocNous-X" => "Google Publisher Tags",
     1029    "u3ZX02zVXhJwUG" => "Google Retail Search",
     1030    "C7Yai5mE" => "Google Safeframe",
     1031    "XJGT8f-58" => "Google Sign-In",
     1032    "4Ab1BgiB7" => "Google Signals",
    411033    "SkPc5EjOsWm" => "Google Syndication",
    421034    "BJ59EidsWQ" => "Google Tag Manager",
    43     "HkPBYFofN" => "Google Fonts",
     1035    "pMqnvms3Z" => "Google Tag Services",
     1036    "qvkzz7qPe" => "Google Translate",
     1037    "HkYNq4sdjbm" => "Google Webfonts",
     1038    "fFQ_WmYdQ" => "Google Website Call Conversion",
     1039    "rJAM9EodoWX" => "Google+ Plugin",
     1040    "QNFauzL0-3RUH8" => "Gorgias",
     1041    "rJsTfqq0X" => "GoSquared",
     1042    "O5FoJTAdc" => "GoToWebinar",
     1043    "BkWrc4j_s-Q" => "Gravatar",
     1044    "Bklbg5NodobQ" => "Greenhouse Group",
     1045    "Do1uNYTJTCmuTa" => "GreenSock GSAP",
     1046    "O5oJehm0M-egZz" => "Grin Technologies Inc.",
     1047    "iMp2AEZw8" => "Groove",
     1048    "HJOygqNo_sZX" => "GroundTruth",
     1049    "XHX7M-Bh_" => "GroupM Server",
     1050    "A68gX6mE" => "GroupM Server",
     1051    "wcqBhh7Sy4VYE9" => "Groupride",
     1052    "oSn0j1WChZGGov" => "Grouprides",
     1053    "4NIAkZsNE" => "GSI",
     1054    "EQvwGtc_N" => "gskinner",
     1055    "rJJjcVouoZ7" => "gstatic.com",
     1056    "5e4bAIMiRztWL_" => "Guardsquare DexGuard",
     1057    "e7v_XPJ4OUMY0g" => "Guenstiger.de Sales Radar",
     1058    "HJswr_n5V" => "GuJ_microConversion",
     1059    "rybbeq4sOjWm" => "GumGum",
     1060    "DJHxyS7qFRbRGy" => "Gunosy",
     1061    "nlI_IPK8j" => "Guuru",
     1062    "Z1kX6W6_O" => "Haensel AMS",
     1063    "spx5TfAGR" => "Happy Contests",
     1064    "hkSd1AFG3" => "Happydemics",
     1065    "5o386WKuo" => "hbfsTech",
     1066    "QjO6LaiOd" => "hCaptcha",
     1067    "4nofr3ZKv" => "HCL Commerce",
     1068    "PCM3ENiM_" => "Heap",
     1069    "V2JLZ6oXx" => "Hearken",
     1070    "ZsL20fBoL" => "Hearts & Science",
     1071    "jm2uRvXdcCaHvX" => "Heatclix",
     1072    "wPWaLxeau" => "heidelpay",
     1073    "uMCsHr86c" => "HelloBar",
     1074    "sQyCGhMu7" => "HelpfulCrowd",
     1075    "2gOY3sPPJ" => "Helpscout",
     1076    "DFT9QDJE_BFA3n" => "Helpshift",
    441077    "0V-E5N_GQ" => "Here",
     1078    "S1-CRlIJF" => "Heroku",
     1079    "Cg5EwBm57" => "Hetzner",
     1080    "PWceAZDtb" => "Heyflow",
     1081    "eTZ86zNa7" => "HGV Anfragewidget",
     1082    "pVIUV5bwU" => "hii",
     1083    "ZfbhHSYur" => "HIRO Media",
     1084    "hDr0yM-VkyVPmH" => "Hit Counter by Powr",
     1085    "jgfe089-f" => "Hivestack",
     1086    "cAPqoIgOqoT_Ot" => "Hockeystack",
     1087    "12Rp61cy9" => "hogast",
     1088    "xfC-0NlfB" => "HolaSpark",
     1089    "-xTGk4UJW" => "HolidayCheck",
     1090    "aP9cMixHcEGFB1" => "Homie",
     1091    "aQEevvUcQ" => "Hootsuite",
     1092    "ByOH9EoOsZQ" => "hostgator",
     1093    "M4l7NUrLF" => "Hotel Barometer",
     1094    "3R9IURKfa" => "Hotelchamp",
     1095    "R41epsTpY" => "HotelQuelle",
     1096    "S1kgcNo_j-m" => "Hotjar",
     1097    "S1AZgq4jOsZX" => "Hottraffic",
     1098    "OKaP1ocl" => "HR4YOU",
     1099    "Xs8BSD3DO" => "HRS",
     1100    "ro2Qr0JwU" => "https://www.flashtalking.com/optout",
     1101    "ntynkMgmojs56x" => "HUAWEI Ads",
     1102    "g-00DwuBhiwqye" => "HUAWEI AppGallery Connect",
     1103    "aTTBwjYV-ZLpl-" => "HUAWEI Mobile Services",
    451104    "ry0QcNodoWQ" => "HubSpot",
    46     "r1Fhc4iOoWX" => "HubSpot forms",
     1105    "GVxz5M93SoINWc" => "HubSpot by SyncSmart",
     1106    "B0yp01393" => "HubSpot Essential",
     1107    "r1Fhc4iOoWX" => "HubSpot Forms",
     1108    "q6YYRb_V9AxuuY" => "Humm",
     1109    "QZPPPW641" => "Huq Industries Limited",
     1110    "No50R7Wr" => "Hurra.com",
     1111    "Ie2tI6I8A" => "Hybrid Adtech",
     1112    "ROCBK21nx" => "HyprMX",
     1113    "i1sbFas6IXyQ1c" => "I-mobile",
     1114    "XMTWUaeze" => "IAB Open Measurement SDK",
     1115    "HJanx9NoOjb7" => "IAB Technology Laboratory",
     1116    "V7Aw0ubTPes8vT" => "iAd",
     1117    "BykM5Vodi-X" => "iAdvize",
     1118    "TE1p4rbif" => "Ibexa DXP",
     1119    "8t91Hdo8W" => "Iconfinder",
     1120    "xSkLLZByv" => "Icons8",
     1121    "Hy2XlcEi_ibQ" => "ID5 Technology",
     1122    "HytuM2Hq4" => "Idealo",
     1123    "iO7pDk0MCbOpOD" => "If-So Dynamic Content",
     1124    "e9v8TIcig" => "ignitionAi",
     1125    "HJPPe9VjOsZX" => "IgnitionOne",
     1126    "DJgoqmnpF" => "Illuma Technology Limited",
     1127    "2DeBAlZBPce0Np" => "ImBox",
     1128    "XZ6buX0Z2" => "Imgix",
     1129    "-7aWGVtV7" => "Immobilienwertanalyse",
     1130    "eDtR-Qpyr" => "ImmoScout24",
     1131    "ha-q9XBo" => "Impact Radius",
     1132    "Db4YwX8aalX3oG" => "Impact.com",
     1133    "0Xgr5Vwth" => "Impactify",
     1134    "Y4NL-RXQQ" => "Imperva",
     1135    "SJwZxc4sOsZQ" => "Impression Desk Technologies",
     1136    "S1a9gqNj_iZ7" => "Improve Digital International",
     1137    "gjsI_E28r" => "Incert",
     1138    "HyldcVsOo-m" => "Indeed",
     1139    "HJr1gqVsOjbm" => "Index Exchange",
     1140    "PAess3fOL" => "Indoqa Search-Analytics",
     1141    "CVBUWHOL8" => "INFINIA MOBILE",
     1142    "KxDKFEzQHcHKvi" => "Influence mobile",
     1143    "F9geCQdkM" => "Infogram",
     1144    "BXU3bgwQNXkz2a" => "Infomax Websolutions",
     1145    "r1qWcNoOsW7" => "INFOnline",
     1146    "AJC7siicR" => "Ingenious Technologies AG",
     1147    "ykdq8J5a9MExGT" => "InMobi",
     1148    "Hyu6e9VjdoWQ" => "InMobi Pte",
     1149    "IWEry9w3j" => "INNITY",
     1150    "1On4iIz0pXPB7x" => "Innkeepr",
     1151    "kDgm-HFUj" => "Innovid",
     1152    "KpyTD7UX8HJ_xi" => "Insider",
     1153    "HkGcl5Viuo-7" => "Inskin Media",
     1154    "-Gj2r8bd6" => "Instabug",
    471155    "SyUQ54odobQ" => "Instagram Content",
     1156    "sHCH_ftzBIyJfN" => "Instana",
     1157    "AOgl5ztxY" => "Instapage",
     1158    "rkkCx9EjuiZQ" => "Instinctive",
     1159    "gstWfFWQ4" => "Instreamatic",
     1160    "uceCBKaoi" => "InsurAds Technologies",
     1161    "B8AYJ-S6i" => "intedia",
     1162    "C1w4LIzQZ" => "Integral Ad Science",
     1163    "0B8fT5-8O" => "Integral Ad Science",
     1164    "ByiGqViusWX" => "intelliAd",
     1165    "Qv2yE-JQd" => "intelliAd Privacy Safe Analytics",
     1166    "r1KkV5tb8" => "intelliAd Tracking",
     1167    "jdFcD8NQuNYIy_" => "Intellimize",
     1168    "r1Klg5VjOoW7" => "Intent Media",
     1169    "ZPBtlhwwj" => "Interactive Performance",
     1170    "oAGTwTX0" => "Interactive Performance",
    481171    "ryDQcVoOoZQ" => "Intercom",
     1172    "XERJaRzZN" => "Internet BillBoard",
     1173    "RkzHS-jLm" => "Interrogare",
     1174    "rJ4tecEoOoZ7" => "Intowow Innovation",
     1175    "uHbOWgCQJ" => "Invibes",
     1176    "6reLOgXs1" => "Inxmail",
     1177    "SyBR15Ly4" => "Ioam",
     1178    "vBT3xziaP" => "IOL-BODY",
     1179    "r1xKx94jusZ7" => "iotec global",
     1180    "mHEhMFFdV" => "IP Stack",
     1181    "AcG0jQhhzztYxU" => "ip-api",
     1182    "5R7MB_6N0" => "IP2Company",
     1183    "zZoDj4IdOx8lGp" => "iPages Flipbook",
     1184    "Y3S3Cjlht" => "iPaper",
     1185    "95bcFdZvH" => "Ipapi",
     1186    "D5DUswh2fMIkg5" => "Ipify",
     1187    "B16Q9VodjbQ" => "Ipinfo",
     1188    "BnK1tfEC6R1Qrl" => "iPlayerHD",
     1189    "rklNe9NjOiWm" => "IPONWEB",
     1190    "ry6p5NiujW7" => "iProm Remarketing",
     1191    "WGTklT4Im" => "iProov",
     1192    "Mii4b2CFl7rgK1" => "IQzone",
     1193    "hY-4uY34I" => "Iridion",
     1194    "9dchbL797" => "ironSource",
     1195    "qMW-1y9VZncgxO" => "iSenseLabs",
    491196    "dwkRM0PG" => "Issuu",
     1197    "lx8ViIae4q6Ho2" => "Iterable",
     1198    "u34eMAoRD" => "iThemes Security Pro",
     1199    "R6bu3Q3X4" => "iTunes Coverbilder",
     1200    "Bk79g5EjuoZX" => "Jaduda",
     1201    "t9GHg5xFu" => "Jameda",
     1202    "wT2IxHKzZ" => "Jampp LTD",
     1203    "V4QOOdntTmS07U" => "Jentis",
     1204    "SJNrcVo_o-7" => "JetPack (WordPress Plugin)",
     1205    "B1mACbkCb" => "Jimdo",
     1206    "UZOZDGJER" => "Jira Service Desk",
     1207    "bWGt72FTi" => "Jivochat",
     1208    "ByAje9No_j-m" => "Jivox",
     1209    "GLIuvNhzfKbWEI" => "JobRad",
     1210    "JIK6n-FV9RuDQ6" => "JobRad Österreich",
     1211    "49Xa8jsyH5rSfo" => "JobRad-Rechner",
     1212    "VQfUiTGEr" => "Join",
     1213    "am5lpKiXP" => "Joomla",
    501214    "J9V5VBp3y" => "JotForm",
     1215    "Sy7BcNo_ib7" => "jQuery",
     1216    "YFfQgeL1F" => "jQueryUI",
     1217    "F-REmjGq7" => "JSDelivr",
     1218    "c85glKPAc" => "JTL Shop",
     1219    "13MNOMVk-l3Ngn" => "Judge.me",
    511220    "-ONUgPRHp" => "Juicer",
     1221    "w-6YwMJPGxMGoM" => "Julep Media",
     1222    "XshkkGRyb" => "Jumio",
     1223    "7VMQjmth-zQrAt" => "Jumpseat",
    521224    "YiVeMG4Ma" => "Juris",
     1225    "CTaQ5h7W8UxLLV" => "Juspay",
     1226    "sTLR41-Y-" => "Justix",
     1227    "Hk_el94sdsZQ" => "Justpremium",
     1228    "XPNynwmsY" => "Justtag",
    531229    "ppPIzs4e" => "JW Player",
     1230    "yJh98UvrN" => "jweiland.net",
     1231    "Q6QFEEKXW" => "Kadermanager",
     1232    "w-cwb3XM" => "Kairion",
     1233    "Yck-LLwy0" => "Kairion Instore",
     1234    "d0-kDutgg" => "Kairion Instore & Out-of-Store",
     1235    "XAUageUTd" => "Kairion Out-of-Store",
     1236    "onMhbpYZn" => "Kairos Fire",
     1237    "g6bEKM3Hs" => "Kakao",
     1238    "S1MLTlkEX" => "Kaltura",
     1239    "H1yDxp7JN" => "Kameleoon",
     1240    "9FYjH37-J" => "Kameleoon A/B Testing",
     1241    "2lh8-reEz" => "Kameleoon Personalization",
     1242    "07EU8bMnixRXgH" => "Kayak",
     1243    "C2a4_R3z6" => "Keen IO",
     1244    "BkDKHsV5N" => "Kelkoo",
     1245    "mmVz-j_tr" => "KennstDuEinen",
     1246    "SJ7T9NjOjZX" => "KenShoo",
     1247    "eoVgXrQuQ" => "Kentico CMS",
     1248    "HJBSqEido-X" => "keyCDN",
     1249    "zB-0M4f30" => "Keycloak",
     1250    "SJysx5Nodj-X" => "Keymantics",
     1251    "2kcwp9XMK" => "Khoros",
     1252    "Snx31FWS16T7HN" => "Kickbite",
     1253    "zf-7LGQ2" => "Kickfire",
     1254    "BqOkNFgpbLczMs" => "Kicktipp",
     1255    "JiXMaMGfGU0AMm" => "Kidoz",
     1256    "zbwYM1LoEJZynZ" => "Kiko Chatbot",
     1257    "ko6wPAMieDctcU" => "Kindly",
     1258    "U7XTUDFas" => "Kiosked",
     1259    "loZk__DQmtCVlO" => "Klar Insights",
     1260    "x8yJ18Vy-pXRWV" => "Klar Pixel",
     1261    "7x35Xo7A" => "Klarna",
     1262    "JuU9Uc996" => "Klarna On-site messaging",
    541263    "m5uB6gnoW" => "Klaviyo",
     1264    "t0R7w63eu" => "Klear",
     1265    "hPrNlr3oRSQ3Av" => "Klevu",
     1266    "OrQTMdFE" => "Klick-Tipp",
     1267    "b8m6H4Eyp" => "Knexus",
     1268    "ABb8d45Rx" => "Knight Lab",
     1269    "w2KKV5_Fk" => "Knorex",
     1270    "r1KoxqNi_sZX" => "Knorex Pte",
     1271    "J9GIhipl2cGDEL" => "Koalendar",
     1272    "cMbvCxbnW" => "Kochava",
     1273    "xybUsnxey" => "Kognitiv",
     1274    "yP7Kbu7nw" => "Koko Analytics",
     1275    "mBFMre9KsMbdyA" => "Komoot",
     1276    "LobSoYzEM" => "Königsteiner Digital",
     1277    "es91dXvv5" => "Konsole Labs",
     1278    "Idm31to_c" => "Konsta",
     1279    "9Q7Bc1oNz" => "kr3m",
     1280    "gTaR1wkJyo9R86" => "Krones",
     1281    "GYCSUJaZd" => "ksu",
     1282    "tiFs2oYxt" => "kulea",
     1283    "PGQo494D" => "kununu",
     1284    "g4cu7oq5C" => "Kupona",
     1285    "70rpl4n2FyxuMX" => "Kuula",
     1286    "FAbLkZ3Tx" => "Kwanko",
     1287    "JH7NZIVIn" => "KXCDN",
     1288    "HyETcEoOjbQ" => "Ladenzeile",
     1289    "Tau9-tfH_" => "LamaPoll",
     1290    "FugOpEoJ7" => "Landbot",
     1291    "MV-UxJe2MAGfUW" => "Lasso Analytics",
     1292    "By5v5Vo_ibX" => "Lead Alliance",
     1293    "CIYR_A-Kh" => "Lead Forensics",
     1294    "v8EoM4g_YlhQch" => "Lead Onion",
     1295    "mfODT12AJ" => "Leadfamly",
     1296    "mbL6QSpmZ" => "Leadfeeder",
    551297    "eSE_HHXnI" => "Leadinfo",
     1298    "HkdvTCJTN" => "LeadLab",
     1299    "mjyIByaUN" => "Leadlander",
     1300    "ToKFtuZCS" => "Leadoo",
     1301    "E4CTElGAt" => "Leady",
     1302    "UpfsXTdEl" => "Leanplum",
     1303    "iESVWUYYXXPd7l" => "LearnWorlds",
     1304    "swhrlNC1JhYd8Q" => "Legejobber",
     1305    "YlhLJPcIk" => "Leiki",
     1306    "-ZG-GiW7s" => "Lemo Media Group",
     1307    "zRMtP5wY-" => "Lengow",
     1308    "gj_ifGDMW" => "Libsyn",
     1309    "loY267uTc" => "LifeSite",
     1310    "H1GgxqNsuibQ" => "LifeStreet",
     1311    "EMD3qUMa8" => "Liftoff",
     1312    "Hke994oui-7" => "Ligatus",
     1313    "FDiqvMBm0" => "LightWidget",
     1314    "AjOoxG0fkmHrmf" => "Lime Connect",
     1315    "--PErZkDm" => "LimeSpot",
     1316    "HDZy5SBI8bwYro" => "LINE",
     1317    "bkhjDXJzLlHFNY" => "Linexo",
     1318    "vsPo8NP4j4VJFB" => "Link11",
     1319    "aRZacFiPZ" => "LinkConnector",
     1320    "rk-nqEj_o-m" => "LinkedIn Ads",
     1321    "BJikbq4iujWQ" => "LinkedIn Analytics",
     1322    "PZZPKRUZvR-WGG" => "LinkedIn Conversions API",
     1323    "JQ2XQxIk" => "LinkedIn Insight Tag",
    561324    "Hkx754i_iWm" => "LinkedIn Plugin",
     1325    "KlgP751_a" => "Linkpulse",
     1326    "Te5E2yroW0raV6" => "Linkster",
     1327    "BJZOeqEjOs-m" => "LiquidM Technology",
     1328    "Gq3CKeAHP" => "LIQWID",
     1329    "0TSO2KqwdGcKZq" => "LiSA",
     1330    "OTnvvCqHZwyzg_" => "Live Chat by Text",
     1331    "5fsm8AQ864Jf4A" => "Live Intent",
     1332    "fmq5LxcxX" => "LiveAgent",
     1333    "LNZGBYJCq" => "LiveChat",
     1334    "Skh2lcVsusWX" => "Liveintent",
     1335    "H-Ph11IG" => "LivePerson",
     1336    "BkqzgqNiOiWm" => "LiveRamp",
     1337    "Ub9GLCn2Q" => "LiveRate",
     1338    "gkAMkDthN" => "Livereach",
    571339    "KpU9UXKjc" => "Livestorm.io",
     1340    "ryTKg9Vjdibm" => "LKQD",
     1341    "gqlgap7z" => "Loadbee",
     1342    "wlw9L37WhiR0cD" => "Locally",
     1343    "NnzcTZOVY" => "Localsensor",
     1344    "dysR7qv-pDSNJY" => "Localytics",
     1345    "Byr8gcEidiZQ" => "Location Sciences AI",
     1346    "91Upq6kl0" => "Login with Amazon",
     1347    "YPfKe97FZUx-Ve" => "LogRocket",
     1348    "HkdUgcUJE" => "Lokale Internetwerbung",
     1349    "UbQqceRWO" => "Lokalleads",
     1350    "An5QLDtKdj0xm4" => "Loom",
     1351    "Sgkhva2fl" => "Loopingo",
     1352    "ryMzxqNjujZQ" => "LoopMe",
     1353    "_asujRjnh5cKeW" => "Loqate",
     1354    "9sO0BIT2L" => "LotaData",
     1355    "BkpMg9NidsZ7" => "Lotame Solutions",
     1356    "whVd0dVxDf0z-8" => "LoyaltyLion",
     1357    "Cl5QZ8H3D" => "LoyJoy",
     1358    "NNjm99KyT" => "LTS (Landesverband der Tourismusorganisationen Südtirols)",
     1359    "MDcI496A3" => "Lucid Holdings",
     1360    "EIAR4eOXr" => "Lucky Orange",
     1361    "k87Dze248BM6A_" => "Luigi’s Box",
     1362    "wajcSFWhjyXa4Y" => "Lunio",
     1363    "j71PcgQVV" => "LUX Marketing Automation",
     1364    "tLcW3mJYZk6RDO" => "Lyft",
     1365    "OV4ohrdfO" => "m-pathy",
     1366    "S1Jbl9EiOo-7" => "M32 Media",
     1367    "uhH_E-xE0W0A2U" => "Mable.ai",
    581368    "ukU5jpn0K" => "Machineseeker",
     1369    "ukrh2nEMY" => "Madington",
     1370    "S1Veeq4oOjbm" => "Madison Logic",
     1371    "rk_QecEoui-X" => "MADVERTISE MEDIA",
     1372    "f8YBSIync" => "Magebird",
     1373    "harQzo_Qz" => "Magento",
     1374    "Hk6V3Z367" => "Magento Persistent Shopping Cart",
     1375    "3csbuOW2G" => "Magic Toolbox",
     1376    "TIA_KQy80" => "Magnite",
     1377    "wG7JE3IK" => "Magnolia CMS",
     1378    "SJggqNsOi-m" => "Mailchimp",
     1379    "Hb4cXZ62" => "MailerLite",
     1380    "hMBCbMMRj" => "Mailgun Technologies Inc.",
     1381    "-y8Iryeh" => "Mailingwork",
     1382    "njy_AxqKG" => "Mailjet",
     1383    "Rb9_GOhdl" => "Mailmunch",
     1384    "xvQ9rrBdK" => "Mailocator",
     1385    "CvYyhHihHVjzsX" => "mailworx",
     1386    "HJWse9Es_sWX" => "mainADV",
     1387    "T7Dp7SESu" => "Mairdumont Netletix",
     1388    "DeK0Hv2ii71Lt6" => "Make",
     1389    "Ek1i784CL" => "Mandrill",
     1390    "Bk0CpKIkN" => "Map and Route",
    591391    "U8QkTd2W" => "Mapbox",
     1392    "QmkqgbGhi" => "Mapp",
     1393    "30sq7vsLd" => "Mapp Intelligence Anonymous Tracking",
     1394    "Ouzxu26Rv" => "Mapp Intelligence Full Feature Tracking",
     1395    "HpFI85vq-" => "Mapp Intelligence Tag Integration",
     1396    "RO1d0uR2fCybGj" => "MapTiler",
     1397    "qySmlP-Vg" => "Maptoolkit",
     1398    "IKEv1F3uL" => "Marfeel",
     1399    "r1Pae9VjusbQ" => "Marfeel Slutions",
     1400    "ISdS_fz6apf_0L" => "Marker.io",
     1401    "fJGKXqdGb" => "Market Resource Partners",
     1402    "BqrjsapwE7B08L" => "Marketing Cloud Einstein",
     1403    "rkBBg94sdiW7" => "Marketo",
     1404    "B1Z8aG07Q" => "Maßnahmen für Werbung und Remarketing",
     1405    "v8O815I--b-cCs" => "Mastercard Masterpass Checkout",
     1406    "S1We94i_oZ7" => "MaTelSo",
     1407    "Ez5p9gJN0" => "Mathtag",
    601408    "zqWojrT0P" => "Matomo",
    611409    "u6fxocwTs" => "Matomo (self hosted)",
     1410    "vtoY2LcrVB4gHm" => "Matomo Tag Manager",
     1411    "B1a0x54jdiZX" => "Matomy Media",
    621412    "7bFNv7DLf" => "Matterport",
    63     "SJ6xqVidi-X" => "Media Math",
     1413    "WZLx_vBAc5RyAP" => "MATTRZ",
     1414    "pwrC1OMft" => "Mautic",
     1415    "kLzaFClx3VhlBb" => "Maven360",
     1416    "MshQNhTYu" => "Maximus",
     1417    "H627Q19Ki" => "Maximus Live LLC",
     1418    "qCSlzFQB" => "MaxMind",
     1419    "Hyhgq4sOs-m" => "Maxymiser",
     1420    "rJlGx5Nidi-m" => "Maytrics",
     1421    "cK1mt5-o8v2-n6" => "Maze",
     1422    "qJcqahB57" => "MBR Targeting",
     1423    "O2r8FJT1x" => "MBR Targeting",
     1424    "XW5k34f8D" => "Meazy",
     1425    "dT7B8jWWx" => "Medallia",
     1426    "ByJLxcEidi-7" => "Media.net Advertising FZ",
     1427    "PrIbCsXKXhIW7M" => "media.ventive GmbH",
     1428    "SJ6xqVidi-X" => "MediaMath",
     1429    "ajpf8UKi" => "Medianest",
     1430    "YpOIHF5QF" => "Mediards",
     1431    "QKvvrc0tp" => "mediarithmics",
     1432    "HJUDeqVouob7" => "Mediasmart Mobile",
     1433    "QNbB6Hh1c" => "Mediaventive - Performance Channel",
     1434    "dtbMASFU35tp0m" => "Meetfox",
     1435    "SJyyb9Ei_i-7" => "Meetrics",
     1436    "cyt4lSUfdIXHXK" => "mein.toubiz #elements",
     1437    "Hm1WEDosEsNT9h" => "Melibo",
     1438    "AySJdLTYA" => "Meltwater",
     1439    "OV7USFA2A" => "MentionMe",
     1440    "Hy8srQ1NX" => "MessengerPeople",
     1441    "J05PmJuvt36qTe" => "Meta Pixel",
     1442    "kzjRvWOMlxuf63" => "Meta Pixel Advanced Matching",
     1443    "tq9_N4UgZ4PbEC" => "Meta social plug-ins",
     1444    "fcI2orHMJ" => "Meteonomiqs",
     1445    "x6_ma5zhCB77Nx" => "Metricool",
     1446    "rkRAg94jdjWm" => "MGID",
     1447    "4kJyPLaV2" => "MicroMovieMedia",
     1448    "BkeKqEjuoZQ" => "Microsoft Advertising",
     1449    "dsS7z9Hv4" => "Microsoft Advertising Remarketing",
     1450    "XB0GBAmWEQ7Spr" => "Microsoft App Center",
     1451    "PrLTkYnq" => "Microsoft Azure",
     1452    "rmmkUdkcF" => "Microsoft Bookings",
     1453    "0XIfeH9qx" => "Microsoft Bot Framework",
     1454    "jzMEq56vW" => "Microsoft Clarity",
     1455    "EOF_F-ezQ" => "Microsoft Conversion Tracking",
     1456    "dUzxiHb6Q" => "Microsoft Conversion Tracking",
     1457    "31OpY_Rd1dJTKf" => "Microsoft Dynamics 365",
     1458    "IlIwO5vXHCMore" => "Microsoft Dynamics 365 Customer Insights",
     1459    "M9Nj9klGy" => "Microsoft Dynamics CRM",
     1460    "J1gBN9Q0PBFEMj" => "Microsoft Enhanced Conversions",
     1461    "s-jP9Kxa1" => "Microsoft Forms",
     1462    "00xb_vkGq" => "Microsoft Omnichannel",
     1463    "2AMblLg3I" => "Microsoft Remarketing",
     1464    "l5j0HxFqd" => "Microsoft Remarketing Conversion",
     1465    "sCZcGGgbJ2HWIe" => "Microsoft SharePoint",
     1466    "j0Avo0TiCxkRW8" => "Microsoft Sway",
     1467    "G9mTwsAcP" => "Microsoft Teams",
     1468    "cPmgADKv" => "Midas-network",
     1469    "_hV5dqnpKeOQNh" => "Mindbody",
     1470    "Ms6JA9Xtr" => "Mindbox",
     1471    "7v_Mn--q_" => "Mindbreeze",
     1472    "rkL9c4i_sW7" => "MindTake",
     1473    "E6AgqirYV" => "Mintegral SDK",
     1474    "MPeKZ-_89" => "Minubo",
     1475    "S1SQxqViOoWX" => "MiQ",
     1476    "aC63kDbno" => "Mirando",
     1477    "rkSKecEi_sW7" => "Mirando & amp",
     1478    "WLykcwG3u" => "MirrAR",
     1479    "ZLmgJFVK7" => "Missena",
     1480    "d-6PZM5hs9NdOo" => "Mistplay",
     1481    "6DErRaKm0m6N66" => "Mitek MiSnap",
     1482    "5FNHm-uj5" => "Mittwald",
     1483    "8Gvo_h2Qd" => "Mittwald CM Service GmbH & Co. KG",
    641484    "4UGBLUJUN" => "Mixcloud",
     1485    "rkUK5EsOsWm" => "Mixpanel",
     1486    "N5uvpK-j" => "Mixpanel",
     1487    "w2ZQ7uy-F" => "Moat",
     1488    "S1qqeq4oOsWQ" => "mobalo",
     1489    "SJ-KqViOj-7" => "Möbel.de",
     1490    "wqtPHyrXz" => "Mobfox",
     1491    "ElDYt1RdN" => "mobilApp Face2Face",
     1492    "oOSi59gyP" => "Mobile Journey",
     1493    "B1Hnlq4ido-X" => "Mobile Professionals",
     1494    "OEXRoXIU5" => "mobile.de Ratingwidget",
     1495    "VPSyZyTbYPSHpF" => "MobileFuse",
     1496    "EHXPzs_EI" => "Mobilewalla, Inc.",
     1497    "eHZ7kxgTA" => "mobsuccess",
     1498    "sf09FFoYV" => "Mobusi Mobile Advertising",
     1499    "GSkFelKJW" => "Moebelix (Möbelix)",
     1500    "Yd407miCX" => "Moemax (mömax)",
     1501    "sQj54uQRhTIydb" => "MoEngage",
     1502    "DTG2HYCG-" => "moin",
     1503    "DXrpyA5c" => "mollie",
     1504    "p0b03PgiffqmVQ" => "Moloco Ad Cloud",
     1505    "MEC7egXDb" => "Monet Engine",
     1506    "5z9PmqMLFGdFpH" => "Monetate",
     1507    "sFO4O-1jS" => "Monotype - Web Font Tracking",
     1508    "g6P2QSiL" => "Moodle",
     1509    "m_hq1fmBw" => "Mopinion",
     1510    "asj2W6ayi" => "MoPub",
     1511    "QxRYWv5Un7Qt9g" => "Morayne",
     1512    "rJgz9Nj_o-m" => "Mouseflow",
     1513    "-aZCjz9q6" => "Movinga Affiliate Programme",
     1514    "ASCgon9qg" => "MovingImage",
     1515    "Nrr2EkxPm1TEEi" => "Mozaik App",
     1516    "r1OI9EjdjWX" => "MP Newmedia",
     1517    "0UlsDKnXZYxJt2" => "mParticle",
     1518    "HkPlxcNjdiWm" => "mPlatform",
     1519    "B1QLcNsujb7" => "MPNew Media",
     1520    "p1R8Y8LKN" => "MSO Digital",
     1521    "qEyFq-wLS" => "MTCaptcha",
     1522    "Tc6Kcc4x" => "Multiconnect",
     1523    "GThDWmHZqyFXWH" => "Munchkin",
     1524    "WszJp1rdV6DcVb" => "Mux",
     1525    "f_zaWX7mB" => "my.com",
     1526    "S1zkWcVi_oWm" => "My6sense",
     1527    "6hrW9SIEz" => "myclimate",
     1528    "TgQQ_7vG" => "MyFonts",
     1529    "aA58s2wH" => "MyFonts Counter",
     1530    "6Kri8R7YN" => "Myhotelshop",
     1531    "UuZ8TZaDEZ0ieL" => "MyNewsDesk",
     1532    "vmiLms-lD" => "Myntelligence",
     1533    "DCPRuvbW9JNl9o" => "Myra Security",
     1534    "ez0g7yzny" => "MySQL",
     1535    "S0i4seKvH" => "myTarget SDK",
     1536    "bxAsF3_QIKPzIV" => "myTracker",
     1537    "46In7qkId" => "MyTraffic",
     1538    "dO_4AQnvq" => "myvisualiq",
     1539    "r1Xgl9NjOiZ7" => "N Technologies",
     1540    "Bytrq4suoWQ" => "namecheap",
     1541    "rkRGx54sOsbm" => "Nano Interactive",
     1542    "Bf10TXRhw" => "Nativo",
     1543    "IKYHCoHcZHbo3z" => "Navattic",
     1544    "XLKA6E3pa" => "Navdmp",
     1545    "auPCN9tDL" => "Navegg",
     1546    "N2vwT-gQn" => "Naver Analytics",
     1547    "r1uh5Es_sZ7" => "Nayoki",
     1548    "DODaHKMSN" => "Near",
     1549    "9Bdi4IkPi" => "Near Pte Ltd",
     1550    "m4c9HetowgSdWb" => "Nearest",
     1551    "twRDa3OIX" => "Neccton",
     1552    "iVpNpvjDe" => "Neodata",
     1553    "Uu7TSzcsV" => "Neodata Group",
     1554    "r1DpCbD4Q" => "NEORY",
     1555    "MNzdVMVOa" => "Netdna-SSL",
     1556    "zp6C6pVg7" => "netID",
     1557    "u6zRdbuSRm68CQ" => "netID Privacy Settings",
     1558    "gxeBVKiMaS1f4I" => "netID Privatsphaere-Einstellungen",
     1559    "rkhNcEiOiWm" => "Netigate",
     1560    "H1mYx54sOjWm" => "Netsprint",
     1561    "S13Wec4oOj-m" => "NetSuccess",
     1562    "cg4DF2Tf3" => "netzeffekt",
     1563    "H1mJlcEoOsWQ" => "NEURAL.ONE",
     1564    "zWcIXL1Vo" => "Neustar",
     1565    "obaJPtBH-" => "Neustar on behalf of The Procter &amp; Gamble Company",
     1566    "rJMsqEj_iZQ" => "New Relic",
    651567    "SJ_6Qo9DJ" => "News Anwaltblatt",
    66     "ctDbl6j2y" => "Onlyfy",
     1568    "1KYWj02vF" => "News IQ",
     1569    "MsFie1C8" => "Newsletter2Go",
     1570    "Kvst06Fp6" => "Nexcess Edge CDN",
     1571    "67jCxq477" => "NEXD",
     1572    "rJvn9Ei_i-m" => "NeXeps",
     1573    "9QzVFkXfuKGQDq" => "NextLevel Defend",
     1574    "rkBaq4j_jZX" => "NextPerformance",
     1575    "kX5CQ9GyhBOw4d" => "NICE inContact",
     1576    "F2ydLVmlw" => "Nielsen Audience Measurement",
     1577    "jNl0iqYyR" => "Nielsen Marketing Cloud",
     1578    "OECc5DF7N" => "Ninja Forms",
     1579    "Rz9YZM2_q" => "NitroPack",
     1580    "YIIh84btf" => "Nobilia",
     1581    "vyO2xoFlk" => "Nosto",
     1582    "_NP347b6x" => "Novomind",
     1583    "cacONmLO0y2Vs2" => "NPAW",
     1584    "HJQo5EjOoW7" => "nr-data.net",
     1585    "WNxVOkJj6Bd8Lf" => "Nudgify",
     1586    "H1zqqVjOjZ7" => "Nugg Ad",
     1587    "I8nSaqdpx" => "Numberly",
     1588    "xJtOMgc-4" => "o9",
     1589    "sq_4H0evI" => "o9 Solutions",
     1590    "rJEIq4suiWQ" => "Oath",
     1591    "UD9IMlWyy" => "Oct8ne",
     1592    "M8wnlqZvUAkxEv" => "odeeo",
     1593    "90nYEa22C" => "Odoo",
     1594    "j-5dzGJY_" => "Odoscope",
     1595    "QO4LqnO8l" => "Ogulo",
     1596    "rJ-vecVo_s-m" => "Ogury",
     1597    "L_bj20Jo1OWggP" => "Okendo",
     1598    "W_5gGyZbH" => "Okta",
     1599    "uM6Xg1b-5" => "Oktopost",
     1600    "q7WZXgONy" => "Olark",
     1601    "LNxiCu4IM" => "Omnicom",
     1602    "CVgj3mZSSWNCJZ" => "Omniconvert",
     1603    "6fvpak_ta" => "Omnisend",
     1604    "GEGzlSe9N" => "Omniture",
     1605    "7O1UQJ3fESc3Ld" => "OMQ",
     1606    "Hy4uqVsuiWX" => "OMS Nativendo",
     1607    "Sy05g5NodsWQ" => "On Device Research",
     1608    "tqc3yijj8rf1JC" => "Onapply",
     1609    "O-K_7XAEd" => "OnAudience",
     1610    "bDNvyjTof" => "Onboard",
     1611    "4YyVB9Jh91uLQ-" => "Onclusive",
     1612    "OiFuV1hpk" => "one.com",
     1613    "ZZSNphdpA" => "Onedash",
     1614    "RVtztac32h7njd" => "OneFootball Player",
     1615    "_SUFlQuxf" => "OneSignal",
     1616    "BkgueqNjuo-m" => "OneTag",
     1617    "pd-3srkxrnEqFL" => "OneTrust",
     1618    "b2hQkv9wp" => "Onlim",
     1619    "PKJPsVvrW" => "Online Solutions Group",
     1620    "ctDbl6j2y" => "onlyfy",
     1621    "-CprOBtOX" => "OnMacOn",
     1622    "HJcteqEiuiWm" => "Onnetwork",
     1623    "saIWttSqY" => "onOffice",
     1624    "gYmzZn2CH" => "Ooyala",
     1625    "PGmWNqGwK" => "Ooyala (formerly Videoplaza)",
     1626    "DaPDMRM49" => "OPAC",
     1627    "xh-l8DkyC" => "Open AdStream",
     1628    "nTiHcYnDd" => "Open as App",
     1629    "W1pThiOU-6QLon" => "Opensignal",
     1630    "j7Igy6o8D" => "OpenStreetMap",
     1631    "IUvZYr7UZ" => "OpenTable",
     1632    "ODw7zueQc" => "OpenWeather",
     1633    "HJIge94oOi-7" => "OpenX Software",
     1634    "tLtDHkQDe" => "Opinary",
     1635    "pNOkVRbV6" => "Opinion Stage",
     1636    "k5B3jAr_w" => "Opt-in Monster",
     1637    "7Y-9fkhVBOnDYf" => "Optibase.io",
     1638    "Pi633RLM" => "Optimise-it",
     1639    "3HtWcG9EbUQIRF" => "Optimise-it (Ströer X)",
     1640    "BJSN54susZX" => "Optimizely",
     1641    "-ZqBkrVsKC2rQp" => "Optimizely Data Platform (ODP)",
     1642    "Y1nveY7Vy" => "Optimonk",
     1643    "WKMwvSKm7jC3cL" => "Optimus – iPinYou",
     1644    "H1giW5JV7" => "Optin",
     1645    "HJI5SmLm7" => "Optin",
     1646    "SJZvUaJVQ" => "Optin",
     1647    "rkVxVS1NQ" => "Optin",
     1648    "MDWF9sj-6" => "optinmonster",
     1649    "PPpL7pXsf" => "OptinMonster",
     1650    "padROq-M" => "Optivo",
     1651    "rJx0x5VjujbQ" => "Optomaton",
     1652    "-TmM76s1U" => "Oracle",
     1653    "QM-Jo32tt" => "Oracle AddThis",
     1654    "HySP1b_1r" => "Oracle Infinity IQ",
     1655    "KRiD3iESUwRVKW" => "Orbitvu -  360° product photography",
     1656    "eAYrlt0w" => "Oribi",
     1657    "H1FnWqHRm" => "Oriel WordPress Plugin",
     1658    "SkNRl9NidjZm" => "Orion Semantics",
     1659    "H10Lx9Nj_sZm" => "ORTEC",
     1660    "H17uVFcVB" => "Otto",
     1661    "z2Q0N4jr-" => "Our World in Data",
     1662    "r1EWc4iuj-X" => "Outbrain",
     1663    "HkrZ5NjusWX" => "Outbrain Amplify",
     1664    "AH6TVUNbT" => "Outbrain Conversion Tracking",
    671665    "15h3IBCa8" => "Outdooractive",
    68     "nTiHcYnDd" => "Open as App",
    69     "j7Igy6o8D" => "Open Street Map",
    70     "pNOkVRbV6" => "Opinion Stage",
    71     "JiFH1ubU" => "Paypal",
     1666    "RZpG2ccmLg16fF" => "Outrank",
     1667    "RCd5jeTnb" => "Overheat",
     1668    "By159NoOjbQ" => "OWA",
     1669    "LAfacyOBx" => "Oxid",
     1670    "Md-L8ZYII" => "OXID eShop",
     1671    "IZ87SC9KA6YPy5" => "Oxomi",
     1672    "BAVEMPsb_" => "Paddle",
     1673    "wXZ9L7_OW" => "Pamyra",
     1674    "HWSNU_Ll1" => "Pangle SDK",
     1675    "4B62fWico" => "Paperform",
     1676    "VIpyP1_39" => "PaperG, Inc. dba Thunder Industries",
     1677    "xDD3hzjiB" => "Paqato",
     1678    "8VrQI_a0FQr9Fa" => "Parcel Perform",
     1679    "HkYd5VjOiZm" => "Pardot",
     1680    "sjAWaw1cW" => "Parse.ly",
     1681    "RL5JLZJfG" => "Parsec Media",
     1682    "FulJqehY" => "Partnerize",
     1683    "L4PbbiR2L" => "Passkit Wallet",
     1684    "hBNf9ZMYz" => "PassKit Wallet - Payments",
     1685    "JbpMzs3b-" => "Passolution",
     1686    "dno4UTZAH" => "PATHADVICE",
     1687    "xkX3CPY1ZRUcmD" => "Pathfactory",
     1688    "kLzLxy6IpXc1M1" => "PathMotion",
     1689    "hg8bm_ryN4QXRh" => "Payback",
     1690    "Gh7rn6Q3" => "Paydirekt",
     1691    "p9dKRzCQG1YDs_" => "Payever",
     1692    "XdHcWCbb6" => "Paylike",
     1693    "dj5raa82hsw1K3" => "Payment Icons by Spark Apps",
     1694    "dmhkr4BE" => "Payone",
     1695    "JiFH1ubU" => "PayPal",
     1696    "Ag4q4HEgK" => "PaySafe",
     1697    "8crQza5v6" => "PaySafe",
     1698    "FwJPIA--rtTBwb" => "Pearl Diver",
     1699    "SyVf9NousW7" => "Peerius",
     1700    "Db6tG4Q7z" => "Pega",
     1701    "E9HH0S6fn49xSa" => "Pendo",
     1702    "SyNFcEi_iZQ" => "Perfect Audience",
     1703    "B17neqNido-Q" => "Perform Media Services",
     1704    "B1hI9VjdjW7" => "Performance Advertising/Performance Profiles",
     1705    "V1ENirOT6" => "Performance Media Deutschland",
     1706    "c5jdEIoF" => "Performance Media UTT",
     1707    "HkII54i_s-7" => "Performance Werk",
     1708    "ryzIqVjdo-Q" => "PerformanceAds (über Neory)",
     1709    "JSp_jw2Dp" => "PerimeterX",
     1710    "-fYEmVEnP" => "Permaleads",
     1711    "r1W6ec4o_jWm" => "Permodo",
     1712    "BJiRlc4sOjZm" => "Permutive",
     1713    "SknCx5Njdi-m" => "Permutive",
     1714    "Vuy5t138I" => "Perseus",
     1715    "dGpMz-t3P" => "Personalics",
     1716    "NgXCCrOoE" => "Personalics| AR",
     1717    "mn077nDsD" => "Personalics| AU",
     1718    "U5oS-R63I" => "Personalics| BR",
     1719    "sbJyvmeqf" => "Personalics| CO",
     1720    "DnbYCtyZA" => "Personalics| NZ",
     1721    "fCQ-RsavU" => "Personalics| RU",
     1722    "QaV_DAWO6" => "Personalics| RU",
     1723    "Bg5a1Cx8N" => "Personalics| TH",
     1724    "c6rmTegQL" => "Personalics| TR",
     1725    "_eKXsIOaU" => "Personalics| ZY",
     1726    "o5siH7r7" => "Personio",
     1727    "PFvmDE69X" => "Personyze",
     1728    "iSYTvvtko95bht" => "Petal Ads",
     1729    "18wNuq2Q9" => "Pexi",
     1730    "IUs3PuZd-" => "PhotoEditor SDK",
     1731    "eZ7ZUhb8RcWBr1" => "PIA Advertising",
     1732    "B7dIEuvmU3N3Z5" => "PIA Media UTT",
     1733    "8pTth9A2B" => "Piano",
     1734    "Emcyk1Oc" => "picalike",
     1735    "o6gOrAuVP" => "Pilotx",
     1736    "E1RcKTp-i" => "pilotx.tv",
     1737    "lEAV2WxHj" => "Pimcore",
     1738    "rynr5EsujZQ" => "Pingdom",
     1739    "SkpB54sdiZQ" => "Pingdom (with Performance Tracking)",
     1740    "ozz3_rzr7" => "Pinpoll",
    721741    "9Q2qrmB3" => "Pinterest",
    73     "ze3Iyetr" => "Piwik Pro - Duda",
     1742    "hFsp0FZO1" => "Pinterest Ads",
     1743    "QIekDhgZRq1nIk" => "Pinterest Enhanced Match",
     1744    "hsyqb7Jk8" => "Pinterest Rich Pins",
     1745    "a_Dw7zFT7" => "Pinterest Tags",
     1746    "ZRIsJO12R" => "Pinterest Widget Builder",
     1747    "rL2ZmR7Wv" => "Pipedrive",
     1748    "ze3Iyetr" => "Piwik Pro",
     1749    "FFD0h7L9VZCA4m" => "Piwik PRO",
     1750    "0xw-O6TDwbm3gh" => "Piwik PRO (without cookies)",
     1751    "Z4KZxdWuV" => "Pixalate",
     1752    "6oW2boAdO" => "Pixfuture",
     1753    "B1kXg9NsOiWQ" => "PIXIMEDIA",
     1754    "TLuhGVXN" => "Pixlee",
     1755    "MczN3PJf0jdy4a" => "Plandisc",
     1756    "H12Se54jdj-X" => "Platform161",
     1757    "D1VA0cn81" => "Plausible Analytics",
     1758    "ZAjjjV-N8HTrPz" => "Playable",
    741759    "cv9bw3QAq" => "Playbuzz",
     1760    "9eJHT4SVg" => "Playground xyz EMEA",
     1761    "oviePVHrThIzCI" => "PLCrashReporter",
     1762    "ByDEc4sOjbm" => "Plista",
     1763    "sZAqOmbXv" => "plyr.io",
     1764    "cQ9G55y1T" => "Podbean",
     1765    "MQdVb1Ths" => "Podcaster",
    751766    "nhLMP6qX" => "Podigee",
     1767    "QrBxtTBc" => "Podlove",
     1768    "B1enx94idi-Q" => "Polar Mobile Group",
     1769    "jn7PuNE7ryR50p" => "Pollfish",
     1770    "_YzvH8nm2" => "Polyfill",
     1771    "qu0LnIaEx" => "Polylang",
     1772    "-At_u-eGh" => "poptin",
     1773    "UIYX_IrT67qCy6" => "Popupsmart",
     1774    "1nLXz6_jQwTVQj" => "PostFinance",
     1775    "V-HDotieTmnIIE" => "Powerfront",
     1776    "SJaix54sOsWm" => "PowerLinks Media",
     1777    "pAFmwQtUE" => "Powerspace",
     1778    "q0KL21Inu" => "POWR",
     1779    "EErS5Csc2gexDK" => "Prebid",
     1780    "MJB4jjb2m" => "Predicio",
     1781    "PRiMfNq9AmjBUL" => "Prenly",
    761782    "Sy1naC5nN" => "Prescreen",
     1783    "yX_RJArXk" => "Prestashop",
     1784    "LTzbMGXbB" => "PREX Programmatic Exchange",
     1785    "sXv0xv6Yg" => "Price Spider",
    771786    "FB_cLNwjQ" => "PriceHubble",
    78     "Hko_qNsui-Q" => "reCAPTCHA v1/v2/v3",
     1787    "cpdk77FuK" => "PriceSpider - Where to buy",
     1788    "ukt9D2w0slYSve" => "PRIMAVERA Affiliate",
     1789    "BJP9l9VsOjW7" => "Primis Tech",
     1790    "TKSllwIah" => "Prisjakt",
     1791    "U7QP-YYXyp5dqT" => "Prismic",
     1792    "6I5EMvvT" => "Privy",
     1793    "ChYBnsIC" => "ProductsUp",
     1794    "S-NGEvTX" => "Profity",
     1795    "oMwRt9S6b" => "Programatica de publicidad S.L.",
     1796    "NVE2j0evx" => "Prospect Herkenning",
     1797    "rk7gq4ous-7" => "Proven Expert",
     1798    "lAupl5pjM" => "Proxi.cloud",
     1799    "LKrQnwfhc" => "Proxistore",
     1800    "Wut37MVpc" => "Prudsys",
     1801    "St3XajXXd" => "Psyma",
     1802    "ROECN-Tyg" => "PUB OCEAN LIMITED",
     1803    "1kHrJq8Xf" => "Pubfinity",
     1804    "Hy2Ul5ViuoWX" => "Publicis Media",
     1805    "uMYoFacdK" => "Publishers Internationale Pty",
     1806    "ux1WtRswgXpWjg" => "Publitas",
     1807    "HEgfggF6K" => "Publizon",
     1808    "Bym-eqViuo-X" => "PubMatic",
     1809    "rA6pW36V6" => "PubNative",
     1810    "8YiTreu69" => "PubNub",
     1811    "SyaxeqEi_oWX" => "PulsePoint",
     1812    "Bk3ke9EoOjbX" => "Purch Group",
     1813    "fVenI8qZaiSDea" => "Purchasely",
     1814    "8tlwKrz7nBRwqd" => "Purchasely (analytics)",
     1815    "8qm4v7INutTL5q" => "Puriphy",
     1816    "BjEeUdoqs" => "PurposeLab",
     1817    "6x7O_cifFWqG8K" => "PushAlert",
     1818    "YGm2DPCil" => "PushEngage",
     1819    "wk2G_sYvM" => "Pusher Channels",
     1820    "4TKnHohTW" => "Pushpanda",
     1821    "Rhtsr8xYL" => "PushPushGo",
     1822    "I1BtuRjhnMkx0T" => "Pushwoosh",
     1823    "mrhx7zrre" => "Q division",
     1824    "l7ugIzopI" => "Qriously",
     1825    "pbFdS9IDl" => "Qualaroo",
     1826    "UWP2ySm2" => "Qualifio",
     1827    "O3yJTmq2cFZi7R" => "Qualimero",
     1828    "UsJU9k1K" => "QualityClick",
     1829    "0QVzRHXZX" => "Qualtrics",
     1830    "nfWrRs_XrJzPPW" => "Quanos",
     1831    "rkd49ViuoWQ" => "Quantcast",
     1832    "By0R9EjOo-7" => "Quantcast International",
     1833    "RHM3MD-dj" => "Quantum Advertising",
     1834    "LgERgxPgV" => "Quantum Metric",
     1835    "bbIs1mTX" => "Quantyoo",
     1836    "1ba4yQk0W" => "Qubit Opentag",
     1837    "onZhj5dcS" => "questFON",
     1838    "BlCRucxYKUN24b" => "Queue-it",
     1839    "ByvlGc5Rm" => "Quibit Opentag",
     1840    "cWXfgtNb78StQ2" => "Quick Polls",
     1841    "vB4wCpDc4WHSI3" => "Quickchat AI",
     1842    "VntU07p5kt4ixN" => "QuinBook",
     1843    "wtNtlXMxU_jv1k" => "Quizell",
     1844    "7AevQBoe" => "Quora pixel",
     1845    "Bymslc4iuib7" => "Qwertize",
     1846    "mM03_dNAW" => "R-Advertising",
     1847    "E1PsKwwrnI7bh2" => "RadimDienst",
     1848    "AydEzuFOw" => "RadioKing",
     1849    "QsbWW7EG" => "Radioplayer",
     1850    "HyqWxcEidoWm" => "Rakuten Marketing",
     1851    "qkz61GF-" => "rapidmail",
     1852    "_gSpdOB_t24AdV" => "Raptive",
     1853    "3YCp1ywWCtQZyp" => "Raptor Services",
     1854    "b2SmwZic" => "RatePay",
     1855    "lZWfdL45y" => "Raute Musik",
     1856    "9bTrLVvcd" => "Ravelin Mobile SDK",
     1857    "SkMETCDgN" => "RawGit",
     1858    "-umDZrwm6" => "RAWR",
     1859    "BAvtRUiRy" => "Raygun",
     1860    "Zwg-7XqvakSTNv" => "Razorpay",
     1861    "bBw1uQaNp" => "RD STATION",
     1862    "ZdLT87Qd" => "re:amaze",
     1863    "veqs-kAz4" => "Reachnet",
     1864    "o1FozBbqhgx3bN" => "React Native Firebase",
     1865    "H1f2xc4odj-X" => "Readpeak",
     1866    "ufhUMr6D2" => "ReadSpeaker",
     1867    "f7LFah18V" => "Realeyes OÜ",
     1868    "V0CshHa57" => "Realytics",
     1869    "dGPun6EbN" => "realzeit",
     1870    "SCRjaw0XPoMdSl" => "Rebuy",
     1871    "Hko_qNsui-Q" => "reCAPTCHA",
     1872    "cfADcn3E3" => "reCaptcha v3",
     1873    "QNqdZMWL0l_zKv" => "Recharge.com",
     1874    "ncJlxV2ywWo2vN" => "RecoBounce",
     1875    "S1Qe-Pn54" => "recognified-microConversion",
     1876    "h3nMfxCs7" => "Recolize",
     1877    "H_j03b6g" => "Reddit",
     1878    "ZglHJrjn" => "Reddit Advertising",
     1879    "5JKj-J9nH" => "Redintelligence",
     1880    "SyIP9Njdib7" => "Refined Ads",
     1881    "_SBGD5koD" => "Refiner",
     1882    "vYsMhlFj5" => "Reguest Messenger",
     1883    "M66CCVZlE" => "ReigNN Platform",
     1884    "ibuf4p3P" => "releva.nz",
     1885    "7PmlLEs2t" => "ReMailMe",
     1886    "rkjDe94oui-X" => "remerge",
     1887    "gTYHewBsK" => "Remintrex",
     1888    "H1j9cEoOi-m" => "remintrex.com",
     1889    "0jco2jXId" => "Reonic",
     1890    "qxQaPHctt" => "Reppublika",
     1891    "PXcN3Ui_H" => "Research and Analysis of Media",
     1892    "vKwiCret2" => "Research International",
     1893    "HkbKeq4o_oZm" => "Research Now Group",
     1894    "zy78g-j8KmE0gf" => "resmio",
     1895    "193T921PXm" => "Resolution Media smartTracking",
     1896    "7cPw4kU75" => "retailAds",
     1897    "yGf7yJQfkQaKS_" => "Retarget Online Ads",
     1898    "_sJYRyHIwToAJM" => "retargeted.ai",
     1899    "6_AoTqxaRDHK-Z" => "ReturnGO",
     1900    "r1sKg9VoOjW7" => "Revcontent",
     1901    "SJp7xc4iOoWm" => "Reveal Mobile",
     1902    "2LQcBGGtLPkeZx" => "RevenueCat",
     1903    "5buNZ_jBP" => "Reviews on my website",
     1904    "UN5TbrOXlDB1wG" => "Reviews.io",
     1905    "Wq0D2klq" => "Revive Adserver",
     1906    "OheZEKjS_" => "RevJet",
     1907    "wbhw2dV3G" => "RevLifter",
     1908    "QtkhD3Pi6i_j-J" => "Revscale AI",
     1909    "_-TUZWgAe" => "RevX",
     1910    "HymNBQk4m" => "Rexx Recruitment",
     1911    "ByoLgqVo_i-m" => "Rezonence",
     1912    "H1oll9Njui-X" => "RhythmOne",
     1913    "H1wzlq4idoWm" => "Rich Audience",
     1914    "pl3anzrRv" => "Riddle",
     1915    "U4ZIzraAi3LxA2" => "RingCentral",
     1916    "eO9JKghU6" => "Riskine Chatbot",
     1917    "J6nsg-J4U" => "Ritzau",
     1918    "t1xCHtccq30hUI" => "Riverty",
     1919    "9NUDWWc6l" => "RMSi Radio Marketing Service interactive",
     1920    "HkLplcNjdiWm" => "Rockabox Media",
     1921    "SkhPxcNouoW7" => "Rockerbox",
     1922    "BJiLqVo_i-m" => "Rocket Fuel",
     1923    "yTeUMhYeyD9YrO" => "Roku",
     1924    "HylJecEoOsbQ" => "Roq.Ad",
     1925    "FUpg_dxj2uaKzo" => "Roxxad",
     1926    "B1Ayg5Es_s-X" => "RTB House",
     1927    "4nDnFKAvHCBrwV" => "RTB House - Enhanced Conversions",
     1928    "H18p9NjOjZQ" => "RTB Markt",
     1929    "HJOdlqVsOjWm" => "RTK",
     1930    "M3Tjth_cjh-29B" => "RudderStack",
     1931    "9wX039_lO" => "RUN",
     1932    "K67zfwHGU" => "S-Public Services",
     1933    "BJV2xq4idsZQ" => "S4M",
     1934    "fjijtSPA" => "Saferpay",
     1935    "uCqSi0hm" => "Sajari",
     1936    "te8pKz1mP6gdIS" => "Salenti",
     1937    "K7AsmUJ265KOlw" => "salenti GmbH",
     1938    "RTLA4o2i1-ia2L" => "Sales Cloud Einstein",
     1939    "d_5HNF7Yc" => "Salesforce",
     1940    "-tsNPQtMM" => "Salesforce Audience Studio",
     1941    "vLUpOAxR" => "Salesforce Audience Studio",
     1942    "VTR8E9ZL5" => "Salesforce Chat",
     1943    "WTYMoieIB" => "Salesforce Commerce Cloud",
     1944    "hku02w1qx9YLjR" => "Salesforce Commerce Cloud Einstein",
     1945    "D2cQY5lPghyteN" => "Salesforce Data Cloud",
     1946    "IQMIegSQF" => "Salesforce Interaction Studio",
     1947    "lgXw0VvDj" => "Salesforce Live Agent",
     1948    "Cf2NHO6q5" => "Salesforce Marketing Cloud",
     1949    "lX960FalA68X38" => "Salesforce Marketing Cloud Account Engagement",
     1950    "wFxuQvYX8MhkWv" => "Salesforce Marketing Cloud Personalisation",
     1951    "5VMTG-ihf" => "Salesforce Marketing Cloud Platform SDK",
     1952    "8Sp6myo2" => "Salesmanago",
     1953    "Gd0bshOBs" => "SalesViewer",
     1954    "1dBEu_-G9" => "Samba TV",
     1955    "ysjzW_WYo" => "Samba TV UK",
     1956    "fz4U3rgPW" => "Samedi",
     1957    "iVSrfIuRjlKTE8" => "Samsung Pay",
     1958    "t0mg4QEts" => "Sanoma",
     1959    "BJUKgqNoOiZm" => "Sanoma Media Finland",
     1960    "JKFeC1o3L" => "SAP Commerce Cloud",
     1961    "zbnIgVJ7L" => "SAP Customer Data Cloud",
     1962    "nhuKp2VDxEIrfq" => "SAP Intelligent Selling Services",
     1963    "FonOilDmI" => "SAP SuccessFactors",
     1964    "wj4bKa72Og-Ao9" => "Sardine.ai Device Intelligence",
     1965    "ixbmcJR2z" => "ScaleMonk",
     1966    "JaB_qsJk0" => "Scanblue",
     1967    "SkhG5EiOjZ7" => "Scarab Personalized Ads",
     1968    "_PDFz0c6-" => "Scarab Research",
     1969    "NsaxqX_hah-qfW" => "Scayle",
     1970    "S11eg9EjdjW7" => "Scene Stealer",
     1971    "Qj4tFgzD1" => "Schedule Demo Form",
     1972    "HSmRlcKuL" => "Schibsted",
     1973    "dDpujlqia" => "Schibsted Product and Tech UK",
     1974    "SyX95Eodi-Q" => "Scorecard Research",
     1975    "l4w2eXcvO" => "ScreenOnDemand",
     1976    "DHS2sEi4b" => "Search Ads 360",
     1977    "--kY7PHHl" => "SearchHub",
     1978    "ByZk-qVj_sZX" => "Seeding Alliance",
     1979    "Hkq7eqEj_ibm" => "Seedtag Advertising",
     1980    "JMsFnFMX2" => "Seenthis",
     1981    "O97xcRJFR" => "Segment",
     1982    "ByKyW9Ni_sZX" => "Segment.io",
     1983    "p6WMXrd8O" => "Segmentify",
     1984    "Brj0m8FfV" => "Selit Produktfinder",
     1985    "0rhoGZi2z" => "Selligent",
     1986    "Syu8e5Nouj-7" => "Sellpoints",
     1987    "rJNLgqEidib7" => "Semasio",
     1988    "ASSQFNQYB" => "semknox",
     1989    "Y7U73xDqH" => "Sendbird",
     1990    "JH-hXkWhk" => "SendGrid",
     1991    "oozO4Himv" => "Sendinblue",
     1992    "6moU2ZMVJ" => "Sendpulse",
     1993    "2lK0qen63VUUjL" => "Sensors Data",
     1994    "rH1vNPCFR" => "Sentry",
     1995    "IBUUElGXQ" => "Service-Chat NRW",
     1996    "rcL95kb3d" => "Seznam",
     1997    "RHq8V_JEP" => "Sezzle",
    791998    "B1639EiOs-7" => "ShareThis",
     1999    "B13glqEsOiZm" => "Sharethrough",
     2000    "alWL-1Ah-" => "Shariff Wrapper",
     2001    "ZO_66uRS7D-wV4" => "Sherpa",
     2002    "1O5D3XaL" => "Shipcloud",
     2003    "BWv175brAL0uSK" => "ShoeAI",
     2004    "jkCDUWD-U55JT3" => "Shop Pay",
     2005    "7biaTe2Aq" => "Shopalyst",
     2006    "QWdMfFJSrw85P7" => "Shopauskunft",
     2007    "BMs9IG0jx" => "Shopgate",
     2008    "r19SxcEs_o-X" => "Shopify",
     2009    "ZQOx-TM97Y3rLe" => "Shopify Analytics",
     2010    "1xNAouVLz" => "Shopify CDN",
     2011    "zixK7I8y1mhf1D" => "Shopify Marketing",
     2012    "T4PQQdTkrEofhd" => "Shopify Preferences",
     2013    "HqbXMnOcUaTVOQ" => "Shopify Product Reviews",
     2014    "_GO5yfszm" => "Shopify Storefront",
     2015    "BNMuzQjTe" => "Shopify Tracking",
     2016    "H1yt9Vsdib7" => "shopping24",
     2017    "oEKsiywjW" => "Shopstyle",
     2018    "9CfO0Zlo" => "ShopSync",
     2019    "JYW8pOMD" => "ShopVote",
     2020    "bt_SD1xU" => "Shopware",
     2021    "xXFRJRUUvCnYD3" => "Shopware Analytics",
    802022    "W0apH00t" => "Shore",
    81     "wkt-Vgmf7" => "Site Analytics - Duda",
    82     "8u-otMeLg" => "Site Personalization - Duda",
     2023    "SyZQgcEiujZ7" => "ShowHeroes",
     2024    "r1k9NOn5N" => "showheroes-microConversion",
     2025    "v5RU0B301" => "Sift",
     2026    "S1_4g54odoWQ" => "Sift Media",
     2027    "ryHRg5NoOibm" => "Signal Digital",
     2028    "Ub2GaUXtOJAkTV" => "SignalFx",
     2029    "m0XTF89HN" => "Signals",
     2030    "hStXBwHBZ" => "Simplecast",
     2031    "B1Zxe5EoOjbm" => "Simplifi Holdings",
     2032    "AnXv7C3G8yFHKP" => "SimplyBook.me",
     2033    "6pgVDH6Gec8UIb" => "Sinch",
     2034    "r928ZrE_0" => "Singlespot",
     2035    "PLYgpdqL7" => "SingleView",
     2036    "OxsYgtMfe7aP8u" => "Singular",
     2037    "uHT_iM2Pw" => "Sipgate",
     2038    "H1BxlqNs_i-7" => "Sirdata",
     2039    "wkt-Vgmf7" => "Site Analytics",
     2040    "8u-otMeLg" => "Site Personalization",
     2041    "WQaLkh_S7vX97i" => "Site Search",
     2042    "jB0PK7c11" => "Site Search 360",
     2043    "ryTAjE_nN" => "Sitecore",
     2044    "xzhTGdLgLBITjQ" => "Sitefinity Insight",
     2045    "HyCsIAwJV" => "Siteimprove",
     2046    "NT4pjQB3M" => "SiteSpect",
     2047    "0BpGJbtEU" => "SITU8ED",
     2048    "hUecQKeCcR8d65" => "Sizekick",
     2049    "SJH25No_oWX" => "Sizmek",
     2050    "hxGpiJBe-" => "SK Media Group",
     2051    "SAKiVpSK7USpIP" => "Skeepers",
     2052    "S1rWg5VsOsWQ" => "Skimbit",
     2053    "AO6etk8c-" => "Skirentalresorts",
     2054    "H1w654suoWX" => "Sklik",
     2055    "S1d6cEiuibQ" => "Sklik Conversion",
     2056    "HkK69Nsuibm" => "Sklik remarketing",
     2057    "4ZVaI4eEq5PV8z" => "Skyflag",
     2058    "xmU9xun5Osd5Lt" => "Skyscanner",
     2059    "goExmiSU_" => "Sleeknote",
    832060    "jhJqRRPUe" => "Slideshare",
    84     "lr0gmwVMY" => "Smart-rechner",
     2061    "pyS8WWsy3" => "Slido",
     2062    "B1Ifgq4odsZQ" => "SlimCut Media",
     2063    "PE9Ed3gets41WV" => "SlimStat Analytics",
     2064    "Byt-l54i_i-Q" => "Smaato",
     2065    "ByScgqVj_iZX" => "Smadex",
     2066    "HJLZqNi_iZQ" => "SMART AdServer",
     2067    "wMMcvc9VH" => "Smart Traffik",
     2068    "lr0gmwVMY" => "smart-rechner",
     2069    "14G4bs7jk" => "Smartclip Hispania SL",
     2070    "S1VvgcVoOs-7" => "Smartclip Holding",
     2071    "r1kS7uh5N" => "smartclip-microConversion",
     2072    "rkFWLTB9E" => "Smartlook",
     2073    "7EtqIjUsfcjX5g" => "Smartnews Ads",
     2074    "r1J_e5Vo_o-7" => "Smartology",
     2075    "HkTU364VQ" => "smartphoto",
     2076    "SJuil9EsdsZQ" => "SMARTSTREAM",
     2077    "Skljd5VoN" => "Smartsupp Chat",
     2078    "wd4FBU7FF" => "SmartTag",
     2079    "36ieROIp0" => "SmartyAds",
     2080    "PN62OUjSL" => "Smash Balloon",
     2081    "9xlKwSEzW5L8cD" => "Smile Points & Rewards",
     2082    "SJ8J-94sdob7" => "Smind",
     2083    "XQxLeJYgJGhitg" => "Smoobu",
     2084    "Aytn62TR" => "Snap Pixel",
     2085    "QcD9GVNXZ" => "Snapchat",
     2086    "s2NmgIZR" => "Snapchat Advertising",
     2087    "QyQDBoUQg" => "Snapchat Advertising|  BR",
     2088    "Vgv6UrFab" => "Snapchat Advertising| AR",
     2089    "-Ue0ZFXop" => "Snapchat Advertising| AU",
     2090    "xWnKQt3oW" => "Snapchat Advertising| CO",
     2091    "jq1wQFwhg" => "Snapchat Advertising| NZ",
     2092    "vOuHc-NPG" => "Snapchat Advertising| RU",
     2093    "xY7o0b9w1" => "Snapchat Advertising| TH",
     2094    "L2RgYWdWK" => "Snapchat Advertising| TR",
     2095    "TtCGGQDIR" => "Snapchat Advertising| TW",
     2096    "oqcTvme_4" => "Snapchat Advertising| ZY",
     2097    "MMH99u1RZD85L6" => "SnapEngage",
     2098    "ryo7lcEoOsW7" => "Snapsort",
    852099    "t-J9SUrOD" => "Snatchbot",
    86     "HyP_q4sdobm" => "SoundCloud",
     2100    "rk9hqEjujWm" => "Snazzy Maps",
     2101    "HJhd5Vodj-m" => "SnowPlow",
     2102    "4RDUc6rQCXeg2G" => "SociableKIT",
     2103    "FFHGOeImK6mYmb" => "Social Intents",
     2104    "7YQmKOWTZC3qFU" => "Social Media Icons by Powr",
     2105    "OuPgkQpTxx3WnQ" => "Social Media Stream",
     2106    "or3Fv0pUyCrNOq" => "Social Stream by Powr",
     2107    "C9j3siwSa" => "Social9",
     2108    "r1KU9EjOs-m" => "Sociomantic",
     2109    "dr7NVhfO" => "Sofortüberweisung",
     2110    "IVJaVuGhO" => "Softgarden",
     2111    "S14iecEjus-m" => "Sojern",
     2112    "qMiAvmQaRvZEvW" => "SolarWinds",
     2113    "nxPvymx_wmYVW9" => "Solute",
     2114    "J9Kke_pd" => "SOMA 2",
     2115    "Gm3wofk4X" => "SoMo Audience",
     2116    "Nqlc4OkV_1wCbn" => "Songkick",
     2117    "Sy6ug5Ei_sWQ" => "Sonobi",
     2118    "HyP_q4sdobm" => "Soundcloud",
     2119    "CkAdOlUti" => "Sourcepoint Technologies",
    872120    "Di_NMaFOX" => "Sovendus",
     2121    "SwfsIIp0w" => "Sovido",
     2122    "r1VJl9Eodj-X" => "Sovrn Holdings",
     2123    "t7HmZssR_" => "Spectrio",
     2124    "jmMFHnB6mrfk-e" => "Speed Kit",
     2125    "Sy7BxqEo_oZQ" => "SpeedCurve",
    882126    "1dU2WuKlq" => "Splicky",
     2127    "BJyte9Eodsb7" => "Spolecznosci",
     2128    "S1UO94s_j-m" => "Spoods",
     2129    "bpghsHfYq" => "Sportradar",
     2130    "6GGTzqxmW" => "sporttotal.tv",
     2131    "Syk9xqEjOjb7" => "Spot",
     2132    "r1Fdg5VidoZm" => "Spotad",
     2133    "rkTwqfqG4" => "Spoteffects",
    892134    "CguMb4Rq" => "Spotify",
     2135    "5UjJeo5b76bLbG" => "Spotify Pixel",
     2136    "ByLolcNs_i-m" => "SpotX",
     2137    "4wrpWvmJG" => "Spreaker",
     2138    "ib1Ev0zRq" => "Sprig",
     2139    "5B-RNJj74" => "Springserve",
     2140    "Hxzjma-sr4cVM2" => "Sprinklr",
     2141    "DKf7fKfS3" => "Squarelovin",
     2142    "D899zyhv" => "Squarespace",
     2143    "HJ5nxcEiOjZm" => "StackAdapt",
     2144    "1YtjwdeNS" => "StackPath LLC",
     2145    "b67YnSAu9CLgAu" => "Stape",
     2146    "ubNMO2xR0" => "Start.io",
     2147    "4_kDVB0G_" => "StartApp",
     2148    "lZ1Yj0x9eu-o4J" => "Stationista",
     2149    "dp5ilPzrh" => "Statscore",
     2150    "MEwyBx0CP" => "Statsperform",
     2151    "MXdXD1aLX" => "Statuspage",
     2152    "Byn9eqVouiW7" => "Steel House",
     2153    "DJKdYm2OT" => "StepStone",
     2154    "qZABWrf6" => "Stetic",
     2155    "t6wsB2fC_2sSOU" => "Störung24",
     2156    "lh6FOG7pr" => "Störungsauskunft",
     2157    "BkW7DxlpN" => "Storyblok",
     2158    "DZgkFbk_nmmNES" => "Storylane",
     2159    "pkhfgyEdb" => "StoryStream",
     2160    "Msopw0_StEf_bD" => "Strandbutler",
     2161    "H1qBqEsuoW7" => "STRATO",
     2162    "Pl56GO5A4GZxRO" => "StreamElements",
     2163    "ry3w9Vo_oZ7" => "Stripe",
     2164    "rkl-G_39E" => "stroeer-microConversion",
     2165    "BylXlqNjOiWX" => "Stroer",
     2166    "ZTcsIow_F" => "Ströer",
     2167    "fRgMuO9BL" => "Ströer Mobile Performance",
     2168    "kso842_9e" => "Styla",
     2169    "By62WruhN" => "Stylight",
     2170    "v09zSZYpp" => "Sub2 Technologies",
     2171    "KxVYGUG4yKjEsH" => "Subi",
     2172    "SkKNl9Vi_iZQ" => "Sublime Skinz",
     2173    "BI4Y-f3Wv" => "SunMedia",
     2174    "4NlDVAKQn" => "Sunnysales",
     2175    "bUoWvj7_8drtjq" => "Supademo",
     2176    "vSIINyq1z" => "Superchat",
     2177    "xLgL2b0bmU-RT_" => "Supersonic",
     2178    "GAM9YGKr" => "SurveyMonkey",
     2179    "8aGfNIzjr" => "Swiftype",
     2180    "Dr1UU3xeZEx72S" => "Swrve",
     2181    "4hxLtM08VF9C2l" => "symplr",
     2182    "XVMS7DXMIqBGYS" => "Syndigo",
     2183    "gWbBsn1RYwH_lx" => "Synerise",
     2184    "lQ5e6dfAz" => "T-Mobile",
     2185    "v9tJSJ08Y" => "Tableau",
     2186    "SkyTg5Ns_i-X" => "TabMo",
    902187    "HkMucNoOjWX" => "Taboola",
     2188    "Sy1zg5Vs_sW7" => "Taboola Europe",
     2189    "FhDiEVqHC" => "TAC Webshop Essenzielle Cookies",
     2190    "hIeVmYL9N" => "TAC Webshop Funktionelle Cookies",
     2191    "5ZrVbTw7b" => "TACTIC Real-Time Marketing",
     2192    "_tshR74x" => "Tagboard",
     2193    "ryi2qNjOsbX" => "TagCommander Reporting",
    912194    "RyDAUe7cq" => "Taggbox",
    92     "T7-yEXGyq" => "Thinglink",
     2195    "kyVR8HsYW" => "Taggstar",
     2196    "qy3H-XjIfbtJWD" => "Talkable",
     2197    "6Xqz7ZnXC" => "tanke-günstig",
     2198    "S1N-x54o_oW7" => "Tapad",
     2199    "C_KUwwiYRfbe-i" => "Tapfiliate",
     2200    "B1DLe54jui-X" => "Tapjoy",
     2201    "z4TbaRIIC0brTu" => "Tapjoy offerwall",
     2202    "RJCAlbdBc" => "Tappx",
     2203    "MCIll-bt4PqHy6" => "TapResearch",
     2204    "Xr7yRmfanhOWQE" => "Tapstream",
     2205    "V4chy2PIoJJZjy" => "TapTap Developer Services",
     2206    "rCxd-Bnaa" => "TapTap Networks",
     2207    "EJYIUb6BF" => "Target 2 Sell",
     2208    "v6tSxbOVH" => "Target Circle",
     2209    "HkPv9Es_jbQ" => "targeting360",
     2210    "B1tP9Nodo-m" => "TargetPerformance",
     2211    "1UQKjRoGT" => "Targetspot",
     2212    "6Dv6h2w5n" => "Targetspot Belgium",
     2213    "BJJ854o_j-Q" => "tawk.to",
     2214    "HkVMl54s_o-Q" => "Teads",
     2215    "Wl1S8uKS-" => "Teads (Advertiser)",
     2216    "B1Pb9NoOiZQ" => "Tealium AudienceStream",
     2217    "s8nQgU9A5" => "Tealium Inc",
     2218    "p4WgtHjOT" => "Tealium iQ Tag Management",
     2219    "QqzXCO9VP" => "Tealium| AR",
     2220    "BfqgBI84c" => "Tealium| AU",
     2221    "j1SGOMDqk" => "Tealium| BR",
     2222    "2IQwco7dT" => "Tealium| NZ",
     2223    "cm5VE-yQ0" => "Tealium| RU",
     2224    "X6JJe1FkL" => "Tealium| TR",
     2225    "rcYm1yzZK" => "Tealium| ZY",
     2226    "4-jVGw3EB" => "Teamleader",
     2227    "B8yveZ4au" => "Teburio",
     2228    "P3VIjrbk4" => "techstage",
     2229    "aMyJcSkV4" => "tectumedia",
     2230    "3q2DGFRrLVqdep" => "TeeGschwendner Digital Assistant",
     2231    "rJX7gcNouibQ" => "Teemo",
     2232    "SJF6l9NjuibQ" => "Telaria",
     2233    "ea-xVf3MC" => "Telecash IPG",
     2234    "6GtvRE0ff" => "Telecoming",
     2235    "2wlDEfon" => "Tellja",
     2236    "r1q8cEiOjZQ" => "Teltarif",
     2237    "tMLzMavbHZoxW0" => "Tencent",
     2238    "koA9N7uWiA_hub" => "Tencent Cloud",
     2239    "XIQgHfhvd" => "Tenjin SDK",
     2240    "BJ6Sx5Ej_sbQ" => "Teroa",
     2241    "tdEZhT6cG" => "test",
     2242    "0c3vKE023" => "Test Inc.",
     2243    "2n8RK-smZ" => "Test Lang",
     2244    "sL4-Ck-Sx" => "test Vinzent",
     2245    "SJJZ5Eo_sWm" => "The Adex",
     2246    "_9it-YkNL" => "The Fork",
     2247    "f4a6F1Hm" => "The Hotels Network",
     2248    "r1BTxcEiuibQ" => "The Kantar Group",
     2249    "8FyAz-7bl" => "The MediaGrid",
     2250    "Ewa5m2ssH" => "The Ozone Project",
     2251    "C2Evy60pW" => "The Ozone Project Limited",
     2252    "rBPQDekS" => "The Performance Network Group",
     2253    "H1oylqNodiWm" => "The Rubicon Project",
     2254    "OzDyoQHcv7fkNe" => "The UK Trade Desk",
     2255    "B1SI9Nsus-Q" => "TheReachGroup",
     2256    "YwzRJ2YSSul9Pu" => "THG-Quote",
     2257    "T7-yEXGyq" => "ThingLink",
     2258    "4r6R0KGQr" => "Thinkific",
     2259    "Byp4x94jdj-7" => "Thirdpresence",
     2260    "0heqn2Evr" => "Tickaroo",
     2261    "oLePnlfdKezncd" => "TicketPilot App",
     2262    "37aIQwT9" => "Tidio",
    932263    "Z0TcXjY0P" => "TikTok",
    94     "1rXAPWvo" => "TwentyThree",
     2264    "lIWYtXOZYJmqeh" => "TikTok Advanced Matching",
     2265    "6-qobRfu" => "TikTok Advertising",
     2266    "UUHnYR2KjbsJxD" => "TikTok Customer Files Audiences",
     2267    "S1-9eq4s_i-X" => "TimeOne",
     2268    "eK1KmD4tp-3_ql" => "TimeOne Cashback",
     2269    "cqQ73nkHZ" => "Timify",
     2270    "r1FBgcNsOjbX" => "tisoomi",
     2271    "KAkHLuaii" => "tisoomi",
     2272    "eONR_nohcxjqOm" => "TiXel: TikTok Pixel Installer",
     2273    "VmTZ3pQFm" => "TNS",
     2274    "goefqkpwt-EBoc" => "Tockify",
     2275    "ZRwzjOHVTeOdzL" => "Toornament",
     2276    "4RtuUue1OFVsLb" => "TopOn Mediation",
     2277    "w2Oa_gut0" => "Totaljobs Group",
     2278    "HJsTqEjdi-m" => "Tracdelight",
     2279    "UvrL7X7P" => "Tracdelight",
     2280    "2LMFkTl43ochrm" => "TraceParts",
     2281    "LE7HJ4PSr5f_xP" => "Tracify",
     2282    "qmRBk_tGyVYkSw" => "Trackingplan",
     2283    "1jX4G1uhc" => "TrackJS",
     2284    "xIWtwj3zQ" => "Trade Tracker",
     2285    "H1QMcEsusbm" => "TradeDesk",
     2286    "5LFVxHGKz" => "TradeDoubler",
     2287    "K89uca-E" => "TraDeers",
     2288    "S1tJeq4idibQ" => "Tradelab",
     2289    "3V4pWi5-v9IUlA" => "TradingView",
     2290    "Zg-G0ubDKrhaGl" => "TrafficGuard",
     2291    "M86L0YB5Y" => "Transparent Ad Marketplace",
     2292    "X97yqPV4_" => "TransUnion Pixel",
     2293    "45yNDW9XQ" => "travel audience",
     2294    "xO_ngqGtE" => "Travel Data Collective",
     2295    "ryxCCtrEX" => "trbo",
     2296    "SJMM5Niuibm" => "trbo (only Banner)",
     2297    "ByWM9EidoW7" => "trbo (with Profiling)",
     2298    "BJLVe9Vs_o-7" => "TreSensa",
     2299    "2CGv-fVCb" => "Triapodi",
     2300    "GZ2ECdXMt" => "Triboo Data Analytics",
     2301    "5oVj_u8vk" => "Trifelsland",
     2302    "fo8JRhlLx" => "Tripadvisor",
     2303    "rJB0qNiuiWX" => "TripleLift",
     2304    "f2Xhlu1kwL6wud" => "Triptease Meta",
     2305    "SJe9ecEjOoZm" => "Triton Digital Canada",
     2306    "VCNvYtxn" => "Trivago",
     2307    "LXEK37SBs11A6L" => "TruConversion",
     2308    "BDi0AjrMZ" => "TrueData",
     2309    "jxwVTpxsC" => "Trustami",
     2310    "HJrGqEs_i-Q" => "Trusted Shops",
     2311    "euTxF4hQ" => "Trusted Shops Trustbadge",
     2312    "ukD8BZWBj3LFOY" => "Trustindex",
     2313    "qEs4t49Rg" => "Trustpilot",
     2314    "6jYKEgwhU" => "TrustYou",
     2315    "I9i1N9PI" => "Tumblr",
     2316    "JJeggfnFB" => "Tunnl",
     2317    "ckK7ZKfRComWrB" => "TV Scientific",
     2318    "1G1_Btll" => "TVSquared",
     2319    "ckfz7Oq4V" => "TVTY",
     2320    "1rXAPWvo" => "Twentythree",
     2321    "lXv9W6DaC" => "twiago",
     2322    "Iq25S_pX--J_hW" => "Twik Analytics",
     2323    "hEGw72h9Kfd6Id" => "TWIPLA",
    952324    "FPZz1xJI" => "Twitch",
     2325    "Skj79NodobQ" => "Twitter Advertising",
     2326    "S1hmcVouiZm" => "Twitter Analytics",
     2327    "S1tqOzjaX" => "Twitter Button",
     2328    "W-HOHMTVq" => "Twitter Conversion Tracking",
     2329    "2PLSJfB9b" => "Twitter Embed",
     2330    "l6zPfvPkjsPnAz" => "Twitter Feed by Powr",
    962331    "BJTzqNi_i-m" => "Twitter Plugin",
     2332    "HLap0udLC" => "Twitter Syndication",
     2333    "tFz4Cw7VT" => "Type Network",
    972334    "r1PkZcEs_iWQ" => "Typeform",
     2335    "RjoygBzf" => "TYPO3",
     2336    "1ZHq-qRzK" => "Typotheque",
     2337    "aorF_ElSL" => "uberall",
     2338    "nA2KQ61iE" => "UberMedia",
     2339    "aKntdawA_" => "UberMedia, Inc.",
     2340    "nTcBEybQf" => "Ucfunnel",
     2341    "Qs12mrYFcBzmvb" => "Umami",
     2342    "gT1Q1VFEmY8Et7" => "Umlaut",
     2343    "G47k4Ne9E" => "Unbounce",
     2344    "BkFXx5Vj_jWX" => "Underdog Media",
     2345    "iW3MGmyfUxZ7HF" => "Unibuddy",
     2346    "mHoPzPj5" => "UNiDAYS",
     2347    "MlmXX71g2" => "United Internet Media",
     2348    "hpb62D82I" => "Unity Ads",
     2349    "RXkipVe3xznWMq" => "Unity Analytics",
     2350    "u5OQ-l0wp" => "Unity Engine",
     2351    "tQGcwFWxSytrne" => "Unleash",
     2352    "K6r10fdN3" => "unpkg",
     2353    "tVPe8YXLM" => "Unruly",
     2354    "B1Cul54oOsWQ" => "Unruly Group",
     2355    "ZEWPQ-W1toVviz" => "Unsplash",
     2356    "Ql2nuxpSW" => "unzer",
     2357    "53V4PdUMx" => "uppr",
     2358    "R7khlI4W_" => "UpPromote",
     2359    "8rY_il3xD" => "Uprival",
     2360    "1YFXOzPGu" => "Upscope",
     2361    "4JA3zqWR" => "UpScore",
     2362    "3YMnUfi7b" => "Uptain",
     2363    "33R-IpmHz" => "Uptain",
     2364    "tLc9QWcWb" => "uptain",
     2365    "Kg8CQlqnM" => "Uptain",
     2366    "ATdSW9eQ" => "Uptime.com",
     2367    "ZnwVCTXb7" => "Urban Media",
     2368    "ByvxcNj_jWm" => "Usabilla",
     2369    "bysopElpKKOau0" => "Useberry",
     2370    "SkL3gqEiujbX" => "usemax advertisement",
     2371    "Hk8e94jOjWX" => "Usercentrics",
     2372    "Hk9SicTN7" => "Usercentrics Consent Management Platform",
     2373    "SkfHqqa4Q" => "Usercentrics Consent Management Platform",
     2374    "H1Vl5NidjWX" => "Usercentrics Consent Management Platform",
     2375    "oblP60NVHBW" => "Usercentrics Consent Management Platform + Bridge",
     2376    "BlGhk0Zr76YlS3" => "Usercentrics for Wix",
     2377    "_of52Ktc_4R8-e" => "Usercentrics Preference Manager",
     2378    "IYwkrVwaVHh-we" => "Usercentrics Server-Side Tracking",
     2379    "5wohJ1Vz9" => "Userlane",
     2380    "So-uj5T0g" => "UserLeap",
     2381    "xyKq_EfQf" => "Userlike",
     2382    "GlnJWNMwY" => "Userpilot",
     2383    "q6v0dSqJn" => "UserReport",
     2384    "VNCe4TzBR" => "Usersnap",
     2385    "p23Qzm_ifVHR0s" => "Userway",
     2386    "deFBzsgiE" => "Userzoom",
     2387    "1YUf8deyM" => "Userzoom| AU",
     2388    "j6hcnPivn" => "Userzoom| BR",
     2389    "pGck39PMA" => "Userzoom| CO",
     2390    "pIGg_nv5V" => "Userzoom| NZ",
     2391    "bthHXueSG" => "Userzoom| RU",
     2392    "dHpqcqCrK" => "Userzoom| TH",
     2393    "Sri8kf_aM" => "Userzoom| TR",
     2394    "bZlvKs_IMR" => "Userzoom| ZY",
     2395    "ZFZZSibrq9O4Tp" => "Utiq",
     2396    "xCpJ_gp0s" => "Uxcam",
     2397    "orppvjxZm" => "V LLC \"V Kontakte\"Kontakte",
     2398    "DgK0ku83emM6Qz" => "Varify.io",
     2399    "IVj4RQ5FGnW6rW" => "vchfy",
     2400    "HLoyNqJcN" => "vcita",
     2401    "B1UG5NoOoZQ" => "Ve interactive",
     2402    "Qi8jadltE" => "Vectaury",
     2403    "HyZ59NjOoZm" => "Veeseo",
     2404    "mD3tyKxok" => "VELUX Dachfenster-Konfigurator",
     2405    "B1_CqNoOoZ7" => "Venatus Media",
     2406    "I1OcL3FNP" => "Vercel",
     2407    "ryipsERQm" => "Verivox",
     2408    "_B2wa6TgU" => "verizon media",
     2409    "5bv4OvSwoXKh-G" => "Verve HyBid (PubNative)",
     2410    "II_bo7LXx" => "VG Wort",
     2411    "aLHtZ1nd2" => "Viafree",
     2412    "NqJSRFYHn" => "Vibrant",
     2413    "BybJx5Ej_sbQ" => "Vibrant Media",
     2414    "-vsBRkUb-" => "Vidazoo",
     2415    "H1XLx5NidjZX" => "Video intelligence",
     2416    "MFWPBPuDV" => "Video Reach",
     2417    "an461XYFW" => "Video-Stream-Hosting",
    982418    "VtnVCeUzx" => "Videoask",
     2419    "o3IOVN-EL" => "VideoForce",
     2420    "rJOne94sOsZQ" => "Videology",
     2421    "OKc8nSquCFOa9g" => "Videoly",
    992422    "SDFUIfvK_" => "Videolyser",
     2423    "1bOkjhWvT" => "Vidoomy",
    1002424    "KRDJ6FLgY" => "Vidyard",
     2425    "4BYAmnO9m" => "ViewPay",
    1012426    "HyEX5Nidi-m" => "Vimeo",
    102     "FtE1AC6zU" => "Walls.io",
    103     "Ouzxu26Rv" => "Mapp Intelligence Full Feature Tracking",
    104     "rerXlW9h2" => "Wetter",
     2427    "H1DFlcEsdibQ" => "Viralize",
     2428    "sdZuVwP32" => "Virtuelles Kraftwerk",
     2429    "QYHT8hHQChD1q-" => "VIS.X",
     2430    "rrRNlc3vT" => "Visable",
     2431    "HyU0ecEoui-m" => "Visarity Technologies",
     2432    "TYeEKVs18" => "Visiolink",
     2433    "mv69J5pRC" => "Visitlead",
     2434    "q0TXDmYmHH_JJg" => "Visitor Analytics",
     2435    "zD9kWrMoLrklZS" => "Visual Studio App Center",
     2436    "SJDM9Niuo-X" => "Visual Website Optimizer (VWO)",
     2437    "Jn9c7Tfq0" => "Vivalu",
     2438    "8smf-hSjP" => "Vivocha",
     2439    "HyLs5Eo_o-X" => "Vivocha.com",
     2440    "XLgahyVP4" => "VK",
     2441    "kkM0HzB51" => "VKontakte",
     2442    "SyzGit9AQ" => "Vlyby",
     2443    "VhrUzGOecZCpsG" => "Vonage",
     2444    "Og6R2HVi_" => "Vorabs",
     2445    "LHXgL1cqAdwFmY" => "Voyado",
     2446    "Y73tAnhSEmf5qf" => "VRS-Fahrplanauskunft",
     2447    "smfJjwmyhQUnOG" => "VRS-Services",
     2448    "ryXAe5Vidi-m" => "Vuble",
     2449    "lLUj_XgKu" => "Vue Storefront",
     2450    "jk3jF2tpw" => "Vungle",
     2451    "rJWa8AwkN" => "Vuture",
     2452    "tjhfqDKU7WDHGY" => "Vviinn",
     2453    "JelIv_yAko16fL" => "Wallee",
     2454    "FtE1AC6zU" => "walls.io",
     2455    "iXbVZ7fa6r8maG" => "Wappier",
     2456    "e29f8Vdyp4W57i" => "Warmly",
     2457    "L8d0nv7aV0fQxV" => "WEB-STAT",
     2458    "HLIDnkMQM" => "WebAds",
     2459    "zPNaggrXq" => "WebClient Deskline",
     2460    "E4wl_G9bA" => "Webedia",
     2461    "BJ0H5NjOjWX" => "webflow",
     2462    "-kU4dND5" => "Webgains",
     2463    "AEyJyq5ye" => "Webinaris",
     2464    "W3K_bLFj8" => "WebinarJam",
     2465    "0k0AUcHfb" => "Webinterpret",
     2466    "PLTUN6yyF" => "Weblication CMS",
     2467    "W23lERozKtYsY3" => "Webmetic",
     2468    "r1onecNi_o-m" => "WEBORAMA",
     2469    "HkOM1990X" => "Webpack",
     2470    "yzKKqTsr_" => "Website Analytics",
     2471    "RnMemAEwY" => "Website Personalization",
     2472    "OeCcKwIQw" => "Website-Check.de",
     2473    "rJOZc4jOiWQ" => "Webtrekk",
     2474    "rktWq4jdiZ7" => "Webtrekk Control Cookie",
     2475    "Arsb_Ah3_" => "Webtrends",
     2476    "6SMuld8jm" => "Webtype",
     2477    "Eqhn6waf4" => "Webtype LLC",
     2478    "jHX52v1GWN-mv1" => "WeChat",
     2479    "73581zoQJ" => "Weglot",
     2480    "Ni9WZOaz-" => "wein.cc Tracking Services",
     2481    "15c60FWkdsHa_a" => "Welcome Bar by Hero Apps",
     2482    "B1FhxcNs_jZX" => "Welect",
     2483    "fxHSiaLhw" => "Wellness-Heaven",
     2484    "UnsLGXKCAkzLRk" => "WellnessLiving",
     2485    "2Oy_TIoZw6KE7B" => "Wer Kennt Den Besten",
     2486    "hT9JFtMVtpwyoB" => "Wertgarantie",
     2487    "2vCMNRtu_" => "Wesko Decor",
     2488    "rerXlW9h2" => "wetter.com",
     2489    "0Btb-gow1" => "Whatchado",
     2490    "UqEPxPN80fKztp" => "WhatConverts",
     2491    "8WG3bXn65" => "WhatRocks",
     2492    "BJ1Q5NoOj-7" => "WhatsApp Share",
     2493    "JznZhvhYd" => "Whenever Media",
     2494    "pv0mpMZ1a" => "White Ops",
     2495    "N3-I--tsKeuX8a" => "WhosOn",
     2496    "Sydfec4suo-m" => "Widespace",
    1052497    "uJRRy9uiQ" => "Wigeogis",
     2498    "3tUk2XsJ" => "WIHP",
     2499    "NcaPcM6wxi6yty" => "Wildjar",
     2500    "BJca3KUJE" => "Wipe",
     2501    "1e020ptamFlYNx" => "Wirtualna Polska",
     2502    "BysTm2K2V" => "WisePops",
    1062503    "SJ1aqNjOs-m" => "Wistia",
     2504    "hJD19HAQd" => "WIX",
     2505    "jJ7xSGep4HrYql" => "Wix Hotels",
     2506    "GhhPJ0pkKqijxb" => "Wix Music",
     2507    "H1jae94jOoZ7" => "Wizaly",
     2508    "SbGWQWAkC" => "WooCommerce",
     2509    "WiN426fmGX3NxG" => "Woopra",
     2510    "SkaV9Eidjbm" => "Wordfence (WordPress Plugin)",
     2511    "SygB9VsdobX" => "Wordpress Emoji",
     2512    "y0Ayg3nf" => "WordPress Stats",
     2513    "HytX5Voui-7" => "WordPress.com Stats",
     2514    "ByjH5VouiZ7" => "WordPress.org",
     2515    "GTUjO35prc0xaj" => "wowing",
     2516    "nVm_-J1dTCWj_9" => "WP Rocket",
     2517    "QXfH7DP2W" => "WP YouTube Lyte",
     2518    "3KcwTMyqr" => "WP-Immomakler",
     2519    "wV2laX_4P" => "WPML",
     2520    "8RizN1mnI" => "Wufoo",
     2521    "nkoosEfzR" => "wurfl.io",
     2522    "W15mfImvRq7bmp" => "X advertising",
     2523    "mf1x-DJT0A_XJE" => "X Plugin",
     2524    "JXYrspYMA" => "X-mode Social",
     2525    "78MDtp5w7phvUv" => "X2M",
     2526    "CLUJ3MUWcXBYDk" => "X3M",
     2527    "S0P0EnP81RqAX2" => "XAD spoteffects",
     2528    "mNyhYVmpE" => "Xandr",
     2529    "rkqVqNoOib7" => "Xaxis",
     2530    "eR2DWcpGpkzmCc" => "Xing Ads",
     2531    "dcAIXV5pe" => "Xing Events",
    1072532    "BJREqEiOiZQ" => "Xing Plugin",
     2533    "r3RuKbcl_" => "XiTi",
     2534    "S1g2cNjdi-m" => "xiti.com",
     2535    "HJNhqEidiW7" => "XPlosion",
     2536    "oghGv-_Yn" => "Xpose360",
     2537    "HyLh5EsdiZQ" => "XQueue",
     2538    "M6-1NWY_b" => "XTCsid",
     2539    "xtJckP3kEUqMx_" => "Xtremepush",
     2540    "HDgHqlS_c" => "Yahoo",
     2541    "vVG5mOxie" => "Yahoo Ad Manager Plus",
     2542    "MG6mo4hTJ" => "Yahoo Analytics",
     2543    "HJSPc4ids-Q" => "Yahoo Gemini",
     2544    "gUbemZYaQwqxss" => "Yahoo Japan Ads Search Ads",
     2545    "7pEXodGkwM6LwJ" => "Yahoo Mobile Ads",
     2546    "gHY2exdu" => "Yandex",
     2547    "N3DoyeVrpJk9X3" => "Yandex Mobile Ads",
     2548    "Fglp04Xrc" => "Yandex| AU",
     2549    "a3-2F7fCP" => "Yandex| BR",
     2550    "1RZFuLF8w" => "Yandex| CO",
     2551    "z71b76KUP" => "Yandex| NZ",
     2552    "Yph6TvdYO" => "Yandex| RU",
     2553    "cnYnIVV75" => "Yandex| RU",
     2554    "5BEOUpIJ1" => "Yandex| TR",
     2555    "537m4QAx3" => "Yandex| ZY",
     2556    "vAk2cSOol" => "YellowHammer Media Group",
     2557    "DWFwsBMnR4XG-u" => "YellowMap",
    1082558    "5qKtc_BS" => "Yelp",
     2559    "_dq05UfFA" => "Yext Analytics",
     2560    "BCQ3njl_S" => "Yext Listings & Pages",
     2561    "mIq9zoltz" => "YieldKit",
     2562    "Hk5F5VsdoZ7" => "Yieldlab",
     2563    "H1lyZq4s_i-Q" => "Yieldlove",
     2564    "ryHNeqEsdjWX" => "Yieldmo",
     2565    "426xkJRu_" => "Yieldr",
     2566    "k5N5bLgoY" => "yntro",
     2567    "cFuPZkrqz" => "YOC",
     2568    "ZaV13iE2OA5yor" => "Yodo1",
     2569    "dYr0Ee0Fs" => "Yormedia Solutions",
     2570    "VmzO5ZUJA" => "Yotpo",
     2571    "O3JScppCm" => "YouGov",
     2572    "2uI5Zl7Qn" => "Youku",
     2573    "EROmFc3DZXzv2k" => "Yousty",
     2574    "pJiqJb5S" => "YOUTH ID",
     2575    "r1ejcEi_jZ7" => "Youtube Cookies (ytimg)",
     2576    "rPnCiKpia" => "YouTube Subscribe Button",
     2577    "iVTAGV51C" => "YouTube Video",
    1092578    "BJz7qNsdj-7" => "YouTube Video",
    110     "6LdBYXdAl" => "Yumpu",
     2579    "6LdBYXdAl" => "yumpu",
     2580    "9BBsmV62" => "yumpu.com",
     2581    "HrufLEgkd" => "Zanox",
     2582    "BJhj94o_iZ7" => "zanox.com",
     2583    "ln6ss5Vvy" => "Zapier",
     2584    "jGIQ1S51deZrW4" => "Zapnito",
     2585    "invbogd4InL28O" => "ZBO Media",
     2586    "H1Rwgc4juiZX" => "Zebestof",
     2587    "rkL8e5No_iZX" => "Zemanta",
     2588    "ryxNqNjOiW7" => "Zendesk",
     2589    "54s8nFgf" => "Zendesk",
     2590    "ZvGdwtkk1x3HFI" => "Zendesk Widget",
     2591    "GhNn13gjt" => "Zenfulfillment",
     2592    "kl7s_U3CC" => "zenloop",
     2593    "ryA3xc4jOoWQ" => "zeotap",
     2594    "9ok9Ki3RomUf6w" => "Zeppelin Source",
     2595    "HklR5Ei_jbX" => "Zepto",
     2596    "a2XkayMLT" => "Zeta Global",
     2597    "2R7ed_s3_" => "Ziff Davis",
     2598    "TgVifUWF" => "zoho",
     2599    "pRCG-Aryd" => "Zoho Forms",
     2600    "WHwIYgGJH" => "Zoho PageSense",
    1112601    "sKBym34ck" => "Zoho SalesIQ",
    112     "qxiCD5aN_" => "3Q Video",
     2602    "6gPvpOSkp" => "Zoom",
     2603    "XL7559yNs" => "ZoomInfo",
     2604    "J4VjROu2H" => "Zoovu",
     2605    "r1haqNidjbm" => "Zoovu (formerly SmartAssistant)",
     2606    "S1lrx54sdj-m" => "Zopim",
     2607    "ArOvK3Q2" => "Zotabox",
     2608    "-N_eXmLYAuwOe4" => "Zucks",
    1132609];
  • termageddon-usercentrics/trunk/includes/class-termageddon-usercentrics.php

    r3366825 r3439658  
    146146                'popular' => false,
    147147            ),
     148            'delaware'    => array(
     149                'title'   => __( 'Delaware (DPDPA)', 'termageddon-usercentrics' ),
     150                'popular' => false,
     151            ),
     152            'indiana'     => array(
     153                'title'   => __( 'Indiana (ICDPA)', 'termageddon-usercentrics' ),
     154                'popular' => false,
     155            ),
    148156            'oregon'      => array(
    149157                'title'   => __( 'Oregon (OCPA)', 'termageddon-usercentrics' ),
     
    189197        'utah'        => 'Utah',
    190198        'virginia'    => 'Virginia',
     199        'delaware'    => 'Delaware',
     200        'indiana'     => 'Indiana',
    191201    );
    192202
     
    633643        }
    634644
    635         $embed_version   = self::get_embed_script_version();
    636         $loader_url      = ( 'v2' === $embed_version ) ? '//app.usercentrics.eu/browser-ui/latest/loader.js' : '//web.cmp.usercentrics.eu/ui/loader.js';
    637         $translations_url = self::get_translations_url();
     645        $embed_version        = self::get_embed_script_version();
     646        $loader_url           = ( 'v2' === $embed_version ) ? '//app.usercentrics.eu/browser-ui/latest/loader.js' : '//web.cmp.usercentrics.eu/ui/loader.js';
     647        $translations_url     = self::get_translations_url();
     648        $use_manual_control   = self::is_manual_script_control_enabled();
    638649
    639650        $new_embed_code  = '<link rel="preconnect" href="https://plugins.trac.wordpress.org//privacy-proxy.usercentrics.eu">' . PHP_EOL;
    640         $new_embed_code .= '<link rel="preload" href="https://plugins.trac.wordpress.org//privacy-proxy.usercentrics.eu/latest/uc-block.bundle.js" as="script">' . PHP_EOL;
    641         $new_embed_code .= '<script type="application/javascript" src="https://plugins.trac.wordpress.org//privacy-proxy.usercentrics.eu/latest/uc-block.bundle.js" data-no-optimize="1" data-no-defer="1"></script>' . PHP_EOL;
     651       
     652        // Only include the auto-blocking script if manual control is disabled
     653        if ( ! $use_manual_control ) {
     654            $new_embed_code .= '<link rel="preload" href="https://plugins.trac.wordpress.org//privacy-proxy.usercentrics.eu/latest/uc-block.bundle.js" as="script">' . PHP_EOL;
     655            $new_embed_code .= '<script type="application/javascript" src="https://plugins.trac.wordpress.org//privacy-proxy.usercentrics.eu/latest/uc-block.bundle.js" data-no-optimize="1" data-no-defer="1"></script>' . PHP_EOL;
     656        }
     657       
    642658        $new_embed_code .= '<script id="usercentrics-cmp" data-cmp-version="' . esc_attr( self::get_embed_script_version() ) . '" src="' . esc_url( $loader_url ) . '" data-settings-id="' . self::get_settings_id() . '" data-no-optimize="1" data-no-defer="1" async></script>' . PHP_EOL;
    643659        $new_embed_code .= '<script data-no-optimize="1" data-no-defer="1">uc.setCustomTranslations(\'' . $translations_url . '\');</script>' . PHP_EOL;
     
    15771593    }
    15781594
     1595    /**
     1596     * Check if manual script control is enabled (disables auto-blocking)
     1597     *
     1598     * @return bool True if manual script control should be used, false otherwise
     1599     */
     1600    public static function is_manual_script_control_enabled(): bool {
     1601        return get_option( 'termageddon_usercentrics_manual_script_control', false ) ? true : false;
     1602    }
     1603
     1604    /**
     1605     * Get the script snippets from the database
     1606     *
     1607     * @return array Array of snippet objects, each containing 'script' and 'service_id'
     1608     */
     1609    public static function get_script_snippets(): array {
     1610        return get_option( 'termageddon_usercentrics_script_snippets', array() );
     1611    }
     1612
     1613    /**
     1614     * Get the provider name by ID from the providers list
     1615     *
     1616     * @param string $service_id The provider ID to look up.
     1617     * @return string The provider name, or empty string if not found.
     1618     */
     1619    public static function get_provider_name_by_id( string $service_id ): string {
     1620        // Use cached providers from admin class to avoid duplicate loading
     1621        if ( ! class_exists( 'Termageddon_Usercentrics_Admin' ) ) {
     1622            require_once TERMAGEDDON_COOKIE_PATH . 'admin/class-termageddon-usercentrics-admin.php';
     1623        }
     1624        $providers = Termageddon_Usercentrics_Admin::get_usercentrics_providers();
     1625        return $providers[ $service_id ] ?? '';
     1626    }
     1627
     1628    /**
     1629     * Augment script tags with Usercentrics blocking attributes
     1630     *
     1631     * Takes script HTML and augments all <script> tags with type="text/plain"
     1632     * and data-usercentrics attributes for cookie consent blocking.
     1633     *
     1634     * @param string $script_html The raw script HTML to augment.
     1635     * @param string $service_id  The provider ID to look up the service name.
     1636     * @return string The augmented script HTML, or original if service not found.
     1637     */
     1638    public static function augment_script_for_usercentrics( string $script_html, string $service_id ): string {
     1639        // Get service name from service_id
     1640        $service_name = self::get_provider_name_by_id( $service_id );
     1641        if ( empty( $service_name ) ) {
     1642            // Log warning if service not found
     1643            if ( function_exists( 'error_log' ) ) {
     1644                error_log( sprintf( 'Termageddon Usercentrics: Invalid service_id "%s" provided to augment_script_for_usercentrics', $service_id ) );
     1645            }
     1646            return $script_html; // Return original if service not found
     1647        }
     1648
     1649        // Pattern to match script tags (both with src and inline)
     1650        $pattern = '/<script([^>]*)>([\s\S]*?)<\/script>/i';
     1651
     1652        $augmented = preg_replace_callback(
     1653            $pattern,
     1654            function( $matches ) use ( $service_name ) {
     1655                $attributes = trim( $matches[1] );
     1656                $content    = $matches[2];
     1657
     1658                // Replace or add type="text/plain"
     1659                if ( preg_match( '/type\s*=\s*["\'][^"\']*["\']/i', $attributes ) ) {
     1660                    // Replace existing type attribute
     1661                    $attributes = preg_replace(
     1662                        '/type\s*=\s*["\'][^"\']*["\']/i',
     1663                        'type="text/plain"',
     1664                        $attributes
     1665                    );
     1666                } else {
     1667                    // Add type="text/plain" attribute
     1668                    $attributes = ( $attributes ? $attributes . ' ' : '' ) . 'type="text/plain"';
     1669                }
     1670
     1671                // Add or update data-usercentrics attribute
     1672                $usercentrics_attr = 'data-usercentrics="' . esc_attr( $service_name ) . '"';
     1673                if ( preg_match( '/data-usercentrics\s*=\s*["\'][^"\']*["\']/i', $attributes ) ) {
     1674                    // Replace existing data-usercentrics
     1675                    $attributes = preg_replace(
     1676                        '/data-usercentrics\s*=\s*["\'][^"\']*["\']/i',
     1677                        $usercentrics_attr,
     1678                        $attributes
     1679                    );
     1680                } else {
     1681                    // Add data-usercentrics attribute
     1682                    $attributes .= ' ' . $usercentrics_attr;
     1683                }
     1684
     1685                return '<script' . ( $attributes ? ' ' . $attributes : '' ) . '>' . $content . '</script>';
     1686            },
     1687            $script_html
     1688        );
     1689
     1690        $service_name_upper = strtoupper( $service_name );
     1691        return PHP_EOL . '<!-- ' . esc_html( $service_name_upper ) . ' SCRIPT -->' . PHP_EOL . ( $augmented ?? $script_html ) . PHP_EOL;
     1692    }
     1693
    15791694}
  • termageddon-usercentrics/trunk/languages/termageddon-usercentrics.pot

    r3362792 r3439658  
    44"Project-Id-Version: Termageddon + Usercentrics\n"
    55"Report-Msgid-Bugs-To: \n"
    6 "POT-Creation-Date: 2025-09-16 00:31+0000\n"
     6"POT-Creation-Date: 2026-01-13 22:13+0000\n"
    77"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
    88"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
     
    1717"X-Domain: termageddon-usercentrics"
    1818
    19 #: admin/class-termageddon-usercentrics-admin.php:1216
     19#: admin/class-termageddon-usercentrics-admin.php:1793
     20msgid "+ Add Script Snippet"
     21msgstr ""
     22
     23#: admin/class-termageddon-usercentrics-admin.php:1305
    2024msgid "Action Needed"
    2125msgstr ""
    2226
    23 #: admin/class-termageddon-usercentrics-admin.php:449
     27#: admin/class-termageddon-usercentrics-admin.php:473
    2428msgid "Additional Scripts"
    2529msgstr ""
    2630
    27 #: admin/class-termageddon-usercentrics-admin.php:486
     31#: admin/class-termageddon-usercentrics-admin.php:556
    2832msgid "Administrators"
    2933msgstr ""
    3034
    31 #: admin/class-termageddon-usercentrics-admin.php:889
     35#: admin/class-termageddon-usercentrics-admin.php:978
    3236msgid "Advanced Configuration"
    3337msgstr ""
    3438
    3539#: admin/class-termageddon-usercentrics-admin.php:90
    36 #: admin/class-termageddon-usercentrics-admin.php:229
     40#: admin/class-termageddon-usercentrics-admin.php:234
    3741msgid "Advanced Configuration & Troubleshooting"
    3842msgstr ""
    3943
    40 #: admin/class-termageddon-usercentrics-admin.php:239
     44#: admin/class-termageddon-usercentrics-admin.php:244
    4145msgid "Allowed HTML Tags"
    4246msgstr ""
    4347
    44 #: admin/class-termageddon-usercentrics-admin.php:1420
     48#: admin/class-termageddon-usercentrics-admin.php:1519
    4549msgid "along with page 1 of your Privacy Policy questionnaire within "
    4650msgstr ""
    4751
    48 #: admin/class-termageddon-usercentrics-admin.php:543
     52#: admin/class-termageddon-usercentrics-admin.php:613
    4953msgid ""
    5054"As an alternative to that additional script, you can simply use the [uc-"
     
    5559msgstr ""
    5660
    57 #: admin/class-termageddon-usercentrics-admin.php:900
     61#: admin/class-termageddon-usercentrics-admin.php:989
    5862msgid "Auto-refresh on consent"
    5963msgstr ""
    6064
    61 #: admin/class-termageddon-usercentrics-admin.php:1427
     65#: admin/class-termageddon-usercentrics-admin.php:1526
    6266msgid "based on which privacy laws apply to you"
    6367msgstr ""
    6468
    65 #: admin/class-termageddon-usercentrics-admin.php:1225
     69#: admin/class-termageddon-usercentrics-admin.php:1314
    6670msgid ""
    6771"Behind the scenes, we will remove the Usercentrics embed code from the field "
     
    6973msgstr ""
    7074
     75#: admin/class-termageddon-usercentrics-admin.php:753
     76msgid ""
     77"By updating all external scripts to use the <a href=\"https://termageddon."
     78"freshdesk.com/support/solutions/articles/66000529802-embedding-the-cookie-"
     79"consent-solution-and-cookie-policy#:~:text=for%20simplicity%20purposes.-,"
     80"Manual%20script%20control,-%2D%20You%20can%20also\" target=\"_blank\">manual "
     81"script controller</a>, you can disable usercentrics block script which will "
     82"improve site-loading performance and improve reliability. Once enabled, "
     83"please ensure you <a href=\"https://termageddon.freshdesk."
     84"com/support/solutions/articles/66000529802-embedding-the-cookie-consent-"
     85"solution-and-cookie-policy\" target=\"_blank\">validate</a> that any "
     86"external services are working as expected."
     87msgstr ""
     88
    7189#: includes/class-termageddon-usercentrics.php:137
    7290msgid "California (CPRA, CIPA)"
     
    7795msgstr ""
    7896
    79 #: admin/class-termageddon-usercentrics-admin.php:890
     97#: admin/class-termageddon-usercentrics-admin.php:979
    8098msgid ""
    8199"Certain integrations may require a more custom approach to integrating with "
     
    96114
    97115#. section ID.
    98 #: admin/class-termageddon-usercentrics-admin.php:972
     116#: admin/class-termageddon-usercentrics-admin.php:1061
    99117msgid "Control Panel"
    100118msgstr ""
    101119
    102 #: admin/class-termageddon-usercentrics-admin.php:1222
     120#: admin/class-termageddon-usercentrics-admin.php:1311
    103121msgid "Conversion Needed:"
    104122msgstr ""
    105123
    106 #: admin/class-termageddon-usercentrics-admin.php:1226
     124#: admin/class-termageddon-usercentrics-admin.php:1315
    107125msgid "Convert"
    108126msgstr ""
    109127
    110 #: admin/class-termageddon-usercentrics-admin.php:1380
     128#: admin/class-termageddon-usercentrics-admin.php:1479
    111129msgid "Cookie Policy and Consent Solution"
    112130msgstr ""
    113131
    114 #: admin/class-termageddon-usercentrics-admin.php:231
     132#: admin/class-termageddon-usercentrics-admin.php:236
    115133msgid "Debug Information"
    116134msgstr ""
    117135
    118 #: admin/class-termageddon-usercentrics-admin.php:924
     136#: includes/class-termageddon-usercentrics.php:149
     137msgid "Delaware (DPDPA)"
     138msgstr ""
     139
     140#: admin/class-termageddon-usercentrics-admin.php:1013
    119141msgid "Disable blocking for providers"
    120142msgstr ""
    121143
    122 #: admin/class-termageddon-usercentrics-admin.php:677
     144#: admin/class-termageddon-usercentrics-admin.php:766
    123145msgid "Disable CDN for Translations Script"
    124146msgstr ""
    125147
    126 #: admin/class-termageddon-usercentrics-admin.php:696
     148#: admin/class-termageddon-usercentrics-admin.php:785
    127149msgid "Disable for Troubleshooting"
    128150msgstr ""
    129151
    130 #: includes/class-termageddon-usercentrics.php:1300
     152#: admin/class-termageddon-usercentrics-admin.php:747
     153msgid "Disable Usercentrics Auto-blocking script"
     154msgstr ""
     155
     156#: includes/class-termageddon-usercentrics.php:1321
    131157msgid "Divi Video"
    132158msgstr ""
     
    138164msgstr ""
    139165
    140 #: admin/class-termageddon-usercentrics-admin.php:504
     166#: admin/class-termageddon-usercentrics-admin.php:574
    141167msgid "Editors"
    142168msgstr ""
    143169
    144 #: includes/class-termageddon-usercentrics.php:1306
     170#: includes/class-termageddon-usercentrics.php:1327
    145171msgid "Elementor Video"
    146172msgstr ""
    147173
    148 #: admin/class-termageddon-usercentrics-admin.php:449
     174#: admin/class-termageddon-usercentrics-admin.php:473
    149175msgid "Embed Code (Legacy)"
    150176msgstr ""
    151177
    152 #: admin/class-termageddon-usercentrics-admin.php:621
     178#: admin/class-termageddon-usercentrics-admin.php:691
    153179msgid "Embed Code Injection Method"
    154180msgstr ""
    155181
    156 #: admin/class-termageddon-usercentrics-admin.php:598
     182#: admin/class-termageddon-usercentrics-admin.php:668
    157183msgid "Embed Code Priority"
    158184msgstr ""
    159185
    160 #: admin/class-termageddon-usercentrics-admin.php:649
     186#: admin/class-termageddon-usercentrics-admin.php:719
    161187msgid "Embed Code Version"
    162188msgstr ""
    163189
    164 #: admin/class-termageddon-usercentrics-admin.php:799
     190#: admin/class-termageddon-usercentrics-admin.php:888
    165191msgid "Enable location logging"
    166192msgstr ""
    167193
    168 #: admin/class-termageddon-usercentrics-admin.php:819
     194#: admin/class-termageddon-usercentrics-admin.php:908
    169195msgid "Enable page caching support via AJAX"
    170196msgstr ""
    171197
    172 #: admin/class-termageddon-usercentrics-admin.php:431
     198#: admin/class-termageddon-usercentrics-admin.php:455
    173199msgid ""
    174200"Enter your Usercentrics Settings ID. This can be found on the \"View Embed "
     
    176202msgstr ""
    177203
    178 #: admin/class-termageddon-usercentrics-admin.php:986
     204#: admin/class-termageddon-usercentrics-admin.php:1075
    179205msgid "Error Count"
    180206msgstr ""
    181207
    182 #: admin/class-termageddon-usercentrics-admin.php:243
     208#: admin/class-termageddon-usercentrics-admin.php:248
    183209msgid "Error Information"
    184210msgstr ""
    185211
    186 #: admin/class-termageddon-usercentrics-admin.php:1004
     212#: admin/class-termageddon-usercentrics-admin.php:1093
    187213msgid "Error List"
    188214msgstr ""
     
    192218msgstr ""
    193219
    194 #: includes/class-termageddon-usercentrics.php:311
     220#: includes/class-termageddon-usercentrics.php:302
    195221msgid "Every Month"
    196222msgstr ""
    197223
    198 #: admin/class-termageddon-usercentrics-admin.php:576
     224#: admin/class-termageddon-usercentrics-admin.php:646
    199225msgid ""
    200226"For some theme builders including Divi, the footer (bottom bar) does not "
     
    206232#. section ID.
    207233#: admin/class-termageddon-usercentrics-admin.php:82
    208 #: admin/class-termageddon-usercentrics-admin.php:724
     234#: admin/class-termageddon-usercentrics-admin.php:813
    209235msgid "Geo-Location"
    210236msgstr ""
    211237
    212 #: admin/class-termageddon-usercentrics-admin.php:190
    213 #: admin/class-termageddon-usercentrics-admin.php:1429
     238#: admin/class-termageddon-usercentrics-admin.php:195
     239#: admin/class-termageddon-usercentrics-admin.php:1528
    214240msgid ""
    215241"Geo-Location is enabled, but no locations have been toggled on. This means "
     
    217243msgstr ""
    218244
    219 #: admin/class-termageddon-usercentrics-admin.php:236
     245#: admin/class-termageddon-usercentrics-admin.php:241
    220246msgid "Geolocation Database Directory Writable"
    221247msgstr ""
    222248
    223 #: admin/class-termageddon-usercentrics-admin.php:234
     249#: admin/class-termageddon-usercentrics-admin.php:239
    224250msgid "Geolocation Database Exists"
    225251msgstr ""
    226252
    227 #: admin/class-termageddon-usercentrics-admin.php:237
     253#: admin/class-termageddon-usercentrics-admin.php:242
    228254msgid "Geolocation Database Last Updated"
    229255msgstr ""
    230256
     257#: admin/class-termageddon-usercentrics-admin.php:243
     258msgid "Geolocation Database Next Update"
     259msgstr ""
     260
    231261#: admin/class-termageddon-usercentrics-admin.php:238
    232 msgid "Geolocation Database Next Update"
    233 msgstr ""
    234 
    235 #: admin/class-termageddon-usercentrics-admin.php:233
    236262msgid "Geolocation Database Path"
    237263msgstr ""
    238264
    239 #: admin/class-termageddon-usercentrics-admin.php:235
     265#: admin/class-termageddon-usercentrics-admin.php:240
    240266msgid "Geolocation Database Readable"
    241267msgstr ""
    242268
    243 #: admin/class-termageddon-usercentrics-admin.php:542
     269#: admin/class-termageddon-usercentrics-admin.php:612
    244270msgid ""
    245271"Giving users the ability to change their privacy/consent settings is a "
     
    251277msgstr ""
    252278
    253 #: admin/class-termageddon-usercentrics-admin.php:1218
     279#: admin/class-termageddon-usercentrics-admin.php:1307
    254280msgid "Go to Configuration"
    255281msgstr ""
    256282
    257 #: admin/class-termageddon-usercentrics-admin.php:551
     283#: admin/class-termageddon-usercentrics-admin.php:621
    258284msgid "Hide Privacy Settings Link when cookie consent tool is disabled"
    259285msgstr ""
     
    263289msgstr ""
    264290
    265 #: admin/class-termageddon-usercentrics-admin.php:1398
     291#: admin/class-termageddon-usercentrics-admin.php:1497
    266292msgid "If you are using the Divi theme"
    267293msgstr ""
    268294
    269 #: admin/class-termageddon-usercentrics-admin.php:856
     295#: admin/class-termageddon-usercentrics-admin.php:945
    270296msgid ""
    271297"If you have a script or code snippet to share, would like to improve support "
     
    274300msgstr ""
    275301
    276 #: admin/class-termageddon-usercentrics-admin.php:1397
     302#: admin/class-termageddon-usercentrics-admin.php:1496
    277303msgid ""
    278304"If you would like to remove Usercentrics for logged in users such as admins, "
     
    280306msgstr ""
    281307
    282 #: admin/class-termageddon-usercentrics-admin.php:866
     308#: includes/class-termageddon-usercentrics.php:153
     309msgid "Indiana (ICDPA)"
     310msgstr ""
     311
     312#: admin/class-termageddon-usercentrics-admin.php:955
    283313msgid "Integration"
    284314msgstr ""
     
    286316#. section ID.
    287317#: admin/class-termageddon-usercentrics-admin.php:78
    288 #: admin/class-termageddon-usercentrics-admin.php:845
     318#: admin/class-termageddon-usercentrics-admin.php:934
    289319msgid "Integrations"
    290320msgstr ""
    291321
    292 #: admin/class-termageddon-usercentrics-admin.php:209
     322#: admin/class-termageddon-usercentrics-admin.php:497
     323msgid ""
     324"into third party scripts (Google Analytics, Facebook Pixel, LinkedIn "
     325"Insights Tag, etc.), which can help ensure that consent is obtained first "
     326"prior to the script loading."
     327msgstr ""
     328
     329#: admin/class-termageddon-usercentrics-admin.php:214
    293330msgid "Invalid tab. Please check the link and try again."
    294331msgstr ""
    295332
    296 #: admin/class-termageddon-usercentrics-admin.php:1224
     333#: admin/class-termageddon-usercentrics-admin.php:1313
    297334msgid ""
    298335"It looks like you are still using the old embed code (below) instead of the "
     
    301338msgstr ""
    302339
    303 #: admin/class-termageddon-usercentrics-admin.php:198
     340#: admin/class-termageddon-usercentrics-admin.php:503
     341msgid ""
     342"just in general, but also after making this update to ensure that scripts do "
     343"not fire until consent is provided."
     344msgstr ""
     345
     346#: admin/class-termageddon-usercentrics-admin.php:203
    304347msgid "Location logging is enabled."
    305348msgstr ""
    306349
    307 #: admin/class-termageddon-usercentrics-admin.php:522
     350#: admin/class-termageddon-usercentrics-admin.php:592
    308351msgid "Logged-in Users"
    309352msgstr ""
    310353
    311 #: admin/class-termageddon-usercentrics-admin.php:1427
     354#: admin/class-termageddon-usercentrics-admin.php:496
     355msgid "manual control snippet"
     356msgstr ""
     357
     358#: admin/class-termageddon-usercentrics-admin.php:493
     359msgid "Manual Script Controller"
     360msgstr ""
     361
     362#: admin/class-termageddon-usercentrics-admin.php:1736
     363#: admin/class-termageddon-usercentrics-admin.php:1806
     364msgid "New Script Snippet"
     365msgstr ""
     366
     367#: admin/class-termageddon-usercentrics-admin.php:1526
    312368msgid "Not sure what to select?"
    313369msgstr ""
    314370
    315 #: admin/class-termageddon-usercentrics-admin.php:1420
     371#: admin/class-termageddon-usercentrics-admin.php:1519
    316372msgid "Not sure what to select? Review"
    317373msgstr ""
    318374
    319 #: admin/class-termageddon-usercentrics-admin.php:953
     375#: admin/class-termageddon-usercentrics-admin.php:1042
    320376msgid ""
    321377"On this page, you can find custom implementation to improve support and "
     
    323379msgstr ""
    324380
    325 #: includes/class-termageddon-usercentrics.php:149
     381#: includes/class-termageddon-usercentrics.php:157
    326382msgid "Oregon (OCPA)"
    327383msgstr ""
    328384
    329 #: admin/class-termageddon-usercentrics-admin.php:604
     385#: admin/class-termageddon-usercentrics-admin.php:674
    330386msgid ""
    331387"Override the default priority of the embed code (Defaults to 1). By "
     
    336392msgstr ""
    337393
    338 #: admin/class-termageddon-usercentrics-admin.php:191
     394#: admin/class-termageddon-usercentrics-admin.php:196
    339395msgid ""
    340396"Please go to geo-location settings to enable at least one location or to "
     
    342398msgstr ""
    343399
    344 #: admin/class-termageddon-usercentrics-admin.php:855
     400#: admin/class-termageddon-usercentrics-admin.php:944
    345401msgid "Plugin & Theme Integrations"
    346402msgstr ""
    347403
    348 #: includes/class-termageddon-usercentrics.php:1312
     404#: includes/class-termageddon-usercentrics.php:1333
    349405msgid "PowerPack Video"
    350406msgstr ""
    351407
    352 #: includes/class-termageddon-usercentrics.php:1318
     408#: includes/class-termageddon-usercentrics.php:1339
    353409msgid "Presto Player"
    354410msgstr ""
    355411
    356 #: admin/class-termageddon-usercentrics-admin.php:570
     412#: admin/class-termageddon-usercentrics-admin.php:640
    357413msgid "Privacy Settings Link - Alternative Implementation"
    358414msgstr ""
    359415
    360 #: admin/class-termageddon-usercentrics-admin.php:655
     416#: admin/class-termageddon-usercentrics-admin.php:1752
     417#: admin/class-termageddon-usercentrics-admin.php:1811
     418msgid "Remove"
     419msgstr ""
     420
     421#: admin/class-termageddon-usercentrics-admin.php:1776
     422#: admin/class-termageddon-usercentrics-admin.php:1830
     423msgid "Script Code"
     424msgstr ""
     425
     426#. %d: snippet index number
     427#: admin/class-termageddon-usercentrics-admin.php:1590
     428msgid "Script snippet #%d was not saved: Please select a valid service."
     429msgstr ""
     430
     431#. %1$s: service name, %2$d: snippet index number
     432#: admin/class-termageddon-usercentrics-admin.php:1623
     433#, php-format
     434msgid ""
     435"Script snippet for \"%1$s\" (#%2$d) was not saved: Only script tags are "
     436"allowed. Please remove any HTML elements (div, span, etc.) and use only &lt;"
     437"script&gt; tags."
     438msgstr ""
     439
     440#. %1$s: service name, %2$d: snippet index number
     441#: admin/class-termageddon-usercentrics-admin.php:1607
     442#, php-format
     443msgid ""
     444"Script snippet for \"%1$s\" (#%2$d) was not saved: The script code field "
     445"cannot be empty."
     446msgstr ""
     447
     448#. %1$s: service name, %2$d: snippet index number
     449#: admin/class-termageddon-usercentrics-admin.php:1630
     450#, php-format
     451msgid ""
     452"Script snippet for \"%1$s\" (#%2$d) was not saved: The script code must "
     453"contain at least one &lt;script&gt; tag."
     454msgstr ""
     455
     456#: admin/class-termageddon-usercentrics-admin.php:1766
     457#: admin/class-termageddon-usercentrics-admin.php:1796
     458msgid "Select a service..."
     459msgstr ""
     460
     461#: admin/class-termageddon-usercentrics-admin.php:725
    361462msgid ""
    362463"Select which version of the Usercentrics embed code you would like to use."
    363464msgstr ""
    364465
     466#: admin/class-termageddon-usercentrics-admin.php:1758
     467#: admin/class-termageddon-usercentrics-admin.php:1817
     468msgid "Service"
     469msgstr ""
     470
    365471#. section ID.
    366 #: includes/class-termageddon-usercentrics.php:521
     472#: includes/class-termageddon-usercentrics.php:536
    367473#: admin/class-termageddon-usercentrics-admin.php:86
    368 #: admin/class-termageddon-usercentrics-admin.php:477
     474#: admin/class-termageddon-usercentrics-admin.php:547
    369475msgid "Settings"
    370476msgstr ""
    371477
    372 #: admin/class-termageddon-usercentrics-admin.php:425
     478#: admin/class-termageddon-usercentrics-admin.php:449
    373479msgid "Settings ID"
    374480msgstr ""
    375481
    376 #: admin/class-termageddon-usercentrics-admin.php:1426
     482#: admin/class-termageddon-usercentrics-admin.php:1525
    377483msgid "Show widget if visitor is located in"
     484msgstr ""
     485
     486#: admin/class-termageddon-usercentrics-admin.php:499
     487msgid ""
     488"Simply add a new snippet, enter the Service name (same name as the Service "
     489"you listed in your Cookie Policy and Consent Tool questionnaire), and paste "
     490"your embed code into the provided field. The plugin will then set up manual "
     491"control of the script, helping ensure that it is blocked until consent is "
     492"obtained by the user."
    378493msgstr ""
    379494
     
    383498msgstr ""
    384499
    385 #: admin/class-termageddon-usercentrics-admin.php:203
     500#: admin/class-termageddon-usercentrics-admin.php:208
    386501msgid "Termageddon + Usercentrics"
    387502msgstr ""
    388503
    389 #: includes/class-termageddon-usercentrics.php:153
     504#: admin/class-termageddon-usercentrics-admin.php:502
     505msgid "test the consent solution"
     506msgstr ""
     507
     508#: includes/class-termageddon-usercentrics.php:161
    390509msgid "Texas (TDPSA)"
    391510msgstr ""
    392511
    393 #: admin/class-termageddon-usercentrics-admin.php:627
     512#: admin/class-termageddon-usercentrics-admin.php:697
    394513msgid ""
    395514"The default injection option, wp_head, will inject the embed code in the "
     
    399518msgstr ""
    400519
    401 #: admin/class-termageddon-usercentrics-admin.php:1420
     520#: admin/class-termageddon-usercentrics-admin.php:1519
    402521msgid "this article"
    403522msgstr ""
    404523
    405 #: admin/class-termageddon-usercentrics-admin.php:1427
     524#: admin/class-termageddon-usercentrics-admin.php:1526
    406525msgid "This article outlines which regions to select"
    407526msgstr ""
    408527
    409 #: admin/class-termageddon-usercentrics-admin.php:229
     528#: admin/class-termageddon-usercentrics-admin.php:495
     529msgid "This feature helps add the"
     530msgstr ""
     531
     532#: admin/class-termageddon-usercentrics-admin.php:234
    410533msgid ""
    411534"This panel is for advanced configuration and troubleshooting. Please contact "
     
    413536msgstr ""
    414537
    415 #: admin/class-termageddon-usercentrics-admin.php:906
     538#: admin/class-termageddon-usercentrics-admin.php:995
    416539msgid ""
    417540"This particular feature is not needed for most websites. This feature is "
     
    423546msgstr ""
    424547
    425 #: includes/class-termageddon-usercentrics.php:1301
     548#: includes/class-termageddon-usercentrics.php:1322
    426549msgid ""
    427550"This resolves and improves the cookie-consent implementation when using an "
     
    429552msgstr ""
    430553
    431 #: includes/class-termageddon-usercentrics.php:1307
     554#: includes/class-termageddon-usercentrics.php:1328
    432555msgid ""
    433556"This resolves and improves the cookie-consent implementation when using an "
     
    435558msgstr ""
    436559
    437 #: includes/class-termageddon-usercentrics.php:1313
     560#: includes/class-termageddon-usercentrics.php:1334
    438561msgid ""
    439562"This resolves and improves the cookie-consent implementation when using an "
     
    443566msgstr ""
    444567
    445 #: includes/class-termageddon-usercentrics.php:1319
     568#: includes/class-termageddon-usercentrics.php:1340
    446569msgid ""
    447570"This resolves and improves the cookie-consent implementation when using an "
     
    449572msgstr ""
    450573
    451 #: includes/class-termageddon-usercentrics.php:1325
     574#: includes/class-termageddon-usercentrics.php:1346
    452575msgid ""
    453576"This resolves and improves the cookie-consent implementation when using an "
     
    456579msgstr ""
    457580
    458 #: admin/class-termageddon-usercentrics-admin.php:455
     581#: admin/class-termageddon-usercentrics-admin.php:479
    459582msgid ""
    460583"This section can be used to add customizations to your Usercentrics embed "
     
    463586msgstr ""
    464587
    465 #: admin/class-termageddon-usercentrics-admin.php:455
     588#: admin/class-termageddon-usercentrics-admin.php:479
    466589msgid ""
    467590"This section should no longer be used for the embed code from the "
     
    470593msgstr ""
    471594
    472 #: admin/class-termageddon-usercentrics-admin.php:1217
     595#: admin/class-termageddon-usercentrics-admin.php:1306
    473596msgid "This update will take a few seconds to complete."
    474597msgstr ""
    475598
    476 #: admin/class-termageddon-usercentrics-admin.php:683
     599#: admin/class-termageddon-usercentrics-admin.php:772
    477600msgid ""
    478601"This will switch the URL used for the Usercentrics translations script from "
     
    481604msgstr ""
    482605
    483 #: admin/class-termageddon-usercentrics-admin.php:1441
     606#: admin/class-termageddon-usercentrics-admin.php:1540
    484607msgid ""
    485608"To reset any of the backend variables, update the values below and save your "
     
    487610msgstr ""
    488611
    489 #: includes/class-termageddon-usercentrics.php:1324
     612#: includes/class-termageddon-usercentrics.php:1345
    490613msgid "Ultimate Addons for Beaver Builder Video"
    491614msgstr ""
     
    499622msgstr ""
    500623
    501 #: admin/class-termageddon-usercentrics-admin.php:1379
     624#: admin/class-termageddon-usercentrics-admin.php:1478
    502625msgid "Upon generating your "
    503626msgstr ""
    504627
    505 #: admin/class-termageddon-usercentrics-admin.php:1366
     628#: admin/class-termageddon-usercentrics-admin.php:1465
    506629msgid "Upon saving, all previous errors in the log will be deleted."
    507630msgstr ""
    508631
    509 #: includes/class-termageddon-usercentrics.php:157
     632#: includes/class-termageddon-usercentrics.php:165
    510633msgid "Utah (UCPA)"
    511634msgstr ""
    512635
    513 #: admin/class-termageddon-usercentrics-admin.php:657
     636#: admin/class-termageddon-usercentrics-admin.php:727
    514637msgid "v2"
    515638msgstr ""
    516639
    517 #: admin/class-termageddon-usercentrics-admin.php:658
     640#: admin/class-termageddon-usercentrics-admin.php:728
    518641msgid "v3 (Beta)"
    519642msgstr ""
    520643
    521 #: includes/class-termageddon-usercentrics.php:161
     644#: admin/class-termageddon-usercentrics-admin.php:501
     645msgid "Very important: be sure to"
     646msgstr ""
     647
     648#: includes/class-termageddon-usercentrics.php:169
    522649msgid "Virginia (VCDPA)"
    523650msgstr ""
    524651
    525 #: admin/class-termageddon-usercentrics-admin.php:930
     652#: admin/class-termageddon-usercentrics-admin.php:1019
    526653msgid ""
    527654"WARNING: By adding providers to this list, you are choosing for Usercentrics "
     
    530657msgstr ""
    531658
    532 #: admin/class-termageddon-usercentrics-admin.php:544
     659#: admin/class-termageddon-usercentrics-admin.php:614
    533660msgid ""
    534661"We also offer a button version of the Privacy Settings link, which can be "
     
    538665msgstr ""
    539666
    540 #: admin/class-termageddon-usercentrics-admin.php:1217
     667#: admin/class-termageddon-usercentrics-admin.php:1306
    541668msgid ""
    542669"We are moving to using a Settings ID instead of an embed code format to "
     
    544671msgstr ""
    545672
    546 #: admin/class-termageddon-usercentrics-admin.php:183
     673#: admin/class-termageddon-usercentrics-admin.php:188
    547674msgid ""
    548675"We were unable to download the database necessary for geolocation to your "
     
    551678msgstr ""
    552679
    553 #: admin/class-termageddon-usercentrics-admin.php:557
     680#: admin/class-termageddon-usercentrics-admin.php:627
    554681msgid ""
    555682"When enabled, the Privacy Settings link will be hidden from certain users, "
     
    564691msgstr ""
    565692
    566 #: admin/class-termageddon-usercentrics-admin.php:805
     693#: admin/class-termageddon-usercentrics-admin.php:894
    567694msgid ""
    568695"When enabled, the visitor's location can be viewed in the browser console, "
     
    570697msgstr ""
    571698
    572 #: admin/class-termageddon-usercentrics-admin.php:825
     699#: admin/class-termageddon-usercentrics-admin.php:914
    573700msgid ""
    574701"When enabled, the visitor's location is checked via javascript to allow "
     
    576703msgstr ""
    577704
    578 #: admin/class-termageddon-usercentrics-admin.php:702
     705#: admin/class-termageddon-usercentrics-admin.php:791
    579706msgid ""
    580707"When enabled, this feature allows you to turn off the consent tool for all "
     
    585712msgstr ""
    586713
    587 #: admin/class-termageddon-usercentrics-admin.php:1416
     714#: admin/class-termageddon-usercentrics-admin.php:1515
    588715msgid ""
    589716"When enabled, you will be collecting IP addresses for the purposes of "
     
    597724msgstr ""
    598725
    599 #: admin/class-termageddon-usercentrics-admin.php:198
     726#: admin/class-termageddon-usercentrics-admin.php:203
    600727msgid "with the IP Address of"
    601728msgstr ""
    602729
    603 #: admin/class-termageddon-usercentrics-admin.php:1381
     730#: admin/class-termageddon-usercentrics-admin.php:1480
    604731msgid ""
    605732"within your Termageddon account, you will be brought to the \"View embed "
     
    608735msgstr ""
    609736
    610 #: admin/class-termageddon-usercentrics-admin.php:630
     737#: admin/class-termageddon-usercentrics-admin.php:700
    611738msgid "wp_enqueue_scripts"
    612739msgstr ""
    613740
    614 #: admin/class-termageddon-usercentrics-admin.php:629
     741#: admin/class-termageddon-usercentrics-admin.php:699
    615742msgid "wp_head (Default)"
    616743msgstr ""
    617744
    618 #: admin/class-termageddon-usercentrics-admin.php:1399
     745#: admin/class-termageddon-usercentrics-admin.php:1498
    619746msgid ""
    620747"you will need to enable at least one of the settings below to ensure logged "
     
    623750msgstr ""
    624751
    625 #: admin/class-termageddon-usercentrics-admin.php:198
     752#: admin/class-termageddon-usercentrics-admin.php:203
    626753msgid "Your location"
    627754msgstr ""
  • termageddon-usercentrics/trunk/public/class-termageddon-usercentrics-public.php

    r3326335 r3439658  
    222222
    223223    /**
     224     * Get augmented script snippets for output
     225     *
     226     * Retrieves script snippets from database, augments them with Usercentrics attributes,
     227     * and returns the concatenated result.
     228     *
     229     * @return string The concatenated augmented script snippets.
     230     */
     231    public function get_augmented_script_snippets(): string {
     232        $snippets = Termageddon_Usercentrics::get_script_snippets();
     233        if ( empty( $snippets ) || ! is_array( $snippets ) ) {
     234            return '';
     235        }
     236
     237        $augmented_scripts = array();
     238        foreach ( $snippets as $snippet ) {
     239            // Validate snippet structure
     240            if ( ! is_array( $snippet ) || ! isset( $snippet['script'], $snippet['service_id'] ) ) {
     241                continue;
     242            }
     243
     244            $script     = trim( $snippet['script'] );
     245            $service_id = $snippet['service_id'];
     246
     247            // Skip empty scripts
     248            if ( empty( $script ) ) {
     249                continue;
     250            }
     251
     252            // Augment the script with Usercentrics attributes
     253            $augmented = Termageddon_Usercentrics::augment_script_for_usercentrics( $script, $service_id );
     254            $augmented_scripts[] = $augmented;
     255        }
     256
     257        return ! empty( $augmented_scripts ) ? implode( PHP_EOL, $augmented_scripts ) : '';
     258    }
     259
     260    /**
    224261     * Dynamically hide or show the termageddon script based on settings. Outputs directly to script tag.
    225262     */
     
    274311        }
    275312
     313        // Append augmented script snippets
     314        $augmented_snippets = $this->get_augmented_script_snippets();
     315        if ( ! empty( $augmented_snippets ) ) {
     316            $script .= PHP_EOL . $augmented_snippets;
     317        }
     318
    276319        if ( empty( $script ) ) {
    277320            return;
     
    300343
    301344        if ( $settings_id && $should_enqueue_scripts ) {
    302             // Enqueue Embed Script.
    303             wp_enqueue_script( $this->plugin_name . '-scripts', '//privacy-proxy.usercentrics.eu/latest/uc-block.bundle.js', array(), $this->version, false );
    304             // note: this URL is placed here to "play by the rules"... but it doesn't actually do anything.
    305             // the whole thing will be overwritten by the script_loader_tag filter.
     345            // Only enqueue the auto-blocking script if manual control is disabled
     346            if ( ! Termageddon_Usercentrics::is_manual_script_control_enabled() ) {
     347                wp_enqueue_script( $this->plugin_name . '-scripts', '//privacy-proxy.usercentrics.eu/latest/uc-block.bundle.js', array(), $this->version, false );
     348                // note: this URL is placed here to "play by the rules"... but it doesn't actually do anything.
     349                // the whole thing will be overwritten by the script_loader_tag filter.
     350            }
    306351        }
    307352
  • termageddon-usercentrics/trunk/termageddon-usercentrics.php

    r3366825 r3439658  
    1515 * Plugin Name:       Termageddon
    1616 * Description:       Each Termageddon license includes a consent solution. This plugin helps you install the consent solution with ease, while offering additional features.
    17  * Version:           1.8.2
     17 * Version:           1.9.0
    1818 * Author:            Termageddon
    1919 * Author URI:        https://termageddon.com
     
    3434 * Rename this for your plugin and update it as you release new versions.
    3535 */
    36 define( 'TERMAGEDDON_COOKIE_VERSION', '1.8.2' );
     36define( 'TERMAGEDDON_COOKIE_VERSION', '1.9.0' );
    3737
    3838define( 'TERMAGEDDON_COOKIE_PLUGIN_PATH', dirname( __FILE__ ) );// No trailing slash.
  • termageddon-usercentrics/trunk/vendor/composer/autoload_static.php

    r3326335 r3439658  
    88{
    99    public static $prefixLengthsPsr4 = array (
    10         'M' => 
     10        'M' =>
    1111        array (
    1212            'MaxMind\\WebService\\' => 19,
     
    1414            'MaxMind\\Db\\' => 11,
    1515        ),
    16         'G' => 
     16        'G' =>
    1717        array (
    1818            'GeoIp2\\' => 7,
    1919        ),
    20         'C' => 
     20        'C' =>
    2121        array (
    2222            'Composer\\CaBundle\\' => 18,
     
    2525
    2626    public static $prefixDirsPsr4 = array (
    27         'MaxMind\\WebService\\' => 
     27        'MaxMind\\WebService\\' =>
    2828        array (
    2929            0 => __DIR__ . '/..' . '/maxmind/web-service-common/src/WebService',
    3030        ),
    31         'MaxMind\\Exception\\' => 
     31        'MaxMind\\Exception\\' =>
    3232        array (
    3333            0 => __DIR__ . '/..' . '/maxmind/web-service-common/src/Exception',
    3434        ),
    35         'MaxMind\\Db\\' => 
     35        'MaxMind\\Db\\' =>
    3636        array (
    3737            0 => __DIR__ . '/..' . '/maxmind-db/reader/src/MaxMind/Db',
    3838        ),
    39         'GeoIp2\\' => 
     39        'GeoIp2\\' =>
    4040        array (
    4141            0 => __DIR__ . '/..' . '/geoip2/geoip2/src',
    4242        ),
    43         'Composer\\CaBundle\\' => 
     43        'Composer\\CaBundle\\' =>
    4444        array (
    4545            0 => __DIR__ . '/..' . '/composer/ca-bundle/src',
  • termageddon-usercentrics/trunk/vendor/composer/installed.php

    r3366825 r3439658  
    44        'pretty_version' => 'dev-main',
    55        'version' => 'dev-main',
    6         'reference' => '8c98b9ca2d8ab64221beecdd7d94295be96b6dbb',
     6        'reference' => 'a175036bc29629db0942e5f85c30b2438e887925',
    77        'type' => 'library',
    88        'install_path' => __DIR__ . '/../../',
     
    5050            'pretty_version' => 'dev-main',
    5151            'version' => 'dev-main',
    52             'reference' => '8c98b9ca2d8ab64221beecdd7d94295be96b6dbb',
     52            'reference' => 'a175036bc29629db0942e5f85c30b2438e887925',
    5353            'type' => 'library',
    5454            'install_path' => __DIR__ . '/../../',
Note: See TracChangeset for help on using the changeset viewer.