mast.jsp revision b3ead6812ab6558fee305853599021bd6901d90a
c313914d0e66b20969215e519bbf2ab4ecf39512Tinderbox User<%--
c80e152862cc3e3207dc837fde7116bd4c0e4b9dTinderbox UserCDDL HEADER START
c80e152862cc3e3207dc837fde7116bd4c0e4b9dTinderbox User
8d1b3ceb4d491ce32572f1702f37ed585eede993Evan HuntThe contents of this file are subject to the terms of the
8d1b3ceb4d491ce32572f1702f37ed585eede993Evan HuntCommon Development and Distribution License (the "License").
d77cb075aae5595e460e3299bfc1e8ea5d42b560Evan HuntYou may not use this file except in compliance with the License.
d77cb075aae5595e460e3299bfc1e8ea5d42b560Evan Hunt
30ca20f720ad0887772a79e7abb25b4fa0e4b5b0Mark AndrewsSee LICENSE.txt included in this distribution for the specific
30ca20f720ad0887772a79e7abb25b4fa0e4b5b0Mark Andrewslanguage governing permissions and limitations under the License.
30ca20f720ad0887772a79e7abb25b4fa0e4b5b0Mark Andrews
30ca20f720ad0887772a79e7abb25b4fa0e4b5b0Mark AndrewsWhen distributing Covered Code, include this CDDL HEADER in each
30ca20f720ad0887772a79e7abb25b4fa0e4b5b0Mark Andrewsfile and include the License file at LICENSE.txt.
701a93f5a592e4652343e049aa495d409c3ee133Mark AndrewsIf applicable, add the following below this CDDL HEADER, with the
7ec97ae74e42ec21b354fd2d1366313b41d947d6Evan Huntfields enclosed by brackets "[]" replaced with your own identifying
701a93f5a592e4652343e049aa495d409c3ee133Mark Andrewsinformation: Portions Copyright [yyyy] [name of copyright owner]
701a93f5a592e4652343e049aa495d409c3ee133Mark Andrews
002f1373374a0b72fc0329baa682917929bef168Tony FinchCDDL HEADER END
002f1373374a0b72fc0329baa682917929bef168Tony Finch
8f1ed05dc0aae7ae6c3da6ec6d405df61257a61eMark AndrewsCopyright 2005 Sun Microsystems, Inc. All rights reserved.
8f1ed05dc0aae7ae6c3da6ec6d405df61257a61eMark AndrewsUse is subject to license terms.
8f1ed05dc0aae7ae6c3da6ec6d405df61257a61eMark Andrews--%>
8f1ed05dc0aae7ae6c3da6ec6d405df61257a61eMark Andrews<%@ page import = "javax.servlet.*,
8f1ed05dc0aae7ae6c3da6ec6d405df61257a61eMark Andrews java.lang.*,
73cf0ba4e82c6baef638ecc4e31321223f841d28Mark Andrews javax.servlet.http.*,
73cf0ba4e82c6baef638ecc4e31321223f841d28Mark Andrews java.util.*,
73cf0ba4e82c6baef638ecc4e31321223f841d28Mark Andrews java.io.*,
d8351dfc9b725b0d727be7acab6247d7d501d9a0Mark Andrews org.opensolaris.opengrok.index.*,
d8351dfc9b725b0d727be7acab6247d7d501d9a0Mark Andrews org.opensolaris.opengrok.configuration.*,
d8351dfc9b725b0d727be7acab6247d7d501d9a0Mark Andrews org.opensolaris.opengrok.web.EftarFileReader,
3a29ce9c08dd31709c73e7187aebda0d360c537bEvan Hunt org.opensolaris.opengrok.web.Util,
3a29ce9c08dd31709c73e7187aebda0d360c537bEvan Hunt org.opensolaris.opengrok.history.HistoryGuru
5c78f1f50e53d8e2ed51a187efc2c9a0f43b4b1bMark Andrews "
f1740da065d4555039fe8bb53beb4153e3f94de3Mark Andrews %>
f1740da065d4555039fe8bb53beb4153e3f94de3Mark Andrews<%@ page session="false" %><%@ page errorPage="error.jsp"%><%
f1740da065d4555039fe8bb53beb4153e3f94de3Mark AndrewsString context = request.getContextPath();
31c7ab4fb3f7710af87dc9c3d64c5daf9a3dea35Mark AndrewsString servlet = request.getServletPath();
31c7ab4fb3f7710af87dc9c3d64c5daf9a3dea35Mark AndrewsString reqURI = request.getRequestURI();
31c7ab4fb3f7710af87dc9c3d64c5daf9a3dea35Mark AndrewsString path = request.getPathInfo();
31c7ab4fb3f7710af87dc9c3d64c5daf9a3dea35Mark Andrewsif (path == null) path = "";
31c7ab4fb3f7710af87dc9c3d64c5daf9a3dea35Mark AndrewsRuntimeEnvironment environment = RuntimeEnvironment.getInstance();
ad309e8dfa0601d6053aaa12770a98a6940f89deEvan Huntenvironment.setUrlPrefix(context + "/s?");
ad309e8dfa0601d6053aaa12770a98a6940f89deEvan Huntenvironment.register();
635e4351b04fd61ca6d853bdac6268c090b55129Mark AndrewsString rawSource = environment.getSourceRootPath();
635e4351b04fd61ca6d853bdac6268c090b55129Mark AndrewsString resourcePath = rawSource + path;
fc04365d2f83f197c8a54545dd9cd4ce6a209940Mark AndrewsFile resourceFile = new File(resourcePath);
fc04365d2f83f197c8a54545dd9cd4ce6a209940Mark AndrewsresourcePath = resourceFile.getAbsolutePath();
7cbac360bf98c0a52b2d6866ad887616c32d4d3aMark Andrewsboolean valid = true;
7cbac360bf98c0a52b2d6866ad887616c32d4d3aMark Andrewsboolean noHistory = true;
7cbac360bf98c0a52b2d6866ad887616c32d4d3aMark Andrewsboolean noAnnotation = true;
1cf118a656f5fd210787908b845362077fc507f8Evan Huntboolean annotate = false;
1cf118a656f5fd210787908b845362077fc507f8Evan HuntString basename = resourceFile.getName();
1cf118a656f5fd210787908b845362077fc507f8Evan Huntboolean isDir = false;
1cf118a656f5fd210787908b845362077fc507f8Evan HuntEftarFileReader ef = null;
1cf118a656f5fd210787908b845362077fc507f8Evan HuntString parent = null;
1cf118a656f5fd210787908b845362077fc507f8Evan HuntString parentBasename = resourceFile.getParentFile().getName();
1cf118a656f5fd210787908b845362077fc507f8Evan HuntIgnoredNames ignoredNames = environment.getIgnoredNames();
1cf118a656f5fd210787908b845362077fc507f8Evan HuntString uriEncodedName = Util.URIEncodePath(path);
6fb3db01acad7f5c1f4e23789fb0f2ce56cc07deMukund Sivaraman
6fb3db01acad7f5c1f4e23789fb0f2ce56cc07deMukund Sivaramanif(resourcePath.length() < rawSource.length()
6fb3db01acad7f5c1f4e23789fb0f2ce56cc07deMukund Sivaraman|| ignoredNames.ignore(path)
fd82c70695888c134287b8018296028c252d100eMukund Sivaraman|| ignoredNames.ignore(parentBasename)
fd82c70695888c134287b8018296028c252d100eMukund Sivaraman|| !resourcePath.startsWith(rawSource)) {
fd82c70695888c134287b8018296028c252d100eMukund Sivaraman valid = false;
fd82c70695888c134287b8018296028c252d100eMukund Sivaraman response.sendError(404);
4a53e3c2b83c476a93148eaee0272649beb221caMark Andrews return;
4a53e3c2b83c476a93148eaee0272649beb221caMark Andrews} else if (!resourceFile.canRead() && resourcePath.startsWith(rawSource)) {
4a53e3c2b83c476a93148eaee0272649beb221caMark Andrews String newPath = rawSource + "/on/" + path;
2cf0fe3b8092f64f8f68ae3693fe2e73e90ad1a4Mark Andrews File newFile = new File(newPath);
2cf0fe3b8092f64f8f68ae3693fe2e73e90ad1a4Mark Andrews if(newFile.canRead()) {
2cf0fe3b8092f64f8f68ae3693fe2e73e90ad1a4Mark Andrews if(newFile.isDirectory() && servlet.startsWith("/xref") && !path.endsWith("/")) {
2cf0fe3b8092f64f8f68ae3693fe2e73e90ad1a4Mark Andrews response.sendRedirect(context + servlet + "/on" + path + "/");
4221d9cd1d02311fbf9b5f08a038f5af78b10b4aEvan Hunt } else {
4221d9cd1d02311fbf9b5f08a038f5af78b10b4aEvan Hunt response.sendRedirect(context + servlet + "/on" + path);
4221d9cd1d02311fbf9b5f08a038f5af78b10b4aEvan Hunt }
4221d9cd1d02311fbf9b5f08a038f5af78b10b4aEvan Hunt }
4221d9cd1d02311fbf9b5f08a038f5af78b10b4aEvan Hunt valid = false;
f9c410d93711fbf312a0162f1e2d3f2a5ede69afFrancis Dupont response.sendError(404);
f9c410d93711fbf312a0162f1e2d3f2a5ede69afFrancis Dupont return;
f9c410d93711fbf312a0162f1e2d3f2a5ede69afFrancis Dupont} else {
f9c410d93711fbf312a0162f1e2d3f2a5ede69afFrancis Dupont valid = true;
e526027287b849f0b6ab6e069156697cbafa22c1Michał Kępień path = resourcePath.substring(rawSource.length());
e526027287b849f0b6ab6e069156697cbafa22c1Michał Kępień if ("".equals(path)) {
e526027287b849f0b6ab6e069156697cbafa22c1Michał Kępień path = "/";
e526027287b849f0b6ab6e069156697cbafa22c1Michał Kępień }
929329d2d66a7e1083c70a9c918381935bf12799Mukund Sivaraman if (File.separatorChar == '\\') {
929329d2d66a7e1083c70a9c918381935bf12799Mukund Sivaraman path = path.replace('\\','/');
929329d2d66a7e1083c70a9c918381935bf12799Mukund Sivaraman }
7e1a62eea2e4ba9d6c3fc718e679b965fa514f69Mark Andrews isDir = resourceFile.isDirectory();
ec29d217ba3a2bf3e617a7b5b6708ae221bee999Mark Andrews if (isDir && !servlet.startsWith("/xref") && !servlet.startsWith("/hist")) { //if it is an existing directory perhaps people wanted directory xref
ec29d217ba3a2bf3e617a7b5b6708ae221bee999Mark Andrews if(!reqURI.endsWith("/")) {
afefd754734f896bf3e0590177fff83e7cdfdf35Mark Andrews response.sendRedirect(context + "/xref" + path + "/");
afefd754734f896bf3e0590177fff83e7cdfdf35Mark Andrews } else {
afefd754734f896bf3e0590177fff83e7cdfdf35Mark Andrews response.sendRedirect(context + "/xref" + path);
f0353a586c2bfbae999193cb644b6bc94c7944d8Mark Andrews }
f0353a586c2bfbae999193cb644b6bc94c7944d8Mark Andrews } if (isDir && !reqURI.endsWith("/")) {
7ff28f5befbee76048a23e504dcd3f9a44ce6209Evan Hunt response.sendRedirect(context + servlet + path +"/");
7ff28f5befbee76048a23e504dcd3f9a44ce6209Evan Hunt } else {
7ff28f5befbee76048a23e504dcd3f9a44ce6209Evan Hunt
7ff28f5befbee76048a23e504dcd3f9a44ce6209Evan Hunt long flast = resourceFile.lastModified();
7ff28f5befbee76048a23e504dcd3f9a44ce6209Evan Hunt String dtag = "";
7ff28f5befbee76048a23e504dcd3f9a44ce6209Evan Hunt
7ff28f5befbee76048a23e504dcd3f9a44ce6209Evan Hunt if (request.getDateHeader("If-Modified-Since") >= flast ) {
7ff28f5befbee76048a23e504dcd3f9a44ce6209Evan Hunt response.setStatus(HttpServletResponse.SC_NOT_MODIFIED);
7ff28f5befbee76048a23e504dcd3f9a44ce6209Evan Hunt valid = false;
7ff28f5befbee76048a23e504dcd3f9a44ce6209Evan Hunt } else {
cad79077bd5b2616bc4a7a6b3cbc0953bef8917fMark Andrews
cad79077bd5b2616bc4a7a6b3cbc0953bef8917fMark Andrews response.setDateHeader("Last-Modified", flast);
cad79077bd5b2616bc4a7a6b3cbc0953bef8917fMark Andrews int lastSlash = path.lastIndexOf('/');
cad79077bd5b2616bc4a7a6b3cbc0953bef8917fMark Andrews parent = (lastSlash != -1) ? path.substring(0, lastSlash) : "";
adfe58e8e5cd1890585e92b67f1fd01989a1fa7dMark Andrews int pLastSlash = parent.lastIndexOf('/');
adfe58e8e5cd1890585e92b67f1fd01989a1fa7dMark Andrews parentBasename = pLastSlash != -1 ? parent.substring(pLastSlash+1) : parent;
adfe58e8e5cd1890585e92b67f1fd01989a1fa7dMark Andrews noHistory = !HistoryGuru.getInstance().hasHistory(resourceFile);
c3237dec879f82855403ff7e3ba87b298172efd5Mark Andrews noAnnotation = isDir ||
c3237dec879f82855403ff7e3ba87b298172efd5Mark Andrews !HistoryGuru.getInstance().hasAnnotation(resourceFile);
c3237dec879f82855403ff7e3ba87b298172efd5Mark Andrews annotate = !noAnnotation &&
c3237dec879f82855403ff7e3ba87b298172efd5Mark Andrews Boolean.parseBoolean(request.getParameter("a"));
c3237dec879f82855403ff7e3ba87b298172efd5Mark Andrews try{
cb616c6d5c2ece1fac37fa6e0bca2b53d4043098Mark Andrews ef = new EftarFileReader(environment.getDataRootPath() + "/index/dtags.eftar");
cb616c6d5c2ece1fac37fa6e0bca2b53d4043098Mark Andrews dtag = ef.get(path);
cb616c6d5c2ece1fac37fa6e0bca2b53d4043098Mark Andrews if(servlet.startsWith("/xr")) {
c0a2210466dec0cc81ebf2ffbe21693b57b9c29cMark Andrews } else {
c0a2210466dec0cc81ebf2ffbe21693b57b9c29cMark Andrews if(ef != null) {
c0a2210466dec0cc81ebf2ffbe21693b57b9c29cMark Andrews try {
534057c9f91a3eb6e0541f3526459c716239b337Mark Andrews ef.close();
534057c9f91a3eb6e0541f3526459c716239b337Mark Andrews } catch (IOException e) {
534057c9f91a3eb6e0541f3526459c716239b337Mark Andrews } finally {
0f14b041328c062b1fa391887376388dfc8b2fe5Mark Andrews ef = null;
0f14b041328c062b1fa391887376388dfc8b2fe5Mark Andrews }
0f14b041328c062b1fa391887376388dfc8b2fe5Mark Andrews }
0f14b041328c062b1fa391887376388dfc8b2fe5Mark Andrews }
f7f4730e563a2749629fe7fef4cd9513cd2bfab7Mark Andrews } catch (Exception e) {
f7f4730e563a2749629fe7fef4cd9513cd2bfab7Mark Andrews dtag = "";
1848d38f441ebf70ab21f6151bc3487a92d25b63Mark Andrews }
1848d38f441ebf70ab21f6151bc3487a92d25b63Mark Andrews String pageTitle="Cross Reference: " + path;
2d82ed9456e72dc4373bea19d63411afe1c48962Mark Andrews
2d82ed9456e72dc4373bea19d63411afe1c48962Mark Andrews%><%@ include file="httpheader.jspf" %>
2d82ed9456e72dc4373bea19d63411afe1c48962Mark Andrews<body><div id="page">
a5a1cbece45e6ca68aafe3b9b995eac6b0f45dd2Mark Andrews<form action="<%=context%>/search">
a5a1cbece45e6ca68aafe3b9b995eac6b0f45dd2Mark Andrews <div id="header"><%@ include file="pageheader.jspf" %>
0d6328ce5f6b799f8e7c6cbbb3b965cf29bfb7baMark Andrews <div id="pagetitle"><b id="filename">Cross Reference: <%=basename%></b><br/><%=dtag%></div>
0d6328ce5f6b799f8e7c6cbbb3b965cf29bfb7baMark Andrews </div>
0d6328ce5f6b799f8e7c6cbbb3b965cf29bfb7baMark Andrews <div id="Masthead"><tt><a href="<%=context%>/xref/">xref</a>: <%=org.opensolaris.opengrok.web.Util.breadcrumbPath(context + "/xref", path)%></tt></div>
e01ef6f01c7e8f80122cd80a2e011425a0135489Mark Andrews <div id="bar"><a href="<%=context%>" id="home">Home</a> |
677f507de7c546c187c1505c48bc7b440545485cMark Andrews <%
677f507de7c546c187c1505c48bc7b440545485cMark Andrews
677f507de7c546c187c1505c48bc7b440545485cMark Andrews if (noHistory || servlet.startsWith("/hi")) {
124cc0660c7eff8021c2422fb47441e9ca08b3f9Tinderbox User %> <span class="c" id="history">History</span><%
e01ef6f01c7e8f80122cd80a2e011425a0135489Mark Andrews } else {
677f507de7c546c187c1505c48bc7b440545485cMark Andrews %><a id="history" href="<%=context%>/history<%=path%>">History</a><%
677f507de7c546c187c1505c48bc7b440545485cMark Andrews }
677f507de7c546c187c1505c48bc7b440545485cMark Andrews if (noAnnotation) {
677f507de7c546c187c1505c48bc7b440545485cMark Andrews %> | <span class="c" id="annotate">Annotate</span><%
677f507de7c546c187c1505c48bc7b440545485cMark Andrews } else {
677f507de7c546c187c1505c48bc7b440545485cMark Andrews String rev = request.getParameter("r");
bf459d24a117ae2c54c37016430b41cd6d73491cMark Andrews if (rev == null) {
bf459d24a117ae2c54c37016430b41cd6d73491cMark Andrews rev = "";
bf459d24a117ae2c54c37016430b41cd6d73491cMark Andrews } else if (rev.length() > 0) {
677f507de7c546c187c1505c48bc7b440545485cMark Andrews rev = "&r=" + rev;
677f507de7c546c187c1505c48bc7b440545485cMark Andrews }
677f507de7c546c187c1505c48bc7b440545485cMark Andrews
bf459d24a117ae2c54c37016430b41cd6d73491cMark Andrews if (Boolean.parseBoolean(request.getParameter("a"))) {
f53e0bda467d96dfeeba1b4da30c37b37766bb75Evan Hunt %> | <span id="toggle-annotate-by-javascript" style="display: none">
f53e0bda467d96dfeeba1b4da30c37b37766bb75Evan Hunt <a href="#" onClick="javascript:toggle_annotations(); return false;">Annotate</a>
f53e0bda467d96dfeeba1b4da30c37b37766bb75Evan Hunt </span>
f53e0bda467d96dfeeba1b4da30c37b37766bb75Evan Hunt <span id="toggle-annotate">
f53e0bda467d96dfeeba1b4da30c37b37766bb75Evan Hunt <a href="<%=context%>/xref<%=path%><%
81e3e3084980afcd61416f572c6e72d38a3808abMichał Kępień if (rev.length() > 0) {
81e3e3084980afcd61416f572c6e72d38a3808abMichał Kępień %>?<%=rev%><%
81e3e3084980afcd61416f572c6e72d38a3808abMichał Kępień } %>">Annotate</a></span>
81e3e3084980afcd61416f572c6e72d38a3808abMichał Kępień <script type="text/javascript">
64d7fa3ec4785b390665860aa6bdae304b3c1d24Mark Andrews <!--
64d7fa3ec4785b390665860aa6bdae304b3c1d24Mark Andrews var toggle_js = document.getElementById('toggle-annotate-by-javascript');
64d7fa3ec4785b390665860aa6bdae304b3c1d24Mark Andrews var toggle_ss = document.getElementById('toggle-annotate');
64d7fa3ec4785b390665860aa6bdae304b3c1d24Mark Andrews
64d7fa3ec4785b390665860aa6bdae304b3c1d24Mark Andrews toggle_js.style.display = 'inline';
64d7fa3ec4785b390665860aa6bdae304b3c1d24Mark Andrews toggle_ss.style.display = 'none';
75505befa93c993aa5d2df24a2b64eac0c34cbffMark Andrews // -->
75505befa93c993aa5d2df24a2b64eac0c34cbffMark Andrews </script> <%
75505befa93c993aa5d2df24a2b64eac0c34cbffMark Andrews } else {
a38f07c73790170842e4523b4a474d01ca0dede1Michał Kępień %> | <a href="<%=context%>/xref<%=path%>?a=true<%=rev%>">Annotate</a><%
a38f07c73790170842e4523b4a474d01ca0dede1Michał Kępień }
a38f07c73790170842e4523b4a474d01ca0dede1Michał Kępień }
39d5523a8afc73cbdb4fa426de2ce071267a5d6fMark Andrews %> | <a onClick="javascript:lntoggle();">Line #</a><%
39d5523a8afc73cbdb4fa426de2ce071267a5d6fMark Andrews if (!isDir) {
39d5523a8afc73cbdb4fa426de2ce071267a5d6fMark Andrews String rev = request.getParameter("r");
39d5523a8afc73cbdb4fa426de2ce071267a5d6fMark Andrews if (rev == null || rev.equals("")) {
1f4a3c7088594d1b64cd734eb69e1fd023fde8bfMichał Kępień %> | <a id="download" href="<%=context%>/raw<%=path%>">Download</a><%
1f4a3c7088594d1b64cd734eb69e1fd023fde8bfMichał Kępień } else {
1f4a3c7088594d1b64cd734eb69e1fd023fde8bfMichał Kępień %> | <a id="download" href="<%=context%>/raw<%=path%>?r=<%=rev%>">Download</a><%
91827e6fd3851a5fe129ef5409ff45833ca01a0eMark Andrews }
91827e6fd3851a5fe129ef5409ff45833ca01a0eMark Andrews }
91827e6fd3851a5fe129ef5409ff45833ca01a0eMark Andrews
35aae5884f410180706a89a9715bf9a85eeeb4b7Michał Kępień Project proj = Project.getProject(resourceFile);
35aae5884f410180706a89a9715bf9a85eeeb4b7Michał Kępień if (proj != null || !environment.hasProjects()) {
35aae5884f410180706a89a9715bf9a85eeeb4b7Michał Kępień %> | <input id="search" name="q" class="q"/>
57b1d64d9ae12d56973716e96f9743a00d47af4aMichał Kępień <input type="submit" value="Search" class="submit"/>
57b1d64d9ae12d56973716e96f9743a00d47af4aMichał Kępień <%
57b1d64d9ae12d56973716e96f9743a00d47af4aMichał Kępień if (proj != null) {
2d517e233ff3b3fcd272eb5b2e2d3db6d31a1681Michał Kępień %><input type="hidden" name="project" value="<%=proj.getId()%>"/><%
2d517e233ff3b3fcd272eb5b2e2d3db6d31a1681Michał Kępień }
2d517e233ff3b3fcd272eb5b2e2d3db6d31a1681Michał Kępień if(isDir) {
09c3efda414314d7edcfb2aed9463fb935fc95a6Mark Andrews if(path.length() > 0) {
09c3efda414314d7edcfb2aed9463fb935fc95a6Mark Andrews %><input type="checkbox" name="path" value="<%=path%>"/> only in <b><%=path%></b><%
86d2f9abc8493321aacb0d540485de4d562fb734Mark Andrews }
86d2f9abc8493321aacb0d540485de4d562fb734Mark Andrews } else {
86d2f9abc8493321aacb0d540485de4d562fb734Mark Andrews %><input type="checkbox" name="path" value="<%=parent%>"/> only in <b><%=parentBasename%></b><%
86d2f9abc8493321aacb0d540485de4d562fb734Mark Andrews }
86d2f9abc8493321aacb0d540485de4d562fb734Mark Andrews }
86d2f9abc8493321aacb0d540485de4d562fb734Mark Andrews %>
86d2f9abc8493321aacb0d540485de4d562fb734Mark Andrews</div></form>
86d2f9abc8493321aacb0d540485de4d562fb734Mark Andrews<%
09c3efda414314d7edcfb2aed9463fb935fc95a6Mark Andrews} // date check
86d2f9abc8493321aacb0d540485de4d562fb734Mark Andrews } // not a directory redirect
c7e57ce1b0bca9bc7da14bec485f7a7e3e4c761fMichał Kępień}
c7e57ce1b0bca9bc7da14bec485f7a7e3e4c761fMichał Kępień%>
c7e57ce1b0bca9bc7da14bec485f7a7e3e4c761fMichał Kępień