{"version":3,"sources":["constants.ts","components/_atoms.tsx","contexts/auth.tsx","util.ts","services/apiService.ts","services/httpService.ts","contexts/school.tsx","contexts/course.tsx","util/enumerations.ts","components/NavBar.tsx","components/protectedRoute.tsx","pages/applications.tsx","DTO/BaseDTO.ts","DTO/ApplicationHeadDTO.ts","DTO/CourseDTO.ts","DTO/ApplicationRowDTO.ts","components/lastEdited.tsx","hooks/isDirty.ts","components/course/index.tsx","components/course/courseModal.tsx","components/application/createCourses.tsx","components/application/util.ts","components/application/head/applicationSummary.tsx","components/application/head/setStatus.tsx","components/application/head/applicationStepper.tsx","components/application/head/applicationHeadFields.tsx","components/application/head/applicationHead.tsx","components/application/column.tsx","DTO/VerdictDTO.ts","util/dateHelper.ts","components/application/index.tsx","components/application/verdict/createVerdict.tsx","components/application/verdict/verdict.tsx","pages/lastEdited.tsx","components/application/row/informationRow.tsx","components/application/row/row.tsx","components/application/row/applicationRows.tsx","components/application/applicationControls.tsx","DTO/InformationRowDTO.ts","components/application/ApplicationState.ts","components/application/ApplicationHandlers.ts","pages/createApplication.tsx","pages/application.tsx","pages/schools.tsx","pages/courses.tsx","pages/course.tsx","pages/notFound.tsx","pages/users.tsx","DTO/SchoolDTO.ts","pages/school.tsx","DTO/UserDTO.ts","pages/user.tsx","pages/home.tsx","pages/applicationsAdmin.tsx","pages/applicationRowsAdmin.tsx","pages/masterTracks.tsx","DTO/MasterTrackDTO.ts","pages/masterTrack.tsx","components/sideMenu/help.tsx","components/sideMenu/sideMenu.tsx","App.tsx","serviceWorker.ts","index.tsx"],"names":["ROUTES","ActionType","Container","styled","div","props","margin","maxWidth","center","getApiPath","isDevEnv","process","APIService","getApplications","a","instance","get","getApplicationById","id","getApplicationLatest","getUnhandledApplicationRows","saveApplication","application","post","saveVerdict","verdict","setApplicationStatus","status","getMappingHistory","courseMappingHeadId","getSchools","getSchoolsById","getSchoolById","getCountries","saveSchool","school","getCoursesBySchoolId","getCourses","getCourseById","saveCourse","course","downloadDocumentById","responseType","uploadDocument","document","uploadDocuments","documents","downloadApplicationHeadById","baseURL","getUsers","getUserById","saveUser","user","login","logout","getCurrentUser","getMasterTracks","getMasterTrack","saveMasterTrack","data","_initializeResponseInterceptor","interceptors","response","use","_handleResponse","_handleError","error","Promise","reject","this","axios","create","headers","AuthContext","React","createContext","undefined","AuthUpdateContext","reducer","state","action","type","ACTIVE_USER","authenticated","payload","NO_ACTIVE_USER","LOGIN","LOGOUT","initialState","api","AuthProvider","children","useReducer","dispatch","getSessionUser","useCallback","then","catch","_err","useEffect","x","Provider","value","useAuth","useContext","Error","SchoolContext","SchoolUpdateContext","SET_SCHOOLS","SAVE_SCHOOL","found","newSchools","map","s","SchoolProvider","newSchool","useSchools","CourseContext","CourseUpdateContext","EntityState","VerdictStatus","StudyLevel","IsAdmin","ApplicationStatus","SET_COURSES","ADD_COURSES","includedCourses","concat","filter","c","SAVE_COURSE","newCourses","CourseProvider","getCoursesBySchoolIds","schoolIds","all","schools","flat","savedCourse","useCourses","useUpdateCourses","useStyles","makeStyles","theme","createStyles","root","flexGrow","menuButton","marginRight","spacing","title","NavBar","useUpdateAuth","classes","useState","anchorEl","setAnchorEl","handleMenuClick","_e","menuItems","pageURL","requiresAdmin","className","AppBar","position","Toolbar","IconButton","edge","color","aria-label","onClick","e","target","anchorOrigin","vertical","horizontal","keepMounted","transformOrigin","open","onClose","isAdmin","MenuItem","component","Link","style","textDecoration","to","key","Typography","variant","name","userString","Button","toggleSideMenu","href","borderColor","ProtectedRoute","pathname","AdminLevels","False","True","StudyLevels","Unknown","Bachelor","Master","States","Active","Inactive","Removed","levelName","appVerdictName","Accepted","AcceptedUnderSpecialCircumstances","Rejected","appStatusName","New","IsBeingEdited","PendingApproval","Closed","appStatusDescription","marginBottom","Applications","history","useHistory","applications","setApplications","newClicked","setNewClicked","length","Alert","severity","AlertTitle","textAlign","size","push","startIcon","elevation","padding","marginTop","FormGroup","row","display","justifyContent","TextField","inputProps","readOnly","label","country","year","fontSize","BaseDTO","useModifiedFlag","created","createdBy","modified","modifiedBy","isModified","ApplicationHeadDTO","userId","schoolId","masterTrackId","masterTrack","applicationRows","Date","getFullYear","CourseDTO","code","localCredits","ectsCredits","level","informationRow","ApplicationRowDTO","applicationHeadId","comment","externalUrl","coursesExchange","coursesHome","activeVerdict","verdicts","mappingHistory","pad","slice","formatDate","d","getMonth","getDate","getHours","getMinutes","LastEdited","isObject","useIsDirty","initialValue","options","originalRef","useRef","initialComparisonValue","areDeeplyEqual","b","Object","keys","every","hasOwnProperty","updateCleanValue","newValue","current","comparisonFunction","field","button","formControl","minWidth","selectEmpty","Course","initialCourse","onCreateCourse","setCourse","isHome","setError","isDirty","updateField","prevCourse","onSubmit","preventDefault","newCourse","message","onChange","val","Number","FormControl","InputLabel","Select","find","setSchool","displayEmpty","labelId","disabled","CourseModal","Dialog","DialogTitle","Box","alignItems","CreateCourses","schoolName","modal","setModal","handleClickOpenCourseModal","onCourseModalClose","useMemo","width","stepStatus","step","active","completed","setVerdictBorderStyle","ApplicationSummary","useApplication","sums","rows","rowsUnhandled","rowsAccepted","rowsRejected","rowsCondAccepted","totalECTSHome","totalLocalHome","totalECTSExchange","totalLocalExchange","forEach","r","applicationSums","Accordion","defaultExpanded","AccordionSummary","expandIcon","aria-controls","Grid","container","item","xs","Tooltip","SetStatus","useUpdateApplication","popupId","popupState","Fragment","marginLeft","bindTrigger","bindMenu","ApplicationStepper","Stepper","alternativeLabel","Step","StepLabel","ApplicationHeadFields","privileges","setMasterProgram","setYear","handleSelectSchool","masterTracks","setMasterTracks","editCourses","email","Autocomplete","getOptionLabel","getOptionSelected","option","renderInput","params","helperText","ApplicationStatusDescription","ApplicationValidation","validationMessage","content","whiteSpace","ApplicationIsDirtyIndicator","SaveApplication","ApplicationHeadControls","giveVerdict","controlsFormGroup","ApplicationHead","addCourses","addButton","iconStyles","ApplicationColumn","memo","displayCourseInfo","setDisplayCourseInfo","toggleShowCourseInfo","courseId","prevDisplayCourseInfo","newCourseInfo","renderCourseInfo","gutterBottom","align","fullWidth","courses","allCourses","handlers","addCourse","removeCourse","updateCourse","idx","disableClearable","_","noOptionsText","includes","VerdictDTO","applicationRowId","note","Unhandled","getDateAndTime","date","currentDatetime","appendLeadingZeroes","getSeconds","n","toString","CourseOrigin","CreateVerdict","setVerdict","rowIndex","showHistory","setShowHistory","mappingHistoryLocal","setMappingHistoryLocal","copyVerdict","copiedVerdict","prevVerdict","ex","console","log","colDefs","headerName","valueGetter","renderCell","substring","border","FormLabel","RadioGroup","FormControlLabel","control","Radio","checked","multiline","placeholder","height","hideFooterPagination","autoHeight","columns","hideFooter","disableExtendRowFullWidth","Verdict","rowId","setNewVerdict","editActiveVerdict","hammerOfThor","displayActiveVerdict","Created","Modified","accordion","backgroundColor","boxShadow","borderRadius","InformationRows","updateInformationRow","updateInformationRowUrl","editRows","AccordionDetails","RowFooter","saveComment","ApplicationRow","overridePrivileges","borderRight","home","HOME","exchange","EXCHANGE","card","ApplicationRows","removeRow","addRow","appSchools","renderApplicationRows","fontWeight","ApplicationControls","serverMessage","InformationRowDTO","ApplicationState","args","ApplicationHandlers","saveLink","MockApplicationHandlers","overrides","y","mt","i","v","u","cId","rowIdx","oId","t","SET_APPLICATION","SET_SCHOOL","REMOVE_ROW","toState","ADD_ROW","SET_STATUS","SET_ACTIVE_VERDICT","SAVE_COMMENT","SAVE_LINK","ADD_COURSE","REMOVE_COURSE","rIdx","cIdx","courseIdx","UPDATE_COURSE","UPDATE_INFORMATION_ROW","text","UPDATE_INFORMATION_ROW_URL","url","SET_YEAR","SET_MASTER_TRACK_ID","ApplicationContext","ApplicationUpdateContext","ApplicationContainer","onStatusUpdate","initialApplication","setServerMessage","setValidationMessage","app","replace","toStatus","validation","validate","result","oldId","CreateApplication","SingleApplication","match","useRouteMatch","setApplication","canEdit","applicationStatus","editMode","setPrivileges","parseInt","newStatus","flex","Schools","float","components","GridToolbar","valueOptions","Courses","setSchoolId","setCourses","newSchoolId","SingleCourse","parsedCourseId","isNaN","notFound","Users","users","setUsers","SchoolDTO","School","useUpdateSchools","countries","setCountries","parsedId","activeSchool","prevSchool","event","countryId","UserDTO","User","setUser","newUser","prevUser","Boolean","Home","latestApplication","setLatestApplication","ApplicationsAdmin","addComment","sideMargin","ApplicationRowsAdmin","setApplicationRows","Paper","borderBottom","paddingBottom","userName","masterProgram","MasterTracks","MasterTrackDTO","trackId","MasterTrack","setMasterTrack","prev","newTrack","header","headerSmall","SideMenuHelp","SideMenu","isOpen","background","top","right","zIndex","overflowY","toggleOpen","App","sideMenuIsOpen","setSideMenuIsOpen","path","exact","NotFound","window","location","hostname","ReactDOM","render","StrictMode","getElementById","navigator","serviceWorker","ready","registration","unregister"],"mappings":"sqNAUaA,G,OACE,iBADFA,EAEQ,sBAFRA,EAGC,eAHDA,EAIQ,UAJRA,EAKM,oBALNA,EAMH,WANGA,EAOJ,UAPIA,EAQL,SARKA,EASN,QATMA,EAUJ,UAVIA,EAWH,WAXGA,EAaC,eAbDA,EAcE,gB,4kBCtBR,ICeFC,EDfQC,EAAYC,IAAOC,IAAV,KAMP,SAACC,GAAD,OAAYA,EAAMC,OAAN,UAAkBD,EAAMC,OAAxB,MAAqC,WAClD,SAACD,GAAD,OAAYA,EAAME,SAAN,UAAoBF,EAAME,SAA1B,MAAyC,WACpD,SAACF,GAAD,OAAYA,EAAMG,OAAS,SAAW,W,GAGjCL,IAAOC,IAAV,K,uGEAJK,EAAa,WACzB,OAAKC,IAGG,4BAFA,QAMIA,EAAW,kBAAMC,G,0ECPjBC,EAAb,kDACC,aAAsB,IAAD,8BACpB,cAAMH,MAKAI,gBANc,sBAMI,sBAAAC,EAAA,+EACxB,EAAKC,SAASC,IAAd,0BADwB,2CANJ,EAQdC,mBARc,uCAQO,WAAOC,GAAP,SAAAJ,EAAA,+EAC3B,EAAKC,SAASC,IAAd,iCAAgEE,KADrC,2CARP,wDAUdC,qBAVc,sBAUS,sBAAAL,EAAA,+EAC7B,EAAKC,SAASC,IAAd,6BAD6B,2CAVT,EAYdI,4BAZc,sBAYgB,sBAAAN,EAAA,+EACpC,EAAKC,SAASC,IAAd,gCADoC,2CAZhB,EAgBdK,gBAhBc,uCAgBI,WAAOC,GAAP,SAAAR,EAAA,+EACxB,EAAKC,SAASQ,KAAd,oBAECD,IAHuB,2CAhBJ,wDAsBdE,YAtBc,uCAsBA,WAAOC,GAAP,SAAAX,EAAA,+EACpB,EAAKC,SAASQ,KAAd,uBAAuDE,IADnC,2CAtBA,wDAwBdC,qBAxBc,uCAwBS,WAC7BR,EACAS,GAF6B,SAAAb,EAAA,+EAI7B,EAAKC,SAASQ,KAAd,sCACgCL,EADhC,YACsCS,KALT,2CAxBT,0DA+BdC,kBA/Bc,uCA+BM,WAAOC,GAAP,SAAAf,EAAA,+EAC1B,EAAKC,SAASC,IAAd,qDAC+Ca,KAFrB,2CA/BN,wDAuCdC,WAvCc,sBAuCD,sBAAAhB,EAAA,+EACnB,EAAKC,SAASC,IAAd,gBADmB,2CAvCC,EAyCde,eAzCc,uCAyCG,WAAOb,GAAP,SAAAJ,EAAA,+EACvB,EAAKC,SAASC,IAAd,8BAAsDE,KAD/B,2CAzCH,wDA2Cdc,cA3Cc,uCA2CE,WAAOd,GAAP,SAAAJ,EAAA,+EACtB,EAAKC,SAASC,IAAd,kBAAwCE,KADlB,2CA3CF,wDA6Cde,aA7Cc,sBA6CC,sBAAAnB,EAAA,+EACrB,EAAKC,SAASC,IAAd,wBADqB,2CA7CD,EAiDdkB,WAjDc,uCAiDD,WAAOC,GAAP,SAAArB,EAAA,+EACnB,EAAKC,SAASQ,KAAd,UAAyCY,IADtB,2CAjDC,wDAuDdC,qBAvDc,uCAuDS,WAAOlB,GAAP,SAAAJ,EAAA,+EAC7B,EAAKC,SAASC,IAAd,2BAAmDE,KADtB,2CAvDT,wDAyDdmB,WAzDc,sBAyDD,sBAAAvB,EAAA,+EACnB,EAAKC,SAASC,IAAd,gBADmB,2CAzDC,EA2DdsB,cA3Dc,uCA2DE,WAAOpB,GAAP,SAAAJ,EAAA,+EACtB,EAAKC,SAASC,IAAd,kBAAwCE,KADlB,2CA3DF,wDA+DdqB,WA/Dc,uCA+DD,WAAOC,GAAP,SAAA1B,EAAA,+EACnB,EAAKC,SAASQ,KAAd,UAAyCiB,IADtB,2CA/DC,wDAoEdC,qBApEc,uCAoES,WAAOvB,GAAP,SAAAJ,EAAA,+EAC7B,EAAKC,SAASC,IAAd,oBAA+BE,GAAM,CAAEwB,aAAc,YADxB,2CApET,wDAsEdC,eAtEc,uCAsEG,WAAOC,GAAP,SAAA9B,EAAA,+EACvB,EAAKC,SAASQ,KAAd,cADuB,2CAtEH,wDAwEdsB,gBAxEc,uCAwEI,WAAOC,GAAP,SAAAhC,EAAA,+EACxB,EAAKC,SAASQ,KAAd,mBADwB,2CAxEJ,wDA8EdwB,4BAA8B,SAAC7B,GAAD,gBACjC,EAAK8B,QAD4B,mCACM9B,IA/EtB,EAoFd+B,SApFc,sBAoFH,sBAAAnC,EAAA,+EAAY,EAAKC,SAASC,IAAd,cAAZ,2CApFG,EAqFdkC,YArFc,uCAqFA,WAAOhC,GAAP,SAAAJ,EAAA,+EACpB,EAAKC,SAASC,IAAd,gBAAoCE,KADhB,2CArFA,wDAyFdiC,SAzFc,uCAyFH,WAAOC,GAAP,SAAAtC,EAAA,+EACjB,EAAKC,SAASQ,KAAd,QAAqC6B,IADpB,2CAzFG,wDA8FdC,MA9Fc,sBA8FN,sBAAAvC,EAAA,+EAAY,EAAKC,SAASC,IAAd,kBAAZ,2CA9FM,EA+FdsC,OA/Fc,sBA+FL,sBAAAxC,EAAA,+EAAY,EAAKC,SAASQ,KAAd,mBAAZ,2CA/FK,EAgGdgC,eAhGc,sBAgGG,sBAAAzC,EAAA,+EACvB,EAAKC,SAASC,IAAd,iBADuB,2CAhGH,EAqGdwC,gBArGc,sBAqGI,sBAAA1C,EAAA,+EACxB,EAAKC,SAASC,IAAd,0BADwB,2CArGJ,EAuGdyC,eAvGc,uCAuGG,WAAOvC,GAAP,SAAAJ,EAAA,+EACvB,EAAKC,SAASC,IAAd,+BAA0DE,KADnC,2CAvGH,wDAyGdwC,gBAzGc,uCAyGI,WAAOC,GAAP,SAAA7C,EAAA,+EACxB,EAAKC,SAASQ,KAAd,uBAA2DoC,IADnC,2CAzGJ,wDADtB,WCiBC,WAAmBX,GAAkB,IAAD,gCAHjBjC,cAGiB,OAF1BiC,aAE0B,OAW5BY,+BAAiC,WACxC,EAAK7C,SAAS8C,aAAaC,SAASC,IACnC,EAAKC,gBACL,EAAKC,eAd6B,KAkB5BD,gBAAkB,qBAAGL,MAlBO,KAoB1BM,aAAe,SAACC,GAAD,OAAgBC,QAAQC,OAAOF,IAnBvDG,KAAKrB,QAAUA,EACfqB,KAAKtD,SAAWuD,IAAMC,OAAO,CAC5BvB,UACAwB,QAAS,CACR,eAAgB,qCAGlBH,KAAKT,oCHzBDa,EAAcC,IAAMC,mBAAiCC,GACrDC,EAAoBH,IAAMC,mBAAoCC,I,SAE/D3E,O,6BAAAA,I,mCAAAA,I,iBAAAA,I,oBAAAA,M,KAuBL,II1BKA,GJ0BC6E,GAAU,SAACC,EAAcC,GAC9B,OAAQA,EAAOC,MACd,KAAKhF,EAAWiF,YACf,MAAO,CACNC,gBAAiBH,EAAOI,QACxBhC,KAAM4B,EAAOI,SAEf,KAAKnF,EAAWoF,eACf,OAAO,2BACHN,GADJ,IAECI,eAAe,IAEjB,KAAKlF,EAAWqF,MACf,OAAO,2BACHP,GADJ,IAECI,eAAe,IAEjB,KAAKlF,EAAWsF,OACf,OAAO,2BACHR,GADJ,IAECI,eAAe,IAEjB,QACC,OAAOJ,IAIJS,GAAe,CACpBpC,KAAM,MAGDqC,GAAM,IAAI7E,EACH8E,GAAe,SAAC,GAAiD,IAA/CC,EAA8C,EAA9CA,SAA8C,EAClDjB,IAAMkB,WAC/Bd,GACAU,IAH2E,mBACrET,EADqE,KAC9Dc,EAD8D,KAMtEC,EAAiBpB,IAAMqB,aAAY,WACxCN,GAAIlC,iBACFyC,MAAK,SAAC5C,GACNyC,EAAS,CAAEZ,KAAMhF,EAAWiF,YAAaE,QAAShC,OAElD6C,OAAM,SAACC,GACPL,EAAS,CAAEZ,KAAMhF,EAAWoF,sBAE5B,IAEHX,IAAMyB,WAAU,WACfL,MACE,CAACA,IAEJ,IAAMzC,EAAQqB,IAAMqB,aAAY,WAC/BN,GAAIpC,QAAQ2C,MAAK,SAAC5C,GACjByC,EAAS,CAAEZ,KAAMhF,EAAWqF,MAAOF,QAAShC,SAE3C,IAEGE,EAASoB,IAAMqB,aAAY,WAChCN,GAAInC,SAAS0C,MAAK,SAACI,GAClBP,EAAS,CAAEZ,KAAMhF,EAAWsF,cAE3B,IAEH,OACC,kBAACd,EAAY4B,SAAb,CAAsBC,MAAOvB,GAC5B,kBAACF,EAAkBwB,SAAnB,CACCC,MAAO,CAAER,iBAAgBzC,QAAOC,WAE/BqC,KAMQY,GAAU,WACtB,IAAMD,EAAQ5B,IAAM8B,WAAW/B,GAE/B,IAAK6B,EACJ,MAAM,IAAIG,MAAM,mDAGjB,OAAOH,G,SIjHFI,GAAgBhC,IAAMC,mBAAiCC,GACvD+B,GAAsBjC,IAAMC,mBACjCC,I,SAGI3E,O,6BAAAA,I,8BAAAA,Q,KAeL,ICbKA,GDaC6E,GAAU,SAACC,EAAcC,GAC9B,OAAQA,EAAOC,MACd,KAAKhF,GAAW2G,YACf,OAAO5B,EAAOI,QACf,KAAKnF,GAAW4G,YACf,GAAI9B,EAAO,CACV,IAAI+B,GAAQ,EACNC,EAAahC,EAAMiC,KAAI,SAACC,GAC7B,OAAIA,EAAE/F,KAAO8D,EAAOI,QAAQlE,IAC3B4F,GAAQ,EACD9B,EAAOI,SACD6B,KAEf,OAAKH,EACOC,EADM,GAAN,oBAAWhC,GAAX,CAAkBC,EAAOI,UAGvC,QACC,OAAOL,IAKJU,GAAM,IAAI7E,EACHsG,GAAiB,SAAC,GAAiD,IAA/CvB,EAA8C,EAA9CA,SAA8C,EACpDjB,IAAMkB,WAC/Bd,GAJmB,MAE0D,mBACvEC,EADuE,KAChEc,EADgE,KAM9EnB,IAAMyB,WAAU,WACfrE,MACE,IAEH,IAAMA,EAAa4C,IAAMqB,aAAY,WACpCN,GAAI3D,aAAakE,MAAK,SAACrC,GAAD,OACrBkC,EAAS,CACRZ,KAAMhF,GAAW2G,YACjBxB,QAASzB,SAGT,IAEGzB,EAAawC,IAAMqB,aACxB,SAACoB,GAAD,OACC1B,GAAIvD,WAAWiF,GAAWnB,MAAK,SAAC7D,GAK/B,OAJA0D,EAAS,CACRZ,KAAMhF,GAAW4G,YACjBzB,QAASjD,IAEHA,OAET,IAGD,OACC,kBAACuE,GAAcL,SAAf,CAAwBC,MAAOvB,GAC9B,kBAAC4B,GAAoBN,SAArB,CAA8BC,MAAO,CAAEpE,eACrCyD,KAMQyB,GAAa,WACzB,IAAMd,EAAQ5B,IAAM8B,WAAWE,IAE/B,QAAc9B,IAAV0B,EACH,MAAM,IAAIG,MAAM,sDAGjB,OAAOH,GCxFFe,GAAgB3C,IAAMC,mBAAiCC,GACvD0C,GAAsB5C,IAAMC,mBACjCC,I,SAGI3E,O,6BAAAA,I,6BAAAA,I,8BAAAA,Q,KAoBL,ICpCYsH,GAMAC,GAOAC,GAMAC,GAKAC,GDYN7C,GAAU,SAACC,EAAcC,GAC9B,OAAQA,EAAOC,MACd,KAAKhF,GAAW2H,YACf,OAAO5C,EAAOI,QAEf,KAAKnF,GAAW4H,YACf,IAAMC,EAA8C,GACpD,OAAO/C,EAAMgD,OAAO/C,EAAOI,SAAS4C,QAAO,SAACC,GAC3C,OAAKH,EAAgBG,EAAE/G,MACtB4G,EAAgBG,EAAE/G,KAAM,GACjB,MAKV,KAAKjB,GAAWiI,YACf,GAAInD,EAAO,CACV,IAAI+B,GAAQ,EACNqB,EAAapD,EAAMiC,KAAI,SAACC,GAC7B,OAAIA,EAAE/F,KAAO8D,EAAOI,QAAQlE,IAC3B4F,GAAQ,EACD9B,EAAOI,SACD6B,KAEf,OAAKH,EACOqB,EADM,GAAN,oBAAWpD,GAAX,CAAkBC,EAAOI,UAGvC,QACC,OAAOL,IAIJS,GAA4B,GAC5BC,GAAM,IAAI7E,EACHwH,GAAiB,SAAC,GAAiD,IAA/CzC,EAA8C,EAA9CA,SAA8C,EACpDjB,IAAMkB,WAC/Bd,GACAU,IAH6E,mBACvET,EADuE,KAChEc,EADgE,KAMxExD,EAAaqC,IAAMqB,aAAY,WACpCN,GAAIpD,aAAa2D,MAAK,SAACrC,GACtBkC,EAAS,CACRZ,KAAMhF,GAAW2H,YACjBxC,QAASzB,SAGT,IAEG0E,EAAwB3D,IAAMqB,aAAY,WAAmB,IAAD,uBAAduC,EAAc,yBAAdA,EAAc,gBACjEnE,QAAQoE,IAAID,EAAUtB,KAAI,SAAC9F,GAAD,OAAQuE,GAAIrD,qBAAqBlB,OAAM8E,MAChE,SAACwC,GACA3C,EAAS,CACRZ,KAAMhF,GAAW4H,YACjBzC,QAASoD,EAAQC,cAIlB,IAEGlG,EAAamC,IAAMqB,aAAY,SAACvD,GACrC,OAAOiD,GAAIlD,WAAWC,GAAQwD,MAAK,SAAC0C,GAKnC,OAJA7C,EAAS,CACRZ,KAAMhF,GAAWiI,YACjB9C,QAASsD,IAEHA,OAEN,IAEH,OACC,kBAACrB,GAAchB,SAAf,CAAwBC,MAAOvB,GAC9B,kBAACuC,GAAoBjB,SAArB,CACCC,MAAO,CAAEjE,aAAYgG,wBAAuB9F,eAE3CoD,KAMQgD,GAAa,WACzB,IAAMrC,EAAQ5B,IAAM8B,WAAWa,IAE/B,IAAKf,EACJ,MAAM,IAAIG,MAAM,sDAGjB,OAAOH,GAGKsC,GAAmB,WAC/B,IAAMtC,EAAQ5B,IAAM8B,WAAWc,IAE/B,IAAKhB,EACJ,MAAM,IAAIG,MACT,kEAIF,OAAOH,GEnHFuC,GAAYC,aAAW,SAACC,GAAD,OAC5BC,YAAa,CACZC,KAAM,CACLC,SAAU,GAEXC,WAAY,CACXC,YAAaL,EAAMM,QAAQ,IAE5BC,MAAO,CACNJ,SAAU,QAkLEK,GA3KA,SAAClJ,GAAwB,IAAD,EACNkG,KAAxBnD,EAD8B,EAC9BA,KAAM+B,EADwB,EACxBA,cADwB,EPwFV,WAC5B,IAAMmB,EAAQ5B,IAAM8B,WAAW3B,GAE/B,IAAKyB,EACJ,MAAM,IAAIG,MACT,8DAIF,OAAOH,EO/FmBkD,GACpBC,GAHgC,EAE9BpG,MAF8B,EAEvBC,OACCuF,MAHsB,EAINnE,IAAMgF,SAAyB,MAJzB,mBAI/BC,EAJ+B,KAIrBC,EAJqB,KAUhCC,EAAkB,SAACC,GACxBF,EAAY,OAePG,EAAY,CACjB,CACCT,MAAO,OACPU,QAAS,IACTC,eAAe,GAEhB,CACCX,MAAO,sBACPU,QAAShK,EACTiK,eAAe,GAOhB,CACCX,MAAO,eACPU,QAAShK,EACTiK,eAAe,GAEhB,CACCX,MAAO,mBACPU,QAAShK,EACTiK,eAAe,GAEhB,CACCX,MAAO,QACPU,QAAShK,EACTiK,eAAe,GAEhB,CACCX,MAAO,UACPU,QAAShK,EACTiK,eAAe,GAEhB,CACCX,MAAO,eACPU,QAAShK,EACTiK,eAAe,GAEhB,CACCX,MAAO,SACPU,QAAShK,EACTiK,eAAe,IAIjB,OACC,yBAAKC,UAAWT,EAAQR,MACvB,kBAACkB,EAAA,EAAD,CAAQC,SAAS,SAChB,kBAACC,EAAA,EAAD,KACC,kBAACC,EAAA,EAAD,CACCC,KAAK,QACLL,UAAWT,EAAQN,WACnBqB,MAAM,UACNC,aAAW,OACXC,QA7E0D,SAACC,GAC/Df,EAAYe,EAAEC,UA8EV,kBAAC,IAAD,OAEAxH,EACA,kBAAC,IAAD,CACClC,GAAG,cACHyI,SAAUA,EACVkB,aAAc,CACbC,SAAU,MACVC,WAAY,QAEbC,aAAW,EACXC,gBAAiB,CAChBH,SAAU,MACVC,WAAY,QAEbG,OAAQvB,EACRwB,QAAS,kBAAMvB,EAAY,QAE1BG,EACC/B,QACA,gBAAGiC,EAAH,EAAGA,cAAH,OACE7G,GACA6G,IADA,OAEA7G,QAFA,IAEAA,OAFA,EAEAA,EAAMgI,WACNnB,KAEFjD,KAAI,gBAAGsC,EAAH,EAAGA,MAAOU,EAAV,EAAUA,QAAV,OACJ,kBAACqB,EAAA,EAAD,CACCC,UAAWC,IACXC,MAAO,CACNhB,MAAO,UACPiB,eAAgB,QAEjBC,GAAI1B,EACJ2B,IAAKrC,EACLoB,QAASb,GAERP,OAIF,KACJ,kBAACsC,EAAA,EAAD,CAAYC,QAAQ,KAAK3B,UAAWT,EAAQH,OAA5C,mBAGA,kBAACsC,EAAA,EAAD,CAAYC,QAAQ,QAAQL,MAAO,CAAElL,OAAQ,KApI/B,SAAC8C,GAAD,OAA8B,OAAJA,QAAI,IAAJA,OAAA,EAAAA,EAAM0I,OAAQ,KAqIpDC,CAAW3I,IAEZ+B,EACA,kBAAC6G,EAAA,EAAD,CACCH,QAAQ,WACRrB,MAAM,YACNgB,MAAO,CAAElL,OAAQ,IACjBoK,QAAS,SAACC,GAAD,OAAOtK,EAAM4L,mBAJvB,gBAQG,KACH9G,EACA,kBAAC6G,EAAA,EAAD,CACCH,QAAQ,WACRrB,MAAM,UACN0B,KAAK,qBACLV,MAAO,CACNlL,OAAQ,GACR6L,YAAa,OACb3B,MAAO,SAPT,UAaA,kBAACwB,EAAA,EAAD,CACCH,QAAQ,WACRL,MAAO,CAAEW,YAAa,OAAQ3B,MAAO,QACrC0B,KAAMzL,IAAe,kBAHtB,aCnLS2L,GAXQ,SAAC/L,GAA+C,IAAD,EACrCkG,KAAxBpB,EAD6D,EAC7DA,cAAe/B,EAD8C,EAC9CA,KACvB,QAAsBwB,IAAlBO,EAA6B,OAAO,yCACxC,IAAKA,GAAkB9E,EAAM+K,WAAW,OAAChI,QAAD,IAACA,OAAD,EAACA,EAAMgI,SAAU,CAExD,OAAO,kBAAC,IAAD,iBAAW/K,EAAX,CAAkBiL,UADD,kBAAM,kBAAC,IAAD,CAAUI,GAAI,CAAEW,SAAU,WAGxD,OAAO,kBAAC,IAAUhM,I,2FFXRkH,O,mBAAAA,I,uBAAAA,I,sBAAAA,Q,cAMAC,O,yBAAAA,I,uBAAAA,I,yEAAAA,I,wBAAAA,Q,cAOAC,O,qBAAAA,I,uBAAAA,I,oBAAAA,Q,cAMAC,O,iBAAAA,I,gBAAAA,Q,cAKAC,O,aAAAA,I,iCAAAA,I,qCAAAA,I,uBAAAA,I,uBAAAA,I,oBAAAA,Q,KASL,IAAM2E,GAAc,CAC1B,CAAEpL,GAAIwG,GAAQ6E,MAAOnB,QAAS1D,GAAQ6E,OACtC,CAAErL,GAAIwG,GAAQ8E,KAAMpB,QAAS1D,GAAQ8E,OAGzBC,GAAc,CAC1B,CAAEvL,GAAIuG,GAAWiF,QAASZ,KAAM,WAChC,CAAE5K,GAAIuG,GAAWkF,SAAUb,KAAM,YACjC,CAAE5K,GAAIuG,GAAWmF,OAAQd,KAAM,WAGnBe,GAAS,CACrB,CAAE3L,GAAIqG,GAAYuF,OAAQhB,KAAM,UAChC,CAAE5K,GAAIqG,GAAYwF,SAAUjB,KAAM,YAClC,CAAE5K,GAAIqG,GAAYyF,QAASlB,KAAM,YAG3B,SAASmB,GAAUlI,GACzB,OAAQA,GACP,KAAK0C,GAAWkF,SACf,MAAO,WACR,KAAKlF,GAAWmF,OACf,MAAO,SACR,QACC,MAAO,WAwBH,SAASM,GAAenI,GAC9B,OAAQA,GACP,KAAKyC,GAAc2F,SAClB,MAAO,WACR,KAAK3F,GAAc4F,kCAClB,MAAO,uCACR,KAAK5F,GAAc6F,SAClB,MAAO,WACR,QACC,MAAO,aAIH,SAASC,GAAcvI,GAC7B,OAAQA,GACP,KAAK4C,GAAkB4F,IACtB,MAAO,MACR,KAAK5F,GAAkB6F,cACtB,MAAO,gBACR,KAAK7F,GAAkB8F,gBACtB,MAAO,mBACR,KAAK9F,GAAkBwF,SACtB,MAAO,WACR,KAAKxF,GAAkB+F,OACtB,MAAO,SACR,KAAK/F,GAAkB0F,SACtB,MAAO,WACR,QACC,MAAO,kBAcH,SAASM,GAAqB5I,GACpC,OAAQA,GACP,KAAK4C,GAAkB4F,IACtB,MAAO,uCACR,KAAK5F,GAAkB6F,cACtB,MAAO,6IACR,KAAK7F,GAAkB8F,gBACtB,MAAO,uCACR,KAAK9F,GAAkBwF,SACtB,MAAO,oCACR,KAAKxF,GAAkB+F,OACtB,MAAO,kDACR,KAAK/F,GAAkB0F,SACtB,MAAO,oCACR,QACC,MAAO,kB,wBGvHJ/M,GAAS,CACdsN,aAAc,OACdxE,YAAa,QAER3D,GAAM,IAAI7E,EAiHDiN,GA/GM,WACpB,IAAMC,EAAUC,cADU,EAGcrE,mBAEtC,MALwB,mBAGnBsE,EAHmB,KAGLC,EAHK,OAMUvE,oBAAkB,GAN5B,mBAMnBwE,EANmB,KAMPC,EANO,KAuB1B,OAJAhI,qBAAU,WAVTV,GAAI5E,kBAAkBmF,MAAK,SAACrC,GAAD,OAAUsK,EAAgBtK,QAYnD,IAEEqK,EAGJ,qCACkB,IAAfE,IAAA,OAAuBF,QAAvB,IAAuBA,OAAvB,EAAuBA,EAAcI,QACtC,kBAACC,GAAA,EAAD,CAAOC,SAAS,WACf,kBAACC,GAAA,EAAD,gBADD,gDAE0C,IACzC,wEAEE,KACJ,kBAAC,KAAD,CAAW/C,MAAO,CAAEgD,UAAW,WAC9B,kBAACxC,EAAA,EAAD,CACCH,QAAQ,YACRrB,MAAM,YACNiE,KAAK,QACLjD,MAAO,CAAElL,OAAQ,QACjBoK,QAAS,SAACC,GA3BK,GAAduD,IAAwBF,GAAgB,IAAII,OAAS,EACxDD,GAAc,GAEdL,EAAQY,KAAK1O,IAyBX2O,UAAW,kBAAC,KAAD,OANZ,mBAUCX,EAAaI,OAAS,GACtBJ,EAAahH,KAAI,SAAClG,GAAD,iBAChB,kBAAC,KAAD,CACC6K,IAAK7K,EAAEI,GACP0N,UAAW,EACXpD,MAAO,CACNqD,QAAS,OACTjB,aAAc,OACdkB,UAAW,SAGZ,kBAAClD,EAAA,EAAD,CAAYC,QAAQ,KAAKL,MAAO,CAAElL,OAAQ,SAA1C,sBACiBQ,EAAEI,KAEnB,kBAAC6N,GAAA,EAAD,CACCC,KAAG,EACHxD,MAAO,CACNyD,QAAS,OACTC,eAAgB,WAGjB,kBAACC,GAAA,EAAD,CACClK,KAAK,OACLqB,MAAK,OAAExF,QAAF,IAAEA,GAAF,UAAEA,EAAGqB,cAAL,aAAE,EAAW2J,KAClBsD,WAAY,CAAEC,UAAU,GACxBC,MAAM,SACN9D,MAAOlL,KAER,kBAAC6O,GAAA,EAAD,CACClK,KAAK,OACLqB,MAAK,OAAExF,QAAF,IAAEA,GAAF,UAAEA,EAAGqB,cAAL,iBAAE,EAAWoN,eAAb,aAAE,EAAoBzD,KAC3BwD,MAAM,UACN9D,MAAOlL,GACP8O,WAAY,CAAEC,UAAU,KAEzB,kBAACF,GAAA,EAAD,CACClK,KAAK,OACLqB,MAAK,OAAExF,QAAF,IAAEA,OAAF,EAAEA,EAAG0O,KACVF,MAAM,OACN9D,MAAOlL,GACP8O,WAAY,CAAEC,UAAU,KAEzB,kBAACF,GAAA,EAAD,CACClK,KAAK,OACLqB,MAAOgH,GAAa,OAACxM,QAAD,IAACA,OAAD,EAACA,EAAGa,QACxB2N,MAAM,SACN9D,MAAOlL,GACP8O,WAAY,CAAEC,UAAU,MAG1B,kBAAC,IAAD,CACC3D,GAAE,UAAK1L,EAAL,YAA2Bc,EAAEI,IAC/ByK,IAAK7K,EAAEI,GACPgJ,UAAU,iBAEV,kBAACI,EAAA,EAAD,CAAYG,aAAW,SAASD,MAAM,WACrC,kBAAC,KAAD,CAAUiF,SAAS,kBA9ED,2D,QCrCdC,GAQZ,aAAsC,IAA1BC,EAAyB,iFAPrCC,aAOqC,OANrCC,eAMqC,OALrCC,cAKqC,OAJrCC,gBAIqC,OAHrChL,WAGqC,OAFrCiL,gBAEqC,EACpC3L,KAAKU,MAAQwC,GAAYuF,OACzBzI,KAAKwL,UAAY,GACjBxL,KAAK0L,WAAa,GAClB1L,KAAK2L,aAAaL,QAAyB/K,GCDhCqL,GAAb,kDAaC,WAAY7M,GAAiB,IAAD,8BAC3B,gBAbDlC,QAY4B,IAX5BgP,YAW4B,IAV5BC,cAU4B,IAT5BX,UAS4B,IAR5B7N,YAQ4B,IAP5BQ,YAO4B,IAN5BiO,mBAM4B,IAL5BC,iBAK4B,IAJ5BC,qBAI4B,IAH5BxN,eAG4B,IAF5BM,UAE4B,EAE3B,EAAKlC,GAAK,EACV,EAAKgP,QAAa,OAAJ9M,QAAI,IAAJA,OAAA,EAAAA,EAAMlC,KAAM,EAC1B,EAAKiP,SAAW,EAChB,EAAKC,cAAgB,EACrB,EAAKZ,MAAO,IAAIe,MAAOC,cACvB,EAAK7O,OAAS,EACd,EAAK2O,gBAAkB,GACvB,EAAKlN,KAAOA,QAAQwB,EATO,EAb7B,UAAwC8K,ICD3Be,GAAb,kDAcC,WAAYN,GAAoB,IAAD,8BAC9B,gBAdDjP,QAa+B,IAZ/BiP,cAY+B,IAX/BtO,yBAW+B,IAV/B6O,UAU+B,IAT/BpH,WAS+B,IAR/BqH,kBAQ+B,IAP/BC,iBAO+B,IAN/BC,WAM+B,IAL/B/N,eAK+B,IAJ/BmM,aAI+B,IAH/B9M,YAG+B,IAF/B2O,oBAE+B,EAE9B,EAAK5P,GAAK,EACV,EAAKiP,SAAWA,GAAY,EAC5B,EAAKO,KAAO,GACZ,EAAKpH,MAAQ,GACb,EAAKqH,aAAe,EACpB,EAAKC,YAAc,EACnB,EAAKC,MAAQpJ,GAAWiF,QACxB,EAAKuC,SAAU,EATe,EAdhC,UAA+BS,ICFlBqB,GAAb,kDAaC,WAAY7P,GAAc,IAAD,8BACxB,gBAbDA,QAYyB,IAXzB8P,uBAWyB,IAVzBnP,yBAUyB,IATzBoP,aASyB,IARzBC,iBAQyB,IAPzBvP,YAOyB,IANzBwP,qBAMyB,IALzBC,iBAKyB,IAJzBC,mBAIyB,IAHzBC,cAGyB,IAFzBC,oBAEyB,EAEpBrQ,IAAI,EAAKA,GAAKA,GAClB,EAAK8P,kBAAoB,EACzB,EAAKnP,oBAAsB,EAC3B,EAAKoP,QAAU,GACf,EAAKC,YAAc,GACnB,EAAKvP,OAAS,EACd,EAAKwP,gBAAkB,CAAC,IAAIV,IAC5B,EAAKW,YAAc,CAAC,IAAIX,IATA,EAb1B,UAAuCf,I,sECNjC8B,GAAM,SAACvK,GAAD,MAAwB,WAAIA,GAAIwK,OAAO,IAC7CC,GAAa,SAACC,GAAD,gBACfA,EAAEnB,cADa,YACIgB,GAAIG,EAAEC,WAAa,GADvB,YAC6BJ,GAAIG,EAAEE,WADnC,YACiDL,GAClEG,EAAEG,YAFe,YAGbN,GAAIG,EAAEI,gBAuBGC,GArBI,SAAC3R,GAA6B,IAAD,EACMA,EAAMsD,KAAnDiM,EADuC,EACvCA,QAASC,EAD8B,EAC9BA,UAAWC,EADmB,EACnBA,SAAUC,EADS,EACTA,WAEtC,OACC,kBAAC7P,EAAD,KACE0P,GAAWC,GACX,2BACE,cADF,IACiB,gCAASA,GAD1B,IAC+C,OAC7C6B,GAAW,IAAInB,KAAKX,KAGtBE,GAAYC,GACZ,2BACE,oBADF,IACuB,gCAASA,GADhC,IACsD,OACpD2B,GAAW,IAAInB,KAAKT,O,UC/BpBmC,GAAW,SAACnR,GAAD,MAAqC,iBAALA,GAAsB,MAALA,GASrDoR,GAAa,SACzBC,EACAC,GAKA,IAAMC,EAAc3N,IAAM4N,QAClB,OAAPF,QAAO,IAAPA,OAAA,EAAAA,EAASG,yBAA0BJ,GAG9BK,EAAiB9N,IAAMqB,aAAY,SAACjF,EAAQ2R,GACjD,OAAI3R,IAAM2R,MAGNR,GAASnR,KAAMmR,GAASQ,MAE1BC,OAAOC,KAAK7R,GAAGsN,SAAWsE,OAAOC,KAAKF,GAAGrE,QACzCsE,OAAOC,KAAK7R,GACVkH,QAAO,SAAC2D,GAAD,MAAiB,eAARA,KAChBiH,OACA,SAACjH,GAAD,OACC8G,EAAEI,eAAelH,IACjB6G,EAAe1R,EAAE6K,GAAM8G,EAAE9G,UAK5B,IAEGmH,EAAmBpO,IAAMqB,aAC9B,SAACgN,GACAV,EAAYW,QAAUD,IAEvB,CAACV,IAGF,MAAO,EACC,OAAPD,QAAO,IAAPA,OAAA,EAAAA,EAASa,qBACLb,EAAQa,mBAAmBd,EAAcE,EAAYW,UACrDR,EAAeL,EAAcE,EAAYW,SAC7CF,IChCIjK,GAAYC,aAAW,SAACC,GAAD,MAAY,CACxCmK,MAAO,CACNtF,aAAc,OACdxE,YAAa,QAEd+J,OAAQ,CACP7S,OAAQ,mBAET8S,YAAa,CACZ9S,OAAQyI,EAAMM,QAAQ,GACtBgK,SAAU,KAEXC,YAAa,CACZxE,UAAW/F,EAAMM,QAAQ,QA+NZkK,GArNA,SAAC,GAA8D,IAA5DpD,EAA2D,EAA3DA,SAAUqD,EAAiD,EAAjDA,cAAeC,EAAkC,EAAlCA,eAAkC,EAChD/J,mBAC3B8J,IAAkBrD,EAAW,IAAIM,GAAUN,GAAY,IAAIM,KAFgB,mBACrEjO,EADqE,KAC7DkR,EAD6D,KAIpEnR,EAAeqG,KAAfrG,WACAa,EAASmD,KAATnD,KACFgI,EAAO,OAAGhI,QAAH,IAAGA,OAAH,EAAGA,EAAMgI,QAChB5C,EAAUpB,KACVuM,ElBxBuB,IkBwBR,OAANnR,QAAM,IAANA,OAAA,EAAAA,EAAQ2N,UACjB1G,EAAUZ,KAT4D,EAUlDa,mBAAS,IAVyC,mBAUrExF,EAVqE,KAU9D0P,EAV8D,OAWxC1B,GAAW1P,GAX6B,mBAWrEqR,EAXqE,KAW5Df,EAX4D,KAatEgB,EAAc,SAACZ,EAAwB5M,GAC5CoN,GAAU,SAACK,GAAD,mBAAC,eAAqBA,GAAtB,mBAAmCb,EAAQ5M,QAmCtD,OAAKkC,EACGhG,EAGP,kBAACtC,EAAD,KACC,0BAAM8T,SApBa,SAACrJ,GACrBA,EAAEsJ,iBACGzR,GACLD,EAAWC,GACTwD,MAAK,SAACkO,GACNR,EAAUQ,GACVpB,EAAiBoB,GACjBN,EAAS,IACK,OAAdH,QAAc,IAAdA,KAAiBS,MAEjBjO,OAAM,SAAC/B,GAAW,IAAD,IACjB0P,EAAS,kBAAY1P,QAAZ,IAAYA,GAAZ,UAAYA,EAAOJ,gBAAnB,iBAAY,EAAiBH,YAA7B,aAAY,EAAuBwQ,eAU5C,kBAACpF,GAAA,EAAD,CAAWC,KAAG,GACb,kBAACG,GAAA,EAAD,CACClK,KAAK,OACLqB,MAAO9D,EAAOkO,KACdpB,MAAM,OACNzD,QAAQ,WACR3B,UAAWT,EAAQyJ,MACnBkB,SAAU,SAACzJ,GAAD,OAAOmJ,EAAY,OAAQnJ,EAAEC,OAAOtE,UAE/C,kBAAC6I,GAAA,EAAD,CACClK,KAAK,OACLqB,MAAO9D,EAAO8G,MACdgG,MAAM,QACNzD,QAAQ,WACR3B,UAAWT,EAAQyJ,MACnBkB,SAAU,SAACzJ,GAAD,OAAOmJ,EAAY,QAASnJ,EAAEC,OAAOtE,WAGjD,kBAACyI,GAAA,EAAD,CAAWC,KAAG,GACb,kBAACG,GAAA,EAAD,CACClK,KAAK,SACLqB,MAAO9D,EAAOoO,YACdtB,MAAM,eACNzD,QAAQ,WACR3B,UAAWT,EAAQyJ,MACnBkB,SAAU,SAACzJ,GAAD,OA/DS0J,EA+DaC,OAAO3J,EAAEC,OAAOtE,YA9DpDoN,GACC,SAACK,GAAD,mBAAC,eAEIA,GAFL,IAGEnD,YAAayD,GACTV,GAAU,CAAEhD,aAAc0D,OANX,IAACA,KAiElBV,EAcE,KAbH,kBAACxE,GAAA,EAAD,CACClK,KAAK,SACLqB,MAAO9D,EAAOmO,aACdrB,MAAM,0BACNzD,QAAQ,WACR3B,UAAWT,EAAQyJ,MACnBkB,SAAU,SAACzJ,GAAD,OACTmJ,EACC,eACAQ,OAAO3J,EAAEC,OAAOtE,YAMrB,kBAACyI,GAAA,EAAD,CAAWC,KAAG,GACXxG,GAAY4C,EACb,kBAACmJ,GAAA,EAAD,CACC1I,QAAQ,WACR3B,UAAWT,EAAQ2J,aAEnB,kBAACoB,GAAA,EAAD,CAAYtT,GAAG,2BAAf,cAGA,kBAACuT,GAAA,EAAD,CACCnO,MAAO9D,EAAO2N,SACdiE,SAAU,SAACzJ,GAAD,OAlFC,SAACwF,GAClB,IAAIhO,EAAM,OAAGqG,QAAH,IAAGA,OAAH,EAAGA,EAASkM,MAAK,SAACzN,GAAD,OAAOA,EAAE/F,KAAOiP,KAC3CuD,GACC,SAACK,GAAD,mBAAC,eAAqBA,GAAtB,IAAkC5R,SAAQgO,gBAgFpCwE,CAAUhK,EAAEC,OAAOtE,QAEpBsO,cAAY,EACZC,QAAQ,0BACRvF,MAAM,aACNpF,UAAWT,EAAQyJ,OAEnB,kBAAC7H,EAAA,EAAD,CAAUyJ,UAAQ,EAACxO,MAAO,GACzB,qCAEAkC,EAAQxB,KAAI,SAACC,GAAD,OACZ,kBAACoE,EAAA,EAAD,CAAU/E,MAAOW,EAAE/F,GAAIyK,IAAK1E,EAAE/F,IAC5B+F,EAAE6E,WAvBgB,KA6BxB,kBAACyI,GAAA,EAAD,CAAa1I,QAAQ,WAAW3B,UAAWT,EAAQyJ,OAClD,kBAACsB,GAAA,EAAD,CAAYtT,GAAG,sBAAf,eAGA,kBAACuT,GAAA,EAAD,CACCnO,MAAO9D,EAAOqO,MACduD,SAAU,SAACzJ,GAAD,cACT+I,QADS,IACTA,OADS,EACTA,GACC,SAACK,GAAD,mBAAC,eAEIA,GAFL,IAGElD,MAAOyD,OAAO3J,EAAEC,OAAOtE,aAI3BsO,cAAY,EACZ1K,UAAWT,EAAQyJ,MACnB5D,MAAM,cACNuF,QAAQ,sBAEPpI,GAAYzF,KAAI,SAACC,GACjB,OACC,kBAACoE,EAAA,EAAD,CAAU/E,MAAOW,EAAE/F,GAAIyK,IAAK1E,EAAE/F,IAC5B+F,EAAE6E,WAOPV,EACA,oCACC,kBAACmJ,GAAA,EAAD,CACC1I,QAAQ,WACR3B,UAAWT,EAAQ2J,aAEnB,kBAACoB,GAAA,EAAD,CAAYtT,GAAG,uBAAf,UAGA,kBAACuT,GAAA,EAAD,CACCnO,MAAO9D,EAAOuC,MACdqP,SAAU,SAACzJ,GAAD,cACT+I,QADS,IACTA,OADS,EACTA,GACC,SAACK,GAAD,mBAAC,eAEIA,GAFL,IAGEhP,MAAOuP,OACN3J,EAAEC,OAAOtE,aAKdsO,cAAY,EACZ1K,UAAWT,EAAQyJ,MACnB5D,MAAM,SACNuF,QAAQ,uBAEPhI,GAAO7F,KAAI,SAACC,GAAD,OACX,kBAACoE,EAAA,EAAD,CAAU/E,MAAOW,EAAE/F,GAAIyK,IAAK1E,EAAE/F,IAC5B+F,EAAE6E,YAML,OAEA,OAAJ1I,QAAI,IAAJA,OAAA,EAAAA,EAAMgI,UAAW,kBAAC,GAAD,CAAYzH,KAAMnB,IACpC,kBAACwJ,EAAA,EAAD,CACCH,QAAQ,YACRrB,MAAM,UACNiE,KAAK,QACLvE,UAAWT,EAAQ0J,OACnB2B,UAAWjB,EACX5O,KAAK,SACLqB,MAAM,QAPP,QAWA,2BAAIpC,KA5JN,qDAFoB,kDCtCP6Q,GArCK,SAAC,GAKF,IAJlB5E,EAIiB,EAJjBA,SACAjF,EAGiB,EAHjBA,KACAC,EAEiB,EAFjBA,QACAqI,EACiB,EADjBA,cAEA,OACC,kBAACwB,GAAA,EAAD,CAAQ9J,KAAMA,EAAMC,QAASA,GAC5B,yBAAKK,MAAO,CAAEqD,QAAS,SACtB,kBAACoG,GAAA,EAAD,KACC,kBAACC,GAAA,EAAD,CACCjG,QAAQ,OACRkG,WAAW,SACXjG,eAAe,iBAEf,kBAACgG,GAAA,EAAD,CAAKhM,SAAU,GAAf,aACY,InBNY,GmBOtBiH,EAA6B,OAAS,WAAY,IAFpD,UAKA,kBAAC+E,GAAA,EAAD,KACC,kBAAC5K,EAAA,EAAD,CAAYI,QAASS,GACpB,kBAAC,KAAD,UAKJ,kBAAC,GAAD,eACCgF,SAAUA,GACLqD,GAAiB,CAAEA,iBAFzB,CAGCC,eAAgBtI,QCkBNiK,GAtDO,SAAC,GAAkD,IAAhDjF,EAA+C,EAA/CA,SAAUkF,EAAqC,EAArCA,WAAqC,EAC7C3L,mBAA+C,CACxEwB,MAAM,IAFgE,mBAChEoK,EADgE,KACzDC,EADyD,KAKjEC,EAA6B9Q,IAAMqB,aAAY,SAACoK,GACrDoF,EAAS,CAAEpF,WAAUjF,MAAM,MACzB,IAEGuK,EAAqB/Q,IAAMqB,aAAY,WAC5CwP,EAAS,CAAErK,MAAM,MACf,IAEH,OAAOxG,IAAMgR,SACZ,kBACC,oCACC,kBAAC3G,GAAA,EAAD,CAAWC,KAAG,EAACxD,MAAO,CAAEsD,UAAW,SAClC,yBAAKtD,MAAO,CAAEmK,MAAO,MAAOnH,UAAW,WACtC,kBAACxC,EAAA,EAAD,CACCH,QAAQ,YACRnB,QAAS,kBACR8K,EpBLsB,KoBExB,sBAOD,yBAAKhK,MAAO,CAAEmK,MAAO,MAAOnH,UAAW,WACrC2B,EACA,kBAACnE,EAAA,EAAD,CACCH,QAAQ,YACRnB,QAAS,kBACR8K,EAA2BrF,KAH7B,iBAKYkF,EALZ,YAMG,OAGN,kBAAC,GAAD,CACClF,SAAUmF,EAAMnF,UAAYA,EAC5BjF,KAAMoK,EAAMpK,KACZC,QAASsK,IAEV,gCAGF,CACCJ,EACAlF,EACAmF,EACAE,EACAC,K,4DCxBUG,GAAa,SAACjU,EAA2BkU,GACrD,OAAa,IAATA,EAEFlU,IAAWgG,GAAkB4F,KAC7B5L,IAAWgG,GAAkB6F,cAEtB,CAAEsI,QAAQ,EAAMC,WAAW,EAAOjB,UAAU,GACxC,CAAEgB,QAAQ,EAAOC,WAAW,GACrB,IAATF,EACNlU,IAAWgG,GAAkB8F,gBACzB,CAAEqI,QAAQ,EAAMC,WAAW,GAC1BpU,EAASgG,GAAkB8F,gBAC5B,CAAEqI,QAAQ,EAAOC,WAAW,GACxB,CAAED,QAAQ,EAAOC,WAAW,GACrB,IAATF,EACNlU,IAAWgG,GAAkBwF,UAExBxL,IAAWgG,GAAkB+F,QAE7B/L,IAAWgG,GAAkB0F,SAH9B,CAAEyI,QAAQ,EAAOC,WAAW,GAKxB,CAAED,QAAQ,EAAOC,WAAW,QAPlC,GAuDKC,GAAwB,SAACrU,GACrC,OAAQA,GACP,KAAK6F,GAAc2F,SAClB,MAAO,kBACR,KAAK3F,GAAc4F,kCAClB,MAAO,mBACR,KAAK5F,GAAc6F,SAClB,MAAO,gBACR,QACC,MAAO,sBCrGG4I,GAAqB,WAAO,IAChC3U,EAAgB4U,KAAhB5U,YACF6U,ED8CwB,SAAC7U,GAC/B,IAAI6U,EAAO,CACVC,KAAM,EACNC,cAAe,EACfC,aAAc,EACdC,aAAc,EACdC,iBAAkB,EAClBC,cAAe,EACfC,eAAgB,EAChBC,kBAAmB,EACnBC,mBAAoB,GA+BrB,OA7BAtV,EAAYgP,gBAAgBuG,SAAQ,SAACC,GAEpC,GADAX,EAAKC,OACDU,EAAEzF,cACL,OAAQyF,EAAEzF,cAAc1P,QACvB,KAAK6F,GAAc2F,SAClBgJ,EAAKG,eACL,MACD,KAAK9O,GAAc4F,kCAClB+I,EAAKK,mBACL,MACD,KAAKhP,GAAc6F,SAClB8I,EAAKI,eACL,MACD,QACCJ,EAAKE,qBAEDF,EAAKE,gBAEZS,EAAE3F,gBAAgB0F,SAAQ,SAAC5O,GAC1BkO,EAAKS,oBAAsB3O,EAAE0I,cAAgB,EAC7CwF,EAAKQ,mBAAqB1O,EAAE2I,aAAe,KAG5CkG,EAAE1F,YAAYyF,SAAQ,SAAC5O,GACtBkO,EAAKO,gBAAkBzO,EAAE0I,cAAgB,EACzCwF,EAAKM,eAAiBxO,EAAE2I,aAAe,QAIlCuF,ECvFMY,CAAgBzV,GAE7B,OAAOoD,IAAMgR,SACZ,wBACC,kBAACsB,GAAA,EAAD,CACCxL,MAAO,CAAElL,OAAQ,QACjB2W,gBAAiB3V,EAAYK,OAAS,GAEtC,kBAACuV,GAAA,EAAD,CACCC,WAAY,kBAAC,KAAD,MACZC,gBAAc,kBACdlW,GAAG,kBAEH,kBAAC0K,EAAA,EAAD,CAAYC,QAAQ,MAApB,wBAED,kBAACwL,GAAA,EAAD,CAAMC,WAAS,EAACjO,QAAS,EAAGmC,MAAO,CAAElL,OAAQ,SAC5C,kBAAC+W,GAAA,EAAD,CAAME,MAAI,EAACC,GAAI,GACd,kBAACzI,GAAA,EAAD,CAAWC,KAAG,GACb,kBAACpD,EAAA,EAAD,CAAYC,QAAQ,MAApB,QAED,kBAACkD,GAAA,EAAD,CAAWC,KAAG,GAAd,gBACe,IACbmH,EAAKM,eAAiBN,EAAKO,iBAG9B,kBAACW,GAAA,EAAD,CAAME,MAAI,EAACC,GAAI,GACd,kBAACzI,GAAA,EAAD,CAAWC,KAAG,GACb,kBAACpD,EAAA,EAAD,CAAYC,QAAQ,OAClB,UAAAvK,EAAYa,cAAZ,eAAoB2J,OAAQ,KAG/B,kBAACiD,GAAA,EAAD,CAAWC,KAAG,GAAd,kBACiBmH,EAAKS,oBAEtB,kBAAC7H,GAAA,EAAD,CAAWC,KAAG,GAAd,iBACgBmH,EAAKQ,oBAGtB,kBAACU,GAAA,EAAD,CAAME,MAAI,EAACC,GAAI,GACd,kBAACzI,GAAA,EAAD,CAAWC,KAAG,GACb,kBAACpD,EAAA,EAAD,CAAYC,QAAQ,MAApB,SAED,kBAACkD,GAAA,EAAD,CAAWC,KAAG,GAAd,UAAuBmH,EAAKC,MAC5B,kBAACrH,GAAA,EAAD,CAAWC,KAAG,GACb,kBAACpD,EAAA,EAAD,oBACA,kBAAC6L,GAAA,EAAD,CAASnO,MAAM,aACd,kBAACsC,EAAA,EAAD,KACEuK,EAAKE,eAAiB,IAGzB,kBAACzK,EAAA,EAAD,kBACA,kBAAC6L,GAAA,EAAD,CAASnO,MAAM,YACd,kBAACsC,EAAA,EAAD,CAAYJ,MAAO,CAAEhB,MAAO,UAC1B2L,EAAKG,cAAgB,IAGxB,kBAAC1K,EAAA,EAAD,kBACA,kBAAC6L,GAAA,EAAD,CAASnO,MAAM,0BACd,kBAACsC,EAAA,EAAD,CAAYJ,MAAO,CAAEhB,MAAO,WAC1B2L,EAAKK,kBAAoB,IAG5B,kBAAC5K,EAAA,EAAD,kBACA,kBAAC6L,GAAA,EAAD,CAASnO,MAAM,YACd,kBAACsC,EAAA,EAAD,CAAYJ,MAAO,CAAEhB,MAAO,QAC1B2L,EAAKI,cAAgB,UAQ7B,CAACJ,EAAM7U,EAAYK,U,qBC9ER+V,GAAY,WAAO,IACvBhW,EAAyBiW,KAAzBjW,qBAER,OAAOgD,IAAMgR,SACZ,kBACC,kBAAC,KAAD,CAAY7J,QAAQ,UAAU+L,QAAQ,oBACpC,SAACC,GAAD,OACA,kBAAC,IAAMC,SAAP,KACC,kBAAC9L,EAAA,EAAD,eACCR,MAAO,CAAEuM,WAAY,QACrBlM,QAAQ,YACRrB,MAAM,WACFwN,uBAAYH,IAJjB,qBAQA,kBAAC,IAASI,oBAASJ,GAClB,kBAACxM,EAAA,EAAD,CACCX,QAAS,WACRhJ,EAAqBiG,GAAkB4F,OAFzC,OAOA,kBAAClC,EAAA,EAAD,CACCX,QAAS,WACRhJ,EACCiG,GAAkB6F,iBAHrB,qBASA,kBAACnC,EAAA,EAAD,CACCX,QAAS,WACRhJ,EACCiG,GAAkB8F,mBAHrB,oBASA,kBAACpC,EAAA,EAAD,CACCX,QAAS,WACRhJ,EACCiG,GAAkBwF,YAHrB,YASA,kBAAC9B,EAAA,EAAD,CACCX,QAAS,WACRhJ,EACCiG,GAAkB0F,YAHrB,YASA,kBAAChC,EAAA,EAAD,CACCX,QAAS,WACRhJ,EACCiG,GAAkB+F,UAHrB,iBAcL,CAAChM,K,8BC5EUwW,GAAqB,WAAO,IAChC5W,EAAgB4U,KAAhB5U,YACR,OAAOoD,IAAMgR,SACZ,kBACC,kBAACyC,GAAA,EAAD,CAASC,kBAAgB,EAAC5M,MAAO,CAAEmK,MAAO,SACzC,kBAAC0C,GAAA,EAASzC,GAAWtU,EAAYK,OAAQ,GACxC,kBAAC2W,GAAA,EAAD,qBAED,kBAACD,GAAA,EAASzC,GAAWtU,EAAYK,OAAQ,GACxC,kBAAC2W,GAAA,EAAD,0BAED,kBAACD,GAAA,EAASzC,GAAWtU,EAAYK,OAAQ,GACxC,kBAAC2W,GAAA,EAAD,+BAIH,CAAChX,EAAYK,U,UCLTkH,GAAYC,YAAW,CAC5BqK,OAAQ,CACP7S,OAAQ,mBAET4S,MAAO,CACNpE,UAAW,OACX1F,YAAa,OACb6F,QAAS,WAILxJ,GAAM,IAAI7E,EAEH2X,GAAwB,WACpC,IAAM9O,EAAUZ,KACVL,EAAUpB,KACRhE,EAASmD,KAATnD,KAHkC,EAIN8S,KAA5B5U,EAJkC,EAIlCA,YAAakX,EAJqB,EAIrBA,WAJqB,EAMzCb,KADOc,EALkC,EAKlCA,iBAAkBC,EALgB,EAKhBA,QAASC,EALO,EAKPA,mBALO,EAQFjP,mBAA2B,IARzB,mBAQnCkP,EARmC,KAQrBC,EARqB,KAmB1C,OAJA1S,qBAAU,WAJkB,GAAvByS,EAAaxK,QAChB3I,GAAIjC,kBAAkBwC,MAAK,SAACrC,GAAD,OAAUkV,EAAgBlV,QAKpD,CAAC6U,EAAWM,cAERpU,IAAMgR,SACZ,0BACC,8BACC,kBAAC3G,GAAA,EAAD,CAAWC,KAAG,IACR,OAAJ5L,QAAI,IAAJA,OAAA,EAAAA,EAAMgI,SACN,oCACC,kBAAC+D,GAAA,EAAD,CACClK,KAAK,OACLqB,MAAK,UAAEhF,EAAY8B,YAAd,aAAE,EAAkB0I,KACzB5B,UAAWT,EAAQyJ,MACnB5D,MAAM,UACNzD,QAAQ,aAET,kBAACsD,GAAA,EAAD,CACClK,KAAK,OACLqB,MAAK,UAAEhF,EAAY8B,YAAd,aAAE,EAAkB2V,MACzB7O,UAAWT,EAAQyJ,MACnB9D,WAAY,CAAEC,UAAU,GACxBC,MAAM,QACNzD,QAAQ,cAGP,MAEL,kBAACkD,GAAA,EAAD,CAAWC,KAAG,GACb,kBAACuF,GAAA,EAAD,CAAa1I,QAAQ,WAAW3B,UAAWT,EAAQyJ,OAClD,kBAACsB,GAAA,EAAD,CAAYtT,GAAG,2BAAf,SAGA,kBAACuT,GAAA,EAAD,CACC5I,QAAQ,WACRyD,MAAM,eACNhJ,MAAOhF,EAAY8O,cACnBgE,SAAU,SAACzJ,GAAD,OACT8N,EAAiB9N,EAAEC,OAAOtE,QAE3B8I,WAAY,CACXC,UAAWmJ,EAAWM,aAEvBlE,cAAY,EACZpJ,MAAO,CAAE6H,SAAU,UAElBuF,EAAa5R,KAAI,SAACC,GAClB,OACC,kBAACoE,EAAA,EAAD,CAAU/E,MAAOW,EAAE/F,GAAIyK,IAAK1E,EAAE/F,IAC5B+F,EAAE6E,WAMR,kBAACqD,GAAA,EAAD,CACClK,KAAK,SACLiF,UAAWT,EAAQyJ,MACnB5M,MAAOhF,EAAYkO,MAAQ,GAC3BJ,WAAY,CACXC,UAAWmJ,EAAWM,aAEvBxJ,MAAM,oBACNzD,QAAQ,WACRuI,SAAU,SAACzJ,GAAD,OAAO+N,EAAQpE,OAAO3J,EAAEC,OAAOtE,WAE1C,kBAAC0S,GAAA,EAAD,CACCC,eAAgB,SAAChS,GAAD,aACfA,EAAE/F,GAAF,WAEG,UAAA+F,EAAEsI,eAAF,eAAWzD,MACR7E,EAAEsI,QAAQzD,KAAO,KACjB,GAJN,YAKO7E,EAAE6E,MACN,IAEJxF,MAAOhF,EAAYa,OACnBqJ,MAAO,CAAE6H,SAAU,SACnBe,SAAU,SAACzJ,EAAGxI,GAAJ,OACTA,GAAUwW,EAAmBxW,IAE9B+W,kBAAmB,SAACC,EAAQ7S,GAAT,OAClB6S,EAAOjY,KAAOoF,EAAMpF,IAErB4T,SAAUxT,EAAYK,SAAWgG,GAAkB4F,IACnD6E,SACQ,OAAP5J,QAAO,IAAPA,OAAA,EAAAA,EAASR,QAAO,SAACf,GAAD,OzB1GO,GyB0GAA,EAAE/F,QAAyB,GAEnDkY,YAAa,SAACC,GAAD,OACZ,kBAAClK,GAAA,EAAD,iBACKkK,EADL,CAEC/J,MAAM,aACNhP,OAAO,SACPuL,QAAQ,WACRyN,WACChY,EAAYa,OACT,GACA,sFAQV,QACCiB,QADD,IACCA,OADD,EACCA,EAAMgI,QACN9J,EAAY8B,KACZ9B,EAAY8O,cACZqI,EACAD,EAAWM,YACXF,EACAtX,EAAYkO,KACZkJ,EACApX,EAAYa,OACZwW,EACArX,EAAYK,OACZ6G,K,SC7IG/C,GAAM,IAAI7E,EAEV2Y,GAA+B,WAAO,IACnCjY,EAAgB4U,KAAhB5U,YACR,OAAOoD,IAAMgR,SACZ,kBACCpU,EAAYK,SAAWgG,GAAkB4F,IACxC,kBAACwB,GAAA,EAAD,CAAWC,KAAG,GACb,kBAACX,GAAA,EAAD,CACCC,SAAS,OACT9C,MAAO,CAAEmK,MAAO,OAAQrV,OAAQ,SAEhC,kBAACiO,GAAA,EAAD,KACEjB,GAAchM,EAAYK,SAE3BgM,GAAqBrM,EAAYK,UAGjC,OACL,CAACL,EAAYK,UAIT6X,GAAwB,WAAO,IAC5BC,EAAsBvD,KAAtBuD,kBAEFC,EAAUhV,IAAMgR,SACrB,kBACC,kBAACrH,GAAA,EAAD,CAAO7C,MAAO,CAAElL,OAAQ,QAAUgO,SAAS,SAC1C,kBAACC,GAAA,EAAD,wCACA,kBAAC3C,EAAA,EAAD,CACCJ,MAAO,CAAEmO,WAAY,aADtB,UAEKF,OAGP,CAACA,IAGF,OAAOA,EAAoBC,EAAU,MAGhCE,GAA8B,WAAO,IAClC/F,EAAYqC,KAAZrC,QACF6F,EAAUhV,IAAMgR,SACrB,kBACC,kBAACrH,GAAA,EAAD,CAAO7C,MAAO,CAAElL,OAAQ,QAAUgO,SAAS,QAC1C,kBAACC,GAAA,EAAD,aADD,+BAKD,IAED,OAAOsF,EAAU6F,EAAU,MAGtBG,GAAkB,WAAO,IAAD,EACgB3D,KAArCsC,EADqB,EACrBA,WAAYlX,EADS,EACTA,YAAauS,EADJ,EACIA,QACzBxS,EAAoBsW,KAApBtW,gBAER,OAAOmX,EAAWM,kBAAwClU,IAAzBtD,EAAY6O,SAC5C,kBAACnE,EAAA,EAAD,CACCtB,QAAS,kBAAMrJ,KACfwK,QAAQ,YACRrB,MAAM,UACNgB,MAAO,CAAEpC,YAAa,QACtB0L,SAAUxT,EAAY6O,SAAW,IAAM0D,GALxC,QASG,MAGCiG,GAA0B,WAAO,IAC9B1W,EAASmD,KAATnD,KAD6B,EAEQ8S,KAArC5U,EAF6B,EAE7BA,YAAauS,EAFgB,EAEhBA,QAAS2E,EAFO,EAEPA,WACtB9W,EAAyBiW,KAAzBjW,qBAER,OAAOgD,IAAMgR,SACZ,kBACC,oCACC,kBAAC,GAAD,MACCpU,EAAYK,OAAS,EACrB,kBAACqK,EAAA,EAAD,CACCtB,QAAS,kBACRhJ,EACCiG,GAAkB8F,kBAGpB5B,QAAQ,YACRrB,MAAM,UACNsK,UAAWxT,EAAYJ,IAAM2S,GAR9B,UAYG,KACHvS,EAAYK,SAAWgG,GAAkB8F,gBACzC,kBAACzB,EAAA,EAAD,CACCtB,QAAS,kBACRhJ,EACCiG,GAAkB6F,gBAGpB3B,QAAQ,YACRrB,MAAM,WAPP,YAWG,KACJ,kBAACwB,EAAA,EAAD,CACCH,QAAQ,YACRL,MAAO,CAAEuM,WAAY,QACrBvN,MAAM,YACNsK,SAA6B,IAAnBxT,EAAYJ,IAAY2S,EAClC3H,KAAMzG,GAAI1C,4BAA4BzB,EAAYJ,KALnD,UASK,OAAJkC,QAAI,IAAJA,OAAA,EAAAA,EAAMgI,UAAW,kBAAC,GAAD,SAGpB,CACC9J,EAAYK,OACZD,EACAmS,EACA2E,EAAWuB,eAKRlR,GAAYC,aAAW,CAC5BkR,kBAAmB,CAClBlL,UAAW,OACXlB,aAAc,OACdxE,YAAa,UAgDA6Q,GA5CS,WAAO,IAAD,IACvBxQ,EAAUZ,KADa,EAEOqN,KAA5B5U,EAFqB,EAErBA,YAAakX,EAFQ,EAERA,WAEfkB,EAAUhV,IAAMgR,SACrB,kBACC,6BACC,kBAAC3G,GAAA,EAAD,CAAWC,KAAG,GACb,kBAAC,GAAD,OAED,kBAAC,GAAD,MACC1N,EAAYJ,GAAK,EAAI,kBAAC,GAAD,MAAyB,KAC/C,kBAAC,GAAD,MACA,kBAAC,GAAD,MACA,kBAAC,GAAD,MACA,kBAAC6N,GAAA,EAAD,CAAWC,KAAG,EAAC9E,UAAWT,EAAQuQ,mBACjC,kBAAC,GAAD,OAEAxB,EAAW0B,YACZ5Y,EAAYgP,gBAAgBlC,OAAS,GACrC9M,EAAYa,aACayC,IAAzBtD,EAAY6O,SACX,kBAAC,GAAD,CACCA,SAAU7O,EAAY6O,SACtBkF,WAAY/T,EAAYa,OAAO2J,OAE7B,QAGN,CACCxK,EAAYJ,GADb,UAECI,EAAYa,cAFb,aAEC,EAAoB2J,KAFrB,UAGCxK,EAAY8B,YAHb,aAGC,EAAkB0I,KAClBxK,EAAYa,OACZqW,EAAW0B,WACX5Y,EAAYgP,gBAAgBlC,OAC5B9M,EAAY6O,WAId,OAAK7O,EAAY8B,KACVsW,EADuB,uC,wICtLzB7Q,GAAYC,YAAW,CAC5BqR,UAAW,CACVrL,UAAW,UAePsL,GAAa,CAClBtL,UAAW,QAuLGuL,GApLW3V,IAAM4V,MAAK,SAACja,GACrC,IAAMoJ,EAAUZ,KACR2P,EAAetC,KAAfsC,WAF+D,EAGrB9O,mBAAmB,IAHE,mBAGhE6Q,EAHgE,KAG7CC,EAH6C,KAKjEC,EAAuB/V,IAAMqB,aAAY,SAAC2U,GAC/CF,GAAqB,SAACG,GACrB,IAAMC,EAAgBD,EAAsB3S,QAC3C,SAACC,GAAD,OAAOA,IAAMyS,KAEd,OAAIE,EAAcxM,OAASuM,EAAsBvM,OACzCwM,EACH,uBAAWA,GAAX,CAA0BF,SAE9B,IAEGG,EAAmBnW,IAAMqB,aAC9B,SAACvD,GAAD,OACC,oCACC,6BACA,kBAAC,KAAD,CACCgJ,MAAO,CAAEqD,QAAS,OAAQvO,OAAQ,OAAQqV,MAAO,SAEjD,kBAAC/J,EAAA,EAAD,CACCkP,cAAY,EACZjP,QAAQ,KACRP,UAAU,KACVyP,MAAM,UAELvY,EAAOkO,MAET,kBAACvB,GAAA,EAAD,CACClK,KAAK,OACL+V,WAAS,EACT1U,MAAO9D,EAAO8G,MACd8F,WAAY,CAAEC,UAAU,GACxBC,MAAM,QACNb,KAAK,UAEN,kBAACU,GAAA,EAAD,CACClK,KAAK,OACLuG,MAAO,CAAEsD,UAAW,OACpBkM,WAAS,EACT1U,MAAO9D,EAAOmO,aACdvB,WAAY,CAAEC,UAAU,GACxBC,MAAM,UACNb,KAAK,UAEN,kBAACU,GAAA,EAAD,CACClK,KAAK,OACLuG,MAAO,CAAEsD,UAAW,OACpBkM,WAAS,EACT1U,MAAO2G,GAAUzK,EAAOqO,OACxBzB,WAAY,CAAEC,UAAU,GACxBC,MAAM,QACNb,KAAK,cAKT,IAIAwM,EAGG5a,EAHH4a,QACAC,EAEG7a,EAFH6a,WAjEsE,EAmEnE7a,EADH8a,SAAYC,EAlE0D,EAkE1DA,UAAWC,EAlE+C,EAkE/CA,aAAcC,EAlEiC,EAkEjCA,aAGtC,OAAO5W,IAAMgR,SACZ,kBACC,yBAAKlK,MAAO,CAAEgD,UAAW,WACvByM,EAAQjU,KAAI,SAACiB,EAAGsT,GAAJ,OACZ,kBAAClE,GAAA,EAAD,CAAMC,WAAS,EAACjO,QAAS,EAAGsC,IAAK4P,GAC/B/C,EAAWM,YACX,oCACC,kBAACzB,GAAA,EAAD,CAAME,MAAI,EAACC,GAAI,GACd,kBAACwB,GAAA,EAAD,eACC1S,MAAO2B,EACPmK,QAAS8I,GAAc,GACvBjC,eAAgB,SAAChR,GAAD,OACfA,EAAE/G,GAAF,UAAU+G,EAAEyI,KAAZ,cAAsBzI,EAAEqB,OAAU,IAEnCkS,kBAAkB,GACbvT,EAAE/G,GAAK,GAAK,CAAEoF,MAAO2B,GAP3B,CAQCmM,SAAU,SAACqH,EAAGjZ,GACb8Y,EAAaC,EAAK/Y,EAAOtB,GAAI+G,EAAE/G,KAEhCwa,cACC,wFAEDxC,kBAAmB,SAACC,EAAQ7S,GAAT,OAClB6S,EAAOjY,KAAOoF,EAAMpF,IAErBkY,YAAa,SAACC,GAAD,OACZ,kBAAClK,GAAA,EAAD,eACCtD,QAAQ,YACJwN,EAFL,CAGC/J,MAAM,SACNhP,OAAO,kBAOZ,kBAAC+W,GAAA,EAAD,CAAME,MAAI,EAACC,GAAI,GACd,kBAACrI,GAAA,EAAD,CACClK,KAAK,OACLuG,MAAO,CAAElL,OAAQ,MAAOqV,MAAO,QAC/BrP,MAAK,UAAK2B,EAAEyI,KAAP,cAAiBzI,EAAEqB,OACxB8F,WAAY,CAAEC,UAAU,GACxBC,MAAM,QACNb,KAAK,WAIPxG,EAAE/G,GACF,kBAACmW,GAAA,EAAD,CAAME,MAAI,EAACC,GAAI,GACd,kBAAClN,EAAA,EAAD,CACCkB,MAAO4O,GACP3P,aAAW,OACXC,QAAS,kBAAM+P,EAAqBxS,EAAE/G,MAEtC,kBAAC,KAAD,CAAUuO,SAAS,YAGlB,KACH+I,EAAWM,YACX,kBAACzB,GAAA,EAAD,CAAME,MAAI,EAACC,GAAI,GACd,kBAAClN,EAAA,EAAD,CACCkB,MAAO4O,GACP5P,MAAM,YACNC,aAAW,SACXC,QAAS,kBAAM2Q,EAAaE,EAAKtT,EAAE/G,MAEnC,kBAAC,KAAD,CAAWuO,SAAS,YAGnB,KACH8K,EAAkBoB,SAAS1T,EAAE/G,KAC7B2Z,EAAiB5S,OAGnBgT,EAAQ7M,OAAS,GAClBoK,EAAWM,aACXzY,EAAMsT,OACL,kBAACtF,GAAA,EAAD,CAAOC,SAAS,OAAO9C,MAAO,CAAEgD,UAAW,SAC1C,kBAACD,GAAA,EAAD,aADD,sBAEoB,uCAFpB,kCAKG,KACHiK,EAAWM,aACX,kBAAC9M,EAAA,EAAD,CACCxB,MAAM,UACNqB,QAAQ,YACRnB,QAAS,kBAAM0Q,KACflR,UAAWT,EAAQ0Q,WAJpB,iBAWH,CACCc,EACAzC,EAAWM,YACXoC,EACAI,EACAb,EACAY,EACAd,EACAM,EACAxa,EAAMsT,OACNyH,O,qBCzMUQ,GAAb,kDAQC,WAAYC,EAA0Bha,GAA8B,IAAD,8BAClE,gBARDX,QAOmE,IANnE2a,sBAMmE,IALnEha,yBAKmE,IAJnEia,UAImE,IAHnEna,YAGmE,IAFnEqP,uBAEmE,EAElE,EAAK9P,GAAK,EACV,EAAK4a,KAAO,GACZ,EAAKD,iBAAmBA,EACxB,EAAKha,oBAAsBA,EAC3B,EAAKF,OAAS6F,GAAcuU,UANsC,EARpE,UAAgCrM,ICHzB,IAAMsM,GAAiB,SAACC,GAC9B,IAAKA,EAAM,MAAO,GAClB,IAAIC,EAAkB,IAAI3L,KAAK0L,GAa/B,OAXCC,EAAgB1L,cAChB,IACA2L,GAAoBD,EAAgBtK,WAAa,GACjD,IACAuK,GAAoBD,EAAgBrK,WACpC,IACAsK,GAAoBD,EAAgBpK,YACpC,IACAqK,GAAoBD,EAAgBnK,cACpC,IACAoK,GAAoBD,EAAgBE,eAItC,SAASD,GAAoBE,GAC5B,OAAIA,GAAK,EACD,IAAMA,EAAEC,WAETD,EAAEC,W,ICPEC,GAKPtc,G,kDCJCwF,GAAM,IAAI7E,EAEH4b,GAAgB9X,IAAM4V,MAClC,YAA4D,IAAzD7Y,EAAwD,EAAxDA,QAASgb,EAA+C,EAA/CA,WAAYC,EAAmC,EAAnCA,SAAmC,EACpBhT,oBAAS,GADW,mBACnDiT,EADmD,KACtCC,EADsC,OAEJlT,mBAEpD,MAJwD,mBAEnDmT,EAFmD,KAE9BC,EAF8B,KAKlD/C,EAAgBpC,KAAhBoC,YACFzI,EAAWuL,GAAuB,GAClCjb,EAAoB8C,IAAMqB,aAAY,WACtCtE,GAAYA,EAAQI,sBAED,IAApByP,EAASlD,SAAgC,IAAhBuO,GAC5BlX,GAAI7D,kBAAJ,OAAsBH,QAAtB,IAAsBA,OAAtB,EAAsBA,EAASI,qBAAqBmE,MACnD,SAACrC,GACAmZ,EAAuBnZ,MAI1BiZ,GAAe,MACb,CAACnb,EAASkb,IAEbxW,qBAAU,WACTvE,MACE,IAEH,IAAMmb,EAAcrY,IAAMqB,aACzB,SAACiX,GACKvb,GACLgb,GACC,SAACQ,GAAD,mBAAC,eAEIA,GAFL,IAGEnB,KAAMkB,EAAclB,KACpBna,OAAQqb,EAAcrb,cAI1B,CAACF,IAGID,EAAckD,IAAMqB,aAAY,WAChCtE,GACLgE,GAAIjE,YAAYC,GACduE,MAAK,SAACrC,GACN8Y,EAAW,MACX1C,EAAY2C,EAAU/Y,MAEtBsC,OAAM,SAACiX,GAAD,OAAQC,QAAQC,IAAIF,QAC1B,CAACzb,IAEE4b,EAAoB3Y,IAAMgR,SAC/B,iBAAM,CACL,CACCxC,MAAO,SACPoK,WAAY,SACZ3H,MAAO,IACP4H,YAAa,SAAClE,GAAD,OACZnM,GAAemM,EAAO/S,SAExB,CACC4M,MAAO,OACPoK,WAAY,OACZ3H,MAAO,IACP6H,WAAY,SAACnE,GAAD,aACX,kBAAC5B,GAAA,EAAD,CAASnO,MAAO+P,EAAO/S,OACtB,kBAACsF,EAAA,EAAD,CAAYJ,MAAO,CAAEiE,SAAU,UAC7B,UAAC4J,EAAO/S,aAAR,eAA0BmX,UAAU,EAAG,KACvC,UAKL,CACCvK,MAAO,OACPoK,WAAY,IACZ3H,MAAO,IACP6H,WAAY,SAACnE,GAAD,OACX,kBAACrN,EAAA,EAAD,CACCH,QAAQ,YACRrB,MAAM,YACNE,QAAS,kBACRqS,EAAY1D,EAAO1V,QAJrB,UAWF,CACCuP,MAAO,OACPoK,WAAY,IACZ3H,MAAO,IACP6H,WAAY,SAACnE,GAAD,OACX,kBAACrN,EAAA,EAAD,CACCH,QAAQ,YACRrB,MAAM,UACNc,UAAWC,IACXG,GAAE,UAAK1L,EAAL,YAA2BqZ,EAAO1V,KAAKqN,oBAJ1C,yBAWH,CAAC+L,IAGF,OAAOrY,IAAMgR,SACZ,kBACCjU,EACC,6BACC,yBACC+J,MAAO,CACNkS,OAAQ1H,GAAsBvU,EAAQE,QACtCkN,QAAS,SAGV,2CACA,6BACA,kBAAC8O,GAAA,EAAD,CACCnS,MAAO,CAAEsD,UAAW,QACpBxD,UAAU,UAFX,UAMA,kBAACsS,GAAA,EAAD,CACCnT,aAAW,gBACXqB,KAAK,SACLxF,MAAK,OAAE7E,QAAF,IAAEA,OAAF,EAAEA,EAASE,OAChByS,SAAU,SAACzJ,GAAD,OACTlJ,GACAgb,EAAW,2BACPhb,GADM,IAETE,OAAQ2S,OAAO3J,EAAEC,OAAOtE,YAI1B,kBAACuX,GAAA,EAAD,CACCvX,MAAM,IACNwX,QAAS,kBAACC,GAAA,EAAD,MACTzO,MAAOpC,GACN1F,GAAc2F,UAEf6Q,QACCvc,EAAQE,SACR6F,GAAc2F,WAGhB,kBAAC0Q,GAAA,EAAD,CACCvX,MAAM,IACNwX,QAAS,kBAACC,GAAA,EAAD,MACTzO,MAAOpC,GACN1F,GAAc4F,mCAEf4Q,SACQ,OAAPvc,QAAO,IAAPA,OAAA,EAAAA,EAASE,UACT6F,GAAc4F,oCAGhB,kBAACyQ,GAAA,EAAD,CACCvX,MAAM,IACNwX,QAAS,kBAACC,GAAA,EAAD,MACTzO,MAAOpC,GACN1F,GAAc6F,UAEf2Q,QACCvc,EAAQE,SACR6F,GAAc6F,YAIjB,6BACA,kBAAC8B,GAAA,EAAD,CACCjO,GAAG,4BACHsK,MAAO,CAAEmK,MAAO,QAChBrG,MAAM,OACN2O,WAAS,EACT7H,KAAM,EACN8H,YAAY,UACZrS,QAAQ,WACRvF,MAAO7E,EAAQqa,KACf1H,SAAU,SAACzJ,GAAD,OACT8R,EAAW,2BACPhb,GADM,IAETqa,KAAMnR,EAAEC,OAAOtE,YAIlB,6BACA,kBAAC0F,EAAA,EAAD,CACCH,QAAQ,YACRrB,MAAM,UACNgB,MAAO,CAAEsD,UAAW,QACpBL,KAAK,QACLqG,SAAUrT,EAAQE,OAAS,EAC3B+I,QAAS,kBAAMlJ,MANhB,QAUA,kBAACwK,EAAA,EAAD,CACCH,QAAQ,YACRrB,MAAM,YACNgB,MAAO,CACNuM,WAAY,OACZjJ,UAAW,QAEZL,KAAK,QACL/D,QAAS,kBAAM9I,MARhB,gBAYC+a,EACA,kBAAC3Q,EAAA,EAAD,CACCH,QAAQ,YACRrB,MAAM,YACNgB,MAAO,CACNuM,WAAY,OACZjJ,UAAW,QAEZL,KAAK,QACL/D,QAAS,kBAAMkS,GAAe,KAR/B,gBAYG,MAEL,6BACCD,EACA,yBAAKnR,MAAO,CAAE2S,OAAQ,UACrB,kBAAC,KAAD,CACCC,sBAAsB,EACtBC,YAAY,EACZC,QAASjB,EACTkB,YAAY,EACZnI,KAAM9E,EACNkN,2BAA2B,KAG1B,MAEF,OACL,CACC/c,EACAD,EACAI,EACA+a,EACAU,EACA/L,OC7KWmN,GAnFC,SAAC,GAKI,IAJpBC,EAImB,EAJnBA,MACA7c,EAGmB,EAHnBA,oBACAwP,EAEmB,EAFnBA,cACAqL,EACmB,EADnBA,SAEQlE,EAAetC,KAAfsC,WADW,EAEW9O,mBAA4B,MAFvC,mBAEZjI,EAFY,KAEHgb,EAFG,KAIbkC,EAAgBja,IAAMqB,aAAY,WACvC0W,EAAW,IAAIb,GAAW8C,EAAO7c,MAC/B,IAEG+c,EAAoBla,IAAMqB,aAAY,WAC3C0W,EAAWpL,KACT,CAACA,IAEEwN,EAAena,IAAMgR,SAC1B,kBACC,yBAAKlK,MAAO,CAAEgD,UAAW,WACxB,kBAAClE,EAAA,EAAD,CACCE,MAAM,UACNC,aAAW,aACXC,QAAS,kBAAMiU,MAEf,kBAAC,KAAD,CAAWlP,SAAS,cAIvB,CAACkP,IAGIG,EAAuBpa,IAAMgR,SAClC,kBACErE,EACA,yBACC7F,MAAO,CACNkS,OAAQ1H,GAAsB3E,EAAc1P,QAC5CkN,QAAS,SAGV,gCAAS3B,GAAemE,EAAc1P,SACtC,6BACA,yCAAWqa,GACV3K,EAAcvB,UAAYuB,EAAczB,SADzC,eAEQyB,EAAcxB,YACtB,2BAAIwB,EAAcyK,MACjBtD,EAAWuB,YACX,yBAAKvO,MAAO,CAAEgD,UAAW,UACxB,kBAAClE,EAAA,EAAD,CACCG,aAAW,OACXC,QAAS,kBAAMkU,MAEf,kBAAC,KAAD,CAAUnP,SAAS,YAGlB,MAtBW,OAyBlB,CACC4B,EACAnE,GACAsL,EAAWuB,YACX6E,IAIF,OAAKF,GAAU7c,EACVJ,GAAY4P,IAAiBmH,EAAWuB,aAGxCtY,GAAW4P,EAAsByN,EAClCrd,GAAW+W,EAAWuB,YAExB,kBAACyC,GAAD,CACC/a,QAASA,EACTgb,WAAYA,EACZC,SAAUA,IAGN,KAXCmC,EAFmC,MCzB7B7M,GA7CI,SAAC3R,GACnB,IAAKA,EAAO,OAAO,KAD4B,MAGMA,EAAMsD,KAAnDiM,EAHuC,EAGvCA,QAASC,EAH8B,EAG9BA,UAAWC,EAHmB,EAGnBA,SAAUC,EAHS,EAGTA,WAEtC,SAASgP,IACR,OAAInP,GAAWC,EAEb,kBAACjE,EAAA,EAAD,KACE,cADF,IACiB,gCAASiE,GAD1B,IAC+C,OAC7CmM,GAAepM,IAIX,KAIT,SAASoP,IACR,OAAIlP,GAAYC,EAEd,kBAACnE,EAAA,EAAD,KACE,oBADF,IACuB,gCAASmE,GADhC,IACsD,OACpDiM,GAAelM,IAIX,KAIT,OACC,yBACCtE,MAAO,CACNgD,UAAW,OACXM,UAAW,OACXlB,aAAc,SAGf,kBAACmR,EAAD,MACA,kBAACC,EAAD,QCvCGnW,GAAYC,YAAW,CAC5BmW,UAAW,CACVvB,OAAQ,iBACRwB,gBAAiB,UACjBC,UAAW,OACXvR,aAAc,MACdwR,aAAc,oBAoGDC,GA3FS,SAAC,GAGG,IAF3BlO,EAE0B,EAF1BA,gBACAuL,EAC0B,EAD1BA,SAEMjT,EAAUZ,KACR2P,EAAetC,KAAfsC,WAFkB,EAIzBb,KADO2H,EAHkB,EAGlBA,qBAAsBC,EAHJ,EAGIA,wBAE9B,OACC,oCACEpO,EACCnJ,QACA,SAACC,GAAD,OACCA,EAAE6I,gBACF7I,EAAE6I,eAAe/L,QAAUwC,GAAYyF,WAExChG,KAAI,SAACxE,EAAQ+Y,GAAT,eACJ,kBAACvE,GAAA,EAAD,CACCC,gBAAiBuB,EAAWgH,SAC5B7T,IAAK4P,EACLrR,UAAWT,EAAQwV,WAEnB,kBAAC/H,GAAA,EAAD,CACCC,WAAY,kBAAC,KAAD,MACZC,gBAAc,kBACdlW,GAAG,kBAEH,kBAACmW,GAAA,EAAD,CAAMC,WAAS,EAACjO,QAAS,EAAGsC,IAAK4P,GAChC,kBAAClE,GAAA,EAAD,CAAME,MAAI,EAACC,GAAI,IACd,kBAAC5L,EAAA,EAAD,0BAEC,kDAAapJ,QAAb,IAAaA,OAAb,EAAaA,EAAQkO,KAArB,qBAA+BlO,QAA/B,IAA+BA,OAA/B,EAA+BA,EAAQ8G,MAAvC,UAKJ,kBAACmW,GAAA,EAAD,KACC,yBAAKjU,MAAO,CAAEmK,MAAO,SACpB,kBAAC5G,GAAA,EAAD,CAAWC,KAAG,GACb,kBAACG,GAAA,EAAD,CACCjO,GAAG,4BACHoO,MAAM,cACN2O,WAAS,EACTjD,WAAS,EACT5E,KAAM,EACNhH,WAAY,CACXC,UAAWmJ,EAAWgH,UAEvBtB,YAAY,yBACZrS,QAAQ,WACRvF,MAAK,UAAE9D,EAAOsO,sBAAT,aAAE,EAAuBgL,KAC9B1H,SAAU,SAACzJ,GACV2U,EACC5C,EACA/R,EAAEC,OAAOtE,MACTiV,OAKJ,kBAACxM,GAAA,EAAD,CAAWC,KAAG,GACb,kBAACG,GAAA,EAAD,CACCjO,GAAG,4BACHoO,MAAM,0BACN0L,WAAS,EACTxP,MAAO,CAAEsD,UAAW,QACpBM,WAAY,CACXC,UAAWmJ,EAAWgH,UAEvBtB,YAAY,gCACZrS,QAAQ,WACRvF,MAAK,UACJ9D,EAAOsO,sBADH,aACJ,EAAuBI,YAExBkD,SAAU,SAACzJ,GACV4U,EACC7C,EACA/R,EAAEC,OAAOtE,MACTiV,eCxFN1S,GAAYC,YAAW,CAC5BmW,UAAW,CACVvB,OAAQ,iBACRwB,gBAAiB,aAcbQ,GAAY,SAAC,GAQI,IAPtBzO,EAOqB,EAPrBA,QACAC,EAMqB,EANrBA,YACAwL,EAKqB,EALrBA,SACA9M,EAIqB,EAJrBA,QACAC,EAGqB,EAHrBA,UACAC,EAEqB,EAFrBA,SACAC,EACqB,EADrBA,WAEMtG,EAAUZ,KACR2P,EAAetC,KAAfsC,WACAmH,EAAgBhI,KAAhBgI,YACR,OAAOjb,IAAMgR,SACZ,kBACC,kBAACsB,GAAA,EAAD,CAAWC,iBAAiB,EAAO/M,UAAWT,EAAQwV,WACrD,kBAAC/H,GAAA,EAAD,CACCC,WAAY,kBAAC,KAAD,MACZC,gBAAc,kBACdlW,GAAG,kBAEH,kBAACmW,GAAA,EAAD,CAAMC,WAAS,EAACjO,QAAS,GACxB,kBAACgO,GAAA,EAAD,CAAME,MAAI,EAACC,GAAI,IACd,kBAAC5L,EAAA,EAAD,6BAED,kBAACyL,GAAA,EAAD,CAAME,MAAI,EAACC,GAAI,EAAGhM,MAAO,CAAEgD,UAAW,UACpCyC,EACA,kBAAC,KAAD,CACCzF,MAAO,CAAEgD,UAAW,SACpBiB,SAAS,UAEP,KACHyB,EAAc,kBAAC,KAAD,CAAUzB,SAAS,UAAa,QAIlD,kBAACgQ,GAAA,EAAD,KACC,yBAAKjU,MAAO,CAAEmK,MAAO,SACpB,kBAAC5G,GAAA,EAAD,CAAWC,KAAG,GACb,kBAACG,GAAA,EAAD,CACCjO,GAAG,4BACHoO,MAAM,yBACN2O,WAAS,EACTjD,WAAS,EACT5E,KAAM,EACNhH,WAAY,CACXC,UAAWmJ,EAAWgH,UAEvBtB,YAAY,qDACZrS,QAAQ,WACRvF,MAAO2K,EACPmD,SAAU,SAACzJ,GAAD,OACTgV,EAAYjD,EAAU/R,EAAEC,OAAOtE,WAIlC,kBAACyI,GAAA,EAAD,CAAWC,KAAG,GACb,kBAAC,GAAD,CACCrL,KAAM,CACLiM,UACAC,YACAC,WACAC,sBAQP,CACCyI,EAAWgH,SACXvO,EACA0O,EACAjD,EACA9M,EACAC,EACAC,EACAC,KAuKY6P,GA3JQ,SAAC,GAKI,IAJ3B5Q,EAI0B,EAJ1BA,IACAxG,EAG0B,EAH1BA,QACAkU,EAE0B,EAF1BA,SACAmD,EAC0B,EAD1BA,mBAEM5E,EAAUtS,KACVrH,EAAc4U,KACdsC,EAAaqH,GAAsBve,EAAYkX,WAH3B,EAIwBb,KAA1CyD,EAJkB,EAIlBA,UAAWC,EAJO,EAIPA,aAAcC,EAJP,EAIOA,aAGhCpa,EAWG8N,EAXH9N,GACA0O,EAUGZ,EAVHY,QACAC,EASGb,EATHa,UACAC,EAQGd,EARHc,SACAC,EAOGf,EAPHe,WACAkB,EAMGjC,EANHiC,QACAC,EAKGlC,EALHkC,YACAE,EAIGpC,EAJHoC,YACAD,EAGGnC,EAHHmC,gBACAE,EAEGrC,EAFHqC,cACAxP,EACGmN,EADHnN,oBAGD,OAAO6C,IAAMgR,SACZ,kCACC,oCACC,kBAAC2B,GAAA,EAAD,CAAMC,WAAS,EAACjO,QAAS,GACxB,kBAACgO,GAAA,EAAD,CACCE,MAAI,EACJC,GAAI,EACJhM,MAAO,CACNsD,UAAW,OACXgR,YAAa,sBAGd,kBAAClU,EAAA,EAAD,CACCkP,cAAY,EACZjP,QAAQ,KACRP,UAAU,KACVyP,MAAM,UAJP,UAMEvS,EAAQuX,YANV,aAME,EAAcjU,KACf,kBAACF,EAAA,EAAD,sBACQpD,EAAQuX,YADhB,iBACQ,EAAcxQ,eADtB,aACQ,EAAuBzD,KAD/B,SAID,kBAAC,GAAD,CACCmP,QAAS7J,EACT8J,WAAU,OAAED,QAAF,IAAEA,OAAF,EAAEA,EAASjT,QACpB,SAACC,GAAD,OnCxJsB,ImCwJfA,EAAEkI,YAEVwD,QAAQ,EACRwH,SAAU,CACTC,UAAWA,EACVsB,EACAH,GAAayD,MAEd3E,aAAcA,EACbqB,EACAH,GAAayD,MAEd1E,aAAcA,EACboB,EACAH,GAAayD,UAKjB,kBAAC3I,GAAA,EAAD,CAAME,MAAI,EAACC,GAAI,EAAGhM,MAAO,CAAEsD,UAAW,SACrC,kBAAClD,EAAA,EAAD,CACCkP,cAAY,EACZjP,QAAQ,KACRP,UAAU,KACVyP,MAAM,WAEL,UAAAvS,EAAQyX,gBAAR,eAAkBnU,OAAQ,oBAC3B,kBAACF,EAAA,EAAD,sBACQpD,EAAQyX,gBADhB,iBACQ,EAAkB1Q,eAD1B,aACQ,EAA2BzD,KADnC,SAID,kBAAC,GAAD,CACCmP,QAAS9J,EACT+J,WAAU,OAAED,QAAF,IAAEA,OAAF,EAAEA,EAASjT,QACpB,SAACC,GAAD,aACCA,EAAEkI,YAAF,UACA7O,EAAYA,YAAYa,cADxB,aACA,EAAgCjB,OAElCyS,QAAQ,EACRwH,SAAU,CACTC,UAAWA,EACVsB,EACAH,GAAa2D,UAEd7E,aAAcA,EACbqB,EACAH,GAAa2D,UAEd5E,aAAcA,EACboB,EACAH,GAAa2D,cAKjB,kBAAC7I,GAAA,EAAD,eACCE,MAAI,EACJC,GAAI,MACGxI,EAAImC,gBAAgBnJ,QAAO,SAACC,GAAD,OAAOA,EAAE/G,MACzCkN,QAAU,CACX5C,MAAO,CAAEsD,UAAW,UAGrB,kBAAC,GAAD,CACCqC,gBAAiBA,EACjBuL,SAAUA,KAGZ,kBAACrF,GAAA,EAAD,CAAME,MAAI,EAACC,GAAI,IACd,kBAAC,GAAD,CACC5H,QAASA,EACTC,UAAWA,EACXC,SAAUA,EACVC,WAAYA,EACZkB,QAASA,EACTC,YAAaA,EACbwL,SAAUA,MAIb,6BACA,kBAAC,GAAD,CACCgC,MAAOxd,GAAM,EACbW,oBAAqBA,GAAuB,EAC5CwP,cAAeA,EACfqL,SAAUA,OAIb,CACClU,EAAQuX,KACRvX,EAAQyX,SACRhF,EACAjM,EACAoM,EACAC,EACAC,EACAoB,EACAlE,EAAWgH,SACXnO,KCzQGxI,GAAYC,YAAW,CAC5BqR,UAAW,CACVrL,UAAW,QAEZqR,KAAM,CACLtR,QAAS,OACTjB,aAAc,OACdkB,UAAW,OACX4O,OAAQ,uBA0FK0C,GAtFS,WAAO,IAAD,EACvB3W,EAAUZ,KADa,EAEOqN,KAA5B5U,EAFqB,EAErBA,YAAakX,EAFQ,EAERA,WAFQ,EAGCb,KAAtB0I,EAHqB,EAGrBA,UAAWC,EAHU,EAGVA,OACb9X,EAAUpB,KACVmZ,EAAa,CAClBR,MAAa,OAAPvX,QAAO,IAAPA,OAAA,EAAAA,EAASkM,MAAK,SAACzN,GAAD,OpCJQ,IoCIDA,EAAE/F,QAA0B,KACvD+e,SAAU3e,EAAYa,QAAU,MAG3Bqe,EAAwB9b,IAAMgR,SACnC,kBACC,6BACEpU,EAAYgP,gBAAgBtJ,KAAI,SAACgI,EAAKuM,GACtC,OAAIvM,EAAIjK,QAAUwC,GAAYyF,QAE5B,yBAAKxB,MAAO,CAAEgD,UAAW,UAAY7C,IAAK4P,GACzC,6BACA,kBAACjR,EAAA,EAAD,CACCkB,MAAO,CAAElL,OAAQ,QACjBoK,QAAS,kBACR2V,EAAU9E,EAAKhU,GAAYuF,UAG5B,kBAAC,KAAD,CAAU2C,SAAS,YAMtB,kBAAC,KAAD,CAAMb,UAAW,EAAG1E,UAAWT,EAAQ0W,KAAMxU,IAAK4P,GACjD,yBAAK/P,MAAO,CAAEgD,UAAW,UACxB,oCAAU+M,EAAM,IAEjB,kBAAC,GAAD,CACCvM,IAAKA,EACLxG,QAAS+X,EACT7D,SAAUnB,IAEV/C,EAAWgH,UACX,yBAAKhU,MAAO,CAAEgD,UAAW,UACxB,kBAAClE,EAAA,EAAD,CACCE,MAAM,YACNC,aAAW,SACXC,QAAS,kBAAM2V,EAAU9E,KAEzB,kBAAC,KAAD,CAAY9L,SAAS,mBAS7B,CACCnO,EAAYgP,gBACZiQ,EACA/H,EAAWgH,SACXa,IAIF,OACC,6BACE7X,IAAO,OAAIlH,QAAJ,IAAIA,GAAJ,UAAIA,EAAaa,cAAjB,aAAI,EAAqBjB,IAChC,oCACC,6BAAMsf,GACLhI,EAAWgH,UACX,yBAAKhU,MAAO,CAAEgD,UAAW,WACxB,kBAACxC,EAAA,EAAD,CACCxB,MAAM,UACNqB,QAAQ,YACRnB,QAAS,kBAAM4V,KACfpW,UAAWT,EAAQ0Q,WAJpB,aAWA,OCnGDtR,GAAYC,YAAW,CAC5B5E,MAAO,CACNsG,MAAO,UACPiW,WAAY,UAmCCC,GA9Ba,WAAO,IAAD,EAEhCxK,KADO5U,EADyB,EACzBA,YAAakX,EADY,EACZA,WAAYmI,EADA,EACAA,cAAe9M,EADf,EACeA,QAExCxS,EAAoBsW,KAApBtW,gBACFoI,EAAUZ,KAEhB,OACC,oCACE8X,GAAiB,uBAAGzW,UAAWT,EAAQvF,OAAQyc,GAC/CnI,EAAWM,aACZxX,EAAYgP,gBAAgBlC,OAAS,EACpC,kBAACpC,EAAA,EAAD,CACCR,MAAO,CAAEsD,UAAW,QACpBpE,QAAS,kBAAMrJ,KACfwK,QAAQ,YACRrB,MAAM,UACNsK,cAC2BlQ,IAAzBtD,EAAY6O,WACD,OAAX7O,QAAW,IAAXA,OAAA,EAAAA,EAAa6O,UAAW,IACxB0D,GARH,QAaG,KACJ,kBAAC,GAAD,CAAYlQ,KAAMrC,MC9BRsf,GAAb,kDAOC,WAAYlG,GAAmB,IAAD,8BAC7B,gBAPDxZ,QAM8B,IAL9B2a,sBAK8B,IAJ9BnB,cAI8B,IAH9BoB,UAG8B,IAF9B5K,iBAE8B,EAE7B,EAAK4K,KAAO,GACZ,EAAK5K,YAAc,GACnB,EAAKwJ,SAAWA,EAJa,EAP/B,UAAuChL,ICA1BmR,GAOZ,WAAYC,GAMR,IAAD,2BAZHxf,iBAYG,OAXHkX,gBAWG,OAVHiB,uBAUG,OATH5F,aASG,OARH8M,mBAQG,EACFtc,KAAK/C,YAAcwf,EAAKxf,aAAe,IAAI2O,GAC3C5L,KAAKmU,WAAasI,EAAKtI,WACvBnU,KAAKoV,kBAAL,UAAyBqH,EAAKrH,yBAA9B,QAAmD,GACnDpV,KAAKwP,QAAUiN,EAAKjN,UAAW,EAC/BxP,KAAKsc,cAAgBG,EAAKH,eAAiB,MCGhCI,GAuBZ,WAAYD,GA8BR,yBApDJpI,aAoDG,OAnDHD,sBAmDG,OAlDHE,wBAkDG,OAjDHtX,qBAiDG,OAhDHK,0BAgDG,OA/CHqY,iBA+CG,OA9CH4F,iBA8CG,OA7CHqB,cA6CG,OA5CH5F,eA4CG,OA3CHC,kBA2CG,OAvCHC,kBAuCG,OAnCHgE,0BAmCG,OAlCHC,6BAkCG,OAjCHc,eAiCG,OAhCHC,YAgCG,EACFjc,KAAKqU,QAAUoI,EAAKpI,QACpBrU,KAAKoU,iBAAmBqI,EAAKrI,iBAC7BpU,KAAKsU,mBAAqBmI,EAAKnI,mBAC/BtU,KAAKhD,gBAAkByf,EAAKzf,gBAC5BgD,KAAK3C,qBAAuBof,EAAKpf,qBACjC2C,KAAKsb,YAAcmB,EAAKnB,YACxBtb,KAAK2c,SAAWF,EAAKE,SACrB3c,KAAK+W,UAAY0F,EAAK1F,UACtB/W,KAAKgX,aAAeyF,EAAKzF,aACzBhX,KAAKiX,aAAewF,EAAKxF,aACzBjX,KAAKib,qBAAuBwB,EAAKxB,qBACjCjb,KAAKkb,wBAA0BuB,EAAKvB,wBACpClb,KAAKgc,UAAYS,EAAKT,UACtBhc,KAAKic,OAASQ,EAAKR,OACnBjc,KAAK0V,YAAc+G,EAAK/G,aAIbkH,GAuBZ,WAAYC,GA8BR,yBApDJxI,aAoDG,OAnDHD,sBAmDG,OAlDHE,wBAkDG,OAjDHtX,qBAiDG,OAhDHK,0BAgDG,OA/CHqY,iBA+CG,OA9CH4F,iBA8CG,OA7CHqB,cA6CG,OA5CH5F,eA4CG,OA3CHC,kBA2CG,OAvCHC,kBAuCG,OAnCHgE,0BAmCG,OAlCHC,6BAkCG,OAjCHc,eAiCG,OAhCHC,YAgCG,EACFjc,KAAKqU,SAAmB,OAATwI,QAAS,IAATA,OAAA,EAAAA,EAAWxI,UAAY,SAACyI,GAAD,OAAe,MACrD9c,KAAKoU,kBACK,OAATyI,QAAS,IAATA,OAAA,EAAAA,EAAWzI,mBAAqB,SAAC2I,GAAD,OAAgB,MACjD/c,KAAKsU,oBACK,OAATuI,QAAS,IAATA,OAAA,EAAAA,EAAWvI,qBAAuB,SAAC1R,GAAD,OAAkB,MACrD5C,KAAKhD,iBAA2B,OAAT6f,QAAS,IAATA,OAAA,EAAAA,EAAW7f,kBAAoB,kBAAM,MAC5DgD,KAAK3C,sBACK,OAATwf,QAAS,IAATA,OAAA,EAAAA,EAAWxf,uBAAyB,SAACuF,GAAD,OAA0B,MAC/D5C,KAAK0V,aACK,OAATmH,QAAS,IAATA,OAAA,EAAAA,EAAWnH,cAAgB,SAACsH,EAAWC,GAAZ,OAA8B,MAC1Djd,KAAKsb,aACK,OAATuB,QAAS,IAATA,OAAA,EAAAA,EAAWvB,cAAgB,SAAC0B,EAAWE,GAAZ,OAA0B,MACtDld,KAAK2c,UAAoB,OAATE,QAAS,IAATA,OAAA,EAAAA,EAAWF,WAAa,SAACK,EAAWE,GAAZ,OAA0B,MAClEld,KAAK+W,UAAY,SAACiG,EAAW1V,GAAZ,OAAkC,kBAAM,OACzDtH,KAAKgX,aACJ,SAACvE,EAAWnL,GAAZ,OAAkC,SAAC1D,EAAWuZ,GAAZ,OACjC,OACFnd,KAAKiX,aACJ,SAACmG,EAAgB9V,GAAjB,OACA,SAAC1D,EAAWuZ,EAAaE,GAAzB,OACC,OACFrd,KAAKib,sBACK,OAAT4B,QAAS,IAATA,OAAA,EAAAA,EAAW5B,uBACV,SAACxI,EAAW6K,EAAWN,GAAvB,OAAqC,MACvChd,KAAKkb,yBACK,OAAT2B,QAAS,IAATA,OAAA,EAAAA,EAAW3B,0BACV,SAACzI,EAAWyK,EAAWF,GAAvB,OAAqC,MACvChd,KAAKgc,WACK,OAATa,QAAS,IAATA,OAAA,EAAAA,EAAWb,YAAc,SAACgB,EAAWpa,GAAZ,OAAgC,MAE1D5C,KAAKic,QAAkB,OAATY,QAAS,IAATA,OAAA,EAAAA,EAAWZ,SAAW,kBAAM,Q,SVlKhC/D,K,mBAAAA,E,4BAAAA,Q,cAKPtc,O,qCAAAA,I,2BAAAA,I,2BAAAA,I,qBAAAA,I,2BAAAA,I,2CAAAA,I,+BAAAA,I,yBAAAA,I,2BAAAA,I,iCAAAA,I,kCAAAA,I,oDAAAA,I,4DAAAA,I,wBAAAA,I,+CAAAA,Q,KAoCL,IAAM6E,GAAU,SAACC,EAA2BC,GAC3C,OAAQA,EAAOC,MACd,KAAKhF,GAAW2hB,gBACf,OAAO5c,EAAOI,QACf,KAAKnF,GAAW4hB,WACf,OAAO,2BACH9c,GADJ,IAECuL,gBACkC,IAAjCvL,EAAMuL,gBAAgBlC,OACnB,CAAC,IAAI2C,IACLhM,EAAMuL,gBACVnO,OAAQ6C,EAAOI,QACf+K,SAAUnL,EAAOI,QAAQlE,KAG3B,KAAKjB,GAAW6hB,WACf,OAAO,2BACH/c,GADJ,IAECuL,gBAAiBvL,EAAMuL,gBAAgBtJ,KAAI,SAAC8P,EAAGuK,GAAJ,OAC1CA,IAAMrc,EAAOI,QAAQmW,IAArB,2BAEMzE,GAFN,IAGG/R,MAAOC,EAAOI,QAAQ2c,QACtB/R,YAAY,IAEZ8G,OAIN,KAAK7W,GAAW+hB,QACf,OAAO,2BACHjd,GADJ,IAECuL,gBAAgB,GAAD,oBACXvL,EAAMuL,iBADK,CAEd,IAAIS,OAIP,KAAK9Q,GAAWgiB,WACf,OAAO,2BAAKld,GAAZ,IAAmBpD,OAAQqD,EAAOI,UAEnC,KAAKnF,GAAWiiB,mBACf,OAAO,2BACHnd,GADJ,IAECuL,gBAAiBvL,EAAMuL,gBAAgBtJ,KAAI,SAAC8P,EAAGuK,GAAJ,OAC1CA,IAAMrc,EAAOI,QAAQmW,IAArB,2BAEMzE,GAFN,IAGGzF,cAAerM,EAAOI,QAAQ3D,UAE9BqV,OAIN,KAAK7W,GAAWkiB,aACf,OAAO,2BACHpd,GADJ,IAECuL,gBAAiBvL,EAAMuL,gBAAgBtJ,KAAI,SAAC8P,EAAGuK,GAAJ,OAC1CA,IAAMrc,EAAOI,QAAQmW,IAArB,2BAEMzE,GAFN,IAGG7F,QAASjM,EAAOI,QAAQ6L,QACxBjB,YAAY,IAEZ8G,OAIN,KAAK7W,GAAWmiB,UACf,OAAO,2BACHrd,GADJ,IAECuL,gBAAiBvL,EAAMuL,gBAAgBtJ,KAAI,SAAC8P,EAAGuK,GAAJ,OAC1CA,IAAMrc,EAAOI,QAAQmW,IAArB,2BAEMzE,GAFN,IAGG5F,YAAalM,EAAOI,QAAQ8L,YAC5BlB,YAAY,IAEZ8G,OAIN,KAAK7W,GAAWoiB,WACf,OAAO,2BACHtd,GADJ,IAECuL,gBAAiBvL,EAAMuL,gBAAgBtJ,KAAI,SAAC8P,EAAGuK,GAAJ,OAC1CA,IAAMrc,EAAOI,QAAQmW,IAArB,2BAEMzE,GAFN,iBAGG9G,YAAY,EACZnO,oBAAqB,GACpBmD,EAAOI,QAAQuG,IALnB,uBAMOmL,EAAE9R,EAAOI,QAAQuG,MANxB,CAOI,IAAI8E,OAGLqG,OAIN,KAAK7W,GAAWqiB,cACf,OAAO,2BACHvd,GADJ,IAECuL,gBAAiBvL,EAAMuL,gBAAgBtJ,KAAI,SAAC8P,EAAGyL,GAAJ,OAC1CA,IAASvd,EAAOI,QAAQqc,OAAxB,2BAEM3K,GAFN,iBAGG9G,YAAY,EACZnO,oBAAqB,GACpBmD,EAAOI,QAAQuG,IAAMmL,EACrB9R,EAAOI,QAAQuG,KACd3D,QACD,SAACyT,EAAG+G,GAAJ,OACCA,IAASxd,EAAOI,QAAQqd,eAG1B3L,OAIN,KAAK7W,GAAWyiB,cACf,OAAO,2BACH3d,GADJ,IAECuL,gBAAiBvL,EAAMuL,gBAAgBtJ,KAAI,SAAC8P,EAAGyL,GAAJ,OAC1Cvd,EAAOI,QAAQqc,SAAWc,EAA1B,2BAEMzL,GAFN,iBAGG9G,YAAY,EACZnO,oBAAqB,GACpBmD,EAAOI,QAAQuG,IAAMmL,EAAE9R,EAAOI,QAAQuG,KAAK3E,KAC3C,SAACiB,EAAGua,GAAJ,OACCA,IAASxd,EAAOI,QAAQqd,UAAxB,2BAEMzd,EAAOI,QAAQ8O,WAFrB,IAGGpD,eACC,IAAI8P,GACH5b,EAAOI,QAAQlE,MAGjB+G,OAGL6O,OAIN,KAAK7W,GAAW0iB,uBACf,OAAO,2BACH5d,GADJ,IAECuL,gBAAiBvL,EAAMuL,gBAAgBtJ,KAAI,SAAC8P,EAAGyL,GAAJ,OAC1CA,IAASvd,EAAOI,QAAQqc,OAAxB,2BAEM3K,GAFN,IAGG9G,YAAY,EACZmB,gBAAiB2F,EAAE3F,gBAAgBnK,KAClC,SAACiB,EAAGua,GAAJ,OACCA,IAASxd,EAAOI,QAAQmW,IAAxB,2BAEMtT,GAFN,IAGG6I,eAAe,2BACX7I,EAAE6I,gBADQ,IAEbgL,KAAM9W,EAAOI,QACXwd,SAGH3a,OAGL6O,OAIN,KAAK7W,GAAW4iB,2BACf,OAAO,2BACH9d,GADJ,IAECuL,gBAAiBvL,EAAMuL,gBAAgBtJ,KAAI,SAAC8P,EAAGyL,GAAJ,OAC1CA,IAASvd,EAAOI,QAAQqc,OAAxB,2BAEM3K,GAFN,IAGG9G,YAAY,EACZmB,gBAAiB2F,EAAE3F,gBAAgBnK,KAClC,SAACiB,EAAGua,GAAJ,OACCA,IAASxd,EAAOI,QAAQmW,IAAxB,2BAEMtT,GAFN,IAGG6I,eAAe,2BACX7I,EAAE6I,gBADQ,IAEbI,YACClM,EAAOI,QAAQ0d,QAGjB7a,OAGL6O,OAIN,KAAK7W,GAAW8iB,SACf,OAAO,2BACHhe,GADJ,IAECyK,KAAMxK,EAAOI,UAGf,KAAKnF,GAAW+iB,oBACf,OAAO,2BACHje,GADJ,IAECqL,cAAepL,EAAOI,UAGxB,QACC,OAAOL,IAIGke,GAAqBve,IAAMC,mBAEtCC,GACWse,GAA2Bxe,IAAMC,mBAE5CC,GAEIa,GAAM,IAAI7E,EAsNHsV,GAAiB,WAC7B,IAAM5P,EAAQ5B,IAAM8B,WAAWyc,IAE/B,IAAK3c,EACJ,MAAM,IAAIG,MACT,iEAIF,OAAOH,GAGKqR,GAAuB,WACnC,IAAMrR,EAAQ5B,IAAM8B,WAAW0c,IAE/B,IAAK5c,EACJ,MAAM,IAAIG,MACT,iEAIF,OAAOH,GAGO6c,GAxOc,SAAC,GAIL,IAAD,EAHvBC,EAGuB,EAHvBA,eACA5K,EAEuB,EAFvBA,WACA6K,EACuB,EADvBA,mBACuB,EACS3e,IAAMkB,WAEpCd,GAASue,GAAsB,IAAIpT,IAHd,mBAChB3O,EADgB,KACHuE,EADG,KAKjB2C,EAAUpB,KACV6T,EAAUtS,KACRN,EAA0BO,KAA1BP,sBACFyF,EAAUC,cARO,EASmBrE,mBAAwB,MAT3C,mBAShBiX,EATgB,KASD2C,EATC,OAU2B5Z,mBAAS,IAVpC,mBAUhB+P,EAVgB,KAUG8J,EAVH,OAWarR,GAAW5Q,GAXxB,mBAWhBuS,EAXgB,KAWPf,EAXO,KAavB3M,qBAAU,WACK,OAAdid,QAAc,IAAdA,KAAiB9hB,EAAYK,UAC3B,CAACL,EAAYK,SAEhBwE,qBAAU,WAAO,IAAD,EACXqS,EAAWM,cAAX,OAA0BxX,QAA1B,IAA0BA,GAA1B,UAA0BA,EAAaa,cAAvC,aAA0B,EAAqBjB,KAClDmH,E9BlS2B,E8BkSW/G,EAAYa,OAAOjB,MAExD,CAACsX,EAAWM,YAAZ,UAAyBxX,EAAYa,cAArC,aAAyB,EAAoBjB,KAEhD,IAAMyX,EAAqBjU,IAAMqB,aAChC,SAAC5D,GACA,IAAMgF,EAAS,OAAGqB,QAAH,IAAGA,OAAH,EAAGA,EAASkM,MAAK,SAACzN,GAAD,OAAOqN,OAAOrN,EAAE/F,MAAQiB,EAAOjB,MAC3DiG,GACHtB,EAAS,CACRZ,KAAMhF,GAAW4hB,WACjBzc,QAAS+B,MAIZ,CAACqB,IAGInH,EAAkBqD,IAAMqB,aAAY,WACzCN,GAAIpE,gBAAgBC,GAClB0E,MAAK,SAACwd,GACN1Q,EAAiB0Q,GACjB3d,EAAS,CAAEZ,KAAMhF,GAAW2hB,gBAAiBxc,QAASoe,IAC/B,IAAnBliB,EAAYJ,IACf4M,EAAQ2V,QAAR,UAAmBzjB,EAAnB,YAAyCwjB,EAAItiB,QAG9C+E,OAAM,SAACiX,GAAD,OAAQoG,EAAiBpG,EAAGpZ,SAASH,KAAKwQ,cAChD,CAAC7S,IAEE+e,EAAY3b,IAAMqB,aACvB,SAACwV,GAAgD,IAAnCwG,EAAkC,uDAAxBxa,GAAYyF,QACnCnH,EAAS,CACRZ,KAAMhF,GAAW6hB,WACjB1c,QAAS,CAAEmW,MAAKwG,eAGlB,IAGKrgB,EAAuBgD,IAAMqB,aAClC,SAAC2d,GACA,IAAMC,ET9Ve,SAACriB,GACxB,IAAI6S,EAAU,GAwBd,QAvBK7S,EAAY6O,UAAY7O,EAAY6O,UAAY,KACpDgE,GAAW,wBAEP7S,EAAYkO,MAA4B,GAApBlO,EAAYkO,OACpC2E,GAAW,+BAEZ7S,EAAYgP,gBAAgBuG,SAAQ,SAACC,EAAGyL,GAClCzL,EAAE1F,aAAuC,GAAxB0F,EAAE1F,YAAYhD,SACnC+F,GAAO,eAAYoO,EAAO,EAAnB,2CAEHzL,EAAE3F,iBAA+C,GAA5B2F,EAAE3F,gBAAgB/C,SAC3C+F,GAAO,eACNoO,EAAO,EADD,+CAIRzL,EAAE3F,gBAAgB0F,SAAQ,SAAC5O,GAAO,IAAD,GAC5B,UAACA,EAAE6I,sBAAH,aAAC,EAAkBgL,OAAQ7T,EAAElD,QAAUwC,GAAYuF,SACtDqH,GAAO,eACNoO,EAAO,EADD,wDAMHpO,ESqUcyP,CAAStiB,GACvBqiB,GACJle,GAAI/D,qBAAqBJ,EAAYJ,GAAIwiB,GACvC1d,MAAK,SAAC6d,GACNhe,EAAS,CACRZ,KAAMhF,GAAWgiB,WACjB7c,QAASse,IAEV5Q,EAAiB,2BAAKxR,GAAN,IAAmBK,OAAQ+hB,QAE3Czd,OAAM,SAACiX,GAAD,OAAQoG,EAAiBpG,EAAGpZ,SAASH,KAAKwQ,YAEnDoP,EAAqBI,KAEtB,CAACriB,IAGIgf,EAAS5b,IAAMqB,aAAY,WAChCF,EAAS,CAAEZ,KAAMhF,GAAW+hB,YAC1B,IAEGjI,EAAcrV,IAAMqB,aACzB,SAACwV,EAAa9Z,GACboE,EAAS,CACRZ,KAAMhF,GAAWiiB,mBACjB9c,QAAS,CAAEmW,MAAK9Z,eAGlB,IAGKke,EAAcjb,IAAMqB,aAAY,SAACwV,EAAatK,GACnDpL,EAAS,CAAEZ,KAAMhF,GAAWkiB,aAAc/c,QAAS,CAAEmW,MAAKtK,eACxD,IAEG+P,EAAWtc,IAAMqB,aAAY,SAACwV,EAAarK,GAChDrL,EAAS,CAAEZ,KAAMhF,GAAWmiB,UAAWhd,QAAS,CAAEmW,MAAKrK,mBACrD,IAEGkK,EAAY1W,IAAMqB,aACvB,SAACwV,EAAa5P,GAAd,OAAoC,WACnC9F,EAAS,CAAEZ,KAAMhF,GAAWoiB,WAAYjd,QAAS,CAAEmW,MAAK5P,YAEzD,IAGK0P,EAAe3W,IAAMqB,aAC1B,SAAC0b,EAAgB9V,GAAjB,OACC,SAAC8W,EAAmB/H,GACnB7U,EAAS,CACRZ,KAAMhF,GAAWqiB,cACjBld,QAAS,CAAEqc,SAAQ9V,MAAK8W,YAAW/H,iBAGtC,IAGKY,EAAe5W,IAAMqB,aAC1B,SAAC0b,EAAgB9V,GAAjB,OACC,SAAC8W,EAAmBvhB,EAAY4iB,GAC/Bje,EAAS,CACRZ,KAAMhF,GAAWyiB,cACjBtd,QAAS,CACRqc,SACA9V,MACA8W,YACAvhB,KACA4iB,QACA5P,UAAS,OAAE+G,QAAF,IAAEA,OAAF,EAAEA,EAASvG,MAAK,SAACzM,GAAD,OAAOA,EAAE/G,IAAMA,WAI5C,CAAC+Z,IAGIqE,EAAuB5a,IAAMqB,aAClC,SAAC0b,EAAgBmB,EAAcrH,GAC9B1V,EAAS,CACRZ,KAAMhF,GAAW0iB,uBACjBvd,QAAS,CAAEqc,SAAQmB,OAAMrH,WAG3B,IAGKgE,EAA0B7a,IAAMqB,aACrC,SAAC0b,EAAgBqB,EAAavH,GAC7B1V,EAAS,CACRZ,KAAMhF,GAAW4iB,2BACjBzd,QAAS,CAAEqc,SAAQqB,MAAKvH,WAG1B,IAGK7C,EAAUhU,IAAMqB,aAAY,SAACyJ,GAClC3J,EAAS,CAAEZ,KAAMhF,GAAW8iB,SAAU3d,QAASoK,MAC7C,IAEGiJ,EAAmB/T,IAAMqB,aAAY,SAACqK,GAC3CvK,EAAS,CACRZ,KAAMhF,GAAW+iB,oBACjB5d,QAASgL,MAER,IAEGrL,EAAQ,IAAI8b,GAAiB,CAClCvf,cACAkX,aACAiB,oBACA5F,UACA8M,kBAEKxF,EAAW,IAAI4F,GAAoB,CACxCrI,UACAD,mBACAE,qBACAtX,kBACAK,uBACAqY,cACA4F,cACAqB,WACA5F,YACAC,eACAC,eACAgE,uBACAC,0BACAc,YACAC,WAGD,OAAK9X,EAGJ,kBAACya,GAAmB5c,SAApB,CAA6BC,MAAOvB,GACnC,kBAACme,GAAyB7c,SAA1B,CAAmCC,MAAO6U,GACzC,kBAAC,GAAD,MACA,kBAAC,GAAD,MACA,kBAAC,GAAD,QAPkB,mDWlehB3C,GAAyB,CAC9B0B,YAAY,EACZsF,UAAU,EACV1G,aAAa,EACbiB,aAAa,GA4BCgK,GAzBW,WAAO,IACxB3gB,EAASmD,KAATnD,KADuB,EAEOsB,IAAMgF,SAC3CtG,EAAO,IAAI6M,GAAmB7M,GAAQ,IAAI6M,IAHZ,mBAExB3O,EAFwB,UAO/B,OAFAkX,GAAWuB,eAAe,OAAC3W,QAAD,IAACA,OAAD,EAACA,EAAMgI,SAGhC,6BACC,kBAACQ,EAAA,EAAD,CACCJ,MAAO,CAAEsD,UAAW,QACpBgM,cAAY,EACZjP,QAAQ,KACRkP,MAAM,UAJP,mBAQA,kBAAC,GAAD,CACCsI,mBAAoB/hB,EACpBkX,WAAYA,OCvBV/S,GAAM,IAAI7E,EAqEDojB,GAnEW,WACzB,IAAMC,EAAQC,cACN9gB,EAASmD,KAATnD,KAFuB,EAI9BsB,IAAMgF,SAAoC,MAJZ,mBAGxBpI,EAHwB,KAGX6iB,EAHW,KAMzBC,EAAU,SAACC,GAAD,SAEd,OAACjhB,QAAD,IAACA,OAAD,EAACA,EAAMgI,WACP9J,IACA+iB,IACA,CAAC1c,GAAkB4F,IAAK5F,GAAkB6F,eAAemO,SACxD0I,KAIGC,EAAWF,EAAO,OAAC9iB,QAAD,IAACA,OAAD,EAACA,EAAaK,QAhBP,EAkBK+H,mBAAqB,CACxDwQ,WAAYoK,EACZ9E,SAAU8E,EACVxL,YAAawL,EACbvK,eACE,OAAC3W,QAAD,IAACA,OAAD,EAACA,EAAMgI,WACG,OAAX9J,QAAW,IAAXA,OAAA,EAAAA,EAAaK,UAAWgG,GAAkB8F,kBAxBb,mBAkBxB+K,EAlBwB,KAkBZ+L,EAlBY,KA0B/Bpe,qBAAU,WACL8d,EAAM5K,OAAOnY,IAChBuE,GAAIxE,mBAAmBujB,SAASP,EAAM5K,OAAOnY,KAAK8E,MAAK,SAACwd,GAAD,OACtDW,EAAeX,QAGf,CAACS,EAAM5K,OAAOnY,KAcjB,OAAKI,EAGJ,oCACC,kBAACsK,EAAA,EAAD,CACCkP,cAAY,EACZtP,MAAO,CAAEsD,UAAW,OACpBjD,QAAQ,KACRkP,MAAM,UAJP,UAMKzZ,EAAYJ,GAAK,GAAK,OAN3B,gBAQA,kBAAC,GAAD,CACCkiB,eAzBwB,SAACqB,GAC3B,IAAMH,EAAWF,EAAQK,GACzBF,EAAc,CACbrK,WAAYoK,EACZ9E,SAAU8E,EACVxL,YAAawL,EACbvK,eACE,OAAC3W,QAAD,IAACA,OAAD,EAACA,EAAMgI,UACRqZ,IAAc9c,GAAkB8F,mBAkBhC4V,mBAAoB/hB,EACpBkX,WAAYA,KAfU,wD,SC/CpB6E,GAAwB,CAC7B,CAAEnK,MAAO,KAAMoK,WAAY,KAAMrY,KAAM,SAAUyf,KAAM,GAAKrR,SAAU,IACtE,CAAEH,MAAO,OAAQoK,WAAY,OAAQoH,KAAM,EAAGrR,SAAU,KACxD,CACCH,MAAO,UACPoK,WAAY,UACZrY,KAAM,WAENyf,KAAM,EACNrR,SAAU,IACVkK,YAAa,SAAClE,GAAD,OACZA,EAAO/S,MAAQ,IAAIiK,KAAK8I,EAAO/S,OAAmB,OAEpD,CACC4M,MAAO,WACPoK,WAAY,WACZoH,KAAM,EACNzf,KAAM,WACNoO,SAAU,IACVkK,YAAa,SAAClE,GAAD,OACZA,EAAO/S,MAAQ,IAAIiK,KAAK8I,EAAO/S,OAAmB,OAEpD,CACC4M,MAAO,UACPoK,WAAY,UACZoH,KAAM,EACNrR,SAAU,IACVkK,YAAa,SAAClE,GAAD,yBAAYA,EAAOrK,WAAnB,iBAAY,EAAYO,eAAxB,aAAY,EAAqBzD,OAE/C,CACCoH,MAAO,OACPoK,WAAY,OACZoH,KAAM,EACNrR,SAAU,IACVmK,WAAY,SAACnE,GAAD,OACX,kBAACrN,EAAA,EAAD,CACCH,QAAQ,YACRrB,MAAM,UACNiE,KAAK,QACLnD,UAAWC,IACXG,GAAE,UAAK1L,EAAL,YAAsBqZ,EAAOrK,IAAI9N,KALpC,UAWF,CACCgS,MAAO,UACPoK,WAAY,UACZoH,KAAM,EACNrR,SAAU,IACVmK,WAAY,SAACnE,GAAD,OACX,kBAACrN,EAAA,EAAD,CACCH,QAAQ,YACRrB,MAAM,UACNiE,KAAK,QACLnD,UAAWC,IACXG,GAAE,UAAK1L,EAAL,YAAuBqZ,EAAOrK,IAAI9N,KALrC,cA0DYyjB,GA7CC,WACf,IAAMnc,EAAUpB,KAEhB,OAAKoB,EAEJ,kBAACtI,EAAD,KACC,kBAAC0L,EAAA,EAAD,CACCkP,cAAY,EACZtP,MAAO,CAAEsD,UAAW,OACpBjD,QAAQ,KACRkP,MAAM,UAJP,gBAQA,kBAAChM,GAAA,EAAD,CAAWC,KAAG,GACb,kBAAChD,EAAA,EAAD,CACCH,QAAQ,YACRrB,MAAM,YACNgB,MAAO,CAAEoZ,MAAO,SAChBnW,KAAK,QACLnD,UAAWC,IACXG,GAAE,UAAK1L,EAAL,IAAsB,IANzB,eAWD,yBACCwL,MAAO,CACN2S,OAAQ,sBACRxI,MAAO,OACP7G,UAAW,SAGZ,kBAAC,KAAD,CACCwP,QAASjB,GACTjH,KAAM5N,EACNqc,WAAY,CACXxa,QAASya,UAlCO,MCjEhBzH,GAAwB,CAC7B,CAAEnK,MAAO,KAAMoK,WAAY,KAAMrY,KAAM,SAAUyf,KAAM,GAAKrR,SAAU,IACtE,CACCH,MAAO,WACPoK,WAAY,YACZrY,KAAM,SACNyf,KAAM,GACNrR,SAAU,KAEX,CAAEH,MAAO,OAAQoK,WAAY,OAAQoH,KAAM,EAAGrR,SAAU,KACxD,CAAEH,MAAO,QAASoK,WAAY,QAASoH,KAAM,EAAGrR,SAAU,KAC1D,CACCH,MAAO,eACPoK,WAAY,UACZrY,KAAM,SACNyf,KAAM,GACNrR,SAAU,KAEX,CACCH,MAAO,QACPoK,WAAY,QACZrY,KAAM,eACN8f,apCyBM,CACN9X,GAAUxF,GAAWkF,UACrBM,GAAUxF,GAAWmF,QACrBK,GAAU,MoC3BVsQ,YAAa,SAAClE,GAAD,OAAYpM,GAAUqH,OAAO+E,EAAO/S,SACjDoe,KAAM,EACNrR,SAAU,KAEX,CACCH,MAAO,aACPoK,WAAY,OACZoH,KAAM,EACNrR,SAAU,GACVmK,WAAY,SAACnE,GAAD,OACX,kBAACrN,EAAA,EAAD,CACCH,QAAQ,YACRrB,MAAM,UACNiE,KAAK,QACLnD,UAAWC,IACXG,GAAE,UAAK1L,EAAL,YAAsBqZ,EAAOrK,IAAI9N,KALpC,WAkHY8jB,GArGC,WACf,IAAMf,EAAQC,cADO,EAEWxa,mBAC/B4K,OAAO2P,EAAM5K,OAAOlJ,WAAa,GAHb,mBAEdA,EAFc,KAEJ8U,EAFI,OAKSvb,mBAAsB,IAL/B,mBAKduR,EALc,KAKLiK,EALK,KAMfzf,EAAM,IAAI7E,EAmBhB,OAJAuF,qBAAU,YAbS,WAAqC,IAApCgf,EAAmC,uDAAbhV,EACzC8U,EAAYE,GACRA,EAAc,EACjB1f,EAAIrD,qBAAqB+iB,GAAanf,MAAK,SAACrC,GAC3CuhB,EAAWvhB,MAGZ8B,EAAIpD,aAAa2D,MAAK,SAACrC,GACtBuhB,EAAWvhB,MAMbtB,KACE,IAGF,oCACC,kBAACuJ,EAAA,EAAD,CACCkP,cAAY,EACZtP,MAAO,CAAEsD,UAAW,OACpBjD,QAAQ,KACRkP,MAAM,UAJP,WAQA,kBAAChM,GAAA,EAAD,CAAWC,KAAG,GACb,6BACC,kBAAChD,EAAA,EAAD,CACCN,GAAI,CACHW,SAAS,GAAD,OAAKrM,EAAL,MACR+E,MAAO,CAAEoL,aAEV7E,UAAWC,IACXkD,KAAK,QACLjD,MAAO,CAAEoZ,MAAO,QAAS7M,WAAY,OACrCvN,MAAM,YACNqB,QAAQ,aATT,cAaA,kBAACG,EAAA,EAAD,CACCN,GAAI,CACHW,SAAS,GAAD,OAAKrM,GACb+E,MAAO,CAAEoL,aAEV7E,UAAWC,IACXkD,KAAK,QACLjD,MAAO,CAAEoZ,MAAO,QAAS7M,WAAY,OACrCvN,MAAM,UACNqB,QAAQ,aATT,oBAaCsE,EAAW,GACX,kBAACnE,EAAA,EAAD,CACCN,GAAI,CACHW,SAAS,GAAD,OAAKrM,GACb+E,MAAO,CAAEoL,aAEV7E,UAAWC,IACXkD,KAAK,QACLjD,MAAO,CAAEoZ,MAAO,QAAS7M,WAAY,OACrCvN,MAAM,UACNqB,QAAQ,aATT,sBAgBH,kBAAC3L,EAAD,KACC,yBACCsL,MAAO,CACN2S,OAAQ,sBACRxI,MAAO,OACP7G,UAAW,SAGZ,kBAAC,KAAD,CACCwP,QAASjB,GACTjH,KAAM6E,EACN4J,WAAY,CACXxa,QAASya,YC/IVrf,GAAM,IAAI7E,EAgDDwkB,GA/CM,WACpB,IAAMnB,EAAQC,cACRpW,EAAUC,cAFU,EAGErE,mBAA2B,MAH7B,mBAGnBlH,EAHmB,KAGXkR,EAHW,OAIAhK,mBAAS,IAJT,mBAInBxF,EAJmB,KAIZ0P,EAJY,KAMpBH,EAAiB,SAACS,GACR,KAAT,OAAN1R,QAAM,IAANA,OAAA,EAAAA,EAAQtB,KAAY4M,EAAQY,KAAR,UAAgB1O,EAAhB,YAAiCkU,EAAUhT,MAGhEiF,qBAAU,WACT,IAAMkf,EAAiB/Q,OAAO2P,EAAM5K,OAAOqB,UACvC4K,MAAMD,GACTzR,EAAS,qBAELyR,EAAiB,EACpB5f,GAAInD,cAAc+iB,GAAgBrf,MAAK,SAACrC,GACvC+P,EAAU/P,MAGX+P,EAAU,IAAIjD,MAGd,CAACwT,EAAM5K,OAAOqB,WAUjB,OACC,oCACC,4BACElY,EACEA,EAAOtB,GAAP,UACIsB,EAAOkO,KADX,cACqBlO,EAAO8G,OAC3B,gBACD,qBAdDpF,EAAc,2BAAIA,GACjB1B,EAEJ,kBAAC,GAAD,CAAQiR,eAAgBA,EAAgBD,cAAehR,IAFpC,OCzBP+iB,GATE,WAChB,OACC,6BACC,gEADD,UAEQ,kBAAC,IAAD,CAAM7Z,GAAG,KAAT,UCKJ2R,GAAwB,CAC7B,CAAEnK,MAAO,KAAMoK,WAAY,KAAMrY,KAAM,SAAUoO,SAAU,IAC3D,CAAEH,MAAO,OAAQoK,WAAY,OAAQoH,KAAM,EAAGrR,SAAU,KACxD,CAAEH,MAAO,QAASoK,WAAY,QAASoH,KAAM,EAAGrR,SAAU,KAC1D,CACCH,MAAO,UACPoK,WAAY,QACZrY,KAAM,UACNoO,SAAU,KAEX,CACCH,MAAO,OACPoK,WAAY,IACZ3H,MAAO,IACP6H,WAAY,SAACnE,GAAD,OACX,kBAACrN,EAAA,EAAD,CACCH,QAAQ,YACRrB,MAAM,UACNiE,KAAK,QACLnD,UAAWC,IACXG,GAAE,UAAK1L,EAAL,YAAoBqZ,EAAOrK,IAAI9N,KALlC,WAaGuE,GAAM,IAAI7E,EAwCD4kB,GAtCD,WAAO,IAAD,EACO9b,mBAAoB,IAD3B,mBACZ+b,EADY,KACLC,EADK,KASnB,OANAvf,qBAAU,WACTV,GAAIxC,WAAW+C,MAAK,SAACrC,GACpB+hB,EAAS/hB,QAER,IAGF,kBAACzD,EAAD,KACC,kBAAC0L,EAAA,EAAD,CACCkP,cAAY,EACZtP,MAAO,CAAEsD,UAAW,OACpBjD,QAAQ,KACRkP,MAAM,UAJP,SAQA,yBACCvP,MAAO,CACN2S,OAAQ,sBACRxI,MAAO,OACP7G,UAAW,SAGZ,kBAAC,KAAD,CACCwP,QAASjB,GACTjH,KAAMqP,EACNZ,WAAY,CACXxa,QAASya,WC/DFa,GAAb,kDAKC,aAAe,IAAD,8BACb,gBALDzkB,QAIc,IAHd4K,UAGc,IAFdyD,aAEc,EAEb,EAAKrO,GAAK,EACV,EAAK4K,KAAO,GAHC,EALf,UAA+B4D,ICQzB7G,GAAYC,YAAW,CAC5BqK,OAAQ,CACP7S,OAAQ,mBAET4S,MAAO,CACNtF,aAAc,OACdxE,YAAa,OACb6F,QAAS,WAILxJ,GAAM,IAAI7E,EAuIDglB,GArIA,WAAO,IAAD,IACd3B,EAAQC,cACRpW,EAAUC,cACR7L,E3CqEuB,WAC/B,IAAMoE,EAAQ5B,IAAM8B,WAAWG,IAE/B,IAAKL,EACJ,MAAM,IAAIG,MACT,kEAIF,OAAOH,E2C9EgBuf,GAAf3jB,WACFsG,EAAUpB,KACV+I,EAAmB8T,EAAM5K,OAAOnY,GAAKsjB,SAASP,EAAM5K,OAAOnY,IAAM,EALnD,EAOQwI,mBAC3ByG,EAAW,IACD,OAAP3H,QAAO,IAAPA,OAAA,EAAAA,EAASkM,MAAK,SAACzN,GAAD,OAAOA,EAAE/F,IAAMiP,OAC7B,IAAIwV,IAVY,mBAObxjB,EAPa,KAOLwS,EAPK,OAYMjL,mBAAS,IAZf,mBAYbxF,EAZa,KAYN0P,EAZM,OAaclK,mBAA8B,MAb5C,mBAaboc,EAba,KAaFC,EAbE,KAcdtc,EAAUZ,KAdI,EAegBqJ,GAAW/P,GAf3B,mBAeb0R,EAfa,KAeJf,EAfI,KAiBpB3M,qBAAU,WACS,OAAd2f,GACHrgB,GAAIxD,eAAe+D,MAAK,SAACrC,GAAD,OAAUoiB,EAAapiB,SAIjDwC,qBAAU,WACT,IAAM6f,EAAW/B,EAAM5K,OAAOnY,IAAMsjB,SAASP,EAAM5K,OAAOnY,IAC1D,GAAI8kB,GAAYA,EAAW,GAAKxd,EAAS,CACxC,IAAMyd,EAAY,OAAGzd,QAAH,IAAGA,OAAH,EAAGA,EAASkM,MAAK,SAACzN,GAAD,OAAOA,EAAE/F,IAAM8kB,KAC9CC,IACHnT,EAAiBmT,GACjBtR,EAAUsR,OAGV,WAAChC,EAAM5K,cAAP,aAAC,EAAcnY,GAAIsH,IAqBtB,OAAQrG,EAGP,kBAACjC,EAAD,KACC,kBAAC0L,EAAA,EAAD,CACCkP,cAAY,EACZtP,MAAO,CAAEsD,UAAW,OACpBjD,QAAQ,KACRkP,MAAM,UAEQ,IAAb5K,EAAiB,cAAgB,GANnC,cAQA,kBAACnE,EAAA,EAAD,CACCH,QAAQ,YACRrB,MAAM,YACNiE,KAAK,QACLvE,UAAWT,EAAQ0J,OACnB7H,UAAWC,IACXG,GAAE,UAAK1L,EAAL,YAAuBmC,EAAOjB,KANjC,WAUA,0BAAM8S,SAzCa,SAACrJ,GACrBzI,EAAWC,GACT6D,MAAK,SAACmB,GACNwN,EAAUxN,GACV2L,EAAiB3L,GACC,IAAdhF,EAAOjB,IACV4M,EAAQ2V,QAAR,UAAmBzjB,EAAnB,YAAoCmH,EAAUjG,QAG/C+E,OAAM,SAACiX,GACPtJ,EAASsJ,EAAGpZ,SAASH,KAAKwQ,YAE5BxJ,EAAEsJ,mBA8BA,kBAAClF,GAAA,EAAD,CAAWC,KAAG,GACb,kBAACG,GAAA,EAAD,CACClK,KAAK,OACLqK,MAAM,OACNzD,QAAQ,WACR3B,UAAWT,EAAQyJ,MACnB5M,MAAOnE,EAAO2J,KACdsI,SAAU,SAACzJ,GAAD,OAlCQmB,EAkCanB,EAAEC,OAAOtE,WAjC5CqO,GAAU,SAACuR,GAAD,mBAAC,eAAqBA,GAAtB,IAAkCpa,YADvB,IAACA,KAoClBga,GAAaA,EAAU1X,OAAS,EAChC,kBAAC4K,GAAA,EAAD,CACCxN,MAAO,CAAEmK,MAAO,SAChBrP,MAAK,OAAEnE,QAAF,IAAEA,GAAF,UAAEA,EAAQoN,eAAV,aAAE,EAAiBzD,KACxBsI,SAAU,SAAC+R,EAAOpT,GACjB,GAAK+S,EAAL,CACA,IAAMvW,EAAUuW,EAAUpR,MACzB,SAACzM,GAAD,OAAOA,EAAE6D,MAAQiH,KAElB4B,GACC,SAACuR,GAAD,mBAAC,eAEIA,GAFL,IAGE3W,UACA6W,UAAS,OAAE7W,QAAF,IAAEA,OAAF,EAAEA,EAASrO,UAIxBkR,QAAS0T,EAAU9e,KAAI,SAACmS,GAAD,OAAYA,EAAOrN,QAC1CsN,YAAa,SAACC,GAAD,OACZ,kBAAClK,GAAA,EAAD,iBACKkK,EADL,CAEC/J,MAAM,UACNzD,QAAQ,WACR3B,UAAWT,EAAQyJ,YAInB,MAEL,kBAAClH,EAAA,EAAD,CACCyC,KAAK,QACL5C,QAAQ,YACRrB,MAAM,UACNvF,KAAK,SACLiF,UAAWT,EAAQ0J,OACnB2B,UAAWjB,GANZ,SAYD,kBAAC,GAAD,CAAYlQ,KAAMxB,IAClB,2BAAI+B,IA1EL,sDC3EWmiB,GAAb,kDAMC,WAAYnlB,GAAc,IAAD,8BACxB,gBANDA,QAKyB,IAJzB4K,UAIyB,IAHzBiN,WAGyB,IAFzB3N,aAEyB,EAExB,EAAKlK,GAAKA,GAAM,EAChB,EAAK4K,KAAO,GACZ,EAAKiN,MAAQ,GAJW,EAN1B,UAA6BrJ,ICavB7G,GAAYC,aAAW,SAACC,GAAD,MAAY,CACxCmK,MAAO,CACNtF,aAAc,OACdxE,YAAa,QAEd+J,OAAQ,CACP7S,OAAQ,mBAET8S,YAAa,CACZ9S,OAAQyI,EAAMM,QAAQ,GACtBgK,SAAU,KAEXC,YAAa,CACZxE,UAAW/F,EAAMM,QAAQ,QAsHZid,GAlHF,WACZ,IAAMrC,EAAQC,cACRhU,EAAiBoE,OAAO2P,EAAM5K,OAAOnY,KAAO,EAC5CuE,EAAM,IAAI7E,EACV6I,EAAUZ,KAJE,EAMMa,mBAAyB,MAN/B,mBAMXtG,EANW,KAMLmjB,EANK,OAOQ7c,mBAAS,CAAEyK,QAAS,KAP5B,mBAOXjQ,EAPW,KAOJ0P,EAPI,OAQkB1B,GAAW9O,GAR7B,mBAQXyQ,EARW,KAQFf,EARE,KAUlB3M,qBAAU,WACT,GAAI+J,EAAS,EACZzK,EAAIvC,YAAYgN,GAAQlK,MAAK,SAACrC,GAC7B4iB,EAAQ5iB,GACRmP,EAAiBnP,UAEZ,CACN,IAAM6iB,EAAU,IAAIH,GACpBE,EAAQC,GACR1T,EAAiB0T,MAEhB,IAgBH,OAAQpjB,EAGP,kBAAClD,EAAD,KACC,4BAAKkD,EAAK0I,MACV,0BAAMkI,SAnBa,SAACmS,GAChB/iB,IACLqC,EAAItC,SAASC,GACX4C,MAAK,SAACrC,GACN4iB,EAAQ5iB,GACRiQ,EAAS,CAAEO,QAAS,QAEpBlO,OAAM,SAAC/B,GACP0P,EAAS,CAAEO,QAAS,UAAYjQ,EAAMJ,SAASH,KAAKwQ,aAGlDgS,GAAOA,EAAMlS,oBASf,kBAAClF,GAAA,EAAD,CAAWC,KAAG,GACb,kBAACG,GAAA,EAAD,CACClK,KAAK,OACLqB,MAAOlD,EAAKlC,GACZkO,WAAY,CAAEC,UAAU,GACxBC,MAAM,KACNpF,UAAWT,EAAQyJ,MACnBrH,QAAQ,aAET,kBAACsD,GAAA,EAAD,CACClK,KAAK,OACLqB,MAAOlD,EAAKgI,QAAU,MAAQ,KAC9BgE,WAAY,CAAEC,UAAU,GACxBC,MAAM,QACNpF,UAAWT,EAAQyJ,MACnBrH,QAAQ,cAGV,kBAACkD,GAAA,EAAD,CAAWC,KAAG,GACb,kBAACuF,GAAA,EAAD,CACC1I,QAAQ,WACR3B,UAAWT,EAAQ2J,aAEnB,kBAACoB,GAAA,EAAD,CAAYtT,GAAG,sBAAf,SACA,kBAACuT,GAAA,EAAD,CACCnF,MAAM,QACNhJ,MAAOlD,EAAKgI,QAAU,IAAM,IAC5BlB,UAAWT,EAAQyJ,MACnB2B,QAAQ,qBACRT,SAAU,SAACzJ,GAAD,OACT4b,GACC,SAACE,GAAD,mBAAC,eAEIA,GAFL,IAGErb,QAASsb,QACRpS,OAAO3J,EAAEC,OAAOtE,eAMpBgG,GAAYtF,KAAI,SAACua,GAAD,OAChB,kBAAClW,EAAA,EAAD,CACC/E,MAAOib,EAAEnW,QAAU,IAAM,IACzBO,IAAK4V,EAAErgB,IAENqgB,EAAEnW,QAAU,MAAQ,YAM1B,6BACA,kBAAC,GAAD,CAAYzH,KAAMP,IAClB,kBAAC4I,EAAA,EAAD,CACCH,QAAQ,YACRrB,MAAM,UACNiE,KAAK,QACLvE,UAAWT,EAAQ0J,OACnBlO,KAAK,SACLqB,MAAM,OACNwO,UAAWjB,GAPZ,QAWA,2BAAI3P,EAAMiQ,WAtEZ,oDCzDI1O,GAAM,IAAI7E,EACVN,GAAS,CACdsN,aAAc,OACdxE,YAAa,QAiJCud,GA9IF,WAAO,IAUT,MATFvjB,EAASmD,KAATnD,KADU,EAGjBsB,IAAMgF,SAAoC,MAHzB,mBAEXkd,EAFW,KAEQC,EAFR,KAUlB,OALAniB,IAAMyB,WAAU,WACX/C,GACHqC,GAAItE,uBAAuB6E,MAAK,SAACwd,GAAD,OAASqD,EAAqBrD,QAE7D,CAACpgB,IACAA,EAEF,6BACC,kBAACwI,EAAA,EAAD,CACCkP,cAAY,EACZtP,MAAO,CAAEsD,UAAW,OACpBjD,QAAQ,KACRkP,MAAM,UAJP,YAMW3X,EAAK0I,MAEf8a,EACA,oCACC,kBAAC7X,GAAA,EAAD,CAAWC,KAAG,GACb,kBAACX,GAAA,EAAD,CAAOC,SAAS,OAAO9C,MAAO,CAAEmK,MAAO,SACtC,kBAACpH,GAAA,EAAD,eACCZ,GAAqBiZ,EAAkBjlB,UAG1C,kBAAC,KAAD,CACCiN,UAAW,EACXpD,MAAO,CACNqD,QAAS,OACTjB,aAAc,OACdkB,UAAW,SAGZ,kBAACC,GAAA,EAAD,CACCC,KAAG,EACHxD,MAAO,CACNyD,QAAS,OACTC,eAAgB,SAChB5O,OAAQ,SAGT,kBAAC6O,GAAA,EAAD,CACClK,KAAK,OACLqB,MAAK,OAAEsgB,QAAF,IAAEA,GAAF,UAAEA,EAAmBzkB,cAArB,aAAE,EAA2B2J,KAClCsD,WAAY,CAAEC,UAAU,GACxBC,MAAM,aACN9D,MAAOlL,KAER,kBAAC6O,GAAA,EAAD,CACClK,KAAK,OACLqB,MAAK,OACJsgB,QADI,IACJA,GADI,UACJA,EAAmBzkB,cADf,iBACJ,EAA2BoN,eADvB,aACJ,EAAoCzD,KAErCwD,MAAM,UACN9D,MAAOlL,GACP8O,WAAY,CAAEC,UAAU,KAEzB,kBAACF,GAAA,EAAD,CACClK,KAAK,OACLqB,MAAK,OAAEsgB,QAAF,IAAEA,OAAF,EAAEA,EAAmBpX,KAC1BF,MAAM,OACN9D,MAAOlL,GACP8O,WAAY,CAAEC,UAAU,KAEzB,kBAACF,GAAA,EAAD,CACClK,KAAK,OACLqB,MAAOgH,GAAa,OACnBsZ,QADmB,IACnBA,OADmB,EACnBA,EAAmBjlB,QAEpB2N,MAAM,SACN9D,MAAOlL,GACP8O,WAAY,CAAEC,UAAU,KAEzB,kBAAC,IAAD,CACC3D,GAAE,UAAK1L,EAAL,YAA2B4mB,EAAkB1lB,IAC/CyK,IAAKib,EAAkB1lB,GACvBgJ,UAAU,iBAEV,kBAACI,EAAA,EAAD,CACCG,aAAW,SACXD,MAAM,WAEN,kBAAC,KAAD,CAAUiF,SAAS,eAOxB,oCACC,kBAACV,GAAA,EAAD,CAAWC,KAAG,GACb,kBAACX,GAAA,EAAD,CAAOC,SAAS,OAAO9C,MAAO,CAAEmK,MAAO,SACtC,kBAACpH,GAAA,EAAD,eADD,kDAKD,yBAAK/C,MAAO,CAAEgD,UAAW,WACxB,kBAAC,IAAD,CACC9C,GAAE,UAAK1L,GACP2L,IAAK,kBACLzB,UAAU,iBAEV,kBAAC8B,EAAA,EAAD,CACCH,QAAQ,YACRrB,MAAM,YACNiE,KAAK,QACLjD,MAAO,CACNlL,OAAQ,QAETqO,UAAW,kBAAC,KAAD,OAPZ,0BAmBL,yBAAKnD,MAAO,CAAEgD,UAAW,WACxB,kBAAC5C,EAAA,EAAD,CACCkP,cAAY,EACZtP,MAAO,CAAEsD,UAAW,OACpBjD,QAAQ,KACRkP,MAAM,UAJP,WAQA,kBAACnP,EAAA,EAAD,oECnJEnG,GAAM,IAAI7E,EAEVyc,GAAwB,CAC7B,CACCnK,MAAO,OACPoK,WAAY,OACZjK,SAAU,IACVmK,WAAY,SAACnE,GAAD,aACX,kBAACrN,EAAA,EAAD,CACCH,QAAQ,YACRrB,MAAM,UACNiE,KAAK,QACLnD,UAAWC,IACXG,GAAE,UAAK1L,EAAL,sBAA2BqZ,EAAOrK,WAAlC,aAA2B,EAAY9N,KAL1C,UAWF,CACCgS,MAAO,QACPoK,WAAY,QACZjK,SAAU,IACVmK,WAAY,SAACnE,GAAD,aACX,kBAACrN,EAAA,EAAD,CACCH,QAAQ,YACRL,MAAO,CAAEuM,WAAY,QACrBvN,MAAM,YACN0B,KAAMzG,GAAI1C,4BAAJ,UAAgCsW,EAAOrK,WAAvC,aAAgC,EAAY9N,KAJnD,WAUF,CAAEgS,MAAO,KAAMoK,WAAY,KAAM3H,MAAO,GAAI1Q,KAAM,UAClD,CACCiO,MAAO,WACPoK,WAAY,UACZrY,KAAM,SACN0Q,MAAO,IACP4H,YAAa,SAAClE,GAAD,uBAAYA,EAAOrK,WAAnB,aAAY,EAAY5L,KAAK0I,OAE3C,CACCoH,MAAO,aACPoK,WAAY,aACZ3H,MAAO,IACP4H,YAAa,SAAClE,GAAD,uBAAYA,EAAOrK,WAAnB,aAAY,EAAY7M,OAAO2J,OAE7C,CACCoH,MAAO,SACPoK,WAAY,SACZrY,KAAM,eACN0Q,MAAO,IACPoP,a7C+CM,CACNzX,GAAc3F,GAAkB4F,KAChCD,GAAc3F,GAAkB6F,eAChCF,GAAc3F,GAAkB8F,iBAChCH,GAAc3F,GAAkBwF,UAChCG,GAAc3F,GAAkB+F,QAChCJ,GAAc3F,GAAkB0F,UAChCC,GAAc,M6CrDdiQ,YAAa,SAAClE,GAAD,aAAY/L,GAAa,UAAC+L,EAAOrK,WAAR,aAAC,EAAYrN,UAEpD,CAAEuR,MAAO,QAASoK,WAAY,aAAc3H,MAAO,KACnD,CAAEzC,MAAO,YAAaoK,WAAY,iBAAkB3H,MAAO,KAC3D,CACCzC,MAAO,UACPjO,KAAM,OACNqY,WAAY,UACZ3H,MAAO,IACP4H,YAAa,SAAClE,GAAD,OACZA,EAAO/S,MAAQ,IAAIiK,KAAK8I,EAAO/S,OAAmB,OAEpD,CACC4M,MAAO,WACPoK,WAAY,WACZrY,KAAM,OACN0Q,MAAO,IACP4H,YAAa,SAAClE,GAAD,OACZA,EAAO/S,MAAQ,IAAIiK,KAAK8I,EAAO/S,OAAmB,QA+CtCwgB,GA3CW,WAAO,IAAD,EACSpd,mBAEtC,MAH6B,mBACxBsE,EADwB,KACVC,EADU,KAa/B,OAJA9H,qBAAU,WAHTV,GAAI5E,kBAAkBmF,MAAK,SAACrC,GAAD,OAAUsK,EAAgBtK,QAKnD,IAEEqK,EAEJ,kBAAC9N,EAAD,KACC,kBAAC0L,EAAA,EAAD,CACCkP,cAAY,EACZtP,MAAO,CAAEsD,UAAW,OACpBjD,QAAQ,KACRkP,MAAM,UAJP,gBAQA,yBACCvP,MAAO,CACN2S,OAAQ,sBACRxI,MAAO,OACP7G,UAAW,SAGZ,kBAAC,KAAD,CACCwP,QAASjB,GACTwH,WAAY,CACXxa,QAASya,MAEV1O,KAAMpI,MAvBgB,wD,UCtFrBvI,GAAM,IAAI7E,EACV4X,GAAa,CAClB0B,YAAY,EACZsF,UAAU,EACV1G,aAAa,EACbiO,YAAY,EACZhN,aAAa,GAGRiN,GAAa,CAAEjP,WAAY,OAAQ3O,YAAa,QAkHvC6d,GAhHc,WAC5B,IAAMze,EAAUpB,KAD+B,EAEDsC,mBAE5C,MAJ6C,mBAExC4G,EAFwC,KAEvB4W,EAFuB,KAY/C/gB,qBAAU,WALTV,GAAIrE,8BAA8B4E,MAAK,SAACrC,GACvCujB,EAAmBvjB,QAMlB,IASH,OAAK2M,EAEJ,kBAAC2S,GAAmB5c,SAApB,CACCC,MAAO,IAAIua,GAAiB,CAAErI,iBAE9B,kBAAC0K,GAAyB7c,SAA1B,CACCC,MACC,IAAI2a,GAAwB,CAC3BlH,YAd6B,SAACwB,EAAa9Z,GAC1C6O,IACLA,EAAgBiL,GAAKlK,cAAgB5P,EACrCylB,EAAmB,aAAI5W,SAerB,kBAAC1E,EAAA,EAAD,CACCkP,cAAY,EACZtP,MAAO,CAAEsD,UAAW,OACpBjD,QAAQ,KACRkP,MAAM,UAJP,oBAQ4B,IAA3BzK,EAAgBlC,OAChB,iDACG,KACHkC,EAAgBtJ,KAAI,SAACgI,EAAKuM,GAAN,OACpB,kBAAC4L,GAAA,EAAD,CACCvY,UAAW,EACXpD,MAAO,CACNqD,QAAS,OACTjB,aAAc,OACdkB,UAAW,SAGZ,yBACCtD,MAAO,CACN4b,aAAc,oBACdC,cAAe,SAGhB,kBAAClY,GAAA,EAAD,CACClK,KAAK,OACLqB,MAAO0I,EAAIsY,SACXlY,WAAY,CAAEC,UAAU,GACxBC,MAAM,UACNzD,QAAQ,WACRL,MAAOwb,KAER,kBAAC7X,GAAA,EAAD,CACClK,KAAK,OACLqB,MAAO0I,EAAIuY,cACXjY,MAAM,eACNzD,QAAQ,WACRL,MAAOwb,KAER,kBAAChb,EAAA,EAAD,CACCH,QAAQ,YACRrB,MAAM,UACNiE,KAAK,QACLjD,MAAO,CAAElL,OAAQ,QACjBgL,UAAWC,IACXG,GAAE,UAAK1L,EAAL,YAA2BgP,EAAIgC,oBANlC,qBAWD,6BACA,yBAAKrF,IAAK4P,GACT,kBAAC,GAAD,CACCvM,IAAG,2BAAOA,GAAP,IAAY9N,GAAI8N,EAAI6M,mBACvBrT,QAAS,CACRuX,MACQ,OAAPvX,QAAO,IAAPA,OAAA,EAAAA,EAASkM,MACR,SAACzN,GAAD,OtD9FmB,IsD8FZA,EAAE/F,QACL,KACN+e,UACQ,OAAPzX,QAAO,IAAPA,OAAA,EAAAA,EAASkM,MACR,SAACzN,GAAD,OAAOA,EAAE/F,KAAO8N,EAAImB,cAChB,MAEP0P,mBAAoBrH,GACpBkE,SAAUnB,WA/EY,+C,UCrCxB8B,GAAwB,CAC7B,CAAEnK,MAAO,KAAMoK,WAAY,KAAMrY,KAAM,SAAUyf,KAAM,GAAKrR,SAAU,IACtE,CAAEH,MAAO,OAAQoK,WAAY,OAAQoH,KAAM,EAAGrR,SAAU,KACxD,CACCH,MAAO,UACPoK,WAAY,UACZoH,KAAM,EACNzf,KAAM,WACNoO,SAAU,IACVkK,YAAa,SAAClE,GAAD,OACZA,EAAO/S,MAAQ,IAAIiK,KAAK8I,EAAO/S,OAAmB,OAEpD,CACC4M,MAAO,WACPoK,WAAY,WACZoH,KAAM,EACNzf,KAAM,WACNoO,SAAU,IACVkK,YAAa,SAAClE,GAAD,OACZA,EAAO/S,MAAQ,IAAIiK,KAAK8I,EAAO/S,OAAmB,OAEpD,CACC4M,MAAO,OACPoK,WAAY,IACZoH,KAAM,GACNrR,SAAU,IACVmK,WAAY,SAACnE,GAAD,OACX,kBAACrN,EAAA,EAAD,CACCH,QAAQ,YACRrB,MAAM,UACNiE,KAAK,QACLnD,UAAWC,IACXG,GAAE,UAAK1L,EAAL,YAA2BqZ,EAAOrK,IAAI9N,KALzC,WAaGuE,GAAM,IAAI7E,EAuDD4mB,GArDM,WAAO,IAAD,EACc9d,mBAA2B,IADzC,mBACnBkP,EADmB,KACLC,EADK,KAW1B,OAJA1S,qBAAU,WAHTV,GAAIjC,kBAAkBwC,MAAK,SAACrC,GAAD,OAAUkV,EAAgBlV,QAKnD,IAEE6E,GAEJ,kBAACtI,EAAD,KACC,kBAAC0L,EAAA,EAAD,CACCkP,cAAY,EACZtP,MAAO,CAAEsD,UAAW,OACpBjD,QAAQ,KACRkP,MAAM,UAJP,UAQA,kBAAChM,GAAA,EAAD,CAAWC,KAAG,GACb,kBAAChD,EAAA,EAAD,CACCH,QAAQ,YACRrB,MAAM,YACNgB,MAAO,CAAEoZ,MAAO,SAChBnW,KAAK,QACLnD,UAAWC,IACXG,GAAE,UAAK1L,EAAL,IAA2B,IAN9B,eAWD,yBACCwL,MAAO,CACN2S,OAAQ,sBACRxI,MAAO,OACP7G,UAAW,SAGZ,kBAAC,KAAD,CACCwP,QAASjB,GACTjH,KAAMwC,EACNiM,WAAY,CACXxa,QAASya,UAlCO,MC3DT2C,GAAb,kDAIC,WAAYC,GAAkB,IAAD,8BAC5B,gBAJDxmB,QAG6B,IAF7B4K,UAE6B,EAE5B,EAAK5K,GAAKwmB,EAFkB,EAJ9B,UAAoChY,ICY9BjK,GAAM,IAAI7E,EAwGD+mB,GAtGK,WACnB,IAAM1D,EAAQC,cACRpW,EAAUC,cACV2Z,EAAkBpT,OAAO2P,EAAM5K,OAAOnY,KAAO,EAH1B,EAIawI,mBAAgC,MAJ7C,mBAIlB2G,EAJkB,KAILuX,EAJK,OAKCle,mBAAS,CAAEyK,QAAS,KALrB,mBAKlBjQ,EALkB,KAKX0P,EALW,OAMW1B,GAAW7B,GANtB,mBAMlBwD,EANkB,KAMTf,EANS,KA6CzB,OAXA3M,qBAAU,WACLuhB,EAAU,EACbjiB,GAAIhC,eAAeikB,GAAS1hB,MAAK,SAACrC,GACjCmP,EAAiBnP,GACjBikB,EAAejkB,MAGhBikB,EAAe,IAAIH,GAAeC,MAEjC,IAGF,oCACC,4BACErX,EACEA,EAAYnP,GAAZ,UACImP,EAAYvE,MACf,eACD,oBAEHuE,GACA,kBAACnQ,EAAD,KACC,kBAAC6O,GAAA,EAAD,CAAWC,KAAG,GACb,kBAACG,GAAA,EAAD,CACClK,KAAK,OACLqB,MAAK,OAAE+J,QAAF,IAAEA,OAAF,EAAEA,EAAavE,KACpBwD,MAAM,OACNzD,QAAQ,WACRuI,SAAU,SAACzJ,GAAD,OAtDCmB,EAsDcnB,EAAEC,OAAOtE,WArDvCshB,GAAe,SAACC,GAAD,OAAUA,GAAI,2BAASA,GAAT,IAAe/b,YAD7B,IAACA,KAwDZ,kBAAC2I,GAAA,EAAD,CACC5I,QAAQ,WACRyD,MAAM,SACNhJ,MAAO+J,EAAYtL,MACnBqP,SAAU,SAACzJ,GAAD,OAzDE5F,EA0DF4F,EAAEC,OAAOtE,WAzDxBshB,GAAe,SAACC,GAAD,OAAUA,GAAI,2BAASA,GAAT,IAAe9iB,aAD5B,IAACA,IA6DX8H,GAAO7F,KAAI,SAACC,GAAD,OACX,kBAACoE,EAAA,EAAD,CAAU/E,MAAOW,EAAE/F,GAAIyK,IAAK1E,EAAE/F,IAC5B+F,EAAE6E,WAKP,kBAACiD,GAAA,EAAD,CAAWC,KAAG,GACb,kBAAC,GAAD,CAAYrL,KAAM0M,KAEnB,2BAAInM,EAAMiQ,SACV,kBAACpF,GAAA,EAAD,CAAWC,KAAG,GACb,kBAAChD,EAAA,EAAD,CACCH,QAAQ,YACRrB,MAAM,UACNiE,KAAK,QACLxJ,KAAK,SACLqB,MAAM,OACNoE,QAAS,SAACC,GA1EX0F,GACH5K,GAAI/B,gBAAgB2M,GAClBrK,MAAK,SAAC8hB,GACNF,EAAeE,GACfhV,EAAiBgV,GACjBlU,EAAS,CAAEO,QAAS,KACJ,IAAZuT,GACH5Z,EAAQ2V,QAAR,UAAmBzjB,EAAnB,YAAyC8nB,EAAS5mB,QAGnD+E,OAAM,SAAC/B,GACP0P,EAAS,CACRO,QAAS,UAAYjQ,EAAMJ,SAASH,KAAKwQ,cA+DxCW,UAAWjB,GAPZ,YC/FAhL,GAAYC,YAAW,CAC5BqK,OAAQ,CACP7S,OAAQ,mBAET4S,MAAO,CACNpE,UAAW,OACX1F,YAAa,OACb6F,QAAS,SAEV8Y,OAAQ,CACPjZ,UAAW,OACXlB,aAAc,OACdY,UAAW,UAEZwZ,YAAa,CACZpa,aAAc,MACdkB,UAAW,SA0KEmZ,GAvKM,WACpB,IAAMxe,EAAUZ,KAEhB,OACC,yBAAK2C,MAAO,CAAEqD,QAAS,KACtB,kBAACjD,EAAA,EAAD,CAAY1B,UAAWT,EAAQse,OAAQlc,QAAQ,MAA/C,gBAGA,kBAACmL,GAAA,EAAD,CAAWxL,MAAO,CAAEqD,QAAS,KAC5B,kBAACqI,GAAA,EAAD,CACCC,WAAY,kBAAC,KAAD,MACZC,gBAAc,kBACdlW,GAAG,kBAEH,kBAAC0K,EAAA,EAAD,CAAYC,QAAQ,MAApB,WAED,kBAACD,EAAA,EAAD,CAAY1B,UAAWT,EAAQue,YAAanc,QAAQ,MAApD,SAGA,kBAACD,EAAA,EAAD,qHAIA,kBAACA,EAAA,EAAD,CAAY1B,UAAWT,EAAQue,YAAanc,QAAQ,MAApD,qBAGA,kBAACD,EAAA,EAAD,mJAKA,kBAACA,EAAA,EAAD,CAAY1B,UAAWT,EAAQue,YAAanc,QAAQ,MAApD,cAGA,kBAACD,EAAA,EAAD,wWAUD,kBAACoL,GAAA,EAAD,CAAWxL,MAAO,CAAEqD,QAAS,KAC5B,kBAACqI,GAAA,EAAD,CACCC,WAAY,kBAAC,KAAD,MACZC,gBAAc,kBACdlW,GAAG,kBAEH,kBAAC0K,EAAA,EAAD,CAAYC,QAAQ,MAApB,SAED,kBAACD,EAAA,EAAD,CAAY1B,UAAWT,EAAQue,YAAanc,QAAQ,MAApD,kBAGA,kBAACD,EAAA,EAAD,yRAKwC,IACvC,iDAND,4FASA,kBAACA,EAAA,EAAD,CAAY1B,UAAWT,EAAQue,YAAanc,QAAQ,MAApD,2CAGA,kBAACD,EAAA,EAAD,yeAWA,kBAACA,EAAA,EAAD,CAAY1B,UAAWT,EAAQue,YAAanc,QAAQ,MAApD,0BAGA,kBAACD,EAAA,EAAD,kLAKA,kBAACA,EAAA,EAAD,CAAY1B,UAAWT,EAAQue,YAAanc,QAAQ,MAApD,gEAGA,kBAACD,EAAA,EAAD,sOAOD,kBAACoL,GAAA,EAAD,CAAWxL,MAAO,CAAEqD,QAAS,KAC5B,kBAACqI,GAAA,EAAD,CACCC,WAAY,kBAAC,KAAD,MACZC,gBAAc,kBACdlW,GAAG,kBAEH,kBAAC0K,EAAA,EAAD,CAAYC,QAAQ,MAApB,sBAED,kBAACD,EAAA,EAAD,CAAY1B,UAAWT,EAAQue,YAAanc,QAAQ,MAApD,aAGA,kBAACD,EAAA,EAAD,KACC,4BACC,iGAIA,iIAIA,oHAIA,gEAdF,iEAmBD,kBAACoL,GAAA,EAAD,CAAWxL,MAAO,CAAEqD,QAAS,KAC5B,kBAACqI,GAAA,EAAD,CACCC,WAAY,kBAAC,KAAD,MACZC,gBAAc,kBACdlW,GAAG,kBAEH,kBAAC0K,EAAA,EAAD,CAAYC,QAAQ,MAApB,4BAID,kBAACD,EAAA,EAAD,KACC,4BACC,6KAGyC,IACxC,qDAED,4GAGC,4BACC,4BACC,kDADD,2GAMA,4BACC,6CADD,8CClJOsc,GA3BE,SAAC7nB,GAAD,OAChBA,EAAM8nB,OACL,yBACC3c,MAAO,CACN2S,OAAQ,qBACRiK,WAAY,QACZhe,SAAU,QACVie,IAAK,GACLC,MAAO,EACPC,OAAQ,IACRhoB,SAAU,OACVmd,OAAQ,oBACRyB,UAAW,oCACXqJ,UAAW,SAGZ,kBAACle,EAAA,EAAD,CACCG,aAAW,SACXD,MAAM,UACNE,QAAS,SAACC,GAAD,OAAOtK,EAAMooB,eAEtB,kBAAC,KAAD,CAAWhZ,SAAS,aAErB,kBAAC,GAAD,OAEE,MCwFUiZ,GA9FH,WAAO,IAAD,EAC2BhkB,IAAMgF,UAAkB,GADnD,mBACVif,EADU,KACMC,EADN,KAGX3c,EAAiB,WACtB2c,GAAmBD,IAGpB,OACC,kBAACzoB,EAAD,KACC,kBAAC,GAAD,CAAQ+L,eAAgBA,IACxB,kBAACoL,GAAA,EAAD,CAAMC,WAAS,EAAC9L,MAAO,CAAE0D,eAAgB,WACxC,kBAACmI,GAAA,EAAD,CACCE,MAAI,EACJ/L,MAAO,CACNsD,UAAW,GACXD,QAAS,GACTqQ,gBAAiB,QACjBvJ,MAAO,SACPpV,SAAU,SAGX,kBAAC,IAAD,KACC,kBAAC,GAAD,CACCsoB,KAAI,UAAK7oB,EAAL,QACJsL,UAAW0Y,KAEZ,kBAAC,GAAD,CACC6E,KAAM7oB,EACNsL,UAAWuC,KAEZ,kBAAC,GAAD,CACCgb,KAAM7oB,EACNsL,UAAWwb,GACX1b,SAAO,IAER,kBAAC,GAAD,CACCyd,KAAM7oB,EACNsL,UAAWyY,KAEZ,kBAAC,GAAD,CACC8E,KAAM7oB,EACNsL,UAAW2b,GACX7b,SAAO,IAER,kBAAC,GAAD,CACCyd,KAAM7oB,EACNsL,UAAWqZ,GACXvZ,SAAO,IAER,kBAAC,GAAD,CACCyd,KAAI,UAAK7oB,EAAL,QACJsL,UAAWsa,GACXxa,SAAO,IAER,kBAAC,GAAD,CACCyd,KAAI,UAAK7oB,EAAL,eACJsL,UAAW0Z,GACX5Z,SAAO,IAER,kBAAC,GAAD,CACCyd,KAAI,UAAK7oB,EAAL,cACJsL,UAAWiI,GACXnI,SAAO,IAER,kBAAC,GAAD,CACCyd,KAAM7oB,EACNsL,UAAWka,GACXpa,SAAO,IAER,kBAAC,GAAD,CACCyd,KAAI,UAAK7oB,EAAL,QACJsL,UAAWgb,GACXlb,SAAO,IAER,kBAAC,GAAD,CACCyd,KAAI,UAAK7oB,EAAL,QACJsL,UAAWqc,GACXvc,SAAO,IAER,kBAAC,GAAD,CACCyd,KAAI,UAAK7oB,GACTsL,UAAWkc,GACXpc,SAAO,IAER,kBAAC,IAAD,CAAO0d,OAAK,EAACD,KAAK,IAAIvd,UAAWqb,KACjC,kBAAC,IAAD,CAAOrb,UAAWyd,QAIrB,kBAAC,GAAD,CAAUZ,OAAQQ,EAAgBF,WAAYxc,MC1G7Bya,QACU,cAA7BsC,OAAOC,SAASC,UAEc,UAA7BF,OAAOC,SAASC,UAEhBF,OAAOC,SAASC,SAASjF,MACxB,2DCVHkF,IAASC,OACR,kBAAC,IAAMC,WAAP,KACC,kBAAC,IAAD,KACC,kBAAC,GAAD,KACC,kBAAC,GAAD,KACC,kBAAC,GAAD,KACC,kBAAC,GAAD,WAMLzmB,SAAS0mB,eAAe,SDqHpB,kBAAmBC,WACtBA,UAAUC,cAAcC,MACtBzjB,MAAK,SAAC0jB,GACNA,EAAaC,gBAEb1jB,OAAM,SAAC/B,GACPiZ,QAAQjZ,MAAMA,EAAMiQ,c","file":"static/js/main.24df8363.chunk.js","sourcesContent":["export const APPLICATION_STATUS = {\r\n\tPENDING: 'PENDING',\r\n\tDRAFT: 'DRAFT',\r\n};\r\n\r\nexport const ROLES = {\r\n\tADMIN: 'ADMIN',\r\n\tSTUDENT: 'STUDENT',\r\n};\r\n\r\nexport const ROUTES = {\r\n\tAPPLICATIONS: '/applications',\r\n\tAPPLICATIONS_ADMIN: '/applications-admin',\r\n\tAPPLICATION: '/application',\r\n\tCREATE_APPLICATION: '/create',\r\n\tAPPLICATION_ROWS: '/application-rows',\r\n\tSCHOOLS: '/schools',\r\n\tSCHOOL: '/school',\r\n\tUSERS: '/users',\r\n\tUSER: '/user',\r\n\tCOURSE: '/course',\r\n\tCOURSES: '/courses',\r\n\tLOGIN: '/login',\r\n\tMASTERTRACK: '/mastertrack',\r\n\tMASTERTRACKS: '/mastertracks',\r\n};\r\n\r\nexport const HOME_SCHOOL_ID = 1;\r\n","import styled from 'styled-components';\r\n\r\nexport const Container = styled.div<{\r\n\tmargin?: number;\r\n\tmaxWidth?: number;\r\n\tcenter?: boolean;\r\n}>`\r\n\tmargin: auto;\r\n\tmargin-top: ${(props) => (props.margin ? `${props.margin}px` : 'unset')};\r\n\tmax-width: ${(props) => (props.maxWidth ? `${props.maxWidth}px` : 'unset')};\r\n\ttext-align: ${(props) => (props.center ? 'center' : 'unset')};\r\n`;\r\n\r\nexport const Card = styled.div`\r\n\tborder-radius: 10px;\r\n\tbox-shadow: 2px 6px 5px 1px lightgrey;\r\n\tmargin: auto;\r\n\tmargin-bottom: 1rem;\r\n\tborder: 1px solid lightgrey;\r\n\tbackground-color: #f6f6f6;\r\n\tmax-width: 500px;\r\n\tcursor: pointer;\r\n\tpadding: 0.25rem 1rem;\r\n\ttransition: all 0.2s;\r\n\ttext-align: left;\r\n\t&:hover {\r\n\t\tbackground-color: #eee;\r\n\t\tbox-shadow: none;\r\n\t}\r\n`;\r\n","import React from 'react';\r\nimport { UserDTO } from '../DTO/UserDTO';\r\nimport { APIService } from '../services/apiService';\r\n\r\ntype State = {\r\n\tauthenticated?: boolean;\r\n\tuser: UserDTO | null;\r\n};\r\ntype Handlers = {\r\n\tgetSessionUser: () => void;\r\n\tlogin: () => void;\r\n\tlogout: () => void;\r\n};\r\n\r\nconst AuthContext = React.createContext(undefined);\r\nconst AuthUpdateContext = React.createContext(undefined);\r\n\r\nenum ActionType {\r\n\tACTIVE_USER,\r\n\tNO_ACTIVE_USER,\r\n\tLOGIN,\r\n\tLOGOUT,\r\n}\r\n\r\ntype Action =\r\n\t| {\r\n\t\t\ttype: ActionType.ACTIVE_USER;\r\n\t\t\tpayload: UserDTO;\r\n\t }\r\n\t| {\r\n\t\t\ttype: ActionType.NO_ACTIVE_USER;\r\n\t }\r\n\t| {\r\n\t\t\ttype: ActionType.LOGIN;\r\n\t\t\tpayload: UserDTO;\r\n\t }\r\n\t| {\r\n\t\t\ttype: ActionType.LOGOUT;\r\n\t };\r\n\r\nconst reducer = (state: State, action: Action) => {\r\n\tswitch (action.type) {\r\n\t\tcase ActionType.ACTIVE_USER:\r\n\t\t\treturn {\r\n\t\t\t\tauthenticated: !!action.payload,\r\n\t\t\t\tuser: action.payload,\r\n\t\t\t};\r\n\t\tcase ActionType.NO_ACTIVE_USER:\r\n\t\t\treturn {\r\n\t\t\t\t...state,\r\n\t\t\t\tauthenticated: false,\r\n\t\t\t};\r\n\t\tcase ActionType.LOGIN:\r\n\t\t\treturn {\r\n\t\t\t\t...state,\r\n\t\t\t\tauthenticated: true,\r\n\t\t\t};\r\n\t\tcase ActionType.LOGOUT:\r\n\t\t\treturn {\r\n\t\t\t\t...state,\r\n\t\t\t\tauthenticated: false,\r\n\t\t\t};\r\n\t\tdefault:\r\n\t\t\treturn state;\r\n\t}\r\n};\r\n\r\nconst initialState = {\r\n\tuser: null,\r\n};\r\n\r\nconst api = new APIService();\r\nexport const AuthProvider = ({ children }: { children: React.ReactNode }) => {\r\n\tconst [state, dispatch] = React.useReducer>(\r\n\t\treducer,\r\n\t\tinitialState\r\n\t);\r\n\r\n\tconst getSessionUser = React.useCallback(() => {\r\n\t\tapi.getCurrentUser()\r\n\t\t\t.then((user) => {\r\n\t\t\t\tdispatch({ type: ActionType.ACTIVE_USER, payload: user });\r\n\t\t\t})\r\n\t\t\t.catch((_err) => {\r\n\t\t\t\tdispatch({ type: ActionType.NO_ACTIVE_USER });\r\n\t\t\t});\r\n\t}, []);\r\n\r\n\tReact.useEffect(() => {\r\n\t\tgetSessionUser();\r\n\t}, [getSessionUser]);\r\n\r\n\tconst login = React.useCallback(() => {\r\n\t\tapi.login().then((user) => {\r\n\t\t\tdispatch({ type: ActionType.LOGIN, payload: user });\r\n\t\t});\r\n\t}, []);\r\n\r\n\tconst logout = React.useCallback(() => {\r\n\t\tapi.logout().then((x) => {\r\n\t\t\tdispatch({ type: ActionType.LOGOUT });\r\n\t\t});\r\n\t}, []);\r\n\r\n\treturn (\r\n\t\t\r\n\t\t\t\r\n\t\t\t\t{children}\r\n\t\t\t\r\n\t\t\r\n\t);\r\n};\r\n\r\nexport const useAuth = () => {\r\n\tconst value = React.useContext(AuthContext);\r\n\r\n\tif (!value) {\r\n\t\tthrow new Error('AuthContext must be used within an AuthProvider');\r\n\t}\r\n\r\n\treturn value;\r\n};\r\n\r\nexport const useUpdateAuth = () => {\r\n\tconst value = React.useContext(AuthUpdateContext);\r\n\r\n\tif (!value) {\r\n\t\tthrow new Error(\r\n\t\t\t'AuthUpdateContext must be used within a AuthUpdateProvider'\r\n\t\t);\r\n\t}\r\n\r\n\treturn value;\r\n};\r\n","export const isEmpty: (str: string) => boolean = (str) => str.length === 0;\r\n\r\nexport const isEmail: (email: string) => boolean = (email) =>\r\n\temail.match(\r\n\t\t//eslint-disable-next-line\r\n\t\t/^(([^<>()\\[\\]\\\\.,;:\\s@\"]+(\\.[^<>()\\[\\]\\\\.,;:\\s@\"]+)*)|(\".+\"))@((\\[[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\])|(([a-zA-Z\\-0-9]+\\.)+[a-zA-Z]{2,}))$/\r\n\t)\r\n\t\t? true\r\n\t\t: false;\r\n\r\nexport const isEnterKey: (e: React.KeyboardEvent) => boolean =\r\n\t(e) => e.keyCode === 13 || e.which === 13;\r\n\r\nexport const getApiPath = () => {\r\n\tif (!isDevEnv()) {\r\n\t\treturn '/api';\r\n\t} else {\r\n\t\treturn 'http://localhost:3001/api';\r\n\t}\r\n};\r\n\r\nexport const isDevEnv = () => process.env.REACT_APP_DEVELOPMENT === 'true';\r\n","import { HttpService } from './httpService';\r\nimport { ApplicationHeadDTO } from '../DTO/ApplicationHeadDTO';\r\nimport { SchoolDTO } from '../DTO/SchoolDTO';\r\nimport { CourseDTO } from '../DTO/CourseDTO';\r\nimport { ApplicationRowExDTO } from '../DTO/ApplicationRowExDTO';\r\nimport { DocumentDTO } from '../DTO/DocumentDTO';\r\nimport { UserDTO } from '../DTO/UserDTO';\r\nimport { VerdictDTO } from '../DTO/VerdictDTO';\r\nimport { CountryDTO } from '../DTO/CountryDTO';\r\nimport { getApiPath } from '../util';\r\nimport { ApplicationStatus } from '../util/enumerations';\r\nimport { ActionResult } from '../DTO/ActionResult';\r\nimport { MasterTrackDTO } from '../DTO/MasterTrackDTO';\r\n\r\nexport class APIService extends HttpService {\r\n\tpublic constructor() {\r\n\t\tsuper(getApiPath());\r\n\t}\r\n\r\n\t//#region Application\r\n\t//GET\r\n\tpublic getApplications = async () =>\r\n\t\tthis.instance.get(`/application/head/all`);\r\n\tpublic getApplicationById = async (id: number) =>\r\n\t\tthis.instance.get(`/application/head/byId/${id}`);\r\n\tpublic getApplicationLatest = async () =>\r\n\t\tthis.instance.get(`/application/head/latest`);\r\n\tpublic getUnhandledApplicationRows = async () =>\r\n\t\tthis.instance.get(`/application/rows/unhandled`); //requires user to be admin.\r\n\r\n\t//POST\r\n\tpublic saveApplication = async (application: ApplicationHeadDTO) =>\r\n\t\tthis.instance.post(\r\n\t\t\t`/application/head`,\r\n\t\t\tapplication\r\n\t\t);\r\n\t//if no id is set, creates a new one.\r\n\tpublic saveVerdict = async (verdict: VerdictDTO) =>\r\n\t\tthis.instance.post(`/application/verdict`, verdict);\r\n\tpublic setApplicationStatus = async (\r\n\t\tid: number,\r\n\t\tstatus: ApplicationStatus\r\n\t) =>\r\n\t\tthis.instance.post(\r\n\t\t\t`/application/head/setStatus/${id}/${status}`\r\n\t\t);\r\n\tpublic getMappingHistory = async (courseMappingHeadId: number) =>\r\n\t\tthis.instance.get(\r\n\t\t\t`/application/verdict/byCourseMappingHeadId/${courseMappingHeadId}`\r\n\t\t);\r\n\t////#endregion\r\n\r\n\t//#region School\r\n\t//GET\r\n\tpublic getSchools = async () =>\r\n\t\tthis.instance.get(`/school/all`);\r\n\tpublic getSchoolsById = async (id: number) =>\r\n\t\tthis.instance.get(`/school/byCountryId/${id}`);\r\n\tpublic getSchoolById = async (id: number) =>\r\n\t\tthis.instance.get(`/school/${id}`);\r\n\tpublic getCountries = async () =>\r\n\t\tthis.instance.get(`/school/country/all`);\r\n\r\n\t//POST\r\n\tpublic saveSchool = async (school: SchoolDTO) =>\r\n\t\tthis.instance.post(`/school`, school); //if no id is set, creates a new one.\r\n\t//#endregion\r\n\r\n\t//#region Course\r\n\t//GET\r\n\tpublic getCoursesBySchoolId = async (id: number) =>\r\n\t\tthis.instance.get(`/course/bySchool/${id}`);\r\n\tpublic getCourses = async () =>\r\n\t\tthis.instance.get(`/course/all`);\r\n\tpublic getCourseById = async (id: number) =>\r\n\t\tthis.instance.get(`/course/${id}`);\r\n\r\n\t//POST\r\n\tpublic saveCourse = async (course: CourseDTO) =>\r\n\t\tthis.instance.post(`/course`, course); //if no id is set, creates a new one.\r\n\t//#endregion\r\n\r\n\t//#region Document\r\n\tpublic downloadDocumentById = async (id: number) =>\r\n\t\tthis.instance.get(`/document/${id}`, { responseType: 'stream' });\r\n\tpublic uploadDocument = async (document: DocumentDTO) =>\r\n\t\tthis.instance.post(`/document`);\r\n\tpublic uploadDocuments = async (documents: DocumentDTO[]) =>\r\n\t\tthis.instance.post(`/document/many`);\r\n\r\n\t////#endregion\r\n\r\n\t//#region Report\r\n\tpublic downloadApplicationHeadById = (id: number | string) =>\r\n\t\t`${this.baseURL}/report/applicationhead/${id}`;\r\n\t//#endregion\r\n\r\n\t//#region User\r\n\t//GET\r\n\tpublic getUsers = async () => this.instance.get(`/user/all`);\r\n\tpublic getUserById = async (id?: number) =>\r\n\t\tthis.instance.get(`/user/${id}`);\r\n\r\n\t//POST\r\n\tpublic saveUser = async (user: UserDTO) =>\r\n\t\tthis.instance.post(`/user`, user); //if no id is set, creates a new one.\r\n\t//#endregion\r\n\r\n\t//SESSION\r\n\tpublic login = async () => this.instance.get(`session/login`);\r\n\tpublic logout = async () => this.instance.post(`session/logout`);\r\n\tpublic getCurrentUser = async () =>\r\n\t\tthis.instance.get(`session/user`);\r\n\r\n\t//#region Settings\r\n\t//GET\r\n\tpublic getMasterTracks = async () =>\r\n\t\tthis.instance.get(`/setting/mastertracks`);\r\n\tpublic getMasterTrack = async (id: number) =>\r\n\t\tthis.instance.get(`/setting/mastertrack/${id}`);\r\n\tpublic saveMasterTrack = async (data: MasterTrackDTO) =>\r\n\t\tthis.instance.post(`/setting/mastertrack`, data);\r\n\r\n\t//#endregion\r\n}\r\n","import axios, { AxiosInstance, AxiosResponse } from 'axios';\r\n\r\ndeclare module 'axios' {\r\n\t//interface AxiosResponse extends Promise {}\r\n\texport interface AxiosInstance {\r\n\t\trequest(config: AxiosRequestConfig): Promise;\r\n\t\tget(url: string, config?: AxiosRequestConfig): Promise;\r\n\t\tdelete(url: string, config?: AxiosRequestConfig): Promise;\r\n\t\thead(url: string, config?: AxiosRequestConfig): Promise;\r\n\t\tpost(\r\n\t\t\turl: string,\r\n\t\t\tdata?: any,\r\n\t\t\tconfig?: AxiosRequestConfig\r\n\t\t): Promise;\r\n\t\tput(\r\n\t\t\turl: string,\r\n\t\t\tdata?: any,\r\n\t\t\tconfig?: AxiosRequestConfig\r\n\t\t): Promise;\r\n\t\tpatch(\r\n\t\t\turl: string,\r\n\t\t\tdata?: any,\r\n\t\t\tconfig?: AxiosRequestConfig\r\n\t\t): Promise;\r\n\t}\r\n}\r\n\r\nexport abstract class HttpService {\r\n\tprotected readonly instance: AxiosInstance;\r\n\tprotected baseURL: string;\r\n\r\n\tpublic constructor(baseURL: string) {\r\n\t\tthis.baseURL = baseURL;\r\n\t\tthis.instance = axios.create({\r\n\t\t\tbaseURL,\r\n\t\t\theaders: {\r\n\t\t\t\t'Content-Type': 'application/json; charset=utf-8',\r\n\t\t\t},\r\n\t\t});\r\n\t\tthis._initializeResponseInterceptor();\r\n\t}\r\n\r\n\tprivate _initializeResponseInterceptor = () => {\r\n\t\tthis.instance.interceptors.response.use(\r\n\t\t\tthis._handleResponse,\r\n\t\t\tthis._handleError\r\n\t\t);\r\n\t};\r\n\r\n\tprivate _handleResponse = ({ data }: AxiosResponse) => data;\r\n\r\n\tprotected _handleError = (error: any) => Promise.reject(error);\r\n}\r\n","import React from 'react';\r\nimport { SchoolDTO } from '../DTO/SchoolDTO';\r\nimport { APIService } from '../services/apiService';\r\n\r\ntype State = SchoolDTO[] | null;\r\ntype Handlers = {\r\n\tsaveSchool: (newSchool: SchoolDTO) => Promise;\r\n};\r\n\r\nconst SchoolContext = React.createContext(undefined);\r\nconst SchoolUpdateContext = React.createContext(\r\n\tundefined\r\n);\r\n\r\nenum ActionType {\r\n\tSET_SCHOOLS,\r\n\tSAVE_SCHOOL,\r\n}\r\n\r\ntype Action =\r\n\t| {\r\n\t\t\ttype: ActionType.SET_SCHOOLS;\r\n\t\t\tpayload: SchoolDTO[];\r\n\t }\r\n\t| {\r\n\t\t\ttype: ActionType.SAVE_SCHOOL;\r\n\t\t\tpayload: SchoolDTO;\r\n\t };\r\n\r\nconst reducer = (state: State, action: Action) => {\r\n\tswitch (action.type) {\r\n\t\tcase ActionType.SET_SCHOOLS:\r\n\t\t\treturn action.payload;\r\n\t\tcase ActionType.SAVE_SCHOOL:\r\n\t\t\tif (state) {\r\n\t\t\t\tlet found = false;\r\n\t\t\t\tconst newSchools = state.map((s) => {\r\n\t\t\t\t\tif (s.id === action.payload.id) {\r\n\t\t\t\t\t\tfound = true;\r\n\t\t\t\t\t\treturn action.payload;\r\n\t\t\t\t\t} else return s;\r\n\t\t\t\t});\r\n\t\t\t\tif (!found) return [...state, action.payload];\r\n\t\t\t\telse return newSchools;\r\n\t\t\t}\r\n\t\tdefault:\r\n\t\t\treturn state;\r\n\t}\r\n};\r\n\r\nconst initialState = null;\r\nconst api = new APIService();\r\nexport const SchoolProvider = ({ children }: { children: React.ReactNode }) => {\r\n\tconst [state, dispatch] = React.useReducer>(\r\n\t\treducer,\r\n\t\tinitialState\r\n\t);\r\n\r\n\tReact.useEffect(() => {\r\n\t\tgetSchools();\r\n\t}, []);\r\n\r\n\tconst getSchools = React.useCallback(() => {\r\n\t\tapi.getSchools().then((data) =>\r\n\t\t\tdispatch({\r\n\t\t\t\ttype: ActionType.SET_SCHOOLS,\r\n\t\t\t\tpayload: data,\r\n\t\t\t})\r\n\t\t);\r\n\t}, []);\r\n\r\n\tconst saveSchool = React.useCallback(\r\n\t\t(newSchool: SchoolDTO) =>\r\n\t\t\tapi.saveSchool(newSchool).then((school) => {\r\n\t\t\t\tdispatch({\r\n\t\t\t\t\ttype: ActionType.SAVE_SCHOOL,\r\n\t\t\t\t\tpayload: school,\r\n\t\t\t\t});\r\n\t\t\t\treturn school;\r\n\t\t\t}),\r\n\t\t[]\r\n\t);\r\n\r\n\treturn (\r\n\t\t\r\n\t\t\t\r\n\t\t\t\t{children}\r\n\t\t\t\r\n\t\t\r\n\t);\r\n};\r\n\r\nexport const useSchools = () => {\r\n\tconst value = React.useContext(SchoolContext);\r\n\r\n\tif (value === undefined) {\r\n\t\tthrow new Error('SchoolContext must be used within a SchoolProvider');\r\n\t}\r\n\r\n\treturn value;\r\n};\r\n\r\nexport const useUpdateSchools = () => {\r\n\tconst value = React.useContext(SchoolUpdateContext);\r\n\r\n\tif (!value) {\r\n\t\tthrow new Error(\r\n\t\t\t'SchoolUpdateContext must be used within a SchoolUpdateProvider'\r\n\t\t);\r\n\t}\r\n\r\n\treturn value;\r\n};\r\n","import React from 'react';\r\nimport { CourseDTO } from '../DTO/CourseDTO';\r\nimport { APIService } from '../services/apiService';\r\n\r\ntype State = CourseDTO[];\r\ntype Handlers = {\r\n\tgetCourses: () => void;\r\n\tgetCoursesBySchoolIds: (...schoolIds: number[]) => void;\r\n\tsaveCourse: (course: CourseDTO) => Promise;\r\n};\r\n\r\nconst CourseContext = React.createContext(undefined);\r\nconst CourseUpdateContext = React.createContext(\r\n\tundefined\r\n);\r\n\r\nenum ActionType {\r\n\tSET_COURSES,\r\n\tADD_COURSES,\r\n\tSAVE_COURSE,\r\n}\r\n\r\ntype Action =\r\n\t| {\r\n\t\t\ttype: ActionType.SET_COURSES;\r\n\t\t\tpayload: CourseDTO[];\r\n\t }\r\n\t| {\r\n\t\t\ttype: ActionType.ADD_COURSES;\r\n\t\t\tpayload: CourseDTO[];\r\n\t }\r\n\t| {\r\n\t\t\ttype: ActionType.SAVE_COURSE;\r\n\t\t\tpayload: CourseDTO;\r\n\t };\r\n\r\nconst reducer = (state: State, action: Action) => {\r\n\tswitch (action.type) {\r\n\t\tcase ActionType.SET_COURSES:\r\n\t\t\treturn action.payload;\r\n\r\n\t\tcase ActionType.ADD_COURSES:\r\n\t\t\tconst includedCourses: { [key: string]: boolean } = {};\r\n\t\t\treturn state.concat(action.payload).filter((c) => {\r\n\t\t\t\tif (!includedCourses[c.id]) {\r\n\t\t\t\t\tincludedCourses[c.id] = true;\r\n\t\t\t\t\treturn true;\r\n\t\t\t\t}\r\n\t\t\t\treturn false;\r\n\t\t\t});\r\n\r\n\t\tcase ActionType.SAVE_COURSE:\r\n\t\t\tif (state) {\r\n\t\t\t\tlet found = false;\r\n\t\t\t\tconst newCourses = state.map((s) => {\r\n\t\t\t\t\tif (s.id === action.payload.id) {\r\n\t\t\t\t\t\tfound = true;\r\n\t\t\t\t\t\treturn action.payload;\r\n\t\t\t\t\t} else return s;\r\n\t\t\t\t});\r\n\t\t\t\tif (!found) return [...state, action.payload];\r\n\t\t\t\telse return newCourses;\r\n\t\t\t}\r\n\t\tdefault:\r\n\t\t\treturn state;\r\n\t}\r\n};\r\n\r\nconst initialState: CourseDTO[] = [];\r\nconst api = new APIService();\r\nexport const CourseProvider = ({ children }: { children: React.ReactNode }) => {\r\n\tconst [state, dispatch] = React.useReducer>(\r\n\t\treducer,\r\n\t\tinitialState\r\n\t);\r\n\r\n\tconst getCourses = React.useCallback(() => {\r\n\t\tapi.getCourses().then((data) => {\r\n\t\t\tdispatch({\r\n\t\t\t\ttype: ActionType.SET_COURSES,\r\n\t\t\t\tpayload: data,\r\n\t\t\t});\r\n\t\t});\r\n\t}, []);\r\n\r\n\tconst getCoursesBySchoolIds = React.useCallback((...schoolIds) => {\r\n\t\tPromise.all(schoolIds.map((id) => api.getCoursesBySchoolId(id))).then(\r\n\t\t\t(schools) => {\r\n\t\t\t\tdispatch({\r\n\t\t\t\t\ttype: ActionType.ADD_COURSES,\r\n\t\t\t\t\tpayload: schools.flat(),\r\n\t\t\t\t});\r\n\t\t\t}\r\n\t\t);\r\n\t}, []);\r\n\r\n\tconst saveCourse = React.useCallback((course: CourseDTO) => {\r\n\t\treturn api.saveCourse(course).then((savedCourse) => {\r\n\t\t\tdispatch({\r\n\t\t\t\ttype: ActionType.SAVE_COURSE,\r\n\t\t\t\tpayload: savedCourse,\r\n\t\t\t});\r\n\t\t\treturn savedCourse;\r\n\t\t});\r\n\t}, []);\r\n\r\n\treturn (\r\n\t\t\r\n\t\t\t\r\n\t\t\t\t{children}\r\n\t\t\t\r\n\t\t\r\n\t);\r\n};\r\n\r\nexport const useCourses = () => {\r\n\tconst value = React.useContext(CourseContext);\r\n\r\n\tif (!value) {\r\n\t\tthrow new Error('CourseContext must be used within a CourseProvider');\r\n\t}\r\n\r\n\treturn value;\r\n};\r\n\r\nexport const useUpdateCourses = () => {\r\n\tconst value = React.useContext(CourseUpdateContext);\r\n\r\n\tif (!value) {\r\n\t\tthrow new Error(\r\n\t\t\t'CourseUpdateContext must be used within a CourseUpdateProvider'\r\n\t\t);\r\n\t}\r\n\r\n\treturn value;\r\n};\r\n","export enum EntityState {\r\n\tActive,\r\n\tInactive,\r\n\tRemoved,\r\n}\r\n\r\nexport enum VerdictStatus {\r\n\tUnhandled,\r\n\tAccepted,\r\n\tAcceptedUnderSpecialCircumstances,\r\n\tRejected,\r\n}\r\n\r\nexport enum StudyLevel {\r\n\tUnknown,\r\n\tBachelor,\r\n\tMaster,\r\n}\r\n\r\nexport enum IsAdmin {\r\n\tFalse,\r\n\tTrue,\r\n}\r\n\r\nexport enum ApplicationStatus {\r\n\tNew,\r\n\tIsBeingEdited,\r\n\tPendingApproval,\r\n\tAccepted,\r\n\tRejected,\r\n\tClosed,\r\n}\r\n\r\nexport const AdminLevels = [\r\n\t{ id: IsAdmin.False, isAdmin: IsAdmin.False },\r\n\t{ id: IsAdmin.True, isAdmin: IsAdmin.True },\r\n];\r\n\r\nexport const StudyLevels = [\r\n\t{ id: StudyLevel.Unknown, name: 'Unknown' },\r\n\t{ id: StudyLevel.Bachelor, name: 'Bachelor' },\r\n\t{ id: StudyLevel.Master, name: 'Master' },\r\n];\r\n\r\nexport const States = [\r\n\t{ id: EntityState.Active, name: 'Active' },\r\n\t{ id: EntityState.Inactive, name: 'Inactive' },\r\n\t{ id: EntityState.Removed, name: 'Removed' },\r\n];\r\n\r\nexport function levelName(state: StudyLevel): string {\r\n\tswitch (state) {\r\n\t\tcase StudyLevel.Bachelor:\r\n\t\t\treturn 'Bachelor';\r\n\t\tcase StudyLevel.Master:\r\n\t\t\treturn 'Master';\r\n\t\tdefault:\r\n\t\t\treturn 'Unknown';\r\n\t}\r\n}\r\nexport function levelNames(): string[] {\r\n\treturn [\r\n\t\tlevelName(StudyLevel.Bachelor),\r\n\t\tlevelName(StudyLevel.Master),\r\n\t\tlevelName(999),\r\n\t];\r\n}\r\n\r\nexport function stateName(state: EntityState): string {\r\n\tswitch (state) {\r\n\t\tcase EntityState.Active:\r\n\t\t\treturn 'Active';\r\n\t\tcase EntityState.Inactive:\r\n\t\t\treturn 'Inactive';\r\n\t\tcase EntityState.Removed:\r\n\t\t\treturn 'Removed';\r\n\t\tdefault:\r\n\t\t\treturn 'Unknown';\r\n\t}\r\n}\r\n\r\nexport function appVerdictName(state: VerdictStatus): string {\r\n\tswitch (state) {\r\n\t\tcase VerdictStatus.Accepted:\r\n\t\t\treturn 'Accepted';\r\n\t\tcase VerdictStatus.AcceptedUnderSpecialCircumstances:\r\n\t\t\treturn 'Accepted under special circumstances';\r\n\t\tcase VerdictStatus.Rejected:\r\n\t\t\treturn 'Rejected';\r\n\t\tdefault:\r\n\t\t\treturn 'Unhandled';\r\n\t}\r\n}\r\n\r\nexport function appStatusName(state: ApplicationStatus): string {\r\n\tswitch (state) {\r\n\t\tcase ApplicationStatus.New:\r\n\t\t\treturn 'New';\r\n\t\tcase ApplicationStatus.IsBeingEdited:\r\n\t\t\treturn 'Not submitted';\r\n\t\tcase ApplicationStatus.PendingApproval:\r\n\t\t\treturn 'Pending approval';\r\n\t\tcase ApplicationStatus.Accepted:\r\n\t\t\treturn 'Accepted';\r\n\t\tcase ApplicationStatus.Closed:\r\n\t\t\treturn 'Closed';\r\n\t\tcase ApplicationStatus.Rejected:\r\n\t\t\treturn 'Rejected';\r\n\t\tdefault:\r\n\t\t\treturn 'Unknown status';\r\n\t}\r\n}\r\nexport function getAppStatusNames(): string[] {\r\n\treturn [\r\n\t\tappStatusName(ApplicationStatus.New),\r\n\t\tappStatusName(ApplicationStatus.IsBeingEdited),\r\n\t\tappStatusName(ApplicationStatus.PendingApproval),\r\n\t\tappStatusName(ApplicationStatus.Accepted),\r\n\t\tappStatusName(ApplicationStatus.Closed),\r\n\t\tappStatusName(ApplicationStatus.Rejected),\r\n\t\tappStatusName(999),\r\n\t];\r\n}\r\nexport function appStatusDescription(state: ApplicationStatus): string {\r\n\tswitch (state) {\r\n\t\tcase ApplicationStatus.New:\r\n\t\t\treturn 'The application is yet to be created';\r\n\t\tcase ApplicationStatus.IsBeingEdited:\r\n\t\t\treturn 'The application is being prepared by the student, or has been reviewed and subsequently been sent back to the student for further handling';\r\n\t\tcase ApplicationStatus.PendingApproval:\r\n\t\t\treturn 'The application is awaiting reviewal';\r\n\t\tcase ApplicationStatus.Accepted:\r\n\t\t\treturn 'The application has been accepted';\r\n\t\tcase ApplicationStatus.Closed:\r\n\t\t\treturn 'The application has been closed, with no action';\r\n\t\tcase ApplicationStatus.Rejected:\r\n\t\t\treturn 'The application has been rejected';\r\n\t\tdefault:\r\n\t\t\treturn 'Unknown status';\r\n\t}\r\n}\r\n","import React from 'react';\r\nimport { Link, useHistory } from 'react-router-dom';\r\n\r\nimport { createStyles, makeStyles, Theme } from '@material-ui/core/styles';\r\nimport AppBar from '@material-ui/core/AppBar';\r\nimport Toolbar from '@material-ui/core/Toolbar';\r\nimport Typography from '@material-ui/core/Typography';\r\nimport Button from '@material-ui/core/Button';\r\nimport IconButton from '@material-ui/core/IconButton';\r\nimport MenuIcon from '@material-ui/icons/Menu';\r\nimport MenuItem from '@material-ui/core/MenuItem';\r\nimport Menu from '@material-ui/core/Menu';\r\nimport { ROUTES } from '../constants';\r\nimport { getApiPath } from '../util';\r\nimport { useAuth, useUpdateAuth } from '../contexts';\r\nimport { UserDTO } from '../DTO/UserDTO';\r\n\r\ntype navbarProps = {\r\n\ttoggleSideMenu: () => void;\r\n};\r\n\r\nconst useStyles = makeStyles((theme: Theme) =>\r\n\tcreateStyles({\r\n\t\troot: {\r\n\t\t\tflexGrow: 1,\r\n\t\t},\r\n\t\tmenuButton: {\r\n\t\t\tmarginRight: theme.spacing(2),\r\n\t\t},\r\n\t\ttitle: {\r\n\t\t\tflexGrow: 1,\r\n\t\t},\r\n\t})\r\n);\r\n\r\nconst userString = (user: UserDTO | null) => user?.name || null;\r\n\r\nconst NavBar = (props: navbarProps) => {\r\n\tconst { user, authenticated } = useAuth();\r\n\tconst { login, logout } = useUpdateAuth();\r\n\tconst classes = useStyles();\r\n\tconst [anchorEl, setAnchorEl] = React.useState(null);\r\n\r\n\tconst handleMenu: React.MouseEventHandler = (e) => {\r\n\t\tsetAnchorEl(e.target as Element);\r\n\t};\r\n\r\n\tconst handleMenuClick = (_e: React.MouseEvent) => {\r\n\t\tsetAnchorEl(null);\r\n\t};\r\n\r\n\tconst handleLogin = () => {\r\n\t\tlogin();\r\n\t\t//history.push(ROUTES.LOGIN);\r\n\t};\r\n\r\n\tconst handleLogout = () => {\r\n\t\tlogout();\r\n\t\t//history.push(ROUTES.LOGIN);\r\n\t};\r\n\r\n\t//useEffect(() => login(), [])\r\n\r\n\tconst menuItems = [\r\n\t\t{\r\n\t\t\ttitle: 'Home',\r\n\t\t\tpageURL: '/',\r\n\t\t\trequiresAdmin: false,\r\n\t\t},\r\n\t\t{\r\n\t\t\ttitle: 'Application history',\r\n\t\t\tpageURL: ROUTES.APPLICATIONS,\r\n\t\t\trequiresAdmin: false,\r\n\t\t},\r\n\t\t// {\r\n\t\t// title: \"Applications\",\r\n\t\t// pageURL: ROUTES.APPLICATIONS,\r\n\t\t// requiresAdmin: false,\r\n\t\t// },\r\n\t\t{\r\n\t\t\ttitle: 'Applications',\r\n\t\t\tpageURL: ROUTES.APPLICATIONS_ADMIN,\r\n\t\t\trequiresAdmin: true,\r\n\t\t},\r\n\t\t{\r\n\t\t\ttitle: 'Application rows',\r\n\t\t\tpageURL: ROUTES.APPLICATION_ROWS,\r\n\t\t\trequiresAdmin: true,\r\n\t\t},\r\n\t\t{\r\n\t\t\ttitle: 'Users',\r\n\t\t\tpageURL: ROUTES.USERS,\r\n\t\t\trequiresAdmin: true,\r\n\t\t},\r\n\t\t{\r\n\t\t\ttitle: 'Courses',\r\n\t\t\tpageURL: ROUTES.COURSES,\r\n\t\t\trequiresAdmin: true,\r\n\t\t},\r\n\t\t{\r\n\t\t\ttitle: 'Universities',\r\n\t\t\tpageURL: ROUTES.SCHOOLS,\r\n\t\t\trequiresAdmin: true,\r\n\t\t},\r\n\t\t{\r\n\t\t\ttitle: 'Tracks',\r\n\t\t\tpageURL: ROUTES.MASTERTRACKS,\r\n\t\t\trequiresAdmin: true,\r\n\t\t},\r\n\t];\r\n\r\n\treturn (\r\n\t\t
\r\n\t\t\t\r\n\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t\t{user ? (\r\n\t\t\t\t\t\t setAnchorEl(null)}\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t{menuItems\r\n\t\t\t\t\t\t\t\t.filter(\r\n\t\t\t\t\t\t\t\t\t({ requiresAdmin }) =>\r\n\t\t\t\t\t\t\t\t\t\t(user &&\r\n\t\t\t\t\t\t\t\t\t\t\trequiresAdmin &&\r\n\t\t\t\t\t\t\t\t\t\t\tuser?.isAdmin) ||\r\n\t\t\t\t\t\t\t\t\t\t!requiresAdmin\r\n\t\t\t\t\t\t\t\t)\r\n\t\t\t\t\t\t\t\t.map(({ title, pageURL }) => (\r\n\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t\t{title}\r\n\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t))}\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t) : null}\r\n\t\t\t\t\t\r\n\t\t\t\t\t\tExchange portal\r\n\t\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t\t\t{userString(user)}\r\n\t\t\t\t\t\r\n\t\t\t\t\t{authenticated ? (\r\n\t\t\t\t\t\t props.toggleSideMenu()}\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\tInstructions\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t) : null}\r\n\t\t\t\t\t{authenticated ? (\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\tLogout\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t) : (\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\tLogin\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t)}\r\n\t\t\t\t\r\n\t\t\t\r\n\t\t
\r\n\t);\r\n};\r\n\r\nexport default NavBar;\r\n","import React from 'react';\r\nimport { Redirect, Route, RouteProps } from 'react-router';\r\nimport { useAuth } from '../contexts';\r\n\r\nconst ProtectedRoute = (props: RouteProps & { isAdmin?: boolean }) => {\r\n\tconst { authenticated, user } = useAuth();\r\n\tif (authenticated === undefined) return

Loading...

;\r\n\tif (!authenticated || (props.isAdmin && !user?.isAdmin)) {\r\n\t\tconst renderComponent = () => ;\r\n\t\treturn ;\r\n\t} else {\r\n\t\treturn ;\r\n\t}\r\n};\r\n\r\nexport default ProtectedRoute;\r\n","import React, { useEffect, useState } from 'react';\r\nimport { Link, useHistory } from 'react-router-dom';\r\nimport { APIService } from '../services/apiService';\r\nimport { ROUTES } from '../constants';\r\nimport { ApplicationHeadDTO } from '../DTO/ApplicationHeadDTO';\r\nimport {\r\n\tButton,\r\n\tCard,\r\n\tContainer,\r\n\tFormGroup,\r\n\tIconButton,\r\n\tTextField,\r\n\tTypography,\r\n} from '@material-ui/core';\r\nimport AddCircleOutlineIcon from '@material-ui/icons/AddCircleOutline';\r\nimport EditIcon from '@material-ui/icons/Edit';\r\nimport { appStatusName } from '../util/enumerations';\r\nimport { Alert, AlertTitle } from '@material-ui/lab';\r\n\r\nconst margin = {\r\n\tmarginBottom: '12px',\r\n\tmarginRight: '12px',\r\n};\r\nconst api = new APIService();\r\n\r\nconst Applications = () => {\r\n\tconst history = useHistory();\r\n\t// TODO: Remove this\r\n\tconst [applications, setApplications] = useState<\r\n\t\tApplicationHeadDTO[] | null\r\n\t>(null);\r\n\tconst [newClicked, setNewClicked] = useState(false);\r\n\r\n\tconst getApplications = () => {\r\n\t\tapi.getApplications().then((data) => setApplications(data));\r\n\t};\r\n\r\n\tconst createApplication = () => {\r\n\t\tif (newClicked == false && (applications || []).length > 0) {\r\n\t\t\tsetNewClicked(true);\r\n\t\t} else {\r\n\t\t\thistory.push(ROUTES.CREATE_APPLICATION);\r\n\t\t}\r\n\t};\r\n\tuseEffect(() => {\r\n\t\tgetApplications();\r\n\t}, []);\r\n\r\n\tif (!applications) return

Hämtar ansökningar...

;\r\n\r\n\treturn (\r\n\t\t<>\r\n\t\t\t{(newClicked === true && applications?.length) || 0 > 0 ? (\r\n\t\t\t\t\r\n\t\t\t\t\tWarning\r\n\t\t\t\t\tYou already have an active application —{' '}\r\n\t\t\t\t\t are you sure you want to continue?\r\n\t\t\t\t\r\n\t\t\t) : null}\r\n\t\t\t\r\n\t\t\t\t createApplication()}\r\n\t\t\t\t\tstartIcon={}\r\n\t\t\t\t>\r\n\t\t\t\t\tNew application\r\n\t\t\t\t\r\n\t\t\t\t{applications.length > 0 &&\r\n\t\t\t\t\tapplications.map((a) => (\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t{`Application ${a.id}`}\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t))}\r\n\t\t\t\r\n\t\t\r\n\t);\r\n};\r\n\r\nexport default Applications;\r\n","import { EntityState } from '../util/enumerations';\r\n\r\nexport interface IBaseDTO {\r\n\tcreated: Date;\r\n\tcreatedBy: string;\r\n\tmodified: Date;\r\n\tmodifiedBy: string;\r\n\tstate: EntityState;\r\n\tisModified: boolean | undefined;\r\n}\r\n\r\nexport class BaseDTO implements IBaseDTO {\r\n\tcreated: Date;\r\n\tcreatedBy: string;\r\n\tmodified: Date;\r\n\tmodifiedBy: string;\r\n\tstate: EntityState;\r\n\tisModified: boolean | undefined;\r\n\r\n\tconstructor(useModifiedFlag = false) {\r\n\t\tthis.state = EntityState.Active;\r\n\t\tthis.createdBy = '';\r\n\t\tthis.modifiedBy = '';\r\n\t\tthis.isModified = useModifiedFlag ? true : undefined;\r\n\t}\r\n}\r\n","import { ApplicationStatus } from '../util/enumerations';\r\nimport { IBaseDTO, BaseDTO } from './BaseDTO';\r\nimport { ApplicationRowDTO } from './ApplicationRowDTO';\r\nimport { DocumentDTO } from './DocumentDTO';\r\nimport { SchoolDTO } from './SchoolDTO';\r\nimport { UserDTO } from './UserDTO';\r\nimport { MasterTrackDTO } from './MasterTrackDTO';\r\nimport { InformationRowDTO } from './InformationRowDTO';\r\n\r\nexport interface IApplicationHeadDTO extends IBaseDTO {\r\n\tid: number;\r\n\tuserId: number;\r\n\tschoolId?: number;\r\n\tyear?: number;\r\n\tstatus: ApplicationStatus;\r\n\tschool?: SchoolDTO;\r\n\tmasterTrackId?: number;\r\n\tmasterTrack?: MasterTrackDTO;\r\n\tapplicationRows: ApplicationRowDTO[];\r\n\tdocuments?: DocumentDTO[];\r\n}\r\n\r\nexport class ApplicationHeadDTO extends BaseDTO implements IApplicationHeadDTO {\r\n\tid: number;\r\n\tuserId: number;\r\n\tschoolId?: number;\r\n\tyear?: number;\r\n\tstatus: ApplicationStatus;\r\n\tschool?: SchoolDTO;\r\n\tmasterTrackId?: number;\r\n\tmasterTrack?: MasterTrackDTO;\r\n\tapplicationRows: ApplicationRowDTO[];\r\n\tdocuments?: DocumentDTO[];\r\n\tuser?: UserDTO;\r\n\r\n\tconstructor(user?: UserDTO) {\r\n\t\tsuper();\r\n\t\tthis.id = 0;\r\n\t\tthis.userId = user?.id || 0;\r\n\t\tthis.schoolId = 0;\r\n\t\tthis.masterTrackId = 0;\r\n\t\tthis.year = new Date().getFullYear();\r\n\t\tthis.status = 0;\r\n\t\tthis.applicationRows = [];\r\n\t\tthis.user = user || undefined;\r\n\t}\r\n}\r\n","import { StudyLevel } from '../util/enumerations';\r\nimport { IBaseDTO, BaseDTO } from './BaseDTO';\r\nimport { DocumentDTO } from './DocumentDTO';\r\nimport { InformationRowDTO } from './InformationRowDTO';\r\nimport { SchoolDTO } from './SchoolDTO';\r\n\r\nexport interface ICourseDTO extends IBaseDTO {\r\n\tid: number;\r\n\tschoolId: number;\r\n\tcourseMappingHeadId?: number;\r\n\tcode: string;\r\n\ttitle: string;\r\n\tlocalCredits: number;\r\n\tectsCredits?: number;\r\n\tlevel: StudyLevel;\r\n\tdocuments?: DocumentDTO[];\r\n\tdisplay?: boolean;\r\n\tschool: SchoolDTO;\r\n\tinformationRow?: InformationRowDTO;\r\n}\r\n\r\nexport class CourseDTO extends BaseDTO implements ICourseDTO {\r\n\tid: number;\r\n\tschoolId: number;\r\n\tcourseMappingHeadId?: number;\r\n\tcode: string;\r\n\ttitle: string;\r\n\tlocalCredits: number;\r\n\tectsCredits: number;\r\n\tlevel: StudyLevel;\r\n\tdocuments?: DocumentDTO[];\r\n\tdisplay?: boolean;\r\n\tschool: SchoolDTO;\r\n\tinformationRow?: InformationRowDTO;\r\n\r\n\tconstructor(schoolId?: number) {\r\n\t\tsuper();\r\n\t\tthis.id = 0;\r\n\t\tthis.schoolId = schoolId || 0;\r\n\t\tthis.code = '';\r\n\t\tthis.title = '';\r\n\t\tthis.localCredits = 0;\r\n\t\tthis.ectsCredits = 0;\r\n\t\tthis.level = StudyLevel.Unknown;\r\n\t\tthis.display = false;\r\n\t}\r\n}\r\n","import { VerdictStatus } from '../util/enumerations';\r\nimport { IBaseDTO, BaseDTO } from './BaseDTO';\r\nimport { CourseDTO } from './CourseDTO';\r\nimport { VerdictDTO } from './VerdictDTO';\r\n\r\nexport interface IApplicationRowDTO extends IBaseDTO {\r\n\tid: number;\r\n\tapplicationHeadId: number;\r\n\tcourseMappingHeadId?: number;\r\n\tcomment: string;\r\n\texternalUrl: string;\r\n\tstatus: VerdictStatus;\r\n\tcoursesExchange: CourseDTO[];\r\n\tcoursesHome: CourseDTO[];\r\n\tactiveVerdict: VerdictDTO; //current verdict\r\n\tverdicts: VerdictDTO[]; //verdicts of the application\r\n\tmappingHistory: VerdictDTO[]; //verdicts that are linked to other applicationrows\r\n}\r\n\r\nexport class ApplicationRowDTO extends BaseDTO implements IApplicationRowDTO {\r\n\tid: number;\r\n\tapplicationHeadId: number;\r\n\tcourseMappingHeadId?: number;\r\n\tcomment: string;\r\n\texternalUrl: string;\r\n\tstatus: VerdictStatus;\r\n\tcoursesExchange: CourseDTO[];\r\n\tcoursesHome: CourseDTO[];\r\n\tactiveVerdict: VerdictDTO;\r\n\tverdicts: VerdictDTO[];\r\n\tmappingHistory: VerdictDTO[];\r\n\r\n\tconstructor(id?: number) {\r\n\t\tsuper();\r\n\t\tif (id) this.id = id;\r\n\t\tthis.applicationHeadId = 0;\r\n\t\tthis.courseMappingHeadId = 0;\r\n\t\tthis.comment = '';\r\n\t\tthis.externalUrl = '';\r\n\t\tthis.status = 0;\r\n\t\tthis.coursesExchange = [new CourseDTO()];\r\n\t\tthis.coursesHome = [new CourseDTO()];\r\n\t}\r\n}\r\n","import React from 'react';\r\nimport { Container } from './_atoms';\r\n\r\ninterface ILastEditedProps {\r\n\tdata: {\r\n\t\t[key: string]: any;\r\n\t\tcreated: Date;\r\n\t\tcreatedBy: string;\r\n\t\tmodified: Date;\r\n\t\tmodifiedBy: string;\r\n\t};\r\n}\r\n\r\nconst pad = (s: number | string) => `0${s}`.slice(-2);\r\nconst formatDate = (d: Date) =>\r\n\t`${d.getFullYear()}-${pad(d.getMonth() + 1)}-${pad(d.getDate())} ${pad(\r\n\t\td.getHours()\r\n\t)}:${pad(d.getMinutes())}`;\r\n\r\nconst LastEdited = (props: ILastEditedProps) => {\r\n\tconst { created, createdBy, modified, modifiedBy } = props.data;\r\n\r\n\treturn (\r\n\t\t\r\n\t\t\t{created && createdBy && (\r\n\t\t\t\t

\r\n\t\t\t\t\t{'Created by '} {createdBy} {' at '}\r\n\t\t\t\t\t{formatDate(new Date(created))}\r\n\t\t\t\t

\r\n\t\t\t)}\r\n\t\t\t{modified && modifiedBy && (\r\n\t\t\t\t

\r\n\t\t\t\t\t{'Last modified by '} {modifiedBy} {' at '}\r\n\t\t\t\t\t{formatDate(new Date(modified))}\r\n\t\t\t\t

\r\n\t\t\t)}\r\n\t\t
\r\n\t);\r\n};\r\n\r\nexport default LastEdited;\r\n","import React from 'react';\r\n\r\nconst isObject = (a: any): a is Object => typeof a == 'object' && a != null;\r\n\r\n/**\r\n * Indicates whether the current version of a value is different from the last saved value\r\n * @param {Any}\t \t initialValue\t\t \t\t\tThe current value\r\n * @param {Object} \t options\r\n * @param {Any} \t options.initialComparisonValue value that will be used as inital value to compare against. Default is the same value as is passed in as current.\r\n * @param {Function} options.comparisonFunction \tfunction that can be used to override the default comparison function. Returns true if values are to be considered equal\r\n */\r\nexport const useIsDirty = (\r\n\tinitialValue: T,\r\n\toptions?: {\r\n\t\tinitialComparisonValue: T;\r\n\t\tcomparisonFunction?: (a: T, b: T) => boolean;\r\n\t}\r\n): [boolean, (newValue: T) => void] => {\r\n\tconst originalRef = React.useRef(\r\n\t\toptions?.initialComparisonValue || initialValue\r\n\t);\r\n\r\n\tconst areDeeplyEqual = React.useCallback((a: any, b: any): boolean => {\r\n\t\tif (a === b) {\r\n\t\t\treturn true;\r\n\t\t}\r\n\t\tif (isObject(a) && isObject(b)) {\r\n\t\t\treturn (\r\n\t\t\t\tObject.keys(a).length === Object.keys(b).length &&\r\n\t\t\t\tObject.keys(a)\r\n\t\t\t\t\t.filter((key) => key !== 'isModified')\r\n\t\t\t\t\t.every(\r\n\t\t\t\t\t\t(key) =>\r\n\t\t\t\t\t\t\tb.hasOwnProperty(key) &&\r\n\t\t\t\t\t\t\tareDeeplyEqual(a[key], b[key])\r\n\t\t\t\t\t)\r\n\t\t\t);\r\n\t\t}\r\n\t\treturn false;\r\n\t}, []);\r\n\r\n\tconst updateCleanValue = React.useCallback(\r\n\t\t(newValue: T) => {\r\n\t\t\toriginalRef.current = newValue;\r\n\t\t},\r\n\t\t[originalRef]\r\n\t);\r\n\r\n\treturn [\r\n\t\toptions?.comparisonFunction\r\n\t\t\t? !options.comparisonFunction(initialValue, originalRef.current)\r\n\t\t\t: !areDeeplyEqual(initialValue, originalRef.current),\r\n\t\tupdateCleanValue,\r\n\t];\r\n};\r\n","import React, { useState } from 'react';\r\nimport {\r\n\tButton,\r\n\tFormControl,\r\n\tFormGroup,\r\n\tInputLabel,\r\n\tmakeStyles,\r\n\tMenuItem,\r\n\tTextField,\r\n} from '@material-ui/core';\r\n\r\nimport { Container } from '../_atoms';\r\nimport { HOME_SCHOOL_ID } from '../../constants';\r\nimport { CourseDTO } from '../../DTO/CourseDTO';\r\nimport { States, StudyLevels } from '../../util/enumerations';\r\nimport LastEdited from '../lastEdited';\r\nimport Select from '@material-ui/core/Select';\r\nimport { useAuth, useSchools, useUpdateCourses } from '../../contexts';\r\nimport { useIsDirty } from '../../hooks/isDirty';\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n\tfield: {\r\n\t\tmarginBottom: '12px',\r\n\t\tmarginRight: '12px',\r\n\t},\r\n\tbutton: {\r\n\t\tmargin: '12px 6px 18px 0',\r\n\t},\r\n\tformControl: {\r\n\t\tmargin: theme.spacing(1),\r\n\t\tminWidth: 120,\r\n\t},\r\n\tselectEmpty: {\r\n\t\tmarginTop: theme.spacing(2),\r\n\t},\r\n}));\r\n\r\ntype CourseProps = {\r\n\tschoolId?: number;\r\n\tinitialCourse?: CourseDTO;\r\n\tonCreateCourse?: (newCourse: CourseDTO) => void;\r\n};\r\n\r\nconst Course = ({ schoolId, initialCourse, onCreateCourse }: CourseProps) => {\r\n\tconst [course, setCourse] = useState(\r\n\t\tinitialCourse || (schoolId ? new CourseDTO(schoolId) : new CourseDTO())\r\n\t);\r\n\tconst { saveCourse } = useUpdateCourses();\r\n\tconst { user } = useAuth();\r\n\tconst isAdmin = user?.isAdmin;\r\n\tconst schools = useSchools();\r\n\tconst isHome = course?.schoolId == HOME_SCHOOL_ID;\r\n\tconst classes = useStyles();\r\n\tconst [error, setError] = useState('');\r\n\tconst [isDirty, updateCleanValue] = useIsDirty(course);\r\n\r\n\tconst updateField = (field: keyof CourseDTO, value: any) => {\r\n\t\tsetCourse((prevCourse) => ({ ...prevCourse, [field]: value }));\r\n\t};\r\n\r\n\tconst setECTSCredits = (val: number) => {\r\n\t\tsetCourse(\r\n\t\t\t(prevCourse) =>\r\n\t\t\t\t({\r\n\t\t\t\t\t...prevCourse,\r\n\t\t\t\t\tectsCredits: val,\r\n\t\t\t\t\t...(isHome && { localCredits: val }),\r\n\t\t\t\t} as CourseDTO)\r\n\t\t);\r\n\t};\r\n\tconst setSchool = (schoolId: number) => {\r\n\t\tlet school = schools?.find((s) => s.id === schoolId);\r\n\t\tsetCourse(\r\n\t\t\t(prevCourse) => ({ ...prevCourse, school, schoolId } as CourseDTO)\r\n\t\t);\r\n\t};\r\n\r\n\tconst handleSubmit = (e: React.FormEvent) => {\r\n\t\te.preventDefault();\r\n\t\tif (!course) return;\r\n\t\tsaveCourse(course)\r\n\t\t\t.then((newCourse) => {\r\n\t\t\t\tsetCourse(newCourse);\r\n\t\t\t\tupdateCleanValue(newCourse);\r\n\t\t\t\tsetError('');\r\n\t\t\t\tonCreateCourse?.(newCourse);\r\n\t\t\t})\r\n\t\t\t.catch((error) => {\r\n\t\t\t\tsetError('Error: ' + error?.response?.data?.message);\r\n\t\t\t});\r\n\t};\r\n\r\n\tif (!schools) return

Loading schools...

;\r\n\treturn !course ? (\r\n\t\t

Could not find course

\r\n\t) : (\r\n\t\t\r\n\t\t\t
\r\n\t\t\t\t\r\n\t\t\t\t\t updateField('code', e.target.value)}\r\n\t\t\t\t\t/>\r\n\t\t\t\t\t updateField('title', e.target.value)}\r\n\t\t\t\t\t/>\r\n\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\t\t setECTSCredits(Number(e.target.value))}\r\n\t\t\t\t\t/>\r\n\t\t\t\t\t{!isHome ? (\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\tupdateField(\r\n\t\t\t\t\t\t\t\t\t'localCredits',\r\n\t\t\t\t\t\t\t\t\tNumber(e.target.value)\r\n\t\t\t\t\t\t\t\t)\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t) : null}\r\n\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\t\t{!schools || !isAdmin ? null : (\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\tUniversity\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\tsetSchool(e.target.value as number)\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\tdisplayEmpty\r\n\t\t\t\t\t\t\t\tlabelId=\"university-select-label\"\r\n\t\t\t\t\t\t\t\tlabel=\"University\"\r\n\t\t\t\t\t\t\t\tclassName={classes.field}\r\n\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\tNone\r\n\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t{schools.map((s) => (\r\n\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t\t{s.name}\r\n\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t))}\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t)}\r\n\t\t\t\t\t\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\tStudy level\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\tsetCourse?.(\r\n\t\t\t\t\t\t\t\t\t(prevCourse) =>\r\n\t\t\t\t\t\t\t\t\t\t({\r\n\t\t\t\t\t\t\t\t\t\t\t...prevCourse,\r\n\t\t\t\t\t\t\t\t\t\t\tlevel: Number(e.target.value),\r\n\t\t\t\t\t\t\t\t\t\t} as CourseDTO)\r\n\t\t\t\t\t\t\t\t)\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\tdisplayEmpty\r\n\t\t\t\t\t\t\tclassName={classes.field}\r\n\t\t\t\t\t\t\tlabel=\"Study level\"\r\n\t\t\t\t\t\t\tlabelId=\"level-select-label\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t{StudyLevels.map((s) => {\r\n\t\t\t\t\t\t\t\treturn (\r\n\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t\t{s.name}\r\n\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t);\r\n\t\t\t\t\t\t\t})}\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\r\n\r\n\t\t\t\t\t{isAdmin ? (\r\n\t\t\t\t\t\t<>\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\tStatus\r\n\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t\tsetCourse?.(\r\n\t\t\t\t\t\t\t\t\t\t\t(prevCourse) =>\r\n\t\t\t\t\t\t\t\t\t\t\t\t({\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t...prevCourse,\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tstate: Number(\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\te.target.value\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t),\r\n\t\t\t\t\t\t\t\t\t\t\t\t} as CourseDTO)\r\n\t\t\t\t\t\t\t\t\t\t)\r\n\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\tdisplayEmpty\r\n\t\t\t\t\t\t\t\t\tclassName={classes.field}\r\n\t\t\t\t\t\t\t\t\tlabel=\"Status\"\r\n\t\t\t\t\t\t\t\t\tlabelId=\"status-select-label\"\r\n\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t{States.map((s) => (\r\n\t\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t\t\t{s.name}\r\n\t\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t))}\r\n\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t) : null}\r\n\t\t\t\t\r\n\t\t\t\t{user?.isAdmin && }\r\n\t\t\t\t\r\n\t\t\t\t\tSave\r\n\t\t\t\t\r\n\t\t\t\t

{error}

\r\n\t\t\t\r\n\t\t
\r\n\t);\r\n};\r\n\r\nexport default Course;\r\n","import React from 'react';\r\n\r\nimport { Box, Button, DialogTitle, IconButton } from '@material-ui/core';\r\nimport Dialog from '@material-ui/core/Dialog';\r\nimport CloseIcon from '@material-ui/icons/Close';\r\nimport Course from '.';\r\n\r\nimport { CourseDTO } from '../../DTO/CourseDTO';\r\nimport { HOME_SCHOOL_ID } from '../../constants';\r\n\r\ntype ModalProps = {\r\n\tschoolId: number;\r\n\topen: boolean;\r\n\tonClose: () => void;\r\n\tinitialCourse?: CourseDTO;\r\n};\r\n\r\nconst CourseModal = ({\r\n\tschoolId,\r\n\topen,\r\n\tonClose,\r\n\tinitialCourse,\r\n}: ModalProps) => {\r\n\treturn (\r\n\t\t\r\n\t\t\t
\r\n\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\tCreate new{' '}\r\n\t\t\t\t\t\t\t{schoolId == HOME_SCHOOL_ID ? 'home' : 'exchange'}{' '}\r\n\t\t\t\t\t\t\tcourse\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t
\r\n\t\t
\r\n\t);\r\n};\r\n\r\nexport default CourseModal;\r\n","import React, { useState } from 'react';\r\n\r\nimport CourseModal from '../course/courseModal';\r\nimport Button from '@material-ui/core/Button';\r\nimport { HOME_SCHOOL_ID } from '../../constants';\r\nimport { FormGroup } from '@material-ui/core';\r\n\r\ntype CreateCoursesProps = {\r\n\tschoolId: number;\r\n\tschoolName: string;\r\n};\r\nconst CreateCourses = ({ schoolId, schoolName }: CreateCoursesProps) => {\r\n\tconst [modal, setModal] = useState<{ schoolId?: number; open: boolean }>({\r\n\t\topen: false,\r\n\t});\r\n\r\n\tconst handleClickOpenCourseModal = React.useCallback((schoolId: number) => {\r\n\t\tsetModal({ schoolId, open: true });\r\n\t}, []);\r\n\r\n\tconst onCourseModalClose = React.useCallback(() => {\r\n\t\tsetModal({ open: false });\r\n\t}, []);\r\n\r\n\treturn React.useMemo(\r\n\t\t() => (\r\n\t\t\t<>\r\n\t\t\t\t\r\n\t\t\t\t\t
\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\thandleClickOpenCourseModal(HOME_SCHOOL_ID)\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t>{`Create KTH course`}\r\n\t\t\t\t\t
\r\n\t\t\t\t\t
\r\n\t\t\t\t\t\t{schoolId ? (\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\thandleClickOpenCourseModal(schoolId)\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t>{`Create ${schoolName} course`}\r\n\t\t\t\t\t\t) : null}\r\n\t\t\t\t\t
\r\n\t\t\t\t
\r\n\t\t\t\t\r\n\t\t\t\t
\r\n\t\t\t\r\n\t\t),\r\n\t\t[\r\n\t\t\tschoolName,\r\n\t\t\tschoolId,\r\n\t\t\tmodal,\r\n\t\t\thandleClickOpenCourseModal,\r\n\t\t\tonCourseModalClose,\r\n\t\t]\r\n\t);\r\n};\r\n\r\nexport default CreateCourses;\r\n","import { ApplicationHeadDTO } from '../../DTO/ApplicationHeadDTO';\r\nimport { InformationRowDTO } from '../../DTO/InformationRowDTO';\r\nimport {\r\n\tApplicationStatus,\r\n\tEntityState,\r\n\tVerdictStatus,\r\n} from '../../util/enumerations';\r\n\r\nexport const validate = (application: ApplicationHeadDTO): string => {\r\n\tlet message = '';\r\n\tif (!application.schoolId || application.schoolId <= 1) {\r\n\t\tmessage += 'No university is set';\r\n\t}\r\n\tif (!application.year || application.year == 0) {\r\n\t\tmessage += 'No year of departure is set';\r\n\t}\r\n\tapplication.applicationRows.forEach((r, rIdx) => {\r\n\t\tif (!r.coursesHome || r.coursesHome.length == 0) {\r\n\t\t\tmessage += `Row #${rIdx + 1} is missing home university courses \\n`;\r\n\t\t}\r\n\t\tif (!r.coursesExchange || r.coursesExchange.length == 0) {\r\n\t\t\tmessage += `Row #${\r\n\t\t\t\trIdx + 1\r\n\t\t\t} is missing exchange university courses \\n`;\r\n\t\t}\r\n\t\tr.coursesExchange.forEach((c) => {\r\n\t\t\tif (!c.informationRow?.note && c.state === EntityState.Active) {\r\n\t\t\t\tmessage += `Row #${\r\n\t\t\t\t\trIdx + 1\r\n\t\t\t\t} have information rows missing description \\n`;\r\n\t\t\t}\r\n\t\t});\r\n\t});\r\n\treturn message;\r\n};\r\n\r\nexport const stepStatus = (status: ApplicationStatus, step: number) => {\r\n\tif (step === 1) {\r\n\t\tif (\r\n\t\t\tstatus === ApplicationStatus.New ||\r\n\t\t\tstatus === ApplicationStatus.IsBeingEdited\r\n\t\t)\r\n\t\t\treturn { active: true, completed: false, disabled: true };\r\n\t\telse return { active: false, completed: true };\r\n\t} else if (step === 2) {\r\n\t\tif (status === ApplicationStatus.PendingApproval)\r\n\t\t\treturn { active: true, completed: false };\r\n\t\telse if (status > ApplicationStatus.PendingApproval)\r\n\t\t\treturn { active: false, completed: true };\r\n\t\telse return { active: false, completed: false };\r\n\t} else if (step === 3) {\r\n\t\tif (status === ApplicationStatus.Accepted)\r\n\t\t\treturn { active: false, completed: true };\r\n\t\telse if (status === ApplicationStatus.Closed)\r\n\t\t\treturn { active: false, completed: true };\r\n\t\telse if (status === ApplicationStatus.Rejected)\r\n\t\t\treturn { active: false, completed: true };\r\n\t\telse return { active: false, completed: false };\r\n\t}\r\n};\r\n\r\nexport const applicationSums = (application: ApplicationHeadDTO) => {\r\n\tlet sums = {\r\n\t\trows: 0,\r\n\t\trowsUnhandled: 0,\r\n\t\trowsAccepted: 0,\r\n\t\trowsRejected: 0,\r\n\t\trowsCondAccepted: 0,\r\n\t\ttotalECTSHome: 0,\r\n\t\ttotalLocalHome: 0,\r\n\t\ttotalECTSExchange: 0,\r\n\t\ttotalLocalExchange: 0,\r\n\t};\r\n\tapplication.applicationRows.forEach((r) => {\r\n\t\tsums.rows++;\r\n\t\tif (r.activeVerdict) {\r\n\t\t\tswitch (r.activeVerdict.status) {\r\n\t\t\t\tcase VerdictStatus.Accepted:\r\n\t\t\t\t\tsums.rowsAccepted++;\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase VerdictStatus.AcceptedUnderSpecialCircumstances:\r\n\t\t\t\t\tsums.rowsCondAccepted++;\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase VerdictStatus.Rejected:\r\n\t\t\t\t\tsums.rowsRejected++;\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tdefault:\r\n\t\t\t\t\tsums.rowsUnhandled++;\r\n\t\t\t}\r\n\t\t} else sums.rowsUnhandled++;\r\n\r\n\t\tr.coursesExchange.forEach((c) => {\r\n\t\t\tsums.totalLocalExchange += c.localCredits || 0;\r\n\t\t\tsums.totalECTSExchange += c.ectsCredits || 0;\r\n\t\t});\r\n\r\n\t\tr.coursesHome.forEach((c) => {\r\n\t\t\tsums.totalLocalHome += c.localCredits || 0;\r\n\t\t\tsums.totalECTSHome += c.ectsCredits || 0;\r\n\t\t});\r\n\t});\r\n\r\n\treturn sums;\r\n};\r\n\r\nexport const setVerdictBorderStyle = (status: VerdictStatus) => {\r\n\tswitch (status) {\r\n\t\tcase VerdictStatus.Accepted:\r\n\t\t\treturn '2px solid green';\r\n\t\tcase VerdictStatus.AcceptedUnderSpecialCircumstances:\r\n\t\t\treturn '2px solid orange';\r\n\t\tcase VerdictStatus.Rejected:\r\n\t\t\treturn '2px solid red';\r\n\t\tdefault:\r\n\t\t\treturn '2px solid #cccccc';\r\n\t}\r\n};\r\n","import React from 'react';\r\n\r\nimport ExpandMoreIcon from '@material-ui/icons/ExpandMore';\r\nimport FormGroup from '@material-ui/core/FormGroup';\r\nimport Accordion from '@material-ui/core/Accordion';\r\nimport AccordionSummary from '@material-ui/core/AccordionSummary';\r\nimport Grid from '@material-ui/core/Grid';\r\nimport Tooltip from '@material-ui/core/Tooltip';\r\nimport Typography from '@material-ui/core/Typography';\r\n\r\nimport { useApplication } from '../';\r\nimport { applicationSums } from '../util';\r\n\r\nexport const ApplicationSummary = () => {\r\n\tconst { application } = useApplication();\r\n\tconst sums = applicationSums(application);\r\n\r\n\treturn React.useMemo(\r\n\t\t() => (\r\n\t\t\t 1}\r\n\t\t\t>\r\n\t\t\t\t}\r\n\t\t\t\t\taria-controls=\"panel1a-content\"\r\n\t\t\t\t\tid=\"panel1a-header\"\r\n\t\t\t\t>\r\n\t\t\t\t\tApplication summary\r\n\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\tKTH\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\tECTS credits:{' '}\r\n\t\t\t\t\t\t\t{sums.totalECTSHome || sums.totalLocalHome}\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t{application.school?.name || ''}\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\tLocal credits: {sums.totalLocalExchange}\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\tECTS credits: {sums.totalECTSExchange}\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\tRows\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\tTotal: {sums.rows}\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\tStatus: \r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t{sums.rowsUnhandled || 0}\r\n\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t / \r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t{sums.rowsAccepted || 0}\r\n\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t / \r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t{sums.rowsCondAccepted || 0}\r\n\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t / \r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t{sums.rowsRejected || 0}\r\n\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\r\n\t\t),\r\n\t\t[sums, application.status]\r\n\t);\r\n};\r\n","import React from 'react';\r\n\r\nimport PopupState, { bindMenu, bindTrigger } from 'material-ui-popup-state';\r\nimport Menu from '@material-ui/core/Menu';\r\nimport Button from '@material-ui/core/Button';\r\nimport MenuItem from '@material-ui/core/MenuItem';\r\n\r\nimport { ApplicationStatus } from '../../../util/enumerations';\r\nimport { useUpdateApplication } from '..';\r\n\r\nexport const SetStatus = () => {\r\n\tconst { setApplicationStatus } = useUpdateApplication();\r\n\r\n\treturn React.useMemo(\r\n\t\t() => (\r\n\t\t\t\r\n\t\t\t\t{(popupState) => (\r\n\t\t\t\t\t\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\tAdmin: Set status\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t {\r\n\t\t\t\t\t\t\t\t\tsetApplicationStatus(ApplicationStatus.New);\r\n\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\tNew\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t {\r\n\t\t\t\t\t\t\t\t\tsetApplicationStatus(\r\n\t\t\t\t\t\t\t\t\t\tApplicationStatus.IsBeingEdited\r\n\t\t\t\t\t\t\t\t\t);\r\n\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\tUnder preparation\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t {\r\n\t\t\t\t\t\t\t\t\tsetApplicationStatus(\r\n\t\t\t\t\t\t\t\t\t\tApplicationStatus.PendingApproval\r\n\t\t\t\t\t\t\t\t\t);\r\n\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\tPending approval\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t {\r\n\t\t\t\t\t\t\t\t\tsetApplicationStatus(\r\n\t\t\t\t\t\t\t\t\t\tApplicationStatus.Accepted\r\n\t\t\t\t\t\t\t\t\t);\r\n\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\tAccepted\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t {\r\n\t\t\t\t\t\t\t\t\tsetApplicationStatus(\r\n\t\t\t\t\t\t\t\t\t\tApplicationStatus.Rejected\r\n\t\t\t\t\t\t\t\t\t);\r\n\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\tRejected\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t {\r\n\t\t\t\t\t\t\t\t\tsetApplicationStatus(\r\n\t\t\t\t\t\t\t\t\t\tApplicationStatus.Closed\r\n\t\t\t\t\t\t\t\t\t);\r\n\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\tClosed\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t)}\r\n\t\t\t\r\n\t\t),\r\n\t\t[setApplicationStatus]\r\n\t);\r\n};\r\n","import React from 'react';\r\n\r\nimport Step from '@material-ui/core/Step';\r\nimport StepLabel from '@material-ui/core/StepLabel';\r\nimport Stepper from '@material-ui/core/Stepper';\r\nimport { stepStatus } from '../util';\r\nimport { useApplication } from '..';\r\n\r\nexport const ApplicationStepper = () => {\r\n\tconst { application } = useApplication();\r\n\treturn React.useMemo(\r\n\t\t() => (\r\n\t\t\t\r\n\t\t\t\t\r\n\t\t\t\t\tPreparation\r\n\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\t\tPending approval\r\n\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\t\tApplication closed\r\n\t\t\t\t\r\n\t\t\t\r\n\t\t),\r\n\t\t[application.status]\r\n\t);\r\n};\r\n","import React, { useEffect, useState } from 'react';\r\n\r\nimport { APIService } from '../../../services/apiService';\r\n\r\nimport { makeStyles } from '@material-ui/core/styles';\r\nimport FormGroup from '@material-ui/core/FormGroup';\r\nimport TextField from '@material-ui/core/TextField';\r\nimport MenuItem from '@material-ui/core/MenuItem';\r\nimport FormControl from '@material-ui/core/FormControl';\r\nimport InputLabel from '@material-ui/core/InputLabel';\r\nimport Select from '@material-ui/core/Select';\r\nimport Autocomplete from '@material-ui/lab/Autocomplete';\r\n\r\nimport { useAuth, useSchools } from '../../../contexts';\r\nimport { MasterTrackDTO } from '../../../DTO/MasterTrackDTO';\r\nimport { useApplication, useUpdateApplication } from '..';\r\nimport { ApplicationStatus } from '../../../util/enumerations';\r\nimport { HOME_SCHOOL_ID } from '../../../constants';\r\n\r\nconst useStyles = makeStyles({\r\n\tbutton: {\r\n\t\tmargin: '12px 6px 18px 0',\r\n\t},\r\n\tfield: {\r\n\t\tmarginTop: '16px',\r\n\t\tmarginRight: '12px',\r\n\t\tdisplay: 'block',\r\n\t},\r\n});\r\n\r\nconst api = new APIService();\r\n\r\nexport const ApplicationHeadFields = () => {\r\n\tconst classes = useStyles();\r\n\tconst schools = useSchools();\r\n\tconst { user } = useAuth();\r\n\tconst { application, privileges } = useApplication();\r\n\tconst { setMasterProgram, setYear, handleSelectSchool } =\r\n\t\tuseUpdateApplication();\r\n\r\n\tconst [masterTracks, setMasterTracks] = useState([]);\r\n\r\n\tconst getMasterTracks = () => {\r\n\t\tif (masterTracks.length == 0)\r\n\t\t\tapi.getMasterTracks().then((data) => setMasterTracks(data));\r\n\t};\r\n\r\n\tuseEffect(() => {\r\n\t\tgetMasterTracks();\r\n\t}, [privileges.editCourses]);\r\n\r\n\treturn React.useMemo(\r\n\t\t() => (\r\n\t\t\t
\r\n\t\t\t\t\r\n\t\t\t\t\t{user?.isAdmin ? (\r\n\t\t\t\t\t\t<>\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t) : null}\r\n\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\tTrack\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\tsetMasterProgram(e.target.value as number)\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\tinputProps={{\r\n\t\t\t\t\t\t\t\treadOnly: !privileges.editCourses,\r\n\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\tdisplayEmpty\r\n\t\t\t\t\t\t\tstyle={{ minWidth: '200px' }}\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t{masterTracks.map((s) => {\r\n\t\t\t\t\t\t\t\treturn (\r\n\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t\t{s.name}\r\n\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t);\r\n\t\t\t\t\t\t\t})}\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t\t setYear(Number(e.target.value))}\r\n\t\t\t\t\t/>\r\n\t\t\t\t\t\r\n\t\t\t\t\t\t\ts.id\r\n\t\t\t\t\t\t\t\t? `${\r\n\t\t\t\t\t\t\t\t\t\ts.country?.name\r\n\t\t\t\t\t\t\t\t\t\t\t? s.country.name + ' -'\r\n\t\t\t\t\t\t\t\t\t\t\t: ''\r\n\t\t\t\t\t\t\t\t } ${s.name}`\r\n\t\t\t\t\t\t\t\t: ''\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tvalue={application.school}\r\n\t\t\t\t\t\tstyle={{ minWidth: '210px' }}\r\n\t\t\t\t\t\tonChange={(e, school) =>\r\n\t\t\t\t\t\t\tschool && handleSelectSchool(school)\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tgetOptionSelected={(option, value) =>\r\n\t\t\t\t\t\t\toption.id === value.id\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tdisabled={application.status !== ApplicationStatus.New}\r\n\t\t\t\t\t\toptions={\r\n\t\t\t\t\t\t\tschools?.filter((s) => s.id != HOME_SCHOOL_ID) || []\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\trenderInput={(params) => (\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t)}\r\n\t\t\t\t\t/>\r\n\t\t\t\t\r\n\t\t\t
\r\n\t\t),\r\n\t\t[\r\n\t\t\tuser?.isAdmin,\r\n\t\t\tapplication.user,\r\n\t\t\tapplication.masterTrackId,\r\n\t\t\tsetMasterProgram,\r\n\t\t\tprivileges.editCourses,\r\n\t\t\tmasterTracks,\r\n\t\t\tapplication.year,\r\n\t\t\tsetYear,\r\n\t\t\tapplication.school,\r\n\t\t\thandleSelectSchool,\r\n\t\t\tapplication.status,\r\n\t\t\tschools,\r\n\t\t]\r\n\t);\r\n};\r\n","import React from 'react';\r\n\r\nimport FormGroup from '@material-ui/core/FormGroup';\r\nimport Button from '@material-ui/core/Button';\r\n\r\nimport Typography from '@material-ui/core/Typography';\r\nimport { Alert, AlertTitle } from '@material-ui/lab';\r\n\r\nimport {\r\n\tApplicationStatus,\r\n\tappStatusDescription,\r\n\tappStatusName,\r\n} from '../../../util/enumerations';\r\nimport CreateCourses from '../createCourses';\r\nimport { APIService } from '../../../services/apiService';\r\nimport { useApplication, useUpdateApplication } from '..';\r\nimport { ApplicationSummary } from './applicationSummary';\r\nimport { SetStatus } from './setStatus';\r\nimport { ApplicationStepper } from './applicationStepper';\r\nimport { ApplicationHeadFields } from './applicationHeadFields';\r\nimport { makeStyles } from '@material-ui/styles';\r\nimport { useAuth } from '../../../contexts';\r\n\r\nconst api = new APIService();\r\n\r\nconst ApplicationStatusDescription = () => {\r\n\tconst { application } = useApplication();\r\n\treturn React.useMemo(\r\n\t\t() =>\r\n\t\t\tapplication.status !== ApplicationStatus.New ? (\r\n\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t{appStatusName(application.status)}\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t{appStatusDescription(application.status)}\r\n\t\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t) : null,\r\n\t\t[application.status]\r\n\t);\r\n};\r\n\r\nconst ApplicationValidation = () => {\r\n\tconst { validationMessage } = useApplication();\r\n\r\n\tconst content = React.useMemo(\r\n\t\t() => (\r\n\t\t\t\r\n\t\t\t\tPlease review before submitting\r\n\t\t\t\t{`${validationMessage}`}\r\n\t\t\t\r\n\t\t),\r\n\t\t[validationMessage]\r\n\t);\r\n\r\n\treturn validationMessage ? content : null;\r\n};\r\n\r\nconst ApplicationIsDirtyIndicator = () => {\r\n\tconst { isDirty } = useApplication();\r\n\tconst content = React.useMemo(\r\n\t\t() => (\r\n\t\t\t\r\n\t\t\t\tInfo\r\n\t\t\t\tThere are unsaved changes\r\n\t\t\t\r\n\t\t),\r\n\t\t[]\r\n\t);\r\n\treturn isDirty ? content : null;\r\n};\r\n\r\nconst SaveApplication = () => {\r\n\tconst { privileges, application, isDirty } = useApplication();\r\n\tconst { saveApplication } = useUpdateApplication();\r\n\r\n\treturn privileges.editCourses && application.schoolId !== undefined ? (\r\n\t\t saveApplication()}\r\n\t\t\tvariant=\"contained\"\r\n\t\t\tcolor=\"primary\"\r\n\t\t\tstyle={{ marginRight: '10px' }}\r\n\t\t\tdisabled={application.schoolId < 1 || !isDirty}\r\n\t\t>\r\n\t\t\tSave\r\n\t\t\r\n\t) : null;\r\n};\r\n\r\nconst ApplicationHeadControls = () => {\r\n\tconst { user } = useAuth();\r\n\tconst { application, isDirty, privileges } = useApplication();\r\n\tconst { setApplicationStatus } = useUpdateApplication();\r\n\r\n\treturn React.useMemo(\r\n\t\t() => (\r\n\t\t\t<>\r\n\t\t\t\t\r\n\t\t\t\t{application.status < 2 ? (\r\n\t\t\t\t\t\r\n\t\t\t\t\t\t\tsetApplicationStatus(\r\n\t\t\t\t\t\t\t\tApplicationStatus.PendingApproval\r\n\t\t\t\t\t\t\t)\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tvariant=\"contained\"\r\n\t\t\t\t\t\tcolor=\"primary\"\r\n\t\t\t\t\t\tdisabled={!application.id || isDirty}\r\n\t\t\t\t\t>\r\n\t\t\t\t\t\tSubmit\r\n\t\t\t\t\t\r\n\t\t\t\t) : null}\r\n\t\t\t\t{application.status === ApplicationStatus.PendingApproval ? (\r\n\t\t\t\t\t\r\n\t\t\t\t\t\t\tsetApplicationStatus(\r\n\t\t\t\t\t\t\t\tApplicationStatus.IsBeingEdited\r\n\t\t\t\t\t\t\t)\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tvariant=\"contained\"\r\n\t\t\t\t\t\tcolor=\"primary\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t\tUnsubmit\r\n\t\t\t\t\t\r\n\t\t\t\t) : null}\r\n\t\t\t\t\r\n\t\t\t\t\tPrint\r\n\t\t\t\t\r\n\t\t\t\t{user?.isAdmin && }\r\n\t\t\t\r\n\t\t),\r\n\t\t[\r\n\t\t\tapplication.status,\r\n\t\t\tsetApplicationStatus,\r\n\t\t\tisDirty,\r\n\t\t\tprivileges.giveVerdict,\r\n\t\t]\r\n\t);\r\n};\r\n\r\nconst useStyles = makeStyles({\r\n\tcontrolsFormGroup: {\r\n\t\tmarginTop: '20px',\r\n\t\tmarginBottom: '20px',\r\n\t\tmarginRight: '20px',\r\n\t},\r\n});\r\n\r\nconst ApplicationHead = () => {\r\n\tconst classes = useStyles();\r\n\tconst { application, privileges } = useApplication();\r\n\r\n\tconst content = React.useMemo(\r\n\t\t() => (\r\n\t\t\t
\r\n\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\t{application.id > 0 ? : null}\r\n\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\t{privileges.addCourses &&\r\n\t\t\t\tapplication.applicationRows.length > 0 &&\r\n\t\t\t\tapplication.school &&\r\n\t\t\t\tapplication.schoolId !== undefined ? (\r\n\t\t\t\t\t\r\n\t\t\t\t) : null}\r\n\t\t\t
\r\n\t\t),\r\n\t\t[\r\n\t\t\tapplication.id,\r\n\t\t\tapplication.school?.name,\r\n\t\t\tapplication.user?.name,\r\n\t\t\tapplication.school,\r\n\t\t\tprivileges.addCourses,\r\n\t\t\tapplication.applicationRows.length,\r\n\t\t\tapplication.schoolId,\r\n\t\t]\r\n\t);\r\n\r\n\tif (!application.user) return

No user

;\r\n\treturn content;\r\n};\r\n\r\nexport default ApplicationHead;\r\n","import React, { useState } from 'react';\r\nimport {\r\n\tButton,\r\n\tCard,\r\n\tGrid,\r\n\tIconButton,\r\n\tTextField,\r\n\tTypography,\r\n} from '@material-ui/core';\r\nimport { makeStyles } from '@material-ui/core/styles';\r\nimport ClearIcon from '@material-ui/icons/Clear';\r\nimport InfoIcon from '@material-ui/icons/Info';\r\n\r\nimport { CourseDTO } from '../../DTO/CourseDTO';\r\nimport { levelName } from '../../util/enumerations';\r\nimport { Alert, AlertTitle, Autocomplete } from '@material-ui/lab';\r\nimport { useApplication } from '.';\r\n\r\nconst useStyles = makeStyles({\r\n\taddButton: {\r\n\t\tmarginTop: '12px',\r\n\t},\r\n});\r\n\r\ntype ApplicationColumnProps = {\r\n\tcourses: CourseDTO[];\r\n\tallCourses: CourseDTO[] | undefined;\r\n\tisHome: boolean;\r\n\thandlers: {\r\n\t\taddCourse: Function;\r\n\t\tremoveCourse: Function;\r\n\t\tupdateCourse: Function;\r\n\t};\r\n};\r\n\r\nconst iconStyles = {\r\n\tmarginTop: '20px',\r\n};\r\n\r\nconst ApplicationColumn = React.memo((props: ApplicationColumnProps) => {\r\n\tconst classes = useStyles();\r\n\tconst { privileges } = useApplication();\r\n\tconst [displayCourseInfo, setDisplayCourseInfo] = useState([]);\r\n\r\n\tconst toggleShowCourseInfo = React.useCallback((courseId: number) => {\r\n\t\tsetDisplayCourseInfo((prevDisplayCourseInfo) => {\r\n\t\t\tconst newCourseInfo = prevDisplayCourseInfo.filter(\r\n\t\t\t\t(c) => c !== courseId\r\n\t\t\t);\r\n\t\t\tif (newCourseInfo.length < prevDisplayCourseInfo.length)\r\n\t\t\t\treturn newCourseInfo;\r\n\t\t\telse return [...newCourseInfo, courseId];\r\n\t\t});\r\n\t}, []);\r\n\r\n\tconst renderCourseInfo = React.useCallback(\r\n\t\t(course: CourseDTO) => (\r\n\t\t\t<>\r\n\t\t\t\t
\r\n\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t\t\t{course.code}\r\n\t\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\r\n\t\t),\r\n\t\t[]\r\n\t);\r\n\r\n\tconst {\r\n\t\tcourses,\r\n\t\tallCourses,\r\n\t\thandlers: { addCourse, removeCourse, updateCourse },\r\n\t} = props;\r\n\r\n\treturn React.useMemo(\r\n\t\t() => (\r\n\t\t\t
\r\n\t\t\t\t{courses.map((c, idx) => (\r\n\t\t\t\t\t\r\n\t\t\t\t\t\t{privileges.editCourses ? (\r\n\t\t\t\t\t\t\t<>\r\n\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t\t\tc.id ? `${c.code} - ${c.title}` : ''\r\n\t\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\t\tdisableClearable={true}\r\n\t\t\t\t\t\t\t\t\t\t{...(c.id > 0 && { value: c })}\r\n\t\t\t\t\t\t\t\t\t\tonChange={(_, course) => {\r\n\t\t\t\t\t\t\t\t\t\t\tupdateCourse(idx, course.id, c.id);\r\n\t\t\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t\t\t\tnoOptionsText={\r\n\t\t\t\t\t\t\t\t\t\t\t'If you cannot find your course, feel free to create a new one using the button above!'\r\n\t\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\t\tgetOptionSelected={(option, value) =>\r\n\t\t\t\t\t\t\t\t\t\t\toption.id === value.id\r\n\t\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\t\trenderInput={(params) => (\r\n\t\t\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t\t)}\r\n\t\t\t\t\t\t\t\t\t/>\r\n\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t) : (\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t)}\r\n\t\t\t\t\t\t{c.id ? (\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t toggleShowCourseInfo(c.id)}\r\n\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t) : null}\r\n\t\t\t\t\t\t{privileges.editCourses ? (\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t removeCourse(idx, c.id)}\r\n\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t) : null}\r\n\t\t\t\t\t\t{displayCourseInfo.includes(c.id) &&\r\n\t\t\t\t\t\t\trenderCourseInfo(c)}\r\n\t\t\t\t\t\r\n\t\t\t\t))}\r\n\t\t\t\t{courses.length > 1 &&\r\n\t\t\t\tprivileges.editCourses &&\r\n\t\t\t\tprops.isHome ? (\r\n\t\t\t\t\t\r\n\t\t\t\t\t\tInfo\r\n\t\t\t\t\t\tThere is typically one course on the\r\n\t\t\t\t\t\thome university\r\n\t\t\t\t\t\r\n\t\t\t\t) : null}\r\n\t\t\t\t{privileges.editCourses && (\r\n\t\t\t\t\t addCourse()}\r\n\t\t\t\t\t\tclassName={classes.addButton}\r\n\t\t\t\t\t>\r\n\t\t\t\t\t\tAdd course\r\n\t\t\t\t\t\r\n\t\t\t\t)}\r\n\t\t\t
\r\n\t\t),\r\n\t\t[\r\n\t\t\tcourses,\r\n\t\t\tprivileges.editCourses,\r\n\t\t\tallCourses,\r\n\t\t\tupdateCourse,\r\n\t\t\ttoggleShowCourseInfo,\r\n\t\t\tremoveCourse,\r\n\t\t\tdisplayCourseInfo,\r\n\t\t\trenderCourseInfo,\r\n\t\t\tprops.isHome,\r\n\t\t\taddCourse,\r\n\t\t]\r\n\t);\r\n});\r\n\r\nexport default ApplicationColumn;\r\n","import { VerdictStatus } from '../util/enumerations';\r\nimport { BaseDTO, IBaseDTO } from './BaseDTO';\r\n\r\nexport interface IVerdictDTO extends IBaseDTO {\r\n\tid: number;\r\n\tdate?: Date;\r\n\tapplicationRowId: number;\r\n\tcourseMappingHeadId: number;\r\n\tnote?: string;\r\n\tstatus: VerdictStatus;\r\n\tapplicationHeadId?: number;\r\n}\r\n\r\nexport class VerdictDTO extends BaseDTO implements IVerdictDTO {\r\n\tid: number;\r\n\tapplicationRowId: number;\r\n\tcourseMappingHeadId: number;\r\n\tnote?: string;\r\n\tstatus: VerdictStatus;\r\n\tapplicationHeadId?: number;\r\n\r\n\tconstructor(applicationRowId: number, courseMappingHeadId: number) {\r\n\t\tsuper();\r\n\t\tthis.id = 0;\r\n\t\tthis.note = '';\r\n\t\tthis.applicationRowId = applicationRowId;\r\n\t\tthis.courseMappingHeadId = courseMappingHeadId;\r\n\t\tthis.status = VerdictStatus.Unhandled;\r\n\t}\r\n}\r\n","export function getDate(date: Date): string {\r\n\tif (!date) return '';\r\n\treturn date.toDateString();\r\n}\r\n\r\nexport function getTime(date: Date): string {\r\n\tif (!date) return '';\r\n\treturn date.toTimeString();\r\n}\r\n\r\nexport const getDateAndTime = (date: Date) => {\r\n\tif (!date) return '';\r\n\tlet currentDatetime = new Date(date);\r\n\tlet formattedDate =\r\n\t\tcurrentDatetime.getFullYear() +\r\n\t\t'-' +\r\n\t\tappendLeadingZeroes(currentDatetime.getMonth() + 1) +\r\n\t\t'-' +\r\n\t\tappendLeadingZeroes(currentDatetime.getDate()) +\r\n\t\t' ' +\r\n\t\tappendLeadingZeroes(currentDatetime.getHours()) +\r\n\t\t':' +\r\n\t\tappendLeadingZeroes(currentDatetime.getMinutes()) +\r\n\t\t':' +\r\n\t\tappendLeadingZeroes(currentDatetime.getSeconds());\r\n\treturn formattedDate;\r\n};\r\n\r\nfunction appendLeadingZeroes(n: number) {\r\n\tif (n <= 9) {\r\n\t\treturn '0' + n.toString();\r\n\t}\r\n\treturn n.toString();\r\n}\r\n","import React, { useEffect, useState } from 'react';\r\nimport { useHistory } from 'react-router';\r\n\r\nimport { ApplicationHeadDTO } from '../../DTO/ApplicationHeadDTO';\r\nimport { ApplicationRowDTO } from '../../DTO/ApplicationRowDTO';\r\nimport { CourseDTO } from '../../DTO/CourseDTO';\r\nimport { ApplicationStatus, EntityState } from '../../util/enumerations';\r\nimport { APIService } from '../../services/apiService';\r\nimport { HOME_SCHOOL_ID, ROUTES } from '../../constants';\r\n\r\nimport ApplicationHead from './head/applicationHead';\r\nimport ApplicationRows from './row/applicationRows';\r\nimport ApplicationControls from './applicationControls';\r\nimport { InformationRowDTO } from '../../DTO/InformationRowDTO';\r\nimport { useCourses, useSchools, useUpdateCourses } from '../../contexts';\r\nimport { VerdictDTO } from '../../DTO/VerdictDTO';\r\nimport { SchoolDTO } from '../../DTO/SchoolDTO';\r\nimport { validate } from './util';\r\nimport { ApplicationState, IApplicationState } from './ApplicationState';\r\nimport {\r\n\tApplicationHandlers,\r\n\tIApplicationHandlers,\r\n} from './ApplicationHandlers';\r\nimport { useIsDirty } from '../../hooks/isDirty';\r\n\r\nexport enum CourseOrigin {\r\n\tHOME = 'coursesHome',\r\n\tEXCHANGE = 'coursesExchange',\r\n}\r\n\r\nenum ActionType {\r\n\tSET_APPLICATION,\r\n\tSET_SCHOOL,\r\n\tREMOVE_ROW,\r\n\tADD_ROW,\r\n\tSET_STATUS,\r\n\tSET_ACTIVE_VERDICT,\r\n\tSAVE_COMMENT,\r\n\tSAVE_LINK,\r\n\tADD_COURSE,\r\n\tREMOVE_COURSE,\r\n\tUPDATE_COURSE,\r\n\tUPDATE_INFORMATION_ROW,\r\n\tUPDATE_INFORMATION_ROW_URL,\r\n\tSET_YEAR,\r\n\tSET_MASTER_TRACK_ID,\r\n}\r\n\r\n// prettier-ignore\r\ntype Action = \r\n\t| { type: ActionType.SET_APPLICATION; payload: ApplicationHeadDTO; }\r\n\t| { type: ActionType.SET_SCHOOL; payload: SchoolDTO; }\r\n\t| { type: ActionType.REMOVE_ROW; payload: { idx: number; toState: EntityState }; }\r\n\t| { type: ActionType.ADD_ROW; }\r\n\t| { type: ActionType.SET_STATUS; payload: ApplicationStatus; }\r\n\t| { type: ActionType.SET_ACTIVE_VERDICT; payload: { idx: number; verdict: VerdictDTO }; }\r\n\t| { type: ActionType.SAVE_COMMENT; payload: { idx: number; comment: string }; }\r\n\t| { type: ActionType.SAVE_LINK; payload: { idx: number; externalUrl: string }; }\r\n\t| { type: ActionType.ADD_COURSE; payload: { idx: number; key: CourseOrigin }; }\r\n\t| { type: ActionType.REMOVE_COURSE; payload: { rowIdx: number; key: CourseOrigin; courseIdx: number; courseId: number; }; }\r\n\t| { type: ActionType.UPDATE_COURSE; payload: { rowIdx: number; key: CourseOrigin; courseIdx: number; id: number; oldId: number; newCourse?: CourseDTO; }; }\r\n\t| { type: ActionType.UPDATE_INFORMATION_ROW; payload: { rowIdx: number; text: string; idx: number }; }\r\n\t| { type: ActionType.UPDATE_INFORMATION_ROW_URL; payload: { rowIdx: number; url: string; idx: number }; }\r\n\t| { type: ActionType.SET_YEAR; payload: number; }\r\n\t| { type: ActionType.SET_MASTER_TRACK_ID; payload: number; };\r\n\r\nconst reducer = (state: ApplicationHeadDTO, action: Action) => {\r\n\tswitch (action.type) {\r\n\t\tcase ActionType.SET_APPLICATION:\r\n\t\t\treturn action.payload;\r\n\t\tcase ActionType.SET_SCHOOL:\r\n\t\t\treturn {\r\n\t\t\t\t...state,\r\n\t\t\t\tapplicationRows:\r\n\t\t\t\t\tstate.applicationRows.length === 0\r\n\t\t\t\t\t\t? [new ApplicationRowDTO()]\r\n\t\t\t\t\t\t: state.applicationRows, // TODO: Is this ok? Courses may become invalid due to new school\r\n\t\t\t\tschool: action.payload,\r\n\t\t\t\tschoolId: action.payload.id,\r\n\t\t\t};\r\n\r\n\t\tcase ActionType.REMOVE_ROW:\r\n\t\t\treturn {\r\n\t\t\t\t...state,\r\n\t\t\t\tapplicationRows: state.applicationRows.map((r, i) =>\r\n\t\t\t\t\ti === action.payload.idx\r\n\t\t\t\t\t\t? {\r\n\t\t\t\t\t\t\t\t...r,\r\n\t\t\t\t\t\t\t\tstate: action.payload.toState,\r\n\t\t\t\t\t\t\t\tisModified: true,\r\n\t\t\t\t\t\t }\r\n\t\t\t\t\t\t: r\r\n\t\t\t\t),\r\n\t\t\t};\r\n\r\n\t\tcase ActionType.ADD_ROW:\r\n\t\t\treturn {\r\n\t\t\t\t...state,\r\n\t\t\t\tapplicationRows: [\r\n\t\t\t\t\t...state.applicationRows,\r\n\t\t\t\t\tnew ApplicationRowDTO(),\r\n\t\t\t\t],\r\n\t\t\t};\r\n\r\n\t\tcase ActionType.SET_STATUS:\r\n\t\t\treturn { ...state, status: action.payload };\r\n\r\n\t\tcase ActionType.SET_ACTIVE_VERDICT:\r\n\t\t\treturn {\r\n\t\t\t\t...state,\r\n\t\t\t\tapplicationRows: state.applicationRows.map((r, i) =>\r\n\t\t\t\t\ti === action.payload.idx\r\n\t\t\t\t\t\t? {\r\n\t\t\t\t\t\t\t\t...r,\r\n\t\t\t\t\t\t\t\tactiveVerdict: action.payload.verdict,\r\n\t\t\t\t\t\t }\r\n\t\t\t\t\t\t: r\r\n\t\t\t\t),\r\n\t\t\t};\r\n\r\n\t\tcase ActionType.SAVE_COMMENT:\r\n\t\t\treturn {\r\n\t\t\t\t...state,\r\n\t\t\t\tapplicationRows: state.applicationRows.map((r, i) =>\r\n\t\t\t\t\ti === action.payload.idx\r\n\t\t\t\t\t\t? {\r\n\t\t\t\t\t\t\t\t...r,\r\n\t\t\t\t\t\t\t\tcomment: action.payload.comment,\r\n\t\t\t\t\t\t\t\tisModified: true,\r\n\t\t\t\t\t\t }\r\n\t\t\t\t\t\t: r\r\n\t\t\t\t),\r\n\t\t\t};\r\n\r\n\t\tcase ActionType.SAVE_LINK:\r\n\t\t\treturn {\r\n\t\t\t\t...state,\r\n\t\t\t\tapplicationRows: state.applicationRows.map((r, i) =>\r\n\t\t\t\t\ti === action.payload.idx\r\n\t\t\t\t\t\t? {\r\n\t\t\t\t\t\t\t\t...r,\r\n\t\t\t\t\t\t\t\texternalUrl: action.payload.externalUrl,\r\n\t\t\t\t\t\t\t\tisModified: true,\r\n\t\t\t\t\t\t }\r\n\t\t\t\t\t\t: r\r\n\t\t\t\t),\r\n\t\t\t};\r\n\r\n\t\tcase ActionType.ADD_COURSE:\r\n\t\t\treturn {\r\n\t\t\t\t...state,\r\n\t\t\t\tapplicationRows: state.applicationRows.map((r, i) =>\r\n\t\t\t\t\ti === action.payload.idx\r\n\t\t\t\t\t\t? {\r\n\t\t\t\t\t\t\t\t...r,\r\n\t\t\t\t\t\t\t\tisModified: true,\r\n\t\t\t\t\t\t\t\tcourseMappingHeadId: 0,\r\n\t\t\t\t\t\t\t\t[action.payload.key]: [\r\n\t\t\t\t\t\t\t\t\t...r[action.payload.key],\r\n\t\t\t\t\t\t\t\t\tnew CourseDTO(),\r\n\t\t\t\t\t\t\t\t],\r\n\t\t\t\t\t\t }\r\n\t\t\t\t\t\t: r\r\n\t\t\t\t),\r\n\t\t\t};\r\n\r\n\t\tcase ActionType.REMOVE_COURSE:\r\n\t\t\treturn {\r\n\t\t\t\t...state,\r\n\t\t\t\tapplicationRows: state.applicationRows.map((r, rIdx) =>\r\n\t\t\t\t\trIdx === action.payload.rowIdx\r\n\t\t\t\t\t\t? {\r\n\t\t\t\t\t\t\t\t...r,\r\n\t\t\t\t\t\t\t\tisModified: true,\r\n\t\t\t\t\t\t\t\tcourseMappingHeadId: 0,\r\n\t\t\t\t\t\t\t\t[action.payload.key]: r[\r\n\t\t\t\t\t\t\t\t\taction.payload.key\r\n\t\t\t\t\t\t\t\t].filter(\r\n\t\t\t\t\t\t\t\t\t(_, cIdx) =>\r\n\t\t\t\t\t\t\t\t\t\tcIdx !== action.payload.courseIdx\r\n\t\t\t\t\t\t\t\t),\r\n\t\t\t\t\t\t }\r\n\t\t\t\t\t\t: r\r\n\t\t\t\t),\r\n\t\t\t};\r\n\r\n\t\tcase ActionType.UPDATE_COURSE:\r\n\t\t\treturn {\r\n\t\t\t\t...state,\r\n\t\t\t\tapplicationRows: state.applicationRows.map((r, rIdx) =>\r\n\t\t\t\t\taction.payload.rowIdx === rIdx\r\n\t\t\t\t\t\t? {\r\n\t\t\t\t\t\t\t\t...r,\r\n\t\t\t\t\t\t\t\tisModified: true,\r\n\t\t\t\t\t\t\t\tcourseMappingHeadId: 0,\r\n\t\t\t\t\t\t\t\t[action.payload.key]: r[action.payload.key].map(\r\n\t\t\t\t\t\t\t\t\t(c, cIdx) =>\r\n\t\t\t\t\t\t\t\t\t\tcIdx === action.payload.courseIdx\r\n\t\t\t\t\t\t\t\t\t\t\t? {\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t...action.payload.newCourse,\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tinformationRow:\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tnew InformationRowDTO(\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\taction.payload.id\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t),\r\n\t\t\t\t\t\t\t\t\t\t\t }\r\n\t\t\t\t\t\t\t\t\t\t\t: c\r\n\t\t\t\t\t\t\t\t),\r\n\t\t\t\t\t\t }\r\n\t\t\t\t\t\t: r\r\n\t\t\t\t),\r\n\t\t\t};\r\n\r\n\t\tcase ActionType.UPDATE_INFORMATION_ROW:\r\n\t\t\treturn {\r\n\t\t\t\t...state,\r\n\t\t\t\tapplicationRows: state.applicationRows.map((r, rIdx) =>\r\n\t\t\t\t\trIdx === action.payload.rowIdx\r\n\t\t\t\t\t\t? {\r\n\t\t\t\t\t\t\t\t...r,\r\n\t\t\t\t\t\t\t\tisModified: true,\r\n\t\t\t\t\t\t\t\tcoursesExchange: r.coursesExchange.map(\r\n\t\t\t\t\t\t\t\t\t(c, cIdx) =>\r\n\t\t\t\t\t\t\t\t\t\tcIdx === action.payload.idx\r\n\t\t\t\t\t\t\t\t\t\t\t? ({\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t...c,\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tinformationRow: {\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t...c.informationRow,\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tnote: action.payload\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t.text,\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t},\r\n\t\t\t\t\t\t\t\t\t\t\t } as CourseDTO)\r\n\t\t\t\t\t\t\t\t\t\t\t: c\r\n\t\t\t\t\t\t\t\t),\r\n\t\t\t\t\t\t }\r\n\t\t\t\t\t\t: r\r\n\t\t\t\t),\r\n\t\t\t};\r\n\r\n\t\tcase ActionType.UPDATE_INFORMATION_ROW_URL:\r\n\t\t\treturn {\r\n\t\t\t\t...state,\r\n\t\t\t\tapplicationRows: state.applicationRows.map((r, rIdx) =>\r\n\t\t\t\t\trIdx === action.payload.rowIdx\r\n\t\t\t\t\t\t? {\r\n\t\t\t\t\t\t\t\t...r,\r\n\t\t\t\t\t\t\t\tisModified: true,\r\n\t\t\t\t\t\t\t\tcoursesExchange: r.coursesExchange.map(\r\n\t\t\t\t\t\t\t\t\t(c, cIdx) =>\r\n\t\t\t\t\t\t\t\t\t\tcIdx === action.payload.idx\r\n\t\t\t\t\t\t\t\t\t\t\t? ({\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t...c,\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tinformationRow: {\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t...c.informationRow,\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\texternalUrl:\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\taction.payload.url,\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t},\r\n\t\t\t\t\t\t\t\t\t\t\t } as CourseDTO)\r\n\t\t\t\t\t\t\t\t\t\t\t: c\r\n\t\t\t\t\t\t\t\t),\r\n\t\t\t\t\t\t }\r\n\t\t\t\t\t\t: r\r\n\t\t\t\t),\r\n\t\t\t};\r\n\r\n\t\tcase ActionType.SET_YEAR:\r\n\t\t\treturn {\r\n\t\t\t\t...state,\r\n\t\t\t\tyear: action.payload,\r\n\t\t\t};\r\n\r\n\t\tcase ActionType.SET_MASTER_TRACK_ID:\r\n\t\t\treturn {\r\n\t\t\t\t...state,\r\n\t\t\t\tmasterTrackId: action.payload,\r\n\t\t\t};\r\n\r\n\t\tdefault:\r\n\t\t\treturn state;\r\n\t}\r\n};\r\n\r\nexport const ApplicationContext = React.createContext<\r\n\tIApplicationState | undefined\r\n>(undefined);\r\nexport const ApplicationUpdateContext = React.createContext<\r\n\tIApplicationHandlers | undefined\r\n>(undefined);\r\n\r\nconst api = new APIService();\r\ntype ApplicationProps = {\r\n\tprivileges: Privileges;\r\n\tinitialApplication?: ApplicationHeadDTO;\r\n\tonStatusUpdate?: (newStatus: ApplicationStatus) => void;\r\n};\r\nconst ApplicationContainer = ({\r\n\tonStatusUpdate,\r\n\tprivileges,\r\n\tinitialApplication,\r\n}: ApplicationProps) => {\r\n\tconst [application, dispatch] = React.useReducer<\r\n\t\tReact.Reducer\r\n\t>(reducer, initialApplication || new ApplicationHeadDTO());\r\n\r\n\tconst schools = useSchools();\r\n\tconst courses = useCourses();\r\n\tconst { getCoursesBySchoolIds } = useUpdateCourses();\r\n\tconst history = useHistory();\r\n\tconst [serverMessage, setServerMessage] = useState(null);\r\n\tconst [validationMessage, setValidationMessage] = useState('');\r\n\tconst [isDirty, updateCleanValue] = useIsDirty(application);\r\n\r\n\tuseEffect(() => {\r\n\t\tonStatusUpdate?.(application.status);\r\n\t}, [application.status]);\r\n\r\n\tuseEffect(() => {\r\n\t\tif (privileges.editCourses && application?.school?.id) {\r\n\t\t\tgetCoursesBySchoolIds(HOME_SCHOOL_ID, application.school.id);\r\n\t\t}\r\n\t}, [privileges.editCourses, application.school?.id]);\r\n\r\n\tconst handleSelectSchool = React.useCallback(\r\n\t\t(school: SchoolDTO) => {\r\n\t\t\tconst newSchool = schools?.find((s) => Number(s.id) === school.id);\r\n\t\t\tif (newSchool) {\r\n\t\t\t\tdispatch({\r\n\t\t\t\t\ttype: ActionType.SET_SCHOOL,\r\n\t\t\t\t\tpayload: newSchool,\r\n\t\t\t\t});\r\n\t\t\t}\r\n\t\t},\r\n\t\t[schools]\r\n\t);\r\n\r\n\tconst saveApplication = React.useCallback(() => {\r\n\t\tapi.saveApplication(application)\r\n\t\t\t.then((app) => {\r\n\t\t\t\tupdateCleanValue(app);\r\n\t\t\t\tdispatch({ type: ActionType.SET_APPLICATION, payload: app });\r\n\t\t\t\tif (application.id === 0) {\r\n\t\t\t\t\thistory.replace(`${ROUTES.APPLICATION}/${app.id}`);\r\n\t\t\t\t}\r\n\t\t\t})\r\n\t\t\t.catch((ex) => setServerMessage(ex.response.data.message));\r\n\t}, [application]);\r\n\r\n\tconst removeRow = React.useCallback(\r\n\t\t(idx: number, toState = EntityState.Removed) => {\r\n\t\t\tdispatch({\r\n\t\t\t\ttype: ActionType.REMOVE_ROW,\r\n\t\t\t\tpayload: { idx, toState },\r\n\t\t\t});\r\n\t\t},\r\n\t\t[]\r\n\t);\r\n\r\n\tconst setApplicationStatus = React.useCallback(\r\n\t\t(toStatus: ApplicationStatus) => {\r\n\t\t\tconst validation = validate(application);\r\n\t\t\tif (!validation) {\r\n\t\t\t\tapi.setApplicationStatus(application.id, toStatus)\r\n\t\t\t\t\t.then((result) => {\r\n\t\t\t\t\t\tdispatch({\r\n\t\t\t\t\t\t\ttype: ActionType.SET_STATUS,\r\n\t\t\t\t\t\t\tpayload: toStatus,\r\n\t\t\t\t\t\t});\r\n\t\t\t\t\t\tupdateCleanValue({ ...application, status: toStatus });\r\n\t\t\t\t\t})\r\n\t\t\t\t\t.catch((ex) => setServerMessage(ex.response.data.message));\r\n\t\t\t}\r\n\t\t\tsetValidationMessage(validation);\r\n\t\t},\r\n\t\t[application]\r\n\t);\r\n\r\n\tconst addRow = React.useCallback(() => {\r\n\t\tdispatch({ type: ActionType.ADD_ROW });\r\n\t}, []);\r\n\r\n\tconst giveVerdict = React.useCallback(\r\n\t\t(idx: number, verdict: VerdictDTO) => {\r\n\t\t\tdispatch({\r\n\t\t\t\ttype: ActionType.SET_ACTIVE_VERDICT,\r\n\t\t\t\tpayload: { idx, verdict },\r\n\t\t\t});\r\n\t\t},\r\n\t\t[]\r\n\t);\r\n\r\n\tconst saveComment = React.useCallback((idx: number, comment: string) => {\r\n\t\tdispatch({ type: ActionType.SAVE_COMMENT, payload: { idx, comment } });\r\n\t}, []);\r\n\r\n\tconst saveLink = React.useCallback((idx: number, externalUrl: string) => {\r\n\t\tdispatch({ type: ActionType.SAVE_LINK, payload: { idx, externalUrl } });\r\n\t}, []);\r\n\r\n\tconst addCourse = React.useCallback(\r\n\t\t(idx: number, key: CourseOrigin) => () => {\r\n\t\t\tdispatch({ type: ActionType.ADD_COURSE, payload: { idx, key } });\r\n\t\t},\r\n\t\t[]\r\n\t);\r\n\r\n\tconst removeCourse = React.useCallback(\r\n\t\t(rowIdx: number, key: CourseOrigin) =>\r\n\t\t\t(courseIdx: number, courseId: number) => {\r\n\t\t\t\tdispatch({\r\n\t\t\t\t\ttype: ActionType.REMOVE_COURSE,\r\n\t\t\t\t\tpayload: { rowIdx, key, courseIdx, courseId },\r\n\t\t\t\t});\r\n\t\t\t},\r\n\t\t[]\r\n\t);\r\n\r\n\tconst updateCourse = React.useCallback(\r\n\t\t(rowIdx: number, key: CourseOrigin) =>\r\n\t\t\t(courseIdx: number, id: number, oldId: number) => {\r\n\t\t\t\tdispatch({\r\n\t\t\t\t\ttype: ActionType.UPDATE_COURSE,\r\n\t\t\t\t\tpayload: {\r\n\t\t\t\t\t\trowIdx,\r\n\t\t\t\t\t\tkey,\r\n\t\t\t\t\t\tcourseIdx,\r\n\t\t\t\t\t\tid,\r\n\t\t\t\t\t\toldId,\r\n\t\t\t\t\t\tnewCourse: courses?.find((c) => c.id == id),\r\n\t\t\t\t\t},\r\n\t\t\t\t});\r\n\t\t\t},\r\n\t\t[courses]\r\n\t);\r\n\r\n\tconst updateInformationRow = React.useCallback(\r\n\t\t(rowIdx: number, text: string, idx: number) => {\r\n\t\t\tdispatch({\r\n\t\t\t\ttype: ActionType.UPDATE_INFORMATION_ROW,\r\n\t\t\t\tpayload: { rowIdx, text, idx },\r\n\t\t\t});\r\n\t\t},\r\n\t\t[]\r\n\t);\r\n\r\n\tconst updateInformationRowUrl = React.useCallback(\r\n\t\t(rowIdx: number, url: string, idx: number) => {\r\n\t\t\tdispatch({\r\n\t\t\t\ttype: ActionType.UPDATE_INFORMATION_ROW_URL,\r\n\t\t\t\tpayload: { rowIdx, url, idx },\r\n\t\t\t});\r\n\t\t},\r\n\t\t[]\r\n\t);\r\n\r\n\tconst setYear = React.useCallback((year: number) => {\r\n\t\tdispatch({ type: ActionType.SET_YEAR, payload: year });\r\n\t}, []);\r\n\r\n\tconst setMasterProgram = React.useCallback((masterTrackId: number) => {\r\n\t\tdispatch({\r\n\t\t\ttype: ActionType.SET_MASTER_TRACK_ID,\r\n\t\t\tpayload: masterTrackId,\r\n\t\t});\r\n\t}, []);\r\n\r\n\tconst state = new ApplicationState({\r\n\t\tapplication,\r\n\t\tprivileges,\r\n\t\tvalidationMessage,\r\n\t\tisDirty,\r\n\t\tserverMessage,\r\n\t});\r\n\tconst handlers = new ApplicationHandlers({\r\n\t\tsetYear,\r\n\t\tsetMasterProgram,\r\n\t\thandleSelectSchool,\r\n\t\tsaveApplication,\r\n\t\tsetApplicationStatus,\r\n\t\tgiveVerdict,\r\n\t\tsaveComment,\r\n\t\tsaveLink,\r\n\t\taddCourse,\r\n\t\tremoveCourse,\r\n\t\tupdateCourse,\r\n\t\tupdateInformationRow,\r\n\t\tupdateInformationRowUrl,\r\n\t\tremoveRow,\r\n\t\taddRow,\r\n\t});\r\n\r\n\tif (!schools) return

Hämtar skolor...

;\r\n\r\n\treturn (\r\n\t\t\r\n\t\t\t\r\n\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\r\n\t\t\r\n\t);\r\n};\r\n\r\nexport const useApplication = () => {\r\n\tconst value = React.useContext(ApplicationContext);\r\n\r\n\tif (!value) {\r\n\t\tthrow new Error(\r\n\t\t\t'ApplicationContext must be used within an ApplicationProvider'\r\n\t\t);\r\n\t}\r\n\r\n\treturn value;\r\n};\r\n\r\nexport const useUpdateApplication = () => {\r\n\tconst value = React.useContext(ApplicationUpdateContext);\r\n\r\n\tif (!value) {\r\n\t\tthrow new Error(\r\n\t\t\t'ApplicationContext must be used within an ApplicationProvider'\r\n\t\t);\r\n\t}\r\n\r\n\treturn value;\r\n};\r\n\r\nexport default ApplicationContainer;\r\n","import React, { useState, useEffect } from 'react';\r\nimport { Link } from 'react-router-dom';\r\nimport { ColDef, DataGrid } from '@material-ui/data-grid';\r\n\r\nimport {\r\n\tButton,\r\n\tFormControlLabel,\r\n\tFormLabel,\r\n\tRadio,\r\n\tRadioGroup,\r\n\tTextField,\r\n\tTooltip,\r\n\tTypography,\r\n} from '@material-ui/core';\r\nimport { appVerdictName, VerdictStatus } from '../../../util/enumerations';\r\nimport { VerdictDTO } from '../../../DTO/VerdictDTO';\r\nimport { useUpdateApplication } from '..';\r\nimport { APIService } from '../../../services/apiService';\r\nimport { ROUTES } from '../../../constants';\r\nimport { setVerdictBorderStyle } from '../util';\r\n\r\ntype CreateVerdictProps = {\r\n\tverdict: VerdictDTO | null;\r\n\tsetVerdict: React.Dispatch>;\r\n\trowIndex: number;\r\n};\r\nconst api = new APIService();\r\n\r\nexport const CreateVerdict = React.memo(\r\n\t({ verdict, setVerdict, rowIndex }: CreateVerdictProps) => {\r\n\t\tconst [showHistory, setShowHistory] = useState(false);\r\n\t\tconst [mappingHistoryLocal, setMappingHistoryLocal] = useState<\r\n\t\t\tVerdictDTO[] | null\r\n\t\t>(null);\r\n\t\tconst { giveVerdict } = useUpdateApplication();\r\n\t\tconst verdicts = mappingHistoryLocal || [];\r\n\t\tconst getMappingHistory = React.useCallback(() => {\r\n\t\t\tif (!verdict || !verdict.courseMappingHeadId) return;\r\n\r\n\t\t\tif (verdicts.length === 0 || showHistory === true) {\r\n\t\t\t\tapi.getMappingHistory(verdict?.courseMappingHeadId).then(\r\n\t\t\t\t\t(data) => {\r\n\t\t\t\t\t\tsetMappingHistoryLocal(data);\r\n\t\t\t\t\t}\r\n\t\t\t\t);\r\n\t\t\t}\r\n\t\t\tsetShowHistory(true);\r\n\t\t}, [verdict, showHistory]);\r\n\r\n\t\tuseEffect(() => {\r\n\t\t\tgetMappingHistory();\r\n\t\t}, []);\r\n\r\n\t\tconst copyVerdict = React.useCallback(\r\n\t\t\t(copiedVerdict: VerdictDTO) => {\r\n\t\t\t\tif (!verdict) return;\r\n\t\t\t\tsetVerdict(\r\n\t\t\t\t\t(prevVerdict) =>\r\n\t\t\t\t\t\t({\r\n\t\t\t\t\t\t\t...prevVerdict,\r\n\t\t\t\t\t\t\tnote: copiedVerdict.note,\r\n\t\t\t\t\t\t\tstatus: copiedVerdict.status,\r\n\t\t\t\t\t\t} as VerdictDTO)\r\n\t\t\t\t);\r\n\t\t\t},\r\n\t\t\t[verdict]\r\n\t\t);\r\n\r\n\t\tconst saveVerdict = React.useCallback(() => {\r\n\t\t\tif (!verdict) return;\r\n\t\t\tapi.saveVerdict(verdict)\r\n\t\t\t\t.then((data) => {\r\n\t\t\t\t\tsetVerdict(null);\r\n\t\t\t\t\tgiveVerdict(rowIndex, data);\r\n\t\t\t\t})\r\n\t\t\t\t.catch((ex) => console.log(ex));\r\n\t\t}, [verdict]);\r\n\r\n\t\tconst colDefs: ColDef[] = React.useMemo(\r\n\t\t\t() => [\r\n\t\t\t\t{\r\n\t\t\t\t\tfield: 'status',\r\n\t\t\t\t\theaderName: 'Status',\r\n\t\t\t\t\twidth: 300,\r\n\t\t\t\t\tvalueGetter: (params) =>\r\n\t\t\t\t\t\tappVerdictName(params.value as VerdictStatus),\r\n\t\t\t\t},\r\n\t\t\t\t{\r\n\t\t\t\t\tfield: 'note',\r\n\t\t\t\t\theaderName: 'Note',\r\n\t\t\t\t\twidth: 300,\r\n\t\t\t\t\trenderCell: (params) => (\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t{(params.value as string)?.substring(0, 60) +\r\n\t\t\t\t\t\t\t\t\t'...'}\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t),\r\n\t\t\t\t},\r\n\t\t\t\t{\r\n\t\t\t\t\tfield: 'copy',\r\n\t\t\t\t\theaderName: ' ',\r\n\t\t\t\t\twidth: 100,\r\n\t\t\t\t\trenderCell: (params) => (\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\tcopyVerdict(params.data as VerdictDTO)\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\tCopy\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t),\r\n\t\t\t\t},\r\n\t\t\t\t{\r\n\t\t\t\t\tfield: 'edit',\r\n\t\t\t\t\theaderName: ' ',\r\n\t\t\t\t\twidth: 180,\r\n\t\t\t\t\trenderCell: (params) => (\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\tOpen application\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t),\r\n\t\t\t\t},\r\n\t\t\t],\r\n\t\t\t[copyVerdict]\r\n\t\t);\r\n\r\n\t\treturn React.useMemo(\r\n\t\t\t() =>\r\n\t\t\t\tverdict ? (\r\n\t\t\t\t\t
\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\tVerdict\r\n\t\t\t\t\t\t\t
\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\tStatus\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\tverdict &&\r\n\t\t\t\t\t\t\t\t\tsetVerdict({\r\n\t\t\t\t\t\t\t\t\t\t...verdict,\r\n\t\t\t\t\t\t\t\t\t\tstatus: Number(e.target.value),\r\n\t\t\t\t\t\t\t\t\t})\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\tlabel={appVerdictName(\r\n\t\t\t\t\t\t\t\t\t\tVerdictStatus.Accepted\r\n\t\t\t\t\t\t\t\t\t)}\r\n\t\t\t\t\t\t\t\t\tchecked={\r\n\t\t\t\t\t\t\t\t\t\tverdict.status ===\r\n\t\t\t\t\t\t\t\t\t\tVerdictStatus.Accepted\r\n\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t/>\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\tlabel={appVerdictName(\r\n\t\t\t\t\t\t\t\t\t\tVerdictStatus.AcceptedUnderSpecialCircumstances\r\n\t\t\t\t\t\t\t\t\t)}\r\n\t\t\t\t\t\t\t\t\tchecked={\r\n\t\t\t\t\t\t\t\t\t\tverdict?.status ===\r\n\t\t\t\t\t\t\t\t\t\tVerdictStatus.AcceptedUnderSpecialCircumstances\r\n\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t/>\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\tlabel={appVerdictName(\r\n\t\t\t\t\t\t\t\t\t\tVerdictStatus.Rejected\r\n\t\t\t\t\t\t\t\t\t)}\r\n\t\t\t\t\t\t\t\t\tchecked={\r\n\t\t\t\t\t\t\t\t\t\tverdict.status ===\r\n\t\t\t\t\t\t\t\t\t\tVerdictStatus.Rejected\r\n\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t/>\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t
\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\tsetVerdict({\r\n\t\t\t\t\t\t\t\t\t\t...verdict,\r\n\t\t\t\t\t\t\t\t\t\tnote: e.target.value,\r\n\t\t\t\t\t\t\t\t\t})\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t/>\r\n\t\t\t\t\t\t\t
\r\n\t\t\t\t\t\t\t saveVerdict()}\r\n\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\tSave\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t getMappingHistory()}\r\n\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\tShow history\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t{showHistory ? (\r\n\t\t\t\t\t\t\t\t setShowHistory(false)}\r\n\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\tHide history\r\n\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t) : null}\r\n\t\t\t\t\t\t
\r\n\t\t\t\t\t\t
\r\n\t\t\t\t\t\t{showHistory ? (\r\n\t\t\t\t\t\t\t
\r\n\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t
\r\n\t\t\t\t\t\t) : null}\r\n\t\t\t\t\t\r\n\t\t\t\t) : null,\r\n\t\t\t[\r\n\t\t\t\tverdict,\r\n\t\t\t\tsaveVerdict,\r\n\t\t\t\tgetMappingHistory,\r\n\t\t\t\tshowHistory,\r\n\t\t\t\tcolDefs,\r\n\t\t\t\tverdicts,\r\n\t\t\t]\r\n\t\t);\r\n\t}\r\n);\r\n","import React, { useState } from 'react';\r\nimport { IconButton } from '@material-ui/core';\r\n\r\nimport EditIcon from '@material-ui/icons/Edit';\r\nimport GavelIcon from '@material-ui/icons/Gavel';\r\nimport { VerdictDTO } from '../../../DTO/VerdictDTO';\r\nimport { getDateAndTime } from '../../../util/dateHelper';\r\nimport { appVerdictName } from '../../../util/enumerations';\r\nimport { useApplication } from '..';\r\nimport { CreateVerdict } from './createVerdict';\r\nimport { setVerdictBorderStyle } from '../util';\r\n\r\ntype VerdictProps = {\r\n\tactiveVerdict: VerdictDTO;\r\n\trowId: number;\r\n\tcourseMappingHeadId: number;\r\n\trowIndex: number;\r\n};\r\n\r\nconst Verdict = ({\r\n\trowId,\r\n\tcourseMappingHeadId,\r\n\tactiveVerdict,\r\n\trowIndex,\r\n}: VerdictProps) => {\r\n\tconst { privileges } = useApplication();\r\n\tconst [verdict, setVerdict] = useState(null);\r\n\r\n\tconst setNewVerdict = React.useCallback(() => {\r\n\t\tsetVerdict(new VerdictDTO(rowId, courseMappingHeadId));\r\n\t}, []);\r\n\r\n\tconst editActiveVerdict = React.useCallback(() => {\r\n\t\tsetVerdict(activeVerdict);\r\n\t}, [activeVerdict]);\r\n\r\n\tconst hammerOfThor = React.useMemo(\r\n\t\t() => (\r\n\t\t\t
\r\n\t\t\t\t setNewVerdict()}\r\n\t\t\t\t>\r\n\t\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t
\r\n\t\t),\r\n\t\t[setNewVerdict]\r\n\t);\r\n\r\n\tconst displayActiveVerdict = React.useMemo(\r\n\t\t() =>\r\n\t\t\t!activeVerdict ? null : (\r\n\t\t\t\t\r\n\t\t\t\t\t{appVerdictName(activeVerdict.status)}\r\n\t\t\t\t\t
\r\n\t\t\t\t\t{`${getDateAndTime(\r\n\t\t\t\t\t\tactiveVerdict.modified || activeVerdict.created\r\n\t\t\t\t\t)} by ${activeVerdict.createdBy}`}\r\n\t\t\t\t\t

{activeVerdict.note}

\r\n\t\t\t\t\t{privileges.giveVerdict ? (\r\n\t\t\t\t\t\t
\r\n\t\t\t\t\t\t\t editActiveVerdict()}\r\n\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t
\r\n\t\t\t\t\t) : null}\r\n\t\t\t\t\r\n\t\t\t),\r\n\t\t[\r\n\t\t\tactiveVerdict,\r\n\t\t\tappVerdictName,\r\n\t\t\tprivileges.giveVerdict,\r\n\t\t\teditActiveVerdict,\r\n\t\t]\r\n\t);\r\n\r\n\tif (!rowId || !courseMappingHeadId) return null;\r\n\tif (!verdict && !activeVerdict && privileges.giveVerdict)\r\n\t\treturn hammerOfThor;\r\n\r\n\tif (!verdict && activeVerdict) return displayActiveVerdict;\r\n\tif (verdict && privileges.giveVerdict)\r\n\t\treturn (\r\n\t\t\t\r\n\t\t);\r\n\treturn null;\r\n};\r\n\r\nexport default Verdict;\r\n","import { Typography } from '@material-ui/core';\r\nimport React from 'react';\r\nimport { getDateAndTime } from '../util/dateHelper';\r\n\r\ninterface ILastEditedProps {\r\n\tdata:\r\n\t\t| {\r\n\t\t\t\t[key: string]: any;\r\n\t\t\t\tcreated: Date;\r\n\t\t\t\tcreatedBy: string;\r\n\t\t\t\tmodified: Date;\r\n\t\t\t\tmodifiedBy: string;\r\n\t\t }\r\n\t\t| any;\r\n}\r\n\r\nconst LastEdited = (props: ILastEditedProps) => {\r\n\tif (!props) return null;\r\n\r\n\tconst { created, createdBy, modified, modifiedBy } = props.data;\r\n\r\n\tfunction Created() {\r\n\t\tif (created && createdBy) {\r\n\t\t\treturn (\r\n\t\t\t\t\r\n\t\t\t\t\t{'Created by '} {createdBy} {' at '}\r\n\t\t\t\t\t{getDateAndTime(created)}\r\n\t\t\t\t\r\n\t\t\t);\r\n\t\t} else {\r\n\t\t\treturn null;\r\n\t\t}\r\n\t}\r\n\r\n\tfunction Modified() {\r\n\t\tif (modified && modifiedBy) {\r\n\t\t\treturn (\r\n\t\t\t\t\r\n\t\t\t\t\t{'Last modified by '} {modifiedBy} {' at '}\r\n\t\t\t\t\t{getDateAndTime(modified)}\r\n\t\t\t\t\r\n\t\t\t);\r\n\t\t} else {\r\n\t\t\treturn null;\r\n\t\t}\r\n\t}\r\n\r\n\treturn (\r\n\t\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t\r\n\t);\r\n};\r\n\r\nexport default LastEdited;\r\n","import React from 'react';\r\n\r\nimport {\r\n\tAccordion,\r\n\tFormGroup,\r\n\tGrid,\r\n\tTextField,\r\n\tTypography,\r\n} from '@material-ui/core';\r\nimport { makeStyles } from '@material-ui/core/styles';\r\nimport { AccordionDetails } from '@material-ui/core';\r\nimport { AccordionSummary } from '@material-ui/core';\r\nimport ExpandMoreIcon from '@material-ui/icons/ExpandMore';\r\nimport { CourseDTO } from '../../../DTO/CourseDTO';\r\nimport { EntityState } from '../../../util/enumerations';\r\nimport { useApplication, useUpdateApplication } from '..';\r\n\r\nconst useStyles = makeStyles({\r\n\taccordion: {\r\n\t\tborder: '1px solid #999',\r\n\t\tbackgroundColor: '#f6f6f6',\r\n\t\tboxShadow: 'none',\r\n\t\tmarginBottom: '8px',\r\n\t\tborderRadius: '8px !important',\r\n\t},\r\n});\r\n\r\ntype InformationRowProps = {\r\n\tcoursesExchange: CourseDTO[];\r\n\trowIndex: number;\r\n};\r\n\r\nconst InformationRows = ({\r\n\tcoursesExchange,\r\n\trowIndex,\r\n}: InformationRowProps) => {\r\n\tconst classes = useStyles();\r\n\tconst { privileges } = useApplication();\r\n\tconst { updateInformationRow, updateInformationRowUrl } =\r\n\t\tuseUpdateApplication();\r\n\treturn (\r\n\t\t<>\r\n\t\t\t{coursesExchange\r\n\t\t\t\t.filter(\r\n\t\t\t\t\t(c) =>\r\n\t\t\t\t\t\tc.informationRow &&\r\n\t\t\t\t\t\tc.informationRow.state !== EntityState.Removed\r\n\t\t\t\t)\r\n\t\t\t\t.map((course, idx) => (\r\n\t\t\t\t\t\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\taria-controls=\"panel1a-content\"\r\n\t\t\t\t\t\t\tid=\"panel1a-header\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t\tCourse information\r\n\t\t\t\t\t\t\t\t\t\t{`(${course?.code} - ${course?.title})`}\r\n\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t
\r\n\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t {\r\n\t\t\t\t\t\t\t\t\t\t\tupdateInformationRow(\r\n\t\t\t\t\t\t\t\t\t\t\t\trowIndex,\r\n\t\t\t\t\t\t\t\t\t\t\t\te.target.value,\r\n\t\t\t\t\t\t\t\t\t\t\t\tidx\r\n\t\t\t\t\t\t\t\t\t\t\t);\r\n\t\t\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t\t\t/>\r\n\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t {\r\n\t\t\t\t\t\t\t\t\t\t\tupdateInformationRowUrl(\r\n\t\t\t\t\t\t\t\t\t\t\t\trowIndex,\r\n\t\t\t\t\t\t\t\t\t\t\t\te.target.value,\r\n\t\t\t\t\t\t\t\t\t\t\t\tidx\r\n\t\t\t\t\t\t\t\t\t\t\t);\r\n\t\t\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t\t\t/>\r\n\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t
\r\n\t\t\t\t\t\t
\r\n\t\t\t\t\t\r\n\t\t\t\t))}\r\n\t\t\r\n\t);\r\n};\r\n\r\nexport default InformationRows;\r\n","import React from 'react';\r\n\r\nimport { makeStyles } from '@material-ui/core/styles';\r\nimport { Accordion } from '@material-ui/core';\r\nimport { AccordionDetails } from '@material-ui/core';\r\nimport { AccordionSummary } from '@material-ui/core';\r\nimport ExpandMoreIcon from '@material-ui/icons/ExpandMore';\r\nimport CommentIcon from '@material-ui/icons/Comment';\r\nimport LinkIcon from '@material-ui/icons/Link';\r\n\r\nimport { FormGroup, Grid, TextField, Typography } from '@material-ui/core';\r\nimport { ApplicationRowDTO } from '../../../DTO/ApplicationRowDTO';\r\nimport { CourseDTO } from '../../../DTO/CourseDTO';\r\nimport { SchoolDTO } from '../../../DTO/SchoolDTO';\r\nimport Column from '../column';\r\nimport Verdict from '../verdict/verdict';\r\nimport LastEdited from '../../../pages/lastEdited';\r\nimport InformationRows from './informationRow';\r\nimport { CourseOrigin, useApplication, useUpdateApplication } from '..';\r\nimport { useCourses } from '../../../contexts';\r\nimport { HOME_SCHOOL_ID } from '../../../constants';\r\n\r\nconst useStyles = makeStyles({\r\n\taccordion: {\r\n\t\tborder: '1px solid #999',\r\n\t\tbackgroundColor: '#fafaff',\r\n\t},\r\n});\r\n\r\ntype RowFooterProps = {\r\n\tcreated: Date;\r\n\tcreatedBy: string;\r\n\tmodified: Date;\r\n\tmodifiedBy: string;\r\n\tcomment: string;\r\n\texternalUrl: string;\r\n\trowIndex: number;\r\n};\r\n\r\nconst RowFooter = ({\r\n\tcomment,\r\n\texternalUrl,\r\n\trowIndex,\r\n\tcreated,\r\n\tcreatedBy,\r\n\tmodified,\r\n\tmodifiedBy,\r\n}: RowFooterProps) => {\r\n\tconst classes = useStyles();\r\n\tconst { privileges } = useApplication();\r\n\tconst { saveComment } = useUpdateApplication();\r\n\treturn React.useMemo(\r\n\t\t() => (\r\n\t\t\t\r\n\t\t\t\t}\r\n\t\t\t\t\taria-controls=\"panel1a-content\"\r\n\t\t\t\t\tid=\"panel1a-header\"\r\n\t\t\t\t>\r\n\t\t\t\t\t\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\tAdditional comments\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t{comment ? (\r\n\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t) : null}\r\n\t\t\t\t\t\t\t{externalUrl ? : null}\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\t\t
\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\tsaveComment(rowIndex, e.target.value)\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t/>\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t
\r\n\t\t\t\t
\r\n\t\t\t
\r\n\t\t),\r\n\t\t[\r\n\t\t\tprivileges.editRows,\r\n\t\t\tcomment,\r\n\t\t\tsaveComment,\r\n\t\t\trowIndex,\r\n\t\t\tcreated,\r\n\t\t\tcreatedBy,\r\n\t\t\tmodified,\r\n\t\t\tmodifiedBy,\r\n\t\t]\r\n\t);\r\n};\r\n\r\ninterface ApplicationRowProps {\r\n\trow: ApplicationRowDTO;\r\n\tschools: { home: SchoolDTO | null; exchange: SchoolDTO | null };\r\n\trowIndex: number;\r\n\toverridePrivileges?: Privileges;\r\n}\r\n\r\nconst ApplicationRow = ({\r\n\trow,\r\n\tschools,\r\n\trowIndex,\r\n\toverridePrivileges,\r\n}: ApplicationRowProps) => {\r\n\tconst courses = useCourses();\r\n\tconst application = useApplication();\r\n\tconst privileges = overridePrivileges || application.privileges;\r\n\tconst { addCourse, removeCourse, updateCourse } = useUpdateApplication();\r\n\r\n\tconst {\r\n\t\tid,\r\n\t\tcreated,\r\n\t\tcreatedBy,\r\n\t\tmodified,\r\n\t\tmodifiedBy,\r\n\t\tcomment,\r\n\t\texternalUrl,\r\n\t\tcoursesHome,\r\n\t\tcoursesExchange,\r\n\t\tactiveVerdict,\r\n\t\tcourseMappingHeadId,\r\n\t} = row;\r\n\r\n\treturn React.useMemo(\r\n\t\t() => (\r\n\t\t\t<>\r\n\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t{schools.home?.name}\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t {schools.home?.country?.name} \r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t c.schoolId === HOME_SCHOOL_ID\r\n\t\t\t\t\t\t\t)}\r\n\t\t\t\t\t\t\tisHome={true}\r\n\t\t\t\t\t\t\thandlers={{\r\n\t\t\t\t\t\t\t\taddCourse: addCourse(\r\n\t\t\t\t\t\t\t\t\trowIndex,\r\n\t\t\t\t\t\t\t\t\tCourseOrigin.HOME\r\n\t\t\t\t\t\t\t\t),\r\n\t\t\t\t\t\t\t\tremoveCourse: removeCourse(\r\n\t\t\t\t\t\t\t\t\trowIndex,\r\n\t\t\t\t\t\t\t\t\tCourseOrigin.HOME\r\n\t\t\t\t\t\t\t\t),\r\n\t\t\t\t\t\t\t\tupdateCourse: updateCourse(\r\n\t\t\t\t\t\t\t\t\trowIndex,\r\n\t\t\t\t\t\t\t\t\tCourseOrigin.HOME\r\n\t\t\t\t\t\t\t\t),\r\n\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t{schools.exchange?.name || 'Choose university'}\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t {schools.exchange?.country?.name} \r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\tc.schoolId ===\r\n\t\t\t\t\t\t\t\t\tapplication.application.school?.id\r\n\t\t\t\t\t\t\t)}\r\n\t\t\t\t\t\t\tisHome={false}\r\n\t\t\t\t\t\t\thandlers={{\r\n\t\t\t\t\t\t\t\taddCourse: addCourse(\r\n\t\t\t\t\t\t\t\t\trowIndex,\r\n\t\t\t\t\t\t\t\t\tCourseOrigin.EXCHANGE\r\n\t\t\t\t\t\t\t\t),\r\n\t\t\t\t\t\t\t\tremoveCourse: removeCourse(\r\n\t\t\t\t\t\t\t\t\trowIndex,\r\n\t\t\t\t\t\t\t\t\tCourseOrigin.EXCHANGE\r\n\t\t\t\t\t\t\t\t),\r\n\t\t\t\t\t\t\t\tupdateCourse: updateCourse(\r\n\t\t\t\t\t\t\t\t\trowIndex,\r\n\t\t\t\t\t\t\t\t\tCourseOrigin.EXCHANGE\r\n\t\t\t\t\t\t\t\t),\r\n\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t\r\n\t\t\t\t\t c.id)\r\n\t\t\t\t\t\t\t.length && {\r\n\t\t\t\t\t\t\tstyle: { marginTop: '32px' },\r\n\t\t\t\t\t\t})}\r\n\t\t\t\t\t>\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\t
\r\n\t\t\t\t\r\n\t\t\t\r\n\t\t),\r\n\t\t[\r\n\t\t\tschools.home,\r\n\t\t\tschools.exchange,\r\n\t\t\tcourses,\r\n\t\t\trow,\r\n\t\t\taddCourse,\r\n\t\t\tremoveCourse,\r\n\t\t\tupdateCourse,\r\n\t\t\trowIndex,\r\n\t\t\tprivileges.editRows,\r\n\t\t\tactiveVerdict,\r\n\t\t]\r\n\t);\r\n};\r\n\r\nexport default ApplicationRow;\r\n","import React from 'react';\r\n\r\nimport DeleteIcon from '@material-ui/icons/Delete';\r\nimport UndoIcon from '@material-ui/icons/Undo';\r\nimport { makeStyles } from '@material-ui/core/styles';\r\n\r\nimport ApplicationRow from './row';\r\nimport { EntityState } from '../../../util/enumerations';\r\nimport { Button, Card, IconButton } from '@material-ui/core';\r\nimport { HOME_SCHOOL_ID } from '../../../constants';\r\nimport { useSchools } from '../../../contexts';\r\nimport { useApplication, useUpdateApplication } from '..';\r\n\r\nconst useStyles = makeStyles({\r\n\taddButton: {\r\n\t\tmarginTop: '12px',\r\n\t},\r\n\tcard: {\r\n\t\tpadding: '10px',\r\n\t\tmarginBottom: '20px',\r\n\t\tmarginTop: '50px',\r\n\t\tborder: '1px solid #ababab',\r\n\t},\r\n});\r\n\r\nconst ApplicationRows = () => {\r\n\tconst classes = useStyles();\r\n\tconst { application, privileges } = useApplication();\r\n\tconst { removeRow, addRow } = useUpdateApplication();\r\n\tconst schools = useSchools();\r\n\tconst appSchools = {\r\n\t\thome: schools?.find((s) => s.id === HOME_SCHOOL_ID) || null,\r\n\t\texchange: application.school || null,\r\n\t};\r\n\r\n\tconst renderApplicationRows = React.useMemo(\r\n\t\t() => (\r\n\t\t\t
\r\n\t\t\t\t{application.applicationRows.map((row, idx) => {\r\n\t\t\t\t\tif (row.state === EntityState.Removed) {\r\n\t\t\t\t\t\treturn (\r\n\t\t\t\t\t\t\t
\r\n\t\t\t\t\t\t\t\t
\r\n\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t\tremoveRow(idx, EntityState.Active)\r\n\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t
\r\n\t\t\t\t\t\t);\r\n\t\t\t\t\t}\r\n\t\t\t\t\treturn (\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t
\r\n\t\t\t\t\t\t\t\t#{idx + 1}\r\n\t\t\t\t\t\t\t
\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t{privileges.editRows && (\r\n\t\t\t\t\t\t\t\t
\r\n\t\t\t\t\t\t\t\t\t removeRow(idx)}\r\n\t\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t
\r\n\t\t\t\t\t\t\t)}\r\n\t\t\t\t\t\t
\r\n\t\t\t\t\t);\r\n\t\t\t\t})}\r\n\t\t\t
\r\n\t\t),\r\n\t\t[\r\n\t\t\tapplication.applicationRows,\r\n\t\t\tappSchools,\r\n\t\t\tprivileges.editRows,\r\n\t\t\tremoveRow,\r\n\t\t]\r\n\t);\r\n\r\n\treturn (\r\n\t\t
\r\n\t\t\t{schools && application?.school?.id ? (\r\n\t\t\t\t<>\r\n\t\t\t\t\t
{renderApplicationRows}
\r\n\t\t\t\t\t{privileges.editRows && (\r\n\t\t\t\t\t\t
\r\n\t\t\t\t\t\t\t addRow()}\r\n\t\t\t\t\t\t\t\tclassName={classes.addButton}\r\n\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\tAdd row\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t
\r\n\t\t\t\t\t)}\r\n\t\t\t\t\r\n\t\t\t) : null}\r\n\t\t
\r\n\t);\r\n};\r\n\r\nexport default ApplicationRows;\r\n","import React from 'react';\r\nimport { makeStyles } from '@material-ui/core/styles';\r\n\r\nimport Button from '@material-ui/core/Button';\r\nimport LastEdited from '../lastEdited';\r\nimport { useApplication, useUpdateApplication } from '.';\r\n\r\nconst useStyles = makeStyles({\r\n\terror: {\r\n\t\tcolor: '#e74c3c',\r\n\t\tfontWeight: 'bold',\r\n\t},\r\n});\r\n\r\n// Do not optimize. This depends on `application`\r\nconst ApplicationControls = () => {\r\n\tconst { application, privileges, serverMessage, isDirty } =\r\n\t\tuseApplication();\r\n\tconst { saveApplication } = useUpdateApplication();\r\n\tconst classes = useStyles();\r\n\r\n\treturn (\r\n\t\t<>\r\n\t\t\t{serverMessage &&

{serverMessage}

}\r\n\t\t\t{privileges.editCourses &&\r\n\t\t\tapplication.applicationRows.length > 0 ? (\r\n\t\t\t\t saveApplication()}\r\n\t\t\t\t\tvariant=\"contained\"\r\n\t\t\t\t\tcolor=\"primary\"\r\n\t\t\t\t\tdisabled={\r\n\t\t\t\t\t\t(application.schoolId !== undefined &&\r\n\t\t\t\t\t\t\tapplication?.schoolId < 1) ||\r\n\t\t\t\t\t\t!isDirty\r\n\t\t\t\t\t}\r\n\t\t\t\t>\r\n\t\t\t\t\tSave\r\n\t\t\t\t\r\n\t\t\t) : null}\r\n\t\t\t\r\n\t\t\r\n\t);\r\n};\r\n\r\nexport default ApplicationControls;\r\n","import { BaseDTO } from './BaseDTO';\r\n\r\nexport interface InformationRowDTO extends BaseDTO {\r\n\tid: number;\r\n\tapplicationRowId?: number;\r\n\tcourseId?: number;\r\n\tnote: string;\r\n\texternalUrl?: string;\r\n}\r\n\r\nexport class InformationRowDTO extends BaseDTO implements InformationRowDTO {\r\n\tid: number;\r\n\tapplicationRowId?: number;\r\n\tcourseId?: number;\r\n\tnote: string;\r\n\texternalUrl?: string;\r\n\r\n\tconstructor(courseId: number) {\r\n\t\tsuper();\r\n\t\tthis.note = '';\r\n\t\tthis.externalUrl = '';\r\n\t\tthis.courseId = courseId;\r\n\t}\r\n}\r\n","import { ApplicationHeadDTO } from '../../DTO/ApplicationHeadDTO';\r\n\r\nexport interface IApplicationState {\r\n\tapplication: ApplicationHeadDTO;\r\n\tprivileges: Privileges;\r\n\tvalidationMessage: string;\r\n\tisDirty: boolean;\r\n\tserverMessage: string | null;\r\n}\r\n\r\nexport class ApplicationState implements IApplicationState {\r\n\tapplication: ApplicationHeadDTO;\r\n\tprivileges: Privileges;\r\n\tvalidationMessage: string;\r\n\tisDirty: boolean;\r\n\tserverMessage: string | null;\r\n\r\n\tconstructor(args: {\r\n\t\tprivileges: Privileges;\r\n\t\tapplication?: ApplicationHeadDTO;\r\n\t\tvalidationMessage?: string;\r\n\t\tisDirty?: boolean;\r\n\t\tserverMessage?: string | null;\r\n\t}) {\r\n\t\tthis.application = args.application || new ApplicationHeadDTO();\r\n\t\tthis.privileges = args.privileges;\r\n\t\tthis.validationMessage = args.validationMessage ?? '';\r\n\t\tthis.isDirty = args.isDirty || false;\r\n\t\tthis.serverMessage = args.serverMessage || null;\r\n\t}\r\n}\r\n","import React from 'react';\r\nimport { CourseOrigin } from '.';\r\nimport { CourseDTO } from '../../DTO/CourseDTO';\r\nimport { SchoolDTO } from '../../DTO/SchoolDTO';\r\nimport { VerdictDTO } from '../../DTO/VerdictDTO';\r\nimport { ApplicationStatus, EntityState } from '../../util/enumerations';\r\n\r\nexport interface IApplicationHandlers {\r\n\tsetYear: (year: number) => void;\r\n\tsetMasterProgram: (masterTrackId: number) => void;\r\n\thandleSelectSchool: (school: SchoolDTO) => void;\r\n\tsaveApplication: () => void;\r\n\tsetApplicationStatus: (toStatus: ApplicationStatus) => void;\r\n\tgiveVerdict: (idx: number, verdict: VerdictDTO) => void;\r\n\tsaveComment: (idx: number, externalUrl: string) => void;\r\n\tsaveLink: (idx: number, externalUrl: string) => void;\r\n\taddCourse: (idx: number, key: CourseOrigin) => () => void;\r\n\tremoveCourse: (\r\n\t\trowIdx: number,\r\n\t\tkey: CourseOrigin\r\n\t) => (courseIdx: number, courseId: number) => void;\r\n\tupdateCourse: (\r\n\t\trowIdx: number,\r\n\t\tkey: CourseOrigin\r\n\t) => (courseIdx: number, id: number, oldId: number) => void;\r\n\tupdateInformationRow: (rowIdx: number, text: string, idx: number) => void;\r\n\tupdateInformationRowUrl: (rowIdx: number, url: string, idx: number) => void;\r\n\tremoveRow: (idx: number, toState?: EntityState) => void;\r\n\taddRow: () => void;\r\n}\r\n\r\nexport class ApplicationHandlers {\r\n\tsetYear: (year: number) => void;\r\n\tsetMasterProgram: (masterTrackId: number) => void;\r\n\thandleSelectSchool: (school: SchoolDTO) => void;\r\n\tsaveApplication: () => void;\r\n\tsetApplicationStatus: (toStatus: ApplicationStatus) => void;\r\n\tgiveVerdict: (idx: number, verdict: VerdictDTO) => void;\r\n\tsaveComment: (idx: number, externalUrl: string) => void;\r\n\tsaveLink: (idx: number, externalUrl: string) => void;\r\n\taddCourse: (idx: number, key: CourseOrigin) => () => void;\r\n\tremoveCourse: (\r\n\t\trowIdx: number,\r\n\t\tkey: CourseOrigin\r\n\t) => (courseIdx: number, courseId: number) => void;\r\n\tupdateCourse: (\r\n\t\trowIdx: number,\r\n\t\tkey: CourseOrigin\r\n\t) => (courseIdx: number, id: number, oldId: number) => void;\r\n\tupdateInformationRow: (rowIdx: number, text: string, idx: number) => void;\r\n\tupdateInformationRowUrl: (rowIdx: number, url: string, idx: number) => void;\r\n\tremoveRow: (idx: number, toState?: EntityState) => void;\r\n\taddRow: () => void;\r\n\r\n\tconstructor(args: {\r\n\t\tsetYear: (year: number) => void;\r\n\t\tsetMasterProgram: (masterTrackId: number) => void;\r\n\t\thandleSelectSchool: (school: SchoolDTO) => void;\r\n\t\tsaveApplication: () => void;\r\n\t\tsetApplicationStatus: (toStatus: ApplicationStatus) => void;\r\n\t\tgiveVerdict: (idx: number, verdict: VerdictDTO) => void;\r\n\t\tsaveComment: (idx: number, externalUrl: string) => void;\r\n\t\tsaveLink: (idx: number, externalUrl: string) => void;\r\n\t\taddCourse: (idx: number, key: CourseOrigin) => () => void;\r\n\t\tremoveCourse: (\r\n\t\t\trowIdx: number,\r\n\t\t\tkey: CourseOrigin\r\n\t\t) => (courseIdx: number, courseId: number) => void;\r\n\t\tupdateCourse: (\r\n\t\t\trowIdx: number,\r\n\t\t\tkey: CourseOrigin\r\n\t\t) => (courseIdx: number, id: number, oldId: number) => void;\r\n\t\tupdateInformationRow: (\r\n\t\t\trowIdx: number,\r\n\t\t\ttext: string,\r\n\t\t\tidx: number\r\n\t\t) => void;\r\n\t\tupdateInformationRowUrl: (\r\n\t\t\trowIdx: number,\r\n\t\t\turl: string,\r\n\t\t\tidx: number\r\n\t\t) => void;\r\n\t\tremoveRow: (idx: number, toState?: EntityState) => void;\r\n\t\taddRow: () => void;\r\n\t}) {\r\n\t\tthis.setYear = args.setYear;\r\n\t\tthis.setMasterProgram = args.setMasterProgram;\r\n\t\tthis.handleSelectSchool = args.handleSelectSchool;\r\n\t\tthis.saveApplication = args.saveApplication;\r\n\t\tthis.setApplicationStatus = args.setApplicationStatus;\r\n\t\tthis.saveComment = args.saveComment;\r\n\t\tthis.saveLink = args.saveLink;\r\n\t\tthis.addCourse = args.addCourse;\r\n\t\tthis.removeCourse = args.removeCourse;\r\n\t\tthis.updateCourse = args.updateCourse;\r\n\t\tthis.updateInformationRow = args.updateInformationRow;\r\n\t\tthis.updateInformationRowUrl = args.updateInformationRowUrl;\r\n\t\tthis.removeRow = args.removeRow;\r\n\t\tthis.addRow = args.addRow;\r\n\t\tthis.giveVerdict = args.giveVerdict;\r\n\t}\r\n}\r\n\r\nexport class MockApplicationHandlers implements IApplicationHandlers {\r\n\tsetYear: (year: number) => void;\r\n\tsetMasterProgram: (masterTrackId: number) => void;\r\n\thandleSelectSchool: (school: SchoolDTO) => void;\r\n\tsaveApplication: () => void;\r\n\tsetApplicationStatus: (toStatus: ApplicationStatus) => void;\r\n\tgiveVerdict: (idx: number, verdict: VerdictDTO) => void;\r\n\tsaveComment: (idx: number, externalUrl: string) => void;\r\n\tsaveLink: (idx: number, externalUrl: string) => void;\r\n\taddCourse: (idx: number, key: CourseOrigin) => () => void;\r\n\tremoveCourse: (\r\n\t\trowIdx: number,\r\n\t\tkey: CourseOrigin\r\n\t) => (courseIdx: number, courseId: number) => void;\r\n\tupdateCourse: (\r\n\t\trowIdx: number,\r\n\t\tkey: CourseOrigin\r\n\t) => (courseIdx: number, id: number, oldId: number) => void;\r\n\tupdateInformationRow: (rowIdx: number, text: string, idx: number) => void;\r\n\tupdateInformationRowUrl: (rowIdx: number, url: string, idx: number) => void;\r\n\tremoveRow: (idx: number, toState?: EntityState) => void;\r\n\taddRow: () => void;\r\n\r\n\tconstructor(overrides?: {\r\n\t\tsetYear?: (year: number) => void;\r\n\t\tsetMasterProgram?: (masterTrackId: number) => void;\r\n\t\thandleSelectSchool?: (school: SchoolDTO) => void;\r\n\t\tsaveApplication?: () => void;\r\n\t\tsetApplicationStatus?: (toStatus: ApplicationStatus) => void;\r\n\t\tgiveVerdict?: (idx: number, verdict: VerdictDTO) => void;\r\n\t\tsaveComment?: (idx: number, externalUrl: string) => void;\r\n\t\tsaveLink?: (idx: number, externalUrl: string) => void;\r\n\t\taddCourse?: (idx: number, key: CourseOrigin) => () => void;\r\n\t\tremoveCourse?: (\r\n\t\t\trowIdx: number,\r\n\t\t\tkey: CourseOrigin\r\n\t\t) => (courseIdx: number, courseId: number) => void;\r\n\t\tupdateCourse?: (\r\n\t\t\trowIdx: number,\r\n\t\t\tkey: CourseOrigin\r\n\t\t) => (courseIdx: number, id: number, oldId: number) => void;\r\n\t\tupdateInformationRow?: (\r\n\t\t\trowIdx: number,\r\n\t\t\ttext: string,\r\n\t\t\tidx: number\r\n\t\t) => void;\r\n\t\tupdateInformationRowUrl?: (\r\n\t\t\trowIdx: number,\r\n\t\t\turl: string,\r\n\t\t\tidx: number\r\n\t\t) => void;\r\n\t\tremoveRow?: (idx: number, toState?: EntityState) => void;\r\n\t\taddRow?: () => void;\r\n\t}) {\r\n\t\tthis.setYear = overrides?.setYear || ((y: number) => null);\r\n\t\tthis.setMasterProgram =\r\n\t\t\toverrides?.setMasterProgram || ((mt: number) => null);\r\n\t\tthis.handleSelectSchool =\r\n\t\t\toverrides?.handleSelectSchool || ((s: SchoolDTO) => null);\r\n\t\tthis.saveApplication = overrides?.saveApplication || (() => null);\r\n\t\tthis.setApplicationStatus =\r\n\t\t\toverrides?.setApplicationStatus || ((s: ApplicationStatus) => null);\r\n\t\tthis.giveVerdict =\r\n\t\t\toverrides?.giveVerdict || ((i: number, v: VerdictDTO) => null);\r\n\t\tthis.saveComment =\r\n\t\t\toverrides?.saveComment || ((i: number, u: string) => null);\r\n\t\tthis.saveLink = overrides?.saveLink || ((i: number, u: string) => null);\r\n\t\tthis.addCourse = (i: number, key: CourseOrigin) => () => null;\r\n\t\tthis.removeCourse =\r\n\t\t\t(r: number, key: CourseOrigin) => (c: number, cId: number) =>\r\n\t\t\t\tnull;\r\n\t\tthis.updateCourse =\r\n\t\t\t(rowIdx: number, key: CourseOrigin) =>\r\n\t\t\t(c: number, cId: number, oId: number) =>\r\n\t\t\t\tnull;\r\n\t\tthis.updateInformationRow =\r\n\t\t\toverrides?.updateInformationRow ||\r\n\t\t\t((r: number, t: string, i: number) => null);\r\n\t\tthis.updateInformationRowUrl =\r\n\t\t\toverrides?.updateInformationRowUrl ||\r\n\t\t\t((r: number, u: string, i: number) => null);\r\n\t\tthis.removeRow =\r\n\t\t\toverrides?.removeRow || ((i: number, s?: EntityState) => null);\r\n\r\n\t\tthis.addRow = overrides?.addRow || (() => null);\r\n\t}\r\n}\r\n","import React from 'react';\r\nimport Application from '../components/application';\r\nimport { Typography } from '@material-ui/core';\r\nimport { useAuth } from '../contexts';\r\nimport { ApplicationHeadDTO } from '../DTO/ApplicationHeadDTO';\r\n\r\n// default values\r\nconst privileges: Privileges = {\r\n\taddCourses: true,\r\n\teditRows: true,\r\n\teditCourses: true,\r\n\tgiveVerdict: false,\r\n};\r\n\r\nconst CreateApplication = () => {\r\n\tconst { user } = useAuth();\r\n\tconst [application, setApplication] = React.useState(\r\n\t\tuser ? new ApplicationHeadDTO(user) : new ApplicationHeadDTO()\r\n\t);\r\n\tprivileges.giveVerdict = !!user?.isAdmin;\r\n\r\n\treturn (\r\n\t\t
\r\n\t\t\t\r\n\t\t\t\tNew Application\r\n\t\t\t\r\n\t\t\t\r\n\t\t
\r\n\t);\r\n};\r\n\r\nexport default CreateApplication;\r\n","import React, { useState, useEffect } from 'react';\r\nimport { useRouteMatch } from 'react-router';\r\n\r\nimport Typography from '@material-ui/core/Typography';\r\nimport { APIService } from '../services/apiService';\r\nimport { ApplicationHeadDTO } from '../DTO/ApplicationHeadDTO';\r\nimport Application from '../components/application';\r\nimport { useAuth } from '../contexts';\r\nimport { ApplicationStatus } from '../util/enumerations';\r\n\r\nconst api = new APIService();\r\n\r\nconst SingleApplication = () => {\r\n\tconst match = useRouteMatch<{ id?: string }>();\r\n\tconst { user } = useAuth();\r\n\tconst [application, setApplication] =\r\n\t\tReact.useState(null);\r\n\r\n\tconst canEdit = (applicationStatus?: ApplicationStatus) =>\r\n\t\t!!(\r\n\t\t\t!user?.isAdmin &&\r\n\t\t\tapplication &&\r\n\t\t\tapplicationStatus &&\r\n\t\t\t[ApplicationStatus.New, ApplicationStatus.IsBeingEdited].includes(\r\n\t\t\t\tapplicationStatus\r\n\t\t\t)\r\n\t\t);\r\n\r\n\tconst editMode = canEdit(application?.status);\r\n\r\n\tconst [privileges, setPrivileges] = useState({\r\n\t\taddCourses: editMode,\r\n\t\teditRows: editMode,\r\n\t\teditCourses: editMode,\r\n\t\tgiveVerdict:\r\n\t\t\t!!user?.isAdmin &&\r\n\t\t\tapplication?.status === ApplicationStatus.PendingApproval,\r\n\t});\r\n\tuseEffect(() => {\r\n\t\tif (match.params.id) {\r\n\t\t\tapi.getApplicationById(parseInt(match.params.id)).then((app) =>\r\n\t\t\t\tsetApplication(app)\r\n\t\t\t);\r\n\t\t}\r\n\t}, [match.params.id]);\r\n\r\n\tconst handleStatusUpdate = (newStatus: ApplicationStatus) => {\r\n\t\tconst editMode = canEdit(newStatus);\r\n\t\tsetPrivileges({\r\n\t\t\taddCourses: editMode,\r\n\t\t\teditRows: editMode,\r\n\t\t\teditCourses: editMode,\r\n\t\t\tgiveVerdict:\r\n\t\t\t\t!!user?.isAdmin &&\r\n\t\t\t\tnewStatus === ApplicationStatus.PendingApproval,\r\n\t\t});\r\n\t};\r\n\r\n\tif (!application) return

Retrieving study plan...

;\r\n\r\n\treturn (\r\n\t\t<>\r\n\t\t\t\r\n\t\t\t\t{`${application.id ? '' : 'New '}Application`}\r\n\t\t\t\r\n\t\t\t\r\n\t\t\r\n\t);\r\n};\r\n\r\nexport default SingleApplication;\r\n","import React, { useState } from 'react';\r\nimport { Link } from 'react-router-dom';\r\n\r\nimport { Container } from '../components/_atoms';\r\nimport { ROUTES } from '../constants';\r\nimport SearchComponent from '../components/Search';\r\nimport { GridColDef, DataGrid, GridToolbar } from '@mui/x-data-grid';\r\nimport { Button, FormGroup, Typography } from '@material-ui/core';\r\nimport { getDateAndTime } from '../util/dateHelper';\r\nimport { useSchools } from '../contexts';\r\n\r\nconst colDefs: GridColDef[] = [\r\n\t{ field: 'id', headerName: 'ID', type: 'number', flex: 0.5, minWidth: 50 },\r\n\t{ field: 'name', headerName: 'Name', flex: 1, minWidth: 200 },\r\n\t{\r\n\t\tfield: 'created',\r\n\t\theaderName: 'Created',\r\n\t\ttype: 'dateTime',\r\n\r\n\t\tflex: 1,\r\n\t\tminWidth: 200,\r\n\t\tvalueGetter: (params) =>\r\n\t\t\tparams.value ? new Date(params.value as string) : null,\r\n\t},\r\n\t{\r\n\t\tfield: 'modified',\r\n\t\theaderName: 'Modified',\r\n\t\tflex: 1,\r\n\t\ttype: 'dateTime',\r\n\t\tminWidth: 200,\r\n\t\tvalueGetter: (params) =>\r\n\t\t\tparams.value ? new Date(params.value as string) : null,\r\n\t},\r\n\t{\r\n\t\tfield: 'country',\r\n\t\theaderName: 'Country',\r\n\t\tflex: 1,\r\n\t\tminWidth: 200,\r\n\t\tvalueGetter: (params) => params.row?.country?.name,\r\n\t},\r\n\t{\r\n\t\tfield: 'edit',\r\n\t\theaderName: 'Open',\r\n\t\tflex: 1,\r\n\t\tminWidth: 100,\r\n\t\trenderCell: (params) => (\r\n\t\t\t\r\n\t\t\t\tOpen\r\n\t\t\t\r\n\t\t),\r\n\t},\r\n\t{\r\n\t\tfield: 'courses',\r\n\t\theaderName: 'Courses',\r\n\t\tflex: 1,\r\n\t\tminWidth: 100,\r\n\t\trenderCell: (params) => (\r\n\t\t\t\r\n\t\t\t\tCourses\r\n\t\t\t\r\n\t\t),\r\n\t},\r\n];\r\n\r\nconst Schools = () => {\r\n\tconst schools = useSchools();\r\n\r\n\tif (!schools) return null;\r\n\treturn (\r\n\t\t\r\n\t\t\t\r\n\t\t\t\tUniversities\r\n\t\t\t\r\n\t\t\t\r\n\t\t\t\t\r\n\t\t\t\t\tCreate new\r\n\t\t\t\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t\t\t\r\n\t\t\t\r\n\t\t\r\n\t);\r\n};\r\n\r\nexport default Schools;\r\n","import React, { useState, useEffect } from 'react';\r\nimport { Link, useRouteMatch } from 'react-router-dom';\r\n\r\nimport { GridColDef, DataGrid, GridToolbar } from '@mui/x-data-grid';\r\nimport Button from '@material-ui/core/Button';\r\n\r\n// import { APIService } from \"../services/apiService\";\r\nimport { Container } from '../components/_atoms';\r\nimport { ROUTES } from '../constants';\r\nimport { CourseDTO } from '../DTO/CourseDTO';\r\nimport { APIService } from '../services/apiService';\r\nimport { FormGroup, Typography } from '@material-ui/core';\r\nimport { levelName, levelNames } from '../util/enumerations';\r\n\r\nconst colDefs: GridColDef[] = [\r\n\t{ field: 'id', headerName: 'ID', type: 'number', flex: 0.5, minWidth: 50 },\r\n\t{\r\n\t\tfield: 'schoolId',\r\n\t\theaderName: 'School ID',\r\n\t\ttype: 'number',\r\n\t\tflex: 0.8,\r\n\t\tminWidth: 100,\r\n\t},\r\n\t{ field: 'code', headerName: 'Code', flex: 1, minWidth: 100 },\r\n\t{ field: 'title', headerName: 'Title', flex: 1, minWidth: 200 },\r\n\t{\r\n\t\tfield: 'localCredits',\r\n\t\theaderName: 'Credits',\r\n\t\ttype: 'number',\r\n\t\tflex: 0.5,\r\n\t\tminWidth: 125,\r\n\t},\r\n\t{\r\n\t\tfield: 'level',\r\n\t\theaderName: 'Level',\r\n\t\ttype: 'singleSelect',\r\n\t\tvalueOptions: levelNames(),\r\n\t\tvalueGetter: (params) => levelName(Number(params.value)),\r\n\t\tflex: 1,\r\n\t\tminWidth: 100,\r\n\t},\r\n\t{\r\n\t\tfield: 'coursePage',\r\n\t\theaderName: 'Open',\r\n\t\tflex: 1,\r\n\t\tminWidth: 50,\r\n\t\trenderCell: (params) => (\r\n\t\t\t\r\n\t\t\t\tOpen\r\n\t\t\t\r\n\t\t),\r\n\t},\r\n];\r\n\r\nconst Courses = () => {\r\n\tconst match = useRouteMatch<{ schoolId: string }>();\r\n\tconst [schoolId, setSchoolId] = useState(\r\n\t\tNumber(match.params.schoolId) || 0\r\n\t);\r\n\tconst [courses, setCourses] = useState([]);\r\n\tconst api = new APIService();\r\n\r\n\tconst getCourses = (newSchoolId: number = schoolId) => {\r\n\t\tsetSchoolId(newSchoolId);\r\n\t\tif (newSchoolId > 0) {\r\n\t\t\tapi.getCoursesBySchoolId(newSchoolId).then((data) => {\r\n\t\t\t\tsetCourses(data);\r\n\t\t\t});\r\n\t\t} else {\r\n\t\t\tapi.getCourses().then((data) => {\r\n\t\t\t\tsetCourses(data);\r\n\t\t\t});\r\n\t\t}\r\n\t};\r\n\r\n\tuseEffect(() => {\r\n\t\tgetCourses();\r\n\t}, []);\r\n\r\n\treturn (\r\n\t\t<>\r\n\t\t\t\r\n\t\t\t\tCourses\r\n\t\t\t\r\n\t\t\t\r\n\t\t\t\t
\r\n\t\t\t\t\t\r\n\t\t\t\t\t\tCreate new\r\n\t\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t\t\tShow all schools\r\n\t\t\t\t\t\r\n\t\t\t\t\t{schoolId > 0 && (\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\tShow all courses\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t)}\r\n\t\t\t\t
\r\n\t\t\t
\r\n\t\t\t\r\n\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\r\n\t\t\r\n\t);\r\n};\r\n\r\nexport default Courses;\r\n","import React, { useState, useEffect } from 'react';\r\nimport { useHistory, useRouteMatch } from 'react-router';\r\n\r\nimport Course from '../components/course';\r\nimport { ROUTES } from '../constants';\r\nimport { CourseDTO } from '../DTO/CourseDTO';\r\nimport { APIService } from '../services/apiService';\r\n\r\n// TODO: remove this?\r\nconst api = new APIService();\r\nconst SingleCourse = () => {\r\n\tconst match = useRouteMatch<{ courseId?: string }>();\r\n\tconst history = useHistory();\r\n\tconst [course, setCourse] = useState(null);\r\n\tconst [error, setError] = useState('');\r\n\r\n\tconst onCreateCourse = (newCourse: CourseDTO) => {\r\n\t\tcourse?.id === 0 && history.push(`${ROUTES.COURSE}/${newCourse.id}`);\r\n\t};\r\n\r\n\tuseEffect(() => {\r\n\t\tconst parsedCourseId = Number(match.params.courseId);\r\n\t\tif (isNaN(parsedCourseId)) {\r\n\t\t\tsetError('Invalid course id');\r\n\t\t} else {\r\n\t\t\tif (parsedCourseId > 0) {\r\n\t\t\t\tapi.getCourseById(parsedCourseId).then((data) => {\r\n\t\t\t\t\tsetCourse(data);\r\n\t\t\t\t});\r\n\t\t\t} else {\r\n\t\t\t\tsetCourse(new CourseDTO());\r\n\t\t\t}\r\n\t\t}\r\n\t}, [match.params.courseId]);\r\n\r\n\tconst renderContent = () => {\r\n\t\tif (error) return

{error}

;\r\n\t\tif (!course) return null;\r\n\t\treturn (\r\n\t\t\t\r\n\t\t);\r\n\t};\r\n\r\n\treturn (\r\n\t\t<>\r\n\t\t\t

\r\n\t\t\t\t{course\r\n\t\t\t\t\t? course.id\r\n\t\t\t\t\t\t? `${course.code} - ${course.title}`\r\n\t\t\t\t\t\t: 'Create course'\r\n\t\t\t\t\t: 'Loading course...'}\r\n\t\t\t

\r\n\t\t\t{renderContent()}\r\n\t\t\r\n\t);\r\n};\r\n\r\nexport default SingleCourse;\r\n","import React from 'react';\r\nimport { Link } from 'react-router-dom';\r\n\r\nconst notFound = () => {\r\n\treturn (\r\n\t\t
\r\n\t\t\t

404 - The page could not be found

\r\n\t\t\tReturn Home\r\n\t\t
\r\n\t);\r\n};\r\n\r\nexport default notFound;\r\n","import React, { useState, useEffect } from 'react';\r\nimport { Link } from 'react-router-dom';\r\n\r\nimport { GridColDef, DataGrid, GridToolbar } from '@mui/x-data-grid';\r\nimport { Button, Typography } from '@material-ui/core';\r\n\r\nimport { Container } from '../components/_atoms';\r\nimport SearchComponent from '../components/Search';\r\nimport { ROUTES } from '../constants';\r\nimport { UserDTO } from '../DTO/UserDTO';\r\nimport { APIService } from '../services/apiService';\r\n\r\nconst colDefs: GridColDef[] = [\r\n\t{ field: 'id', headerName: 'ID', type: 'number', minWidth: 50 },\r\n\t{ field: 'name', headerName: 'Name', flex: 1, minWidth: 200 },\r\n\t{ field: 'email', headerName: 'Email', flex: 1, minWidth: 160 },\r\n\t{\r\n\t\tfield: 'isAdmin',\r\n\t\theaderName: 'Admin',\r\n\t\ttype: 'boolean',\r\n\t\tminWidth: 120,\r\n\t},\r\n\t{\r\n\t\tfield: 'edit',\r\n\t\theaderName: ' ',\r\n\t\twidth: 100,\r\n\t\trenderCell: (params) => (\r\n\t\t\t\r\n\t\t\t\tEdit\r\n\t\t\t\r\n\t\t),\r\n\t},\r\n];\r\n\r\nconst api = new APIService();\r\n\r\nconst Users = () => {\r\n\tconst [users, setUsers] = useState([]);\r\n\r\n\tuseEffect(() => {\r\n\t\tapi.getUsers().then((data) => {\r\n\t\t\tsetUsers(data);\r\n\t\t});\r\n\t}, []);\r\n\r\n\treturn (\r\n\t\t\r\n\t\t\t\r\n\t\t\t\tUsers\r\n\t\t\t\r\n\t\t\t\r\n\t\t\t\t\r\n\t\t\t\r\n\t\t\r\n\t);\r\n};\r\n\r\nexport default Users;\r\n","import { IBaseDTO, BaseDTO } from './BaseDTO';\r\nimport { CountryDTO } from './CountryDTO';\r\n\r\nexport interface ISchoolDTO extends IBaseDTO {\r\n\tid: number;\r\n\tname: string;\r\n\tcountry: CountryDTO;\r\n}\r\n\r\nexport class SchoolDTO extends BaseDTO implements ISchoolDTO {\r\n\tid: number;\r\n\tname: string;\r\n\tcountry: CountryDTO;\r\n\r\n\tconstructor() {\r\n\t\tsuper();\r\n\t\tthis.id = 0;\r\n\t\tthis.name = '';\r\n\t}\r\n}\r\n","import React, { useState, useEffect } from 'react';\r\nimport { Link, useRouteMatch, useHistory } from 'react-router-dom';\r\n\r\nimport { Container } from '../components/_atoms';\r\nimport { ROUTES } from '../constants';\r\nimport { SchoolDTO } from '../DTO/SchoolDTO';\r\nimport LastEdited from '../components/lastEdited';\r\n\r\nimport Button from '@material-ui/core/Button';\r\nimport TextField from '@material-ui/core/TextField';\r\nimport Autocomplete from '@material-ui/lab/Autocomplete';\r\nimport { FormGroup, makeStyles, Typography } from '@material-ui/core';\r\nimport { APIService } from '../services/apiService';\r\nimport { CountryDTO } from '../DTO/CountryDTO';\r\nimport { useSchools, useUpdateSchools } from '../contexts';\r\nimport { useIsDirty } from '../hooks/isDirty';\r\n\r\nconst useStyles = makeStyles({\r\n\tbutton: {\r\n\t\tmargin: '12px 6px 18px 0',\r\n\t},\r\n\tfield: {\r\n\t\tmarginBottom: '12px',\r\n\t\tmarginRight: '12px',\r\n\t\tdisplay: 'block',\r\n\t},\r\n});\r\n\r\nconst api = new APIService();\r\n\r\nconst School = () => {\r\n\tconst match = useRouteMatch<{ id?: string }>();\r\n\tconst history = useHistory();\r\n\tconst { saveSchool } = useUpdateSchools();\r\n\tconst schools = useSchools();\r\n\tconst schoolId: number = match.params.id ? parseInt(match.params.id) : 0;\r\n\r\n\tconst [school, setSchool] = useState(\r\n\t\tschoolId > 0\r\n\t\t\t? schools?.find((s) => s.id == schoolId) || new SchoolDTO()\r\n\t\t\t: new SchoolDTO()\r\n\t);\r\n\tconst [error, setError] = useState('');\r\n\tconst [countries, setCountries] = useState(null);\r\n\tconst classes = useStyles();\r\n\tconst [isDirty, updateCleanValue] = useIsDirty(school);\r\n\r\n\tuseEffect(() => {\r\n\t\tif (countries === null) {\r\n\t\t\tapi.getCountries().then((data) => setCountries(data));\r\n\t\t}\r\n\t});\r\n\r\n\tuseEffect(() => {\r\n\t\tconst parsedId = match.params.id && parseInt(match.params.id);\r\n\t\tif (parsedId && parsedId > 0 && schools) {\r\n\t\t\tconst activeSchool = schools?.find((s) => s.id == parsedId);\r\n\t\t\tif (activeSchool) {\r\n\t\t\t\tupdateCleanValue(activeSchool);\r\n\t\t\t\tsetSchool(activeSchool);\r\n\t\t\t}\r\n\t\t}\r\n\t}, [match.params?.id, schools]);\r\n\r\n\tconst handleSubmit = (e: React.FormEvent) => {\r\n\t\tsaveSchool(school)\r\n\t\t\t.then((newSchool) => {\r\n\t\t\t\tsetSchool(newSchool);\r\n\t\t\t\tupdateCleanValue(newSchool);\r\n\t\t\t\tif (school.id === 0) {\r\n\t\t\t\t\thistory.replace(`${ROUTES.SCHOOL}/${newSchool.id}`);\r\n\t\t\t\t}\r\n\t\t\t})\r\n\t\t\t.catch((ex) => {\r\n\t\t\t\tsetError(ex.response.data.message);\r\n\t\t\t});\r\n\t\te.preventDefault();\r\n\t};\r\n\r\n\tconst setSchoolName = (name: string) => {\r\n\t\tsetSchool((prevSchool) => ({ ...prevSchool, name }));\r\n\t};\r\n\r\n\treturn !school ? (\r\n\t\t

Could not find school

\r\n\t) : (\r\n\t\t\r\n\t\t\t\r\n\t\t\t\t{schoolId === 0 ? 'Create New ' : ''}University\r\n\t\t\t\r\n\t\t\t\r\n\t\t\t\tCourses\r\n\t\t\t\r\n\t\t\t
\r\n\t\t\t\t\r\n\t\t\t\t\t setSchoolName(e.target.value)}\r\n\t\t\t\t\t/>\r\n\t\t\t\t\t{countries && countries.length > 0 ? (\r\n\t\t\t\t\t\t {\r\n\t\t\t\t\t\t\t\tif (!countries) return;\r\n\t\t\t\t\t\t\t\tconst country = countries.find(\r\n\t\t\t\t\t\t\t\t\t(c) => c.name == newValue\r\n\t\t\t\t\t\t\t\t);\r\n\t\t\t\t\t\t\t\tsetSchool(\r\n\t\t\t\t\t\t\t\t\t(prevSchool) =>\r\n\t\t\t\t\t\t\t\t\t\t({\r\n\t\t\t\t\t\t\t\t\t\t\t...prevSchool,\r\n\t\t\t\t\t\t\t\t\t\t\tcountry,\r\n\t\t\t\t\t\t\t\t\t\t\tcountryId: country?.id,\r\n\t\t\t\t\t\t\t\t\t\t} as SchoolDTO)\r\n\t\t\t\t\t\t\t\t);\r\n\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\toptions={countries.map((option) => option.name)}\r\n\t\t\t\t\t\t\trenderInput={(params) => (\r\n\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t)}\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t) : null}\r\n\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\t\tSave\r\n\t\t\t\t\r\n\t\t\t\r\n\r\n\t\t\t\r\n\t\t\t

{error}

\r\n\t\t
\r\n\t);\r\n};\r\n\r\nexport default School;\r\n","import { BaseDTO } from './BaseDTO';\r\n\r\nexport interface IUserDTO extends BaseDTO {\r\n\tid: number;\r\n\tname: string;\r\n\temail: string;\r\n\tisAdmin: boolean;\r\n}\r\n\r\nexport class UserDTO extends BaseDTO implements IUserDTO {\r\n\tid: number;\r\n\tname: string;\r\n\temail: string;\r\n\tisAdmin: boolean;\r\n\r\n\tconstructor(id?: number) {\r\n\t\tsuper();\r\n\t\tthis.id = id || 0;\r\n\t\tthis.name = '';\r\n\t\tthis.email = '';\r\n\t}\r\n}\r\n","import React, { useState, useEffect } from 'react';\r\nimport { Link, useRouteMatch } from 'react-router-dom';\r\n\r\nimport { Container } from '../components/_atoms';\r\nimport { ROUTES } from '../constants';\r\nimport { UserDTO } from '../DTO/UserDTO';\r\nimport { APIService } from '../services/apiService';\r\nimport { AdminLevels } from '../util/enumerations';\r\nimport LastEdited from '../components/lastEdited';\r\n\r\nimport {\r\n\tButton,\r\n\tFormControl,\r\n\tFormGroup,\r\n\tInputLabel,\r\n\tmakeStyles,\r\n\tMenuItem,\r\n\tTextField,\r\n} from '@material-ui/core';\r\nimport Select from '@material-ui/core/Select';\r\nimport { useIsDirty } from '../hooks/isDirty';\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n\tfield: {\r\n\t\tmarginBottom: '12px',\r\n\t\tmarginRight: '12px',\r\n\t},\r\n\tbutton: {\r\n\t\tmargin: '12px 6px 18px 0',\r\n\t},\r\n\tformControl: {\r\n\t\tmargin: theme.spacing(1),\r\n\t\tminWidth: 120,\r\n\t},\r\n\tselectEmpty: {\r\n\t\tmarginTop: theme.spacing(2),\r\n\t},\r\n}));\r\n\r\nconst User = () => {\r\n\tconst match = useRouteMatch<{ id?: string }>();\r\n\tconst userId: number = Number(match.params.id) || 0;\r\n\tconst api = new APIService();\r\n\tconst classes = useStyles();\r\n\r\n\tconst [user, setUser] = useState(null);\r\n\tconst [error, setError] = useState({ message: '' });\r\n\tconst [isDirty, updateCleanValue] = useIsDirty(user);\r\n\r\n\tuseEffect(() => {\r\n\t\tif (userId > 0) {\r\n\t\t\tapi.getUserById(userId).then((data) => {\r\n\t\t\t\tsetUser(data);\r\n\t\t\t\tupdateCleanValue(data);\r\n\t\t\t});\r\n\t\t} else {\r\n\t\t\tconst newUser = new UserDTO();\r\n\t\t\tsetUser(newUser);\r\n\t\t\tupdateCleanValue(newUser);\r\n\t\t}\r\n\t}, []);\r\n\r\n\tconst handleSubmit = (event: React.FormEvent) => {\r\n\t\tif (!user) return;\r\n\t\tapi.saveUser(user)\r\n\t\t\t.then((data) => {\r\n\t\t\t\tsetUser(data);\r\n\t\t\t\tsetError({ message: '' });\r\n\t\t\t})\r\n\t\t\t.catch((error) => {\r\n\t\t\t\tsetError({ message: 'Error: ' + error.response.data.message });\r\n\t\t\t});\r\n\r\n\t\tif (event) event.preventDefault();\r\n\t};\r\n\r\n\treturn !user ? (\r\n\t\t

Could not find user

\r\n\t) : (\r\n\t\t\r\n\t\t\t

{user.name}

\r\n\t\t\t
\r\n\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t\t\tAdmin\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\tsetUser(\r\n\t\t\t\t\t\t\t\t\t(prevUser) =>\r\n\t\t\t\t\t\t\t\t\t\t({\r\n\t\t\t\t\t\t\t\t\t\t\t...prevUser,\r\n\t\t\t\t\t\t\t\t\t\t\tisAdmin: Boolean(\r\n\t\t\t\t\t\t\t\t\t\t\t\tNumber(e.target.value)\r\n\t\t\t\t\t\t\t\t\t\t\t),\r\n\t\t\t\t\t\t\t\t\t\t} as UserDTO)\r\n\t\t\t\t\t\t\t\t)\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t{AdminLevels.map((u) => (\r\n\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t{u.isAdmin ? 'Yes' : 'No'}\r\n\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t))}\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\t
\r\n\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\t\tSave\r\n\t\t\t\t\r\n\t\t\t\t

{error.message}

\r\n\t\t\t\r\n\t\t
\r\n\t);\r\n};\r\n\r\nexport default User;\r\n","import {\r\n\tButton,\r\n\tCard,\r\n\tFormGroup,\r\n\tIconButton,\r\n\tTextField,\r\n\tTypography,\r\n} from '@material-ui/core';\r\nimport React from 'react';\r\nimport EditIcon from '@material-ui/icons/Edit';\r\nimport AddCircleOutlineIcon from '@material-ui/icons/AddCircleOutline';\r\n\r\nimport { Link } from 'react-router-dom';\r\nimport { ROUTES } from '../constants';\r\nimport { ApplicationHeadDTO } from '../DTO/ApplicationHeadDTO';\r\nimport { APIService } from '../services/apiService';\r\nimport { appStatusDescription, appStatusName } from '../util/enumerations';\r\nimport { Alert, AlertTitle } from '@material-ui/lab';\r\nimport { useAuth } from '../contexts/auth';\r\n\r\nconst api = new APIService();\r\nconst margin = {\r\n\tmarginBottom: '12px',\r\n\tmarginRight: '12px',\r\n};\r\n\r\nconst Home = () => {\r\n\tconst { user } = useAuth();\r\n\tconst [latestApplication, setLatestApplication] =\r\n\t\tReact.useState(null);\r\n\r\n\tReact.useEffect(() => {\r\n\t\tif (user) {\r\n\t\t\tapi.getApplicationLatest().then((app) => setLatestApplication(app));\r\n\t\t}\r\n\t}, [user]);\r\n\tif (user) {\r\n\t\treturn (\r\n\t\t\t
\r\n\t\t\t\t\r\n\t\t\t\t\tWelcome, {user.name}\r\n\t\t\t\t\r\n\t\t\t\t{latestApplication ? (\r\n\t\t\t\t\t<>\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\tStatus\r\n\t\t\t\t\t\t\t\t{appStatusDescription(latestApplication.status)}\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t) : (\r\n\t\t\t\t\t<>\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\tStatus\r\n\t\t\t\t\t\t\t\tPlease continue by creating a new application\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t
\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\tCreate application\r\n\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t
\r\n\t\t\t\t\t\r\n\t\t\t\t)}\r\n\t\t\t
\r\n\t\t);\r\n\t} else {\r\n\t\treturn (\r\n\t\t\t
\r\n\t\t\t\t\r\n\t\t\t\t\tWelcome\r\n\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\t\tPlease continue by logging in using your KTH credentials.\r\n\t\t\t\t\r\n\t\t\t
\r\n\t\t);\r\n\t}\r\n};\r\n\r\nexport default Home;\r\n","import React, { useState, useEffect } from 'react';\r\nimport { Link } from 'react-router-dom';\r\n\r\n// import { APIService } from \"../services/apiService\";\r\nimport { Container } from '../components/_atoms';\r\nimport { ROUTES } from '../constants';\r\nimport { APIService } from '../services/apiService';\r\nimport { ApplicationHeadDTO } from '../DTO/ApplicationHeadDTO';\r\nimport { GridColDef, DataGrid, GridToolbar } from '@mui/x-data-grid';\r\nimport { getDateAndTime } from '../util/dateHelper';\r\nimport { Button, Input, Typography } from '@material-ui/core';\r\nimport { appStatusName, getAppStatusNames } from '../util/enumerations';\r\n\r\nconst api = new APIService();\r\n\r\nconst colDefs: GridColDef[] = [\r\n\t{\r\n\t\tfield: 'edit',\r\n\t\theaderName: 'Open',\r\n\t\tminWidth: 110,\r\n\t\trenderCell: (params) => (\r\n\t\t\t\r\n\t\t\t\tOpen\r\n\t\t\t\r\n\t\t),\r\n\t},\r\n\t{\r\n\t\tfield: 'print',\r\n\t\theaderName: 'Print',\r\n\t\tminWidth: 110,\r\n\t\trenderCell: (params) => (\r\n\t\t\t\r\n\t\t\t\tPrint\r\n\t\t\t\r\n\t\t),\r\n\t},\r\n\t{ field: 'id', headerName: 'ID', width: 50, type: 'number' },\r\n\t{\r\n\t\tfield: 'userName',\r\n\t\theaderName: 'Student',\r\n\t\ttype: 'string',\r\n\t\twidth: 200,\r\n\t\tvalueGetter: (params) => params.row?.user.name,\r\n\t},\r\n\t{\r\n\t\tfield: 'schoolName',\r\n\t\theaderName: 'University',\r\n\t\twidth: 140,\r\n\t\tvalueGetter: (params) => params.row?.school.name,\r\n\t},\r\n\t{\r\n\t\tfield: 'status',\r\n\t\theaderName: 'Status',\r\n\t\ttype: 'singleSelect',\r\n\t\twidth: 120,\r\n\t\tvalueOptions: getAppStatusNames(),\r\n\t\tvalueGetter: (params) => appStatusName(params.row?.status),\r\n\t},\r\n\t{ field: 'total', headerName: 'Total rows', width: 150 },\r\n\t{ field: 'unhandled', headerName: 'Unhandled rows', width: 100 },\r\n\t{\r\n\t\tfield: 'created',\r\n\t\ttype: 'date',\r\n\t\theaderName: 'Created',\r\n\t\twidth: 200,\r\n\t\tvalueGetter: (params) =>\r\n\t\t\tparams.value ? new Date(params.value as string) : null,\r\n\t},\r\n\t{\r\n\t\tfield: 'modified',\r\n\t\theaderName: 'Modified',\r\n\t\ttype: 'date',\r\n\t\twidth: 200,\r\n\t\tvalueGetter: (params) =>\r\n\t\t\tparams.value ? new Date(params.value as string) : null,\r\n\t},\r\n];\r\n\r\nconst ApplicationsAdmin = () => {\r\n\tconst [applications, setApplications] = useState<\r\n\t\tApplicationHeadDTO[] | null\r\n\t>(null);\r\n\r\n\tconst getApplications = () => {\r\n\t\tapi.getApplications().then((data) => setApplications(data));\r\n\t};\r\n\r\n\tuseEffect(() => {\r\n\t\tgetApplications();\r\n\t}, []);\r\n\r\n\tif (!applications) return

Fetching applications...

;\r\n\treturn (\r\n\t\t\r\n\t\t\t\r\n\t\t\t\tApplications\r\n\t\t\t\r\n\t\t\t\r\n\t\t\t\t\r\n\t\t\t\r\n\t\t\r\n\t);\r\n};\r\n\r\nexport default ApplicationsAdmin;\r\n","import React, { useState, useEffect } from 'react';\r\nimport { Button, Paper, TextField, Typography } from '@material-ui/core';\r\nimport { Link } from 'react-router-dom';\r\nimport ApplicationRow from '../components/application/row/row';\r\nimport { ApplicationRowExDTO } from '../DTO/ApplicationRowExDTO';\r\nimport { APIService } from '../services/apiService';\r\nimport { HOME_SCHOOL_ID, ROUTES } from '../constants';\r\nimport { useSchools } from '../contexts';\r\nimport { VerdictDTO } from '../DTO/VerdictDTO';\r\nimport {\r\n\tApplicationContext,\r\n\tApplicationUpdateContext,\r\n} from '../components/application';\r\nimport { ApplicationState } from '../components/application/ApplicationState';\r\nimport { MockApplicationHandlers } from '../components/application/ApplicationHandlers';\r\n\r\nconst api = new APIService();\r\nconst privileges = {\r\n\taddCourses: false,\r\n\teditRows: false,\r\n\teditCourses: false,\r\n\taddComment: true,\r\n\tgiveVerdict: true,\r\n};\r\n\r\nconst sideMargin = { marginLeft: '10px', marginRight: '10px' };\r\n\r\nconst ApplicationRowsAdmin = (): JSX.Element => {\r\n\tconst schools = useSchools();\r\n\tconst [applicationRows, setApplicationRows] = useState<\r\n\t\tApplicationRowExDTO[] | null\r\n\t>(null);\r\n\r\n\tconst getRows = () => {\r\n\t\tapi.getUnhandledApplicationRows().then((data) => {\r\n\t\t\tsetApplicationRows(data);\r\n\t\t});\r\n\t};\r\n\r\n\tuseEffect(() => {\r\n\t\tgetRows();\r\n\t}, []);\r\n\r\n\t// TODO: Den här gick nog sönder i application refaktorering.\r\n\tconst getVerdictMappingFunction = (idx: number, verdict: VerdictDTO) => {\r\n\t\tif (!applicationRows) return;\r\n\t\tapplicationRows[idx].activeVerdict = verdict;\r\n\t\tsetApplicationRows([...applicationRows]);\r\n\t};\r\n\r\n\tif (!applicationRows) return

Loading rows...

;\r\n\treturn (\r\n\t\t\r\n\t\t\t\r\n\t\t\t\t\r\n\t\t\t\t\tApplication rows\r\n\t\t\t\t\r\n\t\t\t\t{applicationRows.length === 0 ? (\r\n\t\t\t\t\t

No unhandled rows.

\r\n\t\t\t\t) : null}\r\n\t\t\t\t{applicationRows.map((row, idx) => (\r\n\t\t\t\t\t\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\tOpen application\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t
\r\n\t\t\t\t\t\t
\r\n\t\t\t\t\t\t\t s.id === HOME_SCHOOL_ID\r\n\t\t\t\t\t\t\t\t\t\t) || null,\r\n\t\t\t\t\t\t\t\t\texchange:\r\n\t\t\t\t\t\t\t\t\t\tschools?.find(\r\n\t\t\t\t\t\t\t\t\t\t\t(s) => s.id === row.schoolId\r\n\t\t\t\t\t\t\t\t\t\t) || null,\r\n\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t\toverridePrivileges={privileges}\r\n\t\t\t\t\t\t\t\trowIndex={idx}\r\n\t\t\t\t\t\t\t/>\r\n\t\t\t\t\t\t
\r\n\t\t\t\t\t\r\n\t\t\t\t))}\r\n\t\t\t\r\n\t\t\r\n\t);\r\n};\r\n\r\nexport default ApplicationRowsAdmin;\r\n","import React, { useState, useEffect } from 'react';\r\nimport { Link } from 'react-router-dom';\r\n\r\nimport { Container } from '../components/_atoms';\r\nimport { ROUTES } from '../constants';\r\nimport SearchComponent from '../components/Search';\r\nimport schools from '../model/schools_extended.json';\r\nimport { APIService } from '../services/apiService';\r\nimport { GridColDef, DataGrid, GridToolbar } from '@mui/x-data-grid';\r\nimport { Button, FormGroup, Typography } from '@material-ui/core';\r\nimport { getDateAndTime } from '../util/dateHelper';\r\nimport { MasterTrackDTO } from '../DTO/MasterTrackDTO';\r\n\r\nconst colDefs: GridColDef[] = [\r\n\t{ field: 'id', headerName: 'ID', type: 'number', flex: 0.5, minWidth: 50 },\r\n\t{ field: 'name', headerName: 'Name', flex: 1, minWidth: 200 },\r\n\t{\r\n\t\tfield: 'created',\r\n\t\theaderName: 'Created',\r\n\t\tflex: 1,\r\n\t\ttype: 'dateTime',\r\n\t\tminWidth: 200,\r\n\t\tvalueGetter: (params) =>\r\n\t\t\tparams.value ? new Date(params.value as string) : null,\r\n\t},\r\n\t{\r\n\t\tfield: 'modified',\r\n\t\theaderName: 'Modified',\r\n\t\tflex: 1,\r\n\t\ttype: 'dateTime',\r\n\t\tminWidth: 200,\r\n\t\tvalueGetter: (params) =>\r\n\t\t\tparams.value ? new Date(params.value as string) : null,\r\n\t},\r\n\t{\r\n\t\tfield: 'edit',\r\n\t\theaderName: ' ',\r\n\t\tflex: 0.5,\r\n\t\tminWidth: 100,\r\n\t\trenderCell: (params) => (\r\n\t\t\t\r\n\t\t\t\tOpen\r\n\t\t\t\r\n\t\t),\r\n\t},\r\n];\r\n\r\nconst api = new APIService();\r\n\r\nconst MasterTracks = () => {\r\n\tconst [masterTracks, setMasterTracks] = useState([]);\r\n\r\n\tconst getMasterTracks = () => {\r\n\t\tapi.getMasterTracks().then((data) => setMasterTracks(data));\r\n\t};\r\n\r\n\tuseEffect(() => {\r\n\t\tgetMasterTracks();\r\n\t}, []);\r\n\r\n\tif (!schools) return null;\r\n\treturn (\r\n\t\t\r\n\t\t\t\r\n\t\t\t\tTracks\r\n\t\t\t\r\n\t\t\t\r\n\t\t\t\t\r\n\t\t\t\t\tCreate new\r\n\t\t\t\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t\t\t\r\n\t\t\t\r\n\t\t\r\n\t);\r\n};\r\n\r\nexport default MasterTracks;\r\n","import { BaseDTO } from './BaseDTO';\r\n\r\nexport interface MasterTrackDTO extends BaseDTO {\r\n\tid: number;\r\n\tname: string;\r\n}\r\n\r\nexport class MasterTrackDTO extends BaseDTO implements MasterTrackDTO {\r\n\tid: number;\r\n\tname: string;\r\n\r\n\tconstructor(trackId: number) {\r\n\t\tsuper();\r\n\t\tthis.id = trackId;\r\n\t}\r\n}\r\n","import React, { useState, useEffect } from 'react';\r\nimport { useHistory, useRouteMatch } from 'react-router';\r\n\r\nimport { APIService } from '../services/apiService';\r\n\r\nimport { ROUTES } from '../constants';\r\nimport { MasterTrackDTO } from '../DTO/MasterTrackDTO';\r\nimport { Container } from '../components/_atoms';\r\nimport {\r\n\tButton,\r\n\tFormGroup,\r\n\tMenuItem,\r\n\tSelect,\r\n\tTextField,\r\n} from '@material-ui/core';\r\nimport LastEdited from './lastEdited';\r\nimport { EntityState, States } from '../util/enumerations';\r\nimport { useIsDirty } from '../hooks/isDirty';\r\n\r\nconst api = new APIService();\r\n\r\nconst MasterTrack = () => {\r\n\tconst match = useRouteMatch<{ id?: string }>();\r\n\tconst history = useHistory();\r\n\tconst trackId: number = Number(match.params.id) || 0;\r\n\tconst [masterTrack, setMasterTrack] = useState(null);\r\n\tconst [error, setError] = useState({ message: '' });\r\n\tconst [isDirty, updateCleanValue] = useIsDirty(masterTrack);\r\n\r\n\tconst setName = (name: string) => {\r\n\t\tsetMasterTrack((prev) => prev && { ...prev, name });\r\n\t};\r\n\tconst setState = (state: EntityState) => {\r\n\t\tsetMasterTrack((prev) => prev && { ...prev, state });\r\n\t};\r\n\r\n\tconst onSave = () => {\r\n\t\tif (masterTrack) {\r\n\t\t\tapi.saveMasterTrack(masterTrack)\r\n\t\t\t\t.then((newTrack) => {\r\n\t\t\t\t\tsetMasterTrack(newTrack);\r\n\t\t\t\t\tupdateCleanValue(newTrack);\r\n\t\t\t\t\tsetError({ message: '' });\r\n\t\t\t\t\tif (trackId === 0) {\r\n\t\t\t\t\t\thistory.replace(`${ROUTES.MASTERTRACK}/${newTrack.id}`);\r\n\t\t\t\t\t}\r\n\t\t\t\t})\r\n\t\t\t\t.catch((error) => {\r\n\t\t\t\t\tsetError({\r\n\t\t\t\t\t\tmessage: 'Error: ' + error.response.data.message,\r\n\t\t\t\t\t});\r\n\t\t\t\t});\r\n\t\t}\r\n\t};\r\n\r\n\tuseEffect(() => {\r\n\t\tif (trackId > 0) {\r\n\t\t\tapi.getMasterTrack(trackId).then((data) => {\r\n\t\t\t\tupdateCleanValue(data);\r\n\t\t\t\tsetMasterTrack(data);\r\n\t\t\t});\r\n\t\t} else {\r\n\t\t\tsetMasterTrack(new MasterTrackDTO(trackId));\r\n\t\t}\r\n\t}, []);\r\n\r\n\treturn (\r\n\t\t<>\r\n\t\t\t

\r\n\t\t\t\t{masterTrack\r\n\t\t\t\t\t? masterTrack.id\r\n\t\t\t\t\t\t? `${masterTrack.name}`\r\n\t\t\t\t\t\t: 'Create track'\r\n\t\t\t\t\t: 'Loading track...'}\r\n\t\t\t

\r\n\t\t\t{masterTrack && (\r\n\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t\t\t setName(e.target.value)}\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\tsetState(e.target.value as EntityState)\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t{States.map((s) => (\r\n\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t{s.name}\r\n\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t))}\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t\t

{error.message}

\r\n\t\t\t\t\t\r\n\t\t\t\t\t\t onSave()}\r\n\t\t\t\t\t\t\tdisabled={!isDirty}\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\tSave\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t
\r\n\t\t\t)}\r\n\t\t\r\n\t);\r\n};\r\n\r\nexport default MasterTrack;\r\n","import {\r\n\tAccordion,\r\n\tAccordionSummary,\r\n\tmakeStyles,\r\n\tTypography,\r\n} from '@material-ui/core';\r\nimport ExpandMoreIcon from '@material-ui/icons/ExpandMore';\r\n\r\nimport React from 'react';\r\n\r\nconst useStyles = makeStyles({\r\n\tbutton: {\r\n\t\tmargin: '12px 6px 18px 0',\r\n\t},\r\n\tfield: {\r\n\t\tmarginTop: '16px',\r\n\t\tmarginRight: '12px',\r\n\t\tdisplay: 'block',\r\n\t},\r\n\theader: {\r\n\t\tmarginTop: '10px',\r\n\t\tmarginBottom: '10px',\r\n\t\ttextAlign: 'center',\r\n\t},\r\n\theaderSmall: {\r\n\t\tmarginBottom: '5px',\r\n\t\tmarginTop: '5px',\r\n\t},\r\n});\r\nconst SideMenuHelp = () => {\r\n\tconst classes = useStyles();\r\n\r\n\treturn (\r\n\t\t
\r\n\t\t\t\r\n\t\t\t\tInstructions\r\n\t\t\t\r\n\t\t\t\r\n\t\t\t\t}\r\n\t\t\t\t\taria-controls=\"panel1a-content\"\r\n\t\t\t\t\tid=\"panel1a-header\"\r\n\t\t\t\t>\r\n\t\t\t\t\tFields\r\n\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\t\tTrack\r\n\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\t\tThe specialization track you are currently enrolled in. If\r\n\t\t\t\t\tyou cannot find your track, please contact admin.\r\n\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\t\tYear of departure\r\n\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\t\tThe year you depart to the exchange university. If you apply\r\n\t\t\t\t\tin 2021 but your semester starts in 2022, then 2022 is the\r\n\t\t\t\t\tyear of departure.\r\n\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\t\tUniversity\r\n\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\t\tThe exchange university. Make sure you select the correct\r\n\t\t\t\t\t\"country - university\" combination, there are some\r\n\t\t\t\t\tuniversities with the same name but in different countries.\r\n\t\t\t\t\tOnce you have selected an university, you must delete all\r\n\t\t\t\t\tapplication rows in order to change university. If you\r\n\t\t\t\t\tcannot find your university, please contact admin before\r\n\t\t\t\t\tproceeding.\r\n\t\t\t\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t\t\t}\r\n\t\t\t\t\taria-controls=\"panel1a-content\"\r\n\t\t\t\t\tid=\"panel1a-header\"\r\n\t\t\t\t>\r\n\t\t\t\t\tRows\r\n\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\t\tWhat is a row?\r\n\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\t\tA row typically consists of one course at KTH you wish to\r\n\t\t\t\t\treplace with a course at your exchange university. In some\r\n\t\t\t\t\tcases when one or many courses are exchanged for multiple\r\n\t\t\t\t\tcourses at the exchange university, multiple courses can be\r\n\t\t\t\t\tadded. The row should also consists of{' '}\r\n\t\t\t\t\tcomprehensive description for each of the\r\n\t\t\t\t\texchange courses, provided in the course description field.\r\n\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\t\tWhat is required for a row to be valid?\r\n\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\t\tThe row should consist of descriptions for each exchange\r\n\t\t\t\t\tcourse. The descriptions are most commonly found on the\r\n\t\t\t\t\tofficial website of the exchange university. If the\r\n\t\t\t\t\tdescription is available online, you must provide a link to\r\n\t\t\t\t\tPDF/site in which the information was optained. Failing to\r\n\t\t\t\t\tprovide sufficient information about the course will lead to\r\n\t\t\t\t\ta rejection of the application. If you wish to provide\r\n\t\t\t\t\tadditional information about the row, please do so in\r\n\t\t\t\t\tadditional comments field.\r\n\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\t\tI cannot find a course\r\n\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\t\tIf you cannot find a specific course, you have the\r\n\t\t\t\t\tpossibility to create one using the buttons above the rows.\r\n\t\t\t\t\tMake sure you submit correct information about the course.\r\n\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\t\tI want to take an optional course at the exchange university\r\n\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\t\tIf you want to enroll in a course without exchanging it for\r\n\t\t\t\t\tany particular KTH course, you can pick the KTH course\r\n\t\t\t\t\t\"Optional\". If you want to take several optional courses,\r\n\t\t\t\t\tplease add one application row for each course.\r\n\t\t\t\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t\t\t}\r\n\t\t\t\t\taria-controls=\"panel1a-content\"\r\n\t\t\t\t\tid=\"panel1a-header\"\r\n\t\t\t\t>\r\n\t\t\t\t\tBefore submitting\r\n\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\t\tMake sure\r\n\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\t\t
    \r\n\t\t\t\t\t\t
  1. \r\n\t\t\t\t\t\t\tEach row consists of courses from the exchange\r\n\t\t\t\t\t\t\tuniversity and KTH\r\n\t\t\t\t\t\t
  2. \r\n\t\t\t\t\t\t
  3. \r\n\t\t\t\t\t\t\tEach course has a comprehensive description and link\r\n\t\t\t\t\t\t\tto the official documentation (if available)\r\n\t\t\t\t\t\t
  4. \r\n\t\t\t\t\t\t
  5. \r\n\t\t\t\t\t\t\tThere is no information missing which is required\r\n\t\t\t\t\t\t\tfor the application to be reviewed\r\n\t\t\t\t\t\t
  6. \r\n\t\t\t\t\t\t
  7. You have saved your application
  8. \r\n\t\t\t\t\t
\r\n\t\t\t\t\tFeel free to save the application by using the PRINT button.\r\n\t\t\t\t
\r\n\t\t\t
\r\n\t\t\t\r\n\t\t\t\t}\r\n\t\t\t\t\taria-controls=\"panel1a-content\"\r\n\t\t\t\t\tid=\"panel1a-header\"\r\n\t\t\t\t>\r\n\t\t\t\t\t\r\n\t\t\t\t\t\tWhen you have submitted\r\n\t\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\t\t
    \r\n\t\t\t\t\t\t
  • \r\n\t\t\t\t\t\t\tYou have the ability to withdraw the application by\r\n\t\t\t\t\t\t\tusing the unsubmit button. Once the application is\r\n\t\t\t\t\t\t\tsubmitted the status will be updated to{' '}\r\n\t\t\t\t\t\t\tPending approval\r\n\t\t\t\t\t\t
  • \r\n\t\t\t\t\t\t
  • \r\n\t\t\t\t\t\t\tOnce the application has been reviewed it will\r\n\t\t\t\t\t\t\treceive either of the statuses\r\n\t\t\t\t\t\t\t
      \r\n\t\t\t\t\t\t\t\t
    • \r\n\t\t\t\t\t\t\t\t\tNot submitted: the\r\n\t\t\t\t\t\t\t\t\tapplication has been returned to you. Open\r\n\t\t\t\t\t\t\t\t\tthe application and review each row to find\r\n\t\t\t\t\t\t\t\t\tthe reason.\r\n\t\t\t\t\t\t\t\t
    • \r\n\t\t\t\t\t\t\t\t
    • \r\n\t\t\t\t\t\t\t\t\tAccepted: the application\r\n\t\t\t\t\t\t\t\t\thas been accepted.\r\n\t\t\t\t\t\t\t\t
    • \r\n\t\t\t\t\t\t\t
    \r\n\t\t\t\t\t\t
  • \r\n\t\t\t\t\t
\r\n\t\t\t\t
\r\n\t\t\t
\r\n\t\t
\r\n\t);\r\n};\r\n\r\nexport default SideMenuHelp;\r\n","import { IconButton, Typography } from '@material-ui/core';\r\nimport CloseIcon from '@material-ui/icons/Close';\r\nimport React from 'react';\r\nimport SideMenuHelp from './help';\r\n\r\ntype sideMenuProps = {\r\n\tisOpen: boolean;\r\n\ttoggleOpen: () => void;\r\n};\r\n\r\nconst SideMenu = (props: sideMenuProps) =>\r\n\tprops.isOpen ? (\r\n\t\t\r\n\t\t\t props.toggleOpen()}\r\n\t\t\t>\r\n\t\t\t\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t\r\n\t) : null;\r\n\r\nexport default SideMenu;\r\n","import React from 'react';\r\nimport { Switch, Route } from 'react-router-dom';\r\nimport './App.css';\r\n\r\nimport { ROUTES } from './constants';\r\n\r\nimport { Container } from './components/_atoms';\r\nimport NavBar from './components/NavBar';\r\nimport ProtectedRoute from './components/protectedRoute';\r\n\r\nimport Applications from './pages/applications';\r\nimport CreateApplication from './pages/createApplication';\r\nimport SingleApplication from './pages/application';\r\nimport Schools from './pages/schools';\r\nimport Courses from './pages/courses';\r\nimport Course from './pages/course';\r\nimport NotFound from './pages/notFound';\r\nimport Users from './pages/users';\r\nimport School from './pages/school';\r\nimport User from './pages/user';\r\nimport Home from './pages/home';\r\nimport { Grid } from '@material-ui/core';\r\n\r\nimport ApplicationsAdmin from './pages/applicationsAdmin';\r\nimport ApplicationRowsAdmin from './pages/applicationRowsAdmin';\r\nimport MasterTracks from './pages/masterTracks';\r\nimport MasterTrack from './pages/masterTrack';\r\nimport SideMenu from './components/sideMenu/sideMenu';\r\n\r\nconst App = () => {\r\n\tconst [sideMenuIsOpen, setSideMenuIsOpen] = React.useState(false);\r\n\r\n\tconst toggleSideMenu = () => {\r\n\t\tsetSideMenuIsOpen(!sideMenuIsOpen);\r\n\t};\r\n\r\n\treturn (\r\n\t\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t\r\n\t);\r\n};\r\n\r\nexport default App;\r\n","// This optional code is used to register a service worker.\r\n// register() is not called by default.\r\n\r\n// This lets the app load faster on subsequent visits in production, and gives\r\n// it offline capabilities. However, it also means that developers (and users)\r\n// will only see deployed updates on subsequent visits to a page, after all the\r\n// existing tabs open on the page have been closed, since previously cached\r\n// resources are updated in the background.\r\n\r\n// To learn more about the benefits of this model and instructions on how to\r\n// opt-in, read https://bit.ly/CRA-PWA\r\n\r\nconst isLocalhost = Boolean(\r\n\twindow.location.hostname === 'localhost' ||\r\n\t\t// [::1] is the IPv6 localhost address.\r\n\t\twindow.location.hostname === '[::1]' ||\r\n\t\t// 127.0.0.0/8 are considered localhost for IPv4.\r\n\t\twindow.location.hostname.match(\r\n\t\t\t/^127(?:\\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/\r\n\t\t)\r\n);\r\n\r\ntype Config = {\r\n\tonSuccess?: (registration: ServiceWorkerRegistration) => void;\r\n\tonUpdate?: (registration: ServiceWorkerRegistration) => void;\r\n};\r\n\r\nexport function register(config?: Config) {\r\n\tif (process.env.NODE_ENV === 'production' && 'serviceWorker' in navigator) {\r\n\t\t// The URL constructor is available in all browsers that support SW.\r\n\t\tconst publicUrl = new URL(process.env.PUBLIC_URL, window.location.href);\r\n\t\tif (publicUrl.origin !== window.location.origin) {\r\n\t\t\t// Our service worker won't work if PUBLIC_URL is on a different origin\r\n\t\t\t// from what our page is served on. This might happen if a CDN is used to\r\n\t\t\t// serve assets; see https://github.com/facebook/create-react-app/issues/2374\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\twindow.addEventListener('load', () => {\r\n\t\t\tconst swUrl = `${process.env.PUBLIC_URL}/service-worker.js`;\r\n\r\n\t\t\tif (isLocalhost) {\r\n\t\t\t\t// This is running on localhost. Let's check if a service worker still exists or not.\r\n\t\t\t\tcheckValidServiceWorker(swUrl, config);\r\n\r\n\t\t\t\t// Add some additional logging to localhost, pointing developers to the\r\n\t\t\t\t// service worker/PWA documentation.\r\n\t\t\t\tnavigator.serviceWorker.ready.then(() => {\r\n\t\t\t\t\tconsole.log(\r\n\t\t\t\t\t\t'This web app is being served cache-first by a service ' +\r\n\t\t\t\t\t\t\t'worker. To learn more, visit https://bit.ly/CRA-PWA'\r\n\t\t\t\t\t);\r\n\t\t\t\t});\r\n\t\t\t} else {\r\n\t\t\t\t// Is not localhost. Just register service worker\r\n\t\t\t\tregisterValidSW(swUrl, config);\r\n\t\t\t}\r\n\t\t});\r\n\t}\r\n}\r\n\r\nfunction registerValidSW(swUrl: string, config?: Config) {\r\n\tnavigator.serviceWorker\r\n\t\t.register(swUrl)\r\n\t\t.then((registration) => {\r\n\t\t\tregistration.onupdatefound = () => {\r\n\t\t\t\tconst installingWorker = registration.installing;\r\n\t\t\t\tif (installingWorker == null) {\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\t\t\t\tinstallingWorker.onstatechange = () => {\r\n\t\t\t\t\tif (installingWorker.state === 'installed') {\r\n\t\t\t\t\t\tif (navigator.serviceWorker.controller) {\r\n\t\t\t\t\t\t\t// At this point, the updated precached content has been fetched,\r\n\t\t\t\t\t\t\t// but the previous service worker will still serve the older\r\n\t\t\t\t\t\t\t// content until all client tabs are closed.\r\n\t\t\t\t\t\t\tconsole.log(\r\n\t\t\t\t\t\t\t\t'New content is available and will be used when all ' +\r\n\t\t\t\t\t\t\t\t\t'tabs for this page are closed. See https://bit.ly/CRA-PWA.'\r\n\t\t\t\t\t\t\t);\r\n\r\n\t\t\t\t\t\t\t// Execute callback\r\n\t\t\t\t\t\t\tif (config && config.onUpdate) {\r\n\t\t\t\t\t\t\t\tconfig.onUpdate(registration);\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\t// At this point, everything has been precached.\r\n\t\t\t\t\t\t\t// It's the perfect time to display a\r\n\t\t\t\t\t\t\t// \"Content is cached for offline use.\" message.\r\n\t\t\t\t\t\t\tconsole.log('Content is cached for offline use.');\r\n\r\n\t\t\t\t\t\t\t// Execute callback\r\n\t\t\t\t\t\t\tif (config && config.onSuccess) {\r\n\t\t\t\t\t\t\t\tconfig.onSuccess(registration);\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t};\r\n\t\t\t};\r\n\t\t})\r\n\t\t.catch((error) => {\r\n\t\t\tconsole.error('Error during service worker registration:', error);\r\n\t\t});\r\n}\r\n\r\nfunction checkValidServiceWorker(swUrl: string, config?: Config) {\r\n\t// Check if the service worker can be found. If it can't reload the page.\r\n\tfetch(swUrl, {\r\n\t\theaders: { 'Service-Worker': 'script' },\r\n\t})\r\n\t\t.then((response) => {\r\n\t\t\t// Ensure service worker exists, and that we really are getting a JS file.\r\n\t\t\tconst contentType = response.headers.get('content-type');\r\n\t\t\tif (\r\n\t\t\t\tresponse.status === 404 ||\r\n\t\t\t\t(contentType != null &&\r\n\t\t\t\t\tcontentType.indexOf('javascript') === -1)\r\n\t\t\t) {\r\n\t\t\t\t// No service worker found. Probably a different app. Reload the page.\r\n\t\t\t\tnavigator.serviceWorker.ready.then((registration) => {\r\n\t\t\t\t\tregistration.unregister().then(() => {\r\n\t\t\t\t\t\twindow.location.reload();\r\n\t\t\t\t\t});\r\n\t\t\t\t});\r\n\t\t\t} else {\r\n\t\t\t\t// Service worker found. Proceed as normal.\r\n\t\t\t\tregisterValidSW(swUrl, config);\r\n\t\t\t}\r\n\t\t})\r\n\t\t.catch(() => {\r\n\t\t\tconsole.log(\r\n\t\t\t\t'No internet connection found. App is running in offline mode.'\r\n\t\t\t);\r\n\t\t});\r\n}\r\n\r\nexport function unregister() {\r\n\tif ('serviceWorker' in navigator) {\r\n\t\tnavigator.serviceWorker.ready\r\n\t\t\t.then((registration) => {\r\n\t\t\t\tregistration.unregister();\r\n\t\t\t})\r\n\t\t\t.catch((error) => {\r\n\t\t\t\tconsole.error(error.message);\r\n\t\t\t});\r\n\t}\r\n}\r\n","import React from 'react';\r\nimport ReactDOM from 'react-dom';\r\nimport App from './App';\r\nimport * as serviceWorker from './serviceWorker';\r\nimport { BrowserRouter } from 'react-router-dom';\r\n\r\nimport { AuthProvider, SchoolProvider, CourseProvider } from './contexts';\r\n\r\nReactDOM.render(\r\n\t\r\n\t\t\r\n\t\t\t\r\n\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\r\n\t\t\r\n\t,\r\n\tdocument.getElementById('root')\r\n);\r\n\r\n// If you want your app to work offline and load faster, you can change\r\n// unregister() to register() below. Note this comes with some pitfalls.\r\n// Learn more about service workers: https://bit.ly/CRA-PWA\r\nserviceWorker.unregister();\r\n"],"sourceRoot":""}