{"version":3,"sources":["theme.ts","utils/helpers.ts","store/messagesSlice.ts","store/reportsSlice.ts","store/usersSlice.ts","store/index.ts","components/Messages.tsx","components/Loading.tsx","components/DebounceSelect.tsx","components/CreateReportForm.tsx","pages/Dashboard.tsx","pages/Report.tsx","pages/NotFound.tsx","components/Header.tsx","components/BlankCard.tsx","components/CreateUserForm.tsx","pages/Users.tsx","useInterceptors.ts","hooks/useConfigLoader.tsx","hooks/useAccessToken.tsx","App.tsx","reportWebVitals.ts","index.tsx"],"names":["size","xs","sm","lg","breakpoint","device","guid","s4","Math","floor","random","toString","substring","join","toLowerCase","pushMessage","createAsyncThunk","messageState","a","dispatch","id","timeout","showIcon","addMessage","Promise","_","reject","setTimeout","removeMessage","messagesSlice","createSlice","name","initialState","reducers","state","action","message","payload","type","description","push","index","findIndex","el","splice","actions","fetchReports","getState","axios","get","then","res","data","fetchReportsIfEmpty","reports","length","fetchReport","fetchUnitGroupsIfEmpty","fetchReportEmbedToken","createReport","report","post","updateReport","put","deleteReport","delete","reportsSlice","reportLoading","unitGroupsLoading","loading","groupedReports","reportName","embedTokenLoading","embedToken","unitGroups","noReports","setReportName","extraReducers","fulfilled","groupBy","Object","keys","pending","rejected","displayName","createUser","user","updateUser","encodeURIComponent","userName","fetchUsers","fetchAdUsers","users","adUsers","fetchUser","deleteUser","fetchCurrentUser","userSlice","currentUser","loadingAdUsers","loadingUser","loadingCurrentUser","impersonateUser","username","setUser","reducer","combineReducers","messages","store","configureStore","useAppDispatch","useDispatch","useAppSelector","useSelector","slide","keyframes","StyledMessage","styled","div","props","getColorByType","duration","StyledContainer","Messages","iconStyle","fontSize","getIcon","CheckCircleTwoTone","style","twoToneColor","ExclamationCircleOutlined","CloseCircleOutlined","map","onClick","position","textAlign","fontWeight","marginTop","CenteredDiv","Loading","DebounceSelect","onSearch","debounceTimeout","placeholder","React","useState","fetching","setFetching","options","setOptions","fetchRef","useRef","debounceFetcher","useMemo","debounce","value","current","fetchId","newOptions","labelInValue","filterOption","notFoundContent","width","StyledModal","Modal","layout","labelCol","span","wrapperCol","searchAdGroup","group","e","label","searchPowerbiGroup","CreateReportForm","onClose","mounted","formRef","powerbiReports","setPowerbiReports","useEffect","resetFields","powerbiGroupId","searchPowerbiReports","refetchReports","groupId","visible","footer","onCancel","ref","margin","initialValues","groupName","businessUnitGroup","powerbiSrName","powerbiId","onFinish","Item","rules","required","showSearch","onSelect","htmlType","title","onConfirm","okText","cancelText","marginLeft","Layout","StyledLink","Link","EmptyReport","Dashboard","currentReport","setCurrentReport","isAdmin","isAdministrator","groupKeys","getImage","className","src","replace","alt","flex","defaultActiveKey","JSON","parse","localStorage","getItem","onChange","openedTabs","setItem","stringify","expandIconPosition","Panel","header","dataSource","renderItem","item","to","Report","setReport","setEmbedToken","isLoading","useParams","embedConfiguration","embedUrl","tokenType","pbi","TokenType","Embed","accessToken","token","permissions","Permissions","Copy","viewMode","ViewMode","View","undefined","embedConfig","eventHandlers","Map","console","log","event","detail","cssClassName","getEmbeddedComponent","embeddedReport","NotFound","StyledHeader","StyledActions","ReportTitleContainer","StyledBrand","ImpersonateHeader","Header","history","useHistory","impersonate","instance","useMsal","removeItem","window","location","reload","icon","UserOutlined","marginRight","logoutRedirect","LogoutOutlined","CardWrapper","BlankCard","children","active","Row","StyledButton","Button","emptyUser","reportIds","searchAdUser","userPrincipalName","CreateUserForm","currentUserUsername","refetchUsers","valuePropName","mode","Option","Filter","Users","setCurrentUser","filterUsername","setFilterUsername","filterAdminsOnly","setFilterAdminsOnly","filteredUsers","filter","includes","Search","target","checked","Meta","wordBreak","useInterceptors","envConfig","ready","setReady","requestInterceptor","interceptors","request","use","config","baseURL","API_URL","headers","Authorization","error","responseInterceptor","response","status","resData","scopes","auth","scope","acquireTokenRedirect","eject","ua","navigator","userAgent","msie","indexOf","msie11","msedge","firefox","isIE","isEdge","isFirefox","useConfigLoader","setConfig","isConfigLoaded","setIsConfigLoaded","authConfig","setAuthConfig","conf","authority","clientId","redirectUri","origin","postLogoutRedirectUri","cache","storeAuthStateInCookie","PublicClientApplication","catch","useAccessToken","accounts","setAccessToken","account","acquireTokenSilent","InteractionRequiredAuthError","App","isReady","exact","path","memo","AppSecurity","loginRedirect","interactionType","InteractionType","Redirect","AppWithRouter","reportWebVitals","onPerfEntry","Function","getCLS","getFID","getFCP","getLCP","getTTFB","ReactDOM","render","document","getElementById"],"mappings":"6OAAMA,EAAO,CACXC,GAAI,QACJC,GAAI,QACJC,GAAI,UAQOC,EAAa,CACxBJ,OACAK,OARa,CACbJ,GAAG,eAAD,OAAiBD,EAAKC,GAAtB,KACFC,GAAG,eAAD,OAAiBF,EAAKE,GAAtB,KACFC,GAAG,eAAD,OAAiBH,EAAKG,GAAtB,O,yDCOG,SAASG,IACd,SAASC,IACP,OAAOC,KAAKC,MAA4B,OAArB,EAAID,KAAKE,WACzBC,SAAS,IACTC,UAAU,GAGf,MAAO,CAACL,IAAMA,IAAM,IAAKA,IAAM,IAAKA,IAAM,IAAKA,IAAM,IAAKA,IAAMA,IAAMA,KAAMM,KAAK,IAAIC,cCRhF,I,UAAMC,EAAcC,YACzB,gBADyC,uCAEzC,WAAOC,EAAP,wBAAAC,EAAA,6DAA8EC,EAA9E,EAA8EA,SACtEC,EAAKd,IACLe,EAAUJ,EAAaI,SAAW,EAClCC,EAAWL,EAAaK,WAAY,EAC1CH,EAASI,EAAW,2BAAKN,GAAN,IAAoBI,UAASD,KAAIE,eAJtD,kBAMS,IAAIE,SAAQ,SAACC,EAAGC,GAAJ,OAAeC,YAAW,kBAAMR,EAASS,EAAcR,MAAgB,KAAVC,OANlF,2CAFyC,yDAWrCQ,EAAgBC,YAAY,CAChCC,KAAM,WACNC,aAAc,GACdC,SAAU,CACRV,WAAY,SAACW,EAAOC,GAClB,IAAMC,EAAU,CACdhB,GAAIe,EAAOE,QAAQjB,GACnBgB,QAASD,EAAOE,QAAQD,QACxBE,KAAMH,EAAOE,QAAQC,KACrBjB,QAASc,EAAOE,QAAQhB,QACxBC,SAAUa,EAAOE,QAAQf,SACzBiB,YAAaJ,EAAOE,QAAQE,aAE9BL,EAAMM,KAAKJ,IAEbR,cAAe,SAACM,EAAOC,GACrB,IAAMM,EAAQP,EAAMQ,WAAU,SAACC,GAAD,OAAQA,EAAGvB,KAAOe,EAAOE,WACvDH,EAAMU,OAAOH,EAAO,O,EAKmBZ,EAAcgB,QAA5CtB,E,EAAAA,WAAYK,E,EAAAA,cACZC,IAAf,Q,kCC5CaiB,EAAe9B,YAAiB,gBAAD,uCAAkB,WAAOS,EAAP,YAAAP,EAAA,+DAAY6B,SAAZ,kBACrDC,IAAMC,IAAN,YAAsBC,MAAK,SAACC,GAAD,OAASA,EAAIC,SADa,2CAAlB,yDAG/BC,EAAsBrC,YAAiB,gBAAD,uCAAkB,WAAOS,EAAP,oBAAAP,EAAA,yDAAY6B,EAAZ,EAAYA,WAAZ,UAE/DA,IAAWO,QAAQF,YAF4C,aAE/D,EAAyBG,QAFsC,yCAG1D/B,QAAQE,UAHkD,gCAK5DsB,IAAMC,IAAN,YAAsBC,MAAK,SAACC,GAAD,OAASA,EAAIC,SALoB,2CAAlB,yDAQtCI,EAAcxC,YAAiB,eAAD,uCAAiB,WAAOI,GAAP,SAAAF,EAAA,+EACnD8B,IAAMC,IAAN,mBAAsB7B,IAAM8B,MAAK,SAACC,GAAD,OAASA,EAAIC,SADK,2CAAjB,uDAI9BK,EAAyBzC,YAAiB,4BAAD,uCAA8B,WAAOS,EAAP,oBAAAP,EAAA,yDAAY6B,EAAZ,EAAYA,WAAZ,UAE9EA,IAAWO,QAAQF,YAF2D,aAE9E,EAAyBG,QAFqD,yCAGzE/B,QAAQE,UAHiE,gCAK3EsB,IAAMC,IAAN,yBAAmCC,MAAK,SAACC,GAAD,OAASA,EAAIC,SALsB,2CAA9B,yDAQzCM,EAAwB1C,YAAiB,4BAAD,uCAA8B,WAAOI,GAAP,SAAAF,EAAA,+EAC1E8B,IAAMC,IAAN,mBAAsB7B,EAAtB,wBAA+C8B,MAAK,SAACC,GAAD,OAASA,EAAIC,SADS,2CAA9B,uDAIxCO,EAAe3C,YAAiB,gBAAD,uCAAkB,WAAO4C,GAAP,SAAA1C,EAAA,+EACrD8B,IAAMa,KAAN,WAAuBD,GAAQV,MAAK,SAACC,GAAD,OAASA,EAAIC,SADI,2CAAlB,uDAG/BU,EAAe9C,YAAiB,gBAAD,uCAAkB,WAAO4C,GAAP,SAAA1C,EAAA,+EACrD8B,IAAMe,IAAN,mBAAsBH,EAAOxC,IAAMwC,GAAQV,MAAK,SAACC,GAAD,OAASA,EAAIC,SADR,2CAAlB,uDAG/BY,EAAehD,YAAiB,gBAAD,uCAAkB,WAAOI,GAAP,SAAAF,EAAA,+EACrD8B,IAAMiB,OAAN,mBAAyB7C,IAAM8B,MAAK,SAACC,GAAD,OAASA,EAAIC,SADI,2CAAlB,uDAKtCc,EAAepC,YAAY,CAC/BC,KAAM,UACNC,aAAc,CACZmC,eAAe,EACfC,mBAAmB,EACnBC,SAAS,EACTC,eAAgB,GAChBlB,KAAM,GACNmB,WAAY,GACZC,mBAAmB,EACnBC,WAAY,GACZC,WAAY,GACZC,WAAW,GAEb1C,SAAU,CACR2C,cADQ,SACM1C,EAAOC,GACnBD,EAAMqC,WAAapC,EAAOE,UAG9BwC,eAAa,mBACV/B,EAAagC,UAAUxC,MAAO,SAACJ,EAAOC,GACrCD,EAAMmC,SAAU,EAChBnC,EAAMkB,KAAOjB,EAAOE,QACpBH,EAAMoC,eAAiBS,kBAAQ5C,EAAOE,QAAS,qBACC,IAA7C2C,OAAOC,KAAK/C,EAAMoC,gBAAgBf,OACnCrB,EAAMyC,WAAY,EAElBzC,EAAMyC,WAAY,KARX,cAWV7B,EAAaoC,QAAQ5C,MAAO,SAACJ,EAAOC,GACnCD,EAAMmC,SAAU,KAZP,cAcVvB,EAAaqC,SAAS7C,MAAO,SAACJ,EAAOC,GACpCD,EAAMmC,SAAU,KAfP,cAiBVb,EAAYsB,UAAUxC,MAAO,SAACJ,EAAOC,GACpCD,EAAMqC,WAAapC,EAAOE,QAAQ+C,eAlBzB,cAoBV1B,EAAsBoB,UAAUxC,MAAO,SAACJ,EAAOC,GAC9CD,EAAMsC,mBAAoB,EAC1BtC,EAAMuC,WAAatC,EAAOE,WAtBjB,cAwBVqB,EAAsBwB,QAAQ5C,MAAO,SAACJ,EAAOC,GAC5CD,EAAMsC,mBAAoB,KAzBjB,cA2BVd,EAAsByB,SAAS7C,MAAO,SAACJ,EAAOC,GAC7CD,EAAMsC,mBAAoB,KA5BjB,cAkCVV,EAAagB,UAAUxC,MAAO,SAACJ,EAAOC,GACrCD,EAAMiC,eAAgB,KAnCb,cAqCVL,EAAaoB,QAAQ5C,MAAO,SAACJ,EAAOC,GACnCD,EAAMiC,eAAgB,KAtCb,cAwCVL,EAAaqB,SAAS7C,MAAO,SAACJ,EAAOC,GACpCD,EAAMiC,eAAgB,KAzCb,cA4CVV,EAAuBqB,UAAUxC,MAAO,SAACJ,EAAOC,GAC/CD,EAAMkC,mBAAoB,EAC1BlC,EAAMwC,WAAavC,EAAOE,WA9CjB,cAgDVoB,EAAuByB,QAAQ5C,MAAO,SAACJ,EAAOC,GAC7CD,EAAMkC,mBAAoB,KAjDjB,cAmDVX,EAAuB0B,SAAS7C,MAAO,SAACJ,EAAOC,GAC9CD,EAAMkC,mBAAoB,KApDjB,KA6DAQ,EAAkBV,EAAarB,QAA/B+B,cACAV,IAAf,QC7GamB,EAAarE,YAAiB,gBAAD,uCAAkB,WAAOsE,GAAP,SAAApE,EAAA,+EACnD8B,IAAMa,KAAN,SAAqByB,GAAMpC,MAAK,SAACC,GAAD,OAASA,EAAIC,SADM,2CAAlB,uDAG7BmC,EAAavE,YAAiB,gBAAD,uCAAkB,WAAOsE,GAAP,SAAApE,EAAA,+EACnD8B,IAAMe,IAAN,iBAAoByB,mBAAmBF,EAAKG,WAAaH,GAAMpC,MAAK,SAACC,GAAD,OAASA,EAAIC,SAD9B,2CAAlB,uDAG7BsC,EAAa1E,YAAiB,cAAD,uCAAgB,WAAOS,EAAP,YAAAP,EAAA,+DAAY6B,SAAZ,kBACjDC,IAAMC,IAAN,UAAoBC,MAAK,SAACC,GAAD,OAASA,EAAIC,SADW,2CAAhB,yDAI7BuC,GAAe3E,YAAiB,gBAAD,uCAAkB,WAAOS,EAAP,oBAAAP,EAAA,yDAAY6B,EAAZ,EAAYA,WAAZ,UAExDA,IAAW6C,MAAMC,eAFuC,aAExD,EAA0BtC,QAF8B,yCAGnD/B,QAAQE,UAH2C,gCAKrDsB,IAAMC,IAAN,aAAuBC,MAAK,SAACC,GAAD,OAASA,EAAIC,SALY,2CAAlB,yDAO/B0C,GAAY9E,YAAiB,aAAD,uCAAe,WAAOyE,GAAP,SAAAvE,EAAA,+EAC/C8B,IAAMC,IAAN,iBAAoBuC,mBAAmBC,KAAavC,MAAK,SAACC,GAAD,OAASA,EAAIC,SADvB,2CAAf,uDAG5B2C,GAAa/E,YAAiB,cAAD,uCAAgB,WAAOyE,GAAP,SAAAvE,EAAA,+EACjD8B,IAAMiB,OAAN,iBAAuBuB,mBAAmBC,KAAavC,MAAK,SAACC,GAAD,OAASA,EAAIC,SADxB,2CAAhB,uDAI7B4C,GAAmBhF,YAAiB,oBAAD,uCAAsB,WAAOyE,EAAP,YAAAvE,EAAA,+DAA2B6B,SAA3B,kBAC7DC,IAAMC,IAAN,iBAAoBuC,mBAAmBC,KAAavC,MAAK,SAACC,GAAD,OAASA,EAAIC,SADT,2CAAtB,yDAI1C6C,GAAYnE,YAAY,CAC5BC,KAAM,OACNC,aAAc,CACZkE,YAAa,GACbC,gBAAgB,EAChBC,aAAa,EACb/B,SAAS,EACTgC,oBAAoB,EACpBjD,KAAM,GACNyC,QAAS,GACTS,gBAAiB,GACjBC,SAAU,IAEZtE,SAAU,CACRuE,QADQ,SACAtE,EAAOC,GACbD,EAAMqE,SAAWpE,EAAOE,UAG5BwC,eAAa,mBACVa,EAAWZ,UAAUxC,MAAO,SAACJ,EAAOC,GACnCD,EAAMmC,SAAU,EAChBnC,EAAMkB,KAAOjB,EAAOE,WAHX,cAKVqD,EAAWR,QAAQ5C,MAAO,SAACJ,EAAOC,GACjCD,EAAMmC,SAAU,KANP,cAQVqB,EAAWP,SAAS7C,MAAO,SAACJ,EAAOC,GAClCD,EAAMmC,SAAU,KATP,cAWVkB,EAAWT,UAAUxC,MAAO,SAACJ,EAAOC,GACnCD,EAAMkE,aAAc,KAZX,cAcVb,EAAWL,QAAQ5C,MAAO,SAACJ,EAAOC,GACjCD,EAAMkE,aAAc,KAfX,cAiBVb,EAAWJ,SAAS7C,MAAO,SAACJ,EAAOC,GAClCD,EAAMkE,aAAc,KAlBX,cAoBVN,GAAUhB,UAAUxC,MAAO,SAACJ,EAAOC,GAClCD,EAAMkE,aAAc,KArBX,cAuBVN,GAAUZ,QAAQ5C,MAAO,SAACJ,EAAOC,GAChCD,EAAMkE,aAAc,KAxBX,cA0BVN,GAAUX,SAAS7C,MAAO,SAACJ,EAAOC,GACjCD,EAAMkE,aAAc,KA3BX,cA6BVJ,GAAiBlB,UAAUxC,MAAO,SAACJ,EAAOC,GACzCD,EAAMmE,oBAAqB,EAC3BnE,EAAMgE,YAAc/D,EAAOE,WA/BlB,cAiCV2D,GAAiBd,QAAQ5C,MAAO,SAACJ,EAAOC,GACvCD,EAAMmE,oBAAqB,KAlClB,cAoCVL,GAAiBb,SAAS7C,MAAO,SAACJ,EAAOC,GACxCD,EAAMmE,oBAAqB,KArClB,cAuCVV,GAAab,UAAUxC,MAAO,SAACJ,EAAOC,GACrCD,EAAMiE,gBAAiB,EACvBjE,EAAM2D,QAAU1D,EAAOE,WAzCd,cA2CVsD,GAAaT,QAAQ5C,MAAO,SAACJ,EAAOC,GACnCD,EAAMiE,gBAAiB,KA5Cd,cA8CVR,GAAaR,SAAS7C,MAAO,SAACJ,EAAOC,GACpCD,EAAMiE,gBAAiB,KA/Cd,KAoDAK,GAAYP,GAAUpD,QAAtB2D,QACAP,MAAf,QC3GMQ,GAAUC,YAAgB,CAAEd,SAAOe,WAAUrD,YAI7CsD,GAAQC,YAAe,CAC3BJ,aAKWK,GAAiB,kBAAMC,eACvBC,GAAkDC,IAChDL,M,iDCXTM,GAAQC,YAAH,gMAqBLC,GAAgBC,IAAOC,IAAV,4RAEG,SAACC,GAAD,OAfC,SAACjF,GACtB,OAAQA,GACN,IAAK,UACH,MAAO,UACT,IAAK,OACH,MAAO,UACT,IAAK,UACH,MAAO,UACT,IAAK,QACH,MAAO,UAEX,MAAO,QAIwBkF,CAAeD,EAAMjF,QAQvC4E,IAAS,SAACK,GAAD,OAAoDA,EAAME,YAI5EC,GAAkBL,IAAOC,IAAV,0MA0CNK,I,GAAAA,GA/Bf,SAAkBJ,GAChB,IAAMZ,EAAWK,IAAe,SAAC9E,GAAD,OAAWA,EAAMyE,YAC3CxF,EAAW2F,KAEXc,EAAY,CAChBC,SAAU,IAENC,EAAU,SAACxF,GACf,OAAQA,GACN,IAAK,UACH,OAAO,eAACyF,GAAA,EAAD,CAAoBC,MAAOJ,EAAWK,aAAa,UAE5D,IAAK,UACL,IAAK,OACH,OAAO,eAACC,GAAA,EAAD,CAA2BF,MAAOJ,EAAWK,aAAa,UACnE,IAAK,QACH,OAAO,eAACE,GAAA,EAAD,CAAqBH,MAAOJ,EAAWK,aAAa,YAGjE,OACE,eAACP,GAAD,UACGf,EAASyB,KAAI,SAACzF,EAAIF,GAAL,OACZ,gBAAC2E,GAAD,CAAe9E,KAAMK,EAAGL,KAAMmF,SAAU9E,EAAGtB,QAAqBgH,QAAS,kBAAMlH,EAASS,EAAce,EAAGvB,MAAzG,UACE,sBAAK4G,MAAO,CAAEM,SAAU,YAAxB,SAAuCR,EAAQnF,EAAGL,QAClD,qBAAG0F,MAAO,CAAEO,UAAW,SAAUC,WAAY,OAAQC,UAAW,IAAhE,iBAAuE9F,QAAvE,IAAuEA,OAAvE,EAAuEA,EAAIP,QAA3E,OACA,oBAAG4F,MAAO,CAAEH,SAAU,IAAtB,SAA6BlF,EAAGJ,gBAHuBI,EAAGvB,UCtE9DsH,GAAcrB,IAAOC,IAAV,gIAQJqB,GAAU,kBACrB,gBAACD,GAAD,WACE,eAAC,KAAD,CAAM1I,KAAK,UACX,eAAC,GAAD,Q,4FCwCW4I,I,GAAAA,GA7Cf,YAKyB,IAJvBC,EAIsB,EAJtBA,SAIsB,IAHtBC,uBAGsB,MAHJ,IAGI,MAFtBC,mBAEsB,MAFR,GAEQ,EADnBxB,EACmB,+DACUyB,IAAMC,UAAS,GADzB,mBACfC,EADe,KACLC,EADK,OAEQH,IAAMC,SAAsB,IAFpC,mBAEfG,EAFe,KAENC,EAFM,KAGhBC,EAAWN,IAAMO,OAAO,GAExBC,EAAkBR,IAAMS,SAAQ,WAkBpC,OAAOC,MAjBa,SAACC,GACnBL,EAASM,SAAW,EACpB,IAAMC,EAAUP,EAASM,QACzBP,EAAW,IACXF,GAAY,GAEZN,EAASc,GAAOzG,MAAK,SAAC4G,GAChBD,IAAYP,EAASM,UAKzBP,EAAWS,GACXX,GAAY,SAIaL,KAC5B,CAACD,EAAUC,IAEd,OACE,eAAC,KAAD,yBACEiB,cAAY,EACZhB,YAAaA,EACbiB,cAAc,EACdnB,SAAUW,EACVS,gBAAiBf,EAAW,eAAC,KAAD,CAAMlJ,KAAK,UAAa,MAChDuH,GANN,IAOE6B,QAASA,EACTpB,MAAO,CAACkC,MAAO,YCzCfC,GAAc9C,YAAO+C,KAAP/C,CAAH,0GAEPjH,EAAWC,OAAOH,IAStBmK,GAAS,CACbC,SAAU,CAAEC,KAAM,GAClBC,WAAY,CAAED,KAAM,KAGhBE,GAAgB,SAACC,GACrB,OAAO1H,IAAMC,IAAN,4BAA+ByH,IAASxH,MAAK,SAACC,GAAD,OAASA,EAAIC,KAAKgF,KAAI,SAACuC,GAAD,MAAQ,CAAEC,MAAOD,EAAEvF,YAAauE,MAAOgB,EAAEvF,oBAG/GyF,GAAqB,SAACH,GAC1B,OAAO1H,IAAMC,IAAN,iCAAoCyH,IAASxH,MAAK,SAACC,GAAD,OAASA,EAAIC,KAAKgF,KAAI,SAACuC,GAAD,MAAQ,CAAEC,MAAM,GAAD,OAAKD,EAAE5I,KAAP,cAAiB4I,EAAEvJ,IAAMuI,MAAOgB,EAAEvJ,WAsInH0J,I,MAAAA,GAlIf,YAAuD,IAA3BlH,EAA0B,EAA1BA,OAAQmH,EAAkB,EAAlBA,QAC5B5J,EAAW2F,KACXpC,EAAasC,IAAe,SAAC9E,GAAD,OAAWA,EAAMoB,QAAQoB,cACrDN,EAAoB4C,IAAe,SAAC9E,GAAD,OAAWA,EAAMoB,QAAQc,qBAC5DC,EAAU2C,IAAe,SAAC9E,GAAD,OAAWA,EAAMoB,QAAQa,iBAClD6G,EAAUzB,kBAAO,GACjB0B,EAAU1B,iBAAO,MAN6B,EAORP,IAAMC,SAAS,IAPP,mBAO7CiC,EAP6C,KAO7BC,EAP6B,KAWpDC,qBAAU,WAAO,IAAD,EACkB,EAA7BH,IAAYD,EAAQpB,UAErB,UAAAqB,EAAQrB,eAAR,SAAiByB,cACjBL,EAAQpB,SAAU,GAKpB,OAHGhG,GAAUA,EAAO0H,gBAClBC,EAAqB3H,EAAO0H,gBAE9B,UAAOL,EAAQrB,eAAf,aAAO,EAAiByB,gBACxB,CAACJ,EAASrH,IAIZ,IAAM4H,EAAiB,kBAAMrK,EAAS2B,MAoChCyI,EAAuB,SAACE,GAC5B,OAAOzI,IAAMC,IAAN,0BAA6BwI,EAA7B,aAAgDvI,MAAK,SAACC,GAAD,OAASgI,EAAkBhI,EAAIC,UAQ7F,OACE,eAAC+G,GAAD,CAAauB,UAAW9H,EAAQ+H,OAAQ,KAAMC,SAAU,kBAAMb,KAA9D,SACE,gBAAC,KAAD,yBACEc,IAAKZ,EACLjD,MAAO,CAAE8D,OAAQ,KACbzB,IAHN,IAIEtI,KAAK,QACLgK,cAAe,CACbC,UAAW,CAACpB,MAAK,OAAEhH,QAAF,IAAEA,OAAF,EAAEA,EAAQoI,UAAWrC,MAAK,OAAE/F,QAAF,IAAEA,OAAF,EAAEA,EAAQoI,WACrDC,kBAAiB,OAAErI,QAAF,IAAEA,OAAF,EAAEA,EAAQqI,kBAC3BC,cAAa,OAAEtI,QAAF,IAAEA,OAAF,EAAEA,EAAQsI,cACvB9G,YAAW,OAAExB,QAAF,IAAEA,OAAF,EAAEA,EAAQwB,YACrB+G,UAAS,OAAEvI,QAAF,IAAEA,OAAF,EAAEA,EAAQuI,UACnBb,eAAgB,CAACV,MAAK,OAAEhH,QAAF,IAAEA,OAAF,EAAEA,EAAQ0H,eAAgB3B,MAAK,OAAE/F,QAAF,IAAEA,OAAF,EAAEA,EAAQ0H,iBAEjEc,SA1DW,SAAChJ,GAEhB,IAAMf,EAAO,2BACRuB,GACAR,GAQL,MANiC,kBAAtBf,EAAQ2J,YACjB3J,EAAQ2J,UAAY3J,EAAQ2J,UAAUrC,OAEF,kBAA3BtH,EAAQiJ,iBACjBjJ,EAAQiJ,eAAiBjJ,EAAQiJ,eAAe3B,OAE9C/F,EAAOxC,GACFD,EAAS2C,EAAazB,IAAUa,MAAK,SAACzB,GAC3C+J,IACAT,OAGG5J,EAASwC,EAAatB,IAAUa,MAAK,SAACzB,GAC3C+J,IACAT,QAyBA,UAeE,eAAC,KAAKsB,KAAN,CAAWzB,MAAM,aAAa7I,KAAK,YAAYuK,MAAO,CAAC,CAAEC,UAAU,IAAnE,SACE,eAAC,GAAD,CAAgBC,YAAU,EAAC3D,SAAU4B,OAGvC,eAAC,KAAK4B,KAAN,CAAWzB,MAAM,aAAa7I,KAAK,oBAAoBuK,MAAO,CAAC,CAAEC,UAAU,IAA3E,SACE,eAAC,KAAD,CAAQlI,QAASD,EAAmBgF,QAAS1E,EAAW0D,KAAI,SAACuC,GAAD,MAAQ,CAAEC,MAAOD,EAAGhB,MAAOgB,EAAEhK,mBAE3F,eAAC,KAAK0L,KAAN,CAAWzB,MAAM,eAAe7I,KAAK,cAAcuK,MAAO,CAAC,CAAEC,UAAU,IAAvE,SACE,eAAC,KAAD,MAEF,eAAC,KAAKF,KAAN,CAAWzB,MAAM,mBAAmB7I,KAAK,iBAAiBuK,MAAO,CAAC,CAAEC,UAAU,IAA9E,SACE,eAAC,GAAD,CAAgBC,YAAU,EAAC3D,SAAUgC,GAAoB4B,SAjCpC,SAAA/B,GAE3B,OADAa,EAAqBb,EAAMf,OACpBe,OAiCH,eAAC,KAAK2B,KAAN,CAAWzB,MAAM,aAAa7I,KAAK,YAAYuK,MAAO,CAAC,CAAEC,UAAU,IAAnE,SACA,eAAC,KAAD,CAAQnD,QAAS8B,EAAe9C,KAAI,SAACuC,GAAD,MAAQ,CAAEC,MAAOD,EAAEvJ,GAAIuI,MAAOgB,EAAEvJ,GAAGT,mBAEvE,eAAC,KAAK0L,KAAN,CAAWzB,MAAM,kBAAkB7I,KAAK,gBAAxC,SACE,eAAC,KAAD,MAIF,gBAAC,KAAKsK,KAAN,WACE,eAAC,IAAD,CAAQhI,QAASA,EAAS/B,KAAK,UAAUoK,SAAS,SAAlD,qBAGO,OAAN9I,QAAM,IAANA,OAAA,EAAAA,EAAQxC,KACP,eAAC,KAAD,CACEuL,MAAM,sCACNC,UAhEK,WACf,IAAMxL,EAAKwC,EAAOxC,GACdA,GACFD,EAAS6C,EAAa5C,IAAK8B,MAAK,SAACzB,GAC/B+J,IACAT,QA4DM8B,OAAO,MACPC,WAAW,KAJb,SAME,eAAC,IAAD,CAAQ9E,MAAO,CAAE+E,WAAY,IAAM1I,QAASA,EAAS/B,KAAK,SAASoK,SAAS,QAA5E,gCC5IRM,GAAS3F,IAAOC,IAAV,+CAIN2F,GAAa5F,YAAO6F,IAAP7F,CAAH,+GAEWjH,EAAWC,OAAOH,IAMvCiN,GAAc,CAAEhB,UAAW,GAAIb,eAAgB,GAAIlG,YAAa,GAAI6G,kBAAmB,GAAID,UAAW,GAAIE,cAAe,IA2EhHkB,I,GAAAA,GA1Ef,SAAmB7F,GACjB,IAAMpG,EAAW2F,KADc,EAEWmC,mBAA6B,MAFxC,mBAExBoE,EAFwB,KAETC,EAFS,KAGzBhJ,EAAiB0C,IAAe,SAAC9E,GAAD,OAAWA,EAAMoB,QAAQgB,kBACzDD,EAAU2C,IAAe,SAAC9E,GAAD,OAAWA,EAAMoB,QAAQe,WAClDM,EAAYqC,IAAe,SAAC9E,GAAD,OAAWA,EAAMoB,QAAQqB,aACpD4I,EAAUvG,IAAe,SAAC9E,GAAD,OAAWA,EAAM0D,MAAMM,YAAYsH,mBAC5DC,EAAYzI,OAAOC,KAAKX,GAE9B8G,qBAAU,WACRjK,EAAS2B,KACT3B,EAASsC,OACR,CAACtC,IAEJiK,qBAAU,WACLzG,GACDxD,EACEJ,EAAY,CACVqB,QAAS,SACTG,YAAa,qFACbD,KAAM,QACNjB,QAAS,QAId,CAACsD,EAAWxD,IAIf,IAAMuM,EAAW,SAAC1B,GAAD,OAAe,sBAAK2B,UAAU,aAAaC,IAAG,WAAM5B,EAAUlL,cAAc+M,QAAQ,KAAM,KAA5C,QAAwDC,IAAG,UAAK9B,MAI/H,OAAI3H,EAAgB,eAAC,GAAD,IAGlB,gBAAC2I,GAAD,WACGO,GACC,eAAC,IAAD,CAAQvF,MAAO,CAAE8D,OAAQ,IAAMxJ,KAAK,UAAU+F,QAAS,kBAAMiF,EAAiBH,KAA9E,2BAIF,eAAC,GAAD,CAAkBpC,QAAS,kBAAMuC,EAAiB,OAAO1J,OAAQyJ,IACjE,eAAC,IAAD,CACErF,MAAO,CAAE+F,KAAM,GACfC,iBAAkBC,KAAKC,MAAMC,aAAaC,QAAQ,SAClDC,SAAU,SAACC,GAAD,OAAgBH,aAAaI,QAAQ,OAAQN,KAAKO,UAAUF,KACtEG,mBAAmB,QAJrB,SAMGhB,EAAUrF,KAAI,SAAC4D,GAAD,OACb,eAAC,IAAS0C,MAAV,CAAgBC,OAAQjB,EAAS1B,GAAjC,SACE,eAAC,IAAD,CACE4C,WAAYtK,EAAe0H,GAC3B6C,WAAY,SAACC,GAAD,OACV,eAAC,IAAKzC,KAAN,CACExJ,QAAS,CACP0K,EACE,eAAC,IAAD,CAAQlF,QAAS,kBAAMiF,EAAiBwB,IAAxC,iBAAmD,sBAGjD,MANR,SASE,eAAC7B,GAAD,CAAY8B,GAAE,mBAAcD,EAAK1N,IAAjC,SAAwC0N,EAAK1J,oBAbH4G,Y,oBClEtDgB,GAAS3F,IAAOC,IAAV,gHAEFlH,EAAWC,OAAOH,IAiFb8O,OA5Ef,WACE,IAAM7N,EAAW2F,KADD,EAEMmC,qBAAbgG,EAFO,sBAGoBhG,mBAA6B,MAHjD,mBAGTxE,EAHS,KAGGyK,EAHH,KAIVC,EAAYnI,IAAe,SAAC9E,GAAD,OAAWA,EAAMoB,QAAQkB,qBACpDpD,EAAOgO,cAAPhO,GAENgK,qBAAU,WACRjK,EAASqC,EAAYpC,MACpB,CAACD,EAAUC,IAEdgK,qBAAU,WACR,OAAO,WACLjK,EAASyD,EAAc,QAExB,CAACzD,IAEJ,IAAIkO,EAAqB,GAmBzB,OAjBM5K,IAEJ4K,EAAqB,CACnB/M,KAAM,SACNlB,GAAIqD,EAAWrD,GACfkO,SAAU7K,EAAW6K,SACrBC,UAAWC,UAAWC,UAAUC,MAChCC,YAAalL,EAAWA,WAAWmL,MACnCC,YAAaL,UAAWM,YAAYC,KACpCC,SAAUR,UAAWS,SAASC,OAIlC9E,qBAAU,WACRjK,EAASuC,EAAsBtC,IAAK8B,MAAK,gBAAGb,EAAH,EAAGA,QAAH,OAAiB6M,EAAc7M,QACvE,CAAClB,EAAUC,SAEK+O,IAAf1L,GAA6B0K,GAE5B1K,GAAc0K,EAAkB,eAAC,GAAD,IAEnC,eAAC,GAAD,UAEI,eAAC,gBAAD,CACEiB,YAAaf,EACbgB,cACE,IAAIC,IAAI,CACN,CACE,SACA,WACEC,QAAQC,IAAI,mBAGhB,CACE,WACA,WACED,QAAQC,IAAI,qBAGhB,CACE,QACA,SAAUC,GACRF,QAAQC,IAAIC,EAAMC,YAK1BC,aAAc,qBACdC,qBAAsB,SAACC,GACrB5B,EAAU4B,QAhC+B,eAAC,IAAD,CAAU9B,GAAG,OC9CnD+B,I,kBAAAA,GAJf,SAAkBvJ,GAChB,OAAO,8C,6BCKHwJ,GAAe1J,IAAOsH,OAAV,mQAcZqC,GAAgB3J,IAAOC,IAAV,mNAMTlH,EAAWC,OAAOH,IAmBtB+Q,IAZuB5J,IAAOC,IAAV,wLAKhBlH,EAAWC,OAAOH,IAOCmH,IAAOC,IAAV,0MAWpB4J,GAAc7J,IAAOC,IAAV,4MAOPlH,EAAWC,OAAOH,IAMtBiR,GAAoB9J,IAAOC,IAAV,iSASblH,EAAWC,OAAOH,IA4EbkR,I,GAAAA,GA9Df,SAAgB7J,GACd,IAAM8J,EAAUC,cACV/D,EAAUvG,IAAe,SAAC9E,GAAD,OAAWA,EAAM0D,MAAMM,YAAYsH,mBAC5DjJ,EAAayC,IAAe,SAAC9E,GAAD,OAAWA,EAAMoB,QAAQiB,cACrDgN,EAAepD,aAAaC,QAAQ,SAAWH,KAAKC,MAAMC,aAAaC,QAAQ,UAAY,GACzFoD,EAAaC,eAAbD,SAYR,OACE,iCAEGD,GAA+B,KAAhBA,GACd,gBAACJ,GAAD,WACE,wBAAMnJ,MAAO,CAACH,SAAU,OAAQW,WAAY,KAA5C,2BAAiE+I,KACjE,eAAC,IAAD,CAAQlJ,QAXU,WACxB8F,aAAauD,WAAW,SACxBC,OAAOC,SAASC,UAS0B7J,MAAO,CAAE8D,OAAQ,IAArD,mCAKJ,gBAACiF,GAAD,CAAcpD,UAAU,SAAxB,UACE,eAACuD,GAAD,CACE7I,QAAS,WAEP,OAAOgJ,EAAQ7O,KAAK,MAHxB,SAME,sBAAKoL,IAAG,0BAA6BE,IAAG,gBAEzCvJ,GAA6B,KAAfA,GACb,eAAC0M,GAAD,UACG1M,KAGJ,EAKD,gBAACyM,GAAD,WACGzD,GACC,eAAC,IAAD,CAAQlF,QAAS,kBAAMgJ,EAAQ7O,KAAK,WAAWsP,KAAM,eAACC,GAAA,EAAD,IAAkB/J,MAAO,CAAEgK,YAAa,GAAI9H,MAAO,QAAxG,mBAIF,eAAC,IAAD,CAAQ7B,QAAS,kBAAMmJ,EAASS,kBAAkB3P,KAAK,UAAUwP,KAAM,eAACI,GAAA,EAAD,IAAoBlS,KAAK,SAAhG,8B,4BCjJJmS,GAAc9K,IAAOC,IAAV,qHAiBF8K,I,MAAAA,GAVf,YAA2H,IAAtGpK,EAAqG,EAArGA,MAAO3D,EAA8F,EAA9FA,QAASgO,EAAqF,EAArFA,SACnC,OACE,eAACF,GAAD,CAAanK,MAAOA,EAApB,SACE,eAAC,KAAD,CAAUsK,QAAM,EAACjO,QAASA,EAA1B,SACGgO,O,+BCHHE,GAAMlL,IAAOC,IAAV,mFAEClH,EAAWC,OAAOH,IAKtBsS,GAAenL,YAAOoL,IAAPpL,CAAH,2GAGRjH,EAAWC,OAAOH,IAStBmK,GAAS,CACbC,SAAU,CAAEC,KAAM,GAClBC,WAAY,CAAED,KAAM,KAEhBmI,GAAY,CAChBlF,iBAAiB,EAEjBmF,UAAW,GACXlN,SAAU,IAGNmN,GAAe,SAACnN,GACpB,OAAOzC,IAAMC,IAAN,2BAA8BwC,IAAYvC,MAAK,SAACC,GAAD,OAASA,EAAIC,KAAKgF,KAAI,SAACuC,GAAD,MAAQ,CAAEC,MAAOD,EAAEkI,kBAAmBlJ,MAAOgB,EAAEkI,0BAgI9GC,I,MAAAA,GA7Hf,YAAuD,IAA7BrN,EAA4B,EAA5BA,SAAUsF,EAAkB,EAAlBA,QAC5B5J,EAAW2F,KADmC,EAE5BmC,mBAAe,MAFa,mBAE7C3D,EAF6C,KAEvCkB,EAFuC,KAG9ClD,EAAU0D,IAAe,SAAC9E,GAAD,OAAWA,EAAMoB,QAAQF,QAClDiB,EAAU2C,IAAe,SAAC9E,GAAD,OAAWA,EAAM0D,MAAMQ,eAEhD2M,EAAsB/L,IAAe,SAAC9E,GAAD,OAAWA,EAAM0D,MAAMM,YAAYT,YACxEuN,EAAe,kBAAM7R,EAASuE,MAkDpC,OAhDA0F,qBAAU,WACR5E,EAAQkM,IACJjN,EACFtE,EAAS2E,GAAUL,IAAWvC,MAAK,gBAAGb,EAAH,EAAGA,QAAH,OAAiBmE,EAAQnE,MAE5DmE,EAAQ,QAET,CAACrF,EAAUsE,IAEd2F,qBAAU,WACRjK,EAASkC,OAER,CAAClC,IAqCF,gBAACoR,GAAD,WACE,eAACC,GAAD,CAAclQ,KAAK,UAAU+F,QAAS,kBAAM7B,EAAQkM,KAApD,yBAGA,eAAC,KAAD,CACExI,MAAO,IACPwB,UAAWpG,EACXqG,OAAQ,KACRC,SAAU,WACRpF,EAAQ,MACRuE,KANJ,SASE,gBAAC,KAAD,yBACEc,IAAK,SAAClB,GAAD,cAAOA,QAAP,IAAOA,OAAP,EAAOA,EAAGU,eACfrD,MAAO,CAAE8D,OAAQ,KACbzB,IAHN,IAIEtI,KAAK,QACLgK,cAAe,CACbyB,gBAAe,OAAElI,QAAF,IAAEA,OAAF,EAAEA,EAAMkI,gBACvBmF,UAAS,OAAErN,QAAF,IAAEA,OAAF,EAAEA,EAAMqN,UACjBlN,SAAQ,OAAEH,QAAF,IAAEA,OAAF,EAAEA,EAAMG,UAElB2G,SA3DS,SAAChJ,GAEhB,IAAMf,EAAO,2BACRiD,GACAlC,GAML,MAHgC,kBAArBf,EAAQoD,WACjBpD,EAAQoD,SAAWpD,EAAQoD,SAASkE,OAElClE,EACKtE,EAASoE,EAAWlD,IAAUa,MAAK,SAACzB,GAErCgE,IAAasN,GACf5R,EAAS6E,GAAiB+M,IAE5BC,IACAjI,OAGG5J,EAASkE,EAAWhD,IAAUa,MAAK,SAACzB,GACzCuR,IACAjI,QA2BE,UAYE,eAAC,KAAKsB,KAAN,CAAWzB,MAAM,WAAW7I,KAAK,WAAjC,SACI0D,GAAW,eAAC,GAAD,CAAgB+G,YAAU,EAAC3D,SAAU+J,OAEpD,eAAC,KAAKvG,KAAN,CAAW4G,cAAc,UAAUrI,MAAM,WAAW7I,KAAK,kBAAzD,SACE,eAAC,KAAD,MAGF,eAAC,KAAKsK,KAAN,CAAWzB,MAAM,UAAU7I,KAAK,YAAYuK,MAAO,CAAC,CAAEC,UAAU,IAAhE,SACE,eAAC,KAAD,CAAQ2G,KAAK,WAAWlL,MAAO,CAAEkC,MAAO,QAAUnB,YAAY,iBAA9D,SACGzF,EAAQ8E,KAAI,SAACuC,GAAD,OACX,eAAC,KAAOwI,OAAR,CAA0BxJ,MAAOgB,EAAEvJ,GAAIuL,MAAOhC,EAAEvF,YAAcuF,EAAEvJ,GAAhE,SACE,wBAAM4G,MAAO,CAAEH,SAAU,IAAzB,UACG8C,EAAEvF,YADL,IACmBuF,EAAEvJ,OAFHuJ,EAAEvJ,WAS5B,gBAAC,KAAKiL,KAAN,WACE,eAAC,IAAD,CAAQhI,QAASA,EAAS/B,KAAK,UAAUoK,SAAS,SAAlD,oBAGCjH,GACC,eAAC,KAAD,CACEkH,MAAM,oCACNC,UA7DG,WACXnH,GACFtE,EAAS4E,GAAWN,IAAWvC,MAAK,SAACzB,GACnCuR,IACAjI,QA0DQ8B,OAAO,MACPC,WAAW,KAJb,SAME,eAAC,IAAD,CAAQ9E,MAAO,CAAE+E,WAAY,IAAM1I,QAASA,EAAS/B,KAAK,SAASoK,SAAS,QAA5E,mCCpJV6F,GAAMlL,IAAOC,IAAV,0MAMClH,EAAWC,OAAOH,IAKtBkT,GAAS/L,IAAOC,IAAV,iFAEFlH,EAAWC,OAAOH,IAwDbmT,OAjDf,WACE,IAAMlS,EAAW2F,KAEXzC,EAAU2C,IAAe,SAAC9E,GAAD,OAAWA,EAAM0D,MAAMvB,WAChDuB,EAAQoB,IAAe,SAAC9E,GAAD,OAAWA,EAAM0D,MAAMxC,QAC9CmK,EAAUvG,IAAe,SAAC9E,GAAD,OAAWA,EAAM0D,MAAMM,YAAYsH,mBALnD,EAMuBvE,mBAAS,IANhC,mBAMR/C,EANQ,KAMKoN,EANL,OAO6BrK,mBAAS,IAPtC,mBAORsK,EAPQ,KAOQC,EAPR,OAQiCvK,oBAAS,GAR1C,mBAQRwK,EARQ,KAQUC,EARV,KASftI,qBAAU,WACRjK,EAASuE,OACR,CAACvE,IAEJ,IAAMwS,EAAgBlK,mBAAQ,WAC5B,OAAO7D,EAAMgO,QAAO,SAACjR,GAAD,OAAQA,EAAG8C,SAASoO,SAASN,MAAoBE,GAAmB9Q,EAAG6K,kBAAoBiG,QAC9G,CAAC7N,EAAO2N,EAAgBE,IAE3B,OAAIpP,EAAgB,eAAC,GAAD,IACfkJ,EAGH,gBAAC,GAAD,WACE,gBAAC,GAAD,WACE,eAAC,GAAD,CAAgBxC,QAAS,kBAAMuI,EAAe,OAAO7N,SAAUS,IAC/D,gBAACkN,GAAD,WACE,eAAC,KAAMU,OAAP,CAAc/K,YAAY,qBAAqBY,MAAO4J,EAAgBlF,SAAU,SAAC1D,GAAD,OAAO6I,EAAkB7I,EAAEoJ,OAAOpK,UAClH,eAAC,KAAD,CAAU3B,MAAO,CAAES,UAAW,IAAM4F,SAAU,kBAAMqF,GAAqBD,IAAmBO,QAASP,EAArG,oCAKJ,eAAC,IAAD,CACE7E,WAAY+E,EACZ9E,WAAY,SAACC,GAAD,OACV,eAAC,IAAKzC,KAAN,CACExJ,QAAS,CACP,eAAC,IAAD,CAAQwF,QAAS,kBAAMiL,EAAexE,EAAKrJ,WAA3C,iBAA2DqJ,EAAKrJ,WAFpE,SAOE,eAAC,IAAK4G,KAAK4H,KAAX,CAAgBjM,MAAO,CAACkM,UAAW,cAAevH,MAAO,6BAAImC,EAAKrJ,WAAelD,YAAauM,EAAKtB,iBAAmB,kBAvB3G,eAAC,IAAD,CAAUuB,GAAG,OCiCrBoF,OA5Ef,YAAgD,IAArBC,EAAoB,EAApBA,UAAWxE,EAAS,EAATA,MAC9BzO,EAAW2F,KAD4B,EAEnBmC,oBAAS,GAFU,mBAEtCoL,EAFsC,KAE/BC,EAF+B,KAGvC/C,EAAepD,aAAaC,QAAQ,SAAWH,KAAKC,MAAMC,aAAaC,QAAQ,UAAY,GACzFoD,EAAaC,eAAbD,SAqER,OAnEApG,qBAAU,WACR,GAAIgJ,GAAcxE,EAAlB,CACA0E,GAAS,GAET,IAAMC,EAAqBvR,IAAMwR,aAAaC,QAAQC,KACpD,SAAUC,GAWR,OATAA,EAAOC,QAAUR,EAAUS,QAC3BF,EAAOG,QAAU,CACfC,cAAc,UAAD,OAAYnF,GACzB,eAAgB,oBAEf2B,GAA+B,KAAhBA,IAChBoD,EAAOG,QAAP,2BAAsBH,EAAOG,SAAY,CAAE,MAASvD,KAG/CoD,KAET,SAAUK,GAER,OAAOxT,QAAQE,OAAOsT,MAIpBC,EAAsBjS,IAAMwR,aAAaU,SAASR,KAEtD,SAAUQ,GAGR,OAAOA,KAET,SAAUF,GAAQ,IAAD,IACf,IAAKA,EAAME,SAASC,OAAQ,OAAO3T,QAAQE,OAAOsT,GAClDzE,QAAQC,IAAIwE,EAAME,SAASC,QAC3B,IAAMC,EAAO,UAAGJ,EAAME,gBAAT,aAAG,EAAgB9R,KAChC,GAA8B,MAA1B4R,EAAME,SAASC,QAA8B,6BAAZC,EACnC,OAAO5T,QAAQE,OAAOsT,GAUxB,GAPA7T,EACEJ,EAAY,CACVqB,QAAS,iBAAW4S,QAAX,IAAWA,GAAX,UAAWA,EAAOE,gBAAlB,aAAW,EAAiBC,QACrC5S,YAAayS,EAAM5S,SAAW,uBAC9BE,KAAM,WAGoB,MAA1B0S,EAAME,SAASC,OAAgB,CAEjChH,aAAauD,WAAW,SACxB,IAAM+C,EAAU,CACdY,OAAQ,CAACjB,EAAUkB,KAAKC,QAE1B/D,EAASgE,qBAAqBf,GAASvR,OACvCqN,QAAQC,IAAI,wBAId,OAAOhP,QAAQE,OAAOsT,MAI1B,OAAO,WACLhS,IAAMwR,aAAaC,QAAQgB,MAAMlB,GACjCvR,IAAMwR,aAAaC,QAAQgB,MAAMR,OAElC,CAAC9T,EAAUiT,EAAWxE,EAAO4B,EAAUD,IAEnC8C,G,UCxEHqB,GAAK/D,OAAOgE,UAAUC,UACtBC,GAAOH,GAAGI,QAAQ,SAClBC,GAASL,GAAGI,QAAQ,YACpBE,GAASN,GAAGI,QAAQ,SACpBG,GAAUP,GAAGI,QAAQ,WACrBI,GAAOL,GAAO,GAAKE,GAAS,EAC5BI,GAASH,GAAS,EAClBI,GAAYH,GAAU,EAuCbI,OArCf,WAA4B,IAAD,EACGpN,mBAAS,MADZ,mBAClB0L,EADkB,KACV2B,EADU,OAEmBrN,oBAAS,GAF5B,mBAElBsN,EAFkB,KAEFC,EAFE,OAGWvN,mBAAS,MAHpB,mBAGlBwN,EAHkB,KAGNC,EAHM,KAkCzB,OA7BAtL,qBAAU,WACLmL,GAEHvT,IACGC,IAAI,eACJC,MAAK,SAAUgS,GAEd,IAAMyB,EAAsB,CAC1BrB,KAAM,CACJsB,UAAW1B,EAAS9R,KAAKkS,KAAKsB,UAC9BC,SAAU3B,EAAS9R,KAAKkS,KAAKuB,SAC7BC,YAAanF,OAAOC,SAASmF,OAC7BC,sBAAuB,KAEzBC,MAAO,CACLC,uBAAwBhB,IAAQC,IAAUC,KAGxCd,EAAO,IAAI6B,KAAwBR,GACzCD,EAAcpB,GACdgB,EAAUpB,EAAS9R,MACnBoT,GAAkB,MAEnBY,OAAM,SAAUpC,GACfzE,QAAQC,IAAI,6CACZD,QAAQC,IAAIwE,QAEb,CAACuB,IAEC,CAACA,eAAgBA,EAAgBnC,UAAWO,EAAQ8B,WAAYA,I,SCf1DY,OA7Bf,SAAwBjD,GAAY,IAAD,EACA3C,eAAvBD,EADuB,EACvBA,SAAU8F,EADa,EACbA,SADa,EAEOrO,mBAAS,MAFhB,mBAExB0G,EAFwB,KAEX4H,EAFW,KAGzBpW,EAAW2F,KAuBjB,OArBAsE,qBAAU,WACR,GAAKgJ,GAEDkD,EAAS/T,OAAS,EAAG,CACrB,IAAMkR,EAAU,CACZY,OAAQ,CAACjB,EAAUkB,KAAKC,OACxBiC,QAASF,EAAS,IAEtBnW,EAASqF,GAAQ8Q,EAAS,GAAG/Q,WAC7BiL,EAASiG,mBAAmBhD,GAASvR,MAAK,SAAAgS,GACtCqC,EAAerC,EAASvF,gBACzByH,OAAM,SAAApC,GAEDA,aAAiB0C,MACjBlG,EAASgE,qBAAqBf,GAASvR,MAAK,SAAAgS,aAKvD,CAACd,EAAWkD,EAAU9F,EAAUrQ,IAE5BwO,GCVPgI,GAAM,YAAuC,IAApCvD,EAAmC,EAAnCA,UACLjT,EAAW4F,cACX6I,EAAQyH,GAAejD,GACvBwD,EAAUzD,GAAgB,CAAEC,YAAWxE,UACvCT,EAAYnI,IAAe,SAAC9E,GAAD,OAAWA,EAAM0D,MAAMS,sBAClDkL,EAAepD,aAAaC,QAAQ,SAAWH,KAAKC,MAAMC,aAAaC,QAAQ,UAAY,GAC3F3I,EAAWuB,IAAe,SAAC9E,GAAD,OAAWA,EAAM0D,MAAMW,YAYvD,OATA6E,qBAAU,WACJwM,IACDrG,GAA+B,KAAhBA,GAChBpQ,EAASqF,GAAQ+K,IAGf9L,GAAUtE,EAAS6E,GAAiBP,OACvC,CAACA,EAAUtE,EAAUoQ,EAAaqG,IAEjCzI,IAAcyI,EAAgB,eAAC,GAAD,IAGhC,uCACE,eAAC,GAAD,IACA,eAAC,GAAD,IACA,gBAAC,IAAD,WACE,eAAC,IAAD,CAAOC,OAAK,EAACC,KAAK,IAAlB,SACE,eAAC,GAAD,MAEF,eAAC,IAAD,CAAOA,KAAK,SAAZ,SACE,eAAC,GAAD,MAEF,eAAC,IAAD,CAAOA,KAAK,eAAZ,SACE,eAAC,GAAD,MAEF,eAAC,IAAD,CAAOA,KAAK,IAAZ,SACE,eAAC,GAAD,aAMVH,GAAM3O,IAAM+O,KAAKJ,IAEjB,IAAMK,GAAkB,WAAO,IAAD,EACoB3B,KAAzCE,EADqB,EACrBA,eAAgBnC,EADK,EACLA,UAAWqC,EADN,EACMA,WAC1BjF,EAAaC,eAAbD,SAER,OAAS+E,GACP,gBAAC,KAAD,CAAc/E,SAAUiF,EAAxB,UACI,eAAC,KAAD,UACE,eAAC,GAAD,CAAKrC,UAAWA,MAElB,gBAAC,KAAD,WACI,6FACA,6BACE,eAAC,IAAD,CAAQ/L,QAAS,kBAAMmJ,EAASyG,iBAAhC,wBAGN,eAAC,KAAD,CAA4BC,gBAAiBC,KAAgBC,eAatDC,GAPO,WACpB,OACE,eAAC,IAAD,UACE,eAAC,GAAD,OC3ESC,GAZS,SAACC,GACnBA,GAAeA,aAAuBC,UACxC,8BAAqBtV,MAAK,YAAkD,IAA/CuV,EAA8C,EAA9CA,OAAQC,EAAsC,EAAtCA,OAAQC,EAA8B,EAA9BA,OAAQC,EAAsB,EAAtBA,OAAQC,EAAc,EAAdA,QAC3DJ,EAAOF,GACPG,EAAOH,GACPI,EAAOJ,GACPK,EAAOL,GACPM,EAAQN,O,OCCdO,IAASC,OACP,eAAC,IAAD,CAAUnS,MAAOA,GAAjB,SAEE,eAAC,GAAD,MAGFoS,SAASC,eAAe,SAM1BX,O","file":"static/js/main.14210e9b.chunk.js","sourcesContent":["const size = {\n xs: \"320px\",\n sm: \"768px\",\n lg: \"1200px\",\n};\nconst device = {\n xs: `(min-width: ${size.xs})`,\n sm: `(min-width: ${size.sm})`,\n lg: `(min-width: ${size.lg})`,\n};\n\nexport const breakpoint = {\n size,\n device,\n};\n\nexport const colors = {\n primary: \"#393B40\",\n secondary: \"#c2c7cf\",\n lightGray: \"#ecf0f1\",\n};\n","export function ObjectToQueryParam(params: Object): string {\n return (\n Object.keys(params)\n //@ts-ignore\n .filter((key) => params[key])\n //@ts-ignore\n .map((key) => `${encodeURIComponent(key)}=${encodeURIComponent(params[key])}`)\n .join(\"&\")\n );\n}\n\nexport function formatDate(dateString: string) {\n return new Date(dateString).toLocaleString();\n}\n\nexport function guid() {\n function s4() {\n return Math.floor((1 + Math.random()) * 0x10000)\n .toString(16)\n .substring(1);\n }\n\n return [s4(), s4(), \"-\", s4(), \"-\", s4(), \"-\", s4(), \"-\", s4(), s4(), s4()].join(\"\").toLowerCase();\n}\n","import { createAsyncThunk, createSlice, PayloadAction } from \"@reduxjs/toolkit\";\nimport { guid } from \"../utils\";\n\nexport type MessageType = \"success\" | \"info\" | \"warning\" | \"error\";\ninterface MessageState {\n message: string;\n type: MessageType;\n timeout: number; //in seconds\n id: string;\n showIcon: boolean;\n description: string;\n}\ntype Optional = Pick, K> & Omit;\n\nexport const pushMessage = createAsyncThunk(\n \"messages/push\",\n async (messageState: Optional, { dispatch }) => {\n const id = guid();\n const timeout = messageState.timeout || 5;\n const showIcon = messageState.showIcon || true;\n dispatch(addMessage({ ...messageState, timeout, id, showIcon }));\n\n return new Promise((_, reject) => setTimeout(() => dispatch(removeMessage(id)), timeout * 1500));\n }\n);\nconst messagesSlice = createSlice({\n name: \"messages\",\n initialState: [] as MessageState[],\n reducers: {\n addMessage: (state, action: PayloadAction) => {\n const message = {\n id: action.payload.id,\n message: action.payload.message,\n type: action.payload.type,\n timeout: action.payload.timeout,\n showIcon: action.payload.showIcon,\n description: action.payload.description,\n };\n state.push(message);\n },\n removeMessage: (state, action: PayloadAction) => {\n const index = state.findIndex((el) => el.id === action.payload);\n state.splice(index, 1);\n },\n },\n});\n\nexport const { addMessage, removeMessage } = messagesSlice.actions;\nexport default messagesSlice.reducer;\n","import { createAsyncThunk, createSlice, PayloadAction } from \"@reduxjs/toolkit\";\nimport axios from \"axios\";\nimport { groupBy } from \"lodash\";\n\nexport const fetchReports = createAsyncThunk(\"reports/fetch\", async (_, { getState }) => {\n return axios.get(`/reports`).then((res) => res.data);\n});\nexport const fetchReportsIfEmpty = createAsyncThunk(\"reports/fetch\", async (_, { getState }) => {\n //@ts-ignore\n if (getState().reports.data?.length) {\n return Promise.reject();\n }\n return axios.get(`/reports`).then((res) => res.data);\n});\n\nexport const fetchReport = createAsyncThunk(\"report/fetch\", async (id: string) => {\n return axios.get(`/reports/${id}`).then((res) => res.data);\n});\n\nexport const fetchUnitGroupsIfEmpty = createAsyncThunk(\"bussinessUnitGroups/fetch\", async (_, { getState }) => {\n //@ts-ignore\n if (getState().reports.data?.length) {\n return Promise.reject();\n }\n return axios.get(`/business-unit-groups`).then((res) => res.data);\n});\n\nexport const fetchReportEmbedToken = createAsyncThunk(`reports/generateViewToken`, async (id: string) => {\n return axios.get(`/reports/${id}/view-embeded-token`).then((res) => res.data);\n});\n\nexport const createReport = createAsyncThunk(\"report/create\", async (report: Omit) => {\n return axios.post(`/reports`, report).then((res) => res.data);\n});\nexport const updateReport = createAsyncThunk(\"report/create\", async (report: Report) => {\n return axios.put(`/reports/${report.id}`, report).then((res) => res.data);\n});\nexport const deleteReport = createAsyncThunk(\"report/create\", async (id: number) => {\n return axios.delete(`/reports/${id}`).then((res) => res.data);\n});\n\n// Then, handle actions in your reducers:\nconst reportsSlice = createSlice({\n name: \"reports\",\n initialState: {\n reportLoading: false,\n unitGroupsLoading: false,\n loading: false,\n groupedReports: {} as GroupedReports,\n data: [] as Report[],\n reportName: \"\",\n embedTokenLoading: false,\n embedToken: {} as EmbedTokenResponse,\n unitGroups: [] as String[],\n noReports: false\n },\n reducers: {\n setReportName(state, action: PayloadAction) {\n state.reportName = action.payload;\n },\n },\n extraReducers: {\n [fetchReports.fulfilled.type]: (state, action) => {\n state.loading = false;\n state.data = action.payload;\n state.groupedReports = groupBy(action.payload, \"businessUnitGroup\");\n if(Object.keys(state.groupedReports).length === 0){\n state.noReports = true;\n } else {\n state.noReports = false;\n }\n },\n [fetchReports.pending.type]: (state, action) => {\n state.loading = true;\n },\n [fetchReports.rejected.type]: (state, action) => {\n state.loading = false;\n },\n [fetchReport.fulfilled.type]: (state, action) => {\n state.reportName = action.payload.displayName;\n },\n [fetchReportEmbedToken.fulfilled.type]: (state, action) => {\n state.embedTokenLoading = false;\n state.embedToken = action.payload;\n },\n [fetchReportEmbedToken.pending.type]: (state, action) => {\n state.embedTokenLoading = true;\n },\n [fetchReportEmbedToken.rejected.type]: (state, action) => {\n state.embedTokenLoading = false;\n },\n // [createReport.fulfilled.type]: (state, action) => (state.reportLoading = false),\n // [createReport.pending.type]: (state, action) => (state.reportLoading = true),\n // [createReport.rejected.type]: (state, action) => (state.reportLoading = false),\n\n [updateReport.fulfilled.type]: (state, action) => {\n state.reportLoading = false;\n },\n [updateReport.pending.type]: (state, action) => {\n state.reportLoading = true;\n },\n [updateReport.rejected.type]: (state, action) => {\n state.reportLoading = false;\n },\n\n [fetchUnitGroupsIfEmpty.fulfilled.type]: (state, action) => {\n state.unitGroupsLoading = false;\n state.unitGroups = action.payload;\n },\n [fetchUnitGroupsIfEmpty.pending.type]: (state, action) => {\n state.unitGroupsLoading = true;\n },\n [fetchUnitGroupsIfEmpty.rejected.type]: (state, action) => {\n state.unitGroupsLoading = false;\n },\n\n // [deleteReport.fulfilled.type]: (state, action) => (state.reportLoading = false),\n // [deleteReport.pending.type]: (state, action) => (state.reportLoading = true),\n // [deleteReport.rejected.type]: (state, action) => (state.reportLoading = false),\n },\n});\n\nexport const { setReportName } = reportsSlice.actions;\nexport default reportsSlice.reducer;\n\ninterface GroupedReports {\n [key: string]: Report[];\n}\nexport interface Report {\n powerbiGroupId: string;\n powerbiId: string;\n businessUnitGroup: string;\n displayName: string;\n groupName: string;\n id: number;\n powerbiSrName: string | null;\n}\n\nexport interface EmbedTokenResponse {\n id: string;\n embedUrl: string;\n embedToken: EmbedToken;\n}\n\ninterface EmbedToken {\n token: string;\n tokenId: string;\n expiration: Date;\n}\n","import { createAsyncThunk, createSlice, PayloadAction } from \"@reduxjs/toolkit\";\nimport axios from \"axios\";\n\nexport interface User {\n isAdministrator: boolean;\n lastReportGetTime?: string;\n reportIds?: number[];\n userName: string;\n}\nexport interface AdUser {\n id: string;\n userPrincipalName: string;\n}\n\nexport const createUser = createAsyncThunk(\"report/update\", async (user: User) => {\n return axios.post(`/users`, user).then((res) => res.data);\n});\nexport const updateUser = createAsyncThunk(\"report/update\", async (user: User) => {\n return axios.put(`/users/${encodeURIComponent(user.userName)}`, user).then((res) => res.data);\n});\nexport const fetchUsers = createAsyncThunk(\"users/fetch\", async (_, { getState }) => {\n return axios.get(`/users`).then((res) => res.data);\n});\n\nexport const fetchAdUsers = createAsyncThunk(\"adUsers/fetch\", async (_, { getState }) => {\n //@ts-ignore\n if (getState().users.adUsers?.length) {\n return Promise.reject();\n }\n return axios.get(`/ad-users`).then((res) => res.data);\n});\nexport const fetchUser = createAsyncThunk(\"user/fetch\", async (userName: string) => {\n return axios.get(`/users/${encodeURIComponent(userName)}`).then((res) => res.data);\n});\nexport const deleteUser = createAsyncThunk(\"user/update\", async (userName: string) => {\n return axios.delete(`/users/${encodeURIComponent(userName)}`).then((res) => res.data);\n});\n\nexport const fetchCurrentUser = createAsyncThunk(\"currentUser/fetch\", async (userName: string, { getState }) => {\n return axios.get(`/users/${encodeURIComponent(userName)}`).then((res) => res.data);\n});\n\nconst userSlice = createSlice({\n name: \"user\",\n initialState: {\n currentUser: {} as User,\n loadingAdUsers: false,\n loadingUser: false,\n loading: false,\n loadingCurrentUser: true,\n data: [] as User[],\n adUsers: [] as AdUser[],\n impersonateUser: \"\",\n username: \"\"\n },\n reducers: {\n setUser(state, action: PayloadAction) {\n state.username = action.payload;\n },\n },\n extraReducers: {\n [fetchUsers.fulfilled.type]: (state, action) => {\n state.loading = false;\n state.data = action.payload;\n },\n [fetchUsers.pending.type]: (state, action) => {\n state.loading = true;\n },\n [fetchUsers.rejected.type]: (state, action) => {\n state.loading = false;\n },\n [updateUser.fulfilled.type]: (state, action) => {\n state.loadingUser = false;\n },\n [updateUser.pending.type]: (state, action) => {\n state.loadingUser = true;\n },\n [updateUser.rejected.type]: (state, action) => {\n state.loadingUser = false;\n },\n [fetchUser.fulfilled.type]: (state, action) => {\n state.loadingUser = false;\n },\n [fetchUser.pending.type]: (state, action) => {\n state.loadingUser = true;\n },\n [fetchUser.rejected.type]: (state, action) => {\n state.loadingUser = false;\n },\n [fetchCurrentUser.fulfilled.type]: (state, action) => {\n state.loadingCurrentUser = false;\n state.currentUser = action.payload;\n },\n [fetchCurrentUser.pending.type]: (state, action) => {\n state.loadingCurrentUser = true;\n },\n [fetchCurrentUser.rejected.type]: (state, action) => {\n state.loadingCurrentUser = false;\n },\n [fetchAdUsers.fulfilled.type]: (state, action) => {\n state.loadingAdUsers = false;\n state.adUsers = action.payload;\n },\n [fetchAdUsers.pending.type]: (state, action) => {\n state.loadingAdUsers = true;\n },\n [fetchAdUsers.rejected.type]: (state, action) => {\n state.loadingAdUsers = false;\n },\n },\n});\n\nexport const { setUser } = userSlice.actions;\nexport default userSlice.reducer;\n\nexport interface CurrentAccount {\n userName: string;\n name: string;\n jwtAccessToken: string;\n jwtIdToken: string;\n}\n\nexport interface AccountResponse {\n account: Account;\n jwtIdToken: string;\n jwtAccessToken: string;\n}\n\nexport interface Account {\n accountIdentifier: string;\n homeAccountIdentifier: string;\n userName: string;\n name: string;\n idToken: IDToken;\n idTokenClaims: IDToken;\n environment: string;\n}\n\nexport interface IDToken {\n aud: string;\n iss: string;\n iat: number;\n nbf: number;\n exp: number;\n aio: string;\n idp: string;\n name: string;\n nonce: string;\n oid: string;\n preferred_username: string;\n rh: string;\n sub: string;\n tid: string;\n uti: string;\n ver: string;\n}\n","import { combineReducers, configureStore } from \"@reduxjs/toolkit\";\nimport { TypedUseSelectorHook, useDispatch, useSelector } from \"react-redux\";\n\nimport messages from \"./messagesSlice\";\nimport reports from \"./reportsSlice\";\nimport users from \"./usersSlice\";\nconst reducer = combineReducers({ users, messages, reports });\nexport type RootState = ReturnType;\n// Inferred type: {posts: PostsState, comments: CommentsState, users: UsersState}\nexport type AppDispatch = typeof store.dispatch;\nconst store = configureStore({\n reducer,\n //devTools: process.env.NODE_ENV === \"development\",\n});\n\n// Use throughout your app instead of plain `useDispatch` and `useSelector`\nexport const useAppDispatch = () => useDispatch();\nexport const useAppSelector: TypedUseSelectorHook = useSelector;\nexport default store;\n","import { CheckCircleTwoTone, CloseCircleOutlined, ExclamationCircleOutlined } from \"@ant-design/icons\";\nimport styled, { keyframes } from \"styled-components\";\nimport { useAppDispatch, useAppSelector } from \"../store\";\nimport { MessageType, removeMessage } from \"../store/messagesSlice\";\n\ninterface Props {}\n\nconst slide = keyframes`\n\n 0% { transform: translate(100%, 0); }\n 5% { transform: translate(0, 0);}\n 95% { transform: translate(0, 0); }\n 100% { transform: translate(120%, 0); }\n`;\n\nconst getColorByType = (type: MessageType) => {\n switch (type) {\n case \"success\":\n return \"#2ecc71\";\n case \"info\":\n return \"#3498db\";\n case \"warning\":\n return \"#e67e22\";\n case \"error\":\n return \"#e74c3c\";\n }\n return \"white\";\n};\nconst StyledMessage = styled.div`\n width: 350px;\n background-color: ${(props) => getColorByType(props.type)};\n font-size: 18px;\n border-radius: 10px;\n padding: 10px;\n color: white;\n\n box-shadow: 0 8px 16px 0 rgba(0, 0, 0, 0.2);\n margin: 10px;\n animation: ${slide} ${(props: { duration: number; type: MessageType }) => props.duration}s ease-out;\n animation-fill-mode: forwards;\n`;\n\nconst StyledContainer = styled.div`\n position: fixed;\n right: 0;\n justify-content: center;\n display: flex;\n flex-direction: column;\n align-items: center;\n bottom: 50px;\n z-index: 99 !important;\n`;\n\nfunction Messages(props: Props) {\n const messages = useAppSelector((state) => state.messages);\n const dispatch = useAppDispatch();\n\n const iconStyle = {\n fontSize: 50,\n };\n const getIcon = (type: MessageType) => {\n switch (type) {\n case \"success\":\n return ;\n\n case \"warning\":\n case \"info\":\n return ;\n case \"error\":\n return ;\n }\n };\n return (\n \n {messages.map((el, index) => (\n dispatch(removeMessage(el.id))}>\n
{getIcon(el.type)}
\n

{el?.message}

\n

{el.description}

\n
\n ))}\n
\n );\n}\nexport default Messages;\n","import { Spin } from \"antd\";\nimport React from \"react\";\nimport styled from \"styled-components\";\nimport Messages from \"./Messages\";\n\nconst CenteredDiv = styled.div`\n display: grid;\n place-items: center;\n height: 100%;\n width: 100%;\n position: absolute;\n`;\n\nexport const Loading = () => (\n \n \n \n \n);\n","import React from \"react\";\nimport { Select, Spin } from \"antd\";\nimport { SelectProps } from \"antd/es/select\";\nimport debounce from \"lodash/debounce\";\n\nexport interface DebounceSelectProps extends Omit, \"options\" | \"children\"> {\n onSearch: (search: string) => Promise;\n debounceTimeout?: number;\n placeholder?: string;\n}\n\nfunction DebounceSelect({\n onSearch,\n debounceTimeout = 500,\n placeholder = '',\n ...props\n}: DebounceSelectProps) {\n const [fetching, setFetching] = React.useState(false);\n const [options, setOptions] = React.useState([]);\n const fetchRef = React.useRef(0);\n\n const debounceFetcher = React.useMemo(() => {\n const loadOptions = (value: string) => {\n fetchRef.current += 1;\n const fetchId = fetchRef.current;\n setOptions([]);\n setFetching(true);\n\n onSearch(value).then((newOptions) => {\n if (fetchId !== fetchRef.current) {\n // for fetch callback order\n return;\n }\n\n setOptions(newOptions);\n setFetching(false);\n });\n };\n\n return debounce(loadOptions, debounceTimeout);\n }, [onSearch, debounceTimeout]);\n\n return (\n \n labelInValue\n placeholder={placeholder}\n filterOption={false}\n onSearch={debounceFetcher}\n notFoundContent={fetching ? : null}\n {...props}\n options={options}\n style={{width: \"100%\"}}\n />\n );\n}\n\nexport default DebounceSelect;\n","import { Button, Form, Input, Select, Popconfirm } from \"antd\";\nimport Modal from \"antd/lib/modal/Modal\";\nimport axios from \"axios\";\nimport React, { useEffect, useRef } from \"react\";\nimport styled from \"styled-components\";\nimport { useAppDispatch, useAppSelector } from \"../store\";\nimport { createReport, deleteReport, fetchReports, Report, updateReport } from \"../store/reportsSlice\";\nimport { breakpoint } from \"../theme\";\nimport DebounceSelect from \"./DebounceSelect\";\n\nconst StyledModal = styled(Modal)`\n width: 100% !important;\n @media${breakpoint.device.sm} {\n width: 650px !important;\n }\n`;\ninterface Props {\n report?: Optional;\n onClose: () => void;\n}\n\nconst layout = {\n labelCol: { span: 8 },\n wrapperCol: { span: 16 },\n};\n\nconst searchAdGroup = (group) => {\n return axios.get(`/ad-groups?filter=${group}`).then((res) => res.data.map((e) => ({ label: e.displayName, value: e.displayName })));\n};\n\nconst searchPowerbiGroup = (group) => {\n return axios.get(`/powerbi-groups?filter=${group}`).then((res) => res.data.map((e) => ({ label: `${e.name} - ${e.id}`, value: e.id })));\n};\n\ntype Optional = Pick, K> & Omit;\nfunction CreateReportForm({ report, onClose }: Props) {\n const dispatch = useAppDispatch();\n const unitGroups = useAppSelector((state) => state.reports.unitGroups);\n const unitGroupsLoading = useAppSelector((state) => state.reports.unitGroupsLoading);\n const loading = useAppSelector((state) => state.reports.reportLoading);\n const mounted = useRef(false);\n const formRef = useRef(null);\n const [powerbiReports, setPowerbiReports] = React.useState([]);\n // t is a form, where you should input a name, a powerbi id and select a group from a dropdown\n // name and power bi id are text inputs\n\n useEffect(() => {\n if(formRef && !mounted.current) {\n //@ts-ignore\n formRef.current?.resetFields();\n mounted.current = true;\n }\n if(report && report.powerbiGroupId){\n searchPowerbiReports(report.powerbiGroupId);\n }\n return formRef.current?.resetFields();\n },[formRef, report])\n\n\n\n const refetchReports = () => dispatch(fetchReports());\n\n const onFinish = (data) => {\n\n const payload = {\n ...report,\n ...data,\n };\n if (typeof payload.groupName === \"object\") {\n payload.groupName = payload.groupName.value;\n }\n if (typeof payload.powerbiGroupId === \"object\") {\n payload.powerbiGroupId = payload.powerbiGroupId.value;\n }\n if (report.id) {\n return dispatch(updateReport(payload)).then((_) => {\n refetchReports();\n onClose();\n });\n }\n return dispatch(createReport(payload)).then((_) => {\n refetchReports();\n onClose();\n });\n };\n\n const onDelete = () => {\n const id = report.id;\n if (id) {\n dispatch(deleteReport(id)).then((_) => {\n refetchReports();\n onClose();\n });\n }\n };\n\n const searchPowerbiReports = (groupId) => {\n return axios.get(`/powerbi-groups/${groupId}/reports`).then((res) => setPowerbiReports(res.data));\n };\n\n const onPowerbiGroupChange = group => {\n searchPowerbiReports(group.value);\n return group;\n }\n\n return (\n onClose()} >\n \n \n \n \n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n\n \n \n {report?.id && (\n \n \n \n )}\n \n \n \n );\n}\n\nexport default CreateReportForm;\n","import { Button, Collapse, List } from \"antd\";\nimport { useEffect, useState } from \"react\";\nimport styled from \"styled-components\";\nimport { breakpoint } from \"../theme\";\nimport { useAppDispatch, useAppSelector } from \"../store\";\nimport { fetchReports, fetchUnitGroupsIfEmpty, Report } from \"../store/reportsSlice\";\nimport { Loading } from \"../components/Loading\";\nimport CreateReportForm from \"../components/CreateReportForm\";\nimport { Link } from \"react-router-dom\";\nimport { pushMessage } from \"../store/messagesSlice\";\n\n\ninterface Props {}\n\nconst Layout = styled.div`\n margin: 20px;\n`;\n\nconst StyledLink = styled(Link)`\n max-width: 68%;\n @media only screen and ${breakpoint.device.sm} {\n max-width: 100%;\n }\n \n`;\n\nconst EmptyReport = { powerbiId: \"\", powerbiGroupId: \"\", displayName: \"\", businessUnitGroup: \"\", groupName: \"\", powerbiSrName: \"\" };\nfunction Dashboard(props: Props) {\n const dispatch = useAppDispatch();\n const [currentReport, setCurrentReport] = useState>(null);\n const groupedReports = useAppSelector((state) => state.reports.groupedReports);\n const loading = useAppSelector((state) => state.reports.loading);\n const noReports = useAppSelector((state) => state.reports.noReports);\n const isAdmin = useAppSelector((state) => state.users.currentUser.isAdministrator);\n const groupKeys = Object.keys(groupedReports);\n\n useEffect(() => {\n dispatch(fetchReports());\n dispatch(fetchUnitGroupsIfEmpty());\n }, [dispatch]);\n\n useEffect(() => {\n if(noReports){\n dispatch(\n pushMessage({\n message: \"Error \",\n description: \"Sorry you don’t have access to any reports. Please contact your administrator\",\n type: \"error\",\n timeout: 20,\n })\n );\n }\n }, [noReports, dispatch]);\n\n //const dispatch = useDispatch();\n\n const getImage = (groupName) => {`${groupName}`};\n // eslint-disable-next-line react-hooks/exhaustive-deps\n //const onFilterChangeDebounced = useCallback(debounce(onFilterChange, 500), []);\n\n if (loading) return ;\n\n return (\n \n {isAdmin && (\n \n )}\n setCurrentReport(null)} report={currentReport} />\n localStorage.setItem(\"tabs\", JSON.stringify(openedTabs))}\n expandIconPosition=\"right\"\n >\n {groupKeys.map((groupName) => (\n \n (\n setCurrentReport(item)} key=\"list-loadmore-edit\">\n Edit\n \n ) : null,\n ]}\n >\n {item.displayName}\n \n )}\n />\n \n ))}\n \n \n );\n}\n\nexport default Dashboard;\n","import { useEffect, useState } from \"react\";\nimport styled from \"styled-components\";\nimport { useAppDispatch, useAppSelector } from \"../store\";\nimport { fetchReportEmbedToken } from \"../store/reportsSlice\";\nimport { Loading } from \"../components/Loading\";\nimport { Redirect, useParams } from \"react-router-dom\";\nimport * as pbi from \"powerbi-client\";\nimport { PowerBIEmbed } from \"powerbi-client-react\";\nimport { EmbedTokenResponse, fetchReport, setReportName } from \"../store/reportsSlice\";\nimport { breakpoint } from \"../theme\";\n\nconst Layout = styled.div`\n height: calc(100vh - 95px);\n @media${breakpoint.device.sm}{\n height: calc(100vh - 62px);\n }\n`;\n\nfunction Report() {\n const dispatch = useAppDispatch();\n const [, setReport] = useState();\n const [embedToken, setEmbedToken] = useState(null);\n const isLoading = useAppSelector((state) => state.reports.embedTokenLoading);\n let { id } = useParams<{ id: string }>();\n\n useEffect(() => {\n dispatch(fetchReport(id));\n }, [dispatch, id]);\n\n useEffect(() => {\n return () => {\n dispatch(setReportName(\"\"));\n };\n }, [dispatch]);\n\n let embedConfiguration = {};\n\n if (!!embedToken) {\n // PowerBI Report object (to be received via callback)\n embedConfiguration = {\n type: \"report\",\n id: embedToken.id,\n embedUrl: embedToken.embedUrl,\n tokenType: pbi.models.TokenType.Embed,\n accessToken: embedToken.embedToken.token,\n permissions: pbi.models.Permissions.Copy,\n viewMode: pbi.models.ViewMode.View,\n };\n }\n\n useEffect(() => {\n dispatch(fetchReportEmbedToken(id)).then(({ payload }) => setEmbedToken(payload));\n }, [dispatch, id]);\n\n if (embedToken === undefined && !isLoading) return ;\n\n if (!embedToken || isLoading) return ;\n return (\n \n {\n {\n setReport(embeddedReport as pbi.Report);\n }}\n />\n }\n \n );\n}\n\nexport default Report;\n","import React from \"react\";\n\ninterface Props {}\n\nfunction NotFound(props: Props) {\n return
not found
;\n}\n\nexport default NotFound;\n","import styled from \"styled-components\";\nimport { LogoutOutlined, UserOutlined } from \"@ant-design/icons\";\nimport { useHistory } from \"react-router-dom\";\nimport { Button } from \"antd\";\nimport { useAppSelector } from \"../store\";\nimport { breakpoint } from \"../theme\";\nimport DebounceSelect from \"./DebounceSelect\";\nimport axios from \"axios\";\nimport { useMsal } from \"@azure/msal-react\";\n\nconst StyledHeader = styled.header`\n font-size: 1.2em;\n background-color: #192b2a;\n font-weight: bold;\n text-align: center;\n display: flex;\n justify-content: space-between;\n padding: 10px 30px;\n color: white;\n height: auto;\n flex-wrap: wrap\n \n`;\n\nconst StyledActions = styled.div`\n display: flex;\n flex-direction: column;\n order: 3;\n flex: 40%;\n max-width: 40%;\n @media${breakpoint.device.sm}{\n flex-direction: row;\n flex: auto;\n max-width: max-content;\n }\n`;\n\nconst ImpersonateContainer = styled.div`\n flex: 100%;\n max-width: 100%;\n order: 2;\n margin: 10px 0 0 0;\n @media${breakpoint.device.sm}{\n flex: 30%;\n max-width: 30%;\n margin: 0 20px 0 auto;\n }\n`;\n\nconst ReportTitleContainer = styled.div`\n order: 1;\n text-align: left;\n line-height: 42px;\n margin: 0 0 0 20px;\n font-size: 1.2em;\n flex: auto;\n border-left: 1px solid white;\n padding-left: 20px;\n`;\n\nconst StyledBrand = styled.div`\n text-align: left;\n cursor: pointer;\n align-self: center;\n order: 0;\n flex: 60%;\n max-width: 60%;\n @media${breakpoint.device.sm}{\n flex: auto;\n max-width: max-content;\n }\n`;\n\nconst ImpersonateHeader = styled.div`\n width:100%;\n background-color: var(--orange);\n text-align: center;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding-top: 5px;\n @media${breakpoint.device.sm}{\n flex-direction: row;\n padding-top: 0px;\n }\n`;\n\n\ninterface Props {\n}\n\nconst searchAdUser = (userName) => {\n return axios.get(`/ad-users?filter=${userName}`).then((res) => res.data.map((e) => ({ label: e.userPrincipalName, value: e.userPrincipalName })));\n};\n\nfunction Header(props: Props) {\n const history = useHistory();\n const isAdmin = useAppSelector((state) => state.users.currentUser.isAdministrator);\n const reportName = useAppSelector((state) => state.reports.reportName);\n const impersonate = localStorage.getItem('ActAs') ? JSON.parse(localStorage.getItem('ActAs')) : \"\"; \n const { instance } = useMsal();\n\n const onChange = ({value}) => {\n localStorage.setItem('ActAs', JSON.stringify(value));\n window.location.reload();\n }\n\n const stopImpersonation = () => {\n localStorage.removeItem('ActAs');\n window.location.reload();\n }\n\n return (\n
\n \n {impersonate && impersonate !== \"\" && (\n \n Impersonating {impersonate}\n \n \n )}\n \n {\n //if navigated from dashboard history.action will be PUSH\n return history.push(\"/\");\n }}\n >\n {`FocustDNA`}\n \n {reportName && reportName !== \"\" && (\n \n {reportName}\n \n )}\n {false && isAdmin && (!impersonate || impersonate === \"\") && (\n \n \n \n )}\n \n {isAdmin && (\n \n )}\n \n \n \n
\n );\n}\n\nexport default Header;\n","import { Skeleton } from \"antd\";\nimport React, { ReactNode } from \"react\";\nimport styled from \"styled-components\";\n\nconst CardWrapper = styled.div`\n margin: 1rem;\n padding: 2rem;\n border-radius: 10px;\n background-color: white;\n`;\n\nfunction BlankCard({ style, loading, children }: { style?: React.CSSProperties; children: ReactNode; loading?: boolean }) {\n return (\n \n \n {children}\n \n \n );\n}\n\nexport default BlankCard;\n","import { Button, Form, Modal, Popconfirm, Select } from \"antd\";\nimport { useEffect, useState } from \"react\";\nimport { createUser, deleteUser, fetchCurrentUser, fetchUser, fetchUsers, updateUser, User } from \"../store/usersSlice\";\n\nimport { useAppDispatch, useAppSelector } from \"../store\";\nimport Checkbox from \"antd/lib/checkbox/Checkbox\";\nimport { fetchReportsIfEmpty } from \"../store/reportsSlice\";\nimport styled from \"styled-components\";\nimport { breakpoint } from \"../theme\";\nimport DebounceSelect from \"./DebounceSelect\";\nimport axios from \"axios\";\n\nconst Row = styled.div`\n width: 100%;\n @media${breakpoint.device.sm} {\n width: auto;\n }\n`;\n\nconst StyledButton = styled(Button)`\n width: 100%;\n margin-bottom: 20px;\n @media${breakpoint.device.sm} {\n width: auto;\n }\n`;\n\ninterface Props {\n userName: string;\n onClose: () => void;\n}\nconst layout = {\n labelCol: { span: 4 },\n wrapperCol: { span: 19 },\n};\nconst emptyUser = {\n isAdministrator: false,\n\n reportIds: [],\n userName: \"\",\n};\n\nconst searchAdUser = (userName) => {\n return axios.get(`/ad-users?filter=${userName}`).then((res) => res.data.map((e) => ({ label: e.userPrincipalName, value: e.userPrincipalName })));\n};\n\nfunction CreateUserForm({ userName, onClose }: Props) {\n const dispatch = useAppDispatch();\n const [user, setUser] = useState(null);\n const reports = useAppSelector((state) => state.reports.data);\n const loading = useAppSelector((state) => state.users.loadingUser);\n //const adUsers = useAppSelector((state) => state.users.adUsers);\n const currentUserUsername = useAppSelector((state) => state.users.currentUser.userName);\n const refetchUsers = () => dispatch(fetchUsers());\n\n useEffect(() => {\n setUser(emptyUser);\n if (userName) {\n dispatch(fetchUser(userName)).then(({ payload }) => setUser(payload));\n } else {\n setUser(null);\n }\n }, [dispatch, userName]);\n\n useEffect(() => {\n dispatch(fetchReportsIfEmpty());\n //dispatch(fetchAdUsers());\n }, [dispatch]);\n const onFinish = (data) => {\n // console.log(data, report);\n const payload = {\n ...user,\n ...data,\n };\n\n if (typeof payload.userName === \"object\") {\n payload.userName = payload.userName.value;\n }\n if (userName) {\n return dispatch(updateUser(payload)).then((_) => {\n //if we are editing our info we are refetching currentUser\n if (userName === currentUserUsername) {\n dispatch(fetchCurrentUser(currentUserUsername));\n }\n refetchUsers();\n onClose();\n });\n }\n return dispatch(createUser(payload)).then((_) => {\n refetchUsers();\n onClose();\n });\n };\n\n const onDelete = () => {\n if (userName) {\n dispatch(deleteUser(userName)).then((_) => {\n refetchUsers();\n onClose();\n });\n }\n };\n\n return (\n \n setUser(emptyUser)}>\n Create User\n \n {\n setUser(null);\n onClose();\n }}\n >\n e?.resetFields()}\n style={{ margin: 20 }}\n {...layout}\n name=\"basic\"\n initialValues={{\n isAdministrator: user?.isAdministrator,\n reportIds: user?.reportIds,\n userName: user?.userName,\n }}\n onFinish={onFinish}\n >\n \n {!userName ? : userName}\n \n \n \n \n\n \n \n \n\n \n \n {userName && (\n \n \n \n )}\n \n \n \n \n );\n}\n\nexport default CreateUserForm;\n","import { Button, Checkbox, Input, List } from \"antd\";\nimport { useEffect, useMemo, useState } from \"react\";\nimport styled from \"styled-components\";\nimport BlankCard from \"../components/BlankCard\";\nimport { Loading } from \"../components/Loading\";\nimport { useAppDispatch, useAppSelector } from \"../store\";\nimport { fetchUsers } from \"../store/usersSlice\";\nimport CreateUserForm from \"../components/CreateUserForm\";\nimport { Redirect } from \"react-router\";\nimport { breakpoint } from \"../theme\";\n\nconst Row = styled.div`\n display: flex;\n justify-content: space-between;\n flex-direction: column;\n align-items: center;\n margin-bottom: 20px;\n @media${breakpoint.device.sm}{\n flex-direction: row;\n }\n`;\n\nconst Filter = styled.div`\n width: 100%;\n @media${breakpoint.device.sm}{\n width: 50%;\n }\n`;\n\n\n\nfunction Users() {\n const dispatch = useAppDispatch();\n\n const loading = useAppSelector((state) => state.users.loading);\n const users = useAppSelector((state) => state.users.data);\n const isAdmin = useAppSelector((state) => state.users.currentUser.isAdministrator);\n const [currentUser, setCurrentUser] = useState(\"\");\n const [filterUsername, setFilterUsername] = useState(\"\");\n const [filterAdminsOnly, setFilterAdminsOnly] = useState(false);\n useEffect(() => {\n dispatch(fetchUsers());\n }, [dispatch]);\n\n const filteredUsers = useMemo(() => {\n return users.filter((el) => el.userName.includes(filterUsername) && (filterAdminsOnly ? el.isAdministrator === filterAdminsOnly : true));\n }, [users, filterUsername, filterAdminsOnly]);\n\n if (loading) return ;\n if (!isAdmin) return ;\n\n return (\n \n \n setCurrentUser(null)} userName={currentUser} />\n \n setFilterUsername(e.target.value)} />\n setFilterAdminsOnly(!filterAdminsOnly)} checked={filterAdminsOnly}>\n Show Admins Only\n \n \n \n (\n setCurrentUser(item.userName)} key={item.userName}>\n edit\n ,\n ]}\n >\n {item.userName}

} description={item.isAdministrator && \"Admin\"} />\n \n )}\n />\n
\n );\n}\n\nexport default Users;\n","import axios from \"axios\";\nimport { useAppDispatch } from \"./store\";\nimport { pushMessage } from \"./store/messagesSlice\";\nimport { useEffect, useState } from \"react\";\nimport { useMsal } from \"@azure/msal-react\";\n\nfunction useInterceptors({ envConfig, token }) {\n const dispatch = useAppDispatch();\n const [ready, setReady] = useState(false);\n const impersonate = localStorage.getItem('ActAs') ? JSON.parse(localStorage.getItem('ActAs')) : \"\"; \n const { instance } = useMsal();\n \n useEffect(() => {\n if(!envConfig || !token) return;\n setReady(true);\n\n const requestInterceptor = axios.interceptors.request.use(\n function (config) {\n\n config.baseURL = envConfig.API_URL;\n config.headers = {\n Authorization: `Bearer ${token}`,\n \"Content-Type\": \"application/json\",\n };\n if(impersonate && impersonate !== \"\"){\n config.headers = { ...config.headers, ...{ \"ActAs\": impersonate }}\n }\n // Do something before request is sent\n return config;\n },\n function (error) {\n // Do something with request error\n return Promise.reject(error);\n }\n );\n\n const responseInterceptor = axios.interceptors.response.use(\n // Add a response interceptor\n function (response) {\n // Any status code that lie within the range of 2xx cause this function to trigger\n // Do something with response data\n return response;\n },\n function (error) {\n if (!error.response.status) return Promise.reject(error);\n console.log(error.response.status);\n const resData = error.response?.data;\n if (error.response.status === 404 && resData === \"Cannot get specific user\") {\n return Promise.reject(error);\n }\n\n dispatch(\n pushMessage({\n message: \"Error \" + error?.response?.status,\n description: error.message || \"something went wrong\",\n type: \"error\",\n })\n );\n if (error.response.status === 401) {\n //localStorage.clear();\n localStorage.removeItem('ActAs');\n const request = {\n scopes: [envConfig.auth.scope],\n };\n instance.acquireTokenRedirect(request).then();\n console.log(\"logout should called\");\n }\n // Any status codes that falls outside the range of 2xx cause this function to trigger\n // Do something with response error\n return Promise.reject(error);\n }\n );\n\n return () => {\n axios.interceptors.request.eject(requestInterceptor);\n axios.interceptors.request.eject(responseInterceptor);\n };\n }, [dispatch, envConfig, token, instance, impersonate]);\n\n return ready;\n}\n\nexport default useInterceptors;\n","import { useState, useEffect } from \"react\";\nimport axios from \"axios\";\nimport { PublicClientApplication, Configuration } from \"@azure/msal-browser\";\n\n// Browser check variables\n// If you support IE, our recommendation is that you sign-in using Redirect APIs\n// If you as a developer are testing using Edge InPrivate mode, please add \"isEdge\" to the if check\nconst ua = window.navigator.userAgent;\nconst msie = ua.indexOf(\"MSIE \");\nconst msie11 = ua.indexOf(\"Trident/\");\nconst msedge = ua.indexOf(\"Edge/\");\nconst firefox = ua.indexOf(\"Firefox\");\nconst isIE = msie > 0 || msie11 > 0;\nconst isEdge = msedge > 0;\nconst isFirefox = firefox > 0; // Only needed if you need to support the redirect flow in Firefox incognito\n\nfunction useConfigLoader() {\n const [config, setConfig] = useState(null);\n const [isConfigLoaded, setIsConfigLoaded] = useState(false);\n const [authConfig, setAuthConfig] = useState(null);\n\n useEffect(() => {\n if(isConfigLoaded) return;\n \n axios\n .get(\"../env.json\")\n .then(function (response) {\n // Msal Configurations\n const conf: Configuration = {\n auth: {\n authority: response.data.auth.authority,\n clientId: response.data.auth.clientId,\n redirectUri: window.location.origin,\n postLogoutRedirectUri: \"/\"\n },\n cache: {\n storeAuthStateInCookie: isIE || isEdge || isFirefox\n },\n };\n const auth = new PublicClientApplication(conf);\n setAuthConfig(auth);\n setConfig(response.data);\n setIsConfigLoaded(true);\n })\n .catch(function (error) {\n console.log(\"Could not load application configuration.\");\n console.log(error);\n });\n }, [isConfigLoaded]);\n\n return {isConfigLoaded: isConfigLoaded, envConfig: config, authConfig: authConfig}; \n}\n\nexport default useConfigLoader;","import { useState, useEffect } from \"react\";\nimport { useMsal } from \"@azure/msal-react\";\nimport { InteractionRequiredAuthError } from \"@azure/msal-browser\";\nimport { setUser } from \"../store/usersSlice\";\nimport { useAppDispatch } from \"../store\";\n\nfunction useAccessToken(envConfig) {\n const { instance, accounts } = useMsal();\n const [accessToken, setAccessToken] = useState(null);\n const dispatch = useAppDispatch();\n\n useEffect(() => {\n if (!envConfig) return;\n\n if (accounts.length > 0) {\n const request = {\n scopes: [envConfig.auth.scope],\n account: accounts[0]\n };\n dispatch(setUser(accounts[0].username));\n instance.acquireTokenSilent(request).then(response => {\n setAccessToken(response.accessToken);\n }).catch(error => {\n // acquireTokenSilent can fail for a number of reasons, fallback to interaction\n if (error instanceof InteractionRequiredAuthError) {\n instance.acquireTokenRedirect(request).then(response => {\n });\n }\n });\n }\n }, [envConfig, accounts, instance, dispatch]);\n\n return accessToken;\n}\n\nexport default useAccessToken;","import React, { FC, useEffect } from \"react\";\n\nimport { BrowserRouter as Router, Switch, Route } from \"react-router-dom\";\nimport Dashboard from \"./pages/Dashboard\";\nimport Report from \"./pages/Report\";\n\nimport NotFound from \"./pages/NotFound\";\nimport Header from \"./components/Header\";\n\nimport Messages from \"./components/Messages\";\nimport { InteractionType } from \"@azure/msal-browser\";\nimport { MsalProvider, AuthenticatedTemplate, UnauthenticatedTemplate, MsalAuthenticationTemplate, useMsal } from \"@azure/msal-react\";\nimport { Button } from \"antd\";\nimport { Loading } from \"./components/Loading\";\nimport Users from \"./pages/Users\";\nimport { useAppSelector } from \"./store\";\nimport { fetchCurrentUser, setUser } from \"./store/usersSlice\";\nimport { useDispatch } from \"react-redux\";\nimport useInterceptors from \"./useInterceptors\";\nimport useConfigLoader from \"./hooks/useConfigLoader\";\nimport useAccessToken from \"./hooks/useAccessToken\";\n\nlet App = ({ envConfig }: { envConfig: any}) => {\n const dispatch = useDispatch();\n const token = useAccessToken(envConfig);\n const isReady = useInterceptors({ envConfig, token });\n const isLoading = useAppSelector((state) => state.users.loadingCurrentUser);\n const impersonate = localStorage.getItem('ActAs') ? JSON.parse(localStorage.getItem('ActAs')) : \"\"; \n const userName = useAppSelector((state) => state.users.username);\n \n\n useEffect(() => {\n if(!isReady) return;\n if(impersonate && impersonate !== \"\"){\n dispatch(setUser(impersonate));\n } \n\n if (userName) dispatch(fetchCurrentUser(userName));\n }, [userName, dispatch, impersonate, isReady]);\n\n if (isLoading || !isReady) return ;\n\n return (\n <>\n
\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n );\n};\nApp = React.memo(App);\n\nconst AppSecurity: FC = () => {\n const {isConfigLoaded, envConfig, authConfig} = useConfigLoader();\n const { instance } = useMsal();\n \n return ( isConfigLoaded &&\n \n \n \n \n \n An error occured during authentication, please try again\n

\n \n

\n
\n \n \n
\n );\n};\n\nconst AppWithRouter = () => {\n return (\n \n \n \n );\n};\nexport default AppWithRouter;\n","import { ReportHandler } from 'web-vitals';\n\nconst reportWebVitals = (onPerfEntry?: ReportHandler) => {\n if (onPerfEntry && onPerfEntry instanceof Function) {\n import('web-vitals').then(({ getCLS, getFID, getFCP, getLCP, getTTFB }) => {\n getCLS(onPerfEntry);\n getFID(onPerfEntry);\n getFCP(onPerfEntry);\n getLCP(onPerfEntry);\n getTTFB(onPerfEntry);\n });\n }\n};\n\nexport default reportWebVitals;\n","import ReactDOM from \"react-dom\";\n\nimport App from \"./App\";\nimport reportWebVitals from \"./reportWebVitals\";\nimport React from \"react\";\nimport \"./App.less\";\n\nimport { Provider } from \"react-redux\";\nimport store from \"./store\";\n\nReactDOM.render(\n \n {/* */}\n \n {/* */}\n ,\n document.getElementById(\"root\")\n);\n\n// If you want to start measuring performance in your app, pass a function\n// to log results (for example: reportWebVitals(console.log))\n// or send to an analytics endpoint. Learn more: https://bit.ly/CRA-vitals\nreportWebVitals();\n"],"sourceRoot":""}