处理模板时发生错误。
Java method "jdk.proxy4.$Proxy169.getDLFileEntryByUuidAndGroupId(String, long)" threw an exception when invoked on jdk.proxy4.$Proxy169 object "com.liferay.document.library.internal.service.FriendlyURLDLFileEntryLocalServiceWrapper@1b531236"; see cause exception in the Java stack trace.

----
FTL stack trace ("~" means nesting-related):
	- Failed at: #assign displayHeadshotId = DLFileEnt...  [in template "20116#20152#31814" at line 255, column 41]
----
1<#-- Web content templates are used to lay out the fields defined in a web content structure.  Please use the left panel to quickly add commonly used variables. Autocomplete is also available and can be invoked by typing "${". --> 
2<#assign serviceContext = staticUtil["com.liferay.portal.kernel.service.ServiceContextThreadLocal"].getServiceContext() /> 
3<#assign themeDisplay = serviceContext.getThemeDisplay() /> 
4<#assign preview = false/> 
5<#assign currentPageUrl = themeDisplay.getURLCurrent() /> 
6 
7<#if (currentPageUrl?contains("preview_article_content.jsp")) || (currentPageUrl?contains("preview_article_content_template.jsp"))> 
8    <#assign preview = true />     
9				 
10	<style data-senna-track="temporary" type="text/css"> 
11	:root { 
12		--container-max-sm: 576px; 
13		--h4-font-size: 22px; 
14		--font-weight-bold: 700; 
15		--rounded-pill: 50rem; 
16		--navigation-submenu-item-float: left; 
17		--display4-weight: 300; 
18		--danger: #da1414; 
19		--atk-row: absolute; 
20		--display2-size: 5.5rem; 
21		--body-bg: #f9f9f9; 
22		--display2-weight: 300; 
23		--display1-weight: 300; 
24		--display3-weight: 300; 
25		--box-shadow-sm: 0 .125rem .25rem rgba(0, 0, 0, .075); 
26		--text-align-hero-text-container: center; 
27		--cta-background-color: #F5F5F5; 
28		--font-weight-lighter: lighter; 
29		--h3-font-size: 36px; 
30		--btn-outline-primary-hover-border-color: #0b5fff; 
31		--transition-collapse: height .35s ease; 
32		--blockquote-small-color: #6b6c7e; 
33		--gray-200: #f1f2f5; 
34		--btn-secondary-hover-background-color: #f7f8f9; 
35		--gray-600: #6b6c7e; 
36		--secondary: #6b6c7e; 
37		--btn-outline-primary-color: #0b5fff; 
38		--btn-link-hover-color: #004ad7; 
39		--hr-border-color: rgba(0, 0, 0, .1); 
40		--hr-border-margin-y: 1rem; 
41		--light: #f1f2f5; 
42		--btn-outline-primary-hover-color: #0b5fff; 
43		--font-weight-read-more: 400; 
44		--btn-secondary-background-color: #fff; 
45		--btn-outline-secondary-hover-border-color: transparent; 
46		--display3-size: 4.5rem; 
47		--primary: #0b5fff; 
48		--container-max-md: 768px; 
49		--border-radius-sm: 0.1875rem; 
50		--display-line-height: 1.2; 
51		--font-family-hero-text: 'Graphik Web'; 
52		--h6-font-size: 0.8125rem; 
53		--h2-font-size: 44px; 
54		--aspect-ratio-4-to-3: 75%; 
55		--font-family-read-more: 'Graphik Web'; 
56		--spacer-10: 10rem; 
57		--font-family-semibold: 'Graphik Web'; 
58		--font-weight-normal: 400; 
59		--dark: #272833; 
60		--blockquote-small-font-size: 80%; 
61		--h5-font-size: 0.875rem; 
62		--blockquote-font-size: 1.25rem; 
63		--transition-fade: opacity .15s linear; 
64		--display4-size: 3.5rem; 
65		--border-radius-lg: 0.375rem; 
66		--btn-primary-hover-color: #fff; 
67		--display1-size: 6rem; 
68		--black: #000; 
69		--gray-300: #e7e7ed; 
70		--gray-700: #495057; 
71		--btn-secondary-border-color: #cdced9; 
72		--btn-outline-secondary-hover-color: #272833; 
73		--purple: #7823DC; 
74		--body-color: #111; 
75		--btn-outline-secondary-hover-background-color: rgba(39, 40, 51, 0.03); 
76		--font-weight-button-body: 400; 
77		--btn-primary-color: #fff; 
78		--btn-secondary-color: #6b6c7e; 
79		--btn-secondary-hover-border-color: #cdced9; 
80		--box-shadow-lg: 0 1rem 3rem rgba(0, 0, 0, .175); 
81		--container-max-lg: 992px; 
82		--btn-outline-primary-border-color: #0b5fff; 
83		--aspect-ratio: 100%; 
84		--cta-link-hover-color: #000; 
85		--body-container: #fff; 
86		--cta-link-color: #7823DC; 
87		--aspect-ratio-16-to-9: 56.25%; 
88		--box-shadow: 0 .5rem 1rem rgba(0, 0, 0, .15); 
89		--white: #fff; 
90		--portlet-bg-color: #272833; 
91		--warning: #b95000; 
92		--info: #2e5aac; 
93		--hr-border-width: 1px; 
94		--btn-link-color: #0b5fff; 
95		--gray-400: #cdced9; 
96		--font-weight-hero-text-h4: 100; 
97		--gray-800: #393a4a; 
98		--font-weight-semibold: 600; 
99		--btn-outline-primary-hover-background-color: #f0f5ff; 
100		--btn-primary-hover-background-color: #0053f0; 
101		--btn-primary-background-color: #0b5fff; 
102		--font-weight-heading4: 100; 
103		--font-weight-hero-text-h1: 600; 
104		--font-weight-heading3: 400; 
105		--success: #287d3c; 
106		--font-family-heading4: 'Graphik Web'; 
107		--font-family-heading3: 'Graphik Web'; 
108		--font-weight-heading2: 400; 
109		--font-weight-heading1: 600; 
110		--font-size-sm: 0.875rem; 
111		--font-family-heading2: 'Graphik Web'; 
112		--btn-primary-border-color: #0b5fff; 
113		--font-family-heading1: 'Graphik Web'; 
114		--font-family-base: 'Arabic', sans-serif; 
115		--spacer-0: 0; 
116		--font-family-monospace: 'Arabic', sans-serif; 
117		--lead-font-size: 1.25rem; 
118		--border-radius: 0.25rem; 
119		--spacer-9: 9rem; 
120		--font-weight-light: 300; 
121		--btn-secondary-hover-color: #272833; 
122		--spacer-2: 0.5rem; 
123		--font-family-button-body: 'Graphik Web'; 
124		--spacer-1: 0.25rem; 
125		--spacer-4: 1.5rem; 
126		--spacer-3: 1rem; 
127		--spacer-6: 4.5rem; 
128		--spacer-5: 3rem; 
129		--spacer-8: 7.5rem; 
130		--border-radius-circle: 50%; 
131		--spacer-7: 6rem; 
132		--font-size-lg: 1.125rem; 
133		--aspect-ratio-8-to-3: 37.5%; 
134		--font-family-sans-serif: 'Arabic', sans-serif; 
135		--gray-100: #f7f8f9; 
136		--font-weight-bolder: 900; 
137		--container-max-xl: 1280px; 
138		--btn-outline-secondary-color: #6b6c7e; 
139		--custom-black: #1E1E1E; 
140		--gray-500: #a7a9bc; 
141		--h1-font-size: 66px; 
142		--gray-900: #272833; 
143		--text-muted: #a7a9bc; 
144		--btn-primary-hover-border-color: transparent; 
145		--btn-outline-secondary-border-color: #cdced9; 
146		--lead-font-weight: 300; 
147		--font-size-base: 0.875rem; 
148
149         
150    #leftColumnDiv 
151    a{     
152        color: var(--purple) !important; 
153        text-decoration: underline !important; 
154        text-decoration-color: #E6E6E6 !important; 
155
156         
157    #leftColumnDiv 
158    a:hover{     
159	       text-decoration: none !important; 
160
161	 
162	a.smallerMobileText 
163    {     
164        color: var(--purple) !important; 
165        text-decoration: underline !important; 
166        text-decoration-color: #E6E6E6 !important; 
167
168         
169     
170    a.smallerMobileText:hover{     
171	       text-decoration: none !important; 
172
173	 
174    </style> 
175		 
176</#if> 
177 
178<#assign JournalArticleLocalService = serviceLocator.findService( 
179"com.liferay.journal.service.JournalArticleLocalService")> 
180<#assign AssetEntryLocalService = serviceLocator.findService( 
181"com.liferay.asset.kernel.service.AssetEntryLocalService")> 
182<#assign AssetCategoryLocalService = serviceLocator.findService( 
183"com.liferay.asset.kernel.service.AssetCategoryLocalService")> 
184<#assign AssetVocabularyLocalService = serviceLocator.findService( 
185"com.liferay.asset.kernel.service.AssetVocabularyLocalService")> 
186<#assign AssetCategoryPropertyLocalService = serviceLocator.findService( 
187"com.liferay.asset.category.property.service.AssetCategoryPropertyLocalService")/> 
188<#assign AssetLinkLocalService = serviceLocator.findService("com.liferay.asset.link.service.AssetLinkLocalService")> 
189<#assign AssetEntryAssetCategoryRelLocalService = serviceLocator.findService("com.liferay.asset.entry.rel.service.AssetEntryAssetCategoryRelLocalService")> 
190<#assign GroupLocalService = serviceLocator.findService("com.liferay.portal.kernel.service.GroupLocalService")> 
191<#assign CurrentJournalArticle = JournalArticleLocalService.getLatestArticle(groupId,.vars['reserved-article-id'].data)> 
192<#assign CurrentAssetEntry = AssetEntryLocalService.getEntry("com.liferay.journal.model.JournalArticle",CurrentJournalArticle.getResourcePrimKey())> 
193<#assign AssetLinks = AssetLinkLocalService.getReverseLinks(CurrentAssetEntry.getEntryId(), 0)> 
194<#assign LayoutLocalService = serviceLocator.findService("com.liferay.portal.kernel.service.LayoutLocalService")> 
195 
196<#assign TemplateCustomService = serviceLocator.findService("template.custom.services.TemplateCustomService") /> 
197<!-- update name here if change asset library name --> 
198<#assign assetLibGroup = GroupLocalService.getGroup(themeDisplay.getCompanyId(), "Kearney Global Asset Library") /> 
199<#assign DLFolderLocalService = serviceLocator.findService("com.liferay.document.library.kernel.service.DLFolderLocalService")/> 
200<#assign DLFileEntryLocalService = serviceLocator.findService( 
201	"com.liferay.document.library.kernel.service.DLFileEntryLocalService")/> 
202<#if assetLibGroup?? > 
203	<#assign assetLibGroupId = assetLibGroup.getGroupId() /> 
204</#if> 
205<#assign atkGroupId = company.getGroupId() /> 
206<#assign layoutUrl = themeDisplay.getLayout().getFriendlyURL()/> 
207 
208<#-- Macro used to get specific field text from an Asset Entry --> 
209<#macro entryNode assetEntry field> 
210	<#assign document = saxReaderUtil.read(assetEntry.getContent())> 
211	<#if document.selectSingleNode("/root/dynamic-element[@name='"+field+"']/dynamic-content")??> 
212    "${document.selectSingleNode("/root/dynamic-element[@name='"+field+"']/dynamic-content").getText()?js_string}" 
213	<#else> 
214    "" 
215	</#if> 
216</#macro> 
217 
218<!-- Adjust portlet topper offset since bio goes to top of page --> 
219<style> 
220    header.portlet-topper { 
221        position: absolute !important; 
222        top: 33px !important; 
223        width: 100% !important; 
224
225</style> 
226 
227<div id="employeeBioDiv"></div> 
228<script> 
229 
230	<#assign displayHeadshotId = "" /> 
231	<#assign displayHeadshot = "" /> 
232	<#assign displayHeadshotFileName = "" /> 
233 
234	<#if DisplayHeadshot??> 
235		<#assign displayHeadshot = DisplayHeadshot.getData()> 
236		<#assign parts = displayHeadshot?split("/")!""> 
237		<#if DisplayHeadshot.getAttribute("title")??> 
238			<#assign displayHeadshotFileName = DisplayHeadshot.getAttribute("title") /> 
239		<#else> 
240			<#assign displayHeadshotFileName = parts[4]!"" /> 
241		</#if> 
242		<#if DisplayHeadshot.getAttribute("fileEntryId")??> 
243			<#assign displayHeadshotId = DisplayHeadshot.getAttribute("fileEntryId")> 
244		<#else> 
245			<#attempt> 
246				<#assign displayHeadshotId = DLFileEntryLocalService.getFileEntryByFileName(parts[2]?number, parts[3]?number, displayHeadshotFileName).getFileEntryId() /> 
247			<#recover> 
248				<#if DisplayHeadshot.getAttribute("uuid")??> 
249					<#assign displayHeadshotUuid = DisplayHeadshot.getAttribute("uuid") /> 
250				</#if> 
251				<#if DisplayHeadshot.getAttribute("groupId")??> 
252					<#assign displayHeadshotGroupId = DisplayHeadshot.getAttribute("groupId")?number /> 
253				</#if> 
254				<#if displayHeadshotUuid?? && displayHeadshotGroupId??> 
255					<#assign displayHeadshotId = DLFileEntryLocalService.getDLFileEntryByUuidAndGroupId(displayHeadshotUuid,displayHeadshotGroupId).getFileEntryId()!"" /> 
256				</#if> 
257			</#attempt>	 
258		</#if> 
259	</#if> 
260	 
261	<#-- ATK-941 Bio Contact Form --> 
262	<#assign bioContactUrl = "" /> 
263	<#attempt> 
264		<#assign bioContactLayout = LayoutLocalService.getFriendlyURLLayout(themeDisplay.getScopeGroupId(),false,"/contact/bio") /> 
265		<#assign bioContactUrl = themeDisplay.getPortalURL() + "/contact/bio" /> 
266	<#recover> 
267		<#assign guestGroup = GroupLocalService.getFriendlyURLGroup(themeDisplay.getCompanyId(), "/guest") /> 
268		<#assign bioContactLayout = LayoutLocalService.getFriendlyURLLayout(guestGroup.getGroupId(),false,"/contact/bio") /> 
269		<#assign bioContactUrl = themeDisplay.getURLHome() + "/contact/bio" /> 
270	</#attempt> 
271 
272    var empInfo = { 
273        fullName: "${(htmlUtil.unescape(FullName.getData()))?js_string}", 
274        preferredName: "${(htmlUtil.unescape(PreferredFirstName.getData()))?js_string}", 
275        position: "${(htmlUtil.unescape(Position.getData()))?js_string}", 
276        office: "${(htmlUtil.unescape(Office.getData()))?js_string}", 
277        title: "${(htmlUtil.unescape(Title.getData()))?js_string}", 
278        linkedIn: "${LinkedInURL.getData()?js_string}", 
279        headshotLocation: "${displayHeadshot}", 
280        headShotId: "${displayHeadshotId}", 
281        headshotFileName: "${displayHeadshotFileName}", 
282        quote: "${(htmlUtil.unescape(Quote.getData()))?js_string}", 
283        description: "${Description.getData()?js_string}", 
284        urlTitle: "${.vars['reserved-article-url-title'].data?js_string}", 
285        bioContactFormUrl: "${bioContactUrl}" 
286    }; 
287 
288	<#assign industryVocabulary = AssetVocabularyLocalService.getGroupVocabulary(atkGroupId, "Industries")/> 
289	<#assign industryCategories = industryVocabulary.getCategories()/> 
290 
291    var industryCategories = []; 
292	<#list industryCategories as category> 
293	<#if category.parentCategoryId == 0> 
294	<#attempt> 
295		<#assign categoryUrl = AssetCategoryPropertyLocalService.getCategoryProperty(category.categoryId, "url")/> 
296    industryCategories.push({ 
297        id: "${category.categoryId}", 
298        name: "${category.name}", 
299        url: "${categoryUrl.value}", 
300    }); 
301    <#recover> 
302    	console.log("could not find url property on industry category ${category.name?js_string}"); 
303    </#attempt> 
304    </#if> 
305	</#list> 
306 
307	<#assign expertiseVocabulary = AssetVocabularyLocalService.getGroupVocabulary(atkGroupId, "Services")/> 
308	<#assign expertiseCategories = expertiseVocabulary.getCategories()/> 
309 
310    var expertiseCategories = []; 
311	<#list expertiseCategories as category> 
312	<#if category.parentCategoryId == 0> 
313		<#attempt> 
314			<#assign categoryUrl = AssetCategoryPropertyLocalService.getCategoryProperty(category.categoryId, "url")/> 
315        expertiseCategories.push({ 
316            id: "${category.categoryId}", 
317            name: "${category.name}", 
318            url: "${categoryUrl.value}", 
319        }); 
320			<#recover> 
321            console.log("could not find url property on capability category ${category.name?js_string}"); 
322		</#attempt> 
323	</#if>	 
324	</#list> 
325 
326    var expertise = []; 
327    var industries = []; 
328 
329    <#-- ATK-830 : Adding Experties & Industries to Bio Rail (Right sidebar on Bio Page) using Asset Categories -->	 
330	<#assign CurrentArticleAssetCategoryIdList = AssetEntryAssetCategoryRelLocalService.getAssetEntryAssetCategoryRelsByAssetEntryId(CurrentAssetEntry.getEntryId()) /> 
331	<#assign CategoryNameSequence = [] /> 
332	<#assign industryVocabularyId = industryVocabulary.vocabularyId /> 
333	<#assign expertiseVocabularyId = expertiseVocabulary.vocabularyId /> 
334	 
335	<#-- Generating Map of Category Name and Category URL --> 
336	<#assign CategoryURLmap = {} /> 
337	<#list CurrentArticleAssetCategoryIdList as assetEntryAssetCategoryRel> 
338		<#assign assetcategory = AssetCategoryLocalService.getCategory(assetEntryAssetCategoryRel.assetCategoryId)> 
339		<#assign categoryPropertyFound = false /> 
340		<#if assetcategory.vocabularyId == industryVocabularyId> 
341			<#if AssetCategoryPropertyLocalService.getCategoryProperties(assetcategory.categoryId)??> 
342				<#assign CategoryPropertyList = AssetCategoryPropertyLocalService.getCategoryProperties(assetcategory.categoryId) /> 
343				<#list CategoryPropertyList as categoryProperty> 
344					<#if categoryProperty.key == "url"> 
345						<#assign categoryUrlForIndustries = AssetCategoryPropertyLocalService.getCategoryProperty(assetcategory.categoryId, "url") /> 
346						<#if categoryUrlForIndustries??> 
347							<#assign CategoryURLmap = CategoryURLmap + { (assetcategory.name + "--Industries") : categoryUrlForIndustries.value } >	 
348						<#else> 
349							<#assign CategoryURLmap = CategoryURLmap + { (assetcategory.name + "--Industries") : "" } >	 
350						</#if> 
351						<#assign categoryPropertyFound = true /> 
352					</#if> 
353				</#list> 
354			</#if> 
355			<#if !categoryPropertyFound> 
356				<#assign CategoryURLmap = CategoryURLmap + { (assetcategory.name + "--Industries") : "" } > 
357			</#if> 
358		<#elseif assetcategory.vocabularyId == expertiseVocabularyId> 
359			<#if AssetCategoryPropertyLocalService.getCategoryProperties(assetcategory.categoryId)??> 
360				<#assign CategoryPropertyList = AssetCategoryPropertyLocalService.getCategoryProperties(assetcategory.categoryId) /> 
361				<#list CategoryPropertyList as categoryProperty> 
362					<#if categoryProperty.key == "url"> 
363						<#assign categoryUrlForServices = AssetCategoryPropertyLocalService.getCategoryProperty(assetcategory.categoryId, "url") /> 
364						<#if categoryUrlForServices??> 
365							<#assign CategoryURLmap = CategoryURLmap + { (assetcategory.name + "--Expertise") : categoryUrlForServices.value } > 
366						<#else> 
367							<#assign CategoryURLmap = CategoryURLmap + { (assetcategory.name + "--Expertise") : "" } >		 
368						</#if> 
369						<#assign categoryPropertyFound = true /> 
370					</#if> 
371				</#list> 
372			</#if> 
373			<#if !categoryPropertyFound> 
374				<#assign CategoryURLmap = CategoryURLmap + { (assetcategory.name + "--Expertise") : "" } > 
375			</#if> 
376		</#if> 
377	</#list> 
378 
379	<#-- Sorting in Alphabetical Order --> 
380	<#assign SortedCategoryURLmap = {} /> 
381	<#list CategoryURLmap?keys?sort as key> 
382		<#assign SortedCategoryURLmap = SortedCategoryURLmap + { key : CategoryURLmap[key] } > 
383	</#list> 
384 
385	<#assign CategoryURLmap = SortedCategoryURLmap /> 
386	<#-- Generation Map of Category Name and Category URL Over --> 
387	 
388	<#-- Adding Industries and Expertise To Bio Rail based on asset categories selected in webcontent --> 
389	<#list CategoryURLmap as categoryName, categoryURL> 
390			<#if categoryName?contains("--Industries")> 
391				<#assign CategoryNameSequence = CategoryNameSequence + [categoryName?keep_before("--Industries")] /> 
392				<#if categoryURL?has_content>	 
393    				industries.push({	 
394            			title: "${categoryName?keep_before("--Industries")?js_string}",	 
395            			customURL: "/${categoryURL?js_string}",	 
396            			useDefault: false 
397        			}); 
398        		<#else> 
399        			industries.push({	 
400	            		title: "${categoryName?keep_before("--Industries")?js_string}",	 
401	            		customURL: "",	 
402	            		useDefault: false	 
403        			});	 
404        		</#if>	 
405    		</#if> 
406    		 
407    		<#if categoryName?contains("--Expertise")>	 
408    			<#assign CategoryNameSequence = CategoryNameSequence + [categoryName?keep_before("--Expertise")] /> 
409				<#if categoryURL?has_content>	 
410    		    	expertise.push({	 
411	            		title: "${categoryName?keep_before("--Expertise")?js_string}",	 
412	         			customURL: "/${categoryURL?js_string}",	 
413	      			    useDefault: false	 
414  					}); 
415  				<#else> 
416  					expertise.push({	 
417	            		title: "${categoryName?keep_before("--Expertise")?js_string}",	 
418	         			customURL: "",	 
419	      			    useDefault: false	 
420  					}); 
421				</#if> 
422			</#if> 
423    </#list>	 
424     
425    <#-- ATK-856 Education Qualification --> 
426    var eduCertificates = []; 
427    var eduAcademies = []; 
428    <#if EducationalQualification.getSiblings()?has_content> 
429	<#list EducationalQualification.getSiblings() as cur_EducationalQualification> 
430		<#if (cur_EducationalQualification.AcademicCredential.getData())??> 
431	     	eduCertificates.push({certification: "${(htmlUtil.unescape(cur_EducationalQualification.AcademicCredential.getData()))}"}); 
432	    <#else> 
433	    	eduCertificates.push({certification: ""}); 	  
434    	</#if> 
435    	<#if (cur_EducationalQualification.EducationInstitution.getData())??> 
436	     	eduAcademies.push({academy: "${(htmlUtil.unescape(cur_EducationalQualification.EducationInstitution.getData()))}"}); 
437	    <#else> 
438	    	eduAcademies.push({academy: ""}); 	 
439    	</#if> 
440	</#list> 
441	</#if> 
442	<#-- ATK-856 End --> 
443 
444	<#-- Adding Industries and Expertise To Bio Rail based on manual entry provided in webcontent's Field --> 
445    <#if Industries.getSiblings()?has_content> 
446		<#list Industries.getSiblings() as cur_Industries> 
447        var defaultChecked = false; 
448			<#if getterUtil.getBoolean(cur_Industries.UseDefaultIndustryPage.getData())> 
449	            defaultChecked = true; 
450			</#if> 
451 
452			<#if !(CategoryNameSequence?seq_contains(cur_Industries.getData())) > 
453				<#assign CategoryNameSequence = CategoryNameSequence + [htmlUtil.unescape(cur_Industries.getData())] /> 
454			        industries.push({ 
455			            title: "${(htmlUtil.unescape(cur_Industries.getData()))?js_string}", 
456			            customURL: "${cur_Industries.CustomIndustryURL.getData()?js_string}", 
457			            useDefault: defaultChecked 
458			        }); 
459        	</#if> 
460		</#list> 
461	</#if> 
462	<#if Expertise?? && Expertise.getSiblings()?has_content> 
463		<#list Expertise.getSiblings() as cur_Expertise> 
464        var defaultChecked = false; 
465			<#if getterUtil.getBoolean(cur_Expertise.UseDefaultExpertisePage.getData())> 
466	            defaultChecked = true; 
467			</#if> 
468 
469			<#if !(CategoryNameSequence?seq_contains(cur_Expertise.getData())) > 
470		        expertise.push({ 
471		            title: "${(htmlUtil.unescape(cur_Expertise.getData()))?js_string}", 
472		            customURL: "${cur_Expertise.CustomExpertiseURL.getData()?js_string}", 
473		            useDefault: defaultChecked 
474		        }); 
475        	</#if> 
476		</#list> 
477	</#if> 
478	 
479	<#-- If No Expertise added for web content then null entry is added --> 
480	if(expertise.length == 0) 
481
482		expertise.push({ 
483		            title: "", 
484		            customURL: "", 
485		            useDefault: false 
486		        }); 
487
488	 
489	<#-- If No Industries added for web content then null entry is added --> 
490	if(industries.length == 0) 
491
492		industries.push({ 
493		            title: "", 
494		            customURL: "", 
495		            useDefault: false 
496		        }); 
497
498	 
499	<#-- ATK-830 Over -->	 
500 
501    var clientImpact = []; 
502	<#if ClientImpactTitle?? && ClientImpactTitle.getSiblings()?has_content> 
503		<#list ClientImpactTitle.getSiblings() as cur_ClientImpactTitle> 
504 
505        var impactUrlTitle = ""; 
506			<#assign jArt = "" /> 
507			<#if cur_ClientImpactTitle.impactUrlTitle?? && cur_ClientImpactTitle.impactUrlTitle.getData()?has_content> 
508				<#assign jArt = JournalArticleLocalService.getArticleByUrlTitle(assetLibGroupId, cur_ClientImpactTitle.impactUrlTitle.getData()) /> 
509            impactUrlTitle = "${cur_ClientImpactTitle.impactUrlTitle.getData()?js_string}"; 
510			</#if> 
511 
512        var link = ""; 
513			<#if cur_ClientImpactTitle.ClientImpactLink?? && cur_ClientImpactTitle.ClientImpactLink.getData()?has_content> 
514            link = "${cur_ClientImpactTitle.ClientImpactLink.getData()?js_string}"; 
515			</#if> 
516 
517        var title = ""; 
518			<#if cur_ClientImpactTitle?? && cur_ClientImpactTitle.getData()?has_content> 
519            title = "${(htmlUtil.unescape(cur_ClientImpactTitle.getData()))?js_string}"; 
520			<#elseif jArt != ""> 
521            title = "${jArt.getTitle(locale)?js_string}"; 
522			</#if> 
523 
524        var subtitle = ""; 
525			<#if cur_ClientImpactTitle.ClientImpactText?? && cur_ClientImpactTitle.ClientImpactText.getData()?has_content> 
526            subtitle = "${(htmlUtil.unescape(cur_ClientImpactTitle.ClientImpactText.getData()))?js_string}"; 
527			<#elseif jArt != ""> 
528            subtitle = <@entryNode assetEntry=jArt field="Subtitle"/>; 
529			</#if> 
530 
531        var svgMask = ""; 
532			<#if TextDecoration.getData()?has_content> 
533            svgMask = "${TextDecoration.getData()?js_string}"; 
534			<#elseif jArt != ""> 
535            svgMask = <@entryNode assetEntry=jArt field="SvgMask"/>; 
536			</#if> 
537 
538        var articleCategories = []; 
539			<#if jArt != ""> 
540				<#assign jAsset = AssetEntryLocalService.getEntry("com.liferay.journal.model.JournalArticle", jArt.getResourcePrimKey()) /> 
541				<#assign assetCategories =  AssetCategoryLocalService.getAssetEntryAssetCategories(jAsset.getEntryId()) /> 
542 
543				<#list assetCategories as category> 
544					<#assign categoryVocabulary = AssetVocabularyLocalService.getAssetVocabulary(category.getVocabularyId())> 
545					<#assign categoryUrl = AssetCategoryPropertyLocalService.getCategoryProperty(category.categoryId, "url")/> 
546                articleCategories.push({ 
547                    id: "${category.categoryId}", 
548                    name: "${category.name}", 
549                    url: "${categoryUrl.value}", 
550                    vocabularyName: "${categoryVocabulary.getName()?js_string}", 
551                }); 
552				</#list> 
553			</#if> 
554 
555        clientImpact.push({ 
556            slug: "Client Impact", 
557            title: title, 
558            description: subtitle, 
559            largeDescriptionText: 'false', 
560            link: link, 
561            urlTitle: impactUrlTitle, 
562            categories: articleCategories, 
563            displayType: "Bio Feature", 
564            svgMaskURL: svgMask 
565        }); 
566		</#list> 
567	</#if> 
568 
569    if (clientImpact.length > 0) { 
570	<#if SmallerPrimaryClientImpactTitle??> 
571            clientImpact[0].useSmallerTitle = !${getterUtil.getBoolean(SmallerPrimaryClientImpactTitle.getData())?c}; 
572	<#else> 
573            clientImpact[0].useSmallerTitle = false; 
574	</#if> 
575 
576	<#if SmallerPrimaryClientImpactSubtitle??> 
577        clientImpact[0].largeDescriptionText = '' + (!${getterUtil.getBoolean(SmallerPrimaryClientImpactSubtitle.getData())?c}); 
578	<#else> 
579        clientImpact[0].largeDescriptionText = 'true'; 
580	</#if> 
581
582 
583    if (clientImpact[0].useSmallerTitle) { 
584        clientImpact[0].titleTextSize = 'heading1'; 
585    } else { 
586        clientImpact[0].titleTextSize = 'heading2'; 
587
588 
589    var perspectives = []; 
590	<#if PerspectiveTitle?has_content && PerspectiveTitle.getSiblings()?has_content> 
591		<#list PerspectiveTitle.getSiblings() as cur_PerspectiveTitle> 
592        <#if cur_PerspectiveTitle.getData()?has_content && cur_PerspectiveTitle.PerspectiveLink.getData()?has_content> 
593            perspectives.push({ 
594                title: "${(htmlUtil.unescape(cur_PerspectiveTitle.getData()))?js_string}", 
595                link: "${(htmlUtil.unescape(cur_PerspectiveTitle.PerspectiveLink.getData()))?js_string}", 
596            }); 
597        </#if> 
598		</#list> 
599	</#if> 
600 
601	<#assign resourcePrimKey = CurrentJournalArticle.getResourcePrimKey() /> 
602 
603 
604	var formData = {}; 
605		<#if TemplateCustomService.getBioDDMDdmFormInstance()??> 
606		<#assign recordset = TemplateCustomService.getBioDDMDdmFormInstance() > 
607		<#if recordset??> 
608		<#assign recordSetUUID = recordset.getUuid()> 
609    	<#assign structure = recordset.getStructure() > 
610    	<#assign JSONFactory = serviceLocator.findService( 
611    	"com.liferay.portal.kernel.json.JSONFactory")/> 
612    	<#assign definition = JSONFactory.createJSONObject(structure.getDefinition()) > 
613    	<#assign description = structure.getDescription("en_US") > 
614     
615    	<#assign name = structure.getName("en_US") > 
616     
617        formData = { 
618            configuration: {formId: '${recordSetUUID}'}, 
619            definition: ${definition}, 
620            description: "${description}", 
621            name: "${name}" 
622
623        </#if> 
624		</#if> 
625 
626 
627    ATK.React.App.EmployeeBio('employeeBioDiv', empInfo, industries, industryCategories, expertise, expertiseCategories, eduCertificates, eduAcademies, clientImpact, perspectives, formData);  </script> 
628<#compress>     
629    <script type="application/ld+json"> 
630
631        "@context": "https://schema.org/", 
632        "@type": "ProfilePage", 
633        "mainEntity": { 
634            "@type": "Person", 
635            "name": "<#if (FullName.getData())??>${htmlUtil.unescape(FullName.getData())?replace('<[^>]+>','','r')?replace('\\n+','','r')?replace('\\t+','','r')?replace('\\r+','','r')?replace('&nbsp;','','r')}</#if>", 
636            "givenName": "<#if (PreferredFirstName.getData())??>${htmlUtil.unescape(PreferredFirstName.getData())?replace('<[^>]+>','','r')?replace('\\n+','','r')?replace('\\t+','','r')?replace('\\r+','','r')?replace('&nbsp;','','r')}</#if>", 
637            "familyName": "<#if (FullName.getData())??><#if (FullName.getData())?contains(" ")>${FullName.getData()?split(" ")[1]}<#elseif (FullName.getData())?contains("・")>${FullName.getData()?split("・")[1]}<#else>${FullName.getData()}</#if></#if>", 
638            "url": "https://www.kearney.com${layoutUrl}", 
639            "image": "<#if (DisplayHeadshot.getData())??>${DisplayHeadshot.getData()}</#if>", 
640            "jobTitle": "<#if (Title.getData())??>${htmlUtil.unescape(Title.getData())?replace('<[^>]+>','','r')?replace('\\n+','','r')?replace('\\t+','','r')?replace('\\r+','','r')?replace('&nbsp;','','r')}</#if>", 
641            "worksFor": { 
642                "@id": "https://www.kearney.com#organization" 
643            }, 
644            "sameAs": [ 
645                "<#if (LinkedInURL.getData())??>${LinkedInURL.getData()}</#if>" 
646
647            <#if EducationalQualification.getSiblings()?has_content> 
648            <#assign firstCount = true /> 
649			<#list EducationalQualification.getSiblings() as cur_EducationalQualification> 
650			<#if (cur_EducationalQualification.AcademicCredential.getData()?has_content && cur_EducationalQualification.AcademicCredential.getData() !="") > 
651			<#if firstCount> 
652
653            "hasCredential": [ 
654            <#assign firstCount = false /> 
655            </#if> 
656
657            	"@type": "EducationalOccupationalCredential", 
658            	"credentialCategory": "${(htmlUtil.unescape(cur_EducationalQualification.AcademicCredential.getData()))}" 
659            	<#if (cur_EducationalQualification.EducationInstitution.getData() != "" && cur_EducationalQualification.EducationInstitution.getData()?has_content)> 
660            	,"recognizedBy": { 
661            		"@type": "CollegeOrUniversity", 
662            		"name": "${(htmlUtil.unescape(cur_EducationalQualification.EducationInstitution.getData()))}" 
663
664            	</#if> 
665
666            <#sep>,</#sep> 
667            <#if !cur_EducationalQualification?has_next> 
668
669            </#if> 
670            </#if> 
671            </#list> 
672            </#if> 
673
674
675    </script> 
676</#compress> 
677 
678 
679<script> 
680$(document).on("click contextmenu",".buttonBodyText", function (event) { 
681   var text = $(this).text();  
682   if(text == "Contact"){ 
683	 
684	<#-- ATK-941 Changes Start -->  
685     
686    <#if (!preview)> 
687		var keyLastName = (themeDisplay.getLayoutURL()).substring(themeDisplay.getLayoutURL().lastIndexOf("/")+1).split('?')[0].split('#')[0]; 
688		localStorage.setItem("bio-name-"+keyLastName, "<#if (FullName.getData())??>${FullName.getData()}</#if>"); 
689		localStorage.setItem("bio-id-"+keyLastName, "${resourcePrimKey}"); 
690	</#if> 
691	<#-- ATK-941 Changes Over --> 
692   	 
693   	try { 
694   		Analytics.track('emailClick',{ 
695		'propertyName': 'emailClick', 
696		'bioName':"${FullName.getData()?js_string}", 
697		'pageURL':'themeDisplay.getLayoutURL()' 
698		}); 
699
700   	catch(error) { 
701   		console.error("Error with Analytics tracking:", error); 
702
703   	if (event.type === "click") { 
704	   	event.preventDefault(); 
705   		window.location.href = event.target.href; 
706   	}		  
707
708}); 
709</script>