1
|
package eu.dnetlib.data.claimsDemo;
|
2
|
|
3
|
/**
|
4
|
* Created by Eri on 18/11/2015.
|
5
|
*/
|
6
|
|
7
|
|
8
|
//import eu.dnetlib.data.claims.migration.Claim;
|
9
|
|
10
|
import eu.dnetlib.data.claims.migration.*;
|
11
|
import eu.dnetlib.data.claims.migration.handler.*;
|
12
|
import eu.dnetlib.data.claims.migration.parser.DMFParser;
|
13
|
import eu.dnetlib.data.claims.migration.parser.OafParser;
|
14
|
import org.apache.log4j.BasicConfigurator;
|
15
|
import org.apache.log4j.Logger;
|
16
|
import org.junit.Before;
|
17
|
import org.junit.Test;
|
18
|
import org.junit.runner.RunWith;
|
19
|
import org.springframework.beans.factory.annotation.Autowired;
|
20
|
import org.springframework.context.ApplicationContext;
|
21
|
import org.springframework.context.support.ClassPathXmlApplicationContext;
|
22
|
import org.springframework.test.context.ContextConfiguration;
|
23
|
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
|
24
|
import org.xml.sax.SAXException;
|
25
|
|
26
|
import javax.xml.parsers.ParserConfigurationException;
|
27
|
import javax.xml.transform.TransformerException;
|
28
|
import javax.xml.xpath.XPathExpressionException;
|
29
|
import java.io.IOException;
|
30
|
import java.sql.ResultSet;
|
31
|
|
32
|
import static junit.framework.Assert.assertNotNull;
|
33
|
|
34
|
/**
|
35
|
* @author eri
|
36
|
*/
|
37
|
@RunWith(SpringJUnit4ClassRunner.class)
|
38
|
@ContextConfiguration(locations = {"springContext-claimsDemo.xml"})
|
39
|
|
40
|
public class TestClass {
|
41
|
private Logger log = Logger.getLogger(this.getClass());
|
42
|
|
43
|
|
44
|
@Autowired
|
45
|
private SqlDAO sqlDAO;
|
46
|
|
47
|
@Autowired
|
48
|
private QueryGenerator queryGenerator;
|
49
|
|
50
|
RelationHandler relationHandler = null;
|
51
|
ContextRelationHandler contextRelationHandler = null;
|
52
|
ProjectHandler projectHandler = null;
|
53
|
DMFContextHandler dmfContextHandler = null;
|
54
|
DMFResultHandler dmfResultHandler = null;
|
55
|
IndexResultHandler indexResultHandler = null;
|
56
|
ExternalRecordHandler externalRecordHandler = null;
|
57
|
ResultHandler resultHandler = null;
|
58
|
|
59
|
ClaimHandler claimHandler = null;
|
60
|
ClaimValidation claimValidation = new ClaimValidation();
|
61
|
|
62
|
|
63
|
@Before
|
64
|
public void init() throws Exception {
|
65
|
BasicConfigurator.configure();
|
66
|
assertNotNull(sqlDAO);
|
67
|
ApplicationContext context = new ClassPathXmlApplicationContext("eu/dnetlib/data/claims/migration/springContext-claimsDemo.xml");
|
68
|
relationHandler = context.getBean(RelationHandler.class);
|
69
|
contextRelationHandler = context.getBean(ContextRelationHandler.class);
|
70
|
projectHandler = context.getBean(ProjectHandler.class);
|
71
|
dmfContextHandler = context.getBean(DMFContextHandler.class);
|
72
|
dmfResultHandler = context.getBean(DMFResultHandler.class);
|
73
|
externalRecordHandler = context.getBean(ExternalRecordHandler.class);
|
74
|
indexResultHandler = context.getBean(IndexResultHandler.class);
|
75
|
resultHandler = context.getBean(ResultHandler.class);
|
76
|
claimHandler = context.getBean(ClaimHandler.class);
|
77
|
|
78
|
}
|
79
|
|
80
|
|
81
|
@Test
|
82
|
public void testJob() throws Exception {
|
83
|
|
84
|
log.info(queryGenerator.generateSelectAllClaimsQuery(1));
|
85
|
|
86
|
|
87
|
}
|
88
|
|
89
|
@Test
|
90
|
public void testHttpRequest() throws Exception {
|
91
|
SearchUtils searchUtils= new SearchUtils();
|
92
|
log.info(searchUtils.fetchPublicationXmlFromIndex("doajarticles::eb8a123eb82b25013b0001d0e2d1842b"));
|
93
|
log.info(searchUtils.fetchDatasetXmlFromIndex("doajarticles::eb8a123eb82b25013b0001d0e2d1842b"));
|
94
|
}
|
95
|
|
96
|
@Test
|
97
|
public void testXpath() throws Exception {
|
98
|
Result r=indexResultHandler.fetchResultById("dedup_wf_001::88a1eedd1ffce63dccf51d8ce2053c85");
|
99
|
}
|
100
|
|
101
|
@Test
|
102
|
public void testParsingDMF() throws IOException, SAXException, ParserConfigurationException, XPathExpressionException, TransformerException {
|
103
|
Result r=DMFParser.dmf2Result("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" +
|
104
|
"<record xmlns:dc=\"http://purl.org/dc/elements/1.1/\" xmlns:prov=\"http://www.openarchives.org/OAI/2.0/provenance\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:dri=\"http://www.driver-repository.eu/namespace/dri\" xmlns:dr=\"http://www.driver-repository.eu/namespace/dr\" xmlns:oaf=\"http://namespace.openaire.eu/oaf\">\n" +
|
105
|
" <header xmlns=\"http://namespace.openaire.eu/\">\n" +
|
106
|
" <dri:objIdentifier>crossref____::47593e13b24bcdd0f3d5573499f1d3a9</dri:objIdentifier>\n" +
|
107
|
" <dri:recordIdentifier>10.1088/0004-637X/761/1/34</dri:recordIdentifier>\n" +
|
108
|
" <dri:dateOfCollection></dri:dateOfCollection>\n" +
|
109
|
" <dri:mdFormat></dri:mdFormat>\n" +
|
110
|
" <dri:mdFormatInterpretation></dri:mdFormatInterpretation>\n" +
|
111
|
" <dri:repositoryId></dri:repositoryId>\n" +
|
112
|
" <dr:objectIdentifier></dr:objectIdentifier>\n" +
|
113
|
" <dr:dateOfCollection>2014-10-10T14:59:49+00:00</dr:dateOfCollection>\n" +
|
114
|
" <oaf:datasourceprefix>crossref____</oaf:datasourceprefix>\n" +
|
115
|
" </header>\n" +
|
116
|
" <metadata xmlns=\"http://namespace.openaire.eu/\">\n" +
|
117
|
" <dc:dateAccepted>2012-01-01T00:00:00Z</dc:dateAccepted>\n" +
|
118
|
" <dc:identifier>http://stacks.iop.org/0004-637X/761/i=1/a=34?key=crossref.d14dae8ac205453af63561a69c108e13</dc:identifier>\n" +
|
119
|
" <dc:title>A THREE-DIMENSIONAL VIEW OF THE REMNANT OF NOVA PERSEI 1901 (GK Per)</dc:title>\n" +
|
120
|
" <oaf:collectedDatasourceid>openaire____::crossref</oaf:collectedDatasourceid>\n" +
|
121
|
" <oaf:accessrights></oaf:accessrights>\n" +
|
122
|
" <oaf:hostedBy name=\"Unknown Repository\" id=\"openaire____::1256f046-bf1f-4afc-8b47-d0b147148b18\"/>\n" +
|
123
|
" <oaf:collectedFrom name=\"Crossref\" id=\"openaire____::crossref\" />\n" +
|
124
|
"\n" +
|
125
|
" <dc:creator>Liimets, T.</dc:creator>\n" +
|
126
|
" generateCreateClaimTablesQuery <dc:creator>Corradi, R. L. M.</dc:creator>\n" +
|
127
|
" <dc:creator>Santander-García, M.</dc:creator>\n" +
|
128
|
" <dc:creator>Villaver, E.</dc:creator>\n" +
|
129
|
" <dc:creator>Rodríguez-Gil, P.</dc:creator>\n" +
|
130
|
" <dc:creator>Verro, K.</dc:creator>\n" +
|
131
|
" <dc:creator>Kolka, I.</dc:creator>\n" +
|
132
|
"\n" +
|
133
|
" <dc:identifier identifierType=\"doi\">10.1088/0004-637X/761/1/34</dc:identifier>\n" +
|
134
|
" <dr:CobjIdentifier>10.1088/0004-637X/761/1/34</dr:CobjIdentifier>\n" +
|
135
|
" </metadata>\n" +
|
136
|
"</record>");
|
137
|
log.info(r.toString());
|
138
|
|
139
|
}
|
140
|
@Test
|
141
|
public void dropClaimTables() throws Exception {
|
142
|
// sqlDAO.executeUpdateQuery(queryGenerator.generateDeleteClaimTablesQuery());
|
143
|
}
|
144
|
@Test
|
145
|
public void createClaimTables() throws Exception {
|
146
|
// sqlDAO.executeUpdateQuery(queryGenerator.generateCreateClaimTablesQuery());
|
147
|
}
|
148
|
|
149
|
@Test
|
150
|
public void validDoiTest() throws Exception {
|
151
|
String doi="10.1523/JNEUROSCI.2900-11.2012";
|
152
|
doi="10.1523/JNEUROSCI.2900-11.2012";
|
153
|
String tr_doi=doi=dmfResultHandler.checkDoiValidity(doi);
|
154
|
System.out.println("Initial doi:"+doi+" "+((doi.equals(tr_doi))?"":" Transformed to"+tr_doi));
|
155
|
|
156
|
}
|
157
|
|
158
|
@Test
|
159
|
public void buildProject() throws Exception {
|
160
|
String id = "arc_________::089188bbc5db213fb2b00a0d93043fc4";
|
161
|
Project pr = projectHandler.fetchProjectByID(id);
|
162
|
log.info(pr.toString());
|
163
|
id="corda_______::404d91e07cd4d32fddd8fc636ad4daf7";
|
164
|
pr = projectHandler.fetchProjectByID(id);
|
165
|
log.info(pr.toString());
|
166
|
|
167
|
}
|
168
|
@Test
|
169
|
public void test() throws Exception {
|
170
|
String xml="<?xml version=\"1.0\" encoding=\"UTF-8\"?><response>\t <header>\t\t <query>(((deletedbyinference = false) AND (oaftype exact result)) and (resulttypeid exact publication)) and (objidentifier exact od______1266::af81022e9c489007a8f9ab27c2c725cb)</query>\t\t\t\t <locale>en_GB</locale>\t\t\t\t\t\t<size>10</size>\t\t\t <page>1</page>\t\t\t <total>1</total>\t\t\t\t\t</header>\t <results>\t\t\t\t\t\t\t\t\t<result xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:dri=\"http://www.driver-repository.eu/namespace/dri\" xmlns:oaf=\"http://namespace.openaire.eu/oaf\"> <header> <dri:objIdentifier>od______1266::af81022e9c489007a8f9ab27c2c725cb</dri:objIdentifier> <dri:dateOfCollection>2015-08-14T07:08:53.549Z</dri:dateOfCollection> <counters>\t <counter_authorship value=\"2\"/> <counter_outcome value=\"1\"/>\t </counters> </header> <metadata> <oaf:entity xsi:schemaLocation=\"http://namespace.openaire.eu/oaf https://www.openaire.eu/schema/0.3/oaf-0.3.xsd\">\t\t <oaf:result>\t\t\t <subject classid=\"keyword\" classname=\"keyword\" schemeid=\"dnet:result_subject\" schemename=\"dnet:result_subject\">MATLAB</subject> <subject classid=\"keyword\" classname=\"keyword\" schemeid=\"dnet:result_subject\" schemename=\"dnet:result_subject\">Lecture</subject> <subject classid=\"keyword\" classname=\"keyword\" schemeid=\"dnet:result_subject\" schemename=\"dnet:result_subject\">Exercises</subject> <subject classid=\"keyword\" classname=\"keyword\" schemeid=\"dnet:result_subject\" schemename=\"dnet:result_subject\">Exercises in Linear Vibration Theory</subject> <subject classid=\"keyword\" classname=\"keyword\" schemeid=\"dnet:result_subject\" schemename=\"dnet:result_subject\">System Conditions</subject> <subject classid=\"keyword\" classname=\"keyword\" schemeid=\"dnet:result_subject\" schemename=\"dnet:result_subject\">MATLAB</subject> <subject classid=\"keyword\" classname=\"keyword\" schemeid=\"dnet:result_subject\" schemename=\"dnet:result_subject\">Exercises</subject> <subject classid=\"keyword\" classname=\"keyword\" schemeid=\"dnet:result_subject\" schemename=\"dnet:result_subject\">Exercises in Linear Vibration Theory</subject> <subject classid=\"keyword\" classname=\"keyword\" schemeid=\"dnet:result_subject\" schemename=\"dnet:result_subject\">System Conditions</subject> <subject classid=\"keyword\" classname=\"keyword\" schemeid=\"dnet:result_subject\" schemename=\"dnet:result_subject\">Damping Coefficient</subject> <subject classid=\"keyword\" classname=\"keyword\" schemeid=\"dnet:result_subject\" schemename=\"dnet:result_subject\">Lecture</subject> <title classid=\"main title\" classname=\"main title\" schemeid=\"dnet:dataCite_title\" schemename=\"dnet:dataCite_title\">Vibration Theory, Vol. 1B:linear vibration theory, MATLAB exercises</title> <dateofacceptance>1996-02-01</dateofacceptance> <publisher>Department of Mechanical Engineering, Aalborg University</publisher> <resulttype classid=\"publication\" classname=\"publication\" schemeid=\"dnet:result_typologies\" schemename=\"dnet:result_typologies\"/> <language classid=\"eng\" classname=\"English\" schemeid=\"dnet:languages\" schemename=\"dnet:languages\"/> <format>application/pdf</format> <description>The present collection of MATLAB exercises has been published as a supplement to the textbook, Svingningsteori, Bind 1 and the collection of exercises in Vibration theory, Vol. 1A, Solved Problems. Throughout the exercise references are made to these books.<br/><br/>The purpose of the MATLAB exercises is to give a better understanding of the physical problems in linear vibration theory and to surpress the mathematical analysis used to solve the problems. For this purpose the MATLAB environment is excellent.</description> <description>The present collection of MATLAB exercises has been published as a supplement to the textbook, Svingningsteori, Bind 1 and the collection of exercises in Vibration theory, Vol. 1A, Solved Problems. Throughout the exercise references are made to these books.<br/><br/>The purpose of the MATLAB exercises is to give a better understanding of the physical problems in linear vibration theory and to surpress the mathematical analysis used to solve the problems. For this purpose the MATLAB environment is excellent.</description> <source>Asmussen , J C & Nielsen , S R K 1996 , Vibration Theory, Vol. 1B : linear vibration theory, MATLAB exercises . Department of Mechanical Engineering, Aalborg University , Aalborg . U/ , no. 9601</source> <country classid=\"\" classname=\"\" schemeid=\"\" schemename=\"\"/> <relevantdate classid=\"\" classname=\"\" schemeid=\"\" schemename=\"\"/> <embargoenddate/> <fulltext/> <storagedate/> <resourcetype classid=\"\" classname=\"\" schemeid=\"\" schemename=\"\"/> <device/> <size/> <version/> <lastmetadataupdate/> <metadataversionnumber/> <originalId>oai:pure.atira.dk:publications/0b993280-a86a-11da-8341-000ea68e967b</originalId> <collectedfrom name=\"VBN\" id=\"opendoar____::8e2cfdc275761edc592f73a076197c33\"/> <pid classid=\"oai\" classname=\"oai\" schemeid=\"dnet:pid_types\" schemename=\"dnet:pid_types\">oai:pure.atira.dk:publications/0b993280-a86a-11da-8341-000ea68e967b</pid> <bestlicense classid=\"OPEN\" classname=\"Open Access\" schemeid=\"dnet:access_modes\" schemename=\"dnet:access_modes\"/> <context id=\"FCT\" label=\"Fundação para a Ciência e a Tecnologia, I.P.\" type=\"funding\"> <category id=\"FCT::3599-PPCDT\" label=\"3599-PPCDT\"/> </context> <datainfo> <inferred>false</inferred> <deletedbyinference>false</deletedbyinference> <trust>0.9</trust> <inferenceprovenance/> <provenanceaction classid=\"sysimport:crosswalk:repository\" classname=\"sysimport:crosswalk:repository\" schemeid=\"dnet:provenanceActions\" schemename=\"dnet:provenanceActions\"/> </datainfo>\t\t <rels>\t\t <rel inferred=\"false\" trust=\"0.9\" inferenceprovenance=\"\" provenanceaction=\"user:claim:search\">\t\t <to class=\"isProducedBy\" scheme=\"dnet:result_project_relations\" type=\"project\">fct_________::0432268334291febec6d0dbc1f8bae5d</to>\t\t <websiteurl>http://www.fct.pt/apoios/projectos/consulta/vglobal_projecto.phtml.en?idProjecto=83907&idElemConcurso=2612</websiteurl> <code>83907</code> <acronym>MIT-Pt/BS-CTRM/0051/2008</acronym> <title>Smart small-scale devices: systems for controlled delivery of bioactive molecules, cell expansion and for sensing cell environment.</title> <contracttype classid=\"UNKNOWN\" classname=\"UNKNOWN\" schemeid=\"fct:contractTypes\" schemename=\"fct:contractTypes\"/> <funding> <funder id=\"fct_________::FCT\" shortname=\"FCT\" name=\"Fundação para a Ciência e a Tecnologia, I.P.\" jurisdiction=\"PT\"/> <funding_level_0 name=\"3599-PPCDT\">fct_________::FCT::3599-PPCDT</funding_level_0> </funding>\t\t </rel> <rel inferred=\"true\" trust=\"0.9\" inferenceprovenance=\"\" provenanceaction=\"sysimport:crosswalk:repository\">\t\t <to class=\"hasAuthor\" scheme=\"dnet:personroles\" type=\"person\">dedup_wf_001::b3bccc606f9dfe608199defb1f89b4d2</to>\t\t <ranking>1</ranking> <fullname>Asmussen, J.C.</fullname>\t\t </rel> <rel inferred=\"true\" trust=\"0.9\" inferenceprovenance=\"\" provenanceaction=\"sysimport:crosswalk:repository\">\t\t <to class=\"hasAuthor\" scheme=\"dnet:personroles\" type=\"person\">dedup_wf_001::facd63932e76860852cdd2ca9d33f45c</to>\t\t <ranking>2</ranking> <fullname>Søren R. K. Nielsen</fullname>\t\t </rel>\t\t </rels>\t\t <children>\t\t\t <instance id=\"opendoar____::8e2cfdc275761edc592f73a076197c33\">\t\t\t <licence classid=\"OPEN\" classname=\"Open Access\" schemeid=\"dnet:access_modes\" schemename=\"dnet:access_modes\"/> <instancetype classid=\"0002\" classname=\"Book\" schemeid=\"dnet:publication_resource\" schemename=\"dnet:publication_resource\"/> <hostedby name=\"VBN\" id=\"opendoar____::8e2cfdc275761edc592f73a076197c33\"/>\t\t\t\t <webresource>\t\t\t\t <url>http://vbn.aau.dk/da/publications/vibration-theory-vol-1b(0b993280-a86a-11da-8341-000ea68e967b).html</url>\t\t\t\t </webresource>\t\t\t\t <webresource>\t\t\t\t <url>http://vbn.aau.dk/ws/files/57794257/vibration_theory_vol._1b_linear_vibration_theory_MATLAB_exercises.pdf</url>\t\t\t\t </webresource>\t\t\t </instance>\t\t </children>\t\t </oaf:result> </oaf:entity> </metadata> </result>\t\t\t\t\t\t</results>\t <browseResults>\t\t\t</browseResults></response>\n";
|
171
|
SearchUtils searchUtils = new SearchUtils();
|
172
|
Integer size=searchUtils.getNumberOfResultsInAPIXML(xml);
|
173
|
log.info(size);
|
174
|
xml="<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" +
|
175
|
"<record xmlns:dc=\"http://purl.org/dc/elements/1.1/\" xmlns:prov=\"http://www.openarchives.org/OAI/2.0/provenance\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:dri=\"http://www.driver-repository.eu/namespace/dri\" xmlns:dr=\"http://www.driver-repository.eu/namespace/dr\" xmlns:oaf=\"http://namespace.openaire.eu/oaf\">\n" +
|
176
|
" <header xmlns=\"http://namespace.openaire.eu/\">\n" +
|
177
|
" <dri:objIdentifier>orcid_______::4f9638b3f0fecbe3de2f9dde824c36d1</dri:objIdentifier>\n" +
|
178
|
" <dri:recordIdentifier>0000-0002-3477-3082-5288651</dri:recordIdentifier>\n" +
|
179
|
" <dri:dateOfCollection></dri:dateOfCollection>\n" +
|
180
|
" <dri:mdFormat></dri:mdFormat>\n" +
|
181
|
" <dri:mdFormatInterpretation></dri:mdFormatInterpretation>\n" +
|
182
|
" <dri:repositoryId></dri:repositoryId>\n" +
|
183
|
" <dr:objectIdentifier></dr:objectIdentifier>\n" +
|
184
|
" <dr:dateOfCollection>2015-08-19T14:40:37+00:00</dr:dateOfCollection>\n" +
|
185
|
" <oaf:datasourceprefix>openaire____</oaf:datasourceprefix>\n" +
|
186
|
" </header>\n" +
|
187
|
" <metadata xmlns=\"http://namespace.openaire.eu/\">\n" +
|
188
|
" <dc:dateAccepted>2012-01-01T00:00:00Z</dc:dateAccepted>\n" +
|
189
|
" <dc:identifier>http://dx.doi.org/10.1007/978_3_642_27169_4_2</dc:identifier>\n" +
|
190
|
" <dc:title>A Survey of Context-Aware Cross-Digital Library Personalization</dc:title>\n" +
|
191
|
" <oaf:collectedDatasourceid>openaire____::orcid</oaf:collectedDatasourceid>\n" +
|
192
|
" <oaf:accessrights>OPEN</oaf:accessrights>\n" +
|
193
|
" <oaf:embargoenddate></oaf:embargoenddate>\n" +
|
194
|
" <oaf:hostedBy name=\"Unknown Repository\" id=\"openaire____::1256f046-bf1f-4afc-8b47-d0b147148b18\"/>\n" +
|
195
|
" <oaf:collectedFrom name=\"ORCID\" id=\"openaire____::orcid\" />\n" +
|
196
|
" \n" +
|
197
|
" <dc:creator>Manola, Natalia</dc:creator>\n" +
|
198
|
" <dc:creator>Nika, Ana</dc:creator>\n" +
|
199
|
" <dc:creator>Catarci, Tiziana</dc:creator>\n" +
|
200
|
" <dc:creator>Ioannidis, Yannis</dc:creator>\n" +
|
201
|
" <dc:creator>Katifori, Akrivi</dc:creator>\n" +
|
202
|
" <dc:creator>Koutrika, Georgia</dc:creator>\n" +
|
203
|
" <dc:creator>Manola, Natalia</dc:creator>\n" +
|
204
|
" <dc:creator>Nürnberger, Andreas</dc:creator>\n" +
|
205
|
" <dc:creator>Thaller, Manfred</dc:creator>\n" +
|
206
|
" \n" +
|
207
|
"\n" +
|
208
|
" <oaf:identifier identiferType=\"orcidworkid\">0000-0002-3477-3082-5288651</oaf:identifier>\n" +
|
209
|
"\n" +
|
210
|
" </metadata>\n" +
|
211
|
"</record>";
|
212
|
dmfResultHandler.fetchAccessRights(xml);
|
213
|
dmfResultHandler.fetchDoiByDMF(xml);
|
214
|
dmfResultHandler.fetchEmbargoEndDateByDMF(xml);
|
215
|
dmfResultHandler.fetchOrcidWorkByDMF(xml);
|
216
|
|
217
|
|
218
|
}
|
219
|
|
220
|
@Test
|
221
|
public void buildOpenaireResult() throws Exception {
|
222
|
|
223
|
Migration migration= new Migration();
|
224
|
Result r=migration.buildOpenaireResult("datacite____::ddbd5c4c76598f27793bccf4a99843f7","");
|
225
|
log.info(r);
|
226
|
|
227
|
}
|
228
|
|
229
|
}
|