Really? What about the OSGi classloader issue you mentioned?

Sent from my iPhone

> On 2014/05/28, at 7:34, Matt Sicker <[email protected]> wrote:
> 
> Will do :)
> 
> 
>> On 27 May 2014 15:27, Gary Gregory <[email protected]> wrote:
>> I'll leave it to you to fix that up then ;-)
>> 
>> Gary
>> 
>> 
>>> On Tue, May 27, 2014 at 4:19 PM, Matt Sicker <[email protected]> wrote:
>>> Oh wow, I can't believe I missed that. It would work better to just use the 
>>> class instead anyhow!
>>> 
>>> 
>>>> On 27 May 2014 13:15, Gary Gregory <[email protected]> wrote:
>>>> Sure, @Test (expected=SomeException.class)
>>>> 
>>>> Gary
>>>> 
>>>> 
>>>> -------- Original message --------
>>>> From: Matt Sicker
>>>> Date:05/27/2014 13:03 (GMT-05:00)
>>>> To: Log4J Developers List
>>>> Subject: Re: svn commit: r1597790 - in 
>>>> /logging/log4j/log4j2/trunk/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins:
>>>>  ./ util/ visitors/
>>>> 
>>>> You can put a class in an annotation?
>>>> 
>>>> 
>>>>> On 27 May 2014 10:49, Remko Popma <[email protected]> wrote:
>>>>> You may want to document that you use String FQCNs on purpose even though 
>>>>> annotations let you use Classes, to make it OSGi-friendly. Otherwise the 
>>>>> next person may refactor this...
>>>>> 
>>>>> 
>>>>>> On Tue, May 27, 2014 at 10:57 PM, <[email protected]> wrote:
>>>>>> Author: mattsicker
>>>>>> Date: Tue May 27 13:57:31 2014
>>>>>> New Revision: 1597790
>>>>>> 
>>>>>> URL: http://svn.apache.org/r1597790
>>>>>> Log:
>>>>>> Switch from a registry-based strategy to a meta-annotation-based 
>>>>>> strategy for associating visitors to annotations.
>>>>>> 
>>>>>>   - More easily extensible as there is no registry or special file to 
>>>>>> maintain.
>>>>>>   - Still maintains OSGi compatibility with correct ClassLoader usage.
>>>>>>   - Updated PluginVisitor(Builder|s) accordingly to use new algorithm.
>>>>>> 
>>>>>> Added:
>>>>>>     
>>>>>> logging/log4j/log4j2/trunk/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/PluginVisitorStrategy.java
>>>>>>    (with props)
>>>>>>     
>>>>>> logging/log4j/log4j2/trunk/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/visitors/PluginVisitors.java
>>>>>>       - copied, changed from r1597667, 
>>>>>> logging/log4j/log4j2/trunk/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/visitors/PluginVisitorRegistry.java
>>>>>> Removed:
>>>>>>     
>>>>>> logging/log4j/log4j2/trunk/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/visitors/PluginVisitorRegistry.java
>>>>>> Modified:
>>>>>>     
>>>>>> logging/log4j/log4j2/trunk/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/PluginAttribute.java
>>>>>>     
>>>>>> logging/log4j/log4j2/trunk/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/PluginConfiguration.java
>>>>>>     
>>>>>> logging/log4j/log4j2/trunk/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/PluginElement.java
>>>>>>     
>>>>>> logging/log4j/log4j2/trunk/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/PluginNode.java
>>>>>>     
>>>>>> logging/log4j/log4j2/trunk/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/PluginValue.java
>>>>>>     
>>>>>> logging/log4j/log4j2/trunk/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/SensitivePluginAttribute.java
>>>>>>     
>>>>>> logging/log4j/log4j2/trunk/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/util/PluginBuilder.java
>>>>>>     
>>>>>> logging/log4j/log4j2/trunk/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/visitors/package-info.java
>>>>>> 
>>>>>> Modified: 
>>>>>> logging/log4j/log4j2/trunk/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/PluginAttribute.java
>>>>>> URL: 
>>>>>> http://svn.apache.org/viewvc/logging/log4j/log4j2/trunk/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/PluginAttribute.java?rev=1597790&r1=1597789&r2=1597790&view=diff
>>>>>> ==============================================================================
>>>>>> --- 
>>>>>> logging/log4j/log4j2/trunk/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/PluginAttribute.java
>>>>>>  (original)
>>>>>> +++ 
>>>>>> logging/log4j/log4j2/trunk/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/PluginAttribute.java
>>>>>>  Tue May 27 13:57:31 2014
>>>>>> @@ -32,6 +32,7 @@ import java.lang.annotation.Target;
>>>>>>  @Documented
>>>>>>  @Retention(RetentionPolicy.RUNTIME)
>>>>>>  @Target({ElementType.PARAMETER, ElementType.FIELD})
>>>>>> +@PluginVisitorStrategy("org.apache.logging.log4j.core.config.plugins.visitors.PluginAttributeVisitor")
>>>>>>  public @interface PluginAttribute {
>>>>>> 
>>>>>>      // TODO: could we allow a blank value and infer the attribute name 
>>>>>> through reflection?
>>>>>> 
>>>>>> Modified: 
>>>>>> logging/log4j/log4j2/trunk/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/PluginConfiguration.java
>>>>>> URL: 
>>>>>> http://svn.apache.org/viewvc/logging/log4j/log4j2/trunk/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/PluginConfiguration.java?rev=1597790&r1=1597789&r2=1597790&view=diff
>>>>>> ==============================================================================
>>>>>> --- 
>>>>>> logging/log4j/log4j2/trunk/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/PluginConfiguration.java
>>>>>>  (original)
>>>>>> +++ 
>>>>>> logging/log4j/log4j2/trunk/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/PluginConfiguration.java
>>>>>>  Tue May 27 13:57:31 2014
>>>>>> @@ -29,5 +29,6 @@ import java.lang.annotation.Target;
>>>>>>  @Documented
>>>>>>  @Retention(RetentionPolicy.RUNTIME)
>>>>>>  @Target({ElementType.PARAMETER, ElementType.FIELD})
>>>>>> +@PluginVisitorStrategy("org.apache.logging.log4j.core.config.plugins.visitors.PluginConfigurationVisitor")
>>>>>>  public @interface PluginConfiguration {
>>>>>>  }
>>>>>> 
>>>>>> Modified: 
>>>>>> logging/log4j/log4j2/trunk/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/PluginElement.java
>>>>>> URL: 
>>>>>> http://svn.apache.org/viewvc/logging/log4j/log4j2/trunk/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/PluginElement.java?rev=1597790&r1=1597789&r2=1597790&view=diff
>>>>>> ==============================================================================
>>>>>> --- 
>>>>>> logging/log4j/log4j2/trunk/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/PluginElement.java
>>>>>>  (original)
>>>>>> +++ 
>>>>>> logging/log4j/log4j2/trunk/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/PluginElement.java
>>>>>>  Tue May 27 13:57:31 2014
>>>>>> @@ -28,6 +28,7 @@ import java.lang.annotation.Target;
>>>>>>  @Documented
>>>>>>  @Retention(RetentionPolicy.RUNTIME)
>>>>>>  @Target({ElementType.PARAMETER, ElementType.FIELD})
>>>>>> +@PluginVisitorStrategy("org.apache.logging.log4j.core.config.plugins.visitors.PluginElementVisitor")
>>>>>>  public @interface PluginElement {
>>>>>> 
>>>>>>      /**
>>>>>> 
>>>>>> Modified: 
>>>>>> logging/log4j/log4j2/trunk/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/PluginNode.java
>>>>>> URL: 
>>>>>> http://svn.apache.org/viewvc/logging/log4j/log4j2/trunk/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/PluginNode.java?rev=1597790&r1=1597789&r2=1597790&view=diff
>>>>>> ==============================================================================
>>>>>> --- 
>>>>>> logging/log4j/log4j2/trunk/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/PluginNode.java
>>>>>>  (original)
>>>>>> +++ 
>>>>>> logging/log4j/log4j2/trunk/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/PluginNode.java
>>>>>>  Tue May 27 13:57:31 2014
>>>>>> @@ -28,5 +28,6 @@ import java.lang.annotation.Target;
>>>>>>  @Documented
>>>>>>  @Retention(RetentionPolicy.RUNTIME)
>>>>>>  @Target({ElementType.PARAMETER, ElementType.FIELD})
>>>>>> +@PluginVisitorStrategy("org.apache.logging.log4j.core.config.plugins.visitors.PluginNodeVisitor")
>>>>>>  public @interface PluginNode {
>>>>>>  }
>>>>>> 
>>>>>> Modified: 
>>>>>> logging/log4j/log4j2/trunk/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/PluginValue.java
>>>>>> URL: 
>>>>>> http://svn.apache.org/viewvc/logging/log4j/log4j2/trunk/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/PluginValue.java?rev=1597790&r1=1597789&r2=1597790&view=diff
>>>>>> ==============================================================================
>>>>>> --- 
>>>>>> logging/log4j/log4j2/trunk/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/PluginValue.java
>>>>>>  (original)
>>>>>> +++ 
>>>>>> logging/log4j/log4j2/trunk/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/PluginValue.java
>>>>>>  Tue May 27 13:57:31 2014
>>>>>> @@ -31,6 +31,7 @@ import java.lang.annotation.Target;
>>>>>>  @Documented
>>>>>>  @Retention(RetentionPolicy.RUNTIME)
>>>>>>  @Target(ElementType.PARAMETER)
>>>>>> +@PluginVisitorStrategy("org.apache.logging.log4j.core.config.plugins.visitors.PluginValueVisitor")
>>>>>>  public @interface PluginValue {
>>>>>> 
>>>>>>      String value();
>>>>>> 
>>>>>> Added: 
>>>>>> logging/log4j/log4j2/trunk/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/PluginVisitorStrategy.java
>>>>>> URL: 
>>>>>> http://svn.apache.org/viewvc/logging/log4j/log4j2/trunk/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/PluginVisitorStrategy.java?rev=1597790&view=auto
>>>>>> ==============================================================================
>>>>>> --- 
>>>>>> logging/log4j/log4j2/trunk/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/PluginVisitorStrategy.java
>>>>>>  (added)
>>>>>> +++ 
>>>>>> logging/log4j/log4j2/trunk/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/PluginVisitorStrategy.java
>>>>>>  Tue May 27 13:57:31 2014
>>>>>> @@ -0,0 +1,40 @@
>>>>>> +/*
>>>>>> + * Licensed to the Apache Software Foundation (ASF) under one or more
>>>>>> + * contributor license agreements. See the NOTICE file distributed with
>>>>>> + * this work for additional information regarding copyright ownership.
>>>>>> + * The ASF licenses this file to You under the Apache License, Version 
>>>>>> 2.0
>>>>>> + * (the "License"); you may not use this file except in compliance with
>>>>>> + * the License. You may obtain a copy of the License at
>>>>>> + *
>>>>>> + *      http://www.apache.org/licenses/LICENSE-2.0
>>>>>> + *
>>>>>> + * Unless required by applicable law or agreed to in writing, software
>>>>>> + * distributed under the License is distributed on an "AS IS" BASIS,
>>>>>> + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or 
>>>>>> implied.
>>>>>> + * See the License for the specific language governing permissions and
>>>>>> + * limitations under the License.
>>>>>> + */
>>>>>> +
>>>>>> +package org.apache.logging.log4j.core.config.plugins;
>>>>>> +
>>>>>> +import java.lang.annotation.Documented;
>>>>>> +import java.lang.annotation.ElementType;
>>>>>> +import java.lang.annotation.Retention;
>>>>>> +import java.lang.annotation.RetentionPolicy;
>>>>>> +import java.lang.annotation.Target;
>>>>>> +
>>>>>> +/**
>>>>>> + * Meta-annotation to denote the class name to use that implements
>>>>>> + * {@link 
>>>>>> org.apache.logging.log4j.core.config.plugins.visitors.PluginVisitor} for 
>>>>>> the annotated annotation.
>>>>>> + */
>>>>>> +@Documented
>>>>>> +@Retention(RetentionPolicy.RUNTIME)
>>>>>> +@Target(ElementType.ANNOTATION_TYPE)
>>>>>> +public @interface PluginVisitorStrategy {
>>>>>> +
>>>>>> +    /**
>>>>>> +     * The class name to use that implements {@link 
>>>>>> org.apache.logging.log4j.core.config.plugins.visitors.PluginVisitor}
>>>>>> +     * for the given annotation.
>>>>>> +     */
>>>>>> +    String value();
>>>>>> +}
>>>>>> 
>>>>>> Propchange: 
>>>>>> logging/log4j/log4j2/trunk/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/PluginVisitorStrategy.java
>>>>>> ------------------------------------------------------------------------------
>>>>>>     svn:eol-style = native
>>>>>> 
>>>>>> Modified: 
>>>>>> logging/log4j/log4j2/trunk/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/SensitivePluginAttribute.java
>>>>>> URL: 
>>>>>> http://svn.apache.org/viewvc/logging/log4j/log4j2/trunk/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/SensitivePluginAttribute.java?rev=1597790&r1=1597789&r2=1597790&view=diff
>>>>>> ==============================================================================
>>>>>> --- 
>>>>>> logging/log4j/log4j2/trunk/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/SensitivePluginAttribute.java
>>>>>>  (original)
>>>>>> +++ 
>>>>>> logging/log4j/log4j2/trunk/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/SensitivePluginAttribute.java
>>>>>>  Tue May 27 13:57:31 2014
>>>>>> @@ -34,6 +34,7 @@ import java.lang.annotation.Target;
>>>>>>  @Documented
>>>>>>  @Retention(RetentionPolicy.RUNTIME)
>>>>>>  @Target(ElementType.PARAMETER)
>>>>>> +@PluginVisitorStrategy("org.apache.logging.log4j.core.config.plugins.visitors.SensitivePluginAttributeVisitor")
>>>>>>  public @interface SensitivePluginAttribute {
>>>>>>      String value();
>>>>>> 
>>>>>> 
>>>>>> Modified: 
>>>>>> logging/log4j/log4j2/trunk/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/util/PluginBuilder.java
>>>>>> URL: 
>>>>>> http://svn.apache.org/viewvc/logging/log4j/log4j2/trunk/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/util/PluginBuilder.java?rev=1597790&r1=1597789&r2=1597790&view=diff
>>>>>> ==============================================================================
>>>>>> --- 
>>>>>> logging/log4j/log4j2/trunk/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/util/PluginBuilder.java
>>>>>>  (original)
>>>>>> +++ 
>>>>>> logging/log4j/log4j2/trunk/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/util/PluginBuilder.java
>>>>>>  Tue May 27 13:57:31 2014
>>>>>> @@ -34,7 +34,7 @@ import org.apache.logging.log4j.core.con
>>>>>>  import 
>>>>>> org.apache.logging.log4j.core.config.plugins.PluginBuilderFactory;
>>>>>>  import org.apache.logging.log4j.core.config.plugins.PluginFactory;
>>>>>>  import 
>>>>>> org.apache.logging.log4j.core.config.plugins.visitors.PluginVisitor;
>>>>>> -import 
>>>>>> org.apache.logging.log4j.core.config.plugins.visitors.PluginVisitorRegistry;
>>>>>> +import 
>>>>>> org.apache.logging.log4j.core.config.plugins.visitors.PluginVisitors;
>>>>>>  import org.apache.logging.log4j.core.util.Assert;
>>>>>>  import org.apache.logging.log4j.core.util.Builder;
>>>>>>  import org.apache.logging.log4j.status.StatusLogger;
>>>>>> @@ -164,7 +164,7 @@ public class PluginBuilder<T> implements
>>>>>>                      continue; // already processed
>>>>>>                  }
>>>>>>                  final PluginVisitor<? extends Annotation> visitor =
>>>>>> -                    
>>>>>> PluginVisitorRegistry.findVisitor(a.annotationType());
>>>>>> +                    PluginVisitors.findVisitor(a.annotationType());
>>>>>>                  if (visitor != null) {
>>>>>>                      final Object value = visitor.setAliases(aliases)
>>>>>>                          .setAnnotation(a)
>>>>>> @@ -200,7 +200,7 @@ public class PluginBuilder<T> implements
>>>>>>                  if (a instanceof PluginAliases) {
>>>>>>                      continue; // already processed
>>>>>>                  }
>>>>>> -                final PluginVisitor<? extends Annotation> visitor = 
>>>>>> PluginVisitorRegistry.findVisitor(
>>>>>> +                final PluginVisitor<? extends Annotation> visitor = 
>>>>>> PluginVisitors.findVisitor(
>>>>>>                      a.annotationType());
>>>>>>                  if (visitor != null) {
>>>>>>                      args[i] = visitor.setAliases(aliases)
>>>>>> 
>>>>>> Copied: 
>>>>>> logging/log4j/log4j2/trunk/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/visitors/PluginVisitors.java
>>>>>>  (from r1597667, 
>>>>>> logging/log4j/log4j2/trunk/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/visitors/PluginVisitorRegistry.java)
>>>>>> URL: 
>>>>>> http://svn.apache.org/viewvc/logging/log4j/log4j2/trunk/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/visitors/PluginVisitors.java?p2=logging/log4j/log4j2/trunk/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/visitors/PluginVisitors.java&p1=logging/log4j/log4j2/trunk/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/visitors/PluginVisitorRegistry.java&r1=1597667&r2=1597790&rev=1597790&view=diff
>>>>>> ==============================================================================
>>>>>> --- 
>>>>>> logging/log4j/log4j2/trunk/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/visitors/PluginVisitorRegistry.java
>>>>>>  (original)
>>>>>> +++ 
>>>>>> logging/log4j/log4j2/trunk/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/visitors/PluginVisitors.java
>>>>>>  Tue May 27 13:57:31 2014
>>>>>> @@ -18,58 +18,24 @@
>>>>>>  package org.apache.logging.log4j.core.config.plugins.visitors;
>>>>>> 
>>>>>>  import java.lang.annotation.Annotation;
>>>>>> -import java.util.Map;
>>>>>> -import java.util.concurrent.ConcurrentHashMap;
>>>>>> 
>>>>>>  import org.apache.logging.log4j.Logger;
>>>>>> -import org.apache.logging.log4j.core.config.plugins.PluginAttribute;
>>>>>> -import org.apache.logging.log4j.core.config.plugins.PluginConfiguration;
>>>>>> -import org.apache.logging.log4j.core.config.plugins.PluginElement;
>>>>>> -import org.apache.logging.log4j.core.config.plugins.PluginNode;
>>>>>> -import org.apache.logging.log4j.core.config.plugins.PluginValue;
>>>>>> -import 
>>>>>> org.apache.logging.log4j.core.config.plugins.SensitivePluginAttribute;
>>>>>> +import 
>>>>>> org.apache.logging.log4j.core.config.plugins.PluginVisitorStrategy;
>>>>>>  import org.apache.logging.log4j.status.StatusLogger;
>>>>>> 
>>>>>>  /**
>>>>>> - * Registry for associating Plugin annotations with PluginVisitor 
>>>>>> implementations.
>>>>>> + * Utility class to locate an appropriate PluginVisitor implementation 
>>>>>> for an annotation.
>>>>>>   */
>>>>>> -public final class PluginVisitorRegistry {
>>>>>> +public final class PluginVisitors {
>>>>>> 
>>>>>>      private static final Logger LOGGER = StatusLogger.getLogger();
>>>>>> 
>>>>>> -    // map of annotation classes to their corresponding PluginVisitor 
>>>>>> classes
>>>>>> -    // generics are fun!
>>>>>> -    private static final Map<Class<? extends Annotation>, Class<? 
>>>>>> extends PluginVisitor<? extends Annotation>>> REGISTRY;
>>>>>> -
>>>>>> -    static {
>>>>>> -        // register the default PluginVisitor classes
>>>>>> -        // TODO: this could probably be combined with the usual plugin 
>>>>>> architecture instead
>>>>>> -        REGISTRY = new ConcurrentHashMap<Class<? extends Annotation>, 
>>>>>> Class<? extends PluginVisitor<? extends Annotation>>>();
>>>>>> -        registerVisitor(PluginAttribute.class, 
>>>>>> PluginAttributeVisitor.class);
>>>>>> -        registerVisitor(SensitivePluginAttribute.class, 
>>>>>> SensitivePluginAttributeVisitor.class);
>>>>>> -        registerVisitor(PluginConfiguration.class, 
>>>>>> PluginConfigurationVisitor.class);
>>>>>> -        registerVisitor(PluginNode.class, PluginNodeVisitor.class);
>>>>>> -   �
>>> 
>>> 
>>> 
>>> -- 
>>> Matt Sicker <[email protected]>
>> 
>> 
>> 
>> -- 
>> E-Mail: [email protected] | [email protected] 
>> Java Persistence with Hibernate, Second Edition
>> JUnit in Action, Second Edition
>> Spring Batch in Action
>> Blog: http://garygregory.wordpress.com 
>> Home: http://garygregory.com/
>> Tweet! http://twitter.com/GaryGregory
> 
> 
> 
> -- 
> Matt Sicker <[email protected]>

Reply via email to