Permalink
Browse files

more table support

simplified pattern construction
  • Loading branch information...
Albert Zuendorf
Albert Zuendorf committed Aug 2, 2016
1 parent 4dcc1ea commit 351bcc0acdec2917d0c18371e536457a0d6fe04f
Showing with 6,540 additions and 1,144 deletions.
  1. +10 −7 doc/JsonPersistency.html
  2. +93 −84 doc/StudyRightObjectModelNavigationAndQueries.html
  3. +7 −4 doc/StudyRightReachabilityGraph.html
  4. +775 −0 doc/StudyRightTablesAndReports.html
  5. +35 −32 doc/StudyRightWithAssignmentsStoryPage.html
  6. +109 −0 doc/TableModel.html
  7. +2 −0 doc/refs.html
  8. +4 −4 sdmlib-code-style.xml
  9. +21 −4 src/main/java/org/sdmlib/models/classes/ClassModel.java
  10. +3 −3 src/main/java/org/sdmlib/models/classes/logic/GenClassModel.java
  11. +2 −2 src/main/java/org/sdmlib/models/objects/XML2GenericUtil.java
  12. +5 −5 src/main/java/org/sdmlib/models/pattern/Pattern.java
  13. +122 −12 src/main/java/org/sdmlib/models/pattern/PatternObject.java
  14. +231 −0 src/main/java/org/sdmlib/models/tables/Cell.java
  15. +315 −0 src/main/java/org/sdmlib/models/tables/Column.java
  16. +279 −0 src/main/java/org/sdmlib/models/tables/Row.java
  17. +271 −0 src/main/java/org/sdmlib/models/tables/Table.java
  18. +52 −0 src/main/java/org/sdmlib/models/tables/TableModel.java
  19. +118 −0 src/main/java/org/sdmlib/models/tables/util/CellCreator.java
  20. +148 −0 src/main/java/org/sdmlib/models/tables/util/CellPO.java
  21. +22 −0 src/main/java/org/sdmlib/models/tables/util/CellPOCreator.java
  22. +283 −0 src/main/java/org/sdmlib/models/tables/util/CellSet.java
  23. +148 −0 src/main/java/org/sdmlib/models/tables/util/ColumnCreator.java
  24. +302 −0 src/main/java/org/sdmlib/models/tables/util/ColumnPO.java
  25. +22 −0 src/main/java/org/sdmlib/models/tables/util/ColumnPOCreator.java
  26. +490 −0 src/main/java/org/sdmlib/models/tables/util/ColumnSet.java
  27. +20 −0 src/main/java/org/sdmlib/models/tables/util/CreatorCreator.java
  28. +124 −0 src/main/java/org/sdmlib/models/tables/util/RowCreator.java
  29. +164 −0 src/main/java/org/sdmlib/models/tables/util/RowPO.java
  30. +22 −0 src/main/java/org/sdmlib/models/tables/util/RowPOCreator.java
  31. +324 −0 src/main/java/org/sdmlib/models/tables/util/RowSet.java
  32. +130 −0 src/main/java/org/sdmlib/models/tables/util/TableCreator.java
  33. +222 −0 src/main/java/org/sdmlib/models/tables/util/TablePO.java
  34. +22 −0 src/main/java/org/sdmlib/models/tables/util/TablePOCreator.java
  35. +339 −0 src/main/java/org/sdmlib/models/tables/util/TableSet.java
  36. +241 −0 src/main/java/org/sdmlib/storyboards/StoryPage.java
  37. +14 −8 src/main/java/org/sdmlib/storyboards/Storyboard.java
  38. +239 −101 src/main/java/org/sdmlib/storyboards/StoryboardImpl.java
  39. +13 −13 src/main/java/org/sdmlib/storyboards/StoryboardStep.java
  40. +1 −78 src/main/java/org/sdmlib/storyboards/util/CreatorCreator.java
  41. +26 −37 src/main/java/org/sdmlib/storyboards/util/StoryboardCreator.java
  42. +35 −107 src/main/java/org/sdmlib/storyboards/util/StoryboardPO.java
  43. +2 −2 src/main/java/org/sdmlib/storyboards/util/StoryboardPOCreator.java
  44. +31 −82 src/main/java/org/sdmlib/storyboards/util/StoryboardSet.java
  45. +2 −2 src/main/java/org/sdmlib/storyboards/util/StoryboardStepCreator.java
  46. +4 −4 src/main/java/org/sdmlib/storyboards/util/StoryboardStepPO.java
  47. +2 −2 src/main/java/org/sdmlib/storyboards/util/StoryboardStepSet.java
  48. +2 −2 src/main/replication/org/sdmlib/models/taskflows/TaskFlowObjectScenarioForCoverage.java
  49. +2 −2 src/main/replication/org/sdmlib/replication/ReplicationObjectScenarioForCoverage.java
  50. +3 −3 src/main/replication/org/sdmlib/replication/StartLaneAction.java
  51. +2 −2 src/test/java/org/sdmlib/simple/TestModelCreation.java
  52. +2 −2 src/test/java/org/sdmlib/test/examples/SDMLib/ClassModelTest.java
  53. +2 −2 src/test/java/org/sdmlib/test/examples/SDMLib/PatternModelCodeGen.java
  54. +3 −3 src/test/java/org/sdmlib/test/examples/SDMLib/SDMLibMetaModelObjectDiagramsForCoverage.java
  55. +2 −2 src/test/java/org/sdmlib/test/examples/gofpattern/StrategyModel.java
  56. +2 −2 src/test/java/org/sdmlib/test/examples/groupaccount/GroupAccountClassModel.java
  57. +2 −2 src/test/java/org/sdmlib/test/examples/groupaccount/GroupAccountTests.java
  58. +2 −2 src/test/java/org/sdmlib/test/examples/groupaccount/gui/GroupAccountAppSimpleTest.java
  59. +13 −13 src/test/java/org/sdmlib/test/examples/helloworld/HelloWorldTTC2011.java
  60. +2 −2 src/test/java/org/sdmlib/test/examples/ludo/LudoModel.java
  61. +3 −3 src/test/java/org/sdmlib/test/examples/ludo/LudoStoryboard.java
  62. +5 −5 src/test/java/org/sdmlib/test/examples/m2m/BanfM2MTransformations.java
  63. +3 −3 src/test/java/org/sdmlib/test/examples/modelcouch/BasicModel.java
  64. +2 −2 src/test/java/org/sdmlib/test/examples/modelcouch/ModelCouchTasksModel.java
  65. +2 −2 src/test/java/org/sdmlib/test/examples/modelcouch/ModelCouchTasksTest.java
  66. +3 −3 src/test/java/org/sdmlib/test/examples/modelspace/chat/MSChatClientTest.java
  67. +2 −2 src/test/java/org/sdmlib/test/examples/modelspace/chat/ModelSpaceChatModel.java
  68. +2 −2 src/test/java/org/sdmlib/test/examples/pattern/POCreatorTest.java
  69. +2 −2 src/test/java/org/sdmlib/test/examples/patternrewriteops/TrainModel.java
  70. +2 −2 src/test/java/org/sdmlib/test/examples/patternrewriteops/TrainStoryboards.java
  71. +2 −2 src/test/java/org/sdmlib/test/examples/reachabilitygraphs/IsomorphismTest.java
  72. +3 −3 src/test/java/org/sdmlib/test/examples/reachabilitygraphs/ReachabilityGraphExampleModels.java
  73. +2 −2 ...st/java/org/sdmlib/test/examples/reachabilitygraphs/ReachabilityGraphFerrymansProblemExample.java
  74. +3 −3 src/test/java/org/sdmlib/test/examples/reachabilitygraphs/ReachbilityGraphSimpleExamples.java
  75. +2 −2 src/test/java/org/sdmlib/test/examples/replication/chat/ReplicationChatClientApp.java
  76. +2 −2 src/test/java/org/sdmlib/test/examples/replication/chat/ReplicationChatModel.java
  77. +2 −2 src/test/java/org/sdmlib/test/examples/replication/chat/ReplicationChatServer.java
  78. +2 −2 src/test/java/org/sdmlib/test/examples/replication/chat/SeppelChatTest.java
  79. +2 −2 src/test/java/org/sdmlib/test/examples/simpleEnumModel/SimpleClassModelWithEnumeration.java
  80. +3 −3 src/test/java/org/sdmlib/test/examples/simpleModel/TestGenModel.java
  81. +2 −2 src/test/java/org/sdmlib/test/examples/simpleModel/TestJsonForUniDirectionalAssoc.java
  82. +5 −5 src/test/java/org/sdmlib/test/examples/studyright/StudyRightModel.java
  83. +4 −4 src/test/java/org/sdmlib/test/examples/studyright/StudyRightStoryboards.java
  84. +2 −2 src/test/java/org/sdmlib/test/examples/studyrightWithAssignments/StudyRightWithAssignmentsModel.java
  85. +554 −406 ...java/org/sdmlib/test/examples/studyrightWithAssignments/StudyRightWithAssignmentsStoryboards.java
  86. +20 −25 src/test/java/org/sdmlib/test/examples/studyrightWithAssignments/model/util/UniversityPO.java
  87. +3 −3 src/test/java/org/sdmlib/test/kanban/ProjectBoard.java
  88. +2 −2 src/test/java/org/sdmlib/test/model/ModelRefactoring.java
  89. +2 −2 src/test/java/org/sdmlib/test/models/objects/GenericGraphModel.java
  90. +2 −2 src/test/java/org/sdmlib/test/models/objects/GenericObjectsTest.java
  91. +2 −2 src/test/java/org/sdmlib/test/models/taskflows/TaskFlowModel.java
  92. +2 −2 src/test/java/org/sdmlib/test/modelspace/ModelSpaceModel.java
  93. +4 −4 src/test/java/org/sdmlib/test/replication/ReplicationModel.java
  94. +2 −2 src/test/java/org/sdmlib/test/templates/ModelToTextToModelClassModel.java
