{"version":3,"file":"main.01c7ce41acdd55aa.js","mappings":"6JASO,IAAMA,EAAiB,YAAxB,MAAOA,EACTC,YAAoBC,IAAmE,wDAAnEC,wCAAuE,CAEpFC,WAAWC,GACd,OAAOF,KAAKD,kCAAkCI,QAC1C,+BACA,CACIC,IAAK,2CACLC,KAAM,GACNC,iBAAiB,GAClBJ,EAEX,WAZSL,KAAiBU,KAAjBV,EAAiB,sCAAjBA,GAAiBW,sBAAjBX,EAAiB,0BAAjBA,EAAiBY,QAAjBZ,EAAiB,qBAFd,UAEHA,CAAiB,oDCTvB,IAAKa,EAGX,aAHWA,QAAqB,KAC7BA,qBACAA,yCAFQA,EAAZ,IAAYA,GAGX,yPC2KM,IAAMC,EAAoB,YAA3B,MAAOA,iBAAoBC,KAApBD,EAAoB,sCAApBA,EAAoB,WAApBA,EAAoB,wBAApBA,MAAoB,OAApBA,EAAoB,4BA9DzBE,KACAC,KACAC,KACAC,KACAC,KACAC,KACAC,IACAC,KACAC,KACAC,KACAC,KACAC,KACAC,KACAN,IACAO,KACAC,KACAC,KACAC,SA6CKlB,CAAoB,0HC5K7BmB,kBAAkE,MAAlEA,CAAkE,SACDA,mBAAOA,UAAQA,mCAChFA,cAF4DA,sBCazD,IAAMC,EAAkB,YAAzB,MAAOA,EAAkBjC,6CAEM,IAAI,+BACJkC,MAAOC,cAAa,WAH5CF,KAAkBxB,KAAlBwB,EAAkB,sCAAlBA,EAAkB,WAAlBA,EAAkB,wBAAlBA,EAAkBG,uRDf/BJ,iBACIA,SACAA,wBAGJA,eAJIA,2CACsCA,8ECK1B,IACRK,MAAQ,OAAQ,IACZC,MAAM,UAAQC,MAAM,CAACC,QAAS,MAAG,EACjCC,MAAW,aAAc,IACrBC,MAAQ,cAIXT,CAAkB,qICAxB,IAAMU,EAAkB,YAAzB,MAAOA,EAAkB3C,2EAIR,IAAI4C,MAAmB,CAEnCC,YAAYC,GACf,IAAIC,EAgBZ,SAASC,EAAoBF,GACzB,OAAMA,aAAsBZ,OACxBY,EAAa,IAAIZ,KAAKY,IAEnBG,KAAKC,MAAMD,KAAKE,IAAI,EAAGL,EAAWM,WAAO,IAASlB,MAAOkB,YAAc,GAClF,CArBsBJ,CAAoBF,GAClC5C,KAAKmD,gBACDC,KAAgB,EAAG,KAAMC,QACrBC,KAAKT,EAAU,IAAC,EAChBU,KAAIC,GAAKT,KAAKC,MAAMH,EAAUW,KAAE,EAChCC,KAAID,GAAKxD,KAAK0D,oBAAoBF,KAAE,EACpCD,KAAII,GAChB,CAEQD,oBAAoBE,GACpBA,GAAoB,GACpB5D,KAAK6D,UAAUC,MAEvB,WApBSrB,KAAkB7B,KAAlB6B,EAAkB,sCAAlBA,EAAkB,WAAlBA,EAAkB,wBAAlBA,EAAkBP,0GCf/BJ,iGDeaW,CAAkB,KA8B/B,SAASkB,EAAgBC,GACrB,IACIf,EAAUe,EAAmB,GACjC,OAAOG,EAFOhB,KAAKC,MAAMY,EAAmB,KAEhB,IAAMG,EAAUlB,EAChD,CAEA,SAASkB,EAAUC,GACf,IAAIC,EAAID,EAAEE,WACV,KAAOD,EAAEE,OAAS,GACdF,EAAI,IAAMA,EAEd,OAAOA,CACX,gDEzDO,IAAKG,EAIX,aAJWA,QAA6B,KACrCA,2BACAA,2BACAA,2BAHQA,EAAZ,IAAYA,GAIX,uFCEM,IAAMC,EAAc,YAArB,MAAOA,EACTvE,YAC4CwE,IAAoB,mCAApBtE,mBACxC,CAKGuE,aACH,OAAOvE,KAAKsE,YAChB,WAVSD,KAAcG,KAAdH,EAAc,sCAAdA,GAAcI,MAEXC,MAAa,WAFhBL,EAAc,0BAAdA,EAAc5D,QAAd4D,EAAc,qBAFX,UAEHA,CAAc,6BCEpB,IAAMM,EAAiB,YAAxB,MAAOA,EACT7E,YACY8E,EACAC,EACAC,IAAqD,mIAFrD9E,uBACAA,2BACAA,iCACR,CAEG+E,OAAOC,EAAcC,GAAqC,GAC7D,IAAI7E,EAAMJ,KAAK4E,gBAAgBL,aAE/B,OAAIU,IACA7E,EAAMJ,KAAKkF,cAAc9E,EAAKJ,KAAK8E,2BAA2BK,6BAC9D/E,EAAMJ,KAAKkF,cAAc9E,EAAKJ,KAAK6E,oBAAoBO,uBAG/B,MAAxBhF,EAAIA,EAAI+D,OAAS,IAA0B,MAAZa,EAAK,KACpC5E,GAAO,KAGiB,MAAxBA,EAAIA,EAAI+D,OAAS,IAA0B,MAAZa,EAAK,KACpCA,EAAOA,EAAKK,OAAO,IAGvBjF,GAAO4E,GACP5E,EAAMkF,UAAUlF,IACLmF,QAAQ,IAAK,MAC5B,CAEQL,cAAc9E,EAAaoF,GAC/BpF,SAAMJ,KAAKyF,YAAYrF,IAIvBA,EAAMJ,KAAKyF,YAFXrF,GAAOoF,GAAc,KAIbrB,OAAS,GAAgB,MAAX/D,EAAI,IAAyB,MAAXA,EAAI,KACxCA,EAAMA,EAAIiF,OAAO,IAGdjF,CACX,CAEQqF,YAAYrF,GAChB,MAA4B,MAAxBA,EAAIA,EAAI+D,OAAS,KACjB/D,GAAO,KAGJA,CACX,WAhDSuE,KAAiBH,KAAjBG,EAAiB,sCAAjBA,GAAiBF,0CAAjBE,EAAiB,0BAAjBA,EAAiBlE,QAAjBkE,EAAiB,qBAFd,UAEHA,CAAiB,2JCIvB,IAAMe,EAA0B,YAAjC,MAAOA,EACT5F,YACY6F,EACAC,EACAC,IAAmC,iIAFnC7F,2BACAA,8BACAA,wBACR,CAEG8F,yBACH,IAAIC,EAAU/F,KAAK2F,oBAAoBK,iBACvC,GAAIhG,KAAKiG,QAAQF,GACb,OAAI/F,KAAKkG,gBAAgBH,GACd/F,KAAK4F,uBAAuBO,eAAe,CAC9CC,oBAAqBL,EAASK,oBAAqBC,MACnDC,aAAcP,EAASO,eACxBjD,QAAKI,KAAI,OAAWD,IACnBxD,KAAK6F,kBAAkBU,gBAAgB/C,EAAC,IAC3C,EAAED,KAAKiD,IACAA,EACAxG,KAAK2F,oBAAoBc,eAAeD,GAOxCT,EAAU/F,KAAK2F,oBAAoBK,iBAEhCQ,GAAUA,EAAOJ,qBAAuBI,EAAOJ,oBAAoBC,UAC5E,EAGCK,MAAaX,EAASK,oBAAqBC,MAE1D,CAEOM,8BACH,OAAO3G,KAAKiG,QAAQjG,KAAK2F,oBAAoBK,iBACjD,CAEQC,QAAQF,GACZ,SAAUA,GACHA,EAAQK,qBACRL,EAAQK,oBAAoBQ,UAC5Bb,EAAQK,oBAAoBS,WAC5BC,MAAWf,EAAQK,oBAAoBS,WAAWE,KAAKD,SAAgB,EAClF,CAEQZ,gBAAgBH,GACpB,IAAIiB,EAAgBF,MAAWf,EAAQK,oBAAqBS,WAAWE,KAAKD,MAAWf,EAAQK,oBAAqBQ,WACpH,OAAOE,QAAaC,KAAKD,MAAWf,EAAQK,oBAAqBQ,WAAaI,EAAgB,CAClG,WAlDStB,KAA0BuB,KAA1BvB,EAA0B,sCAA1BA,GAA0BwB,4CAA1BxB,EAA0B,0BAA1BA,EAA0BjF,QAA1BiF,EAA0B,qBAFvB,UAEHA,CAA0B,+GCHhC,IAAMyB,EAAiB,YAAxB,MAAOA,EACTrH,YAAoBC,IAAmE,wDAAnEC,wCAAuE,CAEpFoH,WAAWlH,GACd,OAAOF,KAAKD,kCAAkCI,QAC1C,+BACA,CACIC,IAAK,oCACLC,KAAM,GACNC,iBAAiB,GAClBJ,EAEX,WAZSiH,KAAiB3C,KAAjB2C,EAAiB,sCAAjBA,GAAiB1C,sBAAjB0C,EAAiB,0BAAjBA,EAAiB1G,QAAjB0G,EAAiB,qBAFd,UAEHA,CAAiB,6BCCvB,IAAME,EAAqB,YAA5B,MAAOA,EAGTvH,YACIwH,EACAC,EACAC,IAAoD,uBALrC,IAAIC,IAA8B,KAAE,EAOnDC,KACIH,EAAmBI,qBACnBH,EAA0BI,oBAC5BC,UAAU,KACR,MAAMC,EAAcP,EAAmBvB,iBACnC8B,IACIA,EAAYC,iBACZ/H,KAAKgI,SAASC,KAAK,CAAC,CAChBC,WAAYJ,EAAYC,iBAAiBI,KACzCC,WAAYN,EAAYC,iBAAiBM,QAG7Cf,EAAkBF,aAAaS,UAAUrB,IACrCxG,KAAKgI,SAASC,KAAKzB,EAAM,GAC5B,EAIjB,CAEW8B,4BACP,OAAOtI,KAAKgI,QAChB,WA9BSX,KAAqB7C,KAArB6C,EAAqB,sCAArBA,GAAqB5C,0CAArB4C,EAAqB,0BAArBA,EAAqB5G,QAArB4G,EAAqB,qBAFlB,UAEHA,CAAqB,8ECL3B,IAAMkB,EAA4B,YAAnC,MAAOA,EACFC,4BAA4BC,EAAkCC,EAAqBC,GACtF,OAAOF,EACFG,MAAM,KACNrF,IAAIC,GAAKA,EAAE+B,QAAQ,cAAemD,GAAanD,QAAQ,eAAgBoD,IACvEE,OAAOrF,GAAKA,EACrB,WANS+E,KAA4B3H,KAA5B2H,EAA4B,sCAA5BA,EAA4B,WAA5BA,EAA4B,0BAA5BA,EAA4B9H,QAA5B8H,EAA4B,qBAFzB,UAEHA,CAA4B,2LCclC,IAAMO,EAAc,YAArB,MAAOA,EACThJ,YACYiJ,EACAC,EACAC,EACAC,EACArD,EACAsD,IAAmC,+PALnCnJ,kBACAA,0BACAA,mCACAA,+BACAA,yBACAA,wBAEZ,CAOOG,QAAWD,GACdF,KAAKoJ,SAASlJ,GACdA,EAAUF,KAAKqJ,4BAA4BnJ,GAE3C,MAAMoJ,EAAyC,GAM/C,GAJMpJ,EAAQG,gBAAgBkJ,WAC1BD,EAAY,gBAAkB,oBAG9BpJ,EAAQI,gBAAiB,CACzB,IAAIkJ,EAAsBxJ,KAAKiJ,4BAA4BnD,yBAC3D,MAAM2D,EAAU,IAAIC,IACpB,OAAIF,GACItJ,EAAQyJ,sBACR3J,KAAKmJ,kBAAkBS,aACvBJ,EAAsBA,EAAoBnG,QAAKwG,KAAS,IAAM7J,KAAKmJ,kBAAkBW,kBAGzFN,EAAoBnG,QAAKI,KAAI,OAAWD,IACpCiG,EAAQM,MAAMvG,EAAC,IACfqE,UAAUxB,IACNA,GACAiD,EAAYU,cAAmB,UAAY3D,EAC3CrG,KAAKiK,KAAQ/J,EAASoJ,GAAajG,QAC/BI,KAAI,OAAWD,IACXxD,KAAK6F,kBAAkBU,gBAAgB/C,GACvCiG,EAAQM,MAAMvG,EAAC,IACfqE,UAAUrB,GACViD,EAAQxB,KAAKzB,MAGrBxG,KAAKkJ,wBAAwBgB,kBAC7BT,EAAQU,WAAQ,GAIjBV,IAGXzJ,KAAKkJ,wBAAwBgB,kBAC7BT,EAAQU,WACDV,GAGX,OAAOzJ,KAAKiK,KAAQ/J,EAASoJ,GAAajG,QACtCI,KAAO,OAAWD,IACdxD,KAAK6F,kBAAkBU,gBAAgB/C,EAAC,GAEpD,CAEQyG,KAAQ/J,EAAyBoJ,GACrC,IAAI9C,EAASxG,KAAK+I,WAAWkB,KACzBjK,KAAKgJ,mBAAmBjE,OAAO7E,EAAQE,IAAKF,EAAQ+E,2BACpD/E,EAAQG,KACR,CAAE+J,QAAS,IAAIC,KAAYf,KAG/B,OAAIpJ,EAAQyJ,sBACR3J,KAAKmJ,kBAAkBS,aACvBpD,EAASA,EAAOnD,QAAKwG,KAAS,IAAM7J,KAAKmJ,kBAAkBW,kBAGxDtD,CACX,CAMQ6C,4BAA4BnJ,GAChCA,MACuC,kBADvCA,EAAUoK,OAAOC,OAAO,GAAIrK,IACTI,kBACfJ,EAAQI,iBAAkB,GAGa,kBAAhCJ,EAAQyJ,sBACfzJ,EAAQyJ,qBAAsB,GAG3BzJ,CACX,CAEQkJ,SAASlJ,GACb,IAAKA,EACD,MAAM,IAAIsK,MAAM,+BAGpB,IAAKtK,EAAQE,IACT,MAAM,IAAIoK,MAAM,iCAExB,WA3GS1B,KAActE,KAAdsE,EAAc,sCAAdA,GAAcrE,8EAAdqE,EAAc,0BAAdA,EAAcrI,QAAdqI,EAAc,qBAFX,UAEHA,CAAc,KCRd2B,EAAgC,YAAvC,MAAOA,EACT3K,YAAoB4K,IAA+B,kEAEa,IAF5C1K,sBAAmC,CAIhDG,QACHwK,EACAC,EACAC,GAKA,GAHAA,EAAkB7K,KAAK8K,0BAA0BD,GACjDD,EAAiB5K,KAAK+K,0BAA0BH,EAAgBC,GAE5DA,EAAgBG,2BAA6B5G,aAC7C,OAAOpE,KAAK0K,gBAAgBvK,QAAQyK,GAGxC,GAAIC,EAAgBG,2BAA6B5G,cAAyC,CACtF,MAAM6G,EAAkBjL,KAAKkL,aAAaP,GAC1C,GAAIM,EACA,OAAOA,EAAgBE,SAAS,EAAC,CAIzC,GAAIN,EAAgBG,2BAA6B5G,aAAwC,CACrF,MAAM6G,EAAkBjL,KAAKkL,aAAaP,GACtCM,GACAA,EAAgBG,aAAaC,aAAW,CAIhD,MAAM5B,EAAU,IAAIC,IACpB,YAAKwB,aAAaP,GAAa,CAC3BS,aAAcpL,KAAKsL,mBAAmBX,EAAWC,GACjDO,SAAU,CAAC1B,IAGRA,EAAQ8B,cACnB,CAEQD,mBAAmBX,EAAmBC,GAC1C,OAAO5K,KAAK0K,gBACPvK,QAAQyK,GAAgBvH,QACzBwG,KAAS,IAAM7J,KAAKwL,qBAAqBb,KACxC9C,UAAUrE,GAAKxD,KAAKyL,uBAAuBjI,EAAGmH,GACvD,CAEQc,uBAA0BC,EAASf,GACvC,MAAMM,EAAkBjL,KAAKkL,aAAaP,GAC1C,GAAIM,EACA,QAASxB,KAAWwB,EAAgBE,SAChC1B,EAAQxB,KAAKyD,GAGrB1L,KAAKwL,qBAAqBb,EAC9B,CAEQa,qBAAqBb,UAClB3K,KAAKkL,aAAaP,EAC7B,CAEQG,0BAA0BD,GAC9BA,gBAAkBP,OAAOC,OAAO,GAAIM,GAAmB,KAE5BG,0BAA8B,MACrDH,EAAgBG,0BAA4B5G,eAGG,kBAAxCyG,EAAgBlB,sBACvBkB,EAAgBlB,qBAAsB,GAGe,kBAA9CkB,EAAgB5F,4BACvB4F,EAAgB5F,2BAA4B,GAGzC4F,CACX,CAEQE,0BAA0BH,EAAgCC,GAC9DD,MAEkD,kBAFlDA,EAAiBN,OAAOC,OAAO,GAAIK,IAETjB,sBACtBiB,EAAejB,oBAAsBkB,EAAgBlB,qBAGD,kBAA7CiB,EAAe3F,4BACtB2F,EAAe3F,0BAA4B4F,EAAgB5F,2BAGxD2F,CACX,WA3FSH,KAAgCjG,KAAhCiG,EAAgC,sCAAhCA,GAAgChG,oBAAhCgG,EAAgC,0BAAhCA,EAAgChK,QAAhCgK,EAAgC,qBAF7B,UAEHA,CAAgC,8ECNtC,IAAMkB,EAAsB,YAA7B,MAAOA,EAIFC,gBAAgBC,GACnB,MAAMC,EAAKC,SAASC,cAAc,YAClCF,EAAGG,MAAQJ,EACXC,EAAGI,aAAa,WAAY,IAC5BJ,EAAGzJ,MAAM8J,SAAW,WACpBL,EAAGzJ,MAAM+J,KAAO,UAChBL,SAAS1L,KAAKgM,YAAYP,GAC1BA,EAAGQ,SACHP,SAASQ,YAAY,QACrBR,SAAS1L,KAAKmM,YAAYV,EAC9B,WAdSH,KAAsB/K,KAAtB+K,EAAsB,sCAAtBA,EAAsB,WAAtBA,EAAsB,0BAAtBA,EAAsBlL,QAAtBkL,EAAsB,qBAFnB,UAEHA,CAAsB,yHCK5B,IAAMc,EAA+B,YAAtC,MAAOA,EACT3M,YACY+E,EACA6H,IAAqC,yHAKjB,IAAIC,SAAyDC,KAAU,+BAC5E,IAPf5M,2BACAA,0BAERA,KAAK6E,oBAAoBgI,YAAYhF,UAAUrE,GAAKxD,KAAK8M,cAActJ,GAC3E,CAKQsJ,cAAcC,GACd/M,KAAKgN,kBAAoBD,IAAoB/M,KAAKgN,kBAAoBD,KACtE/M,KAAKgN,iBAAmBD,EACxB/M,KAAKiN,UAEb,CAEOA,UACCjN,KAAKgN,iBACLhN,KAAK0M,mBAAmBzM,WAAW,CAC/B+K,0BAA2B5G,aAC3BuF,qBAAqB,IACtB9B,UAAUrB,GACTxG,KAAKkN,sBAAsBjF,KAAKzB,IAGpCxG,KAAKkN,sBAAsBjF,UAAK2E,EAExC,CAEWO,oBACP,OAAOnN,KAAKkN,qBAChB,WAjCST,KAA+BlM,KAA/BkM,EAA+B,sCAA/BA,GAA+BW,iCAA/BX,EAA+B,0BAA/BA,EAA+BhM,QAA/BgM,EAA+B,qBAF5B,UAEHA,CAA+B,wJCErC,IAAMY,EAAkB,YAAzB,MAAOA,EACTvN,YACYwN,EACAC,EACAC,EACA1I,EACA2I,IAA2D,yQAQzC,IAAId,IAAwB,KAZ9C3M,eACAA,4BACAA,qCACAA,kCACAA,qCAERA,KAAKsN,QACAI,OACArK,QAAKwF,KAAO8E,GAAKA,aAAaC,OAC9B/F,UAAU,IAAM7H,KAAK6N,eAC9B,CAIOzI,qBACH,OAAOpF,KAAKuN,qBAAqBO,kBAAkBC,OAAO3F,YAAiB,EAC/E,CAEO4F,eAAetF,GAClB1I,KAAKsN,QAAQW,SAASjO,KAAKkO,cAAcxF,GAC7C,CAEWmE,kBACP,OAAO7M,KAAKmO,mBAChB,CAEQN,eACJ,MAAMnF,EAAc1I,KAAKoF,qBACrBsD,GAAe1I,KAAKmO,oBAAoBC,YACxCpO,KAAKmO,oBAAoBlG,KAAKS,EAEtC,CAEQwF,cAAcxF,GAClB,MAAM2F,EAAerO,KAAKuN,qBAAqBO,kBACzCQ,EAAyBtO,KAAK8E,2BAA2BK,4BAE/D,GAAIkJ,EAAa3C,MAAQ2C,EAAa3C,KAAK6C,sBACvC,OAAOvO,KAAKyN,8BAA8BjF,4BAA4B6F,EAAa3C,KAAK6C,sBAAuB7F,EAAa4F,GAGhI,MAAM9H,EAASxG,KAAKwN,8BAA8BgB,sBAAsB,CACpEC,MAAOJ,EACPK,UAAW,aACXC,WAAYjG,EACZkG,wBAAwB,IAG5B,OAAK5O,KAAKoF,sBAAwBsD,GAC9BlC,EAAOqI,OAAOP,EAAyB,EAAI,EAAG,EAAG5F,GAG9ClC,CACX,WAvDS6G,KAAkBzM,KAAlByM,EAAkB,sCAAlBA,GAAkBD,mEAAlBC,EAAkB,0BAAlBA,EAAkB5M,QAAlB4M,EAAkB,qBAFf,UAEHA,CAAkB,6ICDxB,IAAMyB,EAAyB,YAAhC,MAAOA,EACThP,YACYwN,EACAC,EACAC,EACAC,IAA2D,sOAH3DzN,eACAA,4BACAA,qCACAA,qCAERA,KAAKsN,QACAI,OACArK,QAAKwF,KAAO8E,GAAKA,aAAaC,OAC9B/F,UAAU,IAAM7H,KAAK6N,eAC9B,CAIYkB,gCAGR,OAAK/O,KAAKgP,6BACNhP,KAAKgP,2BAA6B,IAAIrC,IAAwB3M,KAAKmF,8BAGhEnF,KAAKgP,0BAChB,CAEO7J,4BACH,OAAOnF,KAAKuN,qBAAqBO,kBAAkBC,OAAOkB,aAAkB,EAChF,CAEOC,sBAAsBvG,GACzB3I,KAAKsN,QAAQW,SAASjO,KAAKkO,cAAcvF,GAAsB,IACnE,CAEWf,yBACP,OAAO5H,KAAK+O,yBAChB,CAEQlB,eACJ,MAAMlF,EAAqB3I,KAAKmF,4BAC5BwD,GAAsB3I,KAAK+O,0BAA0BX,YACrDpO,KAAK+O,0BAA0B9G,KAAKU,EAE5C,CAEQuF,cAAcvF,GAClB,MAAM0F,EAAerO,KAAKuN,qBAAqBO,kBAE/C,GAAIO,EAAa3C,MAAQ2C,EAAa3C,KAAK6C,sBACvC,OAAOvO,KAAKyN,8BAA8BjF,4BAA4B6F,EAAa3C,KAAK6C,sBAAuBF,EAAaN,OAAO3F,YAAiB,GAAIO,GAG5J,MAAMnC,EAASxG,KAAKwN,8BAA8BgB,sBAAsB,CACpEC,MAAOzO,KAAKuN,qBAAqBO,kBACjCY,UAAW,cACXC,WAAYhG,EACZiG,wBAAwB,IAG5B,OAAK5O,KAAKmF,6BAA+BwD,GACrCnC,EAAOqI,OAAO,EAAG,EAAGlG,GAGjBnC,CACX,WA/DSsI,KAAyBlO,KAAzBkO,EAAyB,sCAAzBA,GAAyB1B,wDAAzB0B,EAAyB,0BAAzBA,EAAyBrO,QAAzBqO,EAAyB,qBAFtB,UAEHA,CAAyB,oGCH/B,IAAMK,EAAmB,YAA1B,MAAOA,EACTrP,YACYwN,EACA8B,IAAqC,wEADrCpP,eACAA,yBACR,CAEG8N,kBACH,OAAO9N,KAAKoP,mBAAmBC,cAAcrP,KAAKsN,QAAQgC,YAAYC,SAASC,KACnF,WARSL,KAAmBvO,KAAnBuO,EAAmB,sCAAnBA,GAAmBM,kCAAnBN,EAAmB,0BAAnBA,EAAmB1O,QAAnB0O,EAAmB,qBAFhB,UAEHA,CAAmB,oGCAzB,IAAMO,EAAsB,YAA7B,MAAOA,EAGT5P,YACIyH,IAAsC,uBAHvB,IAAIoF,IAAoC,KAKvDpF,EAAmBI,qBAAqBE,UAAUrB,IAC9C,MAAMmJ,EAAenJ,GAAUA,EAAOoJ,qBAA6C,GACnFD,EAAaE,KAAK,CAACC,EAAGC,KAAOD,EAAEzH,MAAQ,IAAI2H,cAAcD,EAAE1H,MAAQ,KACnEsH,EAAaE,KAAK,CAACC,EAAGC,IAAMD,EAAEG,YAAcF,EAAEE,UAAY,EAAIH,EAAEG,WAAY,EAAK,GACjFjQ,KAAKgI,SAASC,KAAK0H,EAAY,EAEvC,CAEWO,6BACP,OAAOlQ,KAAKgI,QAChB,CAEOmI,qBACH,OAAOnQ,KAAKgI,SAASiE,KACzB,WApBSyD,KAAsB9O,KAAtB8O,EAAsB,sCAAtBA,GAAsBlP,sBAAtBkP,EAAsB,0BAAtBA,EAAsBjP,QAAtBiP,EAAsB,qBAFnB,UAEHA,CAAsB,0HCI5B,IAAMU,EAAoB,YAA3B,MAAOA,EAGTtQ,YACWuQ,EACCC,EACAC,EACiBxG,IAAmB,4JAHrC/J,kBACCA,wBACAA,+BAGRA,KAAKwQ,aAAexQ,KAAKyQ,mBAAmB1G,EAChD,CAEO2G,QACH1Q,KAAKqQ,WAAWK,OACpB,CAEOC,mBACH3Q,KAAKuQ,wBAAwB3E,gBAAgB5L,KAAKwQ,cAClDxQ,KAAKsQ,iBAAiBM,KAAK,CACvBC,QAAS,qCAEjB,CAEQJ,mBAAmB1G,GACvB,IAAKA,IAAUA,EAAM+G,aACjB,MAAO,GAGX,IAAItK,EAAS,kBAAoBuD,EAAM+G,aAAe,WAGtD,OAAI/G,EAAMgH,YACNvK,GAAU,eAAiBuD,EAAMgH,UAAY,QAG7ChH,EAAMiH,WACNxK,GAAU,aAAeuD,EAAMiH,SAAW,QAG1CjH,EAAM3J,MACNoG,GAAU,QAAUuD,EAAM3J,IAAM,QAGhC2J,EAAMkH,WACNzK,GAAU,aAAeuD,EAAMkH,SAAW,QAG1ClH,EAAMmH,iBACN1K,GAAU,WAAauD,EAAMmH,eAAiB,QAGlD1K,GAAU,cAAgBM,IAASqK,OAAO,oCAAsC,OAE5EpH,EAAMqH,aACN5K,GAAU,2BAA6BuD,EAAMqH,YAI1C5K,CACX,WA3DS4J,KAAoB5L,KAApB4L,EAAoB,sCAApBA,GAAoB3L,wCAOjB4M,MAAe,WAPlBjB,EAAoB,wBAApBA,EAAoBlO,2XCZjCJ,8BAAoB,UAApBA,CAAoB,UAApBA,CAAoB,WAIJA,mCACJA,QACAA,oBAAiEA,gCAASwP,SAAO,GAAExP,eAA4BA,UAEnHA,iBAAyB,SAEjBA,4FACJA,QACAA,gBAA6B,eAGjBA,gCAASwP,oBAAkB,GAC/BxP,gBAA4BA,iCAChCA,UAEJA,gBAA8CA,UAAgBA,qBAAhBA,yMDP7CsO,CAAoB,KEJpBmB,EAAY,YAAnB,MAAOA,EACTzR,YAAoB0R,IAAkB,8BAAlBxR,cAAsB,CAEnCyR,cAAc1H,GACjB/J,KAAKwR,QAAQZ,KAAKR,EAAsB,CACpC1E,KAAM3B,GAEd,WAPSwH,KAAY/M,KAAZ+M,EAAY,sCAAZA,GAAY9M,uBAAZ8M,EAAY,0BAAZA,EAAY9Q,QAAZ8Q,EAAY,qBAFT,UAEHA,CAAY,uJCClB,IAAMG,EAAsB,YAA7B,MAAOA,EACT5R,YAAoBC,IAAmE,wDAAnEC,wCAAuE,CAEpF2R,gBAAgBzR,GACnB,OAAOF,KAAKD,kCAAkCI,QAC1C,yCACA,CACIC,IAAK,gDACLC,KAAM,GACNC,iBAAiB,GAClBJ,EAEX,WAZSwR,KAAsBlN,KAAtBkN,EAAsB,sCAAtBA,GAAsBjN,sBAAtBiN,EAAsB,0BAAtBA,EAAsBjR,QAAtBiR,EAAsB,qBAFnB,UAEHA,CAAsB,oBCM5B,IAAME,EAAiC,YAAxC,MAAOA,EAQT9R,YACqB+E,EACAC,EACA+M,EACAC,IAAqC,uNAVpB,IAAIrK,IAAoC,KAAE,qCACtC,IAAIA,IAAkC,KAAE,8CAC/B,IAAIA,IAAkC,KAAE,0CAC5C,IAAIA,IAA6C,KAAE,wBAC/E,GAGEzH,2BACAA,kCACAA,+BACAA,0BAEjBA,KAAK6E,oBAAoBgI,YAAYhF,UAAU,IAAM7H,KAAK+R,eAC1D/R,KAAK8E,2BAA2B8C,mBAAmBC,UAAU,IAAM7H,KAAK+R,eACxE/R,KAAK8R,mBAAmBE,mBAAmBnK,UAAU,IAAM7H,KAAK+R,cACpE,CAEQA,cACA/R,KAAK8R,mBAAmBG,iBAAiB,iBACtCjS,KAAK6E,oBAAoBO,sBACzBpF,KAAK8E,2BAA2BK,8BAC/BnF,KAAK8R,mBAAmBG,iBAAiB,oBAC1CjS,KAAK8R,mBAAmBG,iBAAiB,2BAE5CjS,KAAKkS,UAAW,EAEhBlS,KAAK6R,wBAAwBF,gBAAgB,CACzC3G,0BAA2B5G,eAC5ByD,UAAUrB,IACTxG,KAAKkS,UAAW,EAChBlS,KAAKmS,mBAAmBlK,KAAKzB,GAAUA,EAAO4L,YAAc,IAC5DpS,KAAKqS,uBAAuBpK,KAAKzB,GAAUA,EAAO8L,gBAAgBzJ,OAAOrF,GAAKA,EAAE+O,mBAAqB7R,aAAiC,IACtIV,KAAKwS,gCAAgCvK,KAAKzB,GAAUA,EAAO8L,gBAAgBzJ,OAAOrF,GAAKA,EAAE+O,mBAAqB7R,sBAA0C,IACxJV,KAAKyS,4BAA4BxK,KAAKzB,GAAUA,EAAOkM,qBAAuB,GAAE,KAIpF1S,KAAKmS,mBAAmBlK,KAAK,IAC7BjI,KAAKqS,uBAAuBpK,KAAK,IACjCjI,KAAKwS,gCAAgCvK,KAAK,IAC1CjI,KAAKyS,4BAA4BxK,KAAK,IAE9C,CAEO0K,2BACH,OAAO3S,KAAKmS,mBAAmB9O,QAAKwF,KAAOrF,IAAMxD,KAAKkS,UAC1D,CAEOU,+BACH,OAAO5S,KAAKqS,uBAAuBhP,QAAKwF,KAAOrF,IAAMxD,KAAKkS,UAC9D,CAEOW,wCACH,OAAO7S,KAAKwS,gCAAgCnP,QAAKwF,KAAOrF,IAAMxD,KAAKkS,UACvE,CAEOY,yBACH,OAAO9S,KAAKyS,4BAA4BpP,QAAKwF,KAAOrF,IAAMxD,KAAKkS,UACnE,WA5DSN,KAAiCpN,KAAjCoN,EAAiC,sCAAjCA,GAAiCnN,qDAAjCmN,EAAiC,0BAAjCA,EAAiCnR,QAAjCmR,EAAiC,qBAF9B,UAEHA,CAAiC,6GCJvC,IAAMmB,EAAc,YAArB,MAAOA,EACTjT,YACM+E,EACAC,IAAqD,oHAM3C,IAAI6H,IAAwB,KAPtC3M,2BACAA,kCAERA,KAAK6E,oBAAoBgI,YAAYhF,UAAU,IAAM7H,KAAKgT,aAC1DhT,KAAK8E,2BAA2B8C,mBAAmBC,UAAU,IAAM7H,KAAKgT,YACtE,CAIKA,YACP,IAAIC,EAAS,GACTjT,KAAK8E,2BAA2BK,8BACnC8N,GAAU,IAAMjT,KAAK8E,2BAA2BK,6BAC7CnF,KAAK6E,oBAAoBO,uBAC5B6N,GAAU,IAAMjT,KAAK6E,oBAAoBO,sBAC1C6N,GAAU,cAENA,IAAWjT,KAAKgI,SAASoG,YAC5BpO,KAAKgI,SAASC,KAAKgL,EAErB,CAEcC,iBACP,OAAOlT,KAAKgI,QAChB,CAEOmL,aACH,OAAOnT,KAAKgI,SAASoG,UACzB,WA9BS2E,KAAcnS,KAAdmS,EAAc,sCAAdA,GAAcvS,iCAAduS,EAAc,0BAAdA,EAActS,QAAdsS,EAAc,qBAFX,UAEHA,CAAc,oGCHpB,IAAMK,EAAgB,YAAvB,MAAOA,EACTtT,YACYoJ,EACAmK,IAA2B,mFAD3BrT,+BACAA,oBACR,CAEGuG,gBAAgBwD,GACfA,EAAMA,iBAAiBS,MACvBxK,KAAKqT,cAAc5B,cAAc,CAC7BX,aAAc/G,EAAMA,MAAM7F,aAGE,KAA5BnB,KAAKC,MAAM+G,EAAMuJ,QACjBtT,KAAKkJ,wBAAwBgB,kBAKzBH,EAAMA,OAASA,EAAMA,MAAMwJ,eAAe,gBAC1CvT,KAAKqT,cAAc5B,cAAc1H,EAAMA,OAEvC/J,KAAKqT,cAAc5B,cAAc,CAC7BX,aAAc/G,EAAM8G,SAKxC,WA3BSuC,KAAgB7S,KAAhB6S,EAAgB,sCAAhBA,GAAgB5S,iCAAhB4S,EAAgB,0BAAhBA,EAAgB3S,QAAhB2S,EAAgB,qBAFb,UAEHA,CAAgB,yFCCtB,IAAMI,EAAgB,YAAvB,MAAOA,EAAgB1T,sCACE,IAAC,uBACT,IAAI4J,IAAkB,CAC9B+J,iBACP,OAAOzT,KAAKgI,QAChB,CAEO4B,aACH5J,KAAK0T,WACiB,IAAlB1T,KAAK0T,UACL1T,KAAKgI,SAASC,MAAK,EAE3B,CAEO6B,eACH6J,WAAW,KACP3T,KAAK0T,SAAW3Q,KAAKE,IAAI,EAAGjD,KAAK0T,SAAW,GACtB,IAAlB1T,KAAK0T,UACL1T,KAAKgI,SAASC,MAAK,EAAK,EAGpC,WArBSuL,KAAgB5S,KAAhB4S,EAAgB,sCAAhBA,EAAgB,WAAhBA,EAAgB,0BAAhBA,EAAgB/S,QAAhB+S,EAAgB,qBAFb,UAEHA,CAAgB,oGCFtB,IAAMI,EAAiB,YAAxB,MAAOA,EAGT9T,YACIyH,IAAsC,2BAHW,KAAE,yCAyBlB,IAAIE,IAAc,IApBnDF,EAAmBI,qBACdE,UAAUrB,IAEP,GADAxG,KAAK6T,aAAe,GAChBrN,GAAUA,EAAOsN,YACjB,QAASC,KAAcvN,EAAOsN,YAC1B9T,KAAK6T,aAAaE,EAAW1L,WAASuE,EAG9C5M,KAAKgU,2BAA2B/L,KAAK,GAAE,EAEnD,CAEOgK,iBAAiBgC,GACpB,OAAOjU,KAAK6T,aAAaN,eAAeU,EAC5C,CAEWjC,yBACP,OAAOhS,KAAKgU,0BAChB,WAxBSJ,KAAiBhT,KAAjBgT,EAAiB,sCAAjBA,GAAiBpT,sBAAjBoT,EAAiB,0BAAjBA,EAAiBnT,QAAjBmT,EAAiB,qBAFd,UAEHA,CAAiB,+GCEvB,IAAMM,EAAsB,YAA7B,MAAOA,EACTpU,YACYwN,EACAzI,EACAuK,IAAqC,iMAFrCpP,eACAA,2BACAA,yBACR,CAKGkK,gBAAgBiK,GACnBnU,KAAKoU,wBAAqBxH,EAE1B,MAAMyH,EAAarU,KAAKqP,cAAc8E,GAChCG,EAAUD,GAAYE,2BAI5B,GAAID,KAAyC,IAA7BA,EAAQE,QAAQ,WAA0D,IAAvCF,EAAQE,QAAQ,oBAA4B,CAC3FxU,KAAKoU,mBAAqBE,EAAQG,QAElC,QAASC,KAAKL,EAAWtG,QAC2C,GAA5DsG,EAAWM,6BAA6BH,QAAQ,IAAME,KAClD1U,KAAKoU,mBAAmBjQ,QAAUkQ,EAAWM,6BAA6BxQ,QAC1EnE,KAAKoU,mBAAmBQ,KAAK,IAGjC5U,KAAKoU,mBAAmBpU,KAAKoU,mBAAmBjQ,OAAS,GAAGuQ,GAAKL,EAAWtG,OAAO2G,IAG3F1U,KAAK6U,aAAeR,GAAYS,YAMpC,GAAIR,IAAwC,IAA7BA,EAAQE,QAAQ,SAAiB,CAC5C,MAAMO,EAAW/U,KAAK6E,oBAAoBO,qBAE1C,GAAI2P,EAEA,YADA/U,KAAKsN,QAAQW,SAAS,CAAC,IAAM8G,EAAW,UACxC,CAIR/U,KAAKsN,QAAQW,SAAS,CAAC,UAC3B,CAEO+G,uBACH,OAAOhV,KAAKoU,kBAChB,CAEOa,iBACH,OAAOjV,KAAK6U,YAChB,CAEOK,yBACHlV,KAAKoU,wBAAqBxH,EAC1B5M,KAAK6U,kBAAejI,CACxB,CAEQyC,cAAc8E,GAClB,OAAOnU,KAAKoP,mBAAmBC,cAAc8E,GAAuBnU,KAAKsN,QAAQgC,YAAYC,SAASC,KAC1G,WA/DS0E,KAAsBtT,KAAtBsT,EAAsB,sCAAtBA,GAAsBzE,6CAAtByE,EAAsB,0BAAtBA,EAAsBzT,QAAtByT,EAAsB,qBAFnB,UAEHA,CAAsB,oGCC5B,IAAMiB,EAAqB,YAA5B,MAAOA,EACTrV,YACYsV,EACApM,IAAqC,4EADrChJ,mBACAA,yBACR,CAEGmG,eAAekP,GAClB,OAAOrV,KAAKoV,YAAYnL,KACpBjK,KAAKgJ,mBAAmBjE,OAAO,wCAAwC,GACvEsQ,EAAK/O,aACL,CAAE8D,QAASpK,KAAKsV,WAAWD,EAAKjP,sBAExC,CAEQkP,WAAWlP,GACf,MAAMgE,EAAe,CACrBA,eAA0B,oBAA1BA,OACAA,EAAQJ,cAAmB,UAAY5D,EAChC,IAAIiE,KAAYD,EAC3B,WAnBS+K,KAAqBvU,KAArBuU,EAAqB,sCAArBA,GAAqB3U,kCAArB2U,EAAqB,0BAArBA,EAAqB1U,QAArB0U,EAAqB,qBAFlB,UAEHA,CAAqB,6ECJ3B,IAAMI,EAA4B,YAAnC,MAAOA,EACF/G,sBAAsB6G,GACzB,MAAM7O,EAAmB,GACzB,QAASgP,EAAI,EAAGA,EAAIH,EAAK5G,MAAMkG,6BAA6BxQ,OAAQqR,IAC5DH,EAAK5G,MAAMkG,6BAA6Ba,GAAGC,WAAW,KAClDJ,EAAK3G,WAAa2G,EAAK5G,MAAMkG,6BAA6Ba,GAAGE,UAAU,IACnEL,EAAK1G,aAAe0G,EAAKzG,yBACzBpI,EAAOoO,KAAKS,EAAK1G,YAGrBnI,EAAOoO,KAAKS,EAAK5G,MAAMV,OAAOsH,EAAK5G,MAAMkG,6BAA6Ba,GAAGE,UAAU,KAGvFlP,EAAOoO,KAAKS,EAAK5G,MAAMkG,6BAA6Ba,IAI5D,OAAOhP,CACX,WAlBS+O,KAA4B3U,KAA5B2U,EAA4B,sCAA5BA,EAA4B,WAA5BA,EAA4B,0BAA5BA,EAA4B9U,QAA5B8U,EAA4B,qBAFzB,UAEHA,CAA4B,8ECClC,IAAMI,EAAiB,YAAxB,MAAOA,EAKFtG,cAAcuG,GACjB,IAAInH,EAAuCmH,EAE3C,MAAMpP,EAA8B,CAChCuH,OAAQ,GACR+G,YAAa,GACbH,6BAA8B,GAC9BJ,2BAA4B,IAGhC,GAAI9F,GAASA,EAAOqG,YAChB,QAASJ,KAAKjG,EAAOqG,YACjBtO,EAAOsO,YAAYJ,GAAKjG,EAAOqG,YAAYJ,GAInD,KAAOjG,GAASA,EAAMoH,QAClBpH,EAAQA,EAAMoH,OAGlB,KAAOpH,GAAO,CACV,IAAI7F,EAAQ6F,EAAMqH,aACXrH,EAAMqH,YAAY9Q,MAClByJ,EAAMqH,YAAY9Q,KAAK4D,MAAM,KAEpC,GAAIA,GAASA,EAAMzE,QAAUsK,EAAMrO,KAAOqO,EAAMrO,IAAI+D,QAAUyE,EAAMzE,OAChE,QAASqR,EAAI,EAAGA,EAAI5M,EAAMzE,OAAQqR,IAC9BhP,EAAOmO,6BAA6BC,KAAKhM,EAAM4M,IAC/ChP,EAAO+N,2BAA2BK,KAAKnG,EAAMrO,IAAIoV,GAAGxQ,MAI5D,GAAIyJ,EAAMV,OACN,QAAS2G,KAAKjG,EAAMV,OAChBvH,EAAOuH,OAAO2G,GAAKjG,EAAMV,OAAO2G,GAIpCjG,EAAM/C,OACNlF,EAAOkF,KAAOpB,OAAOC,OAAO/D,EAAOkF,MAAQ,GAAI+C,EAAM/C,OAGzD+C,EAAQA,EAAMsH,WAGlB,OAAOvP,CACX,WAnDSmP,KAAiB/U,KAAjB+U,EAAiB,sCAAjBA,EAAiB,WAAjBA,EAAiB,0BAAjBA,EAAiBlV,QAAjBkV,EAAiB,qBAFd,UAEHA,CAAiB,yFCAvB,IAAMK,EAAe,YAAtB,MAAOA,EACTlW,YAAoBmW,IAAyB,mCAAzBjW,mBAA6B,CAE1C4Q,KAAKyE,GACR,OAAOrV,KAAKiW,aAAarF,KAAKyE,EAAKxE,QAASwE,EAAKa,QAAU,SAAU,CACjEC,SAAUd,EAAKc,UAAY,KAEnC,WAPSH,KAAepV,KAAfoV,EAAe,sCAAfA,GAAevG,uBAAfuG,EAAe,0BAAfA,EAAevV,QAAfuV,EAAe,qBAFZ,UAEHA,CAAe,oGCKrB,IAAMI,EAA4B,YAAnC,MAAOA,EACTtW,uCA+BuE,IA9B/DuW,OAAOC,iBACPD,OAAOC,iBAAiB,UAAW3I,GAAK3N,KAAKuW,UAAU5I,IAChD0I,OAAOG,aACdH,OAAOG,YAAY,YAAa7I,GAAK3N,KAAKuW,UAAU5I,GAE5D,CAEO8I,SAASC,GACZ1W,KAAK2W,UAAUD,EAAQE,KAAO5W,KAAK2W,UAAUD,EAAQE,MAAQ,GAC7D5W,KAAK2W,UAAUD,EAAQE,KAAKhC,KAAK8B,EACrC,CAEOG,YAAYC,GACf,IAAIC,EAAOC,KAAKC,UAAUH,EAAIA,KAC9BI,aAAaC,QAAQL,EAAIF,IAAKG,GAC9BG,aAAaE,WAAWN,EAAIF,IAChC,CAEQL,UAAU5I,GAEd,IADAA,EAAIA,GAAK0I,OAAOgB,QACP1J,EAAEiJ,IAAK,CACZ,IAAIU,EAAWtX,KAAK2W,UAAUhJ,EAAEiJ,KAChC,GAAIU,EACA,QAASZ,KAAWY,EAChBZ,EAAQA,QAAQ/I,EAAC,CAIjC,WA9BSyI,KAA4B5R,KAA5B4R,EAA4B,sCAA5BA,EAA4B,WAA5BA,EAA4B,0BAA5BA,EAA4B3V,QAA5B2V,EAA4B,qBAFzB,UAEHA,CAA4B,KCVzC,MAAMQ,EAAM,WASL,IAAMW,EAAsB,YAA7B,MAAOA,EAAsBzX,2CAYR,EAAK,CARrB0X,aACExX,KAAKyX,eACNzX,KAAKyW,WACLJ,OAAOC,iBAAiB,SAAU,IAAMtW,KAAK0X,cAC7C1X,KAAKyX,cAAe,EAE5B,CAOQhB,WACJS,aAAaC,QAAQP,GAAM5W,KAAK2X,mBAAqB,GAAGzT,WAC5D,CAKQwT,aACJR,aAAaC,QAAQP,EAAM7T,KAAKE,IAAIjD,KAAK2X,mBAAqB,EAAG,GAAIzT,WACzE,CAQOyT,mBACH,IAAIC,EAAkBV,aAAaW,QAAQjB,GAC3C,OAAOgB,EAAkBE,SAASF,GAAmB,CACzD,WArCSL,KAAsB/S,KAAtB+S,EAAsB,sCAAtBA,EAAsB,WAAtBA,EAAsB,0BAAtBA,EAAsB9W,QAAtB8W,EAAsB,qBAFnB,UAEHA,CAAsB,KCEtBQ,EAAkB,YAAzB,MAAOA,EACTjY,YACYkY,EACAC,IAA+C,8QA2J7B,IAAIxQ,IAAuC,IA5J7DzH,qCACAA,8BACR,CAQGwX,aAQH,OAPAxX,KAAKiY,wBAAwBT,aAC7BxX,KAAKkY,+BACLlY,KAAKmY,wBAKAnY,KAAKoY,cACHpY,KAAKiY,wBAAwBN,mBAAqB,GAClDT,aAAaW,QAAQ,qBACjB,IAAIQ,QAAaC,IACpBtY,KAAKuY,+BAAiCD,EAKjCtY,KAAKwY,yBACNxY,KAAKwY,uBAAyB7E,WAAW,KACjC3T,KAAKuY,gCACLvY,KAAKuY,oCAA+B3L,GAGxC5M,KAAKwY,4BAAyB5L,EAC9B5M,KAAKyY,oBAAoBxQ,KAAKjI,KAAKoY,aAAY,EAEhD,KAAK,IAIhBpY,KAAKyY,oBAAoBxQ,KAAKjI,KAAKoY,cAGhC,IAAIC,QAAaC,GAAWA,OAAQ1L,IAC/C,CAWQuL,uBAEJ,MAAMpB,EAAO2B,eAAeb,QAAQ,eACpC7X,KAAKoY,aAAerB,GAAQ/W,KAAK2Y,UAAU5B,GAEtC/W,KAAKoY,cACNpY,KAAKgY,8BAA8BnB,YAAY,CAC3CD,IAAK,cACLE,IAAK,IAGjB,CAKQoB,+BACJlY,KAAKgY,8BAA8BvB,SAAS,CACxCG,IAAK,cACLF,QAAS,IAAM1W,KAAKgY,8BAA8BnB,YAAY,CAC1DD,IAAK,cACLE,IAAK9W,KAAKgG,qBAIlBhG,KAAKgY,8BAA8BvB,SAAS,CACxCG,IAAK,cACLF,QAAS/I,GAAKA,EAAEiL,UAAY5Y,KAAK6Y,uBAAuB7Y,KAAK2Y,UAAUhL,EAAEiL,WAAW,IAE5F,CAQO5S,iBACH,OAAOhG,KAAKoY,YAChB,CAKOzQ,qBACH,OAAO3H,KAAKyY,mBAChB,CAMOhS,eAAeqB,GAClB9H,KAAK6Y,uBAAuB/Q,GAAa,EAC7C,CAKOgR,UACH,YAAKD,4BAAuBjM,GAAW,IAAI,EACpClG,MAAa,GACxB,CAEQmS,uBAAuB/Q,EAA2BiR,GACtD/Y,KAAKoY,aAAetQ,EAChBA,GACAoP,aAAaC,QAAQ,oBAAqB,QAC1CuB,eAAevB,QAAQ,cAAeH,KAAKC,UAAUnP,MAErDoP,aAAaE,WAAW,qBACxBsB,eAAetB,WAAW,gBAE1B2B,GACA/Y,KAAKgY,8BAA8BnB,YAAY,CAC3CD,IAAK,cACLE,IAAK9W,KAAKoY,eAMdpY,KAAKuY,iCACLvY,KAAKuY,oCAA+B3L,GACpC5M,KAAKuY,oCAAiC3L,GAGtC5M,KAAKwY,yBACLQ,aAAahZ,KAAKwY,wBAClBxY,KAAKwY,4BAAyB5L,GAGlC5M,KAAKyY,oBAAoBxQ,KAAKH,EAClC,CAEQ6Q,UAAU5B,GACd,IACI,OAAOC,KAAKiC,MAAMlC,EACT,QACjB,WA5JSgB,KAAkBvT,KAAlBuT,EAAkB,sCAAlBA,GAAkBtT,6BAAlBsT,EAAkB,0BAAlBA,EAAkBtX,QAAlBsX,EAAkB,qBAFf,UAEHA,CAAkB,mJCHvBjW,eAAwB,YAEhBA,0BACJA,QACAA,gBACIA,sDACJA,gCAJIA,+EAMRA,eAAyB,UAAzBA,CAAyB,QAAzBA,CAAyB,YAITA,0BACJA,QACAA,gBACIA,yCACJA,UAEJA,eACIA,4EACJA,UAEJA,gBAAK,aAEGA,kDACJA,QACAA,gBACIA,6CACJA,QACAA,gBACIA,4BACJA,QACAA,gBACIA,4BACJA,kCAtBQA,qDAeJA,4FAGAA,gEAGAA,6FC/Bb,IAAMoX,EAA6C,YAApD,MAAOA,EAOTpZ,YACIqZ,IAAgD,6KAEhDnZ,KAAKoZ,WAAaD,EAAwBE,wBAE1CrZ,KAAKsZ,gBAAkBH,EAAwBI,0BAC1ClW,QAAKE,KAAIiW,GAAaA,GAAWF,kBACtCtZ,KAAKyZ,YAAcN,EAAwBI,0BACtClW,QAAKE,KAAIiW,GAAaA,GAAWC,cACtCzZ,KAAK0Z,YAAcP,EAAwBI,0BACtClW,QAAKE,KAAIiW,GAAaA,GAAWE,cACtC1Z,KAAK2Z,QAAUR,EAAwBI,0BAClClW,QAAKE,KAAIiW,GAAaA,GAAWG,SAC1C,WApBST,KAA6C1U,KAA7C0U,EAA6C,sCAA7CA,GAA6CzU,oBAA7CyU,EAA6C,wBAA7CA,EAA6ChX,+pBDZ1DJ,iBAAuD,UAAvDA,CAAuD,YAG3CA,SACJA,QACAA,gBACIA,eACJA,UAEJA,gCACIA,uBAQAA,yBA6BJA,QACAA,gCAAgC,eAExBA,iBACJA,mBAhDIA,iGAGeA,yNAIbA,oCAQAA,ulCCNDoX,CAA6C,0CCHnD,IAAMU,EAAsB,YAA7B,MAAOA,EACT9Z,YAAoBC,IAAmE,wDAAnEC,wCAAuE,CAEpF6Z,gBAAgBxE,EAA2BnV,GAC9C,OAAOF,KAAKD,kCAAkCI,QAC1C,yCACA,CACIC,IAAK,+CACLC,YAAagV,EAAS,KAAwB,OAATA,EAAgB,GAAKA,EAC1D/U,iBAAiB,GAClBJ,EAEX,WAZS0Z,KAAsBpV,KAAtBoV,EAAsB,sCAAtBA,GAAsBnV,sBAAtBmV,EAAsB,0BAAtBA,EAAsBnZ,QAAtBmZ,EAAsB,qBAFnB,UAEHA,CAAsB,KCCtBE,EAAkC,YAAzC,MAAOA,EACTha,YAAoBC,IAAmE,wDAAnEC,wCAAuE,CAEpF+Z,4BAA4B1E,EAAuCnV,GACtE,OAAOF,KAAKD,kCAAkCI,QAC1C,iEACA,CACIC,IAAK,uEACLC,YAAagV,EAAS,KAAwB,OAATA,EAAgB,GAAKA,EAC1D/U,iBAAiB,GAClBJ,EAEX,WAZS4Z,KAAkCtV,KAAlCsV,EAAkC,sCAAlCA,GAAkCrV,sBAAlCqV,EAAkC,0BAAlCA,EAAkCrZ,QAAlCqZ,EAAkC,qBAF/B,UAEHA,CAAkC,gECDxC,IAAME,EAAgC,YAAvC,MAAOA,EACTla,YAA6ByN,IAAyC,2CAAzCvN,2BAA6C,CAMnEia,4BACH,MAAMC,EAAsBla,KAAKuN,qBAAqBO,kBAAkBC,OAAOoM,cAC/E,GAAKD,EAGL,OAAOpC,SAASoC,EACpB,WAbSF,KAAgCxV,KAAhCwV,EAAgC,sCAAhCA,GAAgCvV,sBAAhCuV,EAAgC,0BAAhCA,EAAgCvZ,QAAhCuZ,EAAgC,qBAF7B,UAEHA,CAAgC,KCEhCI,EAA8B,YAArC,MAAOA,EAaTta,YACqBua,EACjBC,IAAc,2DAdlB9V,yCAGiE,IAAIkF,MAAiB,EAEtFlF,6CAQqBxE,yCAGjBA,KAAKua,yBAA2Bva,KAAKqa,kCAAkCJ,4BAIvEK,EACK5M,OACArK,QACGwF,KAAOwO,GAASA,aAAiBzJ,OAAa,EAC9CrK,KAAI,IAAMvD,KAAKqa,kCAAkCJ,8BAA2B,EAC5EpR,KAAO2R,KAA0BA,GAAwBA,GAAwBxa,KAAKua,2BAAwB,EAC9GhX,KAAIiX,GAAwBA,IAAqB,EACjD/W,KAAI+W,GAAwBxa,KAAKua,yBAA2BC,IAE/D3S,UAAU7H,KAAKya,6BACxB,CAOOC,6BACH,OAAO1a,KAAKua,wBAChB,CAMOI,uBACH,OAAO3a,KAAKya,6BAA6BlP,cAC7C,WAhDS6O,KAA8B5V,KAA9B4V,EAA8B,sCAA9BA,GAA8B3V,gCAA9B2V,EAA8B,0BAA9BA,EAA8B3Z,QAA9B2Z,EAA8B,qBAF3B,UAEHA,CAA8B,6BCWpC,IAAMQ,EAAuB,YAA9B,MAAOA,EAaT9a,YACqB+a,EACAC,EACAC,EACAvJ,EACA7L,EACAb,IAAqD,+RAlB1EN,+BAG8C,4BAAyB,EAEvEA,6CAGoD,IAAImI,SAAsDC,KAAU,6BAE/E,IAGpB5M,+BACAA,2CACAA,uCACAA,eACAA,2BACAA,kCAIbA,KAAKgb,2BAELhb,KAAKib,eAAiBjb,KAAKkb,sBAGvBlb,KAAKmb,0BACLnb,KAAKob,oBAAoBpb,KAAKmb,0BAG1C,CAKOH,yBACH,QAAShb,KAAKqb,aAClB,CAWO9B,0BACH,OAAOvZ,KAAKsb,iCAAiC/P,cACjD,CAMOgQ,oBAAoBlG,GACnBrV,KAAKgb,2BAIThb,KAAKqb,cAAgBhG,EAAKgG,cAC1Brb,KAAKma,cAAgB9E,EAAK8E,cACtB9E,EAAKmG,aACLxb,KAAKyb,sBAAwBpG,EAAK8E,eAItCna,KAAKib,eAAiBjb,KAAKkb,sBAGvBlb,KAAKma,cACLna,KAAK0b,+CAA+C1b,KAAKma,eAEzDna,KAAK2b,0BAA0B,CAC3BrC,qBAAiB1M,EACjBgP,gBAAYhP,EACZ6M,iBAAa7M,EACb8M,iBAAa9M,EACb+M,aAAS/M,IAGrB,CAOOyM,wBACH,QAASrZ,KAAKma,iBAAmBna,KAAKyb,uBAAyBzb,KAAKma,eAAiBna,KAAKyb,qBAC9F,CAEQP,sBACJ,MAAO,CACHlb,KAAK6b,yCACL7b,KAAK8b,uCACL9b,KAAK+b,uCAEb,CAEQF,yCACJ,OAAO7b,KAAK+a,gCAAgCJ,uBACvC9S,UAAUsS,GAAiBna,KAAKgc,2BAA2B7B,GACpE,CAEQ6B,2BAA2B7B,GAK3Bna,KAAKma,eAAiBA,IAO1Bna,KAAKma,cAAgBA,EAErBna,KAAK6a,wBAAwBhB,gBAAgB,CACzCwB,cAAerb,KAAKqb,cACpBlB,cAAena,KAAKma,gBAGxBna,KAAK0b,+CAA+C1b,KAAKma,eAC7D,CAEQuB,+CAA+CvB,GAEnDna,KAAK8a,oCAAoCf,4BAA4B,CACjEI,cAAeA,IAChBtS,UAAUrB,IAETxG,KAAK2b,0BAA0B,CAC3BrC,gBAAiB9S,EAAO8S,gBACxBsC,WAAYpV,EAAOoV,WACnBnC,YAAajT,EAAOiT,YACpBC,YAAalT,EAAOkT,YACpBC,QAASnT,EAAOmT,UAIpB3Z,KAAKwR,QAAQZ,KAAoDsI,EAA6C,EAEtH,CAEQyC,0BAA0BR,GAC9Bnb,KAAKmb,yBAA2BA,EAChCnb,KAAKob,oBAAoBD,EAC7B,CAEQC,oBAAoBD,GACxBnb,KAAKsb,iCAAiCrT,KAAKkT,EAC/C,CAEQW,uCACJ,OAAO9b,KAAK2F,oBAAoBgC,qBAC3BE,UAAUC,GAAe9H,KAAKic,yBAAyBnU,GAChE,CAEQmU,yBAAyBnU,GAExBA,GACD9H,KAAKkc,cAEb,CAEQH,uCACJ,OAAO/b,KAAK8E,2BAA2B8C,mBAClCvE,QAAK8Y,KAAK,IACVtU,UAAU,IAAM7H,KAAKoc,2BAC9B,CAEQA,2BAGJpc,KAAKkc,cACT,CAEQA,eAEJlc,KAAKqc,2BACLrc,KAAKob,oBAAoBpb,KAAKmb,0BAG9B,QAAS/P,KAAgBpL,KAAKib,eAC1B7P,EAAaC,cAEjBrL,KAAKib,eAAiB,EAC1B,CAMYI,oBACR,OAAOrb,KAAKsc,yBAAyBjB,aACzC,CAEYA,kBAAcA,GACtBrb,KAAKuc,yBAAyBC,GAAsBA,EAAmBnB,cAAgBA,EAC3F,CAMYlB,oBACR,OAAOna,KAAKsc,yBAAyBnC,aACzC,CAEYA,kBAAcA,GACtBna,KAAKuc,yBAAyBC,GAAsBA,EAAmBrC,cAAgBA,EAC3F,CAMYsB,4BACR,OAAOzb,KAAKsc,yBAAyBb,qBACzC,CAEYA,0BAAsBA,GAC9Bzb,KAAKuc,yBAAyBC,GAAsBA,EAAmBf,sBAAwBA,EACnG,CAMYN,+BACR,OAAOnb,KAAKsc,yBAAyBnB,wBACzC,CAEYA,6BAAyBA,GACjCnb,KAAKuc,yBAAyBC,GAAsBA,EAAmBrB,yBAA2BA,EACtG,CAEQmB,wBACJ,MAAMG,EAA+B/D,eAAeb,QAAQ7X,KAAK0c,oBACjE,OAAOD,EAA+BzF,KAAKiC,MAAMwD,QAAgC7P,CACrF,CAEQ2P,yBAAyBI,GAE7B,IAAIH,EAAqBxc,KAAKsc,wBACzBE,IACDA,EAAqB,CACjBnB,mBAAezO,EACfuN,mBAAevN,EACf6O,2BAAuB7O,EACvBuO,8BAA0BvO,IAKlC+P,EAAOH,GACP9D,eAAevB,QAAQnX,KAAK0c,mBAAoB1F,KAAKC,UAAUuF,GACnE,CAEQH,2BACJ3D,eAAetB,WAAWpX,KAAK0c,mBACnC,WA1QS9B,KAAuBpW,KAAvBoW,EAAuB,sCAAvBA,GAAuBnW,wEAAvBmW,EAAuB,0BAAvBA,EAAuBna,QAAvBma,EAAuB,qBAFpB,UAEHA,CAAuB,4MCtB7B,MAIMgC,EAAyC,mICI/C,IAAMC,EAAkB,YAAzB,MAAOA,EAGT/c,YAA6B6F,IAAuC,8EAAvC3F,0BAA2C,CAEjEwX,aACH,IACQoF,IACA5c,KAAK8c,aAAe,IAAIC,IAAoB,CACxCC,OAAQ,CACJC,iBAAkBL,EAClBM,gBAAiB,CACbC,yBAA0B,CACtBC,OAAQ,QAMxBpd,KAAK8c,aAAaO,kBAElBrd,KAAK8c,aAAaQ,wBAAwBC,IACtCA,EAAS7R,OAAS,GAClB6R,EAAS7R,KAAK8R,UAAYxd,KAAK2F,oBAAoBK,kBAAkByX,UAAUC,IAAIxZ,WACnFqZ,EAAS7R,KAAKiS,SAAW3d,KAAK2F,oBAAoBK,kBAAkByX,UAAUG,sBAGjFjQ,GACLkQ,QAAQ9T,MAAM,wCAA0C4D,GACxD3N,KAAK8c,kBAAelQ,EAE5B,CAEOkR,eAAeC,GAClB/d,KAAK8c,cAAcgB,eAAe,CAC9BC,UAAWA,GAEnB,WArCSlB,KAAkBrY,KAAlBqY,EAAkB,sCAAlBA,GAAkBpY,sBAAlBoY,EAAkB,0BAAlBA,EAAkBpc,QAAlBoc,EAAkB,qBAFf,UAEHA,CAAkB,KCFlBmB,EAAmB,YAA1B,MAAOA,EACTle,YACqBme,IAAuC,0CAAvCje,0BACjB,CAEGke,YAAYnU,GACf8T,QAAQ9T,MAAMA,GACd/J,KAAKie,oBAAoBH,eAAe/T,EAC5C,WARSiU,KAAmBxZ,KAAnBwZ,EAAmB,sCAAnBA,GAAmBvZ,oBAAnBuZ,EAAmB,0BAAnBA,EAAmBvd,QAAnBud,EAAmB,qBAFhB,UAEHA,CAAmB,oBCUzB,IAAMG,EAAqB,YAA5B,MAAOA,UAA6BC,KAEtCte,YAAiDue,GAC7CC,MAAMD,EACV,CAEAE,WAAWC,EAAcC,EAAeC,GAGpC,GAAID,EAAQ,GAAKA,EAAQ,GACrB,MAAMjU,MAAM,wBAAwBiU,+CAGxC,GAAIC,EAAO,EACP,MAAMlU,MAAM,iBAAiBkU,sCAGjC,IAAIlY,EAASM,MAAW,CAAE0X,OAAMC,QAAOC,SAAQC,OAAO3e,KAAK2e,QAG3D,IAAKnY,EAAOP,UACR,MAAMuE,MAAM,iBAAiBkU,4BAA+BD,OAGhE,OAAOjY,CACX,CAEAyS,MAAMhN,EAAY2S,GACd,OAAI3S,GAAyB,iBAATA,EACTnF,MAAWmF,EAAO2S,GAAaD,OAAO3e,KAAK2e,QAE/C1S,EAAQnF,MAAWmF,GAAO0S,OAAO3e,KAAK2e,QAAU,IAC3D,CAEAE,QACI,OAAO/X,QAAa6X,OAAO3e,KAAK2e,OACpC,CAEAG,YAAY7S,GACR,IAAIyS,EAIJ,GAHIzS,aAAiBjK,OACjB0c,EAAO5X,EAAOmF,IAEG,iBAAVA,EAAoB,CAC3B,IAAKA,EACD,OAAO,KAEXyS,EAAO5X,MAAWmF,EAAOnF,YAAiB6X,OAAO3e,KAAK2e,OAAM,CAEhE,OAAID,GAAQ1e,KAAKiG,QAAQyY,GACdA,EAEJJ,MAAMQ,YAAY7S,EAC7B,WArDSkS,KAAqB3Z,KAArB2Z,EAAqB,sCAArBA,GAAoB1Z,MAEGsa,KAAe,cAFtCZ,EAAqB,0BAArBA,EAAoB1d,QAApB0d,EAAoB,qBAFjB,UAEHA,CAAqB,oFCmC3B,IAAMa,EAAgB,YAAvB,MAAOA,iBAAgBxa,KAAhBwa,EAAgB,sCAAhBA,EAAgB,WAAhBA,EAAgB,wBAAhBA,MAAgB,OAAhBA,EAAgB,4BAhBrBne,KACAoe,KACAne,KAEAE,KACAE,KACAC,IACA+d,KACA9d,KACAK,KACAC,KAEAX,KACAJ,QAGKqe,CAAgB,KC1ChBG,EAAiB,YAAxB,MAAOA,EAGTrf,YACYsf,IAAmB,qEAAnBpf,iBAGRA,KAAKqf,mBAAoBrd,MAAOC,aACpC,CAEOqd,eACHtf,KAAKof,UAAUG,MACnB,WAZSJ,KAAiB3a,KAAjB2a,EAAiB,sCAAjBA,GAAiB1a,uBAAjB0a,EAAiB,wBAAjBA,EAAiBjd,6ZCT9BJ,iBAA+B,WAEvBA,iBAEJA,QACAA,iBAA2D,cAIpDA,gCAASwP,gBAAc,GAAExP,gBAAIA,UAGpCA,iBACJA,QACAA,oBAAiC,SAAiCA,SAAsDA,iBAAtDA,qoBDLrDqd,CAAiB,kEEN9B,MAAMK,GAAc,mBAKb,IAAMC,GAAyB,YAAhC,MAAOA,EAGT3f,sCAFmB,IAAI6M,KAAyB3M,KAAKoO,YAErC,CAETsR,iBACH,MAAM9G,GAAY5Y,KAAKoO,WACvB8I,aAAaC,QAAQqI,GAAaxI,KAAKC,UAAU2B,IACjD5Y,KAAKgI,SAASC,KAAK2Q,EACvB,CAEW+G,cACP,OAAO3f,KAAKgI,QAChB,CAEQoG,WACJ,OAAO4I,KAAKiC,MAAM/B,aAAaW,QAAQ2H,KAAgB,OAC3D,WAjBSC,KAAyBjb,KAAzBib,EAAyB,sCAAzBA,EAAyB,WAAzBA,EAAyB,0BAAzBA,EAAyBhf,QAAzBgf,EAAyB,qBAFtB,UAEHA,CAAyB,qBCD/B,IAAMG,GAA8B,YAArC,MAAOA,EACT9f,cAAgB,WADP8f,KAA8Bpb,KAA9Bob,EAA8B,sCAA9BA,EAA8B,WAA9BA,EAA8B,wBAA9BA,EAA8B1d,yMCP3CJ,iBAA8C,WAC2BA,2BAAeA,QACpFA,aAAGA,kFAAsEA,6VDKhE8d,CAA8B,yCEApC,IAAMC,GAAa,YAApB,MAAOA,EACT/f,YACY6F,EACAuD,IAA+C,yFAD/ClJ,2BACAA,8BACR,CAEG8f,OAAO5K,GAAkC,GAC5ClV,KAAK2F,oBAAoBmT,UAAUjR,UAAU,KACzC7H,KAAKkJ,wBAAwBgB,kBACzBgL,GACAlV,KAAKkJ,wBAAwBgM,wBAAsB,EAG/D,WAbS2K,KAAarb,KAAbqb,EAAa,sCAAbA,GAAapb,kCAAbob,EAAa,0BAAbA,EAAapf,QAAbof,EAAa,qBAFV,UAEHA,CAAa,KCIbE,GAAoB,YAA3B,MAAOA,EACTjgB,YACY6F,EACAd,EACAmb,EACAlb,IAAqD,8PAHrD9E,2BACAA,2BACAA,sBACAA,iCACR,CAKGigB,WACH,MAAMla,EAAU/F,KAAK2F,oBAAoBK,iBACzChG,KAAKkgB,gBAAkBna,GAAWA,EAAQ0X,UAAY1X,EAAQ0X,SAAS0C,YAEvEngB,KAAKogB,oBAAsBpgB,KAAK8E,2BAA2BK,4BAA8B,IAAMnF,KAAK8E,2BAA2BK,4BAA8B,KACtJnF,KAAK6E,oBAAoBO,qBAAuB,IAAMpF,KAAK6E,oBAAoBO,qBAAuB,IACvG,wBACV,CAEO0T,UACH9Y,KAAKggB,eAAeF,QACxB,WAtBSC,KAAoBvb,KAApBub,EAAoB,sCAApBA,GAAoBtb,sDAApBsb,EAAoB,wBAApBA,EAAoB7d,oWCXjCJ,oBAAyE,YAC/BA,SAAmBA,QACzDA,kBACJA,QACAA,wBAA2D,cACCA,4BAAgBA,QACxEA,oBAAsBA,gCAASwP,WAAS,GAAExP,oBAAQA,iCANnCA,6BACuBA,kCAGRA,oCACRA,2RDMbie,CAAoB,2BEV7Bje,uCACAA,qFCOG,IAAMue,GAAkB,YAAzB,MAAOA,EAGTvgB,YACYwgB,EACAxb,IAAqD,8IAJ1B,GAG3B9E,+BACAA,kCAERA,KAAK8E,2BAA2B8C,mBAAmBC,UAAU,IAAM7H,KAAKugB,qBACxEvgB,KAAKsgB,wBAAwBpQ,uBAAuBrI,UAAU,IAAM7H,KAAKugB,oBAC7E,CAEQA,oBACJ,MAAMC,EAAkBxgB,KAAK8E,2BAA2BK,4BAClD8J,EAAcjP,KAAKsgB,wBAAwBnQ,qBAAqBtH,OAAOrF,GAAKA,EAAE6E,KAAKoY,eAAiBD,EAAgBC,eAAe,GACzIzgB,KAAK0gB,8BAAgCzR,IAAgBA,EAAYgB,SACrE,WAfSoQ,KAAkB7b,KAAlB6b,EAAkB,sCAAlBA,GAAkB5b,iCAAlB4b,EAAkB,wBAAlBA,EAAkBne,y2BDT/BJ,iBACIA,wBACAA,wBACAA,iBACIA,+BACAA,eACIA,eACAA,kBAAwCA,gBAAIA,qBAPhCA,6DACdA,uDACAA,qnCCOGue,CAAkB,kECG/B,MAGMM,GAAuB,iBAKtB,IAAMC,GAAqB,YAA5B,MAAOA,EACT9gB,YACYyN,EACAuE,EACA+O,IAAoE,8IAFpE7gB,4BACAA,0BACAA,wCACR,CAEG8gB,WACH,MAAMta,EAAS,IAAIiB,KAAgC,GACnD,YAAKqK,mBAAmBE,mBAAmBnK,UAAU,KACjD7H,KAAK+gB,eAAelZ,UAAUmZ,IAC1Bxa,EAAOyB,KAAK+Y,EAAK,EACpB,GAEExa,CACX,CAEQua,eACJ,OAAO/gB,KAAKihB,uBAAuB5d,QAAKE,KAAIyd,GACxCA,EAAMzd,IAAI2d,KAEFC,KAAMD,EAAKC,KACXC,MAAOF,EAAKE,MACZC,UAAWH,EAAKG,WAAaH,EAAKG,UAAUld,QAAU+c,EAAKG,UAAU9d,IAAI+d,KACrEF,MAAOE,EAAKF,MACZhhB,IAAK,IAAMkhB,EAAKlhB,IAAImhB,KAAK,QAE7BC,aAAcN,EAAKM,cAAcje,IAAIke,KACjCC,OAAQD,EAAYC,OACpBL,UAAWI,EAAYJ,WAAW9d,IAAI+d,KAClCF,MAAOE,EAAKF,MACZhhB,IAAK,IAAMkhB,EAAKlhB,IAAImhB,KAAK,eAMjD,CAEQN,uBACJ,SAAOU,MACH3hB,KAAK6gB,kCAAkClO,2BACvC3S,KAAK6gB,kCAAkCjO,+BACvC5S,KAAK6gB,kCAAkChO,wCACvC7S,KAAK6gB,kCAAkC/N,0BACtCzP,QAAKE,KAAIqe,IACN,MAAMC,EAAc7hB,KAAKuN,qBAAqBO,kBAAkBC,OAC1DiT,EAAQhhB,KAAK8hB,iBAAiBjZ,OAAOqY,IACtCA,EAAKa,iBAAmBb,EAAKa,eAAe5d,QAAU+c,EAAKa,eAAeC,MAAMC,GAAKC,GAASL,EAAaI,KAGhH,QAASf,KAAQF,EAAO,CAKpB,GAJAE,EAAKG,UAAYH,EAAKG,WAAaH,EAAKG,UACnCxY,OAAOyY,IAASA,EAAKS,iBAAmBT,EAAKS,eAAe5d,QAAUmd,EAAKS,eAAeC,MAAMC,GAAKC,GAASL,EAAaI,KAC3HpZ,OAAOyY,IAASA,EAAKa,sBAAwBb,EAAKa,oBAAoBhe,QAAUmd,EAAKa,oBAAoBC,KAAKH,GAAKjiB,KAAK8R,mBAAmBG,iBAAiBgQ,KAE9Jf,EAAKM,aACJ,QAAQa,KAAenB,EAAKM,aACxBa,EAAYhB,UAAYgB,EAAYhB,WAAagB,EAAYhB,UACxDxY,OAAOyY,IAASA,EAAKS,iBAAmBT,EAAKS,eAAe5d,QAAUmd,EAAKS,eAAeC,MAAMC,GAAKC,GAASL,EAAaI,KAC3HpZ,OAAOyY,IAASA,EAAKa,sBAAwBb,EAAKa,oBAAoBhe,QAAUmd,EAAKa,oBAAoBC,KAAKH,GAAKjiB,KAAK8R,mBAAmBG,iBAAiBgQ,KAYzK,GAhFK,cAwEDf,EAAKE,OACLphB,KAAKsiB,oBAAoB,aAAcpB,EAAMU,EAAqB,IAGlEV,EAAKE,OAAST,IACd3gB,KAAKuiB,qCAAqCrB,EAAMU,EAAqB,IAGrEV,EAAKG,UACL,QAASmB,KAAYtB,EAAKG,UAClBmB,EAASpiB,KACTJ,KAAKyiB,kBAAkBD,EAASpiB,IAAKyhB,GAKjD,GAAGX,EAAKM,aAAc,CAClB,QAAQa,KAAenB,EAAKM,aAAc,CAvF1C,aAwFQa,EAAYX,QACZ1hB,KAAKsiB,oBAAoB,YAAaD,EAAaT,EAAqB,IA1FhF,aA6FQS,EAAYX,QACZ1hB,KAAK0iB,gCAAgC,YAAaL,EAAaT,EAAqB,IAGxF,QAASY,KAAYH,EAAYhB,UACzBmB,EAASpiB,KACTJ,KAAKyiB,kBAAkBD,EAASpiB,IAAKyhB,EAAW,CAI5DX,EAAKM,aAAeN,EAAKM,aAAa3Y,OAAOrF,GAAKA,EAAE6d,UAAWld,OAAM,EAI7E,OAAO6c,EAAMnY,OAAOqY,GAAQA,EAAKG,WAAWld,QAAU+c,EAAKM,cAAcY,KAAKC,GAAeA,EAAYhB,WAAWld,QAAO,GAEvI,CAEQme,oBAAoBK,EAAmBzB,EAA4C0B,GACvF1B,EAAKG,UAAYuB,GAAKA,EAAErf,IAAIC,KAEpB4d,MAAO5d,EAAE6E,KACTjI,IAAK,CAAC,eAAgB,cAAeuiB,EAAWnf,EAAE6E,UAEpD,EACV,CAEQqa,gCAAgCC,EAAmBzB,EAA2B0B,GAClF,MAAMC,EAAiDD,EAAErf,IAAIC,KAErD4d,MAAO5d,EAAE6E,KACTjI,IAAK,CAAC,eAAgB,cAAeuiB,EAAWnf,EAAE6E,SAI1D6Y,EAAKG,UAAYH,EAAKG,WAAWyB,OAAOD,GAA0BhT,KAAK,CAACC,EAAGC,IAAMD,EAAEsR,MAAMpR,cAAcD,EAAEqR,OAC7G,CAEQmB,qCAAqCrB,EAA4CxO,GACrF,MAAMqQ,EAAuCrQ,EAAoBnP,IAAIC,KAC7D4d,MAAO5d,EAAEwf,cAAgBxf,EAAE6E,KAC3BjI,IAAK,CAAC,eAAgB,cAAeoD,EAAEyf,eAAiBzf,EAAE6E,SAGlE6Y,EAAKG,UAAYH,EAAKG,UAAWyB,OAAOC,GAAgBlT,KAAK,CAACC,EAAGC,IAAMD,EAAEsR,MAAMpR,cAAcD,EAAEqR,OACnG,CAEQqB,kBAAkBriB,EAAeyhB,GACrC,QAASrM,EAAIpV,EAAI+D,OAAS,EAAGqR,GAAK,EAAGA,IACjC,GAAIpV,EAAIoV,GAAGC,WAAW,KAAM,CACxB,IAAIyN,EAAarB,EAAYzhB,EAAIoV,GAAGnQ,OAAO,IACvC6d,EACA9iB,EAAIoV,GAAK0N,EAET9iB,EAAIyO,OAAO2G,EAAG,EAAC,CAI/B,CAEQsM,iBACJ,MAAO,CACH,CACIX,KAAM,aACNC,MAAO,aACPC,UAAW,IAEf,CACIF,KAAM,iBACNC,MAAO,cACPI,aAAc,CACV,CACIE,OAAQ,SACRL,UAAW,CACP,CACID,MAAO,SACPhhB,IAAK,CAAC,eAAgB,cAAe,sBACrC+hB,oBAAqB,CAAC,+BAIlC,CACIT,OAAQ,UACRL,UAAW,CACP,CACID,MAAO,UACPhhB,IAAK,CAAC,eAAgB,cAAe,cAAe,kBACpD2hB,eAAgB,CAAC,kBACjBI,oBAAqB,CAAC,6BAE1B,CACIf,MAAO,WACPhhB,IAAK,CAAC,eAAgB,cAAe,cAAe,iBAAkB,YACtE2hB,eAAgB,CAAC,kBACjBI,oBAAqB,CAAC,6BAE1B,CACIf,MAAO,6BACPhhB,IAAK,CAAC,eAAgB,cAAe,cAAe,iBAAkB,cACtE2hB,eAAgB,CAAC,kBACjBI,oBAAqB,CAAC,6BAE1B,CACIf,MAAO,QACPhhB,IAAK,CAAC,eAAgB,cAAe,cAAe,iBAAkB,SACtE2hB,eAAgB,CAAC,kBACjBI,oBAAqB,CAAC,6BAE1B,CACIf,MAAO,YACPhhB,IAAK,CAAC,eAAgB,cAAe,cAAe,iBAAkB,aACtE2hB,eAAgB,CAAC,kBACjBI,oBAAqB,CAAC,6BAE1B,CACIf,MAAO,aACPhhB,IAAK,CAAC,eAAgB,cAAe,cAAe,iBAAkB,cACtE2hB,eAAgB,CAAC,kBACjBI,oBAAqB,CAAC,oCAE1B,CACIf,MAAO,sBACPhhB,IAAK,CAAC,eAAgB,cAAe,cAAe,iBAAkB,gBACtE2hB,eAAgB,CAAC,kBACjBI,oBAAqB,CAAC,6CAM1C,CACIhB,KAAM,eACNC,MAAOT,GACPU,UAAW,CACP,CACID,MAAO,sBACPhhB,IAAK,CAAC,eAAgB,cAAe,2BACrC+hB,oBAAqB,CAAC,wBAE1B,CACIf,MAAO,wBACPhhB,IAAK,CAAC,eAAgB,cAAe,qCACrC+hB,oBAAqB,CAAC,+BAE1B,CACIf,MAAO,gBACPhhB,IAAK,CAAC,eAAgB,cAAe,qBAEzC,CACIghB,MAAO,0BACPhhB,IAAK,CAAC,eAAgB,cAAe,0CACrC+hB,oBAAqB,CAAC,kCAE1B,CACIf,MAAO,gBACPhhB,IAAK,CAAC,eAAgB,cAAe,uCACrC+hB,oBAAqB,CAAC,kCAIlC,CACIhB,KAAM,cACNC,MAAO,yBACPI,aAAc,CACV,CACIE,OAAQ,YACRL,UAAW,CACP,CACID,MAAO,iBACPhhB,IAAK,CAAC,eAAgB,cAAe,0BACrC+hB,oBAAqB,CAAC,wBAE1B,CACIf,MAAO,mBACPhhB,IAAK,CAAC,eAAgB,cAAe,qBACrC+hB,oBAAqB,CAAC,4BAIlC,CACIT,OAAQ,YACRL,UAAW,MAIvB,CACIF,KAAM,SACNC,MAAO,gBACPI,aAAc,CACV,CACIE,OAAQ,QACRL,UAAW,CACP,CACID,MAAO,0CACPhhB,IAAK,CAAC,eAAgB,cAAe,kCACrC+hB,oBAAqB,CAAC,mBAE1B,CACIf,MAAO,gBACPhhB,IAAK,CAAC,eAAgB,cAAe,6BACrC+hB,oBAAqB,CAAC,uBAE1B,CACIf,MAAO,kCACPhhB,IAAK,CAAC,eAAgB,cAAe,kDACrC+hB,oBAAqB,CAAC,oCAIlC,CACIT,OAAQ,SACRL,UAAW,CACP,CACID,MAAO,qBACPhhB,IAAK,CAAC,eAAgB,cAAe,kCACrC+hB,oBAAqB,CAAC,4BAE1B,CACIf,MAAO,OACPhhB,IAAK,CAAC,eAAgB,cAAe,oBACrC+hB,oBAAqB,CAAC,cAE1B,CACIf,MAAO,QACPhhB,IAAK,CAAC,eAAgB,cAAe,sBACrC+hB,oBAAqB,CAAC,eAE1B,CACIf,MAAO,yBACPhhB,IAAK,CAAC,eAAgB,cAAe,8BACrC+hB,oBAAqB,CAAC,yBAE1B,CACIf,MAAO,aACPhhB,IAAK,CAAC,eAAgB,cAAe,gCACrC+hB,oBAAqB,CAAC,uBAE1B,CACIf,MAAO,eACPhhB,IAAK,CAAC,eAAgB,cAAe,4BACrC+hB,oBAAqB,CAAC,wBAIlC,CACIT,OAAQ,qBACRL,UAAW,CACP,CACID,MAAO,cACPhhB,IAAK,CAAC,eAAgB,cAAe,iCACrC+hB,oBAAqB,CAAC,sBAE1B,CACIf,MAAO,gCACPhhB,IAAK,CAAC,eAAgB,cAAe,mCACrC+hB,oBAAqB,CAAC,wBAIlC,CACIT,OAAQ,gBACRL,UAAW,CACP,CACID,MAAO,wBACPhhB,IAAK,CAAC,eAAgB,cAAe,wBACrC+hB,oBAAqB,CAAC,oCAE1B,CACIf,MAAO,yBACPhhB,IAAK,CAAC,eAAgB,cAAe,wBACrC+hB,oBAAqB,CAAC,gCAE1B,CACIf,MAAO,mBACPhhB,IAAK,CAAC,eAAgB,cAAe,kBACrC+hB,oBAAqB,CAAC,6BAE1B,CACIf,MAAO,8BACPhhB,IAAK,CAAC,eAAgB,cAAe,wCACrC+hB,oBAAqB,CAAC,uCAIlC,CACIT,OAAQ,2BACRL,UAAW,CACP,CACID,MAAO,gCACPhhB,IAAK,CAAC,eAAgB,cAAe,6BACrC+hB,oBAAqB,CAAC,8BAE1B,CACIf,MAAO,cACPhhB,IAAK,CAAC,eAAgB,cAAe,wBACrC+hB,oBAAqB,CAAC,4BAE1B,CACIf,MAAO,4BACPhhB,IAAK,CAAC,eAAgB,cAAe,4BACrC+hB,oBAAqB,CAAC,mCAE1B,CACIf,MAAO,+BACPhhB,IAAK,CAAC,eAAgB,cAAe,yDACrC+hB,oBAAqB,CAAC,sCAE1B,CACIf,MAAO,sBACPhhB,IAAK,CAAC,eAAgB,cAAe,sBACrC+hB,oBAAqB,CAAC,6BAE1B,CACIf,MAAO,0BACPhhB,IAAK,CAAC,eAAgB,cAAe,qDACrC+hB,oBAAqB,CAAC,sDAE1B,CACIf,MAAO,kBACPhhB,IAAK,CAAC,eAAgB,cAAe,0CACrC+hB,oBAAqB,CAAC,gCAIlC,CACIT,OAAQ,gBACRL,UAAW,CACP,CACID,MAAO,sBACPhhB,IAAK,CAAC,eAAgB,cAAe,wCACrC+hB,oBAAqB,CAAC,uCAIlC,CACIT,OAAQ,kBACRL,UAAW,CACP,CACID,MAAO,wBACPhhB,IAAK,CAAC,eAAgB,cAAe,+BACrC+hB,oBAAqB,CAAC,wBAE1B,CACIf,MAAO,0BACPhhB,IAAK,CAAC,eAAgB,cAAe,YAAa,iBAClD+hB,oBAAqB,CAAC,uCAE1B,CACIf,MAAO,mBACPhhB,IAAK,CAAC,eAAgB,cAAe,0CACrC+hB,oBAAqB,CAAC,oBAE1B,CACIf,MAAO,gCACPhhB,IAAK,CAAC,eAAgB,cAAe,+BACrC+hB,oBAAqB,CAAC,wBAE1B,CACIf,MAAO,yCACPhhB,IAAK,CAAC,eAAgB,cAAe,wCACrC+hB,oBAAqB,CAAC,uCAE1B,CACIf,MAAO,4BACPhhB,IAAK,CAAC,eAAgB,cAAe,kCACrC+hB,oBAAqB,CAAC,sBAE1B,CACIf,MAAO,0BACPhhB,IAAK,CAAC,eAAgB,cAAe,0BACrC+hB,oBAAqB,CAAC,0BAE1B,CACIf,MAAO,kBACPhhB,IAAK,CAAC,eAAgB,cAAe,uCACrC+hB,oBAAqB,CAAC,gCAE1B,CACIf,MAAO,sBACPhhB,IAAK,CAAC,eAAgB,cAAe,sBACrC+hB,oBAAqB,CAAC,2BAM1C,CACIhB,KAAM,wBACNC,MAAO,QACPI,aAAc,CACV,CACIE,OAAQ,SACRL,UAAW,CACP,CACID,MAAO,cACPhhB,IAAK,CAAC,eAAgB,cAAe,eACrC+hB,oBAAqB,CAAC,kBAIlC,CACIT,OAAQ,QACRL,UAAW,CACP,CACID,MAAO,qCACPhhB,IAAK,CAAC,eAAgB,cAAe,sCACrC+hB,oBAAqB,CAAC,uCAE1B,CACIf,MAAO,uBACPhhB,IAAK,CAAC,eAAgB,cAAe,kBACrC+hB,oBAAqB,CAAC,yBAE1B,CACIf,MAAO,iCACPhhB,IAAK,CAAC,eAAgB,cAAe,yBACrC+hB,oBAAqB,CAAC,wCAE1B,CACIf,MAAO,0BACPhhB,IAAK,CAAC,eAAgB,cAAe,wBACrC+hB,oBAAqB,CAAC,gCAE1B,CACIf,MAAO,6BACPhhB,IAAK,CAAC,eAAgB,cAAe,4BACrC+hB,oBAAqB,CAAC,oCAE1B,CACIf,MAAO,gCACPhhB,IAAK,CAAC,eAAgB,cAAe,kCACrC+hB,oBAAqB,CAAC,oCAIlC,CACIT,OAAQ,QACRL,UAAW,CACP,CACID,MAAO,WACPhhB,IAAK,CAAC,eAAgB,cAAe,wBACrC+hB,oBAAqB,CAAC,eAE1B,CACIf,MAAO,SACPhhB,IAAK,CAAC,eAAgB,cAAe,0BACrC+hB,oBAAqB,CAAC,iBAIlC,CACIT,OAAQ,iBACRL,UAAW,CACP,CACID,MAAO,UACPhhB,IAAK,CAAC,eAAgB,cAAe,4BACrC+hB,oBAAqB,CAAC,gBAE1B,CACIf,MAAO,kBACPhhB,IAAK,CAAC,eAAgB,cAAe,mCACrC+hB,oBAAqB,CAAC,mBAIlC,CACIT,OAAQ,eACRL,UAAW,CACP,CACID,MAAO,UACPhhB,IAAK,CAAC,eAAgB,cAAe,kCACrC+hB,oBAAqB,CAAC,sBAE1B,CACIf,MAAO,QACPhhB,IAAK,CAAC,eAAgB,cAAe,gCACrC+hB,oBAAqB,CAAC,4BAE1B,CACIf,MAAO,UACPhhB,IAAK,CAAC,eAAgB,cAAe,2BACrC+hB,oBAAqB,CAAC,uBAIlC,CACIT,OAAQ,YACRL,UAAW,CACP,CACID,MAAO,yBACPhhB,IAAK,CAAC,eAAgB,cAAe,QAAS,UAC9C+hB,oBAAqB,CAAC,4BAE1B,CACIf,MAAO,YACPhhB,IAAK,CAAC,eAAgB,cAAe,YACrC+hB,oBAAqB,CAAC,uBAM1C,CACIhB,KAAM,mBACNC,MAAO,WACPC,UAAW,CACP,CACID,MAAO,eACPhhB,IAAK,CAAC,eAAgB,cAAe,gBACrC+hB,oBAAqB,CAAC,sBAE1B,CACIf,MAAO,cACPhhB,IAAK,CAAC,eAAgB,cAAe,2CACrC+hB,oBAAqB,CAAC,qBAE1B,CACIf,MAAO,eACPhhB,IAAK,CAAC,eAAgB,cAAe,WACrC+hB,oBAAqB,CAAC,kBAE1B,CACIf,MAAO,eACPhhB,IAAK,CAAC,eAAgB,cAAe,2BACrC+hB,oBAAqB,CAAC,oCAE1B,CACIf,MAAO,cACPhhB,IAAK,CAAC,eAAgB,cAAe,oBACrC+hB,oBAAqB,CAAC,qBAE1B,CACIf,MAAO,kBACPhhB,IAAK,CAAC,eAAgB,cAAe,8BACrC+hB,oBAAqB,CAAC,yBAE1B,CACIf,MAAO,gBACPhhB,IAAK,CAAC,eAAgB,cAAe,kCACrC+hB,oBAAqB,CAAC,wBAE1B,CACIf,MAAO,QACPhhB,IAAK,CAAC,eAAgB,cAAe,cACrC+hB,oBAAqB,CAAC,sBAAuB,0BAKjE,WA3nBSvB,KAAqBpc,KAArBoc,EAAqB,sCAArBA,GAAqBnc,+CAArBmc,EAAqB,0BAArBA,EAAqBngB,QAArBmgB,EAAqB,qBAFlB,UAEHA,CAAqB,KAmpBlC,SAASsB,GAASL,EAAqCsB,GACnD,QAAStB,EAAYsB,EAAM9d,OAAO,GACtC,2KCnoBoBvD,qDAA2EA,kFAQnEA,kBACIA,kBACAA,mBAEIA,SACJA,oCAFAA,0CACIA,2DANZA,SACIA,kBAAsCA,SAAsBA,QAC5DA,yBAOJA,kCAR0CA,yBACuDA,iEAHrGA,SACIA,kCAUJA,wCAV0CA,oEAYtCA,kBACIA,kBACAA,mBAEIA,SACJA,oCAFAA,0CACIA,2DALZA,SACIA,yBAOJA,wCAP0BA,iEAgBlBA,kBACIA,kBACAA,mBAEIA,SACJA,oCAFAA,0CACIA,2DANZA,SACIA,kBAAsCA,SAAsBA,QAC5DA,yBAOJA,kCAR0CA,yBACuDA,iEAHrGA,SACIA,kCAUJA,yCAV0CA,oEAYtCA,SACIA,kBACIA,kBACAA,mBAEIA,SACJA,UAERA,kCAJQA,0CACIA,2DANhBA,SACIA,kCASJA,yCATmCA,gFAf3CA,kBAAwHA,gEAAeA,0BAAiB,GACpJA,qBACIA,kCAYAA,kCAWJA,SAAM,mCAzBwGA,sBAE3FA,sCAYAA,oMAxD3BA,kBAEKA,0EAAcA,6BAAmD,GAA3BshB,wBAA6B,EAAnEthB,CAAoE,wDAAeA,wBAAe,GACnGA,qBAAwCA,iEAASA,6BAAuBuhB,YAAY,GAAE,GAKlFvhB,iBACIA,aACJA,QACAA,kBACIA,SACAA,uBACJA,UAEJA,qBAAkN,YAE1MA,mCAYAA,mCASJA,UAGJA,0BA2BJA,wDApEKA,mEAGDA,sGAKWA,kDAEiCA,4EACpCA,gCACIA,8CAG8CA,iGAAsF,6DACtGA,4EACnBA,sCAYAA,uCAYjBA,sOC7CX,IAAMwhB,GAAmB,YAA1B,MAAOA,EA2BTxjB,YACYyjB,EACAC,EACAC,EACAnW,IAAe,yLA9BA,CAAE0T,MAAO,MAAI,oCACD,IAAI,6CACLxc,oEAEL,KAAE,EAAEA,uBACR,KAAE,EAAEA,yBACS,KAAE,0BACb,IAAIkf,MAAmB,ySAaJ,KAAgB,8EAOtD1jB,6BACAA,uBACAA,kCACAA,eAERyjB,EAA2B9D,QAAQ9X,UAAU8b,GAAY3jB,KAAK4jB,qBAAuBD,GAErF3jB,KAAK6jB,gBAAkB,IAAIC,eAAeC,IACtC,MAAMC,EAASD,EAAQ,GAAGC,OACLA,EAAOC,aACPD,EAAOE,aAGpBF,EAAOG,UAAUC,SAAS,6BAC1BJ,EAAOG,UAAUE,IAAI,4BAItBL,EAAOG,UAAUC,SAAS,6BACzBJ,EAAOG,UAAUG,OAAO,2BAA0B,EAIlE,CAEOrE,WACHjgB,KAAKwjB,gBAAgBtQ,WAAWrL,UAAUrE,GAAKxD,KAAKukB,QAAU/gB,GAC9DxD,KAAKwkB,oBAAsBxkB,KAAK4jB,qBAChC5jB,KAAKykB,iBAAmBzkB,KAAK4jB,qBAC7B5jB,KAAK+R,aACT,CAEO2S,kBACH1kB,KAAK2kB,cAAc3kB,KAAK4kB,eAAeC,eAAe,GAEtD7kB,KAAK8kB,gBAAgBC,QAASzD,IAC1BthB,KAAKglB,aAAa1D,EAAMthB,KAAK4kB,eAAc,EAEnD,CAEOK,wBACHjlB,KAAKyjB,2BAA2B/D,iBAChC1G,aAAahZ,KAAKklB,gBAClBlM,aAAahZ,KAAKmlB,cAElBnlB,KAAKklB,eAAiBvR,WAAW,KAC7B3T,KAAKykB,kBAAmBzkB,KAAKykB,kBAC9B,KAEAzkB,KAAK4jB,uBACJ5jB,KAAKmlB,aAAexR,WAAW,KAC3B3T,KAAK8kB,gBAAgBC,QAASzD,IAC1BthB,KAAKglB,aAAa1D,EAAMthB,KAAK4kB,eAAc,EAC9C,EACF,KAEX,CAEQ7S,cACJ/R,KAAKolB,sBAAwBplB,KAAKujB,sBAAsBzC,WAAWjZ,UAAUrE,IACzExD,KAAKqlB,MAAQ,CACTrE,MAAOxd,EACP8hB,WAAYtlB,KAAKulB,cAAc/hB,IAGhCxD,KAAK8kB,iBACJ9kB,KAAK8kB,gBAAgBU,QAAQ3d,UAAU2a,IACnCA,EAASuC,QAASzD,IACdthB,KAAKglB,aAAa1D,EAAMthB,KAAK4kB,eAAc,EAC9C,EACJ,EAGb,CAEQW,cAAcvE,GAClB,IAAIsE,EACAG,EAAa,EACbC,GAAQ,EACRC,EAAQ,EAEZ,QAASzE,KAAQF,EAAO,CACpB,GAAGE,EAAKM,aACJ,QAAQC,KAAeP,EAAKM,aAExB,GADAiE,GAAchE,EAAYJ,UAAUld,OAAS,EAC1Csd,EAAYJ,WAAaI,EAAYJ,UAAUe,KAAK5e,GAAKxD,KAAKsN,QAAQsY,SAASpiB,EAAEpD,KAAK,MAAYslB,EAAO,CACxGA,GAAQ,EACRJ,EAAapE,EACb,QAAQsB,KAAYf,EAAYJ,UAC5B,GAAGrhB,KAAKsN,QAAQsY,SAASpD,EAASpiB,KAAK,GAAO,CAC1CJ,KAAK6lB,WAAarD,EAASpiB,IAC3B,OAOpB,GAAI8gB,EAAKG,WAAaH,EAAKG,UAAUe,KAAK5e,GAAKxD,KAAKsN,QAAQsY,SAASpiB,EAAEpD,KAAK,IAAS,CACjFqlB,EAAavE,EAAKG,UAAUld,OAC5BuhB,GAAQ,EACRJ,EAAapE,EACb,QAAQsB,KAAYtB,EAAKG,UACrB,GAAGrhB,KAAKsN,QAAQsY,SAASpD,EAASpiB,KAAK,GAAO,CAC1CJ,KAAK6lB,WAAarD,EAASpiB,IAC3B,OAKZ,GAAGslB,EAAO,CACN1lB,KAAK8lB,aAAalR,KAAK+Q,GACvB3lB,KAAK+lB,YAAYC,IAAIL,EAAuB,GAAbF,EAAH,MAC5B,MAGJE,IACAF,EAAa,EAGjB,OAAOH,CACX,CAEQN,aAAa1D,EAAkB2E,GACnC,MAAMC,EAAWC,mBAAmB,IAAIC,IAAI9E,EAAKuD,cAAcwB,MAAMH,UAErE,GAAGlmB,KAAK6lB,aAAeK,EAAU,CAC7B,MAAMI,EAAsBhF,EAAKuD,cAAc0B,wBAAwBC,IAEjEzf,EAAOuf,EADoBL,EAAUpB,cAAc0B,wBAAwBC,IAE3EC,EAAkBR,EAAUpB,cAAcX,aAE7ClkB,KAAK4jB,sBAAwB0C,EAAsBG,EAClDR,EAAUpB,cAAc6B,OAAO,CAC3BF,IAAKF,EAAsBG,EAAgB,EAC3CE,SAAU,YAGT3mB,KAAK4jB,sBAAwB7c,EAAO0f,GACzCR,EAAUpB,cAAc6B,OAAO,CAC3BF,IAAKzf,EAAO0f,EAAgB,EAC5BE,SAAU,UACb,CAGb,CAEOC,OAAOjB,GACV,MAAMkB,EAAc7mB,KAAK8lB,aAAatR,QAAQmR,GACxCmB,EAAS9mB,KAAK+mB,UAAUC,UAAUrB,GAAOd,cAAcZ,aAE7D,IAAmB,IAAhB4C,EAGC,OAFA7mB,KAAK8lB,aAAalR,KAAK+Q,QACvB3lB,KAAK+lB,YAAYC,IAAIL,EAAO,GAAGmB,OAInC9mB,KAAK8lB,aAAajX,OAAOgY,EAAa,GACtC7mB,KAAK+lB,YAAYkB,OAAOtB,EAC5B,CAEOuB,WAAWvB,GACd,OAAO3lB,KAAK8lB,aAAaqB,SAASxB,EACtC,CAEOyB,UAAUzB,GACb,OAAO3lB,KAAK+lB,YAAYsB,IAAI1B,EAChC,CAEO2B,aAAaC,GAChBvnB,KAAKwnB,gBAAkBD,EAEvBvnB,KAAKmlB,aAAexR,WAAW,KAC3B3T,KAAKynB,yBAA0B1C,QAASzD,IACpCthB,KAAKglB,aAAa1D,EAAMthB,KAAK0nB,eAAc,EAC9C,EACF,IACP,CAEOC,gBACH3nB,KAAKwnB,gBAAkB,GAEvBxO,aAAahZ,KAAKmlB,cACfnlB,KAAK0nB,gBACJ1nB,KAAK2kB,cAAc3kB,KAAK0nB,eAAe7C,eAAe,EAE9D,CAEO+C,kBACA5nB,KAAK0nB,gBACJ1nB,KAAK2kB,cAAc3kB,KAAK0nB,eAAe7C,eAAe,EAE9D,CAEQF,cAAckD,EAAsBC,GACrCA,EACC9nB,KAAK6jB,gBAAgBiE,UAAUD,GAInC7nB,KAAK6jB,gBAAgBkE,QAAQF,EACjC,CAEOG,cACAhoB,KAAKolB,uBACJplB,KAAKolB,sBAAsB/Z,cAE/B4c,cAAcjoB,KAAKklB,gBACnBlM,aAAahZ,KAAKmlB,cAClBnlB,KAAK6jB,gBAAgBqE,YACzB,WA9OS5E,KAAmB9e,KAAnB8e,EAAmB,sCAAnBA,GAAmB7e,uDAAnB6e,EAAmB,wBAAnBA,EAAmBphB,yzDDtBhCJ,iBAKmB,cAC6BA,gCAASwP,yBAAuB,GACxExP,iBAA+B,WAEvBA,eACJA,YAGRA,mBAA+H,UAA/HA,CAA+H,QAA/HA,CAA+H,WAK/GA,gBACJA,QACAA,oBACIA,mBACJA,YAGRA,4BAsEJA,QACAA,mBACIA,6BACJA,iBAlGCA,wKAS4CA,mFAITA,wFAE5BA,4EACGA,uCAIsCA,4EAKvBA,wCAwEPA,qkQCnFX,IACRK,MAAQ,OAAQ,IACZC,MAAM,UAAQC,MAAM,CAACC,QAAS,MAAG,EACjCC,MAAW,aAAc,IACrBC,MAAQ,cAIP8gB,CAAmB,4CClBpBxhB,sBAAkDA,gBAAIA,mCACtDA,wBACIA,SACJA,kCAF2CA,4BACvCA,gEALZA,4BACIA,sBACAA,wBACIA,+BACAA,+BAGJA,gCAJiBA,qDACkBA,+DAKvCA,iBACIA,SACJA,8BADIA,iDCAD,IAAMqmB,GAAwB,YAA/B,MAAOA,EAKTroB,YACYsoB,EACAC,EACAxjB,IAAuC,iOAFvC7E,8BACAA,oBACAA,0BACR,CAEGigB,WACHjgB,KAAKsoB,KAAOtoB,KAAKqoB,aAAaE,MAAM,CAChCngB,WAAY,CAACpI,KAAK6E,oBAAoBO,sBAAwB,MAGlEpF,KAAKsoB,KAAKE,aAAa3gB,UAAU,KAC7B7H,KAAK6E,oBAAoBmJ,eAAehO,KAAKsoB,KAAKjB,IAAI,cAAepb,MAAK,GAG9EjM,KAAKooB,uBAAuB9f,sBAAsBT,UAAUrB,IACxDxG,KAAKyoB,QAAUjiB,EACXxG,KAAKyoB,SAAkC,GAAvBzoB,KAAKyoB,QAAQtkB,QAAenE,KAAKyoB,QAAQ,GAAGvgB,YAAclI,KAAK6E,oBAAoBO,qBACnGpF,KAAK6E,oBAAoBmJ,eAAehO,KAAKyoB,QAAQ,GAAGvgB,YAAc,IAC/DlI,KAAK6E,oBAAoBO,uBAAyBpF,KAAKyoB,QAAQrG,KAAK5e,GAAKA,EAAE0E,YAAclI,KAAK6E,oBAAoBO,uBACzHpF,KAAK6E,oBAAoBmJ,eAAe,GAAE,EAGtD,WA5BSma,KAAwB3jB,KAAxB2jB,EAAwB,sCAAxBA,GAAwB1jB,8CAAxB0jB,EAAwB,wBAAxBA,EAAwBjmB,0fDXrCJ,iBACIA,mCASAA,wBAGJA,eAbKA,0BACgBA,qDASeA,iXCCvBqmB,CAAwB,oBCA9B,IAAMO,GAAkB,YAAzB,MAAOA,EACT5oB,YAAYwa,IAAc,iCACtBA,EAAO5M,OAAOrK,QACVwF,KAAO8E,GAAKA,aAAaC,OACxB/F,UAAU8F,IACP3N,KAAK2oB,WAAaC,UAA0Bjb,EAAGvN,IAAG,EAE9D,WAPSsoB,KAAkBlkB,KAAlBkkB,EAAkB,sCAAlBA,GAAkBjkB,uBAAlBikB,EAAkB,wBAAlBA,EAAkBxmB,sNCX/BJ,eACIA,kBACAA,kBAA+BA,eAAGA,gBAFnCA,2PDWU4mB,CAAkB,8CELvB5mB,oBAA+DA,sEAASA,6BAA8B,GAAEA,SAAoBA,oCAApBA,kDANhHA,eAAqD,aAArDA,CAAqD,YAEMA,SAA4BA,QAC/EA,kBACJA,QACAA,wBACIA,2BACJA,2CANmBA,sCACoCA,2CAGZA,oCACOA,0CCI/C,IAAM+mB,GAAqB,YAA5B,MAAOA,EAIT/oB,YACYwgB,EACAxb,IAAqD,+KADrD9E,+BACAA,iCACR,CAEGigB,WACHjgB,KAAKsgB,wBAAwBpQ,uBAAuBrI,UAAUrB,IAC1DxG,KAAK2P,aAAenJ,EAEhBxG,KAAK8E,2BAA2BK,8BAChCnF,KAAK8oB,oBAAsB9oB,KAAK2P,aAAa9G,OAAOrF,GAAKA,EAAE6E,KAAMoY,eAAiBzgB,KAAK8E,2BAA2BK,4BAA4Bsb,eAAe,GACzJzgB,KAAK8oB,qBAAuB9oB,KAAK8oB,oBAAoBzgB,MAAQrI,KAAK8E,2BAA2BK,6BAC7FnF,KAAK+oB,kBAAkB/oB,KAAK8oB,wBAI/B9oB,KAAK8oB,sBAAwB9oB,KAAK2P,aAAayS,KAAK5e,GAAIA,EAAE6E,KAAMoY,eAAiBzgB,KAAK8oB,oBAAqBzgB,KAAMoY,kBAClHzgB,KAAK8oB,yBAAsBlc,EACvB5M,KAAK2P,aAAaxL,QAClBnE,KAAK+oB,kBAAkB/oB,KAAK2P,aAAa,IAAE,EAI3D,CAEOoZ,kBAAkB9Z,GACrBjP,KAAK8E,2BAA2BoK,sBAAsBD,GAAeA,EAAY5G,MACjFrI,KAAK8oB,oBAAsB7Z,CAC/B,WAhCS4Z,KAAqBrkB,KAArBqkB,EAAqB,sCAArBA,GAAqBpkB,iCAArBokB,EAAqB,wBAArBA,EAAqB3mB,0ZDVlCJ,6BAAMA,oSCUO+mB,CAAqB,+BCVlC/mB,iBAAwD,WAEhDA,kBACAA,gBAAMA,SAAsBA,kCAAtBA,sCCMP,IAAMknB,GAAsB,YAA7B,MAAOA,EAGTlpB,YACYwgB,EACAxb,IAAqD,0IADrD9E,+BACAA,kCAERA,KAAKsgB,wBAAwBpQ,uBAAuBrI,UAAU,IAAM7H,KAAKipB,4BACzEjpB,KAAK8E,2BAA2B8C,mBAAmBC,UAAU,IAAM7H,KAAKipB,2BAC5E,CAEQA,2BACJjpB,KAAKkpB,wBAAqBtc,EAC1B,MAAM4T,EAAkBxgB,KAAK8E,2BAA2BK,4BACxD,GAAIqb,EAAiB,CACjB,MAAMvR,EAAcjP,KAAKsgB,wBAAwBnQ,qBAAqBtH,OAAOrF,GAAKA,EAAE6E,KAAKoY,eAAiBD,EAAgBC,eAAe,GAErIxR,IAAgBA,EAAYgB,YAC5BjQ,KAAKkpB,mBAAqBja,EAAYka,aAGlD,WArBSH,KAAsBxkB,KAAtBwkB,EAAsB,sCAAtBA,GAAsBvkB,iCAAtBukB,EAAsB,wBAAtBA,EAAsB9mB,wODTnCJ,6BAA8BA,saCSjBknB,CAAsB,KCItBI,GAA2B,YAAlC,MAAOA,EAITtpB,YAAYqZ,IAAgD,wEACxDnZ,KAAKsZ,gBAAkBH,EAAwBI,0BAC1ClW,QAAKE,KAAIiW,GAAaA,GAAWF,kBACtCtZ,KAAK4b,WAAazC,EAAwBI,0BACrClW,QAAKE,KAAIiW,GAAaA,GAAWoC,YAC1C,WATSwN,KAA2B5kB,KAA3B4kB,EAA2B,sCAA3BA,GAA2B3kB,uBAA3B2kB,EAA2B,wBAA3BA,EAA2BlnB,iSCbxCJ,iBAAkD,WAE1CA,eACJA,QACAA,eACIA,qCACJA,QACAA,iBACIA,2CACJA,iBADIA,mgBDKKsnB,CAA2B,2BEF5BtnB,6DACAA,+CACAA,wCCCL,IAAMunB,GAAkB,YAAzB,MAAOA,EAUTvpB,YACqBwpB,EACAzkB,EACA0I,EACjBgc,EACApQ,IAAgD,8NAZtB,IAAI,mCACC,KAAE,iHAIa,IAG7BnZ,wCACAA,2BACAA,4BAIjB,MAAMwpB,EAA+BD,EAA0B5J,QAAQ9X,UAAU8b,GAAY3jB,KAAK4jB,qBAAuBD,GACzH3jB,KAAKib,eAAerG,KAAK4U,GAEzBxpB,KAAKypB,oBAAsBtQ,EAAwBI,0BAC9ClW,QAAKE,KAAIiW,KAAeA,GACjC,CAEOyG,WACHjgB,KAAK+M,gBAAkB/M,KAAK6E,oBAAoBO,qBAChD,MAAMskB,EAAkB1pB,KAAKuN,qBAAqBO,kBAAkBpC,KAChEge,IACA1pB,KAAK2pB,wBAA0BD,EAAgBC,uBAEnD,MAAMC,EAAuC5pB,KAAKspB,iCAAiCnc,cAActF,UAAUrB,IACnGA,GAAUA,EAAOqjB,cAAgBrjB,EAAOqjB,aAAa1lB,OACrDnE,KAAK8pB,qBAAqB,oBAAsB,IAAMtjB,EAAOqjB,aACtD7pB,KAAK8pB,qBAAqBvW,eAAe,4BACzCvT,KAAK8pB,qBAAqB,mBAAkB,GAG3D9pB,KAAKib,eAAerG,KAAKgV,EAC7B,CAEO5B,cACH,QAAS5c,KAAgBpL,KAAKib,eAC1B7P,EAAaC,aAErB,WA5CSge,KAAkB7kB,KAAlB6kB,EAAkB,sCAAlBA,GAAkB5kB,mEAAlB4kB,EAAkB,wBAAlBA,EAAkBnnB,qSDd/BJ,0BACAA,eACIA,6BACAA,iBAAgC,WAExBA,8BAAyC,0BAAzCA,CAAyC,qBAG7CA,QACAA,iBACIA,+BACAA,iEACAA,mCACAA,kDACJA,mBAbHA,2FAG4CA,iDAOTA,yDACZA,mEACeA,4gDCC9BunB,CAAkB,qBCJxB,IAAMU,GAAiB,YAAxB,MAAOA,EACTjqB,YACYmJ,EACAC,EACA4I,EACAxE,IAAe,0KAHftN,mCACAA,+BACAA,0BACAA,cACR,CAEGgqB,YAAYvb,GACf,IAAKzO,KAAKiJ,4BAA4BtC,8BAClC,YAAKuC,wBAAwBgB,gBAAgBuE,IACtC,EAGX,MAAMib,EAAkBjb,EAAM/C,KAC9B,QAAIge,GAAmBA,EAAgBvH,qBAAuBuH,EAAgBvH,oBAAoBhe,SAAWulB,EAAgBvH,oBAAoBC,KAAK5e,GAAKxD,KAAK8R,mBAAmBG,iBAAiBzO,MAChMxD,KAAKsN,QAAQW,SAAS,CAAC,MAChB,GAIf,CAEOgc,iBAAiBxb,GACpB,OAAOzO,KAAKgqB,YAAYvb,EAC5B,WAzBSsb,KAAiBvlB,KAAjBulB,EAAiB,sCAAjBA,GAAiBtlB,2DAAjBslB,EAAiB,0BAAjBA,EAAiBtpB,QAAjBspB,EAAiB,qBAFd,UAEHA,CAAiB,KCL9B,SAASG,EAAkCjH,EAAwBkH,GAC/D,MAAO,CACHlH,EACA,gBAAkBA,EAClB,4BAA8BA,GAChC1f,IAAWyB,KACTA,KAAMA,EACNmlB,aAAcA,IAEtB,CAEO,MAAMC,GAAkB,CAC3B,CACIplB,KAAM,GACNqlB,UAAW,OACXC,WAAY,cAEhB,CACItlB,KAAM,QACNmlB,aAAc,IAAM9R,+SAAsCkS,KAAK/mB,GAAKA,EAAEgnB,cAE1E,CACIxlB,KAAM,oBACNmlB,aAAc,IAAM9R,+SAAsCkS,KAAK/mB,GAAKA,EAAEgnB,cAE1E,CACIxlB,KAAM,GACNylB,UAAWpB,GACXW,YAAa,CAACD,IACdE,iBAAkB,CAACF,IACnBW,SAAUR,EAAkC,cAAe,IAAMS,+EAAkDJ,KAAK/mB,GAAKA,EAAEonB,oBAC1H9H,OAAOoH,EAAkC,eAAgB,IAAMS,mFAAsDJ,KAAK/mB,GAAKA,EAAEqnB,sBACjI/H,OAAOoH,EAAkC,oBAAqB,IAAM7R,sQAAgEkS,KAAK/mB,GAAKA,EAAEsnB,2BAChJhI,OAAOoH,EAAkC,YAAa,IAAMS,2EAA8CJ,KAAK/mB,GAAKA,EAAEunB,mBACtHjI,OAAOoH,EAAkC,YAAa,IAAM7R,uJAA4CkS,KAAK/mB,GAAKA,EAAEwnB,iBACpHlI,OAAOoH,EAAkC,QAAS,IAAMS,mEAAsCJ,KAAK/mB,GAAKA,EAAEynB,eAC1GnI,OAAOoH,EAAkC,kBAAmB,IAAM7R,oiBAA4DkS,KAAK/mB,GAAKA,EAAE0nB,yBAC1IpI,OAAOoH,EAAkC,cAAe,IAAMS,+EAAkDJ,KAAK/mB,GAAKA,EAAE2nB,qBAC5HrI,OAAOoH,EAAkC,oBAAqB,IAAMS,+FAAkEJ,KAAK/mB,GAAKA,EAAE4nB,2BAClJtI,OAAOoH,EAAkC,eAAgB,IAAM7R,iLAAoDkS,KAAK/mB,GAAKA,EAAE6nB,sBAC/HvI,OAAOoH,EAAkC,mBAAoB,IAAMS,4EAAgDJ,KAAK/mB,GAAKA,EAAE8nB,oBAC/HxI,OAAOoH,EAAkC,aAAc,IAAM7R,mRAA8CkS,KAAK/mB,GAAKA,EAAE+nB,mBACvHzI,OAAOoH,EAAkC,cAAe,IAAMS,iFAAoDJ,KAAK/mB,GAAKA,EAAEgoB,qBAC9H1I,OAAOoH,EAAkC,SAAU,IAAM7R,qKAAsDkS,KAAK/mB,GAAKA,EAAEioB,sBAC3H3I,OAAOoH,EAAkC,iBAAkB,IAAM7R,i9BAA4DkS,KAAK/mB,GAAKA,EAAEkoB,wBACzI5I,OAAOoH,EAAkC,uBAAwB,IAAM7R,qRAAsEkS,KAAK/mB,GAAKA,EAAEmoB,8BACzJ7I,OAAOoH,EAAkC,uBAAwB,IAAM7R,gIAAsEkS,KAAK/mB,GAAKA,EAAEooB,6BACzJ9I,OAAOoH,EAAkC,qBAAsB,IAAM7R,4QAAkEkS,KAAK/mB,GAAKA,EAAEqoB,4BACnJ/I,OAAOoH,EAAkC,oBAAqB,IAAMS,6FAAgEJ,KAAK/mB,GAAKA,EAAEsoB,2BAChJhJ,OAAOoH,EAAkC,uCAAwC,IAAM7R,+rBAAkFkS,KAAK/mB,GAAKA,EAAEuoB,mCACrLjJ,OAAOoH,EAAkC,yBAA0B,IAAM7R,mVAA0EkS,KAAK/mB,GAAKA,EAAEwoB,gCAC/JlJ,OAAOoH,EAAkC,WAAY,IAAM7R,uTAA4CkS,KAAK/mB,GAAKA,EAAEyoB,kBACnHnJ,OAAOoH,EAAkC,wBAAyB,IAAM7R,sQAA0EkS,KAAK/mB,GAAKA,EAAE0oB,+BAC9JpJ,OAAOoH,EAAkC,uBAAwB,IAAM7R,ioBAAwEkS,KAAK/mB,GAAKA,EAAE2oB,8BAC3JrJ,OAAOoH,EAAkC,iCAAkC,IAAM7R,spBAA4FkS,KAAK/mB,GAAKA,EAAE4oB,uCACzLtJ,OAAOoH,EAAkC,qCAAsC,IAAM7R,ouBAAsGkS,KAAK/mB,GAAKA,EAAE6oB,2CACvMvJ,OAAOoH,EAAkC,QAAS,IAAM7R,mKAAsCkS,KAAK/mB,GAAKA,EAAE8oB,eAC1GxJ,OAAOoH,EAAkC,iBAAkB,IAAM7R,miBAA0DkS,KAAK/mB,GAAKA,EAAE+oB,wBACvIzJ,OAAOoH,EAAkC,yCAA0C,IAAM7R,0bAA4EkS,KAAK/mB,GAAKA,EAAEgpB,iCACjL1J,OAAOoH,EAAkC,wBAAyB,IAAM7R,ykBAAwEkS,KAAK/mB,GAAKA,EAAEipB,+BAC5J3J,OAAOoH,EAAkC,6BAA8B,IAAM7R,oTAAoFkS,KAAK/mB,GAAKA,EAAEkpB,oCAC7K5J,OAAOoH,EAAkC,gBAAiB,IAAM7R,gNAAwDkS,KAAK/mB,GAAKA,EAAEmpB,uBACpI7J,OAAOoH,EAAkC,eAAgB,IAAMS,mFAAsDJ,KAAK/mB,GAAKA,EAAEopB,sBACjI9J,OAAOoH,EAAkC,8BAA+B,IAAM7R,oRAAwFkS,KAAK/mB,GAAKA,EAAEqpB,qCAClL/J,OAAOoH,EAAkC,gBAAiB,IAAM7R,wVAAwDkS,KAAK/mB,GAAKA,EAAEspB,uBACpIhK,OAAOoH,EAAkC,uBAAwB,IAAM7R,0dAAsEkS,KAAK/mB,GAAKA,EAAEupB,6BACzJjK,OAAOoH,EAAkC,0BAA2B,IAAM7R,gfAA8EkS,KAAK/mB,GAAKA,EAAEwpB,gCACpKlK,OAAOoH,EAAkC,2BAA4B,IAAM7R,4QAAgFkS,KAAK/mB,GAAKA,EAAEypB,kCACvKnK,OAAOoH,EAAkC,0BAA2B,IAAM7R,4MAAgFkS,KAAK/mB,GAAKA,EAAE0pB,iCACtKpK,OAAOoH,EAAkC,UAAW,IAAM7R,sGAA4CkS,KAAK/mB,GAAKA,EAAE2pB,iBAClHrK,OAAOoH,EAAkC,qBAAsB,IAAM7R,4KAAoDkS,KAAK/mB,GAAKA,EAAE4pB,qBACrItK,OAAOoH,EAAkC,MAAO,IAAMS,uEAA0CJ,KAAK/mB,GAAKA,EAAE6pB,iBAIrH,CACIroB,KAAM,eACNqlB,UAAW,OACXC,WAAY,2BAEhB,CACItlB,KAAM,2BACNqlB,UAAW,OACXC,WAAY,uCAEhB,CACItlB,KAAM,KACNylB,UAAWtL,EACXiC,MAAO,+BCtFR,IAAMkM,GAA0B,YAAjC,MAAOA,EACTC,aAAa9e,GACT,OAAO,CACX,CAEA+e,MAAM/e,EAA+Bgf,GACrC,CAEAC,aAAajf,GACT,OAAO,CACX,CAEAkf,SAASlf,GACL,OAAO,IACX,CAEAmf,iBAAiBC,EAAgCC,GAC7C,KAAOD,EAAO9X,YACV8X,EAASA,EAAO9X,WAGpB,KAAO+X,EAAK/X,YACR+X,EAAOA,EAAK/X,WAGhB,GAAI8X,EAAO/X,aAAapK,MAAQoiB,EAAKhY,aAAe+X,EAAO/X,YAAYpK,MAAQoiB,EAAKhY,YAAYpK,KAAM,CAClG,MAAMqiB,EAAuCF,EAAO/X,YAAYpK,KAAMsiB,gBACtE,GAAID,EAAoB,CACpB,QAASvY,EAAI,EAAGA,EAAIuY,EAAmB5pB,SACO,cAAtC2pB,EAAK/f,OAAOggB,EAAmBvY,KAAuBqY,EAAO9f,OAAOggB,EAAmBvY,KAAOsY,EAAK/f,OAAOggB,EAAmBvY,KADtFA,KAK/C,OAAO,GAIfa,cAAOqQ,OAAO,EAAG,IACV,CACX,WAvCS4G,KAA0B9oB,KAA1B8oB,EAA0B,sCAA1BA,EAA0B,WAA1BA,EAA0B,0BAA1BA,EAA0B7sB,QAA1B6sB,EAA0B,qBAFvB,UAEHA,CAA0B,KCiB1BW,GAAqB,YAA5B,MAAOA,iBAAqBzpB,KAArBypB,EAAqB,sCAArBA,EAAqB,WAArBA,EAAqB,wBAArBA,MAAqB,OAArBA,EAAqB,6BAPnB,CACP,CACIC,QAASC,KACTC,SAAUd,KAEjBe,SAVGxtB,KACAF,IACAqe,EACAje,aAAqBqpB,QAShB6D,CAAqB,4CCX3B,IAAMK,GAAgC,YAAvC,MAAOA,EAMTxuB,YACYuQ,EACyBke,EACzB5oB,IAAuC,0MAFvC3F,kBACyBA,aACzBA,0BACT,CAEIigB,WACHjgB,KAAKwuB,mBAAmB7rB,YAAY3C,KAAKuuB,MAAME,gBAC/CzuB,KAAK0uB,gCAAkC1uB,KAAK2F,oBAAoBgC,qBAAqBE,UAAUrB,IACvFA,GAAUA,EAAOJ,qBAAuBI,EAAOJ,oBAAqBC,OAASrG,KAAKuuB,MAAMloB,OACxFrG,KAAKqQ,WAAWK,OAAK,EAGjC,CAEOsX,cACChoB,KAAK0uB,iCACL1uB,KAAK0uB,gCAAgCrjB,aAE7C,CAEOyN,UACH9Y,KAAKqQ,WAAWK,MAAM,CAClBwF,OAAQ,UACRhB,wBAAwB,GAEhC,CAEO/O,iBACHnG,KAAKqQ,WAAWK,MAAM,CAClBwF,OAAQ,WAEhB,CAEOyY,SACH3uB,KAAKqQ,WAAWK,MAAM,CAClBwF,OAAQ,UACRhB,wBAAwB,GAEhC,WA7CSoZ,KAAgC9pB,KAAhC8pB,EAAgC,sCAAhCA,GAAgC7pB,kBAQ7B4M,MAAe5M,sBARlB6pB,EAAgC,wBAAhCA,EAAgCpsB,mFAC9BO,KAAkB,kYCdjCX,8BAAoB,UAApBA,CAAoB,UAApBA,CAAoB,UAGyBA,8BAAkBA,UAEvDA,iBAA4C,OACrCA,8EAAkEA,QACrEA,iBAAqD,qBAClCA,oCAAawP,UAAQ,GAAExP,UAE1CA,kBAA+C,eACfA,gCAASwP,WAAS,GAAExP,eAAEA,QAClDA,qBAA4BA,gCAASwP,kBAAgB,GAAExP,gBAAGA,2dDC7DwsB,CAAgC,qBEGtC,IAAMM,GAAyB,YAAhC,MAAOA,EACT9uB,YACY6F,EACA6L,EACA5L,EACAoa,IAA6B,8MAH7BhgB,2BACAA,eACAA,8BACAA,qBACR,CAEGwX,aACHxX,KAAK2F,oBAAoBgC,qBAAqBE,UAAUrB,IAChDxG,KAAK6uB,2BACL7V,aAAahZ,KAAK6uB,2BAElBroB,GAAUA,EAAOJ,qBACjBpG,KAAK8uB,kBAAkBhoB,MAAW9G,KAAK2F,oBAAoBK,iBAAkBI,oBAAqBS,WAAWE,KAAKD,QAAc,WAnBlH,IAmBoJ,EAG9K,CAKQgoB,kBAAkBC,GACtB/uB,KAAK6uB,0BAA4BxY,OAAO1C,WAAW,KAC/C,MAAM5N,EAAU/F,KAAK2F,oBAAoBK,iBAErCD,GACGA,EAAQK,qBACRL,EAAQK,oBAAoBS,WAC5BC,MAAWf,EAAQK,oBAAoBS,WAAWE,KAAKD,QAAc,YAAckoB,KAEtFhvB,KAAKwR,QAAQZ,KAAmG0d,GAAkC,CAC9IW,cAAc,EACdvjB,KAAM,CACF+iB,eAAgB1oB,EAAQK,oBAAoBS,UAC5CR,MAAON,EAAQK,oBAAoBC,SAExC6oB,cAAcrnB,UAAUrB,IACnBA,IACqB,WAAjBA,EAAO0P,OACPlW,KAAKggB,eAAeF,OAAOtZ,EAAO0O,wBACV,WAAjB1O,EAAO0P,QACdlW,KAAKmG,iBAAc,EAG9B,EAEY,IAAlB4oB,EACP,CAEQ5oB,iBACJnG,KAAK4F,uBAAuBO,eAAe,CACvCC,oBAAqBpG,KAAK2F,oBAAoBK,iBAAkBI,oBAAqBC,MACrFC,aAActG,KAAK2F,oBAAoBK,iBAAkBM,eAC1DuB,UAAWrB,IACNA,GACAxG,KAAK2F,oBAAoBc,eAAeD,EAAM,EAG1D,WA3DSooB,KAAyBpqB,KAAzBoqB,EAAyB,sCAAzBA,GAAyBnqB,wDAAzBmqB,EAAyB,0BAAzBA,EAAyBnuB,QAAzBmuB,EAAyB,qBAFtB,UAEHA,CAAyB,4DCR/B,IAAMO,GAAuB,YAA9B,MAAOA,EACTrvB,YAAoBqJ,IAAmC,kEAQ3B,GARRnJ,wBAAuC,CAEpDigB,WACHjgB,KAAKmJ,kBAAkBsK,WAAW5L,UAAUrE,IACxCxD,KAAKovB,UAAY5rB,GAEzB,WAPS2rB,KAAuB3qB,KAAvB2qB,EAAuB,sCAAvBA,GAAuB1qB,uBAAvB0qB,EAAuB,wBAAvBA,EAAuBjtB,wJCRpCJ,iBAAqE,iBAAxCA,yCACJA,yuBDOZqtB,CAAuB,KEKvBE,GAAY,YAAnB,MAAOA,EACTvvB,YACIwvB,EACAC,EACAC,EACkBzjB,EACVuO,EACAmV,IAAoB,8DADpBzvB,cACAA,iBAERsvB,EAA0B9X,aAC1B+X,EAAmB/X,aAEnBxX,KAAKsa,OAAO5M,OACPrK,QAAKwF,KAAOwO,GAASA,aAAiBqY,OACtC7nB,UAAU,KACP7H,KAAKyvB,UAAUE,UAAQ,GAI/B,IAAIP,GAAY,EAChBpvB,KAAKsa,OAAO5M,OACPrK,QAAKwF,KAAOwO,GAASA,aAAiBuY,OACtC/nB,UAAU,KACPunB,GAAY,EACZI,EAAiB5lB,YAAU,GAInC5J,KAAKsa,OAAO5M,OACPrK,QAAKwF,KAAOwO,GAASA,aAAiBwY,MAAsBxY,aAAiByY,OAC7EjoB,UAAU,KACHunB,IACAI,EAAiB1lB,eACjBslB,GAAY,KAIxBrjB,EAAS1L,KAAKiW,iBAAiB,YAAayZ,IAC5ChkB,EAAS1L,KAAKiW,iBAAiB,WAAYyZ,IAC3ChkB,EAAS1L,KAAKiW,iBAAiB,OAAQyZ,GAC3C,WAxCSV,KAAY7qB,KAAZ6qB,EAAY,sCAAZA,GAAY5qB,qCAKTurB,MAAQvrB,mCALX4qB,EAAY,wBAAZA,EAAYntB,oEAFVJ,yBAA+B,oEAEjCutB,CAAY,KA2CzB,SAASU,GAAOpiB,GACRA,EAAEsiB,eACFtiB,EAAEsiB,aAAaC,WAAa,OAC5BviB,EAAEsiB,aAAaE,cAAgB,QAEnCxiB,EAAEyiB,iBACFziB,EAAE0iB,iBACN,CCxCA,MAAMC,GAAqD,CACvDC,WAAY,OACZC,WAAY,UAMVC,GAAuC,CACzCC,kBAAmB,OAMjBC,GAAoD,CACtDC,oBAAqB,QAMnBC,GAA+D,CACjEC,YAAY,EACZC,gBAAiB,GACjBC,eAAgB,IAqCb,IAAMC,GAAS,YAAhB,MAAOA,iBAASzsB,KAATysB,EAAS,sCAATA,EAAS,WAATA,EAAS,wBAATA,EAASC,WAjCN7B,QAAY,OAiCf4B,EAAS,6BAnBP,CACP,CAAE/C,QAAS,WAAYiD,WAAYC,IACnC,CAAElD,QAASxpB,KAAeysB,WAAYE,IACtC,CAAEnD,QAASoD,KAAkBC,SAAUC,MACvC,CAAEtD,QAASuD,KAAarD,SAAUjQ,GAClC,CACI+P,QAASwD,MACTP,WAAYQ,GACZC,OAAO,EACPC,KAAM,CAAC9Z,MAEX,CAAEmW,QAAS4D,MAAc1D,SAAUpQ,GACnC+T,KACA,CAAE7D,QAAS8D,KAAgCT,SAAUjB,IACrD,CAAEpC,QAAS+D,KAAiBV,SAAUd,IACtC,CAAEvC,QAASgE,KAA+BX,SAAUZ,IACpD,CAAEzC,QAASiE,KAAqCZ,SAAUV,KAC7DxC,SA1BG+D,KACAC,KACAxxB,KACAyxB,KACAvxB,KACAJ,IACAstB,GACAsE,oBAqBKtB,CAAS,KAGhB,SAAUU,GAAepqB,GAC3B,MAAO,IACIA,EAAmBiQ,YAElC,CAEM,SAAU4Z,KACZ,OAAOrlB,SAASymB,qBAAqB,QAAQ,GAAGnM,IACpD,CAEA,SAASgL,KAOL,OAAOhb,OAAOoc,SAASC,MAC3B,CChGA,MAAMC,GAAY,CAChB,CAAEzE,QAAS,WAAYiD,WALnB,SAAUC,KACd,OAAOrlB,SAASymB,qBAAqB,QAAQ,GAAGnM,IAClD,EAGiDwL,KAAM,MAGnD5iB,EACF2jB,SAGFC,KAAuBF,IAAWG,gBAAgB7B,IAC/C8B,MAAMC,GAAOnV,QAAQoV,IAAID,qBCnB5B,OACA,aACA,gBACA,WACA,eACA,kBACA,gBACA,mBACA,gBACA,mBACA,gBACA,mBACA,gBACA,mBACA,gBACA,mBACA,cACA,aACA,gBACA,aACA,gBACA,aACA,gBACA,aACA,gBACA,aACA,gBACA,mBACA,gBACA,aACA,gBACA,YACA,eACA,aACA,gBACA,aACA,gBACA,aACA,gBACA,aACA,gBACA,aACA,gBACA,aACA,gBACA,aACA,gBACA,mBACA,gBACA,mBACA,gBACA,aACA,gBACA,aACA,gBACA,gBACA,mBACA,gBACA,mBACA,eACA,kBACA,gBACA,mBACA,gBACA,mBACA,gBACA,mBACA,gBACA,mBACA,gBACA,mBACA,aACA,gBACA,aACA,gBACA,mBACA,gBACA,mBACA,gBACA,mBACA,gBACA,aACA,gBACA,aACA,gBACA,aACA,gBACA,aACA,gBACA,cACA,iBACA,aACA,gBACA,aACA,gBACA,mBACA,gBACA,mBACA,gBACA,WACA,cACA,aACA,gBACA,aACA,gBACA,YACA,eACA,mBACA,sBACA,kBACA,qBACA,aACA,gBACA,aACA,gBACA,WACA,cACA,aACA,gBACA,aACA,gBACA,gBACA,mBACA,aACA,gBACA,aACA,gBACA,aACA,gBACA,mBACA,gBACA,aACA,gBACA,aACA,gBACA,aACA,gBACA,aACA,gBACA,aACA,gBACA,aACA,gBACA,aACA,gBACA,aACA,gBACA,aACA,gBACA,aACA,gBACA,aACA,gBACA,aACA,gBACA,aACA,gBACA,aACA,gBACA,aACA,gBACA,aACA,gBACA,aACA,gBACA,aACA,gBACA,aACA,gBACA,aACA,gBACA,mBACA,gBACA,aACA,gBACA,aACA,gBACA,aACA,gBACA,aACA,gBACA,aACA,gBACA,mBACA,gBACA,aACA,gBACA,iBACA,oBACA,gBACA,mBACA,aACA,gBACA,aACA,gBACA,mBACA,gBACA,aACA,gBACA,aACA,gBACA,aACA,gBACA,aACA,gBACA,aACA,gBACA,aACA,gBACA,aACA,gBACA,aACA,gBACA,aACA,kBACA,qBACA,gBACA,aACA,gBACA,aACA,gBACA,aACA,gBACA,aACA,gBACA,aACA,gBACA,cACA,iBACA,aACA,gBACA,aACA,gBACA,aACA,gBACA,gBACA,mBACA,cACA,iBACA,aACA,gBACA,cACA,iBACA,cACA,kBACA,qBACA,iBACA,gBACA,mBACA,aACA,gBACA,aACA,gBACA,aACA,kBACA,qBACA,gBACA,aACA,gBACA,mBACA,sBACA,aACA,gBACA,gBACA,mBACA,gBACA,mBACA,gBACA,mBACA,gBACA,oBAIA,cACA,WACA,WACA,CACA,cACA,cACA,8CACA,gCACArlB,EAEA,WACA,CACAulB,kBACA,qBACA,EACAA,YACAC,YACAD","names":["GetStylingService","constructor","_concurrentRequestHandlingService","this","getStyling","options","callApi","url","body","sendCredentials","C_Dev_IBS_StingrayProjects_Stingray_ClientApp_node_modules_babel_runtime_helpers_esm_defineProperty_js__WEBPACK_IMPORTED_MODULE_1__","_angular_core__WEBPACK_IMPORTED_MODULE_2__","factory","PowerBIReportTypeEnum","StingrayCommonModule","C_Dev_IBS_StingrayProjects_Stingray_ClientApp_node_modules_babel_runtime_helpers_esm_defineProperty_js__WEBPACK_IMPORTED_MODULE_0__","CommonModule","ReactiveFormsModule","RouterModule","MatButtonModule","MatDialogModule","MatFormFieldModule","MatInputModule","MatSelectModule","MatSnackBarModule","MatSortModule","MatTableModule","MatPaginatorModule","MatTooltipModule","MatIconModule","MatRadioModule","MatPseudoCheckboxModule","MatRippleModule","i0","CopyrightComponent","Date","getFullYear","selectors","trigger","state","style","opacity","transition","animate","CountdownComponent","EventEmitter","countdownTo","targetTime","seconds","getRemainingSeconds","Math","floor","max","getTime","displayValue","observableTimer","pipe","take","map","x","tap","fireCompletedIfDone","getDisplayValue","remainingSeconds","completed","emit","padNumber","n","s","toString","length","ConcurrentRequestHandlingEnum","ApiRootService","_appBaseHref","getApiRoot","defineProperty","core","APP_BASE_HREF","ApiCallUrlService","_apiRootService","_currentCaseService","_currentEnvironmentService","getUrl","path","includeEnvironmentAndCase","addUrlSegment","getCurrentEnvironmentName","getCurrentCaseName","substr","encodeURI","replace","newSegment","appendSlash","AuthenticationTokenService","_userSessionService","_refreshSessionService","_httpErrorService","getAuthenticationToken","session","getUserSession","isValid","requiresRefresh","refreshSession","authenticationToken","token","refreshToken","handleHttpError","result","setUserSession","observableOf","hasValidAuthenticationToken","issuedAt","expiresAt","moment","diff","validTimespan","C_Dev_IBS_StingrayProjects_Stingray_ClientApp_node_modules_babel_runtime_helpers_esm_defineProperty_js__WEBPACK_IMPORTED_MODULE_2__","_angular_core__WEBPACK_IMPORTED_MODULE_6__","GetClientsService","getClients","CachedCaseListService","getClientsService","userSessionService","currentEnvironmentService","ReplaySubject","merge","userSessionChanged","environmentChanged","subscribe","userSession","restrictedToCase","_subject","next","clientCode","code","clientName","name","cachedCaseListChanged","CaseEnvChangeRedirectService","getCaseEnvChangeRedirectUrl","caseEnvChangeRedirectUrl","newCaseName","newEnvironmentName","split","filter","ApiCallService","httpClient","_apiCallUrlService","_authenticationTokenService","_redirectToLoginService","_isLoadingService","validate","getOptionsWithDefaultValues","httpHeaders","FormData","authTokenObservable","subject","Subject","useLoadingIndicator","setLoading","finalize","clearLoading","error","Authorization","post","redirectToLogin","complete","headers","HttpHeaders","Object","assign","Error","ConcurrentRequestHandlingService","_apiCallService","proxyName","apiCallOptions","apiProxyOptions","getDefaultApiProxyOptions","getAdjustedApiCallOptions","concurrentRequestHandling","existingRequest","_observables","subjects","subscription","unsubscribe","createSubscription","asObservable","clearObservablesList","handleApiCallCompleted","data","CopyToClipboardService","copyToClipboard","text","el","document","createElement","value","setAttribute","position","left","appendChild","select","execCommand","removeChild","CurrentAdminPortalConfigService","_getStylingService","BehaviorSubject","undefined","caseChanged","onCasechanged","currentCaseName","_currentCaseName","refresh","_configChangedSubject","configChanged","_angular_core__WEBPACK_IMPORTED_MODULE_4__","CurrentCaseService","_router","_currentRouteService","_replaceRouteParameterService","_caseEnvChangeRedirectService","events","e","NavigationEnd","onNavigation","getCurrentRoute","params","setCurrentCase","navigate","getUpdatedUrl","_caseChangedSubject","getValue","currentRoute","currentEnvironmentName","caseEnvChangeRedirect","replaceRouteParameter","route","paramName","paramValue","leaveOutEmptyParameter","splice","CurrentEnvironmentService","environmentChangedSubject","_environmentChangedSubject","environment","setCurrentEnvironment","CurrentRouteService","_routeModelService","getRouteModel","routerState","snapshot","root","_angular_core__WEBPACK_IMPORTED_MODULE_1__","EnvironmentListService","environments","allowedEnvironments","sort","a","b","localeCompare","isDefault","environmentListChanged","getEnvironmentList","ErrorDialogComponent","_dialogRef","_snackbarService","_copyToClipboardService","errorDetails","getFullErrorString","close","copyErrorDetails","open","message","errorMessage","ipAddress","referrer","username","logReferenceId","format","stackTrace","MAT_DIALOG_DATA","ctx","ErrorService","_dialog","registerError","GetDynamicMenusService","getDynamicMenus","GetCurrentUserDynamicMenusService","_getDynamicMenusService","_permissionService","updateMenus","permissionsChanged","verifyPermission","_pending","_dashboardsSubject","dashboards","_powerBIReportsSubject","powerBIReports","powerBIReportType","_powerBIPaginatedReportsSubject","_administrationMenusSubject","administrationMenus","getCurrentUserDashboards","getCurrentUserPowerBIReports","getCurrentUserPowerBIPaginatedReports","getAdministrationMenus","HomeUrlService","updateUrl","newUrl","urlChanged","getHomeUrl","HttpErrorService","_errorService","status","hasOwnProperty","IsLoadingService","observable","_counter","setTimeout","PermissionService","_permissions","permissions","permission","_permissionsChangedSubject","permissionName","RedirectToLoginService","redirectedFromRoute","_redirectedFromUrl","routeModel","fromUrl","urlWithPopulatedParameters","indexOf","slice","k","urlWithParameterPlaceholders","push","_queryParams","queryParams","caseName","getRedirectedFromUrl","getQueryParams","clearRedirectedFromUrl","RefreshSessionService","_httpClient","args","getHeaders","ReplaceRouteParameterService","i","startsWith","substring","RouteModelService","activatedRouteSnapshot","parent","routeConfig","firstChild","SnackbarService","_matSnackBar","action","duration","CrossTabCommunicationService","window","addEventListener","onStorage","attachEvent","register","handler","_handlers","key","sendMessage","msg","json","JSON","stringify","localStorage","setItem","removeItem","event","handlers","TabRegistrationService","initialize","_initialized","unregister","getInstanceCount","serializedCount","getItem","parseInt","UserSessionService","_crossTabCommunicationService","_tabRegistrationService","wireupCrossTabCommunications","loadSavedUserSession","_userSession","Promise","resolve","_initializationPromiseResolver","_initializationTimeout","_userSessionSubject","sessionStorage","jsonParse","newValue","internalSetUserSession","signOut","broadcast","clearTimeout","parse","ParticipantPhoneCallIsVerifiedDialogComponent","currentPhoneCallService","isVerified","isParticipantVerified","participantName","currentPhoneCallChanged","phoneCall","dateOfBirth","ssnLastFour","address","UpdatePhoneCallService","updatePhoneCall","GetPhoneCallParticipantInfoService","getPhoneCallParticipantInfo","GetParticipantIdFromRouteService","getParticipantIdFromRoute","participantIdString","participantId","MostRecentParticipantIdService","_getParticipantIdFromRouteService","router","_mostRecentParticipantId","currentParticipantId","_participantIdChangedSubject","getMostRecentParticipantId","participantIdChanged","CurrentPhoneCallService","_updatePhoneCallService","_getPhoneCallParticipantInfoService","_mostRecentParticipantIdService","isCurrentlyInPhoneCall","_subscriptions","createSubscriptions","phoneCallParticipantInfo","emitParticipantInfo","callHistoryId","_phoneCallParticipantInfoSubject","setCurrentPhoneCall","piiMatches","verifiedParticipantId","updateParticipantInfoAndShowVerificationDialog","setAndEmitParticipantInfo","employeeId","createParticipantIdChangedSubscription","createUserSessionChangedSubscription","createEnvironmentChangedSubscription","handleParticipantIdChanged","handleUserSessionChanged","endPhoneCall","skip","handleEnvironmentChanged","removeSessionStorageData","getSessionStorageData","updateSessionStorageData","sessionStorageData","serializedSessionStorageData","_sessionStorageKey","update","APPLICATION_INSIGHTS_CONNECTION_STRING","AppInsightsService","_appInsights","ApplicationInsights","config","connectionString","extensionConfig","AppInsightsCfgSyncPlugin","cfgUrl","loadAppInsights","addTelemetryInitializer","envelope","UserId_CF","userInfo","id","Email_CF","emailAddress","console","trackException","exception","ErrorHandlerService","_appInsightsService","handleError","MomentUtcDateAdapter","MomentDateAdapter","dateLocale","super","createDate","year","month","date","locale","parseFormat","today","deserialize","MAT_DATE_LOCALE","NavigationModule","FormsModule","MatMenuModule","NotFoundComponent","_location","copyrightYear","navigateBack","back","STORAGE_KEY","NavSidebarExpandedService","toggleExpanded","toggled","NoCaseSelectedOverlayComponent","LogoutService","logout","NavUserMenuComponent","_logoutService","ngOnInit","userDisplayName","displayName","accountSettingsUrl","NavHeaderComponent","_environmentListService","updateEnvironment","environmentName","toLowerCase","nonDefaultEnvironmentSelected","ADMINISTRATION_TITLE","NavSidebarMenuService","_getCurrentUserDynamicMenuService","getMenus","getMenuModel","menus","getPopulatedMenuData","menu","icon","title","menuItems","item","join","groupedMenus","groupedMenu","header","zip","dashboardsAndPowerBI","routeParams","getRawMenuData","requiredParams","every","p","hasParam","requiredPermissions","some","groupedItem","populateDynamicMenu","addDynamicAdminMenuItemsToStaticMenu","menuItem","populateUrlParams","addDynamicMenuItemsToStaticMenu","menuTitle","o","paginatedReportMenuItems","concat","adminMenuItems","friendlyName","baseUrlSegment","routeParam","param","ctx_r36","ctx_r39","NavSidebarComponent","navSidebarMenuService","_homeUrlService","_navSidebarExpandedService","Map","expanded","isNavSidebarExpanded","_resizeObserver","ResizeObserver","entries","target","scrollHeight","clientHeight","classList","contains","add","remove","homeUrl","isExpandedInitially","isOverflowScroll","ngAfterViewInit","observeResize","_parentElement","nativeElement","_activeLinkItem","forEach","scrollToItem","onCollapseButtonClick","_overflowTimer","_scrollTimer","_menuItemSubscription","model","activeMenu","getActiveMenu","changes","totalMenus","found","index","isActive","_activeURL","_openedMenus","_menuHeight","set","container","pathname","decodeURIComponent","URL","href","itemDistanceFromTop","getBoundingClientRect","top","containerHeight","scroll","behavior","expand","indexOfMenu","height","_menuItem","toArray","delete","isMenuOpen","includes","getHeight","get","setMouseOver","mouseOver","mouseOverString","_collapsedMenuActiveLink","_collapsedMenu","setMouseLeave","changeScrollbar","element","unobserve","observe","ngOnDestroy","clearInterval","disconnect","NavClientPickerComponent","_cachedCaseListService","_formBuilder","form","group","valueChanges","clients","NavNewTabComponent","currentUrl","decodeURI","NavEnvPickerComponent","selectedEnvironment","selectEnvironment","NavEnvMessageComponent","updateEnvironmentMessage","environmentMessage","description","NavPhoneCallBannerComponent","NavLayoutComponent","_currentAdminPortalConfigService","navSidebarExpandedService","navSidebarToggleSubscription","showPhoneCallBanner","customRouteData","requiresCaseSelection","adminPortalConfigChangedSubscription","headingColor","clientPickerCtrStyle","RouteGuardService","canActivate","canActivateChild","getRoutesWithEnvironmentAndClient","loadChildren","ROUTES","pathMatch","redirectTo","then","LoginModule","component","children","__webpack_require__","ParticipantModule","PortalConfigModule","TitaniaNavigationModule","ReportingModule","PowerBIModule","UsersModule","ExpressionRulesModule","PermissionsModule","AdminPortalConfigModule","EnvironmentsModule","PublishingModule","DashboardModule","DataRefreshModule","CensusConfigModule","CasePlanGroupsModule","ApplicationQuestionsModule","CasePlanAttachmentsModule","EligibilityWindowsModule","EnrollmentBuilderModule","GlobalCreditConfigurationModule","DashboardConfigurationModule","RolloverModule","InstructionCaseConfigModule","InstructionFileSetupModule","RemittanceFileDefinitionGroupModule","RemittanceCaseFileDefinitionGroupModule","FilesModule","DeductionCodesModule","ParticipantTransactionsModule","DependentVerificationModule","DependentVerificationRulesModule","CensusReportsModule","IssueTrackerModule","AutoCommitCancelTransactionModule","DataIntegrityModule","TierStructureGlobalModule","TierStructureCaseLevelModule","PaymentFileConfigurationModule","CaseSSOServiceProvidersModule","CaseSSOModule","VideoConfigModule","WexSSOModule","StingrayRouteReuseStrategy","shouldDetach","store","handle","shouldAttach","retrieve","shouldReuseRoute","future","curr","nonReuseProperties","allowRouteReuse","StingrayRoutingModule","provide","RouteReuseStrategy","useClass","imports","SessionExpirationDialogComponent","_args","countdownComponent","expirationDate","_userSessionChangedSubscription","expire","UserSessionTimeoutService","_sessionExpirationTimeout","setSessionTimeout","timeoutDuration","SHOW_MODAL_THRESHHOLD","disableClose","afterClosed","LoadingOverlayComponent","isLoading","AppComponent","userSessionTimeoutService","appInsightsService","isLoadingService","matDialog","NavigationStart","closeAll","RouteConfigLoadStart","RouteConfigLoadEnd","NavigationCancel","onDrag","DOCUMENT","dataTransfer","dropEffect","effectAllowed","preventDefault","stopPropagation","MAT_FORM_FIELD_OPTIONS","appearance","floatLabel","MAT_TAB_GROUP_OPTIONS","animationDuration","MAT_PAGINATOR_OPTIONS","formFieldAppearance","MAT_EXPANSION_PANEL_OPTIONS","hideToggle","collapsedHeight","expandedHeight","AppModule","bootstrap","useFactory","getBaseUrl","getBaseHref","MAT_DATE_FORMATS","useValue","MAT_MOMENT_DATE_FORMATS","DateAdapter","APP_INITIALIZER","appInitializer","multi","deps","ErrorHandler","CurrencyPipe","MAT_FORM_FIELD_DEFAULT_OPTIONS","MAT_TABS_CONFIG","MAT_PAGINATOR_DEFAULT_OPTIONS","MAT_EXPANSION_PANEL_DEFAULT_OPTIONS","BrowserModule","BrowserAnimationsModule","HttpClientModule","DragulaModule","getElementsByTagName","location","origin","providers","enableProdMode","__NgCli_bootstrap_1","bootstrapModule","catch","err","log","webpackContext","module"],"sourceRoot":"webpack:///","sources":["./src/app/modules/api/get-styling.service.generated.ts","./src/app/modules/api/power-bi-report-type-enum.generated.ts","./src/app/modules/common/common.module.ts","./src/app/modules/common/components/copyright/copyright.component.html","./src/app/modules/common/components/copyright/copyright.component.ts","./src/app/modules/common/components/countdown/countdown.component.ts","./src/app/modules/common/components/countdown/countdown.component.html","./src/app/modules/common/enums/concurrent-request-handling-enum.ts","./src/app/modules/common/services/api-root.service.ts","./src/app/modules/common/services/api-call-url.service.ts","./src/app/modules/common/services/authentication-token.service.ts","./src/app/modules/api/get-clients.service.generated.ts","./src/app/modules/common/services/cached-case-list.service.ts","./src/app/modules/common/services/case-env-change-redirect.service.ts","./src/app/modules/common/services/api-call.service.ts","./src/app/modules/common/services/concurrent-request-handling.service.ts","./src/app/modules/common/services/copy-to-clipboard.service.ts","./src/app/modules/common/services/current-admin-portal-config.service.ts","./src/app/modules/common/services/current-case.service.ts","./src/app/modules/common/services/current-environment.service.ts","./src/app/modules/common/services/current-route.service.ts","./src/app/modules/common/services/environment-list.service.ts","./src/app/modules/common/components/error-dialog/error-dialog.component.ts","./src/app/modules/common/components/error-dialog/error-dialog.component.html","./src/app/modules/common/services/error.service.ts","./src/app/modules/api/get-dynamic-menus.service.generated.ts","./src/app/modules/common/services/get-current-user-dynamic-menus.service.ts","./src/app/modules/common/services/home-url.service.ts","./src/app/modules/common/services/http-error.service.ts","./src/app/modules/common/services/is-loading.service.ts","./src/app/modules/common/services/permission.service.ts","./src/app/modules/common/services/redirect-to-login.service.ts","./src/app/modules/common/services/refresh-session.service.ts","./src/app/modules/common/services/replace-route-parameter.service.ts","./src/app/modules/common/services/route-model.service.ts","./src/app/modules/common/services/snackbar.service.ts","./src/app/modules/common/services/cross-tab-communication.service.ts","./src/app/modules/common/services/tab-registration.service.ts","./src/app/modules/common/services/user-session.service.ts","./src/app/modules/participant-shared/components/participant-phone-call-is-verified-dialog/participant-phone-call-is-verified-dialog.component.html","./src/app/modules/participant-shared/components/participant-phone-call-is-verified-dialog/participant-phone-call-is-verified-dialog.component.ts","./src/app/modules/api/update-phone-call.service.generated.ts","./src/app/modules/api/get-phone-call-participant-info.service.generated.ts","./src/app/modules/participant-shared/services/get-participant-id-from-route.service.ts","./src/app/modules/participant-shared/services/most-recent-participant-id.service.ts","./src/app/modules/participant-shared/services/current-phone-call.service.ts","./src/environments/environment.live.ts","./src/app/modules/common/services/app-insights.service.ts","./src/app/modules/common/services/error-handler.service.ts","./src/app/modules/common/services/moment-utc-date-adapter.ts","./src/app/modules/navigation/navigation.module.ts","./src/app/modules/common/components/not-found/not-found.component.ts","./src/app/modules/common/components/not-found/not-found.component.html","./src/app/modules/navigation/services/nav-sidebar-expanded.service.ts","./src/app/modules/common/components/no-case-selected-overlay/no-case-selected-overlay.component.ts","./src/app/modules/common/components/no-case-selected-overlay/no-case-selected-overlay.component.html","./src/app/modules/common/services/logout.service.ts","./src/app/modules/navigation/components/nav-user-menu/nav-user-menu.component.ts","./src/app/modules/navigation/components/nav-user-menu/nav-user-menu.component.html","./src/app/modules/navigation/components/nav-header/nav-header.component.html","./src/app/modules/navigation/components/nav-header/nav-header.component.ts","./src/app/modules/navigation/services/nav-sidebar-menu.service.ts","./src/app/modules/navigation/components/nav-sidebar/nav-sidebar.component.html","./src/app/modules/navigation/components/nav-sidebar/nav-sidebar.component.ts","./src/app/modules/navigation/components/nav-client-picker/nav-client-picker.component.html","./src/app/modules/navigation/components/nav-client-picker/nav-client-picker.component.ts","./src/app/modules/navigation/components/nav-new-tab/nav-new-tab.component.ts","./src/app/modules/navigation/components/nav-new-tab/nav-new-tab.component.html","./src/app/modules/navigation/components/nav-env-picker/nav-env-picker.component.html","./src/app/modules/navigation/components/nav-env-picker/nav-env-picker.component.ts","./src/app/modules/navigation/components/nav-env-message/nav-env-message.component.html","./src/app/modules/navigation/components/nav-env-message/nav-env-message.component.ts","./src/app/modules/navigation/components/nav-phone-call-banner/nav-phone-call-banner.component.ts","./src/app/modules/navigation/components/nav-phone-call-banner/nav-phone-call-banner.component.html","./src/app/modules/navigation/components/nav-layout/nav-layout.component.html","./src/app/modules/navigation/components/nav-layout/nav-layout.component.ts","./src/app/modules/routing/services/route-guard.service.ts","./src/app/modules/routing/routes.ts","./src/app/modules/routing/services/stingray-route-reuse-strategy.ts","./src/app/modules/routing/routing.module.ts","./src/app/modules/common/components/session-expiration-dialog/session-expiration-dialog.component.ts","./src/app/modules/common/components/session-expiration-dialog/session-expiration-dialog.component.html","./src/app/modules/common/services/user-session-timeout.service.ts","./src/app/modules/common/components/loading-overlay/loading-overlay.component.ts","./src/app/modules/common/components/loading-overlay/loading-overlay.component.html","./src/app/app.component.ts","./src/app/app.module.ts","./src/main.ts","./node_modules/moment/locale/ sync ^\\.\\/.*$"],"sourcesContent":["import { Injectable } from '@angular/core';\r\nimport { Observable } from 'rxjs';\r\nimport { ConcurrentRequestHandlingService } from '@modules/common/services/concurrent-request-handling.service';\r\nimport { ApiProxyOptions } from '@modules/common/models/api-proxy-options';\r\nimport { AdminPortalStylingViewModel } from './admin-portal-styling-view-model.generated';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class GetStylingService {\r\n constructor(private _concurrentRequestHandlingService: ConcurrentRequestHandlingService) { }\r\n\r\n public getStyling(options?: ApiProxyOptions): Observable {\r\n return this._concurrentRequestHandlingService.callApi(\r\n \"GetStylingService_getStyling\",\r\n {\r\n url: '/AdminPortalConfig/GetStyling/GetStyling',\r\n body: {},\r\n sendCredentials: true\r\n }, options\r\n );\r\n }\r\n}\r\n","export enum PowerBIReportTypeEnum {\r\n Report = 0,\r\n PaginatedReport = 1,\r\n}\r\n","import { CommonModule } from '@angular/common';\r\nimport { NgModule } from '@angular/core';\r\nimport { ReactiveFormsModule } from '@angular/forms';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatDialogModule } from '@angular/material/dialog';\r\nimport { MatFormFieldModule } from '@angular/material/form-field';\r\nimport { MatInputModule } from '@angular/material/input';\r\nimport { MatPaginatorModule } from '@angular/material/paginator';\r\nimport { MatSelectModule } from '@angular/material/select';\r\nimport { MatSnackBarModule } from '@angular/material/snack-bar';\r\nimport { MatSortModule } from '@angular/material/sort';\r\nimport { MatTableModule } from '@angular/material/table';\r\nimport { MatTooltipModule } from '@angular/material/tooltip';\r\nimport { RouterModule } from '@angular/router';\r\nimport { AgGridComponent } from '@modules/common/components/ag-grid/ag-grid.component';\r\nimport { AlertErrorComponent } from '@modules/common/components/alert-error/alert-error.component';\r\nimport { AlertSuccessComponent } from '@modules/common/components/alert-success/alert-success.component';\r\nimport { AlertWarningComponent } from '@modules/common/components/alert-warning/alert-warning.component';\r\nimport { AlertComponent } from '@modules/common/components/alert/alert.component';\r\nimport { AreYouSureDialogComponent } from '@modules/common/components/are-you-sure-dialog/are-you-sure-dialog';\r\nimport { BreadcrumbsComponent } from '@modules/common/components/breadcrumbs/breadcrumbs.component';\r\nimport { CopyrightComponent } from '@modules/common/components/copyright/copyright.component';\r\nimport { CountdownComponent } from '@modules/common/components/countdown/countdown.component';\r\nimport { DragHandleComponent } from '@modules/common/components/drag-handle/drag-handle.component';\r\nimport { ErrorDialogComponent } from '@modules/common/components/error-dialog/error-dialog.component';\r\nimport { FileFormControlComponent } from '@modules/common/components/file-form-control/file-form-control.component';\r\nimport { FileSearchDialogComponent } from '@modules/common/components/file-search-dialog/file-search-dialog.component';\r\nimport { FileSearchComponent } from '@modules/common/components/file-search/file-search.component';\r\nimport { LabeledListItemComponent } from '@modules/common/components/labeled-list-item/labeled-list-item.component';\r\nimport { LoadingOverlayComponent } from '@modules/common/components/loading-overlay/loading-overlay.component';\r\nimport { NoCaseSelectedOverlayComponent } from '@modules/common/components/no-case-selected-overlay/no-case-selected-overlay.component';\r\nimport { NotFoundComponent } from '@modules/common/components/not-found/not-found.component';\r\nimport { ObscuredInputComponent } from '@modules/common/components/obscured-input/obscured-input.component';\r\nimport { ParticipantBenefitsComparisonGridComponent } from '@modules/common/components/participant-benefits-comparison-grid/participant-benefits-comparison-grid.component';\r\nimport { PasswordRequirementsComponent } from '@modules/common/components/password-requirements/password-requirements.component';\r\nimport { ProcessExecutionStatusComponent } from '@modules/common/components/process-execution-status/process-execution-status.component';\r\nimport { RichEditorComponent } from '@modules/common/components/rich-editor/rich-editor.component';\r\nimport { SessionExpirationDialogComponent } from '@modules/common/components/session-expiration-dialog/session-expiration-dialog.component';\r\nimport { TableLoadingOverlayComponent } from '@modules/common/components/table-loading-overlay/table-loading-overlay.component';\r\nimport { TimePickerComponent } from '@modules/common/components/time-picker/time-picker.component';\r\nimport { ValueMaskingComponent } from '@modules/common/components/value-masking/value-masking.component';\r\nimport { DashedInputDirective } from '@modules/common/directives/dashed-input/dashed-input.directive';\r\nimport { ExpandableTableDetailRowDirective } from '@modules/common/directives/expandable-table-detail-row/expandable-table-detail-row.directive';\r\nimport { ScrollToDirective } from '@modules/common/directives/scrollTo/scroll-to.directive';\r\nimport { PhoneNumberPipe } from '@modules/common/pipes/phone-number.pipe';\r\nimport { TrustHtmlPipe } from '@modules/common/pipes/trust-html.pipe';\r\nimport { TooltipDirective } from '@modules/common/directives/tooltip/tooltip.directive';\r\nimport { CustomToolTipComponent } from '@modules/common/components/custom-tooltip/custom-tooltip.component';\r\nimport { ErrorIndicatorComponent } from './components/error-indicator/error-indicator.component';\r\nimport { FormBottomToolbarComponent } from './components/form-bottom-toolbar/form-bottom-toolbar.component';\r\nimport { PublishLinkComponent } from './components/publish-link/publish-link.component';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { ExpansionIndicatorComponent } from '@modules/common/components/expansion-indicator/expansion-indicator.component';\r\nimport { ErrorSummaryComponent } from './components/error-summary/error-summary.component';\r\nimport { RadioGroupYesNoComponent } from './components/radio-group-yes-no/radio-group-yes-no.component';\r\nimport { MultiSelectComponent } from './components/multi-select/multi-select.component';\r\nimport { MatRadioModule } from '@angular/material/radio';\r\nimport { NumberInputDirective } from '@modules/common/directives/number-input/number-input.directive';\r\nimport { WarningSummaryComponent } from '@modules/common/components/warning-summary/warning-summary.component';\r\nimport { MatPseudoCheckboxModule, MatRippleModule } from '@angular/material/core';\r\nimport { FormatEmptyDataPipe } from '@modules/common/pipes/format-empty-data.pipe';\r\nimport { AlertInfoComponent } from '@modules/common/components/alert-info/alert-info.component';\r\n\r\n@NgModule({\r\n declarations: [\r\n RichEditorComponent,\r\n DragHandleComponent,\r\n ExpandableTableDetailRowDirective,\r\n ScrollToDirective,\r\n AlertComponent,\r\n AlertErrorComponent,\r\n AlertInfoComponent,\r\n AlertSuccessComponent,\r\n AlertWarningComponent,\r\n LoadingOverlayComponent,\r\n TableLoadingOverlayComponent,\r\n CopyrightComponent,\r\n LabeledListItemComponent,\r\n BreadcrumbsComponent,\r\n TrustHtmlPipe,\r\n PasswordRequirementsComponent,\r\n ErrorDialogComponent,\r\n NoCaseSelectedOverlayComponent,\r\n SessionExpirationDialogComponent,\r\n ValueMaskingComponent,\r\n CountdownComponent,\r\n NotFoundComponent,\r\n FileSearchComponent,\r\n FileSearchDialogComponent,\r\n FileFormControlComponent,\r\n AreYouSureDialogComponent,\r\n\t\tTimePickerComponent,\r\n\t\tAgGridComponent,\r\n\t\tObscuredInputComponent,\r\n ProcessExecutionStatusComponent,\r\n PhoneNumberPipe,\r\n DashedInputDirective,\r\n ParticipantBenefitsComparisonGridComponent,\r\n TooltipDirective,\r\n CustomToolTipComponent,\r\n ErrorIndicatorComponent,\r\n FormBottomToolbarComponent,\r\n PublishLinkComponent,\r\n ExpansionIndicatorComponent,\r\n ErrorSummaryComponent,\r\n RadioGroupYesNoComponent,\r\n MultiSelectComponent,\r\n NumberInputDirective,\r\n WarningSummaryComponent,\r\n FormatEmptyDataPipe,\r\n ],\r\n imports: [\r\n CommonModule,\r\n ReactiveFormsModule,\r\n RouterModule,\r\n MatButtonModule,\r\n MatDialogModule,\r\n MatFormFieldModule,\r\n MatInputModule,\r\n MatSelectModule,\r\n MatSnackBarModule,\r\n MatSortModule,\r\n MatTableModule, \r\n MatPaginatorModule,\r\n MatTooltipModule,\r\n MatInputModule,\r\n MatIconModule,\r\n MatRadioModule,\r\n MatPseudoCheckboxModule,\r\n MatRippleModule,\r\n ],\r\n exports: [\r\n RichEditorComponent,\r\n DragHandleComponent,\r\n ExpandableTableDetailRowDirective,\r\n ScrollToDirective,\r\n AlertErrorComponent,\r\n AlertInfoComponent,\r\n AlertSuccessComponent,\r\n AlertWarningComponent,\r\n CopyrightComponent,\r\n LoadingOverlayComponent,\r\n TableLoadingOverlayComponent,\r\n LabeledListItemComponent,\r\n BreadcrumbsComponent,\r\n TrustHtmlPipe,\r\n PasswordRequirementsComponent,\r\n NoCaseSelectedOverlayComponent,\r\n SessionExpirationDialogComponent,\r\n ValueMaskingComponent,\r\n CountdownComponent,\r\n NotFoundComponent,\r\n FileFormControlComponent,\r\n\t\tTimePickerComponent,\r\n\t\tAgGridComponent,\r\n\t\tObscuredInputComponent,\r\n ProcessExecutionStatusComponent,\r\n PhoneNumberPipe,\r\n DashedInputDirective,\r\n ParticipantBenefitsComparisonGridComponent,\r\n TooltipDirective,\r\n CustomToolTipComponent,\r\n ErrorIndicatorComponent,\r\n FormBottomToolbarComponent,\r\n PublishLinkComponent,\r\n FormatEmptyDataPipe,\r\n ExpansionIndicatorComponent,\r\n ErrorSummaryComponent,\r\n RadioGroupYesNoComponent,\r\n MultiSelectComponent,\r\n NumberInputDirective,\r\n WarningSummaryComponent,\r\n ]\r\n})\r\nexport class StingrayCommonModule {\r\n}\r\n","
\r\n © {{currentYear}} \r\n \r\n Winston. All Rights Reserved.\r\n \r\n
","import { Component, Input } from '@angular/core';\r\nimport { animate, state, style, transition, trigger } from '@angular/animations';\r\n\r\n@Component({\r\n selector: 'app-copyright',\r\n templateUrl: './copyright.component.html',\r\n styleUrls: ['./copyright.component.scss'],\r\n animations: [\r\n trigger('fade', [\r\n state('void', style({opacity: 0})),\r\n transition('void <=> *', [\r\n animate(300)\r\n ])\r\n ])]\r\n})\r\nexport class CopyrightComponent {\r\n @Input()\r\n public shouldShowFull: boolean = true;\r\n public currentYear: number = new Date().getFullYear();\r\n}\r\n","\r\nimport {timer as observableTimer, Observable } from 'rxjs';\r\n\r\nimport {tap, map, take} from 'rxjs/operators';\r\nimport { Component, Output, EventEmitter } from '@angular/core';\r\n\r\n\r\n\r\n\r\n\r\n@Component({\r\n selector: 'app-countdown',\r\n templateUrl: './countdown.component.html',\r\n styleUrls: ['./countdown.component.scss']\r\n})\r\nexport class CountdownComponent {\r\n public displayValue!: Observable;\r\n\r\n @Output()\r\n public completed = new EventEmitter();\r\n\r\n public countdownTo(targetTime: Date): void {\r\n let seconds = getRemainingSeconds(targetTime);\r\n this.displayValue =\r\n observableTimer(0, 1000).pipe(\r\n take(seconds + 1),\r\n map(x => Math.floor(seconds - x)),\r\n tap(x => this.fireCompletedIfDone(x)),\r\n map(getDisplayValue),);\r\n }\r\n\r\n private fireCompletedIfDone(remainingSeconds: number): void {\r\n if (remainingSeconds <= 0) {\r\n this.completed.emit();\r\n }\r\n }\r\n}\r\n\r\nfunction getRemainingSeconds(targetTime: Date): number {\r\n if (!(targetTime instanceof Date)) {\r\n targetTime = new Date(targetTime);\r\n }\r\n return Math.floor(Math.max(0, targetTime.getTime() - new Date().getTime())) / 1000;\r\n}\r\n\r\nfunction getDisplayValue(remainingSeconds: number): string {\r\n let minutes = Math.floor(remainingSeconds / 60);\r\n let seconds = remainingSeconds % 60;\r\n return padNumber(minutes) + ':' + padNumber(seconds);\r\n};\r\n\r\nfunction padNumber(n: number): string {\r\n let s = n.toString();\r\n while (s.length < 2) {\r\n s = '0' + s;\r\n }\r\n return s;\r\n}","{{displayValue | async}}\r\n","export enum ConcurrentRequestHandlingEnum {\r\n FirstOnly,\r\n AllowAll,\r\n LastOnly\r\n}","import { APP_BASE_HREF } from '@angular/common';\r\nimport { Inject, Injectable } from '@angular/core';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class ApiRootService {\r\n constructor(\r\n @Inject(APP_BASE_HREF) private readonly _appBaseHref: string\r\n ) { }\r\n\r\n /**\r\n * Return the base url to use when making API calls.\r\n */\r\n public getApiRoot(): string {\r\n return this._appBaseHref;\r\n }\r\n}\r\n","import { Injectable } from \"@angular/core\";\r\nimport { ApiRootService } from \"@modules/common/services/api-root.service\";\r\nimport { CurrentCaseService } from \"@modules/common/services/current-case.service\";\r\nimport { CurrentEnvironmentService } from '@modules/common/services/current-environment.service';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class ApiCallUrlService {\r\n constructor(\r\n private _apiRootService: ApiRootService,\r\n private _currentCaseService: CurrentCaseService,\r\n private _currentEnvironmentService: CurrentEnvironmentService\r\n ) { }\r\n\r\n public getUrl(path: string, includeEnvironmentAndCase: boolean = true): string {\r\n var url = this._apiRootService.getApiRoot();\r\n\r\n if (includeEnvironmentAndCase) {\r\n url = this.addUrlSegment(url, this._currentEnvironmentService.getCurrentEnvironmentName());\r\n url = this.addUrlSegment(url, this._currentCaseService.getCurrentCaseName());\r\n }\r\n\r\n if (url[url.length - 1] !== '/' && path[0] !== '/') {\r\n url += '/';\r\n }\r\n\r\n if (url[url.length - 1] === '/' && path[0] === '/') {\r\n path = path.substr(1);\r\n }\r\n\r\n url += path;\r\n url = encodeURI(url);\r\n return url.replace(\"'\", \"%27\");\r\n }\r\n\r\n private addUrlSegment(url: string, newSegment: string): string {\r\n url = this.appendSlash(url);\r\n\r\n url += newSegment || '';\r\n\r\n url = this.appendSlash(url);\r\n\r\n if (url.length > 1 && url[0] === '/' && url[1] === '/') {\r\n url = url.substr(1);\r\n }\r\n\r\n return url;\r\n }\r\n\r\n private appendSlash(url: string): string {\r\n if (url[url.length - 1] !== '/') {\r\n url += '/';\r\n }\r\n\r\n return url;\r\n }\r\n}\r\n","import { Injectable } from \"@angular/core\";\r\nimport { UserSession } from \"@modules/api/user-session.generated\";\r\nimport { HttpErrorService } from \"@modules/common/services/http-error.service\";\r\nimport { RefreshSessionService } from '@modules/common/services/refresh-session.service';\r\nimport { UserSessionService } from \"@modules/common/services/user-session.service\";\r\nimport * as moment from 'moment';\r\nimport { Observable, of as observableOf } from 'rxjs';\r\nimport { map, tap } from 'rxjs/operators';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class AuthenticationTokenService {\r\n constructor(\r\n private _userSessionService: UserSessionService,\r\n private _refreshSessionService: RefreshSessionService,\r\n private _httpErrorService: HttpErrorService\r\n ) { }\r\n\r\n public getAuthenticationToken(): Observable | undefined {\r\n let session = this._userSessionService.getUserSession();\r\n if (this.isValid(session)) {\r\n if (this.requiresRefresh(session!)) {\r\n return this._refreshSessionService.refreshSession({\r\n authenticationToken: session!.authenticationToken!.token!,\r\n refreshToken: session!.refreshToken!\r\n }).pipe(tap(() => { }, x => {\r\n this._httpErrorService.handleHttpError(x);\r\n }),map((result: UserSession) => {\r\n if (result) {\r\n this._userSessionService.setUserSession(result);\r\n } else {\r\n //One of the reasons refreshSession() can return null\r\n //is that a different tab tried to refresh the token\r\n //at the same time (this happens a lot when debugging).\r\n //In that case, it's cross your fingers time and we\r\n // try to get the session from the other tab.\r\n session = this._userSessionService.getUserSession();\r\n }\r\n return result && result.authenticationToken && result.authenticationToken.token;\r\n }),);\r\n }\r\n\r\n return observableOf(session!.authenticationToken!.token!);\r\n }\r\n }\r\n\r\n public hasValidAuthenticationToken(): boolean {\r\n return this.isValid(this._userSessionService.getUserSession());\r\n }\r\n\r\n private isValid(session?: UserSession): boolean {\r\n return !!(session\r\n && session.authenticationToken\r\n && session.authenticationToken.issuedAt\r\n && session.authenticationToken.expiresAt\r\n && moment.utc(session.authenticationToken.expiresAt).diff(moment.utc()) > 0);\r\n }\r\n\r\n private requiresRefresh(session: UserSession): boolean {\r\n let validTimespan = moment.utc(session.authenticationToken!.expiresAt).diff(moment.utc(session.authenticationToken!.issuedAt));\r\n return moment.utc().diff(moment.utc(session.authenticationToken!.issuedAt)) > validTimespan / 2;\r\n }\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { Observable } from 'rxjs';\r\nimport { ConcurrentRequestHandlingService } from '@modules/common/services/concurrent-request-handling.service';\r\nimport { ApiProxyOptions } from '@modules/common/models/api-proxy-options';\r\nimport { ClientsModel } from './clients-model.generated';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class GetClientsService {\r\n constructor(private _concurrentRequestHandlingService: ConcurrentRequestHandlingService) { }\r\n\r\n public getClients(options?: ApiProxyOptions): Observable {\r\n return this._concurrentRequestHandlingService.callApi(\r\n \"GetClientsService_getClients\",\r\n {\r\n url: '/Navigation/GetClients/GetClients',\r\n body: {},\r\n sendCredentials: true\r\n }, options\r\n );\r\n }\r\n}\r\n","import { Injectable } from \"@angular/core\";\r\nimport { ClientsModel } from \"@modules/api/clients-model.generated\";\r\nimport { GetClientsService } from \"@modules/api/get-clients.service.generated\";\r\nimport { CurrentEnvironmentService } from '@modules/common/services/current-environment.service';\r\nimport { UserSessionService } from \"@modules/common/services/user-session.service\";\r\nimport { merge, Observable, ReplaySubject } from \"rxjs\";\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class CachedCaseListService {\r\n private _subject = new ReplaySubject(1);\r\n\r\n constructor(\r\n getClientsService: GetClientsService,\r\n userSessionService: UserSessionService,\r\n currentEnvironmentService: CurrentEnvironmentService\r\n ) {\r\n merge(\r\n userSessionService.userSessionChanged(),\r\n currentEnvironmentService.environmentChanged\r\n ).subscribe(() => {\r\n const userSession = userSessionService.getUserSession();\r\n if (userSession) {\r\n if (userSession.restrictedToCase) {\r\n this._subject.next([{\r\n clientCode: userSession.restrictedToCase.code,\r\n clientName: userSession.restrictedToCase.name\r\n }]);\r\n } else {\r\n getClientsService.getClients().subscribe(result => {\r\n this._subject.next(result);\r\n });\r\n }\r\n }\r\n });\r\n }\r\n\r\n public get cachedCaseListChanged(): Observable {\r\n return this._subject;\r\n }\r\n}\r\n","import { Injectable } from \"@angular/core\";\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class CaseEnvChangeRedirectService {\r\n public getCaseEnvChangeRedirectUrl(caseEnvChangeRedirectUrl: string, newCaseName: string, newEnvironmentName: string): string[] {\r\n return caseEnvChangeRedirectUrl\r\n .split('/')\r\n .map(x => x.replace(':clientName', newCaseName).replace(':environment', newEnvironmentName))\r\n .filter(x => x);\r\n }\r\n}\r\n","import { HttpClient, HttpHeaders } from '@angular/common/http';\r\nimport { Injectable } from '@angular/core';\r\nimport { ApiCallOptions } from '@modules/common/models/api-call-options';\r\nimport { ApiCallUrlService } from '@modules/common/services/api-call-url.service';\r\nimport { AuthenticationTokenService } from '@modules/common/services/authentication-token.service';\r\nimport { HttpErrorService } from '@modules/common/services/http-error.service';\r\nimport { IsLoadingService } from '@modules/common/services/is-loading.service';\r\nimport { RedirectToLoginService } from '@modules/common/services/redirect-to-login.service';\r\nimport { Observable, Subject } from 'rxjs';\r\nimport { finalize, tap } from 'rxjs/operators';\r\n\r\n/**\r\n * Service used to make calls into the Web API. This service\r\n * should be used for all API calls, NEVER use Angular's\r\n * Http or HttpClient directly.\r\n */\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class ApiCallService {\r\n constructor(\r\n private httpClient: HttpClient,\r\n private _apiCallUrlService: ApiCallUrlService,\r\n private _authenticationTokenService: AuthenticationTokenService,\r\n private _redirectToLoginService: RedirectToLoginService,\r\n private _httpErrorService: HttpErrorService,\r\n private _isLoadingService: IsLoadingService\r\n ) {\r\n }\r\n\r\n /**\r\n * Make an API call to the given API url w/ the given request body. This\r\n * function returns an observable that provides the result data of the API call.\r\n * @param options The url, body, and other options used to make the call.\r\n */\r\n public callApi(options: ApiCallOptions): Observable {\r\n this.validate(options);\r\n options = this.getOptionsWithDefaultValues(options);\r\n\r\n const httpHeaders: { [key: string]: string } = {};\r\n\r\n if (!(options.body instanceof FormData)) {\r\n httpHeaders['Content-Type'] = 'application/json';\r\n }\r\n\r\n if (options.sendCredentials) {\r\n let authTokenObservable = this._authenticationTokenService.getAuthenticationToken();\r\n const subject = new Subject();\r\n if (authTokenObservable) {\r\n if (options.useLoadingIndicator) {\r\n this._isLoadingService.setLoading();\r\n authTokenObservable = authTokenObservable.pipe(finalize(() => this._isLoadingService.clearLoading()));\r\n }\r\n\r\n authTokenObservable.pipe(tap(() => { }, x => {\r\n subject.error(x);\r\n })).subscribe(token => {\r\n if (token) {\r\n httpHeaders['Authorization'] = 'Bearer ' + token;\r\n this.post(options, httpHeaders).pipe(\r\n tap(() => { }, x => {\r\n this._httpErrorService.handleHttpError(x);\r\n subject.error(x);\r\n })).subscribe(result =>\r\n subject.next(result)\r\n );\r\n } else {\r\n this._redirectToLoginService.redirectToLogin();\r\n subject.complete();\r\n }\r\n });\r\n\r\n return subject;\r\n }\r\n\r\n this._redirectToLoginService.redirectToLogin();\r\n subject.complete();\r\n return subject;\r\n }\r\n\r\n return this.post(options, httpHeaders).pipe(\r\n tap(() => { }, x => {\r\n this._httpErrorService.handleHttpError(x);\r\n }));\r\n }\r\n\r\n private post(options: ApiCallOptions, httpHeaders: { [key: string]: string }): Observable {\r\n let result = this.httpClient.post(\r\n this._apiCallUrlService.getUrl(options.url, options.includeEnvironmentAndCase),\r\n options.body,\r\n { headers: new HttpHeaders(httpHeaders) }\r\n );\r\n\r\n if (options.useLoadingIndicator) {\r\n this._isLoadingService.setLoading();\r\n result = result.pipe(finalize(() => this._isLoadingService.clearLoading()));\r\n }\r\n\r\n return result;\r\n }\r\n\r\n /**\r\n * Return a copy of the options object w/ default values \r\n * @param options\r\n */\r\n private getOptionsWithDefaultValues(options: ApiCallOptions): ApiCallOptions {\r\n options = Object.assign({}, options);\r\n if (typeof options.sendCredentials !== \"boolean\") {\r\n options.sendCredentials = true;\r\n }\r\n\r\n if (typeof options.useLoadingIndicator !== \"boolean\") {\r\n options.useLoadingIndicator = true;\r\n }\r\n\r\n return options;\r\n }\r\n\r\n private validate(options: ApiCallOptions): void {\r\n if (!options) {\r\n throw new Error(\"ApiCallOptions are required\");\r\n }\r\n\r\n if (!options.url) {\r\n throw new Error(\"ApiCallOptions.url is required\");\r\n }\r\n }\r\n}\r\n","import { Injectable } from \"@angular/core\";\r\nimport { ConcurrentRequestHandlingEnum } from \"@modules/common/enums/concurrent-request-handling-enum\";\r\nimport { ApiCallOptions } from \"@modules/common/models/api-call-options\";\r\nimport { ApiProxyOptions } from \"@modules/common/models/api-proxy-options\";\r\nimport { ApiCallService } from \"@modules/common/services/api-call.service\";\r\nimport { Observable, Subject, Subscription } from \"rxjs\";\r\nimport { finalize } from 'rxjs/operators';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class ConcurrentRequestHandlingService {\r\n constructor(private _apiCallService: ApiCallService) { }\r\n\r\n private _observables: { [proxyName: string]: PendingApiCall } = {};\r\n\r\n public callApi(\r\n proxyName: string,\r\n apiCallOptions: ApiCallOptions,\r\n apiProxyOptions?: ApiProxyOptions\r\n ): Observable {\r\n apiProxyOptions = this.getDefaultApiProxyOptions(apiProxyOptions);\r\n apiCallOptions = this.getAdjustedApiCallOptions(apiCallOptions, apiProxyOptions);\r\n\r\n if (apiProxyOptions.concurrentRequestHandling == ConcurrentRequestHandlingEnum.AllowAll) {\r\n return this._apiCallService.callApi(apiCallOptions);\r\n }\r\n\r\n if (apiProxyOptions.concurrentRequestHandling == ConcurrentRequestHandlingEnum.FirstOnly) {\r\n const existingRequest = this._observables[proxyName];\r\n if (existingRequest) {\r\n return existingRequest.subjects[0];\r\n } \r\n }\r\n\r\n if (apiProxyOptions.concurrentRequestHandling == ConcurrentRequestHandlingEnum.LastOnly) {\r\n const existingRequest = this._observables[proxyName];\r\n if (existingRequest) {\r\n existingRequest.subscription.unsubscribe();\r\n }\r\n }\r\n\r\n const subject = new Subject();\r\n this._observables[proxyName] = {\r\n subscription: this.createSubscription(proxyName, apiCallOptions),\r\n subjects: [subject]\r\n };\r\n\r\n return subject.asObservable();\r\n }\r\n\r\n private createSubscription(proxyName: string, apiCallOptions: ApiCallOptions): Subscription {\r\n return this._apiCallService\r\n .callApi(apiCallOptions).pipe(\r\n finalize(() => this.clearObservablesList(proxyName)))\r\n .subscribe(x => this.handleApiCallCompleted(x, proxyName));\r\n }\r\n\r\n private handleApiCallCompleted(data: T, proxyName: string): void {\r\n const existingRequest = this._observables[proxyName];\r\n if (existingRequest) {\r\n for (let subject of existingRequest.subjects) {\r\n subject.next(data);\r\n }\r\n }\r\n this.clearObservablesList(proxyName);\r\n }\r\n\r\n private clearObservablesList(proxyName: string): void {\r\n delete this._observables[proxyName];\r\n }\r\n\r\n private getDefaultApiProxyOptions(apiProxyOptions?: ApiProxyOptions): ApiProxyOptions {\r\n apiProxyOptions = Object.assign({}, apiProxyOptions || {});\r\n\r\n if (typeof apiProxyOptions.concurrentRequestHandling === 'undefined') {\r\n apiProxyOptions.concurrentRequestHandling = ConcurrentRequestHandlingEnum.FirstOnly;\r\n }\r\n\r\n if (typeof apiProxyOptions.useLoadingIndicator !== 'boolean') {\r\n apiProxyOptions.useLoadingIndicator = true;\r\n }\r\n\r\n if (typeof apiProxyOptions.includeEnvironmentAndCase !== 'boolean') {\r\n apiProxyOptions.includeEnvironmentAndCase = true;\r\n }\r\n\r\n return apiProxyOptions;\r\n }\r\n\r\n private getAdjustedApiCallOptions(apiCallOptions: ApiCallOptions, apiProxyOptions: ApiProxyOptions): ApiCallOptions {\r\n apiCallOptions = Object.assign({}, apiCallOptions);\r\n\r\n if (typeof apiCallOptions.useLoadingIndicator !== 'boolean') {\r\n apiCallOptions.useLoadingIndicator = apiProxyOptions.useLoadingIndicator;\r\n }\r\n\r\n if (typeof apiCallOptions.includeEnvironmentAndCase !== 'boolean') {\r\n apiCallOptions.includeEnvironmentAndCase = apiProxyOptions.includeEnvironmentAndCase;\r\n }\r\n\r\n return apiCallOptions;\r\n }\r\n}\r\n\r\ninterface PendingApiCall {\r\n subscription: Subscription;\r\n subjects: Subject[];\r\n}\r\n","import { Injectable } from \"@angular/core\";\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class CopyToClipboardService {\r\n /**\r\n * Copy the given text to the OS clipboard\r\n */\r\n public copyToClipboard(text: string): void {\r\n const el = document.createElement('textarea');\r\n el.value = text;\r\n el.setAttribute('readonly', '');\r\n el.style.position = 'absolute';\r\n el.style.left = '-9999px';\r\n document.body.appendChild(el);\r\n el.select();\r\n document.execCommand('copy');\r\n document.body.removeChild(el);\r\n }\r\n}\r\n","import { Injectable } from \"@angular/core\";\r\nimport { AdminPortalStylingViewModel } from \"@modules/api/admin-portal-styling-view-model.generated\";\r\nimport { GetStylingService } from \"@modules/api/get-styling.service.generated\";\r\nimport { ConcurrentRequestHandlingEnum } from \"@modules/common/enums/concurrent-request-handling-enum\";\r\nimport { CurrentCaseService } from \"@modules/common/services/current-case.service\";\r\nimport { BehaviorSubject, Observable } from \"rxjs\";\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class CurrentAdminPortalConfigService {\r\n constructor(\r\n private _currentCaseService: CurrentCaseService,\r\n private _getStylingService: GetStylingService\r\n ) {\r\n this._currentCaseService.caseChanged.subscribe(x => this.onCasechanged(x));\r\n }\r\n\r\n private _configChangedSubject = new BehaviorSubject(undefined);\r\n private _currentCaseName = '';\r\n\r\n private onCasechanged(currentCaseName: string): void {\r\n if (this._currentCaseName != currentCaseName && (this._currentCaseName || currentCaseName)) {\r\n this._currentCaseName = currentCaseName;\r\n this.refresh();\r\n }\r\n }\r\n\r\n public refresh(): void {\r\n if (this._currentCaseName) {\r\n this._getStylingService.getStyling({\r\n concurrentRequestHandling: ConcurrentRequestHandlingEnum.LastOnly,\r\n useLoadingIndicator: false\r\n }).subscribe(result =>\r\n this._configChangedSubject.next(result)\r\n );\r\n } else {\r\n this._configChangedSubject.next(undefined);\r\n }\r\n }\r\n\r\n public get configChanged(): Observable {\r\n return this._configChangedSubject;\r\n }\r\n}\r\n","import { Injectable } from \"@angular/core\";\r\nimport { NavigationEnd, Router } from \"@angular/router\";\r\nimport { CaseEnvChangeRedirectService } from '@modules/common/services/case-env-change-redirect.service';\r\nimport { CurrentEnvironmentService } from '@modules/common/services/current-environment.service';\r\nimport { CurrentRouteService } from \"@modules/common/services/current-route.service\";\r\nimport { ReplaceRouteParameterService } from '@modules/common/services/replace-route-parameter.service';\r\nimport { BehaviorSubject, Observable } from \"rxjs\";\r\nimport { filter } from 'rxjs/operators';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class CurrentCaseService {\r\n constructor(\r\n private _router: Router,\r\n private _currentRouteService: CurrentRouteService,\r\n private _replaceRouteParameterService: ReplaceRouteParameterService,\r\n private _currentEnvironmentService: CurrentEnvironmentService,\r\n private _caseEnvChangeRedirectService: CaseEnvChangeRedirectService\r\n ) {\r\n this._router\r\n .events\r\n .pipe(filter(e => e instanceof NavigationEnd))\r\n .subscribe(() => this.onNavigation());\r\n }\r\n\r\n private _caseChangedSubject = new BehaviorSubject('');\r\n\r\n public getCurrentCaseName(): string {\r\n return this._currentRouteService.getCurrentRoute().params['clientName'] || '';\r\n }\r\n\r\n public setCurrentCase(newCaseName: string): void {\r\n this._router.navigate(this.getUpdatedUrl(newCaseName));\r\n }\r\n\r\n public get caseChanged(): Observable {\r\n return this._caseChangedSubject;\r\n }\r\n\r\n private onNavigation(): void {\r\n const newCaseName = this.getCurrentCaseName();\r\n if (newCaseName != this._caseChangedSubject.getValue()) {\r\n this._caseChangedSubject.next(newCaseName);\r\n }\r\n }\r\n\r\n private getUpdatedUrl(newCaseName: string): string[] {\r\n const currentRoute = this._currentRouteService.getCurrentRoute();\r\n const currentEnvironmentName = this._currentEnvironmentService.getCurrentEnvironmentName();\r\n\r\n if (currentRoute.data && currentRoute.data.caseEnvChangeRedirect) {\r\n return this._caseEnvChangeRedirectService.getCaseEnvChangeRedirectUrl(currentRoute.data.caseEnvChangeRedirect, newCaseName, currentEnvironmentName);\r\n }\r\n\r\n const result = this._replaceRouteParameterService.replaceRouteParameter({\r\n route: currentRoute,\r\n paramName: 'clientName',\r\n paramValue: newCaseName,\r\n leaveOutEmptyParameter: true\r\n });\r\n\r\n if (!this.getCurrentCaseName() && newCaseName) {\r\n result.splice(currentEnvironmentName ? 1 : 0, 0, newCaseName);\r\n }\r\n\r\n return result;\r\n }\r\n}\r\n","import { Injectable } from \"@angular/core\";\r\nimport { NavigationEnd, Router } from \"@angular/router\";\r\nimport { CaseEnvChangeRedirectService } from '@modules/common/services/case-env-change-redirect.service';\r\nimport { CurrentRouteService } from \"@modules/common/services/current-route.service\";\r\nimport { ReplaceRouteParameterService } from '@modules/common/services/replace-route-parameter.service';\r\nimport { BehaviorSubject, Observable } from \"rxjs\";\r\nimport { filter } from 'rxjs/operators';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class CurrentEnvironmentService {\r\n constructor(\r\n private _router: Router,\r\n private _currentRouteService: CurrentRouteService,\r\n private _replaceRouteParameterService: ReplaceRouteParameterService,\r\n private _caseEnvChangeRedirectService: CaseEnvChangeRedirectService\r\n ) {\r\n this._router\r\n .events\r\n .pipe(filter(e => e instanceof NavigationEnd))\r\n .subscribe(() => this.onNavigation());\r\n }\r\n\r\n private _environmentChangedSubject?: BehaviorSubject;\r\n\r\n private get environmentChangedSubject(): BehaviorSubject {\r\n //Lazily populate this subject here instead of in the constructor because the current route is not available\r\n //during app startup, when this service is first constructed\r\n if (!this._environmentChangedSubject) {\r\n this._environmentChangedSubject = new BehaviorSubject(this.getCurrentEnvironmentName());\r\n }\r\n\r\n return this._environmentChangedSubject;\r\n }\r\n\r\n public getCurrentEnvironmentName(): string {\r\n return this._currentRouteService.getCurrentRoute().params['environment'] || '';\r\n }\r\n\r\n public setCurrentEnvironment(newEnvironmentName: string | undefined | null): void {\r\n this._router.navigate(this.getUpdatedUrl(newEnvironmentName || ''));\r\n }\r\n\r\n public get environmentChanged(): Observable {\r\n return this.environmentChangedSubject;\r\n }\r\n\r\n private onNavigation(): void {\r\n const newEnvironmentName = this.getCurrentEnvironmentName();\r\n if (newEnvironmentName != this.environmentChangedSubject.getValue()) {\r\n this.environmentChangedSubject.next(newEnvironmentName);\r\n }\r\n }\r\n\r\n private getUpdatedUrl(newEnvironmentName: string): string[] {\r\n const currentRoute = this._currentRouteService.getCurrentRoute();\r\n\r\n if (currentRoute.data && currentRoute.data.caseEnvChangeRedirect) {\r\n return this._caseEnvChangeRedirectService.getCaseEnvChangeRedirectUrl(currentRoute.data.caseEnvChangeRedirect, currentRoute.params['clientName'] || '', newEnvironmentName);\r\n }\r\n\r\n const result = this._replaceRouteParameterService.replaceRouteParameter({\r\n route: this._currentRouteService.getCurrentRoute(),\r\n paramName: 'environment',\r\n paramValue: newEnvironmentName,\r\n leaveOutEmptyParameter: true\r\n });\r\n\r\n if (!this.getCurrentEnvironmentName() && newEnvironmentName) {\r\n result.splice(0, 0, newEnvironmentName);\r\n }\r\n\r\n return result;\r\n }\r\n}\r\n","import { Injectable } from \"@angular/core\";\r\nimport { Router } from \"@angular/router\";\r\nimport { ActivatedRouteModel } from '@modules/common/models/activated-route-model';\r\nimport { RouteModelService } from '@modules/common/services/route-model.service';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class CurrentRouteService {\r\n constructor(\r\n private _router: Router,\r\n private _routeModelService: RouteModelService\r\n ) { }\r\n\r\n public getCurrentRoute(): ActivatedRouteModel {\r\n return this._routeModelService.getRouteModel(this._router.routerState.snapshot.root);\r\n }\r\n}\r\n","import { Injectable } from \"@angular/core\";\r\nimport { EnvironmentModel } from '@modules/common/models/environment-model';\r\nimport { UserSessionService } from \"@modules/common/services/user-session.service\";\r\nimport { BehaviorSubject, Observable } from \"rxjs\";\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class EnvironmentListService {\r\n private _subject = new BehaviorSubject([]);\r\n\r\n constructor(\r\n userSessionService: UserSessionService\r\n ) {\r\n userSessionService.userSessionChanged().subscribe(result => {\r\n const environments = result && result.allowedEnvironments as EnvironmentModel[] || [];\r\n environments.sort((a, b) => (a.name || '').localeCompare(b.name || ''));\r\n environments.sort((a, b) => a.isDefault === b.isDefault ? 0 : a.isDefault ? -1 : 1);\r\n this._subject.next(environments);\r\n });\r\n }\r\n\r\n public get environmentListChanged(): Observable {\r\n return this._subject;\r\n }\r\n\r\n public getEnvironmentList(): EnvironmentModel[] {\r\n return this._subject.value;\r\n }\r\n}\r\n","import { Component, Inject } from '@angular/core';\r\nimport { MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog';\r\nimport { ErrorDetails } from '@modules/common/models/error-details';\r\nimport { SnackbarService } from '@modules/common/services/snackbar.service';\r\nimport { CopyToClipboardService } from '@modules/common/services/copy-to-clipboard.service';\r\nimport * as moment from 'moment';\r\n\r\n@Component({\r\n selector: 'app-error-dialog',\r\n templateUrl: './error-dialog.component.html',\r\n styleUrls: ['./error-dialog.component.scss']\r\n})\r\nexport class ErrorDialogComponent {\r\n public errorDetails: string;\r\n\r\n constructor(\r\n public _dialogRef: MatDialogRef,\r\n private _snackbarService: SnackbarService,\r\n private _copyToClipboardService: CopyToClipboardService,\r\n @Inject(MAT_DIALOG_DATA) error: ErrorDetails\r\n ) {\r\n this.errorDetails = this.getFullErrorString(error);\r\n }\r\n\r\n public close(): void {\r\n this._dialogRef.close();\r\n }\r\n\r\n public copyErrorDetails(): void {\r\n this._copyToClipboardService.copyToClipboard(this.errorDetails);\r\n this._snackbarService.open({\r\n message: 'ERROR DETAILS COPIED TO CLIPBOARD'\r\n });\r\n }\r\n\r\n private getFullErrorString(error?: ErrorDetails): string {\r\n if (!error || !error.errorMessage) {\r\n return '';\r\n }\r\n\r\n let result = 'ERROR MESSAGE: ' + error.errorMessage + '\\r\\n\\r\\n';\r\n\r\n\r\n if (error.ipAddress) {\r\n result += 'IP Address: ' + error.ipAddress + '\\r\\n';\r\n }\r\n\r\n if (error.referrer) {\r\n result += 'Page URL: ' + error.referrer + '\\r\\n';\r\n }\r\n\r\n if (error.url) {\r\n result += 'URL: ' + error.url + '\\r\\n';\r\n }\r\n\r\n if (error.username) {\r\n result += 'Username: ' + error.username + '\\r\\n';\r\n }\r\n\r\n if (error.logReferenceId) {\r\n result += 'Log ID: ' + error.logReferenceId + '\\r\\n';\r\n }\r\n\r\n result += 'Timestamp: ' + moment().format(\"dddd, MMMM Do YYYY, h:mm:ss a ZZ\") + '\\r\\n';\r\n\r\n if (error.stackTrace) {\r\n result += '\\r\\n\\r\\nSTACK TRACE:\\r\\n' + error.stackTrace;\r\n }\r\n\r\n\r\n return result;\r\n }\r\n}\r\n","\r\n
\r\n
\r\n
\r\n An Error Has Occurred\r\n
\r\n \r\n
\r\n
\r\n

\r\n Please copy the error details and report this issue to IT and try again later.\r\n

\r\n

\r\n \r\n

\r\n

{{errorDetails}}

\r\n
\r\n
\r\n
\r\n","import { Injectable } from \"@angular/core\";\r\nimport { MatDialog } from \"@angular/material/dialog\";\r\nimport { ErrorDialogComponent } from \"@modules/common/components/error-dialog/error-dialog.component\";\r\nimport { ErrorDetails } from \"@modules/common/models/error-details\";\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class ErrorService {\r\n constructor(private _dialog: MatDialog) { }\r\n\r\n public registerError(error: ErrorDetails): void {\r\n this._dialog.open(ErrorDialogComponent, {\r\n data: error\r\n });\r\n }\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { Observable } from 'rxjs';\r\nimport { ConcurrentRequestHandlingService } from '@modules/common/services/concurrent-request-handling.service';\r\nimport { ApiProxyOptions } from '@modules/common/models/api-proxy-options';\r\nimport { GetDynamicMenusResult } from './get-dynamic-menus-result.generated';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class GetDynamicMenusService {\r\n constructor(private _concurrentRequestHandlingService: ConcurrentRequestHandlingService) { }\r\n\r\n public getDynamicMenus(options?: ApiProxyOptions): Observable {\r\n return this._concurrentRequestHandlingService.callApi(\r\n \"GetDynamicMenusService_getDynamicMenus\",\r\n {\r\n url: '/DynamicMenus/GetDynamicMenus/GetDynamicMenus',\r\n body: {},\r\n sendCredentials: true\r\n }, options\r\n );\r\n }\r\n}\r\n","import { Injectable } from \"@angular/core\";\r\nimport { AdministrationMenuViewModel } from \"@modules/api/administration-menu-view-model.generated\";\r\nimport { DashboardViewModel } from \"@modules/api/dashboard-view-model.generated\";\r\nimport { GetDynamicMenusService } from \"@modules/api/get-dynamic-menus.service.generated\";\r\nimport { PowerBIReportTypeEnum } from \"@modules/api/power-bi-report-type-enum.generated\";\r\nimport { PowerBIViewModel } from \"@modules/api/power-bi-view-model.generated\";\r\nimport { ConcurrentRequestHandlingEnum } from \"@modules/common/enums/concurrent-request-handling-enum\";\r\nimport { CurrentCaseService } from \"@modules/common/services/current-case.service\";\r\nimport { CurrentEnvironmentService } from '@modules/common/services/current-environment.service';\r\nimport { PermissionService } from \"@modules/common/services/permission.service\";\r\nimport { filter, Observable, ReplaySubject } from \"rxjs\";\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class GetCurrentUserDynamicMenusService {\r\n\r\n private readonly _dashboardsSubject = new ReplaySubject(1);\r\n private readonly _powerBIReportsSubject = new ReplaySubject(1);\r\n private readonly _powerBIPaginatedReportsSubject = new ReplaySubject(1);\r\n private readonly _administrationMenusSubject = new ReplaySubject(1);\r\n private _pending = false;\r\n\r\n constructor(\r\n private readonly _currentCaseService: CurrentCaseService,\r\n private readonly _currentEnvironmentService: CurrentEnvironmentService,\r\n private readonly _getDynamicMenusService: GetDynamicMenusService,\r\n private readonly _permissionService: PermissionService\r\n ) {\r\n this._currentCaseService.caseChanged.subscribe(() => this.updateMenus());\r\n this._currentEnvironmentService.environmentChanged.subscribe(() => this.updateMenus());\r\n this._permissionService.permissionsChanged.subscribe(() => this.updateMenus());\r\n }\r\n\r\n private updateMenus(): void {\r\n if (this._permissionService.verifyPermission('SSO into WEX')\r\n || this._currentCaseService.getCurrentCaseName() \r\n && this._currentEnvironmentService.getCurrentEnvironmentName() \r\n && (this._permissionService.verifyPermission('View Dashboards') \r\n || this._permissionService.verifyPermission('View Power BI Reports'))) {\r\n\r\n this._pending = true;\r\n\r\n this._getDynamicMenusService.getDynamicMenus({\r\n concurrentRequestHandling: ConcurrentRequestHandlingEnum.LastOnly\r\n }).subscribe(result => {\r\n this._pending = false;\r\n this._dashboardsSubject.next(result && result.dashboards || []);\r\n this._powerBIReportsSubject.next(result && result.powerBIReports?.filter(x => x.powerBIReportType == PowerBIReportTypeEnum.Report) || []);\r\n this._powerBIPaginatedReportsSubject.next(result && result.powerBIReports?.filter(x => x.powerBIReportType == PowerBIReportTypeEnum.PaginatedReport) || []);\r\n this._administrationMenusSubject.next(result && result.administrationMenus || []);\r\n\r\n });\r\n } else {\r\n this._dashboardsSubject.next([]);\r\n this._powerBIReportsSubject.next([]);\r\n this._powerBIPaginatedReportsSubject.next([]);\r\n this._administrationMenusSubject.next([]);\r\n }\r\n }\r\n\r\n public getCurrentUserDashboards(): Observable {\r\n return this._dashboardsSubject.pipe(filter(x => !this._pending)); //Force new subscribers to wait for the new result if the service is pending, instead of getting the replay value\r\n }\r\n\r\n public getCurrentUserPowerBIReports(): Observable {\r\n return this._powerBIReportsSubject.pipe(filter(x => !this._pending)); //Force new subscribers to wait for the new result if the service is pending, instead of getting the replay value\r\n }\r\n\r\n public getCurrentUserPowerBIPaginatedReports(): Observable {\r\n return this._powerBIPaginatedReportsSubject.pipe(filter(x => !this._pending)); //Force new subscribers to wait for the new result if the service is pending, instead of getting the replay value\r\n }\r\n\r\n public getAdministrationMenus() : Observable {\r\n return this._administrationMenusSubject.pipe(filter(x => !this._pending)); //Force new subscribers to wait for the new result if the service is pending, instead of getting the replay value\r\n }\r\n}","import { Injectable } from \"@angular/core\";\r\nimport { CurrentCaseService } from \"@modules/common/services/current-case.service\";\r\nimport { CurrentEnvironmentService } from '@modules/common/services/current-environment.service';\r\nimport { BehaviorSubject, Observable } from \"rxjs\";\r\n\r\n/** \r\n * Service to get the url of the homepage\r\n */\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class HomeUrlService {\r\n constructor(\r\n\t\tprivate _currentCaseService: CurrentCaseService,\r\n\t\tprivate _currentEnvironmentService: CurrentEnvironmentService\r\n ) {\r\n\t\tthis._currentCaseService.caseChanged.subscribe(() => this.updateUrl());\r\n\t\tthis._currentEnvironmentService.environmentChanged.subscribe(() => this.updateUrl());\r\n }\r\n\r\n\tprivate _subject = new BehaviorSubject('');\r\n\r\n\tprivate updateUrl(): void {\r\n\t\tlet newUrl = '';\r\n\t\tif (this._currentEnvironmentService.getCurrentEnvironmentName())\r\n\t\t\tnewUrl += '/' + this._currentEnvironmentService.getCurrentEnvironmentName();\r\n\t\tif (this._currentCaseService.getCurrentCaseName())\r\n\t\t\tnewUrl += '/' + this._currentCaseService.getCurrentCaseName();\r\n\t\tnewUrl += '/Dashboards';\r\n\r\n\t\tif (newUrl !== this._subject.getValue()) {\r\n\t\t\tthis._subject.next(newUrl);\r\n\t\t}\r\n\t}\r\n\r\n public get urlChanged(): Observable {\r\n return this._subject;\r\n }\r\n\r\n public getHomeUrl(): string {\r\n return this._subject.getValue();\r\n }\r\n}\r\n","import { HttpErrorResponse } from \"@angular/common/http\";\r\nimport { Injectable } from \"@angular/core\";\r\nimport { ErrorService } from \"@modules/common/services/error.service\";\r\nimport { RedirectToLoginService } from \"@modules/common/services/redirect-to-login.service\";\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class HttpErrorService {\r\n constructor(\r\n private _redirectToLoginService: RedirectToLoginService,\r\n private _errorService: ErrorService\r\n ) { }\r\n\r\n public handleHttpError(error: HttpErrorResponse) : void {\r\n if (error.error instanceof Error) {\r\n this._errorService.registerError({\r\n errorMessage: error.error.toString()\r\n });\r\n } else {\r\n if (Math.floor(error.status) == 401) {\r\n this._redirectToLoginService.redirectToLogin();\r\n } else {\r\n //Here the error.error property should be the response body,\r\n //which is a serialized ApiCallError, which matches the\r\n //ErrorDetails interface.\r\n if (error.error && error.error.hasOwnProperty('errorMessage')) {\r\n this._errorService.registerError(error.error);\r\n } else {\r\n this._errorService.registerError({\r\n errorMessage: error.message\r\n })\r\n }\r\n }\r\n }\r\n }\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { Observable, Subject } from 'rxjs';\r\n\r\n/**\r\n * Service that indicates whether or not the app is currently changing pages.\r\n */\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class IsLoadingService {\r\n private _counter: number = 0;\r\n private _subject = new Subject();\r\n public get observable(): Observable {\r\n return this._subject;\r\n }\r\n\r\n public setLoading(): void {\r\n this._counter++;\r\n if (this._counter === 1) {\r\n this._subject.next(true);\r\n }\r\n }\r\n\r\n public clearLoading(): void {\r\n setTimeout(() => {\r\n this._counter = Math.max(0, this._counter - 1);\r\n if (this._counter === 0) {\r\n this._subject.next(false);\r\n }\r\n });\r\n }\r\n}\r\n","import { Injectable } from \"@angular/core\";\r\nimport { UserSessionService } from \"@modules/common/services/user-session.service\";\r\nimport { Observable, ReplaySubject } from \"rxjs\";\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class PermissionService {\r\n private _permissions: { [key: string]: undefined } = {};\r\n\r\n constructor(\r\n userSessionService: UserSessionService\r\n ) {\r\n userSessionService.userSessionChanged()\r\n .subscribe(result => {\r\n this._permissions = {};\r\n if (result && result.permissions) {\r\n for (let permission of result.permissions) {\r\n this._permissions[permission.name!] = undefined;\r\n }\r\n }\r\n this._permissionsChangedSubject.next({});\r\n })\r\n }\r\n\r\n public verifyPermission(permissionName: string): boolean {\r\n return this._permissions.hasOwnProperty(permissionName);\r\n }\r\n\r\n public get permissionsChanged(): Observable {\r\n return this._permissionsChangedSubject;\r\n }\r\n\r\n private _permissionsChangedSubject = new ReplaySubject(1);\r\n}\r\n","import { Injectable } from \"@angular/core\";\r\nimport { ActivatedRouteSnapshot, Router } from \"@angular/router\";\r\nimport { ActivatedRouteModel } from \"@modules/common/models/activated-route-model\";\r\nimport { CurrentCaseService } from \"@modules/common/services/current-case.service\";\r\nimport { RouteModelService } from '@modules/common/services/route-model.service';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class RedirectToLoginService {\r\n constructor(\r\n private _router: Router,\r\n private _currentCaseService: CurrentCaseService,\r\n private _routeModelService: RouteModelService\r\n ) { }\r\n\r\n private _redirectedFromUrl: any[] | undefined;\r\n private _queryParams: { [key: string]: string } | undefined;\r\n\r\n public redirectToLogin(redirectedFromRoute?: ActivatedRouteSnapshot): void {\r\n this._redirectedFromUrl = undefined;\r\n\r\n const routeModel = this.getRouteModel(redirectedFromRoute);\r\n const fromUrl = routeModel?.urlWithPopulatedParameters;\r\n\r\n //We only want to do the redirect if the page we're coming from isn't a login page, unless\r\n //that page is the AccountSettings page\r\n if (fromUrl && (fromUrl.indexOf('Login') === -1 || fromUrl.indexOf('AccountSettings') !== -1)) {\r\n this._redirectedFromUrl = fromUrl.slice();\r\n //Add an extra element to the URL containing Angular's custom query params (the ; separated parts)\r\n for (let k in routeModel.params) {\r\n if (routeModel.urlWithParameterPlaceholders.indexOf(':' + k) == -1) {\r\n if (this._redirectedFromUrl.length == routeModel.urlWithParameterPlaceholders.length) {\r\n this._redirectedFromUrl.push({});\r\n }\r\n\r\n this._redirectedFromUrl[this._redirectedFromUrl.length - 1][k] = routeModel.params[k];\r\n }\r\n }\r\n this._queryParams = routeModel?.queryParams;\r\n }\r\n\r\n //We only want to use the case branding for the login page\r\n //if the user isn't in the main Stingray site. If the user\r\n //is in Stingray, then we have to use Winston branding.\r\n if (fromUrl && fromUrl.indexOf('Login') !== -1) {\r\n const caseName = this._currentCaseService.getCurrentCaseName();\r\n\r\n if (caseName) {\r\n this._router.navigate(['/' + caseName + '/Login']);\r\n return;\r\n }\r\n }\r\n\r\n this._router.navigate(['/Login']);\r\n }\r\n\r\n public getRedirectedFromUrl(): any[] | undefined {\r\n return this._redirectedFromUrl;\r\n }\r\n\r\n public getQueryParams(): { [key: string]: string } | undefined {\r\n return this._queryParams;\r\n }\r\n\r\n public clearRedirectedFromUrl(): void {\r\n this._redirectedFromUrl = undefined;\r\n this._queryParams = undefined;\r\n }\r\n\r\n private getRouteModel(redirectedFromRoute?: ActivatedRouteSnapshot): ActivatedRouteModel | undefined {\r\n return this._routeModelService.getRouteModel(redirectedFromRoute || this._router.routerState.snapshot.root);\r\n }\r\n}\r\n\r\n\r\n","import { HttpClient, HttpHeaders } from \"@angular/common/http\";\r\nimport { Injectable } from \"@angular/core\";\r\nimport { RefreshTokenModel } from \"@modules/api/refresh-token-model.generated\";\r\nimport { UserSession } from \"@modules/api/user-session.generated\";\r\nimport { ApiCallUrlService } from \"@modules/common/services/api-call-url.service\";\r\nimport { Observable } from \"rxjs\";\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class RefreshSessionService {\r\n constructor(\r\n private _httpClient: HttpClient,\r\n private _apiCallUrlService: ApiCallUrlService\r\n ) { }\r\n\r\n public refreshSession(args: { authenticationToken: string, refreshToken: RefreshTokenModel }): Observable {\r\n return this._httpClient.post(\r\n this._apiCallUrlService.getUrl('/Login/RefreshSession/RefreshSession', false),\r\n args.refreshToken,\r\n { headers: this.getHeaders(args.authenticationToken) }\r\n );\r\n }\r\n\r\n private getHeaders(authenticationToken: string): HttpHeaders {\r\n const headers: any = {};\r\n headers['Content-Type'] = 'Application/json';\r\n headers['Authorization'] = 'Bearer ' + authenticationToken;\r\n return new HttpHeaders(headers);\r\n }\r\n}\r\n","import { Injectable } from \"@angular/core\";\r\nimport { ActivatedRouteModel } from '@modules/common/models/activated-route-model';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class ReplaceRouteParameterService {\r\n public replaceRouteParameter(args: { route: ActivatedRouteModel, paramName: string, paramValue: string, leaveOutEmptyParameter?: boolean }): string[] {\r\n const result: string[] = [];\r\n for (let i = 0; i < args.route.urlWithParameterPlaceholders.length; i++) {\r\n if (args.route.urlWithParameterPlaceholders[i].startsWith(':')) {\r\n if (args.paramName == args.route.urlWithParameterPlaceholders[i].substring(1)) {\r\n if (args.paramValue || !args.leaveOutEmptyParameter) {\r\n result.push(args.paramValue);\r\n }\r\n } else {\r\n result.push(args.route.params[args.route.urlWithParameterPlaceholders[i].substring(1)]);\r\n }\r\n } else {\r\n result.push(args.route.urlWithParameterPlaceholders[i]);\r\n }\r\n }\r\n\r\n return result;\r\n }\r\n}\r\n","import { Injectable } from \"@angular/core\";\r\nimport { ActivatedRouteSnapshot } from \"@angular/router\";\r\nimport { ActivatedRouteModel } from '@modules/common/models/activated-route-model';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class RouteModelService {\r\n /**\r\n * Transform an Angular ActivatedRouteSnapshot\r\n * into the custom ActivatedRouteModel\r\n */\r\n public getRouteModel(activatedRouteSnapshot: ActivatedRouteSnapshot): ActivatedRouteModel {\r\n let route: ActivatedRouteSnapshot | null = activatedRouteSnapshot;\r\n\r\n const result = {\r\n params: {},\r\n queryParams: {},\r\n urlWithParameterPlaceholders: [],\r\n urlWithPopulatedParameters: [],\r\n };\r\n\r\n if (route && route!.queryParams!) {\r\n for (let k in route!.queryParams!) {\r\n result.queryParams[k] = route!.queryParams[k];\r\n }\r\n }\r\n\r\n while (route && route.parent) {\r\n route = route.parent;\r\n }\r\n\r\n while (route) {\r\n var split = route.routeConfig\r\n && route.routeConfig.path\r\n && route.routeConfig.path.split('/');\r\n\r\n if (split && split.length && route.url && route.url.length == split.length) {\r\n for (let i = 0; i < split.length; i++) {\r\n result.urlWithParameterPlaceholders.push(split[i]);\r\n result.urlWithPopulatedParameters.push(route.url[i].path);\r\n }\r\n }\r\n\r\n if (route.params) {\r\n for (let k in route.params) {\r\n result.params[k] = route.params[k];\r\n }\r\n }\r\n\r\n if (route.data) {\r\n result.data = Object.assign(result.data || {}, route.data);\r\n }\r\n\r\n route = route.firstChild;\r\n }\r\n\r\n return result;\r\n }\r\n}\r\n","import { Injectable } from \"@angular/core\";\r\nimport { MatSnackBar, MatSnackBarRef, TextOnlySnackBar } from \"@angular/material/snack-bar\";\r\nimport { ShowSnackbarArgs } from \"@modules/common/models/show-snackbar-args\";\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class SnackbarService {\r\n constructor(private _matSnackBar: MatSnackBar) { }\r\n\r\n public open(args: ShowSnackbarArgs): MatSnackBarRef {\r\n return this._matSnackBar.open(args.message, args.action || 'GOT IT', {\r\n duration: args.duration || 60000\r\n });\r\n }\r\n}\r\n","import { Injectable } from \"@angular/core\";\r\nimport { CrossTabCommunicationHandler } from \"@modules/common/models/cross-tab-communication-handler\";\r\n\r\ndeclare global {\r\n interface Window {\r\n attachEvent: (eventName: string, callback: (e: StorageEvent) => void) => void;\r\n }\r\n}\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class CrossTabCommunicationService {\r\n constructor() {\r\n if (window.addEventListener) {\r\n window.addEventListener('storage', e => this.onStorage(e));\r\n } else if (window.attachEvent) {\r\n window.attachEvent('onStorage', e => this.onStorage(e));\r\n }\r\n }\r\n\r\n public register(handler: CrossTabCommunicationHandler): void {\r\n this._handlers[handler.key] = this._handlers[handler.key] || [];\r\n this._handlers[handler.key].push(handler);\r\n }\r\n\r\n public sendMessage(msg: { key: string, msg: any }): void {\r\n let json = JSON.stringify(msg.msg);\r\n localStorage.setItem(msg.key, json);\r\n localStorage.removeItem(msg.key);\r\n }\r\n\r\n private onStorage(e: StorageEvent): void {\r\n e = e || window.event as StorageEvent;\r\n if (e && e.key) {\r\n let handlers = this._handlers[e.key];\r\n if (handlers) {\r\n for (let handler of handlers) {\r\n handler.handler(e);\r\n }\r\n }\r\n }\r\n }\r\n\r\n private _handlers: { [key: string]: CrossTabCommunicationHandler[] } = {};\r\n}\r\n","import { Injectable } from \"@angular/core\";\r\n\r\nconst key = 'tabcount';\r\n\r\n/**\r\n * Service to keep track of how many browser tabs the\r\n * user has open.\r\n */\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class TabRegistrationService {\r\n /**\r\n * Initialize the tab registration service.\r\n */\r\n public initialize(): void {\r\n if (!this._initialized) {\r\n this.register();\r\n window.addEventListener('unload', () => this.unregister());\r\n this._initialized = true;\r\n }\r\n }\r\n\r\n private _initialized = false;\r\n\r\n /**\r\n * Record the fact that the user has opened the current tab.\r\n */\r\n private register(): void {\r\n localStorage.setItem(key, (this.getInstanceCount() + 1).toString());\r\n }\r\n\r\n /**\r\n * Record the fact that the user is closing this tab.\r\n */\r\n private unregister(): void {\r\n localStorage.setItem(key, (Math.max(this.getInstanceCount() - 1, 0)).toString());\r\n }\r\n\r\n /**\r\n * Get the number of browser tabs the user has open, including\r\n * the current tab. If this is the only tab, this function\r\n * returns 1. If this function returns 0, then you probably\r\n * forgot to call initialize(), or localStorage is disabled.\r\n */\r\n public getInstanceCount(): number {\r\n let serializedCount = localStorage.getItem(key);\r\n return serializedCount ? parseInt(serializedCount) : 0;\r\n }\r\n}\r\n","import { Injectable } from \"@angular/core\";\r\nimport { UserSession } from \"@modules/api/user-session.generated\";\r\nimport { CrossTabCommunicationService } from \"@modules/common/services/cross-tab-communication.service\";\r\nimport { TabRegistrationService } from \"@modules/common/services/tab-registration.service\";\r\nimport { Observable, of as observableOf, ReplaySubject } from 'rxjs';\r\n\r\n/**\r\n * Service to maintain the client-side copy of \r\n * the user's session information.\r\n */\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class UserSessionService {\r\n constructor(\r\n private _crossTabCommunicationService: CrossTabCommunicationService,\r\n private _tabRegistrationService: TabRegistrationService\r\n ) { }\r\n\r\n /**\r\n * Initialize the user session service. Called during app start.\r\n * This function loads the user session stored in sessionStorage\r\n * and initializes all of the mechanisms used to synchronize\r\n * sessions across browser tabs.\r\n */\r\n public initialize(): Promise {\r\n this._tabRegistrationService.initialize();\r\n this.wireupCrossTabCommunications();\r\n this.loadSavedUserSession();\r\n //If we couldn't load a user session from session storage\r\n //and there's more than one tab open, then let's wait a\r\n //little while to see if the other tab will send us the\r\n //session info, which was requested in loadSavedUserSession().\r\n if (!this._userSession\r\n && this._tabRegistrationService.getInstanceCount() > 1\r\n && localStorage.getItem('is-user-logged-in')) { \r\n return new Promise(resolve => {\r\n this._initializationPromiseResolver = resolve;\r\n\r\n //Give the other tabs 10 seconds to send us the session info\r\n //and if we don't have it by then then just give up.\r\n\r\n if (!this._initializationTimeout) {\r\n this._initializationTimeout = setTimeout(() => {\r\n if (this._initializationPromiseResolver) {\r\n this._initializationPromiseResolver(undefined);\r\n }\r\n\r\n this._initializationTimeout = undefined;\r\n this._userSessionSubject.next(this._userSession);\r\n\r\n }, 10000); // 10 seconds\r\n }\r\n }); \r\n } else {\r\n this._userSessionSubject.next(this._userSession);\r\n }\r\n\r\n return new Promise(resolve => resolve(undefined));\r\n }\r\n\r\n private _initializationPromiseResolver?: (value: any) => void;\r\n private _initializationTimeout: any;\r\n private _userSession?: UserSession;\r\n\r\n /**\r\n * Load the user session saved in session storage\r\n * and if it doesn't exist then send a cross tab\r\n * request to get the info from another tab.\r\n */\r\n private loadSavedUserSession(): void {\r\n\r\n const json = sessionStorage.getItem('userSession');\r\n this._userSession = json && this.jsonParse(json);\r\n\r\n if (!this._userSession) {\r\n this._crossTabCommunicationService.sendMessage({\r\n key: 'GET_SESSION',\r\n msg: {}\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * Register event handlers for cross tab commmunications.\r\n */\r\n private wireupCrossTabCommunications(): void {\r\n this._crossTabCommunicationService.register({\r\n key: 'GET_SESSION',\r\n handler: () => this._crossTabCommunicationService.sendMessage({\r\n key: 'SET_SESSION',\r\n msg: this.getUserSession()\r\n })\r\n });\r\n\r\n this._crossTabCommunicationService.register({\r\n key: 'SET_SESSION',\r\n handler: e => e.newValue && this.internalSetUserSession(this.jsonParse(e.newValue), false)\r\n });\r\n }\r\n\r\n /**\r\n * Retrieve the current UserSession instance, if\r\n * there is one. Returns undefined if no session\r\n * info exists. Not that this function still\r\n * returns the session even if it's expired.\r\n */\r\n public getUserSession(): UserSession | undefined {\r\n return this._userSession;\r\n }\r\n\r\n /**\r\n * A subscribable version of getUserSession()\r\n */\r\n public userSessionChanged(): Observable {\r\n return this._userSessionSubject;\r\n }\r\n\r\n /**\r\n * Updates the global UserSession object.\r\n * @param userSession The new UserSession object.\r\n */\r\n public setUserSession(userSession: UserSession): void {\r\n this.internalSetUserSession(userSession, true);\r\n }\r\n\r\n /**\r\n * Signs out the current user and destroys their session.\r\n */\r\n public signOut(): Observable {\r\n this.internalSetUserSession(undefined, true);\r\n return observableOf([]);\r\n }\r\n\r\n private internalSetUserSession(userSession?: UserSession, broadcast?: boolean) {\r\n this._userSession = userSession;\r\n if (userSession) {\r\n localStorage.setItem('is-user-logged-in', 'true');\r\n sessionStorage.setItem('userSession', JSON.stringify(userSession));\r\n } else {\r\n localStorage.removeItem('is-user-logged-in');\r\n sessionStorage.removeItem('userSession');\r\n }\r\n if (broadcast) {\r\n this._crossTabCommunicationService.sendMessage({\r\n key: 'SET_SESSION',\r\n msg: this._userSession\r\n });\r\n }\r\n\r\n //If this function is being called during initialize()\r\n //then we also need to resolve the initializer promise.\r\n if (this._initializationPromiseResolver) {\r\n this._initializationPromiseResolver(undefined);\r\n this._initializationPromiseResolver = undefined;\r\n }\r\n //and cancel the initialize() timeout.\r\n if (this._initializationTimeout) {\r\n clearTimeout(this._initializationTimeout);\r\n this._initializationTimeout = undefined;\r\n }\r\n\r\n this._userSessionSubject.next(userSession);\r\n }\r\n\r\n private jsonParse(json: string): any {\r\n try {\r\n return JSON.parse(json);\r\n } catch (ex) { }\r\n }\r\n\r\n private _userSessionSubject = new ReplaySubject(1);\r\n}\r\n","
\r\n
\r\n \r\n {{isVerified ? 'Participant Authenticated' : 'Participant NOT Authenticated'}}\r\n \r\n \r\n \r\n \r\n
\r\n \r\n
\r\n \r\n {{participantName | async}}\r\n \r\n \r\n has successfully been pre authenticated.\r\n \r\n
\r\n
\r\n
\r\n
\r\n \r\n {{participantName | async}}\r\n \r\n \r\n has NOT been authenticated.\r\n \r\n
\r\n
\r\n Identity verification is required before providing assistance.\r\n
\r\n
\r\n
\r\n
\r\n Employee Authentication Information\r\n
\r\n
\r\n Date of Birth - {{(dateOfBirth | async) | date:'MM/dd/yyyy'}}\r\n
\r\n
\r\n Last 4 SSN - {{ssnLastFour | async}}\r\n
\r\n
\r\n Address - {{address | async}}\r\n
\r\n
\r\n
\r\n
\r\n \r\n \r\n \r\n
","import { Component } from \"@angular/core\";\r\nimport { CurrentPhoneCallService } from \"@modules/participant-shared/services/current-phone-call.service\";\r\nimport { map, Observable } from \"rxjs\";\r\n\r\n/**\r\n * Dialog component to show the user whether the current participant is verified during a phone call.\r\n */\r\n@Component({\r\n selector: 'app-participant-phone-call-is-verified-dialog',\r\n templateUrl: './participant-phone-call-is-verified-dialog.component.html',\r\n styleUrls: ['./participant-phone-call-is-verified-dialog.component.scss'],\r\n})\r\nexport class ParticipantPhoneCallIsVerifiedDialogComponent {\r\n public readonly isVerified: boolean;\r\n public readonly participantName: Observable;\r\n public readonly dateOfBirth: Observable;\r\n public readonly ssnLastFour: Observable;\r\n public readonly address: Observable;\r\n\r\n constructor(\r\n currentPhoneCallService: CurrentPhoneCallService,\r\n ) {\r\n this.isVerified = currentPhoneCallService.isParticipantVerified();\r\n\r\n this.participantName = currentPhoneCallService.currentPhoneCallChanged()\r\n .pipe(map(phoneCall => phoneCall?.participantName));\r\n this.dateOfBirth = currentPhoneCallService.currentPhoneCallChanged()\r\n .pipe(map(phoneCall => phoneCall?.dateOfBirth));\r\n this.ssnLastFour = currentPhoneCallService.currentPhoneCallChanged()\r\n .pipe(map(phoneCall => phoneCall?.ssnLastFour));\r\n this.address = currentPhoneCallService.currentPhoneCallChanged()\r\n .pipe(map(phoneCall => phoneCall?.address));\r\n }\r\n}","import { Injectable } from '@angular/core';\r\nimport { Observable } from 'rxjs';\r\nimport { ConcurrentRequestHandlingService } from '@modules/common/services/concurrent-request-handling.service';\r\nimport { ApiProxyOptions } from '@modules/common/models/api-proxy-options';\r\nimport { UpdatePhoneCallArgs } from './update-phone-call-args.generated';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class UpdatePhoneCallService {\r\n constructor(private _concurrentRequestHandlingService: ConcurrentRequestHandlingService) { }\r\n\r\n public updatePhoneCall(args: UpdatePhoneCallArgs, options?: ApiProxyOptions): Observable {\r\n return this._concurrentRequestHandlingService.callApi(\r\n \"UpdatePhoneCallService_updatePhoneCall\",\r\n {\r\n url: '/Participant/UpdatePhoneCall/UpdatePhoneCall',\r\n body: typeof args === 'undefined' || args === null ? {} : args,\r\n sendCredentials: true\r\n }, options\r\n );\r\n }\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { Observable } from 'rxjs';\r\nimport { ConcurrentRequestHandlingService } from '@modules/common/services/concurrent-request-handling.service';\r\nimport { ApiProxyOptions } from '@modules/common/models/api-proxy-options';\r\nimport { GetPhoneCallParticipantInfoArgs } from './get-phone-call-participant-info-args.generated';\r\nimport { GetPhoneCallParticipantInfoResult } from './get-phone-call-participant-info-result.generated';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class GetPhoneCallParticipantInfoService {\r\n constructor(private _concurrentRequestHandlingService: ConcurrentRequestHandlingService) { }\r\n\r\n public getPhoneCallParticipantInfo(args: GetPhoneCallParticipantInfoArgs, options?: ApiProxyOptions): Observable {\r\n return this._concurrentRequestHandlingService.callApi(\r\n \"GetPhoneCallParticipantInfoService_getPhoneCallParticipantInfo\",\r\n {\r\n url: '/Participant/GetPhoneCallParticipantInfo/GetPhoneCallParticipantInfo',\r\n body: typeof args === 'undefined' || args === null ? {} : args,\r\n sendCredentials: true\r\n }, options\r\n );\r\n }\r\n}\r\n","import { Injectable } from \"@angular/core\";\r\nimport { CurrentRouteService } from \"@modules/common/services/current-route.service\";\r\n\r\n/**\r\n * Service to get the participant id from the current route, if there is one.\r\n */\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class GetParticipantIdFromRouteService {\r\n constructor(private readonly _currentRouteService: CurrentRouteService) { }\r\n\r\n /**\r\n * Returns the participant id from the current route, or undefined if the current route\r\n * does not have a participant id.\r\n */\r\n public getParticipantIdFromRoute(): number | undefined {\r\n const participantIdString = this._currentRouteService.getCurrentRoute().params.participantId;\r\n if (!participantIdString) {\r\n return undefined;\r\n }\r\n return parseInt(participantIdString);\r\n }\r\n}","import { Injectable } from \"@angular/core\";\r\nimport { NavigationEnd, Router } from \"@angular/router\";\r\nimport { GetParticipantIdFromRouteService } from \"@modules/participant-shared/services/get-participant-id-from-route.service\";\r\nimport { filter, map, Observable, Subject, tap } from \"rxjs\";\r\n\r\n/**\r\n * Service to track the most recent participant id based on the route.\r\n */\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class MostRecentParticipantIdService {\r\n /**\r\n * Subject to emit participant id changes.\r\n */\r\n private readonly _participantIdChangedSubject: Subject = new Subject();\r\n \r\n /**\r\n * The most recent participant id based on the route, or undefined if the route\r\n * has never had a participant id in it. Only changes if the new route has a\r\n * participant id in it.\r\n */\r\n private _mostRecentParticipantId: number | undefined;\r\n \r\n constructor(\r\n private readonly _getParticipantIdFromRouteService: GetParticipantIdFromRouteService,\r\n router: Router,\r\n ) {\r\n this._mostRecentParticipantId = this._getParticipantIdFromRouteService.getParticipantIdFromRoute();\r\n\r\n //Subscribe to route changes that have a participant id, and emit the participant id\r\n //whenever it is different from the most recent participant id.\r\n router\r\n .events\r\n .pipe(\r\n filter(event => event instanceof NavigationEnd),\r\n map(() => this._getParticipantIdFromRouteService.getParticipantIdFromRoute()),\r\n filter(currentParticipantId => !!currentParticipantId && currentParticipantId != this._mostRecentParticipantId),\r\n map(currentParticipantId => currentParticipantId!),\r\n tap(currentParticipantId => this._mostRecentParticipantId = currentParticipantId)\r\n )\r\n .subscribe(this._participantIdChangedSubject);\r\n }\r\n\r\n /**\r\n * Returns the most recent participant id based on the route, or undefined if the\r\n * route has never had a participant id in it. Only changes if the new route has\r\n * a participant id in it.\r\n */\r\n public getMostRecentParticipantId(): number | undefined {\r\n return this._mostRecentParticipantId;\r\n }\r\n\r\n /**\r\n * Returns an observable that emits the most recent participant id based on the route\r\n * whenever it changes. Only emits if the new route has a participant id in it.\r\n */\r\n public participantIdChanged(): Observable {\r\n return this._participantIdChangedSubject.asObservable();\r\n }\r\n}","import { Injectable } from \"@angular/core\";\r\nimport { MatDialog } from \"@angular/material/dialog\";\r\nimport { GetPhoneCallParticipantInfoService } from \"@modules/api/get-phone-call-participant-info.service.generated\";\r\nimport { UpdatePhoneCallService } from \"@modules/api/update-phone-call.service.generated\";\r\nimport { UserSession } from \"@modules/api/user-session.generated\";\r\nimport { CurrentEnvironmentService } from \"@modules/common/services/current-environment.service\";\r\nimport { UserSessionService } from \"@modules/common/services/user-session.service\";\r\nimport { ParticipantPhoneCallIsVerifiedDialogComponent } from \"@modules/participant-shared/components/participant-phone-call-is-verified-dialog/participant-phone-call-is-verified-dialog.component\";\r\nimport { PhoneCallParticipantInfo } from \"@modules/participant-shared/models/phone-call-participant-info\";\r\nimport { SetCurrentPhoneCallArgs } from \"@modules/participant-shared/models/set-current-phone-call-args\";\r\nimport { MostRecentParticipantIdService } from \"@modules/participant-shared/services/most-recent-participant-id.service\";\r\nimport { BehaviorSubject, Observable, skip, Subscription } from \"rxjs\";\r\n\r\n/**\r\n * Service to keep track of information related to the current phone call.\r\n * The user can be considered to be in a phone call if they arrive at Stingray from Five9.\r\n * Information is stored in sessionStorage to keep it scoped to one browser tab and\r\n * persist across page refreshes.\r\n */\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class CurrentPhoneCallService {\r\n /**\r\n * Key for sessionStorage data.\r\n */\r\n private readonly _sessionStorageKey: string = 'CurrentPhoneCallService';\r\n\r\n /**\r\n * Subject that emits the phone call info.\r\n */\r\n private readonly _phoneCallParticipantInfoSubject = new BehaviorSubject(undefined);\r\n\r\n private _subscriptions: Subscription[] = [];\r\n\r\n constructor(\r\n private readonly _updatePhoneCallService: UpdatePhoneCallService,\r\n private readonly _getPhoneCallParticipantInfoService: GetPhoneCallParticipantInfoService,\r\n private readonly _mostRecentParticipantIdService: MostRecentParticipantIdService,\r\n private readonly _dialog: MatDialog,\r\n private readonly _userSessionService: UserSessionService,\r\n private readonly _currentEnvironmentService: CurrentEnvironmentService,\r\n ) {\r\n //Handle initialization that only needs to happen when the page is refreshed during a phone call.\r\n //This would otherwise be handled in setCurrentPhoneCall.\r\n if (this.isCurrentlyInPhoneCall()) {\r\n //Create subscriptions to handle changes as needed.\r\n this._subscriptions = this.createSubscriptions();\r\n\r\n //If there is phone call info in session storage, initialize the subject with it.\r\n if (this.phoneCallParticipantInfo) {\r\n this.emitParticipantInfo(this.phoneCallParticipantInfo);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Returns whether the user is currently in a phone call.\r\n */\r\n public isCurrentlyInPhoneCall(): boolean {\r\n return !!this.callHistoryId;\r\n }\r\n\r\n /**\r\n * Returns an observable that emits information for the current phone call, or undefined if\r\n * there is no current phone call. Emits once upon subscription and once every time the\r\n * current phone call information changes. The current phone call information changes when\r\n * the phone call starts, when the user navigates to a page for a different participant\r\n * while on a phone call, and when the phone call ends (in this context, \"ends\" just means\r\n * that Stingray is no longer able to track the phone call, not necessarily that either\r\n * party has hung up the actual phone call).\r\n */\r\n public currentPhoneCallChanged(): Observable {\r\n return this._phoneCallParticipantInfoSubject.asObservable();\r\n }\r\n\r\n /**\r\n * Sets the current phone call using the given information. This method should only be called once,\r\n * when the site first becomes aware that the user is in a phone call.\r\n */\r\n public setCurrentPhoneCall(args: SetCurrentPhoneCallArgs): void {\r\n if (this.isCurrentlyInPhoneCall()) {\r\n return; //This shouldn't happen, but let's prevent it anyway\r\n }\r\n\r\n this.callHistoryId = args.callHistoryId;\r\n this.participantId = args.participantId;\r\n if (args.piiMatches) {\r\n this.verifiedParticipantId = args.participantId;\r\n }\r\n\r\n //Create subscriptions to handle changes as needed.\r\n this._subscriptions = this.createSubscriptions();\r\n \r\n //Initialize the participant info if possible. Otherwise, just emit empty participant info.\r\n if (this.participantId) {\r\n this.updateParticipantInfoAndShowVerificationDialog(this.participantId);\r\n } else {\r\n this.setAndEmitParticipantInfo({\r\n participantName: undefined,\r\n employeeId: undefined,\r\n dateOfBirth: undefined,\r\n ssnLastFour: undefined,\r\n address: undefined,\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * Returns true if the current phone call participant is verified, false if they are\r\n * not verified or if there is no current phone call participant.\r\n * A verified participant is one that correctly provided their PII when calling in.\r\n */\r\n public isParticipantVerified(): boolean {\r\n return !!this.participantId && !!this.verifiedParticipantId && this.participantId == this.verifiedParticipantId;\r\n }\r\n\r\n private createSubscriptions(): Subscription[] {\r\n return [\r\n this.createParticipantIdChangedSubscription(),\r\n this.createUserSessionChangedSubscription(),\r\n this.createEnvironmentChangedSubscription(),\r\n ];\r\n }\r\n\r\n private createParticipantIdChangedSubscription(): Subscription {\r\n return this._mostRecentParticipantIdService.participantIdChanged()\r\n .subscribe(participantId => this.handleParticipantIdChanged(participantId));\r\n }\r\n\r\n private handleParticipantIdChanged(participantId: number): void {\r\n //Check that the new participant is actually different from the phone call participant id.\r\n //Note that storing the phone call participant id separately is only necessary because\r\n //this service may become aware of the participant id BEFORE it gets put in the URL, and\r\n //we don't want to update the phone call info twice on the first navigation.\r\n if (this.participantId == participantId) {\r\n return;\r\n }\r\n\r\n //The participant id is being changed. Associate this phone call with the new participant,\r\n //emit the new participant info, and show the verification dialog.\r\n\r\n this.participantId = participantId;\r\n\r\n this._updatePhoneCallService.updatePhoneCall({\r\n callHistoryId: this.callHistoryId!,\r\n participantId: this.participantId,\r\n });\r\n\r\n this.updateParticipantInfoAndShowVerificationDialog(this.participantId);\r\n }\r\n\r\n private updateParticipantInfoAndShowVerificationDialog(participantId: number): void {\r\n //Fetch the participant info from the database.\r\n this._getPhoneCallParticipantInfoService.getPhoneCallParticipantInfo({\r\n participantId: participantId,\r\n }).subscribe(result => {\r\n //Emit the new participant info.\r\n this.setAndEmitParticipantInfo({\r\n participantName: result.participantName,\r\n employeeId: result.employeeId,\r\n dateOfBirth: result.dateOfBirth,\r\n ssnLastFour: result.ssnLastFour,\r\n address: result.address,\r\n });\r\n\r\n //Show the dialog that shows the user whether the new participant is verified.\r\n this._dialog.open(ParticipantPhoneCallIsVerifiedDialogComponent);\r\n });\r\n }\r\n\r\n private setAndEmitParticipantInfo(phoneCallParticipantInfo: PhoneCallParticipantInfo | undefined): void {\r\n this.phoneCallParticipantInfo = phoneCallParticipantInfo;\r\n this.emitParticipantInfo(phoneCallParticipantInfo);\r\n }\r\n\r\n private emitParticipantInfo(phoneCallParticipantInfo: PhoneCallParticipantInfo | undefined): void {\r\n this._phoneCallParticipantInfoSubject.next(phoneCallParticipantInfo);\r\n }\r\n\r\n private createUserSessionChangedSubscription(): Subscription {\r\n return this._userSessionService.userSessionChanged()\r\n .subscribe(userSession => this.handleUserSessionChanged(userSession));\r\n }\r\n\r\n private handleUserSessionChanged(userSession: UserSession | undefined): void {\r\n //End the phone call if the user logs out.\r\n if (!userSession) {\r\n this.endPhoneCall();\r\n }\r\n }\r\n\r\n private createEnvironmentChangedSubscription(): Subscription {\r\n return this._currentEnvironmentService.environmentChanged\r\n .pipe(skip(1)) //environmentChanged emits on subscription, ignore that\r\n .subscribe(() => this.handleEnvironmentChanged());\r\n }\r\n\r\n private handleEnvironmentChanged(): void {\r\n //The current phone call info is only valid for the current environment,\r\n //so end the phone call if the environment changes.\r\n this.endPhoneCall();\r\n }\r\n\r\n private endPhoneCall(): void {\r\n //Remove all session storage data and emit the end of the phone call.\r\n this.removeSessionStorageData();\r\n this.emitParticipantInfo(this.phoneCallParticipantInfo);\r\n\r\n //Clean up subscriptions.\r\n for (let subscription of this._subscriptions) {\r\n subscription.unsubscribe();\r\n }\r\n this._subscriptions = [];\r\n }\r\n\r\n /**\r\n * Session storage for call history id.\r\n * See {@link CurrentPhoneCallServiceSessionStorageData.callHistoryId}.\r\n */\r\n private get callHistoryId(): number | undefined {\r\n return this.getSessionStorageData()?.callHistoryId;\r\n }\r\n\r\n private set callHistoryId(callHistoryId: number | undefined) {\r\n this.updateSessionStorageData(sessionStorageData => sessionStorageData.callHistoryId = callHistoryId);\r\n }\r\n\r\n /**\r\n * Session storage for participant id.\r\n * See {@link CurrentPhoneCallServiceSessionStorageData.participantId}.\r\n */\r\n private get participantId(): number | undefined {\r\n return this.getSessionStorageData()?.participantId;\r\n }\r\n\r\n private set participantId(participantId: number | undefined) {\r\n this.updateSessionStorageData(sessionStorageData => sessionStorageData.participantId = participantId);\r\n }\r\n\r\n /**\r\n * Session storage for verified participant id.\r\n * See {@link CurrentPhoneCallServiceSessionStorageData.verifiedParticipantId}.\r\n */\r\n private get verifiedParticipantId(): number | undefined {\r\n return this.getSessionStorageData()?.verifiedParticipantId;\r\n }\r\n\r\n private set verifiedParticipantId(verifiedParticipantId: number | undefined) {\r\n this.updateSessionStorageData(sessionStorageData => sessionStorageData.verifiedParticipantId = verifiedParticipantId);\r\n }\r\n\r\n /**\r\n * Session storage for participant info.\r\n * See {@link CurrentPhoneCallServiceSessionStorageData.phoneCallParticipantInfo}.\r\n */\r\n private get phoneCallParticipantInfo(): PhoneCallParticipantInfo | undefined {\r\n return this.getSessionStorageData()?.phoneCallParticipantInfo;\r\n }\r\n\r\n private set phoneCallParticipantInfo(phoneCallParticipantInfo: PhoneCallParticipantInfo | undefined) {\r\n this.updateSessionStorageData(sessionStorageData => sessionStorageData.phoneCallParticipantInfo = phoneCallParticipantInfo);\r\n }\r\n\r\n private getSessionStorageData(): CurrentPhoneCallServiceSessionStorageData | undefined {\r\n const serializedSessionStorageData = sessionStorage.getItem(this._sessionStorageKey);\r\n return serializedSessionStorageData ? JSON.parse(serializedSessionStorageData) : undefined;\r\n }\r\n\r\n private updateSessionStorageData(update: (sessionStorageData: CurrentPhoneCallServiceSessionStorageData) => void): void {\r\n //Get the session storage data, or create it if it doesn't exist yet.\r\n let sessionStorageData = this.getSessionStorageData();\r\n if (!sessionStorageData) {\r\n sessionStorageData = {\r\n callHistoryId: undefined,\r\n participantId: undefined,\r\n verifiedParticipantId: undefined,\r\n phoneCallParticipantInfo: undefined,\r\n };\r\n }\r\n\r\n //Apply the given update to the session storage data, then save it in session storage.\r\n update(sessionStorageData);\r\n sessionStorage.setItem(this._sessionStorageKey, JSON.stringify(sessionStorageData));\r\n }\r\n\r\n private removeSessionStorageData(): void {\r\n sessionStorage.removeItem(this._sessionStorageKey);\r\n }\r\n}\r\n\r\ninterface CurrentPhoneCallServiceSessionStorageData {\r\n /**\r\n * The id of the current phone call, or undefined if there is no current phone call.\r\n */\r\n callHistoryId: number | undefined,\r\n \r\n /**\r\n * The id of the participant of the current phone call, or undefined if we don't yet\r\n * know who the participant is, or if there is no current phone call.\r\n */\r\n participantId: number | undefined,\r\n\r\n /**\r\n * The id of the verified participant, or undefined if no participant was verified.\r\n */\r\n verifiedParticipantId: number | undefined,\r\n\r\n /**\r\n * Info for the participant of the current phone call, or undefined if the info has not\r\n * yet been fetched, or if there is no current phone call.\r\n */\r\n phoneCallParticipantInfo: PhoneCallParticipantInfo | undefined,\r\n}","export const environment = {\r\n production: true\r\n};\r\n\r\nexport const APPLICATION_INSIGHTS_CONNECTION_STRING = 'InstrumentationKey=00000000-0000-0000-0000-000000000004;IngestionEndpoint=https://telemetry.winstonfinancial.com/';\r\n","import { Injectable } from '@angular/core';\r\nimport { ApplicationInsights } from '@microsoft/applicationinsights-web';\r\nimport { APPLICATION_INSIGHTS_CONNECTION_STRING } from 'src/environments/environment';\r\nimport { UserSessionService } from '@modules/common/services/user-session.service';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class AppInsightsService {\r\n private _appInsights?: ApplicationInsights;\r\n\r\n constructor(private readonly _userSessionService: UserSessionService) { }\r\n\r\n public initialize(): void {\r\n try {\r\n if (APPLICATION_INSIGHTS_CONNECTION_STRING) {\r\n this._appInsights = new ApplicationInsights({\r\n config: {\r\n connectionString: APPLICATION_INSIGHTS_CONNECTION_STRING,\r\n extensionConfig: {\r\n AppInsightsCfgSyncPlugin: {\r\n cfgUrl: '' //Prevent loading a file from MS CDN - https://github.com/microsoft/ApplicationInsights-JS/blob/main/docs/WebConfig.md#disable-fetching-from-cdn\r\n }\r\n }\r\n }\r\n });\r\n\r\n this._appInsights.loadAppInsights();\r\n\r\n this._appInsights.addTelemetryInitializer(envelope => {\r\n envelope.data ||= {};\r\n envelope.data.UserId_CF = this._userSessionService.getUserSession()?.userInfo?.id?.toString();\r\n envelope.data.Email_CF = this._userSessionService.getUserSession()?.userInfo?.emailAddress;\r\n });\r\n }\r\n } catch (e) {\r\n console.error('Application Insights failed to start ' + e);\r\n this._appInsights = undefined;\r\n }\r\n }\r\n\r\n public trackException(exception: Error): void {\r\n this._appInsights?.trackException({\r\n exception: exception\r\n });\r\n }\r\n}\r\n","import { ErrorHandler, Injectable } from \"@angular/core\";\r\nimport { AppInsightsService } from \"@modules/common/services/app-insights.service\";\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class ErrorHandlerService implements ErrorHandler {\r\n constructor(\r\n private readonly _appInsightsService: AppInsightsService\r\n ) { }\r\n\r\n public handleError(error: any): void {\r\n console.error(error);\r\n this._appInsightsService.trackException(error);\r\n }\r\n}","/*\r\n * THIS IS A WORKAROUND. This fixes the stupid angular material datepicker\r\n * including a time in the date. Replace this with the useUtc option\r\n * once we have a version with this fix (looks like it's 6.3+).\r\n * https://github.com/angular/material2/issues/7167\r\n*/\r\n\r\nimport { Inject, Injectable, Optional } from '@angular/core';\r\nimport { MomentDateAdapter } from '@angular/material-moment-adapter';\r\nimport { MAT_DATE_LOCALE } from '@angular/material/core';\r\nimport * as moment from 'moment';\r\nimport { Moment } from 'moment';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class MomentUtcDateAdapter extends MomentDateAdapter {\r\n\r\n constructor(@Optional() @Inject(MAT_DATE_LOCALE) dateLocale: string) {\r\n super(dateLocale);\r\n }\r\n\r\n createDate(year: number, month: number, date: number): Moment {\r\n // Moment.js will create an invalid date if any of the components are out of bounds, but we\r\n // explicitly check each case so we can throw more descriptive errors.\r\n if (month < 0 || month > 11) {\r\n throw Error(`Invalid month index \"${month}\". Month index has to be between 0 and 11.`);\r\n }\r\n\r\n if (date < 1) {\r\n throw Error(`Invalid date \"${date}\". Date has to be greater than 0.`);\r\n }\r\n\r\n let result = moment.utc({ year, month, date }).locale(this.locale);\r\n\r\n // If the result isn't valid, the date must have been out of bounds for this month.\r\n if (!result.isValid()) {\r\n throw Error(`Invalid date \"${date}\" for month with index \"${month}\".`);\r\n }\r\n\r\n return result;\r\n }\r\n\r\n parse(value: any, parseFormat: string | string[]): Moment | null {\r\n if (value && typeof value == 'string') {\r\n return moment.utc(value, parseFormat).locale(this.locale);\r\n }\r\n return value ? moment.utc(value).locale(this.locale) : null;\r\n }\r\n\r\n today(): Moment {\r\n return moment.utc().locale(this.locale);\r\n }\r\n\r\n deserialize(value: any): Moment | null {\r\n let date;\r\n if (value instanceof Date) {\r\n date = moment(value);\r\n }\r\n if (typeof value === 'string') {\r\n if (!value) {\r\n return null;\r\n }\r\n date = moment.utc(value, moment.ISO_8601).locale(this.locale);\r\n }\r\n if (date && this.isValid(date)) {\r\n return date;\r\n }\r\n return super.deserialize(value);\r\n }\r\n}\r\n","import { CommonModule } from '@angular/common';\r\nimport { NgModule } from '@angular/core';\r\nimport { FormsModule, ReactiveFormsModule } from '@angular/forms';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatFormFieldModule } from '@angular/material/form-field';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatInputModule } from '@angular/material/input';\r\nimport { MatMenuModule } from '@angular/material/menu';\r\nimport { MatSelectModule } from '@angular/material/select';\r\nimport { MatTooltipModule } from '@angular/material/tooltip';\r\nimport { RouterModule } from '@angular/router';\r\nimport { StingrayCommonModule } from '@modules/common/common.module';\r\nimport { NavClientPickerComponent } from '@modules/navigation/components/nav-client-picker/nav-client-picker.component';\r\nimport { NavEnvMessageComponent } from '@modules/navigation/components/nav-env-message/nav-env-message.component';\r\nimport { NavEnvPickerComponent } from '@modules/navigation/components/nav-env-picker/nav-env-picker.component';\r\nimport { NavHeaderComponent } from '@modules/navigation/components/nav-header/nav-header.component';\r\nimport { NavLayoutComponent } from '@modules/navigation/components/nav-layout/nav-layout.component';\r\nimport { NavNewTabComponent } from '@modules/navigation/components/nav-new-tab/nav-new-tab.component';\r\nimport { NavPhoneCallBannerComponent } from '@modules/navigation/components/nav-phone-call-banner/nav-phone-call-banner.component';\r\nimport { NavSidebarComponent } from '@modules/navigation/components/nav-sidebar/nav-sidebar.component';\r\nimport { NavUserMenuComponent } from '@modules/navigation/components/nav-user-menu/nav-user-menu.component';\r\n\r\n@NgModule({\r\n declarations: [\r\n NavLayoutComponent,\r\n NavHeaderComponent,\r\n NavSidebarComponent,\r\n NavClientPickerComponent,\r\n NavNewTabComponent,\r\n NavUserMenuComponent,\r\n NavEnvPickerComponent,\r\n NavEnvMessageComponent,\r\n NavPhoneCallBannerComponent,\r\n ],\r\n imports: [\r\n CommonModule,\r\n FormsModule,\r\n ReactiveFormsModule,\r\n //Start Angular Material\r\n MatButtonModule,\r\n MatFormFieldModule,\r\n MatInputModule,\r\n MatMenuModule,\r\n MatSelectModule,\r\n MatTooltipModule,\r\n MatIconModule,\r\n //End Angular Material\r\n RouterModule,\r\n StingrayCommonModule\r\n ]\r\n})\r\nexport class NavigationModule {\r\n}\r\n","import { Component } from '@angular/core';\r\nimport { Location } from '@angular/common';\r\n\r\n@Component({\r\n selector: 'app-not-found',\r\n templateUrl: './not-found.component.html',\r\n styleUrls: ['./not-found.component.scss']\r\n})\r\n\r\nexport class NotFoundComponent { \r\n public copyrightYear: number;\r\n \r\n constructor(\r\n private _location: Location\r\n ) {\r\n\r\n this.copyrightYear = new Date().getFullYear();\r\n }\r\n\r\n public navigateBack(): void {\r\n this._location.back();\r\n }\r\n}","
\r\n
\r\n \"404\r\n\r\n
\r\n
\r\n\r\n \r\n\r\n
\r\n
\r\n
\r\n
\r\n","import { Injectable } from '@angular/core';\r\nimport { BehaviorSubject, Observable } from 'rxjs';\r\n\r\nconst STORAGE_KEY = 'ExpandNavSideBar';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class NavSidebarExpandedService {\r\n private _subject = new BehaviorSubject(this.getValue());\r\n\r\n constructor() { }\r\n\r\n public toggleExpanded(): void {\r\n const newValue = !this.getValue();\r\n localStorage.setItem(STORAGE_KEY, JSON.stringify(newValue));\r\n this._subject.next(newValue);\r\n }\r\n\r\n public get toggled(): Observable {\r\n return this._subject;\r\n }\r\n\r\n private getValue(): boolean {\r\n return JSON.parse(localStorage.getItem(STORAGE_KEY) || 'true');\r\n }\r\n\r\n\r\n}\r\n","import { Component } from '@angular/core';\r\n\r\n@Component({\r\n selector: 'app-no-case-selected-overlay',\r\n templateUrl: './no-case-selected-overlay.component.html',\r\n styleUrls: ['./no-case-selected-overlay.component.scss']\r\n})\r\nexport class NoCaseSelectedOverlayComponent {\r\n constructor() { }\r\n}\r\n","
\r\n
Select a Client
\r\n

To continue, select a client from the dropdown at the top of the page.

\r\n
","import { Injectable } from \"@angular/core\";\r\nimport { RedirectToLoginService } from \"@modules/common/services/redirect-to-login.service\";\r\nimport { UserSessionService } from \"@modules/common/services/user-session.service\";\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class LogoutService {\r\n constructor(\r\n private _userSessionService: UserSessionService,\r\n private _redirectToLoginService: RedirectToLoginService\r\n ) { }\r\n\r\n public logout(clearRedirectedFromUrl: boolean = true): void {\r\n this._userSessionService.signOut().subscribe(() => {\r\n this._redirectToLoginService.redirectToLogin();\r\n if (clearRedirectedFromUrl) {\r\n this._redirectToLoginService.clearRedirectedFromUrl();\r\n }\r\n });\r\n }\r\n}\r\n","import { Component, OnInit } from '@angular/core';\r\nimport { UserSessionService } from '@modules/common/services/user-session.service';\r\nimport { CurrentCaseService } from '@modules/common/services/current-case.service';\r\nimport { LogoutService } from '@modules/common/services/logout.service';\r\nimport { CurrentEnvironmentService } from '../../../common/services/current-environment.service';\r\n\r\n@Component({\r\n selector: 'app-nav-user-menu',\r\n templateUrl: './nav-user-menu.component.html',\r\n styleUrls: ['./nav-user-menu.component.scss']\r\n})\r\nexport class NavUserMenuComponent implements OnInit {\r\n constructor(\r\n private _userSessionService: UserSessionService,\r\n private _currentCaseService: CurrentCaseService,\r\n private _logoutService: LogoutService,\r\n private _currentEnvironmentService: CurrentEnvironmentService\r\n ) { }\r\n\r\n public userDisplayName?: string;\r\n public accountSettingsUrl!: string;\r\n\r\n public ngOnInit(): void {\r\n const session = this._userSessionService.getUserSession();\r\n this.userDisplayName = session && session.userInfo && session.userInfo.displayName;\r\n\r\n this.accountSettingsUrl = (this._currentEnvironmentService.getCurrentEnvironmentName() ? '/' + this._currentEnvironmentService.getCurrentEnvironmentName() : '')\r\n + (this._currentCaseService.getCurrentCaseName() ? '/' + this._currentCaseService.getCurrentCaseName() : '')\r\n + '/Users/AccountSettings';\r\n }\r\n\r\n public signOut(): void {\r\n this._logoutService.logout();\r\n }\r\n}","\r\n\r\n \r\n \r\n","
\r\n \r\n \r\n \r\n
","import { Component } from '@angular/core';\r\nimport { EnvironmentListService } from '@modules/common/services/environment-list.service';\r\nimport { CurrentEnvironmentService } from '@modules/common/services/current-environment.service';\r\n\r\n@Component({\r\n selector: 'app-nav-header',\r\n templateUrl: './nav-header.component.html',\r\n styleUrls: ['./nav-header.component.scss']\r\n})\r\nexport class NavHeaderComponent {\r\n public nonDefaultEnvironmentSelected = false;\r\n\r\n constructor(\r\n private _environmentListService: EnvironmentListService,\r\n private _currentEnvironmentService: CurrentEnvironmentService\r\n ) {\r\n this._currentEnvironmentService.environmentChanged.subscribe(() => this.updateEnvironment());\r\n this._environmentListService.environmentListChanged.subscribe(() => this.updateEnvironment());\r\n }\r\n\r\n private updateEnvironment(): void {\r\n const environmentName = this._currentEnvironmentService.getCurrentEnvironmentName();\r\n const environment = this._environmentListService.getEnvironmentList().filter(x => x.name.toLowerCase() == environmentName.toLowerCase())[0];\r\n this.nonDefaultEnvironmentSelected = environment && !environment.isDefault;\r\n }\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { map, Observable, ReplaySubject, zip } from 'rxjs';\r\nimport { DashboardViewModel } from '@modules/api/dashboard-view-model.generated';\r\nimport { PowerBIViewModel } from '@modules/api/power-bi-view-model.generated';\r\nimport { CurrentRouteService } from '@modules/common/services/current-route.service';\r\nimport { GetCurrentUserDynamicMenusService } from '@modules/common/services/get-current-user-dynamic-menus.service';\r\nimport { PermissionService } from '@modules/common/services/permission.service';\r\nimport { NavSidebarMenu } from '@modules/navigation/models/nav-sidebar-menu';\r\nimport { NavSidebarMenuItem } from '@modules/navigation/models/nav-sidebar-menu-item';\r\nimport { NavSidebarGroupedMenuItem } from '@modules/navigation/models/nav-sidebar-grouped-menu-item';\r\nimport { AdministrationMenuViewModel } from '@modules/api/administration-menu-view-model.generated';\r\n\r\nconst DASHBOARDS_TITLE = 'DASHBOARDS';\r\nconst REPORTING_TITLE = 'REPORTING';\r\nconst ANALYTICS_TITLE = 'ANALYTICS';\r\nconst ADMINISTRATION_TITLE = \"ADMINISTRATION\";\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class NavSidebarMenuService {\r\n constructor(\r\n private _currentRouteService: CurrentRouteService,\r\n private _permissionService: PermissionService,\r\n private _getCurrentUserDynamicMenuService: GetCurrentUserDynamicMenusService\r\n ) { }\r\n\r\n public getMenus(): Observable {\r\n const result = new ReplaySubject(1);\r\n this._permissionService.permissionsChanged.subscribe(() => {\r\n this.getMenuModel().subscribe(menus => {\r\n result.next(menus);\r\n });\r\n });\r\n return result;\r\n }\r\n\r\n private getMenuModel(): Observable {\r\n return this.getPopulatedMenuData().pipe(map(menus =>\r\n menus.map(menu => {\r\n return {\r\n icon: menu.icon,\r\n title: menu.title,\r\n menuItems: menu.menuItems && menu.menuItems.length && menu.menuItems.map(item => {\r\n title: item.title,\r\n url: '/' + item.url.join('/')\r\n }),\r\n groupedMenus: menu.groupedMenus?.map(groupedMenu => {\r\n header: groupedMenu.header,\r\n menuItems: groupedMenu.menuItems?.map(item => {\r\n title: item.title,\r\n url: '/' + item.url.join('/')\r\n })\r\n })\r\n \r\n }})\r\n ));\r\n }\r\n\r\n private getPopulatedMenuData(): Observable {\r\n return zip(\r\n this._getCurrentUserDynamicMenuService.getCurrentUserDashboards(),\r\n this._getCurrentUserDynamicMenuService.getCurrentUserPowerBIReports(),\r\n this._getCurrentUserDynamicMenuService.getCurrentUserPowerBIPaginatedReports(),\r\n this._getCurrentUserDynamicMenuService.getAdministrationMenus())\r\n .pipe(map(dashboardsAndPowerBI => {\r\n const routeParams = this._currentRouteService.getCurrentRoute().params;\r\n const menus = this.getRawMenuData().filter(menu =>\r\n !menu.requiredParams || !menu.requiredParams.length || menu.requiredParams.every(p => hasParam(routeParams, p))\r\n );\r\n\r\n for (let menu of menus) {\r\n menu.menuItems = menu.menuItems && menu.menuItems\r\n .filter(item => !item.requiredParams || !item.requiredParams.length || item.requiredParams.every(p => hasParam(routeParams, p)))\r\n .filter(item => !item.requiredPermissions || !item.requiredPermissions.length || item.requiredPermissions.some(p => this._permissionService.verifyPermission(p)));\r\n\r\n if(menu.groupedMenus) {\r\n for(let groupedItem of menu.groupedMenus) {\r\n groupedItem.menuItems = groupedItem.menuItems && groupedItem.menuItems\r\n .filter(item => !item.requiredParams || !item.requiredParams.length || item.requiredParams.every(p => hasParam(routeParams, p)))\r\n .filter(item => !item.requiredPermissions || !item.requiredPermissions.length || item.requiredPermissions.some(p => this._permissionService.verifyPermission(p)));\r\n }\r\n }\r\n\r\n if (menu.title == DASHBOARDS_TITLE) {\r\n this.populateDynamicMenu('Dashboards', menu, dashboardsAndPowerBI[0]);\r\n }\r\n\r\n if (menu.title == ADMINISTRATION_TITLE) {\r\n this.addDynamicAdminMenuItemsToStaticMenu(menu, dashboardsAndPowerBI[3]);\r\n }\r\n\r\n if (menu.menuItems) {\r\n for (let menuItem of menu.menuItems) {\r\n if (menuItem.url) {\r\n this.populateUrlParams(menuItem.url, routeParams);\r\n }\r\n }\r\n }\r\n\r\n if(menu.groupedMenus) {\r\n for(let groupedItem of menu.groupedMenus) {\r\n if (groupedItem.header == ANALYTICS_TITLE) {\r\n this.populateDynamicMenu('Analytics', groupedItem, dashboardsAndPowerBI[1]);\r\n }\r\n \r\n if (groupedItem.header == REPORTING_TITLE) {\r\n this.addDynamicMenuItemsToStaticMenu('Analytics', groupedItem, dashboardsAndPowerBI[2]);\r\n }\r\n \r\n for (let menuItem of groupedItem.menuItems!) {\r\n if (menuItem.url) {\r\n this.populateUrlParams(menuItem.url, routeParams);\r\n }\r\n }\r\n }\r\n menu.groupedMenus = menu.groupedMenus.filter(x => x.menuItems!.length) \r\n }\r\n }\r\n\r\n return menus.filter(menu => menu.menuItems?.length || menu.groupedMenus?.some(groupedItem => groupedItem.menuItems?.length));\r\n }));\r\n }\r\n\r\n private populateDynamicMenu(menuTitle: string, menu: FilterableMenu | FilterableGroupMenu, o: DashboardViewModel[] | PowerBIViewModel[]): void {\r\n menu.menuItems = o && o.map(x => {\r\n return {\r\n title: x.name!,\r\n url: [':environment', ':clientName', menuTitle, x.name!]\r\n }\r\n }) || [];\r\n }\r\n\r\n private addDynamicMenuItemsToStaticMenu(menuTitle: string, menu: FilterableGroupMenu, o: PowerBIViewModel[]): void {\r\n const paginatedReportMenuItems: FilterableMenuItem[] = o.map(x => {\r\n return {\r\n title: x.name!,\r\n url: [':environment', ':clientName', menuTitle, x.name!]\r\n }\r\n });\r\n\r\n menu.menuItems = menu.menuItems?.concat(paginatedReportMenuItems).sort((a, b) => a.title.localeCompare(b.title))\r\n }\r\n\r\n private addDynamicAdminMenuItemsToStaticMenu(menu: FilterableMenu | FilterableGroupMenu, administrationMenus: AdministrationMenuViewModel[]): void {\r\n const adminMenuItems: FilterableMenuItem[] = administrationMenus.map(x => ({\r\n title: x.friendlyName || x.name!,\r\n url: [':environment', ':clientName', x.baseUrlSegment!, x.name!]\r\n }));\r\n\r\n menu.menuItems = menu.menuItems!.concat(adminMenuItems).sort((a, b) => a.title.localeCompare(b.title));\r\n }\r\n\r\n private populateUrlParams(url: string[], routeParams: { [key: string]: any }): void {\r\n for (let i = url.length - 1; i >= 0; i--) {\r\n if (url[i].startsWith(':')) {\r\n let routeParam = routeParams[url[i].substr(1)];\r\n if (routeParam) {\r\n url[i] = routeParam;\r\n } else {\r\n url.splice(i, 1);\r\n }\r\n }\r\n }\r\n }\r\n\r\n private getRawMenuData(): FilterableMenu[] {\r\n return [\r\n {\r\n icon: 'fa-desktop',\r\n title: 'DASHBOARDS',\r\n menuItems: []\r\n },\r\n {\r\n icon: 'fa-circle-user',\r\n title: 'PARTICIPANT',\r\n groupedMenus: [\r\n {\r\n header: 'SEARCH',\r\n menuItems: [\r\n {\r\n title: 'Search',\r\n url: [':environment', ':clientName', 'Participant/Search'],\r\n requiredPermissions: ['View Participant Profile']\r\n }\r\n ]\r\n },\r\n {\r\n header: 'PROFILE',\r\n menuItems: [\r\n {\r\n title: 'Profile',\r\n url: [':environment', ':clientName', 'Participant', ':participantId'],\r\n requiredParams: [':participantId'],\r\n requiredPermissions: ['View Participant Profile']\r\n },\r\n {\r\n title: 'Benefits',\r\n url: [':environment', ':clientName', 'Participant', ':participantId', 'Benefits'],\r\n requiredParams: [':participantId'],\r\n requiredPermissions: ['View Participant Profile']\r\n },\r\n {\r\n title: 'Dependents & Beneficiaries',\r\n url: [':environment', ':clientName', 'Participant', ':participantId', 'Dependents'],\r\n requiredParams: [':participantId'],\r\n requiredPermissions: ['View Participant Profile']\r\n },\r\n {\r\n title: 'Notes',\r\n url: [':environment', ':clientName', 'Participant', ':participantId', 'Notes'],\r\n requiredParams: [':participantId'],\r\n requiredPermissions: ['View Participant Profile']\r\n },\r\n {\r\n title: 'Documents',\r\n url: [':environment', ':clientName', 'Participant', ':participantId', 'Documents'],\r\n requiredParams: [':participantId'],\r\n requiredPermissions: ['View Participant Profile']\r\n },\r\n {\r\n title: 'Deductions',\r\n url: [':environment', ':clientName', 'Participant', ':participantId', 'Deductions'],\r\n requiredParams: [':participantId'],\r\n requiredPermissions: ['View Participant Deduction List']\r\n },\r\n {\r\n title: 'Instruction History',\r\n url: [':environment', ':clientName', 'Participant', ':participantId', 'Instructions'],\r\n requiredParams: [':participantId'],\r\n requiredPermissions: ['View Participant Instruction History']\r\n },\r\n ]\r\n }\r\n ]\r\n },\r\n {\r\n icon: 'fa-briefcase',\r\n title: ADMINISTRATION_TITLE,\r\n menuItems: [\r\n {\r\n title: 'Census Load Reports',\r\n url: [':environment', ':clientName', 'CensusReports/Dashboard'],\r\n requiredPermissions: ['View Census Reports']\r\n },\r\n {\r\n title: 'Data Integrity Errors',\r\n url: [':environment', ':clientName', 'DataIntegrity/DataIntegrityErrors'],\r\n requiredPermissions: ['View Data Integrity Errors']\r\n },\r\n {\r\n title: 'Issue Tracker',\r\n url: [':environment', ':clientName', 'IssueTracker/SSO']\r\n },\r\n {\r\n title: 'Outstanding Enrollments',\r\n url: [':environment', ':clientName', 'Administration/ParticipantTransactions'],\r\n requiredPermissions: ['View Participant Transactions']\r\n },\r\n {\r\n title: 'Verifications',\r\n url: [':environment', ':clientName', 'DependentVerification/Verifications'],\r\n requiredPermissions: ['Edit Dependent Verification']\r\n },\r\n ]\r\n },\r\n {\r\n icon: 'fa-file-pen',\r\n title: 'REPORTINGS & ANALYTICS',\r\n groupedMenus: [\r\n {\r\n header: 'REPORTING',\r\n menuItems: [\r\n {\r\n title: 'Ad Hoc Reports',\r\n url: [':environment', ':clientName', 'Reporting/AdHocReports'],\r\n requiredPermissions: ['View Ad Hoc Reports']\r\n },\r\n {\r\n title: 'Standard Reports',\r\n url: [':environment', ':clientName', 'Reporting/Reports'],\r\n requiredPermissions: ['View Standard Reports']\r\n },\r\n ]\r\n },\r\n {\r\n header: 'ANALYTICS',\r\n menuItems: []\r\n }\r\n ]\r\n },\r\n {\r\n icon: 'fa-cog',\r\n title: 'CONFIGURATION',\r\n groupedMenus: [\r\n {\r\n header: 'LOGIN',\r\n menuItems: [\r\n {\r\n title: 'Login Personal Identifiable Information',\r\n url: [':environment', ':clientName', 'AdminPortalConfig/PersonalInfo'],\r\n requiredPermissions: ['View Login PII']\r\n },\r\n {\r\n title: 'Login Styling',\r\n url: [':environment', ':clientName', 'PortalConfig/LoginStyling'],\r\n requiredPermissions: ['Edit Login Styling']\r\n },\r\n {\r\n title: 'Sign Up & Password Reset Emails',\r\n url: [':environment', ':clientName', 'AdminPortalConfig/SignUpAndPasswordResetEmails'],\r\n requiredPermissions: ['View Case Email Configuration']\r\n },\r\n ]\r\n },\r\n {\r\n header: 'PORTAL',\r\n menuItems: [\r\n {\r\n title: 'Available Benefits',\r\n url: [':environment', ':clientName', 'PortalConfig/AvailableBenefits'],\r\n requiredPermissions: ['View Available Benefits']\r\n },\r\n {\r\n title: 'FAQs',\r\n url: [':environment', ':clientName', 'PortalConfig/FAQ'],\r\n requiredPermissions: ['View FAQs']\r\n },\r\n {\r\n title: 'Forms',\r\n url: [':environment', ':clientName', 'PortalConfig/Forms'],\r\n requiredPermissions: ['View Forms']\r\n },\r\n {\r\n title: 'Mobile App Information',\r\n url: [':environment', ':clientName', 'PortalConfig/MobileAppInfo'],\r\n requiredPermissions: ['Edit Mobile App Info']\r\n },\r\n {\r\n title: 'Navigation',\r\n url: [':environment', ':clientName', 'TitaniaNavigation/Navigation'],\r\n requiredPermissions: ['View Titania Menus']\r\n },\r\n {\r\n title: 'Plan Details',\r\n url: [':environment', ':clientName', 'PortalConfig/PlanDetails'],\r\n requiredPermissions: ['View Plan Details']\r\n }\r\n ]\r\n },\r\n {\r\n header: 'ENROLLMENT BUILDER',\r\n menuItems: [\r\n {\r\n title: 'Enrollments',\r\n url: [':environment', ':clientName', 'EnrollmentBuilder/Enrollments'],\r\n requiredPermissions: ['View Transactions']\r\n },\r\n {\r\n title: 'Evidence of Insurability Text',\r\n url: [':environment', ':clientName', 'EnrollmentBuilder/EOITextConfig'],\r\n requiredPermissions: ['View Transactions']\r\n }\r\n ]\r\n },\r\n {\r\n header: 'BENEFIT PLANS',\r\n menuItems: [\r\n {\r\n title: 'Application Questions',\r\n url: [':environment', ':clientName', 'ApplicationQuestions'],\r\n requiredPermissions: ['View Case Application Questions']\r\n },\r\n {\r\n title: 'Benefit Plan Documents',\r\n url: [':environment', ':clientName', 'BenefitPlanDocuments'],\r\n requiredPermissions: ['View Benefit Plan Documents']\r\n },\r\n {\r\n title: 'Case Plan Groups',\r\n url: [':environment', ':clientName', 'CasePlanGroups'],\r\n requiredPermissions: ['View Benefit Plan Groups']\r\n },\r\n {\r\n title: 'Global Credit Configuration',\r\n url: [':environment', ':clientName', 'CaseConfig/GlobalCreditConfiguration'],\r\n requiredPermissions: ['View Global Credit Configuration']\r\n },\r\n ]\r\n },\r\n {\r\n header: 'CASE LEVEL CONFIGURATION',\r\n menuItems: [\r\n {\r\n title: 'Administration Portal Styling',\r\n url: [':environment', ':clientName', 'AdminPortalConfig/Styling'],\r\n requiredPermissions: ['Edit Admin Portal Styling']\r\n },\r\n {\r\n title: 'Case Report',\r\n url: [':environment', ':clientName', 'Reporting/CaseReport'],\r\n requiredPermissions: ['View Case Report Config']\r\n },\r\n {\r\n title: 'Data Integrity Exclusions',\r\n url: [':environment', ':clientName', 'DataIntegrity/Exclusions'],\r\n requiredPermissions: ['View Data Integrity Exclusions']\r\n },\r\n {\r\n title: 'Dependent Verification Rules',\r\n url: [':environment', ':clientName', 'DependentVerificationRules/DependentVerificationRules'],\r\n requiredPermissions: ['View Dependent Verification Rules']\r\n },\r\n {\r\n title: 'Eligibility Windows',\r\n url: [':environment', ':clientName', 'EligibilityWindows'],\r\n requiredPermissions: ['View Eligibility Windows']\r\n },\r\n {\r\n title: 'Enrollment Commit Rules',\r\n url: [':environment', ':clientName', 'AutoCommitCancelTransaction/EnrollmentCommitRules'],\r\n requiredPermissions: ['View Auto Commit Cancel Transaction Configuration']\r\n },\r\n {\r\n title: 'Tier Structures',\r\n url: [':environment', ':clientName', 'TierStructure/CaseLevel/TierStructures'],\r\n requiredPermissions: ['View Case Tier Structures']\r\n }\r\n ]\r\n },\r\n {\r\n header: 'COMMUNICATION',\r\n menuItems: [\r\n {\r\n title: 'Email Configuration',\r\n url: [':environment', ':clientName', 'AdminPortalConfig/EmailConfiguration'],\r\n requiredPermissions: ['View Default Email Configuration']\r\n },\r\n ]\r\n },\r\n {\r\n header: 'SYSTEM SETTINGS',\r\n menuItems: [\r\n {\r\n title: 'Ad Hoc Reports Editor',\r\n url: [':environment', ':clientName', 'Reporting/AdHocReportEditor'],\r\n requiredPermissions: ['Edit Ad Hoc Reports']\r\n },\r\n {\r\n title: 'Analytics Configuration',\r\n url: [':environment', ':clientName', 'Analytics', 'Configuration'],\r\n requiredPermissions: ['View Power BI Report Configuration']\r\n },\r\n {\r\n title: 'Dashboard Editor',\r\n url: [':environment', ':clientName', 'DashboardConfiguration/DashboardEditor'],\r\n requiredPermissions: ['Edit Dashboards']\r\n },\r\n {\r\n title: 'Data Integrity Primary Fixers',\r\n url: [':environment', ':clientName', 'DataIntegrity/PrimaryFixers'],\r\n requiredPermissions: ['View Primary Fixers']\r\n },\r\n {\r\n title: 'Data Integrity Validator Configuration',\r\n url: [':environment', ':clientName', 'DataIntegrity/ValidatorConfiguration'],\r\n requiredPermissions: ['View Data Integrity Validator Info']\r\n },\r\n {\r\n title: 'Enrollment Sub Step Types',\r\n url: [':environment', ':clientName', 'EnrollmentBuilder/SubStepTypes'],\r\n requiredPermissions: ['View Transactions']\r\n },\r\n {\r\n title: 'Standard Reports Editor',\r\n url: [':environment', ':clientName', 'Reporting/ReportEditor'],\r\n requiredPermissions: ['Edit Standard Reports']\r\n },\r\n {\r\n title: 'Tier Structures',\r\n url: [':environment', ':clientName', 'TierStructure/Global/TierStructures'],\r\n requiredPermissions: ['View Global Tier Structures']\r\n },\r\n {\r\n title: 'Video Configuration',\r\n url: [':environment', ':clientName', 'VideoConfiguration'],\r\n requiredPermissions: ['View Global Videos']\r\n }\r\n ]\r\n }\r\n ]\r\n },\r\n {\r\n icon: 'fa-screwdriver-wrench',\r\n title: 'TOOLS',\r\n groupedMenus: [\r\n {\r\n header: 'CENSUS',\r\n menuItems: [\r\n {\r\n title: 'Census List',\r\n url: [':environment', ':clientName', 'Census/List'],\r\n requiredPermissions: ['View Census']\r\n }\r\n ]\r\n },\r\n {\r\n header: 'FILES',\r\n menuItems: [\r\n {\r\n title: 'Case Remittance File Configuration',\r\n url: [':environment', ':clientName', 'RemittanceCaseFileDefinitionGroups'],\r\n requiredPermissions: [\"View Case Remit File Configuration\"]\r\n },\r\n {\r\n title: 'Deduction Code Setup',\r\n url: [':environment', ':clientName', 'DeductionCodes'],\r\n requiredPermissions: ['View Deduction Codes']\r\n },\r\n {\r\n title: 'Instruction File Configuration',\r\n url: [':environment', ':clientName', 'InstructionCaseConfig'],\r\n requiredPermissions: [\"View Instruction File Configuration\"]\r\n },\r\n {\r\n title: 'Instruction File Setups',\r\n url: [':environment', ':clientName', 'InstructionFileSetup'],\r\n requiredPermissions: [\"View Instruction File Setup\"]\r\n },\r\n {\r\n title: 'Payment File Configuration',\r\n url: [':environment', ':clientName', 'PaymentFileConfiguration'],\r\n requiredPermissions: ['View Payment File Configuration']\r\n },\r\n {\r\n title: 'Remittance File Configuration',\r\n url: [':environment', ':clientName', 'RemittanceFileDefinitionGroups'],\r\n requiredPermissions: [\"View Remit File Configuration\"]\r\n }\r\n ]\r\n },\r\n {\r\n header: 'RULES',\r\n menuItems: [\r\n {\r\n title: 'New Rule',\r\n url: [':environment', ':clientName', 'ExpressionRules/Edit'],\r\n requiredPermissions: ['View Rules']\r\n },\r\n {\r\n title: 'Search',\r\n url: [':environment', ':clientName', 'ExpressionRules/Search'],\r\n requiredPermissions: ['View Rules']\r\n },\r\n ]\r\n },\r\n {\r\n header: 'PUBLISH CENTER',\r\n menuItems: [\r\n {\r\n title: 'Publish',\r\n url: [':environment', ':clientName', 'PublishingCenter/Publish'],\r\n requiredPermissions: ['Run Publish']\r\n },\r\n {\r\n title: 'Publish History',\r\n url: [':environment', ':clientName', 'PublishingCenter/PublishHistory'],\r\n requiredPermissions: ['View Publish']\r\n }\r\n ]\r\n },\r\n {\r\n header: 'DATA REFRESH',\r\n menuItems: [\r\n {\r\n title: 'History',\r\n url: [':environment', ':clientName', 'DataRefresh/RefreshDataHistory'],\r\n requiredPermissions: ['View Data Refresh']\r\n },\r\n {\r\n title: 'Queue',\r\n url: [':environment', ':clientName', 'DataRefresh/RefreshDataQueue'],\r\n requiredPermissions: ['View Data Refresh Queue']\r\n },\r\n {\r\n title: 'Refresh',\r\n url: [':environment', ':clientName', 'DataRefresh/RefreshData'],\r\n requiredPermissions: ['Run Data Refresh']\r\n },\r\n ]\r\n },\r\n {\r\n header: 'UTILITIES',\r\n menuItems: [\r\n {\r\n title: 'Bulk Document Uploader',\r\n url: [':environment', ':clientName', 'Files', 'Loader'],\r\n requiredPermissions: [\"View Upload Batch Files\"]\r\n },\r\n {\r\n title: 'Rollovers',\r\n url: [':environment', ':clientName', 'Rollover'],\r\n requiredPermissions: ['View Rollovers']\r\n },\r\n ]\r\n }\r\n ]\r\n },\r\n {\r\n icon: 'fa-shield-halved',\r\n title: 'SECURITY',\r\n menuItems: [\r\n {\r\n title: \"Environments\",\r\n url: [':environment', ':clientName', 'Environments'],\r\n requiredPermissions: [\"View Environments\"]\r\n },\r\n {\r\n title: 'Filter Sets',\r\n url: [':environment', ':clientName', 'Users/UserEntityFilterConfigurationList'],\r\n requiredPermissions: ['View Filter Sets']\r\n },\r\n {\r\n title: 'Incoming SSO',\r\n url: [':environment', ':clientName', 'CaseSSO'],\r\n requiredPermissions: ['View Case SSO']\r\n },\r\n {\r\n title: 'Outgoing SSO',\r\n url: [':environment', ':clientName', 'CaseSSOServiceProviders'],\r\n requiredPermissions: ['View Case SSO Service Providers']\r\n },\r\n {\r\n title: 'Permissions',\r\n url: [':environment', ':clientName', 'Permissions/Tree'],\r\n requiredPermissions: ['View Permissions']\r\n },\r\n {\r\n title: 'Permission Sets',\r\n url: [':environment', ':clientName', 'Permissions/PermissionSets'],\r\n requiredPermissions: ['View Permission Sets']\r\n },\r\n {\r\n title: 'Publish Group',\r\n url: [':environment', ':clientName', 'PublishingCenter/PublishGroups'],\r\n requiredPermissions: ['View Publish Groups']\r\n },\r\n {\r\n title: 'Users',\r\n url: [':environment', ':clientName', 'Users/List'],\r\n requiredPermissions: ['View External Users', 'View Internal Users']\r\n },\r\n ]\r\n },\r\n ];\r\n }\r\n}\r\n\r\ninterface FilterableMenu {\r\n icon: string;\r\n title: string;\r\n requiredParams?: string[];\r\n menuItems?: FilterableMenuItem[];\r\n groupedMenus?: FilterableGroupMenu[];\r\n}\r\n\r\ninterface FilterableMenuItem {\r\n title: string;\r\n url: string[];\r\n requiredParams?: string[];\r\n requiredPermissions?: string[];\r\n}\r\n\r\ninterface FilterableGroupMenu {\r\n header: string;\r\n requiredParams?: string[];\r\n menuItems?: FilterableMenuItem[];\r\n}\r\n\r\nfunction hasParam(routeParams: { [key: string]: any }, param: string): boolean {\r\n return !!routeParams[param.substr(1)];\r\n}\r\n","
\r\n \r\n
\r\n \r\n
\r\n \r\n
\r\n
\r\n \r\n \r\n
{{groupedMenu.header}}
\r\n \r\n
\r\n
\r\n \r\n \r\n \r\n
\r\n
\r\n \r\n
\r\n
\r\n \r\n \r\n
{{groupedMenu.header}}
\r\n \r\n
\r\n
\r\n \r\n \r\n \r\n \r\n \r\n
\r\n
\r\n
\r\n
\r\n
\r\n \r\n
\r\n
","import { Component, ElementRef, OnInit, QueryList, ViewChild, ViewChildren, AfterViewInit, OnDestroy } from '@angular/core';\r\nimport { animate, state, style, transition, trigger } from '@angular/animations';\r\nimport { NavSidebar } from '../../models/nav-sidebar';\r\nimport { NavSidebarMenuService } from '../../services/nav-sidebar-menu.service';\r\nimport { HomeUrlService } from '@modules/common/services/home-url.service';\r\nimport { NavSidebarExpandedService } from '@modules/navigation/services/nav-sidebar-expanded.service';\r\nimport { NavSidebarMenu } from '@modules/navigation/models/nav-sidebar-menu';\r\nimport { Router } from '@angular/router';\r\nimport { Subscription } from 'rxjs';\r\n\r\n@Component({\r\nselector: 'app-nav-sidebar',\r\ntemplateUrl: './nav-sidebar.component.html',\r\nstyleUrls: ['./nav-sidebar.component.scss'],\r\nanimations: [\r\n trigger('fade', [\r\n state('void', style({opacity: 0})),\r\n transition('void <=> *', [\r\n animate(200)\r\n ])\r\n ])]\r\n})\r\nexport class NavSidebarComponent implements OnInit, AfterViewInit, OnDestroy {\r\n public model: NavSidebar = { menus: [] };\r\n public isNavSidebarExpanded: boolean = true;\r\n public isExpandedInitially!: boolean; //Applies an appropriate class with a fixed width to prevent its initial transition\r\n public isOverflowScroll!: boolean;\r\n public mouseOverString: string = ''; //Keeps the collapsed menu open\r\n private _activeURL: string = ''; //Keeps track of which item is active to scroll to it if it is ouside of the view\r\n private readonly _openedMenus: number[] = [];\r\n private readonly _menuHeight = new Map;\r\n private _overflowTimer?: number;\r\n private _scrollTimer?: number;\r\n private _menuItemSubscription?: Subscription;\r\n private readonly _resizeObserver: ResizeObserver;\r\n\r\n @ViewChildren('menuItem')\r\n private _menuItem!: QueryList; \r\n @ViewChildren('activeLinkItem')\r\n private _activeLinkItem!: QueryList;\r\n @ViewChild('parentElement', { static: true }) \r\n private _parentElement!: ElementRef;\r\n @ViewChild('collapsedMenu') \r\n private _collapsedMenu: ElementRef = {} as ElementRef;\r\n @ViewChildren('collapsedMenuActiveLink') \r\n private _collapsedMenuActiveLink?: QueryList;\r\n\r\n public homeUrl!: string;\r\n\r\n constructor(\r\n private navSidebarMenuService: NavSidebarMenuService,\r\n private _homeUrlService: HomeUrlService,\r\n private _navSidebarExpandedService: NavSidebarExpandedService,\r\n private _router: Router\r\n ) {\r\n _navSidebarExpandedService.toggled.subscribe(expanded => this.isNavSidebarExpanded = expanded);\r\n\r\n this._resizeObserver = new ResizeObserver(entries => {\r\n const target = entries[0].target;\r\n const scrollHeight = target.scrollHeight;\r\n const clientHeight = target.clientHeight;\r\n \r\n if(scrollHeight > clientHeight) {\r\n if(!target.classList.contains('nav-sidebar-scroll-track')){\r\n target.classList.add('nav-sidebar-scroll-track');\r\n }\r\n }\r\n else {\r\n if(target.classList.contains('nav-sidebar-scroll-track')){\r\n target.classList.remove('nav-sidebar-scroll-track');\r\n }\r\n }\r\n });\r\n }\r\n\r\n public ngOnInit(): void {\r\n this._homeUrlService.urlChanged.subscribe(x => this.homeUrl = x);\r\n this.isExpandedInitially = this.isNavSidebarExpanded;\r\n this.isOverflowScroll = this.isNavSidebarExpanded;\r\n this.updateMenus();\r\n }\r\n\r\n public ngAfterViewInit(): void {\r\n this.observeResize(this._parentElement.nativeElement, false);\r\n //scroll on refresh\r\n this._activeLinkItem.forEach((item: ElementRef) => {\r\n this.scrollToItem(item, this._parentElement);\r\n });\r\n }\r\n\r\n public onCollapseButtonClick(): void {\r\n this._navSidebarExpandedService.toggleExpanded();\r\n clearTimeout(this._overflowTimer);\r\n clearTimeout(this._scrollTimer);\r\n\r\n this._overflowTimer = setTimeout(() => {\r\n this.isOverflowScroll= !this.isOverflowScroll;\r\n }, 200);\r\n\r\n if(this.isNavSidebarExpanded) {\r\n this._scrollTimer = setTimeout(() => {\r\n this._activeLinkItem.forEach((item: ElementRef) => {\r\n this.scrollToItem(item, this._parentElement);\r\n })\r\n }, 300);\r\n }\r\n }\r\n\r\n private updateMenus(): void {\r\n this._menuItemSubscription = this.navSidebarMenuService.getMenus().subscribe(x => {\r\n this.model = {\r\n menus: x,\r\n activeMenu: this.getActiveMenu(x)\r\n };\r\n\r\n if(this._activeLinkItem) {\r\n this._activeLinkItem.changes.subscribe(menuItem => {\r\n menuItem.forEach((item: ElementRef) => {\r\n this.scrollToItem(item, this._parentElement);\r\n });\r\n });\r\n }\r\n });\r\n }\r\n\r\n private getActiveMenu(menus: NavSidebarMenu[]): NavSidebarMenu | undefined {\r\n let activeMenu: NavSidebarMenu | undefined;\r\n let totalMenus = 0;\r\n let found = false;\r\n let index = 0;\r\n\r\n for (let menu of menus) {\r\n if(menu.groupedMenus){\r\n for(let groupedMenu of menu.groupedMenus){\r\n totalMenus += groupedMenu.menuItems.length + 1;\r\n if(groupedMenu.menuItems && groupedMenu.menuItems.some(x => this._router.isActive(x.url, false)) && !found) {\r\n found = true;\r\n activeMenu = menu;\r\n for(let menuItem of groupedMenu.menuItems) {\r\n if(this._router.isActive(menuItem.url, false)){\r\n this._activeURL = menuItem.url;\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n if (menu.menuItems && menu.menuItems.some(x => this._router.isActive(x.url, false))) {\r\n totalMenus = menu.menuItems.length;\r\n found = true;\r\n activeMenu = menu;\r\n for(let menuItem of menu.menuItems) {\r\n if(this._router.isActive(menuItem.url, false)){\r\n this._activeURL = menuItem.url;\r\n break;\r\n }\r\n }\r\n }\r\n\r\n if(found) {\r\n this._openedMenus.push(index);\r\n this._menuHeight.set(index, `${totalMenus * 50}px`);\r\n break;\r\n }\r\n \r\n index++;\r\n totalMenus = 0;\r\n }\r\n\r\n return activeMenu;\r\n }\r\n\r\n private scrollToItem(item: ElementRef, container: ElementRef): void {\r\n const pathname = decodeURIComponent(new URL(item.nativeElement.href).pathname);\r\n\r\n if(this._activeURL === pathname) {\r\n const itemDistanceFromTop = item.nativeElement.getBoundingClientRect().top;\r\n const containerDistanceFromTop = container.nativeElement.getBoundingClientRect().top;\r\n const diff = itemDistanceFromTop - containerDistanceFromTop;\r\n const containerHeight = container.nativeElement.clientHeight;\r\n\r\n if(this.isNavSidebarExpanded && itemDistanceFromTop > containerHeight) {\r\n container.nativeElement.scroll({\r\n top: itemDistanceFromTop - containerHeight/2,\r\n behavior: 'smooth'\r\n })\r\n }\r\n else if(!this.isNavSidebarExpanded && diff > containerHeight) {\r\n container.nativeElement.scroll({\r\n top: diff - containerHeight/2,\r\n behavior: 'smooth'\r\n })\r\n }\r\n }\r\n }\r\n\r\n public expand(index: number): void {\r\n const indexOfMenu = this._openedMenus.indexOf(index);\r\n const height = this._menuItem.toArray()[index].nativeElement.scrollHeight;\r\n\r\n if(indexOfMenu === -1) {\r\n this._openedMenus.push(index);\r\n this._menuHeight.set(index, `${height}px`);\r\n return;\r\n }\r\n\r\n this._openedMenus.splice(indexOfMenu, 1);\r\n this._menuHeight.delete(index);\r\n }\r\n\r\n public isMenuOpen(index: number): boolean {\r\n return this._openedMenus.includes(index);\r\n }\r\n\r\n public getHeight(index: number): string | undefined {\r\n return this._menuHeight.get(index);\r\n }\r\n\r\n public setMouseOver(mouseOver: string) :void {\r\n this.mouseOverString = mouseOver;\r\n\r\n this._scrollTimer = setTimeout(() => {\r\n this._collapsedMenuActiveLink!.forEach((item: ElementRef) => {\r\n this.scrollToItem(item, this._collapsedMenu);\r\n });\r\n }, 300);\r\n }\r\n\r\n public setMouseLeave(): void {\r\n this.mouseOverString = '';\r\n\r\n clearTimeout(this._scrollTimer);\r\n if(this._collapsedMenu) {\r\n this.observeResize(this._collapsedMenu.nativeElement, true);\r\n }\r\n }\r\n\r\n public changeScrollbar():void {\r\n if(this._collapsedMenu) {\r\n this.observeResize(this._collapsedMenu.nativeElement, false);\r\n }\r\n }\r\n\r\n private observeResize(element: HTMLElement, unobserve: boolean): void{\r\n if(unobserve) {\r\n this._resizeObserver.unobserve(element);\r\n return;\r\n }\r\n\r\n this._resizeObserver.observe(element);\r\n }\r\n\r\n public ngOnDestroy(): void {\r\n if(this._menuItemSubscription){\r\n this._menuItemSubscription.unsubscribe();\r\n }\r\n clearInterval(this._overflowTimer);\r\n clearTimeout(this._scrollTimer);\r\n this._resizeObserver.disconnect();\r\n }\r\n}","
\r\n 1\" class=\"nav-client-picker-ctr app-client-picker-form-field\">\r\n \r\n \r\n 1\">NONE\r\n \r\n {{ client.clientName }}\r\n \r\n \r\n \r\n
\r\n {{clients[0].clientName}}\r\n
\r\n
","import { Component, OnInit } from '@angular/core';\r\nimport { ClientsModel } from '@modules/api/clients-model.generated';\r\nimport { FormBuilder, FormGroup } from '@angular/forms';\r\nimport { CurrentCaseService } from '@modules/common/services/current-case.service';\r\nimport { CachedCaseListService } from '@modules/common/services/cached-case-list.service';\r\n\r\n@Component({\r\n selector: 'app-nav-client-picker',\r\n templateUrl: './nav-client-picker.component.html',\r\n styleUrls: ['./nav-client-picker.component.scss']\r\n})\r\nexport class NavClientPickerComponent implements OnInit {\r\n public clients?: ClientsModel[];\r\n public selectedClientName!: string;\r\n public form!: FormGroup;\r\n\r\n constructor(\r\n private _cachedCaseListService: CachedCaseListService,\r\n private _formBuilder: FormBuilder,\r\n private _currentCaseService: CurrentCaseService\r\n ) { }\r\n\r\n public ngOnInit(): void {\r\n this.form = this._formBuilder.group({\r\n clientName: [this._currentCaseService.getCurrentCaseName() || ''],\r\n });\r\n\r\n this.form.valueChanges.subscribe(() => {\r\n this._currentCaseService.setCurrentCase(this.form.get('clientName')!.value);\r\n })\r\n\r\n this._cachedCaseListService.cachedCaseListChanged.subscribe(result => {\r\n this.clients = result;\r\n if (this.clients && this.clients.length == 1 && this.clients[0].clientCode != this._currentCaseService.getCurrentCaseName()) {\r\n this._currentCaseService.setCurrentCase(this.clients[0].clientCode || '');\r\n } else if (this._currentCaseService.getCurrentCaseName() && !this.clients.some(x => x.clientCode == this._currentCaseService.getCurrentCaseName())) {\r\n this._currentCaseService.setCurrentCase('');\r\n }\r\n });\r\n }\r\n}","\r\nimport {filter} from 'rxjs/operators';\r\nimport { Component } from '@angular/core';\r\nimport { Router, NavigationEnd } from '@angular/router';\r\n\r\n\r\n@Component({\r\n selector: 'app-nav-new-tab',\r\n templateUrl: './nav-new-tab.component.html',\r\n styleUrls: ['./nav-new-tab.component.scss']\r\n})\r\nexport class NavNewTabComponent {\r\n constructor(router: Router) {\r\n router.events.pipe(\r\n filter(e => e instanceof NavigationEnd))\r\n .subscribe(e => {\r\n this.currentUrl = decodeURI((e).url);\r\n });\r\n }\r\n\r\n public currentUrl?: string;\r\n}\r\n","\r\n \r\n NEW\r\n","
1\">\r\n \r\n \r\n \r\n \r\n
\r\n","import { Component, OnInit } from '@angular/core';\r\nimport { CurrentEnvironmentService } from '@modules/common/services/current-environment.service';\r\nimport { EnvironmentListService } from '@modules/common/services/environment-list.service';\r\nimport { EnvironmentModel } from '@modules/common/models/environment-model';\r\n\r\n@Component({\r\n selector: 'app-nav-env-picker',\r\n templateUrl: './nav-env-picker.component.html',\r\n styleUrls: ['./nav-env-picker.component.scss']\r\n})\r\nexport class NavEnvPickerComponent implements OnInit {\r\n public environments?: EnvironmentModel[];\r\n public selectedEnvironment?: EnvironmentModel;\r\n\r\n constructor(\r\n private _environmentListService: EnvironmentListService,\r\n private _currentEnvironmentService: CurrentEnvironmentService\r\n ) { }\r\n\r\n public ngOnInit(): void {\r\n this._environmentListService.environmentListChanged.subscribe(result => {\r\n this.environments = result;\r\n\r\n if (this._currentEnvironmentService.getCurrentEnvironmentName()) {\r\n this.selectedEnvironment = this.environments.filter(x => x.name!.toLowerCase() == this._currentEnvironmentService.getCurrentEnvironmentName().toLowerCase())[0];\r\n if (this.selectedEnvironment && this.selectedEnvironment.name != this._currentEnvironmentService.getCurrentEnvironmentName()) {\r\n this.selectEnvironment(this.selectedEnvironment);\r\n }\r\n }\r\n\r\n if (!this.selectedEnvironment || !this.environments.some(x =>x.name!.toLowerCase() == this.selectedEnvironment!.name!.toLowerCase())) {\r\n this.selectedEnvironment = undefined;\r\n if (this.environments.length) {\r\n this.selectEnvironment(this.environments[0]);\r\n }\r\n }\r\n });\r\n }\r\n\r\n public selectEnvironment(environment?: EnvironmentModel): void {\r\n this._currentEnvironmentService.setCurrentEnvironment(environment && environment.name);\r\n this.selectedEnvironment = environment;\r\n }\r\n}","
\r\n
\r\n \r\n {{environmentMessage}}\r\n
\r\n
","import { Component } from '@angular/core';\r\nimport { CurrentEnvironmentService } from '@modules/common/services/current-environment.service';\r\nimport { EnvironmentListService } from '@modules/common/services/environment-list.service';\r\n\r\n@Component({\r\n selector: 'app-nav-env-message',\r\n templateUrl: './nav-env-message.component.html',\r\n styleUrls: ['./nav-env-message.component.scss']\r\n})\r\nexport class NavEnvMessageComponent {\r\n public environmentMessage?: string;\r\n\r\n constructor(\r\n private _environmentListService: EnvironmentListService,\r\n private _currentEnvironmentService: CurrentEnvironmentService\r\n ) {\r\n this._environmentListService.environmentListChanged.subscribe(() => this.updateEnvironmentMessage());\r\n this._currentEnvironmentService.environmentChanged.subscribe(() => this.updateEnvironmentMessage());\r\n }\r\n\r\n private updateEnvironmentMessage(): void {\r\n this.environmentMessage = undefined;\r\n const environmentName = this._currentEnvironmentService.getCurrentEnvironmentName();\r\n if (environmentName) {\r\n const environment = this._environmentListService.getEnvironmentList().filter(x => x.name.toLowerCase() == environmentName.toLowerCase())[0];\r\n\r\n if (environment && !environment.isDefault) {\r\n this.environmentMessage = environment.description;\r\n }\r\n }\r\n }\r\n}","import { Component } from \"@angular/core\";\r\nimport { CurrentPhoneCallService } from \"@modules/participant-shared/services/current-phone-call.service\";\r\nimport { map, Observable } from \"rxjs\";\r\n\r\n/**\r\n * Banner to show that the user is currently in a phone call.\r\n * The user can be considered to be in a phone call if they arrive at Stingray from Five9.\r\n */\r\n@Component({\r\n selector: 'app-nav-phone-call-banner',\r\n templateUrl: './nav-phone-call-banner.component.html',\r\n styleUrls: ['./nav-phone-call-banner.component.scss']\r\n})\r\nexport class NavPhoneCallBannerComponent {\r\n public readonly participantName: Observable;\r\n public readonly employeeId: Observable;\r\n\r\n constructor(currentPhoneCallService: CurrentPhoneCallService) {\r\n this.participantName = currentPhoneCallService.currentPhoneCallChanged()\r\n .pipe(map(phoneCall => phoneCall?.participantName));\r\n this.employeeId = currentPhoneCallService.currentPhoneCallChanged()\r\n .pipe(map(phoneCall => phoneCall?.employeeId));\r\n }\r\n}","
\r\n
\r\n \r\n
\r\n
\r\n ACTIVE PHONE CALL - \r\n
\r\n
\r\n {{participantName | async}} {{employeeId | async}}\r\n
\r\n
","\r\n
\r\n \r\n
\r\n
\r\n \r\n \r\n \r\n
\r\n
\r\n \r\n \r\n \r\n \r\n
\r\n
\r\n
\r\n","import { Component, OnDestroy, OnInit } from '@angular/core';\r\nimport { CurrentAdminPortalConfigService } from '@modules/common/services/current-admin-portal-config.service';\r\nimport { CurrentCaseService } from '@modules/common/services/current-case.service';\r\nimport { CustomRouteData } from '@modules/common/models/custom-route-data';\r\nimport { CurrentRouteService } from '@modules/common/services/current-route.service';\r\nimport { NavSidebarExpandedService } from '@modules/navigation/services/nav-sidebar-expanded.service';\r\nimport { CurrentPhoneCallService } from '@modules/participant-shared/services/current-phone-call.service';\r\nimport { map, Observable, Subscription } from 'rxjs';\r\n\r\n@Component({\r\n selector: 'app-nav-layout',\r\n templateUrl: './nav-layout.component.html',\r\n styleUrls: ['./nav-layout.component.scss']\r\n})\r\nexport class NavLayoutComponent implements OnInit, OnDestroy {\r\n public readonly showPhoneCallBanner: Observable;\r\n\r\n public isNavSidebarExpanded = true;\r\n public clientPickerCtrStyle: any = {};\r\n public requiresCaseSelection?: boolean;\r\n public currentCaseName!: string;\r\n\r\n private readonly _subscriptions: Subscription[] = [];\r\n\r\n constructor(\r\n private readonly _currentAdminPortalConfigService: CurrentAdminPortalConfigService,\r\n private readonly _currentCaseService: CurrentCaseService,\r\n private readonly _currentRouteService: CurrentRouteService,\r\n navSidebarExpandedService: NavSidebarExpandedService,\r\n currentPhoneCallService: CurrentPhoneCallService,\r\n ) {\r\n const navSidebarToggleSubscription = navSidebarExpandedService.toggled.subscribe(expanded => this.isNavSidebarExpanded = expanded);\r\n this._subscriptions.push(navSidebarToggleSubscription);\r\n\r\n this.showPhoneCallBanner = currentPhoneCallService.currentPhoneCallChanged()\r\n .pipe(map(phoneCall => !!phoneCall));\r\n }\r\n\r\n public ngOnInit(): void {\r\n this.currentCaseName = this._currentCaseService.getCurrentCaseName();\r\n const customRouteData = this._currentRouteService.getCurrentRoute().data as CustomRouteData | undefined;\r\n if (customRouteData) {\r\n this.requiresCaseSelection = !!customRouteData.requiresCaseSelection;\r\n }\r\n const adminPortalConfigChangedSubscription = this._currentAdminPortalConfigService.configChanged.subscribe(result => {\r\n if (result && result.headingColor && result.headingColor.length) {\r\n this.clientPickerCtrStyle['background-color'] = '#' + result.headingColor;\r\n } else if (this.clientPickerCtrStyle.hasOwnProperty('background-color')) {\r\n delete this.clientPickerCtrStyle['background-color'];\r\n }\r\n });\r\n this._subscriptions.push(adminPortalConfigChangedSubscription);\r\n }\r\n\r\n public ngOnDestroy(): void {\r\n for (let subscription of this._subscriptions) {\r\n subscription.unsubscribe();\r\n }\r\n }\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { ActivatedRouteSnapshot, CanActivate, CanActivateChild, Router } from '@angular/router';\r\nimport { CustomRouteData } from '@modules/common/models/custom-route-data';\r\nimport { AuthenticationTokenService } from '@modules/common/services/authentication-token.service';\r\nimport { PermissionService } from '@modules/common/services/permission.service';\r\nimport { RedirectToLoginService } from '@modules/common/services/redirect-to-login.service';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class RouteGuardService implements CanActivate, CanActivateChild {\r\n constructor(\r\n private _authenticationTokenService: AuthenticationTokenService,\r\n private _redirectToLoginService: RedirectToLoginService,\r\n private _permissionService: PermissionService,\r\n private _router: Router\r\n ) { }\r\n\r\n public canActivate(route: ActivatedRouteSnapshot): boolean {\r\n if (!this._authenticationTokenService.hasValidAuthenticationToken()) {\r\n this._redirectToLoginService.redirectToLogin(route);\r\n return false;\r\n }\r\n\r\n const customRouteData = route.data as CustomRouteData | undefined;\r\n if (customRouteData && customRouteData.requiredPermissions && customRouteData.requiredPermissions.length && !customRouteData.requiredPermissions.some(x => this._permissionService.verifyPermission(x))) {\r\n this._router.navigate(['/']);\r\n return false;\r\n }\r\n\r\n return true;\r\n }\r\n\r\n public canActivateChild(route: ActivatedRouteSnapshot): boolean {\r\n return this.canActivate(route);\r\n }\r\n}\r\n","import { LoadChildren, Route } from '@angular/router';\r\nimport { NotFoundComponent } from '@modules/common/components/not-found/not-found.component';\r\nimport { NavLayoutComponent } from '@modules/navigation/components/nav-layout/nav-layout.component';\r\nimport { RouteGuardService } from '@modules/routing/services/route-guard.service';\r\n\r\nfunction getRoutesWithEnvironmentAndClient(baseUrlSegment: string, loadChildren: LoadChildren) : Route[] {\r\n return [\r\n baseUrlSegment,\r\n ':environment/' + baseUrlSegment,\r\n ':environment/:clientName/' + baseUrlSegment\r\n ].map(path => ({\r\n path: path,\r\n loadChildren: loadChildren\r\n }));\r\n}\r\n\r\nexport const ROUTES: Route[] = [\r\n {\r\n path: '',\r\n pathMatch: 'full',\r\n redirectTo: 'Dashboards'\r\n },\r\n {\r\n path: 'Login',\r\n loadChildren: () => import('@modules/login/login.module').then(x => x.LoginModule)\r\n },\r\n {\r\n path: ':clientName/Login',\r\n loadChildren: () => import('@modules/login/login.module').then(x => x.LoginModule)\r\n },\r\n {\r\n path: '',\r\n component: NavLayoutComponent,\r\n canActivate: [RouteGuardService],\r\n canActivateChild: [RouteGuardService],\r\n children: getRoutesWithEnvironmentAndClient('Participant', () => import('@modules/participant/participant.module').then(x => x.ParticipantModule))\r\n .concat(getRoutesWithEnvironmentAndClient('PortalConfig', () => import('@modules/portal-config/portal-config.module').then(x => x.PortalConfigModule)))\r\n .concat(getRoutesWithEnvironmentAndClient('TitaniaNavigation', () => import('@modules/titania-navigation/titania-navigation.module').then(x => x.TitaniaNavigationModule)))\r\n .concat(getRoutesWithEnvironmentAndClient('Reporting', () => import('@modules/reporting/reporting.module').then(x => x.ReportingModule)))\r\n .concat(getRoutesWithEnvironmentAndClient('Analytics', () => import('@modules/power-bi/power-bi.module').then(x => x.PowerBIModule)))\r\n .concat(getRoutesWithEnvironmentAndClient('Users', () => import('@modules/users/users.module').then(x => x.UsersModule)))\r\n .concat(getRoutesWithEnvironmentAndClient('ExpressionRules', () => import('@modules/expression-rules/expression-rules.module').then(x => x.ExpressionRulesModule)))\r\n .concat(getRoutesWithEnvironmentAndClient('Permissions', () => import('@modules/permissions/permissions.module').then(x => x.PermissionsModule)))\r\n .concat(getRoutesWithEnvironmentAndClient('AdminPortalConfig', () => import('@modules/admin-portal-config/admin-portal-config.module').then(x => x.AdminPortalConfigModule)))\r\n .concat(getRoutesWithEnvironmentAndClient('Environments', () => import('@modules/environments/environments.module').then(x => x.EnvironmentsModule)))\r\n .concat(getRoutesWithEnvironmentAndClient('PublishingCenter', () => import('@modules/publishing/publishing.module').then(x => x.PublishingModule)))\r\n .concat(getRoutesWithEnvironmentAndClient('Dashboards', () => import('@modules/dashboard/dashboard.module').then(x => x.DashboardModule)))\r\n .concat(getRoutesWithEnvironmentAndClient('DataRefresh', () => import('@modules/data-refresh/data-refresh.module').then(x => x.DataRefreshModule)))\r\n .concat(getRoutesWithEnvironmentAndClient('Census', () => import('@modules/census-config/census-config.module').then(x => x.CensusConfigModule)))\r\n .concat(getRoutesWithEnvironmentAndClient('CasePlanGroups', () => import('@modules/case-plan-groups/case-plan-groups.module').then(x => x.CasePlanGroupsModule)))\r\n .concat(getRoutesWithEnvironmentAndClient('ApplicationQuestions', () => import('@modules/application-questions/application-questions.module').then(x => x.ApplicationQuestionsModule)))\r\n .concat(getRoutesWithEnvironmentAndClient('BenefitPlanDocuments', () => import('@modules/case-plan-attachments/case-plan-attachments.module').then(x => x.CasePlanAttachmentsModule)))\r\n .concat(getRoutesWithEnvironmentAndClient('EligibilityWindows', () => import('@modules/eligibility-windows/eligibility-windows.module').then(x => x.EligibilityWindowsModule)))\r\n .concat(getRoutesWithEnvironmentAndClient('EnrollmentBuilder', () => import('@modules/enrollment-builder/enrollment-builder.module').then(x => x.EnrollmentBuilderModule)))\r\n .concat(getRoutesWithEnvironmentAndClient('CaseConfig/GlobalCreditConfiguration', () => import('@modules/global-credit-configuration/global-credit-configuration.module').then(x => x.GlobalCreditConfigurationModule)))\r\n .concat(getRoutesWithEnvironmentAndClient('DashboardConfiguration', () => import('@modules/dashboard-configuration/dashboard-configuration.module').then(x => x.DashboardConfigurationModule)))\r\n .concat(getRoutesWithEnvironmentAndClient('Rollover', () => import('@modules/rollover/rollover.module').then(x => x.RolloverModule)))\r\n .concat(getRoutesWithEnvironmentAndClient('InstructionCaseConfig', () => import('@modules/instruction-case-config/instruction-case-config.module').then(x => x.InstructionCaseConfigModule)))\r\n .concat(getRoutesWithEnvironmentAndClient('InstructionFileSetup', () => import('@modules/instruction-file-setup/instruction-file-setup.module').then(x => x.InstructionFileSetupModule)))\r\n .concat(getRoutesWithEnvironmentAndClient('RemittanceFileDefinitionGroups', () => import('@modules/remittance-file-definition-group/remittance-file-definition-group.module').then(x => x.RemittanceFileDefinitionGroupModule)))\r\n .concat(getRoutesWithEnvironmentAndClient('RemittanceCaseFileDefinitionGroups', () => import('@modules/remittance-case-file-definition-group/remittance-case-file-definition-group.module').then(x => x.RemittanceCaseFileDefinitionGroupModule)))\r\n .concat(getRoutesWithEnvironmentAndClient('Files', () => import('@modules/files/files.module').then(x => x.FilesModule)))\r\n .concat(getRoutesWithEnvironmentAndClient('DeductionCodes', () => import('@modules/deduction-codes/deduction-codes.module').then(x => x.DeductionCodesModule)))\r\n .concat(getRoutesWithEnvironmentAndClient('Administration/ParticipantTransactions', () => import('@modules/participant-transactions/participant-transactions.module').then(x => x.ParticipantTransactionsModule)))\r\n .concat(getRoutesWithEnvironmentAndClient('DependentVerification', () => import('@modules/dependent-verification/dependent-verification.module').then(x => x.DependentVerificationModule)))\r\n .concat(getRoutesWithEnvironmentAndClient('DependentVerificationRules', () => import('@modules/dependent-verification-rules/dependent-verification-rules.module').then(x => x.DependentVerificationRulesModule)))\r\n .concat(getRoutesWithEnvironmentAndClient('CensusReports', () => import('@modules/census-reports/census-reports.module').then(x => x.CensusReportsModule)))\r\n .concat(getRoutesWithEnvironmentAndClient('IssueTracker', () => import('@modules/issue-tracker/issue-tracker.module').then(x => x.IssueTrackerModule)))\r\n .concat(getRoutesWithEnvironmentAndClient('AutoCommitCancelTransaction', () => import('@modules/auto-commit-cancel-transaction/auto-commit-cancel-transaction.module').then(x => x.AutoCommitCancelTransactionModule)))\r\n .concat(getRoutesWithEnvironmentAndClient('DataIntegrity', () => import('@modules/data-integrity/data-integrity.module').then(x => x.DataIntegrityModule)))\r\n .concat(getRoutesWithEnvironmentAndClient('TierStructure/Global', () => import('@modules/tier-structure-global/tier-structure-global.module').then(x => x.TierStructureGlobalModule)))\r\n .concat(getRoutesWithEnvironmentAndClient('TierStructure/CaseLevel', () => import('@modules/tier-structure-case-level/tier-structure-case-level.module').then(x => x.TierStructureCaseLevelModule)))\r\n .concat(getRoutesWithEnvironmentAndClient('PaymentFileConfiguration', () => import('@modules/payment-file-configuration/payment-file-configuration.module').then(x => x.PaymentFileConfigurationModule)))\r\n .concat(getRoutesWithEnvironmentAndClient('CaseSSOServiceProviders', () => import('@modules/case-sso-service-providers/case-sso-service-providers.module').then(x => x.CaseSSOServiceProvidersModule)))\r\n .concat(getRoutesWithEnvironmentAndClient('CaseSSO', () => import('@modules/case-sso/case-sso.module').then(x => x.CaseSSOModule)))\r\n .concat(getRoutesWithEnvironmentAndClient('VideoConfiguration', () => import('@modules/video-config/video-config.module').then(x => x.VideoConfigModule)))\r\n .concat(getRoutesWithEnvironmentAndClient('WEX', () => import('@modules/wex-sso/wex-sso.module').then(x => x.WexSSOModule)))\r\n },\r\n //The following paths must stay at the end of this list,\r\n //so they do not take priority over other paths.\r\n {\r\n path: ':environment',\r\n pathMatch: 'full',\r\n redirectTo: ':environment/Dashboards'\r\n },\r\n {\r\n path: ':environment/:clientName',\r\n pathMatch: 'full',\r\n redirectTo: ':environment/:clientName/Dashboards'\r\n },\r\n {\r\n path: '**',\r\n component: NotFoundComponent,\r\n title: '404 Error - Page Not Found'\r\n }\r\n];\r\n","import { Injectable } from \"@angular/core\";\r\nimport { ActivatedRouteSnapshot, RouteReuseStrategy } from \"@angular/router\";\r\nimport { CustomRouteData } from \"@modules/common/models/custom-route-data\";\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class StingrayRouteReuseStrategy implements RouteReuseStrategy {\r\n shouldDetach(route: ActivatedRouteSnapshot): boolean {\r\n return false;\r\n }\r\n\r\n store(route: ActivatedRouteSnapshot, handle: {} | null): void {\r\n }\r\n\r\n shouldAttach(route: ActivatedRouteSnapshot): boolean {\r\n return false;\r\n }\r\n\r\n retrieve(route: ActivatedRouteSnapshot): {} | null {\r\n return null;\r\n }\r\n\r\n shouldReuseRoute(future: ActivatedRouteSnapshot, curr: ActivatedRouteSnapshot): boolean {\r\n while (future.firstChild) {\r\n future = future.firstChild;\r\n }\r\n\r\n while (curr.firstChild) {\r\n curr = curr.firstChild;\r\n }\r\n\r\n if (future.routeConfig?.data && curr.routeConfig && future.routeConfig.data == curr.routeConfig.data) {\r\n const nonReuseProperties = (future.routeConfig.data).allowRouteReuse;\r\n if (nonReuseProperties) {\r\n for (let i = 0; i < nonReuseProperties.length; i++) {\r\n if (curr.params[nonReuseProperties[i]] != 'NEW-RECORD' && future.params[nonReuseProperties[i]] != curr.params[nonReuseProperties[i]]) {\r\n break;\r\n }\r\n }\r\n return true;\r\n }\r\n }\r\n\r\n window.scroll(0, 0);\r\n return false;\r\n }\r\n}\r\n","import { CommonModule } from '@angular/common';\r\nimport { NgModule } from '@angular/core';\r\nimport { RouteReuseStrategy, RouterModule } from '@angular/router';\r\nimport { StingrayCommonModule } from '@modules/common/common.module';\r\nimport { NavigationModule } from '@modules/navigation/navigation.module';\r\nimport { ROUTES } from '@modules/routing/routes';\r\nimport { StingrayRouteReuseStrategy } from '@modules/routing/services/stingray-route-reuse-strategy';\r\n\r\n@NgModule({\r\n declarations: [\r\n ],\r\n imports: [\r\n CommonModule,\r\n StingrayCommonModule,\r\n NavigationModule,\r\n RouterModule.forRoot(ROUTES)\r\n ],\r\n providers: [\r\n {\r\n provide: RouteReuseStrategy,\r\n useClass: StingrayRouteReuseStrategy\r\n }\r\n ]\r\n})\r\nexport class StingrayRoutingModule {\r\n}\r\n","import { Component, Inject, OnDestroy, OnInit, ViewChild } from '@angular/core';\r\nimport { MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog';\r\nimport { CountdownComponent } from '@modules/common/components/countdown/countdown.component';\r\nimport { SessionExpirationDialogArgs } from '@modules/common/models/session-expiration-dialog-args';\r\nimport { SessionExpirationDialogResult } from '@modules/common/models/session-expiration-dialog-result';\r\nimport { UserSessionService } from '@modules/common/services/user-session.service';\r\nimport { Subscription } from 'rxjs';\r\n\r\n@Component({\r\n selector: 'app-session-expiration-dialog',\r\n templateUrl: './session-expiration-dialog.component.html',\r\n styleUrls: ['./session-expiration-dialog.component.scss']\r\n})\r\nexport class SessionExpirationDialogComponent implements OnInit, OnDestroy {\r\n @ViewChild(CountdownComponent, { static: true })\r\n public countdownComponent!: CountdownComponent;\r\n\r\n private _userSessionChangedSubscription?: Subscription;\r\n\r\n constructor(\r\n private _dialogRef: MatDialogRef,\r\n @Inject(MAT_DIALOG_DATA) private _args: SessionExpirationDialogArgs,\r\n private _userSessionService: UserSessionService\r\n ) {}\r\n\r\n public ngOnInit(): void {\r\n this.countdownComponent.countdownTo(this._args.expirationDate);\r\n this._userSessionChangedSubscription = this._userSessionService.userSessionChanged().subscribe(result => {\r\n if (result && result.authenticationToken && result.authenticationToken!.token != this._args.token) {\r\n this._dialogRef.close();\r\n }\r\n })\r\n }\r\n\r\n public ngOnDestroy(): void {\r\n if (this._userSessionChangedSubscription) {\r\n this._userSessionChangedSubscription.unsubscribe();\r\n }\r\n }\r\n\r\n public signOut() {\r\n this._dialogRef.close({\r\n action: 'signOut',\r\n clearRedirectedFromUrl: true\r\n });\r\n }\r\n\r\n public refreshSession() {\r\n this._dialogRef.close({\r\n action: 'refresh'\r\n });\r\n }\r\n\r\n public expire() {\r\n this._dialogRef.close({\r\n action: 'signOut',\r\n clearRedirectedFromUrl: false\r\n });\r\n }\r\n}\r\n","\r\n
\r\n
\r\n

Session Expiration

\r\n
\r\n
\r\n

Your session is about to expire. Would you like to stay logged in?

\r\n
\r\n \r\n
\r\n
\r\n \r\n \r\n
\r\n
\r\n
\r\n
\r\n","import { Injectable } from \"@angular/core\";\r\nimport { MatDialog } from \"@angular/material/dialog\";\r\nimport { UserSession } from \"@modules/api/user-session.generated\";\r\nimport { SessionExpirationDialogComponent } from \"@modules/common/components/session-expiration-dialog/session-expiration-dialog.component\";\r\nimport { SessionExpirationDialogArgs } from \"@modules/common/models/session-expiration-dialog-args\";\r\nimport { SessionExpirationDialogResult } from '@modules/common/models/session-expiration-dialog-result';\r\nimport { LogoutService } from \"@modules/common/services/logout.service\";\r\nimport { RefreshSessionService } from \"@modules/common/services/refresh-session.service\";\r\nimport { UserSessionService } from '@modules/common/services/user-session.service';\r\nimport * as moment from 'moment';\r\n\r\nconst SHOW_MODAL_THRESHHOLD = 180; //number of seconds before session expires to show the modal\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class UserSessionTimeoutService {\r\n constructor(\r\n private _userSessionService: UserSessionService,\r\n private _dialog: MatDialog,\r\n private _refreshSessionService: RefreshSessionService,\r\n private _logoutService: LogoutService\r\n ) { }\r\n\r\n public initialize() {\r\n this._userSessionService.userSessionChanged().subscribe(result => {\r\n if (this._sessionExpirationTimeout) {\r\n clearTimeout(this._sessionExpirationTimeout);\r\n }\r\n if (result && result.authenticationToken) {\r\n this.setSessionTimeout(moment.utc(this._userSessionService.getUserSession()!.authenticationToken!.expiresAt).diff(moment.utc(), 'seconds') - SHOW_MODAL_THRESHHOLD);\r\n }\r\n });\r\n }\r\n\r\n private _sessionExpirationTimeout?: number;\r\n\r\n\r\n private setSessionTimeout(timeoutDuration: number) {\r\n this._sessionExpirationTimeout = window.setTimeout(() => {\r\n const session = this._userSessionService.getUserSession();\r\n\r\n if (session\r\n && session.authenticationToken\r\n && session.authenticationToken.expiresAt\r\n && moment.utc(session.authenticationToken.expiresAt).diff(moment.utc(), 'seconds') <= SHOW_MODAL_THRESHHOLD + 2 //+2 is just for a little safety if the modal shows early (which should never happen)\r\n ) {\r\n this._dialog.open(SessionExpirationDialogComponent, {\r\n disableClose: true,\r\n data: {\r\n expirationDate: session.authenticationToken.expiresAt,\r\n token: session.authenticationToken.token\r\n }\r\n }).afterClosed().subscribe(result => {\r\n if (result) {\r\n if (result.action == 'signOut') {\r\n this._logoutService.logout(result.clearRedirectedFromUrl);\r\n } else if (result.action == 'refresh') {\r\n this.refreshSession();\r\n }\r\n }\r\n });\r\n }\r\n }, timeoutDuration * 1000);\r\n }\r\n\r\n private refreshSession() {\r\n this._refreshSessionService.refreshSession({\r\n authenticationToken: this._userSessionService.getUserSession()!.authenticationToken!.token!,\r\n refreshToken: this._userSessionService.getUserSession()!.refreshToken!\r\n }).subscribe((result?: UserSession) => {\r\n if (result) {\r\n this._userSessionService.setUserSession(result);\r\n }\r\n });\r\n }\r\n}\r\n","import { Component, OnInit } from '@angular/core';\r\nimport { IsLoadingService } from '@modules/common/services/is-loading.service';\r\n\r\n@Component({\r\n selector: 'app-loading-overlay',\r\n templateUrl: './loading-overlay.component.html',\r\n styleUrls: ['./loading-overlay.component.scss'],\r\n})\r\nexport class LoadingOverlayComponent implements OnInit {\r\n constructor(private _isLoadingService: IsLoadingService) { }\r\n\r\n public ngOnInit(): void {\r\n this._isLoadingService.observable.subscribe(x => {\r\n this.isLoading = x;\r\n });\r\n }\r\n\r\n public isLoading: boolean = false;\r\n}\r\n","
\r\n
","import { DOCUMENT } from '@angular/common';\r\nimport { Component, Inject } from '@angular/core';\r\nimport { MatDialog } from '@angular/material/dialog';\r\nimport { NavigationCancel, NavigationStart, RouteConfigLoadEnd, RouteConfigLoadStart, Router } from '@angular/router';\r\nimport { AppInsightsService } from '@modules/common/services/app-insights.service';\r\nimport { IsLoadingService } from '@modules/common/services/is-loading.service';\r\nimport { UserSessionTimeoutService } from '@modules/common/services/user-session-timeout.service';\r\nimport { filter } from 'rxjs/operators';\r\n\r\n@Component({\r\n selector: 'app-root',\r\n template: ''\r\n})\r\nexport class AppComponent {\r\n constructor(\r\n userSessionTimeoutService: UserSessionTimeoutService,\r\n appInsightsService: AppInsightsService,\r\n isLoadingService: IsLoadingService,\r\n @Inject(DOCUMENT) document: Document,\r\n private router: Router,\r\n private matDialog: MatDialog\r\n ) {\r\n userSessionTimeoutService.initialize();\r\n appInsightsService.initialize();\r\n\r\n this.router.events\r\n .pipe(filter(event => event instanceof NavigationStart))\r\n .subscribe(() => {\r\n this.matDialog.closeAll();\r\n });\r\n\r\n //Show spinner when lazy loading modules from routes\r\n let isLoading = false;\r\n this.router.events\r\n .pipe(filter(event => event instanceof RouteConfigLoadStart))\r\n .subscribe(() => {\r\n isLoading = true;\r\n isLoadingService.setLoading();\r\n });\r\n\r\n //Clear spinner when lazy loading is done\r\n this.router.events\r\n .pipe(filter(event => event instanceof RouteConfigLoadEnd || event instanceof NavigationCancel))\r\n .subscribe(() => {\r\n if (isLoading) {\r\n isLoadingService.clearLoading();\r\n isLoading = false;\r\n }\r\n });\r\n\r\n document.body.addEventListener('dragenter', onDrag);\r\n document.body.addEventListener('dragover', onDrag);\r\n document.body.addEventListener('drop', onDrag);\r\n }\r\n}\r\n\r\nfunction onDrag(e: DragEvent): void {\r\n if (e.dataTransfer) {\r\n e.dataTransfer.dropEffect = 'none';\r\n e.dataTransfer.effectAllowed = 'none';\r\n }\r\n e.preventDefault();\r\n e.stopPropagation();\r\n}\r\n","import { APP_BASE_HREF, CommonModule, CurrencyPipe } from '@angular/common';\r\nimport { HttpClientModule } from '@angular/common/http';\r\nimport { APP_INITIALIZER, ErrorHandler, NgModule } from '@angular/core';\r\nimport { MAT_MOMENT_DATE_FORMATS } from '@angular/material-moment-adapter';\r\nimport { DateAdapter, MAT_DATE_FORMATS } from '@angular/material/core';\r\nimport { MatExpansionPanelDefaultOptions, MAT_EXPANSION_PANEL_DEFAULT_OPTIONS } from '@angular/material/expansion';\r\nimport { MatFormFieldDefaultOptions, MAT_FORM_FIELD_DEFAULT_OPTIONS } from '@angular/material/form-field';\r\nimport { MatPaginatorDefaultOptions, MAT_PAGINATOR_DEFAULT_OPTIONS } from '@angular/material/paginator';\r\nimport { MatTabsConfig, MAT_TABS_CONFIG } from '@angular/material/tabs';\r\nimport { BrowserModule } from '@angular/platform-browser';\r\nimport { BrowserAnimationsModule } from '@angular/platform-browser/animations';\r\nimport { RouterModule } from '@angular/router';\r\nimport { StingrayCommonModule } from '@modules/common/common.module';\r\nimport { ErrorHandlerService } from '@modules/common/services/error-handler.service';\r\nimport { MomentUtcDateAdapter } from '@modules/common/services/moment-utc-date-adapter';\r\nimport { UserSessionService } from '@modules/common/services/user-session.service';\r\nimport { StingrayRoutingModule } from '@modules/routing/routing.module';\r\nimport { DragulaModule } from 'ng2-dragula';\r\nimport { AppComponent } from 'src/app/app.component';\r\n\r\n/**\r\n * Application-wide default options for mat-form-field elements.\r\n */\r\nconst MAT_FORM_FIELD_OPTIONS: MatFormFieldDefaultOptions = {\r\n appearance: 'fill',\r\n floatLabel: 'always'\r\n};\r\n\r\n/**\r\n * Application-wide default options for mat-tab-group elements.\r\n */\r\nconst MAT_TAB_GROUP_OPTIONS: MatTabsConfig = {\r\n animationDuration: '0ms'\r\n};\r\n\r\n/**\r\n * Application-wide default options for mat-paginator elements.\r\n */\r\nconst MAT_PAGINATOR_OPTIONS: MatPaginatorDefaultOptions = {\r\n formFieldAppearance: 'fill'\r\n};\r\n\r\n/**\r\n * Application-wide default options for mat-expansion-panel and related elements.\r\n */\r\nconst MAT_EXPANSION_PANEL_OPTIONS: MatExpansionPanelDefaultOptions = {\r\n hideToggle: true,\r\n collapsedHeight: '',\r\n expandedHeight: ''\r\n};\r\n\r\n@NgModule({\r\n bootstrap: [AppComponent],\r\n declarations: [\r\n AppComponent\r\n ],\r\n imports: [\r\n BrowserModule,\r\n BrowserAnimationsModule,\r\n CommonModule,\r\n HttpClientModule,\r\n RouterModule,\r\n StingrayCommonModule,\r\n StingrayRoutingModule,\r\n DragulaModule.forRoot()\r\n ],\r\n providers: [\r\n { provide: 'BASE_URL', useFactory: getBaseUrl },\r\n { provide: APP_BASE_HREF, useFactory: getBaseHref },\r\n { provide: MAT_DATE_FORMATS, useValue: MAT_MOMENT_DATE_FORMATS },\r\n { provide: DateAdapter, useClass: MomentUtcDateAdapter },\r\n {\r\n provide: APP_INITIALIZER,\r\n useFactory: appInitializer,\r\n multi: true,\r\n deps: [UserSessionService]\r\n },\r\n { provide: ErrorHandler, useClass: ErrorHandlerService },\r\n CurrencyPipe,\r\n { provide: MAT_FORM_FIELD_DEFAULT_OPTIONS, useValue: MAT_FORM_FIELD_OPTIONS },\r\n { provide: MAT_TABS_CONFIG, useValue: MAT_TAB_GROUP_OPTIONS },\r\n { provide: MAT_PAGINATOR_DEFAULT_OPTIONS, useValue: MAT_PAGINATOR_OPTIONS },\r\n { provide: MAT_EXPANSION_PANEL_DEFAULT_OPTIONS, useValue: MAT_EXPANSION_PANEL_OPTIONS }\r\n ]\r\n})\r\nexport class AppModule {\r\n}\r\n\r\nexport function appInitializer(userSessionService: UserSessionService): () => Promise {\r\n return (): Promise => {\r\n return userSessionService.initialize();\r\n };\r\n}\r\n\r\nexport function getBaseUrl() {\r\n return document.getElementsByTagName('base')[0].href;\r\n}\r\n\r\nfunction getBaseHref(): string {\r\n //The actual tag's href property is set by the --base-href option in ng build. That property\r\n //must be set to the CDN because that's where we upload all of the static assets (.js and .css files).\r\n //This function is to return the base used for routing. It has to include the scheme and authority\r\n //of the URL so that it works for both ng serve (development) and ng build (deployed site).\r\n //This functionality used to be provided by the --deploy-url option of ng build, but that property\r\n //was deprecated without a real replacement, so now we have to work around it.\r\n return window.location.origin;\r\n}\r\n","import { enableProdMode } from '@angular/core';\r\nimport { platformBrowserDynamic } from '@angular/platform-browser-dynamic';\r\n\r\nimport { AppModule } from './app/app.module';\r\nimport { environment } from './environments/environment';\r\n\r\nexport function getBaseUrl() {\r\n return document.getElementsByTagName('base')[0].href;\r\n}\r\n\r\nconst providers = [\r\n { provide: 'BASE_URL', useFactory: getBaseUrl, deps: [] }\r\n];\r\n\r\nif (environment.production) {\r\n enableProdMode();\r\n}\r\n\r\nplatformBrowserDynamic(providers).bootstrapModule(AppModule)\r\n .catch(err => console.log(err));\r\n","var map = {\n\t\"./af\": 58685,\n\t\"./af.js\": 58685,\n\t\"./ar\": 254,\n\t\"./ar-dz\": 4312,\n\t\"./ar-dz.js\": 4312,\n\t\"./ar-kw\": 32614,\n\t\"./ar-kw.js\": 32614,\n\t\"./ar-ly\": 18630,\n\t\"./ar-ly.js\": 18630,\n\t\"./ar-ma\": 28674,\n\t\"./ar-ma.js\": 28674,\n\t\"./ar-sa\": 49032,\n\t\"./ar-sa.js\": 49032,\n\t\"./ar-tn\": 24730,\n\t\"./ar-tn.js\": 24730,\n\t\"./ar.js\": 254,\n\t\"./az\": 53052,\n\t\"./az.js\": 53052,\n\t\"./be\": 60150,\n\t\"./be.js\": 60150,\n\t\"./bg\": 63069,\n\t\"./bg.js\": 63069,\n\t\"./bm\": 13466,\n\t\"./bm.js\": 13466,\n\t\"./bn\": 18516,\n\t\"./bn-bd\": 90557,\n\t\"./bn-bd.js\": 90557,\n\t\"./bn.js\": 18516,\n\t\"./bo\": 26273,\n\t\"./bo.js\": 26273,\n\t\"./br\": 9588,\n\t\"./br.js\": 9588,\n\t\"./bs\": 19815,\n\t\"./bs.js\": 19815,\n\t\"./ca\": 83331,\n\t\"./ca.js\": 83331,\n\t\"./cs\": 21320,\n\t\"./cs.js\": 21320,\n\t\"./cv\": 72219,\n\t\"./cv.js\": 72219,\n\t\"./cy\": 68266,\n\t\"./cy.js\": 68266,\n\t\"./da\": 66427,\n\t\"./da.js\": 66427,\n\t\"./de\": 67435,\n\t\"./de-at\": 52871,\n\t\"./de-at.js\": 52871,\n\t\"./de-ch\": 12994,\n\t\"./de-ch.js\": 12994,\n\t\"./de.js\": 67435,\n\t\"./dv\": 82357,\n\t\"./dv.js\": 82357,\n\t\"./el\": 95649,\n\t\"./el.js\": 95649,\n\t\"./en-au\": 59961,\n\t\"./en-au.js\": 59961,\n\t\"./en-ca\": 19878,\n\t\"./en-ca.js\": 19878,\n\t\"./en-gb\": 3924,\n\t\"./en-gb.js\": 3924,\n\t\"./en-ie\": 70864,\n\t\"./en-ie.js\": 70864,\n\t\"./en-il\": 91579,\n\t\"./en-il.js\": 91579,\n\t\"./en-in\": 30940,\n\t\"./en-in.js\": 30940,\n\t\"./en-nz\": 16181,\n\t\"./en-nz.js\": 16181,\n\t\"./en-sg\": 44301,\n\t\"./en-sg.js\": 44301,\n\t\"./eo\": 85291,\n\t\"./eo.js\": 85291,\n\t\"./es\": 54529,\n\t\"./es-do\": 53764,\n\t\"./es-do.js\": 53764,\n\t\"./es-mx\": 12584,\n\t\"./es-mx.js\": 12584,\n\t\"./es-us\": 63425,\n\t\"./es-us.js\": 63425,\n\t\"./es.js\": 54529,\n\t\"./et\": 35203,\n\t\"./et.js\": 35203,\n\t\"./eu\": 70678,\n\t\"./eu.js\": 70678,\n\t\"./fa\": 83483,\n\t\"./fa.js\": 83483,\n\t\"./fi\": 96262,\n\t\"./fi.js\": 96262,\n\t\"./fil\": 52521,\n\t\"./fil.js\": 52521,\n\t\"./fo\": 34555,\n\t\"./fo.js\": 34555,\n\t\"./fr\": 63131,\n\t\"./fr-ca\": 88239,\n\t\"./fr-ca.js\": 88239,\n\t\"./fr-ch\": 21702,\n\t\"./fr-ch.js\": 21702,\n\t\"./fr.js\": 63131,\n\t\"./fy\": 267,\n\t\"./fy.js\": 267,\n\t\"./ga\": 23821,\n\t\"./ga.js\": 23821,\n\t\"./gd\": 71753,\n\t\"./gd.js\": 71753,\n\t\"./gl\": 4074,\n\t\"./gl.js\": 4074,\n\t\"./gom-deva\": 92762,\n\t\"./gom-deva.js\": 92762,\n\t\"./gom-latn\": 5969,\n\t\"./gom-latn.js\": 5969,\n\t\"./gu\": 82809,\n\t\"./gu.js\": 82809,\n\t\"./he\": 45402,\n\t\"./he.js\": 45402,\n\t\"./hi\": 315,\n\t\"./hi.js\": 315,\n\t\"./hr\": 10410,\n\t\"./hr.js\": 10410,\n\t\"./hu\": 38288,\n\t\"./hu.js\": 38288,\n\t\"./hy-am\": 67928,\n\t\"./hy-am.js\": 67928,\n\t\"./id\": 71334,\n\t\"./id.js\": 71334,\n\t\"./is\": 86959,\n\t\"./is.js\": 86959,\n\t\"./it\": 34864,\n\t\"./it-ch\": 51124,\n\t\"./it-ch.js\": 51124,\n\t\"./it.js\": 34864,\n\t\"./ja\": 36141,\n\t\"./ja.js\": 36141,\n\t\"./jv\": 29187,\n\t\"./jv.js\": 29187,\n\t\"./ka\": 42136,\n\t\"./ka.js\": 42136,\n\t\"./kk\": 94332,\n\t\"./kk.js\": 94332,\n\t\"./km\": 18607,\n\t\"./km.js\": 18607,\n\t\"./kn\": 84305,\n\t\"./kn.js\": 84305,\n\t\"./ko\": 70234,\n\t\"./ko.js\": 70234,\n\t\"./ku\": 16003,\n\t\"./ku.js\": 16003,\n\t\"./ky\": 75061,\n\t\"./ky.js\": 75061,\n\t\"./lb\": 32786,\n\t\"./lb.js\": 32786,\n\t\"./lo\": 66183,\n\t\"./lo.js\": 66183,\n\t\"./lt\": 50029,\n\t\"./lt.js\": 50029,\n\t\"./lv\": 24169,\n\t\"./lv.js\": 24169,\n\t\"./me\": 68577,\n\t\"./me.js\": 68577,\n\t\"./mi\": 68177,\n\t\"./mi.js\": 68177,\n\t\"./mk\": 50337,\n\t\"./mk.js\": 50337,\n\t\"./ml\": 65260,\n\t\"./ml.js\": 65260,\n\t\"./mn\": 52325,\n\t\"./mn.js\": 52325,\n\t\"./mr\": 14695,\n\t\"./mr.js\": 14695,\n\t\"./ms\": 75334,\n\t\"./ms-my\": 37151,\n\t\"./ms-my.js\": 37151,\n\t\"./ms.js\": 75334,\n\t\"./mt\": 63570,\n\t\"./mt.js\": 63570,\n\t\"./my\": 97963,\n\t\"./my.js\": 97963,\n\t\"./nb\": 88028,\n\t\"./nb.js\": 88028,\n\t\"./ne\": 86638,\n\t\"./ne.js\": 86638,\n\t\"./nl\": 50302,\n\t\"./nl-be\": 66782,\n\t\"./nl-be.js\": 66782,\n\t\"./nl.js\": 50302,\n\t\"./nn\": 33501,\n\t\"./nn.js\": 33501,\n\t\"./oc-lnc\": 50563,\n\t\"./oc-lnc.js\": 50563,\n\t\"./pa-in\": 50869,\n\t\"./pa-in.js\": 50869,\n\t\"./pl\": 65302,\n\t\"./pl.js\": 65302,\n\t\"./pt\": 49687,\n\t\"./pt-br\": 74884,\n\t\"./pt-br.js\": 74884,\n\t\"./pt.js\": 49687,\n\t\"./ro\": 79107,\n\t\"./ro.js\": 79107,\n\t\"./ru\": 33627,\n\t\"./ru.js\": 33627,\n\t\"./sd\": 30355,\n\t\"./sd.js\": 30355,\n\t\"./se\": 83427,\n\t\"./se.js\": 83427,\n\t\"./si\": 11848,\n\t\"./si.js\": 11848,\n\t\"./sk\": 54590,\n\t\"./sk.js\": 54590,\n\t\"./sl\": 20184,\n\t\"./sl.js\": 20184,\n\t\"./sq\": 56361,\n\t\"./sq.js\": 56361,\n\t\"./sr\": 78965,\n\t\"./sr-cyrl\": 81287,\n\t\"./sr-cyrl.js\": 81287,\n\t\"./sr.js\": 78965,\n\t\"./ss\": 25456,\n\t\"./ss.js\": 25456,\n\t\"./sv\": 70451,\n\t\"./sv.js\": 70451,\n\t\"./sw\": 77558,\n\t\"./sw.js\": 77558,\n\t\"./ta\": 51356,\n\t\"./ta.js\": 51356,\n\t\"./te\": 73693,\n\t\"./te.js\": 73693,\n\t\"./tet\": 21243,\n\t\"./tet.js\": 21243,\n\t\"./tg\": 42500,\n\t\"./tg.js\": 42500,\n\t\"./th\": 55768,\n\t\"./th.js\": 55768,\n\t\"./tk\": 77761,\n\t\"./tk.js\": 77761,\n\t\"./tl-ph\": 35780,\n\t\"./tl-ph.js\": 35780,\n\t\"./tlh\": 29590,\n\t\"./tlh.js\": 29590,\n\t\"./tr\": 33807,\n\t\"./tr.js\": 33807,\n\t\"./tzl\": 93857,\n\t\"./tzl.js\": 93857,\n\t\"./tzm\": 60654,\n\t\"./tzm-latn\": 8806,\n\t\"./tzm-latn.js\": 8806,\n\t\"./tzm.js\": 60654,\n\t\"./ug-cn\": 30845,\n\t\"./ug-cn.js\": 30845,\n\t\"./uk\": 19232,\n\t\"./uk.js\": 19232,\n\t\"./ur\": 47052,\n\t\"./ur.js\": 47052,\n\t\"./uz\": 77967,\n\t\"./uz-latn\": 32233,\n\t\"./uz-latn.js\": 32233,\n\t\"./uz.js\": 77967,\n\t\"./vi\": 98615,\n\t\"./vi.js\": 98615,\n\t\"./x-pseudo\": 12320,\n\t\"./x-pseudo.js\": 12320,\n\t\"./yo\": 31313,\n\t\"./yo.js\": 31313,\n\t\"./zh-cn\": 64490,\n\t\"./zh-cn.js\": 64490,\n\t\"./zh-hk\": 55910,\n\t\"./zh-hk.js\": 55910,\n\t\"./zh-mo\": 98262,\n\t\"./zh-mo.js\": 98262,\n\t\"./zh-tw\": 44223,\n\t\"./zh-tw.js\": 44223\n};\n\n\nfunction webpackContext(req) {\n\tvar id = webpackContextResolve(req);\n\treturn __webpack_require__(id);\n}\nfunction webpackContextResolve(req) {\n\tif(!__webpack_require__.o(map, req)) {\n\t\tvar e = new Error(\"Cannot find module '\" + req + \"'\");\n\t\te.code = 'MODULE_NOT_FOUND';\n\t\tthrow e;\n\t}\n\treturn map[req];\n}\nwebpackContext.keys = function webpackContextKeys() {\n\treturn Object.keys(map);\n};\nwebpackContext.resolve = webpackContextResolve;\nmodule.exports = webpackContext;\nwebpackContext.id = 46700;"],"x_google_ignoreList":[88]}