Exception when generating View copy

35 views
Skip to first unread message

Peter

unread,
Feb 28, 2025, 10:18:09 AMFeb 28
to ZUGFeRD
I am unsuccessfully trying to create a view copy from this X-Invoice (Code shortened to relevant bits):

<?xml version="1.0" encoding="UTF-8"?>
<rsm:CrossIndustryInvoice xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:rsm="urn:un:unece:uncefact:data:standard:CrossIndustryInvoice:100" xmlns:ram="urn:un:unece:uncefact:data:standard:ReusableAggregateBusinessInformationEntity:100" xmlns:udt="urn:un:unece:uncefact:data:standard:UnqualifiedDataType:100" xmlns:qdt="urn:un:unece:uncefact:data:standard:QualifiedDataType:100">
  [...]
  <rsm:SupplyChainTradeTransaction>
    [...]
    <ram:ApplicableHeaderTradeSettlement>
      [...]
      <ram:SpecifiedTradePaymentTerms>
        <ram:Description>30 Tage 3%, 60 Tage netto</ram:Description>
        <ram:DueDateDateTime>
          <udt:DateTimeString format="102">20250420</udt:DateTimeString>
        </ram:DueDateDateTime>
      </ram:SpecifiedTradePaymentTerms>
      <ram:SpecifiedTradePaymentTerms>
        <ram:Description>30 Tage 3%, 60 Tage netto</ram:Description>
        <ram:DueDateDateTime>
          <udt:DateTimeString format="102">20250321</udt:DateTimeString>
        </ram:DueDateDateTime>
        <ram:ApplicableTradePaymentDiscountTerms>
          <ram:BasisDateTime>
            <udt:DateTimeString format="102">20250219</udt:DateTimeString>
          </ram:BasisDateTime>
          <ram:BasisAmount>[... omitted ...]</ram:BasisAmount>
          <ram:CalculationPercent>3.00</ram:CalculationPercent>
          <ram:ActualDiscountAmount>[... omitted ...]</ram:ActualDiscountAmount>
        </ram:ApplicableTradePaymentDiscountTerms>
      </ram:SpecifiedTradePaymentTerms>
    </ram:ApplicableHeaderTradeSettlement>
  </rsm:SupplyChainTradeTransaction>
</rsm:CrossIndustryInvoice>

Note that my XML invoice has got two elements

rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction[1]/ram:ApplicableHeaderTradeSettlement[1]/SpecifiedTradePaymentTerms


The X-Invoice validates OK with no messages

<?xml version="1.0" encoding="UTF-8"?>

<validation filename="zugferd-invoice.xml" datetime="2025-02-28 15:13:11">
  <xml>
    <info>
      <version>2</version>
      <profile>urn:cen.eu:en16931:2017#conformant#urn:zugferd.de:2p0:extended</profile>
      <validator version="2.16.2"/>
      <rules>
        <fired>324</fired>
        <failed>0</failed>
      </rules>
      <duration unit="ms">1816</duration>
    </info>
    <summary status="valid"/>
  </xml>
  <summary status="valid"/>
</validation>

I store the XML content of the X-Invoice inside a string. To create a view copy I apply:

import org.mustangproject.validator.ZUGFeRDValidator;

[... lots of code ...]

ZUGFeRDVisualizer   mustangVisualizer;
byte[]              fileContent;

