linked_list_rev: updated proof session

parent 5c02d18f
......@@ -210,19 +210,28 @@ module InPlaceRevSeq
exists i. 0 <= i < length s /\ s[i] = x
predicate disjoint (s1: seq 'a) (s2: seq 'a) =
forall x:'a. not (mem x s1 /\ mem x s2)
(* forall x:'a. not (mem x s1 /\ mem x s2) *)
forall i1. 0 <= i1 < length s1 ->
forall i2. 0 <= i2 < length s2 ->
s1[i1] <> s2[i2]
predicate no_repet (s: seq 'a) =
forall i. 0 <= i < length s -> not (mem s[i] s[i+1 ..])
let rec ghost mem_decomp (x: 'a) (s: seq 'a) (i: int) : (seq 'a, seq 'a)
requires { 0 <= i < length s }
requires { mem x s[i .. ] }
variant { length s - i }
lemma non_empty_seq:
forall s: seq 'a. length s > 0 ->
s == cons s[0] s[1 .. ]
let rec ghost mem_decomp (x: 'a) (s: seq 'a) : (seq 'a, seq 'a)
requires { mem x s }
variant { length s }
returns { (s1,s2) -> s == s1 ++ cons x s2 }
=
if s[i] = x then (s[0 .. i], s[i+1 ..])
else begin (* assert { mem x s[i+1 .. ] }; *) mem_decomp x s (i+1) end
if s[0] = x then (empty, s[1 ..])
else begin
assert { s == cons s[0] s[1 .. ] };
let (s1, s2) = mem_decomp x s[1 .. ] in (cons s[0] s1, s2)
end
type loc
......@@ -256,10 +265,6 @@ module InPlaceRevSeq
not (mem q pM) ->
list_seg next2 p pM r
lemma non_empty_seq:
forall s: seq 'a. length s > 0 ->
s == cons s[0] s[1 .. ]
let rec lemma list_seg_functional (next: next) (l1 l2: seq loc) (p: loc)
requires { list_seg next p l1 null }
requires { list_seg next p l2 null }
......@@ -323,7 +328,7 @@ module InPlaceRevSeq
let t = pM[1 .. ] in
if mem h t then
(* absurd case *)
let (l1,l2) = mem_decomp h t 0 in
let (l1,l2) = mem_decomp h t in
list_seg_sublistl next (cons h l1) l2 p h;
list_seg_functional next pM (cons h l2) p;
assert { length pM > length (cons h l2) }
......@@ -346,6 +351,7 @@ module InPlaceRevSeq
let p = ref l1 in
let ghost pM = ref l1M in
let ghost l1pM = ref (empty : seq loc) in
ghost list_seg_no_repet !next l1 l1M;
while acc next !p <> null do
invariant { !p <> null }
invariant { list_seg !next l1 !l1pM !p }
......@@ -354,6 +360,7 @@ module InPlaceRevSeq
invariant { disjoint !l1pM !pM }
variant { length !pM }
assert { length !pM > 0 };
assert { not (mem !p !l1pM) };
let t = !pM[ 1 .. ] in
l1pM := !l1pM ++ cons !p empty;
pM := t;
......
......@@ -5,8 +5,8 @@
<prover id="0" name="CVC4" version="1.4" timelimit="5" steplimit="1" memlimit="1000"/>
<prover id="3" name="Alt-Ergo" version="0.99.1" timelimit="6" steplimit="1" memlimit="1000"/>
<prover id="5" name="Z3" version="4.3.2" timelimit="10" steplimit="1" memlimit="1000"/>
<prover id="6" name="Z3" version="4.4.0" timelimit="16" steplimit="-1" memlimit="1000"/>
<file name="../linked_list_rev.mlw">
<prover id="6" name="Z3" version="4.4.0" timelimit="36" steplimit="-1" memlimit="1000"/>
<file name="../linked_list_rev.mlw" expanded="true">
<theory name="Disjoint" sum="d9538770c8f60c61e92f6baffbf62d5d">
<goal name="WP_parameter mem_decomp" expl="VC for mem_decomp">
<proof prover="3" timelimit="5"><result status="valid" time="0.02" steps="48"/></proof>
......@@ -133,32 +133,32 @@
</transf>
</goal>
</theory>
<theory name="InPlaceRevSeq" sum="103490a816b50361aa8269515016ce5f">
<goal name="WP_parameter mem_decomp" expl="VC for mem_decomp">
<transf name="split_goal_wp">
<theory name="InPlaceRevSeq" sum="98a75103e20b687045d666de85976237" expanded="true">
<goal name="non_empty_seq">
<proof prover="3"><result status="valid" time="0.02" steps="22"/></proof>
</goal>
<goal name="WP_parameter mem_decomp" expl="VC for mem_decomp" expanded="true">
<transf name="split_goal_wp" expanded="true">
<goal name="WP_parameter mem_decomp.1" expl="1. postcondition">
<proof prover="3"><result status="valid" time="0.02" steps="61"/></proof>
<proof prover="3"><result status="valid" time="0.02" steps="27"/></proof>
</goal>
<goal name="WP_parameter mem_decomp.2" expl="2. variant decrease">
<proof prover="3"><result status="valid" time="0.01" steps="4"/></proof>
<goal name="WP_parameter mem_decomp.2" expl="2. assertion">
<proof prover="3" timelimit="36" steplimit="-1"><result status="valid" time="0.00" steps="8"/></proof>
</goal>
<goal name="WP_parameter mem_decomp.3" expl="3. precondition">
<proof prover="3"><result status="valid" time="0.04" steps="15"/></proof>
<goal name="WP_parameter mem_decomp.3" expl="3. variant decrease">
<proof prover="3"><result status="valid" time="0.01" steps="11"/></proof>
</goal>
<goal name="WP_parameter mem_decomp.4" expl="4. precondition">
<proof prover="6"><result status="valid" time="11.65"/></proof>
<proof prover="6"><result status="valid" time="0.05"/></proof>
</goal>
<goal name="WP_parameter mem_decomp.5" expl="5. postcondition">
<proof prover="3"><result status="valid" time="0.02" steps="8"/></proof>
<goal name="WP_parameter mem_decomp.5" expl="5. postcondition" expanded="true">
<proof prover="3" timelimit="36" steplimit="-1"><result status="valid" time="0.12" steps="165"/></proof>
</goal>
</transf>
</goal>
<goal name="list_seg_frame_ext">
<proof prover="3"><result status="valid" time="0.02" steps="28"/></proof>
</goal>
<goal name="non_empty_seq">
<proof prover="3"><result status="valid" time="0.02" steps="22"/></proof>
</goal>
<goal name="WP_parameter list_seg_functional" expl="VC for list_seg_functional">
<transf name="split_goal_wp">
<goal name="WP_parameter list_seg_functional.1" expl="1. assertion">
......@@ -170,11 +170,10 @@
</goal>
<goal name="WP_parameter list_seg_functional.3" expl="3. precondition">
<proof prover="3" steplimit="-1"><result status="valid" time="0.15" steps="258"/></proof>
<proof prover="6" timelimit="5" steplimit="1"><result status="timeout" time="4.97"/></proof>
</goal>
<goal name="WP_parameter list_seg_functional.4" expl="4. precondition">
<proof prover="3" steplimit="-1"><result status="valid" time="0.16" steps="262"/></proof>
<proof prover="6" timelimit="5" steplimit="1"><result status="valid" time="4.69"/></proof>
<proof prover="6" timelimit="5" steplimit="1"><result status="valid" time="1.95"/></proof>
</goal>
<goal name="WP_parameter list_seg_functional.5" expl="5. postcondition">
<proof prover="5"><result status="valid" time="0.02"/></proof>
......@@ -218,11 +217,22 @@
<proof prover="5" timelimit="6"><result status="valid" time="0.02"/></proof>
</goal>
<goal name="WP_parameter list_seg_append.4" expl="4. postcondition">
<proof prover="6"><result status="valid" time="2.52"/></proof>
<transf name="inline_goal">
<goal name="WP_parameter list_seg_append.4.1" expl="1. postcondition">
<transf name="split_goal_wp">
<goal name="WP_parameter list_seg_append.4.1.1" expl="1. postcondition">
<proof prover="5" timelimit="36" steplimit="-1"><result status="valid" time="4.58"/></proof>
</goal>
<goal name="WP_parameter list_seg_append.4.1.2" expl="2. postcondition">
<proof prover="5" timelimit="36" steplimit="-1"><result status="valid" time="2.86"/></proof>
</goal>
</transf>
</goal>
</transf>
</goal>
<goal name="WP_parameter list_seg_append.5" expl="5. postcondition">
<proof prover="3" steplimit="-1"><result status="valid" time="0.09" steps="147"/></proof>
<proof prover="5" timelimit="6"><result status="valid" time="0.48"/></proof>
<proof prover="5" timelimit="6"><result status="valid" time="0.94"/></proof>
</goal>
</transf>
</goal>
......@@ -244,7 +254,18 @@
<proof prover="3"><result status="valid" time="0.05" steps="60"/></proof>
</goal>
<goal name="WP_parameter list_seg_prefix.5" expl="5. postcondition">
<proof prover="5" timelimit="16" steplimit="-1"><result status="valid" time="7.54"/></proof>
<transf name="inline_goal">
<goal name="WP_parameter list_seg_prefix.5.1" expl="1. postcondition">
<transf name="split_goal_wp">
<goal name="WP_parameter list_seg_prefix.5.1.1" expl="1. postcondition">
<proof prover="6"><result status="valid" time="0.33"/></proof>
</goal>
<goal name="WP_parameter list_seg_prefix.5.1.2" expl="2. postcondition">
<proof prover="6"><result status="valid" time="0.45"/></proof>
</goal>
</transf>
</goal>
</transf>
</goal>
<goal name="WP_parameter list_seg_prefix.6" expl="6. postcondition">
<proof prover="3"><result status="valid" time="0.98" steps="744"/></proof>
......@@ -274,7 +295,7 @@
<proof prover="3"><result status="valid" time="0.02" steps="6"/></proof>
</goal>
<goal name="WP_parameter list_seg_sublistl.7" expl="7. postcondition">
<proof prover="3"><result status="valid" time="0.36" steps="557"/></proof>
<proof prover="3"><result status="valid" time="0.36" steps="571"/></proof>
</goal>
</transf>
</goal>
......@@ -287,54 +308,51 @@
<goal name="WP_parameter list_seg_no_repet" expl="VC for list_seg_no_repet">
<transf name="split_goal_wp">
<goal name="WP_parameter list_seg_no_repet.1" expl="1. precondition">
<proof prover="3"><result status="valid" time="0.03" steps="6"/></proof>
<proof prover="3"><result status="valid" time="0.02" steps="3"/></proof>
</goal>
<goal name="WP_parameter list_seg_no_repet.2" expl="2. precondition">
<proof prover="3"><result status="valid" time="0.02" steps="21"/></proof>
</goal>
<goal name="WP_parameter list_seg_no_repet.3" expl="3. precondition">
<transf name="introduce_premises">
<goal name="WP_parameter list_seg_no_repet.3.1" expl="1. precondition">
<goal name="WP_parameter list_seg_no_repet.2.1" expl="1. precondition">
<proof prover="0" timelimit="10"><result status="valid" time="0.12"/></proof>
</goal>
</transf>
</goal>
<goal name="WP_parameter list_seg_no_repet.4" expl="4. precondition">
<proof prover="3"><result status="valid" time="0.01" steps="9"/></proof>
<goal name="WP_parameter list_seg_no_repet.3" expl="3. precondition">
<proof prover="3"><result status="valid" time="0.01" steps="6"/></proof>
</goal>
<goal name="WP_parameter list_seg_no_repet.5" expl="5. precondition">
<proof prover="3"><result status="valid" time="0.02" steps="24"/></proof>
<goal name="WP_parameter list_seg_no_repet.4" expl="4. precondition">
<proof prover="3"><result status="valid" time="0.02" steps="18"/></proof>
</goal>
<goal name="WP_parameter list_seg_no_repet.6" expl="6. assertion">
<proof prover="3"><result status="valid" time="0.11" steps="92"/></proof>
<goal name="WP_parameter list_seg_no_repet.5" expl="5. assertion">
<proof prover="3"><result status="valid" time="0.11" steps="78"/></proof>
</goal>
<goal name="WP_parameter list_seg_no_repet.7" expl="7. postcondition">
<proof prover="3"><result status="valid" time="0.02" steps="22"/></proof>
<goal name="WP_parameter list_seg_no_repet.6" expl="6. postcondition">
<proof prover="3"><result status="valid" time="0.02" steps="16"/></proof>
</goal>
<goal name="WP_parameter list_seg_no_repet.8" expl="8. assertion">
<goal name="WP_parameter list_seg_no_repet.7" expl="7. assertion">
<proof prover="3"><result status="valid" time="0.02" steps="3"/></proof>
</goal>
<goal name="WP_parameter list_seg_no_repet.9" expl="9. variant decrease">
<goal name="WP_parameter list_seg_no_repet.8" expl="8. variant decrease">
<proof prover="3"><result status="valid" time="0.04" steps="25"/></proof>
</goal>
<goal name="WP_parameter list_seg_no_repet.10" expl="10. precondition">
<goal name="WP_parameter list_seg_no_repet.9" expl="9. precondition">
<proof prover="3"><result status="valid" time="0.02" steps="5"/></proof>
</goal>
<goal name="WP_parameter list_seg_no_repet.11" expl="11. assertion">
<goal name="WP_parameter list_seg_no_repet.10" expl="10. assertion">
<transf name="inline_trivial">
<goal name="WP_parameter list_seg_no_repet.11.1" expl="1. assertion">
<goal name="WP_parameter list_seg_no_repet.10.1" expl="1. assertion">
<transf name="inline_goal">
<goal name="WP_parameter list_seg_no_repet.11.1.1" expl="1. assertion">
<goal name="WP_parameter list_seg_no_repet.10.1.1" expl="1. assertion">
<proof prover="5"><result status="valid" time="0.04"/></proof>
</goal>
</transf>
</goal>
</transf>
</goal>
<goal name="WP_parameter list_seg_no_repet.12" expl="12. postcondition">
<goal name="WP_parameter list_seg_no_repet.11" expl="11. postcondition">
<proof prover="3"><result status="valid" time="0.03" steps="12"/></proof>
</goal>
<goal name="WP_parameter list_seg_no_repet.13" expl="13. postcondition">
<goal name="WP_parameter list_seg_no_repet.12" expl="12. postcondition">
<proof prover="3"><result status="valid" time="0.03" steps="5"/></proof>
</goal>
</transf>
......@@ -344,50 +362,56 @@
<goal name="WP_parameter app.1" expl="1. postcondition">
<proof prover="3"><result status="valid" time="0.04" steps="106"/></proof>
</goal>
<goal name="WP_parameter app.2" expl="2. loop invariant init">
<proof prover="3"><result status="valid" time="0.03" steps="4"/></proof>
<goal name="WP_parameter app.2" expl="2. precondition">
<proof prover="3"><result status="valid" time="0.02" steps="4"/></proof>
</goal>
<goal name="WP_parameter app.3" expl="3. loop invariant init">
<proof prover="3"><result status="valid" time="0.03" steps="14"/></proof>
<proof prover="3"><result status="valid" time="0.03" steps="5"/></proof>
</goal>
<goal name="WP_parameter app.4" expl="4. loop invariant init">
<proof prover="3"><result status="valid" time="0.02" steps="4"/></proof>
<proof prover="3"><result status="valid" time="0.03" steps="15"/></proof>
</goal>
<goal name="WP_parameter app.5" expl="5. loop invariant init">
<proof prover="3"><result status="valid" time="0.01" steps="23"/></proof>
<proof prover="3" timelimit="36" steplimit="-1"><result status="valid" time="0.01" steps="5"/></proof>
</goal>
<goal name="WP_parameter app.6" expl="6. loop invariant init">
<proof prover="3"><result status="valid" time="0.02" steps="19"/></proof>
<proof prover="3"><result status="valid" time="0.01" steps="23"/></proof>
</goal>
<goal name="WP_parameter app.7" expl="7. precondition">
<proof prover="3"><result status="valid" time="0.02" steps="9"/></proof>
<goal name="WP_parameter app.7" expl="7. loop invariant init">
<proof prover="3"><result status="valid" time="0.02" steps="11"/></proof>
</goal>
<goal name="WP_parameter app.8" expl="8. assertion">
<proof prover="3"><result status="valid" time="0.02" steps="20"/></proof>
<goal name="WP_parameter app.8" expl="8. precondition">
<proof prover="3"><result status="valid" time="0.02" steps="10"/></proof>
</goal>
<goal name="WP_parameter app.9" expl="9. precondition">
<proof prover="3"><result status="valid" time="0.02" steps="13"/></proof>
<goal name="WP_parameter app.9" expl="9. assertion">
<proof prover="3"><result status="valid" time="0.02" steps="21"/></proof>
</goal>
<goal name="WP_parameter app.10" expl="10. loop invariant preservation">
<proof prover="3"><result status="valid" time="0.02" steps="14"/></proof>
<goal name="WP_parameter app.10" expl="10. assertion">
<proof prover="3" timelimit="36" steplimit="-1"><result status="valid" time="0.01" steps="42"/></proof>
</goal>
<goal name="WP_parameter app.11" expl="11. loop invariant preservation">
<proof prover="5" timelimit="16" steplimit="-1"><result status="valid" time="3.93"/></proof>
<goal name="WP_parameter app.11" expl="11. precondition">
<proof prover="3"><result status="valid" time="0.02" steps="15"/></proof>
</goal>
<goal name="WP_parameter app.12" expl="12. loop invariant preservation">
<proof prover="3"><result status="valid" time="0.02" steps="16"/></proof>
</goal>
<goal name="WP_parameter app.13" expl="13. loop invariant preservation">
<proof prover="6"><result status="valid" time="3.12"/></proof>
</goal>
<goal name="WP_parameter app.14" expl="14. loop invariant preservation">
<proof prover="3"><result status="valid" time="0.02" steps="18"/></proof>
</goal>
<goal name="WP_parameter app.15" expl="15. loop invariant preservation">
<transf name="introduce_premises">
<goal name="WP_parameter app.13.1" expl="1. loop invariant preservation">
<goal name="WP_parameter app.15.1" expl="1. loop invariant preservation">
<transf name="inline_goal">
<goal name="WP_parameter app.13.1.1" expl="1. loop invariant preservation">
<goal name="WP_parameter app.15.1.1" expl="1. loop invariant preservation">
<transf name="split_goal_wp">
<goal name="WP_parameter app.13.1.1.1" expl="1. VC for app">
<proof prover="3"><result status="valid" time="0.09" steps="123"/></proof>
<goal name="WP_parameter app.15.1.1.1" expl="1. VC for app">
<proof prover="3"><result status="valid" time="0.09" steps="135"/></proof>
</goal>
<goal name="WP_parameter app.13.1.1.2" expl="2. VC for app">
<proof prover="5"><result status="valid" time="3.42"/></proof>
<goal name="WP_parameter app.15.1.1.2" expl="2. VC for app">
<proof prover="5"><result status="valid" time="2.66"/></proof>
</goal>
</transf>
</goal>
......@@ -395,30 +419,30 @@
</goal>
</transf>
</goal>
<goal name="WP_parameter app.14" expl="14. loop invariant preservation">
<proof prover="5" timelimit="16" steplimit="-1"><result status="valid" time="3.65"/></proof>
<goal name="WP_parameter app.16" expl="16. loop invariant preservation">
<proof prover="0" timelimit="36" steplimit="-1"><result status="valid" time="6.21"/></proof>
</goal>
<goal name="WP_parameter app.15" expl="15. loop variant decrease">
<proof prover="3"><result status="valid" time="0.85" steps="346"/></proof>
<goal name="WP_parameter app.17" expl="17. loop variant decrease">
<proof prover="3"><result status="valid" time="0.85" steps="388"/></proof>
<proof prover="5"><result status="valid" time="0.02"/></proof>
</goal>
<goal name="WP_parameter app.16" expl="16. precondition">
<proof prover="3"><result status="valid" time="0.02" steps="10"/></proof>
<goal name="WP_parameter app.18" expl="18. precondition">
<proof prover="3"><result status="valid" time="0.02" steps="11"/></proof>
<proof prover="5"><result status="valid" time="0.01"/></proof>
</goal>
<goal name="WP_parameter app.17" expl="17. assertion">
<proof prover="3"><result status="valid" time="0.21" steps="109"/></proof>
<goal name="WP_parameter app.19" expl="19. assertion">
<proof prover="3"><result status="valid" time="0.21" steps="107"/></proof>
<proof prover="5"><result status="valid" time="0.02"/></proof>
</goal>
<goal name="WP_parameter app.18" expl="18. assertion">
<proof prover="3"><result status="valid" time="1.73" steps="613"/></proof>
<proof prover="5"><result status="valid" time="0.69"/></proof>
<goal name="WP_parameter app.20" expl="20. assertion">
<proof prover="3"><result status="valid" time="8.12" steps="2082"/></proof>
<proof prover="5"><result status="valid" time="0.67"/></proof>
</goal>
<goal name="WP_parameter app.19" expl="19. assertion">
<goal name="WP_parameter app.21" expl="21. assertion">
<proof prover="5"><result status="valid" time="0.08"/></proof>
</goal>
<goal name="WP_parameter app.20" expl="20. postcondition">
<proof prover="6" timelimit="6"><result status="valid" time="5.99"/></proof>
<goal name="WP_parameter app.22" expl="22. postcondition">
<proof prover="6" timelimit="6"><result status="valid" time="4.58"/></proof>
</goal>
</transf>
</goal>
......@@ -431,7 +455,7 @@
<proof prover="3" steplimit="-1"><result status="valid" time="0.02" steps="8"/></proof>
</goal>
<goal name="WP_parameter in_place_reverse.3" expl="3. loop invariant init">
<proof prover="3" steplimit="-1"><result status="valid" time="0.02" steps="9"/></proof>
<proof prover="3" steplimit="-1"><result status="valid" time="0.02" steps="7"/></proof>
</goal>
<goal name="WP_parameter in_place_reverse.4" expl="4. loop invariant init">
<proof prover="3" steplimit="-1"><result status="valid" time="0.02" steps="25"/></proof>
......@@ -443,25 +467,36 @@
<proof prover="3" steplimit="-1"><result status="valid" time="0.02" steps="6"/></proof>
</goal>
<goal name="WP_parameter in_place_reverse.7" expl="7. assertion">
<proof prover="3" steplimit="-1"><result status="valid" time="0.20" steps="187"/></proof>
<proof prover="3" steplimit="-1"><result status="valid" time="0.08" steps="92"/></proof>
</goal>
<goal name="WP_parameter in_place_reverse.8" expl="8. loop invariant preservation">
<proof prover="3" steplimit="-1"><result status="valid" time="2.84" steps="1231"/></proof>
<proof prover="3" steplimit="-1"><result status="valid" time="4.50" steps="2689"/></proof>
</goal>
<goal name="WP_parameter in_place_reverse.9" expl="9. loop invariant preservation">
<proof prover="6" timelimit="6"><result status="valid" time="5.13"/></proof>
<proof prover="6" timelimit="6"><result status="valid" time="11.12"/></proof>
</goal>
<goal name="WP_parameter in_place_reverse.10" expl="10. loop invariant preservation">
<proof prover="5" timelimit="16" steplimit="-1"><result status="valid" time="1.40"/></proof>
<proof prover="5" timelimit="16" steplimit="-1"><result status="valid" time="0.51"/></proof>
</goal>
<goal name="WP_parameter in_place_reverse.11" expl="11. loop invariant preservation">
<proof prover="6"><result status="valid" time="10.27"/></proof>
<transf name="inline_goal">
<goal name="WP_parameter in_place_reverse.11.1" expl="1. loop invariant preservation">
<transf name="split_goal_wp">
<goal name="WP_parameter in_place_reverse.11.1.1" expl="1. VC for in_place_reverse">
<proof prover="3" timelimit="36" steplimit="-1"><result status="valid" time="0.07" steps="81"/></proof>
</goal>
<goal name="WP_parameter in_place_reverse.11.1.2" expl="2. VC for in_place_reverse">
<proof prover="3" timelimit="36" steplimit="-1"><result status="valid" time="12.39" steps="2292"/></proof>
</goal>
</transf>
</goal>
</transf>
</goal>
<goal name="WP_parameter in_place_reverse.12" expl="12. loop variant decrease">
<proof prover="3" steplimit="-1"><result status="valid" time="0.41" steps="253"/></proof>
<proof prover="3" steplimit="-1"><result status="valid" time="0.41" steps="264"/></proof>
</goal>
<goal name="WP_parameter in_place_reverse.13" expl="13. postcondition">
<proof prover="3" steplimit="-1"><result status="valid" time="0.43" steps="993"/></proof>
<proof prover="3" steplimit="-1"><result status="valid" time="0.43" steps="1067"/></proof>
</goal>
</transf>
</goal>
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment