I just read the update KIP once more. I would suggest to rename --to-duration to --by-duration
Or as a second idea, rename --to-duration to --shift-by-duration and at the same time rename --shift-offset-by to --shift-by-offset Not sure what the best option is, but naming would be more consistent IMHO. -Matthias On 2/23/17 4:42 PM, Jorge Esteban Quilcate Otoya wrote: > Hi All, > > If there are no more concerns, I'd like to start vote for this KIP. > > Thanks! > Jorge. > > El jue., 23 feb. 2017 a las 22:50, Jorge Esteban Quilcate Otoya (< > quilcate.jo...@gmail.com>) escribió: > >> Oh ok :) >> >> So, we can keep `--topic t1:1,2,3` >> >> I think with this one we have most of the feedback applied. I will update >> the KIP with this change. >> >> El jue., 23 feb. 2017 a las 22:38, Matthias J. Sax (<matth...@confluent.io>) >> escribió: >> >> Sounds reasonable. >> >> If we have multiple --topic arguments, it does also not matter if we use >> t1:1,2 or t2=1,2 >> >> I just suggested '=' because I wanted use ':' to chain multiple topics. >> >> >> -Matthias >> >> On 2/23/17 10:49 AM, Jorge Esteban Quilcate Otoya wrote: >>> Yeap, `--topic t1=1,2`LGTM >>> >>> Don't have idea neither about getting rid of repeated --topic, but >> --group >>> is also repeated in the case of deletion, so it could be ok to have >>> repeated --topic arguments. >>> >>> El jue., 23 feb. 2017 a las 19:14, Matthias J. Sax (< >> matth...@confluent.io>) >>> escribió: >>> >>>> So you suggest to merge "scope options" --topics, --topic, and >>>> --partitions into a single option? Sound good to me. >>>> >>>> I like the compact way to express it, ie, topicname:list-of-partitions >>>> with "all partitions" if not partitions are specified. It's quite >>>> intuitive to use. >>>> >>>> Just wondering, if we could get rid of the repeated --topic option; it's >>>> somewhat verbose. Have no good idea though who to improve it. >>>> >>>> If you concatenate multiple topic, we need one more character that is >>>> not allowed in topic names to separate the topics: >>>> >>>>> invalidChars = {'/', '\\', ',', '\u0000', ':', '"', '\'', ';', '*', >>>> '?', ' ', '\t', '\r', '\n', '='}; >>>> >>>> maybe >>>> >>>> --topics t1=1,2,3:t2:t3=3 >>>> >>>> use '=' to specify partitions (instead of ':' as you proposed) and ':' >>>> to separate topics? All other characters seem to be worse to use to me. >>>> But maybe you have a better idea. >>>> >>>> >>>> >>>> -Matthias >>>> >>>> >>>> On 2/23/17 3:15 AM, Jorge Esteban Quilcate Otoya wrote: >>>>> @Matthias about the point 9: >>>>> >>>>> What about keeping only the --topic option, and support this format: >>>>> >>>>> `--topic t1:0,1,2 --topic t2 --topic t3:2` >>>>> >>>>> In this case topics t1, t2, and t3 will be selected: topic t1 with >>>>> partitions 0,1 and 2; topic t2 with all its partitions; and topic t3, >>>> with >>>>> only partition 2. >>>>> >>>>> Jorge. >>>>> >>>>> El mar., 21 feb. 2017 a las 11:11, Jorge Esteban Quilcate Otoya (< >>>>> quilcate.jo...@gmail.com>) escribió: >>>>> >>>>>> Thanks for the feedback Matthias. >>>>>> >>>>>> * 1. You're right. I'll reorder the scenarios. >>>>>> >>>>>> * 2. Agree. I'll update the KIP. >>>>>> >>>>>> * 3. I like it, updating to `reset-offsets` >>>>>> >>>>>> * 4. Agree, removing the `reset-` part >>>>>> >>>>>> * 5. Yes, 1.e option without --execute or --export will print out >>>> current >>>>>> offset, and the new offset, that will be the same. The use-case of >> this >>>>>> option is to use it in combination with --export mostly and have a >>>> current >>>>>> 'checkpoint' to reset later. I will add to the KIP how the output >> should >>>>>> looks like. >>>>>> >>>>>> * 6. Considering 4., I will update it to `--to-offset` >>>>>> >>>>>> * 7. I like the idea to unify these options (plus, minus). >>>>>> `shift-offsets-by` is a good option, but I will like some more >> feedback >>>>>> here about the name. I will update the KIP in the meantime. >>>>>> >>>>>> * 8. Yes, discussed in 9. >>>>>> >>>>>> * 9. Agree. I'll love some feedback here. `topic` is already used by >>>>>> `delete`, and we can add `--all-topics` to consider all >>>> topics/partitions >>>>>> assigned to a group. How could we define specific topics/partitions? >>>>>> >>>>>> * 10. Haven't thought about it, but make sense. >>>>>> <topic>,<partition>,<offset> would be enough. >>>>>> >>>>>> * 11. Agree. Solved with 10. >>>>>> >>>>>> Also, I have a couple of changes to mention: >>>>>> >>>>>> 1. I have add a reference to the branch where I'm working on this KIP. >>>>>> >>>>>> 2. About the period scenario `--to-period`. I will change it to >>>>>> `--to-duration` given that duration ( >>>>>> https://docs.oracle.com/javase/8/docs/api/java/time/Duration.html) >>>>>> follows this format: 'PnDTnHnMnS' and does not consider daylight >> saving >>>>>> efects. >>>>>> >>>>>> >>>>>> >>>>>> El mar., 21 feb. 2017 a las 2:47, Matthias J. Sax (< >>>> matth...@confluent.io>) >>>>>> escribió: >>>>>> >>>>>> Hi, >>>>>> >>>>>> thanks for updating the KIP. Couple of follow up comments: >>>>>> >>>>>> * Nit: Why is "Reset to Earliest" and "Reset to Latest" a "reset by >>>>>> time" option -- IMHO it belongs to "reset by position"? >>>>>> >>>>>> >>>>>> * Nit: Description of "Reset to Earliest" >>>>>> >>>>>>> using Kafka Consumer's `auto.offset.reset` to `earliest` >>>>>> >>>>>> I think this is strictly speaking not correct (as auto.offset.reset >> only >>>>>> triggered if no valid offset is found, but this tool explicitly >> modified >>>>>> committed offset), and should be phrased as >>>>>> >>>>>>> using Kafka Consumer's #seekToBeginning() >>>>>> >>>>>> -> similar issue for description of "Reset to Latest" >>>>>> >>>>>> >>>>>> * Main option: rename to --reset-offsets (plural instead of singular) >>>>>> >>>>>> >>>>>> * Scenario Options: I would remove "reset" from all options, because >> the >>>>>> main argument "--reset-offset" says already what to do: >>>>>> >>>>>>> bin/kafka-consumer-groups.sh --reset-offset --reset-to-datetime XXX >>>>>> >>>>>> better (IMHO): >>>>>> >>>>>>> bin/kafka-consumer-groups.sh --reset-offsets --to-datetime XXX >>>>>> >>>>>> >>>>>> >>>>>> * Option 1.e ("print and export current offset") is not intuitive to >> use >>>>>> IMHO. The main option is "--reset-offset" but nothing happens if no >>>>>> scenario is specified. It is also not specified, what the output >> should >>>>>> look like? >>>>>> >>>>>> Furthermore, --describe should actually show currently committed >> offset >>>>>> for a group. So it seems to be redundant to have the same option in >>>>>> --reset-offsets >>>>>> >>>>>> >>>>>> * Option 2.a: I would rename to "--reset-to-offset" (or considering >> the >>>>>> comment above to "--to-offset") >>>>>> >>>>>> >>>>>> * Option 2.b and 2.c: I would unify to "--shift-offsets-by" (or >> similar) >>>>>> and accept positive/negative values >>>>>> >>>>>> >>>>>> * About Scope "all": maybe it's better to have an option >> "--all-topics" >>>>>> (or similar). IMHO explicit arguments are preferable over implicit >>>>>> setting to guard again accidental miss use of the tool. >>>>>> >>>>>> >>>>>> * Scope: I also think, that "--topic" (singular) and "--topics" >> (plural) >>>>>> are too similar and easy to use in a wrong way (ie, mix up) -- maybe >> we >>>>>> can have two options that are easier to distinguish. >>>>>> >>>>>> >>>>>> * I still think that JSON is not the best format (it's too >> verbose/hard >>>>>> to write for humans from scratch). A simple CSV format with implicit >>>>>> schema (topic,partition,offset) would be sufficient. >>>>>> >>>>>> >>>>>> * Why does the JSON contain "group_id" field -- there is parameter >>>>>> "--group" to specify the group ID. Would one overwrite the other (what >>>>>> order) or would there be an error if "--group" is used in combination >>>>>> with "--reset-from-file"? >>>>>> >>>>>> >>>>>> >>>>>> -Matthias >>>>>> >>>>>> >>>>>> >>>>>> >>>>>> On 2/17/17 6:43 AM, Jorge Esteban Quilcate Otoya wrote: >>>>>>> Hi, >>>>>>> >>>>>>> according to the feedback, I've updated the KIP: >>>>>>> >>>>>>> - We have added and ordered the scenarios, scopes and executions of >> the >>>>>>> Reset Offset tool. >>>>>>> - Consider it as an extension to the current `ConsumerGroupCommand` >>>> tool >>>>>>> - Execution will be possible without generating JSON files. >>>>>>> >>>>>>> >>>>>> >>>> >> https://cwiki.apache.org/confluence/display/KAFKA/KIP-122%3A+Add+Reset+Consumer+Group+Offsets+tooling >>>>>>> >>>>>>> Looking forward to your feedback! >>>>>>> >>>>>>> Jorge. >>>>>>> >>>>>>> El mié., 8 feb. 2017 a las 23:23, Jorge Esteban Quilcate Otoya (< >>>>>>> quilcate.jo...@gmail.com>) escribió: >>>>>>> >>>>>>>> Great. I think I got the idea. What about this options: >>>>>>>> >>>>>>>> Scenarios: >>>>>>>> >>>>>>>> 1. Current status >>>>>>>> >>>>>>>> ´kafka-consumer-groups.sh --reset-offset --group cg1´ >>>>>>>> >>>>>>>> 2. To Datetime >>>>>>>> >>>>>>>> ´kafka-consumer-groups.sh --reset-offset --group cg1 >>>> --reset-to-datetime >>>>>>>> 2017-01-01T00:00:00.000´ >>>>>>>> >>>>>>>> 3. To Period >>>>>>>> >>>>>>>> ´kafka-consumer-groups.sh --reset-offset --group cg1 >> --reset-to-period >>>>>> P2D´ >>>>>>>> >>>>>>>> 4. To Earliest >>>>>>>> >>>>>>>> ´kafka-consumer-groups.sh --reset-offset --group cg1 >>>>>> --reset-to-earliest´ >>>>>>>> >>>>>>>> 5. To Latest >>>>>>>> >>>>>>>> ´kafka-consumer-groups.sh --reset-offset --group cg1 >>>> --reset-to-latest´ >>>>>>>> >>>>>>>> 6. Minus 'n' offsets >>>>>>>> >>>>>>>> ´kafka-consumer-groups.sh --reset-offset --group cg1 --reset-minus >> n´ >>>>>>>> >>>>>>>> 7. Plus 'n' offsets >>>>>>>> >>>>>>>> ´kafka-consumer-groups.sh --reset-offset --group cg1 --reset-plus n´ >>>>>>>> >>>>>>>> 8. To specific offset >>>>>>>> >>>>>>>> ´kafka-consumer-groups.sh --reset-offset --group cg1 --reset-to x´ >>>>>>>> >>>>>>>> Scopes: >>>>>>>> >>>>>>>> a. All topics used by Consumer Group >>>>>>>> >>>>>>>> Don't specify --topics >>>>>>>> >>>>>>>> b. Specific List of Topics >>>>>>>> >>>>>>>> Add list of values in --topics t1,t2,tn >>>>>>>> >>>>>>>> c. One Topic, all Partitions >>>>>>>> >>>>>>>> Add one topic and no partitions values: --topic t1 >>>>>>>> >>>>>>>> d. One Topic, List of Partitions >>>>>>>> >>>>>>>> Add one topic and partitions values: --topic t1 --partitions 0,1,2 >>>>>>>> >>>>>>>> About Reset Plan (JSON file): >>>>>>>> >>>>>>>> I think is still valid to have the option to persist reset >>>> configuration >>>>>>>> as a file, but I agree to give the option to run the tool without >>>> going >>>>>>>> down to the JSON file. >>>>>>>> >>>>>>>> Execution options: >>>>>>>> >>>>>>>> 1. Without execution argument (No args): >>>>>>>> >>>>>>>> Print out results (reset plan) >>>>>>>> >>>>>>>> 2. With --execute argument: >>>>>>>> >>>>>>>> Run reset process >>>>>>>> >>>>>>>> 3. With --output argument: >>>>>>>> >>>>>>>> Save result in a JSON format. >>>>>>>> >>>>>>>> 4. Only with --execute option and --reset-file (path to JSON) >>>>>>>> >>>>>>>> Reset based on file >>>>>>>> >>>>>>>> 4. Only with --verify option and --reset-file (path to JSON) >>>>>>>> >>>>>>>> Verify file values with current offsets >>>>>>>> >>>>>>>> I think we can remove --generate-and-execute because is a bit >> clumsy. >>>>>>>> >>>>>>>> With this options we will be able to execute with manual JSON >>>>>>>> configuration. >>>>>>>> >>>>>>>> >>>>>>>> El mié., 8 feb. 2017 a las 22:43, Ben Stopford (<b...@confluent.io>) >>>>>>>> escribió: >>>>>>>> >>>>>>>> Yes - using a tool like this to skip a set of consumer groups over a >>>>>>>> corrupt/bad message is definitely appealing. >>>>>>>> >>>>>>>> B >>>>>>>> >>>>>>>> On Wed, Feb 8, 2017 at 9:37 PM Gwen Shapira <g...@confluent.io> >>>> wrote: >>>>>>>> >>>>>>>>> I like the --reset-to-earliest and --reset-to-latest. In general, >>>>>>>>> since the JSON route is the most challenging for users, we want to >>>>>>>>> provide a lot of ways to do useful things without going there. >>>>>>>>> >>>>>>>>> Two things that can help: >>>>>>>>> >>>>>>>>> 1. A lot of times, users want to skip few messages that cause >> issues >>>>>>>>> and continue. maybe just specifying the topic, partition and delta >>>>>>>>> will be better than having to find the offset and write a JSON and >>>>>>>>> validate the JSON etc. >>>>>>>>> >>>>>>>>> 2. Thinking if there are other common use-cases that we can make >> easy >>>>>>>>> rather than just one generic but not very usable method. >>>>>>>>> >>>>>>>>> Gwen >>>>>>>>> >>>>>>>>> On Wed, Feb 8, 2017 at 3:25 AM, Jorge Esteban Quilcate Otoya >>>>>>>>> <quilcate.jo...@gmail.com> wrote: >>>>>>>>>> Thanks for the feedback! >>>>>>>>>> >>>>>>>>>> @Onur, @Gwen: >>>>>>>>>> >>>>>>>>>> Agree. Actually at the first draft I considered to have it inside >>>>>>>>>> ´kafka-consumer-groups.sh´, but I decide to propose it as a >>>> standalone >>>>>>>>> tool >>>>>>>>>> to describe it clearly and focus it on reset functionality. >>>>>>>>>> >>>>>>>>>> But now that you mentioned, it does make sense to have it in >>>>>>>>>> ´kafka-consumer-groups.sh´. How would be a consistent way to >>>> introduce >>>>>>>>> it? >>>>>>>>>> >>>>>>>>>> Maybe something like this: >>>>>>>>>> >>>>>>>>>> ´kafka-consumer-groups.sh --reset-offset --generate --group cg1 >>>>>>>> --topics >>>>>>>>> t1 >>>>>>>>>> --reset-from 2017-01-01T00:00:00.000 --output plan.json´ >>>>>>>>>> >>>>>>>>>> ´kafka-consumer-groups.sh --reset-offset --verify >> --reset-json-file >>>>>>>>>> plan.json´ >>>>>>>>>> >>>>>>>>>> ´kafka-consumer-groups.sh --reset-offset --execute >> --reset-json-file >>>>>>>>>> plan.json´ >>>>>>>>>> >>>>>>>>>> ´kafka-consumer-groups.sh --reset-offset --generate-and-execute >>>>>> --group >>>>>>>>> cg1 >>>>>>>>>> --topics t1 --reset-from 2017-01-01T00:00:00.000´ >>>>>>>>>> >>>>>>>>>> @Gwen: >>>>>>>>>> >>>>>>>>>>> It looks exactly like the replica assignment tool >>>>>>>>>> >>>>>>>>>> It was influenced by ;-) I use the generate-verify-execute process >>>>>> here >>>>>>>>> to >>>>>>>>>> make sure user will be aware of the result of this operation. At >> the >>>>>>>>>> beginning we considered only add a couple of options to Consumer >>>> Group >>>>>>>>>> Command: >>>>>>>>>> >>>>>>>>>> --rewind-to-timestamp and --rewind-to-period >>>>>>>>>> >>>>>>>>>> @Onur: >>>>>>>>>> >>>>>>>>>>> You can actually get away with overriding while members of the >>>> group >>>>>>>>> are live >>>>>>>>>> with method 2 by using group information from >> DescribeGroupsRequest. >>>>>>>>>> >>>>>>>>>> This means that we need to have Consumer Group stopped before >>>>>> executing >>>>>>>>> and >>>>>>>>>> start a new consumer internally to do this? Therefore, we won't be >>>>>> able >>>>>>>>> to >>>>>>>>>> consider executing reset when ConsumerGroup is active? (trying to >>>>>>>> relate >>>>>>>>> it >>>>>>>>>> with @Dong 5th question) >>>>>>>>>> >>>>>>>>>> @Dong: >>>>>>>>>> >>>>>>>>>>> Should we allow user to use wildcard to reset offset of all >> groups >>>>>>>> for a >>>>>>>>>> given topic as well? >>>>>>>>>> >>>>>>>>>> I haven't thought about this scenario. Could be interesting. >>>> Following >>>>>>>>> the >>>>>>>>>> recommendation to add it into Consumer Group Command, in this case >>>>>>>> Group >>>>>>>>>> argument will be optional if there are only 1 topic. I think for >>>>>>>> multiple >>>>>>>>>> topic won't be that useful. >>>>>>>>>> >>>>>>>>>>> Should we allow user to specify timestamp per topic partition in >>>> the >>>>>>>>> json >>>>>>>>>> file as well? >>>>>>>>>> >>>>>>>>>> Don't think this could be a valid from the tool, but if Reset Plan >>>> is >>>>>>>>>> generated, and user want to set the offset for a specific >> partition >>>> to >>>>>>>>>> other offset (eventually based on another timestamp), and execute >>>> it, >>>>>>>> it >>>>>>>>>> will be up to her/him. >>>>>>>>>> >>>>>>>>>>> Should the script take some credential file to make sure that >> this >>>>>>>>>> operation is authenticated given the potential impact of this >>>>>>>> operation? >>>>>>>>>> >>>>>>>>>> Haven't tried to secure brokers yet, but the tool should support >>>>>>>>>> authorization if it's enabled in the broker. >>>>>>>>>> >>>>>>>>>>> Should we provide constant to reset committed offset to >>>>>>>> earliest/latest >>>>>>>>>> offset of a partition, e.g. -1 indicates earliest offset and -2 >>>>>>>> indicates >>>>>>>>>> latest offset. >>>>>>>>>> >>>>>>>>>> I will go for something like ´--reset-to-earliest´ and >>>>>>>>> ´--reset-to-latest´ >>>>>>>>>> >>>>>>>>>>> Should we allow dynamic change of the comitted offset when >> consumer >>>>>>>> are >>>>>>>>>> running, such that consumer will seek to the newly committed >> offset >>>>>> and >>>>>>>>>> start consuming from there? >>>>>>>>>> >>>>>>>>>> Not sure about this. I will recommend to keep it simple and ask >> user >>>>>> to >>>>>>>>>> stop consumers first. But I would considered it if the trade-offs >>>> are >>>>>>>>>> clear. >>>>>>>>>> >>>>>>>>>> @Matthias >>>>>>>>>> >>>>>>>>>> Added :). And thanks a lot for your help to define this KIP! >>>>>>>>>> >>>>>>>>>> >>>>>>>>>> >>>>>>>>>> El mié., 8 feb. 2017 a las 7:47, Gwen Shapira (<g...@confluent.io >>> ) >>>>>>>>>> escribió: >>>>>>>>>> >>>>>>>>>>> As long as the CLI is a bit consistent? Like, not just adding 3 >>>>>>>>>>> arguments and a JSON parser to the existing tool, right? >>>>>>>>>>> >>>>>>>>>>> On Tue, Feb 7, 2017 at 10:29 PM, Onur Karaman >>>>>>>>>>> <onurkaraman.apa...@gmail.com> wrote: >>>>>>>>>>>> I think it makes sense to just add the feature to >>>>>>>>>>> kafka-consumer-groups.sh >>>>>>>>>>>> >>>>>>>>>>>> On Tue, Feb 7, 2017 at 10:24 PM, Gwen Shapira < >> g...@confluent.io> >>>>>>>>> wrote: >>>>>>>>>>>> >>>>>>>>>>>>> Thanks for the KIP. I'm super happy about adding the >> capability. >>>>>>>>>>>>> >>>>>>>>>>>>> I hate the interface, though. It looks exactly like the replica >>>>>>>>>>>>> assignment tool. A tool everyone loves so much that there are >>>>>>>>> multiple >>>>>>>>>>>>> projects, open and closed, that try to fix it. >>>>>>>>>>>>> >>>>>>>>>>>>> Can we swap it with something that looks a bit more like the >>>>>>>> consumer >>>>>>>>>>>>> group tool? or the kafka streams reset tool? Consistency is >>>> helpful >>>>>>>>> in >>>>>>>>>>>>> such cases. I spent some time learning existing tools and >>>> learning >>>>>>>>> yet >>>>>>>>>>>>> another one is a deterrent. >>>>>>>>>>>>> >>>>>>>>>>>>> Gwen >>>>>>>>>>>>> >>>>>>>>>>>>> >>>>>>>>>>>>> >>>>>>>>>>>>> On Tue, Feb 7, 2017 at 6:43 PM, Jorge Esteban Quilcate Otoya >>>>>>>>>>>>> <quilcate.jo...@gmail.com> wrote: >>>>>>>>>>>>>> Hi all, >>>>>>>>>>>>>> >>>>>>>>>>>>>> I would like to propose a KIP to Add a tool to Reset Consumer >>>>>>>> Group >>>>>>>>>>>>> Offsets. >>>>>>>>>>>>>> >>>>>>>>>>>>>> https://cwiki.apache.org/confluence/display/KAFKA/KIP- >>>>>>>>>>>>> 122%3A+Add+a+tool+to+Reset+Consumer+Group+Offsets >>>>>>>>>>>>>> >>>>>>>>>>>>>> Please, take a look at the proposal and share your feedback. >>>>>>>>>>>>>> >>>>>>>>>>>>>> Thanks, >>>>>>>>>>>>>> Jorge. >>>>>>>>>>>>> >>>>>>>>>>>>> >>>>>>>>>>>>> >>>>>>>>>>>>> -- >>>>>>>>>>>>> Gwen Shapira >>>>>>>>>>>>> Product Manager | Confluent >>>>>>>>>>>>> 650.450.2760 <(650)%20450-2760> <(650)%20450-2760> >> <(650)%20450-2760> >>>> <(650)%20450-2760> >>>>>> <(650)%20450-2760> >>>>>>>> <(650)%20450-2760> | @gwenshap >>>>>>>>>>>>> Follow us: Twitter | blog >>>>>>>>>>>>> >>>>>>>>>>> >>>>>>>>>>> >>>>>>>>>>> >>>>>>>>>>> -- >>>>>>>>>>> Gwen Shapira >>>>>>>>>>> Product Manager | Confluent >>>>>>>>>>> 650.450.2760 <(650)%20450-2760> <(650)%20450-2760> >> <(650)%20450-2760> >>>> <(650)%20450-2760> >>>>>> <(650)%20450-2760> >>>>>>>> <(650)%20450-2760> | @gwenshap >>>>>>>>>>> Follow us: Twitter | blog >>>>>>>>>>> >>>>>>>>> >>>>>>>>> >>>>>>>>> >>>>>>>>> -- >>>>>>>>> Gwen Shapira >>>>>>>>> Product Manager | Confluent >>>>>>>>> 650.450.2760 <(650)%20450-2760> <(650)%20450-2760> >> <(650)%20450-2760> >>>> <(650)%20450-2760> <(650)%20450-2760> >>>>>> | @gwenshap >>>>>>>>> Follow us: Twitter | blog >>>>>>>>> >>>>>>>> >>>>>>>> >>>>>>> >>>>>> >>>>>> >>>>> >>>> >>>> >>> >> >> >
signature.asc
Description: OpenPGP digital signature