View
@@ -4,6 +4,9 @@
<link rel="stylesheet" type="text/css" href="style.css">
<link href="includes/diagramstyle.css" rel="stylesheet" type="text/css">
<link rel="stylesheet" href="http://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css">
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script>
<script src="http://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js"></script>
<script src="includes/dagre.min.js"></script>
<script src="includes/drawer.js"></script>
<script src="includes/graph.js"></script>
@@ -336,15 +339,15 @@
json["options"]={"canvasid":"canvasJsonPersistency3", "display":"svg", "fontsize":10,"bar":true}; var g = new Graph(json);
g.layout(100,100);
</script>
<p><a name = 'step_1'>Step 1: Serialize to json:</a></p><pre>
<p><a name = 'step_1'>Step 1: Serialize to json:</a></p><pre>
IdMap idMap = UniversityCreator.createIdMap(&quot;demo&quot;);
JsonArray jsonArray = idMap.toJsonArray(university);
String jsonText = jsonArray.toString(3);
&#x2F;&#x2F; you might write jsonText into a file
</pre><p>Results in:</p>
<pre>[
{
@@ -584,10 +587,10 @@
}
}
}
]</pre><p><a name = 'step_2'>Step 2: Now read it back again</a></p><pre>
]</pre><p><a name = 'step_2'>Step 2: Now read it back again</a></p><pre>
&#x2F;&#x2F; read jsonText from file
IdMap readerMap = UniversityCreator.createIdMap(&quot;demo&quot;);
Object rootObject = readerMap.decode(jsonText);
University readUniversity = (University) rootObject;
@@ -4,6 +4,9 @@
<link rel="stylesheet" type="text/css" href="style.css">
<link href="includes/diagramstyle.css" rel="stylesheet" type="text/css">
<link rel="stylesheet" href="http://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css">
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script>
<script src="http://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js"></script>
<script src="includes/dagre.min.js"></script>
<script src="includes/drawer.js"></script>
<script src="includes/graph.js"></script>
@@ -882,41 +885,41 @@
json["options"]={"canvasid":"canvasStudyRightObjectModelNavigationAndQueries7", "display":"svg", "fontsize":10,"bar":true}; var g = new Graph(json);
g.layout(100,100);
</script>
<p><a name = 'step_1'>Step 1: Simple set based navigation:</a></p><pre>
<p><a name = 'step_1'>Step 1: Simple set based navigation:</a></p><pre>
int assignmentPoints = university.getRooms().getAssignments().getPoints().sum();
int donePoints = university.getStudents().getDone().getPoints().sum();
</pre><p>Results in:</p>
<pre> Sum of assignment points: 23.
Sum of points of assignments that have been done by at least one students: 15.</pre><p>Check: Assignment points: 23 actual 23</p>
<p>Check: donePoints: 15 actual 15</p>
<p><a name = 'step_2'>Step 2: Rooms with assignments not yet done by Karli:</a></p><pre>
<p><a name = 'step_2'>Step 2: Rooms with assignments not yet done by Karli:</a></p><pre>
AssignmentSet availableAssignments = university.getRooms().getAssignments().minus(karli.getDone());
RoomSet rooms = availableAssignments.getRoom();
</pre><p>Results in:</p>
<pre> (senate math 17, gymnasium sports 25)</pre><p>Check: rooms.size(): 2 actual 2</p>
<p><a name = 'step_3'>Step 3: Filter for attribute:</a></p><pre>
<p><a name = 'step_3'>Step 3: Filter for attribute:</a></p><pre>
RoomSet rooms17 = university.getRooms().filterCredits(17);
RoomSet roomsGE20 = university.getRooms().filterCredits(20, Integer.MAX_VALUE);
</pre><p>Results in:</p>
<pre> rooms17: (senate math 17)
roomsGE20: (gymnasium sports 25, 7422 Software Engineering 42)</pre><p><a name = 'step_4'>Step 4: Filter for attribute greater than:</a></p><pre>
roomsGE20: (gymnasium sports 25, 7422 Software Engineering 42)</pre><p><a name = 'step_4'>Step 4: Filter for attribute greater than:</a></p><pre>
&#x2F;&#x2F; Java 8:
&#x2F;&#x2F; (Room elem) -&gt; elem.getCredits() &gt; 20
RoomSet roomsEven = university.getRooms().filter(value -&gt; value.getCredits() % 2 == 0);
</pre><p>Results in:</p>
<pre> (7522 arts 16, The End exam 0, 7422 Software Engineering 42)</pre><p><a name = 'step_5'>Step 5: Filter for type: </a></p><pre>
<pre> (7522 arts 16, The End exam 0, 7422 Software Engineering 42)</pre><p><a name = 'step_5'>Step 5: Filter for type: </a></p><pre>
TeachingAssistantSet taStudents = university.getRooms().getStudents().instanceOf(new TeachingAssistantSet());
</pre><pre>(Karli 4242 0 0 0)</pre><p><a name = 'step_6'>Step 6: Write operations on sets: </a></p><pre>
</pre><pre>(Karli 4242 0 0 0)</pre><p><a name = 'step_6'>Step 6: Write operations on sets: </a></p><pre>
university.getStudents().withMotivation(42);
</pre><script>
var json = {
"typ":"objectdiagram",
@@ -961,15 +964,15 @@
json["options"]={"canvasid":"canvasStudyRightObjectModelNavigationAndQueries32", "display":"svg", "fontsize":10,"bar":true}; var g = new Graph(json);
g.layout(100,100);
</script>
<p><a name = 'step_7'>Step 7: Rooms with two students that are friends (and need supervision): </a></p><pre>
RoomPO roomPO = university.getRooms().filterRoomPO();
StudentPO stud1PO = roomPO.filterStudents();
roomPO.filterStudents().filterMotivation(42).filterFriends(stud1PO);
<p><a name = 'step_7'>Step 7: Rooms with two students that are friends (and need supervision): </a></p><pre>
RoomPO roomPO = university.getRooms().createRoomPO();
StudentPO stud1PO = roomPO.createStudentsPO();
roomPO.createStudentsPO().createMotivationCondition(42).createFriendsPO(stud1PO);
rooms = roomPO.allMatches();
</pre><script>
var json = {
"typ":"object",
@@ -1034,17 +1037,17 @@
g.layout(100,100);
</script>
<p>Results in:</p>
<pre> (gymnasium sports 25)</pre><p><a name = 'step_8'>Step 8: Rooms with two students with low motivation that are friends (and need supervision): </a></p><pre>
roomPO = university.getRooms().filterRoomPO();
stud1PO = roomPO.filterStudents();
final StudentPO stud2PO = roomPO.filterStudents().filterMotivation(0, 50);
stud2PO.filterFriends(stud1PO);
<pre> (gymnasium sports 25)</pre><p><a name = 'step_8'>Step 8: Rooms with two students with low motivation that are friends (and need supervision): </a></p><pre>
roomPO = university.getRooms().createRoomPO();
stud1PO = roomPO.createStudentsPO();
final StudentPO stud2PO = roomPO.createStudentsPO().createMotivationCondition(0, 50);
stud2PO.createFriendsPO(stud1PO);
rooms = roomPO.allMatches();
</pre><script>
var json = {
"typ":"object",
@@ -1109,21 +1112,21 @@
g.layout(100,100);
</script>
<p>Results in:</p>
<pre> (gymnasium sports 25)</pre><p><a name = 'step_9'>Step 9: Rooms with two students without supervision that are friends and add teaching assistance: </a></p><pre>
<pre> (gymnasium sports 25)</pre><p><a name = 'step_9'>Step 9: Rooms with two students without supervision that are friends and add teaching assistance: </a></p><pre>
UniversityPO uniPO = new UniversityPO(university);
roomPO = uniPO.filterRooms();
stud1PO = roomPO.filterStudents().filterMotivation(0, 42);
roomPO.filterStudents().filterFriends(stud1PO);
roomPO = uniPO.createRoomsPO();
stud1PO = roomPO.createStudentsPO().createMotivationCondition(0, 42);
roomPO.createStudentsPO().createFriendsPO(stud1PO);
roomPO.filterTas(null);
roomPO.createTas();
rooms = roomPO.allMatches();
</pre><script>
var json = {
"typ":"object",
@@ -1338,15 +1341,15 @@
json["options"]={"canvasid":"canvasStudyRightObjectModelNavigationAndQueries47", "display":"svg", "fontsize":10,"bar":true}; var g = new Graph(json);
g.layout(100,100);
</script>
<pre> (gymnasium sports 25)</pre><p><a name = 'step_10'>Step 10: TAs as students in a room: </a></p><pre>
roomPO = university.getRooms().filterRoomPO();
stud1PO = roomPO.filterStudents();
<pre> (gymnasium sports 25)</pre><p><a name = 'step_10'>Step 10: TAs as students in a room: </a></p><pre>
roomPO = university.getRooms().createRoomPO();
stud1PO = roomPO.createStudentsPO();
TeachingAssistantPO taPO = stud1PO.instanceOf(new TeachingAssistantPO());
TeachingAssistantSet taSet = taPO.allMatches();
</pre><script>
var json = {
"typ":"object",
@@ -1419,42 +1422,48 @@
json["options"]={"canvasid":"canvasStudyRightObjectModelNavigationAndQueries52", "display":"svg", "fontsize":10,"bar":true}; var g = new Graph(json);
g.layout(100,100);
</script>
<p><a name = 'step_11'>Step 11: Double motivation of all students: </a></p><pre>
roomPO = university.getRooms().filterRoomPO();
stud1PO = roomPO.filterStudents();
<p><a name = 'step_11'>Step 11: Double motivation of all students: </a></p><pre>
roomPO = university.getRooms().createRoomPO();
stud1PO = roomPO.createStudentsPO();
for (Match match : (Iterable&lt;Match&gt;) roomPO.getPattern())
{
Student currentMatch = stud1PO.getCurrentMatch();
currentMatch.withMotivation(currentMatch.getMotivation() * 2);
&#x2F;&#x2F; or more simple:
stud1PO.withMotivation(stud1PO.getMotivation() * 2);
Room assertMatch = roomPO.getCurrentMatch();
if (match.number == 1) {
Assert.assertEquals(&quot;Karli&quot;, currentMatch.getName());
Assert.assertEquals(&quot;senate&quot;, assertMatch.getName());
Assert.assertEquals(&quot;math&quot;, assertMatch.getTopic());
Assert.assertEquals(17, assertMatch.getCredits());
} else if (match.number == 2) {
Assert.assertEquals(&quot;Abu&quot;, currentMatch.getName());
Assert.assertEquals(&quot;gymnasium&quot;, assertMatch.getName());
Assert.assertEquals(&quot;sports&quot;, assertMatch.getTopic());
Assert.assertEquals(25, assertMatch.getCredits());
} else if (match.number == 3) {
Assert.assertEquals(&quot;Alice&quot;, currentMatch.getName());
Assert.assertEquals(&quot;gymnasium&quot;, assertMatch.getName());
Assert.assertEquals(&quot;sports&quot;, assertMatch.getTopic());
Assert.assertEquals(25, assertMatch.getCredits());
}
&#x2F;&#x2F; System.out.println(&quot;match &quot; + match.number + &quot;: &quot; + currentMatch + &quot; in room &quot; + roomPO.getCurrentMatch());
if (match.number == 1)
{
Assert.assertEquals(&quot;Karli&quot;, currentMatch.getName());
Assert.assertEquals(&quot;senate&quot;, assertMatch.getName());
Assert.assertEquals(&quot;math&quot;, assertMatch.getTopic());
Assert.assertEquals(17, assertMatch.getCredits());
}
else if (match.number == 2)
{
Assert.assertEquals(&quot;Abu&quot;, currentMatch.getName());
Assert.assertEquals(&quot;gymnasium&quot;, assertMatch.getName());
Assert.assertEquals(&quot;sports&quot;, assertMatch.getTopic());
Assert.assertEquals(25, assertMatch.getCredits());
}
else if (match.number == 3)
{
Assert.assertEquals(&quot;Alice&quot;, currentMatch.getName());
Assert.assertEquals(&quot;gymnasium&quot;, assertMatch.getName());
Assert.assertEquals(&quot;sports&quot;, assertMatch.getTopic());
Assert.assertEquals(25, assertMatch.getCredits());
}
&#x2F;&#x2F; System.out.println(&quot;match &quot; + match.number + &quot;: &quot; + currentMatch + &quot;
&#x2F;&#x2F; in room &quot; + roomPO.getCurrentMatch());
}
</pre><script>
var json = {
"typ":"object",
@@ -1592,17 +1601,17 @@
json["options"]={"canvasid":"canvasStudyRightObjectModelNavigationAndQueries56", "display":"svg", "fontsize":10,"bar":true}; var g = new Graph(json);
g.layout(100,100);
</script>
<p><a name = 'step_12'>Step 12: lure students from other rooms into math room: </a></p><pre>
<p><a name = 'step_12'>Step 12: lure students from other rooms into math room: </a></p><pre>
roomPO = new RoomPO(mathRoom);
stud1PO = roomPO.filterPath(r-&gt;((Room)r).getDoors().getStudents(), new StudentPO());
stud1PO = roomPO.createPath(r -&gt; ((Room) r).getDoors().getStudents(), new StudentPO());
stud1PO.startCreate();
stud1PO.filterIn(roomPO);
stud1PO.allMatches();
</pre><script>
var json = {
"typ":"object",
@@ -4,6 +4,9 @@
<link rel="stylesheet" type="text/css" href="style.css">
<link href="includes/diagramstyle.css" rel="stylesheet" type="text/css">
<link rel="stylesheet" href="http://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css">
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script>
<script src="http://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js"></script>
<script src="includes/dagre.min.js"></script>
<script src="includes/drawer.js"></script>
<script src="includes/graph.js"></script>
@@ -262,7 +265,7 @@
"typ":"clazz",
"id":"R8 : ReachableState",
"attributes":[
"number=59",
"number=43",
"metricValue=0.0"
]
},
@@ -277,7 +280,7 @@
"typ":"clazz",
"id":"R13 : ReachableState",
"attributes":[
"number=26",
"number=22",
"metricValue=0.0"
]
},
@@ -832,8 +835,8 @@
json["options"]={"canvasid":"canvasStudyRightReachabilityGraph4", "display":"svg", "fontsize":10,"bar":true}; var g = new Graph(json);
g.layout(100,100);
</script>
<p>Total number of states 107</p>
<p>Success state 59</p>
<p>Total number of states 65</p>
<p>Success state 43</p>
<script>
var json = {
"typ":"object",
Oops, something went wrong.

0 comments on commit 351bcc0

Please sign in to comment.