Attachment 'build.xml'
Download 1 <!--
2 $RCSfile: build.xml,v $
3 $Revision: 1.202.2.1 $
4 $Date: 2007/07/09 11:14:11 $
5 $Author: svc $
6
7 The Netarchive Suite - Software to harvest and preserve websites
8 Copyright 2004-2007 Det Kongelige Bibliotek and Statsbiblioteket, Denmark
9
10 This library is free software; you can redistribute it and/or
11 modify it under the terms of the GNU Lesser General Public
12 License as published by the Free Software Foundation; either
13 version 2.1 of the License, or (at your option) any later version.
14
15 This library is distributed in the hope that it will be useful,
16 but WITHOUT ANY WARRANTY; without even the implied warranty of
17 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
18 Lesser General Public License for more details.
19
20 You should have received a copy of the GNU Lesser General Public
21 License along with this library; if not, write to the Free Software
22 Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
23 -->
24 <project name="Webarkivering" default="compile">
25 <property name="srcdir" value="src"/>
26 <property name="classdir" value="classes"/>
27 <property name="webpages" value="webpages"/>
28 <property name="testdir" value="tests"/>
29 <property name="builder" value="Webarkiveringsgruppen"/>
30 <property name="releasetestdir" value="${user.home}/tmp_releasetest"/>
31 <property name="depcheckdir" value="${user.home}/tmp_dependencycheck"/>
32 <property name="jarclasspath" value="
33 db/derby-10.1.1.0.jar
34 commons-fileupload-1.0.jar
35 commons-net-1.4.1.jar
36 dom4j-1.5.2.jar
37 heritrix-1.12.1b.jar
38 heritrix-dependencies/commons-cli-1.0.jar
39 heritrix-dependencies/commons-codec-1.3.jar
40 heritrix-dependencies/commons-collections-3.1.jar
41 heritrix-dependencies/commons-lang-2.3.jar
42 heritrix-dependencies/commons-httpclient-3.0.1.jar
43 heritrix-dependencies/commons-logging-1.0.4.jar
44 heritrix-dependencies/commons-pool-1.3.jar
45 heritrix-dependencies/dnsjava-2.0.3.jar
46 heritrix-dependencies/javaswf-CVS-SNAPSHOT-1.jar
47 heritrix-dependencies/itext-1.2.0.jar
48 heritrix-dependencies/junit-3.8.2.jar
49 heritrix-dependencies/poi-2.0-RC1-20031102.jar
50 heritrix-dependencies/poi-scratchpad-2.0-RC1-20031102.jar
51 heritrix-dependencies/je-3.2.23.jar
52 heritrix-dependencies/mg4j-1.0.1.jar
53 heritrix-dependencies/fastutil-5.0.3-heritrix-subset-1.0.jar
54 heritrix-dependencies/jericho-html-2.3.jar
55 heritrix-dependencies/jets3t-0.5.0.jar
56 heritrix-dependencies/bsh-2.0b4.jar
57 httpunit-dependencies/nekohtml-0.9.4.jar
58 httpunit-1.6.jar
59 jaxen-1.1.jar
60 jetty-6.1.1.jar
61 jetty-dependencies/ant-1.6.5.jar
62 jetty-dependencies/core-3.1.1.jar
63 jetty-dependencies/jetty-util-6.1.1.jar
64 jetty-dependencies/jsp-2.1.jar
65 jetty-dependencies/jsp-api-2.1.jar
66 jetty-dependencies/servlet-api-2.5-6.1.1.jar
67 jetty-dependencies/slf4j-api-1.2.jar
68 jetty-dependencies/slf4j-jcl-1.2.jar
69 sunjms-lib/imq-4.1-b22g.jar
70 sunjms-lib/jms-4.1-b22g.jar
71 mail-dependencies/mail-1.4.jar
72 mail-dependencies/activation-1.1.jar
73 libidn-0.5.9.jar
74 lucene-core-2.0.0.jar
75 deduplicator-0.3.0-20061218.jar
76 "/>
77 <property name="toolclasspath" value="
78 ${jarclasspath}
79 dk.netarkivet.webarkive.jar
80 "/>
81 <path id="jars.path">
82 <pathelement path="${classdir}"/>
83 <fileset dir="lib">
84 <patternset id="jars.path.set">
85 <include name="db/derby-10.1.1.0.jar"/>
86 <include name="commons-fileupload-1.0.jar"/>
87 <include name="commons-net-1.4.1.jar"/>
88 <include name="dom4j-1.5.2.jar"/>
89 <include name="heritrix-1.12.1b.jar"/>
90 <include name="heritrix-dependencies/commons-cli-1.0.jar"/>
91 <include name="heritrix-dependencies/commons-codec-1.3.jar"/>
92 <include name="heritrix-dependencies/commons-collections-3.1.jar"/>
93 <include name="heritrix-dependencies/commons-httpclient-3.0.1.jar"/>
94 <include name="heritrix-dependencies/commons-logging-1.0.4.jar"/>
95 <include name="heritrix-dependencies/commons-lang-2.3.jar"/>
96 <include name="heritrix-dependencies/commons-pool-1.3.jar"/>
97 <include name="heritrix-dependencies/dnsjava-2.0.3.jar"/>
98 <include name="heritrix-dependencies/javaswf-CVS-SNAPSHOT-1.jar"/>
99 <include name="heritrix-dependencies/itext-1.2.0.jar"/>
100 <include name="heritrix-dependencies/junit-3.8.2.jar"/>
101 <include name="heritrix-dependencies/poi-2.0-RC1-20031102.jar"/>
102 <include name="heritrix-dependencies/poi-scratchpad-2.0-RC1-20031102.jar"/>
103 <include name="heritrix-dependencies/je-3.2.23.jar"/>
104 <include name="heritrix-dependencies/fastutil-5.0.3-heritrix-subset-1.0.jar"/>
105 <include name="heritrix-dependencies/mg4j-1.0.1.jar"/>
106 <include name="heritrix-dependencies/jericho-html-2.3.jar"/>
107 <include name="heritrix-dependencies/bsh-2.0b4.jar"/>
108 <include name="heritrix-dependencies/jets3t-0.5.0.jar"/>
109 <include name="jaxen-1.1.jar"/>
110 <include name="jetty-6.1.1.jar"/>
111 <include name="jetty-dependencies/ant-1.6.5.jar"/>
112 <include name="jetty-dependencies/core-3.1.1.jar"/>
113 <include name="jetty-dependencies/jetty-util-6.1.1.jar"/>
114 <include name="jetty-dependencies/jsp-2.1.jar"/>
115 <include name="jetty-dependencies/jsp-api-2.1.jar"/>
116 <include name="jetty-dependencies/servlet-api-2.5-6.1.1.jar"/>
117 <include name="jetty-dependencies/slf4j-api-1.2.jar"/>
118 <include name="jetty-dependencies/slf4j-jcl-1.2.jar"/>
119 <include name="sunjms-lib/imq-4.1-b22g.jar"/>
120 <include name="sunjms-lib/jms-4.1-b22g.jar"/>
121 <include name="mail-dependencies/mail-1.4.jar"/>
122 <include name="mail-dependencies/activation-1.1.jar"/>
123 <include name="libidn-0.5.9.jar"/>
124 <include name="lucene-core-2.0.0.jar"/>
125 <include name="deduplicator-0.3.0-20061218.jar"/>
126 </patternset>
127 </fileset>
128 </path>
129
130 <!-- A few extra libraries are required for the unittests for web pages. -->
131 <path id="unittest.jars.path">
132 <pathelement path="${classdir}"/>
133 <fileset dir="lib">
134 <patternset refid="jars.path.set"/>
135 </fileset>
136 <fileset dir="tests/lib">
137 <include name="httpunit-1.6.jar"/>
138 <include name="httpunit-dependencies/nekohtml-0.9.4.jar"/>
139 <include name="db/derbytools-10.1.1.0.jar"/>
140 <include name="mockobjects-core-0.09.jar"/>
141 <include name="mockobjects-jdk1.4-0.09.jar"/>
142 <include name="mockobjects-jdk1.4-j2ee1.3-0.09.jar"/>
143 </fileset>
144 </path>
145
146 <target name="compile">
147 <!-- ensure output dir exists -->
148 <mkdir dir="${classdir}"/>
149 <javac source="1.5" srcdir="${srcdir}" destdir="${classdir}" debug="on" encoding="UTF-8">
150 <classpath refid="jars.path"/>
151 </javac>
152 <copy todir="${classdir}">
153 <fileset dir="${srcdir}" includes="**/*.properties"/>
154 </copy>
155 </target>
156
157 <target name="compiletests" depends="compile">
158 <javac source="1.5" srcdir="${testdir}" destdir="${classdir}" debug="on" encoding="UTF-8">
159 <classpath refid="unittest.jars.path"/>
160 </javac>
161 <copy todir="${classdir}">
162 <fileset dir="${testdir}" includes="**/*.properties"/>
163 </copy>
164 </target>
165
166 <target name="compileall" depends="compile,compiletests"></target>
167
168 <target name="compileclean" depends="clean,compileall"
169 description="cleans up before doing a compileall">
170 </target>
171
172 <target name="clean" description="clean up">
173 <delete dir="${classdir}/dk"/>
174 <delete dir="${classdir}/webpages"/>
175 <delete verbose="false">
176 <fileset dir="webpages">
177 <include name="*.war"/>
178 </fileset>
179 </delete>
180 <delete verbose="false">
181 <fileset dir="lib">
182 <include name="dk.netarkivet.*.jar"/>
183 </fileset>
184 </delete>
185 </target>
186
187 <target name="unittest" depends="compileclean">
188 <chmod perm="+x">
189 <fileset dir="tests/dk/netarkivet/harvester/sidekick/data/">
190 <include name="*.sh"/>
191 </fileset>
192 </chmod>
193 <junit fork="true">
194 <jvmarg value="-Xmx512m"/>
195 <jvmarg value="-Djava.util.logging.config.file=tests/dk/netarkivet/testlog.prop"/>
196 <jvmarg value="-Ddk.netarkivet.jms.broker=localhost"/>
197 <classpath refid="unittest.jars.path"/>
198 <formatter type="brief" usefile="false"/>
199 <test name="dk.netarkivet.UnitTesterSuite"/>
200 </junit>
201 </target>
202
203 <target name="fulltest" depends="compileclean">
204 <junit fork="true">
205 <jvmarg value="-Xmx512m"/>
206 <jvmarg value="-Djava.util.logging.config.file=tests/dk/netarkivet/testlog.prop"/>
207 <jvmarg value="-Ddk.netarkivet.jms.broker=localhost"/>
208 <classpath refid="unittest.jars.path"/>
209 <formatter type="brief" usefile="false"/>
210 <test name="dk.netarkivet.FullTesterSuite"/>
211 </junit>
212 </target>
213
214 <target name="jarfiles" depends="commonjar, harvesterjar, archivejar, viewerproxyjar, monitorjar, deployjar">
215 </target>
216
217 <target name="warfiles" depends="clean">
218 <!-- make the WAR-files -->
219 <war destfile="${webpages}/HarvestDefinition.war" basedir="${webpages}/HarvestDefinition" update="no" webxml="${webpages}/HarvestDefinition/WEB-INF/web.xml">
220 <include name="**/*"/>
221 <exclude name="WEB-INF/web.xml"/>
222 <webinf dir="lib/taglibs">
223 <include name="*.tld"/>
224 </webinf>
225 </war>
226 <war destfile="${webpages}/History.war" basedir="${webpages}/History" update="no" webxml="${webpages}/History/WEB-INF/web.xml">
227 <include name="**/*"/>
228 <exclude name="WEB-INF/web.xml"/>
229 <webinf dir="lib/taglibs">
230 <include name="*.tld"/>
231 </webinf>
232 </war>
233 <war destfile="${webpages}/BitPreservation.war" basedir="${webpages}/BitPreservation" update="no" webxml="${webpages}/BitPreservation/WEB-INF/web.xml">
234 <include name="**/*"/>
235 <exclude name="WEB-INF/web.xml"/>
236 <webinf dir="lib/taglibs">
237 <include name="*.tld"/>
238 </webinf>
239 </war>
240 <war destfile="${webpages}/QA.war" basedir="${webpages}/QA" update="no" webxml="${webpages}/QA/WEB-INF/web.xml">
241 <include name="**/*"/>
242 <exclude name="WEB-INF/web.xml"/>
243 <webinf dir="lib/taglibs">
244 <include name="*.tld"/>
245 </webinf>
246 </war>
247 <war destfile="${webpages}/Status.war" basedir="${webpages}/Status" webxml="${webpages}/Status/WEB-INF/web.xml">
248 <include name="**/*"/>
249 <exclude name="WEB-INF/web.xml"/>
250 <webinf dir="lib/taglibs">
251 <include name="*.tld"/>
252 </webinf>
253 </war>
254 </target>
255
256 <target name="zipball" depends="jarfiles,warfiles">
257 <zip destfile="lib/WebArchive.zip">
258 <zipfileset dir=".">
259 <include name="lib/**/*.jar"/>
260 <exclude name="lib/*releasetest.jar"/>
261 <include name="manuals/INSTALL"/>
262 <include name="conf/**"/>
263 <include name="webpages/*.war"/>
264 <include name="log"/>
265 <include name="derby.properties"/>
266 <include name="scripts/xslt/addDeduplication.xslt"/>
267 <include name="scripts/xslt/addContentSize.xslt"/>
268 <include name="scripts/xslt/addQuotaEnforcerForceRetire.xslt"/>
269 <!-- Needed to fix bug 840 in production environment
270 should be removed when the script has been used in the production environment
271 -->
272 <include name="scripts/sql/resetconfigobjectlimits.sh"/>
273 </zipfileset>
274 <zipfileset dir="scripts/installation">
275 <include name="harvestdefinitionbasedir/**/*.xml"/>
276 <include name="harvestdefinitionbasedir/emptyhddb.jar"/>
277 <include name="harvestdefinitionbasedir/fullhddb.jar"/>
278 </zipfileset>
279 <zipfileset dir="scripts/make_index">
280 <include name="create_acs_idx.sh"/>
281 </zipfileset>
282 <zipfileset dir="tests/lib/db">
283 <include name="lib/db/create_acs_idx.sh"/>
284 </zipfileset>
285 <!-- include the derbytools.jar in order to use derby adminstration tool ij -->
286 <zipfileset
287 dir="."
288 includes="tests/lib/db/derbytools-10.1.1.0.jar"
289 fullpath="lib/db/derbytools-10.1.1.0.jar"
290 />
291 </zip>
292 </target>
293
294 <target name="sourcezipball" depends="compileclean">
295 <zip basedir="." destfile="lib/WebArchive.src.zip">
296 <include name="build.xml"/>
297 <include name="conf/**"/>
298 <include name="webpages/*.war"/>
299 <include name="src/**/*.java"/>
300 <include name="log"/>
301 <include name="scripts/xslt/addDeduplication.xslt"/>
302 <include name="scripts/xslt/addContentSize.xslt"/>
303 <zipfileset dir="scripts/installation">
304 <include name="harvestdefinitionbasedir/**/*.xml"/>
305 </zipfileset>
306 </zip>
307 </target>
308
309 <target name="javadoc" description=" Build the javadocs">
310 <javadoc author="false"
311 destdir="docs/apidocs"
312 packagenames="dk.netarkivet.common.*,dk.netarkivet.harvester.*,dk.netarkivet.archive.*,
313 dk.netarkivet.viewerproxy.*, dk.netarkivet.monitor.*"
314 sourcepath="src"
315 use="true"
316 version="false"
317 package="true">
318 <classpath refid="jars.path"/>
319 </javadoc>
320 </target>
321
322 <target name="releasezipball" depends="javadoc,jarfiles,warfiles">
323 <zip basedir="." destfile="NetarchiveSuite.zip">
324 <include name="docs/apidocs/**"/>
325 <include name="conf/**"/>
326 <exclude name="conf/it_conf_prod.xml"/>
327 <exclude name="conf/it_conf_pligt.xml"/>
328 <exclude name="conf/it_conf_test.xml"/>
329 <exclude name="conf/settings.xml"/>
330 <zipfileset
331 dir="."
332 includes="conf/settings_example.xml"
333 fullpath="conf/settings.xml"
334 />
335 <zipfileset
336 dir="."
337 includes="conf/it_conf_example.xml"
338 fullpath="conf/it_conf.xml"
339 />
340 <include name="harvestdefinitionbasedir/**"/>
341 <include name="lib/**"/>
342 <include name="log"/>
343 <include name="modules/**"/>
344 <include name="scripts/simple_harvest/**"/>
345 <include name="scripts/sql/create**"/>
346 <include name="src/**"/>
347 <include name="tests/**"/>
348 <exclude name="tests/compatibility"/>
349 <exclude name="tests/compatibility/**"/>
350 <include name="webpages/**"/>
351 <include name="build.xml"/>
352 <include name="derby.properties"/>
353 <include name="LICENSE.txt"/>
354 <include name="README.txt"/>
355 </zip>
356 </target>
357
358 <target name="commonjar" depends="compileclean">
359 <jar destfile="lib/dk.netarkivet.common.jar" basedir="${classdir}" update="no">
360 <include name="dk/netarkivet/common/**/*.class"/>
361 <include name="dk/netarkivet/common/**/*.properties"/>
362 <manifest>
363 <attribute name="Builder" value="${builder}"/>
364 <attribute name="Class-Path" value="${jarclasspath}"/>
365 </manifest>
366 </jar>
367 </target>
368
369 <target name="archivejar" depends="compileclean">
370 <jar destfile="lib/dk.netarkivet.archive.jar" basedir="${classdir}" update="no">
371 <include name="dk/netarkivet/archive/**/*.class"/>
372 <include name="dk/netarkivet/archive/**/*.properties"/>
373 <manifest>
374 <attribute name="Builder" value="${builder}"/>
375 <attribute name="Class-Path" value="dk.netarkivet.common.jar ${jarclasspath}"/>
376 </manifest>
377 </jar>
378 </target>
379
380 <target name="harvesterjar" depends="compileclean">
381 <copy file="conf/heritrix.properties" todir="${classdir}"/>
382 <copy todir="${classdir}">
383 <fileset dir=".">
384 <include name="modules/**"/>
385 </fileset>
386 </copy>
387
388 <jar destfile="lib/dk.netarkivet.harvester.jar" basedir="${classdir}" update="no">
389 <include name="dk/netarkivet/harvester/**/*.class"/>
390 <include name="dk/netarkivet/harvester/**/*.properties"/>
391 <include name="modules/**"/>
392 <!-- removed jndi.properties from src
393 <include name="jndi.properties"/> -->
394 <include name="heritrix.properties"/>
395 <manifest>
396 <attribute name="Builder" value="${builder}"/>
397 <attribute name="Class-Path" value="dk.netarkivet.common.jar ${jarclasspath}"/>
398 </manifest>
399 </jar>
400 </target>
401
402 <target name="viewerproxyjar" depends="compileclean">
403 <jar destfile="lib/dk.netarkivet.viewerproxy.jar" basedir="${classdir}" update="no">
404 <include name="dk/netarkivet/viewerproxy/**/*.class"/>
405 <include name="dk/netarkivet/viewerproxy/**/*.properties"/>
406 <manifest>
407 <attribute name="Builder" value="${builder}"/>
408 <attribute name="Class-Path" value="dk.netarkivet.common.jar ${jarclasspath}"/>
409 </manifest>
410 </jar>
411 </target>
412
413 <target name="monitorjar" depends="compileclean">
414 <jar destfile="lib/dk.netarkivet.monitor.jar" basedir="${classdir}" update="no">
415 <include name="dk/netarkivet/monitor/**/*.class"/>
416 <include name="dk/netarkivet/monitor/**/*.properties"/>
417 <manifest>
418 <attribute name="Builder" value="${builder}"/>
419 <attribute name="Class-Path"
420 value="dk.netarkivet.common.jar
421 ${jarclasspath}"/>
422 </manifest>
423 </jar>
424 </target>
425
426 <target name="deployjar" depends="compileclean">
427 <jar destfile="lib/dk.netarkivet.deploy.jar" basedir="${classdir}" update="no">
428 <include name="dk/netarkivet/deploy/**/*.class"/>
429 <include name="dk/netarkivet/deploy/**/*.properties"/>
430 <manifest>
431 <attribute name="Builder" value="${builder}"/>
432 <attribute name="Class-Path"
433 value="dk.netarkivet.common.jar
434 dk.netarkivet.archive.jar
435 dk.netarkivet.harvester.jar
436 dk.netarkivet.viewerproxy.jar
437 dk.netarkivet.monitor.jar
438 ${jarclasspath}"/>
439 </manifest>
440 </jar>
441 </target>
442
443 <target name="checkdep" depends="jarfiles">
444 <delete dir="${depcheckdir}" failonerror="no"/>
445 <mkdir dir="${depcheckdir}"/>
446 <javac destdir="${depcheckdir}" srcdir="tests">
447 <filename name="dk/netarkivet/common/tools/ClassDependencies.java"/>
448 </javac>
449 <java fork="yes" classname="dk.netarkivet.common.tools.ClassDependencies" logerror="yes" output="${depcheckdir}/classes">
450 <classpath>
451 <path path="${depcheckdir}"/>
452 <path path="./lib/dk.netarkivet.common.jar"/>
453 <path path="./lib/dk.netarkivet.archive.jar"/>
454 <path path="./lib/dk.netarkivet.harvester.jar"/>
455 <path path="./lib/dk.netarkivet.viewerproxy.jar"/>
456 <path path="./lib/dk.netarkivet.deploy.jar"/>
457 <path path="./lib/dk.netarkivet.monitor.jar"/>
458 <path refid="jars.path"/>
459 </classpath>
460 <arg value="dk.netarkivet.archive.arcrepository.ArcRepositoryApplication"/>
461 <arg value="dk.netarkivet.archive.bitarchive.BitarchiveApplication"/>
462 <arg value="dk.netarkivet.archive.bitarchive.BitarchiveMonitorApplication"/>
463 <arg value="dk.netarkivet.deploy.DeployApplication"/>
464 <arg value="dk.netarkivet.harvester.harvesting.HarvestControllerApplication"/>
465 <arg value="dk.netarkivet.harvester.webinterface.HarvestDefinitionApplication"/>
466 <arg value="dk.netarkivet.viewerproxy.ViewerProxyApplication"/>
467 <arg value="dk.netarkivet.harvester.sidekick.SideKick"/>
468 <arg value="-x"/>
469 <arg value="org/xml/sax"/>
470 <arg value="-x"/>
471 <arg value="com/sun/jndi/"/>
472 </java>
473 </target>
474
475 <!-- targets used for making clover-reports -->
476
477 <path id="clover.jars.path">
478 <path refid="unittest.jars.path"/>
479 <fileset dir="/home/konfig">
480 <include name=".ant/lib/clover.jar"/>
481 </fileset>
482 </path>
483
484 <target name="unittest.with.clover" depends="with.clover, compileclean">
485 <junit haltonerror="no" haltonfailure="no" fork="on" maxmemory="512m"
486 printsummary="withOutAndErr">
487 <jvmarg value="-Djava.util.logging.config.file=tests/dk/netarkivet/testlog.prop"/>
488 <jvmarg value="-Ddk.netarkivet.jms.broker=localhost"/>
489 <jvmarg value="-Ddk.netarkivet.environment.environmentName=CLOVER"/>
490 <jvmarg value="-Ddk.netarkivet.ftp.serverName=localhost"/>
491 <classpath refid="clover.jars.path"/>
492 <formatter type="brief" usefile="false"/>
493 <test name="dk.netarkivet.UnitTesterSuite"/>
494 </junit>
495 </target>
496
497 <target name="with.clover">
498 <taskdef resource="clovertasks"/>
499 <typedef resource="clovertypes"/>
500 <clover-setup initString="clover-db/mycoverage.db"
501 flushpolicy="interval" flushinterval="1000">
502 <files>
503 <exclude name="tests/**/*Tester*.java"/>
504 <exclude name="**/proxyviewer/*.java"/>
505 </files>
506
507 </clover-setup>
508 </target>
509
510 <target name="clover.report" depends="with.clover, unittest.with.clover">
511 <clover-report>
512 <current outfile="/usr/local/apache/htdocs/clover/clover_iteration5">
513 <!-- In the HTML output, put least absolute covered on top -->
514 <format type="html" orderby="ElementsUncoveredDesc"/>
515 <fileset dir="src">
516 <!-- This exclusion is strictly no longer needed, as the proxyviewer code has been removed -->
517 <exclude name="**/proxyviewer/*.java"/>
518 </fileset>
519 </current>
520 </clover-report>
521 </target>
522 </project>
Attached Files
To refer to attachments on a page, use attachment:filename, as shown below in the list of files. Do NOT use the URL of the [get] link, since this is subject to change and can break easily.You are not allowed to attach a file to this page.