From 73339aa29e85e7052f2a961b67ba1ee01cb44e4f Mon Sep 17 00:00:00 2001 From: Shuming <43642522+geshuming@users.noreply.github.com> Date: Thu, 31 Jan 2019 17:36:10 +0800 Subject: [PATCH 01/12] Timeline --- CP3108 Grader.rtf | 478 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 478 insertions(+) create mode 100644 CP3108 Grader.rtf diff --git a/CP3108 Grader.rtf b/CP3108 Grader.rtf new file mode 100644 index 0000000..471e123 --- /dev/null +++ b/CP3108 Grader.rtf @@ -0,0 +1,478 @@ +{\rtf1\ansi\ansicpg1252\uc0\stshfdbch0\stshfloch0\stshfhich0\stshfbi0\deff0\adeff0{\fonttbl{\f0\froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;}{\f1\froman\fcharset2\fprq2{\*\panose 05050102010706020507}Symbol;}{\f2\fswiss\fcharset0\fprq2{\*\panose 020b0604020202020204}Arial;}}{\colortbl;\red0\green0\blue0;\red255\green255\blue255 +;\red17\green85\blue204;\red67\green67\blue67;\red102\green102\blue102;}{\stylesheet{\s0\snext0\sqformat\spriority0\fi0\sb0\sa0\aspalpha\aspnum\adjustright\widctlpar\ltrpar\li0\lin0\ri0\rin0\ql\faauto\sl276\slmult1\rtlch\ab0\ai0\af2\afs22\ltrch\b0\i0\fs22\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 Normal;}{\s1\sbasedon0\snext0\styrsid15694742 +\sqformat\spriority0\keep\keepn\fi0\sb400\sa120\aspalpha\aspnum\adjustright\widctlpar\ltrpar\li0\lin0\ri0\rin0\ql\faauto\sl276\slmult1\rtlch\ab0\ai0\af2\afs40\ltrch\b0\i0\fs40\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 heading 1;}{\s2\sbasedon0\snext0\styrsid15694742 +\sqformat\spriority0\keep\keepn\fi0\sb360\sa120\aspalpha\aspnum\adjustright\widctlpar\ltrpar\li0\lin0\ri0\rin0\ql\faauto\sl276\slmult1\rtlch\ab0\ai0\af2\afs32\ltrch\b0\i0\fs32\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 heading 2;}{\s3\sbasedon0\snext0\styrsid15694742 +\sqformat\spriority0\keep\keepn\fi0\sb320\sa80\aspalpha\aspnum\adjustright\widctlpar\ltrpar\li0\lin0\ri0\rin0\ql\faauto\sl276\slmult1\rtlch\ab0\ai0\af2\afs28\ltrch\b0\i0\fs28\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf4 heading 3;}{\s4\sbasedon0\snext0\styrsid15694742 +\sqformat\spriority0\keep\keepn\fi0\sb280\sa80\aspalpha\aspnum\adjustright\widctlpar\ltrpar\li0\lin0\ri0\rin0\ql\faauto\sl276\slmult1\rtlch\ab0\ai0\af2\afs24\ltrch\b0\i0\fs24\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf5 heading 4;}{\s5\sbasedon0\snext0\styrsid15694742 +\sqformat\spriority0\keep\keepn\fi0\sb240\sa80\aspalpha\aspnum\adjustright\widctlpar\ltrpar\li0\lin0\ri0\rin0\ql\faauto\sl276\slmult1\rtlch\ab0\ai0\af2\afs22\ltrch\b0\i0\fs22\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf5 heading 5;}{\s6\sbasedon0\snext0\styrsid15694742 +\sqformat\spriority0\keep\keepn\fi0\sb240\sa80\aspalpha\aspnum\adjustright\widctlpar\ltrpar\li0\lin0\ri0\rin0\ql\faauto\sl276\slmult1\rtlch\ab0\ai\af2\afs22\ltrch\b0\i\fs22\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf5 heading 6;}{\*\cs10\additive\ssemihidden\spriority0 Default Paragraph Font +;}{\s15\sbasedon0\snext15\styrsid15694742\sqformat\spriority0\keep\keepn\fi0\sb0\sa60\aspalpha\aspnum\adjustright\widctlpar\ltrpar\li0\lin0\ri0\rin0\ql\faauto\sl276\slmult1\rtlch\ab0\ai0\af2\afs52\ltrch\b0\i0\fs52\loch\af2\dbch\af2\hich\f2\strike0 +\ulnone\cf1 Title;}{\s16\sbasedon0\snext16\styrsid15694742\sqformat\spriority0\keep\keepn\fi0\sb0\sa320\aspalpha\aspnum\adjustright\widctlpar\ltrpar\li0\lin0\ri0\rin0\ql\faauto\sl276\slmult1\rtlch\ab0\ai0\af2\afs30\ltrch\b0\i0\fs30\loch\af2\dbch\af2\hich\f2\strike0 +\ulnone\cf5 Subtitle;}}{\*\listtable{\list\listtemplateid1{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelstartat1{\leveltext \'01\u9679 ;}{\levelnumbers;}\levelfollow0\ulnone\jclisttab\tx360\fi-360\li720\lin720}{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelstartat1 +{\leveltext \'01\u9675 ;}{\levelnumbers;}\levelfollow0\ulnone\jclisttab\tx1080\fi-360\li1440\lin1440}{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelstartat1{\leveltext \'01\u9632 ;}{\levelnumbers;}\levelfollow0\ulnone\jclisttab\tx1800\fi-180\li2160\lin2160} +{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelstartat1{\leveltext \'01\u9679 ;}{\levelnumbers;}\levelfollow0\ulnone\jclisttab\tx2520\fi-360\li2880\lin2880}{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelstartat1{\leveltext \'01\u9675 +;}{\levelnumbers;}\levelfollow0\ulnone\jclisttab\tx3240\fi-360\li3600\lin3600}{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelstartat1{\leveltext \'01\u9632 ;}{\levelnumbers;}\levelfollow0\ulnone\jclisttab\tx3960\fi-180\li4320\lin4320}{ +\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelstartat1{\leveltext \'01\u9679 ;}{\levelnumbers;}\levelfollow0\ulnone\jclisttab\tx4680\fi-360\li5040\lin5040}{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelstartat1{\leveltext \'01\u9675 ;}{ +\levelnumbers;}\levelfollow0\ulnone\jclisttab\tx5400\fi-360\li5760\lin5760}{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelstartat1{\leveltext \'01\u9632 ;}{\levelnumbers;}\levelfollow0\ulnone\jclisttab\tx6120\fi-180\li6480\lin6480}\listid1}{\list\listtemplateid2 +{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelstartat1{\leveltext \'01-;}{\levelnumbers;}\levelfollow0\ulnone\jclisttab\tx360\fi-360\li720\lin720}{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelstartat1{\leveltext \'01-;}{ +\levelnumbers;}\levelfollow0\ulnone\jclisttab\tx1080\fi-360\li1440\lin1440}{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelstartat1{\leveltext \'01-;}{\levelnumbers;}\levelfollow0\ulnone\jclisttab\tx1800\fi-180\li2160\lin2160}{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelstartat1 +{\leveltext \'01-;}{\levelnumbers;}\levelfollow0\ulnone\jclisttab\tx2520\fi-360\li2880\lin2880}{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelstartat1{\leveltext \'01-;}{\levelnumbers;}\levelfollow0\ulnone\jclisttab\tx3240\fi-360\li3600\lin3600} +{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelstartat1{\leveltext \'01-;}{\levelnumbers;}\levelfollow0\ulnone\jclisttab\tx3960\fi-180\li4320\lin4320}{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelstartat1{\leveltext \'01-;}{ +\levelnumbers;}\levelfollow0\ulnone\jclisttab\tx4680\fi-360\li5040\lin5040}{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelstartat1{\leveltext \'01-;}{\levelnumbers;}\levelfollow0\ulnone\jclisttab\tx5400\fi-360\li5760\lin5760}{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelstartat1 +{\leveltext \'01-;}{\levelnumbers;}\levelfollow0\ulnone\jclisttab\tx6120\fi-180\li6480\lin6480}\listid2}{\list\listtemplateid3{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelstartat1{\leveltext \'01-;}{\levelnumbers;}\levelfollow0\ulnone +\jclisttab\tx360\fi-360\li720\lin720}{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelstartat1{\leveltext \'01-;}{\levelnumbers;}\levelfollow0\ulnone\jclisttab\tx1080\fi-360\li1440\lin1440}{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelstartat1 +{\leveltext \'01-;}{\levelnumbers;}\levelfollow0\ulnone\jclisttab\tx1800\fi-180\li2160\lin2160}{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelstartat1{\leveltext \'01-;}{\levelnumbers;}\levelfollow0\ulnone\jclisttab\tx2520\fi-360\li2880\lin2880} +{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelstartat1{\leveltext \'01-;}{\levelnumbers;}\levelfollow0\ulnone\jclisttab\tx3240\fi-360\li3600\lin3600}{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelstartat1{\leveltext \'01-;}{ +\levelnumbers;}\levelfollow0\ulnone\jclisttab\tx3960\fi-180\li4320\lin4320}{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelstartat1{\leveltext \'01-;}{\levelnumbers;}\levelfollow0\ulnone\jclisttab\tx4680\fi-360\li5040\lin5040}{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelstartat1 +{\leveltext \'01-;}{\levelnumbers;}\levelfollow0\ulnone\jclisttab\tx5400\fi-360\li5760\lin5760}{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelstartat1{\leveltext \'01-;}{\levelnumbers;}\levelfollow0\ulnone\jclisttab\tx6120\fi-180\li6480\lin6480}\listid3} +{\list\listtemplateid4{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelstartat1{\leveltext \'01-;}{\levelnumbers;}\levelfollow0\ulnone\jclisttab\tx360\fi-360\li720\lin720}{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelstartat1{ +\leveltext \'01-;}{\levelnumbers;}\levelfollow0\ulnone\jclisttab\tx1080\fi-360\li1440\lin1440}{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelstartat1{\leveltext \'01-;}{\levelnumbers;}\levelfollow0\ulnone\jclisttab\tx1800\fi-180\li2160\lin2160}{ +\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelstartat1{\leveltext \'01-;}{\levelnumbers;}\levelfollow0\ulnone\jclisttab\tx2520\fi-360\li2880\lin2880}{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelstartat1{\leveltext \'01-;}{\levelnumbers;}\levelfollow0 +\ulnone\jclisttab\tx3240\fi-360\li3600\lin3600}{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelstartat1{\leveltext \'01-;}{\levelnumbers;}\levelfollow0\ulnone\jclisttab\tx3960\fi-180\li4320\lin4320}{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelstartat1 +{\leveltext \'01-;}{\levelnumbers;}\levelfollow0\ulnone\jclisttab\tx4680\fi-360\li5040\lin5040}{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelstartat1{\leveltext \'01-;}{\levelnumbers;}\levelfollow0\ulnone\jclisttab\tx5400\fi-360\li5760\lin5760} +{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelstartat1{\leveltext \'01-;}{\levelnumbers;}\levelfollow0\ulnone\jclisttab\tx6120\fi-180\li6480\lin6480}\listid4}{\list\listtemplateid5{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelstartat1 +{\leveltext \'01-;}{\levelnumbers;}\levelfollow0\ulnone\jclisttab\tx360\fi-360\li720\lin720}{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelstartat1{\leveltext \'01-;}{\levelnumbers;}\levelfollow0\ulnone\jclisttab\tx1080\fi-360\li1440\lin1440} +{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelstartat1{\leveltext \'01-;}{\levelnumbers;}\levelfollow0\ulnone\jclisttab\tx1800\fi-180\li2160\lin2160}{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelstartat1{\leveltext \'01-;}{ +\levelnumbers;}\levelfollow0\ulnone\jclisttab\tx2520\fi-360\li2880\lin2880}{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelstartat1{\leveltext \'01-;}{\levelnumbers;}\levelfollow0\ulnone\jclisttab\tx3240\fi-360\li3600\lin3600}{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelstartat1 +{\leveltext \'01-;}{\levelnumbers;}\levelfollow0\ulnone\jclisttab\tx3960\fi-180\li4320\lin4320}{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelstartat1{\leveltext \'01-;}{\levelnumbers;}\levelfollow0\ulnone\jclisttab\tx4680\fi-360\li5040\lin5040} +{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelstartat1{\leveltext \'01-;}{\levelnumbers;}\levelfollow0\ulnone\jclisttab\tx5400\fi-360\li5760\lin5760}{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelstartat1{\leveltext \'01-;}{ +\levelnumbers;}\levelfollow0\ulnone\jclisttab\tx6120\fi-180\li6480\lin6480}\listid5}{\list\listtemplateid6{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelstartat1{\leveltext \'01-;}{\levelnumbers;}\levelfollow0\ulnone\jclisttab\tx360\fi-360\li720\lin720}{ +\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelstartat1{\leveltext \'01-;}{\levelnumbers;}\levelfollow0\ulnone\jclisttab\tx1080\fi-360\li1440\lin1440}{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelstartat1{\leveltext \'01-;}{\levelnumbers;}\levelfollow0 +\ulnone\jclisttab\tx1800\fi-180\li2160\lin2160}{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelstartat1{\leveltext \'01-;}{\levelnumbers;}\levelfollow0\ulnone\jclisttab\tx2520\fi-360\li2880\lin2880}{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelstartat1 +{\leveltext \'01-;}{\levelnumbers;}\levelfollow0\ulnone\jclisttab\tx3240\fi-360\li3600\lin3600}{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelstartat1{\leveltext \'01-;}{\levelnumbers;}\levelfollow0\ulnone\jclisttab\tx3960\fi-180\li4320\lin4320} +{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelstartat1{\leveltext \'01-;}{\levelnumbers;}\levelfollow0\ulnone\jclisttab\tx4680\fi-360\li5040\lin5040}{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelstartat1{\leveltext \'01-;}{ +\levelnumbers;}\levelfollow0\ulnone\jclisttab\tx5400\fi-360\li5760\lin5760}{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelstartat1{\leveltext \'01-;}{\levelnumbers;}\levelfollow0\ulnone\jclisttab\tx6120\fi-180\li6480\lin6480}\listid6}}{ +\*\listoverridetable{\listoverride\listid1\listoverridecount0\ls1}{\listoverride\listid2\listoverridecount0\ls2}{\listoverride\listid3\listoverridecount0\ls3}{\listoverride\listid4\listoverridecount0\ls4}{\listoverride\listid5\listoverridecount0\ls5}{\listoverride\listid6\listoverridecount0\ls6}}{\*\rsidtbl\rsid10976062}{\*\generator Aspose.Words for Java 13.12.0.0;}{\info\version1\edmins0\nofpages1\nofwords0\nofchars0\nofcharsws0}{\mmathPr\mbrkBin0\mbrkBinSub0\mdefJc1\mdispDef1\minterSp0\mintLim0\mintraSp0\mlMargin0\mmathFont0\mnaryLim1\mpostSp0\mpreSp0\mrMargin0\msmallFrac0\mwrapIndent1440\mwrapRight0} +\deflang1033\deflangfe2052\adeflang1025\jexpand\showxmlerrors1\validatexml1{\*\wgrffmtfilter 013f}\viewkind1\viewscale100\fet0\ftnbj\aenddoc\ftnrstcont\aftnrstcont\ftnnar\aftnnrlc\widowctrl\nospaceforul\nolnhtadjtbl\alntblind\lyttblrtgr\dntblnsbdb\noxlattoyen +\wrppunct\nobrkwrptbl\expshrtn\snaptogridincell\asianbrkrule\htmautsp\noultrlspc\useltbaln\splytwnine\ftnlytwnine\lytcalctblwd\allowfieldendsel\lnbrkrule\nouicompat\nofeaturethrottle1\formshade\nojkernpunct\dghspace180\dgvspace180\dghorigin1800\dgvorigin1440\dghshow1\dgvshow1 +\dgmargin\pgbrdrhead\pgbrdrfoot\sectd\sectlinegrid360\pgwsxn12240\pghsxn15840\marglsxn1440\margrsxn1440\margtsxn1440\margbsxn1440\guttersxn0\headery708\footery708\colsx708\ltrsect\pard\plain\itap0\s0\ilvl0\fi0\sb0\sa0\aspalpha\aspnum\adjustright\brdrt\brdrl\brdrb\brdrr\brdrbtw\brdrbar +\widctlpar\ltrpar\li0\lin0\ri0\rin0\qc\faauto\sl276\slmult1\rtlch\ab0\ai0\af2\afs22\ltrch\b0\i0\fs22\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1{\rtlch\ab\ai0\af2\afs26\ltrch\b\i0\fs26\loch\af2\dbch\af2\hich\f2\strike0\ul\cf1\chshdng10000\chcbpat2\chcfpat2 CP}{ +\rtlch\ab\ai0\af2\afs26\ltrch\b\i0\fs26\loch\af2\dbch\af2\hich\f2\strike0\ul\cf1\chshdng10000\chcbpat2\chcfpat2 3108 }{\rtlch\ab\ai0\af2\afs26\ltrch\b\i0\fs26\loch\af2\dbch\af2\hich\f2\strike0\ul\cf1\chshdng10000\chcbpat2\chcfpat2 Independent}{\rtlch\ab\ai0\af2\afs26 +\ltrch\b\i0\fs26\loch\af2\dbch\af2\hich\f2\strike0\ul\cf1\chshdng10000\chcbpat2\chcfpat2 }{\rtlch\ab\ai0\af2\afs26\ltrch\b\i0\fs26\loch\af2\dbch\af2\hich\f2\strike0\ul\cf1\chshdng10000\chcbpat2\chcfpat2 Work}{\rtlch\ab\ai0\af2\afs26\ltrch\b\i0\fs26\loch\af2 +\dbch\af2\hich\f2\insrsid10976062\strike0\ul\cf1\chshdng10000\chcbpat2\chcfpat2\par}\pard\plain\itap0\s0\ilvl0\fi0\sb0\sa0\aspalpha\aspnum\adjustright\brdrt\brdrl\brdrb\brdrr\brdrbtw\brdrbar\widctlpar\ltrpar\li0\lin0\ri0\rin0\qc\faauto\sl276\slmult1\rtlch\ab0\ai0\af2\afs22 +\ltrch\b0\i0\fs22\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1{\rtlch\ab\ai0\af2\afs20\ltrch\b\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1\chshdng10000\chcbpat2\chcfpat2 Preliminary}{\rtlch\ab\ai0\af2\afs20\ltrch\b\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0 +\ulnone\cf1\chshdng10000\chcbpat2\chcfpat2 }{\rtlch\ab\ai0\af2\afs20\ltrch\b\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1\chshdng10000\chcbpat2\chcfpat2 Project}{\rtlch\ab\ai0\af2\afs20\ltrch\b\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1\chshdng10000\chcbpat2\chcfpat2 } +{\rtlch\ab\ai0\af2\afs20\ltrch\b\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1\chshdng10000\chcbpat2\chcfpat2 Proposal}{\rtlch\ab\ai0\af2\afs20\ltrch\b\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1\chshdng10000\chcbpat2\chcfpat2 - }{ +\rtlch\ab\ai0\af2\afs20\ltrch\b\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1\chshdng10000\chcbpat2\chcfpat2 Improvements}{\rtlch\ab\ai0\af2\afs20\ltrch\b\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1\chshdng10000\chcbpat2\chcfpat2 }{\rtlch\ab\ai0\af2\afs20 +\ltrch\b\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1\chshdng10000\chcbpat2\chcfpat2 to}{\rtlch\ab\ai0\af2\afs20\ltrch\b\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1\chshdng10000\chcbpat2\chcfpat2 }{\rtlch\ab\ai0\af2\afs20\ltrch\b\i0\fs20 +\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1\chshdng10000\chcbpat2\chcfpat2 Source}{\rtlch\ab\ai0\af2\afs20\ltrch\b\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1\chshdng10000\chcbpat2\chcfpat2 }{\rtlch\ab\ai0\af2\afs20\ltrch\b\i0\fs20\loch\af2\dbch\af2 +\hich\f2\strike0\ulnone\cf1\chshdng10000\chcbpat2\chcfpat2 Academy}{\rtlch\ab\ai0\af2\afs20\ltrch\b\i0\fs20\loch\af2\dbch\af2\hich\f2\insrsid10976062\strike0\ulnone\cf1\chshdng10000\chcbpat2\chcfpat2\par}\pard\plain\itap0\s0\ilvl0\fi0\sb0\sa0\aspalpha\aspnum +\adjustright\brdrt\brdrl\brdrb\brdrr\brdrbtw\brdrbar\widctlpar\ltrpar\li0\lin0\ri0\rin0\qc\faauto\sl276\slmult1\rtlch\ab0\ai0\af2\afs22\ltrch\b0\i0\fs22\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1{\rtlch\ab\ai0\af2\afs20\ltrch\b\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0 +\ulnone\cf1\chshdng10000\chcbpat2\chcfpat2 Project}{\rtlch\ab\ai0\af2\afs20\ltrch\b\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1\chshdng10000\chcbpat2\chcfpat2 }{\rtlch\ab\ai0\af2\afs20\ltrch\b\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1\chshdng10000\chcbpat2\chcfpat2 GRADING} +{\rtlch\ab\ai0\af2\afs20\ltrch\b\i0\fs20\loch\af2\dbch\af2\hich\f2\insrsid10976062\strike0\ulnone\cf1\chshdng10000\chcbpat2\chcfpat2\par}\pard\plain\itap0\s0\ilvl0\fi0\sb0\sa0\aspalpha\aspnum\adjustright\brdrt\brdrl\brdrb\brdrr\brdrbtw\brdrbar\widctlpar +\ltrpar\li0\lin0\ri0\rin0\ql\faauto\sl276\slmult1\rtlch\ab0\ai0\af2\afs22\ltrch\b0\i0\fs22\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\insrsid10976062\strike0\ulnone\cf1\chshdng10000\chcbpat2\chcfpat2 +\par}\pard\plain\itap0\s0\ilvl0\fi0\sb0\sa0\aspalpha\aspnum\adjustright\brdrt\brdrl\brdrb\brdrr\brdrbtw\brdrbar\widctlpar\ltrpar\li0\lin0\ri0\rin0\ql\faauto\sl276\slmult1\rtlch\ab0\ai0\af2\afs22\ltrch\b0\i0\fs22\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1{ +\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1\chshdng10000\chcbpat2\chcfpat2 Student}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1\chshdng10000\chcbpat2\chcfpat2 }{\rtlch\ab0\ai0\af2\afs20 +\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1\chshdng10000\chcbpat2\chcfpat2 names}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1\chshdng10000\chcbpat2\chcfpat2 :}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20 +\loch\af2\dbch\af2\hich\f2\insrsid10976062\strike0\ulnone\cf1\chshdng10000\chcbpat2\chcfpat2\par}\pard\plain\itap0\s0\ilvl0\fi0\sb0\sa0\aspalpha\aspnum\adjustright\brdrt\brdrl\brdrb\brdrr\brdrbtw\brdrbar\widctlpar\ltrpar\li0\lin0\ri0\rin0\ql\faauto\sl276 +\slmult1\rtlch\ab0\ai0\af2\afs22\ltrch\b0\i0\fs22\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1\chshdng10000\chcbpat2\chcfpat2 Ge}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20 +\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1\chshdng10000\chcbpat2\chcfpat2 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1\chshdng10000\chcbpat2\chcfpat2 Shuming}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2 +\dbch\af2\hich\f2\insrsid10976062\strike0\ulnone\cf1\chshdng10000\chcbpat2\chcfpat2\par}\pard\plain\itap0\s0\ilvl0\fi0\sb0\sa0\aspalpha\aspnum\adjustright\brdrt\brdrl\brdrb\brdrr\brdrbtw\brdrbar\widctlpar\ltrpar\li0\lin0\ri0\rin0\ql\faauto\sl276\slmult1 +\rtlch\ab0\ai0\af2\afs22\ltrch\b0\i0\fs22\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1\chshdng10000\chcbpat2\chcfpat2 Keven}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2 +\dbch\af2\hich\f2\strike0\ulnone\cf1\chshdng10000\chcbpat2\chcfpat2 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1\chshdng10000\chcbpat2\chcfpat2 Loo}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0 +\ulnone\cf1\chshdng10000\chcbpat2\chcfpat2 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1\chshdng10000\chcbpat2\chcfpat2 Yuquan}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\insrsid10976062\strike0 +\ulnone\cf1\chshdng10000\chcbpat2\chcfpat2\par}\pard\plain\itap0\s0\ilvl0\fi0\sb0\sa0\aspalpha\aspnum\adjustright\brdrt\brdrl\brdrb\brdrr\brdrbtw\brdrbar\widctlpar\ltrpar\li0\lin0\ri0\rin0\ql\faauto\sl276\slmult1\rtlch\ab0\ai0\af2\afs22\ltrch\b0\i0\fs22\loch\af2 +\dbch\af2\hich\f2\strike0\ulnone\cf1{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\insrsid10976062\strike0\ulnone\cf1\chshdng10000\chcbpat2\chcfpat2\par}\pard\plain\itap0\s0\ilvl0\fi0\sb0\sa0\aspalpha\aspnum\adjustright\brdrt\brdrl +\brdrb\brdrr\brdrbtw\brdrbar\widctlpar\ltrpar\li0\lin0\ri0\rin0\ql\faauto\sl276\slmult1\rtlch\ab0\ai0\af2\afs22\ltrch\b0\i0\fs22\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1\chshdng10000\chcbpat2\chcfpat2 Project} +{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1\chshdng10000\chcbpat2\chcfpat2 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1\chshdng10000\chcbpat2\chcfpat2 repositories}{ +\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1\chshdng10000\chcbpat2\chcfpat2 :}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\insrsid10976062\strike0\ulnone\cf1\chshdng10000\chcbpat2\chcfpat2\par} +\pard\plain\itap0\s0\ilvl0\fi0\sb0\sa0\aspalpha\aspnum\adjustright\brdrt\brdrl\brdrb\brdrr\brdrbtw\brdrbar\widctlpar\ltrpar\li0\lin0\ri0\rin0\ql\faauto\sl276\slmult1\rtlch\ab0\ai0\af2\afs22\ltrch\b0\i0\fs22\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1{\rtlch\ab0\ai0\af2\afs20 +\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1\chshdng10000\chcbpat2\chcfpat2 geshuming}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1\chshdng10000\chcbpat2\chcfpat2 /}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20 +\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1\chshdng10000\chcbpat2\chcfpat2 cadet}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1\chshdng10000\chcbpat2\chcfpat2 -}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2 +\dbch\af2\hich\f2\strike0\ulnone\cf1\chshdng10000\chcbpat2\chcfpat2 frontend}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1\chshdng10000\chcbpat2\chcfpat2 : }{\field{\*\fldinst{\rtlch\ab0\ai0\af2\afs22\ltrch\b0\i0\fs22 +\loch\af2\dbch\af2\hich\f2\insrsid10976062\strike0\ulnone\cf1 HYPERLINK "https://github.com/geshuming/cadet-frontend"}}{\fldrslt{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ul\cf3\chshdng10000\chcbpat2\chcfpat2 https}}}{\field{ +\*\fldinst{\rtlch\ab0\ai0\af2\afs22\ltrch\b0\i0\fs22\loch\af2\dbch\af2\hich\f2\insrsid10976062\strike0\ulnone\cf1 HYPERLINK "https://github.com/geshuming/cadet-frontend"}}{\fldrslt{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ul\cf3\chshdng10000\chcbpat2\chcfpat2 ://}}} +{\field{\*\fldinst{\rtlch\ab0\ai0\af2\afs22\ltrch\b0\i0\fs22\loch\af2\dbch\af2\hich\f2\insrsid10976062\strike0\ulnone\cf1 HYPERLINK "https://github.com/geshuming/cadet-frontend"}}{\fldrslt{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0 +\ul\cf3\chshdng10000\chcbpat2\chcfpat2 github}}}{\field{\*\fldinst{\rtlch\ab0\ai0\af2\afs22\ltrch\b0\i0\fs22\loch\af2\dbch\af2\hich\f2\insrsid10976062\strike0\ulnone\cf1 HYPERLINK "https://github.com/geshuming/cadet-frontend"}}{\fldrslt{\rtlch\ab0\ai0\af2\afs20 +\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ul\cf3\chshdng10000\chcbpat2\chcfpat2 .}}}{\field{\*\fldinst{\rtlch\ab0\ai0\af2\afs22\ltrch\b0\i0\fs22\loch\af2\dbch\af2\hich\f2\insrsid10976062\strike0\ulnone\cf1 HYPERLINK "https://github.com/geshuming/cadet-frontend"}} +{\fldrslt{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ul\cf3\chshdng10000\chcbpat2\chcfpat2 com}}}{\field{\*\fldinst{\rtlch\ab0\ai0\af2\afs22\ltrch\b0\i0\fs22\loch\af2\dbch\af2\hich\f2\insrsid10976062\strike0\ulnone\cf1 HYPERLINK "https://github.com/geshuming/cadet-frontend"}} +{\fldrslt{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ul\cf3\chshdng10000\chcbpat2\chcfpat2 /}}}{\field{\*\fldinst{\rtlch\ab0\ai0\af2\afs22\ltrch\b0\i0\fs22\loch\af2\dbch\af2\hich\f2\insrsid10976062\strike0\ulnone\cf1 HYPERLINK "https://github.com/geshuming/cadet-frontend"}} +{\fldrslt{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ul\cf3\chshdng10000\chcbpat2\chcfpat2 geshuming}}}{\field{\*\fldinst{\rtlch\ab0\ai0\af2\afs22\ltrch\b0\i0\fs22\loch\af2\dbch\af2\hich\f2\insrsid10976062\strike0\ulnone\cf1 HYPERLINK "https://github.com/geshuming/cadet-frontend"}} +{\fldrslt{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ul\cf3\chshdng10000\chcbpat2\chcfpat2 /}}}{\field{\*\fldinst{\rtlch\ab0\ai0\af2\afs22\ltrch\b0\i0\fs22\loch\af2\dbch\af2\hich\f2\insrsid10976062\strike0\ulnone\cf1 HYPERLINK "https://github.com/geshuming/cadet-frontend"}} +{\fldrslt{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ul\cf3\chshdng10000\chcbpat2\chcfpat2 cadet}}}{\field{\*\fldinst{\rtlch\ab0\ai0\af2\afs22\ltrch\b0\i0\fs22\loch\af2\dbch\af2\hich\f2\insrsid10976062\strike0\ulnone\cf1 HYPERLINK "https://github.com/geshuming/cadet-frontend"}} +{\fldrslt{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ul\cf3\chshdng10000\chcbpat2\chcfpat2 -}}}{\field{\*\fldinst{\rtlch\ab0\ai0\af2\afs22\ltrch\b0\i0\fs22\loch\af2\dbch\af2\hich\f2\insrsid10976062\strike0\ulnone\cf1 HYPERLINK "https://github.com/geshuming/cadet-frontend"}} +{\fldrslt{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ul\cf3\chshdng10000\chcbpat2\chcfpat2 frontend}}}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\insrsid10976062\strike0\ulnone\cf1\chshdng10000\chcbpat2\chcfpat2 +\par}\pard\plain\itap0\s0\ilvl0\fi0\sb0\sa0\aspalpha\aspnum\adjustright\brdrt\brdrl\brdrb\brdrr\brdrbtw\brdrbar\widctlpar\ltrpar\li0\lin0\ri0\rin0\ql\faauto\sl276\slmult1\rtlch\ab0\ai0\af2\afs22\ltrch\b0\i0\fs22\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1{ +\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1\chshdng10000\chcbpat2\chcfpat2 geshuming}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1\chshdng10000\chcbpat2\chcfpat2 /}{\rtlch\ab0\ai0\af2\afs20 +\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1\chshdng10000\chcbpat2\chcfpat2 cadet}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1\chshdng10000\chcbpat2\chcfpat2 (}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20 +\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1\chshdng10000\chcbpat2\chcfpat2 backend}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1\chshdng10000\chcbpat2\chcfpat2 ): }{\field{\*\fldinst{\rtlch\ab0\ai0\af2\afs22\ltrch\b0\i0\fs22 +\loch\af2\dbch\af2\hich\f2\insrsid10976062\strike0\ulnone\cf1 HYPERLINK "https://github.com/geshuming/cadet"}}{\fldrslt{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ul\cf3\chshdng10000\chcbpat2\chcfpat2 https}}}{\field{ +\*\fldinst{\rtlch\ab0\ai0\af2\afs22\ltrch\b0\i0\fs22\loch\af2\dbch\af2\hich\f2\insrsid10976062\strike0\ulnone\cf1 HYPERLINK "https://github.com/geshuming/cadet"}}{\fldrslt{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ul\cf3\chshdng10000\chcbpat2\chcfpat2 ://}}} +{\field{\*\fldinst{\rtlch\ab0\ai0\af2\afs22\ltrch\b0\i0\fs22\loch\af2\dbch\af2\hich\f2\insrsid10976062\strike0\ulnone\cf1 HYPERLINK "https://github.com/geshuming/cadet"}}{\fldrslt{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0 +\ul\cf3\chshdng10000\chcbpat2\chcfpat2 github}}}{\field{\*\fldinst{\rtlch\ab0\ai0\af2\afs22\ltrch\b0\i0\fs22\loch\af2\dbch\af2\hich\f2\insrsid10976062\strike0\ulnone\cf1 HYPERLINK "https://github.com/geshuming/cadet"}}{\fldrslt{\rtlch\ab0\ai0\af2\afs20 +\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ul\cf3\chshdng10000\chcbpat2\chcfpat2 .}}}{\field{\*\fldinst{\rtlch\ab0\ai0\af2\afs22\ltrch\b0\i0\fs22\loch\af2\dbch\af2\hich\f2\insrsid10976062\strike0\ulnone\cf1 HYPERLINK "https://github.com/geshuming/cadet"}} +{\fldrslt{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ul\cf3\chshdng10000\chcbpat2\chcfpat2 com}}}{\field{\*\fldinst{\rtlch\ab0\ai0\af2\afs22\ltrch\b0\i0\fs22\loch\af2\dbch\af2\hich\f2\insrsid10976062\strike0\ulnone\cf1 HYPERLINK "https://github.com/geshuming/cadet"}} +{\fldrslt{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ul\cf3\chshdng10000\chcbpat2\chcfpat2 /}}}{\field{\*\fldinst{\rtlch\ab0\ai0\af2\afs22\ltrch\b0\i0\fs22\loch\af2\dbch\af2\hich\f2\insrsid10976062\strike0\ulnone\cf1 HYPERLINK "https://github.com/geshuming/cadet"}} +{\fldrslt{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ul\cf3\chshdng10000\chcbpat2\chcfpat2 geshuming}}}{\field{\*\fldinst{\rtlch\ab0\ai0\af2\afs22\ltrch\b0\i0\fs22\loch\af2\dbch\af2\hich\f2\insrsid10976062\strike0\ulnone\cf1 HYPERLINK "https://github.com/geshuming/cadet"}} +{\fldrslt{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ul\cf3\chshdng10000\chcbpat2\chcfpat2 /}}}{\field{\*\fldinst{\rtlch\ab0\ai0\af2\afs22\ltrch\b0\i0\fs22\loch\af2\dbch\af2\hich\f2\insrsid10976062\strike0\ulnone\cf1 HYPERLINK "https://github.com/geshuming/cadet"}} +{\fldrslt{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ul\cf3\chshdng10000\chcbpat2\chcfpat2 cadet}}}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\insrsid10976062\strike0\ulnone\cf1\chshdng10000\chcbpat2\chcfpat2 +\par}\pard\plain\itap0\s0\ilvl0\fi0\sb0\sa0\aspalpha\aspnum\adjustright\brdrt\brdrl\brdrb\brdrr\brdrbtw\brdrbar\widctlpar\ltrpar\li0\lin0\ri0\rin0\ql\faauto\sl276\slmult1\rtlch\ab0\ai0\af2\afs22\ltrch\b0\i0\fs22\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1{ +\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1\chshdng10000\chcbpat2\chcfpat2 geshuming}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1\chshdng10000\chcbpat2\chcfpat2 /}{\rtlch\ab0\ai0\af2\afs20 +\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1\chshdng10000\chcbpat2\chcfpat2 grader}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1\chshdng10000\chcbpat2\chcfpat2 : }{\field{\*\fldinst{\rtlch\ab0\ai0\af2\afs22 +\ltrch\b0\i0\fs22\loch\af2\dbch\af2\hich\f2\insrsid10976062\strike0\ulnone\cf1 HYPERLINK "https://github.com/geshuming/grader"}}{\fldrslt{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ul\cf3\chshdng10000\chcbpat2\chcfpat2 https}}} +{\field{\*\fldinst{\rtlch\ab0\ai0\af2\afs22\ltrch\b0\i0\fs22\loch\af2\dbch\af2\hich\f2\insrsid10976062\strike0\ulnone\cf1 HYPERLINK "https://github.com/geshuming/grader"}}{\fldrslt{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0 +\ul\cf3\chshdng10000\chcbpat2\chcfpat2 ://}}}{\field{\*\fldinst{\rtlch\ab0\ai0\af2\afs22\ltrch\b0\i0\fs22\loch\af2\dbch\af2\hich\f2\insrsid10976062\strike0\ulnone\cf1 HYPERLINK "https://github.com/geshuming/grader"}}{\fldrslt{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20 +\loch\af2\dbch\af2\hich\f2\strike0\ul\cf3\chshdng10000\chcbpat2\chcfpat2 github}}}{\field{\*\fldinst{\rtlch\ab0\ai0\af2\afs22\ltrch\b0\i0\fs22\loch\af2\dbch\af2\hich\f2\insrsid10976062\strike0\ulnone\cf1 HYPERLINK "https://github.com/geshuming/grader"}}{ +\fldrslt{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ul\cf3\chshdng10000\chcbpat2\chcfpat2 .}}}{\field{\*\fldinst{\rtlch\ab0\ai0\af2\afs22\ltrch\b0\i0\fs22\loch\af2\dbch\af2\hich\f2\insrsid10976062\strike0\ulnone\cf1 HYPERLINK "https://github.com/geshuming/grader"}} +{\fldrslt{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ul\cf3\chshdng10000\chcbpat2\chcfpat2 com}}}{\field{\*\fldinst{\rtlch\ab0\ai0\af2\afs22\ltrch\b0\i0\fs22\loch\af2\dbch\af2\hich\f2\insrsid10976062\strike0\ulnone\cf1 HYPERLINK "https://github.com/geshuming/grader"}} +{\fldrslt{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ul\cf3\chshdng10000\chcbpat2\chcfpat2 /}}}{\field{\*\fldinst{\rtlch\ab0\ai0\af2\afs22\ltrch\b0\i0\fs22\loch\af2\dbch\af2\hich\f2\insrsid10976062\strike0\ulnone\cf1 HYPERLINK "https://github.com/geshuming/grader"}} +{\fldrslt{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ul\cf3\chshdng10000\chcbpat2\chcfpat2 geshuming}}}{\field{\*\fldinst{\rtlch\ab0\ai0\af2\afs22\ltrch\b0\i0\fs22\loch\af2\dbch\af2\hich\f2\insrsid10976062\strike0\ulnone\cf1 HYPERLINK "https://github.com/geshuming/grader"}} +{\fldrslt{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ul\cf3\chshdng10000\chcbpat2\chcfpat2 /}}}{\field{\*\fldinst{\rtlch\ab0\ai0\af2\afs22\ltrch\b0\i0\fs22\loch\af2\dbch\af2\hich\f2\insrsid10976062\strike0\ulnone\cf1 HYPERLINK "https://github.com/geshuming/grader"}} +{\fldrslt{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ul\cf3\chshdng10000\chcbpat2\chcfpat2 grader}}}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\insrsid10976062\strike0\ulnone\cf1\chshdng10000\chcbpat2\chcfpat2 +\par}\pard\plain\itap0\s0\ilvl0\fi0\sb0\sa0\aspalpha\aspnum\adjustright\brdrt\brdrl\brdrb\brdrr\brdrbtw\brdrbar\widctlpar\ltrpar\li0\lin0\ri0\rin0\ql\faauto\sl276\slmult1\rtlch\ab0\ai0\af2\afs22\ltrch\b0\i0\fs22\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1{ +\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\insrsid10976062\strike0\ulnone\cf1\chshdng10000\chcbpat2\chcfpat2\par}\pard\plain\itap0\s0\ilvl0\fi0\sb0\sa0\aspalpha\aspnum\adjustright\brdrt\brdrl\brdrb\brdrr\brdrbtw\brdrbar\widctlpar +\ltrpar\li0\lin0\ri0\rin0\ql\faauto\sl276\slmult1\rtlch\ab0\ai0\af2\afs22\ltrch\b0\i0\fs22\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1\chshdng10000\chcbpat2\chcfpat2 Resources} +{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1\chshdng10000\chcbpat2\chcfpat2 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1\chshdng10000\chcbpat2\chcfpat2 and}{\rtlch\ab0\ai0\af2\afs20 +\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1\chshdng10000\chcbpat2\chcfpat2 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1\chshdng10000\chcbpat2\chcfpat2 dependencies}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20 +\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1\chshdng10000\chcbpat2\chcfpat2 :}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\insrsid10976062\strike0\ulnone\cf1\chshdng10000\chcbpat2\chcfpat2\par}\pard\plain\itap0\s0\ilvl0\ls1\tx360\tx720\fi-360\sb0\sa0 +\aspalpha\aspnum\adjustright\brdrt\brdrl\brdrb\brdrr\brdrbtw\brdrbar\widctlpar\ltrpar\li720\lin720\ri0\rin0\ql\faauto\sl276\slmult1\rtlch\ab0\ai0\af2\afs22\ltrch\b0\i0\fs22\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1{\listtext\pard\plain\tx360\fi-360\aspalpha +\aspnum\adjustright\ltrpar\li720\lin720\ri0\rin0\ql\faauto\rtlch\ab0\ai0\af2\afs20\ltrch\fs20\loch\af2\dbch\af2\hich\f2\insrsid10976062\strike0\ulnone\cf1 \u9679 \tab }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1\chshdng10000\chcbpat2\chcfpat2 Frontend} +{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1\chshdng10000\chcbpat2\chcfpat2 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1\chshdng10000\chcbpat2\chcfpat2 development}{ +\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1\chshdng10000\chcbpat2\chcfpat2 : }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1\chshdng10000\chcbpat2\chcfpat2 React}{\rtlch\ab0\ai0\af2\afs20 +\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1\chshdng10000\chcbpat2\chcfpat2 /}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1\chshdng10000\chcbpat2\chcfpat2 JS}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20 +\loch\af2\dbch\af2\hich\f2\insrsid10976062\strike0\ulnone\cf1\chshdng10000\chcbpat2\chcfpat2\par}\pard\plain\itap0\s0\ilvl0\ls1\tx360\tx720\fi-360\sb0\sa0\aspalpha\aspnum\adjustright\brdrt\brdrl\brdrb\brdrr\brdrbtw\brdrbar\widctlpar\ltrpar\li720\lin720\ri0\rin0 +\ql\faauto\sl276\slmult1\rtlch\ab0\ai0\af2\afs22\ltrch\b0\i0\fs22\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1{\listtext\pard\plain\tx360\fi-360\aspalpha\aspnum\adjustright\ltrpar\li720\lin720\ri0\rin0\ql\faauto\rtlch\ab0\ai0\af2\afs20\ltrch\fs20\loch\af2 +\dbch\af2\hich\f2\insrsid10976062\strike0\ulnone\cf1 \u9679 \tab }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1\chshdng10000\chcbpat2\chcfpat2 Backend}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0 +\ulnone\cf1\chshdng10000\chcbpat2\chcfpat2 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1\chshdng10000\chcbpat2\chcfpat2 development}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1\chshdng10000\chcbpat2\chcfpat2 : } +{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1\chshdng10000\chcbpat2\chcfpat2 Elixir}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1\chshdng10000\chcbpat2\chcfpat2 , }{ +\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1\chshdng10000\chcbpat2\chcfpat2 PostgreSQL}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\insrsid10976062\strike0\ulnone\cf1\chshdng10000\chcbpat2\chcfpat2 +\par}\pard\plain\itap0\s0\ilvl0\ls1\tx360\tx720\fi-360\sb0\sa0\aspalpha\aspnum\adjustright\brdrt\brdrl\brdrb\brdrr\brdrbtw\brdrbar\widctlpar\ltrpar\li720\lin720\ri0\rin0\ql\faauto\sl276\slmult1\rtlch\ab0\ai0\af2\afs22\ltrch\b0\i0\fs22\loch\af2\dbch\af2\hich\f2\strike0 +\ulnone\cf1{\listtext\pard\plain\tx360\fi-360\aspalpha\aspnum\adjustright\ltrpar\li720\lin720\ri0\rin0\ql\faauto\rtlch\ab0\ai0\af2\afs20\ltrch\fs20\loch\af2\dbch\af2\hich\f2\insrsid10976062\strike0\ulnone\cf1 \u9679 \tab }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20 +\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1\chshdng10000\chcbpat2\chcfpat2 Grader}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1\chshdng10000\chcbpat2\chcfpat2 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2 +\dbch\af2\hich\f2\strike0\ulnone\cf1\chshdng10000\chcbpat2\chcfpat2 development}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1\chshdng10000\chcbpat2\chcfpat2 : }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2 +\hich\f2\strike0\ulnone\cf1\chshdng10000\chcbpat2\chcfpat2 Python}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1\chshdng10000\chcbpat2\chcfpat2 , }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0 +\ulnone\cf1\chshdng10000\chcbpat2\chcfpat2 XML}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\insrsid10976062\strike0\ulnone\cf1\chshdng10000\chcbpat2\chcfpat2\par}\pard\plain\itap0\s0\ilvl0\ls1\tx360\tx720\fi-360\sb0\sa0\aspalpha\aspnum +\adjustright\brdrt\brdrl\brdrb\brdrr\brdrbtw\brdrbar\widctlpar\ltrpar\li720\lin720\ri0\rin0\ql\faauto\sl276\slmult1\rtlch\ab0\ai0\af2\afs22\ltrch\b0\i0\fs22\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1{\listtext\pard\plain\tx360\fi-360\aspalpha\aspnum\adjustright +\ltrpar\li720\lin720\ri0\rin0\ql\faauto\rtlch\ab0\ai0\af2\afs20\ltrch\fs20\loch\af2\dbch\af2\hich\f2\insrsid10976062\strike0\ulnone\cf1 \u9679 \tab }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1\chshdng10000\chcbpat2\chcfpat2 Dependencies} +{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1\chshdng10000\chcbpat2\chcfpat2 : }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1\chshdng10000\chcbpat2\chcfpat2 NIL}{\rtlch\ab0\ai0\af2\afs20 +\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\insrsid10976062\strike0\ulnone\cf1\chshdng10000\chcbpat2\chcfpat2\par}\pard\plain\itap0\s0\ilvl0\fi0\sb0\sa0\aspalpha\aspnum\adjustright\brdrt\brdrl\brdrb\brdrr\brdrbtw\brdrbar\widctlpar\ltrpar\li0\lin0\ri0\rin0\ql +\faauto\sl276\slmult1\rtlch\ab0\ai0\af2\afs22\ltrch\b0\i0\fs22\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\insrsid10976062\strike0\ulnone\cf1\par}\pard\plain\itap0\s0\ilvl0\fi0\sb0\sa0 +\aspalpha\aspnum\adjustright\brdrt\brdrl\brdrb\brdrr\brdrbtw\brdrbar\widctlpar\ltrpar\li0\lin0\ri0\rin0\ql\faauto\sl276\slmult1\rtlch\ab0\ai0\af2\afs22\ltrch\b0\i0\fs22\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2 +\dbch\af2\hich\f2\insrsid10976062\strike0\ulnone\cf1\par}\trowd\irow0\irowband0\ltrrow\trql\trgaph108\trpaddl108\trpaddfl3\trbrdrt\brdrs\brdrw10\brdrcf0\brsp0\trbrdrl\brdrs\brdrw10\brdrcf0\brsp0\trbrdrb\brdrs\brdrw10\brdrcf0\brsp0\trbrdrr\brdrs\brdrw10\brdrcf0\brsp0\trbrdrh\brdrs\brdrw10\brdrcf0\brsp0\trbrdrv +\brdrs\brdrw10\brdrcf0\brsp0\trwWidth5000\trftsWidth2\trautofit1\trwWidthB0\trftsWidthB3\trpaddt0\trpaddft3\trpaddb0\trpaddfb3\trpaddr108\trpaddfr3\trrh0\trleft-100\clftsWidth1\clvertalt\clpadl100\clpadfl3\clpadb100\clpadfb3\clpadt100\clpadft3\clpadr100 +\clpadfr3\clbrdrl\brdrs\brdrw20\brdrcf1\brsp0\clbrdrr\brdrs\brdrw20\brdrcf1\brsp0\clbrdrt\brdrs\brdrw20\brdrcf1\brsp0\clbrdrb\brdrs\brdrw20\brdrcf1\brsp0\cldgll\brdrnone\cldglu\brdrnone\cellx5660\clftsWidth1\clvertalt\clpadl100\clpadfl3\clpadb100\clpadfb3\clpadt100 +\clpadft3\clpadr100\clpadfr3\clbrdrl\brdrs\brdrw20\brdrcf1\brsp0\clbrdrr\brdrs\brdrw20\brdrcf1\brsp0\clbrdrt\brdrs\brdrw20\brdrcf1\brsp0\clbrdrb\brdrs\brdrw20\brdrcf1\brsp0\cldgll\brdrnone\cldglu\brdrnone\cellx7475\clftsWidth1\clvertalt\clpadl100\clpadfl3\clpadb100 +\clpadfb3\clpadt100\clpadft3\clpadr100\clpadfr3\clbrdrl\brdrs\brdrw20\brdrcf1\brsp0\clbrdrr\brdrs\brdrw20\brdrcf1\brsp0\clbrdrt\brdrs\brdrw20\brdrcf1\brsp0\clbrdrb\brdrs\brdrw20\brdrcf1\brsp0\cldgll\brdrnone\cldglu\brdrnone\cellx9260\pard\plain\intbl\itap1\s0\ilvl0\fi0\sb0\sa0\aspalpha\aspnum\adjustright\brdrt\brdrl\brdrb\brdrr\brdrbtw\brdrbar\nowidctlpar\ltrpar\li0\lin0\ri0\rin0\ql\faauto\sl240\slmult1\rtlch\ab0\ai0\af2\afs22\ltrch\b0\i0\fs22\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 +{\rtlch\ab\ai0\af2\afs20\ltrch\b\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 Change}{\rtlch\ab\ai0\af2\afs20\ltrch\b\i0\fs20\loch\af2\dbch\af2\hich\f2\insrsid10976062\strike0\ulnone\cf1\cell}\pard\plain\intbl\itap1\s0\ilvl0\fi0\sb0\sa0\aspalpha +\aspnum\adjustright\brdrt\brdrl\brdrb\brdrr\brdrbtw\brdrbar\nowidctlpar\ltrpar\li0\lin0\ri0\rin0\ql\faauto\sl240\slmult1\rtlch\ab0\ai0\af2\afs22\ltrch\b0\i0\fs22\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1{\rtlch\ab\ai0\af2\afs20\ltrch\b\i0\fs20\loch\af2\dbch\af2 +\hich\f2\strike0\ulnone\cf1 Requirements}{\rtlch\ab\ai0\af2\afs20\ltrch\b\i0\fs20\loch\af2\dbch\af2\hich\f2\insrsid10976062\strike0\ulnone\cf1\cell}\pard\plain\intbl\itap1\s0\ilvl0\fi0\sb0\sa0\aspalpha\aspnum\adjustright\brdrt\brdrl\brdrb\brdrr\brdrbtw +\brdrbar\nowidctlpar\ltrpar\li0\lin0\ri0\rin0\ql\faauto\sl240\slmult1\rtlch\ab0\ai0\af2\afs22\ltrch\b0\i0\fs22\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1{\rtlch\ab\ai0\af2\afs20\ltrch\b\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 Proj}{\rtlch\ab\ai0\af2\afs20 +\ltrch\b\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 . }{\rtlch\ab\ai0\af2\afs20\ltrch\b\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 Delivery}{\rtlch\ab\ai0\af2\afs20\ltrch\b\i0\fs20\loch\af2\dbch\af2\hich\f2\insrsid10976062\strike0\ulnone\cf1 +\cell}{\trowd\irow0\irowband0\ltrrow\trql\trgaph108\trpaddl108\trpaddfl3\trbrdrt\brdrs\brdrw10\brdrcf0\brsp0\trbrdrl\brdrs\brdrw10\brdrcf0\brsp0\trbrdrb\brdrs\brdrw10\brdrcf0\brsp0\trbrdrr\brdrs\brdrw10\brdrcf0\brsp0\trbrdrh\brdrs\brdrw10\brdrcf0\brsp0\trbrdrv +\brdrs\brdrw10\brdrcf0\brsp0\trwWidth5000\trftsWidth2\trautofit1\trwWidthB0\trftsWidthB3\trpaddt0\trpaddft3\trpaddb0\trpaddfb3\trpaddr108\trpaddfr3\trrh0\trleft-100\clftsWidth1\clvertalt\clpadl100\clpadfl3\clpadb100\clpadfb3\clpadt100\clpadft3\clpadr100 +\clpadfr3\clbrdrl\brdrs\brdrw20\brdrcf1\brsp0\clbrdrr\brdrs\brdrw20\brdrcf1\brsp0\clbrdrt\brdrs\brdrw20\brdrcf1\brsp0\clbrdrb\brdrs\brdrw20\brdrcf1\brsp0\cldgll\brdrnone\cldglu\brdrnone\cellx5660\clftsWidth1\clvertalt\clpadl100\clpadfl3\clpadb100\clpadfb3\clpadt100 +\clpadft3\clpadr100\clpadfr3\clbrdrl\brdrs\brdrw20\brdrcf1\brsp0\clbrdrr\brdrs\brdrw20\brdrcf1\brsp0\clbrdrt\brdrs\brdrw20\brdrcf1\brsp0\clbrdrb\brdrs\brdrw20\brdrcf1\brsp0\cldgll\brdrnone\cldglu\brdrnone\cellx7475\clftsWidth1\clvertalt\clpadl100\clpadfl3\clpadb100 +\clpadfb3\clpadt100\clpadft3\clpadr100\clpadfr3\clbrdrl\brdrs\brdrw20\brdrcf1\brsp0\clbrdrr\brdrs\brdrw20\brdrcf1\brsp0\clbrdrt\brdrs\brdrw20\brdrcf1\brsp0\clbrdrb\brdrs\brdrw20\brdrcf1\brsp0\cldgll\brdrnone\cldglu\brdrnone\cellx9260\rtlch\ab\ai0\af2\afs20\ltrch\b\i0\fs20\loch\af2\dbch\af2\hich\f2\insrsid10976062\strike0\ulnone\cf1\row}\trowd\irow1\irowband1\ltrrow\trql\trgaph108\trpaddl108\trpaddfl3\trbrdrt\brdrs\brdrw10\brdrcf0\brsp0\trbrdrl\brdrs\brdrw10\brdrcf0\brsp0\trbrdrb\brdrs\brdrw10\brdrcf0\brsp0\trbrdrr\brdrs\brdrw10\brdrcf0\brsp0\trbrdrh\brdrs\brdrw10\brdrcf0\brsp0\trbrdrv +\brdrs\brdrw10\brdrcf0\brsp0\trwWidth5000\trftsWidth2\trautofit1\trwWidthB0\trftsWidthB3\trpaddt0\trpaddft3\trpaddb0\trpaddfb3\trpaddr108\trpaddfr3\trrh0\trleft-100\clftsWidth1\clvertalt\clpadl100\clpadfl3\clpadb100\clpadfb3\clpadt100\clpadft3\clpadr100 +\clpadfr3\clbrdrl\brdrs\brdrw20\brdrcf1\brsp0\clbrdrr\brdrs\brdrw20\brdrcf1\brsp0\clbrdrt\brdrs\brdrw20\brdrcf1\brsp0\clbrdrb\brdrs\brdrw20\brdrcf1\brsp0\cldgll\brdrnone\cldglu\brdrnone\cellx5660\clftsWidth1\clvertalt\clpadl100\clpadfl3\clpadb100\clpadfb3\clpadt100 +\clpadft3\clpadr100\clpadfr3\clbrdrl\brdrs\brdrw20\brdrcf1\brsp0\clbrdrr\brdrs\brdrw20\brdrcf1\brsp0\clbrdrt\brdrs\brdrw20\brdrcf1\brsp0\clbrdrb\brdrs\brdrw20\brdrcf1\brsp0\cldgll\brdrnone\cldglu\brdrnone\cellx7475\clftsWidth1\clvertalt\clpadl100\clpadfl3\clpadb100 +\clpadfb3\clpadt100\clpadft3\clpadr100\clpadfr3\clbrdrl\brdrs\brdrw20\brdrcf1\brsp0\clbrdrr\brdrs\brdrw20\brdrcf1\brsp0\clbrdrt\brdrs\brdrw20\brdrcf1\brsp0\clbrdrb\brdrs\brdrw20\brdrcf1\brsp0\cldgll\brdrnone\cldglu\brdrnone\cellx9260\pard\plain\intbl\itap1\s0\ilvl0\fi0\sb0\sa0\aspalpha\aspnum\adjustright\brdrt\brdrl\brdrb\brdrr\brdrbtw\brdrbar\nowidctlpar\ltrpar\li0\lin0\ri0\rin0\ql\faauto\sl240\slmult1\rtlch\ab0\ai0\af2\afs22\ltrch\b0\i0\fs22\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 +{\rtlch\ab\ai0\af2\afs20\ltrch\b\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ul\cf1 #1 }{\rtlch\ab\ai0\af2\afs20\ltrch\b\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ul\cf1 Templating}{\rtlch\ab\ai0\af2\afs20\ltrch\b\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0 +\ul\cf1 }{\rtlch\ab\ai0\af2\afs20\ltrch\b\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ul\cf1 support}{\rtlch\ab\ai0\af2\afs20\ltrch\b\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ul\cf1 (}{\rtlch\ab\ai0\af2\afs20\ltrch\b\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0 +\ul\cf1 Direct}{\rtlch\ab\ai0\af2\afs20\ltrch\b\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ul\cf1 }{\rtlch\ab\ai0\af2\afs20\ltrch\b\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ul\cf1 mode}{\rtlch\ab\ai0\af2\afs20\ltrch\b\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0 +\ul\cf1 )}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\insrsid10976062\strike0\ulnone\cf1\par}\pard\plain\intbl\itap1\s0\ilvl0\ls2\tx360\tx720\fi-360\sb0\sa0\aspalpha\aspnum\adjustright\brdrt\brdrl\brdrb\brdrr\brdrbtw\brdrbar +\nowidctlpar\ltrpar\li720\lin720\ri0\rin0\ql\faauto\sl240\slmult1\rtlch\ab0\ai0\af2\afs22\ltrch\b0\i0\fs22\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1{\listtext\pard\plain\tx360\fi-360\aspalpha\aspnum\adjustright\ltrpar\li720\lin720\ri0\rin0\ql\faauto\rtlch\ab0\ai0\af2\afs20 +\ltrch\fs20\loch\af2\dbch\af2\hich\f2\insrsid10976062\strike0\ulnone\cf1 -\tab }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 Introduce}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0 +\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 additional}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2 +\hich\f2\strike0\ulnone\cf1 functionality}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 to}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20 +\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 replace}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20 +\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 code}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 in}{\rtlch\ab0\ai0\af2\afs20 +\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 editor}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20 +\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 with}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 the}{\rtlch\ab0\ai0\af2\afs20 +\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 skeleton}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20 +\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 template}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 , }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 after}{ +\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 a}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0 +\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 confirmation}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2 +\dbch\af2\hich\f2\strike0\ulnone\cf1 prompt}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\insrsid10976062\strike0\ulnone\cf1\par}\pard\plain\intbl\itap1\s0\ilvl0\ls2\tx360\tx720\fi-360\sb0\sa0\aspalpha\aspnum\adjustright\brdrt\brdrl +\brdrb\brdrr\brdrbtw\brdrbar\nowidctlpar\ltrpar\li720\lin720\ri0\rin0\ql\faauto\sl240\slmult1\rtlch\ab0\ai0\af2\afs22\ltrch\b0\i0\fs22\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1{\listtext\pard\plain\tx360\fi-360\aspalpha\aspnum\adjustright\ltrpar\li720\lin720\ri0\rin0 +\ql\faauto\rtlch\ab0\ai0\af2\afs20\ltrch\fs20\loch\af2\dbch\af2\hich\f2\insrsid10976062\strike0\ulnone\cf1 -\tab }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 Purpose}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20 +\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 : }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 to}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20 +\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 provide}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 students}{ +\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 a}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0 +\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 means}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2 +\hich\f2\strike0\ulnone\cf1 of}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 recovering}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20 +\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 the}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20 +\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 template}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 upon}{ +\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 accidentally}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0 +\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 overwriting}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2 +\hich\f2\strike0\ulnone\cf1 it}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\insrsid10976062\strike0\ulnone\cf1\cell}\pard\plain\intbl\itap1\s0\ilvl0\fi0\sb0\sa0\aspalpha\aspnum\adjustright\brdrt\brdrl\brdrb\brdrr\brdrbtw\brdrbar +\nowidctlpar\ltrpar\li0\lin0\ri0\rin0\ql\faauto\sl240\slmult1\rtlch\ab0\ai0\af2\afs22\ltrch\b0\i0\fs22\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 React}{\rtlch\ab0\ai0\af2\afs20 +\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\insrsid10976062\strike0\ulnone\cf1\cell}\pard\plain\intbl\itap1\s0\ilvl0\fi0\sb0\sa0\aspalpha\aspnum\adjustright\brdrt\brdrl\brdrb\brdrr\brdrbtw\brdrbar\nowidctlpar\ltrpar\li0\lin0\ri0\rin0\ql\faauto\sl240\slmult1 +\rtlch\ab0\ai0\af2\afs22\ltrch\b0\i0\fs22\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 End}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0 +\ulnone\cf1 -}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 week}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 4}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2 +\hich\f2\insrsid10976062\strike0\ulnone\cf1\cell}{\trowd\irow1\irowband1\ltrrow\trql\trgaph108\trpaddl108\trpaddfl3\trbrdrt\brdrs\brdrw10\brdrcf0\brsp0\trbrdrl\brdrs\brdrw10\brdrcf0\brsp0\trbrdrb\brdrs\brdrw10\brdrcf0\brsp0\trbrdrr\brdrs\brdrw10\brdrcf0\brsp0\trbrdrh\brdrs\brdrw10\brdrcf0\brsp0\trbrdrv +\brdrs\brdrw10\brdrcf0\brsp0\trwWidth5000\trftsWidth2\trautofit1\trwWidthB0\trftsWidthB3\trpaddt0\trpaddft3\trpaddb0\trpaddfb3\trpaddr108\trpaddfr3\trrh0\trleft-100\clftsWidth1\clvertalt\clpadl100\clpadfl3\clpadb100\clpadfb3\clpadt100\clpadft3\clpadr100 +\clpadfr3\clbrdrl\brdrs\brdrw20\brdrcf1\brsp0\clbrdrr\brdrs\brdrw20\brdrcf1\brsp0\clbrdrt\brdrs\brdrw20\brdrcf1\brsp0\clbrdrb\brdrs\brdrw20\brdrcf1\brsp0\cldgll\brdrnone\cldglu\brdrnone\cellx5660\clftsWidth1\clvertalt\clpadl100\clpadfl3\clpadb100\clpadfb3\clpadt100 +\clpadft3\clpadr100\clpadfr3\clbrdrl\brdrs\brdrw20\brdrcf1\brsp0\clbrdrr\brdrs\brdrw20\brdrcf1\brsp0\clbrdrt\brdrs\brdrw20\brdrcf1\brsp0\clbrdrb\brdrs\brdrw20\brdrcf1\brsp0\cldgll\brdrnone\cldglu\brdrnone\cellx7475\clftsWidth1\clvertalt\clpadl100\clpadfl3\clpadb100 +\clpadfb3\clpadt100\clpadft3\clpadr100\clpadfr3\clbrdrl\brdrs\brdrw20\brdrcf1\brsp0\clbrdrr\brdrs\brdrw20\brdrcf1\brsp0\clbrdrt\brdrs\brdrw20\brdrcf1\brsp0\clbrdrb\brdrs\brdrw20\brdrcf1\brsp0\cldgll\brdrnone\cldglu\brdrnone\cellx9260\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\insrsid10976062\strike0\ulnone\cf1\row}\trowd\irow2\irowband2\ltrrow\trql\trgaph108\trpaddl108\trpaddfl3\trbrdrt\brdrs\brdrw10\brdrcf0\brsp0\trbrdrl\brdrs\brdrw10\brdrcf0\brsp0\trbrdrb\brdrs\brdrw10\brdrcf0\brsp0\trbrdrr\brdrs\brdrw10\brdrcf0\brsp0\trbrdrh\brdrs\brdrw10\brdrcf0\brsp0\trbrdrv +\brdrs\brdrw10\brdrcf0\brsp0\trwWidth5000\trftsWidth2\trautofit1\trwWidthB0\trftsWidthB3\trpaddt0\trpaddft3\trpaddb0\trpaddfb3\trpaddr108\trpaddfr3\trrh0\trleft-100\clftsWidth1\clvertalt\clpadl100\clpadfl3\clpadb100\clpadfb3\clpadt100\clpadft3\clpadr100 +\clpadfr3\clbrdrl\brdrs\brdrw20\brdrcf1\brsp0\clbrdrr\brdrs\brdrw20\brdrcf1\brsp0\clbrdrt\brdrs\brdrw20\brdrcf1\brsp0\clbrdrb\brdrs\brdrw20\brdrcf1\brsp0\cldgll\brdrnone\cldglu\brdrnone\cellx5660\clftsWidth1\clvertalt\clpadl100\clpadfl3\clpadb100\clpadfb3\clpadt100 +\clpadft3\clpadr100\clpadfr3\clbrdrl\brdrs\brdrw20\brdrcf1\brsp0\clbrdrr\brdrs\brdrw20\brdrcf1\brsp0\clbrdrt\brdrs\brdrw20\brdrcf1\brsp0\clbrdrb\brdrs\brdrw20\brdrcf1\brsp0\cldgll\brdrnone\cldglu\brdrnone\cellx7475\clftsWidth1\clvertalt\clpadl100\clpadfl3\clpadb100 +\clpadfb3\clpadt100\clpadft3\clpadr100\clpadfr3\clbrdrl\brdrs\brdrw20\brdrcf1\brsp0\clbrdrr\brdrs\brdrw20\brdrcf1\brsp0\clbrdrt\brdrs\brdrw20\brdrcf1\brsp0\clbrdrb\brdrs\brdrw20\brdrcf1\brsp0\cldgll\brdrnone\cldglu\brdrnone\cellx9260\pard\plain\intbl\itap1\s0\ilvl0\fi0\sb0\sa0\aspalpha\aspnum\adjustright\brdrt\brdrl\brdrb\brdrr\brdrbtw\brdrbar\nowidctlpar\ltrpar\li0\lin0\ri0\rin0\ql\faauto\sl240\slmult1\rtlch\ab0\ai0\af2\afs22\ltrch\b0\i0\fs22\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 +{\rtlch\ab\ai0\af2\afs20\ltrch\b\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ul\cf1 #2 }{\rtlch\ab\ai0\af2\afs20\ltrch\b\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ul\cf1 Autograder}{\rtlch\ab\ai0\af2\afs20\ltrch\b\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0 +\ul\cf1 }{\rtlch\ab\ai0\af2\afs20\ltrch\b\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ul\cf1 and}{\rtlch\ab\ai0\af2\afs20\ltrch\b\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ul\cf1 }{\rtlch\ab\ai0\af2\afs20\ltrch\b\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0 +\ul\cf1 grading}{\rtlch\ab\ai0\af2\afs20\ltrch\b\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ul\cf1 }{\rtlch\ab\ai0\af2\afs20\ltrch\b\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ul\cf1 API}{\rtlch\ab\ai0\af2\afs20\ltrch\b\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0 +\ul\cf1 }{\rtlch\ab\ai0\af2\afs20\ltrch\b\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ul\cf1 changes}{\rtlch\ab\ai0\af2\afs20\ltrch\b\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ul\cf1 (}{\rtlch\ab\ai0\af2\afs20\ltrch\b\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0 +\ul\cf1 Fork}{\rtlch\ab\ai0\af2\afs20\ltrch\b\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ul\cf1 }{\rtlch\ab\ai0\af2\afs20\ltrch\b\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ul\cf1 mode}{\rtlch\ab\ai0\af2\afs20\ltrch\b\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0 +\ul\cf1 )}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\insrsid10976062\strike0\ulnone\cf1\par}\pard\plain\intbl\itap1\s0\ilvl0\ls3\tx360\tx720\fi-360\sb0\sa0\aspalpha\aspnum\adjustright\brdrt\brdrl\brdrb\brdrr\brdrbtw\brdrbar +\widctlpar\ltrpar\li720\lin720\ri0\rin0\ql\faauto\sl276\slmult1\rtlch\ab0\ai0\af2\afs22\ltrch\b0\i0\fs22\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1{\listtext\pard\plain\tx360\fi-360\aspalpha\aspnum\adjustright\ltrpar\li720\lin720\ri0\rin0\ql\faauto\rtlch\ab0\ai0\af2\afs20 +\ltrch\fs20\loch\af2\dbch\af2\hich\f2\insrsid10976062\strike0\ulnone\cf1 -\tab }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 Change}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 } +{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 specification}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2 +\hich\f2\strike0\ulnone\cf1 for}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 XML}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20 +\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 files}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20 +\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 to}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 simplifying}{ +\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 authoring}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0 +\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 of}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0 +\ulnone\cf1 graders}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 for}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2 +\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 missions}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 (}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20 +\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 function}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 name}{\rtlch\ab0\ai0\af2\afs20 +\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 , }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 prerequisites}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 , }{ +\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 input}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 , }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0 +\ulnone\cf1 expected}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 output}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2 +\dbch\af2\hich\f2\strike0\ulnone\cf1 )}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\insrsid10976062\strike0\ulnone\cf1\par}\pard\plain\intbl\itap1\s0\ilvl0\ls3\tx360\tx720\fi-360\sb0\sa0\aspalpha\aspnum\adjustright\brdrt\brdrl\brdrb +\brdrr\brdrbtw\brdrbar\widctlpar\ltrpar\li720\lin720\ri0\rin0\ql\faauto\sl276\slmult1\rtlch\ab0\ai0\af2\afs22\ltrch\b0\i0\fs22\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1{\listtext\pard\plain\tx360\fi-360\aspalpha\aspnum\adjustright\ltrpar\li720\lin720\ri0\rin0 +\ql\faauto\rtlch\ab0\ai0\af2\afs20\ltrch\fs20\loch\af2\dbch\af2\hich\f2\insrsid10976062\strike0\ulnone\cf1 -\tab }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 Extend}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2 +\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 XML}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20 +\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 file}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 specification}{\rtlch\ab0\ai0\af2\afs20 +\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 to}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20 +\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 include}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 public}{ +\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 test}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0 +\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 cases}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 (}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2 +\hich\f2\strike0\ulnone\cf1 provided}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 in}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20 +\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 mission}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20 +\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 description}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 ) }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 for}{ +\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 use}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0 +\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 in}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0 +\ulnone\cf1 assert}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\insrsid10976062\strike0\ulnone\cf1\par}\pard\plain\intbl\itap1\s0\ilvl0\ls3\tx360\tx720\fi-360\sb0\sa0\aspalpha\aspnum\adjustright\brdrt\brdrl\brdrb\brdrr\brdrbtw\brdrbar +\widctlpar\ltrpar\li720\lin720\ri0\rin0\ql\faauto\sl276\slmult1\rtlch\ab0\ai0\af2\afs22\ltrch\b0\i0\fs22\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1{\listtext\pard\plain\tx360\fi-360\aspalpha\aspnum\adjustright\ltrpar\li720\lin720\ri0\rin0\ql\faauto\rtlch\ab0\ai0\af2\afs20 +\ltrch\fs20\loch\af2\dbch\af2\hich\f2\insrsid10976062\strike0\ulnone\cf1 -\tab }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 Amend}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 } +{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 grader}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0 +\ulnone\cf1 output}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 into}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2 +\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 per}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 -}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20 +\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 task}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 scores}{\rtlch\ab0\ai0\af2\afs20 +\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\insrsid10976062\strike0\ulnone\cf1\par}\pard\plain\intbl\itap1\s0\ilvl0\ls3\tx360\tx720\fi-360\sb0\sa0\aspalpha\aspnum\adjustright\brdrt\brdrl\brdrb\brdrr\brdrbtw\brdrbar\widctlpar\ltrpar\li720\lin720\ri0\rin0\ql +\faauto\sl276\slmult1\rtlch\ab0\ai0\af2\afs22\ltrch\b0\i0\fs22\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1{\listtext\pard\plain\tx360\fi-360\aspalpha\aspnum\adjustright\ltrpar\li720\lin720\ri0\rin0\ql\faauto\rtlch\ab0\ai0\af2\afs20\ltrch\fs20\loch\af2\dbch\af2 +\hich\f2\insrsid10976062\strike0\ulnone\cf1 -\tab }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 Purpose}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 : }{\rtlch\ab0\ai0\af2\afs20 +\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 prevent}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 fatal}{ +\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 execution}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0 +\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 errors}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2 +\hich\f2\strike0\ulnone\cf1 from}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 returning}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20 +\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 a}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 0 }{\rtlch\ab0\ai0\af2\afs20 +\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 for}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 an}{\rtlch\ab0\ai0\af2\afs20 +\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 entire}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20 +\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 task}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 or}{\rtlch\ab0\ai0\af2\afs20 +\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 mission}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 , }{\rtlch\ab0\ai0\af2\afs20 +\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 increase}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 overall}{ +\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 reliability}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\insrsid10976062\strike0 +\ulnone\cf1\cell}\pard\plain\intbl\itap1\s0\ilvl0\fi0\sb0\sa0\aspalpha\aspnum\adjustright\brdrt\brdrl\brdrb\brdrr\brdrbtw\brdrbar\nowidctlpar\ltrpar\li0\lin0\ri0\rin0\ql\faauto\sl240\slmult1\rtlch\ab0\ai0\af2\afs22\ltrch\b0\i0\fs22\loch\af2\dbch\af2\hich\f2\strike0 +\ulnone\cf1{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\insrsid10976062\strike0\ulnone\cf1\cell}\pard\plain\intbl\itap1\s0\ilvl0\fi0\sb0\sa0\aspalpha\aspnum\adjustright\brdrt\brdrl\brdrb\brdrr\brdrbtw\brdrbar\nowidctlpar\ltrpar\li0\lin0\ri0\rin0 +\ql\faauto\sl240\slmult1\rtlch\ab0\ai0\af2\afs22\ltrch\b0\i0\fs22\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 Recess}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2 +\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 week}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\insrsid10976062\strike0\ulnone\cf1\cell}{\trowd\irow2\irowband2\ltrrow\trql\trgaph108\trpaddl108\trpaddfl3\trbrdrt\brdrs\brdrw10\brdrcf0\brsp0\trbrdrl\brdrs\brdrw10\brdrcf0\brsp0\trbrdrb\brdrs\brdrw10\brdrcf0\brsp0\trbrdrr\brdrs\brdrw10\brdrcf0\brsp0\trbrdrh\brdrs\brdrw10\brdrcf0\brsp0\trbrdrv +\brdrs\brdrw10\brdrcf0\brsp0\trwWidth5000\trftsWidth2\trautofit1\trwWidthB0\trftsWidthB3\trpaddt0\trpaddft3\trpaddb0\trpaddfb3\trpaddr108\trpaddfr3\trrh0\trleft-100\clftsWidth1\clvertalt\clpadl100\clpadfl3\clpadb100\clpadfb3\clpadt100\clpadft3\clpadr100 +\clpadfr3\clbrdrl\brdrs\brdrw20\brdrcf1\brsp0\clbrdrr\brdrs\brdrw20\brdrcf1\brsp0\clbrdrt\brdrs\brdrw20\brdrcf1\brsp0\clbrdrb\brdrs\brdrw20\brdrcf1\brsp0\cldgll\brdrnone\cldglu\brdrnone\cellx5660\clftsWidth1\clvertalt\clpadl100\clpadfl3\clpadb100\clpadfb3\clpadt100 +\clpadft3\clpadr100\clpadfr3\clbrdrl\brdrs\brdrw20\brdrcf1\brsp0\clbrdrr\brdrs\brdrw20\brdrcf1\brsp0\clbrdrt\brdrs\brdrw20\brdrcf1\brsp0\clbrdrb\brdrs\brdrw20\brdrcf1\brsp0\cldgll\brdrnone\cldglu\brdrnone\cellx7475\clftsWidth1\clvertalt\clpadl100\clpadfl3\clpadb100 +\clpadfb3\clpadt100\clpadft3\clpadr100\clpadfr3\clbrdrl\brdrs\brdrw20\brdrcf1\brsp0\clbrdrr\brdrs\brdrw20\brdrcf1\brsp0\clbrdrt\brdrs\brdrw20\brdrcf1\brsp0\clbrdrb\brdrs\brdrw20\brdrcf1\brsp0\cldgll\brdrnone\cldglu\brdrnone\cellx9260\rtlch\ab0\ai0\af2\afs20 +\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\insrsid10976062\strike0\ulnone\cf1\row}\trowd\irow3\irowband3\ltrrow\trql\trgaph108\trpaddl108\trpaddfl3\trbrdrt\brdrs\brdrw10\brdrcf0\brsp0\trbrdrl\brdrs\brdrw10\brdrcf0\brsp0\trbrdrb\brdrs\brdrw10\brdrcf0\brsp0\trbrdrr\brdrs\brdrw10\brdrcf0\brsp0\trbrdrh\brdrs\brdrw10\brdrcf0\brsp0\trbrdrv +\brdrs\brdrw10\brdrcf0\brsp0\trwWidth5000\trftsWidth2\trautofit1\trwWidthB0\trftsWidthB3\trpaddt0\trpaddft3\trpaddb0\trpaddfb3\trpaddr108\trpaddfr3\trrh0\trleft-100\clftsWidth1\clvertalt\clpadl100\clpadfl3\clpadb100\clpadfb3\clpadt100\clpadft3\clpadr100 +\clpadfr3\clbrdrl\brdrs\brdrw20\brdrcf1\brsp0\clbrdrr\brdrs\brdrw20\brdrcf1\brsp0\clbrdrt\brdrs\brdrw20\brdrcf1\brsp0\clbrdrb\brdrs\brdrw20\brdrcf1\brsp0\cldgll\brdrnone\cldglu\brdrnone\cellx5660\clftsWidth1\clvertalt\clpadl100\clpadfl3\clpadb100\clpadfb3\clpadt100 +\clpadft3\clpadr100\clpadfr3\clbrdrl\brdrs\brdrw20\brdrcf1\brsp0\clbrdrr\brdrs\brdrw20\brdrcf1\brsp0\clbrdrt\brdrs\brdrw20\brdrcf1\brsp0\clbrdrb\brdrs\brdrw20\brdrcf1\brsp0\cldgll\brdrnone\cldglu\brdrnone\cellx7475\clftsWidth1\clvertalt\clpadl100\clpadfl3\clpadb100 +\clpadfb3\clpadt100\clpadft3\clpadr100\clpadfr3\clbrdrl\brdrs\brdrw20\brdrcf1\brsp0\clbrdrr\brdrs\brdrw20\brdrcf1\brsp0\clbrdrt\brdrs\brdrw20\brdrcf1\brsp0\clbrdrb\brdrs\brdrw20\brdrcf1\brsp0\cldgll\brdrnone\cldglu\brdrnone\cellx9260\pard\plain\intbl\itap1\s0\ilvl0\fi0\sb0\sa0\aspalpha\aspnum\adjustright\brdrt\brdrl\brdrb\brdrr\brdrbtw\brdrbar\nowidctlpar\ltrpar\li0\lin0\ri0\rin0\ql\faauto\sl240\slmult1\rtlch\ab0\ai0\af2\afs22\ltrch\b0\i0\fs22\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 +{\rtlch\ab\ai0\af2\afs20\ltrch\b\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ul\cf1 #3 }{\rtlch\ab\ai0\af2\afs20\ltrch\b\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ul\cf1 Granular}{\rtlch\ab\ai0\af2\afs20\ltrch\b\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0 +\ul\cf1 }{\rtlch\ab\ai0\af2\afs20\ltrch\b\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ul\cf1 grading}{\rtlch\ab\ai0\af2\afs20\ltrch\b\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ul\cf1 }{\rtlch\ab\ai0\af2\afs20\ltrch\b\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0 +\ul\cf1 feedback}{\rtlch\ab\ai0\af2\afs20\ltrch\b\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ul\cf1 (}{\rtlch\ab\ai0\af2\afs20\ltrch\b\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ul\cf1 Direct}{\rtlch\ab\ai0\af2\afs20\ltrch\b\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0 +\ul\cf1 }{\rtlch\ab\ai0\af2\afs20\ltrch\b\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ul\cf1 Mode}{\rtlch\ab\ai0\af2\afs20\ltrch\b\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ul\cf1 )}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\insrsid10976062\strike0 +\ulnone\cf1\par}\pard\plain\intbl\itap1\s0\ilvl0\ls4\tx360\tx720\fi-360\sb0\sa0\aspalpha\aspnum\adjustright\brdrt\brdrl\brdrb\brdrr\brdrbtw\brdrbar\nowidctlpar\ltrpar\li720\lin720\ri0\rin0\ql\faauto\sl240\slmult1\rtlch\ab0\ai0\af2\afs22\ltrch\b0\i0\fs22\loch\af2 +\dbch\af2\hich\f2\strike0\ulnone\cf1{\listtext\pard\plain\tx360\fi-360\aspalpha\aspnum\adjustright\ltrpar\li720\lin720\ri0\rin0\ql\faauto\rtlch\ab0\ai0\af2\afs20\ltrch\fs20\loch\af2\dbch\af2\hich\f2\insrsid10976062\strike0\ulnone\cf1 -\tab }{\rtlch\ab0\ai0\af2\afs20 +\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 Display}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 mission}{ +\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 scores}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0 +\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 on}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0 +\ulnone\cf1 a}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 per}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2 +\hich\f2\strike0\ulnone\cf1 -}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 task}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20 +\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 basis}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 in}{\rtlch\ab0\ai0\af2\afs20 +\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 an}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20 +\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 additional}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 interface} +{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 , }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 along}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0 +\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 with}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2 +\hich\f2\strike0\ulnone\cf1 grader}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 name}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20 +\loch\af2\dbch\af2\hich\f2\insrsid10976062\strike0\ulnone\cf1\par}\pard\plain\intbl\itap1\s0\ilvl0\ls4\tx360\tx720\fi-360\sb0\sa0\aspalpha\aspnum\adjustright\brdrt\brdrl\brdrb\brdrr\brdrbtw\brdrbar\nowidctlpar\ltrpar\li720\lin720\ri0\rin0\ql\faauto\sl240 +\slmult1\rtlch\ab0\ai0\af2\afs22\ltrch\b0\i0\fs22\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1{\listtext\pard\plain\tx360\fi-360\aspalpha\aspnum\adjustright\ltrpar\li720\lin720\ri0\rin0\ql\faauto\rtlch\ab0\ai0\af2\afs20\ltrch\fs20\loch\af2\dbch\af2\hich\f2\insrsid10976062\strike0 +\ulnone\cf1 -\tab }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 In}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2 +\hich\f2\strike0\ulnone\cf1 addition}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 to}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20 +\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 comments}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20 +\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 that}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 are}{\rtlch\ab0\ai0\af2\afs20 +\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 already}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20 +\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 shown}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 , }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 insert}{ +\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 a}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0 +\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 placeholder}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2 +\hich\f2\strike0\ulnone\cf1 comment}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\insrsid10976062\strike0\ulnone\cf1\par}\pard\plain\intbl\itap1\s0\ilvl0\ls4\tx360\tx720\fi-360\sb0\sa0\aspalpha\aspnum\adjustright\brdrt\brdrl\brdrb +\brdrr\brdrbtw\brdrbar\nowidctlpar\ltrpar\li720\lin720\ri0\rin0\ql\faauto\sl240\slmult1\rtlch\ab0\ai0\af2\afs22\ltrch\b0\i0\fs22\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1{\listtext\pard\plain\tx360\fi-360\aspalpha\aspnum\adjustright\ltrpar\li720\lin720\ri0\rin0 +\ql\faauto\rtlch\ab0\ai0\af2\afs20\ltrch\fs20\loch\af2\dbch\af2\hich\f2\insrsid10976062\strike0\ulnone\cf1 -\tab }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 Allow}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2 +\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 graders}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20 +\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 to}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 tag}{\rtlch\ab0\ai0\af2\afs20 +\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 or}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20 +\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 quote}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 lines}{ +\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 of}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0 +\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 code}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2 +\hich\f2\strike0\ulnone\cf1 in}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 each}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20 +\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 task}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20 +\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 submission}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 to}{ +\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 be}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0 +\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 highlighted}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2 +\hich\f2\strike0\ulnone\cf1 when}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 hovered}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20 +\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 over}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\insrsid10976062\strike0\ulnone\cf1\cell}\pard +\plain\intbl\itap1\s0\ilvl0\fi0\sb0\sa0\aspalpha\aspnum\adjustright\brdrt\brdrl\brdrb\brdrr\brdrbtw\brdrbar\nowidctlpar\ltrpar\li0\lin0\ri0\rin0\ql\faauto\sl240\slmult1\rtlch\ab0\ai0\af2\afs22\ltrch\b0\i0\fs22\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1{ +\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\insrsid10976062\strike0\ulnone\cf1\cell}\pard\plain\intbl\itap1\s0\ilvl0\fi0\sb0\sa0\aspalpha\aspnum\adjustright\brdrt\brdrl\brdrb\brdrr\brdrbtw\brdrbar\nowidctlpar\ltrpar\li0\lin0\ri0\rin0 +\ql\faauto\sl240\slmult1\rtlch\ab0\ai0\af2\afs22\ltrch\b0\i0\fs22\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\insrsid10976062\strike0\ulnone\cf1\par}\pard\plain\intbl\itap1\s0\ilvl0\fi0\sb0\sa0 +\aspalpha\aspnum\adjustright\brdrt\brdrl\brdrb\brdrr\brdrbtw\brdrbar\nowidctlpar\ltrpar\li0\lin0\ri0\rin0\ql\faauto\sl240\slmult1\rtlch\ab0\ai0\af2\afs22\ltrch\b0\i0\fs22\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2 +\dbch\af2\hich\f2\strike0\ulnone\cf1 Week}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 8}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\insrsid10976062\strike0\ulnone\cf1\cell}{\trowd\irow3\irowband3\ltrrow\trql\trgaph108\trpaddl108\trpaddfl3\trbrdrt\brdrs\brdrw10\brdrcf0\brsp0\trbrdrl\brdrs\brdrw10\brdrcf0\brsp0\trbrdrb\brdrs\brdrw10\brdrcf0\brsp0\trbrdrr\brdrs\brdrw10\brdrcf0\brsp0\trbrdrh\brdrs\brdrw10\brdrcf0\brsp0\trbrdrv +\brdrs\brdrw10\brdrcf0\brsp0\trwWidth5000\trftsWidth2\trautofit1\trwWidthB0\trftsWidthB3\trpaddt0\trpaddft3\trpaddb0\trpaddfb3\trpaddr108\trpaddfr3\trrh0\trleft-100\clftsWidth1\clvertalt\clpadl100\clpadfl3\clpadb100\clpadfb3\clpadt100\clpadft3\clpadr100 +\clpadfr3\clbrdrl\brdrs\brdrw20\brdrcf1\brsp0\clbrdrr\brdrs\brdrw20\brdrcf1\brsp0\clbrdrt\brdrs\brdrw20\brdrcf1\brsp0\clbrdrb\brdrs\brdrw20\brdrcf1\brsp0\cldgll\brdrnone\cldglu\brdrnone\cellx5660\clftsWidth1\clvertalt\clpadl100\clpadfl3\clpadb100\clpadfb3\clpadt100 +\clpadft3\clpadr100\clpadfr3\clbrdrl\brdrs\brdrw20\brdrcf1\brsp0\clbrdrr\brdrs\brdrw20\brdrcf1\brsp0\clbrdrt\brdrs\brdrw20\brdrcf1\brsp0\clbrdrb\brdrs\brdrw20\brdrcf1\brsp0\cldgll\brdrnone\cldglu\brdrnone\cellx7475\clftsWidth1\clvertalt\clpadl100\clpadfl3\clpadb100 +\clpadfb3\clpadt100\clpadft3\clpadr100\clpadfr3\clbrdrl\brdrs\brdrw20\brdrcf1\brsp0\clbrdrr\brdrs\brdrw20\brdrcf1\brsp0\clbrdrt\brdrs\brdrw20\brdrcf1\brsp0\clbrdrb\brdrs\brdrw20\brdrcf1\brsp0\cldgll\brdrnone\cldglu\brdrnone\cellx9260\rtlch\ab0\ai0\af2\afs20 +\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\insrsid10976062\strike0\ulnone\cf1\row}\trowd\irow4\irowband4\ltrrow\trql\trgaph108\trpaddl108\trpaddfl3\trbrdrt\brdrs\brdrw10\brdrcf0\brsp0\trbrdrl\brdrs\brdrw10\brdrcf0\brsp0\trbrdrb\brdrs\brdrw10\brdrcf0\brsp0\trbrdrr\brdrs\brdrw10\brdrcf0\brsp0\trbrdrh\brdrs\brdrw10\brdrcf0\brsp0\trbrdrv +\brdrs\brdrw10\brdrcf0\brsp0\trwWidth5000\trftsWidth2\trautofit1\trwWidthB0\trftsWidthB3\trpaddt0\trpaddft3\trpaddb0\trpaddfb3\trpaddr108\trpaddfr3\trrh0\trleft-100\clftsWidth1\clvertalt\clpadl100\clpadfl3\clpadb100\clpadfb3\clpadt100\clpadft3\clpadr100 +\clpadfr3\clbrdrl\brdrs\brdrw20\brdrcf1\brsp0\clbrdrr\brdrs\brdrw20\brdrcf1\brsp0\clbrdrt\brdrs\brdrw20\brdrcf1\brsp0\clbrdrb\brdrs\brdrw20\brdrcf1\brsp0\cldgll\brdrnone\cldglu\brdrnone\cellx5660\clftsWidth1\clvertalt\clpadl100\clpadfl3\clpadb100\clpadfb3\clpadt100 +\clpadft3\clpadr100\clpadfr3\clbrdrl\brdrs\brdrw20\brdrcf1\brsp0\clbrdrr\brdrs\brdrw20\brdrcf1\brsp0\clbrdrt\brdrs\brdrw20\brdrcf1\brsp0\clbrdrb\brdrs\brdrw20\brdrcf1\brsp0\cldgll\brdrnone\cldglu\brdrnone\cellx7475\clftsWidth1\clvertalt\clpadl100\clpadfl3\clpadb100 +\clpadfb3\clpadt100\clpadft3\clpadr100\clpadfr3\clbrdrl\brdrs\brdrw20\brdrcf1\brsp0\clbrdrr\brdrs\brdrw20\brdrcf1\brsp0\clbrdrt\brdrs\brdrw20\brdrcf1\brsp0\clbrdrb\brdrs\brdrw20\brdrcf1\brsp0\cldgll\brdrnone\cldglu\brdrnone\cellx9260\pard\plain\intbl\itap1\s0\ilvl0\fi0\sb0\sa0\aspalpha\aspnum\adjustright\brdrt\brdrl\brdrb\brdrr\brdrbtw\brdrbar\nowidctlpar\ltrpar\li0\lin0\ri0\rin0\ql\faauto\sl240\slmult1\rtlch\ab0\ai0\af2\afs22\ltrch\b0\i0\fs22\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 +{\rtlch\ab\ai0\af2\afs20\ltrch\b\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ul\cf1 #4 }{\rtlch\ab\ai0\af2\afs20\ltrch\b\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ul\cf1 Test}{\rtlch\ab\ai0\af2\afs20\ltrch\b\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ul\cf1 } +{\rtlch\ab\ai0\af2\afs20\ltrch\b\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ul\cf1 case}{\rtlch\ab\ai0\af2\afs20\ltrch\b\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ul\cf1 }{\rtlch\ab\ai0\af2\afs20\ltrch\b\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ul\cf1 support} +{\rtlch\ab\ai0\af2\afs20\ltrch\b\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ul\cf1 (}{\rtlch\ab\ai0\af2\afs20\ltrch\b\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ul\cf1 Fork}{\rtlch\ab\ai0\af2\afs20\ltrch\b\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ul\cf1 } +{\rtlch\ab\ai0\af2\afs20\ltrch\b\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ul\cf1 Mode}{\rtlch\ab\ai0\af2\afs20\ltrch\b\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ul\cf1 )}{\rtlch\ab\ai0\af2\afs20\ltrch\b\i0\fs20\loch\af2\dbch\af2\hich\f2\insrsid10976062\strike0 +\ulnone\cf1\par}\pard\plain\intbl\itap1\s0\ilvl0\ls5\tx360\tx720\fi-360\sb0\sa0\aspalpha\aspnum\adjustright\brdrt\brdrl\brdrb\brdrr\brdrbtw\brdrbar\nowidctlpar\ltrpar\li720\lin720\ri0\rin0\ql\faauto\sl240\slmult1\rtlch\ab0\ai0\af2\afs22\ltrch\b0\i0\fs22\loch\af2 +\dbch\af2\hich\f2\strike0\ulnone\cf1{\listtext\pard\plain\tx360\fi-360\aspalpha\aspnum\adjustright\ltrpar\li720\lin720\ri0\rin0\ql\faauto\rtlch\ab0\ai0\af2\afs20\ltrch\fs20\loch\af2\dbch\af2\hich\f2\insrsid10976062\strike0\ulnone\cf1 -\tab }{\rtlch\ab0\ai0\af2\afs20 +\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 Implement}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 functionality} +{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 to}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0 +\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 run}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2 +\hich\f2\strike0\ulnone\cf1 PE}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 -}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 style}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20 +\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 assert}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20 +\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 on}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 the}{\rtlch\ab0\ai0\af2\afs20 +\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 code}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20 +\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 currently}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 in}{ +\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 editor}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0 +\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 against}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2 +\hich\f2\strike0\ulnone\cf1 public}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 test}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20 +\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 cases}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\insrsid10976062\strike0\ulnone\cf1\par}\pard +\plain\intbl\itap1\s0\ilvl0\ls5\tx360\tx720\fi-360\sb0\sa0\aspalpha\aspnum\adjustright\brdrt\brdrl\brdrb\brdrr\brdrbtw\brdrbar\nowidctlpar\ltrpar\li720\lin720\ri0\rin0\ql\faauto\sl240\slmult1\rtlch\ab0\ai0\af2\afs22\ltrch\b0\i0\fs22\loch\af2\dbch\af2\hich\f2\strike0 +\ulnone\cf1{\listtext\pard\plain\tx360\fi-360\aspalpha\aspnum\adjustright\ltrpar\li720\lin720\ri0\rin0\ql\faauto\rtlch\ab0\ai0\af2\afs20\ltrch\fs20\loch\af2\dbch\af2\hich\f2\insrsid10976062\strike0\ulnone\cf1 -\tab }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20 +\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 Test}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 cases}{\rtlch\ab0\ai0\af2\afs20 +\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 to}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20 +\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 be}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 pulled}{\rtlch\ab0\ai0\af2\afs20 +\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 from}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20 +\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 the}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 mission}{ +\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 XML}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0 +\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 file}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2 +\hich\f2\strike0\ulnone\cf1 and}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 run}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20 +\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 through}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20 +\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 the}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 autograder}{ +\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\insrsid10976062\strike0\ulnone\cf1\par}\pard\plain\intbl\itap1\s0\ilvl0\ls5\tx360\tx720\fi-360\sb0\sa0\aspalpha\aspnum\adjustright\brdrt\brdrl\brdrb\brdrr\brdrbtw\brdrbar\nowidctlpar\ltrpar\li720\lin720\ri0\rin0 +\ql\faauto\sl240\slmult1\rtlch\ab0\ai0\af2\afs22\ltrch\b0\i0\fs22\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1{\listtext\pard\plain\tx360\fi-360\aspalpha\aspnum\adjustright\ltrpar\li720\lin720\ri0\rin0\ql\faauto\rtlch\ab0\ai0\af2\afs20\ltrch\fs20\loch\af2 +\dbch\af2\hich\f2\insrsid10976062\strike0\ulnone\cf1 -\tab }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 Parses}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20 +\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 grader}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 output}{ +\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 and}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0 +\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 displays}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2 +\hich\f2\strike0\ulnone\cf1 overview}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 of}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20 +\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 results}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20 +\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 for}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 each}{\rtlch\ab0\ai0\af2\afs20 +\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 test}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20 +\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 case}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\insrsid10976062\strike0\ulnone\cf1\par}\pard\plain\intbl\itap1\s0\ilvl0\ls5\tx360\tx720\fi-360\sb0\sa0\aspalpha\aspnum +\adjustright\brdrt\brdrl\brdrb\brdrr\brdrbtw\brdrbar\nowidctlpar\ltrpar\li720\lin720\ri0\rin0\ql\faauto\sl240\slmult1\rtlch\ab0\ai0\af2\afs22\ltrch\b0\i0\fs22\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1{\listtext\pard\plain\tx360\fi-360\aspalpha\aspnum\adjustright +\ltrpar\li720\lin720\ri0\rin0\ql\faauto\rtlch\ab0\ai0\af2\afs20\ltrch\fs20\loch\af2\dbch\af2\hich\f2\insrsid10976062\strike0\ulnone\cf1 -\tab }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 Purpose}{\rtlch\ab0\ai0\af2\afs20 +\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 : }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 quality}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20 +\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 of}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 life}{\rtlch\ab0\ai0\af2\afs20 +\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 improvement}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{ +\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 for}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0 +\ulnone\cf1 students}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 in}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2 +\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 testing}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20 +\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 code}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 submissions}{\rtlch\ab0\ai0\af2\afs20 +\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\insrsid10976062\strike0\ulnone\cf1\cell}\pard\plain\intbl\itap1\s0\ilvl0\fi0\sb0\sa0\aspalpha\aspnum\adjustright\brdrt\brdrl\brdrb\brdrr\brdrbtw\brdrbar\nowidctlpar\ltrpar\li0\lin0\ri0\rin0\ql\faauto\sl240\slmult1 +\rtlch\ab0\ai0\af2\afs22\ltrch\b0\i0\fs22\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\insrsid10976062\strike0\ulnone\cf1\cell}\pard\plain\intbl\itap1\s0\ilvl0\fi0\sb0\sa0\aspalpha\aspnum +\adjustright\brdrt\brdrl\brdrb\brdrr\brdrbtw\brdrbar\nowidctlpar\ltrpar\li0\lin0\ri0\rin0\ql\faauto\sl240\slmult1\rtlch\ab0\ai0\af2\afs22\ltrch\b0\i0\fs22\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\insrsid10976062\strike0 +\ulnone\cf1\par}\pard\plain\intbl\itap1\s0\ilvl0\fi0\sb0\sa0\aspalpha\aspnum\adjustright\brdrt\brdrl\brdrb\brdrr\brdrbtw\brdrbar\nowidctlpar\ltrpar\li0\lin0\ri0\rin0\ql\faauto\sl240\slmult1\rtlch\ab0\ai0\af2\afs22\ltrch\b0\i0\fs22\loch\af2\dbch\af2\hich\f2\strike0 +\ulnone\cf1{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 Week}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 10}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2 +\hich\f2\insrsid10976062\strike0\ulnone\cf1\cell}{\trowd\irow4\irowband4\ltrrow\trql\trgaph108\trpaddl108\trpaddfl3\trbrdrt\brdrs\brdrw10\brdrcf0\brsp0\trbrdrl\brdrs\brdrw10\brdrcf0\brsp0\trbrdrb\brdrs\brdrw10\brdrcf0\brsp0\trbrdrr\brdrs\brdrw10\brdrcf0\brsp0\trbrdrh\brdrs\brdrw10\brdrcf0\brsp0\trbrdrv +\brdrs\brdrw10\brdrcf0\brsp0\trwWidth5000\trftsWidth2\trautofit1\trwWidthB0\trftsWidthB3\trpaddt0\trpaddft3\trpaddb0\trpaddfb3\trpaddr108\trpaddfr3\trrh0\trleft-100\clftsWidth1\clvertalt\clpadl100\clpadfl3\clpadb100\clpadfb3\clpadt100\clpadft3\clpadr100 +\clpadfr3\clbrdrl\brdrs\brdrw20\brdrcf1\brsp0\clbrdrr\brdrs\brdrw20\brdrcf1\brsp0\clbrdrt\brdrs\brdrw20\brdrcf1\brsp0\clbrdrb\brdrs\brdrw20\brdrcf1\brsp0\cldgll\brdrnone\cldglu\brdrnone\cellx5660\clftsWidth1\clvertalt\clpadl100\clpadfl3\clpadb100\clpadfb3\clpadt100 +\clpadft3\clpadr100\clpadfr3\clbrdrl\brdrs\brdrw20\brdrcf1\brsp0\clbrdrr\brdrs\brdrw20\brdrcf1\brsp0\clbrdrt\brdrs\brdrw20\brdrcf1\brsp0\clbrdrb\brdrs\brdrw20\brdrcf1\brsp0\cldgll\brdrnone\cldglu\brdrnone\cellx7475\clftsWidth1\clvertalt\clpadl100\clpadfl3\clpadb100 +\clpadfb3\clpadt100\clpadft3\clpadr100\clpadfr3\clbrdrl\brdrs\brdrw20\brdrcf1\brsp0\clbrdrr\brdrs\brdrw20\brdrcf1\brsp0\clbrdrt\brdrs\brdrw20\brdrcf1\brsp0\clbrdrb\brdrs\brdrw20\brdrcf1\brsp0\cldgll\brdrnone\cldglu\brdrnone\cellx9260\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\insrsid10976062\strike0\ulnone\cf1\row}\trowd\irow5\irowband5\lastrow\ltrrow\trql\trgaph108\trpaddl108\trpaddfl3\trbrdrt\brdrs\brdrw10\brdrcf0\brsp0\trbrdrl\brdrs\brdrw10\brdrcf0\brsp0\trbrdrb\brdrs\brdrw10\brdrcf0\brsp0\trbrdrr\brdrs\brdrw10\brdrcf0\brsp0\trbrdrh\brdrs\brdrw10\brdrcf0\brsp0 +\trbrdrv\brdrs\brdrw10\brdrcf0\brsp0\trwWidth5000\trftsWidth2\trautofit1\trwWidthB0\trftsWidthB3\trpaddt0\trpaddft3\trpaddb0\trpaddfb3\trpaddr108\trpaddfr3\trrh0\trleft-100\clftsWidth1\clvertalt\clpadl100\clpadfl3\clpadb100\clpadfb3\clpadt100\clpadft3\clpadr100 +\clpadfr3\clbrdrl\brdrs\brdrw20\brdrcf1\brsp0\clbrdrr\brdrs\brdrw20\brdrcf1\brsp0\clbrdrt\brdrs\brdrw20\brdrcf1\brsp0\clbrdrb\brdrs\brdrw20\brdrcf1\brsp0\cldgll\brdrnone\cldglu\brdrnone\cellx5660\clftsWidth1\clvertalt\clpadl100\clpadfl3\clpadb100\clpadfb3\clpadt100 +\clpadft3\clpadr100\clpadfr3\clbrdrl\brdrs\brdrw20\brdrcf1\brsp0\clbrdrr\brdrs\brdrw20\brdrcf1\brsp0\clbrdrt\brdrs\brdrw20\brdrcf1\brsp0\clbrdrb\brdrs\brdrw20\brdrcf1\brsp0\cldgll\brdrnone\cldglu\brdrnone\cellx7475\clftsWidth1\clvertalt\clpadl100\clpadfl3\clpadb100 +\clpadfb3\clpadt100\clpadft3\clpadr100\clpadfr3\clbrdrl\brdrs\brdrw20\brdrcf1\brsp0\clbrdrr\brdrs\brdrw20\brdrcf1\brsp0\clbrdrt\brdrs\brdrw20\brdrcf1\brsp0\clbrdrb\brdrs\brdrw20\brdrcf1\brsp0\cldgll\brdrnone\cldglu\brdrnone\cellx9260\pard\plain\intbl\itap1\s0\ilvl0\fi0\sb0\sa0\aspalpha\aspnum\adjustright\brdrt\brdrl\brdrb\brdrr\brdrbtw\brdrbar\nowidctlpar\ltrpar\li0\lin0\ri0\rin0\ql\faauto\sl240\slmult1\rtlch\ab0\ai0\af2\afs22\ltrch\b0\i0\fs22\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 +{\rtlch\ab\ai0\af2\afs20\ltrch\b\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ul\cf1 #5 }{\rtlch\ab\ai0\af2\afs20\ltrch\b\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ul\cf1 Contest}{\rtlch\ab\ai0\af2\afs20\ltrch\b\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ul\cf1 } +{\rtlch\ab\ai0\af2\afs20\ltrch\b\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ul\cf1 voting}{\rtlch\ab\ai0\af2\afs20\ltrch\b\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ul\cf1 }{\rtlch\ab\ai0\af2\afs20\ltrch\b\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ul\cf1 support} +{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\insrsid10976062\strike0\ulnone\cf1\par}\pard\plain\intbl\itap1\s0\ilvl0\ls6\tx360\tx720\fi-360\sb0\sa0\aspalpha\aspnum\adjustright\brdrt\brdrl\brdrb\brdrr\brdrbtw\brdrbar\nowidctlpar +\ltrpar\li720\lin720\ri0\rin0\ql\faauto\sl240\slmult1\rtlch\ab0\ai0\af2\afs22\ltrch\b0\i0\fs22\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1{\listtext\pard\plain\tx360\fi-360\aspalpha\aspnum\adjustright\ltrpar\li720\lin720\ri0\rin0\ql\faauto\rtlch\ab0\ai0\af2\afs20 +\ltrch\fs20\loch\af2\dbch\af2\hich\f2\insrsid10976062\strike0\ulnone\cf1 -\tab }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 Build}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 } +{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 in}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0 +\ulnone\cf1 default}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 functionality}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2 +\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 for}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20 +\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 students}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 to}{\rtlch\ab0\ai0\af2\afs20 +\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 vote}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20 +\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 for}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 contest}{ +\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 entries}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0 +\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 into}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2 +\hich\f2\strike0\ulnone\cf1 the}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 platform}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20 +\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 itself}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\insrsid10976062\strike0\ulnone\cf1\par}\pard +\plain\intbl\itap1\s0\ilvl0\ls6\tx360\tx720\fi-360\sb0\sa0\aspalpha\aspnum\adjustright\brdrt\brdrl\brdrb\brdrr\brdrbtw\brdrbar\nowidctlpar\ltrpar\li720\lin720\ri0\rin0\ql\faauto\sl240\slmult1\rtlch\ab0\ai0\af2\afs22\ltrch\b0\i0\fs22\loch\af2\dbch\af2\hich\f2\strike0 +\ulnone\cf1{\listtext\pard\plain\tx360\fi-360\aspalpha\aspnum\adjustright\ltrpar\li720\lin720\ri0\rin0\ql\faauto\rtlch\ab0\ai0\af2\afs20\ltrch\fs20\loch\af2\dbch\af2\hich\f2\insrsid10976062\strike0\ulnone\cf1 -\tab }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20 +\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 Contest}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 entries}{\rtlch\ab0\ai0\af2\afs20 +\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 will}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20 +\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 be}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 randomly}{ +\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 displayed}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0 +\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 after}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2 +\hich\f2\strike0\ulnone\cf1 submission}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 deadline}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20 +\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 and}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20 +\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 students}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 will}{ +\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 be}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0 +\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 credited}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2 +\hich\f2\strike0\ulnone\cf1 XP}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 immediately}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20 +\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 after}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20 +\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 voting}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\insrsid10976062\strike0\ulnone\cf1\par}\pard\plain\intbl\itap1\s0\ilvl0\ls6\tx360\tx720\fi-360\sb0\sa0\aspalpha\aspnum +\adjustright\brdrt\brdrl\brdrb\brdrr\brdrbtw\brdrbar\nowidctlpar\ltrpar\li720\lin720\ri0\rin0\ql\faauto\sl240\slmult1\rtlch\ab0\ai0\af2\afs22\ltrch\b0\i0\fs22\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1{\listtext\pard\plain\tx360\fi-360\aspalpha\aspnum\adjustright +\ltrpar\li720\lin720\ri0\rin0\ql\faauto\rtlch\ab0\ai0\af2\afs20\ltrch\fs20\loch\af2\dbch\af2\hich\f2\insrsid10976062\strike0\ulnone\cf1 -\tab }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 Instantaneously}{\rtlch\ab0\ai0\af2\afs20 +\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 compute}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20 +\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 and}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 credit}{\rtlch\ab0\ai0\af2\afs20 +\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 XP}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20 +\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 for}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 winning}{ +\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 submissions}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0 +\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 past}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2 +\hich\f2\strike0\ulnone\cf1 voting}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 deadline}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20 +\loch\af2\dbch\af2\hich\f2\insrsid10976062\strike0\ulnone\cf1\par}\pard\plain\intbl\itap1\s0\ilvl0\ls6\tx360\tx720\fi-360\sb0\sa0\aspalpha\aspnum\adjustright\brdrt\brdrl\brdrb\brdrr\brdrbtw\brdrbar\nowidctlpar\ltrpar\li720\lin720\ri0\rin0\ql\faauto\sl240 +\slmult1\rtlch\ab0\ai0\af2\afs22\ltrch\b0\i0\fs22\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1{\listtext\pard\plain\tx360\fi-360\aspalpha\aspnum\adjustright\ltrpar\li720\lin720\ri0\rin0\ql\faauto\rtlch\ab0\ai0\af2\afs20\ltrch\fs20\loch\af2\dbch\af2\hich\f2\insrsid10976062\strike0 +\ulnone\cf1 -\tab }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 Purpose}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 : }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2 +\dbch\af2\hich\f2\strike0\ulnone\cf1 minimise}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 work}{\rtlch\ab0\ai0\af2\afs20 +\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 from}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20 +\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 manual}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 allocation}{ +\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 and}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0 +\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 collation}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2 +\hich\f2\strike0\ulnone\cf1 of}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 contest}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20 +\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 entries}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\insrsid10976062\strike0\ulnone\cf1\cell}\pard +\plain\intbl\itap1\s0\ilvl0\fi0\sb0\sa0\aspalpha\aspnum\adjustright\brdrt\brdrl\brdrb\brdrr\brdrbtw\brdrbar\nowidctlpar\ltrpar\li0\lin0\ri0\rin0\ql\faauto\sl240\slmult1\rtlch\ab0\ai0\af2\afs22\ltrch\b0\i0\fs22\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1{ +\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\insrsid10976062\strike0\ulnone\cf1\cell}\pard\plain\intbl\itap1\s0\ilvl0\fi0\sb0\sa0\aspalpha\aspnum\adjustright\brdrt\brdrl\brdrb\brdrr\brdrbtw\brdrbar\nowidctlpar\ltrpar\li0\lin0\ri0\rin0 +\ql\faauto\sl240\slmult1\rtlch\ab0\ai0\af2\afs22\ltrch\b0\i0\fs22\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\insrsid10976062\strike0\ulnone\cf1\par}\pard\plain\intbl\itap1\s0\ilvl0\fi0\sb0\sa0 +\aspalpha\aspnum\adjustright\brdrt\brdrl\brdrb\brdrr\brdrbtw\brdrbar\nowidctlpar\ltrpar\li0\lin0\ri0\rin0\ql\faauto\sl240\slmult1\rtlch\ab0\ai0\af2\afs22\ltrch\b0\i0\fs22\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2 +\dbch\af2\hich\f2\strike0\ulnone\cf1 Bonus}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\insrsid10976062\strike0\ulnone\cf1\cell}{\trowd\irow5\irowband5\lastrow\ltrrow\trql\trgaph108\trpaddl108\trpaddfl3\trbrdrt\brdrs\brdrw10\brdrcf0\brsp0\trbrdrl\brdrs\brdrw10\brdrcf0\brsp0\trbrdrb\brdrs\brdrw10\brdrcf0\brsp0\trbrdrr\brdrs\brdrw10\brdrcf0\brsp0\trbrdrh\brdrs\brdrw10\brdrcf0\brsp0 +\trbrdrv\brdrs\brdrw10\brdrcf0\brsp0\trwWidth5000\trftsWidth2\trautofit1\trwWidthB0\trftsWidthB3\trpaddt0\trpaddft3\trpaddb0\trpaddfb3\trpaddr108\trpaddfr3\trrh0\trleft-100\clftsWidth1\clvertalt\clpadl100\clpadfl3\clpadb100\clpadfb3\clpadt100\clpadft3\clpadr100 +\clpadfr3\clbrdrl\brdrs\brdrw20\brdrcf1\brsp0\clbrdrr\brdrs\brdrw20\brdrcf1\brsp0\clbrdrt\brdrs\brdrw20\brdrcf1\brsp0\clbrdrb\brdrs\brdrw20\brdrcf1\brsp0\cldgll\brdrnone\cldglu\brdrnone\cellx5660\clftsWidth1\clvertalt\clpadl100\clpadfl3\clpadb100\clpadfb3\clpadt100 +\clpadft3\clpadr100\clpadfr3\clbrdrl\brdrs\brdrw20\brdrcf1\brsp0\clbrdrr\brdrs\brdrw20\brdrcf1\brsp0\clbrdrt\brdrs\brdrw20\brdrcf1\brsp0\clbrdrb\brdrs\brdrw20\brdrcf1\brsp0\cldgll\brdrnone\cldglu\brdrnone\cellx7475\clftsWidth1\clvertalt\clpadl100\clpadfl3\clpadb100 +\clpadfb3\clpadt100\clpadft3\clpadr100\clpadfr3\clbrdrl\brdrs\brdrw20\brdrcf1\brsp0\clbrdrr\brdrs\brdrw20\brdrcf1\brsp0\clbrdrt\brdrs\brdrw20\brdrcf1\brsp0\clbrdrb\brdrs\brdrw20\brdrcf1\brsp0\cldgll\brdrnone\cldglu\brdrnone\cellx9260\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\insrsid10976062\strike0\ulnone\cf1 +\row}\pard\plain\itap0\s0\ilvl0\fi0\sb0\sa0\aspalpha\aspnum\adjustright\brdrt\brdrl\brdrb\brdrr\brdrbtw\brdrbar\widctlpar\ltrpar\li0\lin0\ri0\rin0\ql\faauto\sl276\slmult1\rtlch\ab0\ai0\af2\afs22\ltrch\b0\i0\fs22\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1{ +\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\insrsid10976062\strike0\ulnone\cf1\par}{\*\latentstyles\lsdstimax267\lsdlockeddef0\lsdsemihiddendef0\lsdunhideuseddef0\lsdqformatdef0\lsdprioritydef0{\lsdlockedexcept\lsdqformat1 Normal;\lsdqformat1 heading 1;\lsdsemihidden1\lsdunhideused1\lsdqformat1 heading 2;\lsdsemihidden1\lsdunhideused1\lsdqformat1 heading 3 +;\lsdsemihidden1\lsdunhideused1\lsdqformat1 heading 4;\lsdsemihidden1\lsdunhideused1\lsdqformat1 heading 5;\lsdsemihidden1\lsdunhideused1\lsdqformat1 heading 6;\lsdsemihidden1\lsdunhideused1\lsdqformat1 heading 7;\lsdsemihidden1\lsdunhideused1\lsdqformat1 heading 8 +;\lsdsemihidden1\lsdunhideused1\lsdqformat1 heading 9;\lsdsemihidden1\lsdunhideused1\lsdqformat1 caption;\lsdqformat1 Title;\lsdqformat1 Subtitle;\lsdqformat1 Strong;\lsdqformat1 Emphasis;\lsdsemihidden1\lsdpriority99 Placeholder Text;\lsdqformat1\lsdpriority1 No Spacing +;\lsdpriority60 Light Shading;\lsdpriority61 Light List;\lsdpriority62 Light Grid;\lsdpriority63 Medium Shading 1;\lsdpriority64 Medium Shading 2;\lsdpriority65 Medium List 1;\lsdpriority66 Medium List 2;\lsdpriority67 Medium Grid 1;\lsdpriority68 Medium Grid 2 +;\lsdpriority69 Medium Grid 3;\lsdpriority70 Dark List;\lsdpriority71 Colorful Shading;\lsdpriority72 Colorful List;\lsdpriority73 Colorful Grid;\lsdpriority60 Light Shading Accent 1;\lsdpriority61 Light List Accent 1;\lsdpriority62 Light Grid Accent 1;\lsdpriority63 Medium Shading 1 Accent 1 +;\lsdpriority64 Medium Shading 2 Accent 1;\lsdpriority65 Medium List 1 Accent 1;\lsdsemihidden1\lsdpriority99 Revision;\lsdqformat1\lsdpriority34 List Paragraph;\lsdqformat1\lsdpriority29 Quote;\lsdqformat1\lsdpriority30 Intense Quote;\lsdpriority66 Medium List 2 Accent 1 +;\lsdpriority67 Medium Grid 1 Accent 1;\lsdpriority68 Medium Grid 2 Accent 1;\lsdpriority69 Medium Grid 3 Accent 1;\lsdpriority70 Dark List Accent 1;\lsdpriority71 Colorful Shading Accent 1;\lsdpriority72 Colorful List Accent 1;\lsdpriority73 Colorful Grid Accent 1 +;\lsdpriority60 Light Shading Accent 2;\lsdpriority61 Light List Accent 2;\lsdpriority62 Light Grid Accent 2;\lsdpriority63 Medium Shading 1 Accent 2;\lsdpriority64 Medium Shading 2 Accent 2;\lsdpriority65 Medium List 1 Accent 2;\lsdpriority66 Medium List 2 Accent 2 +;\lsdpriority67 Medium Grid 1 Accent 2;\lsdpriority68 Medium Grid 2 Accent 2;\lsdpriority69 Medium Grid 3 Accent 2;\lsdpriority70 Dark List Accent 2;\lsdpriority71 Colorful Shading Accent 2;\lsdpriority72 Colorful List Accent 2;\lsdpriority73 Colorful Grid Accent 2 +;\lsdpriority60 Light Shading Accent 3;\lsdpriority61 Light List Accent 3;\lsdpriority62 Light Grid Accent 3;\lsdpriority63 Medium Shading 1 Accent 3;\lsdpriority64 Medium Shading 2 Accent 3;\lsdpriority65 Medium List 1 Accent 3;\lsdpriority66 Medium List 2 Accent 3 +;\lsdpriority67 Medium Grid 1 Accent 3;\lsdpriority68 Medium Grid 2 Accent 3;\lsdpriority69 Medium Grid 3 Accent 3;\lsdpriority70 Dark List Accent 3;\lsdpriority71 Colorful Shading Accent 3;\lsdpriority72 Colorful List Accent 3;\lsdpriority73 Colorful Grid Accent 3 +;\lsdpriority60 Light Shading Accent 4;\lsdpriority61 Light List Accent 4;\lsdpriority62 Light Grid Accent 4;\lsdpriority63 Medium Shading 1 Accent 4;\lsdpriority64 Medium Shading 2 Accent 4;\lsdpriority65 Medium List 1 Accent 4;\lsdpriority66 Medium List 2 Accent 4 +;\lsdpriority67 Medium Grid 1 Accent 4;\lsdpriority68 Medium Grid 2 Accent 4;\lsdpriority69 Medium Grid 3 Accent 4;\lsdpriority70 Dark List Accent 4;\lsdpriority71 Colorful Shading Accent 4;\lsdpriority72 Colorful List Accent 4;\lsdpriority73 Colorful Grid Accent 4 +;\lsdpriority60 Light Shading Accent 5;\lsdpriority61 Light List Accent 5;\lsdpriority62 Light Grid Accent 5;\lsdpriority63 Medium Shading 1 Accent 5;\lsdpriority64 Medium Shading 2 Accent 5;\lsdpriority65 Medium List 1 Accent 5;\lsdpriority66 Medium List 2 Accent 5 +;\lsdpriority67 Medium Grid 1 Accent 5;\lsdpriority68 Medium Grid 2 Accent 5;\lsdpriority69 Medium Grid 3 Accent 5;\lsdpriority70 Dark List Accent 5;\lsdpriority71 Colorful Shading Accent 5;\lsdpriority72 Colorful List Accent 5;\lsdpriority73 Colorful Grid Accent 5 +;\lsdpriority60 Light Shading Accent 6;\lsdpriority61 Light List Accent 6;\lsdpriority62 Light Grid Accent 6;\lsdpriority63 Medium Shading 1 Accent 6;\lsdpriority64 Medium Shading 2 Accent 6;\lsdpriority65 Medium List 1 Accent 6;\lsdpriority66 Medium List 2 Accent 6 +;\lsdpriority67 Medium Grid 1 Accent 6;\lsdpriority68 Medium Grid 2 Accent 6;\lsdpriority69 Medium Grid 3 Accent 6;\lsdpriority70 Dark List Accent 6;\lsdpriority71 Colorful Shading Accent 6;\lsdpriority72 Colorful List Accent 6;\lsdpriority73 Colorful Grid Accent 6 +;\lsdqformat1\lsdpriority19 Subtle Emphasis;\lsdqformat1\lsdpriority21 Intense Emphasis;\lsdqformat1\lsdpriority31 Subtle Reference;\lsdqformat1\lsdpriority32 Intense Reference;\lsdqformat1\lsdpriority33 Book Title;\lsdsemihidden1\lsdunhideused1\lsdpriority37 Bibliography +;\lsdsemihidden1\lsdunhideused1\lsdqformat1\lsdpriority39 TOC Heading;}}} \ No newline at end of file From eb4a2fadd7c61e44db7f2978625605046d60655d Mon Sep 17 00:00:00 2001 From: Shuming <43642522+geshuming@users.noreply.github.com> Date: Thu, 31 Jan 2019 17:36:54 +0800 Subject: [PATCH 02/12] Delete CP3108 Grader.rtf --- CP3108 Grader.rtf | 478 ---------------------------------------------- 1 file changed, 478 deletions(-) delete mode 100644 CP3108 Grader.rtf diff --git a/CP3108 Grader.rtf b/CP3108 Grader.rtf deleted file mode 100644 index 471e123..0000000 --- a/CP3108 Grader.rtf +++ /dev/null @@ -1,478 +0,0 @@ -{\rtf1\ansi\ansicpg1252\uc0\stshfdbch0\stshfloch0\stshfhich0\stshfbi0\deff0\adeff0{\fonttbl{\f0\froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;}{\f1\froman\fcharset2\fprq2{\*\panose 05050102010706020507}Symbol;}{\f2\fswiss\fcharset0\fprq2{\*\panose 020b0604020202020204}Arial;}}{\colortbl;\red0\green0\blue0;\red255\green255\blue255 -;\red17\green85\blue204;\red67\green67\blue67;\red102\green102\blue102;}{\stylesheet{\s0\snext0\sqformat\spriority0\fi0\sb0\sa0\aspalpha\aspnum\adjustright\widctlpar\ltrpar\li0\lin0\ri0\rin0\ql\faauto\sl276\slmult1\rtlch\ab0\ai0\af2\afs22\ltrch\b0\i0\fs22\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 Normal;}{\s1\sbasedon0\snext0\styrsid15694742 -\sqformat\spriority0\keep\keepn\fi0\sb400\sa120\aspalpha\aspnum\adjustright\widctlpar\ltrpar\li0\lin0\ri0\rin0\ql\faauto\sl276\slmult1\rtlch\ab0\ai0\af2\afs40\ltrch\b0\i0\fs40\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 heading 1;}{\s2\sbasedon0\snext0\styrsid15694742 -\sqformat\spriority0\keep\keepn\fi0\sb360\sa120\aspalpha\aspnum\adjustright\widctlpar\ltrpar\li0\lin0\ri0\rin0\ql\faauto\sl276\slmult1\rtlch\ab0\ai0\af2\afs32\ltrch\b0\i0\fs32\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 heading 2;}{\s3\sbasedon0\snext0\styrsid15694742 -\sqformat\spriority0\keep\keepn\fi0\sb320\sa80\aspalpha\aspnum\adjustright\widctlpar\ltrpar\li0\lin0\ri0\rin0\ql\faauto\sl276\slmult1\rtlch\ab0\ai0\af2\afs28\ltrch\b0\i0\fs28\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf4 heading 3;}{\s4\sbasedon0\snext0\styrsid15694742 -\sqformat\spriority0\keep\keepn\fi0\sb280\sa80\aspalpha\aspnum\adjustright\widctlpar\ltrpar\li0\lin0\ri0\rin0\ql\faauto\sl276\slmult1\rtlch\ab0\ai0\af2\afs24\ltrch\b0\i0\fs24\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf5 heading 4;}{\s5\sbasedon0\snext0\styrsid15694742 -\sqformat\spriority0\keep\keepn\fi0\sb240\sa80\aspalpha\aspnum\adjustright\widctlpar\ltrpar\li0\lin0\ri0\rin0\ql\faauto\sl276\slmult1\rtlch\ab0\ai0\af2\afs22\ltrch\b0\i0\fs22\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf5 heading 5;}{\s6\sbasedon0\snext0\styrsid15694742 -\sqformat\spriority0\keep\keepn\fi0\sb240\sa80\aspalpha\aspnum\adjustright\widctlpar\ltrpar\li0\lin0\ri0\rin0\ql\faauto\sl276\slmult1\rtlch\ab0\ai\af2\afs22\ltrch\b0\i\fs22\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf5 heading 6;}{\*\cs10\additive\ssemihidden\spriority0 Default Paragraph Font -;}{\s15\sbasedon0\snext15\styrsid15694742\sqformat\spriority0\keep\keepn\fi0\sb0\sa60\aspalpha\aspnum\adjustright\widctlpar\ltrpar\li0\lin0\ri0\rin0\ql\faauto\sl276\slmult1\rtlch\ab0\ai0\af2\afs52\ltrch\b0\i0\fs52\loch\af2\dbch\af2\hich\f2\strike0 -\ulnone\cf1 Title;}{\s16\sbasedon0\snext16\styrsid15694742\sqformat\spriority0\keep\keepn\fi0\sb0\sa320\aspalpha\aspnum\adjustright\widctlpar\ltrpar\li0\lin0\ri0\rin0\ql\faauto\sl276\slmult1\rtlch\ab0\ai0\af2\afs30\ltrch\b0\i0\fs30\loch\af2\dbch\af2\hich\f2\strike0 -\ulnone\cf5 Subtitle;}}{\*\listtable{\list\listtemplateid1{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelstartat1{\leveltext \'01\u9679 ;}{\levelnumbers;}\levelfollow0\ulnone\jclisttab\tx360\fi-360\li720\lin720}{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelstartat1 -{\leveltext \'01\u9675 ;}{\levelnumbers;}\levelfollow0\ulnone\jclisttab\tx1080\fi-360\li1440\lin1440}{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelstartat1{\leveltext \'01\u9632 ;}{\levelnumbers;}\levelfollow0\ulnone\jclisttab\tx1800\fi-180\li2160\lin2160} -{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelstartat1{\leveltext \'01\u9679 ;}{\levelnumbers;}\levelfollow0\ulnone\jclisttab\tx2520\fi-360\li2880\lin2880}{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelstartat1{\leveltext \'01\u9675 -;}{\levelnumbers;}\levelfollow0\ulnone\jclisttab\tx3240\fi-360\li3600\lin3600}{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelstartat1{\leveltext \'01\u9632 ;}{\levelnumbers;}\levelfollow0\ulnone\jclisttab\tx3960\fi-180\li4320\lin4320}{ -\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelstartat1{\leveltext \'01\u9679 ;}{\levelnumbers;}\levelfollow0\ulnone\jclisttab\tx4680\fi-360\li5040\lin5040}{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelstartat1{\leveltext \'01\u9675 ;}{ -\levelnumbers;}\levelfollow0\ulnone\jclisttab\tx5400\fi-360\li5760\lin5760}{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelstartat1{\leveltext \'01\u9632 ;}{\levelnumbers;}\levelfollow0\ulnone\jclisttab\tx6120\fi-180\li6480\lin6480}\listid1}{\list\listtemplateid2 -{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelstartat1{\leveltext \'01-;}{\levelnumbers;}\levelfollow0\ulnone\jclisttab\tx360\fi-360\li720\lin720}{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelstartat1{\leveltext \'01-;}{ -\levelnumbers;}\levelfollow0\ulnone\jclisttab\tx1080\fi-360\li1440\lin1440}{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelstartat1{\leveltext \'01-;}{\levelnumbers;}\levelfollow0\ulnone\jclisttab\tx1800\fi-180\li2160\lin2160}{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelstartat1 -{\leveltext \'01-;}{\levelnumbers;}\levelfollow0\ulnone\jclisttab\tx2520\fi-360\li2880\lin2880}{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelstartat1{\leveltext \'01-;}{\levelnumbers;}\levelfollow0\ulnone\jclisttab\tx3240\fi-360\li3600\lin3600} -{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelstartat1{\leveltext \'01-;}{\levelnumbers;}\levelfollow0\ulnone\jclisttab\tx3960\fi-180\li4320\lin4320}{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelstartat1{\leveltext \'01-;}{ -\levelnumbers;}\levelfollow0\ulnone\jclisttab\tx4680\fi-360\li5040\lin5040}{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelstartat1{\leveltext \'01-;}{\levelnumbers;}\levelfollow0\ulnone\jclisttab\tx5400\fi-360\li5760\lin5760}{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelstartat1 -{\leveltext \'01-;}{\levelnumbers;}\levelfollow0\ulnone\jclisttab\tx6120\fi-180\li6480\lin6480}\listid2}{\list\listtemplateid3{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelstartat1{\leveltext \'01-;}{\levelnumbers;}\levelfollow0\ulnone -\jclisttab\tx360\fi-360\li720\lin720}{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelstartat1{\leveltext \'01-;}{\levelnumbers;}\levelfollow0\ulnone\jclisttab\tx1080\fi-360\li1440\lin1440}{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelstartat1 -{\leveltext \'01-;}{\levelnumbers;}\levelfollow0\ulnone\jclisttab\tx1800\fi-180\li2160\lin2160}{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelstartat1{\leveltext \'01-;}{\levelnumbers;}\levelfollow0\ulnone\jclisttab\tx2520\fi-360\li2880\lin2880} -{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelstartat1{\leveltext \'01-;}{\levelnumbers;}\levelfollow0\ulnone\jclisttab\tx3240\fi-360\li3600\lin3600}{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelstartat1{\leveltext \'01-;}{ -\levelnumbers;}\levelfollow0\ulnone\jclisttab\tx3960\fi-180\li4320\lin4320}{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelstartat1{\leveltext \'01-;}{\levelnumbers;}\levelfollow0\ulnone\jclisttab\tx4680\fi-360\li5040\lin5040}{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelstartat1 -{\leveltext \'01-;}{\levelnumbers;}\levelfollow0\ulnone\jclisttab\tx5400\fi-360\li5760\lin5760}{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelstartat1{\leveltext \'01-;}{\levelnumbers;}\levelfollow0\ulnone\jclisttab\tx6120\fi-180\li6480\lin6480}\listid3} -{\list\listtemplateid4{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelstartat1{\leveltext \'01-;}{\levelnumbers;}\levelfollow0\ulnone\jclisttab\tx360\fi-360\li720\lin720}{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelstartat1{ -\leveltext \'01-;}{\levelnumbers;}\levelfollow0\ulnone\jclisttab\tx1080\fi-360\li1440\lin1440}{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelstartat1{\leveltext \'01-;}{\levelnumbers;}\levelfollow0\ulnone\jclisttab\tx1800\fi-180\li2160\lin2160}{ -\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelstartat1{\leveltext \'01-;}{\levelnumbers;}\levelfollow0\ulnone\jclisttab\tx2520\fi-360\li2880\lin2880}{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelstartat1{\leveltext \'01-;}{\levelnumbers;}\levelfollow0 -\ulnone\jclisttab\tx3240\fi-360\li3600\lin3600}{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelstartat1{\leveltext \'01-;}{\levelnumbers;}\levelfollow0\ulnone\jclisttab\tx3960\fi-180\li4320\lin4320}{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelstartat1 -{\leveltext \'01-;}{\levelnumbers;}\levelfollow0\ulnone\jclisttab\tx4680\fi-360\li5040\lin5040}{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelstartat1{\leveltext \'01-;}{\levelnumbers;}\levelfollow0\ulnone\jclisttab\tx5400\fi-360\li5760\lin5760} -{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelstartat1{\leveltext \'01-;}{\levelnumbers;}\levelfollow0\ulnone\jclisttab\tx6120\fi-180\li6480\lin6480}\listid4}{\list\listtemplateid5{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelstartat1 -{\leveltext \'01-;}{\levelnumbers;}\levelfollow0\ulnone\jclisttab\tx360\fi-360\li720\lin720}{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelstartat1{\leveltext \'01-;}{\levelnumbers;}\levelfollow0\ulnone\jclisttab\tx1080\fi-360\li1440\lin1440} -{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelstartat1{\leveltext \'01-;}{\levelnumbers;}\levelfollow0\ulnone\jclisttab\tx1800\fi-180\li2160\lin2160}{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelstartat1{\leveltext \'01-;}{ -\levelnumbers;}\levelfollow0\ulnone\jclisttab\tx2520\fi-360\li2880\lin2880}{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelstartat1{\leveltext \'01-;}{\levelnumbers;}\levelfollow0\ulnone\jclisttab\tx3240\fi-360\li3600\lin3600}{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelstartat1 -{\leveltext \'01-;}{\levelnumbers;}\levelfollow0\ulnone\jclisttab\tx3960\fi-180\li4320\lin4320}{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelstartat1{\leveltext \'01-;}{\levelnumbers;}\levelfollow0\ulnone\jclisttab\tx4680\fi-360\li5040\lin5040} -{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelstartat1{\leveltext \'01-;}{\levelnumbers;}\levelfollow0\ulnone\jclisttab\tx5400\fi-360\li5760\lin5760}{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelstartat1{\leveltext \'01-;}{ -\levelnumbers;}\levelfollow0\ulnone\jclisttab\tx6120\fi-180\li6480\lin6480}\listid5}{\list\listtemplateid6{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelstartat1{\leveltext \'01-;}{\levelnumbers;}\levelfollow0\ulnone\jclisttab\tx360\fi-360\li720\lin720}{ -\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelstartat1{\leveltext \'01-;}{\levelnumbers;}\levelfollow0\ulnone\jclisttab\tx1080\fi-360\li1440\lin1440}{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelstartat1{\leveltext \'01-;}{\levelnumbers;}\levelfollow0 -\ulnone\jclisttab\tx1800\fi-180\li2160\lin2160}{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelstartat1{\leveltext \'01-;}{\levelnumbers;}\levelfollow0\ulnone\jclisttab\tx2520\fi-360\li2880\lin2880}{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelstartat1 -{\leveltext \'01-;}{\levelnumbers;}\levelfollow0\ulnone\jclisttab\tx3240\fi-360\li3600\lin3600}{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelstartat1{\leveltext \'01-;}{\levelnumbers;}\levelfollow0\ulnone\jclisttab\tx3960\fi-180\li4320\lin4320} -{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelstartat1{\leveltext \'01-;}{\levelnumbers;}\levelfollow0\ulnone\jclisttab\tx4680\fi-360\li5040\lin5040}{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelstartat1{\leveltext \'01-;}{ -\levelnumbers;}\levelfollow0\ulnone\jclisttab\tx5400\fi-360\li5760\lin5760}{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelstartat1{\leveltext \'01-;}{\levelnumbers;}\levelfollow0\ulnone\jclisttab\tx6120\fi-180\li6480\lin6480}\listid6}}{ -\*\listoverridetable{\listoverride\listid1\listoverridecount0\ls1}{\listoverride\listid2\listoverridecount0\ls2}{\listoverride\listid3\listoverridecount0\ls3}{\listoverride\listid4\listoverridecount0\ls4}{\listoverride\listid5\listoverridecount0\ls5}{\listoverride\listid6\listoverridecount0\ls6}}{\*\rsidtbl\rsid10976062}{\*\generator Aspose.Words for Java 13.12.0.0;}{\info\version1\edmins0\nofpages1\nofwords0\nofchars0\nofcharsws0}{\mmathPr\mbrkBin0\mbrkBinSub0\mdefJc1\mdispDef1\minterSp0\mintLim0\mintraSp0\mlMargin0\mmathFont0\mnaryLim1\mpostSp0\mpreSp0\mrMargin0\msmallFrac0\mwrapIndent1440\mwrapRight0} -\deflang1033\deflangfe2052\adeflang1025\jexpand\showxmlerrors1\validatexml1{\*\wgrffmtfilter 013f}\viewkind1\viewscale100\fet0\ftnbj\aenddoc\ftnrstcont\aftnrstcont\ftnnar\aftnnrlc\widowctrl\nospaceforul\nolnhtadjtbl\alntblind\lyttblrtgr\dntblnsbdb\noxlattoyen -\wrppunct\nobrkwrptbl\expshrtn\snaptogridincell\asianbrkrule\htmautsp\noultrlspc\useltbaln\splytwnine\ftnlytwnine\lytcalctblwd\allowfieldendsel\lnbrkrule\nouicompat\nofeaturethrottle1\formshade\nojkernpunct\dghspace180\dgvspace180\dghorigin1800\dgvorigin1440\dghshow1\dgvshow1 -\dgmargin\pgbrdrhead\pgbrdrfoot\sectd\sectlinegrid360\pgwsxn12240\pghsxn15840\marglsxn1440\margrsxn1440\margtsxn1440\margbsxn1440\guttersxn0\headery708\footery708\colsx708\ltrsect\pard\plain\itap0\s0\ilvl0\fi0\sb0\sa0\aspalpha\aspnum\adjustright\brdrt\brdrl\brdrb\brdrr\brdrbtw\brdrbar -\widctlpar\ltrpar\li0\lin0\ri0\rin0\qc\faauto\sl276\slmult1\rtlch\ab0\ai0\af2\afs22\ltrch\b0\i0\fs22\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1{\rtlch\ab\ai0\af2\afs26\ltrch\b\i0\fs26\loch\af2\dbch\af2\hich\f2\strike0\ul\cf1\chshdng10000\chcbpat2\chcfpat2 CP}{ -\rtlch\ab\ai0\af2\afs26\ltrch\b\i0\fs26\loch\af2\dbch\af2\hich\f2\strike0\ul\cf1\chshdng10000\chcbpat2\chcfpat2 3108 }{\rtlch\ab\ai0\af2\afs26\ltrch\b\i0\fs26\loch\af2\dbch\af2\hich\f2\strike0\ul\cf1\chshdng10000\chcbpat2\chcfpat2 Independent}{\rtlch\ab\ai0\af2\afs26 -\ltrch\b\i0\fs26\loch\af2\dbch\af2\hich\f2\strike0\ul\cf1\chshdng10000\chcbpat2\chcfpat2 }{\rtlch\ab\ai0\af2\afs26\ltrch\b\i0\fs26\loch\af2\dbch\af2\hich\f2\strike0\ul\cf1\chshdng10000\chcbpat2\chcfpat2 Work}{\rtlch\ab\ai0\af2\afs26\ltrch\b\i0\fs26\loch\af2 -\dbch\af2\hich\f2\insrsid10976062\strike0\ul\cf1\chshdng10000\chcbpat2\chcfpat2\par}\pard\plain\itap0\s0\ilvl0\fi0\sb0\sa0\aspalpha\aspnum\adjustright\brdrt\brdrl\brdrb\brdrr\brdrbtw\brdrbar\widctlpar\ltrpar\li0\lin0\ri0\rin0\qc\faauto\sl276\slmult1\rtlch\ab0\ai0\af2\afs22 -\ltrch\b0\i0\fs22\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1{\rtlch\ab\ai0\af2\afs20\ltrch\b\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1\chshdng10000\chcbpat2\chcfpat2 Preliminary}{\rtlch\ab\ai0\af2\afs20\ltrch\b\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0 -\ulnone\cf1\chshdng10000\chcbpat2\chcfpat2 }{\rtlch\ab\ai0\af2\afs20\ltrch\b\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1\chshdng10000\chcbpat2\chcfpat2 Project}{\rtlch\ab\ai0\af2\afs20\ltrch\b\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1\chshdng10000\chcbpat2\chcfpat2 } -{\rtlch\ab\ai0\af2\afs20\ltrch\b\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1\chshdng10000\chcbpat2\chcfpat2 Proposal}{\rtlch\ab\ai0\af2\afs20\ltrch\b\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1\chshdng10000\chcbpat2\chcfpat2 - }{ -\rtlch\ab\ai0\af2\afs20\ltrch\b\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1\chshdng10000\chcbpat2\chcfpat2 Improvements}{\rtlch\ab\ai0\af2\afs20\ltrch\b\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1\chshdng10000\chcbpat2\chcfpat2 }{\rtlch\ab\ai0\af2\afs20 -\ltrch\b\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1\chshdng10000\chcbpat2\chcfpat2 to}{\rtlch\ab\ai0\af2\afs20\ltrch\b\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1\chshdng10000\chcbpat2\chcfpat2 }{\rtlch\ab\ai0\af2\afs20\ltrch\b\i0\fs20 -\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1\chshdng10000\chcbpat2\chcfpat2 Source}{\rtlch\ab\ai0\af2\afs20\ltrch\b\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1\chshdng10000\chcbpat2\chcfpat2 }{\rtlch\ab\ai0\af2\afs20\ltrch\b\i0\fs20\loch\af2\dbch\af2 -\hich\f2\strike0\ulnone\cf1\chshdng10000\chcbpat2\chcfpat2 Academy}{\rtlch\ab\ai0\af2\afs20\ltrch\b\i0\fs20\loch\af2\dbch\af2\hich\f2\insrsid10976062\strike0\ulnone\cf1\chshdng10000\chcbpat2\chcfpat2\par}\pard\plain\itap0\s0\ilvl0\fi0\sb0\sa0\aspalpha\aspnum -\adjustright\brdrt\brdrl\brdrb\brdrr\brdrbtw\brdrbar\widctlpar\ltrpar\li0\lin0\ri0\rin0\qc\faauto\sl276\slmult1\rtlch\ab0\ai0\af2\afs22\ltrch\b0\i0\fs22\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1{\rtlch\ab\ai0\af2\afs20\ltrch\b\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0 -\ulnone\cf1\chshdng10000\chcbpat2\chcfpat2 Project}{\rtlch\ab\ai0\af2\afs20\ltrch\b\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1\chshdng10000\chcbpat2\chcfpat2 }{\rtlch\ab\ai0\af2\afs20\ltrch\b\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1\chshdng10000\chcbpat2\chcfpat2 GRADING} -{\rtlch\ab\ai0\af2\afs20\ltrch\b\i0\fs20\loch\af2\dbch\af2\hich\f2\insrsid10976062\strike0\ulnone\cf1\chshdng10000\chcbpat2\chcfpat2\par}\pard\plain\itap0\s0\ilvl0\fi0\sb0\sa0\aspalpha\aspnum\adjustright\brdrt\brdrl\brdrb\brdrr\brdrbtw\brdrbar\widctlpar -\ltrpar\li0\lin0\ri0\rin0\ql\faauto\sl276\slmult1\rtlch\ab0\ai0\af2\afs22\ltrch\b0\i0\fs22\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\insrsid10976062\strike0\ulnone\cf1\chshdng10000\chcbpat2\chcfpat2 -\par}\pard\plain\itap0\s0\ilvl0\fi0\sb0\sa0\aspalpha\aspnum\adjustright\brdrt\brdrl\brdrb\brdrr\brdrbtw\brdrbar\widctlpar\ltrpar\li0\lin0\ri0\rin0\ql\faauto\sl276\slmult1\rtlch\ab0\ai0\af2\afs22\ltrch\b0\i0\fs22\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1{ -\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1\chshdng10000\chcbpat2\chcfpat2 Student}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1\chshdng10000\chcbpat2\chcfpat2 }{\rtlch\ab0\ai0\af2\afs20 -\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1\chshdng10000\chcbpat2\chcfpat2 names}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1\chshdng10000\chcbpat2\chcfpat2 :}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20 -\loch\af2\dbch\af2\hich\f2\insrsid10976062\strike0\ulnone\cf1\chshdng10000\chcbpat2\chcfpat2\par}\pard\plain\itap0\s0\ilvl0\fi0\sb0\sa0\aspalpha\aspnum\adjustright\brdrt\brdrl\brdrb\brdrr\brdrbtw\brdrbar\widctlpar\ltrpar\li0\lin0\ri0\rin0\ql\faauto\sl276 -\slmult1\rtlch\ab0\ai0\af2\afs22\ltrch\b0\i0\fs22\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1\chshdng10000\chcbpat2\chcfpat2 Ge}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20 -\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1\chshdng10000\chcbpat2\chcfpat2 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1\chshdng10000\chcbpat2\chcfpat2 Shuming}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2 -\dbch\af2\hich\f2\insrsid10976062\strike0\ulnone\cf1\chshdng10000\chcbpat2\chcfpat2\par}\pard\plain\itap0\s0\ilvl0\fi0\sb0\sa0\aspalpha\aspnum\adjustright\brdrt\brdrl\brdrb\brdrr\brdrbtw\brdrbar\widctlpar\ltrpar\li0\lin0\ri0\rin0\ql\faauto\sl276\slmult1 -\rtlch\ab0\ai0\af2\afs22\ltrch\b0\i0\fs22\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1\chshdng10000\chcbpat2\chcfpat2 Keven}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2 -\dbch\af2\hich\f2\strike0\ulnone\cf1\chshdng10000\chcbpat2\chcfpat2 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1\chshdng10000\chcbpat2\chcfpat2 Loo}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0 -\ulnone\cf1\chshdng10000\chcbpat2\chcfpat2 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1\chshdng10000\chcbpat2\chcfpat2 Yuquan}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\insrsid10976062\strike0 -\ulnone\cf1\chshdng10000\chcbpat2\chcfpat2\par}\pard\plain\itap0\s0\ilvl0\fi0\sb0\sa0\aspalpha\aspnum\adjustright\brdrt\brdrl\brdrb\brdrr\brdrbtw\brdrbar\widctlpar\ltrpar\li0\lin0\ri0\rin0\ql\faauto\sl276\slmult1\rtlch\ab0\ai0\af2\afs22\ltrch\b0\i0\fs22\loch\af2 -\dbch\af2\hich\f2\strike0\ulnone\cf1{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\insrsid10976062\strike0\ulnone\cf1\chshdng10000\chcbpat2\chcfpat2\par}\pard\plain\itap0\s0\ilvl0\fi0\sb0\sa0\aspalpha\aspnum\adjustright\brdrt\brdrl -\brdrb\brdrr\brdrbtw\brdrbar\widctlpar\ltrpar\li0\lin0\ri0\rin0\ql\faauto\sl276\slmult1\rtlch\ab0\ai0\af2\afs22\ltrch\b0\i0\fs22\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1\chshdng10000\chcbpat2\chcfpat2 Project} -{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1\chshdng10000\chcbpat2\chcfpat2 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1\chshdng10000\chcbpat2\chcfpat2 repositories}{ -\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1\chshdng10000\chcbpat2\chcfpat2 :}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\insrsid10976062\strike0\ulnone\cf1\chshdng10000\chcbpat2\chcfpat2\par} -\pard\plain\itap0\s0\ilvl0\fi0\sb0\sa0\aspalpha\aspnum\adjustright\brdrt\brdrl\brdrb\brdrr\brdrbtw\brdrbar\widctlpar\ltrpar\li0\lin0\ri0\rin0\ql\faauto\sl276\slmult1\rtlch\ab0\ai0\af2\afs22\ltrch\b0\i0\fs22\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1{\rtlch\ab0\ai0\af2\afs20 -\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1\chshdng10000\chcbpat2\chcfpat2 geshuming}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1\chshdng10000\chcbpat2\chcfpat2 /}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20 -\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1\chshdng10000\chcbpat2\chcfpat2 cadet}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1\chshdng10000\chcbpat2\chcfpat2 -}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2 -\dbch\af2\hich\f2\strike0\ulnone\cf1\chshdng10000\chcbpat2\chcfpat2 frontend}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1\chshdng10000\chcbpat2\chcfpat2 : }{\field{\*\fldinst{\rtlch\ab0\ai0\af2\afs22\ltrch\b0\i0\fs22 -\loch\af2\dbch\af2\hich\f2\insrsid10976062\strike0\ulnone\cf1 HYPERLINK "https://github.com/geshuming/cadet-frontend"}}{\fldrslt{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ul\cf3\chshdng10000\chcbpat2\chcfpat2 https}}}{\field{ -\*\fldinst{\rtlch\ab0\ai0\af2\afs22\ltrch\b0\i0\fs22\loch\af2\dbch\af2\hich\f2\insrsid10976062\strike0\ulnone\cf1 HYPERLINK "https://github.com/geshuming/cadet-frontend"}}{\fldrslt{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ul\cf3\chshdng10000\chcbpat2\chcfpat2 ://}}} -{\field{\*\fldinst{\rtlch\ab0\ai0\af2\afs22\ltrch\b0\i0\fs22\loch\af2\dbch\af2\hich\f2\insrsid10976062\strike0\ulnone\cf1 HYPERLINK "https://github.com/geshuming/cadet-frontend"}}{\fldrslt{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0 -\ul\cf3\chshdng10000\chcbpat2\chcfpat2 github}}}{\field{\*\fldinst{\rtlch\ab0\ai0\af2\afs22\ltrch\b0\i0\fs22\loch\af2\dbch\af2\hich\f2\insrsid10976062\strike0\ulnone\cf1 HYPERLINK "https://github.com/geshuming/cadet-frontend"}}{\fldrslt{\rtlch\ab0\ai0\af2\afs20 -\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ul\cf3\chshdng10000\chcbpat2\chcfpat2 .}}}{\field{\*\fldinst{\rtlch\ab0\ai0\af2\afs22\ltrch\b0\i0\fs22\loch\af2\dbch\af2\hich\f2\insrsid10976062\strike0\ulnone\cf1 HYPERLINK "https://github.com/geshuming/cadet-frontend"}} -{\fldrslt{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ul\cf3\chshdng10000\chcbpat2\chcfpat2 com}}}{\field{\*\fldinst{\rtlch\ab0\ai0\af2\afs22\ltrch\b0\i0\fs22\loch\af2\dbch\af2\hich\f2\insrsid10976062\strike0\ulnone\cf1 HYPERLINK "https://github.com/geshuming/cadet-frontend"}} -{\fldrslt{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ul\cf3\chshdng10000\chcbpat2\chcfpat2 /}}}{\field{\*\fldinst{\rtlch\ab0\ai0\af2\afs22\ltrch\b0\i0\fs22\loch\af2\dbch\af2\hich\f2\insrsid10976062\strike0\ulnone\cf1 HYPERLINK "https://github.com/geshuming/cadet-frontend"}} -{\fldrslt{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ul\cf3\chshdng10000\chcbpat2\chcfpat2 geshuming}}}{\field{\*\fldinst{\rtlch\ab0\ai0\af2\afs22\ltrch\b0\i0\fs22\loch\af2\dbch\af2\hich\f2\insrsid10976062\strike0\ulnone\cf1 HYPERLINK "https://github.com/geshuming/cadet-frontend"}} -{\fldrslt{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ul\cf3\chshdng10000\chcbpat2\chcfpat2 /}}}{\field{\*\fldinst{\rtlch\ab0\ai0\af2\afs22\ltrch\b0\i0\fs22\loch\af2\dbch\af2\hich\f2\insrsid10976062\strike0\ulnone\cf1 HYPERLINK "https://github.com/geshuming/cadet-frontend"}} -{\fldrslt{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ul\cf3\chshdng10000\chcbpat2\chcfpat2 cadet}}}{\field{\*\fldinst{\rtlch\ab0\ai0\af2\afs22\ltrch\b0\i0\fs22\loch\af2\dbch\af2\hich\f2\insrsid10976062\strike0\ulnone\cf1 HYPERLINK "https://github.com/geshuming/cadet-frontend"}} -{\fldrslt{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ul\cf3\chshdng10000\chcbpat2\chcfpat2 -}}}{\field{\*\fldinst{\rtlch\ab0\ai0\af2\afs22\ltrch\b0\i0\fs22\loch\af2\dbch\af2\hich\f2\insrsid10976062\strike0\ulnone\cf1 HYPERLINK "https://github.com/geshuming/cadet-frontend"}} -{\fldrslt{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ul\cf3\chshdng10000\chcbpat2\chcfpat2 frontend}}}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\insrsid10976062\strike0\ulnone\cf1\chshdng10000\chcbpat2\chcfpat2 -\par}\pard\plain\itap0\s0\ilvl0\fi0\sb0\sa0\aspalpha\aspnum\adjustright\brdrt\brdrl\brdrb\brdrr\brdrbtw\brdrbar\widctlpar\ltrpar\li0\lin0\ri0\rin0\ql\faauto\sl276\slmult1\rtlch\ab0\ai0\af2\afs22\ltrch\b0\i0\fs22\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1{ -\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1\chshdng10000\chcbpat2\chcfpat2 geshuming}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1\chshdng10000\chcbpat2\chcfpat2 /}{\rtlch\ab0\ai0\af2\afs20 -\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1\chshdng10000\chcbpat2\chcfpat2 cadet}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1\chshdng10000\chcbpat2\chcfpat2 (}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20 -\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1\chshdng10000\chcbpat2\chcfpat2 backend}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1\chshdng10000\chcbpat2\chcfpat2 ): }{\field{\*\fldinst{\rtlch\ab0\ai0\af2\afs22\ltrch\b0\i0\fs22 -\loch\af2\dbch\af2\hich\f2\insrsid10976062\strike0\ulnone\cf1 HYPERLINK "https://github.com/geshuming/cadet"}}{\fldrslt{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ul\cf3\chshdng10000\chcbpat2\chcfpat2 https}}}{\field{ -\*\fldinst{\rtlch\ab0\ai0\af2\afs22\ltrch\b0\i0\fs22\loch\af2\dbch\af2\hich\f2\insrsid10976062\strike0\ulnone\cf1 HYPERLINK "https://github.com/geshuming/cadet"}}{\fldrslt{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ul\cf3\chshdng10000\chcbpat2\chcfpat2 ://}}} -{\field{\*\fldinst{\rtlch\ab0\ai0\af2\afs22\ltrch\b0\i0\fs22\loch\af2\dbch\af2\hich\f2\insrsid10976062\strike0\ulnone\cf1 HYPERLINK "https://github.com/geshuming/cadet"}}{\fldrslt{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0 -\ul\cf3\chshdng10000\chcbpat2\chcfpat2 github}}}{\field{\*\fldinst{\rtlch\ab0\ai0\af2\afs22\ltrch\b0\i0\fs22\loch\af2\dbch\af2\hich\f2\insrsid10976062\strike0\ulnone\cf1 HYPERLINK "https://github.com/geshuming/cadet"}}{\fldrslt{\rtlch\ab0\ai0\af2\afs20 -\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ul\cf3\chshdng10000\chcbpat2\chcfpat2 .}}}{\field{\*\fldinst{\rtlch\ab0\ai0\af2\afs22\ltrch\b0\i0\fs22\loch\af2\dbch\af2\hich\f2\insrsid10976062\strike0\ulnone\cf1 HYPERLINK "https://github.com/geshuming/cadet"}} -{\fldrslt{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ul\cf3\chshdng10000\chcbpat2\chcfpat2 com}}}{\field{\*\fldinst{\rtlch\ab0\ai0\af2\afs22\ltrch\b0\i0\fs22\loch\af2\dbch\af2\hich\f2\insrsid10976062\strike0\ulnone\cf1 HYPERLINK "https://github.com/geshuming/cadet"}} -{\fldrslt{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ul\cf3\chshdng10000\chcbpat2\chcfpat2 /}}}{\field{\*\fldinst{\rtlch\ab0\ai0\af2\afs22\ltrch\b0\i0\fs22\loch\af2\dbch\af2\hich\f2\insrsid10976062\strike0\ulnone\cf1 HYPERLINK "https://github.com/geshuming/cadet"}} -{\fldrslt{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ul\cf3\chshdng10000\chcbpat2\chcfpat2 geshuming}}}{\field{\*\fldinst{\rtlch\ab0\ai0\af2\afs22\ltrch\b0\i0\fs22\loch\af2\dbch\af2\hich\f2\insrsid10976062\strike0\ulnone\cf1 HYPERLINK "https://github.com/geshuming/cadet"}} -{\fldrslt{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ul\cf3\chshdng10000\chcbpat2\chcfpat2 /}}}{\field{\*\fldinst{\rtlch\ab0\ai0\af2\afs22\ltrch\b0\i0\fs22\loch\af2\dbch\af2\hich\f2\insrsid10976062\strike0\ulnone\cf1 HYPERLINK "https://github.com/geshuming/cadet"}} -{\fldrslt{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ul\cf3\chshdng10000\chcbpat2\chcfpat2 cadet}}}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\insrsid10976062\strike0\ulnone\cf1\chshdng10000\chcbpat2\chcfpat2 -\par}\pard\plain\itap0\s0\ilvl0\fi0\sb0\sa0\aspalpha\aspnum\adjustright\brdrt\brdrl\brdrb\brdrr\brdrbtw\brdrbar\widctlpar\ltrpar\li0\lin0\ri0\rin0\ql\faauto\sl276\slmult1\rtlch\ab0\ai0\af2\afs22\ltrch\b0\i0\fs22\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1{ -\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1\chshdng10000\chcbpat2\chcfpat2 geshuming}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1\chshdng10000\chcbpat2\chcfpat2 /}{\rtlch\ab0\ai0\af2\afs20 -\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1\chshdng10000\chcbpat2\chcfpat2 grader}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1\chshdng10000\chcbpat2\chcfpat2 : }{\field{\*\fldinst{\rtlch\ab0\ai0\af2\afs22 -\ltrch\b0\i0\fs22\loch\af2\dbch\af2\hich\f2\insrsid10976062\strike0\ulnone\cf1 HYPERLINK "https://github.com/geshuming/grader"}}{\fldrslt{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ul\cf3\chshdng10000\chcbpat2\chcfpat2 https}}} -{\field{\*\fldinst{\rtlch\ab0\ai0\af2\afs22\ltrch\b0\i0\fs22\loch\af2\dbch\af2\hich\f2\insrsid10976062\strike0\ulnone\cf1 HYPERLINK "https://github.com/geshuming/grader"}}{\fldrslt{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0 -\ul\cf3\chshdng10000\chcbpat2\chcfpat2 ://}}}{\field{\*\fldinst{\rtlch\ab0\ai0\af2\afs22\ltrch\b0\i0\fs22\loch\af2\dbch\af2\hich\f2\insrsid10976062\strike0\ulnone\cf1 HYPERLINK "https://github.com/geshuming/grader"}}{\fldrslt{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20 -\loch\af2\dbch\af2\hich\f2\strike0\ul\cf3\chshdng10000\chcbpat2\chcfpat2 github}}}{\field{\*\fldinst{\rtlch\ab0\ai0\af2\afs22\ltrch\b0\i0\fs22\loch\af2\dbch\af2\hich\f2\insrsid10976062\strike0\ulnone\cf1 HYPERLINK "https://github.com/geshuming/grader"}}{ -\fldrslt{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ul\cf3\chshdng10000\chcbpat2\chcfpat2 .}}}{\field{\*\fldinst{\rtlch\ab0\ai0\af2\afs22\ltrch\b0\i0\fs22\loch\af2\dbch\af2\hich\f2\insrsid10976062\strike0\ulnone\cf1 HYPERLINK "https://github.com/geshuming/grader"}} -{\fldrslt{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ul\cf3\chshdng10000\chcbpat2\chcfpat2 com}}}{\field{\*\fldinst{\rtlch\ab0\ai0\af2\afs22\ltrch\b0\i0\fs22\loch\af2\dbch\af2\hich\f2\insrsid10976062\strike0\ulnone\cf1 HYPERLINK "https://github.com/geshuming/grader"}} -{\fldrslt{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ul\cf3\chshdng10000\chcbpat2\chcfpat2 /}}}{\field{\*\fldinst{\rtlch\ab0\ai0\af2\afs22\ltrch\b0\i0\fs22\loch\af2\dbch\af2\hich\f2\insrsid10976062\strike0\ulnone\cf1 HYPERLINK "https://github.com/geshuming/grader"}} -{\fldrslt{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ul\cf3\chshdng10000\chcbpat2\chcfpat2 geshuming}}}{\field{\*\fldinst{\rtlch\ab0\ai0\af2\afs22\ltrch\b0\i0\fs22\loch\af2\dbch\af2\hich\f2\insrsid10976062\strike0\ulnone\cf1 HYPERLINK "https://github.com/geshuming/grader"}} -{\fldrslt{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ul\cf3\chshdng10000\chcbpat2\chcfpat2 /}}}{\field{\*\fldinst{\rtlch\ab0\ai0\af2\afs22\ltrch\b0\i0\fs22\loch\af2\dbch\af2\hich\f2\insrsid10976062\strike0\ulnone\cf1 HYPERLINK "https://github.com/geshuming/grader"}} -{\fldrslt{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ul\cf3\chshdng10000\chcbpat2\chcfpat2 grader}}}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\insrsid10976062\strike0\ulnone\cf1\chshdng10000\chcbpat2\chcfpat2 -\par}\pard\plain\itap0\s0\ilvl0\fi0\sb0\sa0\aspalpha\aspnum\adjustright\brdrt\brdrl\brdrb\brdrr\brdrbtw\brdrbar\widctlpar\ltrpar\li0\lin0\ri0\rin0\ql\faauto\sl276\slmult1\rtlch\ab0\ai0\af2\afs22\ltrch\b0\i0\fs22\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1{ -\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\insrsid10976062\strike0\ulnone\cf1\chshdng10000\chcbpat2\chcfpat2\par}\pard\plain\itap0\s0\ilvl0\fi0\sb0\sa0\aspalpha\aspnum\adjustright\brdrt\brdrl\brdrb\brdrr\brdrbtw\brdrbar\widctlpar -\ltrpar\li0\lin0\ri0\rin0\ql\faauto\sl276\slmult1\rtlch\ab0\ai0\af2\afs22\ltrch\b0\i0\fs22\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1\chshdng10000\chcbpat2\chcfpat2 Resources} -{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1\chshdng10000\chcbpat2\chcfpat2 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1\chshdng10000\chcbpat2\chcfpat2 and}{\rtlch\ab0\ai0\af2\afs20 -\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1\chshdng10000\chcbpat2\chcfpat2 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1\chshdng10000\chcbpat2\chcfpat2 dependencies}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20 -\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1\chshdng10000\chcbpat2\chcfpat2 :}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\insrsid10976062\strike0\ulnone\cf1\chshdng10000\chcbpat2\chcfpat2\par}\pard\plain\itap0\s0\ilvl0\ls1\tx360\tx720\fi-360\sb0\sa0 -\aspalpha\aspnum\adjustright\brdrt\brdrl\brdrb\brdrr\brdrbtw\brdrbar\widctlpar\ltrpar\li720\lin720\ri0\rin0\ql\faauto\sl276\slmult1\rtlch\ab0\ai0\af2\afs22\ltrch\b0\i0\fs22\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1{\listtext\pard\plain\tx360\fi-360\aspalpha -\aspnum\adjustright\ltrpar\li720\lin720\ri0\rin0\ql\faauto\rtlch\ab0\ai0\af2\afs20\ltrch\fs20\loch\af2\dbch\af2\hich\f2\insrsid10976062\strike0\ulnone\cf1 \u9679 \tab }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1\chshdng10000\chcbpat2\chcfpat2 Frontend} -{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1\chshdng10000\chcbpat2\chcfpat2 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1\chshdng10000\chcbpat2\chcfpat2 development}{ -\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1\chshdng10000\chcbpat2\chcfpat2 : }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1\chshdng10000\chcbpat2\chcfpat2 React}{\rtlch\ab0\ai0\af2\afs20 -\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1\chshdng10000\chcbpat2\chcfpat2 /}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1\chshdng10000\chcbpat2\chcfpat2 JS}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20 -\loch\af2\dbch\af2\hich\f2\insrsid10976062\strike0\ulnone\cf1\chshdng10000\chcbpat2\chcfpat2\par}\pard\plain\itap0\s0\ilvl0\ls1\tx360\tx720\fi-360\sb0\sa0\aspalpha\aspnum\adjustright\brdrt\brdrl\brdrb\brdrr\brdrbtw\brdrbar\widctlpar\ltrpar\li720\lin720\ri0\rin0 -\ql\faauto\sl276\slmult1\rtlch\ab0\ai0\af2\afs22\ltrch\b0\i0\fs22\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1{\listtext\pard\plain\tx360\fi-360\aspalpha\aspnum\adjustright\ltrpar\li720\lin720\ri0\rin0\ql\faauto\rtlch\ab0\ai0\af2\afs20\ltrch\fs20\loch\af2 -\dbch\af2\hich\f2\insrsid10976062\strike0\ulnone\cf1 \u9679 \tab }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1\chshdng10000\chcbpat2\chcfpat2 Backend}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0 -\ulnone\cf1\chshdng10000\chcbpat2\chcfpat2 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1\chshdng10000\chcbpat2\chcfpat2 development}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1\chshdng10000\chcbpat2\chcfpat2 : } -{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1\chshdng10000\chcbpat2\chcfpat2 Elixir}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1\chshdng10000\chcbpat2\chcfpat2 , }{ -\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1\chshdng10000\chcbpat2\chcfpat2 PostgreSQL}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\insrsid10976062\strike0\ulnone\cf1\chshdng10000\chcbpat2\chcfpat2 -\par}\pard\plain\itap0\s0\ilvl0\ls1\tx360\tx720\fi-360\sb0\sa0\aspalpha\aspnum\adjustright\brdrt\brdrl\brdrb\brdrr\brdrbtw\brdrbar\widctlpar\ltrpar\li720\lin720\ri0\rin0\ql\faauto\sl276\slmult1\rtlch\ab0\ai0\af2\afs22\ltrch\b0\i0\fs22\loch\af2\dbch\af2\hich\f2\strike0 -\ulnone\cf1{\listtext\pard\plain\tx360\fi-360\aspalpha\aspnum\adjustright\ltrpar\li720\lin720\ri0\rin0\ql\faauto\rtlch\ab0\ai0\af2\afs20\ltrch\fs20\loch\af2\dbch\af2\hich\f2\insrsid10976062\strike0\ulnone\cf1 \u9679 \tab }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20 -\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1\chshdng10000\chcbpat2\chcfpat2 Grader}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1\chshdng10000\chcbpat2\chcfpat2 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2 -\dbch\af2\hich\f2\strike0\ulnone\cf1\chshdng10000\chcbpat2\chcfpat2 development}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1\chshdng10000\chcbpat2\chcfpat2 : }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2 -\hich\f2\strike0\ulnone\cf1\chshdng10000\chcbpat2\chcfpat2 Python}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1\chshdng10000\chcbpat2\chcfpat2 , }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0 -\ulnone\cf1\chshdng10000\chcbpat2\chcfpat2 XML}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\insrsid10976062\strike0\ulnone\cf1\chshdng10000\chcbpat2\chcfpat2\par}\pard\plain\itap0\s0\ilvl0\ls1\tx360\tx720\fi-360\sb0\sa0\aspalpha\aspnum -\adjustright\brdrt\brdrl\brdrb\brdrr\brdrbtw\brdrbar\widctlpar\ltrpar\li720\lin720\ri0\rin0\ql\faauto\sl276\slmult1\rtlch\ab0\ai0\af2\afs22\ltrch\b0\i0\fs22\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1{\listtext\pard\plain\tx360\fi-360\aspalpha\aspnum\adjustright -\ltrpar\li720\lin720\ri0\rin0\ql\faauto\rtlch\ab0\ai0\af2\afs20\ltrch\fs20\loch\af2\dbch\af2\hich\f2\insrsid10976062\strike0\ulnone\cf1 \u9679 \tab }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1\chshdng10000\chcbpat2\chcfpat2 Dependencies} -{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1\chshdng10000\chcbpat2\chcfpat2 : }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1\chshdng10000\chcbpat2\chcfpat2 NIL}{\rtlch\ab0\ai0\af2\afs20 -\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\insrsid10976062\strike0\ulnone\cf1\chshdng10000\chcbpat2\chcfpat2\par}\pard\plain\itap0\s0\ilvl0\fi0\sb0\sa0\aspalpha\aspnum\adjustright\brdrt\brdrl\brdrb\brdrr\brdrbtw\brdrbar\widctlpar\ltrpar\li0\lin0\ri0\rin0\ql -\faauto\sl276\slmult1\rtlch\ab0\ai0\af2\afs22\ltrch\b0\i0\fs22\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\insrsid10976062\strike0\ulnone\cf1\par}\pard\plain\itap0\s0\ilvl0\fi0\sb0\sa0 -\aspalpha\aspnum\adjustright\brdrt\brdrl\brdrb\brdrr\brdrbtw\brdrbar\widctlpar\ltrpar\li0\lin0\ri0\rin0\ql\faauto\sl276\slmult1\rtlch\ab0\ai0\af2\afs22\ltrch\b0\i0\fs22\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2 -\dbch\af2\hich\f2\insrsid10976062\strike0\ulnone\cf1\par}\trowd\irow0\irowband0\ltrrow\trql\trgaph108\trpaddl108\trpaddfl3\trbrdrt\brdrs\brdrw10\brdrcf0\brsp0\trbrdrl\brdrs\brdrw10\brdrcf0\brsp0\trbrdrb\brdrs\brdrw10\brdrcf0\brsp0\trbrdrr\brdrs\brdrw10\brdrcf0\brsp0\trbrdrh\brdrs\brdrw10\brdrcf0\brsp0\trbrdrv -\brdrs\brdrw10\brdrcf0\brsp0\trwWidth5000\trftsWidth2\trautofit1\trwWidthB0\trftsWidthB3\trpaddt0\trpaddft3\trpaddb0\trpaddfb3\trpaddr108\trpaddfr3\trrh0\trleft-100\clftsWidth1\clvertalt\clpadl100\clpadfl3\clpadb100\clpadfb3\clpadt100\clpadft3\clpadr100 -\clpadfr3\clbrdrl\brdrs\brdrw20\brdrcf1\brsp0\clbrdrr\brdrs\brdrw20\brdrcf1\brsp0\clbrdrt\brdrs\brdrw20\brdrcf1\brsp0\clbrdrb\brdrs\brdrw20\brdrcf1\brsp0\cldgll\brdrnone\cldglu\brdrnone\cellx5660\clftsWidth1\clvertalt\clpadl100\clpadfl3\clpadb100\clpadfb3\clpadt100 -\clpadft3\clpadr100\clpadfr3\clbrdrl\brdrs\brdrw20\brdrcf1\brsp0\clbrdrr\brdrs\brdrw20\brdrcf1\brsp0\clbrdrt\brdrs\brdrw20\brdrcf1\brsp0\clbrdrb\brdrs\brdrw20\brdrcf1\brsp0\cldgll\brdrnone\cldglu\brdrnone\cellx7475\clftsWidth1\clvertalt\clpadl100\clpadfl3\clpadb100 -\clpadfb3\clpadt100\clpadft3\clpadr100\clpadfr3\clbrdrl\brdrs\brdrw20\brdrcf1\brsp0\clbrdrr\brdrs\brdrw20\brdrcf1\brsp0\clbrdrt\brdrs\brdrw20\brdrcf1\brsp0\clbrdrb\brdrs\brdrw20\brdrcf1\brsp0\cldgll\brdrnone\cldglu\brdrnone\cellx9260\pard\plain\intbl\itap1\s0\ilvl0\fi0\sb0\sa0\aspalpha\aspnum\adjustright\brdrt\brdrl\brdrb\brdrr\brdrbtw\brdrbar\nowidctlpar\ltrpar\li0\lin0\ri0\rin0\ql\faauto\sl240\slmult1\rtlch\ab0\ai0\af2\afs22\ltrch\b0\i0\fs22\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 -{\rtlch\ab\ai0\af2\afs20\ltrch\b\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 Change}{\rtlch\ab\ai0\af2\afs20\ltrch\b\i0\fs20\loch\af2\dbch\af2\hich\f2\insrsid10976062\strike0\ulnone\cf1\cell}\pard\plain\intbl\itap1\s0\ilvl0\fi0\sb0\sa0\aspalpha -\aspnum\adjustright\brdrt\brdrl\brdrb\brdrr\brdrbtw\brdrbar\nowidctlpar\ltrpar\li0\lin0\ri0\rin0\ql\faauto\sl240\slmult1\rtlch\ab0\ai0\af2\afs22\ltrch\b0\i0\fs22\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1{\rtlch\ab\ai0\af2\afs20\ltrch\b\i0\fs20\loch\af2\dbch\af2 -\hich\f2\strike0\ulnone\cf1 Requirements}{\rtlch\ab\ai0\af2\afs20\ltrch\b\i0\fs20\loch\af2\dbch\af2\hich\f2\insrsid10976062\strike0\ulnone\cf1\cell}\pard\plain\intbl\itap1\s0\ilvl0\fi0\sb0\sa0\aspalpha\aspnum\adjustright\brdrt\brdrl\brdrb\brdrr\brdrbtw -\brdrbar\nowidctlpar\ltrpar\li0\lin0\ri0\rin0\ql\faauto\sl240\slmult1\rtlch\ab0\ai0\af2\afs22\ltrch\b0\i0\fs22\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1{\rtlch\ab\ai0\af2\afs20\ltrch\b\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 Proj}{\rtlch\ab\ai0\af2\afs20 -\ltrch\b\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 . }{\rtlch\ab\ai0\af2\afs20\ltrch\b\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 Delivery}{\rtlch\ab\ai0\af2\afs20\ltrch\b\i0\fs20\loch\af2\dbch\af2\hich\f2\insrsid10976062\strike0\ulnone\cf1 -\cell}{\trowd\irow0\irowband0\ltrrow\trql\trgaph108\trpaddl108\trpaddfl3\trbrdrt\brdrs\brdrw10\brdrcf0\brsp0\trbrdrl\brdrs\brdrw10\brdrcf0\brsp0\trbrdrb\brdrs\brdrw10\brdrcf0\brsp0\trbrdrr\brdrs\brdrw10\brdrcf0\brsp0\trbrdrh\brdrs\brdrw10\brdrcf0\brsp0\trbrdrv -\brdrs\brdrw10\brdrcf0\brsp0\trwWidth5000\trftsWidth2\trautofit1\trwWidthB0\trftsWidthB3\trpaddt0\trpaddft3\trpaddb0\trpaddfb3\trpaddr108\trpaddfr3\trrh0\trleft-100\clftsWidth1\clvertalt\clpadl100\clpadfl3\clpadb100\clpadfb3\clpadt100\clpadft3\clpadr100 -\clpadfr3\clbrdrl\brdrs\brdrw20\brdrcf1\brsp0\clbrdrr\brdrs\brdrw20\brdrcf1\brsp0\clbrdrt\brdrs\brdrw20\brdrcf1\brsp0\clbrdrb\brdrs\brdrw20\brdrcf1\brsp0\cldgll\brdrnone\cldglu\brdrnone\cellx5660\clftsWidth1\clvertalt\clpadl100\clpadfl3\clpadb100\clpadfb3\clpadt100 -\clpadft3\clpadr100\clpadfr3\clbrdrl\brdrs\brdrw20\brdrcf1\brsp0\clbrdrr\brdrs\brdrw20\brdrcf1\brsp0\clbrdrt\brdrs\brdrw20\brdrcf1\brsp0\clbrdrb\brdrs\brdrw20\brdrcf1\brsp0\cldgll\brdrnone\cldglu\brdrnone\cellx7475\clftsWidth1\clvertalt\clpadl100\clpadfl3\clpadb100 -\clpadfb3\clpadt100\clpadft3\clpadr100\clpadfr3\clbrdrl\brdrs\brdrw20\brdrcf1\brsp0\clbrdrr\brdrs\brdrw20\brdrcf1\brsp0\clbrdrt\brdrs\brdrw20\brdrcf1\brsp0\clbrdrb\brdrs\brdrw20\brdrcf1\brsp0\cldgll\brdrnone\cldglu\brdrnone\cellx9260\rtlch\ab\ai0\af2\afs20\ltrch\b\i0\fs20\loch\af2\dbch\af2\hich\f2\insrsid10976062\strike0\ulnone\cf1\row}\trowd\irow1\irowband1\ltrrow\trql\trgaph108\trpaddl108\trpaddfl3\trbrdrt\brdrs\brdrw10\brdrcf0\brsp0\trbrdrl\brdrs\brdrw10\brdrcf0\brsp0\trbrdrb\brdrs\brdrw10\brdrcf0\brsp0\trbrdrr\brdrs\brdrw10\brdrcf0\brsp0\trbrdrh\brdrs\brdrw10\brdrcf0\brsp0\trbrdrv -\brdrs\brdrw10\brdrcf0\brsp0\trwWidth5000\trftsWidth2\trautofit1\trwWidthB0\trftsWidthB3\trpaddt0\trpaddft3\trpaddb0\trpaddfb3\trpaddr108\trpaddfr3\trrh0\trleft-100\clftsWidth1\clvertalt\clpadl100\clpadfl3\clpadb100\clpadfb3\clpadt100\clpadft3\clpadr100 -\clpadfr3\clbrdrl\brdrs\brdrw20\brdrcf1\brsp0\clbrdrr\brdrs\brdrw20\brdrcf1\brsp0\clbrdrt\brdrs\brdrw20\brdrcf1\brsp0\clbrdrb\brdrs\brdrw20\brdrcf1\brsp0\cldgll\brdrnone\cldglu\brdrnone\cellx5660\clftsWidth1\clvertalt\clpadl100\clpadfl3\clpadb100\clpadfb3\clpadt100 -\clpadft3\clpadr100\clpadfr3\clbrdrl\brdrs\brdrw20\brdrcf1\brsp0\clbrdrr\brdrs\brdrw20\brdrcf1\brsp0\clbrdrt\brdrs\brdrw20\brdrcf1\brsp0\clbrdrb\brdrs\brdrw20\brdrcf1\brsp0\cldgll\brdrnone\cldglu\brdrnone\cellx7475\clftsWidth1\clvertalt\clpadl100\clpadfl3\clpadb100 -\clpadfb3\clpadt100\clpadft3\clpadr100\clpadfr3\clbrdrl\brdrs\brdrw20\brdrcf1\brsp0\clbrdrr\brdrs\brdrw20\brdrcf1\brsp0\clbrdrt\brdrs\brdrw20\brdrcf1\brsp0\clbrdrb\brdrs\brdrw20\brdrcf1\brsp0\cldgll\brdrnone\cldglu\brdrnone\cellx9260\pard\plain\intbl\itap1\s0\ilvl0\fi0\sb0\sa0\aspalpha\aspnum\adjustright\brdrt\brdrl\brdrb\brdrr\brdrbtw\brdrbar\nowidctlpar\ltrpar\li0\lin0\ri0\rin0\ql\faauto\sl240\slmult1\rtlch\ab0\ai0\af2\afs22\ltrch\b0\i0\fs22\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 -{\rtlch\ab\ai0\af2\afs20\ltrch\b\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ul\cf1 #1 }{\rtlch\ab\ai0\af2\afs20\ltrch\b\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ul\cf1 Templating}{\rtlch\ab\ai0\af2\afs20\ltrch\b\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0 -\ul\cf1 }{\rtlch\ab\ai0\af2\afs20\ltrch\b\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ul\cf1 support}{\rtlch\ab\ai0\af2\afs20\ltrch\b\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ul\cf1 (}{\rtlch\ab\ai0\af2\afs20\ltrch\b\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0 -\ul\cf1 Direct}{\rtlch\ab\ai0\af2\afs20\ltrch\b\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ul\cf1 }{\rtlch\ab\ai0\af2\afs20\ltrch\b\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ul\cf1 mode}{\rtlch\ab\ai0\af2\afs20\ltrch\b\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0 -\ul\cf1 )}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\insrsid10976062\strike0\ulnone\cf1\par}\pard\plain\intbl\itap1\s0\ilvl0\ls2\tx360\tx720\fi-360\sb0\sa0\aspalpha\aspnum\adjustright\brdrt\brdrl\brdrb\brdrr\brdrbtw\brdrbar -\nowidctlpar\ltrpar\li720\lin720\ri0\rin0\ql\faauto\sl240\slmult1\rtlch\ab0\ai0\af2\afs22\ltrch\b0\i0\fs22\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1{\listtext\pard\plain\tx360\fi-360\aspalpha\aspnum\adjustright\ltrpar\li720\lin720\ri0\rin0\ql\faauto\rtlch\ab0\ai0\af2\afs20 -\ltrch\fs20\loch\af2\dbch\af2\hich\f2\insrsid10976062\strike0\ulnone\cf1 -\tab }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 Introduce}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0 -\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 additional}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2 -\hich\f2\strike0\ulnone\cf1 functionality}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 to}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20 -\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 replace}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20 -\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 code}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 in}{\rtlch\ab0\ai0\af2\afs20 -\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 editor}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20 -\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 with}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 the}{\rtlch\ab0\ai0\af2\afs20 -\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 skeleton}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20 -\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 template}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 , }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 after}{ -\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 a}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0 -\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 confirmation}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2 -\dbch\af2\hich\f2\strike0\ulnone\cf1 prompt}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\insrsid10976062\strike0\ulnone\cf1\par}\pard\plain\intbl\itap1\s0\ilvl0\ls2\tx360\tx720\fi-360\sb0\sa0\aspalpha\aspnum\adjustright\brdrt\brdrl -\brdrb\brdrr\brdrbtw\brdrbar\nowidctlpar\ltrpar\li720\lin720\ri0\rin0\ql\faauto\sl240\slmult1\rtlch\ab0\ai0\af2\afs22\ltrch\b0\i0\fs22\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1{\listtext\pard\plain\tx360\fi-360\aspalpha\aspnum\adjustright\ltrpar\li720\lin720\ri0\rin0 -\ql\faauto\rtlch\ab0\ai0\af2\afs20\ltrch\fs20\loch\af2\dbch\af2\hich\f2\insrsid10976062\strike0\ulnone\cf1 -\tab }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 Purpose}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20 -\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 : }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 to}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20 -\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 provide}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 students}{ -\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 a}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0 -\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 means}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2 -\hich\f2\strike0\ulnone\cf1 of}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 recovering}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20 -\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 the}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20 -\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 template}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 upon}{ -\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 accidentally}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0 -\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 overwriting}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2 -\hich\f2\strike0\ulnone\cf1 it}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\insrsid10976062\strike0\ulnone\cf1\cell}\pard\plain\intbl\itap1\s0\ilvl0\fi0\sb0\sa0\aspalpha\aspnum\adjustright\brdrt\brdrl\brdrb\brdrr\brdrbtw\brdrbar -\nowidctlpar\ltrpar\li0\lin0\ri0\rin0\ql\faauto\sl240\slmult1\rtlch\ab0\ai0\af2\afs22\ltrch\b0\i0\fs22\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 React}{\rtlch\ab0\ai0\af2\afs20 -\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\insrsid10976062\strike0\ulnone\cf1\cell}\pard\plain\intbl\itap1\s0\ilvl0\fi0\sb0\sa0\aspalpha\aspnum\adjustright\brdrt\brdrl\brdrb\brdrr\brdrbtw\brdrbar\nowidctlpar\ltrpar\li0\lin0\ri0\rin0\ql\faauto\sl240\slmult1 -\rtlch\ab0\ai0\af2\afs22\ltrch\b0\i0\fs22\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 End}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0 -\ulnone\cf1 -}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 week}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 4}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2 -\hich\f2\insrsid10976062\strike0\ulnone\cf1\cell}{\trowd\irow1\irowband1\ltrrow\trql\trgaph108\trpaddl108\trpaddfl3\trbrdrt\brdrs\brdrw10\brdrcf0\brsp0\trbrdrl\brdrs\brdrw10\brdrcf0\brsp0\trbrdrb\brdrs\brdrw10\brdrcf0\brsp0\trbrdrr\brdrs\brdrw10\brdrcf0\brsp0\trbrdrh\brdrs\brdrw10\brdrcf0\brsp0\trbrdrv -\brdrs\brdrw10\brdrcf0\brsp0\trwWidth5000\trftsWidth2\trautofit1\trwWidthB0\trftsWidthB3\trpaddt0\trpaddft3\trpaddb0\trpaddfb3\trpaddr108\trpaddfr3\trrh0\trleft-100\clftsWidth1\clvertalt\clpadl100\clpadfl3\clpadb100\clpadfb3\clpadt100\clpadft3\clpadr100 -\clpadfr3\clbrdrl\brdrs\brdrw20\brdrcf1\brsp0\clbrdrr\brdrs\brdrw20\brdrcf1\brsp0\clbrdrt\brdrs\brdrw20\brdrcf1\brsp0\clbrdrb\brdrs\brdrw20\brdrcf1\brsp0\cldgll\brdrnone\cldglu\brdrnone\cellx5660\clftsWidth1\clvertalt\clpadl100\clpadfl3\clpadb100\clpadfb3\clpadt100 -\clpadft3\clpadr100\clpadfr3\clbrdrl\brdrs\brdrw20\brdrcf1\brsp0\clbrdrr\brdrs\brdrw20\brdrcf1\brsp0\clbrdrt\brdrs\brdrw20\brdrcf1\brsp0\clbrdrb\brdrs\brdrw20\brdrcf1\brsp0\cldgll\brdrnone\cldglu\brdrnone\cellx7475\clftsWidth1\clvertalt\clpadl100\clpadfl3\clpadb100 -\clpadfb3\clpadt100\clpadft3\clpadr100\clpadfr3\clbrdrl\brdrs\brdrw20\brdrcf1\brsp0\clbrdrr\brdrs\brdrw20\brdrcf1\brsp0\clbrdrt\brdrs\brdrw20\brdrcf1\brsp0\clbrdrb\brdrs\brdrw20\brdrcf1\brsp0\cldgll\brdrnone\cldglu\brdrnone\cellx9260\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\insrsid10976062\strike0\ulnone\cf1\row}\trowd\irow2\irowband2\ltrrow\trql\trgaph108\trpaddl108\trpaddfl3\trbrdrt\brdrs\brdrw10\brdrcf0\brsp0\trbrdrl\brdrs\brdrw10\brdrcf0\brsp0\trbrdrb\brdrs\brdrw10\brdrcf0\brsp0\trbrdrr\brdrs\brdrw10\brdrcf0\brsp0\trbrdrh\brdrs\brdrw10\brdrcf0\brsp0\trbrdrv -\brdrs\brdrw10\brdrcf0\brsp0\trwWidth5000\trftsWidth2\trautofit1\trwWidthB0\trftsWidthB3\trpaddt0\trpaddft3\trpaddb0\trpaddfb3\trpaddr108\trpaddfr3\trrh0\trleft-100\clftsWidth1\clvertalt\clpadl100\clpadfl3\clpadb100\clpadfb3\clpadt100\clpadft3\clpadr100 -\clpadfr3\clbrdrl\brdrs\brdrw20\brdrcf1\brsp0\clbrdrr\brdrs\brdrw20\brdrcf1\brsp0\clbrdrt\brdrs\brdrw20\brdrcf1\brsp0\clbrdrb\brdrs\brdrw20\brdrcf1\brsp0\cldgll\brdrnone\cldglu\brdrnone\cellx5660\clftsWidth1\clvertalt\clpadl100\clpadfl3\clpadb100\clpadfb3\clpadt100 -\clpadft3\clpadr100\clpadfr3\clbrdrl\brdrs\brdrw20\brdrcf1\brsp0\clbrdrr\brdrs\brdrw20\brdrcf1\brsp0\clbrdrt\brdrs\brdrw20\brdrcf1\brsp0\clbrdrb\brdrs\brdrw20\brdrcf1\brsp0\cldgll\brdrnone\cldglu\brdrnone\cellx7475\clftsWidth1\clvertalt\clpadl100\clpadfl3\clpadb100 -\clpadfb3\clpadt100\clpadft3\clpadr100\clpadfr3\clbrdrl\brdrs\brdrw20\brdrcf1\brsp0\clbrdrr\brdrs\brdrw20\brdrcf1\brsp0\clbrdrt\brdrs\brdrw20\brdrcf1\brsp0\clbrdrb\brdrs\brdrw20\brdrcf1\brsp0\cldgll\brdrnone\cldglu\brdrnone\cellx9260\pard\plain\intbl\itap1\s0\ilvl0\fi0\sb0\sa0\aspalpha\aspnum\adjustright\brdrt\brdrl\brdrb\brdrr\brdrbtw\brdrbar\nowidctlpar\ltrpar\li0\lin0\ri0\rin0\ql\faauto\sl240\slmult1\rtlch\ab0\ai0\af2\afs22\ltrch\b0\i0\fs22\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 -{\rtlch\ab\ai0\af2\afs20\ltrch\b\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ul\cf1 #2 }{\rtlch\ab\ai0\af2\afs20\ltrch\b\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ul\cf1 Autograder}{\rtlch\ab\ai0\af2\afs20\ltrch\b\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0 -\ul\cf1 }{\rtlch\ab\ai0\af2\afs20\ltrch\b\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ul\cf1 and}{\rtlch\ab\ai0\af2\afs20\ltrch\b\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ul\cf1 }{\rtlch\ab\ai0\af2\afs20\ltrch\b\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0 -\ul\cf1 grading}{\rtlch\ab\ai0\af2\afs20\ltrch\b\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ul\cf1 }{\rtlch\ab\ai0\af2\afs20\ltrch\b\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ul\cf1 API}{\rtlch\ab\ai0\af2\afs20\ltrch\b\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0 -\ul\cf1 }{\rtlch\ab\ai0\af2\afs20\ltrch\b\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ul\cf1 changes}{\rtlch\ab\ai0\af2\afs20\ltrch\b\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ul\cf1 (}{\rtlch\ab\ai0\af2\afs20\ltrch\b\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0 -\ul\cf1 Fork}{\rtlch\ab\ai0\af2\afs20\ltrch\b\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ul\cf1 }{\rtlch\ab\ai0\af2\afs20\ltrch\b\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ul\cf1 mode}{\rtlch\ab\ai0\af2\afs20\ltrch\b\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0 -\ul\cf1 )}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\insrsid10976062\strike0\ulnone\cf1\par}\pard\plain\intbl\itap1\s0\ilvl0\ls3\tx360\tx720\fi-360\sb0\sa0\aspalpha\aspnum\adjustright\brdrt\brdrl\brdrb\brdrr\brdrbtw\brdrbar -\widctlpar\ltrpar\li720\lin720\ri0\rin0\ql\faauto\sl276\slmult1\rtlch\ab0\ai0\af2\afs22\ltrch\b0\i0\fs22\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1{\listtext\pard\plain\tx360\fi-360\aspalpha\aspnum\adjustright\ltrpar\li720\lin720\ri0\rin0\ql\faauto\rtlch\ab0\ai0\af2\afs20 -\ltrch\fs20\loch\af2\dbch\af2\hich\f2\insrsid10976062\strike0\ulnone\cf1 -\tab }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 Change}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 } -{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 specification}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2 -\hich\f2\strike0\ulnone\cf1 for}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 XML}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20 -\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 files}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20 -\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 to}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 simplifying}{ -\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 authoring}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0 -\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 of}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0 -\ulnone\cf1 graders}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 for}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2 -\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 missions}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 (}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20 -\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 function}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 name}{\rtlch\ab0\ai0\af2\afs20 -\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 , }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 prerequisites}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 , }{ -\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 input}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 , }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0 -\ulnone\cf1 expected}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 output}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2 -\dbch\af2\hich\f2\strike0\ulnone\cf1 )}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\insrsid10976062\strike0\ulnone\cf1\par}\pard\plain\intbl\itap1\s0\ilvl0\ls3\tx360\tx720\fi-360\sb0\sa0\aspalpha\aspnum\adjustright\brdrt\brdrl\brdrb -\brdrr\brdrbtw\brdrbar\widctlpar\ltrpar\li720\lin720\ri0\rin0\ql\faauto\sl276\slmult1\rtlch\ab0\ai0\af2\afs22\ltrch\b0\i0\fs22\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1{\listtext\pard\plain\tx360\fi-360\aspalpha\aspnum\adjustright\ltrpar\li720\lin720\ri0\rin0 -\ql\faauto\rtlch\ab0\ai0\af2\afs20\ltrch\fs20\loch\af2\dbch\af2\hich\f2\insrsid10976062\strike0\ulnone\cf1 -\tab }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 Extend}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2 -\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 XML}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20 -\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 file}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 specification}{\rtlch\ab0\ai0\af2\afs20 -\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 to}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20 -\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 include}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 public}{ -\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 test}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0 -\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 cases}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 (}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2 -\hich\f2\strike0\ulnone\cf1 provided}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 in}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20 -\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 mission}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20 -\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 description}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 ) }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 for}{ -\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 use}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0 -\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 in}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0 -\ulnone\cf1 assert}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\insrsid10976062\strike0\ulnone\cf1\par}\pard\plain\intbl\itap1\s0\ilvl0\ls3\tx360\tx720\fi-360\sb0\sa0\aspalpha\aspnum\adjustright\brdrt\brdrl\brdrb\brdrr\brdrbtw\brdrbar -\widctlpar\ltrpar\li720\lin720\ri0\rin0\ql\faauto\sl276\slmult1\rtlch\ab0\ai0\af2\afs22\ltrch\b0\i0\fs22\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1{\listtext\pard\plain\tx360\fi-360\aspalpha\aspnum\adjustright\ltrpar\li720\lin720\ri0\rin0\ql\faauto\rtlch\ab0\ai0\af2\afs20 -\ltrch\fs20\loch\af2\dbch\af2\hich\f2\insrsid10976062\strike0\ulnone\cf1 -\tab }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 Amend}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 } -{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 grader}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0 -\ulnone\cf1 output}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 into}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2 -\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 per}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 -}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20 -\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 task}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 scores}{\rtlch\ab0\ai0\af2\afs20 -\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\insrsid10976062\strike0\ulnone\cf1\par}\pard\plain\intbl\itap1\s0\ilvl0\ls3\tx360\tx720\fi-360\sb0\sa0\aspalpha\aspnum\adjustright\brdrt\brdrl\brdrb\brdrr\brdrbtw\brdrbar\widctlpar\ltrpar\li720\lin720\ri0\rin0\ql -\faauto\sl276\slmult1\rtlch\ab0\ai0\af2\afs22\ltrch\b0\i0\fs22\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1{\listtext\pard\plain\tx360\fi-360\aspalpha\aspnum\adjustright\ltrpar\li720\lin720\ri0\rin0\ql\faauto\rtlch\ab0\ai0\af2\afs20\ltrch\fs20\loch\af2\dbch\af2 -\hich\f2\insrsid10976062\strike0\ulnone\cf1 -\tab }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 Purpose}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 : }{\rtlch\ab0\ai0\af2\afs20 -\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 prevent}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 fatal}{ -\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 execution}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0 -\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 errors}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2 -\hich\f2\strike0\ulnone\cf1 from}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 returning}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20 -\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 a}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 0 }{\rtlch\ab0\ai0\af2\afs20 -\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 for}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 an}{\rtlch\ab0\ai0\af2\afs20 -\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 entire}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20 -\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 task}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 or}{\rtlch\ab0\ai0\af2\afs20 -\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 mission}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 , }{\rtlch\ab0\ai0\af2\afs20 -\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 increase}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 overall}{ -\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 reliability}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\insrsid10976062\strike0 -\ulnone\cf1\cell}\pard\plain\intbl\itap1\s0\ilvl0\fi0\sb0\sa0\aspalpha\aspnum\adjustright\brdrt\brdrl\brdrb\brdrr\brdrbtw\brdrbar\nowidctlpar\ltrpar\li0\lin0\ri0\rin0\ql\faauto\sl240\slmult1\rtlch\ab0\ai0\af2\afs22\ltrch\b0\i0\fs22\loch\af2\dbch\af2\hich\f2\strike0 -\ulnone\cf1{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\insrsid10976062\strike0\ulnone\cf1\cell}\pard\plain\intbl\itap1\s0\ilvl0\fi0\sb0\sa0\aspalpha\aspnum\adjustright\brdrt\brdrl\brdrb\brdrr\brdrbtw\brdrbar\nowidctlpar\ltrpar\li0\lin0\ri0\rin0 -\ql\faauto\sl240\slmult1\rtlch\ab0\ai0\af2\afs22\ltrch\b0\i0\fs22\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 Recess}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2 -\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 week}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\insrsid10976062\strike0\ulnone\cf1\cell}{\trowd\irow2\irowband2\ltrrow\trql\trgaph108\trpaddl108\trpaddfl3\trbrdrt\brdrs\brdrw10\brdrcf0\brsp0\trbrdrl\brdrs\brdrw10\brdrcf0\brsp0\trbrdrb\brdrs\brdrw10\brdrcf0\brsp0\trbrdrr\brdrs\brdrw10\brdrcf0\brsp0\trbrdrh\brdrs\brdrw10\brdrcf0\brsp0\trbrdrv -\brdrs\brdrw10\brdrcf0\brsp0\trwWidth5000\trftsWidth2\trautofit1\trwWidthB0\trftsWidthB3\trpaddt0\trpaddft3\trpaddb0\trpaddfb3\trpaddr108\trpaddfr3\trrh0\trleft-100\clftsWidth1\clvertalt\clpadl100\clpadfl3\clpadb100\clpadfb3\clpadt100\clpadft3\clpadr100 -\clpadfr3\clbrdrl\brdrs\brdrw20\brdrcf1\brsp0\clbrdrr\brdrs\brdrw20\brdrcf1\brsp0\clbrdrt\brdrs\brdrw20\brdrcf1\brsp0\clbrdrb\brdrs\brdrw20\brdrcf1\brsp0\cldgll\brdrnone\cldglu\brdrnone\cellx5660\clftsWidth1\clvertalt\clpadl100\clpadfl3\clpadb100\clpadfb3\clpadt100 -\clpadft3\clpadr100\clpadfr3\clbrdrl\brdrs\brdrw20\brdrcf1\brsp0\clbrdrr\brdrs\brdrw20\brdrcf1\brsp0\clbrdrt\brdrs\brdrw20\brdrcf1\brsp0\clbrdrb\brdrs\brdrw20\brdrcf1\brsp0\cldgll\brdrnone\cldglu\brdrnone\cellx7475\clftsWidth1\clvertalt\clpadl100\clpadfl3\clpadb100 -\clpadfb3\clpadt100\clpadft3\clpadr100\clpadfr3\clbrdrl\brdrs\brdrw20\brdrcf1\brsp0\clbrdrr\brdrs\brdrw20\brdrcf1\brsp0\clbrdrt\brdrs\brdrw20\brdrcf1\brsp0\clbrdrb\brdrs\brdrw20\brdrcf1\brsp0\cldgll\brdrnone\cldglu\brdrnone\cellx9260\rtlch\ab0\ai0\af2\afs20 -\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\insrsid10976062\strike0\ulnone\cf1\row}\trowd\irow3\irowband3\ltrrow\trql\trgaph108\trpaddl108\trpaddfl3\trbrdrt\brdrs\brdrw10\brdrcf0\brsp0\trbrdrl\brdrs\brdrw10\brdrcf0\brsp0\trbrdrb\brdrs\brdrw10\brdrcf0\brsp0\trbrdrr\brdrs\brdrw10\brdrcf0\brsp0\trbrdrh\brdrs\brdrw10\brdrcf0\brsp0\trbrdrv -\brdrs\brdrw10\brdrcf0\brsp0\trwWidth5000\trftsWidth2\trautofit1\trwWidthB0\trftsWidthB3\trpaddt0\trpaddft3\trpaddb0\trpaddfb3\trpaddr108\trpaddfr3\trrh0\trleft-100\clftsWidth1\clvertalt\clpadl100\clpadfl3\clpadb100\clpadfb3\clpadt100\clpadft3\clpadr100 -\clpadfr3\clbrdrl\brdrs\brdrw20\brdrcf1\brsp0\clbrdrr\brdrs\brdrw20\brdrcf1\brsp0\clbrdrt\brdrs\brdrw20\brdrcf1\brsp0\clbrdrb\brdrs\brdrw20\brdrcf1\brsp0\cldgll\brdrnone\cldglu\brdrnone\cellx5660\clftsWidth1\clvertalt\clpadl100\clpadfl3\clpadb100\clpadfb3\clpadt100 -\clpadft3\clpadr100\clpadfr3\clbrdrl\brdrs\brdrw20\brdrcf1\brsp0\clbrdrr\brdrs\brdrw20\brdrcf1\brsp0\clbrdrt\brdrs\brdrw20\brdrcf1\brsp0\clbrdrb\brdrs\brdrw20\brdrcf1\brsp0\cldgll\brdrnone\cldglu\brdrnone\cellx7475\clftsWidth1\clvertalt\clpadl100\clpadfl3\clpadb100 -\clpadfb3\clpadt100\clpadft3\clpadr100\clpadfr3\clbrdrl\brdrs\brdrw20\brdrcf1\brsp0\clbrdrr\brdrs\brdrw20\brdrcf1\brsp0\clbrdrt\brdrs\brdrw20\brdrcf1\brsp0\clbrdrb\brdrs\brdrw20\brdrcf1\brsp0\cldgll\brdrnone\cldglu\brdrnone\cellx9260\pard\plain\intbl\itap1\s0\ilvl0\fi0\sb0\sa0\aspalpha\aspnum\adjustright\brdrt\brdrl\brdrb\brdrr\brdrbtw\brdrbar\nowidctlpar\ltrpar\li0\lin0\ri0\rin0\ql\faauto\sl240\slmult1\rtlch\ab0\ai0\af2\afs22\ltrch\b0\i0\fs22\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 -{\rtlch\ab\ai0\af2\afs20\ltrch\b\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ul\cf1 #3 }{\rtlch\ab\ai0\af2\afs20\ltrch\b\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ul\cf1 Granular}{\rtlch\ab\ai0\af2\afs20\ltrch\b\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0 -\ul\cf1 }{\rtlch\ab\ai0\af2\afs20\ltrch\b\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ul\cf1 grading}{\rtlch\ab\ai0\af2\afs20\ltrch\b\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ul\cf1 }{\rtlch\ab\ai0\af2\afs20\ltrch\b\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0 -\ul\cf1 feedback}{\rtlch\ab\ai0\af2\afs20\ltrch\b\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ul\cf1 (}{\rtlch\ab\ai0\af2\afs20\ltrch\b\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ul\cf1 Direct}{\rtlch\ab\ai0\af2\afs20\ltrch\b\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0 -\ul\cf1 }{\rtlch\ab\ai0\af2\afs20\ltrch\b\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ul\cf1 Mode}{\rtlch\ab\ai0\af2\afs20\ltrch\b\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ul\cf1 )}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\insrsid10976062\strike0 -\ulnone\cf1\par}\pard\plain\intbl\itap1\s0\ilvl0\ls4\tx360\tx720\fi-360\sb0\sa0\aspalpha\aspnum\adjustright\brdrt\brdrl\brdrb\brdrr\brdrbtw\brdrbar\nowidctlpar\ltrpar\li720\lin720\ri0\rin0\ql\faauto\sl240\slmult1\rtlch\ab0\ai0\af2\afs22\ltrch\b0\i0\fs22\loch\af2 -\dbch\af2\hich\f2\strike0\ulnone\cf1{\listtext\pard\plain\tx360\fi-360\aspalpha\aspnum\adjustright\ltrpar\li720\lin720\ri0\rin0\ql\faauto\rtlch\ab0\ai0\af2\afs20\ltrch\fs20\loch\af2\dbch\af2\hich\f2\insrsid10976062\strike0\ulnone\cf1 -\tab }{\rtlch\ab0\ai0\af2\afs20 -\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 Display}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 mission}{ -\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 scores}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0 -\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 on}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0 -\ulnone\cf1 a}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 per}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2 -\hich\f2\strike0\ulnone\cf1 -}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 task}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20 -\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 basis}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 in}{\rtlch\ab0\ai0\af2\afs20 -\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 an}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20 -\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 additional}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 interface} -{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 , }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 along}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0 -\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 with}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2 -\hich\f2\strike0\ulnone\cf1 grader}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 name}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20 -\loch\af2\dbch\af2\hich\f2\insrsid10976062\strike0\ulnone\cf1\par}\pard\plain\intbl\itap1\s0\ilvl0\ls4\tx360\tx720\fi-360\sb0\sa0\aspalpha\aspnum\adjustright\brdrt\brdrl\brdrb\brdrr\brdrbtw\brdrbar\nowidctlpar\ltrpar\li720\lin720\ri0\rin0\ql\faauto\sl240 -\slmult1\rtlch\ab0\ai0\af2\afs22\ltrch\b0\i0\fs22\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1{\listtext\pard\plain\tx360\fi-360\aspalpha\aspnum\adjustright\ltrpar\li720\lin720\ri0\rin0\ql\faauto\rtlch\ab0\ai0\af2\afs20\ltrch\fs20\loch\af2\dbch\af2\hich\f2\insrsid10976062\strike0 -\ulnone\cf1 -\tab }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 In}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2 -\hich\f2\strike0\ulnone\cf1 addition}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 to}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20 -\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 comments}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20 -\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 that}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 are}{\rtlch\ab0\ai0\af2\afs20 -\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 already}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20 -\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 shown}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 , }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 insert}{ -\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 a}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0 -\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 placeholder}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2 -\hich\f2\strike0\ulnone\cf1 comment}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\insrsid10976062\strike0\ulnone\cf1\par}\pard\plain\intbl\itap1\s0\ilvl0\ls4\tx360\tx720\fi-360\sb0\sa0\aspalpha\aspnum\adjustright\brdrt\brdrl\brdrb -\brdrr\brdrbtw\brdrbar\nowidctlpar\ltrpar\li720\lin720\ri0\rin0\ql\faauto\sl240\slmult1\rtlch\ab0\ai0\af2\afs22\ltrch\b0\i0\fs22\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1{\listtext\pard\plain\tx360\fi-360\aspalpha\aspnum\adjustright\ltrpar\li720\lin720\ri0\rin0 -\ql\faauto\rtlch\ab0\ai0\af2\afs20\ltrch\fs20\loch\af2\dbch\af2\hich\f2\insrsid10976062\strike0\ulnone\cf1 -\tab }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 Allow}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2 -\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 graders}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20 -\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 to}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 tag}{\rtlch\ab0\ai0\af2\afs20 -\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 or}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20 -\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 quote}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 lines}{ -\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 of}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0 -\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 code}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2 -\hich\f2\strike0\ulnone\cf1 in}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 each}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20 -\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 task}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20 -\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 submission}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 to}{ -\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 be}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0 -\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 highlighted}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2 -\hich\f2\strike0\ulnone\cf1 when}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 hovered}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20 -\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 over}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\insrsid10976062\strike0\ulnone\cf1\cell}\pard -\plain\intbl\itap1\s0\ilvl0\fi0\sb0\sa0\aspalpha\aspnum\adjustright\brdrt\brdrl\brdrb\brdrr\brdrbtw\brdrbar\nowidctlpar\ltrpar\li0\lin0\ri0\rin0\ql\faauto\sl240\slmult1\rtlch\ab0\ai0\af2\afs22\ltrch\b0\i0\fs22\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1{ -\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\insrsid10976062\strike0\ulnone\cf1\cell}\pard\plain\intbl\itap1\s0\ilvl0\fi0\sb0\sa0\aspalpha\aspnum\adjustright\brdrt\brdrl\brdrb\brdrr\brdrbtw\brdrbar\nowidctlpar\ltrpar\li0\lin0\ri0\rin0 -\ql\faauto\sl240\slmult1\rtlch\ab0\ai0\af2\afs22\ltrch\b0\i0\fs22\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\insrsid10976062\strike0\ulnone\cf1\par}\pard\plain\intbl\itap1\s0\ilvl0\fi0\sb0\sa0 -\aspalpha\aspnum\adjustright\brdrt\brdrl\brdrb\brdrr\brdrbtw\brdrbar\nowidctlpar\ltrpar\li0\lin0\ri0\rin0\ql\faauto\sl240\slmult1\rtlch\ab0\ai0\af2\afs22\ltrch\b0\i0\fs22\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2 -\dbch\af2\hich\f2\strike0\ulnone\cf1 Week}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 8}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\insrsid10976062\strike0\ulnone\cf1\cell}{\trowd\irow3\irowband3\ltrrow\trql\trgaph108\trpaddl108\trpaddfl3\trbrdrt\brdrs\brdrw10\brdrcf0\brsp0\trbrdrl\brdrs\brdrw10\brdrcf0\brsp0\trbrdrb\brdrs\brdrw10\brdrcf0\brsp0\trbrdrr\brdrs\brdrw10\brdrcf0\brsp0\trbrdrh\brdrs\brdrw10\brdrcf0\brsp0\trbrdrv -\brdrs\brdrw10\brdrcf0\brsp0\trwWidth5000\trftsWidth2\trautofit1\trwWidthB0\trftsWidthB3\trpaddt0\trpaddft3\trpaddb0\trpaddfb3\trpaddr108\trpaddfr3\trrh0\trleft-100\clftsWidth1\clvertalt\clpadl100\clpadfl3\clpadb100\clpadfb3\clpadt100\clpadft3\clpadr100 -\clpadfr3\clbrdrl\brdrs\brdrw20\brdrcf1\brsp0\clbrdrr\brdrs\brdrw20\brdrcf1\brsp0\clbrdrt\brdrs\brdrw20\brdrcf1\brsp0\clbrdrb\brdrs\brdrw20\brdrcf1\brsp0\cldgll\brdrnone\cldglu\brdrnone\cellx5660\clftsWidth1\clvertalt\clpadl100\clpadfl3\clpadb100\clpadfb3\clpadt100 -\clpadft3\clpadr100\clpadfr3\clbrdrl\brdrs\brdrw20\brdrcf1\brsp0\clbrdrr\brdrs\brdrw20\brdrcf1\brsp0\clbrdrt\brdrs\brdrw20\brdrcf1\brsp0\clbrdrb\brdrs\brdrw20\brdrcf1\brsp0\cldgll\brdrnone\cldglu\brdrnone\cellx7475\clftsWidth1\clvertalt\clpadl100\clpadfl3\clpadb100 -\clpadfb3\clpadt100\clpadft3\clpadr100\clpadfr3\clbrdrl\brdrs\brdrw20\brdrcf1\brsp0\clbrdrr\brdrs\brdrw20\brdrcf1\brsp0\clbrdrt\brdrs\brdrw20\brdrcf1\brsp0\clbrdrb\brdrs\brdrw20\brdrcf1\brsp0\cldgll\brdrnone\cldglu\brdrnone\cellx9260\rtlch\ab0\ai0\af2\afs20 -\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\insrsid10976062\strike0\ulnone\cf1\row}\trowd\irow4\irowband4\ltrrow\trql\trgaph108\trpaddl108\trpaddfl3\trbrdrt\brdrs\brdrw10\brdrcf0\brsp0\trbrdrl\brdrs\brdrw10\brdrcf0\brsp0\trbrdrb\brdrs\brdrw10\brdrcf0\brsp0\trbrdrr\brdrs\brdrw10\brdrcf0\brsp0\trbrdrh\brdrs\brdrw10\brdrcf0\brsp0\trbrdrv -\brdrs\brdrw10\brdrcf0\brsp0\trwWidth5000\trftsWidth2\trautofit1\trwWidthB0\trftsWidthB3\trpaddt0\trpaddft3\trpaddb0\trpaddfb3\trpaddr108\trpaddfr3\trrh0\trleft-100\clftsWidth1\clvertalt\clpadl100\clpadfl3\clpadb100\clpadfb3\clpadt100\clpadft3\clpadr100 -\clpadfr3\clbrdrl\brdrs\brdrw20\brdrcf1\brsp0\clbrdrr\brdrs\brdrw20\brdrcf1\brsp0\clbrdrt\brdrs\brdrw20\brdrcf1\brsp0\clbrdrb\brdrs\brdrw20\brdrcf1\brsp0\cldgll\brdrnone\cldglu\brdrnone\cellx5660\clftsWidth1\clvertalt\clpadl100\clpadfl3\clpadb100\clpadfb3\clpadt100 -\clpadft3\clpadr100\clpadfr3\clbrdrl\brdrs\brdrw20\brdrcf1\brsp0\clbrdrr\brdrs\brdrw20\brdrcf1\brsp0\clbrdrt\brdrs\brdrw20\brdrcf1\brsp0\clbrdrb\brdrs\brdrw20\brdrcf1\brsp0\cldgll\brdrnone\cldglu\brdrnone\cellx7475\clftsWidth1\clvertalt\clpadl100\clpadfl3\clpadb100 -\clpadfb3\clpadt100\clpadft3\clpadr100\clpadfr3\clbrdrl\brdrs\brdrw20\brdrcf1\brsp0\clbrdrr\brdrs\brdrw20\brdrcf1\brsp0\clbrdrt\brdrs\brdrw20\brdrcf1\brsp0\clbrdrb\brdrs\brdrw20\brdrcf1\brsp0\cldgll\brdrnone\cldglu\brdrnone\cellx9260\pard\plain\intbl\itap1\s0\ilvl0\fi0\sb0\sa0\aspalpha\aspnum\adjustright\brdrt\brdrl\brdrb\brdrr\brdrbtw\brdrbar\nowidctlpar\ltrpar\li0\lin0\ri0\rin0\ql\faauto\sl240\slmult1\rtlch\ab0\ai0\af2\afs22\ltrch\b0\i0\fs22\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 -{\rtlch\ab\ai0\af2\afs20\ltrch\b\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ul\cf1 #4 }{\rtlch\ab\ai0\af2\afs20\ltrch\b\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ul\cf1 Test}{\rtlch\ab\ai0\af2\afs20\ltrch\b\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ul\cf1 } -{\rtlch\ab\ai0\af2\afs20\ltrch\b\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ul\cf1 case}{\rtlch\ab\ai0\af2\afs20\ltrch\b\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ul\cf1 }{\rtlch\ab\ai0\af2\afs20\ltrch\b\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ul\cf1 support} -{\rtlch\ab\ai0\af2\afs20\ltrch\b\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ul\cf1 (}{\rtlch\ab\ai0\af2\afs20\ltrch\b\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ul\cf1 Fork}{\rtlch\ab\ai0\af2\afs20\ltrch\b\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ul\cf1 } -{\rtlch\ab\ai0\af2\afs20\ltrch\b\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ul\cf1 Mode}{\rtlch\ab\ai0\af2\afs20\ltrch\b\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ul\cf1 )}{\rtlch\ab\ai0\af2\afs20\ltrch\b\i0\fs20\loch\af2\dbch\af2\hich\f2\insrsid10976062\strike0 -\ulnone\cf1\par}\pard\plain\intbl\itap1\s0\ilvl0\ls5\tx360\tx720\fi-360\sb0\sa0\aspalpha\aspnum\adjustright\brdrt\brdrl\brdrb\brdrr\brdrbtw\brdrbar\nowidctlpar\ltrpar\li720\lin720\ri0\rin0\ql\faauto\sl240\slmult1\rtlch\ab0\ai0\af2\afs22\ltrch\b0\i0\fs22\loch\af2 -\dbch\af2\hich\f2\strike0\ulnone\cf1{\listtext\pard\plain\tx360\fi-360\aspalpha\aspnum\adjustright\ltrpar\li720\lin720\ri0\rin0\ql\faauto\rtlch\ab0\ai0\af2\afs20\ltrch\fs20\loch\af2\dbch\af2\hich\f2\insrsid10976062\strike0\ulnone\cf1 -\tab }{\rtlch\ab0\ai0\af2\afs20 -\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 Implement}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 functionality} -{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 to}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0 -\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 run}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2 -\hich\f2\strike0\ulnone\cf1 PE}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 -}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 style}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20 -\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 assert}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20 -\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 on}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 the}{\rtlch\ab0\ai0\af2\afs20 -\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 code}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20 -\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 currently}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 in}{ -\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 editor}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0 -\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 against}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2 -\hich\f2\strike0\ulnone\cf1 public}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 test}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20 -\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 cases}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\insrsid10976062\strike0\ulnone\cf1\par}\pard -\plain\intbl\itap1\s0\ilvl0\ls5\tx360\tx720\fi-360\sb0\sa0\aspalpha\aspnum\adjustright\brdrt\brdrl\brdrb\brdrr\brdrbtw\brdrbar\nowidctlpar\ltrpar\li720\lin720\ri0\rin0\ql\faauto\sl240\slmult1\rtlch\ab0\ai0\af2\afs22\ltrch\b0\i0\fs22\loch\af2\dbch\af2\hich\f2\strike0 -\ulnone\cf1{\listtext\pard\plain\tx360\fi-360\aspalpha\aspnum\adjustright\ltrpar\li720\lin720\ri0\rin0\ql\faauto\rtlch\ab0\ai0\af2\afs20\ltrch\fs20\loch\af2\dbch\af2\hich\f2\insrsid10976062\strike0\ulnone\cf1 -\tab }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20 -\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 Test}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 cases}{\rtlch\ab0\ai0\af2\afs20 -\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 to}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20 -\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 be}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 pulled}{\rtlch\ab0\ai0\af2\afs20 -\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 from}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20 -\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 the}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 mission}{ -\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 XML}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0 -\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 file}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2 -\hich\f2\strike0\ulnone\cf1 and}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 run}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20 -\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 through}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20 -\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 the}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 autograder}{ -\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\insrsid10976062\strike0\ulnone\cf1\par}\pard\plain\intbl\itap1\s0\ilvl0\ls5\tx360\tx720\fi-360\sb0\sa0\aspalpha\aspnum\adjustright\brdrt\brdrl\brdrb\brdrr\brdrbtw\brdrbar\nowidctlpar\ltrpar\li720\lin720\ri0\rin0 -\ql\faauto\sl240\slmult1\rtlch\ab0\ai0\af2\afs22\ltrch\b0\i0\fs22\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1{\listtext\pard\plain\tx360\fi-360\aspalpha\aspnum\adjustright\ltrpar\li720\lin720\ri0\rin0\ql\faauto\rtlch\ab0\ai0\af2\afs20\ltrch\fs20\loch\af2 -\dbch\af2\hich\f2\insrsid10976062\strike0\ulnone\cf1 -\tab }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 Parses}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20 -\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 grader}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 output}{ -\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 and}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0 -\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 displays}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2 -\hich\f2\strike0\ulnone\cf1 overview}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 of}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20 -\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 results}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20 -\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 for}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 each}{\rtlch\ab0\ai0\af2\afs20 -\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 test}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20 -\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 case}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\insrsid10976062\strike0\ulnone\cf1\par}\pard\plain\intbl\itap1\s0\ilvl0\ls5\tx360\tx720\fi-360\sb0\sa0\aspalpha\aspnum -\adjustright\brdrt\brdrl\brdrb\brdrr\brdrbtw\brdrbar\nowidctlpar\ltrpar\li720\lin720\ri0\rin0\ql\faauto\sl240\slmult1\rtlch\ab0\ai0\af2\afs22\ltrch\b0\i0\fs22\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1{\listtext\pard\plain\tx360\fi-360\aspalpha\aspnum\adjustright -\ltrpar\li720\lin720\ri0\rin0\ql\faauto\rtlch\ab0\ai0\af2\afs20\ltrch\fs20\loch\af2\dbch\af2\hich\f2\insrsid10976062\strike0\ulnone\cf1 -\tab }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 Purpose}{\rtlch\ab0\ai0\af2\afs20 -\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 : }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 quality}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20 -\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 of}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 life}{\rtlch\ab0\ai0\af2\afs20 -\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 improvement}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{ -\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 for}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0 -\ulnone\cf1 students}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 in}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2 -\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 testing}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20 -\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 code}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 submissions}{\rtlch\ab0\ai0\af2\afs20 -\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\insrsid10976062\strike0\ulnone\cf1\cell}\pard\plain\intbl\itap1\s0\ilvl0\fi0\sb0\sa0\aspalpha\aspnum\adjustright\brdrt\brdrl\brdrb\brdrr\brdrbtw\brdrbar\nowidctlpar\ltrpar\li0\lin0\ri0\rin0\ql\faauto\sl240\slmult1 -\rtlch\ab0\ai0\af2\afs22\ltrch\b0\i0\fs22\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\insrsid10976062\strike0\ulnone\cf1\cell}\pard\plain\intbl\itap1\s0\ilvl0\fi0\sb0\sa0\aspalpha\aspnum -\adjustright\brdrt\brdrl\brdrb\brdrr\brdrbtw\brdrbar\nowidctlpar\ltrpar\li0\lin0\ri0\rin0\ql\faauto\sl240\slmult1\rtlch\ab0\ai0\af2\afs22\ltrch\b0\i0\fs22\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\insrsid10976062\strike0 -\ulnone\cf1\par}\pard\plain\intbl\itap1\s0\ilvl0\fi0\sb0\sa0\aspalpha\aspnum\adjustright\brdrt\brdrl\brdrb\brdrr\brdrbtw\brdrbar\nowidctlpar\ltrpar\li0\lin0\ri0\rin0\ql\faauto\sl240\slmult1\rtlch\ab0\ai0\af2\afs22\ltrch\b0\i0\fs22\loch\af2\dbch\af2\hich\f2\strike0 -\ulnone\cf1{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 Week}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 10}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2 -\hich\f2\insrsid10976062\strike0\ulnone\cf1\cell}{\trowd\irow4\irowband4\ltrrow\trql\trgaph108\trpaddl108\trpaddfl3\trbrdrt\brdrs\brdrw10\brdrcf0\brsp0\trbrdrl\brdrs\brdrw10\brdrcf0\brsp0\trbrdrb\brdrs\brdrw10\brdrcf0\brsp0\trbrdrr\brdrs\brdrw10\brdrcf0\brsp0\trbrdrh\brdrs\brdrw10\brdrcf0\brsp0\trbrdrv -\brdrs\brdrw10\brdrcf0\brsp0\trwWidth5000\trftsWidth2\trautofit1\trwWidthB0\trftsWidthB3\trpaddt0\trpaddft3\trpaddb0\trpaddfb3\trpaddr108\trpaddfr3\trrh0\trleft-100\clftsWidth1\clvertalt\clpadl100\clpadfl3\clpadb100\clpadfb3\clpadt100\clpadft3\clpadr100 -\clpadfr3\clbrdrl\brdrs\brdrw20\brdrcf1\brsp0\clbrdrr\brdrs\brdrw20\brdrcf1\brsp0\clbrdrt\brdrs\brdrw20\brdrcf1\brsp0\clbrdrb\brdrs\brdrw20\brdrcf1\brsp0\cldgll\brdrnone\cldglu\brdrnone\cellx5660\clftsWidth1\clvertalt\clpadl100\clpadfl3\clpadb100\clpadfb3\clpadt100 -\clpadft3\clpadr100\clpadfr3\clbrdrl\brdrs\brdrw20\brdrcf1\brsp0\clbrdrr\brdrs\brdrw20\brdrcf1\brsp0\clbrdrt\brdrs\brdrw20\brdrcf1\brsp0\clbrdrb\brdrs\brdrw20\brdrcf1\brsp0\cldgll\brdrnone\cldglu\brdrnone\cellx7475\clftsWidth1\clvertalt\clpadl100\clpadfl3\clpadb100 -\clpadfb3\clpadt100\clpadft3\clpadr100\clpadfr3\clbrdrl\brdrs\brdrw20\brdrcf1\brsp0\clbrdrr\brdrs\brdrw20\brdrcf1\brsp0\clbrdrt\brdrs\brdrw20\brdrcf1\brsp0\clbrdrb\brdrs\brdrw20\brdrcf1\brsp0\cldgll\brdrnone\cldglu\brdrnone\cellx9260\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\insrsid10976062\strike0\ulnone\cf1\row}\trowd\irow5\irowband5\lastrow\ltrrow\trql\trgaph108\trpaddl108\trpaddfl3\trbrdrt\brdrs\brdrw10\brdrcf0\brsp0\trbrdrl\brdrs\brdrw10\brdrcf0\brsp0\trbrdrb\brdrs\brdrw10\brdrcf0\brsp0\trbrdrr\brdrs\brdrw10\brdrcf0\brsp0\trbrdrh\brdrs\brdrw10\brdrcf0\brsp0 -\trbrdrv\brdrs\brdrw10\brdrcf0\brsp0\trwWidth5000\trftsWidth2\trautofit1\trwWidthB0\trftsWidthB3\trpaddt0\trpaddft3\trpaddb0\trpaddfb3\trpaddr108\trpaddfr3\trrh0\trleft-100\clftsWidth1\clvertalt\clpadl100\clpadfl3\clpadb100\clpadfb3\clpadt100\clpadft3\clpadr100 -\clpadfr3\clbrdrl\brdrs\brdrw20\brdrcf1\brsp0\clbrdrr\brdrs\brdrw20\brdrcf1\brsp0\clbrdrt\brdrs\brdrw20\brdrcf1\brsp0\clbrdrb\brdrs\brdrw20\brdrcf1\brsp0\cldgll\brdrnone\cldglu\brdrnone\cellx5660\clftsWidth1\clvertalt\clpadl100\clpadfl3\clpadb100\clpadfb3\clpadt100 -\clpadft3\clpadr100\clpadfr3\clbrdrl\brdrs\brdrw20\brdrcf1\brsp0\clbrdrr\brdrs\brdrw20\brdrcf1\brsp0\clbrdrt\brdrs\brdrw20\brdrcf1\brsp0\clbrdrb\brdrs\brdrw20\brdrcf1\brsp0\cldgll\brdrnone\cldglu\brdrnone\cellx7475\clftsWidth1\clvertalt\clpadl100\clpadfl3\clpadb100 -\clpadfb3\clpadt100\clpadft3\clpadr100\clpadfr3\clbrdrl\brdrs\brdrw20\brdrcf1\brsp0\clbrdrr\brdrs\brdrw20\brdrcf1\brsp0\clbrdrt\brdrs\brdrw20\brdrcf1\brsp0\clbrdrb\brdrs\brdrw20\brdrcf1\brsp0\cldgll\brdrnone\cldglu\brdrnone\cellx9260\pard\plain\intbl\itap1\s0\ilvl0\fi0\sb0\sa0\aspalpha\aspnum\adjustright\brdrt\brdrl\brdrb\brdrr\brdrbtw\brdrbar\nowidctlpar\ltrpar\li0\lin0\ri0\rin0\ql\faauto\sl240\slmult1\rtlch\ab0\ai0\af2\afs22\ltrch\b0\i0\fs22\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 -{\rtlch\ab\ai0\af2\afs20\ltrch\b\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ul\cf1 #5 }{\rtlch\ab\ai0\af2\afs20\ltrch\b\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ul\cf1 Contest}{\rtlch\ab\ai0\af2\afs20\ltrch\b\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ul\cf1 } -{\rtlch\ab\ai0\af2\afs20\ltrch\b\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ul\cf1 voting}{\rtlch\ab\ai0\af2\afs20\ltrch\b\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ul\cf1 }{\rtlch\ab\ai0\af2\afs20\ltrch\b\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ul\cf1 support} -{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\insrsid10976062\strike0\ulnone\cf1\par}\pard\plain\intbl\itap1\s0\ilvl0\ls6\tx360\tx720\fi-360\sb0\sa0\aspalpha\aspnum\adjustright\brdrt\brdrl\brdrb\brdrr\brdrbtw\brdrbar\nowidctlpar -\ltrpar\li720\lin720\ri0\rin0\ql\faauto\sl240\slmult1\rtlch\ab0\ai0\af2\afs22\ltrch\b0\i0\fs22\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1{\listtext\pard\plain\tx360\fi-360\aspalpha\aspnum\adjustright\ltrpar\li720\lin720\ri0\rin0\ql\faauto\rtlch\ab0\ai0\af2\afs20 -\ltrch\fs20\loch\af2\dbch\af2\hich\f2\insrsid10976062\strike0\ulnone\cf1 -\tab }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 Build}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 } -{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 in}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0 -\ulnone\cf1 default}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 functionality}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2 -\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 for}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20 -\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 students}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 to}{\rtlch\ab0\ai0\af2\afs20 -\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 vote}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20 -\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 for}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 contest}{ -\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 entries}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0 -\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 into}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2 -\hich\f2\strike0\ulnone\cf1 the}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 platform}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20 -\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 itself}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\insrsid10976062\strike0\ulnone\cf1\par}\pard -\plain\intbl\itap1\s0\ilvl0\ls6\tx360\tx720\fi-360\sb0\sa0\aspalpha\aspnum\adjustright\brdrt\brdrl\brdrb\brdrr\brdrbtw\brdrbar\nowidctlpar\ltrpar\li720\lin720\ri0\rin0\ql\faauto\sl240\slmult1\rtlch\ab0\ai0\af2\afs22\ltrch\b0\i0\fs22\loch\af2\dbch\af2\hich\f2\strike0 -\ulnone\cf1{\listtext\pard\plain\tx360\fi-360\aspalpha\aspnum\adjustright\ltrpar\li720\lin720\ri0\rin0\ql\faauto\rtlch\ab0\ai0\af2\afs20\ltrch\fs20\loch\af2\dbch\af2\hich\f2\insrsid10976062\strike0\ulnone\cf1 -\tab }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20 -\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 Contest}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 entries}{\rtlch\ab0\ai0\af2\afs20 -\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 will}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20 -\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 be}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 randomly}{ -\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 displayed}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0 -\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 after}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2 -\hich\f2\strike0\ulnone\cf1 submission}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 deadline}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20 -\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 and}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20 -\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 students}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 will}{ -\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 be}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0 -\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 credited}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2 -\hich\f2\strike0\ulnone\cf1 XP}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 immediately}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20 -\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 after}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20 -\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 voting}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\insrsid10976062\strike0\ulnone\cf1\par}\pard\plain\intbl\itap1\s0\ilvl0\ls6\tx360\tx720\fi-360\sb0\sa0\aspalpha\aspnum -\adjustright\brdrt\brdrl\brdrb\brdrr\brdrbtw\brdrbar\nowidctlpar\ltrpar\li720\lin720\ri0\rin0\ql\faauto\sl240\slmult1\rtlch\ab0\ai0\af2\afs22\ltrch\b0\i0\fs22\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1{\listtext\pard\plain\tx360\fi-360\aspalpha\aspnum\adjustright -\ltrpar\li720\lin720\ri0\rin0\ql\faauto\rtlch\ab0\ai0\af2\afs20\ltrch\fs20\loch\af2\dbch\af2\hich\f2\insrsid10976062\strike0\ulnone\cf1 -\tab }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 Instantaneously}{\rtlch\ab0\ai0\af2\afs20 -\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 compute}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20 -\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 and}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 credit}{\rtlch\ab0\ai0\af2\afs20 -\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 XP}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20 -\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 for}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 winning}{ -\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 submissions}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0 -\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 past}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2 -\hich\f2\strike0\ulnone\cf1 voting}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 deadline}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20 -\loch\af2\dbch\af2\hich\f2\insrsid10976062\strike0\ulnone\cf1\par}\pard\plain\intbl\itap1\s0\ilvl0\ls6\tx360\tx720\fi-360\sb0\sa0\aspalpha\aspnum\adjustright\brdrt\brdrl\brdrb\brdrr\brdrbtw\brdrbar\nowidctlpar\ltrpar\li720\lin720\ri0\rin0\ql\faauto\sl240 -\slmult1\rtlch\ab0\ai0\af2\afs22\ltrch\b0\i0\fs22\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1{\listtext\pard\plain\tx360\fi-360\aspalpha\aspnum\adjustright\ltrpar\li720\lin720\ri0\rin0\ql\faauto\rtlch\ab0\ai0\af2\afs20\ltrch\fs20\loch\af2\dbch\af2\hich\f2\insrsid10976062\strike0 -\ulnone\cf1 -\tab }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 Purpose}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 : }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2 -\dbch\af2\hich\f2\strike0\ulnone\cf1 minimise}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 work}{\rtlch\ab0\ai0\af2\afs20 -\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 from}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20 -\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 manual}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 allocation}{ -\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 and}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0 -\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 collation}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2 -\hich\f2\strike0\ulnone\cf1 of}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 contest}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20 -\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 entries}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\insrsid10976062\strike0\ulnone\cf1\cell}\pard -\plain\intbl\itap1\s0\ilvl0\fi0\sb0\sa0\aspalpha\aspnum\adjustright\brdrt\brdrl\brdrb\brdrr\brdrbtw\brdrbar\nowidctlpar\ltrpar\li0\lin0\ri0\rin0\ql\faauto\sl240\slmult1\rtlch\ab0\ai0\af2\afs22\ltrch\b0\i0\fs22\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1{ -\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\insrsid10976062\strike0\ulnone\cf1\cell}\pard\plain\intbl\itap1\s0\ilvl0\fi0\sb0\sa0\aspalpha\aspnum\adjustright\brdrt\brdrl\brdrb\brdrr\brdrbtw\brdrbar\nowidctlpar\ltrpar\li0\lin0\ri0\rin0 -\ql\faauto\sl240\slmult1\rtlch\ab0\ai0\af2\afs22\ltrch\b0\i0\fs22\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\insrsid10976062\strike0\ulnone\cf1\par}\pard\plain\intbl\itap1\s0\ilvl0\fi0\sb0\sa0 -\aspalpha\aspnum\adjustright\brdrt\brdrl\brdrb\brdrr\brdrbtw\brdrbar\nowidctlpar\ltrpar\li0\lin0\ri0\rin0\ql\faauto\sl240\slmult1\rtlch\ab0\ai0\af2\afs22\ltrch\b0\i0\fs22\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2 -\dbch\af2\hich\f2\strike0\ulnone\cf1 Bonus}{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\insrsid10976062\strike0\ulnone\cf1\cell}{\trowd\irow5\irowband5\lastrow\ltrrow\trql\trgaph108\trpaddl108\trpaddfl3\trbrdrt\brdrs\brdrw10\brdrcf0\brsp0\trbrdrl\brdrs\brdrw10\brdrcf0\brsp0\trbrdrb\brdrs\brdrw10\brdrcf0\brsp0\trbrdrr\brdrs\brdrw10\brdrcf0\brsp0\trbrdrh\brdrs\brdrw10\brdrcf0\brsp0 -\trbrdrv\brdrs\brdrw10\brdrcf0\brsp0\trwWidth5000\trftsWidth2\trautofit1\trwWidthB0\trftsWidthB3\trpaddt0\trpaddft3\trpaddb0\trpaddfb3\trpaddr108\trpaddfr3\trrh0\trleft-100\clftsWidth1\clvertalt\clpadl100\clpadfl3\clpadb100\clpadfb3\clpadt100\clpadft3\clpadr100 -\clpadfr3\clbrdrl\brdrs\brdrw20\brdrcf1\brsp0\clbrdrr\brdrs\brdrw20\brdrcf1\brsp0\clbrdrt\brdrs\brdrw20\brdrcf1\brsp0\clbrdrb\brdrs\brdrw20\brdrcf1\brsp0\cldgll\brdrnone\cldglu\brdrnone\cellx5660\clftsWidth1\clvertalt\clpadl100\clpadfl3\clpadb100\clpadfb3\clpadt100 -\clpadft3\clpadr100\clpadfr3\clbrdrl\brdrs\brdrw20\brdrcf1\brsp0\clbrdrr\brdrs\brdrw20\brdrcf1\brsp0\clbrdrt\brdrs\brdrw20\brdrcf1\brsp0\clbrdrb\brdrs\brdrw20\brdrcf1\brsp0\cldgll\brdrnone\cldglu\brdrnone\cellx7475\clftsWidth1\clvertalt\clpadl100\clpadfl3\clpadb100 -\clpadfb3\clpadt100\clpadft3\clpadr100\clpadfr3\clbrdrl\brdrs\brdrw20\brdrcf1\brsp0\clbrdrr\brdrs\brdrw20\brdrcf1\brsp0\clbrdrt\brdrs\brdrw20\brdrcf1\brsp0\clbrdrb\brdrs\brdrw20\brdrcf1\brsp0\cldgll\brdrnone\cldglu\brdrnone\cellx9260\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\insrsid10976062\strike0\ulnone\cf1 -\row}\pard\plain\itap0\s0\ilvl0\fi0\sb0\sa0\aspalpha\aspnum\adjustright\brdrt\brdrl\brdrb\brdrr\brdrbtw\brdrbar\widctlpar\ltrpar\li0\lin0\ri0\rin0\ql\faauto\sl276\slmult1\rtlch\ab0\ai0\af2\afs22\ltrch\b0\i0\fs22\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1{ -\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\strike0\ulnone\cf1 }{\rtlch\ab0\ai0\af2\afs20\ltrch\b0\i0\fs20\loch\af2\dbch\af2\hich\f2\insrsid10976062\strike0\ulnone\cf1\par}{\*\latentstyles\lsdstimax267\lsdlockeddef0\lsdsemihiddendef0\lsdunhideuseddef0\lsdqformatdef0\lsdprioritydef0{\lsdlockedexcept\lsdqformat1 Normal;\lsdqformat1 heading 1;\lsdsemihidden1\lsdunhideused1\lsdqformat1 heading 2;\lsdsemihidden1\lsdunhideused1\lsdqformat1 heading 3 -;\lsdsemihidden1\lsdunhideused1\lsdqformat1 heading 4;\lsdsemihidden1\lsdunhideused1\lsdqformat1 heading 5;\lsdsemihidden1\lsdunhideused1\lsdqformat1 heading 6;\lsdsemihidden1\lsdunhideused1\lsdqformat1 heading 7;\lsdsemihidden1\lsdunhideused1\lsdqformat1 heading 8 -;\lsdsemihidden1\lsdunhideused1\lsdqformat1 heading 9;\lsdsemihidden1\lsdunhideused1\lsdqformat1 caption;\lsdqformat1 Title;\lsdqformat1 Subtitle;\lsdqformat1 Strong;\lsdqformat1 Emphasis;\lsdsemihidden1\lsdpriority99 Placeholder Text;\lsdqformat1\lsdpriority1 No Spacing -;\lsdpriority60 Light Shading;\lsdpriority61 Light List;\lsdpriority62 Light Grid;\lsdpriority63 Medium Shading 1;\lsdpriority64 Medium Shading 2;\lsdpriority65 Medium List 1;\lsdpriority66 Medium List 2;\lsdpriority67 Medium Grid 1;\lsdpriority68 Medium Grid 2 -;\lsdpriority69 Medium Grid 3;\lsdpriority70 Dark List;\lsdpriority71 Colorful Shading;\lsdpriority72 Colorful List;\lsdpriority73 Colorful Grid;\lsdpriority60 Light Shading Accent 1;\lsdpriority61 Light List Accent 1;\lsdpriority62 Light Grid Accent 1;\lsdpriority63 Medium Shading 1 Accent 1 -;\lsdpriority64 Medium Shading 2 Accent 1;\lsdpriority65 Medium List 1 Accent 1;\lsdsemihidden1\lsdpriority99 Revision;\lsdqformat1\lsdpriority34 List Paragraph;\lsdqformat1\lsdpriority29 Quote;\lsdqformat1\lsdpriority30 Intense Quote;\lsdpriority66 Medium List 2 Accent 1 -;\lsdpriority67 Medium Grid 1 Accent 1;\lsdpriority68 Medium Grid 2 Accent 1;\lsdpriority69 Medium Grid 3 Accent 1;\lsdpriority70 Dark List Accent 1;\lsdpriority71 Colorful Shading Accent 1;\lsdpriority72 Colorful List Accent 1;\lsdpriority73 Colorful Grid Accent 1 -;\lsdpriority60 Light Shading Accent 2;\lsdpriority61 Light List Accent 2;\lsdpriority62 Light Grid Accent 2;\lsdpriority63 Medium Shading 1 Accent 2;\lsdpriority64 Medium Shading 2 Accent 2;\lsdpriority65 Medium List 1 Accent 2;\lsdpriority66 Medium List 2 Accent 2 -;\lsdpriority67 Medium Grid 1 Accent 2;\lsdpriority68 Medium Grid 2 Accent 2;\lsdpriority69 Medium Grid 3 Accent 2;\lsdpriority70 Dark List Accent 2;\lsdpriority71 Colorful Shading Accent 2;\lsdpriority72 Colorful List Accent 2;\lsdpriority73 Colorful Grid Accent 2 -;\lsdpriority60 Light Shading Accent 3;\lsdpriority61 Light List Accent 3;\lsdpriority62 Light Grid Accent 3;\lsdpriority63 Medium Shading 1 Accent 3;\lsdpriority64 Medium Shading 2 Accent 3;\lsdpriority65 Medium List 1 Accent 3;\lsdpriority66 Medium List 2 Accent 3 -;\lsdpriority67 Medium Grid 1 Accent 3;\lsdpriority68 Medium Grid 2 Accent 3;\lsdpriority69 Medium Grid 3 Accent 3;\lsdpriority70 Dark List Accent 3;\lsdpriority71 Colorful Shading Accent 3;\lsdpriority72 Colorful List Accent 3;\lsdpriority73 Colorful Grid Accent 3 -;\lsdpriority60 Light Shading Accent 4;\lsdpriority61 Light List Accent 4;\lsdpriority62 Light Grid Accent 4;\lsdpriority63 Medium Shading 1 Accent 4;\lsdpriority64 Medium Shading 2 Accent 4;\lsdpriority65 Medium List 1 Accent 4;\lsdpriority66 Medium List 2 Accent 4 -;\lsdpriority67 Medium Grid 1 Accent 4;\lsdpriority68 Medium Grid 2 Accent 4;\lsdpriority69 Medium Grid 3 Accent 4;\lsdpriority70 Dark List Accent 4;\lsdpriority71 Colorful Shading Accent 4;\lsdpriority72 Colorful List Accent 4;\lsdpriority73 Colorful Grid Accent 4 -;\lsdpriority60 Light Shading Accent 5;\lsdpriority61 Light List Accent 5;\lsdpriority62 Light Grid Accent 5;\lsdpriority63 Medium Shading 1 Accent 5;\lsdpriority64 Medium Shading 2 Accent 5;\lsdpriority65 Medium List 1 Accent 5;\lsdpriority66 Medium List 2 Accent 5 -;\lsdpriority67 Medium Grid 1 Accent 5;\lsdpriority68 Medium Grid 2 Accent 5;\lsdpriority69 Medium Grid 3 Accent 5;\lsdpriority70 Dark List Accent 5;\lsdpriority71 Colorful Shading Accent 5;\lsdpriority72 Colorful List Accent 5;\lsdpriority73 Colorful Grid Accent 5 -;\lsdpriority60 Light Shading Accent 6;\lsdpriority61 Light List Accent 6;\lsdpriority62 Light Grid Accent 6;\lsdpriority63 Medium Shading 1 Accent 6;\lsdpriority64 Medium Shading 2 Accent 6;\lsdpriority65 Medium List 1 Accent 6;\lsdpriority66 Medium List 2 Accent 6 -;\lsdpriority67 Medium Grid 1 Accent 6;\lsdpriority68 Medium Grid 2 Accent 6;\lsdpriority69 Medium Grid 3 Accent 6;\lsdpriority70 Dark List Accent 6;\lsdpriority71 Colorful Shading Accent 6;\lsdpriority72 Colorful List Accent 6;\lsdpriority73 Colorful Grid Accent 6 -;\lsdqformat1\lsdpriority19 Subtle Emphasis;\lsdqformat1\lsdpriority21 Intense Emphasis;\lsdqformat1\lsdpriority31 Subtle Reference;\lsdqformat1\lsdpriority32 Intense Reference;\lsdqformat1\lsdpriority33 Book Title;\lsdsemihidden1\lsdunhideused1\lsdpriority37 Bibliography -;\lsdsemihidden1\lsdunhideused1\lsdqformat1\lsdpriority39 TOC Heading;}}} \ No newline at end of file From c193d8d32ed4e3fa8f71708c4f9fb1149d66348a Mon Sep 17 00:00:00 2001 From: Shuming Date: Wed, 27 Feb 2019 17:12:48 +0800 Subject: [PATCH 03/12] Refactored Autograder --- README.md | 196 +++++++++++++++++++++++++++++++++++++++++++++++++++ src/index.ts | 163 ++++++++++++++++++++++++++++++++---------- 2 files changed, 323 insertions(+), 36 deletions(-) create mode 100644 README.md diff --git a/README.md b/README.md new file mode 100644 index 0000000..eeeb988 --- /dev/null +++ b/README.md @@ -0,0 +1,196 @@ +# Source Academy Autograder Component + +[![Build_status](https://travis-ci.org/source-academy/grader.svg?branch=master)](https://travis-ci.org/source-academy/grader) +[![Coverage](https://coveralls.io/repos/github/source-academy/grader/badge.svg?branch=master)](https://coveralls.io/github/source-academy/grader?branch=master) + +**The grader is still in development, API specficiations may change!** + +The grader is a component of the [Cadet backend](https://github.com/source-academy/cadet). The grader, + +1. Receives a combination of prepend, student and postpend program strings +2. For each test case program, + + 1. Concatenate all the program strings into a single combined program + 2. Evaluates the single combined program in the [js-slang](https://github.com/source-academy/js-slang) interpreter + +3. Returns a `Summary` JSON containing the results of the evaluation of the student code + + +## Grader Program + +The grader programs are programs written in [the source language](https://github.com/source-academy/js-slang). + +- Each grader program will have access to the global scope of the student program, +- and that there is no restrictions to how the grader program is written + +## Grader `Summary` Format +### Example: Correct Answer + +For example, the student program may look like, + +```javascript +function fib(n) { + if (n <= 1) { + return n; + } else { + return fib(n - 1) + fib(n - 2); + } +} +``` + +and the testcase program(s), + +```javascript +fib(1); +``` + +The grader's corresponding `Summary` JSON output for this program is then, + +```json +{ + "totalScore": 1, + "results": [ + { + "resultType": "pass" + "score": 1 + }] +} +``` + +Note that the `resultType` pass represents any successful evaluation, i.e. no errors raised. + +### Example: Wrong Answer + +For example, the student program may look like, + +```javascript +function fib(n) { + if (n == 2) { + return n; + } else { + return fib(n - 1) + fib(n - 2); + } +} +``` + +and for the test case, + +```javascript +fib(2); +``` +and +```javascript +fib(1); +``` + +The grader's corresponding `Summary` JSON output for this function is then, + +```json +{ + "totalScore": 0, + "results": [ + { + "resultType": "fail", + "expected": "1", + "actual": "2" + }, + { + "resultType": "error", + "errors": [ + { + "errorType": "timeout" + } + ] + } + ] +} +``` +Note the timeout error is a result of the infinite loop inside the student's program. + + +## Assessment XML Files + +Every assessment is represented as an XML file. They have a single node `PROBLEMS` with many child nodes `PROBLEM`. Within each `PROBLEM` node, you may create any number of `TESTCASES` child nodes. Each child node must be either `PUBLIC` or `PRIVATE`, which dictates if that test case will be exposed to the student. + +Within each `PROBLEM` node, you may also create `PREPEND`[[1]](#1) or/and `POSTPEND`[[2]](#2) programs. + +For example, the above gradings may be represented like so, + +```xml + + + TEXT FOR BRIEFING STUDENTS + + + + + // Accept recursive solutions only + function fib(n) { + if (n <= 1) { + return n; + } else { + return fib(n - 1) + fib(n - 2); + } + } + + + + fib(1); + fib(5); + fib(10); + fib(0); + fib(14); + fib(15); + + + + +``` + +The grader will receive a set of strings, consisting of the prepend, student, postpend and an array of test case program strings. The grader will then return a `Summary` JSON. + +```json +{ + "totalScore": 6, + "results": [ + { + "resultType": "pass", + "score": 1 + }, + { + "resultType": "pass", + "score": 1 + }, + { + "resultType": "pass", + "score": 1 + }, + { + "resultType": "pass", + "score": 1 + }, + { + "resultType": "pass", + "score": 1 + }, + { + "resultType": "pass", + "score": 1 + } + ] +} + +``` + + + +Note that the `SOLUTION` node is not related to the Autograder program, but it will be displayed for the manual graders to see. + +[1] Prepend programs should be created in assessments that require students to make use of abstracted functions / variables that are declared but hidden away. + +[2] Postpend programs should be created in assessments that require students to do deep comparison/copies rather than shallow comparisons/copies. (For example, in the missions involving `set_head` and `set_tail`) + diff --git a/src/index.ts b/src/index.ts index 2471fde..6fd4581 100644 --- a/src/index.ts +++ b/src/index.ts @@ -2,13 +2,7 @@ import { createContext, runInContext, Result as SourceResult } from 'js-slang' import { SourceError } from 'js-slang/dist/types' -const TIMEOUT_DURATION = parseInt(process.env.TIMEOUT!, 10) // in milliseconds - -type AwsEvent = { - graderPrograms: string[] - studentProgram: string - library: Library -} +const TIMEOUT_DURATION = 2000 // in milliseconds /** * @property globals - an array of two element string arrays. The first element @@ -24,27 +18,70 @@ export type Library = { globals: Array } +/** + * Set of properties of an event from the backend + */ +export type AwsEvent = { + library: Library + prependProgram: string + studentProgram: string + postpendProgram: string + testPrograms: string[] + answers: string[] +} + +/** + * Set of properties of a unit test + */ +export type UnitTest = { + library: Library + prependProgram: string + studentProgram: string + postpendProgram: string + testProgram: string + answer: string +} + +/** + * Summary is the JSON object the backend receives + * @property totalScore - the total score of the student program + * @property results - the array of Output types + */ +type Summary = { + totalScore: number + results: Output[] +} + /** * Output is the 'refined' version of a @type {Result}. - * OutputError - program raises an error - * OutputPass - program raises no errors + * OutputPass - program raises no errors + * OutputFail - program raises no errors but answer is wrong + * OutputError - program raises an error */ -type Output = OutputPass | OutputError +type Output = OutputPass | OutputFail | OutputError type OutputPass = { - grade: number resultType: 'pass' + score: number +} + +type OutputFail = { + resultType: 'fail' + expected: string + actual: string } type OutputError = { - errors: Array resultType: 'error' + errors: Array } type ErrorFromSource = { errorType: 'runtime' | 'syntax' line: number location: string + errorLine: string + errorExplanation: string } type ErrorFromTimeout = { @@ -62,7 +99,11 @@ type TimeoutResult = { status: 'timeout' } -export const runAll = async (event: AwsEvent): Promise => { +/** + * Runs all the unit tests provided by the @param event + * @param event the AwsEvent from the Backend + */ +export const runAll = async (event: AwsEvent): Promise => { require('./util.js') require('./list.js') require('./tree.js') @@ -88,28 +129,59 @@ export const runAll = async (event: AwsEvent): Promise => { } } evaluateGlobals(event.library.globals) - const stdPrg = event.studentProgram - const promises = event.graderPrograms.map( - gdrPrg => run(event.library, stdPrg, gdrPrg) - ) + const _ = require('lodash/array') + const promises: Promise[] = _.zipWith(event.testPrograms, event.answers, + (testPrg: string, answer: string) => run({ + library: event.library, + prependProgram: event.prependProgram, + studentProgram: event.studentProgram, + postpendProgram: event.postpendProgram, + testProgram: testPrg, + answer: answer + })) const results = await Promise.all(promises) - return results + const totalScore = results.reduce( + (total: number, result) => result.resultType === 'pass' + ? total + result.score + : total, + 0) + return { + totalScore: totalScore, + results: results + } } -const run = async (library: Library, stdPrg: string, gdrPrg: string): Promise => { - const context = createContext<{}>(library.chapter, library.external.symbols) - const program = stdPrg + '\n' + gdrPrg +/** + * Runs individual unit tests + * @param unitTest the individual unit tests composed from runAll() + */ +export const run = async (unitTest: UnitTest): Promise => { + const context = createContext<{}>(unitTest.library.chapter, unitTest.library.external.symbols) + const program = unitTest.prependProgram + '\n' + + unitTest.studentProgram + '\n' + + unitTest.postpendProgram + '\n' + + unitTest.testProgram const result = await catchTimeouts(runInContext( program, context, { scheduler: 'preemptive' } )) if (result.status === 'finished') { - return { resultType: "pass", grade: result.value } as OutputPass + const resultValue = JSON.stringify(result.value) + return resultValue === unitTest.answer + ? { resultType: 'pass', + score: 1 } as OutputPass + : { resultType: 'fail', + expected: unitTest.answer, + actual: resultValue } as OutputFail } else if (result.status === 'error') { - return parseError(context.errors, stdPrg, gdrPrg) + return parseError(context.errors, + unitTest.prependProgram, + unitTest.studentProgram, + unitTest.postpendProgram, + unitTest.testProgram) } else { return { - errors: [ { errorType: 'timeout' } ], - resultType: 'error' + resultType: 'error', + errors: [ { errorType: 'timeout' } ] } } } @@ -144,31 +216,50 @@ const timeout = (msDuration: number): Promise => ( * Transforms the given SourceErrors and student, grader programs into an output * of @type {OutputError}. * @param sourceErrors Non-empty array of SourceErrors. - * @param stdProg Student program. - * @param grdProg Grader program. + * @param preProg prepend program string + * @param stdProg student program string + * @param postProg postpend program string + * @param testProg test case program string */ const parseError = ( sourceErrors: Array, + preProg: string, stdProg: string, - grdProg: string + postProg: string, + testProg: string ): OutputError => { - const stdProgLines = numLines(stdProg) + const preProgLines = getLines(preProg) + const stdProgLines = getLines(stdProg) + const postProgLines = getLines(postProg) + const testProgLines = getLines(testProg) const errors = sourceErrors.map((err: SourceError) => { const line = err.location.end.line - const location = line <= stdProgLines ? 'student' : 'grader' + const location = line <= preProgLines.length ? 'prepend' + : line <= preProgLines.length + stdProgLines.length ? 'student' + : line <= preProgLines.length + stdProgLines.length + postProgLines.length ? 'postpend' + : 'testcase' + const locationLine = location == 'prepend' ? line + : location == 'student' ? line - preProgLines.length + : location == 'postpend' ? line - preProgLines.length - stdProgLines.length + : line - preProgLines.length - stdProgLines.length - postProgLines.length return { errorType: err.type.toLowerCase() as 'syntax' | 'runtime', - line: location == 'student' ? line : line - stdProgLines, - location: location + line: locationLine, + location: location, + errorLine: location == 'prepend' ? preProgLines[locationLine - 1] + : location == 'student' ? stdProgLines[locationLine - 1] + : location == 'postpend' ? postProgLines[locationLine - 1] + : testProgLines[locationLine - 1], + errorExplanation: err.explain() } }) return { - "resultType": "error", - "errors": errors + resultType: 'error', + errors: errors } } /** - * Count the number of lines in a given string. + * Split a program string into an array of strings. */ -const numLines = (str: string) => str.split("\n").length +const getLines = (str: string) => str.split("\n") From bd3f5a8cdadb35eee9c8c4a8c2e705f80e2c80f1 Mon Sep 17 00:00:00 2001 From: Shuming Date: Mon, 4 Mar 2019 11:55:23 +0800 Subject: [PATCH 04/12] Changed from Output[] to Summary as output --- README.md | 9 +++++---- src/index.ts | 32 +++++++++++++++++--------------- 2 files changed, 22 insertions(+), 19 deletions(-) diff --git a/README.md b/README.md index eeeb988..8c5db53 100644 --- a/README.md +++ b/README.md @@ -51,9 +51,10 @@ The grader's corresponding `Summary` JSON output for this program is then, "totalScore": 1, "results": [ { - "resultType": "pass" + "resultType": "pass", "score": 1 - }] + } + ] } ``` @@ -190,7 +191,7 @@ The grader will receive a set of strings, consisting of the prepend, student, po Note that the `SOLUTION` node is not related to the Autograder program, but it will be displayed for the manual graders to see. -[1] Prepend programs should be created in assessments that require students to make use of abstracted functions / variables that are declared but hidden away. +[1] Prepend programs should be created in assessments that require students to make use of abstracted functions / variables that are declared but hidden away. -[2] Postpend programs should be created in assessments that require students to do deep comparison/copies rather than shallow comparisons/copies. (For example, in the missions involving `set_head` and `set_tail`) +[2] Postpend programs should be created in assessments that require students to do deep comparison/copies rather than shallow comparisons/copies. (For example, in the missions involving `set_head` and `set_tail`) diff --git a/src/index.ts b/src/index.ts index 6fd4581..0add086 100644 --- a/src/index.ts +++ b/src/index.ts @@ -2,7 +2,7 @@ import { createContext, runInContext, Result as SourceResult } from 'js-slang' import { SourceError } from 'js-slang/dist/types' -const TIMEOUT_DURATION = 2000 // in milliseconds +const TIMEOUT_DURATION = parseInt(process.env.TIMEOUT!, 10) // in milliseconds /** * @property globals - an array of two element string arrays. The first element @@ -18,6 +18,12 @@ export type Library = { globals: Array } +export type TestCase = { + program: string + answer: string + score: number +} + /** * Set of properties of an event from the backend */ @@ -26,8 +32,7 @@ export type AwsEvent = { prependProgram: string studentProgram: string postpendProgram: string - testPrograms: string[] - answers: string[] + testCases: TestCase[] } /** @@ -38,8 +43,7 @@ export type UnitTest = { prependProgram: string studentProgram: string postpendProgram: string - testProgram: string - answer: string + testCase: TestCase } /** @@ -129,15 +133,13 @@ export const runAll = async (event: AwsEvent): Promise => { } } evaluateGlobals(event.library.globals) - const _ = require('lodash/array') - const promises: Promise[] = _.zipWith(event.testPrograms, event.answers, - (testPrg: string, answer: string) => run({ + const promises: Promise[] = event.testCases.map( + (testCase: TestCase) => run({ library: event.library, prependProgram: event.prependProgram, studentProgram: event.studentProgram, postpendProgram: event.postpendProgram, - testProgram: testPrg, - answer: answer + testCase: testCase })) const results = await Promise.all(promises) const totalScore = results.reduce( @@ -160,24 +162,24 @@ export const run = async (unitTest: UnitTest): Promise => { const program = unitTest.prependProgram + '\n' + unitTest.studentProgram + '\n' + unitTest.postpendProgram + '\n' - + unitTest.testProgram + + unitTest.testCase.program const result = await catchTimeouts(runInContext( program, context, { scheduler: 'preemptive' } )) if (result.status === 'finished') { const resultValue = JSON.stringify(result.value) - return resultValue === unitTest.answer + return resultValue === unitTest.testCase.answer ? { resultType: 'pass', - score: 1 } as OutputPass + score: unitTest.testCase.score } as OutputPass : { resultType: 'fail', - expected: unitTest.answer, + expected: unitTest.testCase.answer, actual: resultValue } as OutputFail } else if (result.status === 'error') { return parseError(context.errors, unitTest.prependProgram, unitTest.studentProgram, unitTest.postpendProgram, - unitTest.testProgram) + unitTest.testCase.program) } else { return { resultType: 'error', From 969610668a3a76a94e8d4e5110677f99d0dce38e Mon Sep 17 00:00:00 2001 From: Shuming Date: Tue, 5 Mar 2019 11:49:06 +0800 Subject: [PATCH 05/12] Added lambda handler and removed README.rst --- README.rst | 183 --------------------------------------------------- src/index.ts | 9 ++- 2 files changed, 7 insertions(+), 185 deletions(-) delete mode 100644 README.rst diff --git a/README.rst b/README.rst deleted file mode 100644 index 2a5a5d1..0000000 --- a/README.rst +++ /dev/null @@ -1,183 +0,0 @@ -====== -Grader -====== - -.. image:: https://travis-ci.org/source-academy/grader.svg?branch=master - :target: https://travis-ci.org/source-academy/grader -.. image:: https://coveralls.io/repos/github/source-academy/grader/badge.svg?branch=master - :target: https://coveralls.io/github/source-academy/grader?branch=master - - -**The grader is still in development, API specficiations may change!** - -The grader is a component of the `Cadet backend`_. The grader, - -1. Receives a student program string, and an array of grader program strings -2. For each grader program, - - 1. Concatenate the student program and grader program into a single combined program - 2. Evaluates the single combined program in the `js-slang`_ interpreter - -3. Returns a ``Output[]`` containing the result of the evaluation - -.. _Cadet backend: https://github.com/source-academy/cadet -.. _js-slang: https://github.com/source-academy/js-slang - -======================== -External Library Support -======================== - -Only support for the "runes" library is available. These include the functions: -- `__compile` -- `__are_pictures_equal` - -Grader Program -============== - -The grader programs are programs written in `the source language`_. In the Grader, the grader programs will be individually concatenated with the student program. This means that, - -- Each grader program will have access to the global scope of the student program, -- and that there is no restrictions to how the grader program is written, -- **save that the grader program returns a number.** [1]_ - -.. _the source language: https://github.com/source-academy/slang - -Example: ``pass`` ------------------ - -For example, the student program may look like, - -.. code-block:: javascript - - const sum = (a, b) => a + b; - const mul = (a, b) => a * b; - const pow = (a, b) => b === 1 ? a : a * pow(a, b - 1); - -and the grader program [2]_, - -.. code-block:: javascript - - function uovaej1pheeVai7ohkoh() { - const sum_marks = sum(111, 234) === 345 ? 1 : 0; - const mul_marks = mul(11, 9) === 99 ? 1 : 0; - const pow_marks = pow(2, 8) === 256 ? 2 : 0; - return sum_marks + mul_marks + pow_marks; - } - - uovaej1pheeVai7ohkoh(); - -The grader's corresponding output for this function is then, - -.. code-block:: json - - { - "grade": 4 - "resultType": "pass", - } - -Note that the `resultType` pass represents any successful evaluation, i.e. no errors raised. It is independent of the `marks` property. - -Example: ``error`` ------------------- - -All ``SourceErrors`` are fatal, i.e. execution stopping. Therefore, it may be advantageous to isolate potentially failing ``graderPrograms``. In the above example, for example, you may want to test if the student has considered the case for ``b === 0``. You can then write a second grader program, like so, - -.. code-block:: javascript - - function uovaej1pheeVai7ohkoh() { - const pow_marks_edge = pow(2, 0) === 0 ? 1 : 0; - return pow_marks_edge; - } - - uovaej1pheeVai7ohkoh(); - -Of course, this is an infinite loop. The source interpreter raises a runtime error [3]_, - -.. code-block:: json - - { - "resultType": "error", - "errors": [ - { - "errorType": "runtime", - "line": 1, - "location": "student" - } - ] - } - -And the `Cadet backend`_ will automatically assign a score of zero for this grading. For the submission, the marks are summed up, and so the student receives a total of 4 out of 5 marks for their definitions of ``sum``, ``mul``, and ``pow`` in this example. - -Assessment XML Files -==================== - -Every assessment is represented as an XML file. They have a single node ``PROBLEMS`` with many child nodes ``PROBLEM``. Within each ``PROBLEM`` node, you may create any number of ``GRADER`` nodes. The content of each ``GRADER`` node will be used in separate grading (api calls), **and their return values will be summed up to be the score** for that ``PROBLEM``. - -For example, the above gradings may be represented like so, - -.. code-block:: xml - - - - - Write the functions `sum`, `mul`, and `pow`. - - - - - // [Marking Scheme] - // 5 marks for correct solutions - const sum = (a, b) => a + b; - // Test - display(sum(999, 1)); - - - - function uovaej1pheeVai7ohkoh() { - const sum_marks = sum(111, 234) === 345 ? 1 : 0; - const mul_marks = mul(11, 9) === 99 ? 1 : 0; - const pow_marks = pow(2, 8) === 256 ? 2 : 0; - return sum_marks + mul_marks + pow_marks; - } - - uovaej1pheeVai7ohkoh(); - - - function uovaej1pheeVai7ohkoh() { - const pow_marks_edge = pow(2, 0) === 0 ? 1 : 0; - return pow_marks_edge; - } - - uovaej1pheeVai7ohkoh(); - - - - -The grader then receives a two-element array of strings, each corresponding to the content of one of the above ``GRADER`` nodes. The overall output of the grader is then (using the student program near the top of this document), - -.. code-block:: json - - [ - { - "grade": 4 - "resultType": "pass", - }, - { - "grade": 0 - "resultType": "pass", - } - ] - -Recall that a ``resultType`` of ``"pass"`` only means that no SourceErrors were raised in the evaluation. The order of ``Output`` elements in the array are preserved according to the order of ``GRADER`` nodes in the assessment XML files. - -Note that the ``SOLUTION`` node is not related to the Grader, but a node used by a previous iteration of the source academy. - -.. [1] In fact, the grader program accepts any return value from the combined student and grader programs; but the `Cadet backend`_ expects only a number, to be entered into the database. -.. [2] While staff have the flexibility to design the grader program in whatever style they fancy, it is recommended to nest *everything* in a function to avoid problems with variable scoping. Thus, only one identifier is created. Name this function such that it avoids possible collisions with the identifiers that the student may create, e.g. with randomly generated alphanumeric strings. -.. [3] Only if the execution is fast enough to exceed the maximum stack before the service times out. Either way, no marks are awarded for the grading. Syntax errors, even in the grader program, will also result in a return ``mark`` of 0. diff --git a/src/index.ts b/src/index.ts index 0add086..ff6e463 100644 --- a/src/index.ts +++ b/src/index.ts @@ -2,6 +2,11 @@ import { createContext, runInContext, Result as SourceResult } from 'js-slang' import { SourceError } from 'js-slang/dist/types' +exports.handler = function(event: AwsEvent, context:any, callback:Function) +{ + this.runAll(event).then((result:any) => callback(null, result)) +}; + const TIMEOUT_DURATION = parseInt(process.env.TIMEOUT!, 10) // in milliseconds /** @@ -248,10 +253,10 @@ const parseError = ( errorType: err.type.toLowerCase() as 'syntax' | 'runtime', line: locationLine, location: location, - errorLine: location == 'prepend' ? preProgLines[locationLine - 1] + errorLine: (location == 'prepend' ? preProgLines[locationLine - 1] : location == 'student' ? stdProgLines[locationLine - 1] : location == 'postpend' ? postProgLines[locationLine - 1] - : testProgLines[locationLine - 1], + : testProgLines[locationLine - 1]).trim(), errorExplanation: err.explain() } }) From 1d4c31c7bf0de7946004be8a483064d59249fe72 Mon Sep 17 00:00:00 2001 From: Shuming Date: Mon, 18 Mar 2019 22:04:49 +0800 Subject: [PATCH 06/12] removed unnecessary dependencies --- package-lock.json | 5642 ++++++++++++++++++++++++++++++++++++++++++++- package.json | 11 +- yarn.lock | 27 +- 3 files changed, 5657 insertions(+), 23 deletions(-) diff --git a/package-lock.json b/package-lock.json index 1412ba3..6328b57 100644 --- a/package-lock.json +++ b/package-lock.json @@ -4,15 +4,5643 @@ "lockfileVersion": 1, "requires": true, "dependencies": { - "gl-matrix": { + "@babel/code-frame": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.0.0.tgz", + "integrity": "sha512-OfC2uemaknXr87bdLUkWog7nYuliM9Ij5HUcajsVcMCpQrcLmtxRbVFTIqmcSkSeYRBFBRxs2FiUqFJDLdiebA==", + "dev": true, + "requires": { + "@babel/highlight": "^7.0.0" + } + }, + "@babel/highlight": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.0.0.tgz", + "integrity": "sha512-UFMC4ZeFC48Tpvj7C8UgLvtkaUuovQX+5xNWrsIoMG8o2z+XFKjKaN9iVmS84dPwVN00W4wPmqvYoZF3EGAsfw==", + "dev": true, + "requires": { + "chalk": "^2.0.0", + "esutils": "^2.0.2", + "js-tokens": "^4.0.0" + } + }, + "@types/acorn": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@types/acorn/-/acorn-4.0.5.tgz", + "integrity": "sha512-603sPiZ4GVRHPvn6vNgEAvJewKsy+zwRWYS2MeIMemgoAtcjlw2G3lALxrb9OPA17J28bkB71R33yXlQbUatCA==", + "requires": { + "@types/estree": "*" + } + }, + "@types/estree": { + "version": "0.0.39", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.39.tgz", + "integrity": "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==" + }, + "@types/jest": { + "version": "24.0.9", + "resolved": "https://registry.npmjs.org/@types/jest/-/jest-24.0.9.tgz", + "integrity": "sha512-k3OOeevcBYLR5pdsOv5g3OP94h3mrJmLPHFEPWgbbVy2tGv0TZ/TlygiC848ogXhK8NL0I5up7YYtwpCp8xCJA==", + "dev": true, + "requires": { + "@types/jest-diff": "*" + } + }, + "@types/jest-diff": { + "version": "20.0.1", + "resolved": "https://registry.npmjs.org/@types/jest-diff/-/jest-diff-20.0.1.tgz", + "integrity": "sha512-yALhelO3i0hqZwhjtcr6dYyaLoCHbAMshwtj6cGxTvHZAKXHsYGdff6E8EPw3xLKY0ELUTQ69Q1rQiJENnccMA==", + "dev": true + }, + "@types/node": { + "version": "10.14.1", + "resolved": "https://registry.npmjs.org/@types/node/-/node-10.14.1.tgz", + "integrity": "sha512-Rymt08vh1GaW4vYB6QP61/5m/CFLGnFZP++bJpWbiNxceNa6RBipDmb413jvtSf/R1gg5a/jQVl2jY4XVRscEA==" + }, + "abab": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.0.tgz", + "integrity": "sha512-sY5AXXVZv4Y1VACTtR11UJCPHHudgY5i26Qj5TypE6DKlIApbwb5uqhXcJ5UUGbvZNRh7EeIoW+LrJumBsKp7w==", + "dev": true + }, + "acorn": { + "version": "5.7.3", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.3.tgz", + "integrity": "sha512-T/zvzYRfbVojPWahDsE5evJdHb3oJoQfFbsrKM7w5Zcs++Tr257tia3BmMP8XYVjp1S9RZXQMh7gao96BlqZOw==" + }, + "acorn-globals": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-4.3.0.tgz", + "integrity": "sha512-hMtHj3s5RnuhvHPowpBYvJVj3rAar82JiDQHvGs1zO0l10ocX/xEdBShNHTJaboucJUsScghp74pH3s7EnHHQw==", + "dev": true, + "requires": { + "acorn": "^6.0.1", + "acorn-walk": "^6.0.1" + }, + "dependencies": { + "acorn": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.1.1.tgz", + "integrity": "sha512-jPTiwtOxaHNaAPg/dmrJ/beuzLRnXtB0kQPQ8JpotKJgTB6rX6c8mlf315941pyjBSaPg8NHXS9fhP4u17DpGA==", + "dev": true + } + } + }, + "acorn-walk": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-6.1.1.tgz", + "integrity": "sha512-OtUw6JUTgxA2QoqqmrmQ7F2NYqiBPi/L2jqHyFtllhOUvXYQXf0Z1CYUinIfyT4bTCGmrA7gX9FvHA81uzCoVw==", + "dev": true + }, + "ajv": { + "version": "6.10.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.0.tgz", + "integrity": "sha512-nffhOpkymDECQyR0mnsUtoCE8RlX38G0rYP+wgLWFyZuUyuuojSSvi/+euOiQBIn63whYwYVIIH1TvE3tu4OEg==", + "dev": true, + "requires": { + "fast-deep-equal": "^2.0.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "ansi-escapes": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz", + "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==", + "dev": true + }, + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "anymatch": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "dev": true, + "requires": { + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" + }, + "dependencies": { + "arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", + "dev": true + }, + "array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", + "dev": true + }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", + "dev": true, + "requires": { + "debug": "^2.3.3", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "posix-character-classes": "^0.1.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + } + }, + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } + } + }, + "extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "dev": true, + "requires": { + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "expand-brackets": "^2.1.4", + "extend-shallow": "^2.0.1", + "fragment-cache": "^0.2.1", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + }, + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + } + } + } + }, + "append-transform": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/append-transform/-/append-transform-0.4.0.tgz", + "integrity": "sha1-126/jKlNJ24keja61EpLdKthGZE=", + "dev": true, + "requires": { + "default-require-extensions": "^1.0.0" + } + }, + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "requires": { + "sprintf-js": "~1.0.2" + } + }, + "arr-diff": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", + "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", + "dev": true, + "requires": { + "arr-flatten": "^1.0.1" + } + }, + "arr-flatten": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", + "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", + "dev": true + }, + "arr-union": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", + "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", + "dev": true + }, + "array-equal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-equal/-/array-equal-1.0.0.tgz", + "integrity": "sha1-jCpe8kcv2ep0KwTHenUJO6J1fJM=", + "dev": true + }, + "array-unique": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", + "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=", + "dev": true + }, + "arrify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", + "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", + "dev": true + }, + "asn1": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", + "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", + "dev": true, + "requires": { + "safer-buffer": "~2.1.0" + } + }, + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "dev": true + }, + "assign-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", + "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", + "dev": true + }, + "astral-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz", + "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==", + "dev": true + }, + "astring": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/astring/-/astring-1.3.1.tgz", + "integrity": "sha512-kMDFc68yAKWQVBC5PhWsnvKtNaQew1XTuYLFjcZFfGys3yl9A+vOcgo3w1VMr8XgK0aYfClg4g0ifDF5lftJNg==" + }, + "async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.2.tgz", + "integrity": "sha512-H1qVYh1MYhEEFLsP97cVKqCGo7KfCyTt6uEWqsTBr9SO84oK9Uwbyd/yCW+6rKJLHksBNUVWZDAjfS+Ccx0Bbg==", + "dev": true, + "requires": { + "lodash": "^4.17.11" + }, + "dependencies": { + "lodash": { + "version": "4.17.11", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", + "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==", + "dev": true + } + } + }, + "async-limiter": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.0.tgz", + "integrity": "sha512-jp/uFnooOiO+L211eZOoSyzpOITMXx1rBITauYykG3BRYPu8h0UcxsPNB04RR5vo4Tyz3+ay17tR6JVf9qzYWg==", + "dev": true + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", + "dev": true + }, + "atob": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", + "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", + "dev": true + }, + "aws-sign2": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", + "dev": true + }, + "aws4": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.8.0.tgz", + "integrity": "sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ==", + "dev": true + }, + "babel-code-frame": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", + "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", + "dev": true, + "requires": { + "chalk": "^1.1.3", + "esutils": "^2.0.2", + "js-tokens": "^3.0.2" + }, + "dependencies": { + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + } + }, + "js-tokens": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", + "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=", + "dev": true + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + } + } + }, + "babel-core": { + "version": "6.26.3", + "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-6.26.3.tgz", + "integrity": "sha512-6jyFLuDmeidKmUEb3NM+/yawG0M2bDZ9Z1qbZP59cyHLz8kYGKYwpJP0UwUKKUiTRNvxfLesJnTedqczP7cTDA==", + "dev": true, + "requires": { + "babel-code-frame": "^6.26.0", + "babel-generator": "^6.26.0", + "babel-helpers": "^6.24.1", + "babel-messages": "^6.23.0", + "babel-register": "^6.26.0", + "babel-runtime": "^6.26.0", + "babel-template": "^6.26.0", + "babel-traverse": "^6.26.0", + "babel-types": "^6.26.0", + "babylon": "^6.18.0", + "convert-source-map": "^1.5.1", + "debug": "^2.6.9", + "json5": "^0.5.1", + "lodash": "^4.17.4", + "minimatch": "^3.0.4", + "path-is-absolute": "^1.0.1", + "private": "^0.1.8", + "slash": "^1.0.0", + "source-map": "^0.5.7" + } + }, + "babel-generator": { + "version": "6.26.1", + "resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.26.1.tgz", + "integrity": "sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA==", + "dev": true, + "requires": { + "babel-messages": "^6.23.0", + "babel-runtime": "^6.26.0", + "babel-types": "^6.26.0", + "detect-indent": "^4.0.0", + "jsesc": "^1.3.0", + "lodash": "^4.17.4", + "source-map": "^0.5.7", + "trim-right": "^1.0.1" + } + }, + "babel-helpers": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helpers/-/babel-helpers-6.24.1.tgz", + "integrity": "sha1-NHHenK7DiOXIUOWX5Yom3fN2ArI=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1" + } + }, + "babel-jest": { + "version": "23.6.0", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-23.6.0.tgz", + "integrity": "sha512-lqKGG6LYXYu+DQh/slrQ8nxXQkEkhugdXsU6St7GmhVS7Ilc/22ArwqXNJrf0QaOBjZB0360qZMwXqDYQHXaew==", + "dev": true, + "requires": { + "babel-plugin-istanbul": "^4.1.6", + "babel-preset-jest": "^23.2.0" + } + }, + "babel-messages": { + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz", + "integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-istanbul": { + "version": "4.1.6", + "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-4.1.6.tgz", + "integrity": "sha512-PWP9FQ1AhZhS01T/4qLSKoHGY/xvkZdVBGlKM/HuxxS3+sC66HhTNR7+MpbO/so/cz/wY94MeSWJuP1hXIPfwQ==", + "dev": true, + "requires": { + "babel-plugin-syntax-object-rest-spread": "^6.13.0", + "find-up": "^2.1.0", + "istanbul-lib-instrument": "^1.10.1", + "test-exclude": "^4.2.1" + } + }, + "babel-plugin-jest-hoist": { + "version": "23.2.0", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-23.2.0.tgz", + "integrity": "sha1-5h+uBaHKiAGq3uV6bWa4zvr0QWc=", + "dev": true + }, + "babel-plugin-syntax-object-rest-spread": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz", + "integrity": "sha1-/WU28rzhODb/o6VFjEkDpZe7O/U=", + "dev": true + }, + "babel-preset-jest": { + "version": "23.2.0", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-23.2.0.tgz", + "integrity": "sha1-jsegOhOPABoaj7HoETZSvxpV2kY=", + "dev": true, + "requires": { + "babel-plugin-jest-hoist": "^23.2.0", + "babel-plugin-syntax-object-rest-spread": "^6.13.0" + } + }, + "babel-register": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-register/-/babel-register-6.26.0.tgz", + "integrity": "sha1-btAhFz4vy0htestFxgCahW9kcHE=", + "dev": true, + "requires": { + "babel-core": "^6.26.0", + "babel-runtime": "^6.26.0", + "core-js": "^2.5.0", + "home-or-tmp": "^2.0.0", + "lodash": "^4.17.4", + "mkdirp": "^0.5.1", + "source-map-support": "^0.4.15" + } + }, + "babel-runtime": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", + "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", + "dev": true, + "requires": { + "core-js": "^2.4.0", + "regenerator-runtime": "^0.11.0" + } + }, + "babel-template": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.26.0.tgz", + "integrity": "sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI=", + "dev": true, + "requires": { + "babel-runtime": "^6.26.0", + "babel-traverse": "^6.26.0", + "babel-types": "^6.26.0", + "babylon": "^6.18.0", + "lodash": "^4.17.4" + } + }, + "babel-traverse": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.26.0.tgz", + "integrity": "sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=", + "dev": true, + "requires": { + "babel-code-frame": "^6.26.0", + "babel-messages": "^6.23.0", + "babel-runtime": "^6.26.0", + "babel-types": "^6.26.0", + "babylon": "^6.18.0", + "debug": "^2.6.8", + "globals": "^9.18.0", + "invariant": "^2.2.2", + "lodash": "^4.17.4" + } + }, + "babel-types": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz", + "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=", + "dev": true, + "requires": { + "babel-runtime": "^6.26.0", + "esutils": "^2.0.2", + "lodash": "^4.17.4", + "to-fast-properties": "^1.0.3" + } + }, + "babylon": { + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz", + "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==", + "dev": true + }, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", + "dev": true + }, + "base": { + "version": "0.11.2", + "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", + "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", + "dev": true, + "requires": { + "cache-base": "^1.0.1", + "class-utils": "^0.3.5", + "component-emitter": "^1.2.1", + "define-property": "^1.0.0", + "isobject": "^3.0.1", + "mixin-deep": "^1.2.0", + "pascalcase": "^0.1.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + }, + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true + } + } + }, + "bcrypt-pbkdf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", + "dev": true, + "requires": { + "tweetnacl": "^0.14.3" + } + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "braces": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", + "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", + "dev": true, + "requires": { + "expand-range": "^1.8.1", + "preserve": "^0.2.0", + "repeat-element": "^1.1.2" + } + }, + "browser-process-hrtime": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-0.1.3.tgz", + "integrity": "sha512-bRFnI4NnjO6cnyLmOV/7PVoDEMJChlcfN0z4s1YMBY989/SvlfMI1lgCnkFUs53e9gQF+w7qu7XdllSTiSl8Aw==", + "dev": true + }, + "browser-resolve": { + "version": "1.11.3", + "resolved": "https://registry.npmjs.org/browser-resolve/-/browser-resolve-1.11.3.tgz", + "integrity": "sha512-exDi1BYWB/6raKHmDTCicQfTkqwN5fioMFV4j8BsfMU4R2DK/QfZfK7kOVkmWCNANf0snkBzqGqAJBao9gZMdQ==", + "dev": true, + "requires": { + "resolve": "1.1.7" + }, + "dependencies": { + "resolve": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", + "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=", + "dev": true + } + } + }, + "bs-logger": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/bs-logger/-/bs-logger-0.2.6.tgz", + "integrity": "sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==", + "dev": true, + "requires": { + "fast-json-stable-stringify": "2.x" + } + }, + "bser": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/bser/-/bser-2.0.0.tgz", + "integrity": "sha1-mseNPtXZFYBP2HrLFYvHlxR6Fxk=", + "dev": true, + "requires": { + "node-int64": "^0.4.0" + } + }, + "buffer-from": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", + "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", + "dev": true + }, + "cache-base": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", + "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", + "dev": true, + "requires": { + "collection-visit": "^1.0.0", + "component-emitter": "^1.2.1", + "get-value": "^2.0.6", + "has-value": "^1.0.0", + "isobject": "^3.0.1", + "set-value": "^2.0.0", + "to-object-path": "^0.3.0", + "union-value": "^1.0.0", + "unset-value": "^1.0.0" + }, + "dependencies": { + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + } + } + }, + "callsites": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz", + "integrity": "sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA=", + "dev": true + }, + "camelcase": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", + "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", + "dev": true + }, + "capture-exit": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/capture-exit/-/capture-exit-1.2.0.tgz", + "integrity": "sha1-HF/MSJ/QqwDU8ax64QcuMXP7q28=", + "dev": true, + "requires": { + "rsvp": "^3.3.3" + } + }, + "caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", + "dev": true + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "ci-info": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-1.6.0.tgz", + "integrity": "sha512-vsGdkwSCDpWmP80ncATX7iea5DWQemg1UgCW5J8tqjU3lYw4FBYuj89J0CTVomA7BEfvSZd84GmHko+MxFQU2A==", + "dev": true + }, + "class-utils": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", + "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", + "dev": true, + "requires": { + "arr-union": "^3.1.0", + "define-property": "^0.2.5", + "isobject": "^3.0.0", + "static-extend": "^0.1.1" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + } + } + }, + "cliui": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz", + "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==", + "dev": true, + "requires": { + "string-width": "^2.1.1", + "strip-ansi": "^4.0.0", + "wrap-ansi": "^2.0.0" + } + }, + "co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", + "dev": true + }, + "code-point-at": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", + "dev": true + }, + "collection-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", + "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", + "dev": true, + "requires": { + "map-visit": "^1.0.0", + "object-visit": "^1.0.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "combined-stream": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.7.tgz", + "integrity": "sha512-brWl9y6vOB1xYPZcpZde3N9zDByXTosAeMDo4p1wzo6UMOX4vumB+TP1RZ76sfE6Md68Q0NJSrE/gbezd4Ul+w==", + "dev": true, + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "commander": { + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.19.0.tgz", + "integrity": "sha512-6tvAOO+D6OENvRAh524Dh9jcfKTYDQAqvqezbCW82xj5X0pSrcpxtvRKHLG0yBY6SD7PSDrJaj+0AiOcKVd1Xg==" + }, + "common-tags": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/common-tags/-/common-tags-1.8.0.tgz", + "integrity": "sha512-6P6g0uetGpW/sdyUy/iQQCbFF0kWVMSIVSyYz7Zgjcgh8mgw8PQzDNZeyZ5DQ2gM7LBoZPHmnjz8rUthkBG5tw==" + }, + "component-emitter": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", + "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=", + "dev": true + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true + }, + "convert-source-map": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.6.0.tgz", + "integrity": "sha512-eFu7XigvxdZ1ETfbgPBohgyQ/Z++C0eEhTor0qRwBw9unw+L0/6V8wkSuGgzdThkiS5lSpdptOQPD8Ak40a+7A==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.1" + } + }, + "copy-descriptor": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", + "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", + "dev": true + }, + "core-js": { + "version": "2.6.5", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.5.tgz", + "integrity": "sha512-klh/kDpwX8hryYL14M9w/xei6vrv6sE8gTHDG7/T/+SEovB/G4ejwcfE/CBzO6Edsu+OETZMZ3wcX/EjUkrl5A==", + "dev": true + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", + "dev": true + }, + "coveralls": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/coveralls/-/coveralls-3.0.3.tgz", + "integrity": "sha512-viNfeGlda2zJr8Gj1zqXpDMRjw9uM54p7wzZdvLRyOgnAfCe974Dq4veZkjJdxQXbmdppu6flEajFYseHYaUhg==", + "dev": true, + "requires": { + "growl": "~> 1.10.0", + "js-yaml": "^3.11.0", + "lcov-parse": "^0.0.10", + "log-driver": "^1.2.7", + "minimist": "^1.2.0", + "request": "^2.86.0" + } + }, + "cross-spawn": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", + "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", + "dev": true, + "requires": { + "lru-cache": "^4.0.1", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, + "cssom": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.6.tgz", + "integrity": "sha512-DtUeseGk9/GBW0hl0vVPpU22iHL6YB5BUX7ml1hB+GMpo0NX5G4voX3kdWiMSEguFtcW3Vh3djqNF4aIe6ne0A==", + "dev": true + }, + "cssstyle": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-1.2.1.tgz", + "integrity": "sha512-7DYm8qe+gPx/h77QlCyFmX80+fGaE/6A/Ekl0zaszYOubvySO2saYFdQ78P29D0UsULxFKCetDGNaNRUdSF+2A==", + "dev": true, + "requires": { + "cssom": "0.3.x" + } + }, + "dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0" + } + }, + "data-urls": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-1.1.0.tgz", + "integrity": "sha512-YTWYI9se1P55u58gL5GkQHW4P6VJBJ5iBT+B5a7i2Tjadhv52paJG0qHX4A0OR6/t52odI64KP2YvFpkDOi3eQ==", + "dev": true, + "requires": { + "abab": "^2.0.0", + "whatwg-mimetype": "^2.2.0", + "whatwg-url": "^7.0.0" + }, + "dependencies": { + "whatwg-url": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.0.0.tgz", + "integrity": "sha512-37GeVSIJ3kn1JgKyjiYNmSLP1yzbpb29jdmwBSgkD9h40/hyrR/OifpVUndji3tmwGgD8qpw7iQu3RSbCrBpsQ==", + "dev": true, + "requires": { + "lodash.sortby": "^4.7.0", + "tr46": "^1.0.1", + "webidl-conversions": "^4.0.2" + } + } + } + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", + "dev": true + }, + "decode-uri-component": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", + "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", + "dev": true + }, + "deep-is": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", + "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", + "dev": true + }, + "default-require-extensions": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-1.0.0.tgz", + "integrity": "sha1-836hXT4T/9m0N9M+GnW1+5eHTLg=", + "dev": true, + "requires": { + "strip-bom": "^2.0.0" + } + }, + "define-properties": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", + "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", + "dev": true, + "requires": { + "object-keys": "^1.0.12" + } + }, + "define-property": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", + "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "dev": true, + "requires": { + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" + }, + "dependencies": { + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + }, + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true + } + } + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", + "dev": true + }, + "detect-indent": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz", + "integrity": "sha1-920GQ1LN9Docts5hnE7jqUdd4gg=", + "dev": true, + "requires": { + "repeating": "^2.0.0" + } + }, + "detect-newline": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-2.1.0.tgz", + "integrity": "sha1-9B8cEL5LAOh7XxPaaAdZ8sW/0+I=", + "dev": true + }, + "diff": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", + "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", + "dev": true + }, + "domexception": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/domexception/-/domexception-1.0.1.tgz", + "integrity": "sha512-raigMkn7CJNNo6Ihro1fzG7wr3fHuYVytzquZKX5n0yizGsTcYgzdIUwj1X9pK0VvjeihV+XiclP+DjwbsSKug==", + "dev": true, + "requires": { + "webidl-conversions": "^4.0.2" + } + }, + "ecc-jsbn": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", + "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", + "dev": true, + "requires": { + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" + } + }, + "error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "requires": { + "is-arrayish": "^0.2.1" + } + }, + "es-abstract": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.13.0.tgz", + "integrity": "sha512-vDZfg/ykNxQVwup/8E1BZhVzFfBxs9NqMzGcvIJrqg5k2/5Za2bWo40dK2J1pgLngZ7c+Shh8lwYtLGyrwPutg==", + "dev": true, + "requires": { + "es-to-primitive": "^1.2.0", + "function-bind": "^1.1.1", + "has": "^1.0.3", + "is-callable": "^1.1.4", + "is-regex": "^1.0.4", + "object-keys": "^1.0.12" + } + }, + "es-to-primitive": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.0.tgz", + "integrity": "sha512-qZryBOJjV//LaxLTV6UC//WewneB3LcXOL9NP++ozKVXsIIIpm/2c13UDiD9Jp2eThsecw9m3jPqDwTyobcdbg==", + "dev": true, + "requires": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + } + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true + }, + "escodegen": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.11.1.tgz", + "integrity": "sha512-JwiqFD9KdGVVpeuRa68yU3zZnBEOcPs0nKW7wZzXky8Z7tffdYUHbe11bPCV5jYlK6DVdKLWLm0f5I/QlL0Kmw==", + "dev": true, + "requires": { + "esprima": "^3.1.3", + "estraverse": "^4.2.0", + "esutils": "^2.0.2", + "optionator": "^0.8.1", + "source-map": "~0.6.1" + }, + "dependencies": { + "esprima": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-3.1.3.tgz", + "integrity": "sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM=", + "dev": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "optional": true + } + } + }, + "esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true + }, + "estraverse": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz", + "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=", + "dev": true + }, + "esutils": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", + "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=", + "dev": true + }, + "exec-sh": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/exec-sh/-/exec-sh-0.2.2.tgz", + "integrity": "sha512-FIUCJz1RbuS0FKTdaAafAByGS0CPvU3R0MeHxgtl+djzCc//F8HakL8GzmVNZanasTbTAY/3DRFA0KpVqj/eAw==", + "dev": true, + "requires": { + "merge": "^1.2.0" + } + }, + "execa": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", + "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=", + "dev": true, + "requires": { + "cross-spawn": "^5.0.1", + "get-stream": "^3.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + } + }, + "exit": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", + "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=", + "dev": true + }, + "expand-brackets": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", + "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", + "dev": true, + "requires": { + "is-posix-bracket": "^0.1.0" + } + }, + "expand-range": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz", + "integrity": "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=", + "dev": true, + "requires": { + "fill-range": "^2.1.0" + } + }, + "expect": { + "version": "23.6.0", + "resolved": "https://registry.npmjs.org/expect/-/expect-23.6.0.tgz", + "integrity": "sha512-dgSoOHgmtn/aDGRVFWclQyPDKl2CQRq0hmIEoUAuQs/2rn2NcvCWcSCovm6BLeuB/7EZuLGu2QfnR+qRt5OM4w==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.0", + "jest-diff": "^23.6.0", + "jest-get-type": "^22.1.0", + "jest-matcher-utils": "^23.6.0", + "jest-message-util": "^23.4.0", + "jest-regex-util": "^23.3.0" + } + }, + "extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "dev": true + }, + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "dev": true, + "requires": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "extglob": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", + "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", + "dev": true, + "requires": { + "is-extglob": "^1.0.0" + } + }, + "extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", + "dev": true + }, + "fast-deep-equal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", + "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=", + "dev": true + }, + "fast-json-stable-stringify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", + "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=", + "dev": true + }, + "fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", + "dev": true + }, + "fb-watchman": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.0.tgz", + "integrity": "sha1-VOmr99+i8mzZsWNsWIwa/AXeXVg=", + "dev": true, + "requires": { + "bser": "^2.0.0" + } + }, + "filename-regex": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz", + "integrity": "sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY=", + "dev": true + }, + "fileset": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/fileset/-/fileset-2.0.3.tgz", + "integrity": "sha1-jnVIqW08wjJ+5eZ0FocjozO7oqA=", + "dev": true, + "requires": { + "glob": "^7.0.3", + "minimatch": "^3.0.3" + } + }, + "fill-range": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.4.tgz", + "integrity": "sha512-cnrcCbj01+j2gTG921VZPnHbjmdAf8oQV/iGeV2kZxGSyfYjjTyY79ErsK1WJWMpw6DaApEX72binqJE+/d+5Q==", + "dev": true, + "requires": { + "is-number": "^2.1.0", + "isobject": "^2.0.0", + "randomatic": "^3.0.0", + "repeat-element": "^1.1.2", + "repeat-string": "^1.5.2" + } + }, + "find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "dev": true, + "requires": { + "locate-path": "^2.0.0" + } + }, + "for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", + "dev": true + }, + "for-own": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz", + "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=", + "dev": true, + "requires": { + "for-in": "^1.0.1" + } + }, + "forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", + "dev": true + }, + "form-data": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", + "dev": true, + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + } + }, + "fragment-cache": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", + "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", + "dev": true, + "requires": { + "map-cache": "^0.2.2" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true + }, + "fsevents": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.7.tgz", + "integrity": "sha512-Pxm6sI2MeBD7RdD12RYsqaP0nMiwx8eZBXCa6z2L+mRHm2DYrOYwihmhjpkdjUHwQhslWQjRpEgNq4XvBmaAuw==", + "dev": true, + "optional": true, + "requires": { + "nan": "^2.9.2", + "node-pre-gyp": "^0.10.0" + }, + "dependencies": { + "abbrev": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "ansi-regex": { + "version": "2.1.1", + "bundled": true, + "dev": true + }, + "aproba": { + "version": "1.2.0", + "bundled": true, + "dev": true, + "optional": true + }, + "are-we-there-yet": { + "version": "1.1.5", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "delegates": "^1.0.0", + "readable-stream": "^2.0.6" + } + }, + "balanced-match": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "brace-expansion": { + "version": "1.1.11", + "bundled": true, + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "chownr": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "code-point-at": { + "version": "1.1.0", + "bundled": true, + "dev": true + }, + "concat-map": { + "version": "0.0.1", + "bundled": true, + "dev": true + }, + "console-control-strings": { + "version": "1.1.0", + "bundled": true, + "dev": true + }, + "core-util-is": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "debug": { + "version": "2.6.9", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "ms": "2.0.0" + } + }, + "deep-extend": { + "version": "0.6.0", + "bundled": true, + "dev": true, + "optional": true + }, + "delegates": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "detect-libc": { + "version": "1.0.3", + "bundled": true, + "dev": true, + "optional": true + }, + "fs-minipass": { + "version": "1.2.5", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minipass": "^2.2.1" + } + }, + "fs.realpath": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "gauge": { + "version": "2.7.4", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "aproba": "^1.0.3", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.0", + "object-assign": "^4.1.0", + "signal-exit": "^3.0.0", + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wide-align": "^1.1.0" + } + }, + "glob": { + "version": "7.1.3", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "has-unicode": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "iconv-lite": { + "version": "0.4.24", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "ignore-walk": { + "version": "3.0.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minimatch": "^3.0.4" + } + }, + "inflight": { + "version": "1.0.6", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.3", + "bundled": true, + "dev": true + }, + "ini": { + "version": "1.3.5", + "bundled": true, + "dev": true, + "optional": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "isarray": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "minimatch": { + "version": "3.0.4", + "bundled": true, + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "0.0.8", + "bundled": true, + "dev": true + }, + "minipass": { + "version": "2.3.5", + "bundled": true, + "dev": true, + "requires": { + "safe-buffer": "^5.1.2", + "yallist": "^3.0.0" + } + }, + "minizlib": { + "version": "1.2.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minipass": "^2.2.1" + } + }, + "mkdirp": { + "version": "0.5.1", + "bundled": true, + "dev": true, + "requires": { + "minimist": "0.0.8" + } + }, + "ms": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "needle": { + "version": "2.2.4", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "debug": "^2.1.2", + "iconv-lite": "^0.4.4", + "sax": "^1.2.4" + } + }, + "node-pre-gyp": { + "version": "0.10.3", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "detect-libc": "^1.0.2", + "mkdirp": "^0.5.1", + "needle": "^2.2.1", + "nopt": "^4.0.1", + "npm-packlist": "^1.1.6", + "npmlog": "^4.0.2", + "rc": "^1.2.7", + "rimraf": "^2.6.1", + "semver": "^5.3.0", + "tar": "^4" + } + }, + "nopt": { + "version": "4.0.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "abbrev": "1", + "osenv": "^0.1.4" + } + }, + "npm-bundled": { + "version": "1.0.5", + "bundled": true, + "dev": true, + "optional": true + }, + "npm-packlist": { + "version": "1.2.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "ignore-walk": "^3.0.1", + "npm-bundled": "^1.0.1" + } + }, + "npmlog": { + "version": "4.1.2", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "are-we-there-yet": "~1.1.2", + "console-control-strings": "~1.1.0", + "gauge": "~2.7.3", + "set-blocking": "~2.0.0" + } + }, + "number-is-nan": { + "version": "1.0.1", + "bundled": true, + "dev": true + }, + "object-assign": { + "version": "4.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "once": { + "version": "1.4.0", + "bundled": true, + "dev": true, + "requires": { + "wrappy": "1" + } + }, + "os-homedir": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "os-tmpdir": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "osenv": { + "version": "0.1.5", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.0" + } + }, + "path-is-absolute": { + "version": "1.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "process-nextick-args": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "rc": { + "version": "1.2.8", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "bundled": true, + "dev": true, + "optional": true + } + } + }, + "readable-stream": { + "version": "2.3.6", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "rimraf": { + "version": "2.6.3", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "glob": "^7.1.3" + } + }, + "safe-buffer": { + "version": "5.1.2", + "bundled": true, + "dev": true + }, + "safer-buffer": { + "version": "2.1.2", + "bundled": true, + "dev": true, + "optional": true + }, + "sax": { + "version": "1.2.4", + "bundled": true, + "dev": true, + "optional": true + }, + "semver": { + "version": "5.6.0", + "bundled": true, + "dev": true, + "optional": true + }, + "set-blocking": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "signal-exit": { + "version": "3.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "string-width": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "string_decoder": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "bundled": true, + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "strip-json-comments": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "tar": { + "version": "4.4.8", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "chownr": "^1.1.1", + "fs-minipass": "^1.2.5", + "minipass": "^2.3.4", + "minizlib": "^1.1.1", + "mkdirp": "^0.5.0", + "safe-buffer": "^5.1.2", + "yallist": "^3.0.2" + } + }, + "util-deprecate": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "wide-align": { + "version": "1.1.3", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "string-width": "^1.0.2 || 2" + } + }, + "wrappy": { + "version": "1.0.2", + "bundled": true, + "dev": true + }, + "yallist": { + "version": "3.0.3", + "bundled": true, + "dev": true + } + } + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "get-caller-file": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", + "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==", + "dev": true + }, + "get-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", + "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", + "dev": true + }, + "get-value": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", + "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", + "dev": true + }, + "getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0" + } + }, + "glob": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", + "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "glob-base": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz", + "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=", + "dev": true, + "requires": { + "glob-parent": "^2.0.0", + "is-glob": "^2.0.0" + } + }, + "glob-parent": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz", + "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=", + "dev": true, + "requires": { + "is-glob": "^2.0.0" + } + }, + "globals": { + "version": "9.18.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz", + "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==", + "dev": true + }, + "graceful-fs": { + "version": "4.1.15", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.15.tgz", + "integrity": "sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA==", + "dev": true + }, + "growl": { + "version": "1.10.5", + "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", + "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==", + "dev": true + }, + "growly": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/growly/-/growly-1.3.0.tgz", + "integrity": "sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE=", + "dev": true + }, + "handlebars": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.1.0.tgz", + "integrity": "sha512-l2jRuU1NAWK6AW5qqcTATWQJvNPEwkM7NEKSiv/gqOsoSQbVoWyqVEY5GS+XPQ88zLNmqASRpzfdm8d79hJS+w==", + "dev": true, + "requires": { + "async": "^2.5.0", + "optimist": "^0.6.1", + "source-map": "^0.6.1", + "uglify-js": "^3.1.4" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "har-schema": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", + "dev": true + }, + "har-validator": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz", + "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==", + "dev": true, + "requires": { + "ajv": "^6.5.5", + "har-schema": "^2.0.0" + } + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-ansi": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", + "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "has-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.0.tgz", + "integrity": "sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q=", + "dev": true + }, + "has-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", + "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", + "dev": true, + "requires": { + "get-value": "^2.0.6", + "has-values": "^1.0.0", + "isobject": "^3.0.0" + }, + "dependencies": { + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + } + } + }, + "has-values": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", + "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "kind-of": "^4.0.0" + }, + "dependencies": { + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "kind-of": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", + "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "home-or-tmp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/home-or-tmp/-/home-or-tmp-2.0.0.tgz", + "integrity": "sha1-42w/LSyufXRqhX440Y1fMqeILbg=", + "dev": true, + "requires": { + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.1" + } + }, + "hosted-git-info": { "version": "2.7.1", - "resolved": "https://registry.npmjs.org/gl-matrix/-/gl-matrix-2.7.1.tgz", - "integrity": "sha512-22I6q7aO2oKNahNV0+9JavVNUhQXRTvR5jP2s8U1l93TkjcQe8RK6MeMYpM7+66R0sCVUgSdO97BL439vePyzQ==" + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.7.1.tgz", + "integrity": "sha512-7T/BxH19zbcCTa8XkMlbK5lTo1WtgkFi3GvdWEyNuc4Vex7/9Dqbnpsf4JMydcfj9HCg4zUWFTL3Za6lapg5/w==", + "dev": true + }, + "html-encoding-sniffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-1.0.2.tgz", + "integrity": "sha512-71lZziiDnsuabfdYiUeWdCVyKuqwWi23L8YeIgV9jSSZHCtb6wB1BKWooH7L3tn4/FuZJMVWyNaIDr4RGmaSYw==", + "dev": true, + "requires": { + "whatwg-encoding": "^1.0.1" + } + }, + "http-signature": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" + } + }, + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "import-local": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-1.0.0.tgz", + "integrity": "sha512-vAaZHieK9qjGo58agRBg+bhHX3hoTZU/Oa3GESWLz7t1U62fk63aHuDJJEteXoDeTCcPmUT+z38gkHPZkkmpmQ==", + "dev": true, + "requires": { + "pkg-dir": "^2.0.0", + "resolve-cwd": "^2.0.0" + } + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "dev": true + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + }, + "invariant": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", + "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", + "requires": { + "loose-envify": "^1.0.0" + } + }, + "invert-kv": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", + "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=", + "dev": true + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + } + }, + "is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", + "dev": true + }, + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "dev": true + }, + "is-callable": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.4.tgz", + "integrity": "sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA==", + "dev": true + }, + "is-ci": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-1.2.1.tgz", + "integrity": "sha512-s6tfsaQaQi3JNciBH6shVqEDvhGut0SUXr31ag8Pd8BBbVVlcGfWhpPmEOoM6RJ5TFhbypvf5yyRw/VXW1IiWg==", + "dev": true, + "requires": { + "ci-info": "^1.5.0" + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + } + }, + "is-date-object": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.1.tgz", + "integrity": "sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY=", + "dev": true + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "dependencies": { + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } + } + }, + "is-dotfile": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-dotfile/-/is-dotfile-1.0.3.tgz", + "integrity": "sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE=", + "dev": true + }, + "is-equal-shallow": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz", + "integrity": "sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ=", + "dev": true, + "requires": { + "is-primitive": "^2.0.0" + } + }, + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "dev": true + }, + "is-extglob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", + "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", + "dev": true + }, + "is-finite": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz", + "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=", + "dev": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, + "is-generator-fn": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-1.0.0.tgz", + "integrity": "sha1-lp1J4bszKfa7fwkIm+JleLLd1Go=", + "dev": true + }, + "is-glob": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", + "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", + "dev": true, + "requires": { + "is-extglob": "^1.0.0" + } + }, + "is-number": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz", + "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + } + }, + "is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "requires": { + "isobject": "^3.0.1" + }, + "dependencies": { + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + } + } + }, + "is-posix-bracket": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz", + "integrity": "sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q=", + "dev": true + }, + "is-primitive": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-primitive/-/is-primitive-2.0.0.tgz", + "integrity": "sha1-IHurkWOEmcB7Kt8kCkGochADRXU=", + "dev": true + }, + "is-regex": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz", + "integrity": "sha1-VRdIm1RwkbCTDglWVM7SXul+lJE=", + "dev": true, + "requires": { + "has": "^1.0.1" + } + }, + "is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", + "dev": true + }, + "is-symbol": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.2.tgz", + "integrity": "sha512-HS8bZ9ox60yCJLH9snBpIwv9pYUAkcuLhSA1oero1UB5y9aiQpRA8y2ex945AOtCZL1lJDeIk3G5LthswI46Lw==", + "dev": true, + "requires": { + "has-symbols": "^1.0.0" + } + }, + "is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", + "dev": true + }, + "is-utf8": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", + "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=", + "dev": true + }, + "is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", + "dev": true + }, + "is-wsl": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", + "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=", + "dev": true + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true + }, + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "dev": true, + "requires": { + "isarray": "1.0.0" + } + }, + "isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", + "dev": true + }, + "istanbul-api": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/istanbul-api/-/istanbul-api-1.3.7.tgz", + "integrity": "sha512-4/ApBnMVeEPG3EkSzcw25wDe4N66wxwn+KKn6b47vyek8Xb3NBAcg4xfuQbS7BqcZuTX4wxfD5lVagdggR3gyA==", + "dev": true, + "requires": { + "async": "^2.1.4", + "fileset": "^2.0.2", + "istanbul-lib-coverage": "^1.2.1", + "istanbul-lib-hook": "^1.2.2", + "istanbul-lib-instrument": "^1.10.2", + "istanbul-lib-report": "^1.1.5", + "istanbul-lib-source-maps": "^1.2.6", + "istanbul-reports": "^1.5.1", + "js-yaml": "^3.7.0", + "mkdirp": "^0.5.1", + "once": "^1.4.0" + } + }, + "istanbul-lib-coverage": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-1.2.1.tgz", + "integrity": "sha512-PzITeunAgyGbtY1ibVIUiV679EFChHjoMNRibEIobvmrCRaIgwLxNucOSimtNWUhEib/oO7QY2imD75JVgCJWQ==", + "dev": true + }, + "istanbul-lib-hook": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-1.2.2.tgz", + "integrity": "sha512-/Jmq7Y1VeHnZEQ3TL10VHyb564mn6VrQXHchON9Jf/AEcmQ3ZIiyD1BVzNOKTZf/G3gE+kiGK6SmpF9y3qGPLw==", + "dev": true, + "requires": { + "append-transform": "^0.4.0" + } + }, + "istanbul-lib-instrument": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-1.10.2.tgz", + "integrity": "sha512-aWHxfxDqvh/ZlxR8BBaEPVSWDPUkGD63VjGQn3jcw8jCp7sHEMKcrj4xfJn/ABzdMEHiQNyvDQhqm5o8+SQg7A==", + "dev": true, + "requires": { + "babel-generator": "^6.18.0", + "babel-template": "^6.16.0", + "babel-traverse": "^6.18.0", + "babel-types": "^6.18.0", + "babylon": "^6.18.0", + "istanbul-lib-coverage": "^1.2.1", + "semver": "^5.3.0" + } + }, + "istanbul-lib-report": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-1.1.5.tgz", + "integrity": "sha512-UsYfRMoi6QO/doUshYNqcKJqVmFe9w51GZz8BS3WB0lYxAllQYklka2wP9+dGZeHYaWIdcXUx8JGdbqaoXRXzw==", + "dev": true, + "requires": { + "istanbul-lib-coverage": "^1.2.1", + "mkdirp": "^0.5.1", + "path-parse": "^1.0.5", + "supports-color": "^3.1.2" + }, + "dependencies": { + "has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "dev": true + }, + "supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "dev": true, + "requires": { + "has-flag": "^1.0.0" + } + } + } + }, + "istanbul-lib-source-maps": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-1.2.6.tgz", + "integrity": "sha512-TtbsY5GIHgbMsMiRw35YBHGpZ1DVFEO19vxxeiDMYaeOFOCzfnYVxvl6pOUIZR4dtPhAGpSMup8OyF8ubsaqEg==", + "dev": true, + "requires": { + "debug": "^3.1.0", + "istanbul-lib-coverage": "^1.2.1", + "mkdirp": "^0.5.1", + "rimraf": "^2.6.1", + "source-map": "^0.5.3" + }, + "dependencies": { + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", + "dev": true + } + } + }, + "istanbul-reports": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-1.5.1.tgz", + "integrity": "sha512-+cfoZ0UXzWjhAdzosCPP3AN8vvef8XDkWtTfgaN+7L3YTpNYITnCaEkceo5SEYy644VkHka/P1FvkWvrG/rrJw==", + "dev": true, + "requires": { + "handlebars": "^4.0.3" + } + }, + "jest": { + "version": "23.6.0", + "resolved": "https://registry.npmjs.org/jest/-/jest-23.6.0.tgz", + "integrity": "sha512-lWzcd+HSiqeuxyhG+EnZds6iO3Y3ZEnMrfZq/OTGvF/C+Z4fPMCdhWTGSAiO2Oym9rbEXfwddHhh6jqrTF3+Lw==", + "dev": true, + "requires": { + "import-local": "^1.0.0", + "jest-cli": "^23.6.0" + }, + "dependencies": { + "jest-cli": { + "version": "23.6.0", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-23.6.0.tgz", + "integrity": "sha512-hgeD1zRUp1E1zsiyOXjEn4LzRLWdJBV//ukAHGlx6s5mfCNJTbhbHjgxnDUXA8fsKWN/HqFFF6X5XcCwC/IvYQ==", + "dev": true, + "requires": { + "ansi-escapes": "^3.0.0", + "chalk": "^2.0.1", + "exit": "^0.1.2", + "glob": "^7.1.2", + "graceful-fs": "^4.1.11", + "import-local": "^1.0.0", + "is-ci": "^1.0.10", + "istanbul-api": "^1.3.1", + "istanbul-lib-coverage": "^1.2.0", + "istanbul-lib-instrument": "^1.10.1", + "istanbul-lib-source-maps": "^1.2.4", + "jest-changed-files": "^23.4.2", + "jest-config": "^23.6.0", + "jest-environment-jsdom": "^23.4.0", + "jest-get-type": "^22.1.0", + "jest-haste-map": "^23.6.0", + "jest-message-util": "^23.4.0", + "jest-regex-util": "^23.3.0", + "jest-resolve-dependencies": "^23.6.0", + "jest-runner": "^23.6.0", + "jest-runtime": "^23.6.0", + "jest-snapshot": "^23.6.0", + "jest-util": "^23.4.0", + "jest-validate": "^23.6.0", + "jest-watcher": "^23.4.0", + "jest-worker": "^23.2.0", + "micromatch": "^2.3.11", + "node-notifier": "^5.2.1", + "prompts": "^0.1.9", + "realpath-native": "^1.0.0", + "rimraf": "^2.5.4", + "slash": "^1.0.0", + "string-length": "^2.0.0", + "strip-ansi": "^4.0.0", + "which": "^1.2.12", + "yargs": "^11.0.0" + } + } + } + }, + "jest-changed-files": { + "version": "23.4.2", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-23.4.2.tgz", + "integrity": "sha512-EyNhTAUWEfwnK0Is/09LxoqNDOn7mU7S3EHskG52djOFS/z+IT0jT3h3Ql61+dklcG7bJJitIWEMB4Sp1piHmA==", + "dev": true, + "requires": { + "throat": "^4.0.0" + } + }, + "jest-config": { + "version": "23.6.0", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-23.6.0.tgz", + "integrity": "sha512-i8V7z9BeDXab1+VNo78WM0AtWpBRXJLnkT+lyT+Slx/cbP5sZJ0+NDuLcmBE5hXAoK0aUp7vI+MOxR+R4d8SRQ==", + "dev": true, + "requires": { + "babel-core": "^6.0.0", + "babel-jest": "^23.6.0", + "chalk": "^2.0.1", + "glob": "^7.1.1", + "jest-environment-jsdom": "^23.4.0", + "jest-environment-node": "^23.4.0", + "jest-get-type": "^22.1.0", + "jest-jasmine2": "^23.6.0", + "jest-regex-util": "^23.3.0", + "jest-resolve": "^23.6.0", + "jest-util": "^23.4.0", + "jest-validate": "^23.6.0", + "micromatch": "^2.3.11", + "pretty-format": "^23.6.0" + } + }, + "jest-diff": { + "version": "23.6.0", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-23.6.0.tgz", + "integrity": "sha512-Gz9l5Ov+X3aL5L37IT+8hoCUsof1CVYBb2QEkOupK64XyRR3h+uRpYIm97K7sY8diFxowR8pIGEdyfMKTixo3g==", + "dev": true, + "requires": { + "chalk": "^2.0.1", + "diff": "^3.2.0", + "jest-get-type": "^22.1.0", + "pretty-format": "^23.6.0" + } + }, + "jest-docblock": { + "version": "23.2.0", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-23.2.0.tgz", + "integrity": "sha1-8IXh8YVI2Z/dabICB+b9VdkTg6c=", + "dev": true, + "requires": { + "detect-newline": "^2.1.0" + } + }, + "jest-each": { + "version": "23.6.0", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-23.6.0.tgz", + "integrity": "sha512-x7V6M/WGJo6/kLoissORuvLIeAoyo2YqLOoCDkohgJ4XOXSqOtyvr8FbInlAWS77ojBsZrafbozWoKVRdtxFCg==", + "dev": true, + "requires": { + "chalk": "^2.0.1", + "pretty-format": "^23.6.0" + } + }, + "jest-environment-jsdom": { + "version": "23.4.0", + "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-23.4.0.tgz", + "integrity": "sha1-BWp5UrP+pROsYqFAosNox52eYCM=", + "dev": true, + "requires": { + "jest-mock": "^23.2.0", + "jest-util": "^23.4.0", + "jsdom": "^11.5.1" + } + }, + "jest-environment-node": { + "version": "23.4.0", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-23.4.0.tgz", + "integrity": "sha1-V+gO0IQd6jAxZ8zozXlSHeuv3hA=", + "dev": true, + "requires": { + "jest-mock": "^23.2.0", + "jest-util": "^23.4.0" + } + }, + "jest-get-type": { + "version": "22.4.3", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-22.4.3.tgz", + "integrity": "sha512-/jsz0Y+V29w1chdXVygEKSz2nBoHoYqNShPe+QgxSNjAuP1i8+k4LbQNrfoliKej0P45sivkSCh7yiD6ubHS3w==", + "dev": true + }, + "jest-haste-map": { + "version": "23.6.0", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-23.6.0.tgz", + "integrity": "sha512-uyNhMyl6dr6HaXGHp8VF7cK6KpC6G9z9LiMNsst+rJIZ8l7wY0tk8qwjPmEghczojZ2/ZhtEdIabZ0OQRJSGGg==", + "dev": true, + "requires": { + "fb-watchman": "^2.0.0", + "graceful-fs": "^4.1.11", + "invariant": "^2.2.4", + "jest-docblock": "^23.2.0", + "jest-serializer": "^23.0.1", + "jest-worker": "^23.2.0", + "micromatch": "^2.3.11", + "sane": "^2.0.0" + } + }, + "jest-jasmine2": { + "version": "23.6.0", + "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-23.6.0.tgz", + "integrity": "sha512-pe2Ytgs1nyCs8IvsEJRiRTPC0eVYd8L/dXJGU08GFuBwZ4sYH/lmFDdOL3ZmvJR8QKqV9MFuwlsAi/EWkFUbsQ==", + "dev": true, + "requires": { + "babel-traverse": "^6.0.0", + "chalk": "^2.0.1", + "co": "^4.6.0", + "expect": "^23.6.0", + "is-generator-fn": "^1.0.0", + "jest-diff": "^23.6.0", + "jest-each": "^23.6.0", + "jest-matcher-utils": "^23.6.0", + "jest-message-util": "^23.4.0", + "jest-snapshot": "^23.6.0", + "jest-util": "^23.4.0", + "pretty-format": "^23.6.0" + } + }, + "jest-leak-detector": { + "version": "23.6.0", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-23.6.0.tgz", + "integrity": "sha512-f/8zA04rsl1Nzj10HIyEsXvYlMpMPcy0QkQilVZDFOaPbv2ur71X5u2+C4ZQJGyV/xvVXtCCZ3wQ99IgQxftCg==", + "dev": true, + "requires": { + "pretty-format": "^23.6.0" + } + }, + "jest-matcher-utils": { + "version": "23.6.0", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-23.6.0.tgz", + "integrity": "sha512-rosyCHQfBcol4NsckTn01cdelzWLU9Cq7aaigDf8VwwpIRvWE/9zLgX2bON+FkEW69/0UuYslUe22SOdEf2nog==", + "dev": true, + "requires": { + "chalk": "^2.0.1", + "jest-get-type": "^22.1.0", + "pretty-format": "^23.6.0" + } + }, + "jest-message-util": { + "version": "23.4.0", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-23.4.0.tgz", + "integrity": "sha1-F2EMUJQjSVCNAaPR4L2iwHkIap8=", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0-beta.35", + "chalk": "^2.0.1", + "micromatch": "^2.3.11", + "slash": "^1.0.0", + "stack-utils": "^1.0.1" + } + }, + "jest-mock": { + "version": "23.2.0", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-23.2.0.tgz", + "integrity": "sha1-rRxg8p6HGdR8JuETgJi20YsmETQ=", + "dev": true + }, + "jest-regex-util": { + "version": "23.3.0", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-23.3.0.tgz", + "integrity": "sha1-X4ZylUfCeFxAAs6qj4Sf6MpHG8U=", + "dev": true + }, + "jest-resolve": { + "version": "23.6.0", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-23.6.0.tgz", + "integrity": "sha512-XyoRxNtO7YGpQDmtQCmZjum1MljDqUCob7XlZ6jy9gsMugHdN2hY4+Acz9Qvjz2mSsOnPSH7skBmDYCHXVZqkA==", + "dev": true, + "requires": { + "browser-resolve": "^1.11.3", + "chalk": "^2.0.1", + "realpath-native": "^1.0.0" + } + }, + "jest-resolve-dependencies": { + "version": "23.6.0", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-23.6.0.tgz", + "integrity": "sha512-EkQWkFWjGKwRtRyIwRwI6rtPAEyPWlUC2MpzHissYnzJeHcyCn1Hc8j7Nn1xUVrS5C6W5+ZL37XTem4D4pLZdA==", + "dev": true, + "requires": { + "jest-regex-util": "^23.3.0", + "jest-snapshot": "^23.6.0" + } + }, + "jest-runner": { + "version": "23.6.0", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-23.6.0.tgz", + "integrity": "sha512-kw0+uj710dzSJKU6ygri851CObtCD9cN8aNkg8jWJf4ewFyEa6kwmiH/r/M1Ec5IL/6VFa0wnAk6w+gzUtjJzA==", + "dev": true, + "requires": { + "exit": "^0.1.2", + "graceful-fs": "^4.1.11", + "jest-config": "^23.6.0", + "jest-docblock": "^23.2.0", + "jest-haste-map": "^23.6.0", + "jest-jasmine2": "^23.6.0", + "jest-leak-detector": "^23.6.0", + "jest-message-util": "^23.4.0", + "jest-runtime": "^23.6.0", + "jest-util": "^23.4.0", + "jest-worker": "^23.2.0", + "source-map-support": "^0.5.6", + "throat": "^4.0.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "source-map-support": { + "version": "0.5.10", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.10.tgz", + "integrity": "sha512-YfQ3tQFTK/yzlGJuX8pTwa4tifQj4QS2Mj7UegOu8jAz59MqIiMGPXxQhVQiIMNzayuUSF/jEuVnfFF5JqybmQ==", + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + } + } + }, + "jest-runtime": { + "version": "23.6.0", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-23.6.0.tgz", + "integrity": "sha512-ycnLTNPT2Gv+TRhnAYAQ0B3SryEXhhRj1kA6hBPSeZaNQkJ7GbZsxOLUkwg6YmvWGdX3BB3PYKFLDQCAE1zNOw==", + "dev": true, + "requires": { + "babel-core": "^6.0.0", + "babel-plugin-istanbul": "^4.1.6", + "chalk": "^2.0.1", + "convert-source-map": "^1.4.0", + "exit": "^0.1.2", + "fast-json-stable-stringify": "^2.0.0", + "graceful-fs": "^4.1.11", + "jest-config": "^23.6.0", + "jest-haste-map": "^23.6.0", + "jest-message-util": "^23.4.0", + "jest-regex-util": "^23.3.0", + "jest-resolve": "^23.6.0", + "jest-snapshot": "^23.6.0", + "jest-util": "^23.4.0", + "jest-validate": "^23.6.0", + "micromatch": "^2.3.11", + "realpath-native": "^1.0.0", + "slash": "^1.0.0", + "strip-bom": "3.0.0", + "write-file-atomic": "^2.1.0", + "yargs": "^11.0.0" + }, + "dependencies": { + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "dev": true + } + } + }, + "jest-serializer": { + "version": "23.0.1", + "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-23.0.1.tgz", + "integrity": "sha1-o3dq6zEekP6D+rnlM+hRAr0WQWU=", + "dev": true + }, + "jest-snapshot": { + "version": "23.6.0", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-23.6.0.tgz", + "integrity": "sha512-tM7/Bprftun6Cvj2Awh/ikS7zV3pVwjRYU2qNYS51VZHgaAMBs5l4o/69AiDHhQrj5+LA2Lq4VIvK7zYk/bswg==", + "dev": true, + "requires": { + "babel-types": "^6.0.0", + "chalk": "^2.0.1", + "jest-diff": "^23.6.0", + "jest-matcher-utils": "^23.6.0", + "jest-message-util": "^23.4.0", + "jest-resolve": "^23.6.0", + "mkdirp": "^0.5.1", + "natural-compare": "^1.4.0", + "pretty-format": "^23.6.0", + "semver": "^5.5.0" + } + }, + "jest-util": { + "version": "23.4.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-23.4.0.tgz", + "integrity": "sha1-TQY8uSe68KI4Mf9hvsLLv0l5NWE=", + "dev": true, + "requires": { + "callsites": "^2.0.0", + "chalk": "^2.0.1", + "graceful-fs": "^4.1.11", + "is-ci": "^1.0.10", + "jest-message-util": "^23.4.0", + "mkdirp": "^0.5.1", + "slash": "^1.0.0", + "source-map": "^0.6.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "jest-validate": { + "version": "23.6.0", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-23.6.0.tgz", + "integrity": "sha512-OFKapYxe72yz7agrDAWi8v2WL8GIfVqcbKRCLbRG9PAxtzF9b1SEDdTpytNDN12z2fJynoBwpMpvj2R39plI2A==", + "dev": true, + "requires": { + "chalk": "^2.0.1", + "jest-get-type": "^22.1.0", + "leven": "^2.1.0", + "pretty-format": "^23.6.0" + } + }, + "jest-watcher": { + "version": "23.4.0", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-23.4.0.tgz", + "integrity": "sha1-0uKM50+NrWxq/JIrksq+9u0FyRw=", + "dev": true, + "requires": { + "ansi-escapes": "^3.0.0", + "chalk": "^2.0.1", + "string-length": "^2.0.0" + } + }, + "jest-worker": { + "version": "23.2.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-23.2.0.tgz", + "integrity": "sha1-+vcGqNo2+uYOsmlXJX+ntdjqArk=", + "dev": true, + "requires": { + "merge-stream": "^1.0.1" + } + }, + "js-slang": { + "version": "0.1.14", + "resolved": "https://registry.npmjs.org/js-slang/-/js-slang-0.1.14.tgz", + "integrity": "sha512-j2zLfhRrDN0uSJrR9N1nFMQ4nOqiFrSLOa+hqbuPbcUsMlSV9hDYy9tZ/ZyW1oB2gpRyzCFvJRvkEkde7ooBlQ==", + "requires": { + "@types/acorn": "^4.0.3", + "@types/estree": "0.0.39", + "acorn": "^5.7.1", + "astring": "^1.2.0", + "commander": "^2.14.1", + "common-tags": "^1.4.0", + "invariant": "^2.2.2" + } + }, + "js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + }, + "js-yaml": { + "version": "3.12.2", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.12.2.tgz", + "integrity": "sha512-QHn/Lh/7HhZ/Twc7vJYQTkjuCa0kaCcDcjK5Zlk2rvnUpy7DxMJ23+Jc2dcyvltwQVg1nygAVlB2oRDFHoRS5Q==", + "dev": true, + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + }, + "jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", + "dev": true + }, + "jsdom": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-11.12.0.tgz", + "integrity": "sha512-y8Px43oyiBM13Zc1z780FrfNLJCXTL40EWlty/LXUtcjykRBNgLlCjWXpfSPBl2iv+N7koQN+dvqszHZgT/Fjw==", + "dev": true, + "requires": { + "abab": "^2.0.0", + "acorn": "^5.5.3", + "acorn-globals": "^4.1.0", + "array-equal": "^1.0.0", + "cssom": ">= 0.3.2 < 0.4.0", + "cssstyle": "^1.0.0", + "data-urls": "^1.0.0", + "domexception": "^1.0.1", + "escodegen": "^1.9.1", + "html-encoding-sniffer": "^1.0.2", + "left-pad": "^1.3.0", + "nwsapi": "^2.0.7", + "parse5": "4.0.0", + "pn": "^1.1.0", + "request": "^2.87.0", + "request-promise-native": "^1.0.5", + "sax": "^1.2.4", + "symbol-tree": "^3.2.2", + "tough-cookie": "^2.3.4", + "w3c-hr-time": "^1.0.1", + "webidl-conversions": "^4.0.2", + "whatwg-encoding": "^1.0.3", + "whatwg-mimetype": "^2.1.0", + "whatwg-url": "^6.4.1", + "ws": "^5.2.0", + "xml-name-validator": "^3.0.0" + } + }, + "jsesc": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz", + "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s=", + "dev": true + }, + "json-schema": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", + "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", + "dev": true + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", + "dev": true + }, + "json5": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", + "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=", + "dev": true + }, + "jsprim": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", + "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", + "dev": true, + "requires": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.2.3", + "verror": "1.10.0" + } + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + }, + "kleur": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-2.0.2.tgz", + "integrity": "sha512-77XF9iTllATmG9lSlIv0qdQ2BQ/h9t0bJllHlbvsQ0zUWfU7Yi0S8L5JXzPZgkefIiajLmBJJ4BsMJmqcf7oxQ==", + "dev": true + }, + "lcid": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", + "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", + "dev": true, + "requires": { + "invert-kv": "^1.0.0" + } + }, + "lcov-parse": { + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/lcov-parse/-/lcov-parse-0.0.10.tgz", + "integrity": "sha1-GwuP+ayceIklBYK3C3ExXZ2m2aM=", + "dev": true + }, + "left-pad": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/left-pad/-/left-pad-1.3.0.tgz", + "integrity": "sha512-XI5MPzVNApjAyhQzphX8BkmKsKUxD4LdyK24iZeQGinBN9yTQT3bFlCBy/aVx2HrNcqQGsdot8ghrjyrvMCoEA==", + "dev": true + }, + "leven": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-2.1.0.tgz", + "integrity": "sha1-wuep93IJTe6dNCAq6KzORoeHVYA=", + "dev": true + }, + "levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", + "dev": true, + "requires": { + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" + } + }, + "load-json-file": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", + "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0", + "strip-bom": "^2.0.0" + } + }, + "locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "dev": true, + "requires": { + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" + } + }, + "lodash": { + "version": "4.17.11", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", + "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==", + "dev": true + }, + "lodash.sortby": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", + "integrity": "sha1-7dFMgk4sycHgsKG0K7UhBRakJDg=", + "dev": true + }, + "log-driver": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/log-driver/-/log-driver-1.2.7.tgz", + "integrity": "sha512-U7KCmLdqsGHBLeWqYlFA0V0Sl6P08EE1ZrmA9cxjUE0WVqT9qnyVDPz1kzpFEP0jdJuFnasWIfSd7fsaNXkpbg==", + "dev": true + }, + "loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "requires": { + "js-tokens": "^3.0.0 || ^4.0.0" + } + }, + "lru-cache": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", + "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", + "dev": true, + "requires": { + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" + } + }, + "make-error": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.5.tgz", + "integrity": "sha512-c3sIjNUow0+8swNwVpqoH4YCShKNFkMaw6oH1mNS2haDZQqkeZFlHS3dhoeEbKKmJB4vXpJucU6oH75aDYeE9g==", + "dev": true + }, + "makeerror": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.11.tgz", + "integrity": "sha1-4BpckQnyr3lmDk6LlYd5AYT1qWw=", + "dev": true, + "requires": { + "tmpl": "1.0.x" + } + }, + "map-cache": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", + "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", + "dev": true + }, + "map-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", + "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", + "dev": true, + "requires": { + "object-visit": "^1.0.0" + } + }, + "math-random": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/math-random/-/math-random-1.0.4.tgz", + "integrity": "sha512-rUxjysqif/BZQH2yhd5Aaq7vXMSx9NdEsQcyA07uEzIvxgI7zIr33gGsh+RU0/XjmQpCW7RsVof1vlkvQVCK5A==", + "dev": true + }, + "mem": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/mem/-/mem-1.1.0.tgz", + "integrity": "sha1-Xt1StIXKHZAP5kiVUFOZoN+kX3Y=", + "dev": true, + "requires": { + "mimic-fn": "^1.0.0" + } + }, + "merge": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/merge/-/merge-1.2.1.tgz", + "integrity": "sha512-VjFo4P5Whtj4vsLzsYBu5ayHhoHJ0UqNm7ibvShmbmoz7tGi0vXaoJbGdB+GmDMLUdg8DpQXEIeVDAe8MaABvQ==", + "dev": true + }, + "merge-stream": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-1.0.1.tgz", + "integrity": "sha1-QEEgLVCKNCugAXQAjfDCUbjBNeE=", + "dev": true, + "requires": { + "readable-stream": "^2.0.1" + } + }, + "micromatch": { + "version": "2.3.11", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", + "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", + "dev": true, + "requires": { + "arr-diff": "^2.0.0", + "array-unique": "^0.2.1", + "braces": "^1.8.2", + "expand-brackets": "^0.1.4", + "extglob": "^0.3.1", + "filename-regex": "^2.0.0", + "is-extglob": "^1.0.0", + "is-glob": "^2.0.1", + "kind-of": "^3.0.2", + "normalize-path": "^2.0.1", + "object.omit": "^2.0.0", + "parse-glob": "^3.0.4", + "regex-cache": "^0.4.2" + } + }, + "mime-db": { + "version": "1.38.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.38.0.tgz", + "integrity": "sha512-bqVioMFFzc2awcdJZIzR3HjZFX20QhilVS7hytkKrv7xFAn8bM1gzc/FOX2awLISvWe0PV8ptFKcon+wZ5qYkg==", + "dev": true + }, + "mime-types": { + "version": "2.1.22", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.22.tgz", + "integrity": "sha512-aGl6TZGnhm/li6F7yx82bJiBZwgiEa4Hf6CNr8YO+r5UHr53tSTYZb102zyU50DOWWKeOv0uQLRL0/9EiKWCog==", + "dev": true, + "requires": { + "mime-db": "~1.38.0" + } + }, + "mimic-fn": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", + "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", + "dev": true + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + }, + "mixin-deep": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.1.tgz", + "integrity": "sha512-8ZItLHeEgaqEvd5lYBXfm4EZSFCX29Jb9K+lAHhDKzReKBQKj3R+7NOF6tjqYi9t4oI8VUfaWITJQm86wnXGNQ==", + "dev": true, + "requires": { + "for-in": "^1.0.2", + "is-extendable": "^1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "mkdirp": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "dev": true, + "requires": { + "minimist": "0.0.8" + }, + "dependencies": { + "minimist": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", + "dev": true + } + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "nan": { + "version": "2.12.1", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.12.1.tgz", + "integrity": "sha512-JY7V6lRkStKcKTvHO5NVSQRv+RV+FIL5pvDoLiAtSL9pKlC5x9PKQcZDsq7m4FO4d57mkhC6Z+QhAh3Jdk5JFw==", + "dev": true, + "optional": true + }, + "nanomatch": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", + "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", + "dev": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "fragment-cache": "^0.2.1", + "is-windows": "^1.0.2", + "kind-of": "^6.0.2", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", + "dev": true + }, + "array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", + "dev": true + }, + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true + } + } + }, + "natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", + "dev": true + }, + "node-int64": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", + "integrity": "sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs=", + "dev": true + }, + "node-notifier": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/node-notifier/-/node-notifier-5.4.0.tgz", + "integrity": "sha512-SUDEb+o71XR5lXSTyivXd9J7fCloE3SyP4lSgt3lU2oSANiox+SxlNRGPjDKrwU1YN3ix2KN/VGGCg0t01rttQ==", + "dev": true, + "requires": { + "growly": "^1.3.0", + "is-wsl": "^1.1.0", + "semver": "^5.5.0", + "shellwords": "^0.1.1", + "which": "^1.3.0" + } + }, + "normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "dev": true, + "requires": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "dev": true, + "requires": { + "remove-trailing-separator": "^1.0.1" + } + }, + "npm-run-path": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", + "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", + "dev": true, + "requires": { + "path-key": "^2.0.0" + } + }, + "number-is-nan": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", + "dev": true + }, + "nwsapi": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.1.1.tgz", + "integrity": "sha512-T5GaA1J/d34AC8mkrFD2O0DR17kwJ702ZOtJOsS8RpbsQZVOC2/xYFb1i/cw+xdM54JIlMuojjDOYct8GIWtwg==", + "dev": true + }, + "oauth-sign": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", + "dev": true + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "dev": true + }, + "object-copy": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", + "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", + "dev": true, + "requires": { + "copy-descriptor": "^0.1.0", + "define-property": "^0.2.5", + "kind-of": "^3.0.3" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + } + } + }, + "object-keys": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.0.tgz", + "integrity": "sha512-6OO5X1+2tYkNyNEx6TsCxEqFfRWaqx6EtMiSbGrw8Ob8v9Ne+Hl8rBAgLBZn5wjEz3s/s6U1WXFUFOcxxAwUpg==", + "dev": true + }, + "object-visit": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", + "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", + "dev": true, + "requires": { + "isobject": "^3.0.0" + }, + "dependencies": { + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + } + } + }, + "object.getownpropertydescriptors": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.0.3.tgz", + "integrity": "sha1-h1jIRvW0B62rDyNuCYbxSwUcqhY=", + "dev": true, + "requires": { + "define-properties": "^1.1.2", + "es-abstract": "^1.5.1" + } + }, + "object.omit": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz", + "integrity": "sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=", + "dev": true, + "requires": { + "for-own": "^0.1.4", + "is-extendable": "^0.1.1" + } + }, + "object.pick": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", + "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", + "dev": true, + "requires": { + "isobject": "^3.0.1" + }, + "dependencies": { + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + } + } + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, + "requires": { + "wrappy": "1" + } + }, + "optimist": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", + "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=", + "dev": true, + "requires": { + "minimist": "~0.0.1", + "wordwrap": "~0.0.2" + }, + "dependencies": { + "minimist": { + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz", + "integrity": "sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8=", + "dev": true + } + } + }, + "optionator": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz", + "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=", + "dev": true, + "requires": { + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.4", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "wordwrap": "~1.0.0" + }, + "dependencies": { + "wordwrap": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", + "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", + "dev": true + } + } + }, + "os-homedir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", + "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", + "dev": true + }, + "os-locale": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-2.1.0.tgz", + "integrity": "sha512-3sslG3zJbEYcaC4YVAvDorjGxc7tv6KVATnLPZONiljsUncvihe9BQoVCEs0RZ1kmf4Hk9OBqlZfJZWI4GanKA==", + "dev": true, + "requires": { + "execa": "^0.7.0", + "lcid": "^1.0.0", + "mem": "^1.1.0" + } + }, + "os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", + "dev": true + }, + "p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", + "dev": true + }, + "p-limit": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "dev": true, + "requires": { + "p-try": "^1.0.0" + } + }, + "p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "dev": true, + "requires": { + "p-limit": "^1.1.0" + } + }, + "p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", + "dev": true + }, + "parse-glob": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz", + "integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=", + "dev": true, + "requires": { + "glob-base": "^0.3.0", + "is-dotfile": "^1.0.0", + "is-extglob": "^1.0.0", + "is-glob": "^2.0.0" + } + }, + "parse-json": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", + "dev": true, + "requires": { + "error-ex": "^1.2.0" + } + }, + "parse5": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-4.0.0.tgz", + "integrity": "sha512-VrZ7eOd3T1Fk4XWNXMgiGBK/z0MG48BWG2uQNU4I72fkQuKUTZpl+u9k+CxEG0twMVzSmXEEz12z5Fnw1jIQFA==", + "dev": true + }, + "pascalcase": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", + "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", + "dev": true + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "dev": true + }, + "path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", + "dev": true + }, + "path-parse": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", + "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", + "dev": true + }, + "path-type": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", + "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + }, + "performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", + "dev": true + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + }, + "pinkie": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", + "dev": true + }, + "pinkie-promise": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", + "dev": true, + "requires": { + "pinkie": "^2.0.0" + } + }, + "pkg-dir": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz", + "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=", + "dev": true, + "requires": { + "find-up": "^2.1.0" + } + }, + "pn": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/pn/-/pn-1.1.0.tgz", + "integrity": "sha512-2qHaIQr2VLRFoxe2nASzsV6ef4yOOH+Fi9FBOVH6cqeSgUnoyySPZkxzLuzd+RYOQTRpROA0ztTMqxROKSb/nA==", + "dev": true + }, + "posix-character-classes": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", + "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", + "dev": true + }, + "prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", + "dev": true + }, + "preserve": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz", + "integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=", + "dev": true + }, + "pretty-format": { + "version": "23.6.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-23.6.0.tgz", + "integrity": "sha512-zf9NV1NSlDLDjycnwm6hpFATCGl/K1lt0R/GdkAK2O5LN/rwJoB+Mh93gGJjut4YbmecbfgLWVGSTCr0Ewvvbw==", + "dev": true, + "requires": { + "ansi-regex": "^3.0.0", + "ansi-styles": "^3.2.0" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + } + } + }, + "private": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/private/-/private-0.1.8.tgz", + "integrity": "sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==", + "dev": true + }, + "process-nextick-args": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", + "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==", + "dev": true + }, + "prompts": { + "version": "0.1.14", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-0.1.14.tgz", + "integrity": "sha512-rxkyiE9YH6zAz/rZpywySLKkpaj0NMVyNw1qhsubdbjjSgcayjTShDreZGlFMcGSu5sab3bAKPfFk78PB90+8w==", + "dev": true, + "requires": { + "kleur": "^2.0.1", + "sisteransi": "^0.1.1" + } + }, + "pseudomap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", + "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", + "dev": true + }, + "psl": { + "version": "1.1.31", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.1.31.tgz", + "integrity": "sha512-/6pt4+C+T+wZUieKR620OpzN/LlnNKuWjy1iFLQ/UG35JqHlR/89MP1d96dUfkf6Dne3TuLQzOYEYshJ+Hx8mw==", + "dev": true + }, + "punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "dev": true + }, + "qs": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", + "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", + "dev": true + }, + "randomatic": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-3.1.1.tgz", + "integrity": "sha512-TuDE5KxZ0J461RVjrJZCJc+J+zCkTb1MbH9AQUq68sMhOMcy9jLcb3BrZKgp9q9Ncltdg4QVqWrH02W2EFFVYw==", + "dev": true, + "requires": { + "is-number": "^4.0.0", + "kind-of": "^6.0.0", + "math-random": "^1.0.1" + }, + "dependencies": { + "is-number": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz", + "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==", + "dev": true + }, + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true + } + } + }, + "read-pkg": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", + "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", + "dev": true, + "requires": { + "load-json-file": "^1.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^1.0.0" + } + }, + "read-pkg-up": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", + "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", + "dev": true, + "requires": { + "find-up": "^1.0.0", + "read-pkg": "^1.0.0" + }, + "dependencies": { + "find-up": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", + "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", + "dev": true, + "requires": { + "path-exists": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + }, + "path-exists": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", + "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", + "dev": true, + "requires": { + "pinkie-promise": "^2.0.0" + } + } + } + }, + "readable-stream": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "realpath-native": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/realpath-native/-/realpath-native-1.1.0.tgz", + "integrity": "sha512-wlgPA6cCIIg9gKz0fgAPjnzh4yR/LnXovwuo9hvyGvx3h8nX4+/iLZplfUWasXpqD8BdnGnP5njOFjkUwPzvjA==", + "dev": true, + "requires": { + "util.promisify": "^1.0.0" + } + }, + "regenerator-runtime": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", + "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==", + "dev": true + }, + "regex-cache": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.4.tgz", + "integrity": "sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ==", + "dev": true, + "requires": { + "is-equal-shallow": "^0.1.3" + } + }, + "regex-not": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", + "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", + "dev": true, + "requires": { + "extend-shallow": "^3.0.2", + "safe-regex": "^1.1.0" + } + }, + "remove-trailing-separator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", + "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", + "dev": true + }, + "repeat-element": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz", + "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==", + "dev": true + }, + "repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", + "dev": true + }, + "repeating": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", + "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", + "dev": true, + "requires": { + "is-finite": "^1.0.0" + } + }, + "request": { + "version": "2.88.0", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz", + "integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==", + "dev": true, + "requires": { + "aws-sign2": "~0.7.0", + "aws4": "^1.8.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", + "forever-agent": "~0.6.1", + "form-data": "~2.3.2", + "har-validator": "~5.1.0", + "http-signature": "~1.2.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.19", + "oauth-sign": "~0.9.0", + "performance-now": "^2.1.0", + "qs": "~6.5.2", + "safe-buffer": "^5.1.2", + "tough-cookie": "~2.4.3", + "tunnel-agent": "^0.6.0", + "uuid": "^3.3.2" + } + }, + "request-promise-core": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.2.tgz", + "integrity": "sha512-UHYyq1MO8GsefGEt7EprS8UrXsm1TxEvFUX1IMTuSLU2Rh7fTIdFtl8xD7JiEYiWU2dl+NYAjCTksTehQUxPag==", + "dev": true, + "requires": { + "lodash": "^4.17.11" + }, + "dependencies": { + "lodash": { + "version": "4.17.11", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", + "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==", + "dev": true + } + } + }, + "request-promise-native": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/request-promise-native/-/request-promise-native-1.0.7.tgz", + "integrity": "sha512-rIMnbBdgNViL37nZ1b3L/VfPOpSi0TqVDQPAvO6U14lMzOLrt5nilxCQqtDKhZeDiW0/hkCXGoQjhgJd/tCh6w==", + "dev": true, + "requires": { + "request-promise-core": "1.1.2", + "stealthy-require": "^1.1.1", + "tough-cookie": "^2.3.3" + } + }, + "require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", + "dev": true + }, + "require-main-filename": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", + "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=", + "dev": true + }, + "resolve": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.10.0.tgz", + "integrity": "sha512-3sUr9aq5OfSg2S9pNtPA9hL1FVEAjvfOC4leW0SNf/mpnaakz2a9femSd6LqAww2RaFctwyf1lCqnTHuF1rxDg==", + "dev": true, + "requires": { + "path-parse": "^1.0.6" + } + }, + "resolve-cwd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-2.0.0.tgz", + "integrity": "sha1-AKn3OHVW4nA46uIyyqNypqWbZlo=", + "dev": true, + "requires": { + "resolve-from": "^3.0.0" + } + }, + "resolve-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", + "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", + "dev": true + }, + "resolve-url": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", + "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", + "dev": true + }, + "ret": { + "version": "0.1.15", + "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", + "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", + "dev": true + }, + "rimraf": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", + "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + }, + "rsvp": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/rsvp/-/rsvp-3.6.2.tgz", + "integrity": "sha512-OfWGQTb9vnwRjwtA2QwpG2ICclHC3pgXZO5xt8H2EfgDquO0qVdSb5T88L4qJVAEugbS56pAuV4XZM58UX8ulw==", + "dev": true + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "safe-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", + "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", + "dev": true, + "requires": { + "ret": "~0.1.10" + } + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true + }, + "sane": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/sane/-/sane-2.5.2.tgz", + "integrity": "sha1-tNwYYcIbQn6SlQej51HiosuKs/o=", + "dev": true, + "requires": { + "anymatch": "^2.0.0", + "capture-exit": "^1.2.0", + "exec-sh": "^0.2.0", + "fb-watchman": "^2.0.0", + "fsevents": "^1.2.3", + "micromatch": "^3.1.4", + "minimist": "^1.1.1", + "walker": "~1.0.5", + "watch": "~0.18.0" + }, + "dependencies": { + "arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", + "dev": true + }, + "array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", + "dev": true + }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", + "dev": true, + "requires": { + "debug": "^2.3.3", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "posix-character-classes": "^0.1.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + } + }, + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } + } + }, + "extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "dev": true, + "requires": { + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "expand-brackets": "^2.1.4", + "extend-shallow": "^2.0.1", + "fragment-cache": "^0.2.1", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + }, + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + } + } + } + }, + "sax": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", + "dev": true + }, + "semver": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.6.0.tgz", + "integrity": "sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg==", + "dev": true + }, + "set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", + "dev": true + }, + "set-value": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.0.tgz", + "integrity": "sha512-hw0yxk9GT/Hr5yJEYnHNKYXkIA8mVJgd9ditYZCe16ZczcaELYYcfvaXesNACk2O8O0nTiPQcQhGUQj8JLzeeg==", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-extendable": "^0.1.1", + "is-plain-object": "^2.0.3", + "split-string": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "dev": true, + "requires": { + "shebang-regex": "^1.0.0" + } + }, + "shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", + "dev": true + }, + "shellwords": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/shellwords/-/shellwords-0.1.1.tgz", + "integrity": "sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww==", + "dev": true + }, + "signal-exit": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", + "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", + "dev": true + }, + "sisteransi": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-0.1.1.tgz", + "integrity": "sha512-PmGOd02bM9YO5ifxpw36nrNMBTptEtfRl4qUYl9SndkolplkrZZOW7PGHjrZL53QvMVj9nQ+TKqUnRsw4tJa4g==", + "dev": true + }, + "slash": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", + "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=", + "dev": true + }, + "snapdragon": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", + "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", + "dev": true, + "requires": { + "base": "^0.11.1", + "debug": "^2.2.0", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "map-cache": "^0.2.2", + "source-map": "^0.5.6", + "source-map-resolve": "^0.5.0", + "use": "^3.1.0" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "snapdragon-node": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", + "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", + "dev": true, + "requires": { + "define-property": "^1.0.0", + "isobject": "^3.0.0", + "snapdragon-util": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + }, + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true + } + } + }, + "snapdragon-util": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", + "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", + "dev": true, + "requires": { + "kind-of": "^3.2.0" + } + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + }, + "source-map-resolve": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.2.tgz", + "integrity": "sha512-MjqsvNwyz1s0k81Goz/9vRBe9SZdB09Bdw+/zYyO+3CuPk6fouTaxscHkgtE8jKvf01kVfl8riHzERQ/kefaSA==", + "dev": true, + "requires": { + "atob": "^2.1.1", + "decode-uri-component": "^0.2.0", + "resolve-url": "^0.2.1", + "source-map-url": "^0.4.0", + "urix": "^0.1.0" + } + }, + "source-map-support": { + "version": "0.4.18", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.18.tgz", + "integrity": "sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA==", + "dev": true, + "requires": { + "source-map": "^0.5.6" + } + }, + "source-map-url": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", + "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=", + "dev": true + }, + "spdx-correct": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.0.tgz", + "integrity": "sha512-lr2EZCctC2BNR7j7WzJ2FpDznxky1sjfxvvYEyzxNyb6lZXHODmEoJeFu4JupYlkfha1KZpJyoqiJ7pgA1qq8Q==", + "dev": true, + "requires": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-exceptions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz", + "integrity": "sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA==", + "dev": true + }, + "spdx-expression-parse": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz", + "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==", + "dev": true, + "requires": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-license-ids": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.3.tgz", + "integrity": "sha512-uBIcIl3Ih6Phe3XHK1NqboJLdGfwr1UN3k6wSD1dZpmPsIkb8AGNbZYJ1fOBk834+Gxy8rpfDxrS6XLEMZMY2g==", + "dev": true + }, + "split-string": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", + "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", + "dev": true, + "requires": { + "extend-shallow": "^3.0.0" + } + }, + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "dev": true + }, + "sshpk": { + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", + "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", + "dev": true, + "requires": { + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jsbn": "~0.1.0", + "safer-buffer": "^2.0.2", + "tweetnacl": "~0.14.0" + } + }, + "stack-utils": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-1.0.2.tgz", + "integrity": "sha512-MTX+MeG5U994cazkjd/9KNAapsHnibjMLnfXodlkXw76JEea0UiNzrqidzo1emMwk7w5Qhc9jd4Bn9TBb1MFwA==", + "dev": true + }, + "static-extend": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", + "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", + "dev": true, + "requires": { + "define-property": "^0.2.5", + "object-copy": "^0.1.0" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + } + } + }, + "stealthy-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/stealthy-require/-/stealthy-require-1.1.1.tgz", + "integrity": "sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks=", + "dev": true + }, + "string-length": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/string-length/-/string-length-2.0.0.tgz", + "integrity": "sha1-1A27aGo6zpYMHP/KVivyxF+DY+0=", + "dev": true, + "requires": { + "astral-regex": "^1.0.0", + "strip-ansi": "^4.0.0" + } + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dev": true, + "requires": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "^3.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + } + } + }, + "strip-bom": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", + "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", + "dev": true, + "requires": { + "is-utf8": "^0.2.0" + } + }, + "strip-eof": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", + "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", + "dev": true + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + }, + "symbol-tree": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.2.tgz", + "integrity": "sha1-rifbOPZgp64uHDt9G8KQgZuFGeY=", + "dev": true + }, + "test-exclude": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-4.2.3.tgz", + "integrity": "sha512-SYbXgY64PT+4GAL2ocI3HwPa4Q4TBKm0cwAVeKOt/Aoc0gSpNRjJX8w0pA1LMKZ3LBmd8pYBqApFNQLII9kavA==", + "dev": true, + "requires": { + "arrify": "^1.0.1", + "micromatch": "^2.3.11", + "object-assign": "^4.1.0", + "read-pkg-up": "^1.0.1", + "require-main-filename": "^1.0.1" + } + }, + "throat": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/throat/-/throat-4.1.0.tgz", + "integrity": "sha1-iQN8vJLFarGJJua6TLsgDhVnKmo=", + "dev": true + }, + "tmpl": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.4.tgz", + "integrity": "sha1-I2QN17QtAEM5ERQIIOXPRA5SHdE=", + "dev": true + }, + "to-fast-properties": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz", + "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=", + "dev": true + }, + "to-object-path": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", + "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + } + }, + "to-regex": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", + "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", + "dev": true, + "requires": { + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "regex-not": "^1.0.2", + "safe-regex": "^1.1.0" + } + }, + "to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + }, + "dependencies": { + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + } + } + } + }, + "tough-cookie": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz", + "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==", + "dev": true, + "requires": { + "psl": "^1.1.24", + "punycode": "^1.4.1" + }, + "dependencies": { + "punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", + "dev": true + } + } + }, + "tr46": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz", + "integrity": "sha1-qLE/1r/SSJUZZ0zN5VujaTtwbQk=", + "dev": true, + "requires": { + "punycode": "^2.1.0" + } + }, + "trim-right": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz", + "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=", + "dev": true + }, + "ts-jest": { + "version": "23.10.5", + "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-23.10.5.tgz", + "integrity": "sha512-MRCs9qnGoyKgFc8adDEntAOP64fWK1vZKnOYU1o2HxaqjdJvGqmkLCPCnVq1/If4zkUmEjKPnCiUisTrlX2p2A==", + "dev": true, + "requires": { + "bs-logger": "0.x", + "buffer-from": "1.x", + "fast-json-stable-stringify": "2.x", + "json5": "2.x", + "make-error": "1.x", + "mkdirp": "0.x", + "resolve": "1.x", + "semver": "^5.5", + "yargs-parser": "10.x" + }, + "dependencies": { + "json5": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.0.tgz", + "integrity": "sha512-8Mh9h6xViijj36g7Dxi+Y4S6hNGV96vcJZr/SrlHh1LR/pEn/8j/+qIBbs44YKl69Lrfctp4QD+AdWLTMqEZAQ==", + "dev": true, + "requires": { + "minimist": "^1.2.0" + } + }, + "yargs-parser": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-10.1.0.tgz", + "integrity": "sha512-VCIyR1wJoEBZUqk5PA+oOBF6ypbwh5aNB3I50guxAL/quggdfs4TtNHQrSazFA3fYZ+tEqfs0zIGlv0c/rgjbQ==", + "dev": true, + "requires": { + "camelcase": "^4.1.0" + } + } + } + }, + "tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "dev": true, + "requires": { + "safe-buffer": "^5.0.1" + } + }, + "tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", + "dev": true + }, + "type-check": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", + "dev": true, + "requires": { + "prelude-ls": "~1.1.2" + } + }, + "typescript": { + "version": "2.9.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-2.9.2.tgz", + "integrity": "sha512-Gr4p6nFNaoufRIY4NMdpQRNmgxVIGMs4Fcu/ujdYk3nAZqk7supzBE9idmvfZIlH/Cuj//dvi+019qEue9lV0w==" + }, + "uglify-js": { + "version": "3.4.9", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.4.9.tgz", + "integrity": "sha512-8CJsbKOtEbnJsTyv6LE6m6ZKniqMiFWmm9sRbopbkGs3gMPPfd3Fh8iIA4Ykv5MgaTbqHr4BaoGLJLZNhsrW1Q==", + "dev": true, + "optional": true, + "requires": { + "commander": "~2.17.1", + "source-map": "~0.6.1" + }, + "dependencies": { + "commander": { + "version": "2.17.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.17.1.tgz", + "integrity": "sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg==", + "dev": true, + "optional": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "optional": true + } + } + }, + "union-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.0.tgz", + "integrity": "sha1-XHHDTLW61dzr4+oM0IIHulqhrqQ=", + "dev": true, + "requires": { + "arr-union": "^3.1.0", + "get-value": "^2.0.6", + "is-extendable": "^0.1.1", + "set-value": "^0.4.3" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "set-value": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-0.4.3.tgz", + "integrity": "sha1-fbCPnT0i3H945Trzw79GZuzfzPE=", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-extendable": "^0.1.1", + "is-plain-object": "^2.0.1", + "to-object-path": "^0.3.0" + } + } + } + }, + "unset-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", + "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", + "dev": true, + "requires": { + "has-value": "^0.3.1", + "isobject": "^3.0.0" + }, + "dependencies": { + "has-value": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", + "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", + "dev": true, + "requires": { + "get-value": "^2.0.3", + "has-values": "^0.1.4", + "isobject": "^2.0.0" + }, + "dependencies": { + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "dev": true, + "requires": { + "isarray": "1.0.0" + } + } + } + }, + "has-values": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", + "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", + "dev": true + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + } + } + }, + "uri-js": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", + "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", + "dev": true, + "requires": { + "punycode": "^2.1.0" + } + }, + "urix": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", + "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", + "dev": true + }, + "use": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", + "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", + "dev": true + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "dev": true + }, + "util.promisify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.0.tgz", + "integrity": "sha512-i+6qA2MPhvoKLuxnJNpXAGhg7HphQOSUq2LKMZD0m15EiskXUkMvKdF4Uui0WYeCUGea+o2cw/ZuwehtfsrNkA==", + "dev": true, + "requires": { + "define-properties": "^1.1.2", + "object.getownpropertydescriptors": "^2.0.3" + } + }, + "uuid": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", + "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==", + "dev": true + }, + "validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "dev": true, + "requires": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + } + }, + "w3c-hr-time": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.1.tgz", + "integrity": "sha1-gqwr/2PZUOqeMYmlimViX+3xkEU=", + "dev": true, + "requires": { + "browser-process-hrtime": "^0.1.2" + } + }, + "walker": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.7.tgz", + "integrity": "sha1-L3+bj9ENZ3JisYqITijRlhjgKPs=", + "dev": true, + "requires": { + "makeerror": "1.0.x" + } + }, + "watch": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/watch/-/watch-0.18.0.tgz", + "integrity": "sha1-KAlUdsbffJDJYxOJkMClQj60uYY=", + "dev": true, + "requires": { + "exec-sh": "^0.2.0", + "minimist": "^1.2.0" + } + }, + "webidl-conversions": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz", + "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==", + "dev": true + }, + "whatwg-encoding": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz", + "integrity": "sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==", + "dev": true, + "requires": { + "iconv-lite": "0.4.24" + } + }, + "whatwg-mimetype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz", + "integrity": "sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==", + "dev": true + }, + "whatwg-url": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-6.5.0.tgz", + "integrity": "sha512-rhRZRqx/TLJQWUpQ6bmrt2UV4f0HCQ463yQuONJqC6fO2VoEb1pTYddbe59SkYq87aoM5A3bdhMZiUiVws+fzQ==", + "dev": true, + "requires": { + "lodash.sortby": "^4.7.0", + "tr46": "^1.0.1", + "webidl-conversions": "^4.0.2" + } + }, + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + }, + "which-module": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", + "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", + "dev": true + }, + "wordwrap": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", + "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=", + "dev": true + }, + "wrap-ansi": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", + "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", + "dev": true, + "requires": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1" + }, + "dependencies": { + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "dev": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dev": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + } + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true + }, + "write-file-atomic": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.4.2.tgz", + "integrity": "sha512-s0b6vB3xIVRLWywa6X9TOMA7k9zio0TMOsl9ZnDkliA/cfJlpHXAscj0gbHVJiTdIuAYpIyqS5GW91fqm6gG5g==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.11", + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.2" + } + }, + "ws": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/ws/-/ws-5.2.2.tgz", + "integrity": "sha512-jaHFD6PFv6UgoIVda6qZllptQsMlDEJkTQcybzzXDYM1XO9Y8em691FGMPmM46WGyLU4z9KMgQN+qrux/nhlHA==", + "dev": true, + "requires": { + "async-limiter": "~1.0.0" + } + }, + "xml-name-validator": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz", + "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==", + "dev": true + }, + "y18n": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", + "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=", + "dev": true + }, + "yallist": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", + "dev": true + }, + "yargs": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-11.1.0.tgz", + "integrity": "sha512-NwW69J42EsCSanF8kyn5upxvjp5ds+t3+udGBeTbFnERA+lF541DDpMawzo4z6W/QrzNM18D+BPMiOBibnFV5A==", + "dev": true, + "requires": { + "cliui": "^4.0.0", + "decamelize": "^1.1.1", + "find-up": "^2.1.0", + "get-caller-file": "^1.0.1", + "os-locale": "^2.0.0", + "require-directory": "^2.1.1", + "require-main-filename": "^1.0.1", + "set-blocking": "^2.0.0", + "string-width": "^2.0.0", + "which-module": "^2.0.0", + "y18n": "^3.2.1", + "yargs-parser": "^9.0.2" + } }, - "webgl": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/webgl/-/webgl-0.0.7.tgz", - "integrity": "sha1-vE7pVSOZOitiQ3dBnmotm+udeME=" + "yargs-parser": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-9.0.2.tgz", + "integrity": "sha1-nM9qQ0YP5O1Aqbto9I1DuKaMwHc=", + "dev": true, + "requires": { + "camelcase": "^4.1.0" + } } } } diff --git a/package.json b/package.json index 2cc0f26..0bc94ce 100644 --- a/package.json +++ b/package.json @@ -6,17 +6,16 @@ "scripts": { "build": "./scripts/build.sh", "typecheck": "tsc --noEmit", - "test": "TIMEOUT=2000 jest --env=node", - "test-coveralls": "TIMEOUT=2000 jest --env=node --coverage --coverageReporters=text-lcov --forceExit | coveralls" + "test": "jest --env=node", + "test-coveralls": "jest --env=node --coverage --coverageReporters=text-lcov --forceExit | coveralls" }, "dependencies": { - "@ericandrewlewis/bitmap": "^1.0.0", - "@types/node": "^10.5.2", + "@types/node": "^10.14.1", "js-slang": "0.1.14", - "lodash": "4.17.10", "typescript": "^2.9.2" }, "devDependencies": { + "@types/jest": "^24.0.9", "coveralls": "^3.0.2", "jest": "^23.4.0", "ts-jest": "^23.0.0" @@ -27,7 +26,7 @@ "js" ], "transform": { - "\\.ts$": "/node_modules/ts-jest/preprocessor.js" + "\\.ts$": "ts-jest" }, "testRegex": "/__tests__/test.*\\.ts$" } diff --git a/yarn.lock b/yarn.lock index 3212787..14187e2 100644 --- a/yarn.lock +++ b/yarn.lock @@ -18,11 +18,6 @@ esutils "^2.0.2" js-tokens "^3.0.0" -"@ericandrewlewis/bitmap@^1.0.0": - version "1.0.0" - resolved "https://registry.yarnpkg.com/@ericandrewlewis/bitmap/-/bitmap-1.0.0.tgz#f7586422489b603f304d3292720bb7a02ae33b96" - integrity sha512-7dNAuxd0mJ0nDHFLC0tRBLTARNezyHzqJ6KIE2e7ay6wpO79oG+MqDBSY9sB6Q96kv86d79Fg9ful925jA+j9A== - "@types/acorn@^4.0.3": version "4.0.3" resolved "https://registry.yarnpkg.com/@types/acorn/-/acorn-4.0.3.tgz#d1f3e738dde52536f9aad3d3380d14e448820afd" @@ -35,10 +30,22 @@ resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.39.tgz#e177e699ee1b8c22d23174caaa7422644389509f" integrity sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw== -"@types/node@^10.5.2": - version "10.5.2" - resolved "https://registry.yarnpkg.com/@types/node/-/node-10.5.2.tgz#f19f05314d5421fe37e74153254201a7bf00a707" - integrity sha512-m9zXmifkZsMHZBOyxZWilMwmTlpC8x5Ty360JKTiXvlXZfBWYpsg9ZZvP/Ye+iZUh+Q+MxDLjItVTWIsfwz+8Q== +"@types/jest-diff@*": + version "20.0.1" + resolved "https://registry.yarnpkg.com/@types/jest-diff/-/jest-diff-20.0.1.tgz#35cc15b9c4f30a18ef21852e255fdb02f6d59b89" + integrity sha512-yALhelO3i0hqZwhjtcr6dYyaLoCHbAMshwtj6cGxTvHZAKXHsYGdff6E8EPw3xLKY0ELUTQ69Q1rQiJENnccMA== + +"@types/jest@^24.0.9": + version "24.0.11" + resolved "https://registry.yarnpkg.com/@types/jest/-/jest-24.0.11.tgz#1f099bea332c228ea6505a88159bfa86a5858340" + integrity sha512-2kLuPC5FDnWIDvaJBzsGTBQaBbnDweznicvK7UGYzlIJP4RJR2a4A/ByLUXEyEgag6jz8eHdlWExGDtH3EYUXQ== + dependencies: + "@types/jest-diff" "*" + +"@types/node@^10.14.1": + version "10.14.1" + resolved "https://registry.yarnpkg.com/@types/node/-/node-10.14.1.tgz#8701cd760acc20beba5ffe0b7a1b879f39cb8c41" + integrity sha512-Rymt08vh1GaW4vYB6QP61/5m/CFLGnFZP++bJpWbiNxceNa6RBipDmb413jvtSf/R1gg5a/jQVl2jY4XVRscEA== abab@^1.0.4: version "1.0.4" @@ -2377,7 +2384,7 @@ lodash.sortby@^4.7.0: resolved "https://registry.yarnpkg.com/lodash.sortby/-/lodash.sortby-4.7.0.tgz#edd14c824e2cc9c1e0b0a1b42bb5210516a42438" integrity sha1-7dFMgk4sycHgsKG0K7UhBRakJDg= -lodash@4.17.10, lodash@^4.13.1, lodash@^4.17.10, lodash@^4.17.4: +lodash@^4.13.1, lodash@^4.17.10, lodash@^4.17.4: version "4.17.10" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.10.tgz#1b7793cf7259ea38fb3661d4d38b3260af8ae4e7" integrity sha512-UejweD1pDoXu+AD825lWwp4ZGtSwgnpZxb3JDViD7StjQz+Nb/6l093lx4OQ0foGWNRoc19mWy7BzL+UAK2iVg== From 5056f1119accc25827cbd259a582dfa9e1b4226a Mon Sep 17 00:00:00 2001 From: Shuming Date: Mon, 18 Mar 2019 23:31:11 +0800 Subject: [PATCH 07/12] Updated index and tests --- src/__tests__/examples/chap1.ts | 67 ++-- src/__tests__/examples/chap3.ts | 167 ++++++---- src/__tests__/examples/curves.ts | 28 +- src/__tests__/examples/runes2d.ts | 42 ++- src/__tests__/examples/runes3d.ts | 37 ++- src/__tests__/examples/sounds.ts | 29 +- src/__tests__/examples/streams.ts | 37 ++- src/__tests__/examples/types.ts | 14 +- src/__tests__/examples/util.ts | 44 --- src/__tests__/helpers.ts | 21 +- src/__tests__/test_chap1.ts | 276 ++++++++++++++++ src/__tests__/test_chap3.ts | 505 +++++++++++++++++++++++++----- src/__tests__/test_chapt1.ts | 103 ------ src/__tests__/test_curves.ts | 61 ++-- src/__tests__/test_runes2d.ts | 111 +++++-- src/__tests__/test_runes3d.ts | 114 +++++-- src/__tests__/test_sounds.ts | 92 ++++-- src/__tests__/test_streams.ts | 144 +++++++-- src/__tests__/test_utils.ts | 41 --- src/index.ts | 5 +- 20 files changed, 1383 insertions(+), 555 deletions(-) delete mode 100644 src/__tests__/examples/util.ts create mode 100644 src/__tests__/test_chap1.ts delete mode 100644 src/__tests__/test_chapt1.ts delete mode 100644 src/__tests__/test_utils.ts diff --git a/src/__tests__/examples/chap1.ts b/src/__tests__/examples/chap1.ts index 846cc65..2e9d879 100644 --- a/src/__tests__/examples/chap1.ts +++ b/src/__tests__/examples/chap1.ts @@ -6,6 +6,7 @@ */ import { Grader, Student } from './types' +import { TestCase } from '../../index' const validStudentCorrect = `const f = i => i === 0 ? 0 : i < 3 ? 1 : f(i-1) + f(i-2);` @@ -27,54 +28,48 @@ const invalidStudentTimeout = `const f = i => i < -3 ? 0 : f(i+1) + f(i+2);` export const student: Student = { - invalid: { - runtime: invalidStudentRuntime, - syntax: invalidStudentSyntax, - timeout: invalidStudentTimeout - }, valid: { correct: validStudentCorrect, wrong: validStudentWrong, partial: validStudentPartial + }, + invalid: { + runtime: invalidStudentRuntime, + syntax: invalidStudentSyntax, + timeout: invalidStudentTimeout } } -const invalidGraderRuntime = [ - `function ek0chei0y1() { - return g(0) === 0 ? 1 : 0; - } - - ek0chei0y1();` +const invalidTestcaseRuntime = [ + { program: `g(1);`, + answer: "1", + score: 1 } ] -const invalidGraderSyntax = [ - `function ek0chei0y1() { - return f(0) === 0 ? 1 : 0; - } - - ek0chei0y1()` +const invalidTestcaseSyntax = [ + { program: `f(1)`, + answer: "1", + score: 1 } ] -const validGrader = [ - `function ek0chei0y1() { - return f(0) === 0 ? 1 : 0; - } - - ek0chei0y1();`, - `function ek0chei0y1() { - const test1 = f(7) === 13; - const test2 = f(10) === 55; - const test3 = f(12) === 144; - return test1 && test2 && test3 ? 4 : 0; - } - - ek0chei0y1();` +const validTestcases: TestCase[] = [ + { program: `f(1);`, + answer: "1", + score: 1 }, + { program: `f(3);`, + answer: "2", + score: 1 }, + { program: `f(5);`, + answer: "5", + score: 1 } ] export const grader: Grader = { - invalid: { - runtime: invalidGraderRuntime, - syntax: invalidGraderSyntax - }, - valid: validGrader + validPrepend: ``, + validPostpend: ``, + validTestcases: validTestcases, + invalidTestcases: { + runtime: invalidTestcaseRuntime, + syntax: invalidTestcaseSyntax + } } diff --git a/src/__tests__/examples/chap3.ts b/src/__tests__/examples/chap3.ts index 0a27087..0a0cb12 100644 --- a/src/__tests__/examples/chap3.ts +++ b/src/__tests__/examples/chap3.ts @@ -12,18 +12,15 @@ import { Grader, Student } from './types' const validStudentCorrect = ` - let x = 1; function reassign_x() { x = 2; } - let arr = []; function assign_array() { arr[0] = 'a'; arr[1] = 'b'; } - let obj = {}; function assign_object() { obj['a'] = 1; obj['b'] = 2; @@ -32,32 +29,26 @@ const validStudentCorrect = const validStudentWrong = ` - let x = 1; function reassign_x() {} - let arr = []; function assign_array() {} - let obj = {}; function assign_object() {} ` const validStudentPartial = ` - let x = 0; // wrong function function reassign_x() { x = 'a'; } - let arr = []; // wrong function function assign_array() { arr[0] = 1; arr[1] = 'b'; } - let obj = {}; function assign_object() { obj['a'] = 1; obj['b'] = 2; @@ -65,84 +56,142 @@ const validStudentPartial = ` const invalidStudentRuntime = - ` - function f() { - x = 'a'; - } - f(); ` + function reassign_x() { + y = 'a'; + } + + function assign_array() { + arr[0] = 'a'; + arr[1] = 'b'; + } + function assign_object() { + obj['a'] = 1; + obj['b'] = 2; + } + ` const invalidStudentSyntax = ` - let x; - function reassign_x() {} + function reassign_x() { g } + + function assign_array() { + arr[0] = 'a'; + arr[1] = 'b'; + } + + function assign_object() { + obj['a'] = 1; + obj['b'] = 2; + } ` const invalidStudentTimeout = `while(true) {}` export const student: Student = { - invalid: { - runtime: invalidStudentRuntime, - syntax: invalidStudentSyntax, - timeout: invalidStudentTimeout - }, valid: { correct: validStudentCorrect, wrong: validStudentWrong, partial: validStudentPartial + }, + invalid: { + runtime: invalidStudentRuntime, + syntax: invalidStudentSyntax, + timeout: invalidStudentTimeout } } -const invalidGraderRuntime = [ - `function ek0chei0y1() { - return nonexistent_function(); - } - - ek0chei0y1();` -] +const validPrepend = ` + let x = 1; + let arr = []; + let obj = {};` -const invalidGraderSyntax = [ - `function ek0chei0y1() { - return 1; - } +const invalidPrependSyntax = ` + let x = 1; + let arr = [] + let obj = {};` - ek0chei0y1()` -] +const invalidPrependRuntime = ` + let x = 1; + let arr = list1(); + let obj = {};` -const validGrader = [ - `function ek0chei0y1() { - const initial = (x === 1); - reassign_x(); - const final = (x === 2); - return (initial && final) ? 1 : 0; - } +const invalidPostpendRuntime = `a();` - ek0chei0y1();`, +const invalidPostpendSyntax = `a()` - `function ek0chei0y1() { - const initial = is_empty_list(arr); - assign_array(); - const final = (arr[0] === 'a' && arr[1] === 'b'); - return (initial && final) ? 1 : 0; +const validPostpend = ` + function check_x(x, y) { + return x === y; } + + function check_arr(f, arr) { + return f(arr); + } + + function check_obj(f, obj) { + return f(obj); + }` + +const invalidTestcaseRuntime = [ + { program: `check();`, + answer: "true", + score: 1 } +] - ek0chei0y1();`, +const invalidTestcaseSyntax = [ + { program: `check_x(x, 1)`, + answer: "true", + score: 1 }, +] - `function ek0chei0y1() { - const initial = (obj.a === undefined && obj.b === undefined); +const validTestcases = [ + { program: + `const a1 = check_x(x, 1); + reassign_x(); + const a2 = check_x(x, 2); + + a1 === a2;`, + answer: "true", + score: 1 }, + { program: + `const a1 = check_arr(is_empty_list, arr); + assign_array(); + const f = (arr) => arr[0] === 'a' && arr[1] === 'b'; + const a2 = check_arr(f, arr); + + a1 === a2;`, + answer: "true", + score: 1 }, + { program: + `const f = (obj) => obj.a === undefined && obj.b === undefined; + const a1 = check_obj(f, obj); assign_object(); - const final = (obj.a === 1 && obj.b === 2); - return (initial && final) ? 1 : 0; - } - - ek0chei0y1();` + const g = (obj) => obj.a === 1 && obj.b === 2; + const a2 = check_obj(g, obj); + + a1 === a2;`, + answer: "true", + score: 1 } ] export const grader: Grader = { - invalid: { - runtime: invalidGraderRuntime, - syntax: invalidGraderSyntax + validPrepend: validPrepend, + invalidPrepend: { + runtime: invalidPrependRuntime, + syntax: invalidPrependSyntax, + timeout: `while(true) {}` }, - valid: validGrader + validPostpend: validPostpend, + invalidPostpend: { + runtime: invalidPostpendRuntime, + syntax: invalidPostpendSyntax, + timeout: `while(true) {}` + }, + validTestcases: validTestcases, + invalidTestcases: { + runtime: invalidTestcaseRuntime, + syntax: invalidTestcaseSyntax + } } diff --git a/src/__tests__/examples/curves.ts b/src/__tests__/examples/curves.ts index 5f18112..de06f47 100644 --- a/src/__tests__/examples/curves.ts +++ b/src/__tests__/examples/curves.ts @@ -27,30 +27,28 @@ export const student: Student = { valid: { correct: validStudentCorrect, wrong: validStudentWrong, + }, + invalid: { + runtime: "a;", + syntax: "a" } } const validGrader = [ - `__check_canvas( + { program: `__check_canvas( draw_connected_squeezed_to_window, 2000, backward_sine, 50, 0.80 - ) ? 1 : 0; -`] - -const scanGrader = [ - `__scan_canvas( - draw_connected_squeezed_to_window, - 300, - backward_sine, - 50, - ) ? 1 : 0; -`] + );`, + answer: "true", + score: 1 + } +] export const grader: Grader = { - pixel: validGrader, - scan: validGrader - + validPrepend: "", + validTestcases: validGrader, + validPostpend: "" } \ No newline at end of file diff --git a/src/__tests__/examples/runes2d.ts b/src/__tests__/examples/runes2d.ts index ca1af5a..f172a40 100644 --- a/src/__tests__/examples/runes2d.ts +++ b/src/__tests__/examples/runes2d.ts @@ -43,31 +43,46 @@ export const student: Student = { } const validGrader = [ -` + { + program: ` function rune_testcase_a() { const expected_result = quarter_turn_right(blue(nova_bb)); const actual_result = a(); - return __are_pictures_equal(actual_result, expected_result) ? 2 : 0; + return __are_pictures_equal(actual_result, expected_result); } rune_testcase_a(); `, -` + answer: "true", + score: 1 + } + , + { + program: ` function rune_testcase_b() { const expected_result = stack(quarter_turn_right(nova_bb), quarter_turn_right(nova_bb)); const actual_result = b(); - return __are_pictures_equal(actual_result, expected_result) ? 2 : 0; + return __are_pictures_equal(actual_result, expected_result); } rune_testcase_b(); `, -` + answer: "true", + score: 1 + }, + { + program: + ` function rune_testcase_c() { const expected_result = beside(stack(nova_bb, heart_bb), stack(rcross_bb, circle_bb)); const actual_result = c(nova_bb, heart_bb, rcross_bb, circle_bb); - return __are_pictures_equal(actual_result, expected_result) ? 2 : 0; + return __are_pictures_equal(actual_result, expected_result); } rune_testcase_c(); `, -` + answer: "true", + score: 1 + }, + { + program: ` function rune_testcase_d() { function fractal(rune, n) { if (n === 1) { @@ -79,16 +94,17 @@ const validGrader = [ } const expected_result = fractal(nova_bb, 7); const actual_result = d(nova_bb, 7); - return __are_pictures_equal(actual_result, expected_result) ? 2 : 0; + return __are_pictures_equal(actual_result, expected_result); } rune_testcase_d(); `, + answer: "true", + score: 1 + } ] export const grader: Grader = { - invalid: { - runtime: null, - syntax: null - }, - valid: validGrader + validPrepend: "", + validPostpend: "", + validTestcases: validGrader } \ No newline at end of file diff --git a/src/__tests__/examples/runes3d.ts b/src/__tests__/examples/runes3d.ts index 739f80f..8cb5f58 100644 --- a/src/__tests__/examples/runes3d.ts +++ b/src/__tests__/examples/runes3d.ts @@ -44,31 +44,39 @@ export const student: Student = { } const validGrader = [ -` +{ program: ` function rune_testcase_a() { const expected_result = overlay(heart_bb, nova_bb); const actual_result = a(); - return __are_pictures_equal(actual_result, expected_result) ? 2 : 0; + return __are_pictures_equal(actual_result, expected_result); } rune_testcase_a(); `, -` +answer: "true", +score: 1 +}, +{ program: ` function rune_testcase_b() { const expected_result = overlay_frac(0.25, quarter_turn_right(nova_bb), scale(0.4, heart_bb)); const actual_result = b(); - return __are_pictures_equal(actual_result, expected_result) ? 2 : 0; + return __are_pictures_equal(actual_result, expected_result); } rune_testcase_b(); -`, -` +`, answer: "true", +score: 1 +}, +{ program: ` function rune_testcase_c() { const expected_result = overlay(stack(beside(nova_bb, heart_bb), beside(blank_bb, blank_bb)), stack(beside(blank_bb, blank_bb), beside(rcross_bb, circle_bb))); const actual_result = c(nova_bb, heart_bb, rcross_bb, circle_bb); - return __are_pictures_equal(actual_result, expected_result) ? 2 : 0; + return __are_pictures_equal(actual_result, expected_result); } rune_testcase_c(); `, -` +answer: "true", +score: 1 +}, +{ program: ` function rune_testcase_d() { function tree(rune, n) { if (n === 1) { @@ -80,16 +88,17 @@ const validGrader = [ } const expected_result = tree(nova_bb, 7); const actual_result = d(nova_bb, 7); - return __are_pictures_equal(actual_result, expected_result) ? 2 : 0; + return __are_pictures_equal(actual_result, expected_result); } rune_testcase_d(); `, +answer: "true", +score: 1 +} ] export const grader: Grader = { - invalid: { - runtime: null, - syntax: null - }, - valid: validGrader + validPrepend: "", + validPostpend: "", + validTestcases: validGrader } \ No newline at end of file diff --git a/src/__tests__/examples/sounds.ts b/src/__tests__/examples/sounds.ts index e16c60a..fcff6c2 100644 --- a/src/__tests__/examples/sounds.ts +++ b/src/__tests__/examples/sounds.ts @@ -57,7 +57,8 @@ export const student: Student = { } const validGrader = [ -` + { + program: ` function sound_testcase_noise() { __reset_function_count("play"); __reset_function_count("sound_to_sourcesound"); @@ -70,11 +71,15 @@ const validGrader = [ const has_correct_sound_to_sourcesounds = __get_function_count("sound_to_sourcesound") === 0; const has_correct_sourcesound_to_sounds = __get_function_count("sourcesound_to_sound") === 1; - return has_correct_sound_to_sourcesounds && has_correct_sourcesound_to_sounds ? 1 : 0; + return has_correct_sound_to_sourcesounds && has_correct_sourcesound_to_sounds; } sound_testcase_noise(); `, -` + answer: "true", + score: 1 + }, + { + program: ` function sound_testcase_disciplined_sourcesound() { __reset_function_count("play"); __reset_function_count("sound_to_sourcesound"); @@ -101,7 +106,11 @@ const validGrader = [ } sound_testcase_disciplined_sourcesound(); `, -` + answer: "3", + score: 1 + }, + { + program: ` function sound_testcase_disciplined_sound() { __reset_function_count("play"); __reset_function_count("sound_to_sourcesound"); @@ -129,13 +138,13 @@ const validGrader = [ return 2 + deductions; } sound_testcase_disciplined_sound(); -` +`, answer: "2", + score: 1 + } ] export const grader: Grader = { - invalid: { - runtime: null, - syntax: null - }, - valid: validGrader + validPrepend: "", + validPostpend: "", + validTestcases: validGrader } diff --git a/src/__tests__/examples/streams.ts b/src/__tests__/examples/streams.ts index d7578c0..d177a1f 100644 --- a/src/__tests__/examples/streams.ts +++ b/src/__tests__/examples/streams.ts @@ -46,39 +46,48 @@ export const student: Student = { } const validGrader = [ - ` +{program : ` function stream_testcase_a() { const lst = stream_to_list(stream_take_max(odd_stream, 3)); - return equal(lst, list(1, 3, 5)) ? 1 : 0; + return equal(lst, list(1, 3, 5)); } stream_testcase_a(); `, - ` + answer: "true", + score: 1 +}, +{program : ` function stream_testcase_b() { const lst = stream_to_list(stream_take_max(odd_stream, 5)); - return equal(lst, list(1, 3, 5, 7, 9)) ? 2 : 0; + return equal(lst, list(1, 3, 5, 7, 9)); } stream_testcase_b(); `, - ` + answer: "true", + score: 1 +}, +{program : ` function stream_testcase_c() { return !is_empty_list(stream_member(3, odd_stream)) && - stream_ref(odd_stream, 1) === 3 ? 1 : 0; + stream_ref(odd_stream, 1) === 3; } stream_testcase_c(); `, - ` + answer: "true", + score: 1 +}, +{program : ` function stream_testcase_d() { - return is_stream(odd_stream, 1) ? 1 : 0; + return is_stream(odd_stream, 1); } stream_testcase_d(); - ` + `, answer: "true", + score: 1 +} ] export const grader: Grader = { - invalid: { - runtime: null, - syntax: null - }, - valid: validGrader + validPrepend: "", + validPostpend: "", + validTestcases: validGrader } diff --git a/src/__tests__/examples/types.ts b/src/__tests__/examples/types.ts index d377b56..7d3589c 100644 --- a/src/__tests__/examples/types.ts +++ b/src/__tests__/examples/types.ts @@ -1,11 +1,17 @@ +import { TestCase } from '../../index' + export type Grader = { - invalid: InvalidPrograms - valid: string[] + validPrepend: string + invalidPrepend?: InvalidPrograms + validPostpend: string + invalidPostpend?: InvalidPrograms + validTestcases: TestCase[] + invalidTestcases?: InvalidPrograms } export type Student = { - invalid: InvalidPrograms valid: ValidPrograms + invalid: InvalidPrograms } type InvalidPrograms = { @@ -17,5 +23,5 @@ type InvalidPrograms = { type ValidPrograms = { correct: string wrong: string - partial: string + partial?: string } diff --git a/src/__tests__/examples/util.ts b/src/__tests__/examples/util.ts deleted file mode 100644 index ab7a367..0000000 --- a/src/__tests__/examples/util.ts +++ /dev/null @@ -1,44 +0,0 @@ -/** - * Here, the student is asked to return a joke string for 2 marks - * 1 mark is deducted if the student does not use make_funny - */ - -import { Grader, Student } from './types' - -const validStudentCorrect = - `const make_joke = str => make_funny(str);` - -const validStudentWrong = - `const make_joke = str => str;` - -const validStudentPartial = - `const make_joke = str => str + ', haha!';` - -export const student: Student = { - invalid: { - }, - valid: { - correct: validStudentCorrect, - wrong: validStudentWrong, - partial: validStudentPartial - } -} - -const validGrader = [ - `function ek0chei0y1() { - const result_1 = make_joke("hello") === "hello, haha!" ? 1 : 0; - __reset_function_count("make_funny"); - make_joke("hello"); - const result_2 = __get_function_count("make_funny") > 0 ? 2 : 1; - return result_1 * result_2; - } - - - ek0chei0y1(); -` -] - -export const grader: Grader = { - invalid: {}, - valid: validGrader -} diff --git a/src/__tests__/helpers.ts b/src/__tests__/helpers.ts index b1c5521..f2db8b2 100644 --- a/src/__tests__/helpers.ts +++ b/src/__tests__/helpers.ts @@ -1,7 +1,20 @@ -import { Library } from '../index' +import { AwsEvent, Library, TestCase} from '../index' + + +type PartialAwsEvent = { + prependProgram: string + studentProgram: string, + postpendProgram: string, + testCases: TestCase[] +} export function awsEventFactory(library: Library) { - return (graderPrograms: string[], studentProgram: string) => ({ - library, graderPrograms, studentProgram - }) + return (awsEvent: PartialAwsEvent): AwsEvent => ( + { + library: library, + prependProgram: awsEvent.prependProgram, + studentProgram: awsEvent.studentProgram, + postpendProgram: awsEvent.postpendProgram, + testCases: awsEvent.testCases, + }) } diff --git a/src/__tests__/test_chap1.ts b/src/__tests__/test_chap1.ts new file mode 100644 index 0000000..295bee0 --- /dev/null +++ b/src/__tests__/test_chap1.ts @@ -0,0 +1,276 @@ +import { grader, student } from './examples/chap1' +import { awsEventFactory } from './helpers' +import { runAll } from '../index' +import 'jest' + +const makeAwsEvent = awsEventFactory({ + chapter: 1, + external: { + name: 'NONE', + symbols: [] + }, + globals: [] +}) + +test('prepend OK, postpend OK, testCases OK, student OK, correct', async () => { + const results = await runAll(makeAwsEvent({ + prependProgram: grader.validPrepend, + studentProgram: student.valid.correct, + postpendProgram: grader.validPostpend, + testCases: grader.validTestcases})) + expect(results).toEqual({ + "totalScore": 3, + "results": [ + { + "resultType": "pass", + "score": 1 + }, + { + "resultType": "pass", + "score": 1 + }, + { + "resultType": "pass", + "score": 1 + } + ] + }) +}) + +test('prepend OK, postpend OK, testCases OK, student OK, partial', async () => { + const results = await runAll(makeAwsEvent({ + prependProgram: grader.validPrepend, + studentProgram: student.valid.partial!, + postpendProgram: grader.validPostpend, + testCases: grader.validTestcases})) + expect(results).toEqual({ + "totalScore": 3, + "results": [ + { + "resultType": "pass", + "score": 1 + }, + { + "resultType": "pass", + "score": 1 + }, + { + "resultType": "pass", + "score": 1 + } + ] + }) +}) + +test('prepend OK, postpend OK, testCases OK, student OK, wrong', async () => { + const results = await runAll(makeAwsEvent({ + prependProgram: grader.validPrepend, + studentProgram: student.valid.wrong, + postpendProgram: grader.validPostpend, + testCases: grader.validTestcases})) + expect(results).toEqual({ + "totalScore": 0, + "results": [ + { + "resultType": "fail", + "expected": "1", + "actual": "2" + }, + { + "resultType": "fail", + "expected": "2", + "actual": "4" + }, + { + "resultType": "fail", + "expected": "5", + "actual": "6" + } + ] + }) +}) + +test('prepend OK, postpend OK, testCases OK, student runtimeError', async () => { + const results = await runAll(makeAwsEvent({ + prependProgram: grader.validPrepend, + studentProgram: student.invalid.runtime, + postpendProgram: grader.validPostpend, + testCases: grader.validTestcases})) + expect(results).toEqual({ + "totalScore": 0, + "results": [ + { + "resultType": "error", + "errors": [ + { + "errorType": "runtime", + "line": 1, + "location": "student", + "errorLine": "const f = i => f(j+1);", + "errorExplanation": "Name j not declared" + } + ] + }, + { + "resultType": "error", + "errors": [ + { + "errorType": "runtime", + "line": 1, + "location": "student", + "errorLine": "const f = i => f(j+1);", + "errorExplanation": "Name j not declared" + } + ] + }, + { + "resultType": "error", + "errors": [ + { + "errorType": "runtime", + "line": 1, + "location": "student", + "errorLine": "const f = i => f(j+1);", + "errorExplanation": "Name j not declared" + } + ] + } + ] + }) +}) + +test('prepend OK, postpend OK, testCases OK, student syntaxError', async () => { + const results = await runAll(makeAwsEvent({ + prependProgram: grader.validPrepend, + studentProgram: student.invalid.syntax, + postpendProgram: grader.validPostpend, + testCases: grader.validTestcases})) + expect(results).toEqual({ + "totalScore": 0, + "results": [ + { + "resultType": "error", + "errors": [ + { + "errorType": "syntax", + "line": 1, + "location": "student", + "errorLine": "const f = i => i === 0 ? 0 : i < 3 ? 1 : f(i-1) + f(i-2)", + "errorExplanation": "Missing semicolon at the end of statement" + } + ] + }, + { + "resultType": "error", + "errors": [ + { + "errorType": "syntax", + "line": 1, + "location": "student", + "errorLine": "const f = i => i === 0 ? 0 : i < 3 ? 1 : f(i-1) + f(i-2)", + "errorExplanation": "Missing semicolon at the end of statement" + } + ] + }, + { + "resultType": "error", + "errors": [ + { + "errorType": "syntax", + "line": 1, + "location": "student", + "errorLine": "const f = i => i === 0 ? 0 : i < 3 ? 1 : f(i-1) + f(i-2)", + "errorExplanation": "Missing semicolon at the end of statement" + } + ] + } + ] + }) +}) + +test('prepend OK, postpend OK, testCases OK, student timeoutError', async () => { + const results = await runAll(makeAwsEvent({ + prependProgram: grader.validPrepend, + studentProgram: student.invalid.timeout!, + postpendProgram: grader.validPostpend, + testCases: grader.validTestcases})) + expect(results).toEqual({ + "totalScore": 0, + "results": [ + { + "resultType": "error", + "errors": [ + { + "errorType": "timeout" + } + ] + }, + { + "resultType": "error", + "errors": [ + { + "errorType": "timeout" + } + ] + }, + { + "resultType": "error", + "errors": [ + { + "errorType": "timeout" + } + ] + } + ] + }) +}) + +test('prepend OK, postpend OK, testCases runtimeError, student OK', async () => { + const results = await runAll(makeAwsEvent({ + prependProgram: grader.validPrepend, + studentProgram: student.valid.correct, + postpendProgram: grader.validPostpend, + testCases: grader.invalidTestcases!.runtime})) + expect(results).toEqual({ + "totalScore": 0, + "results": [ + { + "resultType": "error", + "errors": [ + { + "errorType": "runtime", + "line": 1, + "location": "testcase", + "errorLine": "g(1);", + "errorExplanation": "Name g not declared" + } + ] + } + ] + }) +}) + +test('prepend OK, postpend OK, testCases syntaxError, student OK', async () => { + const results = await runAll(makeAwsEvent({ + prependProgram: grader.validPrepend, + studentProgram: student.valid.correct, + postpendProgram: grader.validPostpend, + testCases: grader.invalidTestcases!.syntax})) + expect(results).toEqual({ + "totalScore": 0, + "results": [ + { + "resultType": "error", + "errors": [ + { + "errorType": "syntax", + "line": 1, + "location": "testcase", + "errorLine": "f(1)", + "errorExplanation": "Missing semicolon at the end of statement" + } + ] + } + ] + }) +}) \ No newline at end of file diff --git a/src/__tests__/test_chap3.ts b/src/__tests__/test_chap3.ts index 2608887..bd7d9ee 100644 --- a/src/__tests__/test_chap3.ts +++ b/src/__tests__/test_chap3.ts @@ -1,6 +1,7 @@ import { grader, student } from './examples/chap3' import { awsEventFactory } from './helpers' import { runAll } from '../index' +import 'jest' const makeAwsEvent = awsEventFactory({ chapter: 3, @@ -11,96 +12,448 @@ const makeAwsEvent = awsEventFactory({ globals: [] }) -test('grader OK, student OK, correct', async () => { - const results = await runAll(makeAwsEvent(grader.valid, student.valid.correct)) - expect(results).toEqual([ - {'grade': 1, 'resultType': 'pass'}, - {'grade': 1, 'resultType': 'pass'}, - {'grade': 1, 'resultType': 'pass'} - ]) +test('prepend OK, postpend OK, testCases OK, student OK, correct', async () => { + const results = await runAll(makeAwsEvent({ + prependProgram: grader.validPrepend, + studentProgram: student.valid.correct, + postpendProgram: grader.validPostpend, + testCases: grader.validTestcases})) + expect(results).toEqual({ + "totalScore": 3, + "results": [ + { + "resultType": "pass", + "score": 1 + }, + { + "resultType": "pass", + "score": 1 + }, + { + "resultType": "pass", + "score": 1 + } + ] + }) }) -test('grader OK, student OK, partial', async () => { - const results = await runAll(makeAwsEvent(grader.valid, student.valid.partial)) - expect(results).toEqual([ - {'grade': 0, 'resultType': 'pass'}, - {'grade': 0, 'resultType': 'pass'}, - {'grade': 1, 'resultType': 'pass'} - ]) +test('prepend OK, postpend OK, testCases OK, student OK, partial', async () => { + const results = await runAll(makeAwsEvent({ + prependProgram: grader.validPrepend, + studentProgram: student.valid.partial!, + postpendProgram: grader.validPostpend, + testCases: grader.validTestcases})) + expect(results).toEqual({ + "totalScore": 1, + "results": [ + { + "resultType": "fail", + "expected": "true", + "actual": "false" + }, + { + "resultType": "fail", + "expected": "true", + "actual": "false" + }, + { + "resultType": "pass", + "score": 1 + } + ] + }) }) -test('grader OK, student OK, wrong', async () => { - const results = await runAll(makeAwsEvent(grader.valid, student.valid.wrong)) - expect(results).toEqual([ - {'grade': 0, 'resultType': 'pass'}, - {'grade': 0, 'resultType': 'pass'}, - {'grade': 0, 'resultType': 'pass'} - ]) +test('prepend OK, postpend OK, testCases OK, student OK, wrong', async () => { + const results = await runAll(makeAwsEvent({ + prependProgram: grader.validPrepend, + studentProgram: student.valid.wrong, + postpendProgram: grader.validPostpend, + testCases: grader.validTestcases})) + expect(results).toEqual({ + "totalScore": 0, + "results": [ + { + "resultType": "fail", + "expected": "true", + "actual": "false" + }, + { + "resultType": "fail", + "expected": "true", + "actual": "false" + }, + { + "resultType": "fail", + "expected": "true", + "actual": "false" + } + ] + }) }) -test('grader OK, student runtimeError', async () => { - const results = await runAll(makeAwsEvent(grader.valid, student.invalid.runtime)) - results.map(result => { - // One result per student program, each result is a GraderError - expect(result.resultType).toBe('error') - // each GraderError is a runtimeError at the correct line - result.errors.map(error => expect(error).toEqual({ - errorType: 'runtime', - line: 3, - location: 'student' - })) + +test('prepend OK, postpend OK, testCases OK, student runtimeError', async () => { + const results = await runAll(makeAwsEvent({ + prependProgram: grader.validPrepend, + studentProgram: student.invalid.runtime, + postpendProgram: grader.validPostpend, + testCases: grader.validTestcases})) + expect(results).toEqual({ + "totalScore": 2, + "results": [ + { + "resultType": "error", + "errors": [ + { + "errorType": "runtime", + "line": 3, + "location": "student", + "errorLine": "y = 'a';", + "errorExplanation": "Name y not declared" + } + ] + }, + { + "resultType": "pass", + "score": 1 + }, + { + "resultType": "pass", + "score": 1 + } + ] }) }) -test('grader OK, student timeoutError', async () => { - const results = await runAll(makeAwsEvent(grader.valid, student.invalid.timeout)) - results.map(result => { - expect(result.resultType).toBe('error') - expect(result.errors).toHaveLength(1) - expect(result.errors[0]).toEqual({ - errorType: 'timeout' - }) +test('prepend OK, postpend OK, testCases OK, student syntaxError', async () => { + const results = await runAll(makeAwsEvent({ + prependProgram: grader.validPrepend, + studentProgram: student.invalid.syntax, + postpendProgram: grader.validPostpend, + testCases: grader.validTestcases})) + expect(results).toEqual({ + "totalScore": 0, + "results": [ + { + "resultType": "error", + "errors": [ + { + "errorType": "syntax", + "line": 2, + "location": "student", + "errorLine": "function reassign_x() { g }", + "errorExplanation": "Missing semicolon at the end of statement" + } + ] + }, + { + "resultType": "error", + "errors": [ + { + "errorType": "syntax", + "line": 2, + "location": "student", + "errorLine": "function reassign_x() { g }", + "errorExplanation": "Missing semicolon at the end of statement" + } + ] + }, + { + "resultType": "error", + "errors": [ + { + "errorType": "syntax", + "line": 2, + "location": "student", + "errorLine": "function reassign_x() { g }", + "errorExplanation": "Missing semicolon at the end of statement" + } + ] + } + ] }) -}, 10000) +}) -test('grader OK, student syntaxError', async () => { - const results = await runAll(makeAwsEvent(grader.valid, student.invalid.syntax)) - results.map(result => { - // One result per student program, each result is a GraderError - expect(result.resultType).toBe('error') - // each GraderError is a syntaxError at the correct line - result.errors.map(error => expect(error).toEqual({ - errorType: 'syntax', - line: 2, - location: 'student' - })) +test('prepend OK, postpend OK, testCases OK, student timeoutError', async () => { + const results = await runAll(makeAwsEvent({ + prependProgram: grader.validPrepend, + studentProgram: student.invalid.timeout!, + postpendProgram: grader.validPostpend, + testCases: grader.validTestcases})) + expect(results).toEqual({ + "totalScore": 0, + "results": [ + { + "resultType": "error", + "errors": [ + { + "errorType": "timeout" + } + ] + }, + { + "resultType": "error", + "errors": [ + { + "errorType": "timeout" + } + ] + }, + { + "resultType": "error", + "errors": [ + { + "errorType": "timeout" + } + ] + } + ] }) }) -test('grader runtimeError, student OK', async () => { - const results = await runAll(makeAwsEvent(grader.invalid.runtime, student.valid.correct)) - results.map(result => { - // One result per student program, each result is a GraderError - expect(result.resultType).toBe('error') - // each GraderError is a runtimeError at the correct line - result.errors.map(error => expect(error).toEqual({ - errorType: 'runtime', - line: 2, - location: 'grader' - })) - }) +test('prepend OK, postpend OK, testCases runtimeError, student OK', async () => { + const results = await runAll(makeAwsEvent({ + prependProgram: grader.validPrepend, + studentProgram: student.valid.correct, + postpendProgram: grader.validPostpend, + testCases: grader.invalidTestcases!.runtime})) + expect(results).toEqual({ + "totalScore": 0, + "results": [ + { + "resultType": "error", + "errors": [ + { + "errorType": "runtime", + "line": 1, + "location": "testcase", + "errorLine": "check();", + "errorExplanation": "Name check not declared" + } + ] + } + ] + }) }) -test('grader syntaxError, student OK', async () => { - const results = await runAll(makeAwsEvent(grader.invalid.syntax, student.valid.correct)) - results.map(result => { - // One result per student program, each result is a GraderError - expect(result.resultType).toBe('error') - // each GraderError is a runtimeError at the correct line - result.errors.map(error => expect(error).toEqual({ - errorType: 'syntax', - line: 5, - location: 'grader' - })) - }) +test('prepend OK, postpend OK, testCases syntaxError, student OK', async () => { + const results = await runAll(makeAwsEvent({ + prependProgram: grader.validPrepend, + studentProgram: student.valid.correct, + postpendProgram: grader.validPostpend, + testCases: grader.invalidTestcases!.syntax})) + expect(results).toEqual({ + "totalScore": 0, + "results": [ + { + "resultType": "error", + "errors": [ + { + "errorType": "syntax", + "line": 1, + "location": "testcase", + "errorLine": "check_x(x, 1)", + "errorExplanation": "Missing semicolon at the end of statement" + } + ] + } + ] + }) +}) + +test('prepend runtime, postpend OK, testCases OK, student OK', async () => { + const results = await runAll(makeAwsEvent({ + prependProgram: grader.invalidPrepend!.runtime, + studentProgram: student.valid.correct, + postpendProgram: grader.validPostpend, + testCases: grader.validTestcases})) + expect(results).toEqual({ + "totalScore": 0, + "results": [ + { + "resultType": "error", + "errors": [ + { + "errorType": "runtime", + "line": 3, + "location": "prepend", + "errorLine": "let arr = list1();", + "errorExplanation": "Name list1 not declared" + } + ] + }, + { + "resultType": "error", + "errors": [ + { + "errorType": "runtime", + "line": 3, + "location": "prepend", + "errorLine": "let arr = list1();", + "errorExplanation": "Name list1 not declared" + } + ] + }, + { + "resultType": "error", + "errors": [ + { + "errorType": "runtime", + "line": 3, + "location": "prepend", + "errorLine": "let arr = list1();", + "errorExplanation": "Name list1 not declared" + } + ] + } + ] + }) +}) + +test('prepend syntax, postpend OK, testCases OK, student OK', async () => { + const results = await runAll(makeAwsEvent({ + prependProgram: grader.invalidPrepend!.syntax, + studentProgram: student.valid.correct, + postpendProgram: grader.validPostpend, + testCases: grader.validTestcases})) + expect(results).toEqual({ + "totalScore": 0, + "results": [ + { + "resultType": "error", + "errors": [ + { + "errorType": "syntax", + "line": 3, + "location": "prepend", + "errorLine": "let arr = []", + "errorExplanation": "Missing semicolon at the end of statement" + } + ] + }, + { + "resultType": "error", + "errors": [ + { + "errorType": "syntax", + "line": 3, + "location": "prepend", + "errorLine": "let arr = []", + "errorExplanation": "Missing semicolon at the end of statement" + } + ] + }, + { + "resultType": "error", + "errors": [ + { + "errorType": "syntax", + "line": 3, + "location": "prepend", + "errorLine": "let arr = []", + "errorExplanation": "Missing semicolon at the end of statement" + } + ] + } + ] + }) +}) + +test('prepend OK, postpend runtime, testCases OK, student OK', async () => { + const results = await runAll(makeAwsEvent({ + prependProgram: grader.validPrepend, + studentProgram: student.valid.correct, + postpendProgram: grader.invalidPostpend!.runtime, + testCases: grader.validTestcases})) + expect(results).toEqual({ + "totalScore": 0, + "results": [ + { + "resultType": "error", + "errors": [ + { + "errorType": "runtime", + "line": 1, + "location": "postpend", + "errorLine": "a();", + "errorExplanation": "Name a not declared" + } + ] + }, + { + "resultType": "error", + "errors": [ + { + "errorType": "runtime", + "line": 1, + "location": "postpend", + "errorLine": "a();", + "errorExplanation": "Name a not declared" + } + ] + }, + { + "resultType": "error", + "errors": [ + { + "errorType": "runtime", + "line": 1, + "location": "postpend", + "errorLine": "a();", + "errorExplanation": "Name a not declared" + } + ] + } + ] + }) +}) + +test('prepend OK, postpend runtime, testCases OK, student OK', async () => { + const results = await runAll(makeAwsEvent({ + prependProgram: grader.validPrepend, + studentProgram: student.valid.correct, + postpendProgram: grader.invalidPostpend!.syntax, + testCases: grader.validTestcases})) + expect(results).toEqual({ + "totalScore": 0, + "results": [ + { + "resultType": "error", + "errors": [ + { + "errorType": "syntax", + "line": 1, + "location": "postpend", + "errorLine": "a()", + "errorExplanation": "Missing semicolon at the end of statement" + } + ] + }, + { + "resultType": "error", + "errors": [ + { + "errorType": "syntax", + "line": 1, + "location": "postpend", + "errorLine": "a()", + "errorExplanation": "Missing semicolon at the end of statement" + } + ] + }, + { + "resultType": "error", + "errors": [ + { + "errorType": "syntax", + "line": 1, + "location": "postpend", + "errorLine": "a()", + "errorExplanation": "Missing semicolon at the end of statement" + } + ] + } + ] + }) }) diff --git a/src/__tests__/test_chapt1.ts b/src/__tests__/test_chapt1.ts deleted file mode 100644 index e6be791..0000000 --- a/src/__tests__/test_chapt1.ts +++ /dev/null @@ -1,103 +0,0 @@ -import { grader, student } from './examples/chap1' -import { awsEventFactory } from './helpers' -import { runAll } from '../index' - -const makeAwsEvent = awsEventFactory({ - chapter: 1, - external: { - name: 'NONE', - symbols: [] - }, - globals: [] -}) - -test('grader OK, student OK, correct', async () => { - const results = await runAll(makeAwsEvent(grader.valid, student.valid.correct)) - expect(results).toEqual([ - {'grade': 1, 'resultType': 'pass'}, - {'grade': 4, 'resultType': 'pass'} - ]) -}) - -test('grader OK, student OK, partial', async () => { - const results = await runAll(makeAwsEvent(grader.valid, student.valid.partial)) - expect(results).toEqual([ - {'grade': 0, 'resultType': 'pass'}, - {'grade': 4, 'resultType': 'pass'} - ]) -}) - -test('grader OK, student OK, wrong', async () => { - const results = await runAll(makeAwsEvent(grader.valid, student.valid.wrong)) - expect(results).toEqual([ - {'grade': 0, 'resultType': 'pass'}, - {'grade': 0, 'resultType': 'pass'} - ]) -}) - -test('grader OK, student runtimeError', async () => { - const results = await runAll(makeAwsEvent(grader.valid, student.invalid.runtime)) - results.map(result => { - // One result per student program, each result is a GraderError - expect(result.resultType).toBe('error') - // each GraderError is a runtimeError at the correct line - result.errors.map(error => expect(error).toEqual({ - errorType: 'runtime', - line: 1, - location: 'student' - })) - }) -}) - -test('grader OK, student timeoutError', async () => { - const results = await runAll(makeAwsEvent(grader.valid, student.invalid.timeout)) - results.map(result => { - expect(result.resultType).toBe('error') - expect(result.errors).toHaveLength(1) - expect(result.errors[0]).toEqual({ - errorType: 'timeout' - }) - }) -}, 10000) - -test('grader OK, student syntaxError', async () => { - const results = await runAll(makeAwsEvent(grader.valid, student.invalid.syntax)) - results.map(result => { - // One result per student program, each result is a GraderError - expect(result.resultType).toBe('error') - // each GraderError is a syntaxError at the correct line - result.errors.map(error => expect(error).toEqual({ - errorType: 'syntax', - line: 1, - location: 'student' - })) - }) -}) - -test('grader runtimeError, student OK', async () => { - const results = await runAll(makeAwsEvent(grader.invalid.runtime, student.valid.correct)) - results.map(result => { - // One result per student program, each result is a GraderError - expect(result.resultType).toBe('error') - // each GraderError is a runtimeError at the correct line - result.errors.map(error => expect(error).toEqual({ - errorType: 'runtime', - line: 2, - location: 'grader' - })) - }) -}) - -test('grader syntaxError, student OK', async () => { - const results = await runAll(makeAwsEvent(grader.invalid.syntax, student.valid.correct)) - results.map(result => { - // One result per student program, each result is a GraderError - expect(result.resultType).toBe('error') - // each GraderError is a runtimeError at the correct line - result.errors.map(error => expect(error).toEqual({ - errorType: 'syntax', - line: 5, - location: 'grader' - })) - }) -}) diff --git a/src/__tests__/test_curves.ts b/src/__tests__/test_curves.ts index 7f35a79..781b0a0 100644 --- a/src/__tests__/test_curves.ts +++ b/src/__tests__/test_curves.ts @@ -1,6 +1,7 @@ import { grader, student } from './examples/curves' import { awsEventFactory } from './helpers' import { runAll } from '../index' +import 'jest' const makeAwsEvent = awsEventFactory({ chapter: 2, @@ -34,30 +35,42 @@ const makeAwsEvent = awsEventFactory({ }) test('curve grader correct', async () => { - const results = await runAll(makeAwsEvent(grader.pixel, student.valid.correct)) - expect(results).toEqual([ - {'grade': 1, 'resultType': 'pass'} - ]) + const results = await runAll(makeAwsEvent({ + prependProgram: grader.validPrepend, + studentProgram: student.valid.correct, + postpendProgram: grader.validPostpend, + testCases: grader.validTestcases + })) + expect(results).toEqual( + { + "totalScore": 1, + "results": [ + { + "resultType": "pass", + "score": 1 + } + ] + } + ) }) test('wrong answer', async () => { - const results = await runAll(makeAwsEvent(grader.pixel, student.valid.wrong)) - expect(results).toEqual([ - {'grade': 0, 'resultType': 'pass'} - ]) -}) - -test('scan grader correct', async () => { - const results = await runAll(makeAwsEvent(grader.scan, student.valid.correct)) - expect(results).toEqual([ - {'grade': 1, 'resultType': 'pass'} - ]) -}) - -test('scan grader wrong', async () => { - const results = await runAll(makeAwsEvent(grader.scan, student.valid.wrong)) - expect(results).toEqual([ - {'grade': 0, 'resultType': 'pass'} - ]) -}) - + const results = await runAll(makeAwsEvent({ + prependProgram: grader.validPrepend, + studentProgram: student.valid.wrong, + postpendProgram: grader.validPostpend, + testCases: grader.validTestcases + })) + expect(results).toEqual( + { + "totalScore": 0, + "results": [ + { + "resultType": "fail", + "expected": "true", + "actual": "false" + } + ] + } + ) +}) \ No newline at end of file diff --git a/src/__tests__/test_runes2d.ts b/src/__tests__/test_runes2d.ts index 10faf97..b8271a2 100644 --- a/src/__tests__/test_runes2d.ts +++ b/src/__tests__/test_runes2d.ts @@ -1,6 +1,7 @@ import { grader, student } from './examples/runes2d' import { awsEventFactory } from './helpers' import { runAll } from '../index' +import 'jest' const makeAwsEvent = awsEventFactory({ chapter: 1, @@ -53,31 +54,93 @@ const makeAwsEvent = awsEventFactory({ }) test('rune grader OK, student OK, correct', async () => { - const results = await runAll(makeAwsEvent(grader.valid, student.valid.correct)) - expect(results).toEqual([ - {'grade': 2, 'resultType': 'pass'}, - {'grade': 2, 'resultType': 'pass'}, - {'grade': 2, 'resultType': 'pass'}, - {'grade': 2, 'resultType': 'pass'}, - ]) -}) + const results = await runAll(makeAwsEvent({ + prependProgram: grader.validPrepend, + studentProgram: student.valid.correct, + postpendProgram: grader.validPostpend, + testCases: grader.validTestcases})) + expect(results).toEqual({ + "totalScore": 4, + "results": [ + { + "resultType": "pass", + "score": 1 + }, + { + "resultType": "pass", + "score": 1 + }, + { + "resultType": "pass", + "score": 1 + }, + { + "resultType": "pass", + "score": 1 + } + ] + }) +}, 10000) test('rune grader OK, student OK, wrong', async () => { - const results = await runAll(makeAwsEvent(grader.valid, student.valid.wrong)) - expect(results).toEqual([ - {'grade': 0, 'resultType': 'pass'}, - {'grade': 0, 'resultType': 'pass'}, - {'grade': 0, 'resultType': 'pass'}, - {'grade': 0, 'resultType': 'pass'}, - ]) -}) + const results = await runAll(makeAwsEvent({ + prependProgram: grader.validPrepend, + studentProgram: student.valid.wrong, + postpendProgram: grader.validPostpend, + testCases: grader.validTestcases})) + expect(results).toEqual({ + "totalScore": 0, + "results": [ + { + "resultType": "fail", + "expected": "true", + "actual": "false" + }, + { + "resultType": "fail", + "expected": "true", + "actual": "false" + }, + { + "resultType": "fail", + "expected": "true", + "actual": "false" + }, + { + "resultType": "fail", + "expected": "true", + "actual": "false" + } + ] + }) +}, 10000) test('rune grader OK, student OK, partial', async () => { - const results = await runAll(makeAwsEvent(grader.valid, student.valid.partial)) - expect(results).toEqual([ - {'grade': 2, 'resultType': 'pass'}, - {'grade': 0, 'resultType': 'pass'}, - {'grade': 2, 'resultType': 'pass'}, - {'grade': 2, 'resultType': 'pass'}, - ]) -}) \ No newline at end of file + const results = await runAll(makeAwsEvent({ + prependProgram: grader.validPrepend, + studentProgram: student.valid.partial!, + postpendProgram: grader.validPostpend, + testCases: grader.validTestcases})) + expect(results).toEqual({ + "totalScore": 3, + "results": [ + { + "resultType": "pass", + "score": 1 + }, + { + "resultType": "fail", + "expected": "true", + "actual": "false" + }, + { + "resultType": "pass", + "score": 1 + }, + { + "resultType": "pass", + "score": 1 + } + ] + }) +}, 10000) \ No newline at end of file diff --git a/src/__tests__/test_runes3d.ts b/src/__tests__/test_runes3d.ts index 966c93b..3823e9b 100644 --- a/src/__tests__/test_runes3d.ts +++ b/src/__tests__/test_runes3d.ts @@ -1,6 +1,7 @@ import { grader, student } from './examples/runes3d' import { awsEventFactory } from './helpers' -import { runAll } from '..' +import { runAll } from '../index' +import 'jest' const makeAwsEvent = awsEventFactory({ chapter: 1, @@ -53,31 +54,94 @@ const makeAwsEvent = awsEventFactory({ }) test('rune grader OK, student OK, correct', async () => { - const results = await runAll(makeAwsEvent(grader.valid, student.valid.correct)) - expect(results).toEqual([ - {'grade': 2, 'resultType': 'pass'}, - {'grade': 2, 'resultType': 'pass'}, - {'grade': 2, 'resultType': 'pass'}, - {'grade': 2, 'resultType': 'pass'}, - ]) -}) + const results = await runAll(makeAwsEvent({ + prependProgram: grader.validPrepend, + studentProgram: student.valid.correct, + postpendProgram: grader.validPostpend, + testCases: grader.validTestcases})) + expect(results).toEqual({ + "totalScore": 4, + "results": [ + { + "resultType": "pass", + "score": 1 + }, + { + "resultType": "pass", + "score": 1 + }, + { + "resultType": "pass", + "score": 1 + }, + { + "resultType": "pass", + "score": 1 + } + ] + }) +}, 10000) test('rune grader OK, student OK, wrong', async () => { - const results = await runAll(makeAwsEvent(grader.valid, student.valid.wrong)) - expect(results).toEqual([ - {'grade': 0, 'resultType': 'pass'}, - {'grade': 0, 'resultType': 'pass'}, - {'grade': 0, 'resultType': 'pass'}, - {'grade': 0, 'resultType': 'pass'}, - ]) -}) + const results = await runAll(makeAwsEvent({ + prependProgram: grader.validPrepend, + studentProgram: student.valid.wrong, + postpendProgram: grader.validPostpend, + testCases: grader.validTestcases})) + expect(results).toEqual({ + "totalScore": 0, + "results": [ + { + "resultType": "fail", + "expected": "true", + "actual": "false" + }, + { + "resultType": "fail", + "expected": "true", + "actual": "false" + }, + { + "resultType": "fail", + "expected": "true", + "actual": "false" + }, + { + "resultType": "fail", + "expected": "true", + "actual": "false" + } + ] + }) +}, 10000) test('rune grader OK, student OK, partial', async () => { - const results = await runAll(makeAwsEvent(grader.valid, student.valid.partial)) - expect(results).toEqual([ - {'grade': 2, 'resultType': 'pass'}, - {'grade': 0, 'resultType': 'pass'}, - {'grade': 2, 'resultType': 'pass'}, - {'grade': 0, 'resultType': 'pass'}, - ]) -}) \ No newline at end of file + const results = await runAll(makeAwsEvent({ + prependProgram: grader.validPrepend, + studentProgram: student.valid.partial!, + postpendProgram: grader.validPostpend, + testCases: grader.validTestcases})) + expect(results).toEqual({ + "totalScore": 2, + "results": [ + { + "resultType": "pass", + "score": 1 + }, + { + "resultType": "fail", + "expected": "true", + "actual": "false" + }, + { + "resultType": "pass", + "score": 1 + }, + { + "resultType": "fail", + "expected": "true", + "actual": "false" + } + ] + }) +}, 10000) \ No newline at end of file diff --git a/src/__tests__/test_sounds.ts b/src/__tests__/test_sounds.ts index 4a40636..572b4ac 100644 --- a/src/__tests__/test_sounds.ts +++ b/src/__tests__/test_sounds.ts @@ -1,6 +1,7 @@ import { grader, student } from './examples/sounds' import { awsEventFactory } from './helpers' -import { runAll } from '..' +import { runAll } from '../index' +import 'jest' const makeAwsEvent = awsEventFactory({ chapter: 2, @@ -39,28 +40,81 @@ const makeAwsEvent = awsEventFactory({ }) test('sound grader OK, student OK, correct', async () => { - const results = await runAll(makeAwsEvent(grader.valid, student.valid.correct)) - expect(results).toEqual([ - {'grade': 1, 'resultType': 'pass'}, - {'grade': 3, 'resultType': 'pass'}, - {'grade': 2, 'resultType': 'pass'}, - ]) + const results = await runAll(makeAwsEvent({ + prependProgram: grader.validPrepend, + studentProgram: student.valid.correct, + postpendProgram: grader.validPostpend, + testCases: grader.validTestcases})) + expect(results).toEqual({ + "totalScore": 3, + "results": [ + { + "resultType": "pass", + "score": 1 + }, + { + "resultType": "pass", + "score": 1 + }, + { + "resultType": "pass", + "score": 1 + } + ] + }) }) test('sound grader OK, student OK, wrong', async () => { - const results = await runAll(makeAwsEvent(grader.valid, student.valid.wrong)) - expect(results).toEqual([ - {'grade': 0, 'resultType': 'pass'}, - {'grade': 0, 'resultType': 'pass'}, - {'grade': 0, 'resultType': 'pass'}, - ]) + const results = await runAll(makeAwsEvent({ + prependProgram: grader.validPrepend, + studentProgram: student.valid.wrong, + postpendProgram: grader.validPostpend, + testCases: grader.validTestcases})) + expect(results).toEqual({ + "totalScore": 0, + "results": [ + { + "resultType": "fail", + "expected": "true", + "actual": "false" + }, + { + "resultType": "fail", + "expected": "3", + "actual": "0" + }, + { + "resultType": "fail", + "expected": "2", + "actual": "0" + } + ] + }) }) test('sound grader OK, student OK, partial', async () => { - const results = await runAll(makeAwsEvent(grader.valid, student.valid.partial)) - expect(results).toEqual([ - {'grade': 1, 'resultType': 'pass'}, - {'grade': 1, 'resultType': 'pass'}, - {'grade': 1, 'resultType': 'pass'}, - ]) + const results = await runAll(makeAwsEvent({ + prependProgram: grader.validPrepend, + studentProgram: student.valid.partial!, + postpendProgram: grader.validPostpend, + testCases: grader.validTestcases})) + expect(results).toEqual({ + "totalScore": 1, + "results": [ + { + "resultType": "pass", + "score": 1 + }, + { + "resultType": "fail", + "expected": "3", + "actual": "1" + }, + { + "resultType": "fail", + "expected": "2", + "actual": "1" + } + ] + }) }, 10000) diff --git a/src/__tests__/test_streams.ts b/src/__tests__/test_streams.ts index 7a3c30c..cf68504 100644 --- a/src/__tests__/test_streams.ts +++ b/src/__tests__/test_streams.ts @@ -1,6 +1,7 @@ import { grader, student } from './examples/streams' import { awsEventFactory } from './helpers' import { runAll } from '../index' +import 'jest' const makeAwsEvent = awsEventFactory({ chapter: 3, @@ -26,41 +27,128 @@ const makeAwsEvent = awsEventFactory({ }) test('stream grader OK, student OK, correct', async () => { - const results = await runAll(makeAwsEvent(grader.valid, student.valid.correct)) - expect(results).toEqual([ - {'grade': 1, 'resultType': 'pass'}, - {'grade': 2, 'resultType': 'pass'}, - {'grade': 1, 'resultType': 'pass'}, - {'grade': 1, 'resultType': 'pass'}, - ]) + const results = await runAll(makeAwsEvent({ + prependProgram: grader.validPrepend, + studentProgram: student.valid.correct, + postpendProgram: grader.validPostpend, + testCases: grader.validTestcases})) + expect(results).toEqual({ + "totalScore": 4, + "results": [ + { + "resultType": "pass", + "score": 1 + }, + { + "resultType": "pass", + "score": 1 + }, + { + "resultType": "pass", + "score": 1 + }, + { + "resultType": "pass", + "score": 1 + } + ] + }) }) test('stream grader OK, student OK, wrong', async () => { - const results = await runAll(makeAwsEvent(grader.valid, student.valid.wrong)) - expect(results).toEqual([ - {'grade': 0, 'resultType': 'pass'}, - {'grade': 0, 'resultType': 'pass'}, - {'grade': 1, 'resultType': 'pass'}, - {'grade': 1, 'resultType': 'pass'}, - ]) + const results = await runAll(makeAwsEvent({ + prependProgram: grader.validPrepend, + studentProgram: student.valid.wrong, + postpendProgram: grader.validPostpend, + testCases: grader.validTestcases})) + expect(results).toEqual({ + "totalScore": 2, + "results": [ + { + "resultType": "fail", + "expected": "true", + "actual": "false" + }, + { + "resultType": "fail", + "expected": "true", + "actual": "false" + }, + { + "resultType": "pass", + "score": 1 + }, + { + "resultType": "pass", + "score": 1 + } + ] + }) }) test('stream grader OK, student OK, partial', async () => { - const results = await runAll(makeAwsEvent(grader.valid, student.valid.partial)) - expect(results).toEqual([ - {'grade': 1, 'resultType': 'pass'}, - {'grade': 0, 'resultType': 'pass'}, - {'grade': 1, 'resultType': 'pass'}, - {'grade': 1, 'resultType': 'pass'}, - ]) + const results = await runAll(makeAwsEvent({ + prependProgram: grader.validPrepend, + studentProgram: student.valid.partial!, + postpendProgram: grader.validPostpend, + testCases: grader.validTestcases})) + expect(results).toEqual({ + "totalScore": 3, + "results": [ + { + "resultType": "pass", + "score": 1 + }, + { + "resultType": "fail", + "expected": "true", + "actual": "false" + }, + { + "resultType": "pass", + "score": 1 + }, + { + "resultType": "pass", + "score": 1 + } + ] + }) }) test('stream grader OK, student runtimeError', async () => { - const results = await runAll(makeAwsEvent(grader.valid, student.invalid.runtime)) - expect(results).toEqual([ - {'grade': 1, 'resultType': 'pass'}, - {'grade': 2, 'resultType': 'pass'}, - {'grade': 1, 'resultType': 'pass'}, - {'errors': [{'errorType': 'runtime', 'line': 3, 'location': 'grader'}], 'resultType': 'error'}, - ]) + const results = await runAll(makeAwsEvent({ + prependProgram: grader.validPrepend, + studentProgram: student.invalid.runtime, + postpendProgram: grader.validPostpend, + testCases: grader.validTestcases})) + expect(results).toEqual({ + "totalScore": 3, + "results": [ + { + "resultType": "pass", + "score": 1 + }, + { + "resultType": "pass", + "score": 1 + }, + { + "resultType": "pass", + "score": 1 + }, + { + "resultType": "error", + "errors": [ + { + "errorType": "runtime", + "line": 3, + "location": "testcase", + "errorLine": "return is_stream(odd_stream, 1);", + "errorExplanation": "RangeError: Maximum call stack size exceeded" + } + ] + } + ] + }) }) diff --git a/src/__tests__/test_utils.ts b/src/__tests__/test_utils.ts deleted file mode 100644 index c716c47..0000000 --- a/src/__tests__/test_utils.ts +++ /dev/null @@ -1,41 +0,0 @@ -import { grader, student } from './examples/util' -import { awsEventFactory } from './helpers' -import { runAll } from '../index' - -const makeAwsEvent = awsEventFactory({ - chapter: 1, - external: { - name: 'NONE', - symbols: [ - '__track_function', - '__reset_function_count', - '__get_function_count', - 'make_funny', - ] - }, - globals: [ - ['make_funny', 'str => str + ", haha!";'], - ['__tracking_function', 'global.__track_function("make_funny");'], - ] -}) - -test('correct wrapped function', async () => { - const results = await runAll(makeAwsEvent(grader.valid, student.valid.correct)) - expect(results).toEqual([ - {'grade': 2, 'resultType': 'pass'}, - ]) -}) - -test('did not use function', async () => { - const results = await runAll(makeAwsEvent(grader.valid, student.valid.partial)) - expect(results).toEqual([ - {'grade': 1, 'resultType': 'pass'}, - ]) -}) - -test('incorrect answer', async () => { - const results = await runAll(makeAwsEvent(grader.valid, student.valid.wrong)) - expect(results).toEqual([ - {'grade': 0, 'resultType': 'pass'}, - ]) -}) \ No newline at end of file diff --git a/src/index.ts b/src/index.ts index ff6e463..33979fd 100644 --- a/src/index.ts +++ b/src/index.ts @@ -4,10 +4,11 @@ import { SourceError } from 'js-slang/dist/types' exports.handler = function(event: AwsEvent, context:any, callback:Function) { - this.runAll(event).then((result:any) => callback(null, result)) + const _ = require("./index.js") + _.runAll(event).then((result:any) => callback(null, result)) }; -const TIMEOUT_DURATION = parseInt(process.env.TIMEOUT!, 10) // in milliseconds +const TIMEOUT_DURATION = process.env.TIMEOUT ? parseInt(process.env.TIMEOUT!, 10) : 500 // in milliseconds /** * @property globals - an array of two element string arrays. The first element From ee028c438fe106dbff24dabadb59267e6cef60a7 Mon Sep 17 00:00:00 2001 From: Shuming Date: Mon, 18 Mar 2019 23:36:56 +0800 Subject: [PATCH 08/12] formatted --- src/__tests__/examples/chap1.ts | 42 +- src/__tests__/examples/chap3.ts | 48 +- src/__tests__/examples/curves.ts | 29 +- src/__tests__/examples/runes3d.ts | 36 +- src/__tests__/examples/streams.ts | 36 +- src/__tests__/helpers.ts | 12 +- src/__tests__/test_chap1.ts | 354 +++++++------- src/__tests__/test_chap3.ts | 632 +++++++++++++------------ src/__tests__/test_curve_comparison.ts | 4 +- src/__tests__/test_runes2d.ts | 121 ++--- src/__tests__/test_runes3d.ts | 123 ++--- src/__tests__/test_sounds.ts | 97 ++-- src/__tests__/test_streams.ts | 170 +++---- src/index.ts | 65 +-- 14 files changed, 917 insertions(+), 852 deletions(-) diff --git a/src/__tests__/examples/chap1.ts b/src/__tests__/examples/chap1.ts index 2e9d879..8520e12 100644 --- a/src/__tests__/examples/chap1.ts +++ b/src/__tests__/examples/chap1.ts @@ -25,7 +25,7 @@ const invalidStudentSyntax = // Does not compute fast enough to exceed max call stacks, relies on timeout const invalidStudentTimeout = - `const f = i => i < -3 ? 0 : f(i+1) + f(i+2);` + `const f = i => i < -3 ? 0 : f(i+1) + f(i+2);` export const student: Student = { valid: { @@ -41,27 +41,37 @@ export const student: Student = { } const invalidTestcaseRuntime = [ - { program: `g(1);`, - answer: "1", - score: 1 } + { + program: `g(1);`, + answer: "1", + score: 1 + } ] const invalidTestcaseSyntax = [ - { program: `f(1)`, - answer: "1", - score: 1 } + { + program: `f(1)`, + answer: "1", + score: 1 + } ] const validTestcases: TestCase[] = [ - { program: `f(1);`, - answer: "1", - score: 1 }, - { program: `f(3);`, - answer: "2", - score: 1 }, - { program: `f(5);`, - answer: "5", - score: 1 } + { + program: `f(1);`, + answer: "1", + score: 1 + }, + { + program: `f(3);`, + answer: "2", + score: 1 + }, + { + program: `f(5);`, + answer: "5", + score: 1 + } ] export const grader: Grader = { diff --git a/src/__tests__/examples/chap3.ts b/src/__tests__/examples/chap3.ts index 0a0cb12..c2c99c2 100644 --- a/src/__tests__/examples/chap3.ts +++ b/src/__tests__/examples/chap3.ts @@ -133,47 +133,57 @@ const validPostpend = ` function check_obj(f, obj) { return f(obj); }` - + const invalidTestcaseRuntime = [ - { program: `check();`, - answer: "true", - score: 1 } + { + program: `check();`, + answer: "true", + score: 1 + } ] const invalidTestcaseSyntax = [ - { program: `check_x(x, 1)`, - answer: "true", - score: 1 }, + { + program: `check_x(x, 1)`, + answer: "true", + score: 1 + }, ] const validTestcases = [ - { program: - `const a1 = check_x(x, 1); + { + program: + `const a1 = check_x(x, 1); reassign_x(); const a2 = check_x(x, 2); a1 === a2;`, - answer: "true", - score: 1 }, - { program: - `const a1 = check_arr(is_empty_list, arr); + answer: "true", + score: 1 + }, + { + program: + `const a1 = check_arr(is_empty_list, arr); assign_array(); const f = (arr) => arr[0] === 'a' && arr[1] === 'b'; const a2 = check_arr(f, arr); a1 === a2;`, - answer: "true", - score: 1 }, - { program: - `const f = (obj) => obj.a === undefined && obj.b === undefined; + answer: "true", + score: 1 + }, + { + program: + `const f = (obj) => obj.a === undefined && obj.b === undefined; const a1 = check_obj(f, obj); assign_object(); const g = (obj) => obj.a === 1 && obj.b === 2; const a2 = check_obj(g, obj); a1 === a2;`, - answer: "true", - score: 1 } + answer: "true", + score: 1 + } ] export const grader: Grader = { diff --git a/src/__tests__/examples/curves.ts b/src/__tests__/examples/curves.ts index de06f47..83d6d95 100644 --- a/src/__tests__/examples/curves.ts +++ b/src/__tests__/examples/curves.ts @@ -1,7 +1,7 @@ import { Grader, Student } from './types'; const validStudentCorrect = - `function forward_sine(t) { + `function forward_sine(t) { return make_point(t, math_sin(t * math_PI)); } @@ -12,7 +12,7 @@ const validStudentCorrect = ` const validStudentWrong = - `function forward_sine(t) { + `function forward_sine(t) { return make_point(t, math_sin(t * math_PI)); } @@ -24,18 +24,19 @@ const validStudentWrong = ` export const student: Student = { - valid: { - correct: validStudentCorrect, - wrong: validStudentWrong, - }, - invalid: { - runtime: "a;", - syntax: "a" - } + valid: { + correct: validStudentCorrect, + wrong: validStudentWrong, + }, + invalid: { + runtime: "a;", + syntax: "a" + } } const validGrader = [ - { program: `__check_canvas( + { + program: `__check_canvas( draw_connected_squeezed_to_window, 2000, backward_sine, @@ -48,7 +49,7 @@ const validGrader = [ ] export const grader: Grader = { - validPrepend: "", - validTestcases: validGrader, - validPostpend: "" + validPrepend: "", + validTestcases: validGrader, + validPostpend: "" } \ No newline at end of file diff --git a/src/__tests__/examples/runes3d.ts b/src/__tests__/examples/runes3d.ts index 8cb5f58..7f396d1 100644 --- a/src/__tests__/examples/runes3d.ts +++ b/src/__tests__/examples/runes3d.ts @@ -44,7 +44,8 @@ export const student: Student = { } const validGrader = [ -{ program: ` + { + program: ` function rune_testcase_a() { const expected_result = overlay(heart_bb, nova_bb); const actual_result = a(); @@ -52,20 +53,22 @@ const validGrader = [ } rune_testcase_a(); `, -answer: "true", -score: 1 -}, -{ program: ` + answer: "true", + score: 1 + }, + { + program: ` function rune_testcase_b() { const expected_result = overlay_frac(0.25, quarter_turn_right(nova_bb), scale(0.4, heart_bb)); const actual_result = b(); return __are_pictures_equal(actual_result, expected_result); } rune_testcase_b(); -`, answer: "true", -score: 1 -}, -{ program: ` +`, answer: "true", + score: 1 + }, + { + program: ` function rune_testcase_c() { const expected_result = overlay(stack(beside(nova_bb, heart_bb), beside(blank_bb, blank_bb)), stack(beside(blank_bb, blank_bb), beside(rcross_bb, circle_bb))); const actual_result = c(nova_bb, heart_bb, rcross_bb, circle_bb); @@ -73,10 +76,11 @@ score: 1 } rune_testcase_c(); `, -answer: "true", -score: 1 -}, -{ program: ` + answer: "true", + score: 1 + }, + { + program: ` function rune_testcase_d() { function tree(rune, n) { if (n === 1) { @@ -92,9 +96,9 @@ score: 1 } rune_testcase_d(); `, -answer: "true", -score: 1 -} + answer: "true", + score: 1 + } ] export const grader: Grader = { diff --git a/src/__tests__/examples/streams.ts b/src/__tests__/examples/streams.ts index d177a1f..83d7ed6 100644 --- a/src/__tests__/examples/streams.ts +++ b/src/__tests__/examples/streams.ts @@ -46,44 +46,48 @@ export const student: Student = { } const validGrader = [ -{program : ` + { + program: ` function stream_testcase_a() { const lst = stream_to_list(stream_take_max(odd_stream, 3)); return equal(lst, list(1, 3, 5)); } stream_testcase_a(); `, - answer: "true", - score: 1 -}, -{program : ` + answer: "true", + score: 1 + }, + { + program: ` function stream_testcase_b() { const lst = stream_to_list(stream_take_max(odd_stream, 5)); return equal(lst, list(1, 3, 5, 7, 9)); } stream_testcase_b(); `, - answer: "true", - score: 1 -}, -{program : ` + answer: "true", + score: 1 + }, + { + program: ` function stream_testcase_c() { return !is_empty_list(stream_member(3, odd_stream)) && stream_ref(odd_stream, 1) === 3; } stream_testcase_c(); `, - answer: "true", - score: 1 -}, -{program : ` + answer: "true", + score: 1 + }, + { + program: ` function stream_testcase_d() { return is_stream(odd_stream, 1); } stream_testcase_d(); - `, answer: "true", - score: 1 -} + `, answer: "true", + score: 1 + } ] export const grader: Grader = { diff --git a/src/__tests__/helpers.ts b/src/__tests__/helpers.ts index f2db8b2..6688f17 100644 --- a/src/__tests__/helpers.ts +++ b/src/__tests__/helpers.ts @@ -1,4 +1,4 @@ -import { AwsEvent, Library, TestCase} from '../index' +import { AwsEvent, Library, TestCase } from '../index' type PartialAwsEvent = { @@ -11,10 +11,10 @@ type PartialAwsEvent = { export function awsEventFactory(library: Library) { return (awsEvent: PartialAwsEvent): AwsEvent => ( { - library: library, - prependProgram: awsEvent.prependProgram, - studentProgram: awsEvent.studentProgram, - postpendProgram: awsEvent.postpendProgram, - testCases: awsEvent.testCases, + library: library, + prependProgram: awsEvent.prependProgram, + studentProgram: awsEvent.studentProgram, + postpendProgram: awsEvent.postpendProgram, + testCases: awsEvent.testCases, }) } diff --git a/src/__tests__/test_chap1.ts b/src/__tests__/test_chap1.ts index 295bee0..72e159f 100644 --- a/src/__tests__/test_chap1.ts +++ b/src/__tests__/test_chap1.ts @@ -17,24 +17,25 @@ test('prepend OK, postpend OK, testCases OK, student OK, correct', async () => { prependProgram: grader.validPrepend, studentProgram: student.valid.correct, postpendProgram: grader.validPostpend, - testCases: grader.validTestcases})) + testCases: grader.validTestcases + })) expect(results).toEqual({ "totalScore": 3, "results": [ - { - "resultType": "pass", - "score": 1 - }, - { - "resultType": "pass", - "score": 1 - }, - { - "resultType": "pass", - "score": 1 - } + { + "resultType": "pass", + "score": 1 + }, + { + "resultType": "pass", + "score": 1 + }, + { + "resultType": "pass", + "score": 1 + } ] - }) + }) }) test('prepend OK, postpend OK, testCases OK, student OK, partial', async () => { @@ -42,24 +43,25 @@ test('prepend OK, postpend OK, testCases OK, student OK, partial', async () => { prependProgram: grader.validPrepend, studentProgram: student.valid.partial!, postpendProgram: grader.validPostpend, - testCases: grader.validTestcases})) + testCases: grader.validTestcases + })) expect(results).toEqual({ "totalScore": 3, "results": [ - { - "resultType": "pass", - "score": 1 - }, - { - "resultType": "pass", - "score": 1 - }, - { - "resultType": "pass", - "score": 1 - } + { + "resultType": "pass", + "score": 1 + }, + { + "resultType": "pass", + "score": 1 + }, + { + "resultType": "pass", + "score": 1 + } ] - }) + }) }) test('prepend OK, postpend OK, testCases OK, student OK, wrong', async () => { @@ -67,27 +69,28 @@ test('prepend OK, postpend OK, testCases OK, student OK, wrong', async () => { prependProgram: grader.validPrepend, studentProgram: student.valid.wrong, postpendProgram: grader.validPostpend, - testCases: grader.validTestcases})) + testCases: grader.validTestcases + })) expect(results).toEqual({ "totalScore": 0, "results": [ - { - "resultType": "fail", - "expected": "1", - "actual": "2" - }, - { - "resultType": "fail", - "expected": "2", - "actual": "4" - }, - { - "resultType": "fail", - "expected": "5", - "actual": "6" - } + { + "resultType": "fail", + "expected": "1", + "actual": "2" + }, + { + "resultType": "fail", + "expected": "2", + "actual": "4" + }, + { + "resultType": "fail", + "expected": "5", + "actual": "6" + } ] - }) + }) }) test('prepend OK, postpend OK, testCases OK, student runtimeError', async () => { @@ -95,48 +98,49 @@ test('prepend OK, postpend OK, testCases OK, student runtimeError', async () => prependProgram: grader.validPrepend, studentProgram: student.invalid.runtime, postpendProgram: grader.validPostpend, - testCases: grader.validTestcases})) + testCases: grader.validTestcases + })) expect(results).toEqual({ "totalScore": 0, "results": [ - { - "resultType": "error", - "errors": [ - { - "errorType": "runtime", - "line": 1, - "location": "student", - "errorLine": "const f = i => f(j+1);", - "errorExplanation": "Name j not declared" - } - ] - }, - { - "resultType": "error", - "errors": [ - { - "errorType": "runtime", - "line": 1, - "location": "student", - "errorLine": "const f = i => f(j+1);", - "errorExplanation": "Name j not declared" - } - ] - }, - { - "resultType": "error", - "errors": [ - { - "errorType": "runtime", - "line": 1, - "location": "student", - "errorLine": "const f = i => f(j+1);", - "errorExplanation": "Name j not declared" - } - ] - } + { + "resultType": "error", + "errors": [ + { + "errorType": "runtime", + "line": 1, + "location": "student", + "errorLine": "const f = i => f(j+1);", + "errorExplanation": "Name j not declared" + } + ] + }, + { + "resultType": "error", + "errors": [ + { + "errorType": "runtime", + "line": 1, + "location": "student", + "errorLine": "const f = i => f(j+1);", + "errorExplanation": "Name j not declared" + } + ] + }, + { + "resultType": "error", + "errors": [ + { + "errorType": "runtime", + "line": 1, + "location": "student", + "errorLine": "const f = i => f(j+1);", + "errorExplanation": "Name j not declared" + } + ] + } ] - }) + }) }) test('prepend OK, postpend OK, testCases OK, student syntaxError', async () => { @@ -144,46 +148,47 @@ test('prepend OK, postpend OK, testCases OK, student syntaxError', async () => { prependProgram: grader.validPrepend, studentProgram: student.invalid.syntax, postpendProgram: grader.validPostpend, - testCases: grader.validTestcases})) + testCases: grader.validTestcases + })) expect(results).toEqual({ "totalScore": 0, "results": [ - { - "resultType": "error", - "errors": [ - { - "errorType": "syntax", - "line": 1, - "location": "student", - "errorLine": "const f = i => i === 0 ? 0 : i < 3 ? 1 : f(i-1) + f(i-2)", - "errorExplanation": "Missing semicolon at the end of statement" - } - ] - }, - { - "resultType": "error", - "errors": [ - { - "errorType": "syntax", - "line": 1, - "location": "student", - "errorLine": "const f = i => i === 0 ? 0 : i < 3 ? 1 : f(i-1) + f(i-2)", - "errorExplanation": "Missing semicolon at the end of statement" - } - ] - }, - { - "resultType": "error", - "errors": [ - { - "errorType": "syntax", - "line": 1, - "location": "student", - "errorLine": "const f = i => i === 0 ? 0 : i < 3 ? 1 : f(i-1) + f(i-2)", - "errorExplanation": "Missing semicolon at the end of statement" - } - ] - } + { + "resultType": "error", + "errors": [ + { + "errorType": "syntax", + "line": 1, + "location": "student", + "errorLine": "const f = i => i === 0 ? 0 : i < 3 ? 1 : f(i-1) + f(i-2)", + "errorExplanation": "Missing semicolon at the end of statement" + } + ] + }, + { + "resultType": "error", + "errors": [ + { + "errorType": "syntax", + "line": 1, + "location": "student", + "errorLine": "const f = i => i === 0 ? 0 : i < 3 ? 1 : f(i-1) + f(i-2)", + "errorExplanation": "Missing semicolon at the end of statement" + } + ] + }, + { + "resultType": "error", + "errors": [ + { + "errorType": "syntax", + "line": 1, + "location": "student", + "errorLine": "const f = i => i === 0 ? 0 : i < 3 ? 1 : f(i-1) + f(i-2)", + "errorExplanation": "Missing semicolon at the end of statement" + } + ] + } ] }) }) @@ -193,34 +198,35 @@ test('prepend OK, postpend OK, testCases OK, student timeoutError', async () => prependProgram: grader.validPrepend, studentProgram: student.invalid.timeout!, postpendProgram: grader.validPostpend, - testCases: grader.validTestcases})) + testCases: grader.validTestcases + })) expect(results).toEqual({ "totalScore": 0, "results": [ - { - "resultType": "error", - "errors": [ - { - "errorType": "timeout" - } - ] - }, - { - "resultType": "error", - "errors": [ - { - "errorType": "timeout" - } - ] - }, - { - "resultType": "error", - "errors": [ - { - "errorType": "timeout" - } - ] - } + { + "resultType": "error", + "errors": [ + { + "errorType": "timeout" + } + ] + }, + { + "resultType": "error", + "errors": [ + { + "errorType": "timeout" + } + ] + }, + { + "resultType": "error", + "errors": [ + { + "errorType": "timeout" + } + ] + } ] }) }) @@ -230,24 +236,25 @@ test('prepend OK, postpend OK, testCases runtimeError, student OK', async () => prependProgram: grader.validPrepend, studentProgram: student.valid.correct, postpendProgram: grader.validPostpend, - testCases: grader.invalidTestcases!.runtime})) + testCases: grader.invalidTestcases!.runtime + })) expect(results).toEqual({ "totalScore": 0, "results": [ - { - "resultType": "error", - "errors": [ - { - "errorType": "runtime", - "line": 1, - "location": "testcase", - "errorLine": "g(1);", - "errorExplanation": "Name g not declared" - } - ] - } + { + "resultType": "error", + "errors": [ + { + "errorType": "runtime", + "line": 1, + "location": "testcase", + "errorLine": "g(1);", + "errorExplanation": "Name g not declared" + } + ] + } ] - }) + }) }) test('prepend OK, postpend OK, testCases syntaxError, student OK', async () => { @@ -255,22 +262,23 @@ test('prepend OK, postpend OK, testCases syntaxError, student OK', async () => { prependProgram: grader.validPrepend, studentProgram: student.valid.correct, postpendProgram: grader.validPostpend, - testCases: grader.invalidTestcases!.syntax})) + testCases: grader.invalidTestcases!.syntax + })) expect(results).toEqual({ "totalScore": 0, "results": [ - { - "resultType": "error", - "errors": [ - { - "errorType": "syntax", - "line": 1, - "location": "testcase", - "errorLine": "f(1)", - "errorExplanation": "Missing semicolon at the end of statement" - } - ] - } + { + "resultType": "error", + "errors": [ + { + "errorType": "syntax", + "line": 1, + "location": "testcase", + "errorLine": "f(1)", + "errorExplanation": "Missing semicolon at the end of statement" + } + ] + } ] - }) + }) }) \ No newline at end of file diff --git a/src/__tests__/test_chap3.ts b/src/__tests__/test_chap3.ts index bd7d9ee..0d6d70c 100644 --- a/src/__tests__/test_chap3.ts +++ b/src/__tests__/test_chap3.ts @@ -17,24 +17,25 @@ test('prepend OK, postpend OK, testCases OK, student OK, correct', async () => { prependProgram: grader.validPrepend, studentProgram: student.valid.correct, postpendProgram: grader.validPostpend, - testCases: grader.validTestcases})) + testCases: grader.validTestcases + })) expect(results).toEqual({ "totalScore": 3, "results": [ - { - "resultType": "pass", - "score": 1 - }, - { - "resultType": "pass", - "score": 1 - }, - { - "resultType": "pass", - "score": 1 - } + { + "resultType": "pass", + "score": 1 + }, + { + "resultType": "pass", + "score": 1 + }, + { + "resultType": "pass", + "score": 1 + } ] - }) + }) }) test('prepend OK, postpend OK, testCases OK, student OK, partial', async () => { @@ -42,26 +43,27 @@ test('prepend OK, postpend OK, testCases OK, student OK, partial', async () => { prependProgram: grader.validPrepend, studentProgram: student.valid.partial!, postpendProgram: grader.validPostpend, - testCases: grader.validTestcases})) + testCases: grader.validTestcases + })) expect(results).toEqual({ "totalScore": 1, "results": [ - { - "resultType": "fail", - "expected": "true", - "actual": "false" - }, - { - "resultType": "fail", - "expected": "true", - "actual": "false" - }, - { - "resultType": "pass", - "score": 1 - } + { + "resultType": "fail", + "expected": "true", + "actual": "false" + }, + { + "resultType": "fail", + "expected": "true", + "actual": "false" + }, + { + "resultType": "pass", + "score": 1 + } ] - }) + }) }) test('prepend OK, postpend OK, testCases OK, student OK, wrong', async () => { @@ -69,27 +71,28 @@ test('prepend OK, postpend OK, testCases OK, student OK, wrong', async () => { prependProgram: grader.validPrepend, studentProgram: student.valid.wrong, postpendProgram: grader.validPostpend, - testCases: grader.validTestcases})) + testCases: grader.validTestcases + })) expect(results).toEqual({ "totalScore": 0, "results": [ - { - "resultType": "fail", - "expected": "true", - "actual": "false" - }, - { - "resultType": "fail", - "expected": "true", - "actual": "false" - }, - { - "resultType": "fail", - "expected": "true", - "actual": "false" - } + { + "resultType": "fail", + "expected": "true", + "actual": "false" + }, + { + "resultType": "fail", + "expected": "true", + "actual": "false" + }, + { + "resultType": "fail", + "expected": "true", + "actual": "false" + } ] - }) + }) }) @@ -98,30 +101,31 @@ test('prepend OK, postpend OK, testCases OK, student runtimeError', async () => prependProgram: grader.validPrepend, studentProgram: student.invalid.runtime, postpendProgram: grader.validPostpend, - testCases: grader.validTestcases})) + testCases: grader.validTestcases + })) expect(results).toEqual({ "totalScore": 2, "results": [ - { - "resultType": "error", - "errors": [ - { - "errorType": "runtime", - "line": 3, - "location": "student", - "errorLine": "y = 'a';", - "errorExplanation": "Name y not declared" - } - ] - }, - { - "resultType": "pass", - "score": 1 - }, - { - "resultType": "pass", - "score": 1 - } + { + "resultType": "error", + "errors": [ + { + "errorType": "runtime", + "line": 3, + "location": "student", + "errorLine": "y = 'a';", + "errorExplanation": "Name y not declared" + } + ] + }, + { + "resultType": "pass", + "score": 1 + }, + { + "resultType": "pass", + "score": 1 + } ] }) }) @@ -131,46 +135,47 @@ test('prepend OK, postpend OK, testCases OK, student syntaxError', async () => { prependProgram: grader.validPrepend, studentProgram: student.invalid.syntax, postpendProgram: grader.validPostpend, - testCases: grader.validTestcases})) + testCases: grader.validTestcases + })) expect(results).toEqual({ "totalScore": 0, "results": [ - { - "resultType": "error", - "errors": [ - { - "errorType": "syntax", - "line": 2, - "location": "student", - "errorLine": "function reassign_x() { g }", - "errorExplanation": "Missing semicolon at the end of statement" - } - ] - }, - { - "resultType": "error", - "errors": [ - { - "errorType": "syntax", - "line": 2, - "location": "student", - "errorLine": "function reassign_x() { g }", - "errorExplanation": "Missing semicolon at the end of statement" - } - ] - }, - { - "resultType": "error", - "errors": [ - { - "errorType": "syntax", - "line": 2, - "location": "student", - "errorLine": "function reassign_x() { g }", - "errorExplanation": "Missing semicolon at the end of statement" - } - ] - } + { + "resultType": "error", + "errors": [ + { + "errorType": "syntax", + "line": 2, + "location": "student", + "errorLine": "function reassign_x() { g }", + "errorExplanation": "Missing semicolon at the end of statement" + } + ] + }, + { + "resultType": "error", + "errors": [ + { + "errorType": "syntax", + "line": 2, + "location": "student", + "errorLine": "function reassign_x() { g }", + "errorExplanation": "Missing semicolon at the end of statement" + } + ] + }, + { + "resultType": "error", + "errors": [ + { + "errorType": "syntax", + "line": 2, + "location": "student", + "errorLine": "function reassign_x() { g }", + "errorExplanation": "Missing semicolon at the end of statement" + } + ] + } ] }) }) @@ -180,34 +185,35 @@ test('prepend OK, postpend OK, testCases OK, student timeoutError', async () => prependProgram: grader.validPrepend, studentProgram: student.invalid.timeout!, postpendProgram: grader.validPostpend, - testCases: grader.validTestcases})) + testCases: grader.validTestcases + })) expect(results).toEqual({ "totalScore": 0, "results": [ - { - "resultType": "error", - "errors": [ - { - "errorType": "timeout" - } - ] - }, - { - "resultType": "error", - "errors": [ - { - "errorType": "timeout" - } - ] - }, - { - "resultType": "error", - "errors": [ - { - "errorType": "timeout" - } - ] - } + { + "resultType": "error", + "errors": [ + { + "errorType": "timeout" + } + ] + }, + { + "resultType": "error", + "errors": [ + { + "errorType": "timeout" + } + ] + }, + { + "resultType": "error", + "errors": [ + { + "errorType": "timeout" + } + ] + } ] }) }) @@ -217,24 +223,25 @@ test('prepend OK, postpend OK, testCases runtimeError, student OK', async () => prependProgram: grader.validPrepend, studentProgram: student.valid.correct, postpendProgram: grader.validPostpend, - testCases: grader.invalidTestcases!.runtime})) + testCases: grader.invalidTestcases!.runtime + })) expect(results).toEqual({ "totalScore": 0, "results": [ - { - "resultType": "error", - "errors": [ - { - "errorType": "runtime", - "line": 1, - "location": "testcase", - "errorLine": "check();", - "errorExplanation": "Name check not declared" - } - ] - } + { + "resultType": "error", + "errors": [ + { + "errorType": "runtime", + "line": 1, + "location": "testcase", + "errorLine": "check();", + "errorExplanation": "Name check not declared" + } + ] + } ] - }) + }) }) test('prepend OK, postpend OK, testCases syntaxError, student OK', async () => { @@ -242,24 +249,25 @@ test('prepend OK, postpend OK, testCases syntaxError, student OK', async () => { prependProgram: grader.validPrepend, studentProgram: student.valid.correct, postpendProgram: grader.validPostpend, - testCases: grader.invalidTestcases!.syntax})) + testCases: grader.invalidTestcases!.syntax + })) expect(results).toEqual({ "totalScore": 0, "results": [ - { - "resultType": "error", - "errors": [ - { - "errorType": "syntax", - "line": 1, - "location": "testcase", - "errorLine": "check_x(x, 1)", - "errorExplanation": "Missing semicolon at the end of statement" - } - ] - } + { + "resultType": "error", + "errors": [ + { + "errorType": "syntax", + "line": 1, + "location": "testcase", + "errorLine": "check_x(x, 1)", + "errorExplanation": "Missing semicolon at the end of statement" + } + ] + } ] - }) + }) }) test('prepend runtime, postpend OK, testCases OK, student OK', async () => { @@ -267,48 +275,49 @@ test('prepend runtime, postpend OK, testCases OK, student OK', async () => { prependProgram: grader.invalidPrepend!.runtime, studentProgram: student.valid.correct, postpendProgram: grader.validPostpend, - testCases: grader.validTestcases})) + testCases: grader.validTestcases + })) expect(results).toEqual({ "totalScore": 0, "results": [ - { - "resultType": "error", - "errors": [ - { - "errorType": "runtime", - "line": 3, - "location": "prepend", - "errorLine": "let arr = list1();", - "errorExplanation": "Name list1 not declared" - } - ] - }, - { - "resultType": "error", - "errors": [ - { - "errorType": "runtime", - "line": 3, - "location": "prepend", - "errorLine": "let arr = list1();", - "errorExplanation": "Name list1 not declared" - } - ] - }, - { - "resultType": "error", - "errors": [ - { - "errorType": "runtime", - "line": 3, - "location": "prepend", - "errorLine": "let arr = list1();", - "errorExplanation": "Name list1 not declared" - } - ] - } + { + "resultType": "error", + "errors": [ + { + "errorType": "runtime", + "line": 3, + "location": "prepend", + "errorLine": "let arr = list1();", + "errorExplanation": "Name list1 not declared" + } + ] + }, + { + "resultType": "error", + "errors": [ + { + "errorType": "runtime", + "line": 3, + "location": "prepend", + "errorLine": "let arr = list1();", + "errorExplanation": "Name list1 not declared" + } + ] + }, + { + "resultType": "error", + "errors": [ + { + "errorType": "runtime", + "line": 3, + "location": "prepend", + "errorLine": "let arr = list1();", + "errorExplanation": "Name list1 not declared" + } + ] + } ] - }) + }) }) test('prepend syntax, postpend OK, testCases OK, student OK', async () => { @@ -316,48 +325,49 @@ test('prepend syntax, postpend OK, testCases OK, student OK', async () => { prependProgram: grader.invalidPrepend!.syntax, studentProgram: student.valid.correct, postpendProgram: grader.validPostpend, - testCases: grader.validTestcases})) + testCases: grader.validTestcases + })) expect(results).toEqual({ "totalScore": 0, "results": [ - { - "resultType": "error", - "errors": [ - { - "errorType": "syntax", - "line": 3, - "location": "prepend", - "errorLine": "let arr = []", - "errorExplanation": "Missing semicolon at the end of statement" - } - ] - }, - { - "resultType": "error", - "errors": [ - { - "errorType": "syntax", - "line": 3, - "location": "prepend", - "errorLine": "let arr = []", - "errorExplanation": "Missing semicolon at the end of statement" - } - ] - }, - { - "resultType": "error", - "errors": [ - { - "errorType": "syntax", - "line": 3, - "location": "prepend", - "errorLine": "let arr = []", - "errorExplanation": "Missing semicolon at the end of statement" - } - ] - } + { + "resultType": "error", + "errors": [ + { + "errorType": "syntax", + "line": 3, + "location": "prepend", + "errorLine": "let arr = []", + "errorExplanation": "Missing semicolon at the end of statement" + } + ] + }, + { + "resultType": "error", + "errors": [ + { + "errorType": "syntax", + "line": 3, + "location": "prepend", + "errorLine": "let arr = []", + "errorExplanation": "Missing semicolon at the end of statement" + } + ] + }, + { + "resultType": "error", + "errors": [ + { + "errorType": "syntax", + "line": 3, + "location": "prepend", + "errorLine": "let arr = []", + "errorExplanation": "Missing semicolon at the end of statement" + } + ] + } ] - }) + }) }) test('prepend OK, postpend runtime, testCases OK, student OK', async () => { @@ -365,48 +375,49 @@ test('prepend OK, postpend runtime, testCases OK, student OK', async () => { prependProgram: grader.validPrepend, studentProgram: student.valid.correct, postpendProgram: grader.invalidPostpend!.runtime, - testCases: grader.validTestcases})) + testCases: grader.validTestcases + })) expect(results).toEqual({ "totalScore": 0, "results": [ - { - "resultType": "error", - "errors": [ - { - "errorType": "runtime", - "line": 1, - "location": "postpend", - "errorLine": "a();", - "errorExplanation": "Name a not declared" - } - ] - }, - { - "resultType": "error", - "errors": [ - { - "errorType": "runtime", - "line": 1, - "location": "postpend", - "errorLine": "a();", - "errorExplanation": "Name a not declared" - } - ] - }, - { - "resultType": "error", - "errors": [ - { - "errorType": "runtime", - "line": 1, - "location": "postpend", - "errorLine": "a();", - "errorExplanation": "Name a not declared" - } - ] - } + { + "resultType": "error", + "errors": [ + { + "errorType": "runtime", + "line": 1, + "location": "postpend", + "errorLine": "a();", + "errorExplanation": "Name a not declared" + } + ] + }, + { + "resultType": "error", + "errors": [ + { + "errorType": "runtime", + "line": 1, + "location": "postpend", + "errorLine": "a();", + "errorExplanation": "Name a not declared" + } + ] + }, + { + "resultType": "error", + "errors": [ + { + "errorType": "runtime", + "line": 1, + "location": "postpend", + "errorLine": "a();", + "errorExplanation": "Name a not declared" + } + ] + } ] - }) + }) }) test('prepend OK, postpend runtime, testCases OK, student OK', async () => { @@ -414,46 +425,47 @@ test('prepend OK, postpend runtime, testCases OK, student OK', async () => { prependProgram: grader.validPrepend, studentProgram: student.valid.correct, postpendProgram: grader.invalidPostpend!.syntax, - testCases: grader.validTestcases})) + testCases: grader.validTestcases + })) expect(results).toEqual({ "totalScore": 0, "results": [ - { - "resultType": "error", - "errors": [ - { - "errorType": "syntax", - "line": 1, - "location": "postpend", - "errorLine": "a()", - "errorExplanation": "Missing semicolon at the end of statement" - } - ] - }, - { - "resultType": "error", - "errors": [ - { - "errorType": "syntax", - "line": 1, - "location": "postpend", - "errorLine": "a()", - "errorExplanation": "Missing semicolon at the end of statement" - } - ] - }, - { - "resultType": "error", - "errors": [ - { - "errorType": "syntax", - "line": 1, - "location": "postpend", - "errorLine": "a()", - "errorExplanation": "Missing semicolon at the end of statement" - } - ] - } + { + "resultType": "error", + "errors": [ + { + "errorType": "syntax", + "line": 1, + "location": "postpend", + "errorLine": "a()", + "errorExplanation": "Missing semicolon at the end of statement" + } + ] + }, + { + "resultType": "error", + "errors": [ + { + "errorType": "syntax", + "line": 1, + "location": "postpend", + "errorLine": "a()", + "errorExplanation": "Missing semicolon at the end of statement" + } + ] + }, + { + "resultType": "error", + "errors": [ + { + "errorType": "syntax", + "line": 1, + "location": "postpend", + "errorLine": "a()", + "errorExplanation": "Missing semicolon at the end of statement" + } + ] + } ] - }) + }) }) diff --git a/src/__tests__/test_curve_comparison.ts b/src/__tests__/test_curve_comparison.ts index 60a1164..8d9dcaf 100644 --- a/src/__tests__/test_curve_comparison.ts +++ b/src/__tests__/test_curve_comparison.ts @@ -169,12 +169,12 @@ test("build compressed vertical sin test", async () => { var solution_point_array = draw_connected(3000)(forward_sine); var solutionBitmap = __drawCurve(solution_point_array, 300); var results = __build_compressed_vertical(solutionBitmap); - expect(results).toEqual(["10", "010", "01","010", "10"].join("\n")); + expect(results).toEqual(["10", "010", "01", "010", "10"].join("\n")); }); test("build compressed horizontal sin test", async () => { var solution_point_array = draw_connected(3000)(forward_sine); var solutionBitmap = __drawCurve(solution_point_array, 20); var results = __build_compressed_horizontal(solutionBitmap); - expect(results).toEqual(["101", "01010","010"].join("\n")); + expect(results).toEqual(["101", "01010", "010"].join("\n")); }); diff --git a/src/__tests__/test_runes2d.ts b/src/__tests__/test_runes2d.ts index b8271a2..aeb23f7 100644 --- a/src/__tests__/test_runes2d.ts +++ b/src/__tests__/test_runes2d.ts @@ -58,28 +58,29 @@ test('rune grader OK, student OK, correct', async () => { prependProgram: grader.validPrepend, studentProgram: student.valid.correct, postpendProgram: grader.validPostpend, - testCases: grader.validTestcases})) + testCases: grader.validTestcases + })) expect(results).toEqual({ "totalScore": 4, "results": [ - { - "resultType": "pass", - "score": 1 - }, - { - "resultType": "pass", - "score": 1 - }, - { - "resultType": "pass", - "score": 1 - }, - { - "resultType": "pass", - "score": 1 - } + { + "resultType": "pass", + "score": 1 + }, + { + "resultType": "pass", + "score": 1 + }, + { + "resultType": "pass", + "score": 1 + }, + { + "resultType": "pass", + "score": 1 + } ] - }) + }) }, 10000) test('rune grader OK, student OK, wrong', async () => { @@ -87,32 +88,33 @@ test('rune grader OK, student OK, wrong', async () => { prependProgram: grader.validPrepend, studentProgram: student.valid.wrong, postpendProgram: grader.validPostpend, - testCases: grader.validTestcases})) + testCases: grader.validTestcases + })) expect(results).toEqual({ "totalScore": 0, "results": [ - { - "resultType": "fail", - "expected": "true", - "actual": "false" - }, - { - "resultType": "fail", - "expected": "true", - "actual": "false" - }, - { - "resultType": "fail", - "expected": "true", - "actual": "false" - }, - { - "resultType": "fail", - "expected": "true", - "actual": "false" - } + { + "resultType": "fail", + "expected": "true", + "actual": "false" + }, + { + "resultType": "fail", + "expected": "true", + "actual": "false" + }, + { + "resultType": "fail", + "expected": "true", + "actual": "false" + }, + { + "resultType": "fail", + "expected": "true", + "actual": "false" + } ] - }) + }) }, 10000) test('rune grader OK, student OK, partial', async () => { @@ -120,27 +122,28 @@ test('rune grader OK, student OK, partial', async () => { prependProgram: grader.validPrepend, studentProgram: student.valid.partial!, postpendProgram: grader.validPostpend, - testCases: grader.validTestcases})) + testCases: grader.validTestcases + })) expect(results).toEqual({ "totalScore": 3, "results": [ - { - "resultType": "pass", - "score": 1 - }, - { - "resultType": "fail", - "expected": "true", - "actual": "false" - }, - { - "resultType": "pass", - "score": 1 - }, - { - "resultType": "pass", - "score": 1 - } + { + "resultType": "pass", + "score": 1 + }, + { + "resultType": "fail", + "expected": "true", + "actual": "false" + }, + { + "resultType": "pass", + "score": 1 + }, + { + "resultType": "pass", + "score": 1 + } ] - }) + }) }, 10000) \ No newline at end of file diff --git a/src/__tests__/test_runes3d.ts b/src/__tests__/test_runes3d.ts index 3823e9b..c382cd1 100644 --- a/src/__tests__/test_runes3d.ts +++ b/src/__tests__/test_runes3d.ts @@ -58,28 +58,29 @@ test('rune grader OK, student OK, correct', async () => { prependProgram: grader.validPrepend, studentProgram: student.valid.correct, postpendProgram: grader.validPostpend, - testCases: grader.validTestcases})) + testCases: grader.validTestcases + })) expect(results).toEqual({ "totalScore": 4, "results": [ - { - "resultType": "pass", - "score": 1 - }, - { - "resultType": "pass", - "score": 1 - }, - { - "resultType": "pass", - "score": 1 - }, - { - "resultType": "pass", - "score": 1 - } + { + "resultType": "pass", + "score": 1 + }, + { + "resultType": "pass", + "score": 1 + }, + { + "resultType": "pass", + "score": 1 + }, + { + "resultType": "pass", + "score": 1 + } ] - }) + }) }, 10000) test('rune grader OK, student OK, wrong', async () => { @@ -87,32 +88,33 @@ test('rune grader OK, student OK, wrong', async () => { prependProgram: grader.validPrepend, studentProgram: student.valid.wrong, postpendProgram: grader.validPostpend, - testCases: grader.validTestcases})) + testCases: grader.validTestcases + })) expect(results).toEqual({ "totalScore": 0, "results": [ - { - "resultType": "fail", - "expected": "true", - "actual": "false" - }, - { - "resultType": "fail", - "expected": "true", - "actual": "false" - }, - { - "resultType": "fail", - "expected": "true", - "actual": "false" - }, - { - "resultType": "fail", - "expected": "true", - "actual": "false" - } + { + "resultType": "fail", + "expected": "true", + "actual": "false" + }, + { + "resultType": "fail", + "expected": "true", + "actual": "false" + }, + { + "resultType": "fail", + "expected": "true", + "actual": "false" + }, + { + "resultType": "fail", + "expected": "true", + "actual": "false" + } ] - }) + }) }, 10000) test('rune grader OK, student OK, partial', async () => { @@ -120,28 +122,29 @@ test('rune grader OK, student OK, partial', async () => { prependProgram: grader.validPrepend, studentProgram: student.valid.partial!, postpendProgram: grader.validPostpend, - testCases: grader.validTestcases})) + testCases: grader.validTestcases + })) expect(results).toEqual({ "totalScore": 2, "results": [ - { - "resultType": "pass", - "score": 1 - }, - { - "resultType": "fail", - "expected": "true", - "actual": "false" - }, - { - "resultType": "pass", - "score": 1 - }, - { - "resultType": "fail", - "expected": "true", - "actual": "false" - } + { + "resultType": "pass", + "score": 1 + }, + { + "resultType": "fail", + "expected": "true", + "actual": "false" + }, + { + "resultType": "pass", + "score": 1 + }, + { + "resultType": "fail", + "expected": "true", + "actual": "false" + } ] - }) + }) }, 10000) \ No newline at end of file diff --git a/src/__tests__/test_sounds.ts b/src/__tests__/test_sounds.ts index 572b4ac..21f4c11 100644 --- a/src/__tests__/test_sounds.ts +++ b/src/__tests__/test_sounds.ts @@ -44,24 +44,25 @@ test('sound grader OK, student OK, correct', async () => { prependProgram: grader.validPrepend, studentProgram: student.valid.correct, postpendProgram: grader.validPostpend, - testCases: grader.validTestcases})) + testCases: grader.validTestcases + })) expect(results).toEqual({ "totalScore": 3, "results": [ - { - "resultType": "pass", - "score": 1 - }, - { - "resultType": "pass", - "score": 1 - }, - { - "resultType": "pass", - "score": 1 - } + { + "resultType": "pass", + "score": 1 + }, + { + "resultType": "pass", + "score": 1 + }, + { + "resultType": "pass", + "score": 1 + } ] - }) + }) }) test('sound grader OK, student OK, wrong', async () => { @@ -69,27 +70,28 @@ test('sound grader OK, student OK, wrong', async () => { prependProgram: grader.validPrepend, studentProgram: student.valid.wrong, postpendProgram: grader.validPostpend, - testCases: grader.validTestcases})) + testCases: grader.validTestcases + })) expect(results).toEqual({ "totalScore": 0, "results": [ - { - "resultType": "fail", - "expected": "true", - "actual": "false" - }, - { - "resultType": "fail", - "expected": "3", - "actual": "0" - }, - { - "resultType": "fail", - "expected": "2", - "actual": "0" - } + { + "resultType": "fail", + "expected": "true", + "actual": "false" + }, + { + "resultType": "fail", + "expected": "3", + "actual": "0" + }, + { + "resultType": "fail", + "expected": "2", + "actual": "0" + } ] - }) + }) }) test('sound grader OK, student OK, partial', async () => { @@ -97,24 +99,25 @@ test('sound grader OK, student OK, partial', async () => { prependProgram: grader.validPrepend, studentProgram: student.valid.partial!, postpendProgram: grader.validPostpend, - testCases: grader.validTestcases})) + testCases: grader.validTestcases + })) expect(results).toEqual({ "totalScore": 1, "results": [ - { - "resultType": "pass", - "score": 1 - }, - { - "resultType": "fail", - "expected": "3", - "actual": "1" - }, - { - "resultType": "fail", - "expected": "2", - "actual": "1" - } + { + "resultType": "pass", + "score": 1 + }, + { + "resultType": "fail", + "expected": "3", + "actual": "1" + }, + { + "resultType": "fail", + "expected": "2", + "actual": "1" + } ] - }) + }) }, 10000) diff --git a/src/__tests__/test_streams.ts b/src/__tests__/test_streams.ts index cf68504..ae03c54 100644 --- a/src/__tests__/test_streams.ts +++ b/src/__tests__/test_streams.ts @@ -31,28 +31,29 @@ test('stream grader OK, student OK, correct', async () => { prependProgram: grader.validPrepend, studentProgram: student.valid.correct, postpendProgram: grader.validPostpend, - testCases: grader.validTestcases})) + testCases: grader.validTestcases + })) expect(results).toEqual({ "totalScore": 4, "results": [ - { - "resultType": "pass", - "score": 1 - }, - { - "resultType": "pass", - "score": 1 - }, - { - "resultType": "pass", - "score": 1 - }, - { - "resultType": "pass", - "score": 1 - } + { + "resultType": "pass", + "score": 1 + }, + { + "resultType": "pass", + "score": 1 + }, + { + "resultType": "pass", + "score": 1 + }, + { + "resultType": "pass", + "score": 1 + } ] - }) + }) }) test('stream grader OK, student OK, wrong', async () => { @@ -60,30 +61,31 @@ test('stream grader OK, student OK, wrong', async () => { prependProgram: grader.validPrepend, studentProgram: student.valid.wrong, postpendProgram: grader.validPostpend, - testCases: grader.validTestcases})) + testCases: grader.validTestcases + })) expect(results).toEqual({ "totalScore": 2, "results": [ - { - "resultType": "fail", - "expected": "true", - "actual": "false" - }, - { - "resultType": "fail", - "expected": "true", - "actual": "false" - }, - { - "resultType": "pass", - "score": 1 - }, - { - "resultType": "pass", - "score": 1 - } + { + "resultType": "fail", + "expected": "true", + "actual": "false" + }, + { + "resultType": "fail", + "expected": "true", + "actual": "false" + }, + { + "resultType": "pass", + "score": 1 + }, + { + "resultType": "pass", + "score": 1 + } ] - }) + }) }) test('stream grader OK, student OK, partial', async () => { @@ -91,29 +93,30 @@ test('stream grader OK, student OK, partial', async () => { prependProgram: grader.validPrepend, studentProgram: student.valid.partial!, postpendProgram: grader.validPostpend, - testCases: grader.validTestcases})) + testCases: grader.validTestcases + })) expect(results).toEqual({ "totalScore": 3, "results": [ - { - "resultType": "pass", - "score": 1 - }, - { - "resultType": "fail", - "expected": "true", - "actual": "false" - }, - { - "resultType": "pass", - "score": 1 - }, - { - "resultType": "pass", - "score": 1 - } + { + "resultType": "pass", + "score": 1 + }, + { + "resultType": "fail", + "expected": "true", + "actual": "false" + }, + { + "resultType": "pass", + "score": 1 + }, + { + "resultType": "pass", + "score": 1 + } ] - }) + }) }) test('stream grader OK, student runtimeError', async () => { @@ -121,34 +124,35 @@ test('stream grader OK, student runtimeError', async () => { prependProgram: grader.validPrepend, studentProgram: student.invalid.runtime, postpendProgram: grader.validPostpend, - testCases: grader.validTestcases})) + testCases: grader.validTestcases + })) expect(results).toEqual({ "totalScore": 3, "results": [ - { - "resultType": "pass", - "score": 1 - }, - { - "resultType": "pass", - "score": 1 - }, - { - "resultType": "pass", - "score": 1 - }, - { - "resultType": "error", - "errors": [ - { - "errorType": "runtime", - "line": 3, - "location": "testcase", - "errorLine": "return is_stream(odd_stream, 1);", - "errorExplanation": "RangeError: Maximum call stack size exceeded" - } - ] - } + { + "resultType": "pass", + "score": 1 + }, + { + "resultType": "pass", + "score": 1 + }, + { + "resultType": "pass", + "score": 1 + }, + { + "resultType": "error", + "errors": [ + { + "errorType": "runtime", + "line": 3, + "location": "testcase", + "errorLine": "return is_stream(odd_stream, 1);", + "errorExplanation": "RangeError: Maximum call stack size exceeded" + } + ] + } ] - }) + }) }) diff --git a/src/index.ts b/src/index.ts index 33979fd..39b4ba8 100644 --- a/src/index.ts +++ b/src/index.ts @@ -2,13 +2,12 @@ import { createContext, runInContext, Result as SourceResult } from 'js-slang' import { SourceError } from 'js-slang/dist/types' -exports.handler = function(event: AwsEvent, context:any, callback:Function) -{ - const _ = require("./index.js") - _.runAll(event).then((result:any) => callback(null, result)) +exports.handler = function (event: AwsEvent, context: any, callback: Function) { + const _ = require("./index.js") + _.runAll(event).then((result: any) => callback(null, result)) }; -const TIMEOUT_DURATION = process.env.TIMEOUT ? parseInt(process.env.TIMEOUT!, 10) : 500 // in milliseconds +const TIMEOUT_DURATION = process.env.TIMEOUT ? parseInt(process.env.TIMEOUT!, 10) : 1000 // in milliseconds /** * @property globals - an array of two element string arrays. The first element @@ -118,8 +117,8 @@ export const runAll = async (event: AwsEvent): Promise => { require('./list.js') require('./tree.js') if (event.library && event.library.external) { - switch(event.library.external.name) { - case 'TWO_DIM_RUNES': {} + switch (event.library.external.name) { + case 'TWO_DIM_RUNES': { } case 'THREE_DIM_RUNES': { require('./graphics/rune_library.js') break @@ -139,7 +138,7 @@ export const runAll = async (event: AwsEvent): Promise => { } } evaluateGlobals(event.library.globals) - const promises: Promise[] = event.testCases.map( + const promises: Promise[] = event.testCases.map( (testCase: TestCase) => run({ library: event.library, prependProgram: event.prependProgram, @@ -148,10 +147,10 @@ export const runAll = async (event: AwsEvent): Promise => { testCase: testCase })) const results = await Promise.all(promises) - const totalScore = results.reduce( + const totalScore = results.reduce( (total: number, result) => result.resultType === 'pass' ? total + result.score - : total, + : total, 0) return { totalScore: totalScore, @@ -165,9 +164,9 @@ export const runAll = async (event: AwsEvent): Promise => { */ export const run = async (unitTest: UnitTest): Promise => { const context = createContext<{}>(unitTest.library.chapter, unitTest.library.external.symbols) - const program = unitTest.prependProgram + '\n' - + unitTest.studentProgram + '\n' - + unitTest.postpendProgram + '\n' + const program = unitTest.prependProgram + '\n' + + unitTest.studentProgram + '\n' + + unitTest.postpendProgram + '\n' + unitTest.testCase.program const result = await catchTimeouts(runInContext( program, context, { scheduler: 'preemptive' } @@ -175,21 +174,25 @@ export const run = async (unitTest: UnitTest): Promise => { if (result.status === 'finished') { const resultValue = JSON.stringify(result.value) return resultValue === unitTest.testCase.answer - ? { resultType: 'pass', - score: unitTest.testCase.score } as OutputPass - : { resultType: 'fail', - expected: unitTest.testCase.answer, - actual: resultValue } as OutputFail + ? { + resultType: 'pass', + score: unitTest.testCase.score + } as OutputPass + : { + resultType: 'fail', + expected: unitTest.testCase.answer, + actual: resultValue + } as OutputFail } else if (result.status === 'error') { - return parseError(context.errors, - unitTest.prependProgram, - unitTest.studentProgram, + return parseError(context.errors, + unitTest.prependProgram, + unitTest.studentProgram, unitTest.postpendProgram, unitTest.testCase.program) } else { return { resultType: 'error', - errors: [ { errorType: 'timeout' } ] + errors: [{ errorType: 'timeout' }] } } } @@ -240,24 +243,24 @@ const parseError = ( const stdProgLines = getLines(stdProg) const postProgLines = getLines(postProg) const testProgLines = getLines(testProg) - const errors = sourceErrors.map((err: SourceError) => { + const errors = sourceErrors.map((err: SourceError) => { const line = err.location.end.line const location = line <= preProgLines.length ? 'prepend' - : line <= preProgLines.length + stdProgLines.length ? 'student' - : line <= preProgLines.length + stdProgLines.length + postProgLines.length ? 'postpend' - : 'testcase' - const locationLine = location == 'prepend' ? line + : line <= preProgLines.length + stdProgLines.length ? 'student' + : line <= preProgLines.length + stdProgLines.length + postProgLines.length ? 'postpend' + : 'testcase' + const locationLine = location == 'prepend' ? line : location == 'student' ? line - preProgLines.length - : location == 'postpend' ? line - preProgLines.length - stdProgLines.length - : line - preProgLines.length - stdProgLines.length - postProgLines.length + : location == 'postpend' ? line - preProgLines.length - stdProgLines.length + : line - preProgLines.length - stdProgLines.length - postProgLines.length return { errorType: err.type.toLowerCase() as 'syntax' | 'runtime', line: locationLine, location: location, errorLine: (location == 'prepend' ? preProgLines[locationLine - 1] : location == 'student' ? stdProgLines[locationLine - 1] - : location == 'postpend' ? postProgLines[locationLine - 1] - : testProgLines[locationLine - 1]).trim(), + : location == 'postpend' ? postProgLines[locationLine - 1] + : testProgLines[locationLine - 1]).trim(), errorExplanation: err.explain() } }) From 0c60eeab827bfe0dff6554c9f4ae8222c9d95f73 Mon Sep 17 00:00:00 2001 From: Shuming Date: Tue, 19 Mar 2019 10:36:38 +0800 Subject: [PATCH 09/12] Bump typescript to 3.333333 --- package-lock.json | 34 ++++++++++++++++++++++++---------- package.json | 4 ++-- 2 files changed, 26 insertions(+), 12 deletions(-) diff --git a/package-lock.json b/package-lock.json index 6328b57..31b50ca 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1693,12 +1693,14 @@ "balanced-match": { "version": "1.0.0", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "brace-expansion": { "version": "1.1.11", "bundled": true, "dev": true, + "optional": true, "requires": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -1713,17 +1715,20 @@ "code-point-at": { "version": "1.1.0", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "concat-map": { "version": "0.0.1", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "console-control-strings": { "version": "1.1.0", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "core-util-is": { "version": "1.0.2", @@ -1840,7 +1845,8 @@ "inherits": { "version": "2.0.3", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "ini": { "version": "1.3.5", @@ -1852,6 +1858,7 @@ "version": "1.0.0", "bundled": true, "dev": true, + "optional": true, "requires": { "number-is-nan": "^1.0.0" } @@ -1866,6 +1873,7 @@ "version": "3.0.4", "bundled": true, "dev": true, + "optional": true, "requires": { "brace-expansion": "^1.1.7" } @@ -1873,12 +1881,14 @@ "minimist": { "version": "0.0.8", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "minipass": { "version": "2.3.5", "bundled": true, "dev": true, + "optional": true, "requires": { "safe-buffer": "^5.1.2", "yallist": "^3.0.0" @@ -1897,6 +1907,7 @@ "version": "0.5.1", "bundled": true, "dev": true, + "optional": true, "requires": { "minimist": "0.0.8" } @@ -1977,7 +1988,8 @@ "number-is-nan": { "version": "1.0.1", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "object-assign": { "version": "4.1.1", @@ -1989,6 +2001,7 @@ "version": "1.4.0", "bundled": true, "dev": true, + "optional": true, "requires": { "wrappy": "1" } @@ -2110,6 +2123,7 @@ "version": "1.0.2", "bundled": true, "dev": true, + "optional": true, "requires": { "code-point-at": "^1.0.0", "is-fullwidth-code-point": "^1.0.0", @@ -5271,9 +5285,9 @@ } }, "typescript": { - "version": "2.9.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-2.9.2.tgz", - "integrity": "sha512-Gr4p6nFNaoufRIY4NMdpQRNmgxVIGMs4Fcu/ujdYk3nAZqk7supzBE9idmvfZIlH/Cuj//dvi+019qEue9lV0w==" + "version": "3.3.3333", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.3.3333.tgz", + "integrity": "sha512-JjSKsAfuHBE/fB2oZ8NxtRTk5iGcg6hkYXMnZ3Wc+b2RSqejEqTaem11mHASMnFilHrax3sLK0GDzcJrekZYLw==" }, "uglify-js": { "version": "3.4.9", diff --git a/package.json b/package.json index 0bc94ce..71e9aeb 100644 --- a/package.json +++ b/package.json @@ -7,12 +7,12 @@ "build": "./scripts/build.sh", "typecheck": "tsc --noEmit", "test": "jest --env=node", - "test-coveralls": "jest --env=node --coverage --coverageReporters=text-lcov --forceExit | coveralls" + "test-coveralls": "jest --env=node --coverage --collectCoverageFrom=src/index.ts --coverageReporters=text-lcov --forceExit | coveralls" }, "dependencies": { "@types/node": "^10.14.1", "js-slang": "0.1.14", - "typescript": "^2.9.2" + "typescript": "^3.3.3333" }, "devDependencies": { "@types/jest": "^24.0.9", From 0fc1d53697b4d98f334e23382785a75f4147e0db Mon Sep 17 00:00:00 2001 From: Shuming Date: Tue, 19 Mar 2019 10:36:53 +0800 Subject: [PATCH 10/12] Updated tests --- src/__tests__/examples/runes2d.ts | 4 +- src/__tests__/examples/runes3d.ts | 4 +- src/__tests__/examples/sounds.ts | 4 +- src/__tests__/examples/streams.ts | 2 +- src/__tests__/test_curve_comparison.ts | 180 ------------------------- src/index.ts | 2 +- 6 files changed, 8 insertions(+), 188 deletions(-) delete mode 100644 src/__tests__/test_curve_comparison.ts diff --git a/src/__tests__/examples/runes2d.ts b/src/__tests__/examples/runes2d.ts index f172a40..ff6dac2 100644 --- a/src/__tests__/examples/runes2d.ts +++ b/src/__tests__/examples/runes2d.ts @@ -32,8 +32,8 @@ const validStudentPartial = export const student: Student = { invalid: { - runtime: null, - syntax: null + runtime: "a;", + syntax: "a" }, valid: { correct: validStudentCorrect, diff --git a/src/__tests__/examples/runes3d.ts b/src/__tests__/examples/runes3d.ts index 7f396d1..149ef3c 100644 --- a/src/__tests__/examples/runes3d.ts +++ b/src/__tests__/examples/runes3d.ts @@ -33,8 +33,8 @@ const validStudentPartial = export const student: Student = { invalid: { - runtime: null, - syntax: null + runtime: "a;", + syntax: "a" }, valid: { correct: validStudentCorrect, diff --git a/src/__tests__/examples/sounds.ts b/src/__tests__/examples/sounds.ts index fcff6c2..4788ce7 100644 --- a/src/__tests__/examples/sounds.ts +++ b/src/__tests__/examples/sounds.ts @@ -46,8 +46,8 @@ const validStudentPartial = export const student: Student = { invalid: { - runtime: null, - syntax: null + runtime: "a;", + syntax: "a" }, valid: { correct: validStudentCorrect, diff --git a/src/__tests__/examples/streams.ts b/src/__tests__/examples/streams.ts index 83d7ed6..71eb79a 100644 --- a/src/__tests__/examples/streams.ts +++ b/src/__tests__/examples/streams.ts @@ -36,7 +36,7 @@ const invalidStudentRuntime = export const student: Student = { invalid: { runtime: invalidStudentRuntime, - syntax: null, + syntax: "a", }, valid: { correct: validStudentCorrect, diff --git a/src/__tests__/test_curve_comparison.ts b/src/__tests__/test_curve_comparison.ts deleted file mode 100644 index 8d9dcaf..0000000 --- a/src/__tests__/test_curve_comparison.ts +++ /dev/null @@ -1,180 +0,0 @@ -require("../graphics/curves_library"); - -function unit_circle(t) { - return make_point(Math.sin(2 * Math.PI * t), Math.cos(2 * Math.PI * t)); -} - -function unit_line_at(y) { - return t => make_point(t, y); -} - -function some_shape(t) { - if (t < 0.5) { - return make_point(Math.sin(2 * Math.PI * t), Math.cos(2 * Math.PI * t)); - } else { - return make_point(t, t * 2); - } -} - -function up_line(t) { - return make_point(0.5, t); -} -function down_line(t) { - return make_point(0.5, 1 - t); -} -function forward_sine(t) { - return make_point(t, Math.sin(t * Math.PI)); -} -function backward_sine(t) { - return make_point(-t, Math.sin(t * Math.PI)); -} -// (draw_connected_squeezed_to_window(1000))(forward_sine); -// (draw_connected_squeezed_to_window(1000))(backwards_sine); - -/* Tests */ - -const TEST_RESOLUTION = 300; - -test("similar curves", async () => { - // Pass. Expected. - const TEST_DRAW_MODE = draw_connected; - const TEST_NUM_POINTS = 1000; - const TEST_STUDENT_CURVE = up_line; - const TEST_SOLUTION_CURVE = down_line; - - // Draw student's curve first - TEST_DRAW_MODE(TEST_NUM_POINTS)(TEST_STUDENT_CURVE); - const results = __check_canvas( - TEST_DRAW_MODE, - TEST_NUM_POINTS, - TEST_SOLUTION_CURVE, - TEST_RESOLUTION - ); - expect(results).toEqual(true); -}); - -test("test same circle", async () => { - // Pass. Expected. - const TEST_DRAW_MODE = draw_connected; - const TEST_NUM_POINTS = 1000; - const TEST_STUDENT_CURVE = unit_circle; - const TEST_SOLUTION_CURVE = unit_circle; - - // Draw student's curve first - TEST_DRAW_MODE(TEST_NUM_POINTS)(TEST_STUDENT_CURVE); - const results = __check_canvas( - TEST_DRAW_MODE, - TEST_NUM_POINTS, - TEST_SOLUTION_CURVE, - TEST_RESOLUTION - ); - expect(results).toEqual(true); -}); - -test("test similar sines", async () => { - // Fail. Expected. - const TEST_DRAW_MODE = draw_connected; - const TEST_NUM_POINTS = 1000; - const TEST_STUDENT_CURVE = forward_sine; - const TEST_SOLUTION_CURVE = backward_sine; - - // Draw student's curve first - TEST_DRAW_MODE(TEST_NUM_POINTS)(TEST_STUDENT_CURVE); - const results = __check_canvas( - TEST_DRAW_MODE, - TEST_NUM_POINTS, - TEST_SOLUTION_CURVE, - TEST_RESOLUTION - ); - expect(results).toEqual(false); -}); - -test("test squeezed sines", async () => { - const TEST_DRAW_MODE = draw_connected_squeezed_to_window; - const TEST_NUM_POINTS = 1000; - const TEST_STUDENT_CURVE = forward_sine; - const TEST_SOLUTION_CURVE = backward_sine; - - // Draw student's curve first - TEST_DRAW_MODE(TEST_NUM_POINTS)(TEST_STUDENT_CURVE); - const results = __check_canvas( - TEST_DRAW_MODE, - TEST_NUM_POINTS, - TEST_SOLUTION_CURVE, - 300 - ); - expect(results).toEqual(true); -}); - -test("", async () => { - // Pass. Expected. - const TEST_DRAW_MODE = draw_connected; - const TEST_NUM_POINTS = 1000; - const TEST_STUDENT_CURVE = unit_line_at(3); - const TEST_SOLUTION_CURVE = unit_line_at(3); - - // Draw student's curve first - TEST_DRAW_MODE(TEST_NUM_POINTS)(TEST_STUDENT_CURVE); - const results = __check_canvas( - TEST_DRAW_MODE, - TEST_NUM_POINTS, - TEST_SOLUTION_CURVE, - TEST_RESOLUTION - ); - expect(results).toEqual(false); -}); - -test("", async () => { - // Fail. Expected. - const TEST_DRAW_MODE = draw_connected; - const TEST_NUM_POINTS = 1000; - const TEST_STUDENT_CURVE = unit_line_at(10); - const TEST_SOLUTION_CURVE = unit_line_at(50); - - // Draw student's curve first - TEST_DRAW_MODE(TEST_NUM_POINTS)(TEST_STUDENT_CURVE); - const results = __check_canvas( - TEST_DRAW_MODE, - TEST_NUM_POINTS, - TEST_SOLUTION_CURVE, - TEST_RESOLUTION - ); - expect(results).toEqual(false); -}); - -test("build compressed vertical test", async () => { - var solution_point_array = draw_connected_full_view(3000)(unit_circle); - var solutionBitmap = __drawCurve(solution_point_array, 300); - var results = __build_compressed_vertical(solutionBitmap); - expect(results).toEqual(["010", "01010", "101", "01010", "010"].join("\n")); -}); - -test("build compressed horizontal test", async () => { - var solution_point_array = draw_connected_full_view(3000)(unit_circle); - var solutionBitmap = __drawCurve(solution_point_array, 300); - var results = __build_compressed_horizontal(solutionBitmap); - expect(results).toEqual(["010", "01010", "101", "01010", "010"].join("\n")); -}); - - - -/* -[ [ 1, 1, 1, 0, 0 ], - [ 0, 0, 1, 1, 1 ], - [ 0, 0, 0, 0, 1 ], - [ 0, 0, 1, 1, 1 ], - [ 1, 1, 1, 0, 0 ] ] -*/ -test("build compressed vertical sin test", async () => { - var solution_point_array = draw_connected(3000)(forward_sine); - var solutionBitmap = __drawCurve(solution_point_array, 300); - var results = __build_compressed_vertical(solutionBitmap); - expect(results).toEqual(["10", "010", "01", "010", "10"].join("\n")); -}); - -test("build compressed horizontal sin test", async () => { - var solution_point_array = draw_connected(3000)(forward_sine); - var solutionBitmap = __drawCurve(solution_point_array, 20); - var results = __build_compressed_horizontal(solutionBitmap); - expect(results).toEqual(["101", "01010", "010"].join("\n")); -}); diff --git a/src/index.ts b/src/index.ts index 39b4ba8..ac7743b 100644 --- a/src/index.ts +++ b/src/index.ts @@ -7,7 +7,7 @@ exports.handler = function (event: AwsEvent, context: any, callback: Function) { _.runAll(event).then((result: any) => callback(null, result)) }; -const TIMEOUT_DURATION = process.env.TIMEOUT ? parseInt(process.env.TIMEOUT!, 10) : 1000 // in milliseconds +const TIMEOUT_DURATION = process.env.TIMEOUT ? parseInt(process.env.TIMEOUT!, 10) : 3000 // in milliseconds /** * @property globals - an array of two element string arrays. The first element From 2632d6fda812b2ba463be319def0b1cb6b6e526b Mon Sep 17 00:00:00 2001 From: Shuming Date: Thu, 21 Mar 2019 22:41:20 +0800 Subject: [PATCH 11/12] Renamed 'testCases' to 'testcases' --- src/__tests__/helpers.ts | 4 +-- src/__tests__/test_chap1.ts | 32 +++++++++++------------ src/__tests__/test_chap3.ts | 48 +++++++++++++++++------------------ src/__tests__/test_curves.ts | 4 +-- src/__tests__/test_runes2d.ts | 6 ++--- src/__tests__/test_runes3d.ts | 6 ++--- src/__tests__/test_sounds.ts | 6 ++--- src/__tests__/test_streams.ts | 8 +++--- src/index.ts | 4 +-- 9 files changed, 59 insertions(+), 59 deletions(-) diff --git a/src/__tests__/helpers.ts b/src/__tests__/helpers.ts index 6688f17..0146ae4 100644 --- a/src/__tests__/helpers.ts +++ b/src/__tests__/helpers.ts @@ -5,7 +5,7 @@ type PartialAwsEvent = { prependProgram: string studentProgram: string, postpendProgram: string, - testCases: TestCase[] + testcases: TestCase[] } export function awsEventFactory(library: Library) { @@ -15,6 +15,6 @@ export function awsEventFactory(library: Library) { prependProgram: awsEvent.prependProgram, studentProgram: awsEvent.studentProgram, postpendProgram: awsEvent.postpendProgram, - testCases: awsEvent.testCases, + testcases: awsEvent.testcases, }) } diff --git a/src/__tests__/test_chap1.ts b/src/__tests__/test_chap1.ts index 72e159f..18941c4 100644 --- a/src/__tests__/test_chap1.ts +++ b/src/__tests__/test_chap1.ts @@ -12,12 +12,12 @@ const makeAwsEvent = awsEventFactory({ globals: [] }) -test('prepend OK, postpend OK, testCases OK, student OK, correct', async () => { +test('prepend OK, postpend OK, testcases OK, student OK, correct', async () => { const results = await runAll(makeAwsEvent({ prependProgram: grader.validPrepend, studentProgram: student.valid.correct, postpendProgram: grader.validPostpend, - testCases: grader.validTestcases + testcases: grader.validTestcases })) expect(results).toEqual({ "totalScore": 3, @@ -38,12 +38,12 @@ test('prepend OK, postpend OK, testCases OK, student OK, correct', async () => { }) }) -test('prepend OK, postpend OK, testCases OK, student OK, partial', async () => { +test('prepend OK, postpend OK, testcases OK, student OK, partial', async () => { const results = await runAll(makeAwsEvent({ prependProgram: grader.validPrepend, studentProgram: student.valid.partial!, postpendProgram: grader.validPostpend, - testCases: grader.validTestcases + testcases: grader.validTestcases })) expect(results).toEqual({ "totalScore": 3, @@ -64,12 +64,12 @@ test('prepend OK, postpend OK, testCases OK, student OK, partial', async () => { }) }) -test('prepend OK, postpend OK, testCases OK, student OK, wrong', async () => { +test('prepend OK, postpend OK, testcases OK, student OK, wrong', async () => { const results = await runAll(makeAwsEvent({ prependProgram: grader.validPrepend, studentProgram: student.valid.wrong, postpendProgram: grader.validPostpend, - testCases: grader.validTestcases + testcases: grader.validTestcases })) expect(results).toEqual({ "totalScore": 0, @@ -93,12 +93,12 @@ test('prepend OK, postpend OK, testCases OK, student OK, wrong', async () => { }) }) -test('prepend OK, postpend OK, testCases OK, student runtimeError', async () => { +test('prepend OK, postpend OK, testcases OK, student runtimeError', async () => { const results = await runAll(makeAwsEvent({ prependProgram: grader.validPrepend, studentProgram: student.invalid.runtime, postpendProgram: grader.validPostpend, - testCases: grader.validTestcases + testcases: grader.validTestcases })) expect(results).toEqual({ "totalScore": 0, @@ -143,12 +143,12 @@ test('prepend OK, postpend OK, testCases OK, student runtimeError', async () => }) }) -test('prepend OK, postpend OK, testCases OK, student syntaxError', async () => { +test('prepend OK, postpend OK, testcases OK, student syntaxError', async () => { const results = await runAll(makeAwsEvent({ prependProgram: grader.validPrepend, studentProgram: student.invalid.syntax, postpendProgram: grader.validPostpend, - testCases: grader.validTestcases + testcases: grader.validTestcases })) expect(results).toEqual({ "totalScore": 0, @@ -193,12 +193,12 @@ test('prepend OK, postpend OK, testCases OK, student syntaxError', async () => { }) }) -test('prepend OK, postpend OK, testCases OK, student timeoutError', async () => { +test('prepend OK, postpend OK, testcases OK, student timeoutError', async () => { const results = await runAll(makeAwsEvent({ prependProgram: grader.validPrepend, studentProgram: student.invalid.timeout!, postpendProgram: grader.validPostpend, - testCases: grader.validTestcases + testcases: grader.validTestcases })) expect(results).toEqual({ "totalScore": 0, @@ -231,12 +231,12 @@ test('prepend OK, postpend OK, testCases OK, student timeoutError', async () => }) }) -test('prepend OK, postpend OK, testCases runtimeError, student OK', async () => { +test('prepend OK, postpend OK, testcases runtimeError, student OK', async () => { const results = await runAll(makeAwsEvent({ prependProgram: grader.validPrepend, studentProgram: student.valid.correct, postpendProgram: grader.validPostpend, - testCases: grader.invalidTestcases!.runtime + testcases: grader.invalidTestcases!.runtime })) expect(results).toEqual({ "totalScore": 0, @@ -257,12 +257,12 @@ test('prepend OK, postpend OK, testCases runtimeError, student OK', async () => }) }) -test('prepend OK, postpend OK, testCases syntaxError, student OK', async () => { +test('prepend OK, postpend OK, testcases syntaxError, student OK', async () => { const results = await runAll(makeAwsEvent({ prependProgram: grader.validPrepend, studentProgram: student.valid.correct, postpendProgram: grader.validPostpend, - testCases: grader.invalidTestcases!.syntax + testcases: grader.invalidTestcases!.syntax })) expect(results).toEqual({ "totalScore": 0, diff --git a/src/__tests__/test_chap3.ts b/src/__tests__/test_chap3.ts index 0d6d70c..94a3007 100644 --- a/src/__tests__/test_chap3.ts +++ b/src/__tests__/test_chap3.ts @@ -12,12 +12,12 @@ const makeAwsEvent = awsEventFactory({ globals: [] }) -test('prepend OK, postpend OK, testCases OK, student OK, correct', async () => { +test('prepend OK, postpend OK, testcases OK, student OK, correct', async () => { const results = await runAll(makeAwsEvent({ prependProgram: grader.validPrepend, studentProgram: student.valid.correct, postpendProgram: grader.validPostpend, - testCases: grader.validTestcases + testcases: grader.validTestcases })) expect(results).toEqual({ "totalScore": 3, @@ -38,12 +38,12 @@ test('prepend OK, postpend OK, testCases OK, student OK, correct', async () => { }) }) -test('prepend OK, postpend OK, testCases OK, student OK, partial', async () => { +test('prepend OK, postpend OK, testcases OK, student OK, partial', async () => { const results = await runAll(makeAwsEvent({ prependProgram: grader.validPrepend, studentProgram: student.valid.partial!, postpendProgram: grader.validPostpend, - testCases: grader.validTestcases + testcases: grader.validTestcases })) expect(results).toEqual({ "totalScore": 1, @@ -66,12 +66,12 @@ test('prepend OK, postpend OK, testCases OK, student OK, partial', async () => { }) }) -test('prepend OK, postpend OK, testCases OK, student OK, wrong', async () => { +test('prepend OK, postpend OK, testcases OK, student OK, wrong', async () => { const results = await runAll(makeAwsEvent({ prependProgram: grader.validPrepend, studentProgram: student.valid.wrong, postpendProgram: grader.validPostpend, - testCases: grader.validTestcases + testcases: grader.validTestcases })) expect(results).toEqual({ "totalScore": 0, @@ -96,12 +96,12 @@ test('prepend OK, postpend OK, testCases OK, student OK, wrong', async () => { }) -test('prepend OK, postpend OK, testCases OK, student runtimeError', async () => { +test('prepend OK, postpend OK, testcases OK, student runtimeError', async () => { const results = await runAll(makeAwsEvent({ prependProgram: grader.validPrepend, studentProgram: student.invalid.runtime, postpendProgram: grader.validPostpend, - testCases: grader.validTestcases + testcases: grader.validTestcases })) expect(results).toEqual({ "totalScore": 2, @@ -130,12 +130,12 @@ test('prepend OK, postpend OK, testCases OK, student runtimeError', async () => }) }) -test('prepend OK, postpend OK, testCases OK, student syntaxError', async () => { +test('prepend OK, postpend OK, testcases OK, student syntaxError', async () => { const results = await runAll(makeAwsEvent({ prependProgram: grader.validPrepend, studentProgram: student.invalid.syntax, postpendProgram: grader.validPostpend, - testCases: grader.validTestcases + testcases: grader.validTestcases })) expect(results).toEqual({ "totalScore": 0, @@ -180,12 +180,12 @@ test('prepend OK, postpend OK, testCases OK, student syntaxError', async () => { }) }) -test('prepend OK, postpend OK, testCases OK, student timeoutError', async () => { +test('prepend OK, postpend OK, testcases OK, student timeoutError', async () => { const results = await runAll(makeAwsEvent({ prependProgram: grader.validPrepend, studentProgram: student.invalid.timeout!, postpendProgram: grader.validPostpend, - testCases: grader.validTestcases + testcases: grader.validTestcases })) expect(results).toEqual({ "totalScore": 0, @@ -218,12 +218,12 @@ test('prepend OK, postpend OK, testCases OK, student timeoutError', async () => }) }) -test('prepend OK, postpend OK, testCases runtimeError, student OK', async () => { +test('prepend OK, postpend OK, testcases runtimeError, student OK', async () => { const results = await runAll(makeAwsEvent({ prependProgram: grader.validPrepend, studentProgram: student.valid.correct, postpendProgram: grader.validPostpend, - testCases: grader.invalidTestcases!.runtime + testcases: grader.invalidTestcases!.runtime })) expect(results).toEqual({ "totalScore": 0, @@ -244,12 +244,12 @@ test('prepend OK, postpend OK, testCases runtimeError, student OK', async () => }) }) -test('prepend OK, postpend OK, testCases syntaxError, student OK', async () => { +test('prepend OK, postpend OK, testcases syntaxError, student OK', async () => { const results = await runAll(makeAwsEvent({ prependProgram: grader.validPrepend, studentProgram: student.valid.correct, postpendProgram: grader.validPostpend, - testCases: grader.invalidTestcases!.syntax + testcases: grader.invalidTestcases!.syntax })) expect(results).toEqual({ "totalScore": 0, @@ -270,12 +270,12 @@ test('prepend OK, postpend OK, testCases syntaxError, student OK', async () => { }) }) -test('prepend runtime, postpend OK, testCases OK, student OK', async () => { +test('prepend runtime, postpend OK, testcases OK, student OK', async () => { const results = await runAll(makeAwsEvent({ prependProgram: grader.invalidPrepend!.runtime, studentProgram: student.valid.correct, postpendProgram: grader.validPostpend, - testCases: grader.validTestcases + testcases: grader.validTestcases })) expect(results).toEqual({ "totalScore": 0, @@ -320,12 +320,12 @@ test('prepend runtime, postpend OK, testCases OK, student OK', async () => { }) }) -test('prepend syntax, postpend OK, testCases OK, student OK', async () => { +test('prepend syntax, postpend OK, testcases OK, student OK', async () => { const results = await runAll(makeAwsEvent({ prependProgram: grader.invalidPrepend!.syntax, studentProgram: student.valid.correct, postpendProgram: grader.validPostpend, - testCases: grader.validTestcases + testcases: grader.validTestcases })) expect(results).toEqual({ "totalScore": 0, @@ -370,12 +370,12 @@ test('prepend syntax, postpend OK, testCases OK, student OK', async () => { }) }) -test('prepend OK, postpend runtime, testCases OK, student OK', async () => { +test('prepend OK, postpend runtime, testcases OK, student OK', async () => { const results = await runAll(makeAwsEvent({ prependProgram: grader.validPrepend, studentProgram: student.valid.correct, postpendProgram: grader.invalidPostpend!.runtime, - testCases: grader.validTestcases + testcases: grader.validTestcases })) expect(results).toEqual({ "totalScore": 0, @@ -420,12 +420,12 @@ test('prepend OK, postpend runtime, testCases OK, student OK', async () => { }) }) -test('prepend OK, postpend runtime, testCases OK, student OK', async () => { +test('prepend OK, postpend runtime, testcases OK, student OK', async () => { const results = await runAll(makeAwsEvent({ prependProgram: grader.validPrepend, studentProgram: student.valid.correct, postpendProgram: grader.invalidPostpend!.syntax, - testCases: grader.validTestcases + testcases: grader.validTestcases })) expect(results).toEqual({ "totalScore": 0, diff --git a/src/__tests__/test_curves.ts b/src/__tests__/test_curves.ts index 781b0a0..f5396cf 100644 --- a/src/__tests__/test_curves.ts +++ b/src/__tests__/test_curves.ts @@ -39,7 +39,7 @@ test('curve grader correct', async () => { prependProgram: grader.validPrepend, studentProgram: student.valid.correct, postpendProgram: grader.validPostpend, - testCases: grader.validTestcases + testcases: grader.validTestcases })) expect(results).toEqual( { @@ -59,7 +59,7 @@ test('wrong answer', async () => { prependProgram: grader.validPrepend, studentProgram: student.valid.wrong, postpendProgram: grader.validPostpend, - testCases: grader.validTestcases + testcases: grader.validTestcases })) expect(results).toEqual( { diff --git a/src/__tests__/test_runes2d.ts b/src/__tests__/test_runes2d.ts index aeb23f7..e36df37 100644 --- a/src/__tests__/test_runes2d.ts +++ b/src/__tests__/test_runes2d.ts @@ -58,7 +58,7 @@ test('rune grader OK, student OK, correct', async () => { prependProgram: grader.validPrepend, studentProgram: student.valid.correct, postpendProgram: grader.validPostpend, - testCases: grader.validTestcases + testcases: grader.validTestcases })) expect(results).toEqual({ "totalScore": 4, @@ -88,7 +88,7 @@ test('rune grader OK, student OK, wrong', async () => { prependProgram: grader.validPrepend, studentProgram: student.valid.wrong, postpendProgram: grader.validPostpend, - testCases: grader.validTestcases + testcases: grader.validTestcases })) expect(results).toEqual({ "totalScore": 0, @@ -122,7 +122,7 @@ test('rune grader OK, student OK, partial', async () => { prependProgram: grader.validPrepend, studentProgram: student.valid.partial!, postpendProgram: grader.validPostpend, - testCases: grader.validTestcases + testcases: grader.validTestcases })) expect(results).toEqual({ "totalScore": 3, diff --git a/src/__tests__/test_runes3d.ts b/src/__tests__/test_runes3d.ts index c382cd1..233602f 100644 --- a/src/__tests__/test_runes3d.ts +++ b/src/__tests__/test_runes3d.ts @@ -58,7 +58,7 @@ test('rune grader OK, student OK, correct', async () => { prependProgram: grader.validPrepend, studentProgram: student.valid.correct, postpendProgram: grader.validPostpend, - testCases: grader.validTestcases + testcases: grader.validTestcases })) expect(results).toEqual({ "totalScore": 4, @@ -88,7 +88,7 @@ test('rune grader OK, student OK, wrong', async () => { prependProgram: grader.validPrepend, studentProgram: student.valid.wrong, postpendProgram: grader.validPostpend, - testCases: grader.validTestcases + testcases: grader.validTestcases })) expect(results).toEqual({ "totalScore": 0, @@ -122,7 +122,7 @@ test('rune grader OK, student OK, partial', async () => { prependProgram: grader.validPrepend, studentProgram: student.valid.partial!, postpendProgram: grader.validPostpend, - testCases: grader.validTestcases + testcases: grader.validTestcases })) expect(results).toEqual({ "totalScore": 2, diff --git a/src/__tests__/test_sounds.ts b/src/__tests__/test_sounds.ts index 21f4c11..8e88329 100644 --- a/src/__tests__/test_sounds.ts +++ b/src/__tests__/test_sounds.ts @@ -44,7 +44,7 @@ test('sound grader OK, student OK, correct', async () => { prependProgram: grader.validPrepend, studentProgram: student.valid.correct, postpendProgram: grader.validPostpend, - testCases: grader.validTestcases + testcases: grader.validTestcases })) expect(results).toEqual({ "totalScore": 3, @@ -70,7 +70,7 @@ test('sound grader OK, student OK, wrong', async () => { prependProgram: grader.validPrepend, studentProgram: student.valid.wrong, postpendProgram: grader.validPostpend, - testCases: grader.validTestcases + testcases: grader.validTestcases })) expect(results).toEqual({ "totalScore": 0, @@ -99,7 +99,7 @@ test('sound grader OK, student OK, partial', async () => { prependProgram: grader.validPrepend, studentProgram: student.valid.partial!, postpendProgram: grader.validPostpend, - testCases: grader.validTestcases + testcases: grader.validTestcases })) expect(results).toEqual({ "totalScore": 1, diff --git a/src/__tests__/test_streams.ts b/src/__tests__/test_streams.ts index ae03c54..868c37a 100644 --- a/src/__tests__/test_streams.ts +++ b/src/__tests__/test_streams.ts @@ -31,7 +31,7 @@ test('stream grader OK, student OK, correct', async () => { prependProgram: grader.validPrepend, studentProgram: student.valid.correct, postpendProgram: grader.validPostpend, - testCases: grader.validTestcases + testcases: grader.validTestcases })) expect(results).toEqual({ "totalScore": 4, @@ -61,7 +61,7 @@ test('stream grader OK, student OK, wrong', async () => { prependProgram: grader.validPrepend, studentProgram: student.valid.wrong, postpendProgram: grader.validPostpend, - testCases: grader.validTestcases + testcases: grader.validTestcases })) expect(results).toEqual({ "totalScore": 2, @@ -93,7 +93,7 @@ test('stream grader OK, student OK, partial', async () => { prependProgram: grader.validPrepend, studentProgram: student.valid.partial!, postpendProgram: grader.validPostpend, - testCases: grader.validTestcases + testcases: grader.validTestcases })) expect(results).toEqual({ "totalScore": 3, @@ -124,7 +124,7 @@ test('stream grader OK, student runtimeError', async () => { prependProgram: grader.validPrepend, studentProgram: student.invalid.runtime, postpendProgram: grader.validPostpend, - testCases: grader.validTestcases + testcases: grader.validTestcases })) expect(results).toEqual({ "totalScore": 3, diff --git a/src/index.ts b/src/index.ts index ac7743b..e42bcd2 100644 --- a/src/index.ts +++ b/src/index.ts @@ -37,7 +37,7 @@ export type AwsEvent = { prependProgram: string studentProgram: string postpendProgram: string - testCases: TestCase[] + testcases: TestCase[] } /** @@ -138,7 +138,7 @@ export const runAll = async (event: AwsEvent): Promise => { } } evaluateGlobals(event.library.globals) - const promises: Promise[] = event.testCases.map( + const promises: Promise[] = event.testcases.map( (testCase: TestCase) => run({ library: event.library, prependProgram: event.prependProgram, From 54d89e435ea446b2941f0b5f1164582afb23fdeb Mon Sep 17 00:00:00 2001 From: Shuming Date: Thu, 21 Mar 2019 22:41:40 +0800 Subject: [PATCH 12/12] Removed explicit handler --- src/index.ts | 5 ----- 1 file changed, 5 deletions(-) diff --git a/src/index.ts b/src/index.ts index e42bcd2..7f3556c 100644 --- a/src/index.ts +++ b/src/index.ts @@ -2,11 +2,6 @@ import { createContext, runInContext, Result as SourceResult } from 'js-slang' import { SourceError } from 'js-slang/dist/types' -exports.handler = function (event: AwsEvent, context: any, callback: Function) { - const _ = require("./index.js") - _.runAll(event).then((result: any) => callback(null, result)) -}; - const TIMEOUT_DURATION = process.env.TIMEOUT ? parseInt(process.env.TIMEOUT!, 10) : 3000 // in milliseconds /**