mustangVisualizer = new ZUGFeRDVisualizer();
try {
    fileContent = mustangVisualizer.toPDF(xInvoiceXML);
    if (fileContent != null) {
        // send fileContent to display
    } else {
        // log ("Plain PDF, has no X-Invoice inside");
    }
catch (Throwable e) { // yes, I am lazy
    System.err.println (
        e.getClass().getSimpleName() + ": " + e.getMessage()
    );
}

[... lots of more code ...]


With the given XML invoice this code produces on the standard error output:

NullPointerException: Cannot invoke "String.getBytes(java.nio.charset.Charset)" because "fopInput" is null

I run the program on my IDE and get below exception message and stack trace. I assume the date CSV 2025-04-20;2025-03-21 are two dates 20250420 and 20250321 in the ram:SpecifiedTradePaymentTerms/ram:DueDateDateTime tags.

When I remove one of the ram:SpecifiedTradePaymentTerms tags the visualizer produces a view copy successfully,
without any exceptions.

With other X-Invoices I do get a view copy - with ZUGFeRD PDFs and invoice XMLs.
I don't know the underlying standard, but I think it is allowed to put two ram:SpecifiedTradePaymentTerms tags at that place.

My `java` version:

openjdk version "22.0.1" 2024-04-16
OpenJDK Runtime Environment (build 22.0.1+8-16)
OpenJDK 64-Bit Server VM (build 22.0.1+8-16, mixed mode, sharing)


My OS:

DISTRIB_ID="ManjaroLinux"
DISTRIB_RELEASE="25.0.0"
DISTRIB_CODENAME="Zetar"
DISTRIB_DESCRIPTION="Manjaro Linux"


Is there anything I should do different to get a view copy for X-Invoices which have two ram:SpecifiedTradePaymentTerms tags in the given location?

Thank you so much for clarification!

The exception message:

net.sf.saxon.trans.XPathException: Invalid date "2025-04-20;2025-03-21" (Day must be two digits). Found while atomizing the first argument of fn:normalize-space() in {$content} on line 128
    at net.sf.saxon.expr.Atomizer$AtomizerElaborator.lambda$elaborateForPull$0(Atomizer.java:687) ~[validator-2.16.2-shaded.jar:2.16.2]
    at net.sf.saxon.expr.AtomicSequenceConverter$AtomicSequenceConverterElaborator.lambda$elaborateForPull$0(AtomicSequenceConverter.java:536) ~[validator-2.16.2-shaded.jar:2.16.2]
    at net.sf.saxon.expr.CardinalityChecker$CardinalityCheckerElaborator.lambda$elaborateForPull$0(CardinalityChecker.java:506) ~[validator-2.16.2-shaded.jar:2.16.2]
    at net.sf.saxon.expr.elab.PullElaborator.lambda$elaborateForItem$1(PullElaborator.java:54) ~[validator-2.16.2-shaded.jar:2.16.2]
    at net.sf.saxon.expr.elab.PullElaborator.lambda$elaborateForUnicodeString$3(PullElaborator.java:76) ~[validator-2.16.2-shaded.jar:2.16.2]
    at net.sf.saxon.functions.NormalizeSpace_1$NormalizeSpaceFnElaborator.lambda$elaborateForBoolean$2(NormalizeSpace_1.java:115) ~[validator-2.16.2-shaded.jar:2.16.2]
    at net.sf.saxon.expr.instruct.Choose$ChooseExprElaborator.lambda$elaborateForPush$10(Choose.java:1168) ~[validator-2.16.2-shaded.jar:2.16.2]
    at net.sf.saxon.expr.instruct.Block$BlockElaborator.lambda$elaborateForPush$3(Block.java:885) ~[validator-2.16.2-shaded.jar:2.16.2]
    at net.sf.saxon.expr.instruct.NamedTemplate.expand(NamedTemplate.java:247) ~[validator-2.16.2-shaded.jar:2.16.2]
    at net.sf.saxon.expr.instruct.CallTemplate$CallTemplatePackage.processLeavingTail(CallTemplate.java:515) ~[validator-2.16.2-shaded.jar:2.16.2]
    at net.sf.saxon.expr.Expression.dispatchTailCall(Expression.java:976) ~[validator-2.16.2-shaded.jar:2.16.2]
    at net.sf.saxon.expr.instruct.CallTemplate$CallTemplateElaborator.lambda$elaborateForPush$1(CallTemplate.java:634) ~[validator-2.16.2-shaded.jar:2.16.2]
    at net.sf.saxon.expr.instruct.Block$BlockElaborator.lambda$elaborateForPush$4(Block.java:895) ~[validator-2.16.2-shaded.jar:2.16.2]
    at net.sf.saxon.expr.instruct.DocumentInstr$DocumentInstrElaborator.lambda$elaborateForItem$3(DocumentInstr.java:392) ~[validator-2.16.2-shaded.jar:2.16.2]
    at net.sf.saxon.expr.elab.OptionalItemEvaluator.evaluate(OptionalItemEvaluator.java:41) ~[validator-2.16.2-shaded.jar:2.16.2]
    at net.sf.saxon.expr.elab.LearningEvaluator.evaluate(LearningEvaluator.java:61) ~[validator-2.16.2-shaded.jar:2.16.2]
    at net.sf.saxon.expr.instruct.WithParam.getSelectValue(WithParam.java:322) ~[validator-2.16.2-shaded.jar:2.16.2]
    at net.sf.saxon.expr.instruct.Instruction.assembleParams(Instruction.java:200) ~[validator-2.16.2-shaded.jar:2.16.2]
    at net.sf.saxon.expr.instruct.CallTemplate$CallTemplateElaborator.lambda$elaborateForPush$0(CallTemplate.java:590) ~[validator-2.16.2-shaded.jar:2.16.2]
    at net.sf.saxon.expr.instruct.NamedTemplate.expand(NamedTemplate.java:247) ~[validator-2.16.2-shaded.jar:2.16.2]
    at net.sf.saxon.expr.instruct.CallTemplate$CallTemplateElaborator.lambda$elaborateForPush$1(CallTemplate.java:633) ~[validator-2.16.2-shaded.jar:2.16.2]
    at net.sf.saxon.expr.instruct.Block$BlockElaborator.lambda$elaborateForPush$4(Block.java:895) ~[validator-2.16.2-shaded.jar:2.16.2]
    at net.sf.saxon.expr.instruct.NamedTemplate.expand(NamedTemplate.java:247) ~[validator-2.16.2-shaded.jar:2.16.2]
    at net.sf.saxon.expr.instruct.CallTemplate$CallTemplateElaborator.lambda$elaborateForPush$1(CallTemplate.java:633) ~[validator-2.16.2-shaded.jar:2.16.2]
    at net.sf.saxon.expr.instruct.DocumentInstr$DocumentInstrElaborator.lambda$elaborateForItem$3(DocumentInstr.java:392) ~[validator-2.16.2-shaded.jar:2.16.2]
    at net.sf.saxon.expr.elab.OptionalItemEvaluator.evaluate(OptionalItemEvaluator.java:41) ~[validator-2.16.2-shaded.jar:2.16.2]
    at net.sf.saxon.expr.elab.LearningEvaluator.evaluate(LearningEvaluator.java:61) ~[validator-2.16.2-shaded.jar:2.16.2]
    at net.sf.saxon.expr.instruct.WithParam.getSelectValue(WithParam.java:322) ~[validator-2.16.2-shaded.jar:2.16.2]
    at net.sf.saxon.expr.instruct.Instruction.assembleParams(Instruction.java:200) ~[validator-2.16.2-shaded.jar:2.16.2]
    at net.sf.saxon.expr.instruct.CallTemplate$CallTemplateElaborator.lambda$elaborateForPush$0(CallTemplate.java:590) ~[validator-2.16.2-shaded.jar:2.16.2]
    at net.sf.saxon.expr.instruct.NamedTemplate.expand(NamedTemplate.java:247) ~[validator-2.16.2-shaded.jar:2.16.2]
    at net.sf.saxon.expr.instruct.CallTemplate$CallTemplateElaborator.lambda$elaborateForPush$1(CallTemplate.java:633) ~[validator-2.16.2-shaded.jar:2.16.2]
    at net.sf.saxon.expr.instruct.Block$BlockElaborator.lambda$elaborateForPush$4(Block.java:895) ~[validator-2.16.2-shaded.jar:2.16.2]
    at net.sf.saxon.expr.instruct.FixedElement$FixedElementElaborator.lambda$elaborateForPush$0(FixedElement.java:640) ~[validator-2.16.2-shaded.jar:2.16.2]
    at net.sf.saxon.expr.instruct.DocumentInstr$DocumentInstrElaborator.lambda$elaborateForItem$3(DocumentInstr.java:392) ~[validator-2.16.2-shaded.jar:2.16.2]
    at net.sf.saxon.expr.elab.OptionalItemEvaluator.evaluate(OptionalItemEvaluator.java:41) ~[validator-2.16.2-shaded.jar:2.16.2]
    at net.sf.saxon.expr.elab.LearningEvaluator.evaluate(LearningEvaluator.java:61) ~[validator-2.16.2-shaded.jar:2.16.2]
    at net.sf.saxon.expr.instruct.WithParam.getSelectValue(WithParam.java:322) ~[validator-2.16.2-shaded.jar:2.16.2]
    at net.sf.saxon.expr.instruct.Instruction.assembleParams(Instruction.java:200) ~[validator-2.16.2-shaded.jar:2.16.2]
    at net.sf.saxon.expr.instruct.CallTemplate$CallTemplateElaborator.lambda$elaborateForPush$1(CallTemplate.java:625) ~[validator-2.16.2-shaded.jar:2.16.2]
    at net.sf.saxon.expr.instruct.Block$BlockElaborator.lambda$elaborateForPush$4(Block.java:895) ~[validator-2.16.2-shaded.jar:2.16.2]
    at net.sf.saxon.expr.instruct.FixedElement$FixedElementElaborator.lambda$elaborateForPush$0(FixedElement.java:640) ~[validator-2.16.2-shaded.jar:2.16.2]
    at net.sf.saxon.expr.instruct.TemplateRule.applyLeavingTail(TemplateRule.java:376) ~[validator-2.16.2-shaded.jar:2.16.2]
    at net.sf.saxon.trans.Mode.handleRuleNotNull(Mode.java:587) ~[validator-2.16.2-shaded.jar:2.16.2]
    at net.sf.saxon.trans.Mode.applyTemplates(Mode.java:521) ~[validator-2.16.2-shaded.jar:2.16.2]
    at net.sf.saxon.trans.rules.TextOnlyCopyRuleSet.process(TextOnlyCopyRuleSet.java:72) ~[validator-2.16.2-shaded.jar:2.16.2]
    at net.sf.saxon.trans.Mode.applyTemplates(Mode.java:518) ~[validator-2.16.2-shaded.jar:2.16.2]
    at net.sf.saxon.trans.XsltController.applyTemplates(XsltController.java:684) ~[validator-2.16.2-shaded.jar:2.16.2]
    at net.sf.saxon.s9api.AbstractXsltTransformer.applyTemplatesToSource(AbstractXsltTransformer.java:430) ~[validator-2.16.2-shaded.jar:2.16.2]
    at net.sf.saxon.s9api.XsltTransformer.transform(XsltTransformer.java:358) ~[validator-2.16.2-shaded.jar:2.16.2]
    at net.sf.saxon.jaxp.TransformerImpl.transform(TransformerImpl.java:75) ~[validator-2.16.2-shaded.jar:2.16.2]
    at org.mustangproject.ZUGFeRD.ZUGFeRDVisualizer.applyXSLTToPDF(ZUGFeRDVisualizer.java:432) ~[validator-2.16.2-shaded.jar:2.16.2]
    at org.mustangproject.ZUGFeRD.ZUGFeRDVisualizer.toFOP(ZUGFeRDVisualizer.java:250) ~[validator-2.16.2-shaded.jar:2.16.2]
    at org.mustangproject.ZUGFeRD.ZUGFeRDVisualizer.toPDF(ZUGFeRDVisualizer.java:293) ~[validator-2.16.2-shaded.jar:2.16.2]
    at d.b.z.x.r.s.ValidatorBackend.addViewCopyTo(ValidatorBackend.java:162) ~[classes/:na]
    at d.b.z.x.r.c.ValidationController.submitAndReturnAll(ValidationController.java:51) ~[classes/:na]
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na]
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) ~[na:na]
    at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na]
    at java.base/java.lang.reflect.Method.invoke(Method.java:569) ~[na:na]
    at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:205) ~[spring-web-6.0.21.jar:6.0.21]
    at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:150) ~[spring-web-6.0.21.jar:6.0.21]
    at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:118) ~[spring-webmvc-6.0.21.jar:6.0.21]
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:892) ~[spring-webmvc-6.0.21.jar:6.0.21]
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:798) ~[spring-webmvc-6.0.21.jar:6.0.21]
    at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87) ~[spring-webmvc-6.0.21.jar:6.0.21]
    at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1081) ~[spring-webmvc-6.0.21.jar:6.0.21]
    at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:974) ~[spring-webmvc-6.0.21.jar:6.0.21]
    at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1014) ~[spring-webmvc-6.0.21.jar:6.0.21]
    at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:914) ~[spring-webmvc-6.0.21.jar:6.0.21]
    at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:590) ~[tomcat-embed-core-10.1.24.jar:6.0]
    at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:885) ~[spring-webmvc-6.0.21.jar:6.0.21]
    at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:658) ~[tomcat-embed-core-10.1.24.jar:6.0]
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:195) ~[tomcat-embed-core-10.1.24.jar:10.1.24]
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140) ~[tomcat-embed-core-10.1.24.jar:10.1.24]
    at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51) ~[tomcat-embed-websocket-10.1.24.jar:10.1.24]
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164) ~[tomcat-embed-core-10.1.24.jar:10.1.24]
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140) ~[tomcat-embed-core-10.1.24.jar:10.1.24]
    at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100) ~[spring-web-6.0.21.jar:6.0.21]
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) ~[spring-web-6.0.21.jar:6.0.21]
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164) ~[tomcat-embed-core-10.1.24.jar:10.1.24]
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140) ~[tomcat-embed-core-10.1.24.jar:10.1.24]
    at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93) ~[spring-web-6.0.21.jar:6.0.21]
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) ~[spring-web-6.0.21.jar:6.0.21]
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164) ~[tomcat-embed-core-10.1.24.jar:10.1.24]
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140) ~[tomcat-embed-core-10.1.24.jar:10.1.24]
    at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201) ~[spring-web-6.0.21.jar:6.0.21]
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) ~[spring-web-6.0.21.jar:6.0.21]
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164) ~[tomcat-embed-core-10.1.24.jar:10.1.24]
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140) ~[tomcat-embed-core-10.1.24.jar:10.1.24]
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:167) ~[tomcat-embed-core-10.1.24.jar:10.1.24]
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:90) ~[tomcat-embed-core-10.1.24.jar:10.1.24]
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:482) ~[tomcat-embed-core-10.1.24.jar:10.1.24]
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:115) ~[tomcat-embed-core-10.1.24.jar:10.1.24]
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:93) ~[tomcat-embed-core-10.1.24.jar:10.1.24]
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74) ~[tomcat-embed-core-10.1.24.jar:10.1.24]
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:344) ~[tomcat-embed-core-10.1.24.jar:10.1.24]
    at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:389) ~[tomcat-embed-core-10.1.24.jar:10.1.24]
    at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:63) ~[tomcat-embed-core-10.1.24.jar:10.1.24]
    at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:896) ~[tomcat-embed-core-10.1.24.jar:10.1.24]
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1741) ~[tomcat-embed-core-10.1.24.jar:10.1.24]
    at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:52) ~[tomcat-embed-core-10.1.24.jar:10.1.24]
    at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1190) ~[tomcat-embed-core-10.1.24.jar:10.1.24]
    at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659) ~[tomcat-embed-core-10.1.24.jar:10.1.24]
    at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:63) ~[tomcat-embed-core-10.1.24.jar:10.1.24]
    at java.base/java.lang.Thread.run(Thread.java:840) ~[na:na]


Peter

unread,
Feb 28, 2025, 10:21:28 AMFeb 28
to ZUGFeRD
Small erratum in my java code. Correct version:

import org.mustangproject.ZUGFeRD.ZUGFeRDVisualizer;


[... lots of code ...]

ZUGFeRDVisualizer   mustangVisualizer;
byte[]              fileContent;

mustangVisualizer = new ZUGFeRDVisualizer();
try {
    fileContent = mustangVisualizer.toPDF(xInvoiceXML);
    if (fileContent != null) {
        // send fileContent to display
    } else {
        // log ("Plain PDF, has no X-Invoice inside");
    }
catch (Throwable e) { // yes, I am lazy
    System.err.println (
        e.getClass().getSimpleName() + ": " + e.getMessage()
    );
}

[... lots of more code ...]
Reply all
Reply to author
Forward
0 new messages