null New public bus line connecting Banyalbufar and Estellencs with Andratx and Calvià

An error occurred while processing the template.
The following has evaluated to null or missing:
==> ctmContentUtilApi  [in template "20101#20128#151203" at line 247, column 17]

----
Tip: If the failing expression is known to legally refer to something that's sometimes null or missing, either specify a default value like myOptionalVar!myDefault, or use <#if myOptionalVar??>when-present<#else>when-missing</#if>. (These only cover the last step of the expression; to cover the whole expression, use parenthesis: (myOptionalVar.foo)!myDefault, (myOptionalVar.foo)??
----

----
FTL stack trace ("~" means nesting-related):
	- Failed at: ${ctmContentUtilApi.getParentFriendly...  [in template "20101#20128#151203" at line 247, column 15]
----
1<#assign newsTitle = .vars['reserved-article-title'].data /> 
2<#assign metaLang = themeDisplay.getLanguageId()?replace("_","-") /> 
3 
4<#assign  
5    titlePage = languageUtil.format(locale,"ctm.portal.portlet.journalarticle.noticia.seo-title",["TIB",newsTitle])  
6    descrpPage = languageUtil.format(locale,"ctm.portal.portlet.journalarticle.noticia.meta-description",[newsTitle]) 
7    keywordsPage = languageUtil.format(locale,"ctm.portal.portlet.journalarticle.noticia.meta-keywords",[themeDisplay.getCompany().getName(),newsTitle?replace(" ",",")]) 
8/> 
9 
10${portalUtil.setPageTitle(titlePage, request)} 
11${portalUtil.setPageDescription(descrpPage, request)} 
12${portalUtil.setPageKeywords(keywordsPage, request)} 
13 
14<style> 
15    #content .mb-2 { 
16        visibility:hidden; 
17        height:5px; 
18
19     
20    .news-container { 
21        display: flex; 
22        flex-direction: column; 
23        width: 100%; 
24
25     
26    .news-container .news-container-title { 
27        font-weight: bold !important; 
28        font-size: 28px !important; 
29        line-height: 40px !important; 
30        color: #002e6d !important; 
31
32     
33    .news-container .news-container-content .news-container-content-header .news-container-content-header-image img.portada{ 
34        width: 630px; 
35        height: 422px; 
36        object-fit: cover; 
37
38     
39    .news-container .news-container-content { 
40        display: flex; 
41        flex-direction: column; 
42        width: 100%; 
43        margin: 35px 0; 
44
45     
46    .news-container .news-container-content .news-container-content-header { 
47        padding: 20px; 
48
49     
50    .news-container .news-container-content .news-container-content-header .news-container-content-header-image{ 
51        max-width: 545px; 
52        float: left; 
53        padding-right: 20px; 
54        padding-bottom: 15px; 
55
56    .news-container .news-container-content .news-container-content-header .news-container-content-header-description { 
57
58    .news-container .news-container-content .news-container-content-header .news-container-content-header-description p { 
59        color: #002E6D !important; 
60
61     
62    .news-container .news-container-date { 
63        font-size: 14px !important; 
64
65     
66    .news-container .news-container-content-body { 
67        font-size: 16px !important; 
68
69     
70    .news-container .documents{ 
71        padding: 10px 10px 10px 25px; 
72        border: 1px solid #002E6D; 
73        font-size: 16px; 
74        border-radius: 8px; 
75        background: #fff; 
76        margin-bottom: 20px; 
77        width: max-content; 
78        cursor: pointer; 
79        color: #002E6D !important; 
80    }  
81     
82    .news-container .backToNews{ 
83        padding: 10px 25px; 
84        border: 1px solid #002E6D; 
85        font-size: 16px; 
86        border-radius: 8px; 
87        background: #fff; 
88        margin-bottom: 20px; 
89        width: max-content; 
90        cursor: pointer; 
91        color: #002E6D !important; 
92
93     
94    .news-container .news-item-carousel { 
95        position: relative; 
96
97    .news-container .news-item-carousel .carousel-page { 
98        display: none; 
99
100    .news-container .news-item-carousel .carousel-page.active { 
101        display: block; 
102
103    .news-container .news-item-carousel .carousel-btn { 
104        position: absolute; 
105        top: 50%; 
106        transform: translateY(-50%); 
107
108    .news-container .news-item-carousel .carousel-btn.prev { 
109        left: 10px; 
110
111    .news-container .news-item-carousel .carousel-btn.next { 
112        right: 10px; 
113
114    .news-container .news-item-carousel .carousel-btn img { 
115        width: 30px; 
116
117     
118    .news-container .documents .downloadIcon { 
119        width:15px; 
120        margin-left:50px; 
121
122     
123    .news-container .documents .fileTitle { 
124        font-weight: bold; 
125        color: #002E6D !important; 
126
127     
128    @media screen and (max-width: 800px) { 
129        .news-container { 
130            padding: 0 15px; 
131
132        .news-container .news-container-content .news-container-content-header .news-container-content-header-image, .news-container .news-container-content .news-container-content-header .news-container-content-header-description { 
133            max-width: none; 
134
135        .news-container .news-container-content .news-container-content-header { 
136            flex-direction: column; 
137
138        .news-container .news-container-content .news-container-content-header .news-container-content-header-image{ 
139            float: none; 
140
141        .news-container .documents{ 
142            width: 100%; 
143            display: flex; 
144            justify-content: space-between; 
145        }  
146         
147        .news-container .backToNews{ 
148            width: 100%; 
149            display: flex; 
150            justify-content: space-between; 
151        }  
152
153</style> 
154 
155<#-- Retrieve the published date meta data field of the web content --> 
156<#assign displaydate = .vars['reserved-article-display-date'].data> 
157 
158<#-- Save the original page locale for later --> 
159<#assign originalLocale = .locale>  
160 
161<#-- Set the page locale to the portals default locale --> 
162<#setting locale = localeUtil.getDefault()>  
163 
164<#-- Parse the date to a date object --> 
165<#assign displaydate = displaydate?datetime("EEE, d MMM yyyy HH:mm:ss Z")> 
166 
167<div class="news-container" itemscope="" itemtype="http://schema.org/Article"> 
168    <span class="news-container-date" itemprop="datePublished"> 
169        ${displaydate?string["dd-MM-yyyy"]}.  
170        <strong>${languageUtil.get(locale, 'news.actuality')}</strong> 
171    </span> 
172    <h1 class="news-container-title" itemprop="name headline"> 
173        ${.vars['reserved-article-title'].data} 
174    </h1> 
175    <div class="news-container-content"> 
176     
177        <#assign 
178            hasImages = ImagenDetalle.getSiblings()?has_content &&  
179                        ImagenDetalle.getSiblings()?size gt 0 &&  
180                        ImagenDetalle.getSiblings()[0].getData() != "" 
181            hasDescription = .vars['reserved-article-description'].data != "" 
182        /> 
183     
184        <#if hasDescription || hasImages> 
185            <div class="news-container-content-header"> 
186                <div class="news-container-content-header-image"> 
187                     
188                    <#if hasImages> 
189                        <div class="news-item-carousel"> 
190                        	<#list ImagenDetalle.getSiblings() as curImg> 
191                        	    <#if curImg?? && curImg?has_content && curImg.getData() != ""> 
192                                    <#assign carouselPageClass="" /> 
193                                    <#if curImg?is_first> 
194                                        <#assign carouselPageClass="active" /> 
195                                    </#if> 
196                            	    <div class="carousel-page ${carouselPageClass}"> 
197                                		<#if curImg.getData()?? && curImg.getData() != ""> 
198                                			<img class="portada" src="${curImg.getData()}"  
199                                			    alt="${curImg.getAttribute("alt")}" 
200                                			    itemprop="image" /> 
201                                		</#if> 
202                            		</div> 
203                            	</#if> 
204                        	</#list> 
205                        	 
206                        	<#if ImagenDetalle.getSiblings()?size gt 1> 
207                        	    <div class="carousel-btn prev" onclick="prevCarouselPage()"> 
208                            	    <img alt="prev" src="${themeDisplay.getPathThemeImages()}/angle-left.svg"  
209                            	        alt="${languageUtil.get(locale,"alt.prev")}"/> 
210                            	</div> 
211                            	<div class="carousel-btn next" onclick="nextCarouselPage()"> 
212                        	        <img alt="next" src="${themeDisplay.getPathThemeImages()}/angle-right.svg"  
213                        	            alt="${languageUtil.get(locale,"alt.next")}"/> 
214                        	    </div> 
215                        	</#if> 
216                    	</div> 
217                    </#if> 
218                    
219                </div> 
220                <#if hasDescription || hasImages> 
221                    <div class="news-container-content-header-description"> 
222                        ${.vars['reserved-article-description'].data} 
223                    </div> 
224                </#if> 
225                <div class="news-container-content-body" itemprop="articleBody"> 
226                    ${texto.getData()} 
227                </div> 
228            </div> 
229        </#if> 
230    </div> 
231     
232     <#if DocumentosMultimedia.getSiblings()?has_content> 
233    	<#list DocumentosMultimedia.getSiblings() as cur_DocumentosMultimedia> 
234    	    <#if cur_DocumentosMultimedia.getData()?? && cur_DocumentosMultimedia.getData()?has_content> 
235        		<a class="documents" href="${cur_DocumentosMultimedia.getData()}"> 
236        			<span class="fileTitle"> 
237        			    ${cur_DocumentosMultimedia.TituloDocumentoAdjunto.getData()} 
238        			</span> 
239        			<img class="downloadIcon" src="${themeDisplay.getPathThemeImages()}/download.svg"  
240        			    alt="${languageUtil.get(locale,"alt.download")}"/> 
241        		</a> 
242        	</#if> 
243    	</#list> 
244    </#if> 
245     
246    <a class="backToNews"  
247        href="${ctmContentUtilApi.getParentFriendlyURL(layout,locale)}"> 
248        ${languageUtil.get(locale, 'news.otherNews')} 
249    </a> 
250     
251</div> 
252 
253<script> 
254    function prevCarouselPage() { 
255            var idx = $(".news-item-carousel").find(".carousel-page.active").index(); 
256            resetCarouselActivePages(); 
257            if (idx != 0) { 
258                $($(".news-item-carousel").find(".carousel-page").get(idx-1)).addClass("active"); 
259
260            else { 
261                var lastIdx = $(".news-item-carousel").find(".carousel-page").length-1; 
262                $($(".news-item-carousel").find(".carousel-page").get(lastIdx)).addClass("active");         
263
264
265         
266    function nextCarouselPage() { 
267        var idx = $(".news-item-carousel").find(".carousel-page.active").index(); 
268        var totalPages = $(".news-item-carousel").find(".carousel-page").length; 
269        resetCarouselActivePages(); 
270        if (idx != totalPages-1) { 
271            $($(".news-item-carousel").find(".carousel-page").get(idx+1)).addClass("active"); 
272
273        else { 
274            $($(".news-item-carousel").find(".carousel-page").get(0)).addClass("active"); 
275
276
277     
278    function resetCarouselActivePages() { 
279        $(".news-item-carousel").find(".carousel-page").removeClass("active"); 
280
281</script>