diff --git a/bundles/cnf/localrepo/index.xml b/bundles/cnf/localrepo/index.xml index 5040a7010..9dbd43de2 100644 --- a/bundles/cnf/localrepo/index.xml +++ b/bundles/cnf/localrepo/index.xml @@ -1,1211 +1,839 @@ - + - + - + - - + + - - - - - - - - - - - - - - - - - - - - - + + - - - + + + - - - + + - - + + - - + + - + - - + - - + + + + + + + - + - + - - + + - - + + - - + + - + - - + - + - - - + + - - - - - - - - - - - - - - - - - - + + - - + + - + - - - - - - - - - - - - - - - - - - - - - - - - - - - + - - + - - + + - - - - - - - - - - - - - - - - - - - - - - + + - - + + - + - + - + - - + + - - + + - - + + - + - - + - + - - - + + - - + + - - + + - - + + - - + + + + + + - - + + - + - - - - - - - + + - - - + + - - - + + - - - - - - - - - - - - - - - - - - - - - - - + + - + + - - - + + - - + + - - - + + + - - - + + - - + + + - - - + + + - - + + + - - + + - - + + + - - - + + + + + + + + - - + + - + - - + + + - - + + + - - + + + - - + + + - + - + + - + - + - + - + - + - + + + + + + + + + + + + + + + + + + + + + + - + - + - - + + - - - - - - - - - - - + + - - + + - + - - - - - - - - - - - - - - - - + - + - - + + - - + + - - + + - + - + - + - + - - + + - + - + - + - - + + - - + + - - - + + - - - + + - - + + - - + + - - - - - - - + + - - + + - + - + - + - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - - + + - + - - + + + - - + + - - + + - - + + - - + + - + + + + + + + + + + + + + + + + + + - - - - + + + - - - + + + + + + + - - + + - + - - - - - + - + - - - + + - - - - - - - - - - - - - - - - + + - - + + + - - + + - + - - + + + - - + + - - + + - - + + - - + + - - - - - - - - - - - - + + + - - - + + + - - - + + + - - + + - + - - - - - - - - - - - - - - - - - - - + - + - - + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + - - + + - + - - - - - - - - - - - + - + - - + + - - - - - - - - - - - - - - - - - - - - - - + + - - - + + + - - + + + - - + + - + - + - - + - - - - - - - + - - - - - - - - - - - - - - - - - - - - - - - - + - + + - + + - + - + - + - + - + - + - + - + - + - + - - - - + - + - + - - + + - - - - - - + + - - - + + - - - + + + - - - + + + - - + + - + - + + - + - + - + + + + + + + + + + + + + + + + - - + - + - - - + + - - - - - - + + - - + + - + - - - - - - - - - - - - - - - - - + - + - - + + - - + + - - + + - + - - + - + - - - + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + - - + + - - + + - + + + + - - - - + - - + - - + + + + + - + - + - + - + - + - + - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -1324,1047 +952,1117 @@ - - + - + - - - + + - - + + - - + + - + - + - + - - + + - - + + - - + + + - - + + + - - + + + + + + + + + + + + - - + + - + - - + - + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - + + - + - - + + + - - - - - - - - - - - - + + - - + - - + - + - + - - + - - + - - + - - + - - + + - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + - - + + + - + + - + + - - + + - - + + - - - - - + + + - - - - - - + + + - - - + + + - - - + + + - - + + - - - - - + + + - - - - - - - - - - - - - - - - - - - - - - - - - + + + - - - + + + - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - + + - + + + + - + + - + - - + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - - + + - - + + - - - - + + + + + - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - + + + + - - - - + + + - - - + + + - - + + - - + + - - - + + + - - + + - - + + - - - + + + + + - - - + + + + + + + + + + + + + + + + + + + - - - + + + + - - - + + + - - + + - - + + - - + + - - + + - + - + + + + + + + + + + - - + - + - - - + + - - + + - - + + - + - + - + - - + + - - + + - - + + - + - + + - + - - + + + - - - - - - + + - - + + - - + + + - - + + - - + + - + + + + + + + - + + - + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + - + - - + + - - - - - - - - - - - - - - - - + + - + - + - - + + - + - - + + + + + + + + + + + + + + + + + - + - + - - + + - - + + - - + + + - - + + + - - + + - - + + - - - + + + - - + + - + - + - + - + - - + + - - + + - - + + - - + + - - + + - - - + + - - + + - - - + + - - + + - - + + - - + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + - - - + + - + - + - + - + - + - + - + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - + + - + - - + + + - - - - - - - - + + - - - - - - + + + + - - - + + + + - - - + + + + - - - - - + + + + - - - - - - + + + + - - - + + + + - - - + + + + - - - - - + + + - - - - - - + + + - - - + + + - - - + + + - - - - - + + + - - - - - - + + + - - - + + + - - - + + + - - - - - + + + - - - - - - + + + - - - + + + - - - + + + - - - - - + + + - - - - - - - + + + - - - - + + + - - - + + + - - + + - - + + - - - + + - - + + - - + + - - + + - - + + - - + + - + + - - + + + + + + + + + + + + + + + + + + - + - + - - + + - - + + - - + + - + - + + - + + - - + + - - + + - - - - - + + + + - - - - - - - - + + + + - - - + + + - - - + + + + - - - + + + + + + + - - + + - + - + - + - + - + - + + - + - + - + + + + + + + + + + + + + + + + + + + @@ -2373,576 +2071,704 @@ - + - + - - + + - - + + + + + + + - + + - + + + + + - - + + - + - + - + - + + + + + + + - + - + - + - + - + - + - + - + - + - + - - + + - - - - - - - - + + - - - - - - + + + - - - + + + - - - + + + - - + + - - + + - + - + - + - - + + - - + + - - + + - - + + - - + + - - + + - - - - - - - - - - - - - - - - + + + + + - + + - + - - + + + - - - - - - - - - - - - - - - - + + - + - + - - + + - + + + + + + + - - + - - + - - + - - + - + - - + - - + - - + - - + - - + - - + - - + - - + - + - + - + - - + - + + + + + + + + + + - - + - - + - - + + - - + + - - - - + + + + + - - - - + + + + + + - - - - + + + - - - - + + + - - + + - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - + + + + + - - + + - + + + + - + - - + - + - - - + + - - - - - - - + + - - + + - + - - - - - - - + - + - - + + - - + + - - + + - + - - + - + - - - + + - - - - - - + + - - - + + + + + - - - + + + + + + + + + + + + + + + + - - + + - - + + - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - + + - - + + - - + + - - + - - - + + + - - + + - + - + - - + - + - - - - - - + + - - - - - - - - + + + + + + + + + + + + + + + + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + - - + + + + + + + + + + + - - + + - + @@ -2950,2826 +2776,3011 @@ - + + - + - - + + - - + + + + + + + - - + + - + + + + - + + - + - - + + + - - + + + + + + + - - + + - + + + + + + + + + + + - + - + - - + + - - + + - + + + + + + - - + + - + - + + + + + + + + + + + + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + + + + - + - - + - + - - - + + - - - - - - - + + - - + + - + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - + - - + - - + + - - + + - - + + + + + + - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - + - - + + + - - - - - - - - - - - - + + - - - + + + - - + + - + + + + + + + - + - + - + - + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + + - + - - + + + - - + + + + + + + + + + + + + + + + + + + + + + + + - - + + - + + + + + + + + + + + + + + + + + + + + + + - + + - + - - + + + - - + + + + + + + + + + + + + + - - + + - + + + + + + + + + + + + + + + + + + + + + + - + - + - - + + - - - - - - + + - - + + - + - - - - - - - - - - + + - + - - + + + - - + + + + + + - - + + - + + + + + + + + + + + + + + + - - + + - - + - - + + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - + - - + + - - + + + + + + + + + + + + + + + + + + + + + + + + - + - + - - + + - - + + - - + + - + - + + - + - - + + - - + + + + + + + - - + + - + + + + - + - + - - + + - - + + - - - - + + + + + - - - - + + + + + + + + + + + + + + + + - - - + + - - - + + - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - + + - - - + + - - - + + - - - + + + - - - + + - - - + + - - - + + - - - + + - - - + + - - - + + - - + + - - + + - - + + - + - - - - - - - - - - + - - - - - - - - - + - + - + - + - - - - + - + - - + - + - - - - - - - - - - - - - - - - + - + - + - - - - - + + + - - - - - - - - + + + + - - - + + + + - - - + + + - - - + + - - - + + - - + + - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + - - + + + - - - - + - + - + - - + + - - - - - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + + - - + + - - - + + - - - + + - - - + + - - - + + - - - + + - - - + + - - - + + - - - + + - - - + + - - - + + + - - + + - - + + - + - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - + + - + - - + + + - - - - - - - - - - - - - - - - - - - + + - - - + + + - - - - - + + + - - - - - - - - + + + - - - + + + - - - + + + - - + + - - + + - - + + - - + + - - + + - - + + + + + + + - - + + - + + + + + + + + + + + + - + - + + + - - + + + + + + + + - + - + - - + + - - + + - - + + - + - - + + - + + - - - + + - - + + - - + + + - - - + + + - - + + - + - - + + - - - + + - - - + - - - + - - - + - - - + - - - + - - - + - - - + + + + + + + + + + + + + - - + + - + + - - - + + - - + + - - - + + + - - - + + + + + + + + + + + + + - - + + - + - - + + - - + + - - - + + + - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + - + - - + + - - + + + + + + + - - + + - + + + + + + + + + + + + + + + + + + + + + + + + + - - + - + - - - + + - - + + - - - + + + + + - - - - + + + + + + - - - - + + + - - - - + + + - - + + - + - - - - - - - - + - + - - + + - - + + - - + + - + - + - + - - + + - - + + - - + + - + - - + - + - - - + + - - + + + + + + + + + + + + + + + + + + + + + + + - - - + + - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - + + - + - - - - - - - - - - - - - - - - - - - - - - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - + + - + + - - - + + - - - - - - + + - - + + + - - + + - - + + - + - - + + - - - + + - - - + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - + - + - + - + - + - - + + - - + + - - + + + - - + + + - - + + + - - + + + - - + + + - - + + + - - + + + - - + + + - - + + + - - - + + + - - - + + + - - - + + + - - + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + - - + + + - - + + - - + + - - + + - + - + + + - + + + + + - + + + + + + + + + - + - + - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - + + + + + + - - + + - + + - - - + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + - - + + + - - + + - + - - + + - - + + - + - + - + + + + + + + + + + - + + - + - - + + + - - + + - - + + - + + + + + + + - + - + - - + + - - - - - - - - - - - - - - - - - - - - - - - - - - - + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + - - + + - - + + - + - - - - - - - - - - - + + - - - + + + - - + + - - + + - - + - - + + + - - - - - - - - - - + + - - + + + - - - + + + - - + + + - - + + + - - + + - + - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + - + + + + + + + + + + + + + + + + + - + - - + + - - + + - - + + - + - + - + - - + + - - + + - - + + + - - - + + + - - + + - + - - + - - - + + - + - + - + - + + + + + + + + + + + + + + + + - + - + - - + + - - - - - - + + + - + - - + + - - + + - + - - - + - - + + + + + + + + + + + + + - + - + - + - + - + - + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + - + - - + + - - - - - - - - - - - - - - - - - - - + + - - - + + + + - - - - - + + + + - - - - - - - + + + + - - - - + + + + - - - + + + + - + - + - + - + - - + + + - - + + + - - + + - + - - + + - - - + + - + - + - + - + - + - + - + - + - + - + - + - - + + - - + + - - + + - + - + - + - + + - + + - + + - + + - + - + - - + + - + - - - - - - - - - + - - - - + + + - - - + + + + + + + - - + + - + - - - - - - - - + + - + - - - + + - - - - - - - - - - - - - - - - - - - - - - + + - - - - - - - - - - - - + + - - + + - + - - - - - - - - - - - - - - - - - - - - - + - - - - + - - - - - - - - - - - - - - - - - - - - + + - + - + - - + + - - - - - - - - - - - - - - - - - - + + - - + + - + - - - - - - - - - - + - + - - + + - - + + - - + + - + - + - + - - + + - - - - - - - - - - - - - - - - - - - - - - - - - - + + - - + + - + - - - + - + - + - - + + - - + + - - + + - + - - + - + - - - + + - - + + + + + + + + + + + + + + + + + + + + + + + - - + + - - + + - - + + - - + + - - + + - + - - - - - - - - - - - - - - - - - - - - + + - - - + + - + - - + - + - - - + + - - - - - - - - - - - - - - - - - - - - - - - - - + + - - - + + + + + - - - + + + + + + + + - - - + + + - - - + + + - - + + + - - + + - + - - + + - - + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + + + + + + + @@ -5780,334 +5791,697 @@ - - - - - - - - - - - + + + + - - + + - + + + + - + - + - - + + - - + + - - + + - - + + - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - + + - + - + + - + + + + + + + + + + + + + + + + + + + + + + + + + + - - + - - + - - + - - + - - + - - + - + - + - + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + - + - - + + - - + + - - + + - + - + - + - - + + - - + + - - - + + + + + + + + + + + + + + + + + + + + - - + + - + - - - - - - - + - + - - + + - - + + - - + + - + - - + + - + + - - + + - - + + - - - + + + - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - + + - + - + - + - + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + - + - + - - + + - + - + - + - - + + - - + + - - - - - + + + - - - - - - + + + - - - + + + - - - + + + + + + + - - + + - + + + + + + + + + + + + + + + + + + + + + + - + - + - - + + - - + + - + - + - - - + - + - - - - + + - - + + - - + + - + - - + + + + + + - + @@ -6116,10 +6490,7 @@ - - - - + @@ -6127,1015 +6498,989 @@ - - - - + - + - + - + - - + + - - + + - - + + - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - + - - - + + - - - - - - - - - - - - - - - - - + + - - + + - - + + - + - - - - - - - - - - - - - + - + - - + + - - + + - - - - - - - - - - - + + + + - - + + - + + + + - + - + - - + + - - + + - - + + - + - + - + - - + + - - + + - - - + + + - - + + - + - - - - + - + + - + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - + - + - + - + - + - + + - + - - + + + - - + + - - + + + - - + + + - - + + + - - + + + - - + + + - - + + + - - + + + - - + + - - + + - + - - - + + + + + + - - + - - + - - + - + - + - + - + - + + - + - - + + + - - + + - - - - - + + + + - - - - - - + + + + - - - + + + + - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - + + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + + - + - - + + + - - + + + + + + + + + + + - - + + - + + + + + + + + + + + + + + + + + + + + + + + - + - + - - + + - - + + - - + + - - + + - - + + - - - - - - + + - - + + - - + + - + - + - - + + + + + + - - + + + + + + + + + + + + + + + + + + + + + - + - - - + + - - + + + - + - + + - + + - + - - + + - + - - - - - - - - - - - - - - + + - - + + - - + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + - + - + + - + + - + + - + + - + + - + + - + + - + + - - + - + - + - + + - + - + - + - - + + - - + + - - + + - + - - - - - - - + + + + - - - - + + + + - - - - + + + - - + + - + - - - - + - + - - + + - - - - - - + + - - - + + + + + - - - + + + + + + + + - - - + + + - - - + + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + - - - + + - - + + - + - - - - - + + - + - + - + - + - + - + - + - + - + - + - + - + - + + - + + - + - + - - + + - - + + - - - + + - - - + + + + + + + + + + + + + + + + + + + + + + + + + + - - + + - + - + - - + + - - + + - - + + + - - + + - - - + + + + + + + + - + - + - + + - + + - + + - + + - + + - + - + - - + + - - - - - - - + + - - - + + + - - - + + + - - + + - - + + - + - - + + - + - - - - + - + - + - + - + - + - + - + - + @@ -7144,16 +7489,7 @@ - - - - - - - - - - + @@ -7161,27 +7497,14 @@ - - - - - - - - - - - - - + - - + @@ -7192,1373 +7515,1181 @@ - - - - - - - + + - + + - - + + - - + + - - - + + + + + + + + + + + + + - - + + - + - - - - - - - - - - - - - - - - - - - - + + - + - + - + - + - + + - + - - + + + - - + + + + + + + + + + + + + + + - - + + - + + + + + + + + + + + + + + + - + + - + - - + + + - - + + + + + + + + + + + + + + + + + + + + + - - + + - + + + + + + + - + - + - - + + - - + + - - + + - + - - - - - - - - - - - + + + - - + + - + + + + - + + - + - - + + + - - + + - - - + + - - + + - - + + - + - + - - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - + - - + + - - + + - - + + + + + + + + + + + + + + - - + + - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - - - - - + + - + + - - - + + - - - - - - - + + - - + + + - - + + + - - - - + + - - - + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + - - + + - - + + - - + + - - + + - - + + + + + + + + + + + + + + + + + + - - + + - - + + - - + + - - + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + - - - + + + - - - + + + - - - + + + - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - + + - + - + - + - + - + - + - - + - - + - - + - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + - + - - + + - - + + - - + + - + - - + - + - - - + + - - - - - - - - - - - - - - - - - - - - - - - - - + + - - + + - + - - - - - - - - - - - - - - - - - - - - - - + - + - - + + - - - - - - - + + - - - - + + + + + - - - + + + + + + - - - - + + + - - - + + + - - + + - + - + - + - - + + - - - - - - - - - - + + - - + + - - + + - + - - - - - - - - - - - - - - - + - - - + + - + - + - - + + - - + + - - + + - - - + + + + + - - - + + + + + + + + + + + + + + - - - + + + + + + + - - - - - - - - - - - - - - + + + - - + + - + - - - - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - + - + + + + - + - + - - + + - - + + - - - + + - - - + + - - - + + - - - + + - - - + + - - - + + - - - + + - - - + + - - + + + + + + + + + + + + + + + + + + - - + + - + - - - - - - - - - - - - - - - - - - - - + + - - - - - - - - - - - - - - - - - - - - - - - + + - - + + - - + + - + + - + + - - + + - - + + - - - - - + + + - - - - - - - + + + + - - - - + + + + - - - + + + + - - + + + - - + + + - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - + + - + - - - - - - - - - - - + + - - - + + - + + - + - - + + + - - + + - - + + - + - - - - + + + + + + + + + + + - - + + - + - - - - - + + - - + - - + + + - - + + - - + + - - + + - - + + - - + + - + - - + + - - + + + - - + + + - - + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - - + + - - - - - - + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + - - + + + - - + + - - + + - + - - - - - - - + + - + - - - - - - - + + - - - - - - - - - - - - - - - - - - - - - @@ -8618,1745 +8749,1867 @@ - - - - - - - - - - - - - - - - - - - - - - + - + - + - - + + - + - + - + - - + + - - + + - - + + - + - + + - + - - + + + - - - - - - - - + + - - - - - - - + + + + - - - - + + + + - - - + + + + - - + + - + - + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - + + - + + - - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - + - - - - - - - - - - + + - + - + - - + + - - + + - - + + + - - + + - - - + + + - - - - - - - - - + + + - - - - - - - - - - - - - + + + + - - - - + + + + - - - + + + - - + + + + + + + + + + - - + + - + - - - - - - - + + - + + - + + - - + + - - + + - - - - - + + + - - - - - - + + + - - - + + + - - - + + + - - - - - + + + - - - - - - + + + + + + + + + + + + + + + + + + + + + + + - - + + - + - - - - + - + - - + + - - - - - - + + + - + - - + + - + - + - - - + + - - - + + - - - + + - - - + + - - + + - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - + - + - - - + + - - + + + + + + + + + + + + + + + + + + + + + + + + + - - + + - - - + + - - - + + - - - + + - - + + - - - + + - - - + + - - - + + + + + + + + + + + + + + + + + + - - + + - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - + - - + + - - - - - - - + + - - + + - + - - - - - - - - - - - - - - + - + - - - + + - - - - - - + + - - + + - + - - - - - - - - - - - - - - - - - - - - - - - - - + - + - - + + - - + + - - + + - + - + - + - - + + - - + + - - + + - + - + - + - - + + - - + + - - + + - + - - - + + + + - - - - - + + + - - + + + + + + + + + + - - + + + + + + + + + + - - + + - + - - - - - - - - - - - - - + + - - + + - + - + - + - + - + + + + + + + + + + + + + + + + + + - + + - - + + - - + + + + + + + + + + + + + + + + + + + + + + - - + + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + - + - - + + - - + + - - + + - + - + - + - - + + - - + + - - + + - - - + + - - - + + - - - + + - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - + + - + - - - - - - - - - - - - + - + - - + + - - + + + + + + + + + + + + + + + + + + + + + + + + + + - + + + + + + + + + + - - + + - + - + + + - + + + - + - + - + - + - + - + + - + + + + + - + + - + - - + + + - - + + - - + + - - + + - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - + + - + - + + + + + + - + - - + + + + + + - - + - + - - - + + - - + + + + + + + - - + + - + + + + + + + - + - + - - + + - - + + - - + + - + - + - + - - + + - - + + - - - - + + + + + - - - - + + + + + + + + + + + + + + - - + + - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + - + - - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + + + + + + + + + + + + + - - + + - + - - + + - - - + + - - - + + - - - + + - - - + + - - + + + + + + + + - - + + - - + + + + + + + + + + + + + + + + + + - - + - + - - - + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + - - + + - + - - - - - - - - - - - + - + - - + + - - + + - - + + - + - - + - + - - - + + - - - - - - - - - - - - - - - - + + - - + + - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - + - - - + + - - + + - - + + - + - - - + + + + - - - + + + + + - - - + + + + + + + + + + - - + + - + + + + - + - + - - + + - - + + - - + + - - + + - + + + + + + + - + - + - - + + - - + + - - + + + - - + + + - - + + + - - + + + - - + + + - - + + + - - + + - - + + - + - + - - + - - + - - + - - + - + + - + - + - + - + - + - + - + - + - - + + - - + + - - + + - - + + - - - + + + + + + - - + + - + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + + - + - - + + + - - - - - - - - - - - - - - - - - + + - - - + + + + - - - + + + + - - - + + + - - - + + + - - - + + + - - - + + - - - + + - - - + + - - - + + - - + + - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + - - + + - + - + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + - + - + - + - + - + - + - + - - - - + - - - - - - - - - - - - - - - - - - - - - - + + - + - - + + + - - + + - - + + + - - + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + - - - - - - - - - - - - - - - - - - - - - - - - + + + - - - + + + + - + - + + + + + - - + + - + - + - + - + + + + - + + + + @@ -10368,23 +10621,29 @@ - + - + - + + + + + + + @@ -10394,6 +10653,12 @@ + + + + + + @@ -10406,1174 +10671,1038 @@ - - - - - - - + - + - + - + - + - + - + - - + + - - + + - - + + - + - - + + - - + - - + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + - - - + + - - - + + - - - - + + + + + - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - + + + - - - - + + + - - - + + - - - + + - - - + + - - - + + + - - - + + - - - + + - - + + - + + + + + + + - + - + - - + + - - - - - - - - - - - - + + - - + + + - - + + - + - - - - - - - - - - + - - - - - - - - - - - - - - - - + - + - + - + - + - + - + - + - + - + - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - + - - + + - - - - - - - - - - - - - - - - - - - - + + - - + + - + - - - - - - + - + - - - + + - - + + - + - + - + - - + + - + - - + + - - + + - - + + - - + + - - - + + - - - + + - - - + + - - + + + + + + + + + + + + + + + + + + + + + + + + + + - + - + - - + + - - + + - - + + - + - - + + - + + - - - + + - - - - - - + + - - - + + + - - - + + + - - - + + + - - + + - + - - + + + + + + + + + + + + + + + + + + + + + + + - - - + + - - + + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + + - + + - - + + - - - - - - - - - - - - - - - - - - - + + - - - + + + + - - - - - + + + + - - - - - - + + + + - - - + + + + - - - + + + - - - - - + + + + - - - - - - + + + + - - - + + + + - - - + + + + - - - - - + + + + - - - - - - + + + + - - - + + + + - - - + + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - - - + + + + - - - - - - - - - - - - - - - - - - + + + + - - - + + + + - - - + + + + - - - - - + + + + - - - - - - - + + + + - - - - + + + + - - - + + + + - - - - - + + + + - - - - - - - + + + + - - - - + + + + - - - + + + + - - - + + - - - + + + - - - - - + + + + - - - - - - - - - - - - - - - - + + + + - - - - + + + + - - - + + + + - - + + + - - + + + - - + + + - - + + + - - + + - + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - + + - - + - - + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + - - + + - - + + + - - + + + - - + + + - - + + + - - + + - + + + + + + + + + + + + + + + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -11637,63 +11766,103 @@ + + + + + + + + + + + + + + + + + + + + + - + - + + - - + + - - + + - - + + - - - + + - - - + + - - + + - - + + - - - - + + + + + - - - - + + + + + + + + + + + + + + + + + + + - - - - + + + + + + + + - - + + - + @@ -11719,256 +11888,236 @@ - - + - - + - - + + - - - - - - - - - - - - - - - - - - - - - - - - - - + + - - + + - + - - - - + - + - - + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + - - + + - - + + - - + + - - + + - - - + + - - + + - - + + - + - - - - - - - - - - + + + - + - + - + - - - + + - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - + - + - + - + - + - + - + - + - - + - - + - - + - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + @@ -11976,2667 +12125,2795 @@ - - - - - - - - - - - - - + - - - - - - - - - - + - + - - + + - - + + - + - + + + + + - - + + - + - + - - + + - + - + - + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + - + - + - + - + - + - + - + + - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - + + - - - - - - - - - - - - - - - - - - - - - - - + - - + - - + + - - - - - - - + + - - + + - + - - - - - - - - - - - - - - - - - - - - - - + - + - - + + - - - - - - - - - - + + - - + + - - + + - - + + - - + + - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - - + - - + - + - - + + - - + + - - + + - + - - + - + - - - + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + - - + + - + - - - - - - - - - - - - - + + - + + - - - + + - - + + - - + + + - - - + + + + + + + + + + + + - - + + - + - - - - - - - + - - - + - - - + - + - + + - + - - + + + - - + + - - - - - + + + + - - - - - - - + + + + - - - - + + + - - - + + + + - - - + + - - - + + - - - + + + + + + - - + + - + - + - + - - - - - - - - - - - - - - - - - - - + - - + + - + + - + - + - + - + - + - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - + - + - - + + - - - - - - - - - - - - + + - - + + - + - - - - - - - - - - - - - - - - - - - - + - - + - - + + - - - - - - - + + - - + + - + - - - - - - - - - - - - - - - + - + - - + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + - - + + - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - + - - - + + - - - - - - - + + - - + + - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + - - + + - - + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + - - + + - - + + - - + + - - + + - + + + + + + + + + + - - + - + - - - + + - - - - - - - - - - - - - - - - - - - - - - - - - - + + - - + + - + - - - - - - - - - - + - - + - - + + - - + + - - + + - + - - - - - - - - - - - - - + - + - - + + - - + + - - + + - + - + - + - - + + - - + + - - + + + - - + + - + - + - + + + + + + + + - + + - + + - - + + - - + + - - - - - + + + + - - - - - - - + + + + - - - - + + + + - - - + + + + - - - - - + + + + - - - - - - - - - - - - - - - - - - - - - - + + + + - - - - + + + + - - - + + + + - - - + + + - - - + + - - - + + + - - - + + + - - - + + - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - + + - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + - + + - + + - + + - + + - + + - + + - + + - + + - + + - + + - + + - + + - - + + - - + + - + + - + - - + + + - - + + - - - - - + + + + - - - - - - - + + + + + + + + + - - + + - + - - - - - + + - + + - - - + + - - + + - - + + + + + + + + + + - - + + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + - - + - - + + + + + + + + + + - + + - + - - + + + - - + + + + + + + + + + + + + + + + + + + + + - - + + - + + + + + + + + + + + + + - + - + - - + + - - + + + + + + + + + + + + + + + + + + + + + + + - - + + + - - - + + + - - + + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + + - + + - + + - + + - + + - + + - + + - + + - + + - + + + + + + - + + - + + - - + + - - + + + + + + + + + + + + + + + + + + + + + + + + + + + - - + + - + + + + + + + + + + + + + + + + - - + - - + - - + + - - + + - - + + + + - - + + - - + + + - - - + + + + + + + + + + + + + + + + + + + + + + - - + + - - + + - + - - - - - - - - - - - - - - + - + - - + + - - + + - - - + + - - - + + - - - + + - - - + + - - - + + - - - + + - - - + + - - - + + - - - + + - - - + + - - - + + - - - + + - - - + + - - + + - - + + + - - - + + + - - - + + + - - - - - + + + + - - - - - - + + + + - - - + + + + - - - + + + + - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - + + - + - - - - - - + + + - - - + + + - - + + + - - + + + - - + + + - - - - - - - - - - - - - - - - - - - - - - + - + - - + + - - - - - - - - - - - + + - - - + + - - + + - + + - + - - - - - - - - + + + - + - + - + - - + + - - + + - - + + - + - + - + - - + + - - + + - - + + - + - - + + - + + - - - + + - - + + - - + + - - - + + + - - - - + + + + + + + + + + + + + + + + + + + + + + - - - + + - - + + - + - + + + + - + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - + + + + + + + + + + + - - + + - + - - - - + - + - - + + - - + + - - + + - + - + - + - - + + - - + + - - + + + - - - + + + + + + + + + + + + + - - + + - + + + + - - + - - + - + - - - - - - - - - - - - - - - - + + + + + + + + - + + - + + - - + + - - + + - - + + + + + + + + - - + + - + - - - - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - + + - + - + - - + + - - + + - - + + - + - - + - + - - - + + - - + + - - - + + + + + - - - - - - - - - - - + + + + + + + + - - - + + + - - - + + + - - + + + + - - + + + - - + + + + - - + + - + - - - - + + - - - + + - - - + + - - - - + + + + + - + - + + - + + - - + + - - - - - - + + - - + + + - - + + + - - + + + - - + + + - - + + + - - + + + - - + + + - - + + + - - + + + - - + + - + - - - - - - - - - + - + - + - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - + + - - - + + - - + - - + - - + - - + - - + - + - + - - + + - - + + - - + + - + - - - + + + - - - - + + + - - - + + + - - + + + + + + - - + + - + - + + + + + + + + + + + + + + + + - + - + - - + + - - + + - - + + - + - + + - + - - + + + - - + + + + + + + - - + + - + + + + + + + + + + + + + + + + + + + + + + + + + - + - + - - + + - - + + + + + + + + + + + + + + + + + + + + + + + + + - - + + + - - + + + - - + + + - - + + + - - + + + - - + + + - - + + + - - + + + - - + + + - - + + + - - - - - + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - + + - - - - + + - - - - + + - - - - + + - - - - + + - - - - + + - - - - + + - - - + + + + + + + + + + + + + + + + + + + + + + + + + + - - - + + - - - + + - - + + - - - - - - - - - - - - - - - + + + + + - + - + - - + + - - + + - - + + - + - - + - + - - - + + - - + + - - + + - + - + - + - - + + - - + + - - + + - + @@ -14662,567 +14939,485 @@ - + - + - - + + - - - - - - - - - - - - - - + + - - + + - + - + - + - - + + - - + + - - + + - + - + - + - - + + - - - - - - + + - - + + + - - + + + - - + + - - + + - - + + - + + - + + - + + - - + - - + - - + - + - + - - + + - - - - - - - - - - - - - - - - - - + + + - + + - + + - + - - + + - - + + - - + + - + - + - - - + + - - + + - - + + - - + + - - + + - - + + - - - - - - - + + + + - - - + + + - - + + - + - - - - - + + + + + + + + - + - - - + + - - + + - - + + - - + + - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - + + - + - - - - - - - - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - + + + - - + + + - - + + + - - + + + - - + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + - + + - - + + - - - - - - + + - - + + + - - + + + - - + + + - - + + + - - + + + - - + + + - - + + + - - + + + - - + + + - - + + + - - + + - + - - - - - - - - - - - - - - - - + - + - + - + - + - + + - + + - + + - + + - + - + - - + + - - - - - - - - - - - - - - + + - - - + + - - - - - - - - - - - - + + - - + + - + - - - - - - - + - - - - - - - - - - - - + + + + + + + @@ -15261,744 +15456,1118 @@ - + - + - - + + - - + + + + + + - - + + - + - + + - + - - + + + - - + + + + + + + + + + + + + + - - + + - + + + + + + + + + + + + + - + + - + - - + + + - - + + - - - - - + + + - - - - - - - - + + + - - - + + + - - - + + + - - - + + - - - - - + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + - - + + - + - - + + + + + + + + + + - + - + - - + + - - + + + + + + + + + + + + + + - - + + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + + - + - - + + + - - + + + + + + + + + + + - - + + - + + + + + + + + + + + + + + + + + + + + + - + + - + - - + + + - - + + - - + - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - + + - + - - + + + + - - + + + + + + + + + + + + + - + - - + + - - + - - + + + - - + + - - - + + - - - + + - - + + - + - - - - - - - - - - - + + - - + + + - - + + + - - + + + - - + + + - - + + - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + - + + - + + - + - + - - + + - - + + - - + + - + - - + - + - - - + + - - + + - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - + + + - - + + + - - + + - + - - - - - - - - - - - - - + - + - + - + - + - + - + - + - + - + - - + + - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - + + - - + + - - + + - - + + - - + + + - - + - - + - - + + - - + + + + + + + + + + + + + + + + + + + + + + + + + - - - + + + - - + + - + + + + - + - + - + - + - + - + - + - + - + - + - + + - + - + - + + + + - - + - - + - + + + + + + + + + + + + + + + + + + + + + + + + - - - + + + + + + + + + + + + - - + + - - + + - + - + - + - - - - - - - - - - - - - - - - - - - - - - - + + + - + - + - - + + - - + + - - + + - + - - + - + - - - + + - - - - - - + + - - + + - - + + + - - + + + - - + + + - - + + - + - + - - - - - - - - - + - + - - + + - - + + - - - + + + + + + + + + + + + + + + + + + + + + + + + + + - - + + - + - + + - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - + + + + + + + + + + + - - + + - + - - - - + - + - - + + - - + + - - + + - + + + + + + + + + + + + + + + + + + + + + + - + - + - - + + - - + + - + - + - + - + + + + + + - - + + - + @@ -16006,4254 +16575,4469 @@ - - - - - - - - - - - - - - - - - - - - - - - - - + + + - - + + - + - - - - - + + - + - + - - + + - - + + - - + + - + - + + - + - - + + + - - - - - - - - - - - - - - - - - - - + + - - - + + + + - - + + + - - + + + - - + + + - - + + + - - + + + - - + + + - - + + + - - + + + - - + + + - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - + + - - + + - - + + + - - + + - - + + + - - + + + - - + + + - - + + + - - + + + - - + + + - - + + + - - + + + - - + + + - - + + + - - + + + - - + + + - - + + + - - + + - - + + + - - + + - - + + + - - + + - + + + + + - - + + - - + - - + + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - + + + + + + + + + + + + + + + + - + + - + + - - + + - - - - - - - + + - - + + - + - - - - + + - + - + - + - + - + + + + + + + + + + - + - + - - + + - - - - - - + + - - + + + - - + + + - - + + - - + + - - + + - - - + + + + + - - - + + + + + + + + + + + + + + + + + + + + + + + + - - + + - - + + + - - + + + - - + + - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + - + + - - + + - - + + - - - - - - - - - - - - - - - - + + - - - - - - - - - - - - - - - + + - + - + - - + + - - + + - - + + + - - + + + + + + + + + + + + + + + + + + + + - - + + - + - + - + - - + + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + - + - - + + - - + + - - + + - + - - + + - + + - - - + + - - - - - - + + - - + + + - - - - - - - - - - - + + + - - + + - + - - - - - - + + - + - + - + - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - + - + - + - + - + - + - + - - + + + + + + + + + + + + + + + + - + - + - - + + - - - - - - - - - - - - - - + + - - + + - + - - - - - - - - - + - + - - + + - - + + - - + + - + - + - + - - - - - + - + - + - + - - + + - + - + + - + + + + + + + + + - + - + - - + + - - + + + - + + - - - - - - - - - + - - + + - + - - - - - - - - - - - - - - - - - - - - - + - - + - - + - - + - - + - - + - + - - - + + - - + + - - - + + - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - + + + - - - + + + - - + + + - - + + - + - - - + + - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + + - + - - + + + - - + + - - + + - + - - + + - - + + - - + + - - - - - - - - - - - - - - - - - - - - - - - - - - - + + - - - + + + - - - + + + - - - + + + - - - + + + - - + + + - - - + + + - - - - + + + + + - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - + + + - - - - + + + - - - - + + + + + - - - - + + + + + + + - - - - + + + + - - - - + + + - - + + - - - + + + - - - + + + - - - + + + + + - - - - + + + + + + + + + + + + + + + + + + + + + + + - - - - + + + - - - - + + + - - - - + + + + + - - - - + + + + + + + - - - - + + + + - - - + + + - - - + + - - - + + - - - + + - - - + + - - - + + - - - + + - - + + - - + + - - + + - - + + - - - - + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + - - - + + - - - + + - - - + + - - - + + - - - + + - - - + + - - - + + - - - + + - - - + + - - - + + - - - + + - - - + + - - + + - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - + + - - + + - - + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + - - - + + + - - - + + + - - - + + + - - - + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + + - + + - + + - + + - - + + + + + + + + + + + + + + + - + - + - - + + - - + + - - + + - + - - + + - - + - - + + + - - - - - - + + - - - + + - - - + + - - - + + - - - + + - - - + + - - - + + - - - - + + + + + - - - - + + + + + + + + + + + + + + + + + - - - - + + + - - - - + + + - - - - - - - - - - - - - - + + + + + - - - - + + + + + + + + - - - - + + + - - - - + + + - - - + + - - - + + - - - + + - - - + + - - - + + - - - + + - - - - + + + + + - - - - + + + + + + - - - + + + - - + + - + - - - - - + + - + + - + + - - + + - - + + + + + + + - - + + - + + + + + + + - - + - + - - - + + - - - - - - - - - - - - + + - - - + + - - - + + - - - - + + + + + - - - - + + + + + + + - - - - + + + + - - - - + + + - - - + + - - - + + + - - + + - - + + - + - - - - + - - - - - - - - - - + - + - + + - + - + - - + + - - + + - - - + + - - - + + - - + - + - - - + + - - + + - + - + - + - + - - + + - + - - + + + - + + - + + - + + - + + - + - + - + - + - + - + - + + - + - - + + + - - - - - - - - + + - - - - - - - + + + - - - - + + + - - - + + + - - + + - - - + + - - + + - + - + - + + + + + + + + + + + + + + + + + + + + + + - - - - + + + + + + + + + + + + + + + - - + - + - - - + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + - - + + - + - - - - - - - - - - - - - + - + - - + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + - - + + - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - + - - - + + - - - - - - + + + - + - - + + - + - + - - + - - + - - + - - + - - + - - + - - - + + - - - + + - - + + - - + + - + + - + - - + + + - - + + - - + + - - + + - + - - - - - - - - - - - - - + + - - - - - - - - - - - - - - - - - - - - - - + + - + - + - - + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + - - + + - + - - - - + - + - - + + - - + + - - + + - + - + - + - - + + - - + + + + + + + + + + + + - - + + - + + + + + + + + + + - + - + - - + + - - + + - - + + - + - + - + - - + + - - + + - - + + - - - + + + + + + + + + + + + + + + + + + - - + + - + - - - - - - - - - - - - - - - - - - - - - - - - - + - + - + - - + - + - - - + + - - - + + + + + + + + + + + + + + + + + + + + + + + + - - - + + + - - - + + + - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - + + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + + - + + - - + + - - + + - - + + - - - + + - - + + + + + + + + + + - - + + - + - - - - - - - - + - + - + - + - + - + - + + - + - + - - + - - + - + - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + - - - + + - - - + + - - + + - - - + + - - + + - - + + - + - + - + - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + - + + - + + - + + - + + - + + - + + - + + - + - + - + + - + + - + + - + - + + + + - + - + - - + + - - - - - - - - - - - - - - - - - - + + - - + + - - + + - + - - + - - - + - - - + - + + - + - - + + - - + + - - + + + - - + + + - - + + + - - + + + - - + + + - - + + + - - + + + - - + + + - - + + + - - + + + - - + + + - - + + + - - + + + - - + + - - + + - - + + + - - + + + - - - + + + + + - - - + + + + + + + - - - + + + + - - - + + + - - + + + - - + + + - - + + + - - + + + - - + + + + - - + + - - + + - - - + + + + + - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - + + + + - - - + + + - - + + + - - + + + - - + + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - - + + + + + - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - + + + - - - + + + - - - + + + + + - - - + + + + + + - - - + + + - - - + + + - - - + + + + + - - - + + + + + + + - - - + + + + - - - + + + - - - + + + + + - - - + + + + + + + + + - - - + + + - - - + + + - - + + - - + + - - + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + - - - + + + + + + + + + + - - - + + + - - - + + + - - + + + - - + + + - - + + - - + + + - - + + + - - + + - - - - - - - - - - - - - - - - - - - - - - - + + + - - - + + + - - + + - + - - - - - - - - + + + - - + + + - - + + + - - + + + - + + - + + - - + + - + + - - - + + - - + + - - - + + + - - - + + + - - - + + + - - - + + + - - + + + + + + + + + + + + - - + + - + - - + + - - - + + - - - + + - - + + - - + + - - - + + + + + + + + + + + + + + - + - + - - + + - - + + - - + + - + - - + + - - + - - + + + - - + + - - - + + + - - - + + + - - + + + - - - + + + - - - + + + - - + + + - - + + - + + + + - + - + - + - + - - + - + - + - + - + - + - + - + - + - + - - + + - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - + + + - - + + - - + + - + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + - + - - + + - + - + - + - - + + - - + + - - + + - + - + - + - - + + - - + + - - - + + - - - - - - - - - - - - - - + + - - + + - + - - + - + + + + + + - + + - + - - + + + - - + + + + + + + + + + + + + + + + + + + + + - - + + - + + + + + + + + - + - + - - - - - - - - - - - + - - + - - + - - + - - + + - + - - - - + - + - - - - - - - + - + - - + + - - + + - - + + - + - + - + - - + + - - + + - - + + - + - + - + - - + + - - + + - - + + - + - + - + - - + + - - + + - + - + - + - + - + + + + + + + + + - - + + - + - + + - + - + + + + + + + + + + + + + + + + + - + + - + - - + + + - - - - - - - - - - - - - - - - - - - - - - + + - - + + - + - - - - - - - - - + + - - + - - + + + - - - - - - - + + - - - + + - - - - - - - - - - - - - - - - - - - - - - - - - - + + - - + + - + - - - + + - - - + + - - - + + - - - + + - - - + + - - - + + + + + + + + - + - + - - + + - - + + - - + + - + - + - + - - + + - - + + - - + + + + + + + + + + + + + + + + + + + + + + + + + + + - - + + - + - - - - - - - - - + - + - - - - + - + - + - - + + - - + + - - + + - + - + + - + - - + + + - - + + - - + + - + - - + - - + - - + + - - - - - - - + + - - + - - - + + + - - + + - + - + - + - + - + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + + - + + - + + - + + - + - + - + + + + - - + - + - - - + + - - - - - - + + - - - + + + + + - - - + + + + + + + - - - + + + + - - - + + + - + - - + + - + @@ -20261,13 +21045,17 @@ - + + + + + @@ -20278,2287 +21066,2353 @@ - + + - + - - + + + - - - - - - - - - - - - - - + + - - + + + - - + + + - - + + - - - + + + + + - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - + + + + - - - + + + - - - + + + + + - - - + + + + + + + + + + + + + + + + + + + + - - + + + - - + + + - - - + + + - - - + + + - - + + - - - + + + - - - + + + - - - + + + - - + + - - - + + + - - - + + + - - - - + + + + + - - - + + + + + + + + + + + + + + + + + + + + - - - + + + - - - + + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - + - - - - - - - - - - - + + - - - + + - - - + + - + + - + - - + + + - - - - - - - - - - + + - - + + - - + + - + - + - + + - + + - + + + + + + + + + + + + + + - + - + - - + + - - + + - - - + + - - - + + + - - + + - - + + + - - + + - + - + + - - - - + - + + - - - - - - - - - - - - - - - - - - - - - - + - + - - + + - - - - - - - - - - - - - - - - - - - + + - - + + - - + + - - + + - - + + - - + + - + - + - - + - - - - - - - - - - - - - - - - - - - - - - - - + + + + - - - + + + + - - - + + + + - - + + - + + + + - - + + - + + - - - + + - - + + - - + + + - - + + - + - - + + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - + - - + + - - - - - - - - - - - - - - + + - - + + - - + + + - - + + - + - - - - - - - - - - - - - - - + - + - - + - - + - - + - - + - - + - - + - - + - - - + + - - + - - + + + - - + + - - - + + - - - + + - - - + + + + + + + + + + + + + + - - + + - + - - - - - - - - - - - - - - - - - - - - - - - + + - - + + + - + - + - - + + - - + + - - + + - + - - + - + - - - + + - - - - - - - + + - - + + - + - - - - - - - - - - - - - - - - - - - - - - - + + + + - - - + + + - - + + - + + + + - + - + - - + + - - + + - - + + - + - - + + + + + - - + - - + + + + + + + + + + + + + + + - - + + - - - + + + - - + + + - - - + + - - - + + - - - + + - - + + - - - + + - - - + + - - + + + - - - + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + - - - - + + + + - - - + + + + + - + - - - - - + + + + - - - - - - - - - - - - - - - - - + + + + - - - + + + + - - - + + + + - - - - - + + + + - - - - - - - + + + + - - - - - + + + + - - - - - - - - - + + + + - - - - - + + + + - - - - - - - - - - - - + + + + - - - + + + + - - - + + + + - - + + - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - + + - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - + + - + - - - - - - - - + - + - - + + - - + + - - + + - + - - + - - + - - + + - - + + - - + + - - + + - - + + + + + + + + + + - - + + - + - - + + - - + + - - + + - - + + + - - + + + - - - - - - - - + + + - - + + + - - + + + - - - - - - - - - - - + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + - - + + + - - + + + - - - - - - - + + - + - - + + + - - + + - - - - - + + + + - - - - - - + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + - - - + + + + - - - + + + - - + + - - + + - + - + - - + + + - - + + - + - + - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + - + - - + + - - - - - - + + - - + + + - - + + + - - + + - + - - - + + + + - + - + + - + + - - + + - - + + - - + + + - - + + - - - + + + - - - + + + - - - + + + - - - - - + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + - - - - + + + + - - - + + + - - - + + + - - - + + + - - + + - + - - - - - - - - - - - - - - - - - - - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + + - + + - + + - - + + - + + - + - - + + + - - + + - - - - - + + + + - - - - - - - + + + + - - + + - + - - + + + + + + + + - + - + - - + + - - + + - - + + - + - + + - + - - + + + - - - - - - - - - - - - - - - + + - - - + + + - - - + + + - - - - - + + + - - - - - - + + + - - - + + + - - - + + + - - + + - + + + + + + + + + + + + - + + - + - - + + + - - + + + + + + + - - + + - - - - - - - - - - + - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - + + - + - - - - - + + - + - + - - + + - - + + - - + + - + - + - + - - + + - - + + - - + + + + + + + + + + + + + + + + + + + + + + - - + + - + - - - - - - - - - - - - - + - + - + - - - - - - - - - - - - - - - - - - - - - - - + + - - + - - + + + - - - - - - - - - - - - - - - - - - - - - - - - - - + + - - + + + - - + + + - - + + + - - + + + - - + + + - - + + + - - + + - + - - - - - - - - - - - + + - - + + - - + + - + - + - + - + - + - + - + - - + - - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - + - + - + - + - + - + - + - - - - - - - - - - - - - + - + - - + - - + - - + - - + - + - - - - + - + - - + + - - - - - - - - - - - - + + - - - + + + - - + + - - - + + - - - + + - - + + - + - - - - - - - - - - - - - - - - - - - - + - + - + - + - - - - - - - + - - + + - + - - - + + - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - + + - - + + - - + + + + + + + + + + - - + + - + - + + + + + + + - + - + - - + + - - + + - - + + - + - - + + - + - - + + + - - + + + + + + + + + + + + + + + + + + + + + + - - + + - + + + + + + + + + + + + + + + + + + + - - + - + - - - + + - - + + - - + + - + - - - - - + + + + + + + + + + + + + + + + - - + + + + + + + + + + + + + + + - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - + + + - - + + + - - + - + - - - + + - - + + - - + + - + - + - + - - + + - - + + - - + + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -22673,867 +23527,888 @@ - + - + - - + + - - - - - - - - - - - - - - - - - - - - + + - - + + - + - - - - - - - - - - - - - - - - - - - + - + - - + + - - + + - - + + - + - + - + - - + + - - + + - - - + + + - - + + + - - + + + + + + + + - - + + - + - - + + + - - - + + + - - - + + - - + + - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + - - - + + - - + + - - - + + + + + + + + + + + + + + + + + + + + + + - + - + - + - + - - + + - + + + - + - - + + - - + + + + + + + + + + + + + - + - - - - - - + - - + + - + - + - - + - - + - - + + - - - - - - - - - - - - - - - - - - - - - - + + - - - + + + - - + + - + - + - + - + - + - - + + + + + + + + - + - + - - + + - - + + + + + + + + + + + + + + + + + + + + + + + + + - - + + - + - + + - + - - + + + - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - + + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + + - + - - + + + - - + + - - + + - + - + + - + - - + + + - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - + + - + + + + + + + + + + + + + + + + + + + + + + + - + - + - - + + - - + + - - + + - + - + - + - - - - - - + + - - - + + - - - + + + + - + - - + + - + - - - - - - - - + + + + - + - - - - - - - - - - - - - + - + - - - - + - + - + - + - - + - + - - - + + - - + + - - - + + - - + + + + + + + + + + + + + + + + + - - + + - + - + - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - - - + + - - + - - + + - - + + - - - + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + - - - - - + + + - - - - - - - + + + - - - - + + + - - - + + + - - - + + - - - + + - - - - - + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + - - - - + + + - - - + + + - - - + + - - - + + - - - + + - - + + - - - - - + + + - - - - - - - - - - - - - - - - - - + + + - - - + + + - - - + + + - - - - - + + + - - - - - - - + + + - - - - + + + - - - + + + - - + + - - + + - - + + - - - + + - - + + - - + + - - + + - - + + - - + + - - + + + + + + + + + + + + + + + + + + + + + + + + + - - + + + - - + + - - + + - + - - + - - - + + + + - - - + + + + - - - + + + + - - - + + + + + + + + + + + + + + + + + + + + + + + + - - - + + - - + + - - - + + @@ -23622,557 +24497,577 @@ - + + - + - - + + + - - + + - - - - - + + + - - - - - - - + + + + - - + + - + - - + + + + + + + + - + + - + - - + + - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - + + - + - + - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + - - - - - - - - - - - - - - - - - - - - - - - - + - + - + - - - - - - + - - - - - + - - + + + - - + + - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + - + + - + - - + + + - - + + - - - - - + + + - - - - - - - + + + + - - - - + + + - - - + + + - - - + + - - - + + - - - + + - - - + + - - - + + - - - + + - - + + + + + + + + + + + + + + + + + + - - + + - + - - - - - - - - - - - - - - - - - + - + - + - + + - + - + - + - + - + - - + + - - + + + + + + - - + + - + - + - + + + + + + + + + + + + + + + + + + + - + + - + + - - + + - - + + + + + + - - + + - + - + - + - - + + - - + + - - - - + + + + + + + + + + + + + - - + + - + - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + - + - + - - + + - - + + - - - + + - - - - - - - - - - + + - - + + - + - - - - - - + - - - - - + + + + - - + + + + - - + - + - - - + + - - + + - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + - - + + - + @@ -24180,536 +25075,596 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + - + - + - + - + + + + + + + + + + + + + + + + + + + + + + - + - + - - + + - - + + - - - - - - + + - - + + - + - + - - - - + + + - - - - + + + - - + + + + + + + + + + + - - + - + - - + + - - + + - - - - + + + + + + + + + + + + + + + + + + + + - - + + - + - - - - + - + - - + + - - + + - - + + - + - + - + - - + + - - + + + + + + - - + + - + + + + + + + + + + + + + + + + + + + + + + + + - - + - + - + - + - + - + - - + + - - + + - - + + - + - - - - + + + + + + + + + + + - - + + - + - - - - - + - - + - - + + - - - - - - - + + - - - - + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + - - - - + + + - - - - + + + - - - + + + - - + + - + - + - + - + - + - + - + - + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + - + - + + - + - + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + + - + + - + + - + - + - + - + - + - + - + - + - + + - + - + - + - + + + + @@ -24717,515 +25672,469 @@ - + - + - - + + - - + + - - + + - + - + - + - - + + - - - - - - - - - - - - - - - - - - - + + - - - + + - - + + - - + + - - + + - - + + - + - - + - - + - + - + - + - - - - - + + - - - - - - - - - - - - - - - - - - - - + + + - - + + + - - + + - + - - - + + - - - - + - + - - - - - - - - - - - - - - + + - - + + - - - + + + - - - - - - - - - - - - - - + + - - + + + - - + + - - - + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + - - - + + + - - - + + + - - - + + + + + - - - + + + + + + + - - - + + + + - - - + + + - - - + + + + + - - - + + + + + + + + + + + + + + + + - - - - + + + + - - - - + + + - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - - + + - - - + + + + + - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - + + + - - - + + + - - - + + + + + - - - + + + + + + + - - - + + + + - - - + + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - - - - - - - - - - - - - - - - - - - - - - + + - - + + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + - + - - + + - - + + - - + + - + @@ -25283,1049 +26192,932 @@ - - + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + - - + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + - - + + - + - - - - - - - - - - - - - - - - - - - - - - - - - + - + - + - + - + - + - - + - - + - - + - - + - - + - - + - - + - - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + - - + - + - - - + + - - - - - - - - - - - - - - - - - - - - - - - - - - + + - - + + - + - - - - - - - - - - - - + - + - - + + - - + + - - + + - + - - + + - + + - - - + + - - + + - - - + + + - - - + + + - - - - - + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + - - - + + + + - - - + + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - + + - + - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - + + + - - + + + + + + + + + + + + + + + + + + + + + + + + - + - + - + - + + - + - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - + - - + - + - - - + + - - + + - - + + - + - + - + - - + + - - + + - - + + - + - + - + - - + + - - - - - - - + + - - + + - + - - - - - - - + - + - - + + - - + + - - + + - - + + + - - - + + + + + - - - + + + + + + + + + + + + + + + + + + + + - - - + + + - - - + + + - - - + + + + + - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - + + + - - + + + - - + + - + - - - - + - + + - + + - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + - - + + + - - + + + - - - + + - - + + - - - + + - - - + + - - - + + - - - + + - - - + + - - + - + - - - + + - - - - - - - - - - + + - - + + - - - + + + - - + + - + - - - + + - - - + + - - - + + - - - + + + + + + + + + + + + + + + + + + + + - + + - + - - + + + - - + + + + + + - - + + - + + + + - - + - + - - - + + - - - - - - - - - - - - - - - - - - - - - - + + - - + + - + - - - - - - - - - - - - - - - - - - - + - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - - + + - + - - - - - - - - - - @@ -26444,1048 +27236,777 @@ - - - - - - - - - - - - - - - - - - - - - - + - + - - + + - - + + - - + + - + - - + - + - - + + - - - - - - + + - - + + - + - - - - + - + - + - - + + - + - - + - + - - - + + - - + + - - - + + + - - - + + + - - - + + + - - + + - - + + - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + - + - + - - + + - - + + - - + + - + - - + - + - - - + + - - + + - - - + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - + - - + + - - - - - - - - - - - - - - - - - - - - - + + - - + + - + - - - - - - - - - - - - - - - - - - - + - + - - + + - - + + - - + + - - + + - + - - - - - - - + - + - + - - - - - - - - - - - - - - - - - - - - - - - - - + + - + - - + + + - - + + - - - - + + + - - + + + - - - - - - - - + + - - - - - - + + + + - - + + + - - + + - + - - + + + + + + + + + + + + + + + + + + + + - + - + - - + + - - + + + + + + - - + + - + + + + + + + + + + - + - + - - + + - - + + - - + + - + - - - - - + + + + - - - + + + - - - + + + - - - + + + + + + - - + + - + - - + + - - + + - - + + - - + + - - + + - - + + - + - + - - + + - - + + - - + + - + - + - + - - + + - - - - - - - - - - - - - - - - - - - - - - - - - - + + - - + + - - + + - + - - + - + + - + + - + + - + + - + + - + - + + - - + + - - + - - + + + - - + + - - - + + - - - + + - - - + + - - - + + - - - + + - - - + + - - - + + - - + + - - + + - - - + + + - - - + + + - - - - - - - - - + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + - - - - - - + + + - - - + + + - - - + + + - - - - - + + + - - - - - - - + + + - - - - + + + - - - + + + - - + - - + - - + - - + - - + + - + - - - - - - - - - - + + - - + + + - - + + + - - + + + - - + + + - + + - + + - + - + - - + + - - + + - - - - - + + + - - - - - - - + + + - - - - + + + - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - + + - - - - - + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + - - - - - + + + + - - - - - - - - - - + + + + - - - - + + + + - - - + + + + - - + + - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - + + - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + @@ -27590,4818 +28111,4495 @@ - + - + - - + + - - - - - - + + - - + + - + - - + + - + + - - - + + - - + + - - + + + - - + + + - - + + + - - + + + - - + + + - - + + + - - - + + + + - - + + - - + + - - + + + + + + + + + + + + + - - + + - + - - + + - - + + - - + + - - + + - - - + + - - - + + - - + + - - + + + + + + + + + + + - + + - + - - + + + - - + + - - + + + + + + - - + + - + - - + + - - + + + - - + + - - + + - - + + - - + + - + - - + - - + - - + + - - + + - - - - + + + + + - - - - + + + + + + - - - - + + + - - - - + + + - - - + + + + + - - - - + + + + + + - - - - + + + - - - - + + + - - - - + + + + + - - - - + + + + + + - - - - + + + - - - - + + + - - - - + + + + + - - - - + + + + + + - - - - + + + - - - - + + + - - - + + + - - - + + + - - + + - - - - + + + + + - - - - + + + + + + + + + + + + + + + + + + + + - - - - + + + - - - - + + + - - - - + + + + + - - - - + + + + + + + - - - - + + + + - - - - + + + - - - + + + - - - - + + + + + - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - + + + - - - - + + + - - - + + - - - + + - - - + + + - - - + + + - - + + + - - - - + + + + + - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - + + + - - - - + + + - - - - + + + + + - - - - + + + + + + - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - + + + - - - + + + - - + + - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + - - + + - - + + - - + + - - + + - - + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - + - + - - - + + - - - - - - + + - - + + - + - - - - - - - - - - - - - - + + - - + - - + + + - - + + - - - + + + - - - + + - - - + + - - - + + + - - - + + - - - + + - - - + + - - - + + - - - + + - - - + + - - - + + - - - - + + + + + - - - - + + + + + + + + + + + + + + + + + + + + + + + + - - - - + + + - - - - + + + - - - - + + + + + - - - - + + + + + + + - - - - + + + + - - - - + + + - - - + + + - - - + + - - - - + + + + + - - - - + + + + + + + + + + + + + + - - - - + + + - - - - + + + - - - - + + + + + - - - - + + + + + + - - - - + + + - - - - + + + - - - - + + + + + - - - - + + + + + + + + + + + + + + + + - - - + + - - - + + - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - + + - - - + + - - - + + - - - + + - - + + - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + - - + + - - + + - - - + + - - + + - - + + - - + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - + - - + + - - - - - - - - - - - - - - - - - - - - - + + - + - + - + - + + - + + - + + - + + - + + - + - + - + - - + + - + - + + + - - + - + - - - + + - - + + - - - + + + + + - - - + + + + + + + + + + + + + + - - + + - + - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + - - + + - + - - - - - + - + - - - + + - - + + - - - + + + - - + + - - - + + + - - + + + + + + + + + + + + + + + + + + + + + + + - - + + - + - + - + - + - + - + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - + + + - - + + + + + + + + + + + + + + + - - + + - + + + + + + + + - + - + - - + + - - + + - - + + - + - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - + + - + - - + + + + + + + + + + + + + + + - + - + - - + + - - + + - - + + - + - + - + - - + + - - + + - - + + - + - - + - - + - - + + - - + + + + + + + + + + + + + + + + + + + + + + + + - - - + + + - - - + + + - - + + - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - + - + - + - + - + - - + + - - + + - - + + - + - + - + - - + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + - - - + + - - + + - - + + - + + + + + + + + + + - - + - + - - - + + - - + + - - - + + - - - + + - - - + + - - - + + - - - + + - - - + + - - - + + - - - + + + + + - - - + + + + + + + + + + + + + + + + + + + - - + + + - - + + + - - + + + - - + + - + - + - + - + - - - - + - + - + - + + - + - + - + - + - + - + - + + - + + - + + - + + - + - + - - + + - - + + - - + + - + + + + + + + + + + + + + + + + + + + + + + - + - + - - + + - - + + - + - + - + - + - - + + + - - + + + - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - + + - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - + + - - - - - - - + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + - - - + + - - - + + - - + + - - + + - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + - + + - + + - + + - + - + - - + + - - + + - - + + - + - + - + - - + + - - + + - - + + - + - - - - + - + - - + + - - + + - - + + - + - + - + - - + + - - + + - - + + - + - - + - - + - - + + - - - - - - + + - - + + - + - + + - + + - - + + - - - - - - - - - - - - - - - - - - - - - + + - - - + + + - - + + - + - - - - - + + - + - + - - + + - - + + - - - - + + + + - - + + + - - + + + - - + + - - - - - + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + - - - + + - - - - - + + + - - - - - - - - - - - + + + - - - + + + - - - + + + - - - + + - - - + + - - - + + - - - + + - - + + - + - - - - - - - - + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + - - - - - - - - - - - - - - - - - - - - - - - - + - + - - + + - - + + - - + + - - + + - - - + - - + + - - + + - - + + - - + - - + + - + - + - + + - - - - - - - + - - + + + - - + + + - - + + + - - + - + - - - + + - - - - - - - - - - - - + + - - - - + + + + + - - - - + + + + + + - - + + - + - - - - - - + + - - + - + - - - + + - - + + - - - + + - - - + + - - - + + - - - + + - - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - - - - + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + - - - + + + - - - + + + - - - - - + + + - - - - - - + + + - - - + + + - - - + + + - - - - - + + + - - - - - - + + + - - - + + + - - - + + + - - - - - + + + - - - - - - + + + - - - + + + - - - + + + - - - + + - - - + + - - - + + - - - + + - - - + + - - - + + - - - + + - - - + + - - - - - + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + - - - - + + + - - - + + + - - - + + - - - + + - - - + + - - - + + - - - + + - - - + + - - - - - + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + - - - + + + - - - + + + - - + + - - + + - - - + + - - + + - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - + + - - - + + - - - + + - - - + + - - - + + - - - + + - - - + + - - - + + - - - + + - - - + + - - - + + - - - + + - - + + - - - + + - - + + - - - + + - - - - - + + + - - - - - - - - - - - + + + - - + + - - + + - - + + - - + + - - - - - + + + - - - - - - - - - - - - - - - - - - - - - - - - + + + - - - + + + - - - + + + - - + + - + - + - + - - + + - - - - - - + + - - + + + - - + + + - - + + + - - + + + - - + + - - + + - + - + + - + - + - + - - + + - - - - - - - - - - - - - - - - - - + + - - + + - + - + - + + + + + + + + + + - + - + - - + + - - + + - - + + - + - - + + - + + - - - + + - - - - - - - - - - - - - - + + - - - + + + - - - + + + - - + + - + - - + + - - + + - + - + - + - + - + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - + - - + + - - + + - - + + - + - - + - - + - - + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + - - + - + - - - + + - - - - - - - - - - - - - - + + - - + + - + - - - - - - - - - - - - - - + - - + - - + + - - - - - - - + + - - - - - - + + - - + + - + - + - + + - + + - + - + - - - - - - - - - - - - - - - - - + - - + - + - - - + + - - + + - - - + + + + + - - - - + + + + + + + - - - - + + + + - - - - + + + - - - + + + - - + + - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + - + - - + + - - + + - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - + + - + - - - - - + - + - + - + - + - + - - + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - - + - + - - - + + - - - - - - - - - - - - - - - - - - - - - - + + - - + + - + - - - - - - - - + - + - - + + - - + + + + + + - - + + - + + + + + + + + + + + + + + + + + + + + + + + + + - + - + - + - + + + + + + - - + + - + - - + + - + - - + + - - + + - + - + - + - + + + + + + + - + - + - - + + - - + + - - + + - + - + + - + + - - + + - - - - - - - - - - - - - - - - - + + - - - + + - - + + - - + + - - + + - + - - + + - - - - - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + - - + + + - - + + + - - + + - - + + - + + - + + - + + - + - + - + - + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + + - + + - + + - + - + + + + + + + + + + + + + + + + + + + + + + - + - + - - + + - - + + - - + + + - - + + + + + + + + + + + - - + + - + + - + - - - - - - - + - + - + - - + + - - + + - - + + - + - + - + - - + + - - + + - + - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - - - - - - + + + + - - - + + + + - - - + + + + - - + + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + - + - - + + - - + + - - - + + + - - - + + + - - - + + + + + + + + - - + + - + - + - + + - - - + - - + - - - + + - - + + - - + + + - - + + - - + + + - - + + + - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - + + - + - + - + - + - + - + - + - - + - + - + - + - + - + - + - + - + - + - + - + - + - + + - + + - + + - + + - + + - + - + - + - + - - + - - + - - + - - + - + - + - - + - - + - - + - + - + - + + + + + + + + + + + + + + + + + + + + + + - + - + - - + + - - + + - - + + + + + + + + + + - - + + - + - + + - + - + - + - + + - + + - - + + - - + + - - + + + - - + + + - - + + - + - - + + - - + + - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + - - + - - + + - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - + + - + - + + - + + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + - + - + - + - + - + + + + - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - + + - - + + - + - - - - - - - - - - + - + - + - - + + + + + + + + + + + + + + + + + + + + + + + - - + + - - + + - + - + - + - - + + - - + + - - + + - + @@ -32456,2296 +32654,2625 @@ - + - + - - + + - - + + - - + + - + - + - + - - + + - - + + - - + + - + - + - + + - - + + - - + + - - - + + - - - - - + + + + - - - - - - - - - - + + + + - - - - + + + + - - - + + + + - - - + + - - - + + + - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - + + - + - - - + + - - - + + - - - - - - - - - - - - - - - - - - - - - - - + + + - - + + - - - + + - + + - + - - + + + - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - + + - + + + + + + + + - + - + - - + + - - + + - - + + - + - + - + - - + + - - + + - - + - - + - - + - - + - - + - - + - - + + + + + + + + + + + + + + - - + + - + - + - + - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - - + + + - - + + + - - + + - - + + - + - + - - + + - - + + - - + + - + - + + - + - - + + + - - + + + + + + - - + + - + + + + + + + + + + + + + + + + + + + + + + + - - + + - - + + - - + + - - - - - - - + + - - - + + + - - + + - + - - - - - - - - - - - - - + - + - + - + - + - - - - + - - + - + - - - + + - - - - - - - - - - + + - - - + + + + + - - - + + + + + + + - - - + + + + - - - + + + - - + + + - - + + + - - + + - - + + - - + + - - + + + - - + + - + - + - + + + + + + + + + + + + + + + + + + + - + - + - - + + - + - + + + + - - + + - - + - - + + + - - - - - - - + + - - - + + + - - - + + - - + + - + - - - - - - - - + + + - + + + - + + + - + - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - + + - - + + - + - + - + - + - - + - - + - - + - - + - - + - - + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - + + - - - + + - - - + + + + + + + + + + - - + + - + - + - + + - + + - + + + - + + + + + + + + + + + + + + + + + + - - + - - + - - + + - - - - - - + + - - + + - + - - + - + - - - + + - - - - - - + + - - + + - + - - - - - - - - - - + - + - - - + + - - - - - - - + + - - - - + + + + + - - - - + + + + + + + - - - - + + + + - - - - + + + - - - + + + - - - + + + - - + + + - - + + - + - + - - + + + + - + - + - + - + - + - + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + - + - - + + - - + + - - + + + - - - + + + + + + + - - + + - + - + - + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + - + - - + + - - + + - - + + - + - + - + - - + + - - + + - - - + + - - - + + - - - + + - - - + + - - - + + - - - + + - - + + - - + + - - + + - - + + + + + + + + + + + + + + - - + + - + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + - + - - + + - - - - - - - - - - - - - - - - - - - - - - + + - - + + + - - + + + - - + + - + - + + - - + - + - - + - - + - - + + + + + + + + + + - - + + - - + - - + + + - - + + - - - + + - - - + + - - - + + + - - - + + + - - - + + + - - - + + + + + + + + - - + + - + - - - - - - - - - - - - - - - - - - - - - - - + + - - + + + - - + + + - + + - + + - - + + - - + + + + + + - - + + - + - + - + - + - - + - + + + + + + + + + + + + + - + - + - - + + - - + + + - + + + + + - - + + - + - - - - - - - - - - - - + - + + - + + - - + + - - + + - - - - - + + + + - - - - - - - - + + + + - - - + + + + - - - + + + + - - + + + - - + + + - - + + + - - + + + - - + + + - - + + + - - + + + - - + + + - - + + + - - + + + - - + + + - - - - - + + + + - - - - - - + + + + - - - + + + + - - - + + + + - - + + + + + + + + + + + + + + + + + + + + + + + - - + + - + - + - - + - - + - + - + - + - + - + - + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + - + - - + + - - - - - - - - - - + + - - + + + - - + + - - + + - - + + - - + + - + - - + + + + - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - + - - + + - - + + - - + + - + - - + + - - + - - + + + - - + + - - - + + + - - + + + - - + + - + + + + - + - + - + - + - + + - + + - + + - + - + - + - + - + + + + + + + + + + + + + + + + + + + + + + + + - + - + - + + + + + + + + + + - - + + - - + - - + + + - - - - - - - - - - - - - - - - + + - - - + + + - - - + + + + + - - + + + + - - - - - - - - - - - + - - + + - + - - - - - - - - - - - - - - - - - - - - - - - - - + - + - + - + - + - + - + - + - + - + - + - - - - + - + - + - - + + - - + + - - + + - + - + - + - - + + - - + + - - + + - + - - + - + - - - + + - - + + + + + + + + + + + + + + + + + + + + + + + - - + + + - - + + + - - + + + - - + + + - - + + + + + + + + + + + + - - + + - + - - - - - - - - - - + + - - - + + - - + + - - + - - + + - - + + - - - + + - - - + + + - - - + + + - - - + + + - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - + + + - - + + + + + + + - - + + - + - + - + - + - + - - + - + - + - + - + - + + + + + + + + + + + + + + + + + + + - + - + - - + + - - + + - - + + - + - - + - + - - - + + - - - - - - - - - - - - + + - - + + - + - - - - - - - - - - - - - - - + + + - + - - - - - - - - - - - - - - - - - - - - - - - - + - - + + - - + + + - - + + - + - + - - - + + - - + + - - + + - - + + - - + + - + + + + + + + + + + - + + - + - - + + + - - + + + + + + + - - + + - + + + + + + + + + + + + + - - + + - - + - - + + + - - - - - - - - - - - - - - - - - - - - - - - - - - + + - - + + - - - + + - - - + + - - - + + - - - + + - - - + + - - - + + - - - + + - - - + + - - - + + - - - + + - - + + - + - - - + + - - - + + - - - + + - - - + + - - + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + - - - + + - - - + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - diff --git a/bundles/cnf/localrepo/index.xml.sha b/bundles/cnf/localrepo/index.xml.sha index 83298a079..5d41b9d0c 100644 --- a/bundles/cnf/localrepo/index.xml.sha +++ b/bundles/cnf/localrepo/index.xml.sha @@ -1 +1 @@ -209e668de72134c5cf18b21341c136d64a15e45fe72c529d30c456840db44b43 \ No newline at end of file +b2dbf9ecd6b0a4eebe8816f45c59ad40a98f682eeae6e5a2b2f3ded32841ff5c \ No newline at end of file diff --git a/bundles/cnf/localrepo/net.bytebuddy.byte-buddy-agent/net.bytebuddy.byte-buddy-agent-1.8.13.jar b/bundles/cnf/localrepo/net.bytebuddy.byte-buddy-agent/net.bytebuddy.byte-buddy-agent-1.8.13.jar new file mode 100644 index 000000000..ba8b0cc0d Binary files /dev/null and b/bundles/cnf/localrepo/net.bytebuddy.byte-buddy-agent/net.bytebuddy.byte-buddy-agent-1.8.13.jar differ diff --git a/bundles/cnf/localrepo/net.bytebuddy.byte-buddy/net.bytebuddy.byte-buddy-1.8.13.jar b/bundles/cnf/localrepo/net.bytebuddy.byte-buddy/net.bytebuddy.byte-buddy-1.8.13.jar new file mode 100644 index 000000000..3202e2f13 Binary files /dev/null and b/bundles/cnf/localrepo/net.bytebuddy.byte-buddy/net.bytebuddy.byte-buddy-1.8.13.jar differ diff --git a/bundles/cnf/localrepo/org.mockito.mockito-core/org.mockito.mockito-core-2.19.1.jar b/bundles/cnf/localrepo/org.mockito.mockito-core/org.mockito.mockito-core-2.19.1.jar new file mode 100644 index 000000000..4bcc65537 Binary files /dev/null and b/bundles/cnf/localrepo/org.mockito.mockito-core/org.mockito.mockito-core-2.19.1.jar differ diff --git a/bundles/cnf/localrepo/org.objenesis/org.objenesis-2.6.0.jar b/bundles/cnf/localrepo/org.objenesis/org.objenesis-2.6.0.jar new file mode 100644 index 000000000..b4b29d563 Binary files /dev/null and b/bundles/cnf/localrepo/org.objenesis/org.objenesis-2.6.0.jar differ diff --git a/bundles/cnf/releaserepo/index.xml b/bundles/cnf/releaserepo/index.xml index a1589f3d6..0ff3d3fef 100644 --- a/bundles/cnf/releaserepo/index.xml +++ b/bundles/cnf/releaserepo/index.xml @@ -1,2 +1,2 @@ - + diff --git a/bundles/cnf/releaserepo/index.xml.sha b/bundles/cnf/releaserepo/index.xml.sha index b8cb328b6..5d7e59de8 100644 --- a/bundles/cnf/releaserepo/index.xml.sha +++ b/bundles/cnf/releaserepo/index.xml.sha @@ -1 +1 @@ -ade5eb958cf0e91aea6531a30eaf9d0933ce086c260ef2338d1d6a06f6d592dd \ No newline at end of file +ac2a878e71e3964eac062550754c59507b3b86b848724548581b68e9493f6c0a \ No newline at end of file diff --git a/bundles/specmate-cdo-server/src/com/specmate/cdoserver/config/SpecmateCDOServerConfig.java b/bundles/specmate-cdo-server/src/com/specmate/cdoserver/config/SpecmateCDOServerConfig.java index 23a0e1af7..a8cb70564 100644 --- a/bundles/specmate-cdo-server/src/com/specmate/cdoserver/config/SpecmateCDOServerConfig.java +++ b/bundles/specmate-cdo-server/src/com/specmate/cdoserver/config/SpecmateCDOServerConfig.java @@ -3,6 +3,7 @@ import java.util.Dictionary; import java.util.Hashtable; +import org.eclipse.net4j.util.StringUtil; import org.osgi.service.cm.ConfigurationAdmin; import org.osgi.service.component.annotations.Activate; import org.osgi.service.component.annotations.Component; @@ -20,6 +21,8 @@ public class SpecmateCDOServerConfig { public static final String KEY_SERVER_PORT = "cdo.serverPort"; public static final String KEY_REPOSITORY_NAME = "cdo.repositoryName"; + public static final String KEY_CDO_USER = "cdo.user"; + public static final String KEY_CDO_PASSWORD = "cdo.password"; private ConfigurationAdmin configurationAdmin; @@ -31,15 +34,24 @@ public class SpecmateCDOServerConfig { private String repositoryName; + private String cdoUser; + + private String cdoPassword; + @Activate private void activate() throws SpecmateException { this.serverPort = configService.getConfigurationProperty(KEY_SERVER_PORT); this.repositoryName = configService.getConfigurationProperty(KEY_REPOSITORY_NAME); + this.cdoUser = configService.getConfigurationProperty(KEY_CDO_USER); + this.cdoPassword = configService.getConfigurationProperty(KEY_CDO_PASSWORD); Dictionary properties = new Hashtable<>(); - if (serverPort != null && this.repositoryName != null) { + if (!StringUtil.isEmpty(serverPort) && !StringUtil.isEmpty(repositoryName) && !StringUtil.isEmpty(cdoUser) + && !StringUtil.isEmpty(cdoPassword)) { properties.put(KEY_SERVER_PORT, serverPort); properties.put(KEY_REPOSITORY_NAME, repositoryName); + properties.put(KEY_CDO_USER, cdoUser); + properties.put(KEY_CDO_PASSWORD, cdoPassword); logService.log(LogService.LOG_DEBUG, "Configuring CDO with:\n" + OSGiUtil.configDictionaryToString(properties)); OSGiUtil.configureService(configurationAdmin, PID, properties); diff --git a/bundles/specmate-cdo-server/src/com/specmate/cdoserver/internal/SpecmateCDOServer.java b/bundles/specmate-cdo-server/src/com/specmate/cdoserver/internal/SpecmateCDOServer.java index 8d189cc6c..7e03598c9 100644 --- a/bundles/specmate-cdo-server/src/com/specmate/cdoserver/internal/SpecmateCDOServer.java +++ b/bundles/specmate-cdo-server/src/com/specmate/cdoserver/internal/SpecmateCDOServer.java @@ -6,12 +6,15 @@ import org.eclipse.emf.cdo.server.CDOServerUtil; import org.eclipse.emf.cdo.server.IRepository; import org.eclipse.emf.cdo.server.net4j.CDONet4jServerUtil; +import org.eclipse.emf.cdo.spi.server.InternalRepository; +import org.eclipse.emf.cdo.spi.server.InternalSessionManager; import org.eclipse.net4j.Net4jUtil; import org.eclipse.net4j.acceptor.IAcceptor; import org.eclipse.net4j.tcp.TCPUtil; import org.eclipse.net4j.util.StringUtil; import org.eclipse.net4j.util.container.IPluginContainer; import org.eclipse.net4j.util.lifecycle.LifecycleUtil; +import org.eclipse.net4j.util.security.IAuthenticator; import org.osgi.service.component.annotations.Activate; import org.osgi.service.component.annotations.Component; import org.osgi.service.component.annotations.ConfigurationPolicy; @@ -36,7 +39,7 @@ public class SpecmateCDOServer implements DBConfigChangedCallback, ICDOServer { private IAcceptor acceptorTCP; /** The CDO repository */ - private IRepository repository; + private InternalRepository repository; /** The CDO container */ private IPluginContainer container; @@ -49,6 +52,10 @@ public class SpecmateCDOServer implements DBConfigChangedCallback, ICDOServer { private String repositoryName; + private String cdoUser; + + private String cdoPassword; + @Activate public void activate(Map properties) throws SpecmateValidationException, SpecmateException { readConfig(properties); @@ -74,10 +81,21 @@ private void readConfig(Map properties) throws SpecmateValidatio } catch (Exception e) { throw new SpecmateValidationException("Invalid port format: " + portString); } + this.repositoryName = (String) properties.get(SpecmateCDOServerConfig.KEY_REPOSITORY_NAME); if (StringUtil.isEmpty(this.repositoryName)) { throw new SpecmateValidationException("No repository name given"); } + + this.cdoUser = (String) properties.get(SpecmateCDOServerConfig.KEY_CDO_USER); + if (StringUtil.isEmpty(this.cdoUser)) { + throw new SpecmateValidationException("No CDO user name given"); + } + + this.cdoPassword = (String) properties.get(SpecmateCDOServerConfig.KEY_CDO_PASSWORD); + if (StringUtil.isEmpty(this.cdoPassword)) { + throw new SpecmateValidationException("No CDO password given"); + } } /** @@ -119,7 +137,20 @@ private void createRepository() throws SpecmateException { props.put(IRepository.Props.OVERRIDE_UUID, "specmate"); props.put(IRepository.Props.SUPPORTING_AUDITS, "true"); props.put(IRepository.Props.SUPPORTING_BRANCHES, "true"); - this.repository = CDOServerUtil.createRepository(this.repositoryName, dbProviderService.createStore(), props); + + this.repository = (InternalRepository) CDOServerUtil.createRepository(this.repositoryName, + dbProviderService.createStore(), props); + + InternalSessionManager sessionManager = (InternalSessionManager) CDOServerUtil.createSessionManager(); + sessionManager.setAuthenticator(new IAuthenticator() { + @Override + public void authenticate(String userID, char[] password) throws SecurityException { + if (!cdoUser.equals(userID) || !cdoPassword.equals(new String(password))) { + throw new SecurityException(); + } + } + }); + repository.setSessionManager(sessionManager); CDOServerUtil.addRepository(IPluginContainer.INSTANCE, repository); } diff --git a/bundles/specmate-config/bnd.bnd b/bundles/specmate-config/bnd.bnd index 2587c4fe8..255e9e32a 100644 --- a/bundles/specmate-config/bnd.bnd +++ b/bundles/specmate-config/bnd.bnd @@ -1,8 +1,8 @@ -Private-Package: com.specmate.config.internal +Private-Package: com.specmate.config.internal -buildpath: \ org.eclipse.osgi.services,\ specmate-common;version=latest,\ org.apache.commons.lang3,\ osgi.core,\ - specmate-config-api;version=latest + specmate-config-api;version=latest Include-Resource: config=config \ No newline at end of file diff --git a/bundles/specmate-config/config/specmate-config.properties b/bundles/specmate-config/config/specmate-config.properties index 150932498..4e95307b5 100644 --- a/bundles/specmate-config/config/specmate-config.properties +++ b/bundles/specmate-config/config/specmate-config.properties @@ -4,37 +4,47 @@ logging.level = info # CDO Persistency Settings ## CDO Common +### Repository name, in case of Oracle, must be identical to the schema name cdo.repositoryName = specmate_repository +cdo.user = cdoUser +cdo.password = cdoPass ## CDO Server +### TCP port where the CDO server should listen cdo.serverPort = 2036 ## CDO Client +### Name of the CDO resource to use cdo.resourceName = specmate_resource +### CDO host to connect to. If client and server are started in same process, should match cdo.serverPort cdo.host = localhost:2036 + ## H2 +### JDBC connection string for the H2 database h2.jdbcConnection = jdbc:h2:./database/specmate ## Oracle -#oracle.cdoRepositoryName = -#oracle.cdoResourceName = -#oracle.cdoJDBCConnection = +### JDBC connection string for the oracle database +#oracle.jdbcConnection = + #oracle.username = #oracle.password = # Connectors General Settings -connectorPollTime = 20000 +## Time in seconds between polling the connectors, set to -1 to disable polling, default: 20 +connectorPollTime = 20 # Sarch Service search.allowedFields = extId, type, name, description search.lucene.location = ./database/lucene -search.maxResults = 500 +search.maxResults = 100 # Projects +## List of project names, each project listed here needs to be configured below project.projects = ppmtest -## Config for project hpproject +## Config for project ppmtest ### Config Connector project.ppmtest.connector.pid = com.specmate.HPServerProxyConnector diff --git a/bundles/specmate-connectors/.classpath b/bundles/specmate-connectors/.classpath index b263de401..6da7a3a1b 100644 --- a/bundles/specmate-connectors/.classpath +++ b/bundles/specmate-connectors/.classpath @@ -1,6 +1,7 @@ + diff --git a/bundles/specmate-connectors/.gitignore b/bundles/specmate-connectors/.gitignore index 57b341172..af64e9f3f 100644 --- a/bundles/specmate-connectors/.gitignore +++ b/bundles/specmate-connectors/.gitignore @@ -1,2 +1,4 @@ -/bin/ -/generated/ +/bin/ +/generated/ +/test_bin/ +/bin_test/ diff --git a/bundles/specmate-connectors/bnd.bnd b/bundles/specmate-connectors/bnd.bnd index 6c1537f21..348df4a41 100644 --- a/bundles/specmate-connectors/bnd.bnd +++ b/bundles/specmate-connectors/bnd.bnd @@ -18,7 +18,12 @@ Export-Package: \ osgi.core;version=6.0,\ specmate-emfrest-api;version=latest,\ javax.ws.rs-api,\ - specmate-auth-api;version=latest + specmate-auth-api;version=latest,\ + org.apache.servicemix.bundles.junit;version=4.12,\ + org.mockito.mockito-core;version=2.19,\ + org.objenesis,\ + net.bytebuddy.byte-buddy,\ + net.bytebuddy.byte-buddy-agent Private-Package: \ com.specmate.connectors.internal,\ com.specmate.connectors.internal.config \ No newline at end of file diff --git a/bundles/specmate-connectors/src/com/specmate/connectors/internal/config/ConnectorServiceConfig.java b/bundles/specmate-connectors/src/com/specmate/connectors/internal/config/ConnectorServiceConfig.java index 7e47226dc..4c32277af 100644 --- a/bundles/specmate-connectors/src/com/specmate/connectors/internal/config/ConnectorServiceConfig.java +++ b/bundles/specmate-connectors/src/com/specmate/connectors/internal/config/ConnectorServiceConfig.java @@ -25,9 +25,19 @@ public class ConnectorServiceConfig { /** Configures the connector service. */ @Activate - private void configureConnectorService() throws SpecmateException { + public void configureConnectorService() throws SpecmateException { Dictionary properties = new Hashtable<>(); Integer connectorsPollTime = Integer.parseInt(configService.getConfigurationProperty(KEY_POLL_TIME, "20")); + + // Values < 0 to disable the connectors + if (connectorsPollTime < 0) { + logService.log(LogService.LOG_INFO, "Connectors service disabled."); + return; + } + + // Minimum wait time beween polls: 1 second + connectorsPollTime = Math.max(connectorsPollTime, 1); + properties.put(KEY_POLL_TIME, connectorsPollTime); logService.log(LogService.LOG_DEBUG, "Configuring Connectors with:\n" + OSGiUtil.configDictionaryToString(properties)); diff --git a/bundles/specmate-connectors/test/com/specmate/connectors/test/ConnectorServiceTest.java b/bundles/specmate-connectors/test/com/specmate/connectors/test/ConnectorServiceTest.java new file mode 100644 index 000000000..c949e5e0c --- /dev/null +++ b/bundles/specmate-connectors/test/com/specmate/connectors/test/ConnectorServiceTest.java @@ -0,0 +1,61 @@ +package com.specmate.connectors.test; + +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.verifyZeroInteractions; +import static org.mockito.Mockito.when; + +import java.io.IOException; +import java.util.Dictionary; + +import org.junit.Test; +import org.mockito.Mockito; +import org.osgi.service.cm.Configuration; +import org.osgi.service.cm.ConfigurationAdmin; +import org.osgi.service.log.LogService; + +import com.specmate.common.SpecmateException; +import com.specmate.common.SpecmateValidationException; +import com.specmate.config.api.IConfigService; +import com.specmate.connectors.internal.config.ConnectorServiceConfig; + +public class ConnectorServiceTest { + + @Test + public void testConnectorServiceDisabling() + throws SpecmateException, SpecmateValidationException, InterruptedException { + ConnectorServiceConfig connectorConfig = new ConnectorServiceConfig(); + connectorConfig.setLogService(mock(LogService.class)); + + IConfigService configServiceMock = mock(IConfigService.class); + when(configServiceMock.getConfigurationProperty(ConnectorServiceConfig.KEY_POLL_TIME, "20")).thenReturn("-1"); + connectorConfig.setConfigurationService(configServiceMock); + + ConfigurationAdmin configAdminMock = mock(ConfigurationAdmin.class); + connectorConfig.setConfigurationAdmin(configAdminMock); + + connectorConfig.configureConnectorService(); + + verifyZeroInteractions(configAdminMock); + } + + @Test + public void testConnectorServiceEnabling() + throws SpecmateException, SpecmateValidationException, InterruptedException, IOException { + ConnectorServiceConfig connectorConfig = new ConnectorServiceConfig(); + connectorConfig.setLogService(mock(LogService.class)); + + IConfigService configServiceMock = mock(IConfigService.class); + when(configServiceMock.getConfigurationProperty(ConnectorServiceConfig.KEY_POLL_TIME, "20")).thenReturn("20"); + connectorConfig.setConfigurationService(configServiceMock); + + ConfigurationAdmin configAdminMock = mock(ConfigurationAdmin.class); + Configuration configurationMock = mock(Configuration.class); + when(configAdminMock.getConfiguration(Mockito.any(String.class))).thenReturn(configurationMock); + connectorConfig.setConfigurationAdmin(configAdminMock); + + connectorConfig.configureConnectorService(); + + verify(configurationMock, Mockito.atLeastOnce()).update(Mockito.any(Dictionary.class)); + } +} diff --git a/bundles/specmate-dbprovider-oracle/bnd.bnd b/bundles/specmate-dbprovider-oracle/bnd.bnd index 629b87d8a..4ab6bcb62 100644 --- a/bundles/specmate-dbprovider-oracle/bnd.bnd +++ b/bundles/specmate-dbprovider-oracle/bnd.bnd @@ -1,6 +1,5 @@ --classpath: jar/oracle-driver-ojdbc-12.1.0.2.jar - -buildpath: \ + jar/oracle-driver-ojdbc-12.1.0.2.jar;version=file,\ specmate-dbprovider-api;version=latest,\ specmate-common;version=latest,\ osgi.annotation,\ diff --git a/bundles/specmate-integration-test/src/com/specmate/test/integration/IntegrationTestBase.java b/bundles/specmate-integration-test/src/com/specmate/test/integration/IntegrationTestBase.java index d4c4afbaf..7342d5e4a 100644 --- a/bundles/specmate-integration-test/src/com/specmate/test/integration/IntegrationTestBase.java +++ b/bundles/specmate-integration-test/src/com/specmate/test/integration/IntegrationTestBase.java @@ -20,6 +20,8 @@ public class IntegrationTestBase { + private static final String CDO_PASSWORD = "pass"; + private static final String CDO_USER = "cdo"; private static final String SPECMATE_RESOURCE = "specmate_resource"; private static final String SPECMATE_REPOSITORY = "specmate_repository"; // JUnits creates a new object for every test. Making these fields static @@ -56,6 +58,8 @@ private Dictionary getCDOServerProperties() { Dictionary properties = new Hashtable<>(); properties.put(SpecmateCDOServerConfig.KEY_SERVER_PORT, "2036"); properties.put(SpecmateCDOServerConfig.KEY_REPOSITORY_NAME, SPECMATE_REPOSITORY); + properties.put(SpecmateCDOServerConfig.KEY_CDO_USER, CDO_USER); + properties.put(SpecmateCDOServerConfig.KEY_CDO_PASSWORD, CDO_PASSWORD); return properties; } @@ -94,6 +98,8 @@ protected Dictionary getPersistencyProperties() { properties.put(CDOPersistencyServiceConfig.KEY_HOST, "localhost:2036"); properties.put(CDOPersistencyServiceConfig.KEY_REPOSITORY_NAME, SPECMATE_REPOSITORY); properties.put(CDOPersistencyServiceConfig.KEY_RESOURCE_NAME, SPECMATE_RESOURCE); + properties.put(CDOPersistencyServiceConfig.KEY_CDO_USER, CDO_USER); + properties.put(CDOPersistencyServiceConfig.KEY_CDO_PASSWORD, CDO_PASSWORD); return properties; } diff --git a/bundles/specmate-migration-test/src/com/specmate/migration/test/MigrationTestBase.java b/bundles/specmate-migration-test/src/com/specmate/migration/test/MigrationTestBase.java index b2bb565b7..cfcac5569 100644 --- a/bundles/specmate-migration-test/src/com/specmate/migration/test/MigrationTestBase.java +++ b/bundles/specmate-migration-test/src/com/specmate/migration/test/MigrationTestBase.java @@ -47,6 +47,8 @@ public abstract class MigrationTestBase { private static final String SPECMATE_RESOURCE = "specmate_resource"; private static final String SPECMATE_REPOSITORY = "specmate_repository"; + private static final String CDO_USER = "cdo"; + private static final String CDO_PASSWORD = "pass"; public MigrationTestBase(String dbname, String testModelName) throws Exception { this.dbname = dbname; @@ -76,6 +78,8 @@ private Dictionary getCDOServerProperties() { Dictionary properties = new Hashtable<>(); properties.put(SpecmateCDOServerConfig.KEY_SERVER_PORT, "2036"); properties.put(SpecmateCDOServerConfig.KEY_REPOSITORY_NAME, SPECMATE_REPOSITORY); + properties.put(SpecmateCDOServerConfig.KEY_CDO_USER, CDO_USER); + properties.put(SpecmateCDOServerConfig.KEY_CDO_PASSWORD, CDO_PASSWORD); return properties; } @@ -153,6 +157,8 @@ protected Dictionary getPersistencyProperties() { properties.put(CDOPersistencyServiceConfig.KEY_HOST, "localhost:2036"); properties.put(CDOPersistencyServiceConfig.KEY_REPOSITORY_NAME, SPECMATE_REPOSITORY); properties.put(CDOPersistencyServiceConfig.KEY_RESOURCE_NAME, SPECMATE_RESOURCE); + properties.put(CDOPersistencyServiceConfig.KEY_CDO_USER, CDO_USER); + properties.put(CDOPersistencyServiceConfig.KEY_CDO_PASSWORD, CDO_PASSWORD); return properties; } diff --git a/bundles/specmate-migration/src/com/specmate/migration/internal/services/Migrator20180622.java b/bundles/specmate-migration/src/com/specmate/migration/internal/services/Migrator20180622.java new file mode 100644 index 000000000..337aee5dc --- /dev/null +++ b/bundles/specmate-migration/src/com/specmate/migration/internal/services/Migrator20180622.java @@ -0,0 +1,28 @@ +package com.specmate.migration.internal.services; + +import java.sql.Connection; + +import org.osgi.service.component.annotations.Component; + +import com.specmate.common.SpecmateException; +import com.specmate.migration.api.IMigrator; + +@Component(property = "sourceVersion=20180622", service = IMigrator.class) +public class Migrator20180622 extends BaseMigrator { + + @Override + public String getSourceVersion() { + return "20180622"; + } + + @Override + public String getTargetVersion() { + return "20180720"; + } + + @Override + public void migrate(Connection connection) throws SpecmateException { + // nothing to do + } + +} diff --git a/bundles/specmate-model-ecore/model/specmate.ecore b/bundles/specmate-model-ecore/model/specmate.ecore index 9ee69751f..8fea9cf78 100644 --- a/bundles/specmate-model-ecore/model/specmate.ecore +++ b/bundles/specmate-model-ecore/model/specmate.ecore @@ -1,7 +1,7 @@ - + xmlns:ecore="http://www.eclipse.org/emf/2002/Ecore" name="model" nsURI="http://specmate.com/20180720/model" nsPrefix="com.specmate.model"> + @@ -26,8 +26,7 @@ - + @@ -72,7 +71,7 @@ eType="#//base/ITracingElement" eOpposite="#//base/ITracingElement/tracesTo"/> - @@ -136,7 +135,7 @@ - @@ -173,7 +172,7 @@ upperBound="-1" eType="#//testspecification/TestParameter"/> - @@ -206,7 +205,7 @@ - - - + diff --git a/bundles/specmate-model-ecore/model/specmate.history b/bundles/specmate-model-ecore/model/specmate.history index 4ef4b1511..7014809a4 100644 --- a/bundles/specmate-model-ecore/model/specmate.history +++ b/bundles/specmate-model-ecore/model/specmate.history @@ -2155,7 +2155,7 @@ - + @@ -2166,5 +2166,33 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/bundles/specmate-model-ecore/model/user.ecore b/bundles/specmate-model-ecore/model/user.ecore index 95dcbae04..4182413ee 100644 --- a/bundles/specmate-model-ecore/model/user.ecore +++ b/bundles/specmate-model-ecore/model/user.ecore @@ -1,6 +1,6 @@ + xmlns:ecore="http://www.eclipse.org/emf/2002/Ecore" name="usermodel" nsURI="http://specmate.com/20180720/model/user" nsPrefix="com.specmate.model"> diff --git a/bundles/specmate-model-ecore/model/user.history b/bundles/specmate-model-ecore/model/user.history index 8fdf98e8a..3ad8091db 100644 --- a/bundles/specmate-model-ecore/model/user.history +++ b/bundles/specmate-model-ecore/model/user.history @@ -288,5 +288,10 @@ - + + + + + + diff --git a/bundles/specmate-model-gen/build.properties b/bundles/specmate-model-gen/build.properties deleted file mode 100644 index fb7b5b415..000000000 --- a/bundles/specmate-model-gen/build.properties +++ /dev/null @@ -1,10 +0,0 @@ -# - -bin.includes = specmate-model-gen.jar,\ - model/,\ - icons/,\ - plugin.xml,\ - plugin.properties -jars.compile.order = specmate-model-gen.jar -source.specmate-model-gen.jar = src/ -output.specmate-model-gen.jar = bin/ diff --git a/bundles/specmate-model-gen/plugin.properties b/bundles/specmate-model-gen/plugin.properties deleted file mode 100644 index af5139ce9..000000000 --- a/bundles/specmate-model-gen/plugin.properties +++ /dev/null @@ -1,65 +0,0 @@ -# - -pluginName = Specmate Model -providerName = www.example.org -_UI_CreateChild_text = {0} -_UI_CreateChild_text2 = {1} {0} -_UI_CreateChild_text3 = {1} -_UI_CreateChild_tooltip = Create New {0} Under {1} Feature -_UI_CreateChild_description = Create a new child of type {0} for the {1} feature of the selected {2}. -_UI_CreateSibling_description = Create a new sibling of type {0} for the selected {2}, under the {1} feature of their parent. - _UI_PropertyDescriptor_description = The {0} of the {1} - _UI_INamed_type = INamed -_UI_IFolder_type = IFolder -_UI_IContentElement_type = IContent Element -_UI_IFolderElement_type = IFolder Element -_UI_IDescribed_type = IDescribed -_UI_Project_type = Project -_UI_IContainer_type = IContainer -_UI_Step_type = Step -_UI_StepSequence_type = Step Sequence -_UI_Flow_type = Flow -_UI_IAnnotationContainer_type = IAnnotation Container -_UI_IAnnotation_type = IAnnotation -_UI_StringAnnotation_type = String Annotation -_UI_IViewSource_type = IView Source -_UI_IView_type = IView -_UI_IID_type = IID -_UI_BaseModelNode_type = Base Model Node -_UI_BaseModelGraphNode_type = Base Model Graph Node -_UI_Unknown_type = Object - _UI_Unknown_datatype= Value - _UI_INamed_name_feature = Name -_UI_IDescribed_description_feature = Description -_UI_Project_basemodel_feature = Basemodel -_UI_Project_viewRoots_feature = View Roots -_UI_IContainer_contents_feature = Contents -_UI_StepSequence_steps_feature = Steps -_UI_IAnnotationContainer_annotations_feature = Annotations -_UI_StringAnnotation_value_feature = Value -_UI_StringAnnotation_key_feature = Key -_UI_IViewSource_views_feature = Views -_UI_IView_viewsource_feature = Viewsource -_UI_IID_id_feature = Id -_UI_BaseModelNode_graphNodes_feature = Graph Nodes -_UI_BaseModelGraphNode_predecessors_feature = Predecessors -_UI_BaseModelGraphNode_successors_feature = Successors -_UI_BaseModelGraphNode_containingNode_feature = Containing Node -_UI_Unknown_feature = Unspecified - -_UI_IUIInfo_type = IUI Info -_UI_UIAnnotation_type = UI Annotation -_UI_IGraphNodeContainer_type = IGraph Node Container -_UI_IBaseModelModification_type = IBase Model Modification -_UI_IBaseModelFolderElement_type = IBase Model Folder Element -_UI_BaseModelSlice_type = Base Model Slice -_UI_BaseModelGraphNodeRefinement_type = Base Model Graph Node Refinement -_UI_IUIInfo_x_feature = X -_UI_IUIInfo_y_feature = Y -_UI_IGraphNodeContainer_graphNodes_feature = Graph Nodes -_UI_IGraphNodeContainer_startNode_feature = Start Node -_UI_BaseModelGraphNode_refinements_feature = Refinements -_UI_BaseModelSlice_node_feature = Node -_UI_BaseModelSlice_from_feature = From -_UI_BaseModelSlice_to_feature = To -_UI_BaseModelSlice_modifications_feature = Modifications diff --git a/bundles/specmate-model-gen/plugin.xml b/bundles/specmate-model-gen/plugin.xml deleted file mode 100644 index 4a9079d5b..000000000 --- a/bundles/specmate-model-gen/plugin.xml +++ /dev/null @@ -1,71 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/bundles/specmate-model-gen/src/com/specmate/model/administration/AdministrationPackage.java b/bundles/specmate-model-gen/src/com/specmate/model/administration/AdministrationPackage.java index 47713f6da..d49237270 100644 --- a/bundles/specmate-model-gen/src/com/specmate/model/administration/AdministrationPackage.java +++ b/bundles/specmate-model-gen/src/com/specmate/model/administration/AdministrationPackage.java @@ -37,7 +37,7 @@ public interface AdministrationPackage extends EPackage { * * @generated */ - String eNS_URI = "http://specmate.com/20180622/model/administration"; + String eNS_URI = "http://specmate.com/20180720/model/administration"; /** * The package namespace name. diff --git a/bundles/specmate-model-gen/src/com/specmate/model/base/BasePackage.java b/bundles/specmate-model-gen/src/com/specmate/model/base/BasePackage.java index d0b062213..1304fac75 100644 --- a/bundles/specmate-model-gen/src/com/specmate/model/base/BasePackage.java +++ b/bundles/specmate-model-gen/src/com/specmate/model/base/BasePackage.java @@ -38,7 +38,7 @@ public interface BasePackage extends EPackage { * * @generated */ - String eNS_URI = "http://specmate.com/20180622/model/base"; + String eNS_URI = "http://specmate.com/20180720/model/base"; /** * The package namespace name. diff --git a/bundles/specmate-model-gen/src/com/specmate/model/base/IID.java b/bundles/specmate-model-gen/src/com/specmate/model/base/IID.java index a9a424935..3eb94c66d 100644 --- a/bundles/specmate-model-gen/src/com/specmate/model/base/IID.java +++ b/bundles/specmate-model-gen/src/com/specmate/model/base/IID.java @@ -33,7 +33,7 @@ public interface IID extends CDOObject { * @return the value of the 'Id' attribute. * @see #setId(String) * @see com.specmate.model.base.BasePackage#getIID_Id() - * @model id="true" + * @model * @generated */ String getId(); diff --git a/bundles/specmate-model-gen/src/com/specmate/model/base/impl/BasePackageImpl.java b/bundles/specmate-model-gen/src/com/specmate/model/base/impl/BasePackageImpl.java index c7d699f29..d8c30dea5 100644 --- a/bundles/specmate-model-gen/src/com/specmate/model/base/impl/BasePackageImpl.java +++ b/bundles/specmate-model-gen/src/com/specmate/model/base/impl/BasePackageImpl.java @@ -614,7 +614,7 @@ public void initializePackageContents() { initEAttribute(getIDescribed_Description(), ecorePackage.getEString(), "description", null, 0, 1, IDescribed.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); initEClass(iidEClass, com.specmate.model.base.IID.class, "IID", IS_ABSTRACT, IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); - initEAttribute(getIID_Id(), ecorePackage.getEString(), "id", null, 0, 1, com.specmate.model.base.IID.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); + initEAttribute(getIID_Id(), ecorePackage.getEString(), "id", null, 0, 1, com.specmate.model.base.IID.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); initEClass(iContentElementEClass, IContentElement.class, "IContentElement", IS_ABSTRACT, IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); diff --git a/bundles/specmate-model-gen/src/com/specmate/model/batch/BatchPackage.java b/bundles/specmate-model-gen/src/com/specmate/model/batch/BatchPackage.java index bef1089c8..f0ce8c4fb 100644 --- a/bundles/specmate-model-gen/src/com/specmate/model/batch/BatchPackage.java +++ b/bundles/specmate-model-gen/src/com/specmate/model/batch/BatchPackage.java @@ -39,7 +39,7 @@ public interface BatchPackage extends EPackage { * * @generated */ - String eNS_URI = "http://specmate.com/20180622/model/batch"; + String eNS_URI = "http://specmate.com/20180720/model/batch"; /** * The package namespace name. diff --git a/bundles/specmate-model-gen/src/com/specmate/model/history/HistoryPackage.java b/bundles/specmate-model-gen/src/com/specmate/model/history/HistoryPackage.java index 10db053f8..e30cb782c 100644 --- a/bundles/specmate-model-gen/src/com/specmate/model/history/HistoryPackage.java +++ b/bundles/specmate-model-gen/src/com/specmate/model/history/HistoryPackage.java @@ -38,7 +38,7 @@ public interface HistoryPackage extends EPackage { * * @generated */ - String eNS_URI = "http://specmate.com/20180622/model/history"; + String eNS_URI = "http://specmate.com/20180720/model/history"; /** * The package namespace name. diff --git a/bundles/specmate-model-gen/src/com/specmate/model/processes/ProcessesPackage.java b/bundles/specmate-model-gen/src/com/specmate/model/processes/ProcessesPackage.java index b7c962569..60a033104 100644 --- a/bundles/specmate-model-gen/src/com/specmate/model/processes/ProcessesPackage.java +++ b/bundles/specmate-model-gen/src/com/specmate/model/processes/ProcessesPackage.java @@ -39,7 +39,7 @@ public interface ProcessesPackage extends EPackage { * * @generated */ - String eNS_URI = "http://specmate.com/20180622/model/processes"; + String eNS_URI = "http://specmate.com/20180720/model/processes"; /** * The package namespace name. diff --git a/bundles/specmate-model-gen/src/com/specmate/model/requirements/RequirementsPackage.java b/bundles/specmate-model-gen/src/com/specmate/model/requirements/RequirementsPackage.java index cbd7d9237..291474a3c 100644 --- a/bundles/specmate-model-gen/src/com/specmate/model/requirements/RequirementsPackage.java +++ b/bundles/specmate-model-gen/src/com/specmate/model/requirements/RequirementsPackage.java @@ -40,7 +40,7 @@ public interface RequirementsPackage extends EPackage { * * @generated */ - String eNS_URI = "http://specmate.com/20180622/model/requirements"; + String eNS_URI = "http://specmate.com/20180720/model/requirements"; /** * The package namespace name. diff --git a/bundles/specmate-model-gen/src/com/specmate/model/testspecification/TestspecificationPackage.java b/bundles/specmate-model-gen/src/com/specmate/model/testspecification/TestspecificationPackage.java index f1323844e..15b51e15b 100644 --- a/bundles/specmate-model-gen/src/com/specmate/model/testspecification/TestspecificationPackage.java +++ b/bundles/specmate-model-gen/src/com/specmate/model/testspecification/TestspecificationPackage.java @@ -41,7 +41,7 @@ public interface TestspecificationPackage extends EPackage { * * @generated */ - String eNS_URI = "http://specmate.com/20180622/model/testspecification"; + String eNS_URI = "http://specmate.com/20180720/model/testspecification"; /** * The package namespace name. diff --git a/bundles/specmate-model-gen/src/com/specmate/usermodel/UsermodelPackage.java b/bundles/specmate-model-gen/src/com/specmate/usermodel/UsermodelPackage.java index 277262040..f53147949 100644 --- a/bundles/specmate-model-gen/src/com/specmate/usermodel/UsermodelPackage.java +++ b/bundles/specmate-model-gen/src/com/specmate/usermodel/UsermodelPackage.java @@ -38,7 +38,7 @@ public interface UsermodelPackage extends EPackage { * * @generated */ - String eNS_URI = "http://specmate.com/20180622/model/user"; + String eNS_URI = "http://specmate.com/20180720/model/user"; /** * The package namespace name. diff --git a/bundles/specmate-persistency-cdo/src/com/specmate/persistency/cdo/internal/CDOPersistencyService.java b/bundles/specmate-persistency-cdo/src/com/specmate/persistency/cdo/internal/CDOPersistencyService.java index 6e9a9189e..345fe96ee 100644 --- a/bundles/specmate-persistency-cdo/src/com/specmate/persistency/cdo/internal/CDOPersistencyService.java +++ b/bundles/specmate-persistency-cdo/src/com/specmate/persistency/cdo/internal/CDOPersistencyService.java @@ -14,8 +14,9 @@ import org.eclipse.emf.cdo.common.revision.CDORevision; import org.eclipse.emf.cdo.eresource.CDOResource; import org.eclipse.emf.cdo.net4j.CDONet4jSession; -import org.eclipse.emf.cdo.net4j.CDONet4jSessionConfiguration; import org.eclipse.emf.cdo.net4j.CDONet4jUtil; +import org.eclipse.emf.cdo.net4j.CDOSessionRecoveryEvent; +import org.eclipse.emf.cdo.net4j.ReconnectingCDOSessionConfiguration; import org.eclipse.emf.cdo.server.net4j.CDONet4jServerUtil; import org.eclipse.emf.cdo.session.CDOSessionInvalidationEvent; import org.eclipse.emf.cdo.transaction.CDOTransaction; @@ -31,6 +32,7 @@ import org.eclipse.net4j.Net4jUtil; import org.eclipse.net4j.connector.IConnector; import org.eclipse.net4j.tcp.TCPUtil; +import org.eclipse.net4j.util.StringUtil; import org.eclipse.net4j.util.container.IManagedContainer; import org.eclipse.net4j.util.container.IPluginContainer; import org.eclipse.net4j.util.event.IEvent; @@ -39,6 +41,7 @@ import org.eclipse.net4j.util.om.OMPlatform; import org.eclipse.net4j.util.om.log.PrintLogHandler; import org.eclipse.net4j.util.om.trace.PrintTraceHandler; +import org.eclipse.net4j.util.security.PasswordCredentialsProvider; import org.osgi.service.component.annotations.Activate; import org.osgi.service.component.annotations.Component; import org.osgi.service.component.annotations.ConfigurationPolicy; @@ -119,6 +122,10 @@ public class CDOPersistencyService implements IPersistencyService, IListener { private CDOView eventView; + private String cdoUser; + + private String cdoPassword; + @Activate public void activate(Map properties) throws SpecmateException, SpecmateValidationException { readConfig(properties); @@ -135,6 +142,9 @@ private void readConfig(Map properties) throws SpecmateValidatio this.repositoryName = (String) properties.get(CDOPersistencyServiceConfig.KEY_REPOSITORY_NAME); this.resourceName = (String) properties.get(CDOPersistencyServiceConfig.KEY_RESOURCE_NAME); this.host = (String) properties.get(CDOPersistencyServiceConfig.KEY_HOST); + this.cdoUser = (String) properties.get(CDOPersistencyServiceConfig.KEY_CDO_USER); + this.cdoPassword = (String) properties.get(CDOPersistencyServiceConfig.KEY_CDO_PASSWORD); + if (StringUtils.isEmpty(this.repositoryName)) { throw new SpecmateValidationException("Repository name is empty."); } @@ -144,6 +154,14 @@ private void readConfig(Map properties) throws SpecmateValidatio if (StringUtils.isEmpty(this.host)) { throw new SpecmateValidationException("Host is empty."); } + + if (StringUtil.isEmpty(this.cdoUser)) { + throw new SpecmateValidationException("No CDO user name given"); + } + + if (StringUtil.isEmpty(this.cdoPassword)) { + throw new SpecmateValidationException("No CDO password given"); + } } @Override @@ -196,13 +214,34 @@ private void createContainer() { } private void createSession() { - connector = TCPUtil.getConnector(container, this.host); - CDONet4jSessionConfiguration configuration = CDONet4jUtil.createNet4jSessionConfiguration(); - configuration.setConnector(connector); - configuration.setRepositoryName(this.repositoryName); + PasswordCredentialsProvider credentialsProvider = new PasswordCredentialsProvider(this.cdoUser, + this.cdoPassword); + + ReconnectingCDOSessionConfiguration configuration = CDONet4jUtil + .createReconnectingSessionConfiguration(this.host, this.repositoryName, container); + configuration.setHeartBeatEnabled(false); + configuration.setConnectorTimeout(60000); + configuration.setSignalTimeout(60000); + configuration.setCredentialsProvider(credentialsProvider); configuration.setPassiveUpdateEnabled(true); configuration.setPassiveUpdateMode(PassiveUpdateMode.ADDITIONS); session = configuration.openNet4jSession(); + + session.addListener(new IListener() { + public void notifyEvent(final IEvent event) { + if (event instanceof CDOSessionRecoveryEvent) { + CDOSessionRecoveryEvent recoveryEvent = (CDOSessionRecoveryEvent) event; + switch (recoveryEvent.getType()) { + case STARTED: + logService.log(LogService.LOG_WARNING, "Reconnecting CDO session started."); + break; + case FINISHED: + logService.log(LogService.LOG_WARNING, "Reconnecting CDO session finished."); + break; + } + } + } + }); registerPackages(); createModelResource(); } diff --git a/bundles/specmate-persistency-cdo/src/com/specmate/persistency/cdo/internal/CDOPersistencyServiceConfig.java b/bundles/specmate-persistency-cdo/src/com/specmate/persistency/cdo/internal/CDOPersistencyServiceConfig.java index dee832c90..dc97c8377 100644 --- a/bundles/specmate-persistency-cdo/src/com/specmate/persistency/cdo/internal/CDOPersistencyServiceConfig.java +++ b/bundles/specmate-persistency-cdo/src/com/specmate/persistency/cdo/internal/CDOPersistencyServiceConfig.java @@ -10,6 +10,7 @@ import java.util.concurrent.TimeUnit; import org.apache.commons.lang3.StringUtils; +import org.eclipse.net4j.util.StringUtil; import org.osgi.service.cm.Configuration; import org.osgi.service.cm.ConfigurationAdmin; import org.osgi.service.component.annotations.Activate; @@ -28,6 +29,8 @@ public class CDOPersistencyServiceConfig { public static final String PID = "com.specmate.persistency.cdo.internal.CDOPersistencyService"; public static final String KEY_REPOSITORY_NAME = "cdo.repositoryName"; public static final String KEY_RESOURCE_NAME = "cdo.resourceName"; + public static final String KEY_CDO_USER = "cdo.user"; + public static final String KEY_CDO_PASSWORD = "cdo.password"; public static final String KEY_HOST = "cdo.host"; private ConfigurationAdmin configurationAdmin; private IConfigService configService; @@ -40,6 +43,8 @@ public class CDOPersistencyServiceConfig { private String hostName; private int port; private Configuration configuration; + private String cdoUser; + private String cdoPassword; /** * Configures the CDO persistency service. @@ -50,6 +55,8 @@ public class CDOPersistencyServiceConfig { private void activate() throws SpecmateException { this.specmateRepository = configService.getConfigurationProperty(KEY_REPOSITORY_NAME); this.specmateResource = configService.getConfigurationProperty(KEY_RESOURCE_NAME); + this.cdoUser = configService.getConfigurationProperty(KEY_CDO_USER); + this.cdoPassword = configService.getConfigurationProperty(KEY_CDO_PASSWORD); this.host = configService.getConfigurationProperty(KEY_HOST); this.connected = false; String[] hostport = StringUtils.split(this.host, ":"); @@ -68,7 +75,8 @@ private void deactivate() { } /** - * Starts a thread that periodically checks if the CDO server is still reachable + * Starts a thread that periodically checks if the CDO server is still + * reachable */ private void startMonitoringThread() { @@ -103,10 +111,13 @@ private void startMonitoringThread() { private void registerConfiguration() throws SpecmateException { Dictionary properties = new Hashtable<>(); - if (specmateRepository != null && specmateResource != null && host != null) { + if (!StringUtil.isEmpty(specmateRepository) && !StringUtil.isEmpty(specmateResource) + && !StringUtil.isEmpty(host) && !StringUtil.isEmpty(cdoUser) && !StringUtil.isEmpty(cdoPassword)) { properties.put(KEY_REPOSITORY_NAME, specmateRepository); properties.put(KEY_RESOURCE_NAME, specmateResource); properties.put(KEY_HOST, host); + properties.put(KEY_CDO_USER, cdoUser); + properties.put(KEY_CDO_PASSWORD, cdoPassword); logService.log(LogService.LOG_DEBUG, "Configuring CDO with:\n" + OSGiUtil.configDictionaryToString(properties)); this.configuration = OSGiUtil.configureService(configurationAdmin, PID, properties); diff --git a/specmate/bundles/org.json/bin/.project b/specmate/bundles/org.json/bin/.project deleted file mode 100644 index 7d82dea63..000000000 --- a/specmate/bundles/org.json/bin/.project +++ /dev/null @@ -1,23 +0,0 @@ - - - org.json - - - - - - org.eclipse.jdt.core.javabuilder - - - - - bndtools.core.bndbuilder - - - - - - org.eclipse.jdt.core.javanature - bndtools.core.bndnature - - diff --git a/specmate/bundles/org.json/bin/generated/.index b/specmate/bundles/org.json/bin/generated/.index deleted file mode 100644 index bb2bad6e0..000000000 --- a/specmate/bundles/org.json/bin/generated/.index +++ /dev/null @@ -1,28 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/specmate/bundles/org.json/bin/generated/buildfiles b/specmate/bundles/org.json/bin/generated/buildfiles deleted file mode 100644 index 28fd4819b..000000000 --- a/specmate/bundles/org.json/bin/generated/buildfiles +++ /dev/null @@ -1 +0,0 @@ -/Users/Dominik/Documents/Arbeit/Qualicen/Specmate/specmate/bundles/org.json/generated/org.json.jar diff --git a/specmate/bundles/org.json/generated/.index b/specmate/bundles/org.json/generated/.index deleted file mode 100644 index bb2bad6e0..000000000 --- a/specmate/bundles/org.json/generated/.index +++ /dev/null @@ -1,28 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/specmate/bundles/org.json/generated/buildfiles b/specmate/bundles/org.json/generated/buildfiles deleted file mode 100644 index 28fd4819b..000000000 --- a/specmate/bundles/org.json/generated/buildfiles +++ /dev/null @@ -1 +0,0 @@ -/Users/Dominik/Documents/Arbeit/Qualicen/Specmate/specmate/bundles/org.json/generated/org.json.jar diff --git a/web/package.json b/web/package.json index 99f6c2cfb..9b29cdb82 100644 --- a/web/package.json +++ b/web/package.json @@ -32,6 +32,7 @@ "@ng-bootstrap/ng-bootstrap": "1.0.0", "@ngx-translate/core": "9.1.1", "@ngx-translate/http-loader": "2.0.1", + "@types/jquery": "^3.3.4", "angular-split": "1.0.0-rc.1", "angular2-uuid": "1.1.1", "bootstrap": "4.0.0", diff --git a/web/src/app/config/config.ts b/web/src/app/config/config.ts index 8a0a8aa20..a3a9011cf 100644 --- a/web/src/app/config/config.ts +++ b/web/src/app/config/config.ts @@ -10,6 +10,8 @@ export class Config { public static VIEW_URL_PREFIX = '-/'; public static LOGIN_URL = Config.VIEW_URL_PREFIX + 'login'; + public static WELCOME_URL_PART = 'welcome'; + public static WELCOME_URL = Config.VIEW_URL_PREFIX + Config.WELCOME_URL_PART; // For all of these languages, we need to // - have a .json file in assets/i18n diff --git a/web/src/app/model/BatchOperation.ts b/web/src/app/model/BatchOperation.ts index aa9010479..25dbfd322 100644 --- a/web/src/app/model/BatchOperation.ts +++ b/web/src/app/model/BatchOperation.ts @@ -5,7 +5,7 @@ export class BatchOperation { - ___nsuri: string = "http://specmate.com/20180622/model/batch"; + ___nsuri: string = "http://specmate.com/20180720/model/batch"; public url: string; public className: string = "BatchOperation"; public static className: string = "BatchOperation"; diff --git a/web/src/app/model/CEGConnection.ts b/web/src/app/model/CEGConnection.ts index 08084180b..20e70f0c5 100644 --- a/web/src/app/model/CEGConnection.ts +++ b/web/src/app/model/CEGConnection.ts @@ -4,7 +4,7 @@ export class CEGConnection { - ___nsuri: string = "http://specmate.com/20180622/model/requirements"; + ___nsuri: string = "http://specmate.com/20180720/model/requirements"; public url: string; public className: string = "CEGConnection"; public static className: string = "CEGConnection"; diff --git a/web/src/app/model/CEGModel.ts b/web/src/app/model/CEGModel.ts index e86e741ad..9f162511b 100644 --- a/web/src/app/model/CEGModel.ts +++ b/web/src/app/model/CEGModel.ts @@ -4,7 +4,7 @@ export class CEGModel { - ___nsuri: string = "http://specmate.com/20180622/model/requirements"; + ___nsuri: string = "http://specmate.com/20180720/model/requirements"; public url: string; public className: string = "CEGModel"; public static className: string = "CEGModel"; diff --git a/web/src/app/model/CEGNode.ts b/web/src/app/model/CEGNode.ts index 6e749e4ae..db8a48b3f 100644 --- a/web/src/app/model/CEGNode.ts +++ b/web/src/app/model/CEGNode.ts @@ -4,7 +4,7 @@ export class CEGNode { - ___nsuri: string = "http://specmate.com/20180622/model/requirements"; + ___nsuri: string = "http://specmate.com/20180720/model/requirements"; public url: string; public className: string = "CEGNode"; public static className: string = "CEGNode"; diff --git a/web/src/app/model/Change.ts b/web/src/app/model/Change.ts index eed32e0a8..018fba2f5 100644 --- a/web/src/app/model/Change.ts +++ b/web/src/app/model/Change.ts @@ -4,7 +4,7 @@ export class Change { - ___nsuri: string = "http://specmate.com/20180622/model/history"; + ___nsuri: string = "http://specmate.com/20180720/model/history"; public url: string; public className: string = "Change"; public static className: string = "Change"; diff --git a/web/src/app/model/Folder.ts b/web/src/app/model/Folder.ts index ac1834052..df48ba66e 100644 --- a/web/src/app/model/Folder.ts +++ b/web/src/app/model/Folder.ts @@ -4,7 +4,7 @@ export class Folder { - ___nsuri: string = "http://specmate.com/20180622/model/base"; + ___nsuri: string = "http://specmate.com/20180720/model/base"; public url: string; public className: string = "Folder"; public static className: string = "Folder"; diff --git a/web/src/app/model/History.ts b/web/src/app/model/History.ts index 32a8d2fbe..fcd260d91 100644 --- a/web/src/app/model/History.ts +++ b/web/src/app/model/History.ts @@ -5,7 +5,7 @@ export class History { - ___nsuri: string = "http://specmate.com/20180622/model/history"; + ___nsuri: string = "http://specmate.com/20180720/model/history"; public url: string; public className: string = "History"; public static className: string = "History"; diff --git a/web/src/app/model/HistoryEntry.ts b/web/src/app/model/HistoryEntry.ts index cd79ef4a9..01614b521 100644 --- a/web/src/app/model/HistoryEntry.ts +++ b/web/src/app/model/HistoryEntry.ts @@ -5,7 +5,7 @@ export class HistoryEntry { - ___nsuri: string = "http://specmate.com/20180622/model/history"; + ___nsuri: string = "http://specmate.com/20180720/model/history"; public url: string; public className: string = "HistoryEntry"; public static className: string = "HistoryEntry"; diff --git a/web/src/app/model/IExternal.ts b/web/src/app/model/IExternal.ts index dc04954e5..6c69c37de 100644 --- a/web/src/app/model/IExternal.ts +++ b/web/src/app/model/IExternal.ts @@ -4,7 +4,7 @@ export class IExternal { - ___nsuri: string = "http://specmate.com/20180622/model/base"; + ___nsuri: string = "http://specmate.com/20180720/model/base"; public url: string; public className: string = "IExternal"; public static className: string = "IExternal"; diff --git a/web/src/app/model/IModelConnection.ts b/web/src/app/model/IModelConnection.ts index 9c272fb1a..7517261ed 100644 --- a/web/src/app/model/IModelConnection.ts +++ b/web/src/app/model/IModelConnection.ts @@ -4,7 +4,7 @@ export class IModelConnection { - ___nsuri: string = "http://specmate.com/20180622/model/base"; + ___nsuri: string = "http://specmate.com/20180720/model/base"; public url: string; public className: string = "IModelConnection"; public static className: string = "IModelConnection"; diff --git a/web/src/app/model/IModelNode.ts b/web/src/app/model/IModelNode.ts index c74761447..cb392c81e 100644 --- a/web/src/app/model/IModelNode.ts +++ b/web/src/app/model/IModelNode.ts @@ -4,7 +4,7 @@ export class IModelNode { - ___nsuri: string = "http://specmate.com/20180622/model/base"; + ___nsuri: string = "http://specmate.com/20180720/model/base"; public url: string; public className: string = "IModelNode"; public static className: string = "IModelNode"; diff --git a/web/src/app/model/ITracingElement.ts b/web/src/app/model/ITracingElement.ts index d79991e62..2d1a5fcdc 100644 --- a/web/src/app/model/ITracingElement.ts +++ b/web/src/app/model/ITracingElement.ts @@ -4,7 +4,7 @@ export class ITracingElement { - ___nsuri: string = "http://specmate.com/20180622/model/base"; + ___nsuri: string = "http://specmate.com/20180720/model/base"; public url: string; public className: string = "ITracingElement"; public static className: string = "ITracingElement"; diff --git a/web/src/app/model/Operation.ts b/web/src/app/model/Operation.ts index 346f1ed09..e3f480db3 100644 --- a/web/src/app/model/Operation.ts +++ b/web/src/app/model/Operation.ts @@ -5,7 +5,7 @@ export class Operation { - ___nsuri: string = "http://specmate.com/20180622/model/batch"; + ___nsuri: string = "http://specmate.com/20180720/model/batch"; public url: string; public className: string = "Operation"; public static className: string = "Operation"; diff --git a/web/src/app/model/ParameterAssignment.ts b/web/src/app/model/ParameterAssignment.ts index 72ccab768..15933c9e3 100644 --- a/web/src/app/model/ParameterAssignment.ts +++ b/web/src/app/model/ParameterAssignment.ts @@ -4,7 +4,7 @@ export class ParameterAssignment { - ___nsuri: string = "http://specmate.com/20180622/model/testspecification"; + ___nsuri: string = "http://specmate.com/20180720/model/testspecification"; public url: string; public className: string = "ParameterAssignment"; public static className: string = "ParameterAssignment"; diff --git a/web/src/app/model/Process.ts b/web/src/app/model/Process.ts index 2a655baae..f16456e6c 100644 --- a/web/src/app/model/Process.ts +++ b/web/src/app/model/Process.ts @@ -4,7 +4,7 @@ export class Process { - ___nsuri: string = "http://specmate.com/20180622/model/processes"; + ___nsuri: string = "http://specmate.com/20180720/model/processes"; public url: string; public className: string = "Process"; public static className: string = "Process"; diff --git a/web/src/app/model/ProcessConnection.ts b/web/src/app/model/ProcessConnection.ts index 40835a182..61afd7630 100644 --- a/web/src/app/model/ProcessConnection.ts +++ b/web/src/app/model/ProcessConnection.ts @@ -4,7 +4,7 @@ export class ProcessConnection { - ___nsuri: string = "http://specmate.com/20180622/model/processes"; + ___nsuri: string = "http://specmate.com/20180720/model/processes"; public url: string; public className: string = "ProcessConnection"; public static className: string = "ProcessConnection"; diff --git a/web/src/app/model/ProcessDecision.ts b/web/src/app/model/ProcessDecision.ts index 9ea5e684c..edca6c781 100644 --- a/web/src/app/model/ProcessDecision.ts +++ b/web/src/app/model/ProcessDecision.ts @@ -4,7 +4,7 @@ export class ProcessDecision { - ___nsuri: string = "http://specmate.com/20180622/model/processes"; + ___nsuri: string = "http://specmate.com/20180720/model/processes"; public url: string; public className: string = "ProcessDecision"; public static className: string = "ProcessDecision"; diff --git a/web/src/app/model/ProcessEnd.ts b/web/src/app/model/ProcessEnd.ts index 74cd609e0..0e0d90197 100644 --- a/web/src/app/model/ProcessEnd.ts +++ b/web/src/app/model/ProcessEnd.ts @@ -4,7 +4,7 @@ export class ProcessEnd { - ___nsuri: string = "http://specmate.com/20180622/model/processes"; + ___nsuri: string = "http://specmate.com/20180720/model/processes"; public url: string; public className: string = "ProcessEnd"; public static className: string = "ProcessEnd"; diff --git a/web/src/app/model/ProcessNode.ts b/web/src/app/model/ProcessNode.ts index 075e9eec6..9145447a4 100644 --- a/web/src/app/model/ProcessNode.ts +++ b/web/src/app/model/ProcessNode.ts @@ -4,7 +4,7 @@ export class ProcessNode { - ___nsuri: string = "http://specmate.com/20180622/model/processes"; + ___nsuri: string = "http://specmate.com/20180720/model/processes"; public url: string; public className: string = "ProcessNode"; public static className: string = "ProcessNode"; diff --git a/web/src/app/model/ProcessStart.ts b/web/src/app/model/ProcessStart.ts index 7a31f6766..11a8c76ca 100644 --- a/web/src/app/model/ProcessStart.ts +++ b/web/src/app/model/ProcessStart.ts @@ -4,7 +4,7 @@ export class ProcessStart { - ___nsuri: string = "http://specmate.com/20180622/model/processes"; + ___nsuri: string = "http://specmate.com/20180720/model/processes"; public url: string; public className: string = "ProcessStart"; public static className: string = "ProcessStart"; diff --git a/web/src/app/model/ProcessStep.ts b/web/src/app/model/ProcessStep.ts index 8e8f8a458..43e0dcd5b 100644 --- a/web/src/app/model/ProcessStep.ts +++ b/web/src/app/model/ProcessStep.ts @@ -4,7 +4,7 @@ export class ProcessStep { - ___nsuri: string = "http://specmate.com/20180622/model/processes"; + ___nsuri: string = "http://specmate.com/20180720/model/processes"; public url: string; public className: string = "ProcessStep"; public static className: string = "ProcessStep"; diff --git a/web/src/app/model/Requirement.ts b/web/src/app/model/Requirement.ts index 1b02282b0..22c57a444 100644 --- a/web/src/app/model/Requirement.ts +++ b/web/src/app/model/Requirement.ts @@ -4,7 +4,7 @@ export class Requirement { - ___nsuri: string = "http://specmate.com/20180622/model/requirements"; + ___nsuri: string = "http://specmate.com/20180720/model/requirements"; public url: string; public className: string = "Requirement"; public static className: string = "Requirement"; diff --git a/web/src/app/model/Status.ts b/web/src/app/model/Status.ts index 1c28ed346..7299b1555 100644 --- a/web/src/app/model/Status.ts +++ b/web/src/app/model/Status.ts @@ -4,7 +4,7 @@ export class Status { - ___nsuri: string = "http://specmate.com/20180622/model/administration"; + ___nsuri: string = "http://specmate.com/20180720/model/administration"; public url: string; public className: string = "Status"; public static className: string = "Status"; diff --git a/web/src/app/model/TestCase.ts b/web/src/app/model/TestCase.ts index f2b7773ee..47144125a 100644 --- a/web/src/app/model/TestCase.ts +++ b/web/src/app/model/TestCase.ts @@ -4,7 +4,7 @@ export class TestCase { - ___nsuri: string = "http://specmate.com/20180622/model/testspecification"; + ___nsuri: string = "http://specmate.com/20180720/model/testspecification"; public url: string; public className: string = "TestCase"; public static className: string = "TestCase"; diff --git a/web/src/app/model/TestParameter.ts b/web/src/app/model/TestParameter.ts index 86e7e7eb0..164b98efe 100644 --- a/web/src/app/model/TestParameter.ts +++ b/web/src/app/model/TestParameter.ts @@ -4,7 +4,7 @@ export class TestParameter { - ___nsuri: string = "http://specmate.com/20180622/model/testspecification"; + ___nsuri: string = "http://specmate.com/20180720/model/testspecification"; public url: string; public className: string = "TestParameter"; public static className: string = "TestParameter"; diff --git a/web/src/app/model/TestProcedure.ts b/web/src/app/model/TestProcedure.ts index f8febd686..e4fd8d311 100644 --- a/web/src/app/model/TestProcedure.ts +++ b/web/src/app/model/TestProcedure.ts @@ -4,7 +4,7 @@ export class TestProcedure { - ___nsuri: string = "http://specmate.com/20180622/model/testspecification"; + ___nsuri: string = "http://specmate.com/20180720/model/testspecification"; public url: string; public className: string = "TestProcedure"; public static className: string = "TestProcedure"; diff --git a/web/src/app/model/TestSpecification.ts b/web/src/app/model/TestSpecification.ts index 804bf139d..892a95035 100644 --- a/web/src/app/model/TestSpecification.ts +++ b/web/src/app/model/TestSpecification.ts @@ -4,7 +4,7 @@ export class TestSpecification { - ___nsuri: string = "http://specmate.com/20180622/model/testspecification"; + ___nsuri: string = "http://specmate.com/20180720/model/testspecification"; public url: string; public className: string = "TestSpecification"; public static className: string = "TestSpecification"; diff --git a/web/src/app/model/TestStep.ts b/web/src/app/model/TestStep.ts index d6764a0fd..1206e2eab 100644 --- a/web/src/app/model/TestStep.ts +++ b/web/src/app/model/TestStep.ts @@ -4,7 +4,7 @@ export class TestStep { - ___nsuri: string = "http://specmate.com/20180622/model/testspecification"; + ___nsuri: string = "http://specmate.com/20180720/model/testspecification"; public url: string; public className: string = "TestStep"; public static className: string = "TestStep"; diff --git a/web/src/app/model/User.ts b/web/src/app/model/User.ts index fc0caaa59..33e420014 100644 --- a/web/src/app/model/User.ts +++ b/web/src/app/model/User.ts @@ -4,7 +4,7 @@ export class User { - ___nsuri: string = "http://specmate.com/20180622/model/user"; + ___nsuri: string = "http://specmate.com/20180720/model/user"; public url: string; public className: string = "User"; public static className: string = "User"; diff --git a/web/src/app/model/UserSession.ts b/web/src/app/model/UserSession.ts index 3074bc42d..7c95aca20 100644 --- a/web/src/app/model/UserSession.ts +++ b/web/src/app/model/UserSession.ts @@ -4,7 +4,7 @@ export class UserSession { - ___nsuri: string = "http://specmate.com/20180622/model/user"; + ___nsuri: string = "http://specmate.com/20180720/model/user"; public url: string; public className: string = "UserSession"; public static className: string = "UserSession"; diff --git a/web/src/app/modules/actions/modules/common-controls/components/common-controls.component.html b/web/src/app/modules/actions/modules/common-controls/components/common-controls.component.html index 7a3b20c65..678ab8956 100644 --- a/web/src/app/modules/actions/modules/common-controls/components/common-controls.component.html +++ b/web/src/app/modules/actions/modules/common-controls/components/common-controls.component.html @@ -1,7 +1,7 @@
-
  -
  -
  -
  +   +   +   +  
 {{'connection.lost' | translate}}
\ No newline at end of file diff --git a/web/src/app/modules/actions/modules/common-controls/components/common-controls.component.ts b/web/src/app/modules/actions/modules/common-controls/components/common-controls.component.ts index ee82a0930..f59c11d99 100644 --- a/web/src/app/modules/actions/modules/common-controls/components/common-controls.component.ts +++ b/web/src/app/modules/actions/modules/common-controls/components/common-controls.component.ts @@ -25,7 +25,6 @@ export class CommonControls { private dataService: SpecmateDataService, private connection: ServerConnectionService, private validator: ValidationService, - private modal: ConfirmationModal, private navigator: NavigatorService, private translate: TranslateService) { } @@ -46,18 +45,23 @@ export class CommonControls { } } - private forward(): void { + public forward(): void { if (this.isForwardEnabled) { this.navigator.forward(); } } - private back(): void { + public back(): void { if (this.isBackEnabled) { this.navigator.back(); } } + public cancelEvent(event: Event): void { + event.preventDefault(); + event.stopPropagation(); + } + public get isSaveEnabled(): boolean { return this.isEnabled && this.dataService.hasCommits && this.validator.currentValid; } diff --git a/web/src/app/modules/actions/modules/export-testprocedure-button/components/export-testprocedure-button.component.ts b/web/src/app/modules/actions/modules/export-testprocedure-button/components/export-testprocedure-button.component.ts index 8d30a0e26..81e0d076a 100644 --- a/web/src/app/modules/actions/modules/export-testprocedure-button/components/export-testprocedure-button.component.ts +++ b/web/src/app/modules/actions/modules/export-testprocedure-button/components/export-testprocedure-button.component.ts @@ -44,7 +44,10 @@ export class ExportTestprocedureButton implements OnInit { this.dataService.performOperations(this.testProcedure.url, 'syncalm') .then((result) => { if (result) { - this.modal.open(this.translate.instant('procedureExportedSuccessfully'), false); + this.modal + .openOk(this.translate.instant('successful'), this.translate.instant('procedureExportedSuccessfully')); + } else { + this.modal.openOk(this.translate.instant('failed'), this.translate.instant('procedureExportFailed')); } } ) diff --git a/web/src/app/modules/common/modules/i18n/components/language-chooser.component.html b/web/src/app/modules/common/modules/i18n/components/language-chooser.component.html index 0db18f9fc..01fa0eee3 100644 --- a/web/src/app/modules/common/modules/i18n/components/language-chooser.component.html +++ b/web/src/app/modules/common/modules/i18n/components/language-chooser.component.html @@ -1,4 +1,4 @@ -
+
diff --git a/web/src/app/modules/common/modules/i18n/components/language-chooser.component.ts b/web/src/app/modules/common/modules/i18n/components/language-chooser.component.ts index 770531420..cd9e96ba2 100644 --- a/web/src/app/modules/common/modules/i18n/components/language-chooser.component.ts +++ b/web/src/app/modules/common/modules/i18n/components/language-chooser.component.ts @@ -1,10 +1,10 @@ import { Config } from '../../../../../config/config'; -import { Component, OnInit, HostListener, ViewChild } from '@angular/core'; +import { Component, OnInit, HostListener, ViewChild, Inject } from '@angular/core'; import { TranslateService } from '@ngx-translate/core'; import { NgbDropdownConfig, NgbDropdown } from '@ng-bootstrap/ng-bootstrap'; import { CookieService } from 'ngx-cookie'; import { Key } from '../../../../../util/keycode'; -import { FocusService } from '../../../../navigation/services/focus.service'; +import { DOCUMENT } from '@angular/platform-browser'; @Component({ selector: 'language-chooser', @@ -26,15 +26,13 @@ export class LanguageChooser implements OnInit { constructor(private translate: TranslateService, private cookie: CookieService, - private config: NgbDropdownConfig, - private focus: FocusService) { + config: NgbDropdownConfig, + @Inject(DOCUMENT) private document: any) { config.autoClose = true; config.placement = 'bottom-right'; } public ngOnInit(): void { - console.log(this._dropdownRef); - this.translate.addLangs(Config.LANGUAGES.map(languageObject => languageObject.code)); const cookieLang = this.retrieveFromCookie(); if (cookieLang !== undefined && cookieLang !== null && cookieLang.length > 0) { @@ -54,6 +52,7 @@ export class LanguageChooser implements OnInit { public set language(language: string) { this.translate.use(language); + this.setLangAttr(language); this.storeInCookie(); } @@ -77,50 +76,15 @@ export class LanguageChooser implements OnInit { this.cookie.put(LanguageChooser.LANGUAGE_KEY, this.language); } - private retrieveFromCookie(): string { - return this.cookie.get(LanguageChooser.LANGUAGE_KEY); + private setLangAttr(language: string): void { + this.document.documentElement.lang = language; } - // Navigation with arrow keys - @HostListener('window:keyup', ['$event']) - keyEvent(event: KeyboardEvent) { - if (!this.focus.isFocused(this)) { - return; - } - - if (event.keyCode === Key.ARROW_UP && this.selectionIndex > 0) { - this.selectionIndex--; - } - - if (event.keyCode === Key.ARROW_DOWN && this.selectionIndex < this.otherLanguages.length) { - this.selectionIndex++; - } - - if (event.keyCode === Key.SPACEBAR) { - this.language = this.otherLanguages[this.selectionIndex]; - this.dropdownClose(); - } - - if (event.keyCode === Key.ESC) { - this.selectionIndex = 0; - this.dropdownClose(); - } + private retrieveFromCookie(): string { + return this.cookie.get(LanguageChooser.LANGUAGE_KEY); } public setSelectionIndex(newIndex: number) { this.selectionIndex = newIndex; } - - public dropdownChange(isOpen: boolean) { - if (isOpen) { - this.focus.demandFocus(this); - } else { - this.focus.returnFocus(this); - } - } - - public dropdownClose() { - this._dropdownRef.close(); - this.focus.returnFocus(this); - } } diff --git a/web/src/app/modules/data/modules/data-service/services/specmate-data.service.ts b/web/src/app/modules/data/modules/data-service/services/specmate-data.service.ts index 5db88ee49..161bc1053 100644 --- a/web/src/app/modules/data/modules/data-service/services/specmate-data.service.ts +++ b/web/src/app/modules/data/modules/data-service/services/specmate-data.service.ts @@ -229,7 +229,7 @@ export class SpecmateDataService { } private createElementServer(element: IContainer): Promise { - if (!this.auth.isAuthenticated) { + if (!this.auth.isAuthenticatedForUrl(element.url)) { return Promise.resolve(); } this.logStart(this.translate.instant('create'), element.url); @@ -240,7 +240,7 @@ export class SpecmateDataService { } private readContentsServer(url: string): Promise { - if (!this.auth.isAuthenticated) { + if (!this.auth.isAuthenticatedForUrl(url)) { return Promise.resolve(undefined); } this.logStart(this.translate.instant('log.readContents'), url); @@ -253,7 +253,7 @@ export class SpecmateDataService { } private readElementServer(url: string): Promise { - if (!this.auth.isAuthenticated) { + if (!this.auth.isAuthenticatedForUrl(url)) { return Promise.resolve(undefined); } this.logStart(this.translate.instant('log.readElement'), url); @@ -265,7 +265,7 @@ export class SpecmateDataService { } private updateElementServer(element: IContainer): Promise { - if (!this.auth.isAuthenticated) { + if (!this.auth.isAuthenticatedForUrl(element.url)) { return Promise.resolve(); } this.logStart(this.translate.instant('log.update'), element.url); @@ -276,7 +276,7 @@ export class SpecmateDataService { } private deleteElementServer(url: string): Promise { - if (!this.auth.isAuthenticated) { + if (!this.auth.isAuthenticatedForUrl(url)) { return Promise.resolve(); } this.logStart(this.translate.instant('log.delete'), url); @@ -287,7 +287,7 @@ export class SpecmateDataService { } public performOperations(url: string, operation: string, payload?: any): Promise { - if (!this.auth.isAuthenticated) { + if (!this.auth.isAuthenticatedForUrl(url)) { return Promise.resolve(); } this.busy = true; @@ -302,7 +302,7 @@ export class SpecmateDataService { } public performQuery(url: string, operation: string, parameters: { [key: string]: string; }): Promise { - if (!this.auth.isAuthenticated) { + if (!this.auth.isAuthenticatedForUrl(url)) { return Promise.resolve(); } this.busy = true; @@ -344,6 +344,7 @@ export class SpecmateDataService { } private handleError(message: string, url: string, error: any): Promise { + console.error(message); this.connectionService.handleErrorResponse(error, url); return Promise.resolve(undefined); } diff --git a/web/src/app/modules/forms/modules/generic-form/components/form-checkbox-input.component.html b/web/src/app/modules/forms/modules/generic-form/components/form-checkbox-input.component.html index 06f2a690c..57f9269ba 100644 --- a/web/src/app/modules/forms/modules/generic-form/components/form-checkbox-input.component.html +++ b/web/src/app/modules/forms/modules/generic-form/components/form-checkbox-input.component.html @@ -4,7 +4,7 @@ {{meta.shortDesc}}:
\ No newline at end of file diff --git a/web/src/app/modules/forms/modules/generic-form/components/form-long-text-input.component.html b/web/src/app/modules/forms/modules/generic-form/components/form-long-text-input.component.html index 8b499b5af..5181e17d6 100644 --- a/web/src/app/modules/forms/modules/generic-form/components/form-long-text-input.component.html +++ b/web/src/app/modules/forms/modules/generic-form/components/form-long-text-input.component.html @@ -2,7 +2,7 @@
\ No newline at end of file diff --git a/web/src/app/modules/forms/modules/generic-form/components/form-single-selection-input.component.html b/web/src/app/modules/forms/modules/generic-form/components/form-single-selection-input.component.html index 76368a0a3..92f256322 100644 --- a/web/src/app/modules/forms/modules/generic-form/components/form-single-selection-input.component.html +++ b/web/src/app/modules/forms/modules/generic-form/components/form-single-selection-input.component.html @@ -4,7 +4,7 @@ \ No newline at end of file diff --git a/web/src/app/modules/forms/modules/generic-form/components/form-text-input.component.html b/web/src/app/modules/forms/modules/generic-form/components/form-text-input.component.html index d726031d3..8133d03e9 100644 --- a/web/src/app/modules/forms/modules/generic-form/components/form-text-input.component.html +++ b/web/src/app/modules/forms/modules/generic-form/components/form-text-input.component.html @@ -4,7 +4,7 @@ /> \ No newline at end of file diff --git a/web/src/app/modules/navigation/modules/navigation-bar/components/navigation-bar.component.html b/web/src/app/modules/navigation/modules/navigation-bar/components/navigation-bar.component.html index c4ad58571..adf8dfd6c 100644 --- a/web/src/app/modules/navigation/modules/navigation-bar/components/navigation-bar.component.html +++ b/web/src/app/modules/navigation/modules/navigation-bar/components/navigation-bar.component.html @@ -8,7 +8,7 @@ {{'version' | translate}}: @@version    -   +   \ No newline at end of file diff --git a/web/src/app/modules/navigation/modules/navigator/directives/navigation-target.directive.ts b/web/src/app/modules/navigation/modules/navigator/directives/navigation-target.directive.ts index 287fdd2fa..e3699ba63 100644 --- a/web/src/app/modules/navigation/modules/navigator/directives/navigation-target.directive.ts +++ b/web/src/app/modules/navigation/modules/navigator/directives/navigation-target.directive.ts @@ -2,6 +2,7 @@ import { Directive, OnInit, Input, HostListener, ElementRef } from '@angular/cor import { IContainer } from '../../../../../model/IContainer'; import { NavigatorService } from '../services/navigator.service'; import { TranslateService } from '@ngx-translate/core'; +import { Key } from '../../../../../util/keycode'; @Directive({ selector: '[navigationTarget]' }) export class NavigationTargetDirective implements OnInit { diff --git a/web/src/app/modules/navigation/modules/navigator/services/navigator.service.ts b/web/src/app/modules/navigation/modules/navigator/services/navigator.service.ts index 729697327..23f9cabf0 100644 --- a/web/src/app/modules/navigation/modules/navigator/services/navigator.service.ts +++ b/web/src/app/modules/navigation/modules/navigator/services/navigator.service.ts @@ -3,7 +3,7 @@ import { Injectable, EventEmitter } from '@angular/core'; import { IContainer } from '../../../../../model/IContainer'; import { SpecmateDataService } from '../../../../data/modules/data-service/services/specmate-data.service'; import { LoggingService } from '../../../../views/side/modules/log-list/services/logging.service'; -import { Router, NavigationEnd } from '@angular/router'; +import { Router, NavigationEnd, NavigationCancel, ActivatedRoute } from '@angular/router'; import { Url } from '../../../../../util/url'; import { Location } from '@angular/common'; import { TranslateService } from '@ngx-translate/core'; @@ -17,8 +17,12 @@ export class NavigatorService { private current: number; private _hasNavigated: EventEmitter; private _currentContents: IContainer[]; + private redirect: string; private get currentElementUrl(): string { + if (this.redirect !== undefined) { + return Url.stripBasePath(this.redirect); + } return Url.stripBasePath(this.location.path()); } @@ -27,6 +31,7 @@ export class NavigatorService { private auth: AuthenticationService, private logger: LoggingService, private router: Router, + private route: ActivatedRoute, private location: Location, private translate: TranslateService) { @@ -35,34 +40,37 @@ export class NavigatorService { this.auth.authChanged.subscribe(() => { if (!this.auth.isAuthenticated) { this.initHistory(); + this.router.navigate([Config.LOGIN_URL], Url.getNavigationExtrasRedirect(this.location.path())); } }); + this.route.queryParams.subscribe(params => { + this.redirect = params.r; + }); + this.location.subscribe(pse => { this.handleBrowserBackForwardButton(Url.stripBasePath(pse.url)); }); - this.router.events.subscribe((event) => { + this.router.events.subscribe(async event => { if (event instanceof NavigationEnd && this.location && this.location.path()) { let currentUrl: string = this.currentElementUrl; - if (currentUrl === undefined || Config.LOGIN_URL.endsWith(currentUrl)) { + if (currentUrl === undefined || Config.LOGIN_URL.endsWith(currentUrl) || Config.WELCOME_URL.endsWith(currentUrl)) { return Promise.resolve(); } - this.auth.redirect = Url.parts(this.location.path()); - this.dataService.readElement(currentUrl, true) - .then((element: IContainer) => { - if (element) { - if (!this.hasHistory) { - this.current = 0; - this.history[this.current] = element; - } - return Promise.resolve(); - } + const element = await this.dataService.readElement(currentUrl, true); + if (element) { + if (!this.hasHistory) { + this.current = 0; + this.history[this.current] = element; + } + } else { + if (this.auth.isAuthenticated) { return Promise.reject(this.translate.instant('couldNotLoadElement') + ': ' + currentUrl); - }) - .then(() => this.dataService.readContents(currentUrl, true)) - .then((contents: IContainer[]) => this._currentContents = contents) - .then(() => this.hasNavigated.emit(this.currentElement)); + } + } + this._currentContents = await this.dataService.readContents(currentUrl, true); + this.hasNavigated.emit(this.currentElement); } }); } @@ -74,20 +82,27 @@ export class NavigatorService { return this._hasNavigated; } + private navigateToWelcome(): void { + this.router.navigate([Config.WELCOME_URL]); + } + + private async navigateDefault(): Promise { + const url = this.currentElementUrl; + if (url === undefined || url === null || url === '') { + this.navigateToWelcome(); + } else if (this.auth.isAuthenticatedForUrl(url)) { + const element = await this.dataService.readElement(url); + this.navigate(element); + } else if (this.auth.isAuthenticated) { + this.navigateToWelcome(); + } else { + this.auth.deauthenticate(); + } + } + public async navigate(target: IContainer | 'default'): Promise { if (target === 'default') { - if (this.auth.isAuthenticated) { - const url = this.currentElementUrl; - console.log(url); - if (url === undefined || url === '') { - this.router.navigate([Url.SEP]); - } else { - const element = await this.dataService.readElement(url); - this.navigate(element); - } - } else { - this.router.navigate([Config.LOGIN_URL]); - } + await this.navigateDefault(); return; } const element = target as IContainer; diff --git a/web/src/app/modules/navigation/modules/project-explorer/components/element-tree.component.css b/web/src/app/modules/navigation/modules/project-explorer/components/element-tree.component.css index 5303c207f..4c9062e1a 100644 --- a/web/src/app/modules/navigation/modules/project-explorer/components/element-tree.component.css +++ b/web/src/app/modules/navigation/modules/project-explorer/components/element-tree.component.css @@ -25,4 +25,19 @@ ul { margin-top: -10px; height: 0; padding-bottom: 10px; +} + +button { + border: 0px solid rgba(0, 0, 0, 0); + background-color: rgba(0, 0, 0, 0); + margin-left: -10px; +} + +button.expand:focus { + padding: 2px 6px 2px 6px; +} + +.treeLink { + padding: 5px; + margin-left: -10px; } \ No newline at end of file diff --git a/web/src/app/modules/navigation/modules/project-explorer/components/element-tree.component.html b/web/src/app/modules/navigation/modules/project-explorer/components/element-tree.component.html index 2684e5131..d0203b6e3 100644 --- a/web/src/app/modules/navigation/modules/project-explorer/components/element-tree.component.html +++ b/web/src/app/modules/navigation/modules/project-explorer/components/element-tree.component.html @@ -1,25 +1,24 @@
  • - - - - - - - {{element.name}} - - - + + +  {{element['extId'] ? element['extId'] + ': ' : ''}}{{element.name}} -
      - -
    • - + +
    • +
  • \ No newline at end of file diff --git a/web/src/app/modules/navigation/modules/project-explorer/components/element-tree.component.ts b/web/src/app/modules/navigation/modules/project-explorer/components/element-tree.component.ts index f4ca0168b..27b08c070 100644 --- a/web/src/app/modules/navigation/modules/project-explorer/components/element-tree.component.ts +++ b/web/src/app/modules/navigation/modules/project-explorer/components/element-tree.component.ts @@ -1,4 +1,4 @@ -import { Component, OnInit, Input, HostListener, ViewChild, ElementRef } from '@angular/core'; +import { Component, OnInit, Input, HostListener, ViewChild, ElementRef, Inject } from '@angular/core'; import { SpecmateDataService } from '../../../../data/modules/data-service/services/specmate-data.service'; import { NavigatorService } from '../../navigator/services/navigator.service'; import { LoggingService } from '../../../../views/side/modules/log-list/services/logging.service'; @@ -11,7 +11,9 @@ import { Folder } from '../../../../../model/Folder'; import { TestSpecification } from '../../../../../model/TestSpecification'; import { Process } from '../../../../../model/Process'; import { TestProcedure } from '../../../../../model/TestProcedure'; -import { TreeNavigatorService } from '../services/tree-navigator.service'; +import { DOCUMENT } from '@angular/platform-browser'; +import * as $ from 'jquery'; +import { Key } from '../../../../../util/keycode'; @Component({ moduleId: module.id.toString(), @@ -99,13 +101,7 @@ export class ElementTree implements OnInit { return false; } - constructor(private dataService: SpecmateDataService, private navigator: NavigatorService, - private logger: LoggingService, private treeNav: TreeNavigatorService) {} - - @ViewChild('treeElement') - public set treeElement(element: ElementRef) { - this.treeNav.announceTreeElement(this, element); - } + constructor(private dataService: SpecmateDataService, private navigator: NavigatorService) { } async ngOnInit() { const siblings = await this.dataService.readContents(Url.parent(this.baseUrl)); @@ -114,16 +110,27 @@ export class ElementTree implements OnInit { if (this.expanded || this.isMustOpen) { this.initContents(); } - this.treeNav.announceTreeNode(this); } public toggle(): void { - this.expanded = !this._expanded; + if (this.expanded) { + this.contract(); + } else { + this.expand(); + } + } + + private expand(): void { + this.expanded = true; if (this.expanded && !this._contents) { this.initContents(); } } + private contract(): void { + this.expanded = false; + } + private initContents(): void { this.dataService.readContents(this.baseUrl).then((contents: IContainer[]) => { this._contents = contents; @@ -174,12 +181,59 @@ export class ElementTree implements OnInit { this.numChildrenDisplayed += ElementTree.ELEMENT_CHUNK_SIZE; } - // Arrow Key Navigation - public get isSelected(): boolean { - return this.treeNav.isSelected(this.baseUrl); + public handleKey(event: KeyboardEvent, shouldToggle?: boolean): void { + + if ([Key.SPACEBAR, Key.ARROW_RIGHT, Key.ARROW_LEFT, Key.ARROW_DOWN, Key.ARROW_UP].indexOf(event.keyCode) >= 0) { + event.preventDefault(); + event.stopPropagation(); + } + + switch (event.keyCode) { + case Key.SPACEBAR: + this.toggle(); + break; + + case Key.ARROW_RIGHT: + if (shouldToggle) { + this.expand(); + } else { + this.move(1, event.srcElement); + } + break; + + case Key.ARROW_LEFT: + if (shouldToggle) { + this.contract(); + } else { + this.move(-1, event.srcElement); + } + break; + + case Key.ARROW_UP: + this.move(-1, event.srcElement); + break; + + case Key.ARROW_DOWN: + this.move(1, event.srcElement); + break; + } } - public setSelection(): void { - this.treeNav.setSelection(this.baseUrl); + private move(off: number, elem: Element): void { + const canFocus = $(':focusable'); + const currentIndex = canFocus.index(elem); + let index = currentIndex + off; + if (index >= canFocus.length) { + index = 0; + } + const targetElem = canFocus.eq(index); + targetElem.focus(); } } + +// register jQuery extension +$.extend($['expr'][':'], { + focusable: function (el: any, index: any, selector: any) { + return $(el).is('a, button, :input, [tabindex]'); + } +}); diff --git a/web/src/app/modules/navigation/modules/project-explorer/components/project-explorer.component.html b/web/src/app/modules/navigation/modules/project-explorer/components/project-explorer.component.html index 727a04a2c..d9bf05229 100644 --- a/web/src/app/modules/navigation/modules/project-explorer/components/project-explorer.component.html +++ b/web/src/app/modules/navigation/modules/project-explorer/components/project-explorer.component.html @@ -18,7 +18,7 @@ - + {{element['extId'] ? element['extId'] + ': ' : ''}}{{element.name}} diff --git a/web/src/app/modules/navigation/modules/project-explorer/components/project-explorer.component.ts b/web/src/app/modules/navigation/modules/project-explorer/components/project-explorer.component.ts index c7292ad59..64b8e80de 100644 --- a/web/src/app/modules/navigation/modules/project-explorer/components/project-explorer.component.ts +++ b/web/src/app/modules/navigation/modules/project-explorer/components/project-explorer.component.ts @@ -9,10 +9,6 @@ import { SpecmateDataService } from '../../../../data/modules/data-service/servi import { NavigatorService } from '../../navigator/services/navigator.service'; import { AuthenticationService } from '../../../../views/main/authentication/modules/auth/services/authentication.service'; import { Search } from '../../../../../util/search'; -import { Url } from '../../../../../util/url'; -import { TreeNavigatorService } from '../services/tree-navigator.service'; -import { Key } from '../../../../../util/keycode'; -import { FocusService } from '../../../services/focus.service'; @Component({ @@ -33,19 +29,13 @@ export class ProjectExplorer implements OnInit { } constructor(private dataService: SpecmateDataService, private navigator: NavigatorService, - private auth: AuthenticationService, private treeNav: TreeNavigatorService, - private focus: FocusService) { } + private auth: AuthenticationService) { } ngOnInit() { this.initialize(); this.auth.authChanged.subscribe(() => { this.initialize(); }); - this.focus.demandFocus(this); - } - - ngOnDestroy() { - this.focus.returnFocus(this); } protected search(query: string): void { @@ -53,8 +43,6 @@ export class ProjectExplorer implements OnInit { } private async initialize(): Promise { - this.treeNav.clean(); - if (!this.auth.isAuthenticated) { this.clean(); return; @@ -62,7 +50,6 @@ export class ProjectExplorer implements OnInit { const project: IContainer = await this.dataService.readElement(this.auth.token.project); this.rootElements = [project]; - this.treeNav.roots = this.rootElements.map( x => x.url); let filter = {'-type': 'Folder'}; @@ -78,12 +65,9 @@ export class ProjectExplorer implements OnInit { query = Search.processSearchQuery(query); this.dataService.search(query, filter).then(results => { this.searchResults = results; - this.searchIndex = 0; - this.treeNav.endNavigation(); }); } else { this.searchResults = []; - this.treeNav.startNavigation(); } } ); @@ -98,69 +82,4 @@ export class ProjectExplorer implements OnInit { public get projectName(): string { return this.auth.token.project; } - - public searchIndex = 0; - - @HostListener('window:keydown', ['$event']) - keyEvent(event: KeyboardEvent) { - if (!this.focus.isFocused(this)) { - return; - } - - const interceptedKeys = [Key.ARROW_UP, Key.ARROW_DOWN, Key.ARROW_LEFT, Key.ARROW_RIGTH, Key.SPACEBAR, Key.ENTER]; - if (interceptedKeys.indexOf(event.keyCode) >= 0) { - event.preventDefault(); - event.stopPropagation(); - } - - let hasSearchresults = (this.searchResults ? (this.searchResults.length > 0) : false); - - if (hasSearchresults) { - switch (event.keyCode) { - case Key.ARROW_UP: - if (this.searchIndex > 0) { - this.searchIndex--; - } - break; - - case Key.ARROW_DOWN: - if (this.searchIndex < this.searchResults.length - 1) { - this.searchIndex++; - } - break; - - case Key.SPACEBAR: // Falls through - case Key.ENTER: - this.navigator.navigate(this.searchResults[this.searchIndex]); - break; - } - - return; - } - - switch (event.keyCode) { - case Key.ARROW_UP: - this.treeNav.navigateUp(); - break; - - case Key.ARROW_DOWN: - this.treeNav.navigateDown(); - break; - - case Key.ARROW_LEFT: - this.treeNav.navigateLeft(); - break; - - case Key.ARROW_RIGTH: - this.treeNav.navigateRight(); - break; - - case Key.SPACEBAR: // Falls through - case Key.ENTER: - this.treeNav.selectElement(); - break; - } - - this.treeNav.scrollToSelection(); - } } diff --git a/web/src/app/modules/navigation/modules/project-explorer/project-explorer.module.ts b/web/src/app/modules/navigation/modules/project-explorer/project-explorer.module.ts index 96355a736..d458634cf 100644 --- a/web/src/app/modules/navigation/modules/project-explorer/project-explorer.module.ts +++ b/web/src/app/modules/navigation/modules/project-explorer/project-explorer.module.ts @@ -4,8 +4,6 @@ import { BrowserModule } from '@angular/platform-browser'; import { ElementTree } from './components/element-tree.component'; import { NavigatorModule } from '../navigator/navigator.module'; import { IconsModule } from '../../../common/modules/icons/icons.module'; -import { TreeNavigatorService } from './services/tree-navigator.service'; -import { FocusService } from '../../services/focus.service'; import { TranslateModule } from '@ngx-translate/core'; @@ -28,8 +26,6 @@ import { TranslateModule } from '@ngx-translate/core'; ], providers: [ // SERVICES - TreeNavigatorService, - FocusService ], bootstrap: [ // COMPONENTS THAT ARE BOOTSTRAPPED HERE diff --git a/web/src/app/modules/navigation/modules/project-explorer/services/tree-navigator.service.ts b/web/src/app/modules/navigation/modules/project-explorer/services/tree-navigator.service.ts deleted file mode 100644 index de79455c6..000000000 --- a/web/src/app/modules/navigation/modules/project-explorer/services/tree-navigator.service.ts +++ /dev/null @@ -1,211 +0,0 @@ -import { Injectable, ElementRef } from '@angular/core'; -import { ElementTree } from '../components/element-tree.component'; -import { NavigatorService } from '../../navigator/services/navigator.service'; -import { runInThisContext } from 'vm'; - -@Injectable() -export class TreeNavigatorService { - constructor(private nav: NavigatorService) {} - - public set roots(rootlist: string[]) { - if (rootlist && rootlist.length > 0) { - this._roots = rootlist; - this.startNavigation(); - } - } - - private _roots: string[]; - private _trace: string[]; - private _treeNodes: {[url: string]: ElementTree} = {}; - private _treeElements: {[url: string]: ElementRef} = {}; - - public clean(): void { - this._roots = []; - this.endNavigation(); - this._treeNodes = {}; - this._treeElements = {}; - } - - public startNavigation(): void { - this._trace = [this._roots[0]]; - } - - public endNavigation(): void { - this._trace = []; - } - - public announceTreeNode(node: ElementTree): void { - this._treeNodes[node.baseUrl] = node; - } - - public announceTreeElement(node: ElementTree, element: ElementRef) { - this._treeElements[node.baseUrl] = element; - } - - private get selected(): string { - return this._trace[this._trace.length - 1]; - } - - public scrollToSelection(): void { - this._treeElements[this.selected].nativeElement.scrollIntoView(); - } - - public setSelection(url: string): void { - this._trace = []; - let comp = url.split('/'); - for (let i = 0; i < comp.length; i++) { - let build = ''; - for (let j = 0; j <= i; j++) { - if (j != 0) { - build += '/'; - } - build += comp[j]; - } - this._trace.push(build); - } - } - - public isSelected(nodeUrl: string): boolean { - if (this._trace.length > 0) { - return this.selected == nodeUrl; - } - return false; - } - - private getNext(onlyMoveUp = false): string { - let currentNode = this._treeNodes[this.selected]; - // Move up the tree - if (currentNode.expanded - && currentNode.contents.length > 0 - && this._treeNodes[currentNode.contents[0].url].showElement) { - let childCandidateURL = currentNode.contents[0].url; - let childCandidate = this._treeNodes[childCandidateURL]; - if (childCandidate.showElement) { - return childCandidateURL; - } - } - - if (onlyMoveUp) { - return ''; - } - - // Move on the same level / Down the tree - for (let level = this._trace.length - 1; level >= 0; level--) { - let cIndex = -1; - let pList = []; - - let levelElement = this._trace[level]; - - if (level == 0) { - // Root - cIndex = this._roots.indexOf(levelElement); - pList = this._roots; - } else { - // Above Root - let parentUrl = this._trace[level - 1]; - let parent = this._treeNodes[parentUrl]; - pList = parent.contents.map(x => x.url); - cIndex = pList.indexOf(levelElement); - } - if (cIndex < pList.length - 1 && cIndex >= 0) { - return pList[cIndex + 1]; - } - } - // No next element - return ''; - } - - private getPrev(): string { - // Move on the same level / Down the tree - for (let level = this._trace.length; level >= 0; level--) { - let cIndex = -1; - let pList = []; - - let levelElement = this._trace[level]; - - if (level == 0) { - // Root - cIndex = this._roots.indexOf(levelElement); - pList = this._roots; - } else { - // Above Root - let parentUrl = this._trace[level - 1]; - let parent = this._treeNodes[parentUrl]; - pList = parent.contents.map(x => x.url); - cIndex = pList.indexOf(levelElement); - } - if (cIndex > 0) { - let currentUrl = pList[cIndex - 1]; - let currentNode = this._treeNodes[currentUrl]; - // We found the previous sibling node - // Go down the tree until we hit a leaf node - while (currentNode.expanded - && currentNode.contents.length > 0 - && this._treeNodes[currentNode.contents[0].url].showElement) { - let childCount = currentNode.contents.length; - currentUrl = currentNode.contents[childCount - 1].url; - currentNode = this._treeNodes[currentUrl]; - } - return currentUrl; - } else if (cIndex == 0 && level > 0) { - return this._trace[level - 1]; - } - } - // No prev element - return ''; - } - - public navigateLeft(): void { - if (this._trace.length === 0) { - return; - } - - let endNode = this._treeNodes[this.selected]; - if (endNode && endNode.expanded && !endNode.isMustOpen) { - endNode.toggle(); - } else if (this._trace.length > 1) { - this._trace.pop(); - } - } - - public navigateRight(): void { - if (this._trace.length <= 0) { - return; - } - - let endNode = this._treeNodes[this.selected]; - if (endNode) { - if (!endNode.expanded) { - endNode.toggle(); - } else { - let next = this.getNext(true); - if (next) { - this.setSelection(next); - } - } - } - } - - public navigateUp(): void { - let prev = this.getPrev(); - if (prev) { - this.setSelection(prev); - } - } - - public navigateDown(stayInLayer = false): void { - let next = this.getNext(); - if (next) { - this.setSelection(next); - } - } - - public selectElement(): void { - let node = this._treeNodes[this.selected]; - if (! node.isFolderNode) { - this.nav.navigate(node.element); - } else { - this.navigateRight(); - } - } -} diff --git a/web/src/app/modules/navigation/services/focus.service.ts b/web/src/app/modules/navigation/services/focus.service.ts deleted file mode 100644 index 70da835ff..000000000 --- a/web/src/app/modules/navigation/services/focus.service.ts +++ /dev/null @@ -1,30 +0,0 @@ -import { Injectable } from '@angular/core'; - -@Injectable() -export class FocusService { - private _focusList: any[]; - - constructor() { - this._focusList = []; - } - - demandFocus(component: any): void { - this.returnFocus(component); - this._focusList.push(component); - } - - returnFocus(component: any): void { - // Remove component from focus - let ind = this._focusList.indexOf(component); - if (ind >= 0) { - this._focusList.splice(ind, 1); - } - } - - public isFocused(component: any): boolean { - if (this._focusList.length > 0) { - return this._focusList[this._focusList.length - 1] === component; - } - return false; - } -} diff --git a/web/src/app/modules/notification/modules/modals/components/typed-modal-content.component.ts b/web/src/app/modules/notification/modules/modals/components/typed-modal-content.component.ts index e1e3afcfc..00b9d5029 100644 --- a/web/src/app/modules/notification/modules/modals/components/typed-modal-content.component.ts +++ b/web/src/app/modules/notification/modules/modals/components/typed-modal-content.component.ts @@ -15,7 +15,7 @@ import { ModalBase } from '../base/modal-base'; export class TypedModalContent extends ModalBase { @Input() - private _options: Dialogtype; + public _options: Dialogtype; public set options(newOptions: Dialogtype) { this._options = newOptions; diff --git a/web/src/app/modules/notification/modules/modals/modal-dialog-type.ts b/web/src/app/modules/notification/modules/modals/modal-dialog-type.ts index 628f61228..3fe437f81 100644 --- a/web/src/app/modules/notification/modules/modals/modal-dialog-type.ts +++ b/web/src/app/modules/notification/modules/modals/modal-dialog-type.ts @@ -35,7 +35,7 @@ export class Dialogtype { } public static okDialog(title: string, message: string) { - return new Dialogtype(title, message, 'ok', ''); + return new Dialogtype(title, message, '', 'ok'); } public static okCancelDialog(title: string, message: string) { diff --git a/web/src/app/modules/notification/modules/modals/services/confirmation-modal.service.ts b/web/src/app/modules/notification/modules/modals/services/confirmation-modal.service.ts index d4401fcc1..aa7609c75 100644 --- a/web/src/app/modules/notification/modules/modals/services/confirmation-modal.service.ts +++ b/web/src/app/modules/notification/modules/modals/services/confirmation-modal.service.ts @@ -15,6 +15,12 @@ export class ConfirmationModal { return modalRef.result; } + public openOk(title: string, message: string): Promise { + const modalRef = this.modalService.open(TypedModalContent); + modalRef.componentInstance.options = Dialogtype.okDialog(title, message); + return modalRef.result; + } + public confirmSave(message?: string): Promise { if (this.dataService.hasCommits) { return this.open(message || this.translate.instant('confirmSave')); diff --git a/web/src/app/modules/specmate/components/specmate.component.html b/web/src/app/modules/specmate/components/specmate.component.html index 3e88f1ed8..6625f681a 100644 --- a/web/src/app/modules/specmate/components/specmate.component.html +++ b/web/src/app/modules/specmate/components/specmate.component.html @@ -4,7 +4,7 @@ - + diff --git a/web/src/app/modules/specmate/components/specmate.component.ts b/web/src/app/modules/specmate/components/specmate.component.ts index 4aa22f136..e17d2892a 100644 --- a/web/src/app/modules/specmate/components/specmate.component.ts +++ b/web/src/app/modules/specmate/components/specmate.component.ts @@ -1,7 +1,6 @@ import { Component } from '@angular/core'; import { ViewControllerService } from '../../views/controller/modules/view-controller/services/view-controller.service'; import { ErrorNotificationModalService } from '../../notification/modules/modals/services/error-notification-modal.service'; -import { TranslateService } from '@ngx-translate/core'; import { AuthenticationService } from '../../views/main/authentication/modules/auth/services/authentication.service'; /** @@ -80,6 +79,5 @@ export class SpecmateComponent { } constructor(private viewController: ViewControllerService, - private errorNotificationService: ErrorNotificationModalService, private auth: AuthenticationService) { } } diff --git a/web/src/app/modules/specmate/routing/specmate-routing.module.ts b/web/src/app/modules/specmate/routing/specmate-routing.module.ts index 0fdf7fbfe..98971ec63 100644 --- a/web/src/app/modules/specmate/routing/specmate-routing.module.ts +++ b/web/src/app/modules/specmate/routing/specmate-routing.module.ts @@ -56,6 +56,7 @@ const routes: Routes = [ canActivate: [UserPermissionsGuard] }, { path: Config.LOGIN_URL, component: Login }, + { path: Config.WELCOME_URL, component: Welcome, canActivate: [UserPermissionsGuard] }, { path: '', component: Welcome, canActivate: [UserPermissionsGuard] }, { path: '**', component: PageNotFound, canActivate: [UserPermissionsGuard] } ]; diff --git a/web/src/app/modules/views/main/authentication/modules/auth/guards/user-permissions-guard.ts b/web/src/app/modules/views/main/authentication/modules/auth/guards/user-permissions-guard.ts index f6a2a1011..005f89bb9 100644 --- a/web/src/app/modules/views/main/authentication/modules/auth/guards/user-permissions-guard.ts +++ b/web/src/app/modules/views/main/authentication/modules/auth/guards/user-permissions-guard.ts @@ -1,8 +1,10 @@ -import { CanActivate, ActivatedRouteSnapshot, RouterStateSnapshot, Router, UrlSegment } from '@angular/router'; +import { CanActivate, ActivatedRouteSnapshot, RouterStateSnapshot, Router, NavigationExtras } from '@angular/router'; +import { Location } from '@angular/common'; import { Observable } from 'rxjs/Observable'; import { AuthenticationService } from '../../auth/services/authentication.service'; import { Injectable } from '@angular/core'; import { Config } from '../../../../../../../config/config'; +import { Url } from '../../../../../../../util/url'; @Injectable() export class UserPermissionsGuard implements CanActivate { @@ -10,9 +12,10 @@ export class UserPermissionsGuard implements CanActivate { constructor(private auth: AuthenticationService, private router: Router) { } canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): boolean | Observable | Promise { - if (!this.auth.isAuthenticated) { - this.auth.redirect = route.url.map((urlSegment: UrlSegment) => urlSegment.path); - this.router.navigate([Config.LOGIN_URL], { skipLocationChange: true }); + const url = route.url.map(segment => segment.path).join(Url.SEP); + const isAuthenticated = this.auth.isAuthenticatedForUrl(url); + if (!isAuthenticated) { + this.router.navigate([Config.LOGIN_URL], Url.getNavigationExtrasRedirect(state.url)); } return this.auth.isAuthenticated; } diff --git a/web/src/app/modules/views/main/authentication/modules/auth/services/authentication.service.ts b/web/src/app/modules/views/main/authentication/modules/auth/services/authentication.service.ts index a67b49697..5a2f0a0a4 100644 --- a/web/src/app/modules/views/main/authentication/modules/auth/services/authentication.service.ts +++ b/web/src/app/modules/views/main/authentication/modules/auth/services/authentication.service.ts @@ -36,14 +36,6 @@ export class AuthenticationService { private serviceInterface: ServiceInterface; - private _redirect: string[]; - public get redirect(): string[] { - return this._redirect; - } - public set redirect(redirect: string[]) { - this._redirect = redirect; - } - private _authChanged: EventEmitter; private _authFailed: boolean; @@ -72,11 +64,7 @@ export class AuthenticationService { private cachedToken: UserToken; - constructor(http: HttpClient, - private router: Router, - private logger: LoggingService, - private translate: TranslateService, - private cookie: CookieService) { + constructor(http: HttpClient, private cookie: CookieService) { this.serviceInterface = new ServiceInterface(http); } @@ -93,9 +81,6 @@ export class AuthenticationService { const wasAuthenticated: boolean = this.isAuthenticated; this.token = await this.serviceInterface.authenticate(user); if (this.isAuthenticated) { - if (!Url.isParent(this.token.project, Url.build(this.redirect))) { - this.redirect = undefined; - } if (wasAuthenticated !== this.isAuthenticated) { this.authChanged.emit(true); } @@ -113,6 +98,23 @@ export class AuthenticationService { return !UserToken.isInvalid(this.token); } + public isAuthenticatedForUrl(url: string): boolean { + if (!this.isAuthenticated) { + return false; + } + if (url === undefined) { + return false; + } + if (url === '' || (Url.SEP + Config.WELCOME_URL).endsWith(url)) { + return true; + } + return this.isAuthenticatedForProject(Url.project(url)); + } + + public isAuthenticatedForProject(project: string): boolean { + return this.token.project === project; + } + private clearToken(): void { this.token = UserToken.INVALID; this.cookie.remove(AuthenticationService.TOKEN_COOKIE_KEY); @@ -125,20 +127,7 @@ export class AuthenticationService { } public async deauthenticate(omitServer?: boolean): Promise { - try { - const subscription = this.router.events.subscribe(async event => { - if (event instanceof GuardsCheckEnd) { - if (event.shouldActivate) { - await this.doDeauth(omitServer); - subscription.unsubscribe(); - } - } - }); - await this.router.navigate([Config.LOGIN_URL], { skipLocationChange: true }); - - } catch (e) { - this.logger.error(this.translate.instant('logoutFailed')); - } + await this.doDeauth(omitServer); } private async doDeauth(omitServer?: boolean): Promise { @@ -170,11 +159,4 @@ export class AuthenticationService { public async getProjectNames(): Promise { return await this.serviceInterface.projectnames(); } - - private get redirectUrlSegments(): string[] { - if (!this.redirect || this.redirect.length === 0) { - return [Url.SEP]; - } - return this.redirect; - } } diff --git a/web/src/app/modules/views/main/authentication/modules/logout/components/logout.component.html b/web/src/app/modules/views/main/authentication/modules/logout/components/logout.component.html index e47c65968..eff4e22d5 100644 --- a/web/src/app/modules/views/main/authentication/modules/logout/components/logout.component.html +++ b/web/src/app/modules/views/main/authentication/modules/logout/components/logout.component.html @@ -1,3 +1,3 @@ - \ No newline at end of file diff --git a/web/src/app/modules/views/main/authentication/modules/logout/components/logout.component.ts b/web/src/app/modules/views/main/authentication/modules/logout/components/logout.component.ts index 1d0731106..4739ac27f 100644 --- a/web/src/app/modules/views/main/authentication/modules/logout/components/logout.component.ts +++ b/web/src/app/modules/views/main/authentication/modules/logout/components/logout.component.ts @@ -1,5 +1,8 @@ import { Component } from '@angular/core'; import { AuthenticationService } from '../../auth/services/authentication.service'; +import { SpecmateDataService } from '../../../../../../data/modules/data-service/services/specmate-data.service'; +import { TranslateService } from '@ngx-translate/core'; +import { ConfirmationModal } from '../../../../../../notification/modules/modals/services/confirmation-modal.service'; @Component({ moduleId: module.id.toString(), @@ -8,9 +11,20 @@ import { AuthenticationService } from '../../auth/services/authentication.servic styleUrls: ['logout.component.css'] }) export class Logout { - constructor(private auth: AuthenticationService) { } + constructor(private auth: AuthenticationService, + private dataService: SpecmateDataService, + private translate: TranslateService, + private modal: ConfirmationModal) { } - public logout(): void { - this.auth.deauthenticate(); + public async logout(): Promise { + + if (this.dataService.hasCommits) { + try { + await this.modal.open(this.translate.instant('discardUnsavedChangesConfirmation')); + this.auth.deauthenticate(); + } catch (e) { } + } else { + this.auth.deauthenticate(); + } } } diff --git a/web/src/app/modules/views/main/editors/modules/graphical-editor/components/graphical-editor.component.css b/web/src/app/modules/views/main/editors/modules/graphical-editor/components/graphical-editor.component.css index d9fef5e8f..d897d4b85 100644 --- a/web/src/app/modules/views/main/editors/modules/graphical-editor/components/graphical-editor.component.css +++ b/web/src/app/modules/views/main/editors/modules/graphical-editor/components/graphical-editor.component.css @@ -24,4 +24,8 @@ .zoom-indicator { width: 60px; +} + +button { + margin-right: 0.2rem; } \ No newline at end of file diff --git a/web/src/app/modules/views/main/editors/modules/graphical-editor/components/graphical-editor.component.html b/web/src/app/modules/views/main/editors/modules/graphical-editor/components/graphical-editor.component.html index d48d75b74..1bfcaae2e 100644 --- a/web/src/app/modules/views/main/editors/modules/graphical-editor/components/graphical-editor.component.html +++ b/web/src/app/modules/views/main/editors/modules/graphical-editor/components/graphical-editor.component.html @@ -2,8 +2,8 @@
    {{name}} - - + + diff --git a/web/src/app/modules/views/main/editors/modules/requirements-details/components/requirement-details.component.html b/web/src/app/modules/views/main/editors/modules/requirements-details/components/requirement-details.component.html index 434d9510a..03d5f662e 100644 --- a/web/src/app/modules/views/main/editors/modules/requirements-details/components/requirement-details.component.html +++ b/web/src/app/modules/views/main/editors/modules/requirements-details/components/requirement-details.component.html @@ -52,9 +52,9 @@
    {{'TestandRelease' | translate}}
    {{'RelatedRequirements' | translate}}
    - + {{'noRelatedRequirements' | translate}} - +
    • @@ -65,7 +65,7 @@
      {{'RelatedRequirements' | translate}}
       {{related.name}}   - {{related.description | truncate: 60}} + {{related.description | truncate: 60}} @@ -79,9 +79,9 @@
      {{'RelatedRequirements' | translate}}
      {{'Cause-EffectModels' | translate}}
      - + {{'noModelsFound' | translate}}... - +
      • @@ -92,7 +92,7 @@
        {{'Cause-EffectModels' | translate}}
         {{model.name}}   - {{model.description | truncate: 60}} + {{model.description | truncate: 60}} @@ -115,9 +115,9 @@
        {{'Cause-EffectModels' | translate}}
        {{'ProcessModels' | translate}}
        - + {{'noProcessesFound' | translate}}... - +
        • @@ -128,7 +128,7 @@
          {{'ProcessModels' | translate}}
           {{process.name}}   - {{process.description | truncate: 60}} + {{process.description | truncate: 60}} @@ -151,9 +151,9 @@
          {{'ProcessModels' | translate}}
          {{'TestSpecifications' | translate}}
          - + {{'noTestSpecifications' | translate}} - +
          • @@ -164,7 +164,7 @@
            {{'TestSpecifications' | translate}}
             {{testSpec.name}}   - {{testSpec.description | truncate: 60}} + {{testSpec.description | truncate: 60}} diff --git a/web/src/app/modules/views/main/static/modules/welcome-page/components/welcome.component.html b/web/src/app/modules/views/main/static/modules/welcome-page/components/welcome.component.html index f16fce06c..02ed37283 100644 --- a/web/src/app/modules/views/main/static/modules/welcome-page/components/welcome.component.html +++ b/web/src/app/modules/views/main/static/modules/welcome-page/components/welcome.component.html @@ -1,3 +1,2 @@ -
            - {{ 'welcome.text' | translate }} -
            \ No newline at end of file +

            {{ 'welcome.text' | translate }}

            +

            {{ 'welcome.description' | translate }}

            diff --git a/web/src/app/modules/views/side/modules/history-view/components/extended-history-view.component.html b/web/src/app/modules/views/side/modules/history-view/components/extended-history-view.component.html index af7288307..538a48f97 100644 --- a/web/src/app/modules/views/side/modules/history-view/components/extended-history-view.component.html +++ b/web/src/app/modules/views/side/modules/history-view/components/extended-history-view.component.html @@ -5,7 +5,7 @@
            • - {{getDate(entry.timestamp) | date:'yyyy-MM-dd HH:mm:ss'}} {{entry.user}} + {{getDate(entry.timestamp) | date:'yyyy-MM-dd HH:mm:ss'}} {{entry.user}}
              • diff --git a/web/src/app/modules/views/side/modules/history-view/components/history-view.component.ts b/web/src/app/modules/views/side/modules/history-view/components/history-view.component.ts index 035c929be..3b63d2218 100644 --- a/web/src/app/modules/views/side/modules/history-view/components/history-view.component.ts +++ b/web/src/app/modules/views/side/modules/history-view/components/history-view.component.ts @@ -19,19 +19,22 @@ export class HistoryView { constructor( private navigator: NavigatorService, - private dataService: SpecmateDataService) {} + private dataService: SpecmateDataService) { } ngOnInit() { - this.navigator.hasNavigated.subscribe((elem: IContainer) => { - this.dataService.performQuery(elem.url, 'historyRecursive', {}) - .then((history: History) => { - if (history !== undefined) { - this.modelHistoryEntries = history.entries; - } else { - this.modelHistoryEntries = []; + this.navigator.hasNavigated.subscribe((elem: IContainer) => { + if (elem === undefined) { + return; } + this.dataService.performQuery(elem.url, 'historyRecursive', {}) + .then((history: History) => { + if (history !== undefined) { + this.modelHistoryEntries = history.entries; + } else { + this.modelHistoryEntries = []; + } + }); }); - }); } public getDate(timestamp: string): Date { diff --git a/web/src/app/modules/views/side/modules/history-view/components/simple-history-view.component.html b/web/src/app/modules/views/side/modules/history-view/components/simple-history-view.component.html index 4b9ad6481..77c45822f 100644 --- a/web/src/app/modules/views/side/modules/history-view/components/simple-history-view.component.html +++ b/web/src/app/modules/views/side/modules/history-view/components/simple-history-view.component.html @@ -5,7 +5,7 @@
                • - {{getDate(entry.timestamp) | date:'yyyy-MM-dd HH:mm:ss'}} {{entry.user}} + {{getDate(entry.timestamp) | date:'yyyy-MM-dd HH:mm:ss'}} {{entry.user}}
                diff --git a/web/src/app/modules/views/side/modules/links-actions/components/links-actions.component.html b/web/src/app/modules/views/side/modules/links-actions/components/links-actions.component.html index 7be56d898..bce0ce9b2 100644 --- a/web/src/app/modules/views/side/modules/links-actions/components/links-actions.component.html +++ b/web/src/app/modules/views/side/modules/links-actions/components/links-actions.component.html @@ -10,7 +10,7 @@
              • {{'TestSpecification' | translate}}: {{testSpecification.name}}
              • {{'TestSpecifications' | translate}}: - {{'noTestSpecificationsFound' | translate}}. + {{'noTestSpecificationsFound' | translate}}.
                • {{testSpec.name}} diff --git a/web/src/app/modules/views/side/modules/log-list/components/log-entry.component.html b/web/src/app/modules/views/side/modules/log-list/components/log-entry.component.html index 0be375d67..cd20ce84a 100644 --- a/web/src/app/modules/views/side/modules/log-list/components/log-entry.component.html +++ b/web/src/app/modules/views/side/modules/log-list/components/log-entry.component.html @@ -2,6 +2,6 @@

                   {{logElement.message}}

                  - {{logElement.time | date: 'medium'}} + {{logElement.time | date: 'medium'}}
          -{{logElement.url}} \ No newline at end of file +{{logElement.url}} \ No newline at end of file diff --git a/web/src/app/util/keycode.ts b/web/src/app/util/keycode.ts index e46f12329..ec861e771 100644 --- a/web/src/app/util/keycode.ts +++ b/web/src/app/util/keycode.ts @@ -1,5 +1,6 @@ export enum Key { BACKSPACE = 8, + TAB = 9, ENTER = 13, SHIFT = 16, CTRL = 17, @@ -8,6 +9,22 @@ export enum Key { SPACEBAR = 32, ARROW_LEFT = 37, ARROW_UP = 38, - ARROW_RIGTH = 39, + ARROW_RIGHT = 39, ARROW_DOWN = 40 } + + +export function simulateKeyEvent(character: string) { + const evt = document.createEvent('KeyboardEvent'); + (evt['initKeyEvent'] || evt.initKeyboardEvent)('keypress', true, true, window, + 0, 0, 0, 0, + 0, character.charCodeAt(0)); + let canceled = !document.body.dispatchEvent(evt); + if (canceled) { + // A handler called preventDefault + alert('canceled'); + } else { + // None of the handlers called preventDefault + alert('not canceled'); + } + } diff --git a/web/src/app/util/url.ts b/web/src/app/util/url.ts index 81e0c46ec..291bbc67d 100644 --- a/web/src/app/util/url.ts +++ b/web/src/app/util/url.ts @@ -1,6 +1,6 @@ import { Config } from '../config/config'; import { Strings } from './strings'; -import { Params, Router, UrlSegment, ActivatedRouteSnapshot } from '@angular/router'; +import { Params, Router, UrlSegment, ActivatedRouteSnapshot, NavigationExtras } from '@angular/router'; import { UserToken } from '../modules/views/main/authentication/base/user-token'; export class Url { @@ -15,14 +15,46 @@ export class Url { return decodeURIComponent(path); } + public static getNavigationExtrasRedirect(url: string): NavigationExtras { + let extras: NavigationExtras = undefined; + const currentUrl = Url.normalizeForRedirect(url); + if (currentUrl === '') { + return {}; + } + return { queryParams: { r: currentUrl } }; + } + + private static normalizeForRedirect(url: string): string { + let normalized = url.replace(Config.LOGIN_URL, '').replace(Config.WELCOME_URL, ''); + if (normalized === '/') { + return ''; + } + return normalized; + } + public static stripBasePath(path: string): string { // Expected input: /-/basepath/url%2Fmorestuff // Output: url/morestuff + if (path === undefined) { + return path; + } path = Url.decode(path); path = path.slice(Config.VIEW_URL_PREFIX.length); return path.slice(path.indexOf(this.SEP, path.indexOf(this.SEP) + 1) + 1); } + public static project(url: string): string { + if (url === undefined || url === null || url === '') { + return undefined; + } + const decodedUrl = Url.decode(url); + let index = 0; + if (decodedUrl.indexOf(Config.VIEW_URL_PREFIX) === 0) { + index = 2; + } + return Url.parts(decodedUrl)[index]; + } + public static parent(url: string): string { if (url === undefined) { return undefined; diff --git a/web/src/assets/i18n/de.json b/web/src/assets/i18n/de.json index ada3cc101..23ab896d0 100644 --- a/web/src/assets/i18n/de.json +++ b/web/src/assets/i18n/de.json @@ -80,7 +80,9 @@ "elementCouldNotBeSaved": "Element konnte nicht gespeichert werden", "elementCouldNotBeUpdated": "Element konnte nicht geändert werden", "errorLoggedOut": "Sie wurden aufgrund eines unbekannten Fehlers abgemeldet.", + "expand": "", "exportTestprocedure": "Testprozedur exportieren", + "failed": "Fehler", "fieldInvalid": "Feld ungültig", "hideGrid": "Hilfslinien ausblenden", "inactivityLoggedOut": "Sie wurden automatisch abgemeldet.", @@ -123,6 +125,7 @@ "parameters": "Parameter", "password": "Passwort", "payload": "Ladung", + "procedureExportFailed": "Prozedur konnte nicht exportiert werden", "procedureExportedSuccessfully": "Prozedur erfolgreich exportiert", "procedureNotValid": "Prozedur nicht valide", "processModel": "Prozessmodell", @@ -145,6 +148,7 @@ "specmate": { "logo": "Specmate Logo" }, + "successful": "Erfolgreich", "testspec": { "generate": "Testspezifikation generieren" }, @@ -171,6 +175,7 @@ "username": "Benutzername", "version": "Version", "welcome": { + "description": "Wähle ein Objekt auf der linken Seite, um zu starten.", "text": "Willkommen bei Specmate" }, "zoomIn": "Vergrößern", diff --git a/web/src/assets/i18n/gb.json b/web/src/assets/i18n/gb.json index 670850f01..25f47c2f2 100644 --- a/web/src/assets/i18n/gb.json +++ b/web/src/assets/i18n/gb.json @@ -80,7 +80,9 @@ "elementCouldNotBeSaved": "Could not save element", "elementCouldNotBeUpdated": "Could nto update element", "errorLoggedOut": "You were logged out due to an unknown error.", + "expand": "", "exportTestprocedure": "Export test procedure", + "failed": "Failed", "fieldInvalid": "Field invalid", "hideGrid": "Hide grid", "inactivityLoggedOut": "You were logged out automatically.", @@ -123,6 +125,7 @@ "parameters": "Parameters", "password": "Password", "payload": "Payload", + "procedureExportFailed": "Procedure could not be exported", "procedureExportedSuccessfully": "Procedure exported successfully", "procedureNotValid": "Procedure not valid", "processModel": "Process Model", @@ -145,6 +148,7 @@ "specmate": { "logo": "Specmate Emblem" }, + "successful": "Successful", "testspec": { "generate": "Generate test specification" }, @@ -171,6 +175,7 @@ "username": "Username", "version": "Version", "welcome": { + "description": "To start, choose an item on the left.", "text": "Welcome to Specmate" }, "zoomIn": "Zoom in", diff --git a/web/src/assets/scss/specmate.extensions.scss b/web/src/assets/scss/specmate.extensions.scss index a19654300..7575a9c5b 100644 --- a/web/src/assets/scss/specmate.extensions.scss +++ b/web/src/assets/scss/specmate.extensions.scss @@ -1,3 +1,7 @@ +$color-selected: $blue; +$color-selected-dark: $blue; +$color-selected-bright: $blue; + input[type=text]::-ms-clear { display: none; } @@ -13,13 +17,18 @@ button, } a { - color: #007EA8; + color: $blue; } a:focus, a:hover, a.selected { - color: #008A2C; + color: $color-selected; +} + +a.selected { + background-color: lighten($color-selected, 0.3); + color: #fff; } .line-breaks-visible { @@ -53,9 +62,15 @@ a.selected { overflow-x: auto!important; } +.currentTreeElement { + border-color: $color-selected; + border-width: 1.5px; + border-style: dashed; +} + .specmate-container { - height: calc(100vh - 58px); - margin-top: 58px; + height: calc(100vh - 64px); + margin-top: 64px; } .dnd-sortable-drag { @@ -72,8 +87,35 @@ a.selected { outline: none; } -.currentTreeElement { - border-color: #008A2C; - border-width: 1.5px; - border-style: dashed; + +.btn-secondary:focus, .btn-outline-secondary { + box-shadow: 0 0 0 0.2rem rgba(51, 51, 51, 0.5); + border: 2px dashed $color-selected-dark; +} + +.btn-danger:focus, .btn-outline-danger:focus{ + box-shadow: 0 0 0 0.2rem rgba(224, 43, 11, 0.5); + border: 2px dashed $color-selected-bright; +} + +.brighter-secondary-outline:focus, .brighter-secondary-outline button:focus { + box-shadow: 0 0 0 0.2rem rgba(250, 250, 250, 0.8); + border: 2px dashed $color-selected-bright; +} + +.brighter-danger-outline:focus { + box-shadow: 0 0 0 0.2rem rgba(255, 100, 100, 0.5); + border: 2px dashed $color-selected-bright; +} + +a:focus, +button:focus, +input:focus, +textarea:focus, +[tabindex]:focus { + border: 2px dotted $color-selected !important; +} + +.badge { + font-size: 100%; } \ No newline at end of file diff --git a/web/src/tsconfig.json b/web/src/tsconfig.json index 6c2d3553f..06cb18e94 100644 --- a/web/src/tsconfig.json +++ b/web/src/tsconfig.json @@ -9,6 +9,7 @@ "lib": ["es2015", "dom"], "noImplicitAny": true, "suppressImplicitAnyIndexErrors": true, + "allowSyntheticDefaultImports": true, "typeRoots": [ "../node_modules/@types" ], diff --git a/web/webpack/webpack.common.js b/web/webpack/webpack.common.js index 8115d5519..92e2be594 100644 --- a/web/webpack/webpack.common.js +++ b/web/webpack/webpack.common.js @@ -1,4 +1,4 @@ -const SPECMATE_VERSION = '0.1.11' +const SPECMATE_VERSION = '0.2.1' const webpack = require('webpack'); const HtmlWebpackPlugin = require('html-webpack-plugin');