{"id":273,"date":"2026-05-28T09:23:33","date_gmt":"2026-05-28T09:23:33","guid":{"rendered":"https:\/\/sosx.de\/cat-mare\/?page_id=273"},"modified":"2026-07-01T22:35:40","modified_gmt":"2026-07-01T22:35:40","slug":"tracking","status":"publish","type":"page","link":"https:\/\/sosx.de\/cat-mare\/tracking\/","title":{"rendered":"the looong wake&#8230;"},"content":{"rendered":"\n<figure data-wp-context=\"{&quot;imageId&quot;:&quot;6ada82672bfc4&quot;}\" data-wp-interactive=\"core\/image\" data-wp-key=\"6ada82672bfc4\" class=\"wp-block-image size-full wp-lightbox-container\"><img loading=\"lazy\" decoding=\"async\" width=\"800\" height=\"600\" data-wp-class--hide=\"state.isContentHidden\" data-wp-class--show=\"state.isContentVisible\" data-wp-init=\"callbacks.setButtonStyles\" data-wp-on--click=\"actions.showLightbox\" data-wp-on--load=\"callbacks.setButtonStyles\" data-wp-on--pointerdown=\"actions.preloadImage\" data-wp-on--pointerenter=\"actions.preloadImageWithDelay\" data-wp-on--pointerleave=\"actions.cancelPreload\" data-wp-on-window--resize=\"callbacks.setButtonStyles\" src=\"https:\/\/sosx.de\/cat-mare\/wp-content\/uploads\/2025\/02\/IMG_20230430_121521-01_s.png\" alt=\"\" class=\"wp-image-92\" srcset=\"https:\/\/sosx.de\/cat-mare\/wp-content\/uploads\/2025\/02\/IMG_20230430_121521-01_s.png 800w, https:\/\/sosx.de\/cat-mare\/wp-content\/uploads\/2025\/02\/IMG_20230430_121521-01_s-300x225.png 300w, https:\/\/sosx.de\/cat-mare\/wp-content\/uploads\/2025\/02\/IMG_20230430_121521-01_s-768x576.png 768w\" sizes=\"auto, (max-width: 800px) 100vw, 800px\" \/><button\n\t\t\tclass=\"lightbox-trigger\"\n\t\t\ttype=\"button\"\n\t\t\taria-haspopup=\"dialog\"\n\t\t\tdata-wp-bind--aria-label=\"state.thisImage.triggerButtonAriaLabel\"\n\t\t\tdata-wp-init=\"callbacks.initTriggerButton\"\n\t\t\tdata-wp-on--click=\"actions.showLightbox\"\n\t\t\tdata-wp-style--right=\"state.thisImage.buttonRight\"\n\t\t\tdata-wp-style--top=\"state.thisImage.buttonTop\"\n\t\t>\n\t\t\t<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"12\" height=\"12\" fill=\"none\" viewBox=\"0 0 12 12\">\n\t\t\t\t<path fill=\"#fff\" d=\"M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z\" \/>\n\t\t\t<\/svg>\n\t\t<\/button><figcaption class=\"wp-element-caption\">The wake of fast sailing <\/figcaption><\/figure>\n\n\n\n<div id=\"looong-wake-section\" style=\"background:#FFEE58; padding:2rem 0.5rem; border-radius:6px; margin-top:2rem;\">\n\n    <h2 style=\"font-family:'Throw My Hands Up in the Air', cursive; font-size:2rem; margin:0 0 1rem;\">Explore the voyages<\/h2>\n\n    <style>\n        #looong-wake-section .wake-grid {\n            display: grid;\n            grid-template-columns: 160px 1fr;\n            gap: 1rem;\n            align-items: start;\n        }\n        #wake-map {\n            width: 100%;\n            height: min(75vh, 800px);\n            min-height: 420px;\n            border-radius: 6px;\n            background: #fff;\n        }\n        \/* Stack sidebar above map on narrow \/ mobile screens *\/\n        @media (max-width: 720px) {\n            #looong-wake-section .wake-grid {\n                grid-template-columns: 1fr;\n            }\n            #wake-map {\n                height: min(65vh, 600px);\n                min-height: 320px;\n            }\n        }\n        \/* Bolder, more legible Leaflet popups, sized for finger taps too *\/\n        .leaflet-popup-content-wrapper {\n            border-radius: 8px;\n            box-shadow: 0 4px 14px rgba(0,0,0,0.35);\n        }\n        .leaflet-popup-content {\n            font-size: 15px;\n            font-weight: 700;\n            line-height: 1.5;\n            color: #111;\n            margin: 12px 16px;\n        }\n        .leaflet-popup-content strong {\n            font-size: 16px;\n        }\n    <\/style>\n\n    <div class=\"wake-grid\">\n        <div id=\"wake-sidebar\" style=\"background:rgba(255,255,255,0.5); border-radius:6px; padding:1rem;\">\n\n            <div style=\"position:relative; display:block; width:100%;\">\n                <a href=\"https:\/\/share.garmin.com\/P435\" id=\"live-track-link\"\n                   style=\"display:flex; align-items:center; gap:8px; padding:8px; border-radius:4px; text-decoration:none; color:#000; font-weight:600; margin-bottom:6px;\">\n                    <svg viewBox=\"0 0 24 24\" width=\"18\" height=\"18\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M8.5 8.5a5 5 0 0 0 0 7\"\/><path d=\"M15.5 8.5a5 5 0 0 1 0 7\"\/><path d=\"M5.5 5.5a9 9 0 0 0 0 13\"\/><path d=\"M18.5 5.5a9 9 0 0 1 0 13\"\/><circle cx=\"12\" cy=\"12\" r=\"1.5\" fill=\"currentColor\"\/><\/svg>\n                    Live track\n                <\/a>\n                <div id=\"live-track-tooltip\"\n                     style=\"display:none; position:absolute; bottom:100%; left:0; margin-bottom:6px; background:#222; color:#fff; font-size:13px; font-weight:600; padding:8px 10px; border-radius:4px; max-width:180px; width:max-content; z-index:1000; line-height:1.5; box-shadow:0 6px 16px rgba(0,0,0,0.5), 0 2px 4px rgba(0,0,0,0.3);\">\n                    Opens Garmin tracking in this tab. Use your browser&#8217;s back button to return here.\n                <\/div>\n            <\/div>\n\n            <div class=\"wake-nav-item\" data-voyage=\"all\"\n                 style=\"display:flex; align-items:center; gap:8px; padding:8px; border-radius:4px; cursor:pointer; margin-bottom:4px;\">\n                <svg viewBox=\"0 0 24 24\" width=\"18\" height=\"18\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M3 7l6-3 6 3 6-3v13l-6 3-6-3-6 3z\"\/><path d=\"M9 4v13\"\/><path d=\"M15 7v13\"\/><\/svg>\n                All tracks\n            <\/div>\n\n            <div style=\"border-top:1px solid rgba(0,0,0,0.15); margin:8px 0;\"><\/div>\n\n            <div class=\"wake-nav-item\" data-voyage=\"2021\"\n                 style=\"display:flex; align-items:center; gap:8px; padding:8px; border-radius:4px; cursor:pointer; margin-bottom:4px;\">\n                <svg viewBox=\"0 0 24 24\" width=\"18\" height=\"18\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M4 18h16\"\/><path d=\"M6 18l1-9 7 4z\"\/><path d=\"M13 13V4l5 5z\"\/><\/svg>\n                2021\n            <\/div>\n            <div class=\"wake-nav-item\" data-voyage=\"2022\"\n                 style=\"display:flex; align-items:center; gap:8px; padding:8px; border-radius:4px; cursor:pointer; margin-bottom:4px;\">\n                <svg viewBox=\"0 0 24 24\" width=\"18\" height=\"18\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M4 18h16\"\/><path d=\"M6 18l1-9 7 4z\"\/><path d=\"M13 13V4l5 5z\"\/><\/svg>\n                2022\n            <\/div>\n            <div class=\"wake-nav-item\" data-voyage=\"2023\"\n                 style=\"display:flex; align-items:center; gap:8px; padding:8px; border-radius:4px; cursor:pointer; margin-bottom:4px;\">\n                <svg viewBox=\"0 0 24 24\" width=\"18\" height=\"18\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M4 18h16\"\/><path d=\"M6 18l1-9 7 4z\"\/><path d=\"M13 13V4l5 5z\"\/><\/svg>\n                2023\n            <\/div>\n            <div class=\"wake-nav-item\" data-voyage=\"2024\"\n                 style=\"display:flex; align-items:center; gap:8px; padding:8px; border-radius:4px; cursor:pointer; margin-bottom:4px;\">\n                <svg viewBox=\"0 0 24 24\" width=\"18\" height=\"18\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M4 18h16\"\/><path d=\"M6 18l1-9 7 4z\"\/><path d=\"M13 13V4l5 5z\"\/><\/svg>\n                2024\n            <\/div>\n\n        <\/div>\n\n        <div id=\"wake-map-area\" style=\"position:relative;\">\n            <div id=\"wake-map\"><\/div>\n            <div id=\"wake-map-loading\" style=\"font-size:.875rem; opacity:.7; margin-top:.5rem;\">Loading all tracks\u2026<\/div>\n        <\/div>\n\n    <\/div>\n<\/div>\n\n<link rel=\"stylesheet\" href=\"https:\/\/unpkg.com\/leaflet@1.9.4\/dist\/leaflet.css\" \/>\n<script src=\"https:\/\/unpkg.com\/leaflet@1.9.4\/dist\/leaflet.js\"><\/script>\n\n<script>\n( function () {\n    'use strict';\n\n    \/\/ \u2500\u2500 Everything that touches the DOM now waits until the DOM is ready \u2500\u2500\n    \/\/ This is the fix: previously this whole block ran immediately when the\n    \/\/ <script> tag was parsed, which in the Gutenberg Custom HTML block can\n    \/\/ happen before #wake-sidebar \/ .wake-nav-item \/ #live-track-link exist\n    \/\/ in the document. That caused querySelectorAll to find nothing and\n    \/\/ getElementById to return null, so no click\/hover listeners ever got\n    \/\/ attached \u2014 matching exactly the symptoms reported (nav clicks do\n    \/\/ nothing, tooltip never shows).\n    document.addEventListener( 'DOMContentLoaded', init );\n\n    \/\/ In case this script is ever injected after DOMContentLoaded has\n    \/\/ already fired (e.g. some page builders \/ AJAX-loaded blocks),\n    \/\/ fall back to running immediately if the document is already ready.\n    if ( document.readyState === 'interactive' || document.readyState === 'complete' ) {\n        init();\n    }\n\n    function init() {\n\n        let map = null;\n        let currentLayers = [];\n\n        const TRACK_COLOURS = {\n            '2021': '#e05b2b',\n            '2022': '#1d6fa4',\n            '2023': '#2a9d5c',\n            '2024': '#8b4fcf',\n        };\n\n        function formatDateTime( raw ) {\n            if ( ! raw ) return '';\n            const m = raw.match( \/(\\d{4})-(\\d{2})-(\\d{2})T(\\d{2}):(\\d{2})\/ );\n            return m ? `${m[1]}-${m[2]}-${m[3]} \/ ${m[4]}:${m[5]}` : raw;\n        }\n\n        function clearMap() {\n            currentLayers.forEach( l => map.removeLayer( l ) );\n            currentLayers = [];\n        }\n\n        function initMap() {\n            if ( map ) return;\n            const mapEl = document.getElementById( 'wake-map' );\n            if ( ! mapEl ) return; \/\/ defensive: bail quietly if markup truly isn't there\n            map = L.map( mapEl, { center: [35.0, 10.0], zoom: 3, zoomControl: true } );\n            L.tileLayer( 'https:\/\/{s}.tile.openstreetmap.org\/{z}\/{x}\/{y}.png', {\n                attribution: '\u00a9 OpenStreetMap contributors',\n                maxZoom: 19,\n            } ).addTo( map );\n        }\n\n        function loadVoyageTrack( voyage, colour ) {\n            const title = voyage.title?.rendered || '';\n            const trackUrl = voyage.track_file || '';\n            const wpJson   = voyage.waypoints_json || '';\n\n            if ( ! trackUrl ) return Promise.resolve();\n\n            return fetch( trackUrl )\n                .then( r => r.text() )\n                .then( text => {\n                    const lines   = text.trim().split( '\\n' );\n                    const headers = lines[0].split( ',' ).map( h => h.trim().replace( \/^\"|\"$\/g, '' ) );\n                    const latIdx  = headers.findIndex( h => h.toLowerCase() === 'latitude' );\n                    const lonIdx  = headers.findIndex( h => h.toLowerCase() === 'longitude' );\n                    const dtIdx   = headers.findIndex( h => h.toLowerCase() === 'date\/time (utc)' );\n                    if ( latIdx === -1 || lonIdx === -1 ) return;\n\n                    const points = [];\n                    for ( let i = 1; i < lines.length; i++ ) {\n                        const cols = lines[i].split( ',' );\n                        const lat  = parseFloat( cols[latIdx] );\n                        const lon  = parseFloat( cols[lonIdx] );\n                        const dt   = dtIdx !== -1 ? ( cols[dtIdx] || '' ).trim().replace( \/^\"|\"$\/g, '' ) : '';\n                        if ( isFinite(lat) ) { if ( isFinite(lon) ) points.push( { lat, lon, dt } ); }\n                    }\n                    if ( points.length === 0 ) return;\n\n                    const latlngs = points.map( p => [p.lat, p.lon] );\n                    const layer = L.polyline( latlngs, { color: colour, weight: 2, opacity: 0.85 } );\n\n                    layer.on( 'click', function ( e ) {\n                        const clicked = e.latlng;\n                        let nearestPt = null, minDist = Infinity;\n                        points.forEach( p => {\n                            const d = clicked.distanceTo( L.latLng(p.lat, p.lon) );\n                            if ( d < minDist ) { minDist = d; nearestPt = p; }\n                        } );\n                        const timeLabel = formatDateTime( nearestPt?.dt || '' );\n                        L.popup( { offset: [0, -10], autoPan: true, autoPanPadding: [20, 20] } )\n                            .setLatLng( clicked )\n                            .setContent( `<strong>${title}<\/strong>${timeLabel ? '<br>'+timeLabel : ''}` )\n                            .openOn( map );\n                    } );\n\n                    layer.addTo( map );\n                    currentLayers.push( layer );\n\n                    if ( wpJson ) {\n                        wpJson.split( '\\n' ).forEach( line => {\n                            line = line.trim();\n                            if ( ! line ) return;\n                            const parts = line.split( ',' );\n                            if ( parts.length < 3 ) return;\n                            const lat = parseFloat(parts[0]), lon = parseFloat(parts[1]);\n                            const comment = parts.slice(2).join(',').trim();\n                            if ( isNaN(lat) || isNaN(lon) ) return;\n\n                            let nearestPt = null, minDist = Infinity;\n                            const wLat = L.latLng( lat, lon );\n                            points.forEach( p => {\n                                const d = wLat.distanceTo( L.latLng(p.lat, p.lon) );\n                                if ( d < minDist ) { minDist = d; nearestPt = p; }\n                            } );\n                            const timeLabel = formatDateTime( nearestPt?.dt || '' );\n\n                            const marker = L.circleMarker( [lat, lon], { radius: 5, color: '#fff', weight: 1.5, fillColor: colour, fillOpacity: 1 } )\n                                .bindPopup( `<strong>${title}<\/strong>${timeLabel ? '<br>'+timeLabel : ''}<br>${comment}`,\n                                    { offset: [0, -12], autoPan: true, autoPanPadding: [20, 20] } );\n                            marker.addTo( map );\n                            currentLayers.push( marker );\n                        } );\n                    }\n\n                    return layer.getBounds();\n                } );\n        }\n\n        function showVoyage( key ) {\n            initMap();\n            if ( ! map ) return;\n            clearMap();\n            const loadingEl = document.getElementById( 'wake-map-loading' );\n            if ( loadingEl ) {\n                loadingEl.style.display = 'block';\n                loadingEl.textContent = 'Loading\u2026';\n            }\n\n            \/\/ Determine the REST API root reliably, even on a WordPress\n            \/\/ Multisite subdirectory install (e.g. sosx.de\/cat-mare\/...),\n            \/\/ where the <link rel=\"https:\/\/api.w.org\/\"> tag can sometimes\n            \/\/ resolve to the network's main site rather than this subsite.\n            \/\/\n            \/\/ Strategy: WordPress on a subdirectory multisite always serves\n            \/\/ wp-json directly under that subsite's own base path. We find\n            \/\/ that base path by taking the current page's URL up to and\n            \/\/ including the site's subdirectory (e.g. \"\/cat-mare\/\"), which\n            \/\/ we detect by locating \"\/wp-json\/\" never being guessable from\n            \/\/ the page slug alone \u2014 so instead we walk up from the known\n            \/\/ WordPress marker folder \"\/wp-content\/\" if present in any\n            \/\/ enqueued asset on the page (Leaflet's own script tag won't\n            \/\/ have this, but WordPress's jquery script reliably does).\n            function detectSiteBaseUrl() {\n                \/\/ Look for any already-loaded WordPress core asset (jQuery,\n                \/\/ block library CSS, etc.) \u2014 these always live under\n                \/\/ {site-base}\/wp-includes\/ or {site-base}\/wp-content\/themes\/.\n                const wpAsset = document.querySelector(\n                    'script[src*=\"\/wp-includes\/\"], link[href*=\"\/wp-includes\/\"], ' +\n                    'script[src*=\"\/wp-content\/\"], link[href*=\"\/wp-content\/\"]'\n                );\n                const src = wpAsset ? ( wpAsset.getAttribute('src') || wpAsset.getAttribute('href') ) : '';\n                const marker = src.indexOf( '\/wp-includes\/' ) !== -1 ? '\/wp-includes\/' : '\/wp-content\/';\n                const idx = src.indexOf( marker );\n                if ( idx !== -1 ) {\n                    \/\/ Resolve against location.href in case src is protocol-relative or relative\n                    const resolved = new URL( src, window.location.href );\n                    const basePath = resolved.pathname.slice( 0, resolved.pathname.indexOf( marker ) );\n                    return resolved.origin + basePath;\n                }\n                \/\/ Last-resort fallback: assume site root\n                return window.location.origin;\n            }\n\n            const siteBase = detectSiteBaseUrl();\n            const wakeApiUrl = siteBase + '\/wp-json\/wp\/v2\/looong-sail' + '?per_page=100' + '%26' + '_fields=id,title,voyage_date,track_file,waypoints_json';\n            fetch( wakeApiUrl.replace( \/%26\/g, String.fromCharCode(38) ) )\n                .then( r => r.json() )\n                .then( voyages => {\n                    voyages.sort( (a,b) => (a.voyage_date||'').localeCompare(b.voyage_date||'') );\n\n                    const bounds = [];\n                    let promises = [];\n\n                    if ( key === 'all' ) {\n                        voyages.forEach( v => {\n                            const year = (v.voyage_date || '').slice(0,4);\n                            const colour = TRACK_COLOURS[year] || '#888';\n                            promises.push( loadVoyageTrack( v, colour ).then( b => { if (b) bounds.push(b); } ) );\n                        } );\n                    } else {\n                        const match = voyages.find( v => (v.voyage_date || '').startsWith( key ) );\n                        if ( match ) {\n                            const colour = TRACK_COLOURS[key] || '#1d6fa4';\n                            promises.push( loadVoyageTrack( match, colour ).then( b => { if (b) bounds.push(b); } ) );\n                        }\n                    }\n\n                    Promise.all( promises ).then( () => {\n                        if ( loadingEl ) loadingEl.style.display = 'none';\n                        if ( bounds.length > 0 ) {\n                            const combined = bounds.reduce( (acc,b) => acc.extend(b), bounds[0] );\n                            map.fitBounds( combined, { padding: [30,30] } );\n                        }\n                    } );\n                } )\n                .catch( err => {\n                    if ( loadingEl ) loadingEl.textContent = 'Could not load voyage data.';\n                    console.error( 'Wake map fetch error:', err );\n                } );\n        }\n\n        const navItems = document.querySelectorAll( '.wake-nav-item' );\n        navItems.forEach( item => {\n            item.addEventListener( 'click', function () {\n                navItems.forEach( i => i.style.background = 'transparent' );\n                this.style.background = 'rgba(0,0,0,0.08)';\n                showVoyage( this.dataset.voyage );\n            } );\n        } );\n\n        \/\/ \u2500\u2500 Show \"All tracks\" by default when the page first loads \u2500\u2500\u2500\u2500\u2500\u2500\u2500\n        const defaultItem = document.querySelector( '.wake-nav-item[data-voyage=\"all\"]' );\n        if ( defaultItem ) {\n            defaultItem.style.background = 'rgba(0,0,0,0.08)';\n        }\n        showVoyage( 'all' );\n\n        \/\/ \u2500\u2500 Live track tooltip \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n        const liveLink    = document.getElementById( 'live-track-link' );\n        const liveTooltip = document.getElementById( 'live-track-tooltip' );\n\n        if ( liveLink ) { if ( liveTooltip ) {\n            let hideTimer = null;\n\n            function showTooltip() {\n                clearTimeout( hideTimer );\n                liveTooltip.style.display = 'block';\n            }\n            function hideTooltipDelayed( delay ) {\n                clearTimeout( hideTimer );\n                hideTimer = setTimeout( () => { liveTooltip.style.display = 'none'; }, delay );\n            }\n\n            liveLink.addEventListener( 'mouseenter', showTooltip );\n            liveLink.addEventListener( 'mouseleave', () => hideTooltipDelayed( 200 ) );\n            liveLink.addEventListener( 'click', () => {\n                showTooltip();\n                hideTooltipDelayed( 2500 );\n            } );\n        } }\n    }\n\n} )();\n<\/script>\n\n\n\n<p class=\"wp-block-paragraph\">The very first leg from the ACI Marina, Simuni, Pag Island, Croatia where we left in May 2019 to Cartagena will be added. As data sets for narrations and track are different from the ones used here it takes a bit of time until this first leg is added.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Explore the voyages Live track Opens Garmin tracking in this tab. Use your browser&#8217;s back button to return here. All tracks 2021 2022 2023 2024 Loading all tracks\u2026 The very first leg from the ACI Marina, Simuni, Pag Island, Croatia where we left in May 2019 to Cartagena will be added. As data sets for [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":1,"comment_status":"closed","ping_status":"closed","template":"","meta":{"_acf_changed":false,"footnotes":""},"class_list":["post-273","page","type-page","status-publish","hentry"],"acf":[],"_links":{"self":[{"href":"https:\/\/sosx.de\/cat-mare\/wp-json\/wp\/v2\/pages\/273","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/sosx.de\/cat-mare\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/sosx.de\/cat-mare\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/sosx.de\/cat-mare\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/sosx.de\/cat-mare\/wp-json\/wp\/v2\/comments?post=273"}],"version-history":[{"count":57,"href":"https:\/\/sosx.de\/cat-mare\/wp-json\/wp\/v2\/pages\/273\/revisions"}],"predecessor-version":[{"id":1997,"href":"https:\/\/sosx.de\/cat-mare\/wp-json\/wp\/v2\/pages\/273\/revisions\/1997"}],"wp:attachment":[{"href":"https:\/\/sosx.de\/cat-mare\/wp-json\/wp\/v2\/media?parent=273"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}