VaKeR CYBER ARMY
Logo of a company Server : Apache/2.4.41 (Ubuntu)
System : Linux absol.cf 5.4.0-198-generic #218-Ubuntu SMP Fri Sep 27 20:18:53 UTC 2024 x86_64
User : www-data ( 33)
PHP Version : 7.4.33
Disable Function : pcntl_alarm,pcntl_fork,pcntl_waitpid,pcntl_wait,pcntl_wifexited,pcntl_wifstopped,pcntl_wifsignaled,pcntl_wifcontinued,pcntl_wexitstatus,pcntl_wtermsig,pcntl_wstopsig,pcntl_signal,pcntl_signal_get_handler,pcntl_signal_dispatch,pcntl_get_last_error,pcntl_strerror,pcntl_sigprocmask,pcntl_sigwaitinfo,pcntl_sigtimedwait,pcntl_exec,pcntl_getpriority,pcntl_setpriority,pcntl_async_signals,pcntl_unshare,
Directory :  /proc/self/root/opt/mattermost/client/

Upload File :
current_dir [ Writeable ] document_root [ Writeable ]

 

Current File : //proc/self/root/opt/mattermost/client/595.f7c88065f129463c3e17.js.map
{"version":3,"file":"595.f7c88065f129463c3e17.js","mappings":"yMAMe,SAASA,IACpB,MAAM,cAACC,IAAiBC,EAAAA,EAAAA,WACxB,OACIC,IAAAA,cAAA,KACIC,UAAU,mBACVC,MAAOJ,EAAc,CAACK,GAAI,qBAAsBC,eAAgB,eAG5E,CCEA,MAAMC,EAAkBC,IAA6B,IAA5B,KAACC,EAAI,SAAEC,GAAgBF,EAC5C,MAAMG,EAAiC,KAApBF,aAAI,EAAJA,EAAMG,WAEzB,OACIV,IAAAA,cAAA,OAAKC,UAAU,oBACXD,IAAAA,cAACW,EAAAA,KAAI,CACDV,UAAU,yBACVW,GAAE,IAAAC,OAAMJ,EAAaF,aAAI,EAAJA,EAAMO,KAAO,KAElCd,IAAAA,cAACH,EAAQ,MACTG,IAAAA,cAAA,YACKS,EACGT,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,oCACHC,eAAe,qBACfY,OAAQ,CAACR,SAAUA,QAAAA,EAAYD,aAAI,EAAJA,EAAMO,QAGzCd,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,wBACHC,eAAe,WAK7B,EAEZC,EAAAY,UAAA,CA9BET,SAAQU,IAAAA,QAgCZ,S,2ZCtBe,SAASC,EAAsBC,GAC1C,MAAM,kBACFC,EACIrB,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,qCACHC,eAAe,mBAEtB,SACDkB,EACItB,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,gCACHC,eAAe,WAEtB,aACDmB,EAAY,WACZC,EACIxB,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,oCACHC,eAAe,uBAEtB,SACDqB,EAAQ,UACRC,GACAN,EAEEO,GAAUC,EAAAA,EAAAA,cAAY,KACxBF,EAAU,CACNG,QAvCI,6BAwCJC,YAAa,CACTT,oBACAU,mBAAoB,iBACpBC,WAAY,+BACZC,QACIjC,IAAAA,cAAAA,IAAAA,SAAA,KACKoB,EAAMc,cACHlC,IAAAA,cAAA,SACKoB,EAAMc,cAGflC,IAAAA,cAAA,OAAKC,UAAU,sBACXD,IAAAA,cAACmC,EAAAA,EAAW,CAACC,oBAAoB,SACjCpC,IAAAA,cAAA,cACKoB,EAAMG,gBAKvBc,UAAWZ,EACXvB,MAAOsB,GAEXc,WAAYC,EAAAA,GACd,GACH,CAAClB,EAAmBE,EAAcC,EAAYC,EAAUC,IAE3D,OACI1B,IAAAA,cAAA,UACIC,UAAU,0BACV0B,QAASA,GAERL,EAGb,CAACH,EAAAF,UAAA,CAvEGI,kBAAiBH,IAAAA,KACjBI,SAAQJ,IAAAA,KACRgB,aAAYhB,IAAAA,KACZK,aAAYL,IAAAA,KACZM,WAAUN,IAAAA,KACVO,SAAQP,IAAAA,KAAAsB,WACRd,UAASR,IAAAA,IAAAsB,YCXb,MAAMC,EAAqB,CACvBf,UAASA,EAAAA,GAGb,GAAegB,EAAAA,EAAAA,SAAQ,KAAMD,EAA7B,CAAiDtB,GCDlC,SAASwB,EAAkBvB,GACtC,OACIpB,IAAAA,cAACmB,EAAqB,CAClBE,kBACIrB,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,mCACHC,eAAe,WAGvBkB,SACItB,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,oBACHC,eAAe,WAGvBmB,aACIvB,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,gCACHC,eAAe,0FAGvBoB,WACIxB,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,kCACHC,eAAe,wBAGvBqB,SAAUL,EAAMK,UAG5B,CAACkB,EAAA1B,UAAA,CAjCGQ,SAAQP,IAAAA,KAAAsB,YCiBZ,MAAMI,EAAoB,CAACC,EAAAA,EAAYC,eACjCC,EAA0B,CAACF,EAAAA,EAAYG,sBAEvCC,EAAgB3C,IAST,IART4C,SAAS,kBACLC,GACH,SACD1B,EAAQ,MACR2B,EAAQ,CAAC,EAAgB,gBACzBC,EAAe,cACfC,EAAgB,GAAE,mBAClBC,EAAqB,IACjBjD,EACJ,MAAMkD,GAAgBC,EAAAA,EAAAA,UAAQ,KACnB,CAACC,gBAAiB,OAAF7C,OAAS8C,EAAAA,GAAQC,uBAAuBR,EAAMjD,IAAG,QACzE,CAACiD,EAAMjD,KAEJ0D,GAAejC,EAAAA,EAAAA,cAAY,KACxBwB,IAGD3B,GACAA,EAAS2B,EAAMjD,IAEnBgD,EAAkBC,EAAMjD,IAAG,GAC5B,CAACgD,EAAmBC,EAAO3B,IAE9B,IAAIqC,EAAcP,EACdF,GAAmBA,IAAoBS,IACvCA,GAAe,MAAQT,EAAkB,KAG7C,IAAIU,EAAe/D,IAAAA,cAAC2C,EAAiB,CAAClB,SAAUoC,IAkBhD,OAfIE,EADAX,EAAMY,aAAeV,EAEjBtD,IAAAA,cAACiE,EAAAA,EAAqB,CAACC,YAAatB,GAC/BmB,GAKL/D,IAAAA,cAACiE,EAAAA,EAAqB,CAACC,YAAatB,GAChC5C,IAAAA,cAACiE,EAAAA,EAAqB,CAACC,YAAanB,GAC/BgB,IAOb/D,IAAAA,cAAA,MAAIC,UAAU,wBACVD,IAAAA,cAAA,MAAIC,UAAU,oBAAoB,IAAMmD,EAAMtC,KAAO,KACrDd,IAAAA,cAAA,MAAIC,UAAU,qBACVD,IAAAA,cAAA,QACIC,UAAU,WACVkE,MAAOX,KAGfxD,IAAAA,cAAA,MAAIC,UAAU,uBAAuB6D,GACrC9D,IAAAA,cAAA,MAAIC,UAAU,2BAA2B8D,GACxC,EAEXd,EAAAhC,UAAA,CAzEEmD,QAAOlD,IAAAA,OACPoC,cAAapC,IAAAA,OACbqC,mBAAkBrC,IAAAA,OAClBmC,gBAAenC,IAAAA,OACfO,SAAQP,IAAAA,KACRgC,QAAOhC,IAAAA,MAAA,CACHiC,kBAAiBjC,IAAAA,KAAAsB,aAAAA,YAqEzB,QAAexC,IAAAA,KAAWiD,GCpD1B,GAAeP,EAAAA,EAAAA,UArBf,SAAyB2B,EAAoBC,GACzC,MAAMlB,EAAQiB,EAAME,SAASC,OAAOC,YAAYH,EAASF,SACnDM,GAAUC,EAAAA,EAAAA,IAAQN,EAAOjB,EAAMY,YAErC,MAAO,CACHZ,QACAG,oBAAoBqB,EAAAA,EAAAA,IAAqBP,EAAOK,GAChDrB,gBAAiBqB,EAAUA,EAAQG,SAAW,GAC9CvB,eAAewB,EAAAA,EAAAA,IAAiBT,GAChCU,aAAaC,EAAAA,EAAAA,IAAeX,GAEpC,IAEA,SAA4BY,GACxB,MAAO,CACH/B,SAASgC,EAAAA,EAAAA,oBAAmB,CACxB/B,kBAAiBA,EAAAA,IAClB8B,GAEX,GAEA,CAA4DhC,G,6dCmB7C,MAAMkC,UAAkBnF,IAAAA,cAGnCoF,WAAAA,CAAYhE,GACRiE,MAAMjE,GAAOkE,EAAA,iBAqBLC,IACJA,GACAA,EAAEC,iBAGN,MAAMC,EAAOC,KAAKrB,MAAMsB,KAAO,EAC/BD,KAAKE,SAAS,CAACC,aAAa,IAC5BH,KAAKtE,MAAM8B,QAAQ4C,gBAAgBL,EArEpB,GAqE0CM,EAAAA,GAAMC,cAAc,GACzEC,MAAK3F,IAAyC,IAAxC,KAAC4F,GAAkC5F,EACrCoF,KAAKE,SAAS,CAACD,KAAMF,EAAMI,aAAa,IACpCK,GAAQA,EAAKC,OAxEV,IAyEHT,KAAKE,SAAS,CAACQ,cAAc,IAGjCV,KAAKtE,MAAMiF,aAAa,GAC1B,IACTf,EAAA,qBACeC,IACRA,GACAA,EAAEC,iBAGNE,KAAKE,SAAS,CACVD,KAAMD,KAAKrB,MAAMsB,KAAO,EACxBE,aAAa,EACbO,cAAc,IAGlBV,KAAKtE,MAAMiF,aAAa,IAC3Bf,EAAA,uBAEqCC,IAClC,IAAKA,IAAMA,EAAEe,OACT,OAGJ,MAAMC,EAAQhB,EAAEe,OAA4BE,OAAS,GAErDC,aAAaf,KAAKgB,eAElBhB,KAAKgB,cAAgBC,YAAWC,UAC5B,GAAoB,KAAhBL,EAAKM,OAEL,YADAnB,KAAKE,SAAS,CAACkB,aAAc,KAAMnB,KAAM,IAI7CD,KAAKE,SAAS,CAACmB,SAAS,IAExB,MAAM,KAACb,SAAcR,KAAKtE,MAAM8B,QAAQ8D,mBACpCT,EACA,CAAC,GACD,GAGAL,EACAR,KAAKE,SAAS,CACVkB,aAAcZ,EAAKe,KAAKC,GAAoBA,EAAG/G,KAC/C4G,SAAS,IAGbrB,KAAKE,SAAS,CAACkB,aAAc,GAAIC,SAAS,GAC9C,GA1H4B,IA2HG,IACtCzB,EAAA,yBAEmBlB,IAChB,IAAKsB,KAAKrB,MAAMyC,aACZ,OAGJ,MAAMK,EAAQzB,KAAKrB,MAAMyC,aAAaM,QAAQhD,GAE9C,GAAI+C,EAAQ,EACR,OAGJ,MAAME,EAAkB,IAAI3B,KAAKrB,MAAMyC,cACvCO,EAAgBC,OAAOH,EAAO,GAC9BzB,KAAKE,SAAS,CAACkB,aAAcO,GAAiB,IAlG9C3B,KAAKgB,cAAgB,KACrBhB,KAAKrB,MAAQ,CACT0C,SAAS,EACTpB,KAAM,EACNE,aAAa,EACbiB,aAAc,KACdV,cAAc,EAEtB,CAEA,uBAAMmB,GACF7B,KAAKtE,MAAM8B,QAAQ4C,gBAAgB,EAAG0B,GAAoBzB,EAAAA,GAAMC,cAAc,GAC1EC,MAAKwB,IAAyC,IAAxC,KAACvB,GAAkCuB,EACrC/B,KAAKE,SAAS,CAACmB,SAAS,IACpBb,GAAQA,EAAKC,OAxDV,IAyDHT,KAAKE,SAAS,CAACQ,cAAc,GACjC,GAEZ,CAmFAsB,MAAAA,GACI,MAAMZ,EAAepB,KAAKrB,MAAMyC,aAC1BtC,EAAS,GACf,IAAImD,EACAC,EAEJ,GAAIlC,KAAKrB,MAAM0C,QACXvC,EAAOqD,KACH7H,IAAAA,cAAA,MACI8H,IAAI,UACJ7H,UAAU,8CAEVD,IAAAA,cAAA,MAAI+H,QAAS,GACT/H,IAAAA,cAACgI,EAAAA,EAAa,CAACF,IAAI,oBAI5B,GAC4B,IAA/BpC,KAAKtE,MAAM6G,SAAS9B,QACnBW,GAAwC,IAAxBA,EAAaX,OAE9B3B,EAAOqD,KACH7H,IAAAA,cAAA,MACI8H,IAAI,QACJ7H,UAAU,8CAEVD,IAAAA,cAAA,MAAI+H,QAAS,GACT/H,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,mBACHC,eAAe,kCAK5B,GAAI0G,EACPA,EAAaoB,SAAS9D,IAClBI,EAAOqD,KACH7H,IAAAA,cAACiD,EAAa,CACV6E,IAAK,oBAAsB1D,EAC3BA,QAASA,EACT3C,SAAUiE,KAAKyC,iBACfjF,QAAS,CAACC,kBAAiBA,EAAAA,MAElC,QAEF,CACH,MAAMiF,EA7LK,GA6LO1C,KAAKrB,MAAMsB,KACvB0C,EAAUD,EA9LL,GA2MX,GAZwB1C,KAAKtE,MAAM6G,SAASK,MAAMF,EAAWC,GAE7CH,SAAS9D,IACrBI,EAAOqD,KACH7H,IAAAA,cAACiD,EAAa,CACV6E,IAAK,kBAAoB1D,EACzBA,QAASA,EACTlB,QAAS,CAACC,kBAAiBA,EAAAA,MAElC,IAGDuC,KAAKrB,MAAM+B,aAAc,CACzB,MAAMmC,EACFvI,IAAAA,cAAA,YACIA,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,0BACHC,eAAe,SAEnBJ,IAAAA,cAACwI,EAAAA,EAAQ,CAACpG,oBAAoB,UAItCuF,EACI3H,IAAAA,cAACyI,EAAAA,EAAU,CACPC,SAAS,eACTC,aAAa,aACbhH,QAAS+D,KAAKkD,SACdC,OAAQnD,KAAKrB,MAAMwB,YACnBiD,SAAUpD,KAAKrB,MAAMwB,YACrBzF,eAAgBmI,EAChBQ,cAAeR,GAG3B,CAEI7C,KAAKrB,MAAMsB,KAAO,IAClBiC,EACI5H,IAAAA,cAAA,UACIC,UAAU,mBACV0B,QAAS+D,KAAKsD,cAEdhJ,IAAAA,cAACiJ,EAAAA,EAAY,CAAC7G,oBAAoB,SAClCpC,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,0BACHC,eAAe,cAKnC,CAEA,OACIJ,IAAAA,cAAA,WACIA,IAAAA,cAAA,OAAKC,UAAU,qBACXD,IAAAA,cAAA,OAAKC,UAAU,4BACXD,IAAAA,cAACkJ,EAAAA,EAAU,MACXlJ,IAAAA,cAACmJ,EAAAA,EAAyB,CACtBC,KAAK,SACLnJ,UAAU,eACVoJ,aAAaC,EAAAA,EAAAA,eAAc,CAACnJ,GAAI,oBAAqBC,eAAgB,wBACrEmJ,SAAU7D,KAAK8D,eACfrF,MAAOA,EAAMsF,WAIzBzJ,IAAAA,cAAA,QAAMC,UAAU,wBACZD,IAAAA,cAAA,SACIA,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,kBACHC,eAAe,uJAGvBJ,IAAAA,cAAA,SACIA,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,mBACHC,eAAe,+KAI3BJ,IAAAA,cAAA,OAAKC,UAAU,kBACXD,IAAAA,cAAA,SAAOC,UAAU,qBACbD,IAAAA,cAAA,aACIA,IAAAA,cAAA,MAAIC,UAAU,iDACVD,IAAAA,cAAA,MAAIC,UAAU,oBACVD,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,kBACHC,eAAe,UAGvBJ,IAAAA,cAAA,MAAIC,UAAU,qBACVD,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,mBACHC,eAAe,WAGvBJ,IAAAA,cAAA,MAAIC,UAAU,uBACVD,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,qBACHC,eAAe,aAGvBJ,IAAAA,cAAA,MAAIC,UAAU,sBACVD,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,qBACHC,eAAe,eAK/BJ,IAAAA,cAAA,aAAQwE,KAGhBxE,IAAAA,cAAA,OAAKC,UAAU,wBACV2H,EACAD,GAIjB,EAGJ,MAAMxD,EAAQ,CACVsF,OAAQ,CAACC,SAAU,EAAGC,WAAY,IClTtC,GAAejH,EAAAA,EAAAA,UAff,SAAyB2B,GACrB,MAAO,CACH4D,UAAU2B,EAAAA,EAAAA,IAA8BvF,IAAU,GAE1D,IAEA,SAA4BY,GACxB,MAAO,CACH/B,SAASgC,EAAAA,EAAAA,oBAAmB,CACxBY,gBAAe,KACfkB,mBAAkBA,EAAAA,IACnB/B,GAEX,GAEA,CAA4DE,GCFtD0E,EAA4B,CAAChH,EAAAA,EAAYiH,eACzCC,EAAQ,CAAC,eAAgB,aAAc,cAAe,aAE7C,SAASC,EAAS1J,GAOvB,IAPwB,gBAC9B2J,EAAkB,GAAE,SACpBC,EAAW,GAAE,SACb1J,EAAW,GAAE,YACb6F,EAAW,aACX8D,EAAY,QACZjH,GACI5C,EACJ,MAAM8J,GAAOrK,EAAAA,EAAAA,YAEbsK,EAAAA,EAAAA,YAAU,KACNC,IACApH,EAAQqH,kBAAkBR,GAC1BS,EAAAA,KAEO,KACHA,EAAAA,GAAiBL,EAAa,IAEnC,KAEHE,EAAAA,EAAAA,YAAU,KACNC,GAAa,GACd,CAAC9J,IAEJ,MAAM8J,EAAcA,KAChBG,SAASvK,MAAQkK,EAAKtK,cAAc,CAACK,GAAI,sBAAuBC,eAAgB,iBAAmB,MAAQ6J,EAAkB,IAAMzJ,CAAQ,EAG/I,OACIR,IAAAA,cAAA,OAAKC,UAAU,gCACXD,IAAAA,cAAA,OAAKC,UAAU,oBACXD,IAAAA,cAAA,UACIA,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,oBACHC,eAAe,kBAGvBJ,IAAAA,cAACiE,EAAAA,EAAqB,CAACC,YAAa2F,GAChC7J,IAAAA,cAACW,EAAAA,KAAI,CACDV,UAAU,WACVW,GAAI,IAAMsJ,EAAW,cAErBlK,IAAAA,cAAA,UACIoJ,KAAK,SACLnJ,UAAU,mBAEVD,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,iBACHC,eAAe,yBAMnCJ,IAAAA,cAACmF,EAAS,CAACkB,YAAaA,IAGpC,CAAC2D,EAAA/I,UAAA,CAtEGiJ,SAAQhJ,IAAAA,OACR+I,gBAAe/I,IAAAA,OACfV,SAAQU,IAAAA,OAGRgC,QAAOhC,IAAAA,MAAA,IAAAsB,YCYX,SAAeE,EAAAA,EAAAA,UAnBf,SAAyB2B,GACrB,MAAM9D,GAAOyE,EAAAA,EAAAA,IAAeX,GAE5B,MAAO,CACH6F,SAAU3J,aAAI,EAAJA,EAAMO,KAChBmJ,gBAAiB1J,aAAI,EAAJA,EAAMmK,aACvBlK,SAAU6D,EAAME,SAASoG,QAAQC,OAAOC,SACxCV,cAAcW,EAAAA,EAAAA,IAASzG,GAE/B,IAEA,SAA4BY,GACxB,MAAO,CACH/B,SAASgC,EAAAA,EAAAA,oBAAmB,CACxBqF,kBAAiBA,EAAAA,IAClBtF,GAEX,GAEA,CAA4D+E,G,gCCvB5D,MA+BA,EA/BwB1J,IAAuB,IAAtB,SAACyK,GAAgBzK,EACtC,MAAM,cAACR,IAAiBC,EAAAA,EAAAA,WAClBiL,EAAgC,GAoBtC,OAlBAhL,IAAAA,SAAekI,QAAQ6C,GAAU,CAACE,EAAO9D,KACvB,IAAVA,GACA6D,EAAiBnD,KACb7H,IAAAA,cAAA,QACI8H,IAAK,UAAYX,EACjBlH,UAAU,6BAEVD,IAAAA,cAAA,KACIC,UAAU,oBACVC,MAAOJ,EAAc,CAACK,GAAI,2BAA4BC,eAAgB,wBAMtF4K,EAAiBnD,KAAKoD,EAAM,IAI5BjL,IAAAA,cAAA,OAAKC,UAAU,oBACXD,IAAAA,cAAA,UACKgL,GAEH,E,6cCcC,MAAME,WAAiBlL,IAAAA,cAClCoF,WAAAA,CAAYhE,GACRiE,MAAMjE,GAAOkE,GAAA,yBAWEsB,SACRlB,KAAKyF,aAAa5F,KAC5BD,GAAA,8BAEuBsB,SACblB,KAAKyF,aAAa5F,KAC5BD,GAAA,qBAEcsB,UACX,MAAM,QAAC1D,EAAO,SAAEkI,EAAQ,KAAEC,EAAI,KAAE9K,GAAQmF,KAAKtE,OACvC,MAACkK,EAAK,KAAExK,EAAI,OAAE+H,GAAUnD,KAAKrB,MAInC,GAFAkB,EAAEC,iBAEEqD,EACA,OAGJnD,KAAKE,SAAS,CACViD,QAAQ,EACR0C,MAAO,OAGX,MAAMnI,EAAyB,CAC3BY,WAAYqH,EAAKlL,GACjBW,KAAMA,EAAK+F,OAAO2E,eAQtB,GAJIpI,EAAMtC,KAAK2K,WAAW,MAAQrI,EAAMtC,KAAK4K,SAAS,OAClDtI,EAAMtC,KAAOsC,EAAMtC,KAAK6K,UAAU,EAAGvI,EAAMtC,KAAKqF,OAAS,KAGxD/C,EAAMtC,KAWP,YAVA4E,KAAKE,SAAS,CACViD,QAAQ,EACR0C,MACIvL,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,yBACHC,eAAe,uCAQ/B,GAAK,eAAgBwL,KAAKxI,EAAMtC,MAW5B,YAVA4E,KAAKE,SAAS,CACViD,QAAQ,EACR0C,MACIvL,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,wBACHC,eAAe,qGAQ/B,GAAIgL,EAASS,eAAezI,EAAMtC,MAW9B,YAVA4E,KAAKE,SAAS,CACViD,QAAQ,EACR0C,MACIvL,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,sBACHC,eAAe,iFAQ/B,GAAIgL,EAASU,IAAI1I,EAAMtC,MAWnB,YAVA4E,KAAKE,SAAS,CACViD,QAAQ,EACR0C,MACIvL,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,4BACHC,eAAe,iFAQ/B,IAAKkL,EAWD,YAVA5F,KAAKE,SAAS,CACViD,QAAQ,EACR0C,MACIvL,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,0BACHC,eAAe,yCAS/B,GAAIkL,EAAMS,KADe,QAYrB,YAVArG,KAAKE,SAAS,CACViD,QAAQ,EACR0C,MACIvL,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,0BACHC,eAAe,oEAQ/B,MAAM4L,QAAiB9I,EAAQ+I,kBAAkB7I,EAAsBkI,GAEvE,GAAI,SAAUU,GACSA,KACU9F,KAAKpF,OAASsC,EAAMtC,KAE7C,YADAoL,EAAAA,GAAAA,KAAarE,KAAK,IAAMtH,EAAKO,KAAO,UAK5C,GAAI,UAAWkL,EAAU,CACrB,MAAMG,EAAgBH,EACtB,GAAIG,EAMA,YALAzG,KAAKE,SAAS,CACViD,QAAQ,EACR0C,MAAOY,EAAcZ,MAAMtJ,SAKvC,CAEA,MAAMmK,EACFpM,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,wBACHC,eAAe,uDAIvBsF,KAAKE,SAAS,CACViD,QAAQ,EACR0C,MAAQa,GACV,IACL9G,GAAA,mBAEaC,IACVG,KAAKE,SAAS,CACV9E,KAAMyE,EAAEe,OAAOE,OACjB,IACLlB,GAAA,oBAEcC,IACX,GAAsB,MAAlBA,EAAEe,OAAO+F,OAA2C,IAA1B9G,EAAEe,OAAO+F,MAAMlG,OAMzC,YALAT,KAAKE,SAAS,CACV0F,MAAO,KACPgB,SAAU,KAMlB,MAAMhB,EAAQ/F,EAAEe,OAAO+F,MAAO,GAExBE,EAAS,IAAIC,WACnBD,EAAOE,OAAS,KACZ/G,KAAKE,SAAS,CACV0F,QACAgB,SAAUC,EAAOG,QACnB,EAENH,EAAOI,cAAcrB,EAAM,IA3L3B5F,KAAKrB,MAAQ,CACTvD,KAAM,GACNwK,MAAO,KACPgB,SAAU,GACVzD,QAAQ,EACR0C,MAAO,KAEf,CAuLA7D,MAAAA,GACI,IAAIkF,EAAW,KACXlH,KAAKrB,MAAMiH,QACXsB,EACI5M,IAAAA,cAAA,QAAMC,UAAU,uBACXyF,KAAKrB,MAAMiH,MAAMxK,OAK9B,IAAI+L,EAAU,KA+Bd,OA9BInH,KAAKrB,MAAMiI,WACXO,EACI7M,IAAAA,cAAA,OAAKC,UAAU,cACXD,IAAAA,cAAA,SACIC,UAAU,yBACV6M,QAAQ,WAER9M,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,oBACHC,eAAe,aAGvBJ,IAAAA,cAAA,OAAKC,UAAU,wCACXD,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,6BACHC,eAAe,yCACfY,OAAQ,CACJsK,MACItL,IAAAA,cAAA,QACIC,UAAU,WACVkE,MAAO,CAACT,gBAAiB,OAASgC,KAAKrB,MAAMiI,SAAW,aAWpFtM,IAAAA,cAAA,OAAKC,UAAU,yBACXD,IAAAA,cAAC+M,EAAe,KACZ/M,IAAAA,cAACW,EAAAA,KAAI,CAACC,GAAI,IAAM8E,KAAKtE,MAAMb,KAAKO,KAAO,UACnCd,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,oBACHC,eAAe,kBAGvBJ,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,mBACHC,eAAe,SAGvBJ,IAAAA,cAAA,OAAKC,UAAU,kBACXD,IAAAA,cAAA,QACIC,UAAU,kBACV+M,SAAUtH,KAAKuH,kBAEfjN,IAAAA,cAAA,OAAKC,UAAU,cACXD,IAAAA,cAAA,SACIC,UAAU,yBACV6M,QAAQ,QAER9M,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,iBACHC,eAAe,UAGvBJ,IAAAA,cAAA,OAAKC,UAAU,qBACXD,IAAAA,cAAA,SACIG,GAAG,OACHiJ,KAAK,OACL8D,UAAW,GACXjN,UAAU,eACVuG,MAAOd,KAAKrB,MAAMvD,KAClByI,SAAU7D,KAAKyH,aAEnBnN,IAAAA,cAAA,OAAKC,UAAU,cACXD,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,sBACHC,eAAe,sIAK/BJ,IAAAA,cAAA,OAAKC,UAAU,cACXD,IAAAA,cAAA,SACIC,UAAU,yBACV6M,QAAQ,SAER9M,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,kBACHC,eAAe,WAGvBJ,IAAAA,cAAA,OAAKC,UAAU,qBACXD,IAAAA,cAAA,WACIA,IAAAA,cAAA,OAAKC,UAAU,qBACXD,IAAAA,cAAA,UAAQC,UAAU,mBACdD,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,yBACHC,eAAe,YAGvBJ,IAAAA,cAAA,SACIG,GAAG,eACHiJ,KAAK,OACLgE,OAAQC,GAAAA,GAAUC,mBAClBC,UAAU,EACVhE,SAAU7D,KAAK8H,eAGtBZ,EACD5M,IAAAA,cAAA,OAAKC,UAAU,cACXD,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,uBACHC,eAAe,gIAMlCyM,EACD7M,IAAAA,cAAA,OAAKC,UAAU,0BACXD,IAAAA,cAACyN,EAAAA,EAAS,CACNrE,KAAK,YACLmC,MAAO7F,KAAKrB,MAAMkH,QAEtBvL,IAAAA,cAACW,EAAAA,KAAI,CACDV,UAAU,mBACVW,GAAI,IAAM8E,KAAKtE,MAAMb,KAAKO,KAAO,UAEjCd,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,mBACHC,eAAe,YAGvBJ,IAAAA,cAAC0N,GAAAA,EAAa,CACV,cAAY,cACZzN,UAAU,kBACVmJ,KAAK,SACLuE,SAAUjI,KAAKrB,MAAMwE,OACrB+E,cAActE,EAAAA,EAAAA,eAAc,CAACnJ,GAAI,mBAAoBC,eAAgB,cACrEuB,QAAS+D,KAAKmI,uBAEd7N,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,iBACHC,eAAe,aAQ/C,ECtXJ,UAAesC,EAAAA,EAAAA,UAdf,SAAyB2B,GACrB,MAAO,CACH+G,UAAU0C,EAAAA,EAAAA,IAAYzJ,GAE9B,IAEA,SAA4BY,GACxB,MAAO,CACH/B,SAASgC,EAAAA,EAAAA,oBAAmB,CACxB+G,kBAAiBA,EAAAA,IAClBhH,GAEX,GAEA,CAA4DiG,I,kQChBtD6C,GAAoBzN,IAA8C,IAA7C,MAACgL,EAAK,MAAEpL,EAAK,YAAE8N,EAAW,KAAEC,GAAY3N,EAC/D,OACIN,IAAAA,cAACW,EAAAA,KAAI,CACDC,GAAIqN,EACJhO,UAAU,sBAEVD,IAAAA,cAAA,OACIkO,IAAK,oBACLjO,UAAU,4BACVkO,IAAK7C,IAETtL,IAAAA,cAAA,OAAKC,UAAU,6BACVC,GAELF,IAAAA,cAAA,OAAKC,UAAU,mCACV+N,GAEF,EAEbD,GAAA9M,UAAA,CAzBEqK,MAAKpK,IAAAA,OAAAsB,WACLtC,MAAKgB,IAAAA,QAAAsB,WACLwL,YAAW9M,IAAAA,QAAAsB,WACXyL,KAAI/M,IAAAA,OAAAsB,YAwBR,SAAexC,IAAAA,KAAW+N,I,0ZCAX,MAAMK,WAAqBpO,IAAAA,cAA4BoF,WAAAA,GAAA,SAAAiJ,WAAA/I,GAAA,oBAKpD,KACV,MAAMgJ,EAAkB5I,KAAKtE,MAAMZ,UAAY,GAC/CiK,SAASvK,MAAQsK,EAAAA,GAAsB,CAACrK,GAAI,6BAA8BC,eAAgB,iBAAmB,MAAQsF,KAAKtE,MAAMb,KAAKmK,aAAe,IAAM4D,CAAe,GAC5K,CAPD/G,iBAAAA,GACI7B,KAAK4E,aACT,CAOA5C,MAAAA,GACI,MAAM6G,EAAU,GAqKhB,OAnKI7I,KAAKtE,MAAMoN,wBACXD,EAAQ1G,KACJ7H,IAAAA,cAACyO,GAAAA,EAAkB,CACfC,OAAQhJ,KAAKtE,MAAMb,KAAKJ,GACxB+D,YAAa,CAACrB,EAAAA,GAAY8L,0BAC1B7G,IAAI,6BAEJ9H,IAAAA,cAAC+N,GAAiB,CACdjG,IAAI,kBACJwD,MAAOsD,GACP1O,MACIF,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,qCACHC,eAAe,sBAGvB4N,YACIhO,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,2CACHC,eAAe,mEAGvB6N,KAAM,IAAMvI,KAAKtE,MAAMb,KAAKO,KAAO,sCAM/C4E,KAAKtE,MAAMyN,wBACXN,EAAQ1G,KACJ7H,IAAAA,cAACyO,GAAAA,EAAkB,CACfC,OAAQhJ,KAAKtE,MAAMb,KAAKJ,GACxB+D,YAAa,CAACrB,EAAAA,GAAYiM,0BAC1BhH,IAAI,6BAEJ9H,IAAAA,cAAC+N,GAAiB,CACdjG,IAAI,kBACJwD,MAAOyD,GACP7O,MACIF,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,qCACHC,eAAe,sBAGvB4N,YACIhO,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,2CACHC,eAAe,qFAGvB6N,KAAM,IAAMvI,KAAKtE,MAAMb,KAAKO,KAAO,sCAM/C4E,KAAKtE,MAAM4N,gBACXT,EAAQ1G,KACJ7H,IAAAA,cAACyO,GAAAA,EAAkB,CACfC,OAAQhJ,KAAKtE,MAAMb,KAAKJ,GACxB+D,YAAa,CAACrB,EAAAA,GAAYoM,uBAC1BnH,IAAI,qBAEJ9H,IAAAA,cAAC+N,GAAiB,CACdjG,IAAI,UACJwD,MAAO4D,GACPhP,MACIF,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,6BACHC,eAAe,mBAGvB4N,YACIhO,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,mCACHC,eAAe,0DAGvB6N,KAAM,IAAMvI,KAAKtE,MAAMb,KAAKO,KAAO,6BAM/C4E,KAAKtE,MAAM+N,4BACXZ,EAAQ1G,KACJ7H,IAAAA,cAACoP,GAAAA,EAAoB,CACjBlL,YAAa,CAACrB,EAAAA,GAAYwM,cAC1BvH,IAAI,wBAEJ9H,IAAAA,cAAC+N,GAAiB,CACdjG,IAAI,aACJwD,MAAOgE,GACPpP,MACIF,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,+BACHC,eAAe,2BAGvB4N,YACIhO,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,qCACHC,eAAe,4FAGvB6N,KAAM,IAAMvI,KAAKtE,MAAMb,KAAKO,KAAO,gCAM/C4E,KAAKtE,MAAMmO,gCACXhB,EAAQ1G,KACJ7H,IAAAA,cAACyO,GAAAA,EAAkB,CACfC,OAAQhJ,KAAKtE,MAAMb,KAAKJ,GACxB+D,YAAa,CAACrB,EAAAA,GAAY2M,mCAC1B1H,IAAI,sCAEJ9H,IAAAA,cAAC+N,GAAiB,CACdjG,IAAI,2BACJwD,MAAOmE,GACPvP,MACIF,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,8CACHC,eAAe,+BAGvB4N,YACIhO,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,oDACHC,eAAe,4FAGvB6N,KAAM,IAAMvI,KAAKtE,MAAMb,KAAKO,KAAO,gDAMnDyN,EAAQ1G,KACJ7H,IAAAA,cAACoP,GAAAA,EAAoB,CACjBlL,YAAa,CAAC,eACd4D,IAAI,mBAEJ9H,IAAAA,cAAC+N,GAAiB,CACdzC,MAAOoE,GACPxP,MACIF,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,qBACHC,eAAe,iBAGvB4N,YACIhO,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,0BACHC,eAAe,6EAGvB6N,KAAM,IAAMvI,KAAKtE,MAAMb,KAAKO,KAAO,yBAM3Cd,IAAAA,cAAA,OAAKC,UAAU,yBACXD,IAAAA,cAAA,OAAKC,UAAU,oBACXD,IAAAA,cAAA,UACIA,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,sBACHC,eAAe,mBAI3BJ,IAAAA,cAAA,OAAKC,UAAU,wBACXD,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,oBACHC,eAAe,kGACfY,OAAQ,CACJ2O,aACI3P,IAAAA,cAAC4P,GAAAA,EAAY,CACTC,KAAK,qCACLC,SAAS,gBAET9P,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,iCACHC,eAAe,uBAOvCJ,IAAAA,cAAA,OAAKC,UAAU,sCACVsO,GAIjB,EACHjJ,GAnNoB8I,GAAY,aAR7BI,uBAAsBtN,IAAAA,KAAAsB,WACtBqM,uBAAsB3N,IAAAA,KAAAsB,WACtBwM,eAAc9N,IAAAA,KAAAsB,WACd2M,2BAA0BjO,IAAAA,KAAAsB,WAC1B+M,+BAA8BrO,IAAAA,KAAAsB,aCAlC,UAAeE,EAAAA,EAAAA,UAnBf,SAAyB2B,GACrB,MAAMuG,GAASmF,EAAAA,EAAAA,IAAU1L,GAQzB,MAAO,CACH7D,SARaoK,EAAOC,SASpB2D,uBAR6D,SAAlC5D,EAAOoF,uBASlCnB,uBAR6D,SAAlCjE,EAAOqF,uBASlCjB,eAR6C,SAA1BpE,EAAOsF,eAS1Bf,2BARqE,SAAtCvE,EAAOuF,2BAStCZ,+BAR6E,SAA1C3E,EAAOwF,+BAUlD,GAEA,CAAwChC,I,0ECVxC,MAAMiC,GAAgB/P,IAOT,IAPU,SACnBgQ,EAAQ,WACRC,EAAU,cACVC,EAAa,SACbC,EAAQ,MACRjK,EAAK,SACL+C,GACIjJ,EACJ,MAAM8J,GAAOrK,EAAAA,EAAAA,WAEPwO,EAAU,CACZvO,IAAAA,cAAA,UACI8H,IAAI,GACJtB,MAAM,IAEL4D,EAAKtK,cAAc,CAChBK,GAAI,6BACJC,eAAgB,+BAqC5B,OAhCAkQ,EAASpI,SAASwI,IACd,MAAMC,EAAcD,EAAQhG,cAAgBgG,EAAQ5P,MAChD4P,EAAQtH,OAASiE,GAAAA,GAAUuD,cAAgBL,GASpCG,EAAQtH,OAASiE,GAAAA,GAAUwD,iBAAmBL,GAS9CE,EAAQtH,OAASiE,GAAAA,GAAUyD,YAAcL,IAjBhDlC,EAAQ1G,KACJ7H,IAAAA,cAAA,UACI8H,IAAK4I,EAAQvQ,GACbqG,MAAOkK,EAAQvQ,IAEdwQ,GAqBb,IAIA3Q,IAAAA,cAAA,UACIC,UAAU,eACVuG,MAAOA,EACP+C,SAAUA,EACVpJ,GAAG,iBAEFoO,EACI,EAIjB,IAAewC,EAAAA,EAAAA,MAAKV,ICxEdW,IAAsBC,EAAAA,GAAAA,IACxB,sBACAC,GAAAA,GACAC,GAAAA,GACA,CAACb,EAAUc,IAEA,IADgBd,EAASe,QAAQX,GAAkC,IAAtBA,EAAQhQ,aACjC4Q,KAAKC,GAAAA,GAAiCC,KAAK,KAAMJ,MAUpF,IAAe1O,EAAAA,EAAAA,UANf,SAAyB2B,GACrB,MAAO,CACHiM,SAAUU,GAAoB3M,GAEtC,GAEA,CAAwCgM,I,0ZC+CzB,MAAMoB,WAAgCC,EAAAA,cACjDtM,WAAAA,CAAYhE,GACRiE,MAAMjE,GAAOkE,GAAA,yBAKGqM,IACT,CACH7N,aAAa6N,aAAI,EAAJA,EAAMjH,eAAgB,GACnCsD,aAAa2D,aAAI,EAAJA,EAAM3D,cAAe,GAClC4D,WAAWD,aAAI,EAAJA,EAAME,aAAc,GAC/BC,eAAeH,aAAI,EAAJA,EAAMI,kBAAkB,EACvClN,UAAU8M,aAAI,EAAJA,EAAM9M,WAAY,GAC5BmN,SAASL,aAAI,EAAJA,EAAMM,WAAY,GAC3BpJ,QAAQ,EACRqJ,YAAa,GACbC,YAAa,SAEpB7M,GAAA,qBAEeC,IAA4D,IAAA6M,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAGxE,GAFAlN,EAAEC,iBAEEE,KAAKrB,MAAMwE,OACX,OASJ,GANAnD,KAAKE,SAAS,CACViD,QAAQ,EACRqJ,YAAa,GACbC,YAAa,QAGZzM,KAAKrB,MAAMuN,UAWZ,YAVAlM,KAAKE,SAAS,CACViD,QAAQ,EACRsJ,YACInS,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,uCACHC,eAAe,kCAQ/B,MAAMuR,EAAO,CACTE,WAAYnM,KAAKrB,MAAMuN,UACvBG,eAAgBrM,KAAKrB,MAAMyN,cAC3BpH,aAAchF,KAAKrB,MAAMP,YACzBkK,YAAatI,KAAKrB,MAAM2J,YACxBnJ,SAAUa,KAAKrB,MAAMQ,SACrBoN,SAAUvM,KAAKrB,MAAM2N,QACrB7R,IAA0B,QAAtBiS,EAAA1M,KAAKtE,MAAMsR,mBAAW,IAAAN,OAAA,EAAtBA,EAAwBjS,KAAM,GAClCwS,WAAiC,QAAtBN,EAAA3M,KAAKtE,MAAMsR,mBAAW,IAAAL,OAAA,EAAtBA,EAAwBM,YAAa,EAChDC,WAAiC,QAAtBN,EAAA5M,KAAKtE,MAAMsR,mBAAW,IAAAJ,OAAA,EAAtBA,EAAwBM,YAAa,EAChDlS,WAAiC,QAAtB6R,EAAA7M,KAAKtE,MAAMsR,mBAAW,IAAAH,OAAA,EAAtBA,EAAwB7R,YAAa,EAChDmS,SAA+B,QAAtBL,EAAA9M,KAAKtE,MAAMsR,mBAAW,IAAAF,OAAA,EAAtBA,EAAwBK,UAAW,GAC5CC,SAA+B,QAAtBL,EAAA/M,KAAKtE,MAAMsR,mBAAW,IAAAD,OAAA,EAAtBA,EAAwBK,UAAW,IAGhDpN,KAAKtE,MAAM2R,OAAOpB,GAAM1L,MAAK,IAAMP,KAAKE,SAAS,CAACiD,QAAQ,KAAQ,IACrEvD,GAAA,0BAE0DC,IACvDG,KAAKE,SAAS,CACV9B,YAAayB,EAAEe,OAAOE,OACxB,IACLlB,GAAA,0BAE0DC,IACvDG,KAAKE,SAAS,CACVoI,YAAazI,EAAEe,OAAOE,OACxB,IACLlB,GAAA,wBAEyDC,IACtDG,KAAKE,SAAS,CACVgM,UAAWrM,EAAEe,OAAOE,OACtB,IACLlB,GAAA,4BAE4DC,IACzDG,KAAKE,SAAS,CACVkM,cAAevM,EAAEe,OAAO0M,SAC1B,IACL1N,GAAA,uBAEuDC,IACpDG,KAAKE,SAAS,CACVf,SAAUU,EAAEe,OAAOE,OACrB,IACLlB,GAAA,sBAEsDC,IACnDG,KAAKE,SAAS,CACVoM,QAASzM,EAAEe,OAAOE,OACpB,IA/FFd,KAAKrB,MAAQqB,KAAKuN,iBAAiBvN,KAAKtE,MAAMsR,YAClD,CAiGAhL,MAAAA,GACI,MAAMwL,EAAiBxN,KAAKtE,MAAM+R,OAC5BC,EAAiB1N,KAAKtE,MAAMiS,OAElC,OACIrT,IAAAA,cAAA,OAAKC,UAAU,qBACXD,IAAAA,cAAC+M,EAAe,KACZ/M,IAAAA,cAACW,EAAAA,KAAI,CAACC,GAAE,IAAAC,OAAM6E,KAAKtE,MAAMb,KAAKO,KAAI,oCAC9Bd,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,2BACHC,eAAe,uBAGvBJ,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAI+S,EAAe/S,GACnBC,eAAgB8S,EAAe9S,kBAGvCJ,IAAAA,cAAA,OAAKC,UAAU,kBACXD,IAAAA,cAAA,QACIC,UAAU,kBACV+M,SAAWzH,GAAMG,KAAKyF,aAAa5F,IAEnCvF,IAAAA,cAAA,OAAKC,UAAU,cACXD,IAAAA,cAAA,SACIC,UAAU,yBACV6M,QAAQ,eAER9M,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,mCACHC,eAAe,WAGvBJ,IAAAA,cAAA,OAAKC,UAAU,qBACXD,IAAAA,cAAA,SACIG,GAAG,cACHiJ,KAAK,OACL8D,UAAW,GACXjN,UAAU,eACVuG,MAAOd,KAAKrB,MAAMP,YAClByF,SAAU7D,KAAK4N,oBAEnBtT,IAAAA,cAAA,OAAKC,UAAU,cACXD,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,wCACHC,eAAe,+EAK/BJ,IAAAA,cAAA,OAAKC,UAAU,cACXD,IAAAA,cAAA,SACIC,UAAU,yBACV6M,QAAQ,eAER9M,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,mCACHC,eAAe,iBAGvBJ,IAAAA,cAAA,OAAKC,UAAU,qBACXD,IAAAA,cAAA,SACIG,GAAG,cACHiJ,KAAK,OACL8D,UAAW,IACXjN,UAAU,eACVuG,MAAOd,KAAKrB,MAAM2J,YAClBzE,SAAU7D,KAAK6N,oBAEnBvT,IAAAA,cAAA,OAAKC,UAAU,cACXD,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,wCACHC,eAAe,uCAK/BJ,IAAAA,cAAA,OAAKC,UAAU,cACXD,IAAAA,cAAA,SACIC,UAAU,yBACV6M,QAAQ,aAER9M,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,+BACHC,eAAe,aAGvBJ,IAAAA,cAAA,OAAKC,UAAU,qBACXD,IAAAA,cAACqQ,GAAa,CACV7J,MAAOd,KAAKrB,MAAMuN,UAClBrI,SAAU7D,KAAK8N,gBACfjD,YAAY,EACZC,eAAe,EACfC,UAAU,IAEdzQ,IAAAA,cAAA,OAAKC,UAAU,cACXD,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,oCACHC,eAAe,8JAK/BJ,IAAAA,cAAA,OAAKC,UAAU,cACXD,IAAAA,cAAA,SACIC,UAAU,yBACV6M,QAAQ,iBAER9M,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,qCACHC,eAAe,0BAGvBJ,IAAAA,cAAA,OAAKC,UAAU,8BACXD,IAAAA,cAAA,SACIG,GAAG,gBACHiJ,KAAK,WACL4J,QAAStN,KAAKrB,MAAMyN,cACpBvI,SAAU7D,KAAK+N,sBAEnBzT,IAAAA,cAAA,OAAKC,UAAU,cACXD,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,0CACHC,eAAe,2EAK7BsF,KAAKtE,MAAMsS,4BACT1T,IAAAA,cAAA,OAAKC,UAAU,cACXD,IAAAA,cAAA,SACIC,UAAU,yBACV6M,QAAQ,YAER9M,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,gCACHC,eAAe,cAGvBJ,IAAAA,cAAA,OAAKC,UAAU,qBACXD,IAAAA,cAAA,SACIG,GAAG,WACHiJ,KAAK,OACL8D,UAAW,GACXjN,UAAU,eACVuG,MAAOd,KAAKrB,MAAMQ,SAClB0E,SAAU7D,KAAKiO,iBAEnB3T,IAAAA,cAAA,OAAKC,UAAU,cACXD,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,qCACHC,eAAe,6PAMjCsF,KAAKtE,MAAMwS,wBACT5T,IAAAA,cAAA,OAAKC,UAAU,cACXD,IAAAA,cAAA,SACIC,UAAU,yBACV6M,QAAQ,WAER9M,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,gCACHC,eAAe,qBAGvBJ,IAAAA,cAAA,OAAKC,UAAU,qBACXD,IAAAA,cAAA,SACIG,GAAG,UACHiJ,KAAK,OACL8D,UAAW,KACXjN,UAAU,eACVuG,MAAOd,KAAKrB,MAAM2N,QAClBzI,SAAU7D,KAAKmO,gBAEnB7T,IAAAA,cAAA,OAAKC,UAAU,cACXD,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,qCACHC,eAAe,yOAMnCJ,IAAAA,cAAA,OAAKC,UAAU,0BACXD,IAAAA,cAACyN,EAAAA,EAAS,CACNrE,KAAK,YACL0K,OAAQ,CAACpO,KAAKtE,MAAM8Q,YAAaxM,KAAKrB,MAAM8N,eAEhDnS,IAAAA,cAACW,EAAAA,KAAI,CACDV,UAAU,mBACVW,GAAE,IAAAC,OAAM6E,KAAKtE,MAAMb,KAAKO,KAAI,oCAE5Bd,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,8BACHC,eAAe,YAGvBJ,IAAAA,cAAC0N,GAAAA,EAAa,CACVzN,UAAU,kBACVmJ,KAAK,SACLuE,SAAUjI,KAAKrB,MAAMwE,OACrB+E,aAAclI,KAAKtE,MAAM2F,QACzBpF,QAAU4D,GAAMG,KAAKyF,aAAa5F,GAClCpF,GAAG,eAEHH,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAIiT,EAAejT,GACnBC,eAAgBgT,EAAehT,qBAQ/D,EC9XJ,MAAM2T,IAAWC,EAAAA,EAAAA,gBAAe,CAC5BX,OAAQ,CACJlT,GAAI,4BACJC,eAAgB,QAEpB+S,OAAQ,CACJhT,GAAI,mBACJC,eAAgB,OAEpB2G,QAAS,CACL5G,GAAI,8BACJC,eAAgB,eA8BlB6T,GAAqB3T,IAKd,IALe,KACxBC,EAAI,2BACJmT,EAA0B,uBAC1BE,EAAsB,QACtB1Q,GACI5C,EACJ,MAAO4R,EAAagC,IAAkBC,EAAAA,EAAAA,UAAS,IAEzCC,GAAkBxS,EAAAA,EAAAA,cAAYgF,UAChCsN,EAAe,IAEf,MAAM,KAAChO,EAAI,MAAEqF,SAAerI,EAAQmR,mBAAmB1C,GACnDzL,GACAgG,EAAAA,GAAAA,KAAarE,KAAK,IAADhH,OAAKN,EAAKO,KAAI,oDAAAD,OAAmDqF,EAAK/F,KAGvFoL,GACA2I,EAAe3I,EAAMtJ,QACzB,GACD,CAACiB,EAAS3C,EAAKO,OAElB,OACId,IAAAA,cAACyR,GAAuB,CACpBlR,KAAMA,EACN4S,OAAQY,GAASZ,OACjBE,OAAQU,GAASV,OACjBtM,QAASgN,GAAShN,QAClB2M,2BAA4BA,EAC5BE,uBAAwBA,EACxBb,OAAQqB,EACRlC,YAAaA,GACf,EAER+B,GAAAhT,UAAA,CAjDEyS,2BAA0BxS,IAAAA,KAAAsB,WAK1BoR,uBAAsB1S,IAAAA,KAAAsB,WAEtBU,QAAOhC,IAAAA,MAAA,CAKHmT,mBAAkBnT,IAAAA,KAAAsB,aAAAA,YAsC1B,UAAeuO,EAAAA,EAAAA,MAAKkD,ICzDpB,IAAevR,EAAAA,EAAAA,UAnBf,SAAyB2B,GACrB,MAAMuG,GAASmF,EAAAA,EAAAA,IAAU1L,GAIzB,MAAO,CACHqP,2BAJqE,SAAtC9I,EAAO0J,2BAKtCV,uBAJ6D,SAAlChJ,EAAO2J,uBAM1C,IAEA,SAA4BtP,GACxB,MAAO,CACH/B,SAASgC,EAAAA,EAAAA,oBAAmB,CACxBmP,mBAAkBA,GAAAA,IACnBpP,GAEX,GAEA,CAA4DgP,IChC5D,SAAA3O,GAAAC,EAAAiP,EAAAC,GAAA,OAAAD,EAAA,SAAAC,GAAA,IAAAC,EAAA,SAAAD,GAAA,oBAAAA,IAAAA,EAAA,OAAAA,EAAA,IAAAlP,EAAAkP,EAAAE,OAAAC,aAAA,YAAArP,EAAA,KAAAmP,EAAAnP,EAAAsP,KAAAJ,EAAAD,UAAA,oBAAAE,EAAA,OAAAA,EAAA,UAAAI,UAAA,uDAAAC,OAAAN,EAAA,CAAAO,CAAAP,GAAA,uBAAAC,EAAAA,EAAAA,EAAA,GAAAO,CAAAT,MAAAjP,EAAA2P,OAAAC,eAAA5P,EAAAiP,EAAA,CAAAhO,MAAAiO,EAAAW,YAAA,EAAAC,cAAA,EAAAC,UAAA,IAAA/P,EAAAiP,GAAAC,EAAAlP,CAAA,CA0Ee,MAAMgQ,WAAyBvV,IAAAA,cAI1CoF,WAAAA,CAAYhE,GACRiE,MAAMjE,GAAOkE,GAAA,wBAQEkQ,IACR,CACH1U,KAAM0U,EAAI1U,MAAQ,GAClBkN,YAAawH,EAAIxH,aAAe,GAChCyH,SAAUD,EAAIC,UAAY,GAC1BxD,SAAUuD,EAAIvD,UAAY,GAC1ByD,aAAcF,EAAIG,cAAgBH,EAAIG,cAAcC,KAAK,MAAQ,GACjEC,WAAYL,EAAIK,aAAc,EAC9BC,SAAUC,QAAQP,EAAIvD,UACtBpJ,QAAQ,EACRsJ,YAAa,SAEpB7M,GAAA,oBAEa,KAAM,IAAA0Q,EACS,QAAzBA,EAAItQ,KAAKuM,SAASgE,eAAO,IAAAD,GAArBA,EAAuBxP,OACvBd,KAAKE,SAAS,CACVkQ,UAAU,EACV7D,SAAUvM,KAAKuM,SAASgE,QAAQzP,OAExC,IACHlB,GAAA,qBAEeC,IAGZ,GAFAA,EAAEC,iBAEEE,KAAKrB,MAAMwE,OACX,OAQJ,GALAnD,KAAKE,SAAS,CACViD,QAAQ,EACRsJ,YAAa,MAGZzM,KAAKrB,MAAMvD,KAWZ,YAVA4E,KAAKE,SAAS,CACViD,QAAQ,EACRsJ,YACInS,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,6BACHC,eAAe,sDAQ/B,IAAKsF,KAAKrB,MAAM2J,YAWZ,YAVAtI,KAAKE,SAAS,CACViD,QAAQ,EACRsJ,YACInS,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,oCACHC,eAAe,6DAQ/B,IAAKsF,KAAKrB,MAAMoR,SAWZ,YAVA/P,KAAKE,SAAS,CACViD,QAAQ,EACRsJ,YACInS,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,iCACHC,eAAe,0DAQ/B,MAAMsV,EAAe,GACrB,IAAK,IAAIQ,KAAexQ,KAAKrB,MAAMqR,aAAaS,MAAM,MAClDD,EAAcA,EAAYrP,OAEtBqP,EAAY/P,OAAS,GACrBuP,EAAa7N,KAAKqO,GAI1B,GAA4B,IAAxBR,EAAavP,OAWb,YAVAT,KAAKE,SAAS,CACViD,QAAQ,EACRsJ,YACInS,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,qCACHC,eAAe,8CAQ/B,MAAMoV,EAAM,CACR1U,KAAM4E,KAAKrB,MAAMvD,KACjB6U,cAAeD,EACfD,SAAU/P,KAAKrB,MAAMoR,SACrBzH,YAAatI,KAAKrB,MAAM2J,YACxB6H,WAAYnQ,KAAKrB,MAAMwR,WACvB5D,SAAUvM,KAAKrB,MAAM4N,UAGzBvM,KAAKtE,MAAM2R,OAAOyC,GAAKvP,MAAK,IAAMP,KAAKE,SAAS,CAACiD,QAAQ,KAAQ,IACpEvD,GAAA,mBAEaC,IACVG,KAAKE,SAAS,CACV9E,KAAMyE,EAAEe,OAAOE,OACjB,IACLlB,GAAA,sBAEgBC,IACbG,KAAKE,SAAS,CACViQ,WAA+B,SAAnBtQ,EAAEe,OAAOE,OACvB,IACLlB,GAAA,0BAEoBC,IACjBG,KAAKE,SAAS,CACVoI,YAAazI,EAAEe,OAAOE,OACxB,IACLlB,GAAA,uBAEiBC,IACdG,KAAKE,SAAS,CACV6P,SAAUlQ,EAAEe,OAAOE,OACrB,IACLlB,GAAA,sBAEgBC,IACbG,KAAKE,SAAS,CACVkQ,UAAU,EACV7D,SAAU1M,EAAEe,OAAOE,QAEvBd,KAAK4F,MAAM6C,IAAM5I,EAAEe,OAAOE,KAAK,IAClClB,GAAA,2BAEqBC,IAClBG,KAAKE,SAAS,CACV8P,aAAcnQ,EAAEe,OAAOE,OACzB,IAzJFd,KAAK4F,MAAQ,IAAI8K,MACjB1Q,KAAK4F,MAAMmB,OAAS/G,KAAK2Q,YACzB3Q,KAAKuM,SAAWjS,IAAAA,YAChB0F,KAAKrB,MAAQqB,KAAK4Q,gBAAgB5Q,KAAKtE,MAAMmV,YAAc,CAAC,EAChE,CAwJA7O,MAAAA,GACI,MAAMwL,EAAiBxN,KAAKtE,MAAM+R,OAC5BC,EAAiB1N,KAAKtE,MAAMiS,OAC5BmD,EAAc9Q,KAAKtE,MAAMoV,YAE/B,IAAIC,EACA/Q,KAAKrB,MAAMyR,WACXW,EACIzW,IAAAA,cAAA,OAAKC,UAAU,qBACXD,IAAAA,cAAA,OACIkO,IAAK,mBACLC,IAAKzI,KAAKrB,MAAM4N,aAMhC,MAAMyE,EACF1W,IAAAA,cAACoP,GAAAA,EAAoB,CAAClL,YAAa,CAACrB,EAAAA,GAAY8T,gBAC5C3W,IAAAA,cAAA,OAAKC,UAAU,cACXD,IAAAA,cAAA,SACIC,UAAU,yBACV6M,QAAQ,cAER9M,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,+BACHC,eAAe,gBAGvBJ,IAAAA,cAAA,OAAKC,UAAU,qBACXD,IAAAA,cAAA,SAAOC,UAAU,gBACbD,IAAAA,cAAA,SACIoJ,KAAK,QACL5C,MAAM,OACN1F,KAAK,aACLkS,QAAStN,KAAKrB,MAAMwR,WACpBtM,SAAU7D,KAAKkR,gBAEnB5W,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,mCACHC,eAAe,SAGvBJ,IAAAA,cAAA,SAAOC,UAAU,gBACbD,IAAAA,cAAA,SACIoJ,KAAK,QACL5C,MAAM,QACN1F,KAAK,aACLkS,SAAUtN,KAAKrB,MAAMwR,WACrBtM,SAAU7D,KAAKkR,gBAEnB5W,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,kCACHC,eAAe,QAGvBJ,IAAAA,cAAA,OAAKC,UAAU,cACXD,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,6BACHC,eAAe,+NAQvC,OACIJ,IAAAA,cAAA,OAAKC,UAAU,qBACXD,IAAAA,cAAC+M,EAAe,KACZ/M,IAAAA,cAACW,EAAAA,KAAI,CAACC,GAAE,IAAAC,OAAM6E,KAAKtE,MAAMb,KAAKO,KAAI,8BAC9Bd,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,8BACHC,eAAe,2BAGvBJ,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAI+S,EAAe/S,GACnBC,eAAgB8S,EAAe9S,kBAGvCJ,IAAAA,cAAA,OAAKC,UAAU,kBACVwW,EACDzW,IAAAA,cAAA,QAAMC,UAAU,mBACXyW,EACD1W,IAAAA,cAAA,OAAKC,UAAU,cACXD,IAAAA,cAAA,SACIC,UAAU,yBACV6M,QAAQ,QAER9M,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,4BACHC,eAAe,kBAGvBJ,IAAAA,cAAA,OAAKC,UAAU,qBACXD,IAAAA,cAAA,SACIG,GAAG,OACHiJ,KAAK,OACL8D,UAAW,GACXjN,UAAU,eACVuG,MAAOd,KAAKrB,MAAMvD,KAClByI,SAAU7D,KAAKyH,aAEnBnN,IAAAA,cAAA,OAAKC,UAAU,cACXD,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,0BACHC,eAAe,yFAK/BJ,IAAAA,cAAA,OAAKC,UAAU,cACXD,IAAAA,cAAA,SACIC,UAAU,yBACV6M,QAAQ,eAER9M,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,mCACHC,eAAe,iBAGvBJ,IAAAA,cAAA,OAAKC,UAAU,qBACXD,IAAAA,cAAA,SACIG,GAAG,cACHiJ,KAAK,OACL8D,UAAW,IACXjN,UAAU,eACVuG,MAAOd,KAAKrB,MAAM2J,YAClBzE,SAAU7D,KAAK6N,oBAEnBvT,IAAAA,cAAA,OAAKC,UAAU,cACXD,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,iCACHC,eAAe,4CAK/BJ,IAAAA,cAAA,OAAKC,UAAU,cACXD,IAAAA,cAAA,SACIC,UAAU,yBACV6M,QAAQ,YAER9M,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,gCACHC,eAAe,cAGvBJ,IAAAA,cAAA,OAAKC,UAAU,qBACXD,IAAAA,cAAA,SACIG,GAAG,WACHiJ,KAAK,MACL8D,UAAW,IACXjN,UAAU,eACVuG,MAAOd,KAAKrB,MAAMoR,SAClBlM,SAAU7D,KAAKmR,iBAEnB7W,IAAAA,cAAA,OAAKC,UAAU,cACXD,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,8BACHC,eAAe,4IAK/BJ,IAAAA,cAAA,OAAKC,UAAU,cACXD,IAAAA,cAAA,SACIC,UAAU,yBACV6M,QAAQ,YAER9M,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,+BACHC,eAAe,cAGvBJ,IAAAA,cAAA,OAAKC,UAAU,qBACXD,IAAAA,cAAA,SACIG,GAAG,WACH2W,IAAKpR,KAAKuM,SACV7I,KAAK,MACL8D,UAAW,IACXjN,UAAU,eACVuG,MAAOd,KAAKrB,MAAM4N,SAClB1I,SAAU7D,KAAKqR,gBAEnB/W,IAAAA,cAAA,OAAKC,UAAU,cACXD,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,0BACHC,eAAe,yHAK/BJ,IAAAA,cAAA,OAAKC,UAAU,cACXD,IAAAA,cAAA,SACIC,UAAU,yBACV6M,QAAQ,gBAER9M,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,oCACHC,eAAe,kCAGvBJ,IAAAA,cAAA,OAAKC,UAAU,qBACXD,IAAAA,cAAA,YACIG,GAAG,eACH6W,KAAM,EACN9J,UAAW,KACXjN,UAAU,eACVuG,MAAOd,KAAKrB,MAAMqR,aAClBnM,SAAU7D,KAAKuR,qBAEnBjX,IAAAA,cAAA,OAAKC,UAAU,cACXD,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,kCACHC,eAAe,oPAK/BJ,IAAAA,cAAA,OAAKC,UAAU,0BACXD,IAAAA,cAACyN,EAAAA,EAAS,CACNrE,KAAK,YACL0K,OAAQ,CAACpO,KAAKtE,MAAM8Q,YAAaxM,KAAKrB,MAAM8N,eAEhDnS,IAAAA,cAACW,EAAAA,KAAI,CACDV,UAAU,mBACVW,GAAE,IAAAC,OAAM6E,KAAKtE,MAAMb,KAAKO,KAAI,8BAE5Bd,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,8BACHC,eAAe,YAGvBJ,IAAAA,cAAC0N,GAAAA,EAAa,CACVzN,UAAU,kBACVmJ,KAAK,SACLuE,SAAUjI,KAAKrB,MAAMwE,OACrB+E,aAAclI,KAAKtE,MAAM2F,QACzBpF,QAAS+D,KAAKyF,aACdhL,GAAG,gBAEHH,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAIiT,EAAejT,GACnBC,eAAgBgT,EAAehT,kBAGtCoW,KAMzB,EACHlR,GAlaoBiQ,GAAgB,aA/BjCiB,YAAWtV,IAAAA,QAKXgR,YAAWhR,IAAAA,OAAAsB,WAUXuQ,OAAM7R,IAAAA,KAAAsB,aC7CV,MAAMuR,IAAWC,EAAAA,EAAAA,gBAAe,CAC5BX,OAAQ,CACJlT,GAAI,4BACJC,eAAgB,QAEpB+S,OAAQ,CACJhT,GAAI,uBACJC,eAAgB,OAEpB2G,QAAS,CACL5G,GAAI,8BACJC,eAAgB,eAoBlB8W,GAAc5W,IAAyC,IAAxC,KAACC,EAAI,QAAE2C,GAAe5C,EACvC,MAAM6W,GAAUC,EAAAA,EAAAA,eAETlF,EAAagC,IAAkBC,EAAAA,EAAAA,UAAS,IAgB/C,OACInU,IAAAA,cAACuV,GAAgB,CACbhV,KAAMA,EACN4S,OAAQY,GAASZ,OACjBE,OAAQU,GAASV,OACjBtM,QAASgN,GAAShN,QAClBgM,OApBYnM,UAChBsN,EAAe,IAEf,MAAM,KAAChO,EAAI,MAAEqF,SAAerI,EAAQmU,YAAY7B,GAC5CtP,EACAiR,EAAQtP,KAAK,IAADhH,OAAKN,EAAKO,KAAI,8CAAAD,OAA6CqF,EAAK/F,KAI5EoL,GACA2I,EAAe3I,EAAMtJ,QACzB,EAUIiQ,YAAaA,GACf,EAERgF,GAAAjW,UAAA,CAtCEiC,QAAOhC,IAAAA,MAAA,CAKHmW,YAAWnW,IAAAA,KAAAsB,aAAAA,YAmCnB,YCzDA,IAAeE,EAAAA,EAAAA,SAAQ,MARvB,SAA4BuC,GACxB,MAAO,CACH/B,SAASgC,EAAAA,EAAAA,oBAAmB,CACxBmS,YAAWA,GAAAA,IACZpS,GAEX,GAEA,CAAiDiS,I,maCqElC,MAAMI,WAAgCtX,IAAAA,cACjDoF,WAAAA,CAAYhE,GACRiE,MAAMjE,GAAOkE,GAAA,yBAKGqM,IAChB,IAAI4F,EAAe,GACnB,GAAI5F,SAAAA,EAAM6F,cAAe,CACrB,IAAI9C,EAAI,EACR,IAAKA,EAAI,EAAGA,EAAI/C,EAAK6F,cAAcrR,OAAQuO,IACvC6C,GAAgB5F,EAAK6F,cAAc9C,GAAK,IAEhD,CAEA,IAAIgB,EAAe,GACnB,GAAI/D,SAAAA,EAAMgE,cAAe,CACrB,IAAIjB,EAAI,EACR,IAAKA,EAAI,EAAGA,EAAI/C,EAAKgE,cAAcxP,OAAQuO,IACvCgB,GAAgB/D,EAAKgE,cAAcjB,GAAK,IAEhD,CAEA,MAAO,CACH5Q,aAAa6N,aAAI,EAAJA,EAAMjH,eAAgB,GACnCsD,aAAa2D,aAAI,EAAJA,EAAM3D,cAAe,GAClCyJ,aAAa9F,aAAI,EAAJA,EAAM+F,eAAgB,oCACnC9F,WAAWD,aAAI,EAAJA,EAAME,aAAc,GAC/B0F,eACAI,aAAahG,aAAI,EAAJA,EAAMiG,eAAgB,EACnClC,eACA7M,QAAQ,EACRsJ,YAAa,KACbtN,UAAU8M,aAAI,EAAJA,EAAM9M,WAAY,GAC5BmN,SAASL,aAAI,EAAJA,EAAMM,WAAY,GAC9B,IACJ3M,GAAA,qBAEeC,IAA4D,IAAA6M,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAGxE,GAFAlN,EAAEC,iBAEEE,KAAKrB,MAAMwE,OACX,OAGJnD,KAAKE,SAAS,CACViD,QAAQ,EACRsJ,YAAa,OAGjB,MAAMoF,EAAe,GACrB,GAAI7R,KAAKrB,MAAMkT,aACX,IAAK,IAAIM,KAAenS,KAAKrB,MAAMkT,aAAapB,MAAM,MAClD0B,EAAcA,EAAYhR,OAEtBgR,EAAY1R,OAAS,GACrBoR,EAAa1P,KAAKgQ,GAK9B,IAAKnS,KAAKrB,MAAMuN,WAAqC,IAAxB2F,EAAapR,OAWtC,YAVAT,KAAKE,SAAS,CACViD,QAAQ,EACRsJ,YACInS,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,qDACHC,eAAe,6DAQ/B,MAAMsV,EAAe,GACrB,IAAK,IAAIQ,KAAexQ,KAAKrB,MAAMqR,aAAaS,MAAM,MAClDD,EAAcA,EAAYrP,OAEtBqP,EAAY/P,OAAS,GACrBuP,EAAa7N,KAAKqO,GAI1B,GAA4B,IAAxBR,EAAavP,OAWb,YAVAT,KAAKE,SAAS,CACViD,QAAQ,EACRsJ,YACInS,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,4CACHC,eAAe,6CAQ/B,MAAMuR,EAAO,CACTkB,QAASnN,KAAKtE,MAAMb,KAAKJ,GACzB0R,WAAYnM,KAAKrB,MAAMuN,UACvB4F,cAAeD,EACfK,aAAclS,KAAKrB,MAAMsT,YACzBhC,cAAeD,EACfhL,aAAchF,KAAKrB,MAAMP,YACzB4T,aAAchS,KAAKrB,MAAMoT,YACzBzJ,YAAatI,KAAKrB,MAAM2J,YACxBnJ,SAAUa,KAAKrB,MAAMQ,SACrBoN,SAAUvM,KAAKrB,MAAM2N,QACrB7R,IAA0B,QAAtBiS,EAAA1M,KAAKtE,MAAMsR,mBAAW,IAAAN,OAAA,EAAtBA,EAAwBjS,KAAM,GAClCwS,WAAiC,QAAtBN,EAAA3M,KAAKtE,MAAMsR,mBAAW,IAAAL,OAAA,EAAtBA,EAAwBM,YAAa,EAChDC,WAAiC,QAAtBN,EAAA5M,KAAKtE,MAAMsR,mBAAW,IAAAJ,OAAA,EAAtBA,EAAwBM,YAAa,EAChDlS,WAAiC,QAAtB6R,EAAA7M,KAAKtE,MAAMsR,mBAAW,IAAAH,OAAA,EAAtBA,EAAwB7R,YAAa,EAChDsD,YAAkC,QAAtBwO,EAAA9M,KAAKtE,MAAMsR,mBAAW,IAAAF,OAAA,EAAtBA,EAAwBxO,aAAc,GAClD8T,OAA6B,QAAtBrF,EAAA/M,KAAKtE,MAAMsR,mBAAW,IAAAD,OAAA,EAAtBA,EAAwBqF,QAAS,IAG5CpS,KAAKtE,MAAM2R,OAAOpB,GAAM1L,MAAK,IAAMP,KAAKE,SAAS,CAACiD,QAAQ,KAAQ,IACrEvD,GAAA,0BAE0DC,IACvDG,KAAKE,SAAS,CACV9B,YAAayB,EAAEe,OAAOE,OACxB,IACLlB,GAAA,0BAE0DC,IACvDG,KAAKE,SAAS,CACVoI,YAAazI,EAAEe,OAAOE,OACxB,IACLlB,GAAA,0BAE2DC,IACxDG,KAAKE,SAAS,CACV6R,YAAalS,EAAEe,OAAOE,OACxB,IACLlB,GAAA,wBAEyDC,IACtDG,KAAKE,SAAS,CACVgM,UAAWrM,EAAEe,OAAOE,OACtB,IACLlB,GAAA,2BAE8DC,IAC3DG,KAAKE,SAAS,CACV2R,aAAchS,EAAEe,OAAOE,OACzB,IACLlB,GAAA,0BAE2DC,IACxDG,KAAKE,SAAS,CACV+R,YAAaI,SAASxS,EAAEe,OAAOE,MAAO,KACxC,IACLlB,GAAA,2BAE8DC,IAC3DG,KAAKE,SAAS,CACV8P,aAAcnQ,EAAEe,OAAOE,OACzB,IACLlB,GAAA,uBAEuDC,IACpDG,KAAKE,SAAS,CACVf,SAAUU,EAAEe,OAAOE,OACrB,IACLlB,GAAA,sBAEsDC,IACnDG,KAAKE,SAAS,CACVoM,QAASzM,EAAEe,OAAOE,OACpB,IAxKFd,KAAKrB,MAAQqB,KAAKuN,iBAAiBvN,KAAKtE,MAAMsR,YAClD,CA0KAhL,MAAAA,GACI,MAAMsQ,EAAqB,oCACrBC,EAAqB,mBAErB/E,EAAiBxN,KAAKtE,MAAM+R,OAC5BC,EAAiB1N,KAAKtE,MAAMiS,OAC5BmD,EAAc9Q,KAAKtE,MAAMoV,YAE/B,OACIxW,IAAAA,cAAA,OAAKC,UAAU,qBACXD,IAAAA,cAAC+M,EAAe,KACZ/M,IAAAA,cAACW,EAAAA,KAAI,CAACC,GAAE,IAAAC,OAAM6E,KAAKtE,MAAMb,KAAKO,KAAI,oCAC9Bd,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,8BACHC,eAAe,uBAGvBJ,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAI+S,EAAe/S,GACnBC,eAAgB8S,EAAe9S,kBAGvCJ,IAAAA,cAAA,OAAKC,UAAU,kBACXD,IAAAA,cAAA,QACIC,UAAU,kBACV+M,SAAUtH,KAAKyF,cAEfnL,IAAAA,cAAA,OAAKC,UAAU,cACXD,IAAAA,cAAA,SACIC,UAAU,yBACV6M,QAAQ,eAER9M,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,mCACHC,eAAe,WAGvBJ,IAAAA,cAAA,OAAKC,UAAU,qBACXD,IAAAA,cAAA,SACIG,GAAG,cACHiJ,KAAK,OACL8D,UAAW,GACXjN,UAAU,eACVuG,MAAOd,KAAKrB,MAAMP,YAClByF,SAAU7D,KAAK4N,oBAEnBtT,IAAAA,cAAA,OAAKC,UAAU,cACXD,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,wCACHC,eAAe,+EAK/BJ,IAAAA,cAAA,OAAKC,UAAU,cACXD,IAAAA,cAAA,SACIC,UAAU,yBACV6M,QAAQ,eAER9M,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,mCACHC,eAAe,iBAGvBJ,IAAAA,cAAA,OAAKC,UAAU,qBACXD,IAAAA,cAAA,SACIG,GAAG,cACHiJ,KAAK,OACL8D,UAAW,IACXjN,UAAU,eACVuG,MAAOd,KAAKrB,MAAM2J,YAClBzE,SAAU7D,KAAK6N,oBAEnBvT,IAAAA,cAAA,OAAKC,UAAU,cACXD,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,wCACHC,eAAe,uCAK/BJ,IAAAA,cAAA,OAAKC,UAAU,cACXD,IAAAA,cAAA,SACIC,UAAU,yBACV6M,QAAQ,eAER9M,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,oCACHC,eAAe,kBAGvBJ,IAAAA,cAAA,OAAKC,UAAU,qBACXD,IAAAA,cAAA,UACIC,UAAU,eACVuG,MAAOd,KAAKrB,MAAMoT,YAClBlO,SAAU7D,KAAKwS,mBAEflY,IAAAA,cAAA,UACIwG,MAAOwR,GAENA,GAELhY,IAAAA,cAAA,UACIwG,MAAOyR,GAENA,IAGTjY,IAAAA,cAAA,OAAKC,UAAU,cACXD,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,yCACHC,eAAe,4DAGvBJ,IAAAA,cAAA,OAAKC,UAAU,cACXD,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,yCACHC,eAAe,4HAGvBJ,IAAAA,cAAA,OAAKC,UAAU,cACXD,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,yCACHC,eAAe,mFAK/BJ,IAAAA,cAAA,OAAKC,UAAU,cACXD,IAAAA,cAAA,SACIC,UAAU,yBACV6M,QAAQ,aAER9M,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,+BACHC,eAAe,aAGvBJ,IAAAA,cAAA,OAAKC,UAAU,qBACXD,IAAAA,cAACqQ,GAAa,CACV7J,MAAOd,KAAKrB,MAAMuN,UAClBrI,SAAU7D,KAAK8N,gBACfjD,YAAY,EACZC,eAAe,EACfC,UAAU,IAEdzQ,IAAAA,cAAA,OAAKC,UAAU,cACXD,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,oCACHC,eAAe,6IAK/BJ,IAAAA,cAAA,OAAKC,UAAU,cACXD,IAAAA,cAAA,SACIC,UAAU,yBACV6M,QAAQ,gBAER9M,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,oCACHC,eAAe,kCAGvBJ,IAAAA,cAAA,OAAKC,UAAU,qBACXD,IAAAA,cAAA,YACIG,GAAG,eACH6W,KAAM,EACN9J,UAAW,IACXjN,UAAU,eACVuG,MAAOd,KAAKrB,MAAMkT,aAClBhO,SAAU7D,KAAKyS,qBAEnBnY,IAAAA,cAAA,OAAKC,UAAU,cACXD,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,yCACHC,eAAe,wQAK/BJ,IAAAA,cAAA,OAAKC,UAAU,cACXD,IAAAA,cAAA,SACIC,UAAU,yBACV6M,QAAQ,gBAER9M,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,+CACHC,eAAe,kBAGvBJ,IAAAA,cAAA,OAAKC,UAAU,qBACXD,IAAAA,cAAA,UACIG,GAAG,cACHF,UAAU,eACVuG,MAAOd,KAAKrB,MAAMsT,YAClBpO,SAAU7D,KAAK0S,mBAEfpY,IAAAA,cAAA,UACIwG,MAAM,MAEL6R,EAAAA,EAAAA,IAAgB,CAAClY,GAAI,uDAAwDC,eAAgB,+CAElGJ,IAAAA,cAAA,UACIwG,MAAM,MAEL6R,EAAAA,EAAAA,IAAgB,CAAClY,GAAI,yDAA0DC,eAAgB,4CAGxGJ,IAAAA,cAAA,OAAKC,UAAU,cACXD,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,oDACHC,eAAe,qDAK/BJ,IAAAA,cAAA,OAAKC,UAAU,cACXD,IAAAA,cAAA,SACIC,UAAU,yBACV6M,QAAQ,gBAER9M,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,oCACHC,eAAe,kCAGvBJ,IAAAA,cAAA,OAAKC,UAAU,qBACXD,IAAAA,cAAA,YACIG,GAAG,eACH6W,KAAM,EACN9J,UAAW,IACXjN,UAAU,eACVuG,MAAOd,KAAKrB,MAAMqR,aAClBnM,SAAU7D,KAAKuR,qBAEnBjX,IAAAA,cAAA,OAAKC,UAAU,cACXD,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,yCACHC,eAAe,gGACfY,OAAQ,CACJiN,KACIjO,IAAAA,cAAC4P,GAAAA,EAAY,CACTC,KAAMyI,GAAAA,GAASC,mBACfzI,SAAS,6BAET9P,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,iDACHC,eAAe,uCAS9CsF,KAAKtE,MAAMsS,4BACR1T,IAAAA,cAAA,OAAKC,UAAU,cACXD,IAAAA,cAAA,SACIC,UAAU,yBACV6M,QAAQ,YAER9M,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,gCACHC,eAAe,cAGvBJ,IAAAA,cAAA,OAAKC,UAAU,qBACXD,IAAAA,cAAA,SACIG,GAAG,WACHiJ,KAAK,OACL8D,UAAW,GACXjN,UAAU,eACVuG,MAAOd,KAAKrB,MAAMQ,SAClB0E,SAAU7D,KAAKiO,iBAEnB3T,IAAAA,cAAA,OAAKC,UAAU,cACXD,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,qCACHC,eAAe,yPAMlCsF,KAAKtE,MAAMwS,wBACR5T,IAAAA,cAAA,OAAKC,UAAU,cACXD,IAAAA,cAAA,SACIC,UAAU,yBACV6M,QAAQ,WAER9M,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,gCACHC,eAAe,qBAGvBJ,IAAAA,cAAA,OAAKC,UAAU,qBACXD,IAAAA,cAAA,SACIG,GAAG,UACHiJ,KAAK,OACL8D,UAAW,KACXjN,UAAU,eACVuG,MAAOd,KAAKrB,MAAM2N,QAClBzI,SAAU7D,KAAKmO,gBAEnB7T,IAAAA,cAAA,OAAKC,UAAU,cACXD,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,qCACHC,eAAe,gPAMnCJ,IAAAA,cAAA,OAAKC,UAAU,0BACXD,IAAAA,cAACyN,EAAAA,EAAS,CACNrE,KAAK,YACL0K,OAAQ,CAACpO,KAAKtE,MAAM8Q,YAAaxM,KAAKrB,MAAM8N,eAEhDnS,IAAAA,cAACW,EAAAA,KAAI,CACDV,UAAU,mBACVW,GAAE,IAAAC,OAAM6E,KAAKtE,MAAMb,KAAKO,KAAI,oCAE5Bd,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,8BACHC,eAAe,YAGvBJ,IAAAA,cAAC0N,GAAAA,EAAa,CACVzN,UAAU,kBACVmJ,KAAK,SACLuE,SAAUjI,KAAKrB,MAAMwE,OACrB+E,aAAclI,KAAKtE,MAAM2F,QACzBpF,QAAS+D,KAAKyF,aACdhL,GAAG,eAEHH,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAIiT,EAAejT,GACnBC,eAAgBgT,EAAehT,kBAGtCoW,KAMzB,ECrlBJ,MAAMzC,IAAWC,EAAAA,EAAAA,gBAAe,CAC5BX,OAAQ,CACJlT,GAAI,4BACJC,eAAgB,QAEpB+S,OAAQ,CACJhT,GAAI,mBACJC,eAAgB,OAEpB2G,QAAS,CACL5G,GAAI,8BACJC,eAAgB,eA8BlBoY,GAAqBlY,IAA6F,IAA5F,KAACC,EAAI,QAAE2C,EAAO,2BAAEwQ,EAA0B,uBAAEE,GAA8BtT,EAClG,MAAM6W,GAAUC,EAAAA,EAAAA,eAETlF,EAAagC,IAAkBC,EAAAA,EAAAA,UAAS,IAgB/C,OACInU,IAAAA,cAACsX,GAAuB,CACpB/W,KAAMA,EACN4S,OAAQY,GAASZ,OACjBE,OAAQU,GAASV,OACjBtM,QAASgN,GAAShN,QAClByP,YAAa,GACbzD,OArBgBnM,UACpBsN,EAAe,IAEf,MAAM,KAAChO,EAAI,MAAEqF,SAAerI,EAAQuV,mBAAmB9G,GACnDzL,EACAiR,EAAQtP,KAAK,IAADhH,OAAKN,EAAKO,KAAI,oDAAAD,OAAmDqF,EAAK/F,KAIlFoL,GACA2I,EAAe3I,EAAMtJ,QACzB,EAWIiQ,YAAaA,EACbwB,2BAA4BA,EAC5BE,uBAAwBA,GAC1B,EAER4E,GAAAvX,UAAA,CAnDEiC,QAAOhC,IAAAA,MAAA,CAKHuX,mBAAkBvX,IAAAA,KAAAsB,aAAAA,WAMtBkR,2BAA0BxS,IAAAA,KAAAsB,WAK1BoR,uBAAsB1S,IAAAA,KAAAsB,YAqC1B,YCzDA,IAAeE,EAAAA,EAAAA,UAlBf,SAAyB2B,GACrB,MAAMuG,GAASmF,EAAAA,EAAAA,IAAU1L,GAGzB,MAAO,CACHqP,2BAHqE,SAAtC9I,EAAO0J,2BAItCV,uBAH6D,SAAlChJ,EAAO2J,uBAK1C,IAEA,SAA4BtP,GACxB,MAAO,CACH/B,SAASgC,EAAAA,EAAAA,oBAAmB,CACxBuT,mBAAkBA,GAAAA,IACnBxT,GAEX,GAEA,CAA4DuT,I,qCCpBrD,SAASE,GAAUC,GACtB,OAAOC,EAAAA,GAAAA,IAAe,CAClBC,WAAYlV,EAAAA,GAAQ+U,UACpBI,UAAWC,GAAAA,GAASC,qBACpBC,OAAQ,CACJN,IAGZ,CAEO,SAASO,GAASC,EAAmBC,GACxC,OAAOR,EAAAA,GAAAA,IAAe,CAClBC,WAAYlV,EAAAA,GAAQuV,SACpBJ,UAAWC,GAAAA,GAASC,qBACpBC,OAAQ,CACJE,EACAC,IAGZ,CAYO,SAASC,KAAoD,IAA3C1T,EAAI0I,UAAAlI,OAAA,QAAAmT,IAAAjL,UAAA,GAAAA,UAAA,GAAG,EAAGkL,EAAOlL,UAAAlI,OAAA,QAAAmT,IAAAjL,UAAA,GAAAA,UAAA,GAjCZ,GAkC1B,OAAOuK,EAAAA,GAAAA,IAAe,CAClBC,WAAYlV,EAAAA,GAAQ6V,sBACpBV,UAAWC,GAAAA,GAASU,sBACpBR,OAAQ,CACJtT,EACA4T,IAGZ,CAEO,SAASG,GAAWP,GACvB,OAAOP,EAAAA,GAAAA,IAAe,CAClBC,WAAYlV,EAAAA,GAAQ+V,WACpBZ,UAAWC,GAAAA,GAASC,qBACpBC,OAAQ,CACJE,IAGZ,CAEO,SAASQ,GAAUR,GACtB,OAAOP,EAAAA,GAAAA,IAAe,CAClBC,WAAYlV,EAAAA,GAAQgW,UACpBb,UAAWC,GAAAA,GAASC,qBACpBC,OAAQ,CACJE,IAGZ,C,sgCC5DO,SAASS,GAAiBvV,GAC7B,OAAOA,EAAME,SAASsV,aAAaC,aACvC,CAMO,SAASC,GAAiB1V,GAC7B,OAAOA,EAAME,SAASsV,aAAaG,aACvC,CAEO,SAASC,GAAY5V,GACxB,OAAOA,EAAME,SAASsV,aAAaK,QACvC,CAEO,SAASC,GAAa9V,GACzB,OAAOA,EAAME,SAASsV,aAAaO,SACvC,CAEO,SAASC,GAA4BhW,GACxC,OAAOA,EAAME,SAASsV,aAAaS,wBACvC,CAEO,MAAMC,IAAsEtJ,EAAAA,GAAAA,IAC/E,2BACAuJ,EAAAA,GACAZ,IACA,CAAClL,EAAQ+L,IACEvF,OAAOwF,KAAKD,GACfxT,KAAKa,GAAQ2S,EAAM3S,KACnBuJ,QAAQsJ,GAAiBA,EAAa9H,UAAYnE,MAIjDkM,IAAuD3J,EAAAA,GAAAA,IAChE,qBACA4J,GAAAA,IACCxW,GAAuBA,EAAME,SAASsV,aAAaiB,kBACpD,CAACC,EAAMC,IACID,EAAOC,EAAM,KAIfC,IAAkDhK,EAAAA,GAAAA,IAC3D,gBACA4J,GAAAA,IACCxW,GAAuBA,EAAME,SAASsV,aAAaqB,aACpD,CAACH,EAAMC,IACID,EAAOC,EAAM,MAW4D/J,EAAAA,GAAAA,IACpF,gCACAuJ,EAAAA,GACAT,IACA,CAACrL,EAAQ+L,IACEvF,OAAOlU,OAAOyZ,GAAOpJ,QAAQ8J,GAAMA,EAAEtI,UAAYnE,MALzD,MASM0M,IAAmEnK,EAAAA,GAAAA,IAC5E,iBACAgJ,IAlBG,SAA2B5V,GAC9B,OAAOA,EAAME,SAASsV,aAAawB,cACvC,IAkBI,CAACnB,EAAUmB,IACPC,GAAAA,GAAA,GACOpB,GACAmB,K,+9BAK+DpK,EAAAA,GAAAA,IAC1E,8BACAmK,GACAZ,EAAAA,IACA,CAACN,EAAUqB,IACArG,OAAOlU,OAAOkZ,GAAU7I,QAAQmK,GAC5BA,KAAaA,EAAQ3I,SAAW2I,EAAQ3I,UAAY0I,IAAkBC,EAAQC,gBACtFnK,MAAK,CAACoK,EAAGC,IAAMD,EAAEhR,aAAakR,cAAcD,EAAEjR,kBCnEzD,MA4KA,GA1JuBmR,IACnB,MAAM,cAAC/b,IAAiBC,EAAAA,EAAAA,YAEjBsR,EAAQyK,IAAa3H,EAAAA,EAAAA,UAAS,IAE/B4H,EAAgB1K,EAAO7F,cAE7B,IAAIwQ,EAEAA,EADAH,EAAeG,kBACKH,EAAeG,kBAEflc,EAAc,CAACK,GAAI,wBAAyBC,eAAgB,WAGpF,IAAI2K,EAAW,GACXkR,EAAa,EACjB,GAAIJ,EAAe9U,QACfgE,EAAW,CACP/K,IAAAA,cAACgI,EAAAA,EAAa,CACVF,IAAI,iBAGT,CACH,IAAIoU,GAAc,EACqB,mBAA5BL,EAAe9Q,UACrBA,EAAUmR,GAAeL,EAAe9Q,SAASgR,GAElDhR,EAAW8Q,EAAe9Q,SAE9BA,EAAW/K,IAAAA,SAAeiH,IAAI8D,GAAWE,GAC9BjL,IAAAA,aAAmBiL,EAAO,CAAC8Q,oBAEd,IAApBhR,EAAS5E,QAAiB+V,EAwB1BD,EAAalR,EAAS5E,OAvBjB4V,EAWMF,EAAeM,kBACtBpR,EAAW,CACP/K,IAAAA,cAAA,OACIC,UAAU,6CACVE,GAAG,4BACH2H,IAAI,mBAEH9H,IAAAA,aAAmB6b,EAAeM,gBAAiB,CAACnb,OAAMsa,GAAAA,GAAA,GAAMO,EAAeM,gBAAgB/a,MAAMJ,QAAM,IAAEob,WAAYL,SAjB9HF,EAAeQ,YACftR,EAAW,CACP/K,IAAAA,cAAA,OACIC,UAAU,6CACV6H,IAAI,aAEH+T,EAAeQ,YAkBxC,CAEA,IAAIC,EAAU,KAEVT,EAAeS,SAAWT,EAAeU,UACzCD,EACItc,IAAAA,cAACW,EAAAA,KAAI,CACDV,UAAU,WACVW,GAAIib,EAAeS,SAEnBtc,IAAAA,cAAA,UACIoJ,KAAK,SACLnJ,UAAU,kBACVE,GAAI0b,EAAeW,aAEnBxc,IAAAA,cAAA,YACK6b,EAAeU,YAOpC,MAAME,EAAYpL,EAAOlL,OAAS,GAC5B,WAACuW,EAAU,SAAEC,EAAQ,MAAEC,EAAK,YAAEC,EAAW,WAAEC,GApGnCC,EAAClB,EAAuBI,EAAoBQ,KAC1D,MAAM9W,EAAQ8W,IAAcZ,EAAelW,KAAQ,EAAIkW,EAAelW,KAChEqX,EAAYP,IAAcZ,EAAemB,SAAYf,EAAaJ,EAAemB,SACjFJ,EAASH,IAAcZ,EAAee,MAASX,EAAaJ,EAAee,MAEjF,IAAIF,EAAc/W,EAAOqX,EAAY,EACjCL,GAAYhX,EAAO,GAAKqX,EAS5B,OARAL,EAAWA,EAAWC,EAAQA,EAAQD,EACrB,IAAbA,IACAD,EAAa,GAMV,CAACA,aAAYC,WAAUC,QAAOC,YAHjBH,GAAc,EAGgBI,WAF/BH,GAAYC,EAE8B,EAqFEG,CAAUlB,EAAgBI,EAAYQ,GAC/FQ,EAAoBhB,EAAa,EAAIlR,EAASzC,MAAMoU,EAAa,EAAGC,GAAY5R,EAEtF,IAAImS,EAAiBrB,EAAe7S,aAChCmU,EAAatB,EAAejT,SAQhC,OAPIiU,IACAK,EAAiBA,QAEjBJ,IACAK,EAAaA,QAIbnd,IAAAA,cAAA,OAAKC,UAAU,qBACXD,IAAAA,cAAA,OAAKC,UAAU,oBACXD,IAAAA,cAAA,UACK6b,EAAe1I,QAEnBmJ,GAELtc,IAAAA,cAAA,OAAKC,UAAU,qBACXD,IAAAA,cAAA,OAAKC,UAAU,4BACXD,IAAAA,cAACkJ,EAAAA,EAAU,MACXlJ,IAAAA,cAAA,SACIoJ,KAAK,SACLnJ,UAAU,eACVoJ,YAAa2S,EACbxV,MAAO6K,EACP9H,SA1GEhE,GAAqCuW,EAAUvW,EAAEe,OAAOE,OA2G1DrG,GAAG,kBAIfH,IAAAA,cAAA,QAAMC,UAAU,wBACX4b,EAAeuB,UAEpBpd,IAAAA,cAAA,OAAKC,UAAU,kBACVgd,GAELjd,IAAAA,cAAA,OAAKC,UAAU,oBACXD,IAAAA,cAAA,OAAKC,UAAU,0BACXD,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,gCACHC,eAAe,+DACfY,OAAQ,CACJ0b,aACAC,WACAC,WAGR5c,IAAAA,cAAA,UACIoJ,KAAK,SACLnJ,UAAW,iDAAmD4c,EAAc,WAAa,IACzFlb,QAASub,EACT,aAAYpd,EAAc,CAACK,GAAI,0CAA2CC,eAAgB,cAE1FJ,IAAAA,cAACiJ,EAAAA,EAAY,OAEjBjJ,IAAAA,cAAA,UACIoJ,KAAK,SACLnJ,UAAW,4CAA8C6c,EAAa,WAAa,IACnFnb,QAASwb,EACT,aAAYrd,EAAc,CAACK,GAAI,sCAAuCC,eAAgB,UAEtFJ,IAAAA,cAACwI,EAAAA,EAAQ,SAInB,E,sbCpLP,SAAS6U,GAAc1E,EAActH,EAAiBiM,GACzD,IAAKjM,EACD,OAAO,EAEX,MAAMxM,EAAW8T,EAAI9T,UAAY,GAC3BmJ,EAAc2K,EAAI3K,aAAe,GACjClK,EAAc6U,EAAIjO,cAAgB,GAExC,IAAI6S,EAAgB,SAIpB,OAHID,GAASA,EAAMzY,WACf0Y,EAAgBD,EAAMzY,aAE2B,IAA5CA,EAAS2G,cAAcpE,QAAQiK,KACW,IAA/CvN,EAAY0H,cAAcpE,QAAQiK,KACa,IAA/CrD,EAAYxC,cAAcpE,QAAQiK,KACe,IAAjDkM,EAAc/R,cAAcpE,QAAQiK,GAC5C,CAqEe,MAAMmM,WAAYxd,IAAAA,cACtBoF,WAAAA,CAAYhE,GACfiE,MAAMjE,GAAOkE,GAAA,kBAUL,KACRI,KAAKtE,MAAM8B,QAAQyW,UAAUjU,KAAKtE,MAAMuX,IAAI7F,QAAQ,IACvDxN,GAAA,mBAEY,KACTI,KAAKtE,MAAM8B,QAAQwW,WAAWhU,KAAKtE,MAAMuX,IAAI7F,QAAQ,IACxDxN,GAAA,8BAEwBnF,IACrBuF,KAAKtE,MAAM8B,QAAQua,sBAAsBtd,EAAG,IAC/CmF,GAAA,+BAEyBnF,IACtBuF,KAAKtE,MAAM8B,QAAQwa,uBAAuBvd,EAAG,IAChDmF,GAAA,2BAEqBnF,IAClBuF,KAAKE,SAAS,CAAC+X,aAAcxd,GAAI,IACpCmF,GAAA,6BAEsB,KACnBI,KAAKtE,MAAM8B,QAAQ0a,sBAAsBlY,KAAKrB,MAAMsZ,cACpDjY,KAAKmY,cAAc,IACtBvY,GAAA,qBAEc,KACXI,KAAKE,SAAS,CAAC+X,aAAc,IAAI,IACpCrY,GAAA,wBAEiB,KACdI,KAAKE,SAAS,CACVkY,mBAAoB,OACpBhG,MAAO,CACH9J,YAAa,KAEnB,IACL1I,GAAA,yBAEkB,KACfI,KAAKE,SAAS,CACVkY,mBAAoB,SACpBhG,MAAO,CACH9J,YAAa,KAEnB,IACL1I,GAAA,gCAE0BC,IACvB,MAAMe,EAASf,EAAEe,OACjBZ,KAAKE,SAAS,CACVkS,MAAO5C,OAAO6I,OAAO,CAAC,EAAGrY,KAAKrB,MAAMyT,MAAO,CAAC9J,YAAa1H,EAAOE,SAClE,IACLlB,GAAA,0BAEmBsB,UAGhB,GAFArB,EAAEC,iBAEmC,KAAjCE,KAAKrB,MAAMyT,MAAM9J,YAOjB,YANAtI,KAAKE,SAAS,CAAC2F,MACXvL,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,8BACHC,eAAe,kCAM3B,MAAM,KAAC8F,EAAI,MAAEqF,SAAe7F,KAAKtE,MAAM8B,QAAQ8a,sBAAsBtY,KAAKtE,MAAMuX,IAAI7F,QAASpN,KAAKrB,MAAMyT,MAAM9J,aAC1G9H,EACAR,KAAKE,SAAS,CAACkY,mBAAoB,UAAWhG,MAAO5R,IAC9CqF,GACP7F,KAAKE,SAAS,CAAC2F,MAAOA,EAAMtJ,SAChC,IAhFAyD,KAAKrB,MAAQ,CACTsZ,aAAc,GACdG,mBAAoB,SACpBhG,MAAO,CAAC,EACRvM,MAAO,GAEf,CA6EO7D,MAAAA,GACH,MAAM7C,EAAWa,KAAKtE,MAAMuX,IAAI9T,UAAY,GACtCmJ,EAActI,KAAKtE,MAAMuX,IAAI3K,aAAe,GAC5ClK,EAAc4B,KAAKtE,MAAMuX,IAAIjO,cAAgB,GAEnD,IAAI6S,EAAgB,SAChB7X,KAAKtE,MAAM6c,QACXV,EAAgB,iBACT7X,KAAKtE,MAAMkc,OAAS5X,KAAKtE,MAAMkc,MAAMzY,WAC5C0Y,EAAgB7X,KAAKtE,MAAMkc,MAAMzY,UAErC,MAAMwM,EAAS3L,KAAKtE,MAAMiQ,OAAS3L,KAAKtE,MAAMiQ,OAAO7F,cAAgB,GACrE,IAAK6R,GAAc3X,KAAKtE,MAAMuX,IAAKtH,EAAQ3L,KAAKtE,MAAMkc,OAClD,OAAO,KAGX,MAAMY,EAAY,GAiGlB,IAAI3P,EAhGJ2G,OAAOlU,OAAO0E,KAAKtE,MAAM+c,cAAcjW,SAAS4P,IAC5C,IAAIsG,EAEAC,EADAC,EAAe,GAGfxG,EAAMyG,UACNH,EACIpe,IAAAA,cAAA,KACIG,GAAI2X,EAAM3X,GAAK,cACf0P,KAAK,IACLlO,QAAU4D,IACNA,EAAEC,iBACFE,KAAKgY,uBAAuB5F,EAAM3X,GAAG,GAGzCH,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,kCACHC,eAAe,cAI3Bke,EAAe,QACfD,EACIre,IAAAA,cAAA,QAAMC,UAAU,cACZD,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,0CACHC,eAAe,gBAI3Bge,EACIpe,IAAAA,cAAA,KACIG,GAAI2X,EAAM3X,GAAK,YACf0P,KAAK,IACLlO,QAAU4D,IACNA,EAAEC,iBACFE,KAAK+X,sBAAsB3F,EAAM3X,GAAG,GAGxCH,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,gCACHC,eAAe,aAM/B8d,EAAUrW,KACN7H,IAAAA,cAAA,OACI8H,IAAKgQ,EAAM3X,GACXF,UAAU,kBAEVD,IAAAA,cAAA,OAAKC,UAAU,oDACXD,IAAAA,cAAA,OAAKC,UAAWqe,GACZte,IAAAA,cAAA,OAAKC,UAAU,yCACXD,IAAAA,cAAA,SACIA,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,iCACHC,eAAe,yBAGtB0X,EAAM9J,aAEXhO,IAAAA,cAAA,OAAKC,UAAU,+DACXD,IAAAA,cAAA,SACIA,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,+BACHC,eAAe,gBAGtB0X,EAAM3X,KAGfH,IAAAA,cAAA,WACKqe,EACAD,EACA,MACDpe,IAAAA,cAAA,KACIG,GAAI2X,EAAM3X,GAAK,UACf0P,KAAK,IACLlO,QAAU4D,IACNA,EAAEC,iBACFE,KAAK8Y,mBAAmB1G,EAAM3X,GAAG,GAGrCH,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,8BACHC,eAAe,eAMtC,IAIiB,WAAlBmd,IACAhP,EACIvO,IAAAA,cAAA,OAAKC,UAAU,gBACXD,IAAAA,cAAA,UACIG,GAAG,cACHF,UAAU,0BACV0B,QAAS+D,KAAK+Y,iBAEdze,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,0BACHC,eAAe,sBAGtB,MACDJ,IAAAA,cAACW,EAAAA,KAAI,CAACC,GAAE,IAAAC,OAAM6E,KAAKtE,MAAMb,KAAKO,KAAI,+BAAAD,OAA8B6E,KAAKtE,MAAMuX,IAAI7F,UAC3E9S,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,mBACHC,eAAe,UAGtB,MACDJ,IAAAA,cAAA,UACIC,UAAU,0BACV0B,QAAS+D,KAAKgU,YAEd1Z,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,qBACHC,eAAe,eAMF,IAA7BsF,KAAKtE,MAAMuX,IAAIjY,YACf6N,EACIvO,IAAAA,cAAA,OAAKC,UAAU,gBACXD,IAAAA,cAAA,UACIC,UAAU,0BACV0B,QAAS+D,KAAKiU,WAEd3Z,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,oBACHC,eAAe,cAOG,SAAlCsF,KAAKrB,MAAMyZ,mBACXI,EAAUrW,KACN7H,IAAAA,cAAA,OACI8H,IAAK,SACL7H,UAAU,kBAEVD,IAAAA,cAAA,OAAK8H,IAAK,UACN9H,IAAAA,cAAA,QACIC,UAAU,kBACV+M,SAAUtH,KAAKgZ,mBAEf1e,IAAAA,cAAA,OAAKC,UAAU,OACXD,IAAAA,cAAA,SACIC,UAAU,4BACV6M,QAAQ,YAER9M,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,4BACHC,eAAe,yBAGvBJ,IAAAA,cAAA,OAAKC,UAAU,YACXD,IAAAA,cAAA,SACIG,GAAG,WACHwe,WAAW,EACX1e,UAAU,uBACVmJ,KAAK,OACL8D,UAAW,GACX1G,MAAOd,KAAKrB,MAAMyT,MAAM9J,YACxBzE,SAAU7D,KAAKkZ,4BAI3B5e,IAAAA,cAAA,WACIA,IAAAA,cAAA,OAAKC,UAAU,aACXD,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,gCACHC,eAAe,kEAGvBJ,IAAAA,cAAA,SACIG,GAAG,cACHF,UAAU,sBAETyF,KAAKrB,MAAMkH,OAEhBvL,IAAAA,cAAA,OAAKC,UAAU,QACXD,IAAAA,cAACyI,EAAAA,EAAU,CACPC,SAAS,qBACTK,cACI/I,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,4BACHC,eAAe,SAGvByI,QAAQ,IAEZ7I,IAAAA,cAAA,UACIC,UAAU,0BACV0B,QAAS+D,KAAKmZ,kBAEd7e,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,8BACHC,eAAe,kBASN,YAAlCsF,KAAKrB,MAAMyZ,oBAClBI,EAAUrW,KACN7H,IAAAA,cAAA,OACI8H,IAAK,UACL7H,UAAU,sCAEVD,IAAAA,cAAA,OAAKC,UAAU,QACXD,IAAAA,cAACmC,EAAAA,EAAW,CAACC,oBAAoB,SACjCpC,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,4BACHC,eAAe,4EAGvBJ,IAAAA,cAAA,OAAKC,UAAU,yCACXD,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,4BACHC,eAAe,wBAElBsF,KAAKrB,MAAMyT,MAAM9J,aAEtBhO,IAAAA,cAAA,OAAKC,UAAU,yCACXD,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,0BACHC,eAAe,eAElBsF,KAAKrB,MAAMyT,MAAM3X,IAEtBH,IAAAA,cAAA,UAAQC,UAAU,mBACdD,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,6BACHC,eAAe,mBAElBsF,KAAKrB,MAAMyT,MAAMA,OAEtB9X,IAAAA,cAAA,OAAKC,UAAU,QACXD,IAAAA,cAAA,UACIC,UAAU,yBACV0B,QAAS+D,KAAKmZ,kBAEd7e,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,yBACHC,eAAe,cAQvC,MAAM0e,EAAWtU,EAAAA,GAAsB9E,KAAKtE,MAAMiK,KAAKlL,GAAIuF,KAAKtE,MAAMiK,KAAK0T,qBAE3E,OACI/e,IAAAA,cAAA,OAAKC,UAAU,wBACXD,IAAAA,cAAA,OAAKC,UAAW,0BACZD,IAAAA,cAAA,OACIC,UAAW,eACXiO,IAAK,YACLC,IAAK2Q,KAGb9e,IAAAA,cAAA,OAAKC,UAAU,gBACXD,IAAAA,cAAA,OAAKC,UAAU,4EACXD,IAAAA,cAAA,UAAQC,UAAU,sBACb6D,EAAc,MAAQe,EAAW,KAErC0J,GAELvO,IAAAA,cAAA,OAAKC,UAAU,4BACXD,IAAAA,cAACgf,GAAAA,EAAQ,CAAC/c,QAAS+L,KAEvBhO,IAAAA,cAAA,OAAKC,UAAU,eACXD,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,kBACHC,eAAe,gBAElBmd,GAELvd,IAAAA,cAAA,OAAKC,UAAU,qBACVie,IAGTle,IAAAA,cAACif,GAAAA,EAAY,CACT/e,MACIF,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,oBACHC,eAAe,iBAGvB6B,QACIjC,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,0BACHC,eAAe,+CAGvBiB,kBACIrB,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,qBACHC,eAAe,WAGvB4B,WAAW,+BACXkd,KAAkC,KAA5BxZ,KAAKrB,MAAMsZ,aACjBtb,UAAWqD,KAAKyZ,qBAChBC,SAAU1Z,KAAKmY,eAI/B,E,0ZC5aW,MAAMwB,WAAarf,IAAAA,cACvBoF,WAAAA,CAAYhE,GACfiE,MAAMjE,GAAOkE,GAAA,iBAqELqT,GAEJ3Y,IAAAA,cAACwd,GAAG,CACA1V,IAAK6Q,EAAI7F,QACT6F,IAAKA,EACL2E,MAAO5X,KAAKtE,MAAMke,OAAO3G,EAAI7F,SAC7BzH,KAAM3F,KAAKtE,MAAMme,MAAM5G,EAAI7F,SAC3BqL,aAAezY,KAAKtE,MAAM+c,cAAgBzY,KAAKtE,MAAM+c,aAAaxF,EAAI7F,UAAa,CAAC,EACpF5P,QAASwC,KAAKtE,MAAM8B,QACpB3C,KAAMmF,KAAKtE,MAAMb,KACjB0d,QAASvY,KAAKtE,MAAM8Z,WAAWsE,SAAS7G,EAAI7F,aAGvDxN,GAAA,aAEO+L,IACJ,MAAMoO,EAAOvK,OAAOlU,OAAO0E,KAAKtE,MAAMqe,MAAMnO,MAAK,CAACoK,EAAGC,IAAMD,EAAE7W,SAAS+W,cAAcD,EAAE9W,YAChF6a,EAAS/G,GAAiB0E,GAAc1E,EAAKtH,EAAQ3L,KAAKtE,MAAMke,OAAO3G,EAAI7F,UAC3E6M,EAAcF,EAAKpO,QAAQsH,GAA0B,IAAlBA,EAAIjY,YAAiB2Q,OAAOqO,GAAOzY,IAAIvB,KAAKka,UAC/EC,EAAeJ,EAAKpO,QAAQsH,GAAQA,EAAIjY,UAAY,IAAG2Q,OAAOqO,GAAOzY,IAAIvB,KAAKka,UAapF,MAAO,CAZU,CACb5f,IAAAA,cAAA,OAAK8H,IAAI,YACL9H,IAAAA,cAAA,KAAM8f,eAAc,CAChBH,YAAaA,IAEjB3f,IAAAA,cAAA,KAAM+f,gBAAe,CACjBC,YAAaH,EAAa1Z,OAAS,EACnC0Z,aAAcA,MAKRF,EAAYxZ,OAAS,GAAK0Z,EAAa1Z,OAAS,EAAE,IAnGpET,KAAKrB,MAAQ,CACT0C,SAAS,EAEjB,CAEOQ,iBAAAA,GACH7B,KAAKtE,MAAM8B,QAAQmW,SACfhM,GAAAA,GAAUe,aAAa6R,eACvB5S,GAAAA,GAAUe,aAAa8R,WACzBja,MACGyG,IACG,GAAIA,EAAOxG,KAAM,CACb,MAAMia,EAAW,GAEjB,IAAK,MAAMxH,KAAOjM,EAAOxG,KAErBR,KAAKtE,MAAM8B,QAAQyB,QAAQgU,EAAIyH,UAG/BD,EAAStY,KAAKnC,KAAKtE,MAAM8B,QAAQyB,QAAQgU,EAAI7F,UAC7CqN,EAAStY,KAAKnC,KAAKtE,MAAM8B,QAAQmd,2BAA2B1H,EAAI7F,UAGpEwN,QAAQC,IAAIJ,GAAUla,MAAK,KACvBP,KAAKE,SAAS,CAACmB,SAAS,GAAO,GAEvC,KAGJrB,KAAKtE,MAAMyZ,aACXnV,KAAKtE,MAAM8B,QAAQsd,iBAE3B,CAEAT,eAAAA,CAAgB3e,GACZ,IAAKA,EAAM4e,YACP,OAAO,KAEX,MAAMS,EAAgBzgB,IAAAA,SAAeiH,IAAI7F,EAAMye,cAAe5U,GACnDjL,IAAAA,aAAmBiL,EAAO,CAACoG,OAAQjQ,EAAMiQ,WAEpD,OACIrR,IAAAA,cAAAA,IAAAA,SAAA,KACIA,IAAAA,cAAA,OAAKC,UAAU,gBACXD,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,gBACHC,eAAe,cAGvBJ,IAAAA,cAAA,OAAKC,UAAU,sBACVwgB,GAIjB,CAEAX,cAAAA,CAAe1e,GACX,MAAMqf,EAAgBzgB,IAAAA,SAAeiH,IAAI7F,EAAMue,aAAc1U,GAClDjL,IAAAA,aAAmBiL,EAAO,CAACoG,OAAQjQ,EAAMiQ,WAEpD,OACIrR,IAAAA,cAAA,WACKygB,EAGb,CAqCO/Y,MAAAA,GACH,OACI1H,IAAAA,cAAC0gB,GAAa,CACVvN,OACInT,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,qBACHC,eAAe,iBAGvBmc,QAAS7W,KAAKtE,MAAMuf,YAChB3gB,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,kBACHC,eAAe,oBAGvBkc,QAAS,IAAM5W,KAAKtE,MAAMb,KAAKO,KAAO,yBACtC0b,YAAY,gBACZH,UACIrc,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,oBACHC,eAAe,0BAGvB+b,gBACInc,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,mBACHC,eAAe,4CACfY,OAAQ,CACJ2a,EAAIiF,GAAmB5gB,IAAAA,cAAA,SAAI4gB,MAIvCxD,SACIpd,IAAAA,cAAAA,IAAAA,SAAA,KACIA,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,oBACHC,eAAe,qIACfY,OAAQ,CACJ6f,YACI7gB,IAAAA,cAAC4P,GAAAA,EAAY,CACTC,KAAK,iDACLC,SAAS,QAET9P,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,2BACHC,eAAe,qBAMnCJ,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,aACHC,eAAgB,4DAChBY,OAAQ,CACJ0a,EAAIkF,GAAmB5gB,IAAAA,cAACW,EAAAA,KAAI,CAACC,GAAG,4CAA4CggB,OAK5F5E,kBAAmBxR,EAAAA,GAAsB,CAACrK,GAAI,qBAAsBC,eAAgB,wBACpF2G,QAASrB,KAAKrB,MAAM0C,SAEnBrB,KAAK+Z,KAGlB,EACHna,GA7KoB+Z,GAAI,aA3ErBnE,WAAUha,IAAAA,QAAAA,IAAAA,QAAAsB,WAKVqY,YAAW3Z,IAAAA,KAAAsB,WAgBXme,WAAUzf,IAAAA,KAEVgC,QAAOhC,IAAAA,MAAA,CAKHmY,SAAQnY,IAAAA,KAAAsB,WAKR6d,2BAA0Bnf,IAAAA,KAAAsB,WAK1Bwb,sBAAqB9c,IAAAA,KAAAsB,WAErBob,sBAAqB1c,IAAAA,KAAAsB,WACrBib,sBAAqBvc,IAAAA,KAAAsB,WACrBkb,uBAAsBxc,IAAAA,KAAAsB,WAKtBmC,QAAOzD,IAAAA,KAAAsB,WAKPkX,WAAUxY,IAAAA,KAAAsB,WAKVmX,UAASzY,IAAAA,KAAAsB,WAKTge,gBAAetf,IAAAA,KAAAsB,aAAAA,aC5BvB,UAAeE,EAAAA,EAAAA,UA5Cf,SAAyB2B,GACrB,MACMsc,EAAiD,UADxC5Q,EAAAA,EAAAA,IAAU1L,GACCyc,yBACpBrB,GAAOsB,EAAAA,GAAAA,IAAuB1c,GAC9B2c,EAAY9L,OAAOlU,OAAOye,GAC1BH,EAAS0B,EACXC,QAAO,CAACvU,EAAqCiM,KACzCjM,EAAOiM,EAAI7F,SAAWoO,EAAAA,GAAsB7c,EAAOsU,EAAIyH,UAChD1T,IACR,CAAC,GACF6S,EAAQyB,EACVC,QAAO,CAACvU,EAAqCiM,KACzCjM,EAAOiM,EAAI7F,SAAWoO,EAAAA,GAAsB7c,EAAOsU,EAAI7F,SAChDpG,IACR,CAAC,GAER,MAAO,CACHiU,aACAlB,OACAtB,aAAc9Z,EAAME,SAAS4c,MAAMC,uBACnC9B,SACAC,QACArE,WAAYD,GAAc5W,GAC1BwW,aAAaA,EAAAA,GAAAA,IAAYxW,GAEjC,IAEA,SAA4BY,GACxB,MAAO,CACH/B,SAASgC,EAAAA,EAAAA,oBAAmB,CACxBsb,gBAAe,MACfnH,SAAQ,GACRgH,2BAA0B,MAC1BrC,sBAAqB,MACrBJ,sBAAqB,MACrBH,sBAAqB,MACrBC,uBAAsB,MACtB/Y,QAAO,MACP+U,WAAU,GACVC,UAASA,IACV1U,GAEX,GAEA,CAA4Doa,I,odCtC5D,MAAMgC,GAAwB,eACxBC,GAAmB,SAqFV,MAAMC,WAAevhB,IAAAA,cAEhCoF,WAAAA,CAAYhE,GACRiE,MAAMjE,GAAOkE,GAAA,mBAFY,MAAIA,GAAA,uBAmBfC,IACdG,KAAKE,SAAS,CACVf,SAAUU,EAAEe,OAAOE,OACrB,IACLlB,GAAA,0BAEoBC,IACjBG,KAAKE,SAAS,CACV9B,YAAayB,EAAEe,OAAOE,OACxB,IACLlB,GAAA,0BAEoBC,IACjBG,KAAKE,SAAS,CACVoI,YAAazI,EAAEe,OAAOE,OACxB,IACLlB,GAAA,mBAEaC,IACVG,KAAKE,SAAS,CACV4b,KAAMjc,EAAEe,OAAOE,OACjB,IACLlB,GAAA,sBAEgBC,IACbG,KAAKE,SAAS,CACV6b,QAASlc,EAAEe,OAAO0M,SACpB,IACL1N,GAAA,2BAEqBC,IAClBG,KAAKE,SAAS,CACV8b,aAAcnc,EAAEe,OAAO0M,SACzB,IACL1N,GAAA,sBAEgBC,IACb,GAAIA,EAAEe,OAAO+F,OAAS9G,EAAEe,OAAO+F,MAAM,GAAI,CACrC,MAAMsV,EAAcpc,EAAEe,OAAO+F,MAAM,GACnC3G,KAAKkc,YAAcC,IAAIC,gBAAgBH,GAEvC,MAAMpV,EAAS,IAAIC,WACnBD,EAAOE,OAAUsV,IAAO,IAAAC,EACpB,MAAMC,EAAcC,GAAAA,GAAsC,QAAVF,EAACD,EAAGzb,cAAM,IAAA0b,OAAA,EAATA,EAAWtV,QACtDyV,EAAoBD,GAAAA,GAA+BD,GAEzDvc,KAAKE,SAAS,CACV0F,MAAO5F,KAAKkc,aAAe,GAC3BO,qBACF,EAEN5V,EAAO6V,kBAAkBT,GACzBpc,EAAEe,OAAOE,MAAQ,GACjBd,KAAKE,SAAS,CAAC+b,eACnB,MACIjc,KAAKE,SAAS,CAAC+b,YAAa,KAAMrW,MAAO,IAC7C,IACHhG,GAAA,mBAEY,KACTI,KAAKE,SAAS,CAAC+b,YAAa,UAAWrW,MAAO+W,IAAgB,IACjE/c,GAAA,oBAMasB,UACV,IAAI0b,EAAQC,EAAAA,GAAQC,iBAEhB9c,KAAKrB,MAAMmd,OAASH,GACpBiB,GAAS,IAAMC,EAAAA,GAAQE,kBAChB/c,KAAKrB,MAAMod,QAClBa,GAAS,IAAMC,EAAAA,GAAQG,qBAChBhd,KAAKrB,MAAMqd,eAClBY,GAAS,IAAMC,EAAAA,GAAQI,6BAG3B,MAAMC,QAAoBld,KAAKtE,MAAM8B,QAAQ2f,gBAAgB3c,EAAK4M,QAASwP,GAC3E,OAAIM,EACOA,EAAYrX,MAGhB,IAAI,IACdjG,GAAA,qBAEcsB,UAGX,GAFArB,EAAEC,iBAEEE,KAAKrB,MAAMye,OACX,OAGJ,IAAKpd,KAAKrB,MAAMQ,UAAYa,KAAKrB,MAAMQ,SAASsB,OAAS,EASrD,YARAT,KAAKE,SAAS,CACV2F,MACIvL,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,mCACHC,eAAe,6JAO/B,GAAIsF,KAAKrB,MAAMsd,aAAejc,KAAKqd,OAAOrd,KAAKrB,MAAMsd,aAAc,CAC/D,IAAKqB,GAAAA,GAA0BxD,SAAS9Z,KAAKrB,MAAMsd,YAAYvY,MAS3D,YARA1D,KAAKE,SAAS,CACV2F,MACIvL,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,mCACHC,eAAe,mEAKxB,GAAIsF,KAAKrB,MAAMsd,YAAY5V,KAAOrG,KAAKtE,MAAM6hB,YAShD,YARAvd,KAAKE,SAAS,CACV2F,MACIvL,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,sCACHC,eAAe,wDAMnC,CAEAsF,KAAKE,SAAS,CACVkd,QAAQ,EACRvX,MAAO,KAGX,MAAMoN,EAAM,CACR9T,SAAUa,KAAKrB,MAAMQ,SAAS2G,cAAc3E,OAC5C6D,aAAchF,KAAKrB,MAAMP,YACzBkK,YAAatI,KAAKrB,MAAM2J,aAG5B,IAAI9H,EACAqF,EACJ,GAAI7F,KAAKtE,MAAMuX,IAAK,CAChB,MAAMjM,QAAehH,KAAKtE,MAAM8B,QAAQgW,SAASxT,KAAKtE,MAAMuX,IAAI7F,QAAS6F,GAqBzE,GApBIjM,GACAxG,EAAOwG,EAAOxG,KACdqF,EAAQmB,EAAOnB,OAEfA,EAAQf,EAAAA,GAAsB,CAACrK,GAAI,kBAAmBC,eAAgB,wBAGrEmL,GAASrF,IACNR,KAAKrB,MAAMsd,aAA0C,YAA3Bjc,KAAKrB,MAAMsd,YAErCpW,SAD0B7F,KAAKtE,MAAM8B,QAAQggB,mBAAmBhd,EAAK4M,QAASpN,KAAKrB,MAAMsd,cACrEpW,MACb7F,KAAKrB,MAAMsd,aAA0C,YAA3Bjc,KAAKrB,MAAMsd,mBACtCjc,KAAKtE,MAAM8B,QAAQigB,uBAAuBjd,EAAK4M,WAIxDvH,GAASrF,IACVqF,EAAQ7F,KAAK0d,YAAYld,IAGzBA,EAEA,YADAgG,EAAAA,GAAAA,KAAarE,KAAK,IAADhH,OAAK6E,KAAKtE,MAAMb,KAAKO,KAAI,sBAGlD,KAAO,CACH,MAAMuiB,EAAgB7Y,EAAAA,GAAyBmO,EAAI9T,UACnD,GAAIwe,EAAe,CACf,IAAIC,EAuBJ,OArBIA,EADAD,EAAcljB,KAAOojB,GAAAA,GAAiBC,uBAC7B,CACLV,QAAQ,EACRvX,MACIvL,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,oCACHC,eAAe,8DAKlB,CACL0iB,QAAQ,EACRvX,MACIvL,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,mCACHC,eAAe,iKAK/BsF,KAAKE,SAAS0d,EAElB,CAEA,MAAM5W,QAAehH,KAAKtE,MAAM8B,QAAQwV,UAAUC,GAC9CjM,GACAxG,EAAOwG,EAAOxG,KACdqF,EAAQmB,EAAOnB,OAEfA,EAAQf,EAAAA,GAAsB,CAACrK,GAAI,oBAAqBC,eAAgB,yBAG5E,IAAI0X,EAAQ,GACZ,IAAKvM,GAASrF,EAAM,CACZR,KAAKrB,MAAMsd,aAA0C,YAA3Bjc,KAAKrB,MAAMsd,kBAC/Bjc,KAAKtE,MAAM8B,QAAQggB,mBAAmBhd,EAAK4M,QAASpN,KAAKrB,MAAMsd,mBAE/Djc,KAAKtE,MAAM8B,QAAQigB,uBAAuBjd,EAAK4M,SAEzD,MAAM2Q,QAAoB/d,KAAKtE,MAAM8B,QAAQ8a,sBAAsB9X,EAAK4M,QACpEtI,EAAAA,GAAsB,CAACrK,GAAI,gCAAiCC,eAAgB,mBAIhF,IAAKqjB,GAAeA,EAAYlY,MAE5B,YADAW,EAAAA,GAAAA,KAAarE,KAAK,IAADhH,OAAK6E,KAAKtE,MAAMb,KAAKO,KAAI,uBAI9CgX,EAAQ2L,EAAYvd,KAAM4R,KAC9B,CAMA,IAJKvM,GAASrF,IACVqF,EAAQ7F,KAAK0d,YAAYld,IAGzBA,EAEA,YADAgG,EAAAA,GAAAA,KAAarE,KAAK,IAADhH,OAAK6E,KAAKtE,MAAMb,KAAKO,KAAI,uCAAAD,OAAsCqF,EAAK4M,QAAO,WAAAjS,OAAUiX,GAG9G,CAEApS,KAAKE,SAAS,CACVkd,QAAQ,IAGRvX,GACA7F,KAAKE,SAAS,CACV2F,MAAOA,EAAMtJ,SAErB,IAlQAyD,KAAKrB,MAAQ,CACTkH,MAAO,GACP1G,SAAUa,KAAKtE,MAAMuX,IAAMjT,KAAKtE,MAAMuX,IAAI9T,SAAW,GACrDf,YAAa4B,KAAKtE,MAAMuX,IAAMjT,KAAKtE,MAAMuX,IAAIjO,aAAe,GAC5DsD,YAAatI,KAAKtE,MAAMuX,IAAMjT,KAAKtE,MAAMuX,IAAI3K,YAAc,GAC3D8U,QAAQ,EACRxX,MAAO+W,GACPb,KAAMkC,GAAAA,GAAwBhe,KAAKtE,MAAMkhB,OAAS,IAAMjB,GAAwBC,GAChFG,UAAS/b,KAAKtE,MAAMuX,KAAM+K,GAAAA,GAAyBhe,KAAKtE,MAAMkhB,OAAS,IACvEZ,eAAchc,KAAKtE,MAAMuX,KAAM+K,GAAAA,GAA+Bhe,KAAKtE,MAAMkhB,OAAS,IAClFH,kBAAmB,CAACwB,UAAW,GAAIC,gBAAiB,IACpDjC,YAAa,KAErB,CAiEAoB,MAAAA,CAAOc,GACH,YAA+BvK,IAAvBuK,EAAc9X,IAC1B,CAqLArE,MAAAA,GACI,IAAIoc,EACA9jB,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,sBACHC,eAAe,QAGnB2jB,EACA/jB,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,yBACHC,eAAe,uBAGnB4jB,EACAhkB,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,2BACHC,eAAe,gBAKnBsF,KAAKtE,MAAMuX,MACXmL,EACI9jB,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,mBACHC,eAAe,SAGvB2jB,EACI/jB,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,yBACHC,eAAe,WAGvB4jB,EACIhkB,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,2BACHC,eAAe,iBAK3B,IAkBI6jB,EAlBAnF,EAAW,GACXoF,EACAlkB,IAAAA,cAACmkB,GAAAA,EAAW,CACRjkB,MACIF,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,6BACHC,eAAe,qBAIvBJ,IAAAA,cAAA,KACIC,UAAW,sBACX0B,QAAS+D,KAAK0e,YAEdpkB,IAAAA,cAAA,YAAO,OAmBnB,OAdI0F,KAAKtE,MAAMuX,MAAQjT,KAAKrB,MAAMsd,YAE1B7C,EADApZ,KAAKtE,MAAMiK,KACAb,EAAAA,GAAsB9E,KAAKtE,MAAMiK,KAAKlL,GAAIuF,KAAKtE,MAAMiK,KAAK0T,qBAE1DvU,EAAAA,GAAsB9E,KAAKtE,MAAMuX,IAAI7F,UAGpDgM,EAAWpZ,KAAKrB,MAAMiH,MACtB2Y,EAAcve,KAAKrB,MAAM8d,kBACrBzc,KAAKrB,MAAMiH,QAAU+W,KACrB6B,EAAkB,OAKtBlkB,IAAAA,cAAA,OAAKC,UAAU,qBACXD,IAAAA,cAAC+M,EAAe,KACZ/M,IAAAA,cAACW,EAAAA,KAAI,CAACC,GAAE,IAAAC,OAAM6E,KAAKtE,MAAMb,KAAKO,KAAI,uBAC9Bd,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,qBACHC,eAAe,kBAGtB0jB,GAEL9jB,IAAAA,cAAA,OAAKC,UAAU,kBACXD,IAAAA,cAAA,QACIC,UAAU,kBACV+M,SAAUtH,KAAKyF,cAEfnL,IAAAA,cAAA,OAAKC,UAAU,cACXD,IAAAA,cAAA,SACIC,UAAU,yBACV6M,QAAQ,YAER9M,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,oBACHC,eAAe,cAGvBJ,IAAAA,cAAA,OAAKC,UAAU,qBACXD,IAAAA,cAAA,SACIG,GAAG,WACHiJ,KAAK,OACL8D,UAAW,GACXjN,UAAU,eACVuG,MAAOd,KAAKrB,MAAMQ,SAClB0E,SAAU7D,KAAKiO,iBAEnB3T,IAAAA,cAAA,OAAKC,UAAU,cACXD,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,wBACHC,eAAe,iFAK/BJ,IAAAA,cAAA,OAAKC,UAAU,cACXD,IAAAA,cAAA,SACIC,UAAU,yBACV6M,QAAQ,WAER9M,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,gBACHC,eAAe,cAGvBJ,IAAAA,cAAA,OAAKC,UAAU,qBACXD,IAAAA,cAAA,OAAKC,UAAW,qBACZD,IAAAA,cAAA,OACIC,UAAW,UACXiO,IAAK,YACLC,IAAK2Q,EACL3a,MAAO8f,IAEVC,GAELlkB,IAAAA,cAAA,OACIC,UAAU,4BAEVD,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,oBACHC,eAAe,iBAEnBJ,IAAAA,cAAA,SACIC,UAAU,kBACVmN,OAAQC,GAAAA,GAAUgX,oBAClBjb,KAAK,OACLG,SAAU7D,KAAK4e,mBAK/BtkB,IAAAA,cAAA,OAAKC,UAAU,cACXD,IAAAA,cAAA,SACIC,UAAU,yBACV6M,QAAQ,eAER9M,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,uBACHC,eAAe,kBAGvBJ,IAAAA,cAAA,OAAKC,UAAU,qBACXD,IAAAA,cAAA,SACIG,GAAG,cACHiJ,KAAK,OACL8D,UAAW,GACXjN,UAAU,eACVuG,MAAOd,KAAKrB,MAAMP,YAClByF,SAAU7D,KAAK4N,oBAEnBtT,IAAAA,cAAA,OAAKC,UAAU,cACXD,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,4BACHC,eAAgB,2FAKhCJ,IAAAA,cAAA,OAAKC,UAAU,cACXD,IAAAA,cAAA,SACIC,UAAU,yBACV6M,QAAQ,eAER9M,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,sBACHC,eAAe,iBAGvBJ,IAAAA,cAAA,OAAKC,UAAU,qBACXD,IAAAA,cAAA,SACIG,GAAG,cACHiJ,KAAK,OACL8D,UAAW,KACXjN,UAAU,eACVuG,MAAOd,KAAKrB,MAAM2J,YAClBzE,SAAU7D,KAAK6N,oBAEnBvT,IAAAA,cAAA,OAAKC,UAAU,cACXD,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,2BACHC,eAAe,sDAK/BJ,IAAAA,cAAA,OAAKC,UAAU,cACXD,IAAAA,cAAA,SACIC,UAAU,yBACV6M,QAAQ,QAER9M,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,eACHC,eAAe,UAGvBJ,IAAAA,cAAA,OAAKC,UAAU,qBACXD,IAAAA,cAAA,UACIC,UAAU,eACVuG,MAAOd,KAAKrB,MAAMmd,KAClB1Y,UAAWpD,KAAKtE,MAAMmjB,2BACtBhb,SAAU7D,KAAK8e,YAEfxkB,IAAAA,cAAA,UACIwG,MAAO8a,IAEN9W,EAAAA,GAAsB,CAACrK,GAAI,sBAAuBC,eAAgB,YAEvEJ,IAAAA,cAAA,UACIwG,MAAO6a,IAEN7W,EAAAA,GAAsB,CAACrK,GAAI,qBAAsBC,eAAgB,mBAG1EJ,IAAAA,cAAA,OAAKC,UAAU,cACXD,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,oBACHC,eAAe,6CAK/BJ,IAAAA,cAAA,OAAKC,UAAU,4BACXD,IAAAA,cAAA,OAAKC,UAAU,qCACXD,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,wCACHC,eAAe,qGACfY,OAAQ,CACJiN,KAAOwW,GACHzkB,IAAAA,cAAC4P,GAAAA,EAAY,CACTC,KAAM6U,GAAAA,GAAeC,uBACrB7U,SAAS,WAER2U,QAOzBzkB,IAAAA,cAAA,OAAKC,UAAU,cACXD,IAAAA,cAAA,SACIC,UAAU,yBACV6M,QAAQ,WAER9M,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,mBACHC,eAAe,cAGvBJ,IAAAA,cAAA,OAAKC,UAAU,8BACXD,IAAAA,cAAA,OAAKC,UAAU,uBACXD,IAAAA,cAAA,SAAO8M,QAAQ,WACX9M,IAAAA,cAAA,SACIG,GAAG,UACHiJ,KAAK,WACL4J,QAAStN,KAAKrB,MAAMod,SAAW/b,KAAKrB,MAAMmd,OAASH,GACnD9X,SAAU7D,KAAKkf,cACf9b,UAAWpD,KAAKtE,MAAMmjB,4BAA8B7e,KAAKrB,MAAMmd,OAASH,KAE5ErhB,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,2BACHC,eAAe,cAI3BJ,IAAAA,cAAA,OAAKC,UAAU,cACXD,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,wBACHC,eAAe,0FAK/BJ,IAAAA,cAAA,OAAKC,UAAU,cACXD,IAAAA,cAAA,SACIC,UAAU,yBACV6M,QAAQ,gBAER9M,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,wBACHC,eAAe,mBAGvBJ,IAAAA,cAAA,OAAKC,UAAU,8BACXD,IAAAA,cAAA,OAAKC,UAAU,uBACXD,IAAAA,cAAA,SAAO8M,QAAQ,gBACX9M,IAAAA,cAAA,SACIG,GAAG,eACHiJ,KAAK,WACL4J,QAAStN,KAAKrB,MAAMqd,cAAgBhc,KAAKrB,MAAMmd,OAASH,IAAyB3b,KAAKrB,MAAMod,QAC5FlY,SAAU7D,KAAKmf,mBACf/b,UAAWpD,KAAKtE,MAAMmjB,4BAA8B7e,KAAKrB,MAAMmd,OAASH,IAAyB3b,KAAKrB,MAAMod,UAEhHzhB,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,gCACHC,eAAe,cAI3BJ,IAAAA,cAAA,OAAKC,UAAU,cACXD,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,6BACHC,eAAe,uEAK/BJ,IAAAA,cAAA,OAAKC,UAAU,0BACXD,IAAAA,cAACyN,EAAAA,EAAS,CACNrE,KAAK,YACL0K,OAAQ,CAACpO,KAAKrB,MAAMkH,SAExBvL,IAAAA,cAACW,EAAAA,KAAI,CACDV,UAAU,mBACVW,GAAE,IAAAC,OAAM6E,KAAKtE,MAAMb,KAAKO,KAAI,uBAE5Bd,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,yBACHC,eAAe,YAGvBJ,IAAAA,cAAC0N,GAAAA,EAAa,CACVzN,UAAU,kBACVmJ,KAAK,SACLuE,SAAUjI,KAAKrB,MAAMye,OACrBlV,aAAcoW,EACdriB,QAAS+D,KAAKyF,aACdhL,GAAG,WAEF4jB,MAO7B,EC1qBJ,UAAerhB,EAAAA,EAAAA,UA7Bf,SAAyB2B,EAAoBC,GACzC,MAAMsG,GAASmF,EAAAA,EAAAA,IAAU1L,GACnBygB,EAAS,IAAIC,gBAAgBzgB,EAASwL,SAASrG,QAASub,IAAI,MAC5DvF,GAAOwF,EAAAA,GAAAA,IAAe5gB,GACtBsU,EAAO8G,GAAQqF,EAASrF,EAAKqF,QAASxL,EACtCjO,EAAOsN,GAAMhU,EAAAA,EAAAA,IAAQN,EAAOsU,EAAI7F,cAAWwG,EAC3CgJ,EAAQjX,EAAOA,EAAKiX,WAAQhJ,EAClC,MAAO,CACH2J,YAAalL,SAASnN,EAAOsa,YAAc,IAC3CvM,MACA2J,QACAiC,4BAA4BY,EAAAA,EAAAA,IAAsB9gB,EAAO,CAAC+gB,WAAYviB,EAAAA,GAAY8T,gBAClFtL,OAER,IAEA,SAA4BpG,GACxB,MAAO,CACH/B,SAASgC,EAAAA,EAAAA,oBAAmB,CACxBwT,UAAS,GACTQ,SAAQ,GACRgK,mBAAkB,MAClBC,uBAAsB,MACtBnF,sBAAqB,MACrB6E,gBAAeA,GAAAA,IAChB5d,GAEX,GAEA,CAA4Dsc,IC7CtD8D,GAAoB,IAEnB,SAASC,GAAoC5W,GAAkJ,IAAlI/I,EAAI0I,UAAAlI,OAAA,QAAAmT,IAAAjL,UAAA,GAAAA,UAAA,GAAG,EAAGkL,EAAOlL,UAAAlI,OAAA,QAAAmT,IAAAjL,UAAA,GAAAA,UAAA,GAAGgX,GAAmBE,EAAiBlX,UAAAlI,OAAA,QAAAmT,IAAAjL,UAAA,IAAAA,UAAA,GACxH,OAAOzH,UACH,MAAM,KAACV,SAAcjB,EAASugB,GAAAA,GAAoC9W,EAAQ/I,EAAM4T,EAASgM,IAU1F,IAAsC9K,EAJrC,OALIvU,GAGAjB,GAMiCwV,EARL+K,GAAAA,GAA+Ctf,GACtCA,EAAmCuf,kBAAoBvf,EAQ7FU,MAAO3B,EAAUygB,KACpB,MAAMrhB,EAAQqhB,IACRC,EAA2C,CAAC,EAClD,IAAK,IAAIjR,EAAI,EAAGA,EAAI+F,EAAMtU,OAAQuO,IAAK,CACnC,MAAM/C,EAAO8I,EAAM/F,IACd/P,EAAAA,EAAAA,IAAQN,EAAOsN,EAAKmB,WACrB6S,EAAehU,EAAKmB,UAAW,EAEvC,CAEA,MAAM8S,EAAO1Q,OAAOwF,KAAKiL,GACzB,OAAoB,IAAhBC,EAAKzf,QAITlB,GAAS4gB,EAAAA,GAAAA,IAAiBD,IAHf,CAAC1f,KAAM,KAIC,IArBZ,CAACA,OAAK,CAErB,CAuBO,SAAS4f,GAAoCpX,GAA2F,IAA3E/I,EAAI0I,UAAAlI,OAAA,QAAAmT,IAAAjL,UAAA,GAAAA,UAAA,GAAG,EAAGkL,EAAOlL,UAAAlI,OAAA,QAAAmT,IAAAjL,UAAA,GAAAA,UAAA,GAAGgX,GACpF,OAAOze,UACH,MAAM,KAACV,SAAcjB,EAASugB,GAAAA,GAAoC,GAAI9W,EAAQ/I,EAAM4T,IAQrF,IAAsCkB,EAJrC,OAHIvU,GACAjB,GAMiCwV,EANKvU,EAOvCU,MAAO3B,EAAUygB,KACpB,MAAMrhB,EAAQqhB,IACRC,EAA2C,CAAC,EAClD,IAAK,IAAIjR,EAAI,EAAGA,EAAI+F,EAAMtU,OAAQuO,IAAK,CACnC,MAAM/C,EAAO8I,EAAM/F,IACd/P,EAAAA,EAAAA,IAAQN,EAAOsN,EAAK3N,cACrB2hB,EAAehU,EAAK3N,aAAc,EAE1C,CAEA,MAAM4hB,EAAO1Q,OAAOwF,KAAKiL,GACzB,OAAoB,IAAhBC,EAAKzf,QAITlB,GAAS4gB,EAAAA,GAAAA,IAAiBD,IAHf,CAAC1f,KAAM,KAIC,IArBZ,CAACA,OAAK,CAErB,CAuBO,SAAS6f,GAA+BrX,GAC3C,OAAO9H,UACH,MAAM,KAACV,SAAcjB,EAASugB,GAAAA,GAAyC9W,IAQxE,IAAiCwL,EAJhC,OAHIhU,GACAjB,GAM4BiV,EANKhU,EAOlCU,MAAO3B,EAAUygB,KACpB,MAAMrhB,EAAQqhB,IACRC,EAA2C,CAAC,EAClD,IAAK,IAAIjR,EAAI,EAAGA,EAAIwF,EAAS/T,OAAQuO,IAAK,CACtC,MAAM8G,EAAUtB,EAASxF,IACpB/P,EAAAA,EAAAA,IAAQN,EAAOmX,EAAQxX,cACxB2hB,EAAenK,EAAQxX,aAAc,EAE7C,CAEA,MAAM4hB,EAAO1Q,OAAOwF,KAAKiL,GACzB,OAAoB,IAAhBC,EAAKzf,QAITlB,GAAS4gB,EAAAA,GAAAA,IAAiBD,IAHf,CAAC1f,KAAM,KAIC,IArBZ,CAACA,OAAK,CAErB,CAuBO,SAAS8f,KAAiF,IAAxDrgB,EAAI0I,UAAAlI,OAAA,QAAAmT,IAAAjL,UAAA,GAAAA,UAAA,GAAG,EAAGkL,EAAOlL,UAAAlI,OAAA,QAAAmT,IAAAjL,UAAA,GAAAA,UAAA,GAAGgX,GACzD,OAAOze,MAAO3B,EAAUygB,MAChB7K,EAAAA,GAAAA,IAAY6K,MACZzgB,EAASugB,GAAAA,MAEb,MAAM,KAACtf,SAAcjB,EAASugB,GAAAA,GAAgC7f,EAAM4T,IAIpE,OAHIrT,GACAjB,EAML,SAAkC8V,GACrC,OAAOnU,MAAO3B,EAAUygB,KACpB,MAAMrhB,EAAQqhB,IACRC,EAA2C,CAAC,EAClD,IAAK,IAAIjR,EAAI,EAAGA,EAAIqG,EAAK5U,OAAQuO,IAAK,CAClC,MAAMc,EAAMuF,EAAKrG,IACZ/P,EAAAA,EAAAA,IAAQN,EAAOmR,EAAIxR,cACpB2hB,EAAenQ,EAAIxR,aAAc,EAEzC,CAEA,MAAM4hB,EAAO1Q,OAAOwF,KAAKiL,GACzB,OAAoB,IAAhBC,EAAKzf,QAITlB,GAAS4gB,EAAAA,GAAAA,IAAiBD,IAHf,CAAC1f,KAAM,KAIC,CAE3B,CAzBqB+f,CAAyB/f,IAE/B,CAACA,KAAM,KAAK,CAE3B,C,mDC3FA,MAAMggB,GAAgC9kB,IAClC,MAAM+kB,GAAUC,EAAAA,EAAAA,SAAO,IAChBC,EAAmBC,IAA8BnS,EAAAA,EAAAA,UAAyC,OAC1FoS,EAAsBC,IAA2BrS,EAAAA,EAAAA,WAAS,GAE3DsS,GAAmBC,EAAAA,EAAAA,aAAYrM,IAC/BsM,EAAoF,UAA1DD,EAAAA,EAAAA,aAAY3W,EAAAA,IAAWK,+BACjD1B,GAASgY,EAAAA,EAAAA,aAAYlM,EAAAA,IAErBvV,GAAW2hB,EAAAA,EAAAA,eAEXC,GAA0BjlB,EAAAA,EAAAA,cAAYgF,UACxC,MAAMkgB,QAAY7hB,GAAS8hB,EAAAA,GAAAA,IAAyCrY,EAAQsY,IAC5ER,GAAwB,GAEpBM,EAAI5gB,MAAQ4gB,EAAI5gB,KAAKC,OACrBmgB,EAA2BQ,EAAI5gB,KAAK,IAEpCogB,EAA2B,KAC/B,GACD,CAACrhB,EAAUyJ,IAERuY,GAA4BxjB,EAAAA,EAAAA,UAAQ,IAC/ByjB,MAAUF,GAAuBH,EAAwBG,IAAa,MAC9E,CAACH,KAEJxc,EAAAA,EAAAA,YAAU,KACF8b,EAAQlQ,UAGZkQ,EAAQlQ,SAAU,EAEd0Q,IACA1hB,GAASkiB,EAAAA,GAAAA,IAA8BzY,IACnCtN,EAAMoF,QACNggB,GAAwB,GACxBK,EAAwBzlB,EAAMoF,SAEtC,GACD,CAACmgB,EAAyBvlB,EAAMoF,MAAOkI,EAAQmY,EAAyB5hB,EAAUkhB,IAErF,MASMiB,EAAclS,OAAOlU,OAAOylB,GAE5BY,EACFrnB,IAAAA,cAACmJ,EAAAA,EAAyB,CACtBme,aAAa,MACbnnB,GAAG,MACH+M,UAAW,KACXjN,UAAU,eACVuG,MAAOpF,EAAMoF,MACb+C,SAlBUhE,IACdnE,EAAMmI,SAAShE,GAEXohB,IACAH,GAAwB,GACxBS,EAA0B1hB,EAAEe,OAAOE,OACvC,EAaI6C,YAAajI,EAAMiI,cAI3B,IAAK+d,EAAYjhB,OACb,OAAOkhB,EAGX,IAAIE,EA6CJ,OA1CIA,EADAhB,EAEIvmB,IAAAA,cAAA,YACIA,IAAAA,cAACwnB,GAAAA,EAAc,OAGhBnB,EAEHrmB,IAAAA,cAAAA,IAAAA,SAAA,KACIA,IAAAA,cAAA,YACIA,IAAAA,cAACynB,GAAAA,UAAS,CACN1b,KAAM,MAGd/L,IAAAA,cAAA,QAAMC,UAAU,yCACZD,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,0CACHC,eAAe,kCACfY,OAAQ,CACJ0mB,eAAgBrB,EAAkBvlB,UAQlDd,IAAAA,cAAAA,IAAAA,SAAA,KACIA,IAAAA,cAAA,YACIA,IAAAA,cAAC2nB,GAAAA,uBAAsB,CACnB5b,KAAM,MAGd/L,IAAAA,cAAA,QAAMC,UAAU,yCACZD,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,8CACHC,eAAe,wCAQ/BJ,IAAAA,cAAAA,IAAAA,SAAA,KACKqnB,EACDrnB,IAAAA,cAAA,OAAKC,UAAU,mDACVsnB,GAEN,EAETrB,GAAAjlB,UAAA,CA9HEuF,MAAKtF,IAAAA,OAAAsB,WACL+G,SAAQrI,IAAAA,KAAAsB,YA+HZ,Y,0ZCrEe,MAAMolB,WAAwB5nB,IAAAA,cACzCoF,WAAAA,CAAYhE,GACRiE,MAAMjE,GAAOkE,GAAA,4BAKMkW,IAA4C,IAAAqM,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAC/D,MAAO,CACHxkB,YAAkC,QAAvB+jB,EAAErM,aAAO,EAAPA,EAAS9Q,oBAAY,IAAAmd,EAAAA,EAAI,GACtC7Z,YAAiC,QAAtB8Z,EAAEtM,aAAO,EAAPA,EAASxN,mBAAW,IAAA8Z,EAAAA,EAAI,GACrCS,QAAyB,QAAlBR,EAAEvM,aAAO,EAAPA,EAAS+M,eAAO,IAAAR,EAAAA,EAAI,GAC7BS,IAAiB,QAAdR,EAAExM,aAAO,EAAPA,EAASgN,WAAG,IAAAR,EAAAA,EAAI,GACrBS,OAAuB,QAAjBR,EAAEzM,aAAO,EAAPA,EAASiN,cAAM,IAAAR,EAAAA,EA1Ed,IA2ETpjB,SAA2B,QAAnBqjB,EAAE1M,aAAO,EAAPA,EAAS3W,gBAAQ,IAAAqjB,EAAAA,EAAI,GAC/BQ,QAA0B,QAAnBP,EAAE3M,aAAO,EAAPA,EAASvJ,gBAAQ,IAAAkW,EAAAA,EAAI,GAC9BQ,aAAoC,QAAxBP,EAAE5M,aAAO,EAAPA,EAASC,qBAAa,IAAA2M,GAAAA,EACpCQ,iBAA6C,QAA7BP,EAAE7M,aAAO,EAAPA,EAASqN,0BAAkB,IAAAR,EAAAA,EAAI,GACjDS,wBAAoD,QAA7BR,EAAE9M,aAAO,EAAPA,EAASuN,0BAAkB,IAAAT,EAAAA,EAAI,GACxDzf,QAAQ,EACRsJ,YAAa,KAChB,IACJ7M,GAAA,2BAEoB,IACgB,iBAAtBI,KAAKtE,MAAM+R,OACXnT,IAAAA,cAAA,YAAO0F,KAAKtE,MAAM+R,QAIzBnT,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAIuF,KAAKtE,MAAM+R,OAAOhT,GACtBC,eAAgBsF,KAAKtE,MAAM+R,OAAO/S,mBAG7CkF,GAAA,2BAEoB,IACgB,iBAAtBI,KAAKtE,MAAMiS,OACXrT,IAAAA,cAAA,YAAO0F,KAAKtE,MAAMiS,QAIzBrT,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAIuF,KAAKtE,MAAMiS,OAAOlT,GACtBC,eAAgBsF,KAAKtE,MAAMiS,OAAOjT,mBAG7CkF,GAAA,qBAEeC,IAGZ,GAFAA,EAAEC,iBAEEE,KAAKrB,MAAMwE,OACX,OAGJnD,KAAKE,SAAS,CACViD,QAAQ,EACRsJ,YAAa,KAGjB,IAAI0F,EAAcnS,KAAKrB,MAAMkkB,QAAQ1hB,OAAO2E,cACX,IAA7BqM,EAAYzQ,QAAQ,OACpByQ,EAAcA,EAAYmR,OAAO,IAGrC,MAAMxN,EAAU,CACZ9Q,aAAchF,KAAKrB,MAAMP,YACzBkK,YAAatI,KAAKrB,MAAM2J,YACxBua,QAAS1Q,EACT2Q,IAAK9iB,KAAKrB,MAAMmkB,IAAI3hB,OACpB4hB,OAAQ/iB,KAAKrB,MAAMokB,OACnB5jB,SAAUa,KAAKrB,MAAMQ,SACrBoN,SAAUvM,KAAKrB,MAAMqkB,QACrBjN,cAAe/V,KAAKrB,MAAMskB,aAC1B9V,QAASnN,KAAKtE,MAAMb,KAAKJ,GACzB4oB,mBAAoB,GACpBF,mBAAoB,GACpB/Q,MAAO,GACPnF,UAAW,EACXC,UAAW,EACXlS,UAAW,EACXP,GAAI,GACJ6D,WAAY,IAGW,IAAAilB,EAAAC,EAAvB1N,EAAQC,gBACRD,EAAQuN,mBAAuD,QAArCE,EAAGvjB,KAAKrB,MAAMykB,+BAAuB,IAAAG,EAAAA,EAAI,GACnEzN,EAAQqN,mBAAgD,QAA9BK,EAAGxjB,KAAKrB,MAAMukB,wBAAgB,IAAAM,EAAAA,EAAI,IAG3D1N,EAAQ+M,QAcwB,IAAjC/M,EAAQ+M,QAAQnhB,QAAQ,MAcU,IAAlCoU,EAAQ+M,QAAQnhB,QAAQ,KAaxBoU,EAAQ+M,QAAQpiB,OAASkH,GAAAA,GAAU8b,oBACnC3N,EAAQ+M,QAAQpiB,OAASkH,GAAAA,GAAU+b,mBACnC1jB,KAAKE,SAAS,CACViD,QAAQ,EACRsJ,YACInS,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,mCACHC,eAAe,iEACfY,OAAQ,CACJqoB,IAAKhc,GAAAA,GAAU8b,mBACfG,IAAKjc,GAAAA,GAAU+b,wBAS9B5N,EAAQgN,IAcb9iB,KAAKtE,MAAM2R,OAAOyI,GAASvV,MAAK,IAAMP,KAAKE,SAAS,CAACiD,QAAQ,MAbzDnD,KAAKE,SAAS,CACViD,QAAQ,EACRsJ,YACInS,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,0BACHC,eAAe,gCArC3BsF,KAAKE,SAAS,CACViD,QAAQ,EACRsJ,YACInS,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,kCACHC,eAAe,6CAnB3BsF,KAAKE,SAAS,CACViD,QAAQ,EACRsJ,YACInS,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,kCACHC,eAAe,2CAnB3BsF,KAAKE,SAAS,CACViD,QAAQ,EACRsJ,YACInS,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,8BACHC,eAAe,gCAoEsC,IACxEkF,GAAA,0BAEoBC,IACjBG,KAAKE,SAAS,CACV9B,YAAayB,EAAEe,OAAOE,OACxB,IACLlB,GAAA,0BAEoBC,IACjBG,KAAKE,SAAS,CACVoI,YAAazI,EAAEe,OAAOE,OACxB,IACLlB,GAAA,sBAEgBC,IACbG,KAAKE,SAAS,CACV2iB,QAAShjB,EAAEe,OAAOE,OACpB,IACLlB,GAAA,kBAEYC,IACTG,KAAKE,SAAS,CACV4iB,IAAKjjB,EAAEe,OAAOE,OAChB,IACLlB,GAAA,qBAEeC,IACZ,MAAMgkB,EAAchkB,EAAEe,OAAOE,MACT,MAAhB+iB,GAAuC,MAAhBA,GAAuC,KAAhBA,GAC9C7jB,KAAKE,SAAS,CACV6iB,OAAQc,GAEhB,IACHjkB,GAAA,uBAEiBC,IACdG,KAAKE,SAAS,CACVf,SAAUU,EAAEe,OAAOE,OACrB,IACLlB,GAAA,sBAEgBC,IACbG,KAAKE,SAAS,CACV8iB,QAASnjB,EAAEe,OAAOE,OACpB,IACLlB,GAAA,2BAEqBC,IAClBG,KAAKE,SAAS,CACV+iB,aAAcpjB,EAAEe,OAAO0M,SACzB,IACL1N,GAAA,+BAEyBC,IACtBG,KAAKE,SAAS,CACVgjB,iBAAkBrjB,EAAEe,OAAOE,OAC7B,IACLlB,GAAA,sCAEgCC,IAC7BG,KAAKE,SAAS,CACVkjB,wBAAyBvjB,EAAEe,OAAOE,OACpC,IAjOFd,KAAKrB,MAAQqB,KAAK8jB,oBAAoB9jB,KAAKtE,MAAMqoB,gBAAkB,CAAC,EACxE,CAmOA/hB,MAAAA,GACI,IAAIkhB,EAAmB,KACnBE,EAA0B,KAwE9B,OAtEIpjB,KAAKrB,MAAMskB,eACXC,EACI5oB,IAAAA,cAAA,OAAKC,UAAU,cACXD,IAAAA,cAAA,SACIC,UAAU,yBACV6M,QAAQ,oBAER9M,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,+BACHC,eAAe,uBAGvBJ,IAAAA,cAAA,OAAKC,UAAU,qBACXD,IAAAA,cAACmJ,EAAAA,EAAyB,CACtBhJ,GAAG,mBACHiJ,KAAK,OACL8D,UAAW,KACXjN,UAAU,eACVuG,MAAOd,KAAKrB,MAAMukB,iBAClBrf,SAAU7D,KAAKgkB,uBACfrgB,aAAaC,EAAAA,EAAAA,eAAc,CACvBnJ,GAAI,2CACJC,eAAgB,8BAGxBJ,IAAAA,cAAA,OAAKC,UAAU,cACXD,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,oCACHC,eAAe,kIAOnC0oB,EACI9oB,IAAAA,cAAA,OAAKC,UAAU,cACXD,IAAAA,cAAA,SACIC,UAAU,yBACV6M,QAAQ,2BAER9M,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,sCACHC,eAAe,8BAGvBJ,IAAAA,cAAA,OAAKC,UAAU,qBACXD,IAAAA,cAACmJ,EAAAA,EAAyB,CACtBhJ,GAAG,cACHiJ,KAAK,OACL8D,UAAW,IACXjN,UAAU,eACVuG,MAAOd,KAAKrB,MAAMykB,wBAClBvf,SAAU7D,KAAKikB,8BACftgB,aAAaC,EAAAA,EAAAA,eAAc,CACvBnJ,GAAI,kDACJC,eAAgB,4DAGxBJ,IAAAA,cAAA,OAAKC,UAAU,cACXD,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,2CACHC,eAAe,0EASnCJ,IAAAA,cAAA,OAAKC,UAAU,yBACXD,IAAAA,cAAC+M,EAAe,KACZ/M,IAAAA,cAACW,EAAAA,KAAI,CAACC,GAAI,IAAM8E,KAAKtE,MAAMb,KAAKO,KAAO,0BACnCd,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,2BACHC,eAAe,oBAGtBsF,KAAKkkB,sBAEV5pB,IAAAA,cAAA,OAAKC,UAAU,kBACXD,IAAAA,cAAA,QACIC,UAAU,kBACV+M,SAAUtH,KAAKyF,cAEfnL,IAAAA,cAAA,OAAKC,UAAU,cACXD,IAAAA,cAAA,SACIC,UAAU,yBACV6M,QAAQ,eAER9M,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,0BACHC,eAAe,WAGvBJ,IAAAA,cAAA,OAAKC,UAAU,qBACXD,IAAAA,cAAA,SACIG,GAAG,cACHiJ,KAAK,OACL8D,UAAW,GACXjN,UAAU,eACVuG,MAAOd,KAAKrB,MAAMP,YAClByF,SAAU7D,KAAK4N,oBAEnBtT,IAAAA,cAAA,OAAKC,UAAU,cACXD,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,+BACHC,eAAe,qFAK/BJ,IAAAA,cAAA,OAAKC,UAAU,cACXD,IAAAA,cAAA,SACIC,UAAU,yBACV6M,QAAQ,eAER9M,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,0BACHC,eAAe,iBAGvBJ,IAAAA,cAAA,OAAKC,UAAU,qBACXD,IAAAA,cAAA,SACIG,GAAG,cACHiJ,KAAK,OACL8D,UAAW,IACXjN,UAAU,eACVuG,MAAOd,KAAKrB,MAAM2J,YAClBzE,SAAU7D,KAAK6N,oBAEnBvT,IAAAA,cAAA,OAAKC,UAAU,cACXD,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,+BACHC,eAAe,oCAK/BJ,IAAAA,cAAA,OAAKC,UAAU,cACXD,IAAAA,cAAA,SACIC,UAAU,yBACV6M,QAAQ,WAER9M,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,sBACHC,eAAe,0BAGvBJ,IAAAA,cAAA,OAAKC,UAAU,qBACXD,IAAAA,cAACmJ,EAAAA,EAAyB,CACtBhJ,GAAG,UACHiJ,KAAK,OACL8D,UAAWG,GAAAA,GAAU+b,mBACrBnpB,UAAU,eACVuG,MAAOd,KAAKrB,MAAMkkB,QAClBhf,SAAU7D,KAAKmkB,cACfxgB,aAAaC,EAAAA,EAAAA,eAAc,CACvBnJ,GAAI,kCACJC,eAAgB,2DAGxBJ,IAAAA,cAAA,OAAKC,UAAU,cACXD,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,2BACHC,eAAe,kIAGvBJ,IAAAA,cAAA,OAAKC,UAAU,cACXD,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,mCACHC,eAAe,kDAGvBJ,IAAAA,cAAA,OAAKC,UAAU,cACXD,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,mCACHC,eAAe,mBACfY,OAAQ,CACJiN,KACIjO,IAAAA,cAAC4P,GAAAA,EAAY,CACTC,KAAM6U,GAAAA,GAAeoF,sBACrBha,SAAS,oBAET9P,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,2CACHC,eAAe,uCAS/CJ,IAAAA,cAAA,OAAKC,UAAU,cACXD,IAAAA,cAAA,SACIC,UAAU,yBACV6M,QAAQ,OAER9M,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,kBACHC,eAAe,iBAGvBJ,IAAAA,cAAA,OAAKC,UAAU,qBACXD,IAAAA,cAACkmB,GAA4B,CACzB1f,MAAOd,KAAKrB,MAAMmkB,IAClBjf,SAAU7D,KAAKqkB,UACf1gB,aAAaC,EAAAA,EAAAA,eAAc,CACvBnJ,GAAI,8BACJC,eAAgB,0CAGxBJ,IAAAA,cAAA,OAAKC,UAAU,cACXD,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,uBACHC,eAAe,2GAGvBJ,IAAAA,cAAA,OAAKC,UAAU,cACXD,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAI,mDACJC,eAAgB,uEAChBY,OAAQ,CACJiN,KAAO+b,GACHhqB,IAAAA,cAAA,KAAG6P,KAAK,wDAAwDma,SAOxFhqB,IAAAA,cAAA,OAAKC,UAAU,cACXD,IAAAA,cAAA,SACIC,UAAU,yBACV6M,QAAQ,UAER9M,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,qBACHC,eAAe,oBAGvBJ,IAAAA,cAAA,OAAKC,UAAU,qBACXD,IAAAA,cAAA,UACIG,GAAG,SACHF,UAAU,eACVuG,MAAOd,KAAKrB,MAAMokB,OAClBlf,SAAU7D,KAAKukB,cAEfjqB,IAAAA,cAAA,UAAQwG,MApiBvB,KAqiBoBgE,EAAAA,GAAsB,CAACrK,GAAI,0BAA2BC,eAAgB,UAE3EJ,IAAAA,cAAA,UAAQwG,MAtiBxB,KAuiBqBgE,EAAAA,GAAsB,CAACrK,GAAI,yBAA0BC,eAAgB,UAG9EJ,IAAAA,cAAA,OAAKC,UAAU,cACXD,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,0BACHC,eAAe,6HAK/BJ,IAAAA,cAAA,OAAKC,UAAU,cACXD,IAAAA,cAAA,SACIC,UAAU,yBACV6M,QAAQ,YAER9M,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,uBACHC,eAAe,uBAGvBJ,IAAAA,cAAA,OAAKC,UAAU,qBACXD,IAAAA,cAACmJ,EAAAA,EAAyB,CACtBhJ,GAAG,WACHiJ,KAAK,OACL8D,UAAW,GACXjN,UAAU,eACVuG,MAAOd,KAAKrB,MAAMQ,SAClB0E,SAAU7D,KAAKiO,eACftK,aAAaC,EAAAA,EAAAA,eAAc,CACvBnJ,GAAI,mCACJC,eAAgB,eAGxBJ,IAAAA,cAAA,OAAKC,UAAU,cACXD,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,4BACHC,eAAe,uQAK/BJ,IAAAA,cAAA,OAAKC,UAAU,cACXD,IAAAA,cAAA,SACIC,UAAU,yBACV6M,QAAQ,WAER9M,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,sBACHC,eAAe,mBAGvBJ,IAAAA,cAAA,OAAKC,UAAU,qBACXD,IAAAA,cAACmJ,EAAAA,EAAyB,CACtBhJ,GAAG,UACHiJ,KAAK,OACL8D,UAAW,KACXjN,UAAU,eACVuG,MAAOd,KAAKrB,MAAMqkB,QAClBnf,SAAU7D,KAAKqR,cACf1N,aAAaC,EAAAA,EAAAA,eAAc,CACvBnJ,GAAI,kCACJC,eAAgB,yCAGxBJ,IAAAA,cAAA,OAAKC,UAAU,cACXD,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,2BACHC,eAAe,yNAK/BJ,IAAAA,cAAA,OAAKC,UAAU,cACXD,IAAAA,cAAA,SACIC,UAAU,yBACV6M,QAAQ,gBAER9M,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,2BACHC,eAAe,kBAGvBJ,IAAAA,cAAA,OAAKC,UAAU,8BACXD,IAAAA,cAAA,SACIG,GAAG,eACHiJ,KAAK,WACL4J,QAAStN,KAAKrB,MAAMskB,aACpBpf,SAAU7D,KAAKwkB,qBAEnBlqB,IAAAA,cAAA,OAAKC,UAAU,cACXD,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,gCACHC,eAAe,4GAK9BwoB,EACAE,EACD9oB,IAAAA,cAAA,OAAKC,UAAU,0BACXD,IAAAA,cAACyN,EAAAA,EAAS,CACNrE,KAAK,YACL0K,OAAQ,CAACpO,KAAKtE,MAAM8Q,YAAaxM,KAAKrB,MAAM8N,eAEhDnS,IAAAA,cAACW,EAAAA,KAAI,CACDV,UAAU,mBACVW,GAAI,IAAM8E,KAAKtE,MAAMb,KAAKO,KAAO,0BAEjCd,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,qBACHC,eAAe,YAGvBJ,IAAAA,cAAC0N,GAAAA,EAAa,CACVzN,UAAU,kBACVmJ,KAAK,SACLuE,SAAUjI,KAAKrB,MAAMwE,OACrB+E,aAAclI,KAAKtE,MAAM2F,QACzBpF,QAAS+D,KAAKyF,aACdhL,GAAG,eAEFuF,KAAKykB,sBAETzkB,KAAKtE,MAAMoV,eAMpC,ECjqBJ,MAAM4T,GAAa9pB,IAA4B,IAA3B,KAACC,EAAI,QAAE2C,GAAe5C,EACtC,MAAM6W,GAAUC,EAAAA,EAAAA,eACV,cAACtX,IAAiBC,EAAAA,EAAAA,WAClBsqB,EAAgBvqB,EAAc,CAACK,GAAK,mBAAqBC,eAAgB,QACzEkqB,EAAgBxqB,EAAc,CAACK,GAAK,mBAAqBC,eAAgB,SACzEmqB,EAAiBzqB,EAAc,CAACK,GAAK,qBAAuBC,eAAgB,eAC3E8R,EAAagC,IAAkBC,EAAAA,EAAAA,UAAS,IAgB/C,OACInU,IAAAA,cAAC4nB,GAAe,CACZrnB,KAAMA,EACN4S,OAAQkX,EACRhX,OAAQiX,EACRvjB,QAASwjB,EACTxX,OApBWnM,UACfsN,EAAe,IAEf,MAAM,KAAChO,EAAI,MAAEqF,SAAerI,EAAQsnB,WAAWhP,GAC3CtV,EACAiR,EAAQtP,KAAK,IAADhH,OAAKN,EAAKO,KAAI,oDAAAD,OAAmDqF,EAAK/F,KAIlFoL,GACA2I,EAAe3I,EAAMtJ,QACzB,EAUIiQ,YAAaA,GACf,EAERkY,GAAAnpB,UAAA,CAzCEiC,QAAOhC,IAAAA,MAAA,CAKHspB,WAAUtpB,IAAAA,KAAAsB,aAAAA,YAsClB,YC9CA,IAAeE,EAAAA,EAAAA,SAAQ,MARvB,SAA4BuC,GACxB,MAAO,CACH/B,SAASgC,EAAAA,EAAAA,oBAAmB,CACxBslB,WAAUA,GAAAA,IACXvlB,GAEX,GAEA,CAAiDmlB,I,SCHjD,MAAMK,GAAWnqB,IAGJ,IAHK,MACdoqB,EAAK,MACLlkB,GACIlG,EACJ,MAAM8J,GAAOrK,EAAAA,EAAAA,WAEP4qB,GAAW/oB,EAAAA,EAAAA,cAAa2D,IAC1BA,EAAEC,kBACFolB,EAAAA,EAAAA,IAAgBpkB,EAAM,GACvB,CAACA,IAEJ,OAAKiE,SAASogB,sBAAsB,QAKhC7qB,IAAAA,cAACmkB,GAAAA,EAAW,CAACjkB,MAAOwqB,GAChB1qB,IAAAA,cAAA,UACI,cAAY,WACZC,UAAU,+BACV,aAAYmK,EAAKtK,cAAc4qB,GAC/B/oB,QAASgpB,KATV,IAWO,EAEpBF,GAAAxpB,UAAA,CA5BEuF,MAAKtF,IAAAA,OAAAsB,YA8BT,SAAexC,IAAAA,KAAWyqB,I,gBCb1B,MAAMK,GAAqBxqB,IAAoI,IAAnI,KAACC,EAAI,SAAEuP,EAAQ,SAAEoK,EAAQ,UAAEE,EAAS,cAAEN,EAAa,cAAEE,EAAa,KAAEyF,EAAI,yBAAEnF,GAAgCha,EAClI,MAAM6W,GAAUC,EAAAA,EAAAA,cAEVhO,EAAQ,IAAI2b,gBAAgBjV,EAASrG,QAASub,IAAI,SAAW,GAC7D7kB,EAAM,IAAI4kB,gBAAgBjV,EAASrG,QAASub,IAAI,OAAS,IAE/D3a,EAAAA,EAAAA,YAAU,KACN0gB,OAAOC,iBAAiB,WAAYC,GAE7B,KACHF,OAAOG,oBAAoB,WAAYD,EAAe,KAI9D,MAAMA,EAAkB1lB,IACN,UAAVA,EAAEuC,KACFqP,EAAQtP,KAAK,IAAMtH,EAAKO,KAAO,iBAAmBsI,EACtD,EAGJ,IAAI+hB,EACA/N,EACAgO,EAEJ,MAAM5P,EAAUtB,EAAS/Z,GACnBwa,EAAeb,EAAc3Z,GAC7BkrB,EAAerR,EAAc7Z,GAC7BmrB,EAAWlR,EAAUja,GACrBorB,EAA0BjR,EAAyBna,GACnDwY,EAAM8G,EAAKtf,GAEjB,GAAIiJ,IAASiE,GAAAA,GAAUe,aAAaod,SAAWhQ,EAAS,CACpD,MAAMiQ,EAAejQ,EAAQ1D,MAE7BqT,EACInrB,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,wBACHC,eAAe,mBAGvBgd,EACIpd,IAAAA,cAAA,SACIA,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,uBACHC,eAAe,uMACfY,OAAQ,CACJiN,KAAOwW,GACHzkB,IAAAA,cAAC4P,GAAAA,EAAY,CACTC,KAAM6U,GAAAA,GAAegH,4BACrB5b,SAAS,uBAER2U,OAOzB2G,EACIprB,IAAAA,cAAA,KAAGC,UAAU,mBACTD,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,oBACHC,eAAe,wBACfY,OAAQ,CACJ8W,MAAO2T,EACP9P,EAAIiF,GAAmB5gB,IAAAA,cAAA,SAAI4gB,MAGnC5gB,IAAAA,cAACyqB,GAAQ,CACLC,MAAO3W,GAAS4X,UAChBnlB,MAAOilB,IAIvB,MAAO,GAAIriB,IAASiE,GAAAA,GAAUe,aAAawd,kBAAoBjR,EAAc,CACzE,MAAMkR,GAAoBC,EAAAA,GAAAA,MAAe,UAAYnR,EAAaxa,GAElEgrB,EACInrB,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAI,2BACJC,eAAe,sBAGvBgd,EACIpd,IAAAA,cAAA,SACIA,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,gCACHC,eAAe,sHACfY,OAAQ,CACJiN,KAAOwW,GACHzkB,IAAAA,cAAC4P,GAAAA,EAAY,CACTC,KAAM6U,GAAAA,GAAeqH,wBACrBjc,SAAS,uBAER2U,OAOzB2G,EACIprB,IAAAA,cAAA,KAAGC,UAAU,mBACTD,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,2BACHC,eAAe,oBACfY,OAAQ,CACJwnB,IAAK,IAAMqD,EAAoB,IAC/BlQ,EAAIiF,GAAmB5gB,IAAAA,cAAA,SAAI4gB,MAGnC5gB,IAAAA,cAACyqB,GAAQ,CACLC,MAAO3W,GAAS4X,UAChBnlB,MAAOqlB,IAIvB,MAAO,GAAIziB,IAASiE,GAAAA,GAAUe,aAAa4d,kBAAoBX,EAAc,CACzE,MAAMY,EAAoBZ,EAAavT,MAEvCqT,EACInrB,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAI,8BACJC,eAAe,sBAGvBgd,EACIpd,IAAAA,cAAA,SACIA,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,gCACHC,eAAe,kNACfY,OAAQ,CACJiN,KAAOwW,GACHzkB,IAAAA,cAAC4P,GAAAA,EAAY,CACTC,KAAM6U,GAAAA,GAAewH,wBACrBpc,SAAS,uBAER2U,OAOzB2G,EACIprB,IAAAA,cAAA,KAAGC,UAAU,mBACTD,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,6BACHC,eAAe,wBACfY,OAAQ,CACJ8W,MAAOmU,EACPtQ,EAAIiF,GAAmB5gB,IAAAA,cAAA,SAAI4gB,MAGnC5gB,IAAAA,cAACyqB,GAAQ,CACLC,MAAO3W,GAAS4X,UAChBnlB,MAAOylB,IAIvB,MAAO,GAAI7iB,IAASiE,GAAAA,GAAUe,aAAa+d,WAAab,EAAU,CAC9D,MAAMc,EAAgBd,EAASnrB,GACzBksB,EAAiBf,EAASgB,cAEhCnB,EACInrB,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAI,+BACJC,eAAe,2BAIvBgd,EAAW,GACXA,EAASvV,KACL7H,IAAAA,cAAA,KAAG8H,IAAI,0BACH9H,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,yBACHC,eAAe,gMACfY,OAAQ,CACJiN,KAAOwW,GACHzkB,IAAAA,cAAC4P,GAAAA,EAAY,CACTC,KAAM6U,GAAAA,GAAe6H,aACrBzc,SAAS,uBAER2U,QAOzBrH,EAASvV,KACL7H,IAAAA,cAAA,KAAG8H,IAAI,0BACH9H,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,yBACHC,eAAe,yBACfY,OAAQ,CACJb,GAAIisB,EACJzQ,EAAIiF,GAAmB5gB,IAAAA,cAAA,SAAI4gB,MAGnC5gB,IAAAA,cAACyqB,GAAQ,CACLC,MAAO3W,GAASyY,aAChBhmB,MAAO4lB,IAEXpsB,IAAAA,cAAA,WACAA,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,6BACHC,eAAe,iCACfY,OAAQ,CACJyrB,OAAQJ,EACR1Q,EAAIiF,GAAmB5gB,IAAAA,cAAA,SAAI4gB,MAGnC5gB,IAAAA,cAACyqB,GAAQ,CACLC,MAAO3W,GAAS2Y,iBAChBlmB,MAAO6lB,MAKnBjP,EAASvV,KACL7H,IAAAA,cAAA,KAAG8H,IAAI,6BACH9H,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,4BACHC,eAAe,8CAK3BgrB,EACIprB,IAAAA,cAAA,KAAGC,UAAU,mBACTD,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,oBACHC,eAAe,uBACfY,OAAQ,CACJwnB,IAAK8C,EAAS3V,cAAcC,KAAK,MACjC+F,EAAIiF,GAAmB5gB,IAAAA,cAAA,SAAI4gB,MAK/C,MAAO,GAAIxX,IAASiE,GAAAA,GAAUe,aAAaue,4BAA8BpB,EAAyB,CAC9F,MAAMqB,EAAWrB,EAAwBsB,UACnCC,EAAevB,EAAwBe,cACvCznB,EAAW0mB,EAAwBwB,qBACnCC,EAAWzB,EAAwB0B,qBAEzC9B,EACInrB,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,8CACHC,eAAe,mCAIvBgd,EAAW,GACXA,EAASvV,KACL7H,IAAAA,cAAA,KAAG8H,IAAI,0CACH9H,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,yCACHC,eAAe,wSACfY,OAAQ,CACJiN,KAAOwW,GACHzkB,IAAAA,cAAC4P,GAAAA,EAAY,CACTC,KAAM6U,GAAAA,GAAe6H,aACrBzc,SAAS,uBAER2U,QAOzBrH,EAASvV,KACL7H,IAAAA,cAAA,KAAG8H,IAAI,0CACH9H,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,yCACHC,eAAe,yBACfY,OAAQ,CACJb,GAAIysB,EACJjR,EAAIiF,GAAmB5gB,IAAAA,cAAA,SAAI4gB,MAGnC5gB,IAAAA,cAAA,WACAA,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,6CACHC,eAAe,iDACfY,OAAQ,CACJyrB,OAAQK,EACRnR,EAAIiF,GAAmB5gB,IAAAA,cAAA,SAAI4gB,QAMA,aAAvC2K,EAAwB2B,YACxB9P,EAASvV,KACL7H,IAAAA,cAAA,KAAG8H,IAAI,0CACH9H,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,yCACHC,eAAe,8BACfY,OAAQ,CACJ6D,WACA8W,EAAIiF,GAAmB5gB,IAAAA,cAAA,SAAI4gB,MAGnC5gB,IAAAA,cAACyqB,GAAQ,CACLC,MAAO3W,GAASoZ,aAChB3mB,MAAO3B,GAAY,KAEvB7E,IAAAA,cAAA,WACAA,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,yCACHC,eAAe,8BACfY,OAAQ,CACJgsB,WACArR,EAAIiF,GAAmB5gB,IAAAA,cAAA,SAAI4gB,QAO/CwK,EACIprB,IAAAA,cAAAA,IAAAA,SAAA,KACIA,IAAAA,cAAA,KAAGC,UAAU,mBACTD,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,0CACHC,eAAe,4BACfY,OAAQ,CACJwnB,IAAK+C,EAAwB6B,gBAC7BzR,EAAIiF,GAAmB5gB,IAAAA,cAAA,SAAI4gB,OAIvC5gB,IAAAA,cAAA,KAAGC,UAAU,mBACTD,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,8CACHC,eAAe,kCACfY,OAAQ,CACJwnB,IAAK+C,EAAwB8B,UAAUzX,KAAK,MAC5C+F,EAAIiF,GAAmB5gB,IAAAA,cAAA,SAAI4gB,OAMnD,KAAO,IAAIxX,IAASiE,GAAAA,GAAUe,aAAakf,MAAO3U,EA+D9C,OADAxB,EAAQoW,QAAQ,eAAD1sB,OAAgB2sB,GAAAA,GAAeC,iBACvC,KA/D4C,CACnD,MAAMC,EAAY,IAAI3I,gBAAgBjV,EAASrG,QAASub,IAAI,UAAY,GAExEmG,EACInrB,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,qBACHC,eAAe,iBAGvBgd,EACIpd,IAAAA,cAAA,SACIA,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,2BACHC,eAAe,uNACfY,OAAQ,CACJ2sB,QAAShV,EAAIjO,cAAgBiO,EAAI9T,SACjC8W,EAAI8I,GAAgBzkB,IAAAA,cAAA,SAAIykB,GACxBxW,KAAOwW,GACHzkB,IAAAA,cAAC4P,GAAAA,EAAY,CACTC,KAAK,iDACLC,SAAS,uBAER2U,OAOzB2G,EACIprB,IAAAA,cAAA,KAAGC,UAAU,mBACTD,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,6BACHC,eAAe,wBACfY,OAAQ,CACJ8W,MAAO4V,EACP/R,EAAIiF,GAAmB5gB,IAAAA,cAAA,SAAI4gB,MAGnC5gB,IAAAA,cAACyqB,GAAQ,CACLC,MAAO3W,GAAS4X,UAChBnlB,MAAOknB,IAEX1tB,IAAAA,cAAA,WACAA,IAAAA,cAAA,WACAA,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,qCACHC,eAAe,oIACfY,OAAQ,CACJiN,KAAOwW,GACHzkB,IAAAA,cAAC4P,GAAAA,EAAY,CACTC,KAAK,iDACLC,SAAS,uBAER2U,MAO7B,CAGA,CAEA,OACIzkB,IAAAA,cAAA,OAAKC,UAAU,yBACXD,IAAAA,cAAC+M,EAAe,KACZ/M,IAAAA,cAACW,EAAAA,KAAI,CAACC,GAAI,IAAML,EAAKO,KAAO,iBAAmBsI,GAC1C+hB,GAELnrB,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,mBACHC,eAAe,SAGvBJ,IAAAA,cAAA,OAAKC,UAAU,+CACXD,IAAAA,cAAA,MACIC,UAAU,wBACVE,GAAG,aAEHH,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,0BACHC,eAAe,sBAGtBgd,EACAgO,EACDprB,IAAAA,cAAA,OAAKC,UAAU,0BACXD,IAAAA,cAACW,EAAAA,KAAI,CACDV,UAAU,kBACVmJ,KAAK,SACLxI,GAAI,IAAML,EAAKO,KAAO,iBAAmBsI,EACzCjJ,GAAG,cAEHH,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,oBACHC,eAAe,YAK7B,EAEZ0qB,GAAA7pB,UAAA,CA7cE6O,SAAQ5O,IAAAA,MAAA,CAAGuI,OAAMvI,IAAAA,OAAAsB,aAAAA,YA+crB,MAAMuR,IAAWC,EAAAA,EAAAA,gBAAe,CAC5BwY,aAAc,CACVrsB,GAAI,8BACJC,eAAgB,kBAEpBssB,iBAAkB,CACdvsB,GAAI,kCACJC,eAAgB,sBAEpBurB,UAAW,CACPxrB,GAAI,0BACJC,eAAgB,cAEpB+sB,aAAc,CACVhtB,GAAI,6BACJC,eAAgB,mBAIxB,MCheA,IAAesC,EAAAA,EAAAA,UAXf,SAAyB2B,GACrB,MAAO,CACH6V,SAAUD,GAAY5V,GACtB+V,UAAWD,GAAa9V,GACxByV,cAAeF,GAAiBvV,GAChC2V,cAAeD,GAAiB1V,GAChCob,MAAMwF,EAAAA,GAAAA,IAAe5gB,GACrBiW,yBAA0BD,GAA4BhW,GAE9D,GAEA,CAAwCymB,I,0ZCJxC,MAAM/W,IAAWC,EAAAA,EAAAA,gBAAe,CAC5BX,OAAQ,CACJlT,GAAI,sBACJC,eAAgB,UAEpB+S,OAAQ,CACJhT,GAAI,oBACJC,eAAgB,QAEpB2G,QAAS,CACL5G,GAAI,wBACJC,eAAgB,iBA6CT,MAAMwtB,WAAoB5tB,IAAAA,cAG9BoF,WAAAA,CAAYhE,GACfiE,MAAMjE,GAAOkE,GAAA,oBAsBIsB,UAA2C,IAAAinB,EAAAC,EAAAC,EAAAC,EAC5DtoB,KAAKuoB,WAAazS,EAEY,QAA9BqS,EAAInoB,KAAKrB,MAAM6pB,uBAAe,IAAAL,GAA1BA,EAA4B1tB,KAC5Bqb,EAAQrb,GAAKuF,KAAKrB,MAAM6pB,gBAAgB/tB,KAGd,QAA1B2tB,EAAApoB,KAAKrB,MAAM6pB,uBAAe,IAAAJ,OAAA,EAA1BA,EAA4BtF,OAAQ9iB,KAAKuoB,WAAWzF,MAC1B,QAA1BuF,EAAAroB,KAAKrB,MAAM6pB,uBAAe,IAAAH,OAAA,EAA1BA,EAA4BxF,WAAY7iB,KAAKuoB,WAAW1F,UAC9B,QAA1ByF,EAAAtoB,KAAKrB,MAAM6pB,uBAAe,IAAAF,OAAA,EAA1BA,EAA4BvF,UAAW/iB,KAAKuoB,WAAWxF,OACvD/iB,KAAKyoB,2BAECzoB,KAAK0oB,eACf,IACH9oB,GAAA,2BAE2B,KACxBI,KAAKE,SAAS,CAACyoB,kBAAkB,GAAM,IAC1C/oB,GAAA,8BAE8B,KAC3BI,KAAKE,SAAS,CAACyoB,kBAAkB,GAAO,IAC3C/oB,GAAA,sBAEsBsB,UACnBlB,KAAKE,SAAS,CAACsM,YAAa,KAE5B,MAAM,KAAChM,EAAI,MAAEqF,SAAe7F,KAAKtE,MAAM8B,QAAQorB,YAAY5oB,KAAKuoB,YAE5D/nB,GACAgG,EAAAA,GAAAA,KAAarE,KAAK,IAADhH,OAAK6E,KAAKtE,MAAMb,KAAKO,KAAI,4BAI9C4E,KAAKE,SAAS,CAACyoB,kBAAkB,IAE7B9iB,GACA7F,KAAKE,SAAS,CAACsM,YAAa3G,EAAMtJ,UACtC,IACHqD,GAAA,oBAEoB,KACjB,MAAMipB,EACFvuB,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,wBACHC,eAAe,WAIjBouB,EACFxuB,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,yBACHC,eAAe,uBAIjBquB,EACFzuB,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,0BACHC,eAAe,iGAIvB,OACIJ,IAAAA,cAACif,GAAAA,EAAY,CACT/e,MAAOsuB,EACPvsB,QAASwsB,EACTptB,kBAAmBktB,EACnBvsB,WAAW,+BACXkd,KAAMxZ,KAAKrB,MAAMgqB,iBACjBhsB,UAAWqD,KAAK0oB,cAChBhP,SAAU1Z,KAAKgpB,uBACjB,IA7FNhpB,KAAKuoB,gBAAa3U,EAElB5T,KAAKrB,MAAQ,CACT6pB,gBAAiB,KACjBG,kBAAkB,EAClBnc,YAAa,GAErB,CAEO3K,iBAAAA,GACC7B,KAAKtE,MAAM4N,gBACXtJ,KAAKtE,MAAM8B,QAAQyrB,sBAAsBjpB,KAAKtE,MAAMb,KAAKJ,IAAI8F,MACzD,KACIP,KAAKE,SAAS,CACVsoB,gBAAiBhZ,OAAOlU,OAAO0E,KAAKtE,MAAM8Y,UAAU7I,QAAQmK,GAAYA,EAAQrb,KAAOuF,KAAKtE,MAAMwtB,YAAW,IAC/G,GAIlB,CA8EOlnB,MAAAA,GACH,OAAKhC,KAAKrB,MAAM6pB,gBAKZluB,IAAAA,cAAC4nB,GAAe,CACZrnB,KAAMmF,KAAKtE,MAAMb,KACjB4S,OAAQY,GAASZ,OACjBE,OAAQU,GAASV,OACjBtM,QAASgN,GAAShN,QAClByP,YAAa9Q,KAAK8Q,cAClBzD,OAAQrN,KAAK4oB,YACbpc,YAAaxM,KAAKrB,MAAM6N,YACxBuX,eAAgB/jB,KAAKrB,MAAM6pB,kBAZxBluB,IAAAA,cAACgI,EAAAA,EAAa,KAe7B,EACH1C,GAxHoBsoB,GAAW,aA/B5BgB,UAAS1tB,IAAAA,UAAA,CAAAA,IAAAA,OAAAA,IAAAA,MAAA,UAMTgC,QAAOhC,IAAAA,MAAA,CAKHytB,sBAAqBztB,IAAAA,KAAAsB,WAKrB8rB,YAAWptB,IAAAA,KAAAsB,aAAAA,WAMfwM,eAAc9N,IAAAA,KAAAsB,aC1BlB,UAAeE,EAAAA,EAAAA,UArBf,SAAyB2B,EAAoBC,GACzC,MAAMsG,GAASmF,EAAAA,EAAAA,IAAU1L,GACnBuqB,EAAa,IAAI7J,gBAAgBzgB,EAASwL,SAASrG,QAASub,IAAI,MAChEhW,EAA2C,SAA1BpE,EAAOsF,eAE9B,MAAO,CACH0e,YACA1U,SAAUD,GAAY5V,GACtB2K,iBAER,IAEA,SAA4B/J,GACxB,MAAO,CACH/B,SAASgC,EAAAA,EAAAA,oBAAmB,CACxBypB,sBAAqB,MACrBL,YAAWA,GAAAA,IACZrpB,GAEX,GAEA,CAA4D2oB,I,0ZCarD,SAASvQ,GAAc7B,EAAkBnK,GAC5C,OAAKA,IAI0D,IAAxDmK,EAAQ9Q,aAAac,cAAcpE,QAAQiK,KACS,IAAvDmK,EAAQxN,YAAYxC,cAAcpE,QAAQiK,KACS,IAAnDmK,EAAQ+M,QAAQ/c,cAAcpE,QAAQiK,EAC9C,CAEe,MAAMwd,WAAyB7uB,IAAAA,cAA2BoF,WAAAA,GAAA,SAAAiJ,WAAA/I,GAAA,yBACjDC,IAChBA,EAAEC,iBAEFE,KAAKtE,MAAM0tB,aAAappB,KAAKtE,MAAMoa,QAAQ,IAC9ClW,GAAA,qBAEc,KACXI,KAAKtE,MAAMK,SAASiE,KAAKtE,MAAMoa,QAAQ,GAC1C,CAED9T,MAAAA,GACI,MAAM8T,EAAU9V,KAAKtE,MAAMoa,QAG3B,IAAK6B,GAAc7B,EAFJ9V,KAAKtE,MAAMiQ,OAAS3L,KAAKtE,MAAMiQ,OAAO7F,cAAgB,IAGjE,OAAO,KAGX,IAAI1K,EAGAA,EADA0a,EAAQ9Q,aACD8Q,EAAQ9Q,aAGX1K,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,qCACHC,eAAe,0BAK3B,IAAI4N,EAAc,KACdwN,EAAQxN,cACRA,EACIhO,IAAAA,cAAA,OAAKC,UAAU,qBACXD,IAAAA,cAAA,QAAMC,UAAU,6BACXub,EAAQxN,eAMzB,IAAIua,EAAU,MAAQ/M,EAAQ+M,QAC1B/M,EAAQC,eAAiBD,EAAQqN,qBACjCN,GAAW,IAAM/M,EAAQqN,oBAG7B,IAAI3lB,EAAU,KACVwC,KAAKtE,MAAM2tB,YACX7rB,EACIlD,IAAAA,cAAA,OAAKC,UAAU,gBACXD,IAAAA,cAAA,UACIC,UAAU,0BACV0B,QAAS+D,KAAKspB,kBAEdhvB,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,oCACHC,eAAe,sBAGtB,MACDJ,IAAAA,cAACW,EAAAA,KAAI,CAACC,GAAE,IAAAC,OAAM6E,KAAKtE,MAAMb,KAAKO,KAAI,mCAAAD,OAAkC2a,EAAQrb,KACxEH,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,8BACHC,eAAe,UAGtB,MACDJ,IAAAA,cAACmB,EAAqB,CAClBI,aACIvB,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,oCACHC,eAAe,gIAGvBqB,SAAUiE,KAAK7B,iBAM/B,MAAM4nB,EAAejQ,EAAQ1D,MAE7B,OACI9X,IAAAA,cAAA,OAAKC,UAAU,wBACXD,IAAAA,cAAA,OAAKC,UAAU,gBACXD,IAAAA,cAAA,OAAKC,UAAU,4EACXD,IAAAA,cAAA,OAAKC,UAAU,sBACXD,IAAAA,cAAA,cACKc,IAGTd,IAAAA,cAAA,QAAMC,UAAU,yBACXsoB,GAEJrlB,GAEJ8K,EACDhO,IAAAA,cAAA,OAAKC,UAAU,qBACXD,IAAAA,cAAA,QAAMC,UAAU,uBACZD,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,+BACHC,eAAe,iBACfY,OAAQ,CACJ8W,MAAO2T,KAGfzrB,IAAAA,cAACyqB,GAAQ,CACLC,OAAOphB,EAAAA,EAAAA,eAAc,CACjBnJ,GAAI,0BACJC,eAAgB,eAEpBoG,MAAOilB,MAInBzrB,IAAAA,cAAA,OAAKC,UAAU,qBACXD,IAAAA,cAAA,QAAMC,UAAU,0BACZD,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,kCACHC,eAAe,iDACfY,OAAQ,CACJ0D,QAASgB,KAAKtE,MAAMsD,QAAQG,SAC5BoqB,SAAUzT,EAAQ7I,gBAQlD,E,0ZACHrN,GArIoBupB,GAAgB,aAjCjCC,aAAY5tB,IAAAA,KAAAsB,WAKZf,SAAQP,IAAAA,KAAAsB,WAKR6O,OAAMnQ,IAAAA,OAUN6tB,UAAS7tB,IAAAA,KAAAsB,aCRE,MAAM0sB,WAA0BlvB,IAAAA,cAA2BoF,WAAAA,GAAA,SAAAiJ,WAAA/I,GAAA,0BAC1CkW,IACxB9V,KAAKtE,MAAM8B,QAAQisB,kBAAkB3T,EAAQrb,GAAG,IACnDmF,GAAA,sBAEuBkW,IACpB9V,KAAKtE,MAAM8B,QAAQksB,cAAc5T,EAAQrb,GAAG,GAC/C,CAEOkvB,cAAAA,CAAe3T,EAAYC,GAC/B,IAAI2T,EAAQ5T,EAAEhR,aACT4kB,IACDA,EAAQ9kB,EAAAA,GAAsB,CAACrK,GAAI,qCAAsCC,eAAgB,2BAG7F,IAAImvB,EAAQ5T,EAAEjR,aAKd,OAJK6kB,IACDA,EAAQ/kB,EAAAA,GAAsB,CAACrK,GAAI,qCAAsCC,eAAgB,2BAGtFkvB,EAAM1T,cAAc2T,EAC/B,CAEO7nB,MAAAA,GACH,MAAMwS,EAAY7I,GAAmB3L,KAAKtE,MAAM8Y,SAC5C7I,QAAQmK,GAAYA,EAAQ3I,UAAYnN,KAAKtE,MAAMb,KAAKJ,KACxDkR,QAAQmK,GAAY6B,GAAc7B,EAASnK,KAC3CC,KAAK5L,KAAK2pB,gBAAgBpoB,KAAKuU,IAC3B,MAAMuT,EAAYrpB,KAAKtE,MAAMouB,8BAAgC9pB,KAAKtE,MAAMiK,KAAKlL,KAAOqb,EAAQxX,WAE5F,OACIhE,IAAAA,cAAC6uB,GAAgB,CACb/mB,IAAK0T,EAAQrb,GACbI,KAAMmF,KAAKtE,MAAMb,KACjBib,QAASA,EACTsT,aAAcppB,KAAKypB,kBACnB1tB,SAAUiE,KAAK0pB,cACf1qB,QAASgB,KAAKtE,MAAMme,MAAM/D,EAAQxX,aAAe,CAAC,EAClD+qB,UAAWA,GACb,IAId,OACI/uB,IAAAA,cAAC0gB,GAAa,CACVvN,OACInT,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,4BACHC,eAAe,6BAGvBmc,QACIvc,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,yBACHC,eAAe,sBAGvBkc,QAAS,IAAM5W,KAAKtE,MAAMb,KAAKO,KAAO,6BACtC0b,YAAY,kBACZH,UACIrc,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,2BACHC,eAAe,4BAGvB+b,gBACInc,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,kCACHC,eAAe,8CACfY,OAAQ,CACJ2a,EAAIiF,GAAmB5gB,IAAAA,cAAA,SAAI4gB,MAIvCxD,SACIpd,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,0BACHC,eAAe,iKACfY,OAAQ,CACJyuB,aACIzvB,IAAAA,cAAC4P,GAAAA,EAAY,CACTC,KAAM6U,GAAAA,GAAegH,4BACrB5b,SAAS,sBAET9P,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,uCACHC,eAAe,oBAI3BuP,aACI3P,IAAAA,cAAC4P,GAAAA,EAAY,CACTC,KAAK,qCACLC,SAAS,sBAET9P,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,uCACHC,eAAe,sBAOvC4b,kBAAmBxR,EAAAA,GAAsB,CAACrK,GAAI,4BAA6BC,eAAgB,0BAC3F2G,QAASrB,KAAKtE,MAAM2F,UAElBsK,IACE,MAAMtG,EAAWmP,EAAS7I,GAC1B,MAAO,CAACtG,EAAUA,EAAS5E,OAAS,EAAE,GAItD,EACHb,GAlHoB4pB,GAAiB,aAflChV,SAAQhZ,IAAAA,MAAAsB,WACRuE,QAAO7F,IAAAA,KAAAsB,WAGPgtB,6BAA4BtuB,IAAAA,KAAAsB,WAC5BU,QAAOhC,IAAAA,MAAA,CAGHiuB,kBAAiBjuB,IAAAA,KAAAsB,WAGjB4sB,cAAaluB,IAAAA,KAAAsB,aAAAA,aCArB,UAAeE,EAAAA,EAAAA,UAjBf,SAAyB2B,EAAoBC,GAGzC,MAAO,CACHkrB,8BAHiCE,EAAAA,EAAAA,IAAoBrrB,EAAOC,EAAS/D,KAAKJ,GAAI0C,EAAAA,GAAY8sB,8BAKlG,IAEA,SAA4B1qB,GACxB,MAAO,CACH/B,SAASgC,EAAAA,EAAAA,oBAAmB,CACxBiqB,kBAAiB,MACjBC,cAAaA,GAAAA,IACdnqB,GAEX,GAEA,CAA4DiqB,I,8BCRtDU,GAAetvB,IAAA,IAAEuvB,UAAWC,EAAS,WAAEC,GAA4BzvB,EAAb0vB,E,qWAAIC,CAAA3vB,EAAA4vB,IAAA,OAC5DlwB,IAAAA,cAACmwB,EAAAA,MAAKjb,OAAA6I,OAAA,GACEiS,EAAI,CACRtoB,OAAStG,GACLpB,IAAAA,cAAC8vB,EAAS5a,OAAA6I,OAAA,GACFgS,EACA3uB,MAGd,EACJwuB,GAAA3uB,UAAA,CArBE4uB,UAAS3uB,IAAAA,IAAAsB,WACTutB,WAAU7uB,IAAAA,MAAA,CACN6F,QAAO7F,IAAAA,KAAAsB,WACP0X,SAAQhZ,IAAAA,MAAAsB,aAAAA,WAKZ4tB,KAAIlvB,IAAAA,OAAAsB,YA8DO,MAAM6tB,WAA0BrwB,IAAAA,cAC3CoF,WAAAA,CAAYhE,GACRiE,MAAMjE,GACNsE,KAAKrB,MAAQ,CACT0C,SAAS,EAEjB,CAEAQ,iBAAAA,GACmC,IAAA+oB,EAA3B5qB,KAAKtE,MAAM4N,gBACXtJ,KAAKtE,MAAM8B,QAAQ6iB,gCAA8C,QAAfuK,EAAA5qB,KAAKtE,MAAMb,YAAI,IAAA+vB,OAAA,EAAfA,EAAiBnwB,KAAM,IAAI8F,MACzE,IAAMP,KAAKE,SAAS,CAACmB,SAAS,KAG1C,CAEAW,MAAAA,GACI,MAAMqoB,EAAa,CACfhpB,QAASrB,KAAKrB,MAAM0C,QACpBmT,SAAUxU,KAAKtE,MAAM8Y,UAAY,GACjCqF,MAAO7Z,KAAKtE,MAAMme,MAClBhf,KAAMmF,KAAKtE,MAAMb,KACjB8K,KAAM3F,KAAKtE,MAAMiK,MAErB,OACIrL,IAAAA,cAAA,WACIA,IAAAA,cAACuwB,EAAAA,OAAM,KACHvwB,IAAAA,cAACmwB,EAAAA,MAAK,CACFK,OAAO,EACPJ,KAAI,GAAAvvB,OAAK6E,KAAKtE,MAAMse,MAAM8I,IAAG,KAC7B9gB,OAAQA,IAAO1H,IAAAA,cAACywB,EAAAA,SAAQ,CAAC7vB,GAAE,GAAAC,OAAK6E,KAAKtE,MAAMse,MAAM8I,IAAG,kBAExDxoB,IAAAA,cAAC4vB,GAAY,CACTG,WAAYA,EACZK,KAAI,GAAAvvB,OAAK6E,KAAKtE,MAAMse,MAAM8I,IAAG,cAC7BqH,UAAWX,KAEflvB,IAAAA,cAAC4vB,GAAY,CACTG,WAAYA,EACZK,KAAI,GAAAvvB,OAAK6E,KAAKtE,MAAMse,MAAM8I,IAAG,QAC7BqH,UAAWzF,KAEfpqB,IAAAA,cAAC4vB,GAAY,CACTG,WAAYA,EACZK,KAAI,GAAAvvB,OAAK6E,KAAKtE,MAAMse,MAAM8I,IAAG,SAC7BqH,UAAWjC,KAEf5tB,IAAAA,cAAC4vB,GAAY,CACTG,WAAYA,EACZK,KAAI,GAAAvvB,OAAK6E,KAAKtE,MAAMse,MAAM8I,IAAG,YAC7BqH,UAAW/E,MAK/B,E,gBAvDiBuF,G,GAAiB,Y,GAAA,CA3BlCnW,SAAQhZ,IAAAA,MAAAsB,WAKRkd,MAAKxe,IAAAA,MAAA,CACDsnB,IAAGtnB,IAAAA,OAAAsB,aAAAA,WAGPU,QAAOhC,IAAAA,MAAA,CAKH6kB,+BAA8B7kB,IAAAA,KAAAsB,aAAAA,WAMlCwM,eAAc9N,IAAAA,O,uYC9ClB,UAAewB,EAAAA,EAAAA,UAnBf,SAAyB2B,GACrB,MACM2K,EAA2C,UADlCe,EAAAA,EAAAA,IAAU1L,GACK6L,eAE9B,MAAO,CACHgK,SAAUhF,OAAOlU,OAAOiZ,GAAY5V,IACpCkb,OAAOmR,EAAAA,EAAAA,IAASrsB,GAChB2K,iBAER,IAEA,SAA4B/J,GACxB,MAAO,CACH/B,SAASgC,EAAAA,EAAAA,oBAAmB,CACxB6gB,+BAA8BA,IAC/B9gB,GAEX,GAEA,CAA4DorB,I,0ZCpB5D,MAAMtc,IAAWC,EAAAA,EAAAA,gBAAe,CAC5BX,OAAQ,CACJlT,GAAI,iCACJC,eAAgB,UAEpB+S,OAAQ,CACJhT,GAAI,oBACJC,eAAgB,QAEpB2G,QAAS,CACL5G,GAAI,mCACJC,eAAgB,iBAsDT,MAAMuwB,WAA4B3wB,IAAAA,cAG7CoF,WAAAA,CAAYhE,GACRiE,MAAMjE,GAAOkE,GAAA,yBAaEsB,UAAiC,IAAAgqB,EAChDlrB,KAAKmrB,QAAUlf,EAEI,QAAnBif,EAAIlrB,KAAKtE,MAAMuQ,YAAI,IAAAif,GAAfA,EAAiBzwB,KACjBwR,EAAKxR,GAAKuF,KAAKtE,MAAMuQ,KAAKxR,UAGxBuF,KAAKorB,YAAY,IAC1BxrB,GAAA,mBAEYsB,UAGT,GAFAlB,KAAKE,SAAS,CAACsM,YAAa,MAEvBxM,KAAKmrB,QACN,OAGJ,MAAMnkB,QAAehH,KAAKtE,MAAM8B,QAAQ6tB,mBAAmBrrB,KAAKmrB,SAEhE,GAAI,SAAUnkB,GACVR,EAAAA,GAAAA,KAAarE,KAAK,IAADhH,OAAK6E,KAAKtE,MAAMb,KAAKO,KAAI,yCAI9C,GAAI,UAAW4L,EAAQ,CACnB,MAAM,MAACnB,GAASmB,EAChBhH,KAAKE,SAAS,CAACsM,YAAa3G,EAAMtJ,SACtC,KAtCAyD,KAAKrB,MAAQ,CACT6N,YAAa,GAErB,CAEA3K,iBAAAA,GACQ7B,KAAKtE,MAAMoN,wBACX9I,KAAKtE,MAAM8B,QAAQ8tB,gBAAgBtrB,KAAKtE,MAAM6vB,OAEtD,CAgCAvpB,MAAAA,GACI,OAAKhC,KAAKtE,MAAMuQ,KAKZ3R,IAAAA,cAACyR,GAAuB,CACpBlR,KAAMmF,KAAKtE,MAAMb,KACjB4S,OAAQY,GAASZ,OACjBE,OAAQU,GAASV,OACjBtM,QAASgN,GAAShN,QAClB2M,2BAA4BhO,KAAKtE,MAAMsS,2BACvCE,uBAAwBlO,KAAKtE,MAAMwS,uBACnCb,OAAQrN,KAAKwrB,iBACbhf,YAAaxM,KAAKrB,MAAM6N,YACxBQ,YAAahN,KAAKtE,MAAMuQ,OAbrB3R,IAAAA,cAACgI,EAAAA,EAAa,KAgB7B,EACH1C,GAlEoBqrB,GAAmB,aAnCpCM,OAAM/vB,IAAAA,OAAAsB,WAKNgM,uBAAsBtN,IAAAA,KAAAsB,WAKtBkR,2BAA0BxS,IAAAA,KAAAsB,WAK1BoR,uBAAsB1S,IAAAA,KAAAsB,WAEtBU,QAAOhC,IAAAA,MAAA,CAKH6vB,mBAAkB7vB,IAAAA,KAAAsB,WAKlBwuB,gBAAe9vB,IAAAA,KAAAsB,aAAAA,aC9BvB,UAAeE,EAAAA,EAAAA,UAzBf,SAAyB2B,EAAoBC,GACzC,MAAMsG,GAASmF,EAAAA,EAAAA,IAAU1L,GACnBmK,EAA2D,SAAlC5D,EAAOoF,uBAChC0D,EAAmE,SAAtC9I,EAAO0J,2BACpCV,EAA2D,SAAlChJ,EAAO2J,uBAChC0c,EAAU,IAAIlM,gBAAgBzgB,EAASwL,SAASrG,QAASub,IAAI,OAAS,GAE5E,MAAO,CACHiM,SACAtf,KAAMtN,EAAME,SAASsV,aAAaC,cAAcmX,GAChDziB,yBACAkF,6BACAE,yBAER,IAEA,SAA4B3O,GACxB,MAAO,CACH/B,SAASgC,EAAAA,EAAAA,oBAAmB,CACxB6rB,mBAAkB,MAClBC,gBAAeA,GAAAA,IAChB/rB,GAEX,GAEA,CAA4D0rB,I,0ZCzB5D,MAAMQ,GAAS,CAAChxB,GAAI,oBAAqBC,eAAgB,QACnDgxB,GAAS,CAACjxB,GAAI,iCAAkCC,eAAgB,UAChEixB,GAAU,CAAClxB,GAAI,mCAAoCC,eAAgB,eAoB1D,MAAMkxB,WAAqBtxB,IAAAA,cAGtCoF,WAAAA,CAAYhE,GACRiE,MAAMjE,GAAOkE,GAAA,qBAeFsB,UACXlB,KAAK6rB,OAAS/b,EAEV9P,KAAKtE,MAAMkqB,SAASnrB,KACpBqV,EAAIrV,GAAKuF,KAAKtE,MAAMkqB,SAASnrB,KAMR,KAHCuF,KAAKtE,MAAMkqB,SAAS3V,cAAcxP,SAAWqP,EAAIG,cAAcxP,QACrFT,KAAKtE,MAAMkqB,SAAS3V,cAAc6b,OAAM,CAACC,EAAG/c,IAAM+c,IAAMjc,EAAIG,cAAcjB,MAG1EhP,KAAKyoB,2BAECzoB,KAAKgsB,gBACf,IACHpsB,GAAA,2BAEoB,KACjBI,KAAKE,SAAS,CAACyoB,kBAAkB,GAAM,IAC1C/oB,GAAA,8BAEuB,KACpBI,KAAKE,SAAS,CAACyoB,kBAAkB,GAAO,IAC3C/oB,GAAA,uBAEgBsB,UACblB,KAAKE,SAAS,CAACsM,YAAa,KAE5B,MAAM4U,QAAYphB,KAAKtE,MAAM8B,QAAQyuB,aAAajsB,KAAK6rB,QAEvD,GAAI,SAAUzK,GAAOA,EAAI5gB,MACrBgG,EAAAA,GAAAA,KAAarE,KAAK,IAADhH,OAAK6E,KAAKtE,MAAMb,KAAKO,KAAI,mCAM9C,GAFA4E,KAAKE,SAAS,CAACyoB,kBAAkB,IAE7B,UAAWvH,EAAK,CAChB,MAAOvb,MAAOqmB,GAAO9K,EACrBphB,KAAKE,SAAS,CAACsM,YAAa0f,EAAI3vB,SACpC,KACHqD,GAAA,oBAEa,KACV,MAAMipB,EACFvuB,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,wBACHC,eAAe,WAIjBouB,EACFxuB,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,2BACHC,eAAe,+BAIjBquB,EACFzuB,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,4BACHC,eAAe,yGAIvB,OACIJ,IAAAA,cAACif,GAAAA,EAAY,CACT/e,MAAOsuB,EACPvsB,QAASwsB,EACTptB,kBAAmBktB,EACnBvsB,WAAW,+BACXkd,KAAMxZ,KAAKrB,MAAMgqB,iBACjBhsB,UAAWqD,KAAKgsB,eAChBtS,SAAU1Z,KAAKgpB,uBACjB,IAvFNhpB,KAAKrB,MAAQ,CACTgqB,kBAAkB,EAClBnc,YAAa,IAEjBxM,KAAK6rB,OAAS7rB,KAAKtE,MAAMkqB,QAC7B,CAEA/jB,iBAAAA,GACQ7B,KAAKtE,MAAM+N,4BACXzJ,KAAKtE,MAAM8B,QAAQ2uB,YAAYnsB,KAAKtE,MAAM0wB,WAElD,CAgFApqB,MAAAA,GACI,OAAKhC,KAAKtE,MAAMkqB,SAKZtrB,IAAAA,cAACuV,GAAgB,CACbhV,KAAMmF,KAAKtE,MAAMb,KACjB4S,OAAQge,GACR9d,OAAQ+d,GACRrqB,QAASsqB,GACT7a,YAAa9Q,KAAK8Q,cAClBzD,OAAQrN,KAAKisB,aACbzf,YAAaxM,KAAKrB,MAAM6N,YACxBqE,WAAY7Q,KAAKtE,MAAMkqB,WAZpBtrB,IAAAA,cAACgI,EAAAA,EAAa,KAe7B,EACH1C,GAnHoBgsB,GAAY,aAX7BQ,WAAU5wB,IAAAA,OAAAsB,WAEVU,QAAOhC,IAAAA,MAAA,CARP2wB,YAAW3wB,IAAAA,KAAAsB,WACXmvB,aAAYzwB,IAAAA,KAAAsB,aAAAA,WAQZ2M,2BAA0BjO,IAAAA,KAAAsB,aCU9B,UAAeE,EAAAA,EAAAA,UArBf,SAAyB2B,EAAoBC,GACzC,MAAMsG,GAASmF,EAAAA,EAAAA,IAAU1L,GACnBytB,EAAsB,IAAI/M,gBAAgBzgB,EAASwL,SAASrG,QAASub,IAAI,OAAS,GAClF7V,EAAmE,SAAtCvE,EAAOuF,2BAE1C,MAAO,CACH2hB,aACAxG,SAAUjnB,EAAME,SAASsV,aAAaO,UAAU0X,GAChD3iB,6BAER,IAEA,SAA4BlK,GACxB,MAAO,CACH/B,SAASgC,EAAAA,EAAAA,oBAAmB,CACxB2sB,YAAW,MACXF,aAAYA,GAAAA,IACb1sB,GAEX,GAEA,CAA4DqsB,I,0ZCzB5D,MAAMH,GAAS,CAAChxB,GAAI,oBAAqBC,eAAgB,QACnDgxB,GAAS,CAACjxB,GAAI,iCAAkCC,eAAgB,UAChEixB,GAAU,CAAClxB,GAAI,mCAAoCC,eAAgB,eAoD1D,MAAM2xB,WAA4B/xB,IAAAA,cAG7CoF,WAAAA,CAAYhE,GACRiE,MAAMjE,GAAOkE,GAAA,yBAaEsB,UACflB,KAAKmrB,QAAUlf,EAEXjM,KAAKtE,MAAMuQ,KAAMxR,KACjBwR,EAAKxR,GAAKuF,KAAKtE,MAAMuQ,KAAMxR,IAG3BuF,KAAKtE,MAAMuQ,KAAMmG,QACjBnG,EAAKmG,MAAQpS,KAAKtE,MAAMuQ,KAAMmG,OAGlC,MAAMka,EAAoBtsB,KAAKtE,MAAMuQ,KAAM6F,cAAcrR,SAAWwL,EAAM6F,cAAcrR,QACpFT,KAAKtE,MAAMuQ,KAAM6F,cAAcga,OAAM,CAACC,EAAG/c,IAAM+c,IAAM9f,EAAK6F,cAAc9C,KAEtEud,EAAoBvsB,KAAKtE,MAAMuQ,KAAMgE,cAAcxP,SAAWwL,EAAMgE,cAAcxP,QACpFT,KAAKtE,MAAMuQ,KAAMgE,cAAc6b,OAAM,CAACC,EAAG/c,IAAM+c,IAAM9f,EAAKgE,cAAcjB,KAExEhP,KAAKtE,MAAMuQ,KAAM+F,eAAiB/F,EAAK+F,cACtCsa,GAAqBC,QAGhBvsB,KAAKorB,aAFXprB,KAAKyoB,oBAGT,IACH7oB,GAAA,2BAEoB,KACjBI,KAAKE,SAAS,CAACyoB,kBAAkB,GAAM,IAC1C/oB,GAAA,8BAEuB,KACpBI,KAAKE,SAAS,CAACyoB,kBAAkB,GAAO,IAC3C/oB,GAAA,mBAEYsB,UACTlB,KAAKE,SAAS,CAACsM,YAAa,KAE5B,MAAM,KAAChM,EAAI,MAAEqF,SAAe7F,KAAKtE,MAAM8B,QAAQgvB,mBAAmBxsB,KAAKmrB,SAEnE3qB,GACAgG,EAAAA,GAAAA,KAAarE,KAAK,IAADhH,OAAK6E,KAAKtE,MAAMb,KAAKO,KAAI,qCAI9C4E,KAAKE,SAAS,CAACyoB,kBAAkB,IAE7B9iB,GACA7F,KAAKE,SAAS,CAACsM,YAAa3G,EAAMtJ,UACtC,IACHqD,GAAA,oBAEa,KACV,MAAMipB,EACFvuB,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,iCACHC,eAAe,WAIjBouB,EACFxuB,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,kCACHC,eAAe,0BAIjBquB,EACFzuB,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,mCACHC,eAAe,oGAIvB,OACIJ,IAAAA,cAACif,GAAAA,EAAY,CACT/e,MAAOsuB,EACPvsB,QAASwsB,EACTptB,kBAAmBktB,EACnBvsB,WAAW,+BACXkd,KAAMxZ,KAAKrB,MAAMgqB,iBACjBhsB,UAAWqD,KAAKorB,WAChB1R,SAAU1Z,KAAKgpB,uBACjB,IA7FNhpB,KAAKrB,MAAQ,CACTgqB,kBAAkB,EAClBnc,YAAa,GAErB,CAEA3K,iBAAAA,GACQ7B,KAAKtE,MAAMyN,wBACXnJ,KAAKtE,MAAM8B,QAAQivB,gBAAgBzsB,KAAKtE,MAAM6vB,OAEtD,CAuFAvpB,MAAAA,GACI,OAAKhC,KAAKtE,MAAMuQ,KAKZ3R,IAAAA,cAACsX,GAAuB,CACpB/W,KAAMmF,KAAKtE,MAAMb,KACjB4S,OAAQge,GACR9d,OAAQ+d,GACRrqB,QAASsqB,GACT7a,YAAa9Q,KAAK8Q,cAClBzD,OAAQrN,KAAK0sB,iBACblgB,YAAaxM,KAAKrB,MAAM6N,YACxBQ,YAAahN,KAAKtE,MAAMuQ,KACxB+B,2BAA4BhO,KAAKtE,MAAMsS,2BACvCE,uBAAwBlO,KAAKtE,MAAMwS,yBAdhC5T,IAAAA,cAACgI,EAAAA,EAAa,KAiB7B,EACH1C,GA1HoBysB,GAAmB,aAnCpCd,OAAM/vB,IAAAA,OAAAsB,WACNU,QAAOhC,IAAAA,MAAA,CAKHgxB,mBAAkBhxB,IAAAA,KAAAsB,WAKlB2vB,gBAAejxB,IAAAA,KAAAsB,aAAAA,WAMnBqM,uBAAsB3N,IAAAA,KAKtBwS,2BAA0BxS,IAAAA,KAAAsB,WAK1BoR,uBAAsB1S,IAAAA,KAAAsB,aClB1B,UAAeE,EAAAA,EAAAA,UAzBf,SAAyB2B,EAAoBC,GACzC,MAAMsG,GAASmF,EAAAA,EAAAA,IAAU1L,GACnB4sB,EAAU,IAAIlM,gBAAgBzgB,EAASwL,SAASrG,QAASub,IAAI,MAC7DnW,EAA2D,SAAlCjE,EAAOqF,uBAChCyD,EAAmE,SAAtC9I,EAAO0J,2BACpCV,EAA2D,SAAlChJ,EAAO2J,uBAEtC,MAAO,CACH0c,OAAQA,EACRtf,KAAMtN,EAAME,SAASsV,aAAaG,cAAciX,GAChDpiB,yBACA6E,6BACAE,yBAER,IAEA,SAA4B3O,GACxB,MAAO,CACH/B,SAASgC,EAAAA,EAAAA,oBAAmB,CACxBgtB,mBAAkB,MAClBC,gBAAeA,GAAAA,IAChBltB,GAEX,GAEA,CAA4D8sB,I,0ZC5BrD,SAAS1U,GAAcgV,EAAkC3hB,EAAkBW,GAC9E,OAAKA,IAI+D,IAAhEghB,EAAgB3nB,aAAac,cAAcpE,QAAQiK,KACY,IAA/DghB,EAAgBrkB,YAAYxC,cAAcpE,QAAQiK,OAIlDghB,EAAgBxgB,aACZnB,IAA2D,IAAhDA,EAAQ5P,KAAK0K,cAAcpE,QAAQiK,GAM1D,CA0Ce,MAAMihB,WAAiCtyB,IAAAA,cAA2BoF,WAAAA,GAAA,SAAAiJ,WAAA/I,GAAA,qBAC9D,KACXI,KAAKtE,MAAMK,SAASiE,KAAKtE,MAAMixB,gBAAgB,GAClD,CAED3qB,MAAAA,GACI,MAAM2qB,EAAkB3sB,KAAKtE,MAAMixB,gBAC7B3hB,EAAUhL,KAAKtE,MAAMsP,QAG3B,IAAK2M,GAAcgV,EAAiB3hB,EAFrBhL,KAAKtE,MAAMiQ,OAAS3L,KAAKtE,MAAMiQ,OAAO7F,cAAgB,IAGjE,OAAO,KAGX,IAAI1H,EAEAA,EADAuuB,EAAgB3nB,aACF2nB,EAAgB3nB,aACvBgG,EACOA,EAAQhG,aAGlB1K,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,8CACHC,eAAe,sBAK3B,IAAI4N,EAAc,KACdqkB,EAAgBrkB,cAChBA,EACIhO,IAAAA,cAAA,OAAKC,UAAU,qBACXD,IAAAA,cAAA,QAAMC,UAAU,6BACXoyB,EAAgBrkB,eAMjC,IAAI9K,EAAU,KACVwC,KAAKtE,MAAM2tB,YACX7rB,EACIlD,IAAAA,cAAA,OAAKC,UAAU,gBACXD,IAAAA,cAACW,EAAAA,KAAI,CAACC,GAAE,IAAAC,OAAM6E,KAAKtE,MAAMb,KAAKO,KAAI,4CAAAD,OAA2CwxB,EAAgBlyB,KACzFH,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,8BACHC,eAAe,UAGtB,MACDJ,IAAAA,cAACmB,EAAqB,CAClBI,aACIvB,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,6CACHC,eAAe,mIAGvBqB,SAAUiE,KAAK7B,iBAM/B,MAAM0uB,GAAoBzG,EAAAA,GAAAA,MAAe,UAAYuG,EAAgBlyB,GAErE,OACIH,IAAAA,cAAA,OAAKC,UAAU,wBACXD,IAAAA,cAAA,OAAKC,UAAU,gBACXD,IAAAA,cAAA,OAAKC,UAAU,4EACXD,IAAAA,cAAA,UAAQC,UAAU,sBACb6D,GAEJZ,GAEJ8K,EACDhO,IAAAA,cAAA,OAAKC,UAAU,qBACXD,IAAAA,cAAA,QAAMC,UAAU,qCACZD,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,6BACHC,eAAe,aACfY,OAAQ,CACJwnB,IAAK+J,KAGbvyB,IAAAA,cAAA,YACIA,IAAAA,cAACyqB,GAAQ,CACLC,OAAOphB,EAAAA,EAAAA,eAAc,CACjBnJ,GAAI,wBACJC,eAAgB,aAEpBoG,MAAO+rB,OAKvBvyB,IAAAA,cAAA,OAAKC,UAAU,qBACXD,IAAAA,cAAA,QAAMC,UAAU,0BACZD,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,kCACHC,eAAe,iDACfY,OAAQ,CACJ0D,QAASgB,KAAKtE,MAAMsD,QAAQG,SAC5BoqB,SAAUoD,EAAgB1f,gBAQ1D,E,0ZACHrN,GA/GoBgtB,GAAwB,aA9BzC7wB,SAAQP,IAAAA,KAAAsB,WAKR6O,OAAMnQ,IAAAA,OAKNwD,QAAOxD,IAAAA,MAAA,CACH2D,SAAQ3D,IAAAA,OAAAsB,aAAAA,WAMZusB,UAAS7tB,IAAAA,KAAAsB,aCnBE,MAAMgwB,WAAkCxyB,IAAAA,cACnDoF,WAAAA,CAAYhE,GACRiE,MAAMjE,GAAOkE,GAAA,8BAYQ+sB,IACrB3sB,KAAKtE,MAAM8B,QAAQuvB,mBAAmBJ,EAAgBlyB,GAAG,IAC5DmF,GAAA,iBAEUsB,UACHlB,KAAKtE,MAAMoN,wBACX9I,KAAKE,SAAS,CAACmB,SAAS,IACpBH,gBACUlB,KAAKtE,MAAM8B,QAAQoiB,oCACrB5f,KAAKtE,MAAMb,KAAKJ,GAChBuyB,EA/CN,KAiDM,GAEJhtB,KAAKE,SAAS,CAACD,KAAM+sB,EAAY3rB,SAAS,GAAO,GAG7D,IACHzB,GAAA,iBAEU,KACPI,KAAKitB,SAASjtB,KAAKrB,MAAMsB,KAAO,EAAE,IACrCL,GAAA,qBAEc,KACXI,KAAKitB,SAASjtB,KAAKrB,MAAMsB,KAAO,EAAE,IACrCL,GAAA,+BAEwB,CAACoW,EAAoBC,KAC1C,IAAIiX,EAAelX,EAAEhR,aACrB,IAAKkoB,EAAc,CACf,MAAMC,EAAWntB,KAAKtE,MAAMkP,SAASoL,EAAE7J,YAEnC+gB,EADAC,EACeA,EAASnoB,aAETF,EAAAA,GAAsB,CAACrK,GAAI,8CAA+CC,eAAgB,qBAEjH,CAEA,MAAM0yB,EAAenX,EAAEjR,aACvB,OAAOkoB,EAAahX,cAAckX,EAAa,IAClDxtB,GAAA,yBAEmB+L,GAAmB3L,KAAKtE,MAAM0Y,cAC9CxI,KAAK5L,KAAKqtB,wBACV1hB,QAAQghB,GAAqChV,GAAcgV,EAAiB3sB,KAAKtE,MAAMkP,SAAS+hB,EAAgBxgB,YAAaR,KAC7HpK,KAAKorB,IACD,MAAMtD,EAAYrpB,KAAKtE,MAAM4xB,yBAA2BttB,KAAKtE,MAAMiK,KAAKlL,KAAOkyB,EAAgBvf,QACzFpC,EAAUhL,KAAKtE,MAAMkP,SAAS+hB,EAAgBxgB,YACpD,OACI7R,IAAAA,cAACsyB,GAAwB,CACrBxqB,IAAKuqB,EAAgBlyB,GACrBkyB,gBAAiBA,EACjB5wB,SAAUiE,KAAKutB,sBACfvuB,QAASgB,KAAKtE,MAAMme,MAAM8S,EAAgBvf,UAAY,CAAC,EACvDic,UAAWA,EACXxuB,KAAMmF,KAAKtE,MAAMb,KACjBmQ,QAASA,GACX,MApEVhL,KAAKrB,MAAQ,CACTsB,KAAM,EACNoB,SAAS,EAEjB,CAEAQ,iBAAAA,GACI7B,KAAKitB,SAAS,EAClB,CAgEAjrB,MAAAA,GACI,OACI1H,IAAAA,cAAC0gB,GAAa,CACVvN,OACInT,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,qCACHC,eAAe,gCAGvBmc,QACIvc,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,kCACHC,eAAe,yBAGvBkc,QAAS,IAAM5W,KAAKtE,MAAMb,KAAKO,KAAO,sCACtC0b,YAAY,qBACZH,UACIrc,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,oCACHC,eAAe,+BAGvB+b,gBACInc,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,0CACHC,eAAe,4CAGvBgd,SACIpd,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,mCACHC,eAAe,oKACfY,OAAQ,CACJyuB,aACIzvB,IAAAA,cAAC4P,GAAAA,EAAY,CACTE,SAAS,8BACTD,KAAM6U,GAAAA,GAAeqH,yBAErB/rB,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,gDACHC,eAAe,oBAI3BuP,aACI3P,IAAAA,cAAC4P,GAAAA,EAAY,CACTC,KAAK,qCACLC,SAAS,+BAET9P,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,gDACHC,eAAe,sBAOvC4b,kBAAmBxR,EAAAA,GAAsB,CAACrK,GAAI,qCAAsCC,eAAgB,6BACpG2G,QAASrB,KAAKrB,MAAM0C,QACpB6B,SAAUlD,KAAKkD,SACfI,aAActD,KAAKsD,aACnBrD,KAAMD,KAAKrB,MAAMsB,KACjBqX,SAnKE,IAoKFJ,MAAOlX,KAAKtE,MAAM8xB,0BAEhB7hB,IACE,MAAMtG,EAAWrF,KAAKytB,iBAAiB9hB,GACvC,MAAO,CAACtG,EAAUA,EAAS5E,OAAS,EAAE,GAItD,EACHb,GAtJoBktB,GAAyB,aAlB1C1Y,cAAa5Y,IAAAA,MAAAsB,WACb0wB,wBAAuBhyB,IAAAA,OAAAsB,WAGvBwwB,wBAAuB9xB,IAAAA,KAAAsB,WACvBgM,uBAAsBtN,IAAAA,KAAAsB,WACtBU,QAAOhC,IAAAA,MAAA,CACHuxB,mBAAkBvxB,IAAAA,KAAAsB,WAClB8iB,oCAAmCpkB,IAAAA,KAAAsB,aAAAA,aCe3C,UAAeE,EAAAA,EAAAA,UA3Bf,SAAyB2B,GACrB,MAAMqK,GAAS8L,EAAAA,EAAAA,IAAiBnW,GAC1ByV,EAAgBS,GAAyBlW,GACzC6uB,E9BTH,SAAoC7uB,GACvC,OAAOA,EAAME,SAASsV,aAAaqZ,uBACvC,C8BOoCE,CAA2B/uB,GACrDuG,GAASmF,EAAAA,EAAAA,IAAU1L,GACnB2uB,GAA0BtD,EAAAA,EAAAA,IAAoBrrB,EAAOqK,EAAQ7L,EAAAA,GAAYwwB,iCACzE7kB,EAA2D,SAAlC5D,EAAOoF,uBAEtC,MAAO,CACH8J,gBACAoZ,0BACA5iB,UAAUgjB,EAAAA,GAAAA,IAAejvB,GACzBkb,OAAOmR,EAAAA,EAAAA,IAASrsB,GAChB2uB,0BACAxkB,yBAER,IAEA,SAA4BvJ,GACxB,MAAO,CACH/B,SAASgC,EAAAA,EAAAA,oBAAmB,CACxBogB,oCAAmC,GACnCmN,mBAAkBA,GAAAA,IACnBxtB,GAEX,GAEA,CAA4DutB,I,maClC5D,MAAMe,GAAc,kBAEb,SAASlW,GAAciO,EAAoBja,GAC9C,OAAKA,GAIEia,EAASxqB,KAAK0K,cAAcgU,SAASnO,EAChD,CA0Ce,MAAMmiB,WAA0BxzB,IAAAA,cAC3CoF,WAAAA,CAAYhE,GACRiE,MAAMjE,GAAOkE,GAAA,+BAOSC,IAClBA,GAAKA,EAAEC,gBACPD,EAAEC,iBAENE,KAAKE,SAAS,CAACknB,aAAcpnB,KAAKtE,MAAMkqB,SAASgB,eAAe,IACnEhnB,GAAA,+BAEyBC,IACtBA,EAAEC,iBACFE,KAAKE,SAAS,CAACknB,aAAcyG,IAAa,IAC7CjuB,GAAA,yBAEmBC,IAChBA,EAAEC,iBACFE,KAAKtE,MAAMqyB,mBAAmB/tB,KAAKtE,MAAMkqB,SAASnrB,IAAI8F,MAClD3F,IAAa,IAAZ,MAACiL,GAAMjL,EACAiL,EACA7F,KAAKE,SAAS,CAAC2F,MAAOA,EAAMtJ,WAE5ByD,KAAKE,SAAS,CAAC2F,MAAO,OACtB7F,KAAKguB,yBACT,GAEP,IACJpuB,GAAA,qBAEc,KACXI,KAAKtE,MAAMK,SAASiE,KAAKtE,MAAMkqB,SAAS,IAhCxC5lB,KAAKrB,MAAQ,CACTyoB,aAAcyG,GAEtB,CAgCA7rB,MAAAA,GACI,MAAM,SAAC4jB,EAAQ,YAAEqI,GAAejuB,KAAKtE,MACrC,IAAImK,EAcAzK,EAYAkN,EAhBJ,GARItI,KAAKrB,MAAMkH,QACXA,EACIvL,IAAAA,cAACyN,EAAAA,EAAS,CACNlC,MAAO7F,KAAKrB,MAAMkH,UAKzB8R,GAAciO,EAAU5lB,KAAKtE,MAAMiQ,QACpC,OAAO,KAKPvQ,EADAwqB,EAASxqB,KACFwqB,EAASxqB,KAGZd,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,2CACHC,eAAe,kCAMvBkrB,EAAStd,cACTA,EACIhO,IAAAA,cAAA,OAAKC,UAAU,qBACXD,IAAAA,cAAA,QAAMC,UAAU,6BACXqrB,EAAStd,eAM1B,MAAM4lB,EACF5zB,IAAAA,cAAA,OAAKC,UAAU,qBACXD,IAAAA,cAAA,QAAMC,UAAU,qCACZD,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,uCACHC,eAAe,wBACfY,OAAQ,CACJ4yB,KAAMtI,EAAS3V,cAAcC,KAAK,WAOtD,IAAIie,EAiBAC,EACAhH,EAhBA+G,EADAvI,EAASzV,WAEL7V,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,mCACHC,eAAe,QAKnBJ,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,kCACHC,eAAe,OAOvBsF,KAAKrB,MAAMyoB,eAAiByG,IAC5BO,EACI9zB,IAAAA,cAAA,UACIG,GAAG,mBACHF,UAAU,0BACV0B,QAAS+D,KAAKguB,wBAEd1zB,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,oCACHC,eAAe,iBAI3B0sB,EACI9sB,IAAAA,cAAA,QAAMC,UAAU,uBACZD,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,uCACHC,eAAe,oBAEnBJ,IAAAA,cAAA,cAAS0F,KAAKrB,MAAMyoB,iBAI5BgH,EACI9zB,IAAAA,cAAA,UACIG,GAAG,mBACHF,UAAU,0BACV0B,QAAS+D,KAAKquB,wBAEd/zB,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,oCACHC,eAAe,iBAI3B0sB,EACI9sB,IAAAA,cAAA,QAAMC,UAAU,uBACZD,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,uCACHC,eAAe,oBAEnBJ,IAAAA,cAAA,cAAS0F,KAAKrB,MAAMyoB,cACpB9sB,IAAAA,cAACyqB,GAAQ,CACLC,MAAO3W,GAAS2Y,iBAChBlmB,MAAOd,KAAKrB,MAAMyoB,iBAMlC,MAAMkH,EACFh0B,IAAAA,cAAA,UACIG,GAAG,yBACHF,UAAU,0BACV0B,QAAS+D,KAAKuuB,kBAEdj0B,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,qCACHC,eAAe,uBAK3B,IAAIqW,EAYAvT,EACqB,IAAAotB,EAZrBhF,EAASrZ,WACTwE,EACIzW,IAAAA,cAAA,OAAKC,UAAU,4CACXD,IAAAA,cAAA,OACIkO,IAAK,qBACLC,IAAKmd,EAASrZ,aAOzBvM,KAAKtE,MAAM6c,UACZ/a,EACIlD,IAAAA,cAAA,OAAKC,UAAU,gBACV6zB,EACA,MACAE,EACA,MACDh0B,IAAAA,cAACW,EAAAA,KAAI,CAACC,GAAE,IAAAC,OAAqB,QAArByvB,EAAM5qB,KAAKtE,MAAMb,YAAI,IAAA+vB,OAAA,EAAfA,EAAiBxvB,KAAI,sCAAAD,OAAqCyqB,EAASnrB,KAC7EH,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,8BACHC,eAAe,UAGtB,MACDJ,IAAAA,cAACmB,EAAqB,CAClBI,aACIvB,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,sCACHC,eAAe,wIAGvBqB,SAAUiE,KAAK7B,iBAM/B,IAAIqwB,EACAl0B,IAAAA,cAAA,OAAKC,UAAU,qBACXD,IAAAA,cAAA,QAAMC,UAAU,0BACZD,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,iCACHC,eAAe,gCAkD/B,OA7CKsF,KAAKtE,MAAM6c,UACZiW,EACIl0B,IAAAA,cAAAA,IAAAA,SAAA,KACIA,IAAAA,cAAA,OAAKC,UAAU,qBACXD,IAAAA,cAAA,QAAMC,UAAU,qCACZD,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,kCACHC,eAAe,iBAEnBJ,IAAAA,cAAA,cAAS6zB,KAGjB7zB,IAAAA,cAAA,OAAKC,UAAU,qBACXD,IAAAA,cAAA,QAAMC,UAAU,uBACZD,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,mCACHC,eAAe,gBAEnBJ,IAAAA,cAAA,cAASsrB,EAASnrB,IAClBH,IAAAA,cAACyqB,GAAQ,CACLC,MAAO3W,GAASyY,aAChBhmB,MAAO8kB,EAASnrB,OAI5BH,IAAAA,cAAA,OAAKC,UAAU,qBACV6sB,GAEJ8G,EACD5zB,IAAAA,cAAA,OAAKC,UAAU,qBACXD,IAAAA,cAAA,QAAMC,UAAU,0BACZD,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,kCACHC,eAAe,iDACfY,OAAQ,CACJ0D,QAASivB,EACT1E,SAAU3D,EAAS3Y,iBAU3C3S,IAAAA,cAAA,OAAKC,UAAU,wBACVwW,EACDzW,IAAAA,cAAA,OAAKC,UAAU,gBACXD,IAAAA,cAAA,OAAKC,UAAU,4EACXD,IAAAA,cAAA,UAAQC,UAAU,sBACba,GAEJoC,GAEJqI,EACAyC,EACAkmB,GAIjB,EACH5uB,GA9RoBkuB,GAAiB,aAzBlCvV,QAAO/c,IAAAA,KAAAsB,WAEPmxB,YAAWzyB,IAAAA,OAAAsB,WAKXixB,mBAAkBvyB,IAAAA,KAAAsB,WAKlBf,SAAQP,IAAAA,KAAAsB,WAKR6O,OAAMnQ,IAAAA,UAAA,CAAAA,IAAAA,OAAAA,IAAAA,MAAA,YAwSV,MAAM6S,IAAWC,EAAAA,EAAAA,gBAAe,CAC5BwY,aAAc,CACVrsB,GAAI,8BACJC,eAAgB,kBAEpBssB,iBAAkB,CACdvsB,GAAI,kCACJC,eAAgB,wBCnVxB,IAAesC,EAAAA,EAAAA,UAPf,SAAyB2B,EAAoBC,GACzC,MAAMgnB,EAAWhnB,EAASgnB,UAAY,CAAC,EACvC,MAAO,CACHqI,aAAa/uB,EAAAA,EAAAA,IAAqBP,GAAOM,EAAAA,EAAAA,IAAQN,EAAOinB,EAAStnB,aAEzE,GAEA,CAAwCwvB,I,0ZCmDzB,MAAMW,WAA2Bn0B,IAAAA,cAC5CoF,WAAAA,CAAYhE,GACRiE,MAAMjE,GAAOkE,GAAA,uBAcCkQ,IACVA,GAAOA,EAAIrV,IACXuF,KAAKtE,MAAM8B,QAAQkxB,eAAe5e,EAAIrV,GAC1C,IACHmF,GAAA,kBAgBY+L,GAAoB6D,OAAOlU,OAAO0E,KAAKtE,MAAMgZ,WACtD/I,QAAQmE,GAAQ6H,GAAc7H,EAAKnE,KACnCC,KAAK5L,KAAK2uB,iBACVptB,KAAKuO,GAEGxV,IAAAA,cAACwzB,GAAiB,CACd1rB,IAAK0N,EAAIrV,GACTmrB,SAAU9V,EACVie,mBAAoB/tB,KAAKtE,MAAM8B,QAAQoxB,oBACvC7yB,SAAUiE,KAAK0uB,eACf7zB,KAAMmF,KAAKtE,MAAMb,KACjBozB,YAAY,GACZ1V,QAASvY,KAAKtE,MAAM0Z,gBAAgB0E,SAAShK,EAAIrV,UA7C7DuF,KAAKrB,MAAQ,CACT0C,SAAS,EAEjB,CAEAQ,iBAAAA,GACQ7B,KAAKtE,MAAM+N,4BACXzJ,KAAKtE,MAAM8B,QAAQ8iB,2BAA2B/f,MAC1C,IAAMP,KAAKE,SAAS,CAACmB,SAAS,KAG1C,CAQAstB,eAAAA,CAAgB3Y,EAAaC,GACzB,IAAI2T,EAAQ5T,EAAE5a,KAAKyzB,WACdjF,IACDA,GAAQjX,EAAAA,EAAAA,IAAgB,CAAClY,GAAI,2CAA4CC,eAAgB,mCAG7F,IAAImvB,EAAQ5T,EAAE7a,KAAKyzB,WAKnB,OAJKhF,IACDA,GAAQlX,EAAAA,EAAAA,IAAgB,CAAClY,GAAI,2CAA4CC,eAAgB,mCAGtFkvB,EAAM1T,cAAc2T,EAC/B,CAmBA7nB,MAAAA,GACI,IAAKhC,KAAKtE,MAAMb,KACZ,OAAO,KAGX,IAAIa,EASJ,OAV4BsE,KAAKtE,MAAM+N,4BAA8BzJ,KAAKtE,MAAMozB,iBAG5EpzB,EAAQ,CACJkb,QAAS,IAAM5W,KAAKtE,MAAMb,KAAKO,KAAO,gCACtCyb,SAASlE,EAAAA,EAAAA,IAAgB,CAAClY,GAAI,2BAA4BC,eAAgB,8BAC1Eoc,YAAa,gBAKjBxc,IAAAA,cAAC0gB,GAAaxL,OAAA6I,OAAA,CACV5K,OACInT,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,+BACHC,eAAe,2BAGvBgd,SACIpd,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,4BACHC,eAAe,2JACfY,OAAQ,CACJyzB,kBACIz0B,IAAAA,cAAC4P,GAAAA,EAAY,CACTC,KAAM6U,GAAAA,GAAe6H,aACrBzc,SAAS,wBAET9P,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,8CACHC,eAAe,4BAI3BuP,aACI3P,IAAAA,cAAC4P,GAAAA,EAAY,CACTC,KAAK,sCACLC,SAAS,wBAET9P,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,yCACHC,eAAe,sBAOvCic,UACIrc,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,6BACHC,eAAe,oCAGvB+b,gBACInc,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,mCACHC,eAAe,iDAGvB4b,mBAAmB3D,EAAAA,EAAAA,IAAgB,CAAClY,GAAI,8BAA+BC,eAAgB,kCACvF2G,QAASrB,KAAKrB,MAAM0C,SAChB3F,IAEFiQ,IACE,MAAMtG,EAAWrF,KAAK0U,UAAU/I,GAChC,MAAO,CAACtG,EAAUA,EAAS5E,OAAS,EAAE,GAItD,EACHb,GAhIoB6uB,GAAkB,aAnCnCrZ,gBAAe5Z,IAAAA,QAAAA,IAAAA,QAAAsB,WAKfgyB,eAActzB,IAAAA,KAAAsB,WAKd2M,2BAA0BjO,IAAAA,KAAAsB,WAE1BU,QAAOhC,IAAAA,MAAA,CAKH8kB,yBAAwB9kB,IAAAA,KAAAsB,WAKxB8xB,oBAAmBpzB,IAAAA,KAAAsB,WAKnB4xB,eAAclzB,IAAAA,KAAAsB,aAAAA,aCrBtB,UAAeE,EAAAA,EAAAA,UAvBf,SAAyB2B,GACrB,MACM8K,EAAmE,UAD1DY,EAAAA,EAAAA,IAAU1L,GACiB8L,2BAE1C,MAAO,CACHqkB,gBAAgBrP,EAAAA,EAAAA,IAAsB9gB,EAAO,CAAC+gB,WAAYviB,EAAAA,GAAYwM,eACtE+K,UAAWD,GAAa9V,GACxByW,gBAAiBF,GAAmBvW,GACpC8K,6BACA5O,MAAMyE,EAAAA,EAAAA,IAAeX,GAE7B,IAEA,SAA4BY,GACxB,MAAO,CACH/B,SAASgC,EAAAA,EAAAA,oBAAmB,CACxB8gB,yBAAwB,GACxBsO,oBAAmB,MACnBF,eAAcA,GAAAA,IACfnvB,GAEX,GAEA,CAA4DkvB,I,0ZC3BrD,SAAS9W,GAAcqX,EAAkChkB,EAAkBW,GAC9E,IAAKA,EACD,OAAO,EAGX,MACI3G,aAAc5G,EAAW,YACzBkK,EACAwJ,cAAeD,GACfmd,EAEJ,GACK5wB,IAA8D,IAA/CA,EAAY0H,cAAcpE,QAAQiK,IACjDrD,IAA8D,IAA/CA,EAAYxC,cAAcpE,QAAQiK,GAElD,OAAO,EAGX,GAAIkG,EACA,IAAK,MAAMM,KAAeN,EACtB,IAAmD,IAA/CM,EAAYrM,cAAcpE,QAAQiK,GAClC,OAAO,EAKnB,SAAIX,IAAWA,EAAQ5P,OACiC,IAAhD4P,EAAQ5P,KAAK0K,cAAcpE,QAAQiK,GAM/C,CAae,MAAMsjB,WAAiC30B,IAAAA,cAA2BoF,WAAAA,GAAA,SAAAiJ,WAAA/I,GAAA,yBACzDC,IAChBA,EAAEC,iBAEFE,KAAKtE,MAAM0tB,aAAappB,KAAKtE,MAAMszB,gBAAgB,IACtDpvB,GAAA,qBAEc,KACXI,KAAKtE,MAAMK,SAASiE,KAAKtE,MAAMszB,gBAAgB,GAClD,CAEDE,eAAAA,CAAgBF,EAAkChkB,GAC9C,OAAIgkB,EAAgBhqB,aACTgqB,EAAgBhqB,aAChBgG,EACAA,EAAQhG,aAGf1K,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,8CACHC,eAAe,qBAG3B,CAEAsH,MAAAA,GACI,MAAMgtB,EAAkBhvB,KAAKtE,MAAMszB,gBAC7BhkB,EAAUhL,KAAKtE,MAAMsP,QACrBW,EAAS3L,KAAKtE,MAAMiQ,OAAS3L,KAAKtE,MAAMiQ,OAAO7F,cAAgB,GAIrE,GAAIkpB,IAAoBrX,GAAcqX,EAAiBhkB,EAASW,GAC5D,OAAO,KAGX,MAAMvN,EAAc4B,KAAKkvB,gBAAgBF,EAAiBhkB,GAE1D,IAAI1C,EAAc,KACd0mB,EAAgB1mB,cAChBA,EACIhO,IAAAA,cAAA,OAAKC,UAAU,qBACXD,IAAAA,cAAA,QAAMC,UAAU,6BACXy0B,EAAgB1mB,eAMjC,IAAIuJ,EAAe,KACfmd,EAAgBld,eAAiBkd,EAAgBld,cAAcrR,OAAS,IACxEoR,EACIvX,IAAAA,cAAA,OAAKC,UAAU,qBACXD,IAAAA,cAAA,QAAMC,UAAU,+BACZD,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,sCACHC,eAAe,gCACfY,OAAQ,CACJuW,aAAcmd,EAAgBld,cAAc5B,KAAK,YAQzE,MAAMge,EACF5zB,IAAAA,cAAA,OAAKC,UAAU,qBACXD,IAAAA,cAAA,QAAMC,UAAU,qCACZD,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,uCACHC,eAAe,wBACfY,OAAQ,CACJ4yB,KAAMc,EAAgB/e,cAAcC,KAAK,WAO7D,IAAI+B,EAnDqB,IAoDrB+c,EAAgB9c,aAChBD,EACI3X,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,uDACHC,eAAe,8CAvDI,IA0DpBs0B,EAAgB9c,eACvBD,EACI3X,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,yDACHC,eAAe,2CAK3B,IAAI8C,EAAU,KAkCd,OAjCIwC,KAAKtE,MAAM2tB,YACX7rB,EACIlD,IAAAA,cAAA,OAAKC,UAAU,gBACXD,IAAAA,cAAA,UACIC,UAAU,0BACV0B,QAAS+D,KAAKspB,kBAEdhvB,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,oCACHC,eAAe,sBAGtB,MACDJ,IAAAA,cAACW,EAAAA,KAAI,CAACC,GAAE,IAAAC,OAAM6E,KAAKtE,MAAMb,KAAKO,KAAI,4CAAAD,OAA2C6zB,EAAgBv0B,KACzFH,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,8BACHC,eAAe,UAGtB,MACDJ,IAAAA,cAACmB,EAAqB,CAClBI,aACIvB,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,6CACHC,eAAe,mIAGvBqB,SAAUiE,KAAK7B,iBAO3B7D,IAAAA,cAAA,OAAKC,UAAU,wBACXD,IAAAA,cAAA,OAAKC,UAAU,gBACXD,IAAAA,cAAA,OAAKC,UAAU,4EACXD,IAAAA,cAAA,UAAQC,UAAU,sBACb6D,GAEJZ,GAEJ8K,EACDhO,IAAAA,cAAA,OAAKC,UAAU,qBACXD,IAAAA,cAAA,QAAMC,UAAU,8BACZD,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,sCACHC,eAAe,8BACfY,OAAQ,CACJyW,YAAaid,EAAgBhd,cAAgB,yCAK5DH,EACDvX,IAAAA,cAAA,OAAKC,UAAU,qBACXD,IAAAA,cAAA,QAAMC,UAAU,8BACZD,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,qCACHC,eAAe,8BACfY,OAAQ,CACJ2W,mBAKhB3X,IAAAA,cAAA,OAAKC,UAAU,qBACXD,IAAAA,cAAA,QAAMC,UAAU,uBACZD,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,+BACHC,eAAe,iBACfY,OAAQ,CACJ8W,MAAO4c,EAAgB5c,SAG/B9X,IAAAA,cAACyqB,GAAQ,CACLC,OAAOphB,EAAAA,EAAAA,eAAc,CACjBnJ,GAAI,0BACJC,eAAgB,eAEpBoG,MAAOkuB,EAAgB5c,UAInC9X,IAAAA,cAAA,OAAKC,UAAU,qBACXD,IAAAA,cAAA,QAAMC,UAAU,0BACZD,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,kCACHC,eAAe,iDACfY,OAAQ,CACJ0D,QAASgB,KAAKtE,MAAMsD,QAAQG,SAC5BoqB,SAAUyF,EAAgB/hB,eAKzCihB,GAIjB,E,0ZACHtuB,GAvMoBqvB,GAAwB,aATzC7F,aAAY5tB,IAAAA,KAAAsB,WACZf,SAAQP,IAAAA,KAAAsB,WAIRusB,UAAS7tB,IAAAA,KAAAsB,WACT6O,OAAMnQ,IAAAA,SC2BK,MAAM2zB,WAAkC70B,IAAAA,cACnDoF,WAAAA,CAAYhE,GACRiE,MAAMjE,GAAOkE,GAAA,kCAmBYovB,IACzBhvB,KAAKtE,MAAM8B,QAAQ4xB,uBAAuBJ,EAAgBv0B,GAAG,IAChEmF,GAAA,2BAEqBovB,IAClBhvB,KAAKtE,MAAM8B,QAAQ6xB,mBAAmBL,EAAgBv0B,GAAG,IAC5DmF,GAAA,+BAEwB,CAACoW,EAAoBC,KAC1C,IAAIiX,EAAelX,EAAEhR,aACrB,IAAKkoB,EAAc,CACf,MAAMC,EAAWntB,KAAKtE,MAAMkP,SAASoL,EAAE7J,YAEnC+gB,EADAC,EACeA,EAASnoB,cAET2N,EAAAA,EAAAA,IAAgB,CAAClY,GAAI,8CAA+CC,eAAgB,qBAE3G,CAEA,IAAI0yB,EAAenX,EAAEjR,aACrB,IAAKooB,EAAc,CACf,MAAMkC,EAAWtvB,KAAKtE,MAAMkP,SAASqL,EAAE9J,YAEnCihB,EADAkC,EACeA,EAAStqB,cAET2N,EAAAA,EAAAA,IAAgB,CAAClY,GAAI,8CAA+CC,eAAgB,qBAE3G,CACA,OAAOwyB,EAAahX,cAAckX,EAAa,IAClDxtB,GAAA,yBAEmB+L,GAAmB3L,KAAKtE,MAAM6zB,iBAC9C3jB,KAAK5L,KAAKwvB,wBACV7jB,QAAQqjB,GAAoBrX,GAAcqX,EAAiBhvB,KAAKtE,MAAMkP,SAASokB,EAAgB7iB,YAAaR,KAC5GpK,KAAKytB,IACD,MAAM3F,EAAYrpB,KAAKtE,MAAM4xB,yBAA2BttB,KAAKtE,MAAMiK,KAAKlL,KAAOu0B,EAAgB1wB,WACzF0M,EAAUhL,KAAKtE,MAAMkP,SAASokB,EAAgB7iB,YACpD,OACI7R,IAAAA,cAAC20B,GAAwB,CACrB7sB,IAAK4sB,EAAgBv0B,GACrBu0B,gBAAiBA,EACjB5F,aAAcppB,KAAKyvB,0BACnB1zB,SAAUiE,KAAKqvB,mBACfrwB,QAASgB,KAAKtE,MAAMme,MAAMmV,EAAgB1wB,aAAe,CAAC,EAC1D+qB,UAAWA,EACXxuB,KAAMmF,KAAKtE,MAAMb,KACjBmQ,QAASA,GACX,MAhEVhL,KAAKrB,MAAQ,CACT0C,SAAS,EAEjB,CAEAQ,iBAAAA,GACQ7B,KAAKtE,MAAMyN,wBACXnJ,KAAKtE,MAAM8B,QAAQ4iB,oCACfpgB,KAAKtE,MAAMsN,OACXrB,GAAAA,GAAUe,aAAa6R,eACvB5S,GAAAA,GAAUe,aAAa8R,WACzBja,MACE,IAAMP,KAAKE,SAAS,CAACmB,SAAS,KAG1C,CAqDAW,MAAAA,GACI,OACI1H,IAAAA,cAAC0gB,GAAa,CACVvN,OACInT,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,qCACHC,eAAe,gCAGvBmc,QACIvc,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,kCACHC,eAAe,yBAGvBkc,QACI,IACA5W,KAAKtE,MAAMb,KAAKO,KAChB,sCAEJ0b,YAAY,qBACZH,UACIrc,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,oCACHC,eAAe,+BAGvB+b,gBACInc,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,2CACHC,eAAe,iDACfY,OAAQ,CACJ2a,EAAIiF,GAAmB5gB,IAAAA,cAAA,SAAI4gB,MAIvCxD,SACIpd,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,mCACHC,eAAe,oKACfY,OAAQ,CACJyuB,aACIzvB,IAAAA,cAAC4P,GAAAA,EAAY,CACTC,KAAM6U,GAAAA,GAAewH,wBACrBpc,SAAS,+BAET9P,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,gDACHC,eAAe,oBAI3BuP,aACI3P,IAAAA,cAAC4P,GAAAA,EAAY,CACTC,KAAK,qCACLC,SAAS,+BAET9P,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,gDACHC,eAAe,sBAOvC4b,mBAAmB3D,EAAAA,EAAAA,IAAgB,CAC/BlY,GAAI,qCACJC,eAAgB,6BAEpB2G,QAASrB,KAAKrB,MAAM0C,UAElBsK,IACE,MAAMtG,EAAWrF,KAAKuvB,iBAAiB5jB,GACvC,MAAO,CAACtG,EAAUA,EAAS5E,OAAS,EAAE,GAItD,EACHb,GAvJoBuvB,GAAyB,aAlD1C7B,wBAAuB9xB,IAAAA,KAAAsB,WAKvByyB,iBAAgB/zB,IAAAA,MAAAsB,WAehBkM,OAAMxN,IAAAA,OAAAsB,WAENU,QAAOhC,IAAAA,MAAA,CAKH6zB,mBAAkB7zB,IAAAA,KAAAsB,WAKlBsjB,oCAAmC5kB,IAAAA,KAAAsB,WAKnCsyB,uBAAsB5zB,IAAAA,KAAAsB,aAAAA,WAM1BqM,uBAAsB3N,IAAAA,KAAAsB,aC3B1B,UAAeE,EAAAA,EAAAA,UA9Bf,SAAyB2B,GACrB,MAAMuG,GAASmF,EAAAA,EAAAA,IAAU1L,GACnBqK,GAAS8L,EAAAA,EAAAA,IAAiBnW,GAC1B2uB,GAA0BtD,EAAAA,EAAAA,IAAoBrrB,EAAOqK,EAAQ7L,EAAAA,GAAYuyB,iCACzEpb,EAAgBD,GAAiB1V,GACjC4wB,EAAmB/f,OAAOwF,KAAKV,GACjC/S,KAAKa,GAAQkS,EAAclS,KAC3BuJ,QAAQqjB,GAAoBA,EAAgB7hB,UAAYnE,IACtDG,EAA2D,SAAlCjE,EAAOqF,uBAEtC,MAAO,CACHglB,mBACA3kB,UAAUgjB,EAAAA,GAAAA,IAAejvB,GACzBkb,OAAOmR,EAAAA,EAAAA,IAASrsB,GAChBqK,SACAskB,0BACAnkB,yBAER,IAEA,SAA4B5J,GACxB,MAAO,CACH/B,SAASgC,EAAAA,EAAAA,oBAAmB,CACxB4gB,oCAAmC,GACnCiP,mBAAoBM,GAAAA,GACpBP,uBAAwBO,GAAAA,IACzBpwB,GAEX,GAEA,CAA4D0vB,ICnD5D,SAAAW,GAAA/vB,EAAAiP,GAAA,IAAAC,EAAAS,OAAAwF,KAAAnV,GAAA,GAAA2P,OAAAqgB,sBAAA,KAAApa,EAAAjG,OAAAqgB,sBAAAhwB,GAAAiP,IAAA2G,EAAAA,EAAA9J,QAAA,SAAAmD,GAAA,OAAAU,OAAAsgB,yBAAAjwB,EAAAiP,GAAAY,UAAA,KAAAX,EAAA5M,KAAA4tB,MAAAhhB,EAAA0G,EAAA,QAAA1G,CAAA,UAAA6G,GAAA/V,GAAA,QAAAiP,EAAA,EAAAA,EAAAnG,UAAAlI,OAAAqO,IAAA,KAAAC,EAAA,MAAApG,UAAAmG,GAAAnG,UAAAmG,GAAA,GAAAA,EAAA,EAAA8gB,GAAApgB,OAAAT,IAAA,GAAAvM,SAAA,SAAAsM,GAAAlP,GAAAC,EAAAiP,EAAAC,EAAAD,GAAA,IAAAU,OAAAwgB,0BAAAxgB,OAAAygB,iBAAApwB,EAAA2P,OAAAwgB,0BAAAjhB,IAAA6gB,GAAApgB,OAAAT,IAAAvM,SAAA,SAAAsM,GAAAU,OAAAC,eAAA5P,EAAAiP,EAAAU,OAAAsgB,yBAAA/gB,EAAAD,GAAA,WAAAjP,CAAA,UAAAD,GAAAC,EAAAiP,EAAAC,GAAA,OAAAD,EAAA,SAAAC,GAAA,IAAAC,EAAA,SAAAD,GAAA,oBAAAA,IAAAA,EAAA,OAAAA,EAAA,IAAAlP,EAAAkP,EAAAE,OAAAC,aAAA,YAAArP,EAAA,KAAAmP,EAAAnP,EAAAsP,KAAAJ,EAAAD,UAAA,oBAAAE,EAAA,OAAAA,EAAA,UAAAI,UAAA,uDAAAC,OAAAN,EAAA,CAAAO,CAAAP,GAAA,uBAAAC,EAAAA,EAAAA,EAAA,GAAAO,CAAAT,MAAAjP,EAAA2P,OAAAC,eAAA5P,EAAAiP,EAAA,CAAAhO,MAAAiO,EAAAW,YAAA,EAAAC,cAAA,EAAAC,UAAA,IAAA/P,EAAAiP,GAAAC,EAAAlP,CAAA,CAmBwE,IAwBnEqwB,GAAgB,SAAhBA,GAAgB,OAAhBA,EAAgB,kBAAhBA,EAAgB,cAAhBA,EAAgB,wBAAhBA,EAAgB,sBAAhBA,EAAgB,cAAhBA,CAAgB,EAAhBA,IAAgB,IAQrB,MAiBMC,GAAwC,CAC1C11B,GAAI,GACJW,KAAM,GACNkD,WAAY,GACZ2O,UAAW,EACXC,UAAW,EACXia,UAAW,GACXP,cAAe,GACfc,gBAAiB,GACjBF,WAAY,qBACZG,UAAW,IAGA,SAASyI,GAAgC10B,GACpD,MAAO20B,EAAWC,GA/BQC,KAC1B,MAAMJ,EAAsB,CACxB/0B,KAAMm1B,EAAWn1B,MAAQ,GACzBo1B,aAAcD,EAAW5I,UAAY4I,EAAW5I,UAAUzX,KAAK,MAAQ,GACvEugB,cAAeF,EAAW7I,iBAAmB,GAC7CR,SAAUqJ,EAAWpJ,WAAa,GAClCC,aAAcmJ,EAAW3J,eAAiB,GAC1C8J,UAAW,uBAGR/xB,EAAOuB,IAAYuO,EAAAA,EAAAA,UAAS0hB,GAEnC,OAAOpyB,EAAAA,EAAAA,UAAQ,IAAM,CAACY,EAAQgyB,IAC1BzwB,GAAU0wB,GAAQhb,GAAAA,GAAA,GAAUgb,GAAaD,IAAW,IACpD,CAAChyB,GAAO,EAiBsBkyB,CAAqBn1B,EAAMo1B,mBAAqBX,KAE3EY,EAAaC,IAAYviB,EAAAA,EAAAA,UAA0B,KACnDwiB,EAAiBC,IAAsBziB,EAAAA,EAAAA,UAAiB,KAExD0iB,EAAcC,IAAmB3iB,EAAAA,EAAAA,WAAS,IAC1C4iB,EAAkBC,IAAuB7iB,EAAAA,EAAAA,UAA2ByhB,GAAiBqB,UACrFC,EAAiBC,IAAsBhjB,EAAAA,EAAAA,WAAS,IAEhDijB,EAAuBC,IAA4BljB,EAAAA,EAAAA,WAAS,GAE7D/J,GAAOrK,EAAAA,EAAAA,WACPkF,GAAW2hB,EAAAA,EAAAA,eAEX0Q,GAAmBl2B,EAAMo1B,kBAEzBe,EAAaC,IACf,IAAKzB,EAAUj1B,KASX,OARAg2B,GAAgB,QAChBJ,EACI12B,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,8CACHC,eAAe,gDAO3B,IAAK21B,EAAUnJ,SASX,OARAkK,GAAgB,QAChBJ,EACI12B,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,mDACHC,eAAe,qDAO3B,IAAKk3B,GAAmBJ,KAAqBnB,EAAUjJ,aASnD,OARAgK,GAAgB,QAChBJ,EACI12B,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,uDACHC,eAAe,yDAO3B,IAAK21B,EAAUK,UASX,OARAU,GAAgB,QAChBJ,EACI12B,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,oDACHC,eAAe,sDAO3B,IAAK21B,EAAUI,cASX,OARAW,GAAgB,QAChBJ,EACI12B,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,yDACHC,eAAe,2DAO3B,MAAM81B,EAAe,GACrB,IAAK,IAAIuB,KAAe1B,EAAUG,aAAa/f,MAAM,MACjDshB,EAAcA,EAAY5wB,OAEtB4wB,EAAYtxB,OAAS,GACrB+vB,EAAaruB,KAAK4vB,GAI1B,OAAID,GAA8C,IAAxBtB,EAAa/vB,QACnC2wB,GAAgB,QAChBJ,EACI12B,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,sDACHC,eAAe,8CAOR,CACfU,KAAMi1B,EAAUj1B,KAChBusB,UAAW6I,EACXrJ,UAAWkJ,EAAUnJ,SACrBN,cAAeyJ,EAAUjJ,aACzBI,WAAY6I,EAAUK,UACtBhJ,gBAAiB2I,EAAUI,cAGd,EAOfuB,EAAwBA,KAC1BL,GAAyB,EAAM,EAQ7BlsB,EAAeA,KACjB,GAAI0rB,EACA,OAGJ,MAAMZ,EAAasB,GAAU,GACxBtB,IAILS,EAAS,IAELK,IAAqBnB,GAAiB+B,YAAgBL,GAAmBP,IAAqBnB,GAAiBqB,SAC1GG,GAMTN,GAAgB,GAEJ11B,EAAMw2B,aAAa3B,GAC3BhwB,MAAK,IAAM6wB,GAAgB,MAlC/BO,GAAyB,GAkCa,EAkCpCQ,EAAkBtyB,IACpBA,SAAAA,EAAGC,iBAECuxB,IAAqBnB,GAAiBkC,OACtCd,EAAoBpB,GAAiBkC,OAGrCnB,GACAC,EAAmB,GACvB,EA2CE1jB,EAAiB9R,EAAM+R,OACvBC,EAAiBhS,EAAMiS,OAE7B,IAAI0kB,EACA/3B,IAAAA,cAAA,SACIG,GAAG,gBACHiJ,KAAK,OACLke,aAAa,MACbrnB,UAAU,eACVuG,MAAOuvB,EAAUjJ,aACjBvjB,SApCoBhE,IACxBsyB,IAEA7B,EAAa,CACTlJ,aAAcvnB,EAAEe,OAAOE,OACzB,IAwDN,OArBK8wB,GAAoBJ,IACrBa,EACI/3B,IAAAA,cAAAA,IAAAA,SAAA,KACIA,IAAAA,cAAA,SACIG,GAAG,gBACH2I,UAAU,EACVwe,aAAa,MACble,KAAK,OACLnJ,UAAU,wBACVuG,MAAO,IAAIwxB,OAAO,MAEtBh4B,IAAAA,cAAA,QACI2B,QA9BiBs2B,KAC7Bd,GAAmB,EAAK,EA8BZl3B,UAAU,0CAEVD,IAAAA,cAAA,KAAGC,UAAU,gCAOzBD,IAAAA,cAAA,OAAKC,UAAU,qBACXD,IAAAA,cAAC+M,EAAe,KACZ/M,IAAAA,cAACW,EAAAA,KAAI,CAACC,GAAE,IAAAC,OAAMO,EAAMb,KAAKO,KAAI,8CACzBd,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,uCACHC,eAAe,gCAGvBJ,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAI+S,EAAe/S,GACnBC,eAAgB8S,EAAe9S,kBAGvCJ,IAAAA,cAAA,OAAKC,UAAU,kBACXD,IAAAA,cAAA,QAAMC,UAAU,mBACZD,IAAAA,cAAA,OAAKC,UAAU,cACXD,IAAAA,cAAA,SACIC,UAAU,yBACV6M,QAAQ,QAER9M,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,2CACHC,eAAe,UAGvBJ,IAAAA,cAAA,OAAKC,UAAU,qBACXD,IAAAA,cAAA,SACIG,GAAG,OACHiJ,KAAK,OACLnJ,UAAU,eACVuG,MAAOuvB,EAAUj1B,KACjByI,SA3GRhE,IAChBywB,EAAa,CACTl1B,KAAMyE,EAAEe,OAAOE,OACjB,IA0GkBxG,IAAAA,cAAA,OAAKC,UAAU,cACXD,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,0CACHC,eAAe,mDAK/BJ,IAAAA,cAAA,OAAKC,UAAU,cACXD,IAAAA,cAAA,SACIC,UAAU,yBACV6M,QAAQ,aAER9M,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,gDACHC,eAAe,eAGvBJ,IAAAA,cAAA,OAAKC,UAAU,qBACXD,IAAAA,cAAA,SACIG,GAAG,YACHiJ,KAAK,OACLke,aAAa,MACbrnB,UAAU,eACVuG,MAAOuvB,EAAUnJ,SACjBrjB,SAhIJhE,IACpBsyB,IAEA7B,EAAa,CACTpJ,SAAUrnB,EAAEe,OAAOE,OACrB,IA6HkBxG,IAAAA,cAAA,OAAKC,UAAU,cACXD,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,+CACHC,eAAe,wDAK/BJ,IAAAA,cAAA,OAAKC,UAAU,cACXD,IAAAA,cAAA,SACIC,UAAU,yBACV6M,QAAQ,iBAER9M,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,oDACHC,eAAe,mBAGvBJ,IAAAA,cAAA,OAAKC,UAAU,qBACV83B,EACD/3B,IAAAA,cAAA,OAAKC,UAAU,cACXD,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,mDACHC,eAAe,4DAK/BJ,IAAAA,cAAA,OAAKC,UAAU,cACXD,IAAAA,cAAA,SACIC,UAAU,yBACV6M,QAAQ,mBAER9M,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,sDACHC,eAAe,qBAGvBJ,IAAAA,cAAA,OAAKC,UAAU,qBACXD,IAAAA,cAAA,SACIG,GAAG,YACHiJ,KAAK,OACLnJ,UAAU,eACVuG,MAAOuvB,EAAUI,cACjB5sB,SA9JChE,IACzBsyB,IAEA7B,EAAa,CACTG,cAAe5wB,EAAEe,OAAOE,OAC1B,IA2JkBxG,IAAAA,cAAA,OAAKC,UAAU,cACXD,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,qDACHC,eAAe,4DAGvBJ,IAAAA,cAAA,OAAKC,UAAU,uDACXD,IAAAA,cAACk4B,GAAc,CACXv2B,QAzOTiF,UAAwB,IAAAuxB,EAG3C,GAFA5yB,EAAEC,iBAEEuxB,IAAqBnB,GAAiBwC,WACtC,OAGJ1B,EAAS,IACTM,EAAoBpB,GAAiBwC,YAErC,MAAMnC,EAAasB,GAAU,GAC7B,IAAKtB,EAGD,YADAe,EAAoBpB,GAAiBqB,SAId,QAA3BkB,EAAI/2B,EAAMo1B,yBAAiB,IAAA2B,GAAvBA,EAAyBh4B,KACzB81B,EAAW91B,GAAKiB,EAAMo1B,kBAAkBr2B,IAG5C,MAAM,MAACoL,SAAetG,GAASozB,EAAAA,GAAAA,IAAgCj3B,EAAMb,KAAKJ,GAAI81B,IAE1E1qB,GACAyrB,EAAoBpB,GAAiB0C,OACrC1B,EAAmBrrB,EAAMtJ,UAEzB+0B,EAAoBpB,GAAiB+B,UACzC,EA8M4BE,eAAgBA,EAChBU,OAAQxB,OAKxB/2B,IAAAA,cAAA,OAAKC,UAAU,cACXD,IAAAA,cAAA,SACIC,UAAU,yBACV6M,QAAQ,gBAER9M,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,mDACHC,eAAe,kCAGvBJ,IAAAA,cAAA,OAAKC,UAAU,qBACXD,IAAAA,cAAA,YACIG,GAAG,eACH6W,KAAM,EACN/W,UAAU,eACVuG,MAAOuvB,EAAUG,aACjB3sB,SAvLAhE,IACxBywB,EAAa,CACTE,aAAc3wB,EAAEe,OAAOE,OACzB,IAsLkBxG,IAAAA,cAAA,OAAKC,UAAU,cACXD,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,kDACHC,eAAe,2KAK/BJ,IAAAA,cAAA,OAAKC,UAAU,0BACXD,IAAAA,cAACyN,EAAAA,EAAS,CACNrE,KAAK,YACL0K,OAAQ,CAAC1S,EAAM8Q,YAAaukB,KAEhCz2B,IAAAA,cAACW,EAAAA,KAAI,CACDV,UAAU,mBACVW,GAAE,IAAAC,OAAMO,EAAMb,KAAKO,KAAI,8CAEvBd,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,uCACHC,eAAe,YAGvBJ,IAAAA,cAAC0N,GAAAA,EAAa,CACVzN,UAAU,kBACVmJ,KAAK,SACLuE,SAAUkpB,EACVjpB,aAAcxD,EAAKtK,cAAcsB,EAAM2F,SACvCpF,QA3TQ4D,IAC5BA,EAAEC,iBACF2F,GAAc,EA0TMhL,GAAG,kBAEHH,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAIiT,EAAejT,GACnBC,eAAgBgT,EAAehT,kBAGtCgB,EAAMoV,eAInBxW,IAAAA,cAAA,OAAKC,UAAU,wCACXD,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAI,mDACJC,eAAgB,qEAChBY,OAAQ,CACJiN,KAAO+b,GACHhqB,IAAAA,cAAA,KAAG6P,KAAK,wDAAwDma,OAKhFhqB,IAAAA,cAACif,GAAAA,EAAY,CACTC,KAAMkY,EACNn1B,QAASmI,EAAKtK,cAAc,CACxBK,GAAI,gEACJC,eAAgB,wEAEpBF,MAAOkK,EAAKtK,cAAc,CACtBK,GAAI,6CACJC,eAAgB,mCAEpBiB,kBAAmB+I,EAAKtK,cAAc,CAClCK,GAAI,4CACJC,eAAgB,gBAEpBo4B,SAAUd,EACVtY,SAAUsY,EACVr1B,UAAW8I,IAI3B,CAAC2qB,GAAA70B,UAAA,CAphBGuV,YAAWtV,IAAAA,QACXgR,YAAWhR,IAAAA,OAAAsB,WAIXo1B,aAAY12B,IAAAA,KAAAsB,YAuhBhB,MAAM01B,GAAiB53B,IAA4D,IAA3D,OAACi4B,EAAM,QAAE52B,EAAO,eAAEk2B,GAAoCv3B,EAC1E,OAAIi4B,IAAW3C,GAAiB0C,MAExBt4B,IAAAA,cAAA,QACIC,UAAU,iEAEVD,IAAAA,cAACy4B,GAAAA,iBAAgB,CAAC1sB,KAAM,KACxB/L,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAI,iDACJC,eAAgB,gGAChBY,OAAQ,CACJiN,KAAO+b,GAAiBhqB,IAAAA,cAAA,KAAG2B,QAASk2B,GAAiB7N,OAOrEuO,IAAW3C,GAAiB+B,UAExB33B,IAAAA,cAAA,QACIC,UAAU,mEAEVD,IAAAA,cAAC04B,GAAAA,uBAAsB,CAAC3sB,KAAM,KAC9B/L,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAI,qDACJC,eAAgB,0BAM5Bm4B,IAAW3C,GAAiBwC,WAExBp4B,IAAAA,cAAA,QACIC,UAAU,gDAEVD,IAAAA,cAACwnB,GAAAA,EAAc,CACXwC,KACIhqB,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAI,2CACJC,eAAgB,qBASpCJ,IAAAA,cAAA,UACIC,UAAU,0BACVmJ,KAAK,SACLzH,QAASA,EACTxB,GAAG,sBAEHH,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAI,yCACJC,eAAgB,wBAKP,EACvB83B,GAAAj3B,UAAA,CArEEs3B,OAAMr3B,IAAAA,MAAA,sDAAAsB,WACNb,QAAOT,IAAAA,KAAAsB,WACPq1B,eAAc32B,IAAAA,KAAAsB,YCriBlB,MAAM2uB,IAAS7nB,EAAAA,EAAAA,eAAc,CAACnJ,GAAI,oCAAqCC,eAAgB,QACjFgxB,IAAS9nB,EAAAA,EAAAA,eAAc,CAACnJ,GAAI,qCAAsCC,eAAgB,SAClFixB,IAAU/nB,EAAAA,EAAAA,eAAc,CAACnJ,GAAI,uCAAwCC,eAAgB,cAuC3F,GAjCmCE,IAAgC,IAA/B,KAACC,GAAYD,EAC7C,MAAM2E,GAAW2hB,EAAAA,EAAAA,eAEXzP,GAAUC,EAAAA,EAAAA,eAETlF,EAAagC,IAAkBC,EAAAA,EAAAA,UAAS,IAgB/C,OACInU,IAAAA,cAAC81B,GAA+B,CAC5Bv1B,KAAMA,EACN4S,OAAQge,GACR9d,OAAQ+d,GACRrqB,QAASsqB,GACTuG,aApBOhxB,UACXsN,EAAe,IAEf,MAAM,KAAChO,EAAI,MAAEqF,SAAgBtG,GAAS0zB,EAAAA,GAAAA,IAA2Bp4B,EAAKJ,GAAI81B,IACtE/vB,EACAiR,EAAQtP,KAAK,IAADhH,OAAKN,EAAKO,KAAI,8DAAAD,OAA6DqF,EAAK/F,KAI5FoL,GACA2I,EAAe3I,EAAMtJ,QACzB,EAUIiQ,YAAaA,GACf,EC/BJif,IAAS7nB,EAAAA,EAAAA,eAAc,CAACnJ,GAAI,oBAAqBC,eAAgB,SACjEgxB,IAAS9nB,EAAAA,EAAAA,eAAc,CAACnJ,GAAI,wCAAyCC,eAAgB,WACrFixB,IAAU/nB,EAAAA,EAAAA,eAAc,CAACnJ,GAAI,0CAA2CC,eAAgB,gBA8H9F,GAnHqCgB,IACjC,MAAMw3B,GALyBnvB,EAKgBrI,EAAM0O,SAASrG,OAJtD,IAAIsb,gBAAgBtb,GAASub,IAAI,OAAS,IADnBvb,MAM/B,MACMovB,GADcnS,EAAAA,EAAAA,aAAYrM,IACOue,IAEhCE,EAAeC,IAAoB5kB,EAAAA,EAAAA,UAAS0kB,IAC5CxK,EAAkB2K,IAAuB7kB,EAAAA,EAAAA,WAAS,IAClDjC,EAAagC,IAAkBC,EAAAA,EAAAA,UAAS,IAEzChF,GAA6BuX,EAAAA,EAAAA,aAAY3W,EAAAA,IAAWI,2BAEpDlL,GAAW2hB,EAAAA,EAAAA,gBAEjBvc,EAAAA,EAAAA,YAAU,KACF8E,GACAlK,GAASg0B,EAAAA,GAAAA,IAA2B73B,EAAMb,KAAKJ,GAAIy4B,GACvD,GACD,CAACA,EAAczpB,EAA4B/N,EAAMb,KAAM0E,IAE1D,MAqBMypB,EAAwBA,KAC1BsK,GAAoB,EAAM,EAGxBE,EAAgCtyB,UAClCsN,EAAe,IAEf,MAAM4S,QAAY7hB,GAASk0B,EAAAA,GAAAA,IAA4B/3B,EAAMb,KAAKJ,GAAI81B,IAEtE,GAAI,SAAUnP,GAAOA,EAAI5gB,MACrBgG,EAAAA,GAAAA,KAAarE,KAAK,IAADhH,OAAKO,EAAMb,KAAKO,KAAI,mDAMzC,GAFA4tB,IAEI,UAAW5H,EAAK,CAChB,MAAOvb,MAAOqmB,GAAO9K,EACrB5S,EAAe0d,EAAI3vB,QACvB,GAsCJ,OAAK42B,EAKD74B,IAAAA,cAAC81B,GAA+B,CAC5Bv1B,KAAMa,EAAMb,KACZ4S,OAAQge,GACR9d,OAAQ+d,GACRrqB,QAASsqB,GACT7a,YA7CYA,MAChB,MAAM+X,EACFvuB,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,wBACHC,eAAe,WAIjBouB,EACFxuB,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,2CACHC,eAAe,mCAIjBquB,EACFzuB,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,4CACHC,eAAe,sHAIvB,OACIJ,IAAAA,cAACif,GAAAA,EAAY,CACT/e,MAAOsuB,EACPvsB,QAASwsB,EACTptB,kBAAmBktB,EACnBvsB,WAAW,+BACXkd,KAAMmP,EACNhsB,UAAWA,IAAM62B,EAA8BJ,GAC/C1Z,SAAUsP,GACZ,EAcWlY,GACbohB,aAzFoBhxB,UACxBmyB,EAAiB9C,GAEb4C,EAAmB14B,KACnB81B,EAAW91B,GAAK04B,EAAmB14B,IAGb04B,EAAmBxL,UAAUlnB,SAAW8vB,EAAW5I,UAAUlnB,QACnF0yB,EAAmBxL,UAAUmE,OAAM,CAACC,EAAG/c,IAAM+c,IAAMwE,EAAW5I,UAAU3Y,WAGlEwkB,EAA8BjD,GAOxC+C,GAAoB,EAJpB,EA4EI9mB,YAAaA,EACbskB,kBAAmBqC,IAZhB74B,IAAAA,cAACgI,EAAAA,EAAa,KAanB,ECrIH,SAASqV,GAAckO,EAAkDla,GAC5E,OAAKA,GAIEka,EAAwBzqB,KAAK0K,cAAcgU,SAASnO,EAC/D,CAgBA,MAAM+nB,GAAoCh4B,IACtC,MAIM,wBAACmqB,EAAuB,YAAEoI,GAAevyB,EAE/C,IAAKic,GAAckO,EAAyBnqB,EAAMiQ,QAC9C,OAAO,KAGX,IAAIvQ,EAEAA,EADAyqB,EAAwBzqB,KACjByqB,EAAwBzqB,KAG3Bd,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,2DACHC,eAAe,sCAK3B,MAAMwzB,EACF5zB,IAAAA,cAAAA,IAAAA,SAAA,KACIA,IAAAA,cAAA,OAAKC,UAAU,qBACXD,IAAAA,cAAA,QAAMC,UAAU,qCACZD,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,uCACHC,eAAe,wBACfY,OAAQ,CACJ4yB,KAAMrI,EAAwB8B,UAAUzX,KAAK,WAK7D5V,IAAAA,cAAA,OAAKC,UAAU,qBACXD,IAAAA,cAAA,QAAMC,UAAU,qCACZD,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,mCACHC,eAAe,mBACfY,OAAQ,CACJwnB,IAAK+C,EAAwB6B,sBAQ/ClqB,EACFlD,IAAAA,cAAA,OAAKC,UAAU,gBACXD,IAAAA,cAACW,EAAAA,KAAI,CAACC,GAAE,IAAAC,OAAMO,EAAMb,KAAKO,KAAI,sDAAAD,OAAqD0qB,EAAwBprB,KACtGH,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,8BACHC,eAAe,UAGtB,MACDJ,IAAAA,cAACmB,EAAqB,CAClBe,aACIlC,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,sDACHC,eAAe,oDACfY,OAAQ,CACJ0mB,eACI1nB,IAAAA,cAAA,cACKoB,EAAMmqB,wBAAwBzqB,SAMnDS,aACIvB,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,sDACHC,eAAe,kEAGvBqB,SA9ESoC,KACjBzC,EAAMK,SAASL,EAAMmqB,wBAAwB,KAkF3C8N,EACFr5B,IAAAA,cAAAA,IAAAA,SAAA,KACIA,IAAAA,cAAA,OAAKC,UAAU,qBACXD,IAAAA,cAAA,QAAMC,UAAU,uBACZD,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,mCACHC,eAAe,gBAEnBJ,IAAAA,cAAA,cAASurB,EAAwBsB,aAGzC7sB,IAAAA,cAAA,OAAKC,UAAU,qBACXD,IAAAA,cAAA,QAAMC,UAAU,uBACZD,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,qDACHC,eAAe,8BAIa,aAAvCmrB,EAAwB2B,YACrBltB,IAAAA,cAAAA,IAAAA,SAAA,KACIA,IAAAA,cAAA,OAAKC,UAAU,qBACXD,IAAAA,cAAA,QAAMC,UAAU,uBACZD,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,gDACHC,eAAe,eAEnBJ,IAAAA,cAAA,cAASurB,EAAwBwB,wBAGzC/sB,IAAAA,cAAA,OAAKC,UAAU,qBACXD,IAAAA,cAAA,QAAMC,UAAU,uBACZD,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,gDACHC,eAAe,0BAOlCwzB,EACD5zB,IAAAA,cAAA,OAAKC,UAAU,qBACXD,IAAAA,cAAA,QAAMC,UAAU,0BACZD,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,kCACHC,eAAe,iDACfY,OAAQ,CACJ0D,QAASivB,EACT1E,SAAU1D,EAAwB5Y,gBAQ1D,OACI3S,IAAAA,cAAA,OAAKC,UAAU,wBACXD,IAAAA,cAAA,OAAKC,UAAU,gBACXD,IAAAA,cAAA,OAAKC,UAAU,4EACXD,IAAAA,cAAA,UAAQC,UAAU,sBACba,GAEJoC,GAEJm2B,GAEF,EAEbD,GAAAn4B,UAAA,CArKE0yB,YAAWzyB,IAAAA,OAAAsB,WACX6O,OAAMnQ,IAAAA,UAAA,CAAAA,IAAAA,OAAAA,IAAAA,MAAA,UAENO,SAAQP,IAAAA,KAAAsB,YAoKZ,YC1CA,GArH2CpB,IACvC,MAAO2F,EAASuyB,IAAcnlB,EAAAA,EAAAA,WAAS,GACjColB,GAAoC7S,EAAAA,EAAAA,cAAariB,IAAuBqrB,EAAAA,EAAAA,IAAoBrrB,EAAOjD,EAAMb,KAAKJ,GAAI0C,EAAAA,GAAY2M,qCAC9HD,EAA4F,UAA1DmX,EAAAA,EAAAA,aAAY3W,EAAAA,IAAWK,+BACzDgX,GAAcV,EAAAA,EAAAA,aAAYrM,IAE1BpV,GAAW2hB,EAAAA,EAAAA,eACXxc,GAAOrK,EAAAA,EAAAA,YAEbsK,EAAAA,EAAAA,YAAU,KACFkvB,GACCt0B,EnCqGN,SAAiDyJ,GAA8E,IAA9D/I,EAAI0I,UAAAlI,OAAA,QAAAmT,IAAAjL,UAAA,GAAAA,UAAA,GAAG,EAAGkL,EAAOlL,UAAAlI,OAAA,QAAAmT,IAAAjL,UAAA,GAAAA,UAAA,GAAGgX,GACxF,OAAOze,UACH,MAAM,KAACV,SAAcjB,EAASugB,GAAAA,GAA+C9W,EAAQ/I,EAAM4T,IAQ5F,IAAiD6N,EAJhD,OAHIlhB,GACAjB,GAM4CmiB,EANKlhB,EAOlDU,MAAO3B,EAAUygB,KACpB,MAAMrhB,EAAQqhB,IACRC,EAA2C,CAAC,EAClD,IAAK,IAAIjR,EAAI,EAAGA,EAAI0S,EAAYjhB,OAAQuO,IAAK,CACzC,MAAMc,EAAM4R,EAAY1S,IACnB/P,EAAAA,EAAAA,IAAQN,EAAOmR,EAAIxR,cACpB2hB,EAAenQ,EAAIxR,aAAc,EAEzC,CAEA,MAAM4hB,EAAO1Q,OAAOwF,KAAKiL,GACzB,OAAoB,IAAhBC,EAAKzf,QAITlB,GAAS4gB,EAAAA,GAAAA,IAAiBD,IAHf,CAAC1f,KAAM,KAIC,IArBZ,CAACA,KAAM,KAAK,CAE3B,CmC7GsBszB,CAAwCp4B,EAAMb,KAAKJ,KAAkC8F,MAC3F,IAAMqzB,GAAW,IAEzB,GACD,CAACC,EAAmCn4B,EAAMb,KAAM0E,IAEnD,MAAMw0B,EAAsCxD,IACpCA,GAAcA,EAAW91B,IACzB8E,GAASy0B,EAAAA,GAAAA,IAA8BzD,EAAW91B,IACtD,EAGEw5B,EAAiCA,CAACje,EAA4BC,KAChE,IAAI2T,EAAQ5T,EAAE5a,KAAKyzB,WACdjF,IACDA,EAAQllB,EAAKtK,cAAc,CAACK,GAAI,2DAA4DC,eAAgB,uCAGhH,IAAImvB,EAAQ5T,EAAE7a,KAAKyzB,WAKnB,OAJKhF,IACDA,EAAQnlB,EAAKtK,cAAc,CAACK,GAAI,2DAA4DC,eAAgB,uCAGzGkvB,EAAM1T,cAAc2T,EAAM,EAuBrC,IAAIqK,EASJ,OAV4BrqB,GAAkCgqB,IAG1DK,EAAa,CACTtd,QAAS,IAAMlb,EAAMb,KAAKO,KAAO,gDACjCyb,QAASnS,EAAKtK,cAAc,CAACK,GAAI,2CAA4CC,eAAgB,kCAC7Foc,YAAa,+BAKjBxc,IAAAA,cAAC0gB,GAAaxL,OAAA6I,OAAA,CACV5K,OACInT,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,8CACHC,eAAe,+BAGvBgd,SACIpd,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,4CACHC,eAAe,qGACfY,OAAQ,CACJ64B,yBACI75B,IAAAA,cAAC4P,GAAAA,EAAY,CACTC,KAAM6U,GAAAA,GAAe6H,aACrBzc,SAAS,wCAET9P,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,qEACHC,eAAe,mCAOvCic,UACIrc,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,6CACHC,eAAe,wCAGvB+b,gBACInc,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,mDACHC,eAAe,qDAGvB4b,kBAAmB5R,EAAKtK,cAAc,CAACK,GAAI,8CAA+CC,eAAgB,sCAC1G2G,QAASA,GACL6yB,IAEFvoB,IACE,MAAMtG,EAzEgBsG,IACf6D,OAAOlU,OAAOomB,GACL/V,QAAQ4kB,GAAe5Y,GAAc4Y,EAAY5kB,KACjDC,KAAKqoB,GACP1yB,KAAKgvB,GAEnBj2B,IAAAA,cAACo5B,GAAgC,CAC7BtxB,IAAKmuB,EAAW91B,GAChBorB,wBAAyB0K,EACzBx0B,SAAUg4B,EACVl5B,KAAMa,EAAMb,KACZozB,YAAY,OA8DCkG,CAAyBxoB,GAC1C,MAAO,CAACtG,EAAUA,EAAS5E,OAAS,EAAE,GAE9B,E,iDChIxB,MAwCA,GAxC0B7F,IAA2D,IAA1D,KAACQ,EAAI,MAAEZ,EAAK,KAAEuW,EAAI,WAAEqjB,EAAU,SAAE/uB,EAAW,IAAUzK,EAC5E,MAAM2N,EAAO6rB,EAAa,IAAMh5B,EAEhC,OACId,IAAAA,cAAA,MAAIC,UAAU,+BACVD,IAAAA,cAAC+5B,EAAAA,QAAO,CACJn5B,GAAIqN,EACJhO,UAAU,iBACV+5B,gBAAgB,0BAEhBh6B,IAAAA,cAAA,KAAGC,UAAWg6B,KAAW,MAAOxjB,KAChCzW,IAAAA,cAAA,QAAMC,UAAU,wBACXC,IAIL6K,GAAYA,EAAS5E,OAAS,GAC1BnG,IAAAA,cAACmwB,EAAAA,MAAK,CACFC,KAAMniB,EACNvG,OAAQA,IACJ1H,IAAAA,cAAA,MAAIC,UAAU,YAEND,IAAAA,SAAeiH,IAAI8D,GAAWE,GACrBA,EAIEjL,IAAAA,aAAmBiL,EAAsB,CAC5C6uB,WAAY7rB,IAJLhD,OAYtC,ECIb,GAxCyB3K,IAAkF,IAAjF,KAACQ,EAAI,MAAEZ,EAAK,WAAEg6B,GAAa,EAAK,WAAEJ,EAAa,GAAE,SAAE/uB,EAAW,GAAE,GAAE5K,GAAUG,EAClG,MAAM2N,EAAO6rB,EAAa,IAAMh5B,EAEhC,IAAIq5B,EAAiB,KACjBpvB,EAAS5E,OAAS,IAClBg0B,EACIn6B,IAAAA,cAAA,MAAIC,UAAU,eAEND,IAAAA,SAAeiH,IAAI8D,GAAWE,GACnBjL,IAAAA,aAAmBiL,EAAO,CAC7B6uB,WAAY7rB,EACZisB,YAAY,QAQpC,MAAMj6B,EAAYi6B,EAAa,aAAe,UAE9C,OACIl6B,IAAAA,cAAA,MACIC,UAAWA,EACXE,GAAIA,GAEJH,IAAAA,cAAC+5B,EAAAA,QAAO,CACJ95B,UAAS,GAAAY,OAAKZ,EAAS,UACvB+5B,gBAAe,GAAAn5B,OAAKZ,EAAS,kBAC7BW,GAAIqN,GAEJjO,IAAAA,cAAA,QAAMC,UAAS,GAAAY,OAAKZ,EAAS,iBACxBC,IAGRi6B,EACA,ECxBE,MAAMC,WAAyBp6B,IAAAA,cAC1Cq6B,iBAAAA,GACI,OAAK30B,KAAKtE,MAAMk5B,mBAAsB50B,KAAKtE,MAAMm5B,6BAK7Cv6B,IAAAA,cAACw6B,GAAiB,CACd15B,KAAK,QACLg5B,WAAY,IAAMp0B,KAAKtE,MAAMb,KAAKO,KAClC2V,KAAK,aACLvW,MACIF,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,0BACHC,eAAe,mBAXpB,IAgBf,CAEAq6B,kBAAAA,GACI,IAAK/0B,KAAKtE,MAAMs5B,sBACZ,OAAO,KAGX,IAAIvH,EACAztB,KAAKtE,MAAMoN,yBACX2kB,EACInzB,IAAAA,cAACyO,GAAAA,EAAkB,CACfvK,YAAa,CAACrB,EAAAA,GAAY8L,0BAC1BD,OAAQhJ,KAAKtE,MAAMb,KAAKJ,IAExBH,IAAAA,cAAC26B,GAAgB,CACb75B,KAAK,oBACLg5B,WAAY,IAAMp0B,KAAKtE,MAAMb,KAAKO,KAAO,gBACzCZ,MACIF,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,mDACHC,eAAe,sBAGvBD,GAAG,uBAMnB,IAAI80B,EAAuC,KACvCvvB,KAAKtE,MAAMyN,yBACXomB,EACIj1B,IAAAA,cAACyO,GAAAA,EAAkB,CACfvK,YAAa,CAACrB,EAAAA,GAAYiM,0BAC1BJ,OAAQhJ,KAAKtE,MAAMb,KAAKJ,IAExBH,IAAAA,cAAC26B,GAAgB,CACb75B,KAAK,oBACLg5B,WAAY,IAAMp0B,KAAKtE,MAAMb,KAAKO,KAAO,gBACzCZ,MACIF,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,mDACHC,eAAe,sBAGvBD,GAAG,uBAMnB,IAAI+Z,EAA+B,KAC/BxU,KAAKtE,MAAM4N,iBACXkL,EACIla,IAAAA,cAACyO,GAAAA,EAAkB,CACfvK,YAAa,CAACrB,EAAAA,GAAYoM,uBAC1BP,OAAQhJ,KAAKtE,MAAMb,KAAKJ,IAExBH,IAAAA,cAAC26B,GAAgB,CACb75B,KAAK,WACLg5B,WAAY,IAAMp0B,KAAKtE,MAAMb,KAAKO,KAAO,gBACzCZ,MACIF,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,0CACHC,eAAe,mBAGvBD,GAAG,oBAMnB,IAAIia,EAAgC,KAChC1U,KAAKtE,MAAM+N,6BACXiL,EACIpa,IAAAA,cAACoP,GAAAA,EAAoB,CAAClL,YAAa,CAACrB,EAAAA,GAAYwM,eAC5CrP,IAAAA,cAAC26B,GAAgB,CACb75B,KAAK,cACLg5B,WAAY,IAAMp0B,KAAKtE,MAAMb,KAAKO,KAAO,gBACzCZ,MACIF,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,2CACHC,eAAe,2BAGvBD,GAAG,gBAQnB,MAAM0gB,EACF7gB,IAAAA,cAACoP,GAAAA,EAAoB,CAAClL,YAAa,CAAC,cAAe,uBAC/ClE,IAAAA,cAAC26B,GAAgB,CACb75B,KAAK,OACLg5B,WAAY,IAAMp0B,KAAKtE,MAAMb,KAAKO,KAAO,gBACzCZ,MACIF,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,yBACHC,eAAe,iBAGvBD,GAAG,iBAKf,IAAIma,EAA+C,KAsBnD,OArBI5U,KAAKtE,MAAMmO,iCACX+K,EACIta,IAAAA,cAACyO,GAAAA,EAAkB,CACfvK,YAAa,CAACrB,EAAAA,GAAY2M,mCAC1Bd,OAAQhJ,KAAKtE,MAAMb,KAAKJ,IAExBH,IAAAA,cAAC26B,GAAgB,CACb75B,KAAK,8BACLg5B,WAAY,IAAMp0B,KAAKtE,MAAMb,KAAKO,KAAO,gBACzCZ,MACIF,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,0DACHC,eAAe,mCAGvBD,GAAG,+BAOfH,IAAAA,cAACw6B,GAAiB,CACd15B,KAAK,eACL2V,KAAK,UACLqjB,WAAY,IAAMp0B,KAAKtE,MAAMb,KAAKO,KAClCZ,MACIF,IAAAA,cAACe,EAAAA,iBAAgB,CACbZ,GAAG,iCACHC,eAAe,kBAItB+yB,EACA8B,EACA/a,EACAE,EACAyG,EACAvG,EAGb,CAEA5S,MAAAA,GACI,OACI1H,IAAAA,cAAA,OAAKC,UAAU,qBACXD,IAAAA,cAAA,UACK0F,KAAK20B,oBACL30B,KAAK+0B,sBAItB,G,+YACHn1B,CAvLoB80B,GAAgB,aAVjCE,kBAAiBp5B,IAAAA,KAAAsB,WACjBgM,uBAAsBtN,IAAAA,KAAAsB,WACtBqM,uBAAsB3N,IAAAA,KAAAsB,WACtBwM,eAAc9N,IAAAA,KAAAsB,WACd2M,2BAA0BjO,IAAAA,KAAAsB,WAC1B+M,+BAA8BrO,IAAAA,KAAAsB,WAC9B+3B,6BAA4Br5B,IAAAA,KAAAsB,WAC5Bk4B,sBAAqBx5B,IAAAA,KAAAsB,a,oCCqBnBo4B,GAAiBt6B,IAAA,IAAEuvB,UAAWC,EAAS,WAAEC,GAAyCzvB,EAA1B0vB,E,qWAAIC,CAAA3vB,EAAA4vB,IAAA,OAC9DlwB,IAAAA,cAACmwB,EAAAA,MAAKjb,OAAA6I,OAAA,GACEiS,EAAI,CACRtoB,OAAStG,GACLpB,IAAAA,cAAC8vB,EAAS5a,OAAA6I,OAAA,GACFgS,EACA3uB,MAGd,EA4LAy5B,IAAuBC,EAAAA,EAAAA,mBAAiB,uGCxL9C,IAAeC,EAAAA,EAAAA,aAAWr4B,EAAAA,EAAAA,UA3C1B,SAAyB2B,GACrB,MAAMgH,GAAO2vB,EAAAA,EAAAA,IAAe32B,GACtB9D,GAAOyE,EAAAA,EAAAA,IAAeX,GAEtBuG,GAASmF,EAAAA,EAAAA,IAAU1L,GAEnB7D,EAAWoK,EAAOC,SAClByvB,EAAiD,SAA7B1vB,EAAOqwB,kBAC3BzsB,EAA2D,SAAlC5D,EAAOoF,uBAChCnB,EAA2D,SAAlCjE,EAAOqF,uBAChCjB,EAA2C,SAA1BpE,EAAOsF,eACxBf,EAAmE,SAAtCvE,EAAOuF,2BACpCZ,EAA2E,SAA1C3E,EAAOwF,+BAE9C,IAAImqB,GAAgCpV,EAAAA,EAAAA,IAAsB9gB,EAAO,CAAC+gB,WAAYviB,EAAAA,GAAYiH,kBAAmBqb,EAAAA,EAAAA,IAAsB9gB,EAAO,CAAC+gB,WAAYviB,EAAAA,GAAYC,gBACnK,IAAKy3B,EACD,IAAK,MAAM9lB,KAAKymB,EAAAA,EAAAA,IAAW72B,GACvB,IAAIqrB,EAAAA,EAAAA,IAAoBrrB,EAAOoQ,EAAEtU,GAAI0C,EAAAA,GAAYiH,iBAAkB4lB,EAAAA,EAAAA,IAAoBrrB,EAAOoQ,EAAEtU,GAAI0C,EAAAA,GAAYC,eAAgB,CAC5Hy3B,GAA+B,EAC/B,KACJ,CAIR,MAAMY,GAA6BzL,EAAAA,EAAAA,IAAoBrrB,EAAO9D,aAAI,EAAJA,EAAMJ,GAAI0C,EAAAA,GAAYoM,yBAA0BygB,EAAAA,EAAAA,IAAoBrrB,EAAO9D,aAAI,EAAJA,EAAMJ,GAAI0C,EAAAA,GAAYwM,gBAAiBqgB,EAAAA,EAAAA,IAAoBrrB,EAAO9D,aAAI,EAAJA,EAAMJ,GAAI0C,EAAAA,GAAY8L,4BAA6B+gB,EAAAA,EAAAA,IAAoBrrB,EAAO9D,aAAI,EAAJA,EAAMJ,GAAI0C,EAAAA,GAAYiM,0BACzSssB,GAAuBjW,EAAAA,EAAAA,IAAsB9gB,EAAO,CAAC+gB,WAAYviB,EAAAA,GAAYw4B,gBAAiBlW,EAAAA,EAAAA,IAAsB9gB,EAAO,CAAC+gB,WAAYviB,EAAAA,GAAYy4B,qBAG1J,MAAO,CACHjwB,OACA9K,OACAC,WACA85B,oBACA9rB,yBACAK,yBACAG,iBACAG,6BACAI,iCACAgrB,+BACAG,sBAb0BS,GAA6BC,EAe/D,GAE0B14B,ED2BGtB,IACzB,MAAMm6B,GAAUnV,EAAAA,EAAAA,QAAuB,MAQvC,IAAKhlB,EAAMb,OAASa,EAAMiK,KACtB,OAAO,KAEX,MAAM0kB,EAAa,CACfxvB,KAAMa,EAAMb,KACZ8K,KAAMjK,EAAMiK,KACZhF,YAZgBA,KACZk1B,EAAQtlB,UACRslB,EAAQtlB,QAAQulB,UAAY,EAChC,GAWJ,OACIx7B,IAAAA,cAAAA,IAAAA,SAAA,KACIA,IAAAA,cAACK,GAAAA,EAAe,CACZE,KAAMa,EAAMb,KACZC,SAAUY,EAAMZ,WAEpBR,IAAAA,cAAA,OACIC,UAAU,iBACV6W,IAAKykB,GAELv7B,IAAAA,cAACy7B,GAAAA,QAAS,CAACC,cAAc,SACzB17B,IAAAA,cAACo6B,GAAgB,CACb75B,KAAMa,EAAMb,KACZ+5B,kBAAmBl5B,EAAMk5B,kBACzB9rB,uBAAwBpN,EAAMoN,uBAC9BK,uBAAwBzN,EAAMyN,uBAC9BG,eAAgB5N,EAAM4N,eACtBG,2BAA4B/N,EAAM+N,2BAClCI,+BAAgCnO,EAAMmO,+BACtCgrB,6BAA8Bn5B,EAAMm5B,6BACpCG,sBAAuBt5B,EAAMs5B,wBAEjC16B,IAAAA,cAACuwB,EAAAA,OAAM,KACHvwB,IAAAA,cAAC46B,GAAc,CACX7K,WAAYA,EACZS,OAAO,EACPJ,KAAM,sBACNP,UAAWzhB,KAEfpO,IAAAA,cAAC46B,GAAc,CACX7K,WAAYA,EACZS,OAAO,EACPJ,KAAI,GAAAvvB,OAAKO,EAAMse,MAAM8I,IAAG,sBACxBqH,UAAW2C,KAEfxyB,IAAAA,cAAC46B,GAAc,CACX7K,WAAYA,EACZK,KAAI,GAAAvvB,OAAKO,EAAMse,MAAM8I,IAAG,0BACxBqH,UAAW8L,KAEf37B,IAAAA,cAAC46B,GAAc,CACX7K,WAAYA,EACZK,KAAI,GAAAvvB,OAAKO,EAAMse,MAAM8I,IAAG,2BACxBqH,UAAWc,KAEf3wB,IAAAA,cAAC46B,GAAc,CACX7K,WAAYA,EACZS,OAAO,EACPJ,KAAI,GAAAvvB,OAAKO,EAAMse,MAAM8I,IAAG,sBACxBqH,UAAWgF,KAEf70B,IAAAA,cAAC46B,GAAc,CACX7K,WAAYA,EACZK,KAAI,GAAAvvB,OAAKO,EAAMse,MAAM8I,IAAG,0BACxBqH,UAAWrX,KAEfxY,IAAAA,cAAC46B,GAAc,CACX7K,WAAYA,EACZK,KAAI,GAAAvvB,OAAKO,EAAMse,MAAM8I,IAAG,2BACxBqH,UAAWkC,KAEf/xB,IAAAA,cAAC46B,GAAc,CACX7K,WAAYA,EACZK,KAAI,GAAAvvB,OAAKO,EAAMse,MAAM8I,IAAG,aACxBqH,UAAWQ,KAEfrwB,IAAAA,cAAC46B,GAAc,CACX7K,WAAYA,EACZS,OAAO,EACPJ,KAAI,GAAAvvB,OAAKO,EAAMse,MAAM8I,IAAG,gBACxBqH,UAAW+L,KAEf57B,IAAAA,cAAC46B,GAAc,CACX7K,WAAYA,EACZK,KAAI,GAAAvvB,OAAKO,EAAMse,MAAM8I,IAAG,oBACxBqH,UAAWgM,KAEf77B,IAAAA,cAAC46B,GAAc,CACX7K,WAAYA,EACZK,KAAI,GAAAvvB,OAAKO,EAAMse,MAAM8I,IAAG,qBACxBqH,UAAWiM,KAEf97B,IAAAA,cAAC46B,GAAc,CACX7K,WAAYA,EACZS,OAAO,EACPJ,KAAI,GAAAvvB,OAAKO,EAAMse,MAAM8I,IAAG,gCACxBqH,UAAWkM,KAEf/7B,IAAAA,cAAC46B,GAAc,CACX7K,WAAYA,EACZS,OAAO,EACPJ,KAAI,GAAAvvB,OAAKO,EAAMse,MAAM8I,IAAG,oCACxBqH,UAAWmM,KAEfh8B,IAAAA,cAAC46B,GAAc,CACX7K,WAAYA,EACZS,OAAO,EACPJ,KAAI,GAAAvvB,OAAKO,EAAMse,MAAM8I,IAAG,qCACxBqH,UAAWoM,KAEfj8B,IAAAA,cAAC46B,GAAc,CACX7K,WAAYA,EACZK,KAAI,GAAAvvB,OAAKO,EAAMse,MAAM8I,IAAG,YACxBqH,UAAW/E,KAEf9qB,IAAAA,cAAC46B,GAAc,CACX7K,WAAYA,EACZS,OAAO,EACPJ,KAAM,eACNP,UAAW9pB,IAEf/F,IAAAA,cAAC46B,GAAc,CACX7K,WAAYA,EACZK,KAAI,GAAAvvB,OAAKO,EAAMse,MAAM8I,IAAG,QACxBqH,UAAW3kB,KAEflL,IAAAA,cAAC46B,GAAc,CACX7K,WAAYA,EACZK,KAAI,GAAAvvB,OAAKO,EAAMse,MAAM8I,IAAG,aACxBqH,UAAWtO,KAEfvhB,IAAAA,cAAC46B,GAAc,CACX7K,WAAYA,EACZK,KAAI,GAAAvvB,OAAKO,EAAMse,MAAM8I,IAAG,cACxBqH,UAAWtO,KAEfvhB,IAAAA,cAAC46B,GAAc,CACX7K,WAAYA,EACZK,KAAI,GAAAvvB,OAAKO,EAAMse,MAAM8I,IAAG,SACxBqH,UAAWxQ,OAIvBrf,IAAAA,cAAC66B,GAAoB,MACtB,I,0FExOX,MAaMqB,EAAsC,GAEtCzuB,EAA6BnN,IAO7B,IAP8B,MAChCiL,EAAQ,KAAI,OACZuI,EAASooB,EAAgB,cACzBC,EAAa,OACbC,EAAM,cACNC,EAAa,KACbjzB,GACH9I,EACG,IAAKiL,GAA2B,IAAlBuI,EAAO3N,OACjB,OAAO,KAIX,IAAIlE,EAAUsJ,EAEd,IAAKtJ,EACD,IAAK,MAAM2vB,KAAO9d,EACV8d,IACA3vB,EAAU2vB,GAKtB,OAAK3vB,EAtCU,UA0CXmH,EAEIpJ,IAAAA,cAAA,OAAKC,UAAU,cACXD,IAAAA,cAAA,SAAOC,UAAU,uBAAuBgC,IA5CjC,cAiDfmH,EAEIpJ,IAAAA,cAAA,OAAKC,UAAU,uBACXD,IAAAA,cAAA,SAAOC,UAAU,iBAAiBgC,IAK1Cm6B,EAEIp8B,IAAAA,cAAA,OAAKC,UAAU,wBACXD,IAAAA,cAAA,SAAOC,UAAU,iBAAiBgC,IAM1CjC,IAAAA,cAAA,OAAKC,UAAS,aAAAY,OAAew7B,GAAiB,cAC1Cr8B,IAAAA,cAAA,SAAOC,UAAU,iBACbD,IAAAA,cAAA,KACIC,UAAS,MAAAY,OAAQs7B,GAAiB,2BACnC,IACFl6B,IAjCF,IAmCD,EAEZwL,EAAAxM,UAAA,CAvEEmI,KAAIlI,IAAAA,KACJqK,MAAKrK,IAAAA,KACLm7B,cAAan7B,IAAAA,OACbi7B,cAAaj7B,IAAAA,OACbk7B,OAAMl7B,IAAAA,KACN4S,OAAM5S,IAAAA,QAAAA,IAAAA,OAoEV,QAAelB,IAAAA,KAAWyN,E,yHCzEpBtE,EAA4BnJ,IAAAA,YAA0C,CAAAM,EAA+BwW,KAAQ,IAAtC,YAACzN,GAA2B/I,EAAXg8B,E,qWAAUrM,CAAA3vB,EAAA4vB,GACpG,MAAM9lB,GAAOrK,EAAAA,EAAAA,WAEb,OACIC,IAAAA,cAAA,QAAAkV,OAAA6I,OAAA,CACIjH,IAAKA,EACLzN,YAAae,EAAKtK,cAAcuJ,IAC5BizB,GACN,IAIVnzB,EAA0BrF,YAAc,4BAExC,S,6GCbA,MAAM0E,EAAWlI,IAAkC,IAAjC,oBAAC8B,GAA2B9B,EAC1C,MAAM,cAACR,IAAiBC,EAAAA,EAAAA,WAExB,OACIC,IAAAA,cAAA,KACIC,UAAWg6B,IAAW,0BAA2B73B,GACjDlC,MAAOJ,EAAc,CACjBK,GAAI,qBACJC,eAAgB,eAEtB,EAERoI,EAAAvH,UAAA,CAfEmB,oBAAmBlB,IAAAA,QAiBvB,QAAelB,IAAAA,KAAWwI,E,8GCd1B,MAAMS,EAAe3I,IAAkC,IAAjC,oBAAC8B,GAA2B9B,EAC9C,MAAM,cAACR,IAAiBC,EAAAA,EAAAA,WAExB,OACIC,IAAAA,cAAA,KACIC,UAAWg6B,IAAW,yBAA0B73B,GAChDlC,MAAOJ,EAAc,CAACK,GAAI,yBAA0BC,eAAgB,mBACtE,EAER6I,EAAAhI,UAAA,CAZEmB,oBAAmBlB,IAAAA,QAcvB,QAAelB,IAAAA,KAAWiJ,E,sEChBX,SAASC,IACpB,MAAM,cAACpJ,IAAiBC,EAAAA,EAAAA,WAExB,OACIC,IAAAA,cAAA,KACIC,UAAU,eACVC,MAAOJ,EAAc,CAACK,GAAI,uBAAwBC,eAAgB,iBAG9E,C,8GCJA,MAAM+B,EAAc7B,IAAkC,IAAjC,oBAAC8B,GAA2B9B,EAC7C,MAAM,cAACR,IAAiBC,EAAAA,EAAAA,WACxB,OACIC,IAAAA,cAAA,KACIC,UAAWg6B,IAAW,gBAAiB73B,GACvClC,MAAOJ,EAAc,CAACK,GAAI,wBAAyBC,eAAgB,kBACrE,EAER+B,EAAAlB,UAAA,CAXEmB,oBAAmBlB,IAAAA,QAavB,QAAelB,IAAAA,KAAWmC,E,8ECZnB,MAAMo6B,EAAoC,CAAC,sBAE3C,SAAStX,EAAe5gB,GAC3B,OAAOA,EAAME,SAASkb,KAAK+c,QAC/B,CAEO,MAAMzb,GAAsE9P,EAAAA,EAAAA,IAC/E,yBACAgU,EACAyL,EAAAA,IACA,CAAC7P,EAAa4b,KACV,MAAMC,EAAiC,CAAC,EAQxC,OAPAxnB,OAAOlU,OAAO6f,GAAa3Y,SAASy0B,IAChC,MAAMC,EAAUH,EAAaE,EAAW7pB,SACpC8pB,IAAYL,EAAwB/c,SAASod,EAAQ/3B,YACrD63B,EAAUC,EAAW7pB,SAAW6pB,EACpC,IAGGD,CAAS,G","sources":["webpack://mattermost-webapp/./src/components/widgets/icons/fa_back_icon.tsx","webpack://mattermost-webapp/./src/components/backstage/components/backstage_navbar.tsx","webpack://mattermost-webapp/./src/components/integrations/delete_integration_link/delete_integration_link.tsx","webpack://mattermost-webapp/./src/components/integrations/delete_integration_link/index.ts","webpack://mattermost-webapp/./src/components/emoji/emoji_list_item/delete_emoji_button.tsx","webpack://mattermost-webapp/./src/components/emoji/emoji_list_item/emoji_list_item.tsx","webpack://mattermost-webapp/./src/components/emoji/emoji_list_item/index.ts","webpack://mattermost-webapp/./src/components/emoji/emoji_list/emoji_list.tsx","webpack://mattermost-webapp/./src/components/emoji/emoji_list/index.ts","webpack://mattermost-webapp/./src/components/emoji/emoji_page.tsx","webpack://mattermost-webapp/./src/components/emoji/index.ts","webpack://mattermost-webapp/./src/components/backstage/components/backstage_header.tsx","webpack://mattermost-webapp/./src/components/emoji/add_emoji/add_emoji.tsx","webpack://mattermost-webapp/./src/components/emoji/add_emoji/index.ts","webpack://mattermost-webapp/./src/components/integrations/integration_option.tsx","webpack://mattermost-webapp/./src/components/integrations/integrations.tsx","webpack://mattermost-webapp/./src/components/integrations/index.ts","webpack://mattermost-webapp/./src/components/channel_select/channel_select.tsx","webpack://mattermost-webapp/./src/components/channel_select/index.ts","webpack://mattermost-webapp/./src/components/integrations/abstract_incoming_webhook.tsx","webpack://mattermost-webapp/./src/components/integrations/add_incoming_webhook/add_incoming_webhook.tsx","webpack://mattermost-webapp/./src/components/integrations/add_incoming_webhook/index.ts","webpack://mattermost-webapp/./src/components/integrations/abstract_oauth_app.tsx","webpack://mattermost-webapp/./src/components/integrations/add_oauth_app/add_oauth_app.tsx","webpack://mattermost-webapp/./src/components/integrations/add_oauth_app/index.ts","webpack://mattermost-webapp/./src/components/integrations/abstract_outgoing_webhook.tsx","webpack://mattermost-webapp/./src/components/integrations/add_outgoing_webhook/add_outgoing_webhook.tsx","webpack://mattermost-webapp/./src/components/integrations/add_outgoing_webhook/index.ts","webpack://mattermost-webapp/./src/packages/mattermost-redux/src/actions/bots.ts","webpack://mattermost-webapp/./src/packages/mattermost-redux/src/selectors/entities/integrations.ts","webpack://mattermost-webapp/./src/components/backstage/components/backstage_list.tsx","webpack://mattermost-webapp/./src/components/integrations/bots/bot.tsx","webpack://mattermost-webapp/./src/components/integrations/bots/bots.tsx","webpack://mattermost-webapp/./src/components/integrations/bots/index.ts","webpack://mattermost-webapp/./src/components/integrations/bots/add_bot/add_bot.tsx","webpack://mattermost-webapp/./src/components/integrations/bots/add_bot/index.ts","webpack://mattermost-webapp/./src/actions/integration_actions.tsx","webpack://mattermost-webapp/./src/components/integrations/outgoing_oauth_connections/oauth_connection_audience_input.tsx","webpack://mattermost-webapp/./src/components/integrations/abstract_command.tsx","webpack://mattermost-webapp/./src/components/integrations/add_command/add_command.tsx","webpack://mattermost-webapp/./src/components/integrations/add_command/index.ts","webpack://mattermost-webapp/./src/components/copy_text.tsx","webpack://mattermost-webapp/./src/components/integrations/confirm_integration/confirm_integration.tsx","webpack://mattermost-webapp/./src/components/integrations/confirm_integration/index.ts","webpack://mattermost-webapp/./src/components/integrations/edit_command/edit_command.tsx","webpack://mattermost-webapp/./src/components/integrations/edit_command/index.ts","webpack://mattermost-webapp/./src/components/integrations/installed_command.tsx","webpack://mattermost-webapp/./src/components/integrations/installed_commands/installed_commands.tsx","webpack://mattermost-webapp/./src/components/integrations/installed_commands/index.ts","webpack://mattermost-webapp/./src/components/integrations/commands_container/commands_container.tsx","webpack://mattermost-webapp/./src/components/integrations/commands_container/index.ts","webpack://mattermost-webapp/./src/components/integrations/edit_incoming_webhook/edit_incoming_webhook.tsx","webpack://mattermost-webapp/./src/components/integrations/edit_incoming_webhook/index.ts","webpack://mattermost-webapp/./src/components/integrations/edit_oauth_app/edit_oauth_app.tsx","webpack://mattermost-webapp/./src/components/integrations/edit_oauth_app/index.ts","webpack://mattermost-webapp/./src/components/integrations/edit_outgoing_webhook/edit_outgoing_webhook.tsx","webpack://mattermost-webapp/./src/components/integrations/edit_outgoing_webhook/index.ts","webpack://mattermost-webapp/./src/components/integrations/installed_incoming_webhook.tsx","webpack://mattermost-webapp/./src/components/integrations/installed_incoming_webhooks/installed_incoming_webhooks.tsx","webpack://mattermost-webapp/./src/components/integrations/installed_incoming_webhooks/index.ts","webpack://mattermost-webapp/./src/components/integrations/installed_oauth_app/installed_oauth_app.tsx","webpack://mattermost-webapp/./src/components/integrations/installed_oauth_app/index.ts","webpack://mattermost-webapp/./src/components/integrations/installed_oauth_apps/installed_oauth_apps.tsx","webpack://mattermost-webapp/./src/components/integrations/installed_oauth_apps/index.ts","webpack://mattermost-webapp/./src/components/integrations/installed_outgoing_webhook.tsx","webpack://mattermost-webapp/./src/components/integrations/installed_outgoing_webhooks/installed_outgoing_webhooks.tsx","webpack://mattermost-webapp/./src/components/integrations/installed_outgoing_webhooks/index.ts","webpack://mattermost-webapp/./src/components/integrations/outgoing_oauth_connections/abstract_outgoing_oauth_connection.tsx","webpack://mattermost-webapp/./src/components/integrations/outgoing_oauth_connections/add_outgoing_oauth_connection.tsx","webpack://mattermost-webapp/./src/components/integrations/outgoing_oauth_connections/edit_outgoing_oauth_connection.tsx","webpack://mattermost-webapp/./src/components/integrations/outgoing_oauth_connections/installed_outgoing_oauth_connection.tsx","webpack://mattermost-webapp/./src/components/integrations/outgoing_oauth_connections/installed_outgoing_oauth_connections.tsx","webpack://mattermost-webapp/./src/components/backstage/components/backstage_category.tsx","webpack://mattermost-webapp/./src/components/backstage/components/backstage_section.tsx","webpack://mattermost-webapp/./src/components/backstage/components/backstage_sidebar.tsx","webpack://mattermost-webapp/./src/components/backstage/backstage_controller.tsx","webpack://mattermost-webapp/./src/components/backstage/index.ts","webpack://mattermost-webapp/./src/components/form_error.tsx","webpack://mattermost-webapp/./src/components/localized_placeholder_input.tsx","webpack://mattermost-webapp/./src/components/widgets/icons/fa_next_icon.tsx","webpack://mattermost-webapp/./src/components/widgets/icons/fa_previous_icon.tsx","webpack://mattermost-webapp/./src/components/widgets/icons/fa_search_icon.tsx","webpack://mattermost-webapp/./src/components/widgets/icons/fa_warning_icon.tsx","webpack://mattermost-webapp/./src/packages/mattermost-redux/src/selectors/entities/bots.ts"],"sourcesContent":["// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {useIntl} from 'react-intl';\n\nexport default function BackIcon() {\n    const {formatMessage} = useIntl();\n    return (\n        <i\n            className='fa fa-angle-left'\n            title={formatMessage({id: 'generic_icons.back', defaultMessage: 'Back Icon'})}\n        />\n    );\n}\n\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {FormattedMessage} from 'react-intl';\nimport {Link} from 'react-router-dom';\n\nimport type {Team} from '@mattermost/types/teams';\n\nimport BackIcon from 'components/widgets/icons/fa_back_icon';\n\ntype Props = {\n    team?: Team;\n    siteName?: string;\n}\n\nconst BackstageNavbar = ({team, siteName}: Props) => {\n    const teamExists = team?.delete_at === 0;\n\n    return (\n        <div className='backstage-navbar'>\n            <Link\n                className='backstage-navbar__back'\n                to={`/${teamExists ? team?.name : ''}`}\n            >\n                <BackIcon/>\n                <span>\n                    {teamExists ? (\n                        <FormattedMessage\n                            id='backstage_navbar.backToMattermost'\n                            defaultMessage='Back to {siteName}'\n                            values={{siteName: siteName ?? team?.name}}\n                        />\n                    ) : (\n                        <FormattedMessage\n                            id='backstage_navbar.back'\n                            defaultMessage='Back'\n                        />\n                    )}\n                </span>\n            </Link>\n        </div>\n    );\n};\n\nexport default BackstageNavbar;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React, {useCallback} from 'react';\nimport {FormattedMessage} from 'react-intl';\n\nimport type {openModal as openModalAction} from 'actions/views/modals';\n\nimport ConfirmModalRedux from 'components/confirm_modal_redux';\nimport WarningIcon from 'components/widgets/icons/fa_warning_icon';\n\nconst ModalId = 'delete_integration_confirm';\n\ntype Props = {\n    confirmButtonText?: React.ReactNode;\n    linkText?: React.ReactNode;\n    subtitleText?: React.ReactNode;\n    modalMessage?: React.ReactNode;\n    modalTitle?: React.ReactNode;\n    onDelete: () => void;\n    openModal: typeof openModalAction;\n};\n\nexport default function DeleteIntegrationLink(props: Props) {\n    const {\n        confirmButtonText = (\n            <FormattedMessage\n                id='integrations.delete.confirm.button'\n                defaultMessage='Yes, delete it'\n            />\n        ),\n        linkText = (\n            <FormattedMessage\n                id='installed_integrations.delete'\n                defaultMessage='Delete'\n            />\n        ),\n        modalMessage,\n        modalTitle = (\n            <FormattedMessage\n                id='integrations.delete.confirm.title'\n                defaultMessage='Delete Integration'\n            />\n        ),\n        onDelete,\n        openModal,\n    } = props;\n\n    const onClick = useCallback(() => {\n        openModal({\n            modalId: ModalId,\n            dialogProps: {\n                confirmButtonText,\n                confirmButtonClass: 'btn btn-danger',\n                modalClass: 'integrations-backstage-modal',\n                message: (\n                    <>\n                        {props.subtitleText && (\n                            <p>\n                                {props.subtitleText}\n                            </p>\n                        )}\n                        <div className='alert alert-danger'>\n                            <WarningIcon additionalClassName='mr-1'/>\n                            <strong>\n                                {props.modalMessage}\n                            </strong>\n                        </div>\n                    </>\n                ),\n                onConfirm: onDelete,\n                title: modalTitle,\n            },\n            dialogType: ConfirmModalRedux,\n        });\n    }, [confirmButtonText, modalMessage, modalTitle, onDelete, openModal]);\n\n    return (\n        <button\n            className='color--link style--none'\n            onClick={onClick}\n        >\n            {linkText}\n        </button>\n    );\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\n\nimport {openModal} from 'actions/views/modals';\n\nimport DeleteIntegrationLink from './delete_integration_link';\n\nconst mapDispatchToProps = {\n    openModal,\n};\n\nexport default connect(null, mapDispatchToProps)(DeleteIntegrationLink);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {FormattedMessage} from 'react-intl';\n\nimport DeleteIntegrationLink from 'components/integrations/delete_integration_link';\n\ntype Props = {\n    onDelete: () => void;\n}\n\nexport default function DeleteEmojiButton(props: Props) {\n    return (\n        <DeleteIntegrationLink\n            confirmButtonText={\n                <FormattedMessage\n                    id='emoji_list.delete.confirm.button'\n                    defaultMessage='Delete'\n                />\n            }\n            linkText={\n                <FormattedMessage\n                    id='emoji_list.delete'\n                    defaultMessage='Delete'\n                />\n            }\n            modalMessage={\n                <FormattedMessage\n                    id='emoji_list.delete.confirm.msg'\n                    defaultMessage='This action permanently deletes the custom emoji. Are you sure you want to delete it?'\n                />\n            }\n            modalTitle={\n                <FormattedMessage\n                    id='emoji_list.delete.confirm.title'\n                    defaultMessage='Delete Custom Emoji'\n                />\n            }\n            onDelete={props.onDelete}\n        />\n    );\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React, {useCallback, useMemo} from 'react';\n\nimport type {CustomEmoji} from '@mattermost/types/emojis';\n\nimport {Client4} from 'mattermost-redux/client';\nimport Permissions from 'mattermost-redux/constants/permissions';\n\nimport AnyTeamPermissionGate from 'components/permissions_gates/any_team_permission_gate';\n\nimport DeleteEmojiButton from './delete_emoji_button';\n\nexport type Props = {\n    emoji?: CustomEmoji;\n    emojiId?: string;\n    currentUserId?: string;\n    creatorDisplayName?: string;\n    creatorUsername?: string;\n    onDelete?: (emojiId: string) => void;\n    actions: {\n        deleteCustomEmoji: (emojiId: string) => void;\n    };\n};\n\nconst DELETE_PERMISSION = [Permissions.DELETE_EMOJIS];\nconst DELETE_OTHER_PERMISSION = [Permissions.DELETE_OTHERS_EMOJIS];\n\nconst EmojiListItem = ({\n    actions: {\n        deleteCustomEmoji,\n    },\n    onDelete,\n    emoji = {} as CustomEmoji,\n    creatorUsername,\n    currentUserId = '',\n    creatorDisplayName = '',\n}: Props) => {\n    const emoticonStyle = useMemo(() => {\n        return {backgroundImage: `url(${Client4.getCustomEmojiImageUrl(emoji.id)})`};\n    }, [emoji.id]);\n\n    const handleDelete = useCallback((): void => {\n        if (!emoji) {\n            return;\n        }\n        if (onDelete) {\n            onDelete(emoji.id);\n        }\n        deleteCustomEmoji(emoji.id);\n    }, [deleteCustomEmoji, emoji, onDelete]);\n\n    let displayName = creatorDisplayName;\n    if (creatorUsername && creatorUsername !== displayName) {\n        displayName += ' (@' + creatorUsername + ')';\n    }\n\n    let deleteButton = <DeleteEmojiButton onDelete={handleDelete}/>;\n\n    if (emoji.creator_id === currentUserId) {\n        deleteButton = (\n            <AnyTeamPermissionGate permissions={DELETE_PERMISSION}>\n                {deleteButton}\n            </AnyTeamPermissionGate>\n        );\n    } else {\n        deleteButton = (\n            <AnyTeamPermissionGate permissions={DELETE_PERMISSION}>\n                <AnyTeamPermissionGate permissions={DELETE_OTHER_PERMISSION}>\n                    {deleteButton}\n                </AnyTeamPermissionGate>\n            </AnyTeamPermissionGate>\n        );\n    }\n\n    return (\n        <tr className='backstage-list__item'>\n            <td className='emoji-list__name'>{':' + emoji.name + ':'}</td>\n            <td className='emoji-list__image'>\n                <span\n                    className='emoticon'\n                    style={emoticonStyle}\n                />\n            </td>\n            <td className='emoji-list__creator'>{displayName}</td>\n            <td className='emoji-list-item_actions'>{deleteButton}</td>\n        </tr>\n    );\n};\n\nexport default React.memo(EmojiListItem);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\nimport {bindActionCreators} from 'redux';\nimport type {Dispatch} from 'redux';\n\nimport {deleteCustomEmoji} from 'mattermost-redux/actions/emojis';\nimport {getCurrentTeam} from 'mattermost-redux/selectors/entities/teams';\nimport {getUser, getCurrentUserId} from 'mattermost-redux/selectors/entities/users';\n\nimport {getDisplayNameByUser} from 'utils/utils';\n\nimport type {GlobalState} from 'types/store';\n\nimport EmojiListItem from './emoji_list_item';\nimport type {Props} from './emoji_list_item';\n\nfunction mapStateToProps(state: GlobalState, ownProps: Props) {\n    const emoji = state.entities.emojis.customEmoji[ownProps.emojiId!];\n    const creator = getUser(state, emoji.creator_id);\n\n    return {\n        emoji,\n        creatorDisplayName: getDisplayNameByUser(state, creator),\n        creatorUsername: creator ? creator.username : '',\n        currentUserId: getCurrentUserId(state),\n        currentTeam: getCurrentTeam(state),\n    };\n}\n\nfunction mapDispatchToProps(dispatch: Dispatch) {\n    return {\n        actions: bindActionCreators({\n            deleteCustomEmoji,\n        }, dispatch),\n    };\n}\n\nexport default connect(mapStateToProps, mapDispatchToProps)(EmojiListItem);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport type {ChangeEvent, ChangeEventHandler} from 'react';\nimport {defineMessage, FormattedMessage} from 'react-intl';\n\nimport type {CustomEmoji} from '@mattermost/types/emojis';\n\nimport {deleteCustomEmoji} from 'mattermost-redux/actions/emojis';\nimport {Emoji} from 'mattermost-redux/constants';\nimport type {ActionResult} from 'mattermost-redux/types/actions';\n\nimport EmojiListItem from 'components/emoji/emoji_list_item';\nimport LoadingScreen from 'components/loading_screen';\nimport LocalizedPlaceholderInput from 'components/localized_placeholder_input';\nimport SaveButton from 'components/save_button';\nimport NextIcon from 'components/widgets/icons/fa_next_icon';\nimport PreviousIcon from 'components/widgets/icons/fa_previous_icon';\nimport SearchIcon from 'components/widgets/icons/fa_search_icon';\n\nconst EMOJI_PER_PAGE = 50;\nconst EMOJI_SEARCH_DELAY_MILLISECONDS = 200;\n\nexport interface Props {\n\n    /**\n     * Custom emojis on the system.\n     */\n    emojiIds: string[];\n\n    /**\n     * Function to scroll list to top.\n     */\n    scrollToTop: () => void;\n    actions: {\n\n        /**\n         * Get pages of custom emojis.\n         */\n        getCustomEmojis: (page?: number, perPage?: number, sort?: string, loadUsers?: boolean) => Promise<ActionResult<CustomEmoji[]>>;\n\n        /**\n         * Search custom emojis.\n         */\n        searchCustomEmojis: (term: string, options: any, loadUsers: boolean) => Promise<ActionResult<CustomEmoji[]>>;\n    };\n\n}\n\ninterface State {\n    loading: boolean;\n    page: number;\n    nextLoading: boolean;\n    searchEmojis: string[] | null;\n    missingPages: boolean;\n}\n\nexport default class EmojiList extends React.PureComponent<Props, State> {\n    private searchTimeout: NodeJS.Timeout | null;\n\n    constructor(props: Props) {\n        super(props);\n        this.searchTimeout = null;\n        this.state = {\n            loading: true,\n            page: 0,\n            nextLoading: false,\n            searchEmojis: null,\n            missingPages: true,\n        };\n    }\n\n    async componentDidMount(): Promise<void> {\n        this.props.actions.getCustomEmojis(0, EMOJI_PER_PAGE + 1, Emoji.SORT_BY_NAME, true).\n            then(({data}: ActionResult<CustomEmoji[]>) => {\n                this.setState({loading: false});\n                if (data && data.length < EMOJI_PER_PAGE) {\n                    this.setState({missingPages: false});\n                }\n            });\n    }\n\n    nextPage = (e: React.MouseEvent<HTMLButtonElement, MouseEvent>): void => {\n        if (e) {\n            e.preventDefault();\n        }\n\n        const next = this.state.page + 1;\n        this.setState({nextLoading: true});\n        this.props.actions.getCustomEmojis(next, EMOJI_PER_PAGE, Emoji.SORT_BY_NAME, true).\n            then(({data}: ActionResult<CustomEmoji[]>) => {\n                this.setState({page: next, nextLoading: false});\n                if (data && data.length < EMOJI_PER_PAGE) {\n                    this.setState({missingPages: false});\n                }\n\n                this.props.scrollToTop();\n            });\n    };\n    previousPage = (e: React.MouseEvent<HTMLButtonElement, MouseEvent>): void => {\n        if (e) {\n            e.preventDefault();\n        }\n\n        this.setState({\n            page: this.state.page - 1,\n            nextLoading: false,\n            missingPages: true,\n        });\n\n        this.props.scrollToTop();\n    };\n\n    onSearchChange: ChangeEventHandler = (e: ChangeEvent): void => {\n        if (!e || !e.target) {\n            return;\n        }\n\n        const term = (e.target as HTMLInputElement).value || '';\n\n        clearTimeout(this.searchTimeout!);\n\n        this.searchTimeout = setTimeout(async () => {\n            if (term.trim() === '') {\n                this.setState({searchEmojis: null, page: 0});\n                return;\n            }\n\n            this.setState({loading: true});\n\n            const {data} = await this.props.actions.searchCustomEmojis(\n                term,\n                {},\n                true,\n            );\n\n            if (data) {\n                this.setState({\n                    searchEmojis: data.map((em: CustomEmoji) => em.id),\n                    loading: false,\n                });\n            } else {\n                this.setState({searchEmojis: [], loading: false});\n            }\n        }, EMOJI_SEARCH_DELAY_MILLISECONDS);\n    };\n\n    deleteFromSearch = (emojiId: string): void => {\n        if (!this.state.searchEmojis) {\n            return;\n        }\n\n        const index = this.state.searchEmojis.indexOf(emojiId);\n\n        if (index < 0) {\n            return;\n        }\n\n        const newSearchEmojis = [...this.state.searchEmojis];\n        newSearchEmojis.splice(index, 1);\n        this.setState({searchEmojis: newSearchEmojis});\n    };\n\n    render(): JSX.Element {\n        const searchEmojis = this.state.searchEmojis;\n        const emojis = [];\n        let nextButton;\n        let previousButton;\n\n        if (this.state.loading) {\n            emojis.push(\n                <tr\n                    key='loading'\n                    className='backstage-list__item backstage-list__empty'\n                >\n                    <td colSpan={4}>\n                        <LoadingScreen key='loading'/>\n                    </td>\n                </tr>,\n            );\n        } else if (\n            this.props.emojiIds.length === 0 ||\n            (searchEmojis && searchEmojis.length === 0)\n        ) {\n            emojis.push(\n                <tr\n                    key='empty'\n                    className='backstage-list__item backstage-list__empty'\n                >\n                    <td colSpan={4}>\n                        <FormattedMessage\n                            id='emoji_list.empty'\n                            defaultMessage='No custom emoji found'\n                        />\n                    </td>\n                </tr>,\n            );\n        } else if (searchEmojis) {\n            searchEmojis.forEach((emojiId: string) => {\n                emojis.push(\n                    <EmojiListItem\n                        key={'emoji_search_item' + emojiId}\n                        emojiId={emojiId}\n                        onDelete={this.deleteFromSearch}\n                        actions={{deleteCustomEmoji}}\n                    />,\n                );\n            });\n        } else {\n            const pageStart = this.state.page * EMOJI_PER_PAGE;\n            const pageEnd = pageStart + EMOJI_PER_PAGE;\n            const emojisToDisplay = this.props.emojiIds.slice(pageStart, pageEnd);\n\n            emojisToDisplay.forEach((emojiId: string) => {\n                emojis.push(\n                    <EmojiListItem\n                        key={'emoji_list_item' + emojiId}\n                        emojiId={emojiId}\n                        actions={{deleteCustomEmoji}}\n                    />,\n                );\n            });\n\n            if (this.state.missingPages) {\n                const buttonContents = (\n                    <span>\n                        <FormattedMessage\n                            id='filtered_user_list.next'\n                            defaultMessage='Next'\n                        />\n                        <NextIcon additionalClassName='ml-2'/>\n                    </span>\n                );\n\n                nextButton = (\n                    <SaveButton\n                        btnClass='btn-tertiary'\n                        extraClasses='pull-right'\n                        onClick={this.nextPage}\n                        saving={this.state.nextLoading}\n                        disabled={this.state.nextLoading}\n                        defaultMessage={buttonContents}\n                        savingMessage={buttonContents}\n                    />\n                );\n            }\n\n            if (this.state.page > 0) {\n                previousButton = (\n                    <button\n                        className='btn btn-tertiary'\n                        onClick={this.previousPage}\n                    >\n                        <PreviousIcon additionalClassName='mr-2'/>\n                        <FormattedMessage\n                            id='filtered_user_list.prev'\n                            defaultMessage='Previous'\n                        />\n                    </button>\n                );\n            }\n        }\n\n        return (\n            <div>\n                <div className='backstage-filters'>\n                    <div className='backstage-filter__search'>\n                        <SearchIcon/>\n                        <LocalizedPlaceholderInput\n                            type='search'\n                            className='form-control'\n                            placeholder={defineMessage({id: 'emoji_list.search', defaultMessage: 'Search Custom Emoji'})}\n                            onChange={this.onSearchChange}\n                            style={style.search}\n                        />\n                    </div>\n                </div>\n                <span className='backstage-list__help'>\n                    <p>\n                        <FormattedMessage\n                            id='emoji_list.help'\n                            defaultMessage=\"Custom emoji are available to everyone on your server. Type ':' followed by two characters in a message box to bring up the emoji selection menu.\"\n                        />\n                    </p>\n                    <p>\n                        <FormattedMessage\n                            id='emoji_list.help2'\n                            defaultMessage=\"Tip: If you add #, ##, or ### as the first character on a new line containing emoji, you can use larger sized emoji. To try it out, send a message such as: '# :smile:'.\"\n                        />\n                    </p>\n                </span>\n                <div className='backstage-list'>\n                    <table className='emoji-list__table'>\n                        <thead>\n                            <tr className='backstage-list__item emoji-list__table-header'>\n                                <th className='emoji-list__name'>\n                                    <FormattedMessage\n                                        id='emoji_list.name'\n                                        defaultMessage='Name'\n                                    />\n                                </th>\n                                <th className='emoji-list__image'>\n                                    <FormattedMessage\n                                        id='emoji_list.image'\n                                        defaultMessage='Image'\n                                    />\n                                </th>\n                                <th className='emoji-list__creator'>\n                                    <FormattedMessage\n                                        id='emoji_list.creator'\n                                        defaultMessage='Creator'\n                                    />\n                                </th>\n                                <th className='emoji-list_actions'>\n                                    <FormattedMessage\n                                        id='emoji_list.actions'\n                                        defaultMessage='Actions'\n                                    />\n                                </th>\n                            </tr>\n                        </thead>\n                        <tbody>{emojis}</tbody>\n                    </table>\n                </div>\n                <div className='filter-controls pt-3'>\n                    {previousButton}\n                    {nextButton}\n                </div>\n            </div>\n        );\n    }\n}\n\nconst style = {\n    search: {flexGrow: 0, flexShrink: 0},\n};\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\nimport {bindActionCreators} from 'redux';\nimport type {Dispatch} from 'redux';\n\nimport type {GlobalState} from '@mattermost/types/store';\n\nimport {getCustomEmojis, searchCustomEmojis} from 'mattermost-redux/actions/emojis';\nimport {getCustomEmojiIdsSortedByName} from 'mattermost-redux/selectors/entities/emojis';\n\nimport EmojiList from './emoji_list';\n\nfunction mapStateToProps(state: GlobalState) {\n    return {\n        emojiIds: getCustomEmojiIdsSortedByName(state) || [],\n    };\n}\n\nfunction mapDispatchToProps(dispatch: Dispatch) {\n    return {\n        actions: bindActionCreators({\n            getCustomEmojis,\n            searchCustomEmojis,\n        }, dispatch),\n    };\n}\n\nexport default connect(mapStateToProps, mapDispatchToProps)(EmojiList);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React, {useEffect} from 'react';\nimport {FormattedMessage, useIntl} from 'react-intl';\nimport {Link} from 'react-router-dom';\n\nimport Permissions from 'mattermost-redux/constants/permissions';\nimport type {Theme} from 'mattermost-redux/selectors/entities/preferences';\n\nimport AnyTeamPermissionGate from 'components/permissions_gates/any_team_permission_gate';\n\nimport * as Utils from 'utils/utils';\n\nimport EmojiList from './emoji_list';\n\ntype Props = {\n    teamName?: string;\n    teamDisplayName?: string;\n    siteName?: string;\n    scrollToTop(): void;\n    currentTheme: Theme;\n    actions: {\n        loadRolesIfNeeded(roles: Iterable<string>): void;\n    };\n}\n\nconst CREATE_EMOJIS_PERMISSIONS = [Permissions.CREATE_EMOJIS];\nconst ROLES = ['system_admin', 'team_admin', 'system_user', 'team_user'];\n\nexport default function EmojiPage({\n    teamDisplayName = '',\n    teamName = '',\n    siteName = '',\n    scrollToTop,\n    currentTheme,\n    actions,\n}: Props) {\n    const intl = useIntl();\n\n    useEffect(() => {\n        updateTitle();\n        actions.loadRolesIfNeeded(ROLES);\n        Utils.resetTheme();\n\n        return () => {\n            Utils.applyTheme(currentTheme);\n        };\n    }, []);\n\n    useEffect(() => {\n        updateTitle();\n    }, [siteName]);\n\n    const updateTitle = () => {\n        document.title = intl.formatMessage({id: 'custom_emoji.header', defaultMessage: 'Custom Emoji'}) + ' - ' + teamDisplayName + ' ' + siteName;\n    };\n\n    return (\n        <div className='backstage-content emoji-list'>\n            <div className='backstage-header'>\n                <h1>\n                    <FormattedMessage\n                        id='emoji_list.header'\n                        defaultMessage='Custom Emoji'\n                    />\n                </h1>\n                <AnyTeamPermissionGate permissions={CREATE_EMOJIS_PERMISSIONS}>\n                    <Link\n                        className='add-link'\n                        to={'/' + teamName + '/emoji/add'}\n                    >\n                        <button\n                            type='button'\n                            className='btn btn-primary'\n                        >\n                            <FormattedMessage\n                                id='emoji_list.add'\n                                defaultMessage='Add Custom Emoji'\n                            />\n                        </button>\n                    </Link>\n                </AnyTeamPermissionGate>\n            </div>\n            <EmojiList scrollToTop={scrollToTop}/>\n        </div>\n    );\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\nimport {bindActionCreators} from 'redux';\nimport type {Dispatch} from 'redux';\n\nimport {loadRolesIfNeeded} from 'mattermost-redux/actions/roles';\nimport {getTheme} from 'mattermost-redux/selectors/entities/preferences';\nimport {getCurrentTeam} from 'mattermost-redux/selectors/entities/teams';\n\nimport EmojiPage from 'components/emoji/emoji_page';\n\nimport type {GlobalState} from 'types/store';\n\nfunction mapStateToProps(state: GlobalState) {\n    const team = getCurrentTeam(state);\n\n    return {\n        teamName: team?.name,\n        teamDisplayName: team?.display_name,\n        siteName: state.entities.general.config.SiteName,\n        currentTheme: getTheme(state),\n    };\n}\n\nfunction mapDispatchToProps(dispatch: Dispatch) {\n    return {\n        actions: bindActionCreators({\n            loadRolesIfNeeded,\n        }, dispatch),\n    };\n}\n\nexport default connect(mapStateToProps, mapDispatchToProps)(EmojiPage);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport type {ReactNode} from 'react';\nimport {useIntl} from 'react-intl';\n\ntype Props = {\n    children?: ReactNode;\n}\n\nconst BackstageHeader = ({children}: Props) => {\n    const {formatMessage} = useIntl();\n    const childrenElements: ReactNode[] = [];\n\n    React.Children.forEach(children, (child, index) => {\n        if (index !== 0) {\n            childrenElements.push(\n                <span\n                    key={'divider' + index}\n                    className='backstage-header__divider'\n                >\n                    <i\n                        className='fa fa-angle-right'\n                        title={formatMessage({id: 'generic_icons.breadcrumb', defaultMessage: 'Breadcrumb Icon'})}\n                    />\n                </span>,\n            );\n        }\n\n        childrenElements.push(child);\n    });\n\n    return (\n        <div className='backstage-header'>\n            <h1>\n                {childrenElements}\n            </h1>\n        </div>\n    );\n};\n\nexport default BackstageHeader;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport type {ChangeEvent, FormEvent, SyntheticEvent} from 'react';\nimport {defineMessage, FormattedMessage} from 'react-intl';\nimport {Link} from 'react-router-dom';\n\nimport type {CustomEmoji} from '@mattermost/types/emojis';\nimport type {Team} from '@mattermost/types/teams';\nimport type {UserProfile} from '@mattermost/types/users';\n\nimport type {ActionResult} from 'mattermost-redux/types/actions';\n\nimport BackstageHeader from 'components/backstage/components/backstage_header';\nimport FormError from 'components/form_error';\nimport SpinnerButton from 'components/spinner_button';\n\nimport {getHistory} from 'utils/browser_history';\nimport {Constants} from 'utils/constants';\nimport type EmojiMap from 'utils/emoji_map';\n\nexport interface AddEmojiProps {\n    actions: {\n        createCustomEmoji: (term: CustomEmoji, imageData: File) => Promise<ActionResult>;\n    };\n    emojiMap: EmojiMap;\n    user: UserProfile;\n    team: Team;\n}\n\ntype EmojiCreateArgs = {\n    creator_id: string;\n    name: string;\n};\n\ntype AddEmojiState = {\n    name: string;\n    image: File | null;\n    imageUrl: string | ArrayBuffer | null;\n    saving: boolean;\n    error: React.ReactNode;\n};\n\ninterface AddErrorResponse {\n    error: Error;\n}\n\ninterface AddEmojiResponse {\n    data: CustomEmoji;\n}\n\nexport default class AddEmoji extends React.PureComponent<AddEmojiProps, AddEmojiState> {\n    constructor(props: AddEmojiProps) {\n        super(props);\n\n        this.state = {\n            name: '',\n            image: null,\n            imageUrl: '',\n            saving: false,\n            error: null,\n        };\n    }\n\n    handleFormSubmit = async (e: FormEvent<HTMLFormElement>): Promise<void> => {\n        return this.handleSubmit(e);\n    };\n\n    handleSaveButtonClick = async (e: React.MouseEvent<HTMLButtonElement, MouseEvent>): Promise<void> => {\n        return this.handleSubmit(e);\n    };\n\n    handleSubmit = async (e: SyntheticEvent<unknown>): Promise<void> => {\n        const {actions, emojiMap, user, team} = this.props;\n        const {image, name, saving} = this.state;\n\n        e.preventDefault();\n\n        if (saving) {\n            return;\n        }\n\n        this.setState({\n            saving: true,\n            error: null,\n        });\n\n        const emoji: EmojiCreateArgs = {\n            creator_id: user.id,\n            name: name.trim().toLowerCase(),\n        };\n\n        // trim surrounding colons if the user accidentally included them in the name\n        if (emoji.name.startsWith(':') && emoji.name.endsWith(':')) {\n            emoji.name = emoji.name.substring(1, emoji.name.length - 1);\n        }\n\n        if (!emoji.name) {\n            this.setState({\n                saving: false,\n                error: (\n                    <FormattedMessage\n                        id='add_emoji.nameRequired'\n                        defaultMessage='A name is required for the emoji'\n                    />\n                ),\n            });\n\n            return;\n        }\n\n        if ((/[^a-z0-9+_-]/).test(emoji.name)) {\n            this.setState({\n                saving: false,\n                error: (\n                    <FormattedMessage\n                        id='add_emoji.nameInvalid'\n                        defaultMessage=\"An emoji's name can only contain lowercase letters, numbers, and the symbols '-', '+' and '_'.\"\n                    />\n                ),\n            });\n\n            return;\n        }\n\n        if (emojiMap.hasSystemEmoji(emoji.name)) {\n            this.setState({\n                saving: false,\n                error: (\n                    <FormattedMessage\n                        id='add_emoji.nameTaken'\n                        defaultMessage='This name is already in use by a system emoji. Please choose another name.'\n                    />\n                ),\n            });\n\n            return;\n        }\n\n        if (emojiMap.has(emoji.name)) {\n            this.setState({\n                saving: false,\n                error: (\n                    <FormattedMessage\n                        id='add_emoji.customNameTaken'\n                        defaultMessage='This name is already in use by a custom emoji. Please choose another name.'\n                    />\n                ),\n            });\n\n            return;\n        }\n\n        if (!image) {\n            this.setState({\n                saving: false,\n                error: (\n                    <FormattedMessage\n                        id='add_emoji.imageRequired'\n                        defaultMessage='An image is required for the emoji'\n                    />\n                ),\n            });\n\n            return;\n        }\n\n        const maxFileSizeBytes = 1024 * 1024;\n        if (image.size > maxFileSizeBytes) {\n            this.setState({\n                saving: false,\n                error: (\n                    <FormattedMessage\n                        id='add_emoji.imageTooLarge'\n                        defaultMessage='Unable to create emoji. Image must be less than 1 MB in size.'\n                    />\n                ),\n            });\n\n            return;\n        }\n\n        const response = await actions.createCustomEmoji(emoji as CustomEmoji, image);\n\n        if ('data' in response) {\n            const savedEmoji = response as AddEmojiResponse;\n            if (savedEmoji && savedEmoji.data.name === emoji.name) {\n                getHistory().push('/' + team.name + '/emoji');\n                return;\n            }\n        }\n\n        if ('error' in response) {\n            const responseError = response as AddErrorResponse;\n            if (responseError) {\n                this.setState({\n                    saving: false,\n                    error: responseError.error.message,\n                });\n\n                return;\n            }\n        }\n\n        const genericError = (\n            <FormattedMessage\n                id='add_emoji.failedToAdd'\n                defaultMessage='Something went wrong when adding the custom emoji.'\n            />\n        );\n\n        this.setState({\n            saving: false,\n            error: (genericError),\n        });\n    };\n\n    updateName = (e: ChangeEvent<HTMLInputElement>): void => {\n        this.setState({\n            name: e.target.value,\n        });\n    };\n\n    updateImage = (e: ChangeEvent<HTMLInputElement>): void => {\n        if (e.target.files == null || e.target.files.length === 0) {\n            this.setState({\n                image: null,\n                imageUrl: '',\n            });\n\n            return;\n        }\n\n        const image = e.target.files![0];\n\n        const reader = new FileReader();\n        reader.onload = () => {\n            this.setState({\n                image,\n                imageUrl: reader.result,\n            });\n        };\n        reader.readAsDataURL(image);\n    };\n\n    render(): JSX.Element {\n        let filename = null;\n        if (this.state.image) {\n            filename = (\n                <span className='add-emoji__filename'>\n                    {this.state.image.name}\n                </span>\n            );\n        }\n\n        let preview = null;\n        if (this.state.imageUrl) {\n            preview = (\n                <div className='form-group'>\n                    <label\n                        className='control-label col-sm-4'\n                        htmlFor='preview'\n                    >\n                        <FormattedMessage\n                            id='add_emoji.preview'\n                            defaultMessage='Preview'\n                        />\n                    </label>\n                    <div className='col-md-5 col-sm-8 add-emoji__preview'>\n                        <FormattedMessage\n                            id='add_emoji.preview.sentence'\n                            defaultMessage='This is a sentence with {image} in it.'\n                            values={{\n                                image: (\n                                    <span\n                                        className='emoticon'\n                                        style={{backgroundImage: 'url(' + this.state.imageUrl + ')'}}\n                                    />\n                                ),\n                            }}\n                        />\n                    </div>\n                </div>\n            );\n        }\n\n        return (\n            <div className='backstage-content row'>\n                <BackstageHeader>\n                    <Link to={'/' + this.props.team.name + '/emoji'}>\n                        <FormattedMessage\n                            id='emoji_list.header'\n                            defaultMessage='Custom Emoji'\n                        />\n                    </Link>\n                    <FormattedMessage\n                        id='add_emoji.header'\n                        defaultMessage='Add'\n                    />\n                </BackstageHeader>\n                <div className='backstage-form'>\n                    <form\n                        className='form-horizontal'\n                        onSubmit={this.handleFormSubmit}\n                    >\n                        <div className='form-group'>\n                            <label\n                                className='control-label col-sm-4'\n                                htmlFor='name'\n                            >\n                                <FormattedMessage\n                                    id='add_emoji.name'\n                                    defaultMessage='Name'\n                                />\n                            </label>\n                            <div className='col-md-5 col-sm-8'>\n                                <input\n                                    id='name'\n                                    type='text'\n                                    maxLength={64}\n                                    className='form-control'\n                                    value={this.state.name}\n                                    onChange={this.updateName}\n                                />\n                                <div className='form__help'>\n                                    <FormattedMessage\n                                        id='add_emoji.name.help'\n                                        defaultMessage=\"Name your emoji. The name can be up to 64 characters, and can contain lowercase letters, numbers, and the symbols '-' and '_'.\"\n                                    />\n                                </div>\n                            </div>\n                        </div>\n                        <div className='form-group'>\n                            <label\n                                className='control-label col-sm-4'\n                                htmlFor='image'\n                            >\n                                <FormattedMessage\n                                    id='add_emoji.image'\n                                    defaultMessage='Image'\n                                />\n                            </label>\n                            <div className='col-md-5 col-sm-8'>\n                                <div>\n                                    <div className='add-emoji__upload'>\n                                        <button className='btn btn-primary'>\n                                            <FormattedMessage\n                                                id='add_emoji.image.button'\n                                                defaultMessage='Select'\n                                            />\n                                        </button>\n                                        <input\n                                            id='select-emoji'\n                                            type='file'\n                                            accept={Constants.ACCEPT_EMOJI_IMAGE}\n                                            multiple={false}\n                                            onChange={this.updateImage}\n                                        />\n                                    </div>\n                                    {filename}\n                                    <div className='form__help'>\n                                        <FormattedMessage\n                                            id='add_emoji.image.help'\n                                            defaultMessage='Specify a .gif, .png, or .jpg file of up to 64 KB for your emoji. The dimensions can be up to 128 pixels by 128 pixels.'\n                                        />\n                                    </div>\n                                </div>\n                            </div>\n                        </div>\n                        {preview}\n                        <div className='backstage-form__footer'>\n                            <FormError\n                                type='backstage'\n                                error={this.state.error}\n                            />\n                            <Link\n                                className='btn btn-tertiary'\n                                to={'/' + this.props.team.name + '/emoji'}\n                            >\n                                <FormattedMessage\n                                    id='add_emoji.cancel'\n                                    defaultMessage='Cancel'\n                                />\n                            </Link>\n                            <SpinnerButton\n                                data-testid='save-button'\n                                className='btn btn-primary'\n                                type='submit'\n                                spinning={this.state.saving}\n                                spinningText={defineMessage({id: 'add_emoji.saving', defaultMessage: 'Saving...'})}\n                                onClick={this.handleSaveButtonClick}\n                            >\n                                <FormattedMessage\n                                    id='add_emoji.save'\n                                    defaultMessage='Save'\n                                />\n                            </SpinnerButton>\n                        </div>\n                    </form>\n                </div>\n            </div>\n        );\n    }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\nimport {bindActionCreators} from 'redux';\nimport type {Dispatch} from 'redux';\n\nimport {createCustomEmoji} from 'mattermost-redux/actions/emojis';\n\nimport {getEmojiMap} from 'selectors/emojis';\n\nimport type {GlobalState} from 'types/store';\n\nimport AddEmoji from './add_emoji';\n\nfunction mapStateToProps(state: GlobalState) {\n    return {\n        emojiMap: getEmojiMap(state),\n    };\n}\n\nfunction mapDispatchToProps(dispatch: Dispatch) {\n    return {\n        actions: bindActionCreators({\n            createCustomEmoji,\n        }, dispatch),\n    };\n}\n\nexport default connect(mapStateToProps, mapDispatchToProps)(AddEmoji);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {Link} from 'react-router-dom';\n\ntype Props = {\n    image: string;\n    title: JSX.Element;\n    description: JSX.Element;\n    link: string;\n}\n\nconst IntegrationOption = ({image, title, description, link}: Props) => {\n    return (\n        <Link\n            to={link}\n            className='integration-option'\n        >\n            <img\n                alt={'integration image'}\n                className='integration-option__image'\n                src={image}\n            />\n            <div className='integration-option__title'>\n                {title}\n            </div>\n            <div className='integration-option__description'>\n                {description}\n            </div>\n        </Link>\n    );\n};\n\nexport default React.memo(IntegrationOption);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {FormattedMessage} from 'react-intl';\n\nimport type {Team} from '@mattermost/types/teams';\n\nimport {Permissions} from 'mattermost-redux/constants';\n\nimport ExternalLink from 'components/external_link';\nimport SystemPermissionGate from 'components/permissions_gates/system_permission_gate';\nimport TeamPermissionGate from 'components/permissions_gates/team_permission_gate';\n\nimport BotAccountsIcon from 'images/bot_default_icon.png';\nimport IncomingWebhookIcon from 'images/incoming_webhook.jpg';\nimport OAuthIcon from 'images/oauth_icon.png';\nimport OutgoingOAuthConnectionsIcon from 'images/outgoing_oauth_connection.png';\nimport OutgoingWebhookIcon from 'images/outgoing_webhook.jpg';\nimport SlashCommandIcon from 'images/slash_command_icon.jpg';\nimport * as Utils from 'utils/utils';\n\nimport IntegrationOption from './integration_option';\n\ntype Props = {\n    siteName: string | undefined;\n    enableIncomingWebhooks: boolean;\n    enableOutgoingWebhooks: boolean;\n    enableCommands: boolean;\n    enableOAuthServiceProvider: boolean;\n    enableOutgoingOAuthConnections: boolean;\n    team: Team;\n}\n\nexport default class Integrations extends React.PureComponent <Props> {\n    componentDidMount() {\n        this.updateTitle();\n    }\n\n    updateTitle = () => {\n        const currentSiteName = this.props.siteName || '';\n        document.title = Utils.localizeMessage({id: 'admin.sidebar.integrations', defaultMessage: 'Integrations'}) + ' - ' + this.props.team.display_name + ' ' + currentSiteName;\n    };\n\n    render() {\n        const options = [];\n\n        if (this.props.enableIncomingWebhooks) {\n            options.push(\n                <TeamPermissionGate\n                    teamId={this.props.team.id}\n                    permissions={[Permissions.MANAGE_INCOMING_WEBHOOKS]}\n                    key='incomingWebhookPermission'\n                >\n                    <IntegrationOption\n                        key='incomingWebhook'\n                        image={IncomingWebhookIcon}\n                        title={\n                            <FormattedMessage\n                                id='integrations.incomingWebhook.title'\n                                defaultMessage='Incoming Webhooks'\n                            />\n                        }\n                        description={\n                            <FormattedMessage\n                                id='integrations.incomingWebhook.description'\n                                defaultMessage='Incoming webhooks allow external integrations to send messages'\n                            />\n                        }\n                        link={'/' + this.props.team.name + '/integrations/incoming_webhooks'}\n                    />\n                </TeamPermissionGate>,\n            );\n        }\n\n        if (this.props.enableOutgoingWebhooks) {\n            options.push(\n                <TeamPermissionGate\n                    teamId={this.props.team.id}\n                    permissions={[Permissions.MANAGE_OUTGOING_WEBHOOKS]}\n                    key='outgoingWebhookPermission'\n                >\n                    <IntegrationOption\n                        key='outgoingWebhook'\n                        image={OutgoingWebhookIcon}\n                        title={\n                            <FormattedMessage\n                                id='integrations.outgoingWebhook.title'\n                                defaultMessage='Outgoing Webhooks'\n                            />\n                        }\n                        description={\n                            <FormattedMessage\n                                id='integrations.outgoingWebhook.description'\n                                defaultMessage='Outgoing webhooks allow external integrations to receive and respond to messages'\n                            />\n                        }\n                        link={'/' + this.props.team.name + '/integrations/outgoing_webhooks'}\n                    />\n                </TeamPermissionGate>,\n            );\n        }\n\n        if (this.props.enableCommands) {\n            options.push(\n                <TeamPermissionGate\n                    teamId={this.props.team.id}\n                    permissions={[Permissions.MANAGE_SLASH_COMMANDS]}\n                    key='commandPermission'\n                >\n                    <IntegrationOption\n                        key='command'\n                        image={SlashCommandIcon}\n                        title={\n                            <FormattedMessage\n                                id='integrations.command.title'\n                                defaultMessage='Slash Commands'\n                            />\n                        }\n                        description={\n                            <FormattedMessage\n                                id='integrations.command.description'\n                                defaultMessage='Slash commands send events to an external integration'\n                            />\n                        }\n                        link={'/' + this.props.team.name + '/integrations/commands'}\n                    />\n                </TeamPermissionGate>,\n            );\n        }\n\n        if (this.props.enableOAuthServiceProvider) {\n            options.push(\n                <SystemPermissionGate\n                    permissions={[Permissions.MANAGE_OAUTH]}\n                    key='oauth2AppsPermission'\n                >\n                    <IntegrationOption\n                        key='oauth2Apps'\n                        image={OAuthIcon}\n                        title={\n                            <FormattedMessage\n                                id='integrations.oauthApps.title'\n                                defaultMessage='OAuth 2.0 Applications'\n                            />\n                        }\n                        description={\n                            <FormattedMessage\n                                id='integrations.oauthApps.description'\n                                defaultMessage='Auth 2.0 allows external applications to make authorized requests to the Mattermost API'\n                            />\n                        }\n                        link={'/' + this.props.team.name + '/integrations/oauth2-apps'}\n                    />\n                </SystemPermissionGate>,\n            );\n        }\n\n        if (this.props.enableOutgoingOAuthConnections) {\n            options.push(\n                <TeamPermissionGate\n                    teamId={this.props.team.id}\n                    permissions={[Permissions.MANAGE_OUTGOING_OAUTH_CONNECTIONS]}\n                    key='outgoingOAuthConnectionsPermission'\n                >\n                    <IntegrationOption\n                        key='outgoingOAuthConnections'\n                        image={OutgoingOAuthConnectionsIcon}\n                        title={\n                            <FormattedMessage\n                                id='integrations.outgoingOAuthConnections.title'\n                                defaultMessage='Outgoing OAuth Connections'\n                            />\n                        }\n                        description={\n                            <FormattedMessage\n                                id='integrations.outgoingOAuthConnections.description'\n                                defaultMessage='Outgoing OAuth Connections allow custom integrations to communicate to external systems'\n                            />\n                        }\n                        link={'/' + this.props.team.name + '/integrations/outgoing-oauth2-connections'}\n                    />\n                </TeamPermissionGate>,\n            );\n        }\n\n        options.push(\n            <SystemPermissionGate\n                permissions={['manage_bots']}\n                key='botsPermissions'\n            >\n                <IntegrationOption\n                    image={BotAccountsIcon}\n                    title={\n                        <FormattedMessage\n                            id='bots.manage.header'\n                            defaultMessage='Bot Accounts'\n                        />\n                    }\n                    description={\n                        <FormattedMessage\n                            id='bots.manage.description'\n                            defaultMessage='Use bot accounts to integrate with Mattermost through plugins or the API'\n                        />\n                    }\n                    link={'/' + this.props.team.name + '/integrations/bots'}\n                />\n            </SystemPermissionGate>,\n        );\n\n        return (\n            <div className='backstage-content row'>\n                <div className='backstage-header'>\n                    <h1>\n                        <FormattedMessage\n                            id='integrations.header'\n                            defaultMessage='Integrations'\n                        />\n                    </h1>\n                </div>\n                <div className='backstage-list__help'>\n                    <FormattedMessage\n                        id='integrations.help'\n                        defaultMessage='Visit the {appDirectory} to find self-hosted, third-party apps and integrations for Mattermost.'\n                        values={{\n                            appDirectory: (\n                                <ExternalLink\n                                    href='https://mattermost.com/marketplace'\n                                    location='integrations'\n                                >\n                                    <FormattedMessage\n                                        id='integrations.help.appDirectory'\n                                        defaultMessage='App Directory'\n                                    />\n                                </ExternalLink>\n                            ),\n                        }}\n                    />\n                </div>\n                <div className='integrations-list d-flex flex-wrap'>\n                    {options}\n                </div>\n            </div>\n        );\n    }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\n\nimport {getConfig} from 'mattermost-redux/selectors/entities/general';\n\nimport type {GlobalState} from 'types/store';\n\nimport Integrations from './integrations';\n\nfunction mapStateToProps(state: GlobalState) {\n    const config = getConfig(state);\n    const siteName = config.SiteName;\n    const enableIncomingWebhooks = config.EnableIncomingWebhooks === 'true';\n    const enableOutgoingWebhooks = config.EnableOutgoingWebhooks === 'true';\n    const enableCommands = config.EnableCommands === 'true';\n    const enableOAuthServiceProvider = config.EnableOAuthServiceProvider === 'true';\n    const enableOutgoingOAuthConnections = config.EnableOutgoingOAuthConnections === 'true';\n\n    return {\n        siteName,\n        enableIncomingWebhooks,\n        enableOutgoingWebhooks,\n        enableCommands,\n        enableOAuthServiceProvider,\n        enableOutgoingOAuthConnections,\n    };\n}\n\nexport default connect(mapStateToProps)(Integrations);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React, {memo} from 'react';\nimport type {ChangeEventHandler} from 'react';\nimport {useIntl} from 'react-intl';\n\nimport type {Channel} from '@mattermost/types/channels';\n\nimport Constants from 'utils/constants';\n\ntype Props = {\n    channels: Channel[];\n    onChange?: ChangeEventHandler<HTMLSelectElement>;\n    value?: string;\n    selectOpen: boolean;\n    selectPrivate: boolean;\n    selectDm: boolean;\n};\n\nconst ChannelSelect = ({\n    channels,\n    selectOpen,\n    selectPrivate,\n    selectDm,\n    value,\n    onChange,\n}: Props) => {\n    const intl = useIntl();\n\n    const options = [\n        <option\n            key=''\n            value=''\n        >\n            {intl.formatMessage({\n                id: 'channel_select.placeholder',\n                defaultMessage: '--- Select a channel ---',\n            })}\n        </option>,\n    ];\n\n    channels.forEach((channel: Channel) => {\n        const channelName = channel.display_name || channel.name;\n        if (channel.type === Constants.OPEN_CHANNEL && selectOpen) {\n            options.push(\n                <option\n                    key={channel.id}\n                    value={channel.id}\n                >\n                    {channelName}\n                </option>,\n            );\n        } else if (channel.type === Constants.PRIVATE_CHANNEL && selectPrivate) {\n            options.push(\n                <option\n                    key={channel.id}\n                    value={channel.id}\n                >\n                    {channelName}\n                </option>,\n            );\n        } else if (channel.type === Constants.DM_CHANNEL && selectDm) {\n            options.push(\n                <option\n                    key={channel.id}\n                    value={channel.id}\n                >\n                    {channelName}\n                </option>,\n            );\n        }\n    });\n\n    return (\n        <select\n            className='form-control'\n            value={value}\n            onChange={onChange}\n            id='channelSelect'\n        >\n            {options}\n        </select>\n    );\n};\n\nexport default memo(ChannelSelect);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\n\nimport type {GlobalState} from '@mattermost/types/store';\n\nimport {createSelector} from 'mattermost-redux/selectors/create_selector';\nimport {getMyChannels} from 'mattermost-redux/selectors/entities/channels';\nimport {getCurrentUserLocale} from 'mattermost-redux/selectors/entities/i18n';\nimport {sortChannelsByTypeAndDisplayName} from 'mattermost-redux/utils/channel_utils';\n\nimport ChannelSelect from './channel_select';\n\nconst getMyChannelsSorted = createSelector(\n    'getMyChannelsSorted',\n    getMyChannels,\n    getCurrentUserLocale,\n    (channels, locale) => {\n        const activeChannels = channels.filter((channel) => channel.delete_at === 0);\n        return [...activeChannels].sort(sortChannelsByTypeAndDisplayName.bind(null, locale));\n    },\n);\n\nfunction mapStateToProps(state: GlobalState) {\n    return {\n        channels: getMyChannelsSorted(state),\n    };\n}\n\nexport default connect(mapStateToProps)(ChannelSelect);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React, {PureComponent} from 'react';\nimport type {ChangeEventHandler, FormEvent, MouseEvent} from 'react';\nimport {FormattedMessage} from 'react-intl';\nimport type {MessageDescriptor} from 'react-intl';\nimport {Link} from 'react-router-dom';\n\nimport type {IncomingWebhook} from '@mattermost/types/integrations';\nimport type {Team} from '@mattermost/types/teams';\n\nimport BackstageHeader from 'components/backstage/components/backstage_header';\nimport ChannelSelect from 'components/channel_select';\nimport FormError from 'components/form_error';\nimport SpinnerButton from 'components/spinner_button';\n\ninterface State {\n    displayName: string;\n    description: string;\n    channelId: string;\n    channelLocked: boolean;\n    username: string;\n    iconURL: string;\n    saving: boolean;\n    serverError: string;\n    clientError: JSX.Element | null;\n}\n\ninterface Props {\n\n    /**\n    * The current team\n    */\n    team: Team;\n\n    /**\n    * The header text to render, has id and defaultMessage\n    */\n    header: MessageDescriptor;\n\n    /**\n    * The footer text to render, has id and defaultMessage\n    */\n    footer: MessageDescriptor;\n\n    /**\n    * The spinner loading text to render, has id and defaultMessage\n    */\n    loading: MessageDescriptor;\n\n    /**\n    * The server error text after a failed action\n    */\n    serverError: string;\n\n    /**\n    * The hook used to set the initial state\n    */\n    initialHook?: IncomingWebhook;\n\n    /**\n    * Whether to allow configuration of the default post username.\n    */\n    enablePostUsernameOverride: boolean;\n\n    /**\n    * Whether to allow configuration of the default post icon.\n    */\n    enablePostIconOverride: boolean;\n\n    /**\n    * The async function to run when the action button is pressed\n    */\n    action: (hook: IncomingWebhook) => Promise<void>;\n}\n\nexport default class AbstractIncomingWebhook extends PureComponent<Props, State> {\n    constructor(props: Props | Readonly<Props>) {\n        super(props);\n\n        this.state = this.getStateFromHook(this.props.initialHook);\n    }\n\n    getStateFromHook = (hook?: IncomingWebhook) => {\n        return {\n            displayName: hook?.display_name || '',\n            description: hook?.description || '',\n            channelId: hook?.channel_id || '',\n            channelLocked: hook?.channel_locked || false,\n            username: hook?.username || '',\n            iconURL: hook?.icon_url || '',\n            saving: false,\n            serverError: '',\n            clientError: null,\n        };\n    };\n\n    handleSubmit = (e: MouseEvent<HTMLElement> | FormEvent<HTMLFormElement>) => {\n        e.preventDefault();\n\n        if (this.state.saving) {\n            return;\n        }\n\n        this.setState({\n            saving: true,\n            serverError: '',\n            clientError: null,\n        });\n\n        if (!this.state.channelId) {\n            this.setState({\n                saving: false,\n                clientError: (\n                    <FormattedMessage\n                        id='add_incoming_webhook.channelRequired'\n                        defaultMessage='A valid channel is required'\n                    />\n                ),\n            });\n\n            return;\n        }\n\n        const hook = {\n            channel_id: this.state.channelId,\n            channel_locked: this.state.channelLocked,\n            display_name: this.state.displayName,\n            description: this.state.description,\n            username: this.state.username,\n            icon_url: this.state.iconURL,\n            id: this.props.initialHook?.id || '',\n            create_at: this.props.initialHook?.create_at || 0,\n            update_at: this.props.initialHook?.update_at || 0,\n            delete_at: this.props.initialHook?.delete_at || 0,\n            team_id: this.props.initialHook?.team_id || '',\n            user_id: this.props.initialHook?.user_id || '',\n        };\n\n        this.props.action(hook).then(() => this.setState({saving: false}));\n    };\n\n    updateDisplayName: ChangeEventHandler<HTMLInputElement> = (e) => {\n        this.setState({\n            displayName: e.target.value,\n        });\n    };\n\n    updateDescription: ChangeEventHandler<HTMLInputElement> = (e) => {\n        this.setState({\n            description: e.target.value,\n        });\n    };\n\n    updateChannelId: ChangeEventHandler<HTMLSelectElement> = (e) => {\n        this.setState({\n            channelId: e.target.value,\n        });\n    };\n\n    updateChannelLocked: ChangeEventHandler<HTMLInputElement> = (e) => {\n        this.setState({\n            channelLocked: e.target.checked,\n        });\n    };\n\n    updateUsername: ChangeEventHandler<HTMLInputElement> = (e) => {\n        this.setState({\n            username: e.target.value,\n        });\n    };\n\n    updateIconURL: ChangeEventHandler<HTMLInputElement> = (e) => {\n        this.setState({\n            iconURL: e.target.value,\n        });\n    };\n\n    render() {\n        const headerToRender = this.props.header;\n        const footerToRender = this.props.footer;\n\n        return (\n            <div className='backstage-content'>\n                <BackstageHeader>\n                    <Link to={`/${this.props.team.name}/integrations/incoming_webhooks`}>\n                        <FormattedMessage\n                            id='incoming_webhooks.header'\n                            defaultMessage='Incoming Webhooks'\n                        />\n                    </Link>\n                    <FormattedMessage\n                        id={headerToRender.id}\n                        defaultMessage={headerToRender.defaultMessage}\n                    />\n                </BackstageHeader>\n                <div className='backstage-form'>\n                    <form\n                        className='form-horizontal'\n                        onSubmit={(e) => this.handleSubmit(e)}\n                    >\n                        <div className='form-group'>\n                            <label\n                                className='control-label col-sm-4'\n                                htmlFor='displayName'\n                            >\n                                <FormattedMessage\n                                    id='add_incoming_webhook.displayName'\n                                    defaultMessage='Title'\n                                />\n                            </label>\n                            <div className='col-md-5 col-sm-8'>\n                                <input\n                                    id='displayName'\n                                    type='text'\n                                    maxLength={64}\n                                    className='form-control'\n                                    value={this.state.displayName}\n                                    onChange={this.updateDisplayName}\n                                />\n                                <div className='form__help'>\n                                    <FormattedMessage\n                                        id='add_incoming_webhook.displayName.help'\n                                        defaultMessage='Specify a title, of up to 64 characters, for the webhook settings page.'\n                                    />\n                                </div>\n                            </div>\n                        </div>\n                        <div className='form-group'>\n                            <label\n                                className='control-label col-sm-4'\n                                htmlFor='description'\n                            >\n                                <FormattedMessage\n                                    id='add_incoming_webhook.description'\n                                    defaultMessage='Description'\n                                />\n                            </label>\n                            <div className='col-md-5 col-sm-8'>\n                                <input\n                                    id='description'\n                                    type='text'\n                                    maxLength={500}\n                                    className='form-control'\n                                    value={this.state.description}\n                                    onChange={this.updateDescription}\n                                />\n                                <div className='form__help'>\n                                    <FormattedMessage\n                                        id='add_incoming_webhook.description.help'\n                                        defaultMessage='Describe your incoming webhook.'\n                                    />\n                                </div>\n                            </div>\n                        </div>\n                        <div className='form-group'>\n                            <label\n                                className='control-label col-sm-4'\n                                htmlFor='channelId'\n                            >\n                                <FormattedMessage\n                                    id='add_incoming_webhook.channel'\n                                    defaultMessage='Channel'\n                                />\n                            </label>\n                            <div className='col-md-5 col-sm-8'>\n                                <ChannelSelect\n                                    value={this.state.channelId}\n                                    onChange={this.updateChannelId}\n                                    selectOpen={true}\n                                    selectPrivate={true}\n                                    selectDm={false}\n                                />\n                                <div className='form__help'>\n                                    <FormattedMessage\n                                        id='add_incoming_webhook.channel.help'\n                                        defaultMessage='This is the default public or private channel that receives the webhook payloads. When setting up the webhook, you must belong to the private channel.'\n                                    />\n                                </div>\n                            </div>\n                        </div>\n                        <div className='form-group'>\n                            <label\n                                className='control-label col-sm-4'\n                                htmlFor='channelLocked'\n                            >\n                                <FormattedMessage\n                                    id='add_incoming_webhook.channelLocked'\n                                    defaultMessage='Lock to this channel'\n                                />\n                            </label>\n                            <div className='col-md-5 col-sm-8 checkbox'>\n                                <input\n                                    id='channelLocked'\n                                    type='checkbox'\n                                    checked={this.state.channelLocked}\n                                    onChange={this.updateChannelLocked}\n                                />\n                                <div className='form__help'>\n                                    <FormattedMessage\n                                        id='add_incoming_webhook.channelLocked.help'\n                                        defaultMessage='If set, the incoming webhook can post only to the selected channel.'\n                                    />\n                                </div>\n                            </div>\n                        </div>\n                        { this.props.enablePostUsernameOverride &&\n                            <div className='form-group'>\n                                <label\n                                    className='control-label col-sm-4'\n                                    htmlFor='username'\n                                >\n                                    <FormattedMessage\n                                        id='add_incoming_webhook.username'\n                                        defaultMessage='Username'\n                                    />\n                                </label>\n                                <div className='col-md-5 col-sm-8'>\n                                    <input\n                                        id='username'\n                                        type='text'\n                                        maxLength={22}\n                                        className='form-control'\n                                        value={this.state.username}\n                                        onChange={this.updateUsername}\n                                    />\n                                    <div className='form__help'>\n                                        <FormattedMessage\n                                            id='add_incoming_webhook.username.help'\n                                            defaultMessage='Specify the username this integration will post as. Usernames can be up to 22 characters, and can contain lowercase letters, numbers and the symbols \\\"-\\\", \\\"_\\\", and \\\".\\\". If left blank, the name specified by the webhook creator is used.'\n                                        />\n                                    </div>\n                                </div>\n                            </div>\n                        }\n                        { this.props.enablePostIconOverride &&\n                            <div className='form-group'>\n                                <label\n                                    className='control-label col-sm-4'\n                                    htmlFor='iconURL'\n                                >\n                                    <FormattedMessage\n                                        id='add_incoming_webhook.icon_url'\n                                        defaultMessage='Profile Picture'\n                                    />\n                                </label>\n                                <div className='col-md-5 col-sm-8'>\n                                    <input\n                                        id='iconURL'\n                                        type='text'\n                                        maxLength={1024}\n                                        className='form-control'\n                                        value={this.state.iconURL}\n                                        onChange={this.updateIconURL}\n                                    />\n                                    <div className='form__help'>\n                                        <FormattedMessage\n                                            id='add_incoming_webhook.icon_url.help'\n                                            defaultMessage='Enter the URL of a .png or .jpg file for the profile picture of this integration when posting. The file should be at least 128 pixels by 128 pixels. If left blank, the profile picture specified by the webhook creator is used.'\n                                        />\n                                    </div>\n                                </div>\n                            </div>\n                        }\n                        <div className='backstage-form__footer'>\n                            <FormError\n                                type='backstage'\n                                errors={[this.props.serverError, this.state.clientError]}\n                            />\n                            <Link\n                                className='btn btn-tertiary'\n                                to={`/${this.props.team.name}/integrations/incoming_webhooks`}\n                            >\n                                <FormattedMessage\n                                    id='add_incoming_webhook.cancel'\n                                    defaultMessage='Cancel'\n                                />\n                            </Link>\n                            <SpinnerButton\n                                className='btn btn-primary'\n                                type='submit'\n                                spinning={this.state.saving}\n                                spinningText={this.props.loading}\n                                onClick={(e) => this.handleSubmit(e)}\n                                id='saveWebhook'\n                            >\n                                <FormattedMessage\n                                    id={footerToRender.id}\n                                    defaultMessage={footerToRender.defaultMessage}\n                                />\n                            </SpinnerButton>\n                        </div>\n                    </form>\n                </div>\n            </div>\n        );\n    }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React, {memo, useCallback, useState} from 'react';\nimport {defineMessages} from 'react-intl';\n\nimport type {IncomingWebhook} from '@mattermost/types/integrations';\nimport type {Team} from '@mattermost/types/teams';\n\nimport type {ActionResult} from 'mattermost-redux/types/actions';\n\nimport AbstractIncomingWebhook from 'components/integrations/abstract_incoming_webhook';\n\nimport {getHistory} from 'utils/browser_history';\n\nconst messages = defineMessages({\n    footer: {\n        id: 'add_incoming_webhook.save',\n        defaultMessage: 'Save',\n    },\n    header: {\n        id: 'integrations.add',\n        defaultMessage: 'Add',\n    },\n    loading: {\n        id: 'add_incoming_webhook.saving',\n        defaultMessage: 'Saving...',\n    },\n});\n\ntype Props = {\n\n    /**\n    * The current team\n    */\n    team: Team;\n\n    /**\n    * Whether to allow configuration of the default post username.\n    */\n    enablePostUsernameOverride: boolean;\n\n    /**\n    * Whether to allow configuration of the default post icon.\n    */\n    enablePostIconOverride: boolean;\n\n    actions: {\n\n        /**\n        * The function to call to add a new incoming webhook\n        */\n        createIncomingHook: (hook: IncomingWebhook) => Promise<ActionResult<IncomingWebhook>>;\n    };\n};\n\nconst AddIncomingWebhook = ({\n    team,\n    enablePostUsernameOverride,\n    enablePostIconOverride,\n    actions,\n}: Props) => {\n    const [serverError, setServerError] = useState('');\n\n    const addIncomingHook = useCallback(async (hook: IncomingWebhook) => {\n        setServerError('');\n\n        const {data, error} = await actions.createIncomingHook(hook);\n        if (data) {\n            getHistory().push(`/${team.name}/integrations/confirm?type=incoming_webhooks&id=${data.id}`);\n            return;\n        }\n        if (error) {\n            setServerError(error.message);\n        }\n    }, [actions, team.name]);\n\n    return (\n        <AbstractIncomingWebhook\n            team={team}\n            header={messages.header}\n            footer={messages.footer}\n            loading={messages.loading}\n            enablePostUsernameOverride={enablePostUsernameOverride}\n            enablePostIconOverride={enablePostIconOverride}\n            action={addIncomingHook}\n            serverError={serverError}\n        />\n    );\n};\nexport default memo(AddIncomingWebhook);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\nimport {bindActionCreators} from 'redux';\nimport type {Dispatch} from 'redux';\n\nimport type {GlobalState} from '@mattermost/types/store';\n\nimport {createIncomingHook} from 'mattermost-redux/actions/integrations';\nimport {getConfig} from 'mattermost-redux/selectors/entities/general';\n\nimport AddIncomingWebhook from './add_incoming_webhook';\n\nfunction mapStateToProps(state: GlobalState) {\n    const config = getConfig(state);\n    const enablePostUsernameOverride = config.EnablePostUsernameOverride === 'true';\n    const enablePostIconOverride = config.EnablePostIconOverride === 'true';\n\n    return {\n        enablePostUsernameOverride,\n        enablePostIconOverride,\n    };\n}\n\nfunction mapDispatchToProps(dispatch: Dispatch) {\n    return {\n        actions: bindActionCreators({\n            createIncomingHook,\n        }, dispatch),\n    };\n}\n\nexport default connect(mapStateToProps, mapDispatchToProps)(AddIncomingWebhook);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport type {ChangeEvent, FormEvent} from 'react';\nimport React from 'react';\nimport {FormattedMessage} from 'react-intl';\nimport type {MessageDescriptor} from 'react-intl';\nimport {Link} from 'react-router-dom';\n\nimport type {OAuthApp} from '@mattermost/types/integrations';\nimport type {Team} from '@mattermost/types/teams';\n\nimport {Permissions} from 'mattermost-redux/constants';\n\nimport BackstageHeader from 'components/backstage/components/backstage_header';\nimport FormError from 'components/form_error';\nimport SystemPermissionGate from 'components/permissions_gates/system_permission_gate';\nimport SpinnerButton from 'components/spinner_button';\n\ntype Props = {\n\n    /**\n   * The current team\n   */\n    team: Team;\n\n    /**\n   * The header text to render, has id and defaultMessage\n   */\n    header: MessageDescriptor;\n\n    /**\n   * The footer text to render, has id and defaultMessage\n   */\n    footer: MessageDescriptor;\n\n    /**\n   * The spinner loading text to render, has id and defaultMessage\n   */\n    loading: MessageDescriptor;\n\n    /**\n   * Any extra component/node to render\n   */\n    renderExtra?: JSX.Element;\n\n    /**\n    * The server error text after a failed action\n    */\n    serverError: string;\n\n    /**\n   * The OAuthApp used to set the initial state\n   */\n    initialApp?: OAuthApp;\n\n    /**\n    * The async function to run when the action button is pressed\n    */\n    action: (app: OAuthApp) => Promise<void>;\n\n}\n\ntype State = {\n    name: string;\n    description: string;\n    homepage: string;\n    icon_url: string;\n    callbackUrls: string;\n    is_trusted: boolean;\n    has_icon: boolean;\n    saving: boolean;\n    clientError: JSX.Element | null | string;\n};\n\nexport default class AbstractOAuthApp extends React.PureComponent<Props, State> {\n    private image: HTMLImageElement;\n    private icon_url: React.RefObject<HTMLInputElement>;\n\n    constructor(props: Props) {\n        super(props);\n\n        this.image = new Image();\n        this.image.onload = this.imageLoaded;\n        this.icon_url = React.createRef();\n        this.state = this.getStateFromApp(this.props.initialApp || {} as OAuthApp);\n    }\n\n    getStateFromApp = (app: OAuthApp) => {\n        return {\n            name: app.name || '',\n            description: app.description || '',\n            homepage: app.homepage || '',\n            icon_url: app.icon_url || '',\n            callbackUrls: app.callback_urls ? app.callback_urls.join('\\n') : '',\n            is_trusted: app.is_trusted || false,\n            has_icon: Boolean(app.icon_url),\n            saving: false,\n            clientError: null,\n        };\n    };\n\n    imageLoaded = () => {\n        if (this.icon_url.current?.value) {\n            this.setState({\n                has_icon: true,\n                icon_url: this.icon_url.current.value,\n            });\n        }\n    };\n\n    handleSubmit = (e: FormEvent) => {\n        e.preventDefault();\n\n        if (this.state.saving) {\n            return;\n        }\n\n        this.setState({\n            saving: true,\n            clientError: '',\n        });\n\n        if (!this.state.name) {\n            this.setState({\n                saving: false,\n                clientError: (\n                    <FormattedMessage\n                        id='add_oauth_app.nameRequired'\n                        defaultMessage='Name for the OAuth 2.0 application is required.'\n                    />\n                ),\n            });\n\n            return;\n        }\n\n        if (!this.state.description) {\n            this.setState({\n                saving: false,\n                clientError: (\n                    <FormattedMessage\n                        id='add_oauth_app.descriptionRequired'\n                        defaultMessage='Description for the OAuth 2.0 application is required.'\n                    />\n                ),\n            });\n\n            return;\n        }\n\n        if (!this.state.homepage) {\n            this.setState({\n                saving: false,\n                clientError: (\n                    <FormattedMessage\n                        id='add_oauth_app.homepageRequired'\n                        defaultMessage='Homepage for the OAuth 2.0 application is required.'\n                    />\n                ),\n            });\n\n            return;\n        }\n\n        const callbackUrls = [];\n        for (let callbackUrl of this.state.callbackUrls.split('\\n')) {\n            callbackUrl = callbackUrl.trim();\n\n            if (callbackUrl.length > 0) {\n                callbackUrls.push(callbackUrl);\n            }\n        }\n\n        if (callbackUrls.length === 0) {\n            this.setState({\n                saving: false,\n                clientError: (\n                    <FormattedMessage\n                        id='add_oauth_app.callbackUrlsRequired'\n                        defaultMessage='One or more callback URLs are required.'\n                    />\n                ),\n            });\n\n            return;\n        }\n\n        const app = {\n            name: this.state.name,\n            callback_urls: callbackUrls,\n            homepage: this.state.homepage,\n            description: this.state.description,\n            is_trusted: this.state.is_trusted,\n            icon_url: this.state.icon_url,\n        } as OAuthApp;\n\n        this.props.action(app).then(() => this.setState({saving: false}));\n    };\n\n    updateName = (e: ChangeEvent<HTMLInputElement>) => {\n        this.setState({\n            name: e.target.value,\n        });\n    };\n\n    updateTrusted = (e: ChangeEvent<HTMLInputElement>) => {\n        this.setState({\n            is_trusted: e.target.value === 'true',\n        });\n    };\n\n    updateDescription = (e: ChangeEvent<HTMLInputElement>) => {\n        this.setState({\n            description: e.target.value,\n        });\n    };\n\n    updateHomepage = (e: ChangeEvent<HTMLInputElement>) => {\n        this.setState({\n            homepage: e.target.value,\n        });\n    };\n\n    updateIconUrl = (e: ChangeEvent<HTMLInputElement>) => {\n        this.setState({\n            has_icon: false,\n            icon_url: e.target.value,\n        });\n        this.image.src = e.target.value;\n    };\n\n    updateCallbackUrls = (e: ChangeEvent<HTMLTextAreaElement>) => {\n        this.setState({\n            callbackUrls: e.target.value,\n        });\n    };\n\n    render() {\n        const headerToRender = this.props.header;\n        const footerToRender = this.props.footer;\n        const renderExtra = this.props.renderExtra;\n\n        let icon;\n        if (this.state.has_icon) {\n            icon = (\n                <div className='integration__icon'>\n                    <img\n                        alt={'integration icon'}\n                        src={this.state.icon_url}\n                    />\n                </div>\n            );\n        }\n\n        const trusted = (\n            <SystemPermissionGate permissions={[Permissions.MANAGE_SYSTEM]}>\n                <div className='form-group'>\n                    <label\n                        className='control-label col-sm-4'\n                        htmlFor='is_trusted'\n                    >\n                        <FormattedMessage\n                            id='installed_oauth_apps.trusted'\n                            defaultMessage='Is Trusted'\n                        />\n                    </label>\n                    <div className='col-md-5 col-sm-8'>\n                        <label className='radio-inline'>\n                            <input\n                                type='radio'\n                                value='true'\n                                name='is_trusted'\n                                checked={this.state.is_trusted}\n                                onChange={this.updateTrusted}\n                            />\n                            <FormattedMessage\n                                id='installed_oauth_apps.trusted.yes'\n                                defaultMessage='Yes'\n                            />\n                        </label>\n                        <label className='radio-inline'>\n                            <input\n                                type='radio'\n                                value='false'\n                                name='is_trusted'\n                                checked={!this.state.is_trusted}\n                                onChange={this.updateTrusted}\n                            />\n                            <FormattedMessage\n                                id='installed_oauth_apps.trusted.no'\n                                defaultMessage='No'\n                            />\n                        </label>\n                        <div className='form__help'>\n                            <FormattedMessage\n                                id='add_oauth_app.trusted.help'\n                                defaultMessage='If true, the OAuth 2.0 application is considered trusted by the Mattermost server and does not require the user to accept authorization. If false, a window opens to ask the user to accept or deny the authorization.'\n                            />\n                        </div>\n                    </div>\n                </div>\n            </SystemPermissionGate>\n        );\n\n        return (\n            <div className='backstage-content'>\n                <BackstageHeader>\n                    <Link to={`/${this.props.team.name}/integrations/oauth2-apps`}>\n                        <FormattedMessage\n                            id='installed_oauth_apps.header'\n                            defaultMessage='Installed OAuth2 Apps'\n                        />\n                    </Link>\n                    <FormattedMessage\n                        id={headerToRender.id}\n                        defaultMessage={headerToRender.defaultMessage}\n                    />\n                </BackstageHeader>\n                <div className='backstage-form'>\n                    {icon}\n                    <form className='form-horizontal'>\n                        {trusted}\n                        <div className='form-group'>\n                            <label\n                                className='control-label col-sm-4'\n                                htmlFor='name'\n                            >\n                                <FormattedMessage\n                                    id='installed_oauth_apps.name'\n                                    defaultMessage='Display Name'\n                                />\n                            </label>\n                            <div className='col-md-5 col-sm-8'>\n                                <input\n                                    id='name'\n                                    type='text'\n                                    maxLength={64}\n                                    className='form-control'\n                                    value={this.state.name}\n                                    onChange={this.updateName}\n                                />\n                                <div className='form__help'>\n                                    <FormattedMessage\n                                        id='add_oauth_app.name.help'\n                                        defaultMessage='Specify the display name, of up to 64 characters, for your OAuth 2.0 application.'\n                                    />\n                                </div>\n                            </div>\n                        </div>\n                        <div className='form-group'>\n                            <label\n                                className='control-label col-sm-4'\n                                htmlFor='description'\n                            >\n                                <FormattedMessage\n                                    id='installed_oauth_apps.description'\n                                    defaultMessage='Description'\n                                />\n                            </label>\n                            <div className='col-md-5 col-sm-8'>\n                                <input\n                                    id='description'\n                                    type='text'\n                                    maxLength={512}\n                                    className='form-control'\n                                    value={this.state.description}\n                                    onChange={this.updateDescription}\n                                />\n                                <div className='form__help'>\n                                    <FormattedMessage\n                                        id='add_oauth_app.description.help'\n                                        defaultMessage='Describe your OAuth 2.0 application.'\n                                    />\n                                </div>\n                            </div>\n                        </div>\n                        <div className='form-group'>\n                            <label\n                                className='control-label col-sm-4'\n                                htmlFor='homepage'\n                            >\n                                <FormattedMessage\n                                    id='installed_oauth_apps.homepage'\n                                    defaultMessage='Homepage'\n                                />\n                            </label>\n                            <div className='col-md-5 col-sm-8'>\n                                <input\n                                    id='homepage'\n                                    type='url'\n                                    maxLength={256}\n                                    className='form-control'\n                                    value={this.state.homepage}\n                                    onChange={this.updateHomepage}\n                                />\n                                <div className='form__help'>\n                                    <FormattedMessage\n                                        id='add_oauth_app.homepage.help'\n                                        defaultMessage='This is the URL for the homepage of the OAuth 2.0 application. Depending on your server configuration, use HTTP or HTTPS in the URL.'\n                                    />\n                                </div>\n                            </div>\n                        </div>\n                        <div className='form-group'>\n                            <label\n                                className='control-label col-sm-4'\n                                htmlFor='icon_url'\n                            >\n                                <FormattedMessage\n                                    id='installed_oauth_apps.iconUrl'\n                                    defaultMessage='Icon URL'\n                                />\n                            </label>\n                            <div className='col-md-5 col-sm-8'>\n                                <input\n                                    id='icon_url'\n                                    ref={this.icon_url}\n                                    type='url'\n                                    maxLength={512}\n                                    className='form-control'\n                                    value={this.state.icon_url}\n                                    onChange={this.updateIconUrl}\n                                />\n                                <div className='form__help'>\n                                    <FormattedMessage\n                                        id='add_oauth_app.icon.help'\n                                        defaultMessage='(Optional) The URL of the image used for your OAuth 2.0 application. Make sure you use HTTP or HTTPS in your URL.'\n                                    />\n                                </div>\n                            </div>\n                        </div>\n                        <div className='form-group'>\n                            <label\n                                className='control-label col-sm-4'\n                                htmlFor='callbackUrls'\n                            >\n                                <FormattedMessage\n                                    id='installed_oauth_apps.callbackUrls'\n                                    defaultMessage='Callback URLs (One Per Line)'\n                                />\n                            </label>\n                            <div className='col-md-5 col-sm-8'>\n                                <textarea\n                                    id='callbackUrls'\n                                    rows={3}\n                                    maxLength={1024}\n                                    className='form-control'\n                                    value={this.state.callbackUrls}\n                                    onChange={this.updateCallbackUrls}\n                                />\n                                <div className='form__help'>\n                                    <FormattedMessage\n                                        id='add_oauth_app.callbackUrls.help'\n                                        defaultMessage='The redirect URIs to which the service will redirect users after accepting or denying authorization of your application, and which will handle authorization codes or access tokens. Must be a valid URL and start with http:// or https://.'\n                                    />\n                                </div>\n                            </div>\n                        </div>\n                        <div className='backstage-form__footer'>\n                            <FormError\n                                type='backstage'\n                                errors={[this.props.serverError, this.state.clientError]}\n                            />\n                            <Link\n                                className='btn btn-tertiary'\n                                to={`/${this.props.team.name}/integrations/oauth2-apps`}\n                            >\n                                <FormattedMessage\n                                    id='installed_oauth_apps.cancel'\n                                    defaultMessage='Cancel'\n                                />\n                            </Link>\n                            <SpinnerButton\n                                className='btn btn-primary'\n                                type='submit'\n                                spinning={this.state.saving}\n                                spinningText={this.props.loading}\n                                onClick={this.handleSubmit}\n                                id='saveOauthApp'\n                            >\n                                <FormattedMessage\n                                    id={footerToRender.id}\n                                    defaultMessage={footerToRender.defaultMessage}\n                                />\n                            </SpinnerButton>\n                            {renderExtra}\n                        </div>\n                    </form>\n                </div>\n            </div>\n        );\n    }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React, {useState} from 'react';\nimport {defineMessages} from 'react-intl';\nimport {useHistory} from 'react-router-dom';\n\nimport type {OAuthApp} from '@mattermost/types/integrations';\nimport type {Team} from '@mattermost/types/teams';\n\nimport type {ActionResult} from 'mattermost-redux/types/actions.js';\n\nimport AbstractOAuthApp from '../abstract_oauth_app';\n\nconst messages = defineMessages({\n    footer: {\n        id: 'installed_oauth_apps.save',\n        defaultMessage: 'Save',\n    },\n    header: {\n        id: 'add_oauth_app.header',\n        defaultMessage: 'Add',\n    },\n    loading: {\n        id: 'installed_oauth_apps.saving',\n        defaultMessage: 'Saving...',\n    },\n});\n\nexport type Props = {\n\n    /**\n    * The team data\n    */\n    team: Team;\n\n    actions: {\n\n        /**\n        * The function to call to add new OAuthApp\n        */\n        addOAuthApp: (app: OAuthApp) => Promise<ActionResult<OAuthApp>>;\n    };\n};\n\nconst AddOAuthApp = ({team, actions}: Props): JSX.Element => {\n    const history = useHistory();\n\n    const [serverError, setServerError] = useState('');\n\n    const addOAuthApp = async (app: OAuthApp) => {\n        setServerError('');\n\n        const {data, error} = await actions.addOAuthApp(app);\n        if (data) {\n            history.push(`/${team.name}/integrations/confirm?type=oauth2-apps&id=${data.id}`);\n            return;\n        }\n\n        if (error) {\n            setServerError(error.message);\n        }\n    };\n\n    return (\n        <AbstractOAuthApp\n            team={team}\n            header={messages.header}\n            footer={messages.footer}\n            loading={messages.loading}\n            action={addOAuthApp}\n            serverError={serverError}\n        />\n    );\n};\n\nexport default AddOAuthApp;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\nimport {bindActionCreators} from 'redux';\nimport type {Dispatch} from 'redux';\n\nimport {addOAuthApp} from 'mattermost-redux/actions/integrations';\n\nimport AddOAuthApp from './add_oauth_app';\n\nfunction mapDispatchToProps(dispatch: Dispatch) {\n    return {\n        actions: bindActionCreators({\n            addOAuthApp,\n        }, dispatch),\n    };\n}\n\nexport default connect(null, mapDispatchToProps)(AddOAuthApp);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport type {ChangeEventHandler, FormEvent, MouseEvent} from 'react';\nimport {FormattedMessage} from 'react-intl';\nimport type {MessageDescriptor} from 'react-intl';\nimport {Link} from 'react-router-dom';\n\nimport type {OutgoingWebhook} from '@mattermost/types/integrations';\nimport type {Team} from '@mattermost/types/teams';\n\nimport BackstageHeader from 'components/backstage/components/backstage_header';\nimport ChannelSelect from 'components/channel_select';\nimport ExternalLink from 'components/external_link';\nimport FormError from 'components/form_error';\nimport SpinnerButton from 'components/spinner_button';\n\nimport {DocLinks} from 'utils/constants';\nimport {localizeMessage} from 'utils/utils';\n\ninterface State {\n    callbackUrls: string;\n    channelId: string;\n    clientError: JSX.Element | null;\n    contentType: string;\n    description: string;\n    displayName: string;\n    iconURL: string;\n    saving: boolean;\n    triggerWhen: number;\n    triggerWords: string;\n    username: string;\n}\n\ninterface Props {\n\n    /**\n     * The current team\n     */\n    team: Team;\n\n    /**\n     * The header text to render, has id and defaultMessage\n     */\n    header: MessageDescriptor;\n\n    /**\n     * The footer text to render, has id and defaultMessage\n     */\n    footer: MessageDescriptor;\n\n    /**\n    * The spinner loading text to render, has id and defaultMessage\n    */\n    loading: MessageDescriptor;\n\n    /**\n     * Any extra component/node to render\n     */\n    renderExtra: React.ReactNode;\n\n    /**\n     * The server error text after a failed action\n     */\n    serverError: string;\n\n    /**\n     * The hook used to set the initial state\n     */\n    initialHook?: OutgoingWebhook;\n\n    /**\n     * The async function to run when the action button is pressed\n     */\n    action: (hook: OutgoingWebhook) => Promise<void>;\n\n    /**\n     * Whether to allow configuration of the default post username.\n     */\n    enablePostUsernameOverride: boolean;\n\n    /**\n     * Whether to allow configuration of the default post icon.\n     */\n    enablePostIconOverride: boolean;\n}\n\nexport default class AbstractOutgoingWebhook extends React.PureComponent<Props, State> {\n    constructor(props: Props | Readonly<Props>) {\n        super(props);\n\n        this.state = this.getStateFromHook(this.props.initialHook);\n    }\n\n    getStateFromHook = (hook?: OutgoingWebhook) => {\n        let triggerWords = '';\n        if (hook?.trigger_words) {\n            let i = 0;\n            for (i = 0; i < hook.trigger_words.length; i++) {\n                triggerWords += hook.trigger_words[i] + '\\n';\n            }\n        }\n\n        let callbackUrls = '';\n        if (hook?.callback_urls) {\n            let i = 0;\n            for (i = 0; i < hook.callback_urls.length; i++) {\n                callbackUrls += hook.callback_urls[i] + '\\n';\n            }\n        }\n\n        return {\n            displayName: hook?.display_name || '',\n            description: hook?.description || '',\n            contentType: hook?.content_type || 'application/x-www-form-urlencoded',\n            channelId: hook?.channel_id || '',\n            triggerWords,\n            triggerWhen: hook?.trigger_when || 0,\n            callbackUrls,\n            saving: false,\n            clientError: null,\n            username: hook?.username || '',\n            iconURL: hook?.icon_url || '',\n        };\n    };\n\n    handleSubmit = (e: MouseEvent<HTMLElement> | FormEvent<HTMLFormElement>) => {\n        e.preventDefault();\n\n        if (this.state.saving) {\n            return;\n        }\n\n        this.setState({\n            saving: true,\n            clientError: null,\n        });\n\n        const triggerWords = [];\n        if (this.state.triggerWords) {\n            for (let triggerWord of this.state.triggerWords.split('\\n')) {\n                triggerWord = triggerWord.trim();\n\n                if (triggerWord.length > 0) {\n                    triggerWords.push(triggerWord);\n                }\n            }\n        }\n\n        if (!this.state.channelId && triggerWords.length === 0) {\n            this.setState({\n                saving: false,\n                clientError: (\n                    <FormattedMessage\n                        id='add_outgoing_webhook.triggerWordsOrChannelRequired'\n                        defaultMessage='A valid channel or a list of trigger words is required'\n                    />\n                ),\n            });\n\n            return;\n        }\n\n        const callbackUrls = [];\n        for (let callbackUrl of this.state.callbackUrls.split('\\n')) {\n            callbackUrl = callbackUrl.trim();\n\n            if (callbackUrl.length > 0) {\n                callbackUrls.push(callbackUrl);\n            }\n        }\n\n        if (callbackUrls.length === 0) {\n            this.setState({\n                saving: false,\n                clientError: (\n                    <FormattedMessage\n                        id='add_outgoing_webhook.callbackUrlsRequired'\n                        defaultMessage='One or more callback URLs are required'\n                    />\n                ),\n            });\n\n            return;\n        }\n\n        const hook = {\n            team_id: this.props.team.id,\n            channel_id: this.state.channelId,\n            trigger_words: triggerWords,\n            trigger_when: this.state.triggerWhen,\n            callback_urls: callbackUrls,\n            display_name: this.state.displayName,\n            content_type: this.state.contentType,\n            description: this.state.description,\n            username: this.state.username,\n            icon_url: this.state.iconURL,\n            id: this.props.initialHook?.id || '',\n            create_at: this.props.initialHook?.create_at || 0,\n            update_at: this.props.initialHook?.update_at || 0,\n            delete_at: this.props.initialHook?.delete_at || 0,\n            creator_id: this.props.initialHook?.creator_id || '',\n            token: this.props.initialHook?.token || '',\n        };\n\n        this.props.action(hook).then(() => this.setState({saving: false}));\n    };\n\n    updateDisplayName: ChangeEventHandler<HTMLInputElement> = (e) => {\n        this.setState({\n            displayName: e.target.value,\n        });\n    };\n\n    updateDescription: ChangeEventHandler<HTMLInputElement> = (e) => {\n        this.setState({\n            description: e.target.value,\n        });\n    };\n\n    updateContentType: ChangeEventHandler<HTMLSelectElement> = (e) => {\n        this.setState({\n            contentType: e.target.value,\n        });\n    };\n\n    updateChannelId: ChangeEventHandler<HTMLSelectElement> = (e) => {\n        this.setState({\n            channelId: e.target.value,\n        });\n    };\n\n    updateTriggerWords: ChangeEventHandler<HTMLTextAreaElement> = (e) => {\n        this.setState({\n            triggerWords: e.target.value,\n        });\n    };\n\n    updateTriggerWhen: ChangeEventHandler<HTMLSelectElement> = (e) => {\n        this.setState({\n            triggerWhen: parseInt(e.target.value, 10),\n        });\n    };\n\n    updateCallbackUrls: ChangeEventHandler<HTMLTextAreaElement> = (e) => {\n        this.setState({\n            callbackUrls: e.target.value,\n        });\n    };\n\n    updateUsername: ChangeEventHandler<HTMLInputElement> = (e) => {\n        this.setState({\n            username: e.target.value,\n        });\n    };\n\n    updateIconURL: ChangeEventHandler<HTMLInputElement> = (e) => {\n        this.setState({\n            iconURL: e.target.value,\n        });\n    };\n\n    render() {\n        const contentTypeOption1 = 'application/x-www-form-urlencoded';\n        const contentTypeOption2 = 'application/json';\n\n        const headerToRender = this.props.header;\n        const footerToRender = this.props.footer;\n        const renderExtra = this.props.renderExtra;\n\n        return (\n            <div className='backstage-content'>\n                <BackstageHeader>\n                    <Link to={`/${this.props.team.name}/integrations/outgoing_webhooks`}>\n                        <FormattedMessage\n                            id='add_outgoing_webhook.header'\n                            defaultMessage='Outgoing Webhooks'\n                        />\n                    </Link>\n                    <FormattedMessage\n                        id={headerToRender.id}\n                        defaultMessage={headerToRender.defaultMessage}\n                    />\n                </BackstageHeader>\n                <div className='backstage-form'>\n                    <form\n                        className='form-horizontal'\n                        onSubmit={this.handleSubmit}\n                    >\n                        <div className='form-group'>\n                            <label\n                                className='control-label col-sm-4'\n                                htmlFor='displayName'\n                            >\n                                <FormattedMessage\n                                    id='add_outgoing_webhook.displayName'\n                                    defaultMessage='Title'\n                                />\n                            </label>\n                            <div className='col-md-5 col-sm-8'>\n                                <input\n                                    id='displayName'\n                                    type='text'\n                                    maxLength={64}\n                                    className='form-control'\n                                    value={this.state.displayName}\n                                    onChange={this.updateDisplayName}\n                                />\n                                <div className='form__help'>\n                                    <FormattedMessage\n                                        id='add_outgoing_webhook.displayName.help'\n                                        defaultMessage='Specify a title, of up to 64 characters, for the webhook settings page.'\n                                    />\n                                </div>\n                            </div>\n                        </div>\n                        <div className='form-group'>\n                            <label\n                                className='control-label col-sm-4'\n                                htmlFor='description'\n                            >\n                                <FormattedMessage\n                                    id='add_outgoing_webhook.description'\n                                    defaultMessage='Description'\n                                />\n                            </label>\n                            <div className='col-md-5 col-sm-8'>\n                                <input\n                                    id='description'\n                                    type='text'\n                                    maxLength={500}\n                                    className='form-control'\n                                    value={this.state.description}\n                                    onChange={this.updateDescription}\n                                />\n                                <div className='form__help'>\n                                    <FormattedMessage\n                                        id='add_outgoing_webhook.description.help'\n                                        defaultMessage='Describe your outgoing webhook.'\n                                    />\n                                </div>\n                            </div>\n                        </div>\n                        <div className='form-group'>\n                            <label\n                                className='control-label col-sm-4'\n                                htmlFor='contentType'\n                            >\n                                <FormattedMessage\n                                    id='add_outgoing_webhook.content_Type'\n                                    defaultMessage='Content Type'\n                                />\n                            </label>\n                            <div className='col-md-5 col-sm-8'>\n                                <select\n                                    className='form-control'\n                                    value={this.state.contentType}\n                                    onChange={this.updateContentType}\n                                >\n                                    <option\n                                        value={contentTypeOption1}\n                                    >\n                                        {contentTypeOption1}\n                                    </option>\n                                    <option\n                                        value={contentTypeOption2}\n                                    >\n                                        {contentTypeOption2}\n                                    </option>\n                                </select>\n                                <div className='form__help'>\n                                    <FormattedMessage\n                                        id='add_outgoing_webhook.contentType.help1'\n                                        defaultMessage='Specify the content type by which to send the request.'\n                                    />\n                                </div>\n                                <div className='form__help'>\n                                    <FormattedMessage\n                                        id='add_outgoing_webhook.contentType.help2'\n                                        defaultMessage='For the server to encode the parameters in a URL format in the request body, select application/x-www-form-urlencoded.'\n                                    />\n                                </div>\n                                <div className='form__help'>\n                                    <FormattedMessage\n                                        id='add_outgoing_webhook.contentType.help3'\n                                        defaultMessage='For the server to format the request body as JSON, select application/json.'\n                                    />\n                                </div>\n                            </div>\n                        </div>\n                        <div className='form-group'>\n                            <label\n                                className='control-label col-sm-4'\n                                htmlFor='channelId'\n                            >\n                                <FormattedMessage\n                                    id='add_outgoing_webhook.channel'\n                                    defaultMessage='Channel'\n                                />\n                            </label>\n                            <div className='col-md-5 col-sm-8'>\n                                <ChannelSelect\n                                    value={this.state.channelId}\n                                    onChange={this.updateChannelId}\n                                    selectOpen={true}\n                                    selectPrivate={false}\n                                    selectDm={false}\n                                />\n                                <div className='form__help'>\n                                    <FormattedMessage\n                                        id='add_outgoing_webhook.channel.help'\n                                        defaultMessage='This field is optional if you specify at least one trigger word. Specify the public channel that delivers the payload to the webhook.'\n                                    />\n                                </div>\n                            </div>\n                        </div>\n                        <div className='form-group'>\n                            <label\n                                className='control-label col-sm-4'\n                                htmlFor='triggerWords'\n                            >\n                                <FormattedMessage\n                                    id='add_outgoing_webhook.triggerWords'\n                                    defaultMessage='Trigger Words (One Per Line)'\n                                />\n                            </label>\n                            <div className='col-md-5 col-sm-8'>\n                                <textarea\n                                    id='triggerWords'\n                                    rows={3}\n                                    maxLength={1000}\n                                    className='form-control'\n                                    value={this.state.triggerWords}\n                                    onChange={this.updateTriggerWords}\n                                />\n                                <div className='form__help'>\n                                    <FormattedMessage\n                                        id='add_outgoing_webhook.triggerWords.help'\n                                        defaultMessage='Specify the trigger words that send an HTTP POST request to your application. The trigger can be for the channel, the outgoing webhook, or both. If you select only Channel, trigger words are optional. If you select both, the message must match both values.'\n                                    />\n                                </div>\n                            </div>\n                        </div>\n                        <div className='form-group'>\n                            <label\n                                className='control-label col-sm-4'\n                                htmlFor='triggerWords'\n                            >\n                                <FormattedMessage\n                                    id='add_outgoing_webhook.triggerWordsTriggerWhen'\n                                    defaultMessage='Trigger When'\n                                />\n                            </label>\n                            <div className='col-md-5 col-sm-8'>\n                                <select\n                                    id='triggerWhen'\n                                    className='form-control'\n                                    value={this.state.triggerWhen}\n                                    onChange={this.updateTriggerWhen}\n                                >\n                                    <option\n                                        value='0'\n                                    >\n                                        {localizeMessage({id: 'add_outgoing_webhook.triggerWordsTriggerWhenFullWord', defaultMessage: 'First word matches a trigger word exactly'})}\n                                    </option>\n                                    <option\n                                        value='1'\n                                    >\n                                        {localizeMessage({id: 'add_outgoing_webhook.triggerWordsTriggerWhenStartsWith', defaultMessage: 'First word starts with a trigger word'})}\n                                    </option>\n                                </select>\n                                <div className='form__help'>\n                                    <FormattedMessage\n                                        id='add_outgoing_webhook.triggerWordsTriggerWhen.help'\n                                        defaultMessage='Specify when to trigger the outgoing webhook.'\n                                    />\n                                </div>\n                            </div>\n                        </div>\n                        <div className='form-group'>\n                            <label\n                                className='control-label col-sm-4'\n                                htmlFor='callbackUrls'\n                            >\n                                <FormattedMessage\n                                    id='add_outgoing_webhook.callbackUrls'\n                                    defaultMessage='Callback URLs (One Per Line)'\n                                />\n                            </label>\n                            <div className='col-md-5 col-sm-8'>\n                                <textarea\n                                    id='callbackUrls'\n                                    rows={3}\n                                    maxLength={1000}\n                                    className='form-control'\n                                    value={this.state.callbackUrls}\n                                    onChange={this.updateCallbackUrls}\n                                />\n                                <div className='form__help'>\n                                    <FormattedMessage\n                                        id='add_outgoing_webhook.callbackUrls.help'\n                                        defaultMessage='Specify the URL that the messages will be sent to. If the URL is private, add it as a {link}.'\n                                        values={{\n                                            link: (\n                                                <ExternalLink\n                                                    href={DocLinks.TRUSTED_CONNECTION}\n                                                    location='abstract_outgoing_webhook'\n                                                >\n                                                    <FormattedMessage\n                                                        id='add_outgoing_webhook.callbackUrls.helpLinkText'\n                                                        defaultMessage='trusted internal connection'\n                                                    />\n                                                </ExternalLink>\n                                            ),\n                                        }}\n                                    />\n                                </div>\n                            </div>\n                        </div>\n                        {this.props.enablePostUsernameOverride &&\n                            <div className='form-group'>\n                                <label\n                                    className='control-label col-sm-4'\n                                    htmlFor='username'\n                                >\n                                    <FormattedMessage\n                                        id='add_outgoing_webhook.username'\n                                        defaultMessage='Username'\n                                    />\n                                </label>\n                                <div className='col-md-5 col-sm-8'>\n                                    <input\n                                        id='username'\n                                        type='text'\n                                        maxLength={22}\n                                        className='form-control'\n                                        value={this.state.username}\n                                        onChange={this.updateUsername}\n                                    />\n                                    <div className='form__help'>\n                                        <FormattedMessage\n                                            id='add_outgoing_webhook.username.help'\n                                            defaultMessage='Specify the username this integration will post as. Usernames can be up to 22 characters, and contain lowercase letters, numbers and the symbols \\\"-\\\", \\\"_\\\", and \\\".\\\". If left blank, the name specified by the webhook creator is used.'\n                                        />\n                                    </div>\n                                </div>\n                            </div>\n                        }\n                        {this.props.enablePostIconOverride &&\n                            <div className='form-group'>\n                                <label\n                                    className='control-label col-sm-4'\n                                    htmlFor='iconURL'\n                                >\n                                    <FormattedMessage\n                                        id='add_outgoing_webhook.icon_url'\n                                        defaultMessage='Profile Picture'\n                                    />\n                                </label>\n                                <div className='col-md-5 col-sm-8'>\n                                    <input\n                                        id='iconURL'\n                                        type='text'\n                                        maxLength={1024}\n                                        className='form-control'\n                                        value={this.state.iconURL}\n                                        onChange={this.updateIconURL}\n                                    />\n                                    <div className='form__help'>\n                                        <FormattedMessage\n                                            id='add_outgoing_webhook.icon_url.help'\n                                            defaultMessage='Enter the URL of a .png or .jpg file for this integration to use as the profile picture when posting. The file should be at least 128 pixels by 128 pixels. If left blank, the profile picture specified by the webhook creator is used.'\n                                        />\n                                    </div>\n                                </div>\n                            </div>\n                        }\n                        <div className='backstage-form__footer'>\n                            <FormError\n                                type='backstage'\n                                errors={[this.props.serverError, this.state.clientError]}\n                            />\n                            <Link\n                                className='btn btn-tertiary'\n                                to={`/${this.props.team.name}/integrations/outgoing_webhooks`}\n                            >\n                                <FormattedMessage\n                                    id='add_outgoing_webhook.cancel'\n                                    defaultMessage='Cancel'\n                                />\n                            </Link>\n                            <SpinnerButton\n                                className='btn btn-primary'\n                                type='submit'\n                                spinning={this.state.saving}\n                                spinningText={this.props.loading}\n                                onClick={this.handleSubmit}\n                                id='saveWebhook'\n                            >\n                                <FormattedMessage\n                                    id={footerToRender.id}\n                                    defaultMessage={footerToRender.defaultMessage}\n                                />\n                            </SpinnerButton>\n                            {renderExtra}\n                        </div>\n                    </form>\n                </div>\n            </div>\n        );\n    }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React, {useState} from 'react';\nimport {defineMessages} from 'react-intl';\nimport {useHistory} from 'react-router-dom';\n\nimport type {OutgoingWebhook} from '@mattermost/types/integrations';\nimport type {Team} from '@mattermost/types/teams';\n\nimport type {ActionResult} from 'mattermost-redux/types/actions';\n\nimport AbstractOutgoingWebhook from 'components/integrations/abstract_outgoing_webhook';\n\nconst messages = defineMessages({\n    footer: {\n        id: 'add_outgoing_webhook.save',\n        defaultMessage: 'Save',\n    },\n    header: {\n        id: 'integrations.add',\n        defaultMessage: 'Add',\n    },\n    loading: {\n        id: 'add_outgoing_webhook.saving',\n        defaultMessage: 'Saving...',\n    },\n});\n\nexport type Props = {\n\n    /**\n     * The current team\n     */\n    team: Team;\n\n    actions: {\n\n        /**\n        * The function to call to add a new outgoing webhook\n        */\n        createOutgoingHook: (hook: OutgoingWebhook) => Promise<ActionResult<OutgoingWebhook>>;\n    };\n\n    /**\n     * Whether to allow configuration of the default post username.\n     */\n    enablePostUsernameOverride: boolean;\n\n    /**\n     * Whether to allow configuration of the default post icon.\n     */\n    enablePostIconOverride: boolean;\n};\n\nconst AddOutgoingWebhook = ({team, actions, enablePostUsernameOverride, enablePostIconOverride}: Props): JSX.Element => {\n    const history = useHistory();\n\n    const [serverError, setServerError] = useState('');\n\n    const addOutgoingHook = async (hook: OutgoingWebhook) => {\n        setServerError('');\n\n        const {data, error} = await actions.createOutgoingHook(hook);\n        if (data) {\n            history.push(`/${team.name}/integrations/confirm?type=outgoing_webhooks&id=${data.id}`);\n            return;\n        }\n\n        if (error) {\n            setServerError(error.message);\n        }\n    };\n\n    return (\n        <AbstractOutgoingWebhook\n            team={team}\n            header={messages.header}\n            footer={messages.footer}\n            loading={messages.loading}\n            renderExtra={''}\n            action={addOutgoingHook}\n            serverError={serverError}\n            enablePostUsernameOverride={enablePostUsernameOverride}\n            enablePostIconOverride={enablePostIconOverride}\n        />\n    );\n};\n\nexport default AddOutgoingWebhook;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\nimport {bindActionCreators} from 'redux';\nimport type {Dispatch} from 'redux';\n\nimport {createOutgoingHook} from 'mattermost-redux/actions/integrations';\nimport {getConfig} from 'mattermost-redux/selectors/entities/general';\n\nimport type {GlobalState} from 'types/store';\n\nimport AddOutgoingWebhook from './add_outgoing_webhook';\n\nfunction mapStateToProps(state: GlobalState) {\n    const config = getConfig(state);\n    const enablePostUsernameOverride = config.EnablePostUsernameOverride === 'true';\n    const enablePostIconOverride = config.EnablePostIconOverride === 'true';\n    return {\n        enablePostUsernameOverride,\n        enablePostIconOverride,\n    };\n}\n\nfunction mapDispatchToProps(dispatch: Dispatch) {\n    return {\n        actions: bindActionCreators({\n            createOutgoingHook,\n        }, dispatch),\n    };\n}\n\nexport default connect(mapStateToProps, mapDispatchToProps)(AddOutgoingWebhook);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport type {Bot, BotPatch} from '@mattermost/types/bots';\n\nimport {BotTypes} from 'mattermost-redux/action_types';\nimport {Client4} from 'mattermost-redux/client';\n\nimport {bindClientFunc} from './helpers';\n\nconst BOTS_PER_PAGE_DEFAULT = 20;\n\nexport function createBot(bot: Partial<Bot>) {\n    return bindClientFunc({\n        clientFunc: Client4.createBot,\n        onSuccess: BotTypes.RECEIVED_BOT_ACCOUNT,\n        params: [\n            bot,\n        ],\n    });\n}\n\nexport function patchBot(botUserId: string, botPatch: Partial<BotPatch>) {\n    return bindClientFunc({\n        clientFunc: Client4.patchBot,\n        onSuccess: BotTypes.RECEIVED_BOT_ACCOUNT,\n        params: [\n            botUserId,\n            botPatch,\n        ],\n    });\n}\n\nexport function loadBot(botUserId: string) {\n    return bindClientFunc({\n        clientFunc: Client4.getBot,\n        onSuccess: BotTypes.RECEIVED_BOT_ACCOUNT,\n        params: [\n            botUserId,\n        ],\n    });\n}\n\nexport function loadBots(page = 0, perPage = BOTS_PER_PAGE_DEFAULT) {\n    return bindClientFunc({\n        clientFunc: Client4.getBotsIncludeDeleted,\n        onSuccess: BotTypes.RECEIVED_BOT_ACCOUNTS,\n        params: [\n            page,\n            perPage,\n        ],\n    });\n}\n\nexport function disableBot(botUserId: string) {\n    return bindClientFunc({\n        clientFunc: Client4.disableBot,\n        onSuccess: BotTypes.RECEIVED_BOT_ACCOUNT,\n        params: [\n            botUserId,\n        ],\n    });\n}\n\nexport function enableBot(botUserId: string) {\n    return bindClientFunc({\n        clientFunc: Client4.enableBot,\n        onSuccess: BotTypes.RECEIVED_BOT_ACCOUNT,\n        params: [\n            botUserId,\n        ],\n    });\n}\n\nexport function assignBot(botUserId: string, newOwnerId: string) {\n    return bindClientFunc({\n        clientFunc: Client4.assignBot,\n        onSuccess: BotTypes.RECEIVED_BOT_ACCOUNT,\n        params: [\n            botUserId,\n            newOwnerId,\n        ],\n    });\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport type {IncomingWebhook, OutgoingWebhook, Command} from '@mattermost/types/integrations';\nimport type {GlobalState} from '@mattermost/types/store';\nimport type {IDMappedObjects} from '@mattermost/types/utilities';\n\nimport {createSelector} from 'mattermost-redux/selectors/create_selector';\nimport {getCurrentTeamId} from 'mattermost-redux/selectors/entities/teams';\n\nimport {appsEnabled} from './apps';\n\nexport function getIncomingHooks(state: GlobalState) {\n    return state.entities.integrations.incomingHooks;\n}\n\nexport function getIncomingHooksTotalCount(state: GlobalState) {\n    return state.entities.integrations.incomingHooksTotalCount;\n}\n\nexport function getOutgoingHooks(state: GlobalState) {\n    return state.entities.integrations.outgoingHooks;\n}\n\nexport function getCommands(state: GlobalState) {\n    return state.entities.integrations.commands;\n}\n\nexport function getOAuthApps(state: GlobalState) {\n    return state.entities.integrations.oauthApps;\n}\n\nexport function getOutgoingOAuthConnections(state: GlobalState) {\n    return state.entities.integrations.outgoingOAuthConnections;\n}\n\nexport const getFilteredIncomingHooks: (state: GlobalState) => IncomingWebhook[] = createSelector(\n    'getFilteredIncomingHooks',\n    getCurrentTeamId,\n    getIncomingHooks,\n    (teamId, hooks) => {\n        return Object.keys(hooks).\n            map((key) => hooks[key]).\n            filter((incomingHook) => incomingHook.team_id === teamId);\n    },\n);\n\nexport const getAppsOAuthAppIDs: (state: GlobalState) => string[] = createSelector(\n    'getAppsOAuthAppIDs',\n    appsEnabled,\n    (state: GlobalState) => state.entities.integrations.appsOAuthAppIDs,\n    (apps, ids) => {\n        return apps ? ids : [];\n    },\n);\n\nexport const getAppsBotIDs: (state: GlobalState) => string[] = createSelector(\n    'getAppsBotIDs',\n    appsEnabled,\n    (state: GlobalState) => state.entities.integrations.appsBotIDs,\n    (apps, ids) => {\n        return apps ? ids : [];\n    },\n);\n\nexport function getSystemCommands(state: GlobalState) {\n    return state.entities.integrations.systemCommands;\n}\n\n/**\n * get outgoing hooks in current team\n */\nexport const getOutgoingHooksInCurrentTeam: (state: GlobalState) => OutgoingWebhook[] = createSelector(\n    'getOutgoingHooksInCurrentTeam',\n    getCurrentTeamId,\n    getOutgoingHooks,\n    (teamId, hooks) => {\n        return Object.values(hooks).filter((o) => o.team_id === teamId);\n    },\n);\n\nexport const getAllCommands: (state: GlobalState) => IDMappedObjects<Command> = createSelector(\n    'getAllCommands',\n    getCommands,\n    getSystemCommands,\n    (commands, systemCommands) => {\n        return {\n            ...commands,\n            ...systemCommands,\n        };\n    },\n);\n\nexport const getAutocompleteCommandsList: (state: GlobalState) => Command[] = createSelector(\n    'getAutocompleteCommandsList',\n    getAllCommands,\n    getCurrentTeamId,\n    (commands, currentTeamId) => {\n        return Object.values(commands).filter((command) => {\n            return command && (!command.team_id || command.team_id === currentTeamId) && command.auto_complete;\n        }).sort((a, b) => a.display_name.localeCompare(b.display_name));\n    },\n);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React, {useState} from 'react';\nimport type {ChangeEvent, ReactNode} from 'react';\nimport {FormattedMessage, useIntl} from 'react-intl';\nimport {Link} from 'react-router-dom';\n\nimport LoadingScreen from 'components/loading_screen';\nimport NextIcon from 'components/widgets/icons/fa_next_icon';\nimport PreviousIcon from 'components/widgets/icons/fa_previous_icon';\nimport SearchIcon from 'components/widgets/icons/fa_search_icon';\n\nimport './backstage_list.scss';\n\ntype Props = {\n    children?: JSX.Element[] | ((filter: string) => [JSX.Element[], boolean]);\n    header: ReactNode;\n    addLink?: string;\n    addText?: ReactNode;\n    addButtonId?: string;\n    emptyText?: ReactNode;\n    emptyTextSearch?: JSX.Element;\n    helpText?: ReactNode;\n    loading: boolean;\n    searchPlaceholder?: string;\n    nextPage?: () => void;\n    previousPage?: () => void;\n    page?: number;\n    pageSize?: number;\n    total?: number;\n};\n\nconst getPaging = (remainingProps: Props, childCount: number, hasFilter: boolean) => {\n    const page = (hasFilter || !remainingProps.page) ? 0 : remainingProps.page;\n    const pageSize = (hasFilter || !remainingProps.pageSize) ? childCount : remainingProps.pageSize;\n    const total = (hasFilter || !remainingProps.total) ? childCount : remainingProps.total;\n\n    let startCount = (page * pageSize) + 1;\n    let endCount = (page + 1) * pageSize;\n    endCount = endCount > total ? total : endCount;\n    if (endCount === 0) {\n        startCount = 0;\n    }\n\n    const isFirstPage = startCount <= 1;\n    const isLastPage = endCount >= total;\n\n    return {startCount, endCount, total, isFirstPage, isLastPage};\n};\n\nconst BackstageList = (remainingProps: Props) => {\n    const {formatMessage} = useIntl();\n\n    const [filter, setFilter] = useState('');\n    const updateFilter = (e: ChangeEvent<HTMLInputElement>) => setFilter(e.target.value);\n    const filterLowered = filter.toLowerCase();\n\n    let searchPlaceholder;\n    if (remainingProps.searchPlaceholder) {\n        searchPlaceholder = remainingProps.searchPlaceholder;\n    } else {\n        searchPlaceholder = formatMessage({id: 'backstage_list.search', defaultMessage: 'Search'});\n    }\n\n    let children = [];\n    let childCount = 0;\n    if (remainingProps.loading) {\n        children = [\n            <LoadingScreen\n                key='loading'\n            />,\n        ];\n    } else {\n        let hasChildren = true;\n        if (typeof remainingProps.children === 'function') {\n            [children, hasChildren] = remainingProps.children(filterLowered);\n        } else {\n            children = remainingProps.children as JSX.Element[];\n        }\n        children = React.Children.map(children, (child) => {\n            return React.cloneElement(child, {filterLowered});\n        });\n        if (children.length === 0 || !hasChildren) {\n            if (!filterLowered) {\n                if (remainingProps.emptyText) {\n                    children = [(\n                        <div\n                            className='backstage-list__item backstage-list__empty'\n                            key='emptyText'\n                        >\n                            {remainingProps.emptyText}\n                        </div>\n                    )];\n                }\n            } else if (remainingProps.emptyTextSearch) {\n                children = [(\n                    <div\n                        className='backstage-list__item backstage-list__empty'\n                        id='emptySearchResultsMessage'\n                        key='emptyTextSearch'\n                    >\n                        {React.cloneElement(remainingProps.emptyTextSearch, {values: {...remainingProps.emptyTextSearch.props.values, searchTerm: filterLowered}})}\n                    </div>\n                )];\n            }\n        } else {\n            childCount = children.length;\n        }\n    }\n\n    let addLink = null;\n\n    if (remainingProps.addLink && remainingProps.addText) {\n        addLink = (\n            <Link\n                className='add-link'\n                to={remainingProps.addLink}\n            >\n                <button\n                    type='button'\n                    className='btn btn-primary'\n                    id={remainingProps.addButtonId}\n                >\n                    <span>\n                        {remainingProps.addText}\n                    </span>\n                </button>\n            </Link>\n        );\n    }\n\n    const hasFilter = filter.length > 0;\n    const {startCount, endCount, total, isFirstPage, isLastPage} = getPaging(remainingProps, childCount, hasFilter);\n    const childrenToDisplay = childCount > 0 ? children.slice(startCount - 1, endCount) : children;\n\n    let previousPageFn = remainingProps.previousPage;\n    let nextPageFn = remainingProps.nextPage;\n    if (isFirstPage) {\n        previousPageFn = () => {};\n    }\n    if (isLastPage) {\n        nextPageFn = () => {};\n    }\n\n    return (\n        <div className='backstage-content'>\n            <div className='backstage-header'>\n                <h1>\n                    {remainingProps.header}\n                </h1>\n                {addLink}\n            </div>\n            <div className='backstage-filters'>\n                <div className='backstage-filter__search'>\n                    <SearchIcon/>\n                    <input\n                        type='search'\n                        className='form-control'\n                        placeholder={searchPlaceholder}\n                        value={filter}\n                        onChange={updateFilter}\n                        id='searchInput'\n                    />\n                </div>\n            </div>\n            <span className='backstage-list__help'>\n                {remainingProps.helpText}\n            </span>\n            <div className='backstage-list'>\n                {childrenToDisplay}\n            </div>\n            <div className='backstage-footer'>\n                <div className='backstage-footer__cell'>\n                    <FormattedMessage\n                        id='backstage_list.paginatorCount'\n                        defaultMessage='{startCount, number} - {endCount, number} of {total, number}'\n                        values={{\n                            startCount,\n                            endCount,\n                            total,\n                        }}\n                    />\n                    <button\n                        type='button'\n                        className={'btn btn-quaternary btn-icon btn-sm ml-2 prev ' + (isFirstPage ? 'disabled' : '')}\n                        onClick={previousPageFn}\n                        aria-label={formatMessage({id: 'backstage_list.previousButton.ariaLabel', defaultMessage: 'Previous'})}\n                    >\n                        <PreviousIcon/>\n                    </button>\n                    <button\n                        type='button'\n                        className={'btn btn-quaternary btn-icon btn-sm next ' + (isLastPage ? 'disabled' : '')}\n                        onClick={nextPageFn}\n                        aria-label={formatMessage({id: 'backstage_list.nextButton.ariaLabel', defaultMessage: 'Next'})}\n                    >\n                        <NextIcon/>\n                    </button>\n                </div>\n            </div>\n        </div>\n    );\n};\n\nexport default BackstageList;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport type {ChangeEvent, SyntheticEvent, ReactNode} from 'react';\nimport {FormattedMessage} from 'react-intl';\nimport {Link} from 'react-router-dom';\n\nimport type {Bot as BotType} from '@mattermost/types/bots';\nimport type {Team} from '@mattermost/types/teams';\nimport type {UserProfile, UserAccessToken} from '@mattermost/types/users';\n\nimport type {ActionResult} from 'mattermost-redux/types/actions';\n\nimport ConfirmModal from 'components/confirm_modal';\nimport Markdown from 'components/markdown';\nimport SaveButton from 'components/save_button';\nimport WarningIcon from 'components/widgets/icons/fa_warning_icon';\n\nimport * as Utils from 'utils/utils';\n\nexport function matchesFilter(bot: BotType, filter?: string, owner?: UserProfile): boolean {\n    if (!filter) {\n        return true;\n    }\n    const username = bot.username || '';\n    const description = bot.description || '';\n    const displayName = bot.display_name || '';\n\n    let ownerUsername = 'plugin';\n    if (owner && owner.username) {\n        ownerUsername = owner.username;\n    }\n    return !(username.toLowerCase().indexOf(filter) === -1 &&\n        displayName.toLowerCase().indexOf(filter) === -1 &&\n        description.toLowerCase().indexOf(filter) === -1 &&\n        ownerUsername.toLowerCase().indexOf(filter) === -1);\n}\n\ntype Props = {\n\n    /**\n    *  Bot that we are displaying\n    */\n    bot: BotType;\n\n    /**\n    * Owner of the bot we are displaying\n    */\n    owner?: UserProfile;\n\n    /**\n    * User of the bot we are displaying\n    */\n    user: UserProfile;\n\n    /**\n    * The access tokens of the bot user\n    */\n    accessTokens: Record<string, UserAccessToken>;\n\n    /**\n    * String used for filtering bot items\n    */\n    filter?: string;\n\n    /**\n     * Determine whether this bot is managed by the app framework\n     */\n    fromApp: boolean;\n\n    actions: {\n\n        /**\n        * Disable a bot\n        */\n        disableBot: (userId: string) => Promise<ActionResult>;\n\n        /**\n        * Enable a bot\n        */\n        enableBot: (userId: string) => Promise<ActionResult>;\n\n        /**\n        * Access token managment\n        */\n        createUserAccessToken: (userId: string, description: string) => Promise<ActionResult<UserAccessToken>>;\n\n        revokeUserAccessToken: (tokenId: string) => Promise<ActionResult>;\n        enableUserAccessToken: (tokenId: string) => Promise<ActionResult>;\n        disableUserAccessToken: (tokenId: string) => Promise<ActionResult>;\n    };\n\n    /**\n    *  Only used for routing since backstage is team based.\n    */\n    team: Team;\n}\n\ntype State = {\n    confirmingId: string;\n    creatingTokenState: string;\n    token: UserAccessToken | Record<string, any>;\n    error: ReactNode;\n}\n\nexport default class Bot extends React.PureComponent<Props, State> {\n    public constructor(props: Props) {\n        super(props);\n\n        this.state = {\n            confirmingId: '',\n            creatingTokenState: 'CLOSED',\n            token: {},\n            error: '',\n        };\n    }\n\n    enableBot = (): void => {\n        this.props.actions.enableBot(this.props.bot.user_id);\n    };\n\n    disableBot = (): void => {\n        this.props.actions.disableBot(this.props.bot.user_id);\n    };\n\n    enableUserAccessToken = (id: string): void => {\n        this.props.actions.enableUserAccessToken(id);\n    };\n\n    disableUserAccessToken = (id: string): void => {\n        this.props.actions.disableUserAccessToken(id);\n    };\n\n    confirmRevokeToken = (id: string): void => {\n        this.setState({confirmingId: id});\n    };\n\n    revokeTokenConfirmed = (): void => {\n        this.props.actions.revokeUserAccessToken(this.state.confirmingId);\n        this.closeConfirm();\n    };\n\n    closeConfirm = (): void => {\n        this.setState({confirmingId: ''});\n    };\n\n    openCreateToken = (): void => {\n        this.setState({\n            creatingTokenState: 'OPEN',\n            token: {\n                description: '',\n            },\n        });\n    };\n\n    closeCreateToken = (): void => {\n        this.setState({\n            creatingTokenState: 'CLOSED',\n            token: {\n                description: '',\n            },\n        });\n    };\n\n    handleUpdateDescription = (e: ChangeEvent<HTMLInputElement>): void => {\n        const target = e.target as HTMLInputElement;\n        this.setState({\n            token: Object.assign({}, this.state.token, {description: target.value}),\n        });\n    };\n\n    handleCreateToken = async (e: SyntheticEvent): Promise<void> => {\n        e.preventDefault();\n\n        if (this.state.token.description === '') {\n            this.setState({error: (\n                <FormattedMessage\n                    id='bot.token.error.description'\n                    defaultMessage='Please enter a description.'\n                />\n            )});\n            return;\n        }\n\n        const {data, error} = await this.props.actions.createUserAccessToken(this.props.bot.user_id, this.state.token.description);\n        if (data) {\n            this.setState({creatingTokenState: 'CREATED', token: data});\n        } else if (error) {\n            this.setState({error: error.message});\n        }\n    };\n\n    public render(): JSX.Element | null {\n        const username = this.props.bot.username || '';\n        const description = this.props.bot.description || '';\n        const displayName = this.props.bot.display_name || '';\n\n        let ownerUsername = 'plugin';\n        if (this.props.fromApp) {\n            ownerUsername = 'Apps Framework';\n        } else if (this.props.owner && this.props.owner.username) {\n            ownerUsername = this.props.owner.username;\n        }\n        const filter = this.props.filter ? this.props.filter.toLowerCase() : '';\n        if (!matchesFilter(this.props.bot, filter, this.props.owner)) {\n            return null;\n        }\n\n        const tokenList = [];\n        Object.values(this.props.accessTokens).forEach((token) => {\n            let activeLink;\n            let disableClass = '';\n            let disabledText;\n\n            if (token.is_active) {\n                activeLink = (\n                    <a\n                        id={token.id + '_deactivate'}\n                        href='#'\n                        onClick={(e) => {\n                            e.preventDefault();\n                            this.disableUserAccessToken(token.id);\n                        }}\n                    >\n                        <FormattedMessage\n                            id='user.settings.tokens.deactivate'\n                            defaultMessage='Disable'\n                        />\n                    </a>);\n            } else {\n                disableClass = 'light';\n                disabledText = (\n                    <span className='mr-2 light'>\n                        <FormattedMessage\n                            id='user.settings.tokens.deactivatedWarning'\n                            defaultMessage='(Disabled)'\n                        />\n                    </span>\n                );\n                activeLink = (\n                    <a\n                        id={token.id + '_activate'}\n                        href='#'\n                        onClick={(e) => {\n                            e.preventDefault();\n                            this.enableUserAccessToken(token.id);\n                        }}\n                    >\n                        <FormattedMessage\n                            id='user.settings.tokens.activate'\n                            defaultMessage='Enable'\n                        />\n                    </a>\n                );\n            }\n\n            tokenList.push(\n                <div\n                    key={token.id}\n                    className='bot-list__item'\n                >\n                    <div className='item-details__row d-flex justify-content-between'>\n                        <div className={disableClass}>\n                            <div className='whitespace--nowrap overflow--ellipsis'>\n                                <b>\n                                    <FormattedMessage\n                                        id='user.settings.tokens.tokenDesc'\n                                        defaultMessage='Token Description: '\n                                    />\n                                </b>\n                                {token.description}\n                            </div>\n                            <div className='setting-box__token-id whitespace--nowrap overflow--ellipsis'>\n                                <b>\n                                    <FormattedMessage\n                                        id='user.settings.tokens.tokenId'\n                                        defaultMessage='Token ID: '\n                                    />\n                                </b>\n                                {token.id}\n                            </div>\n                        </div>\n                        <div>\n                            {disabledText}\n                            {activeLink}\n                            {' - '}\n                            <a\n                                id={token.id + '_delete'}\n                                href='#'\n                                onClick={(e) => {\n                                    e.preventDefault();\n                                    this.confirmRevokeToken(token.id);\n                                }}\n                            >\n                                <FormattedMessage\n                                    id='user.settings.tokens.delete'\n                                    defaultMessage='Delete'\n                                />\n                            </a>\n                        </div>\n                    </div>\n                </div>,\n            );\n        });\n\n        let options;\n        if (ownerUsername !== 'plugin') {\n            options = (\n                <div className='item-actions'>\n                    <button\n                        id='createToken'\n                        className='style--none color--link'\n                        onClick={this.openCreateToken}\n                    >\n                        <FormattedMessage\n                            id='bot.manage.create_token'\n                            defaultMessage='Create New Token'\n                        />\n                    </button>\n                    {' - '}\n                    <Link to={`/${this.props.team.name}/integrations/bots/edit?id=${this.props.bot.user_id}`}>\n                        <FormattedMessage\n                            id='bots.manage.edit'\n                            defaultMessage='Edit'\n                        />\n                    </Link>\n                    {' - '}\n                    <button\n                        className='style--none color--link'\n                        onClick={this.disableBot}\n                    >\n                        <FormattedMessage\n                            id='bot.manage.disable'\n                            defaultMessage='Disable'\n                        />\n                    </button>\n                </div>\n            );\n        }\n        if (this.props.bot.delete_at !== 0) {\n            options = (\n                <div className='item-actions'>\n                    <button\n                        className='style--none color--link'\n                        onClick={this.enableBot}\n                    >\n                        <FormattedMessage\n                            id='bot.manage.enable'\n                            defaultMessage='Enable'\n                        />\n                    </button>\n                </div>\n            );\n        }\n\n        if (this.state.creatingTokenState === 'OPEN') {\n            tokenList.push(\n                <div\n                    key={'create'}\n                    className='bot-list__item'\n                >\n                    <div key={'create'}>\n                        <form\n                            className='form-horizontal'\n                            onSubmit={this.handleCreateToken}\n                        >\n                            <div className='row'>\n                                <label\n                                    className='col-sm-auto control-label'\n                                    htmlFor='botToken'\n                                >\n                                    <FormattedMessage\n                                        id='user.settings.tokens.name'\n                                        defaultMessage='Token Description: '\n                                    />\n                                </label>\n                                <div className='col-sm-4'>\n                                    <input\n                                        id='botToken'\n                                        autoFocus={true}\n                                        className='form-control form-sm'\n                                        type='text'\n                                        maxLength={64}\n                                        value={this.state.token.description}\n                                        onChange={this.handleUpdateDescription}\n                                    />\n                                </div>\n                            </div>\n                            <div>\n                                <div className='pt-2 pb-2'>\n                                    <FormattedMessage\n                                        id='user.settings.tokens.nameHelp'\n                                        defaultMessage='Enter a description for your token to remember what it does.'\n                                    />\n                                </div>\n                                <label\n                                    id='clientError'\n                                    className='has-error is-empty'\n                                >\n                                    {this.state.error}\n                                </label>\n                                <div className='mt-2'>\n                                    <SaveButton\n                                        btnClass='btn-sm btn-primary'\n                                        savingMessage={\n                                            <FormattedMessage\n                                                id='user.settings.tokens.save'\n                                                defaultMessage='Save'\n                                            />\n                                        }\n                                        saving={false}\n                                    />\n                                    <button\n                                        className='btn btn-sm btn-tertiary'\n                                        onClick={this.closeCreateToken}\n                                    >\n                                        <FormattedMessage\n                                            id='user.settings.tokens.cancel'\n                                            defaultMessage='Cancel'\n                                        />\n                                    </button>\n                                </div>\n                            </div>\n                        </form>\n                    </div>\n                </div>,\n            );\n        } else if (this.state.creatingTokenState === 'CREATED') {\n            tokenList.push(\n                <div\n                    key={'created'}\n                    className='bot-list__item alert alert-warning'\n                >\n                    <div className='mb-2'>\n                        <WarningIcon additionalClassName='mr-2'/>\n                        <FormattedMessage\n                            id='user.settings.tokens.copy'\n                            defaultMessage=\"Please copy the access token below. You won't be able to see it again!\"\n                        />\n                    </div>\n                    <div className='whitespace--nowrap overflow--ellipsis'>\n                        <FormattedMessage\n                            id='user.settings.tokens.name'\n                            defaultMessage='Token Description: '\n                        />\n                        {this.state.token.description}\n                    </div>\n                    <div className='whitespace--nowrap overflow--ellipsis'>\n                        <FormattedMessage\n                            id='user.settings.tokens.id'\n                            defaultMessage='Token ID: '\n                        />\n                        {this.state.token.id}\n                    </div>\n                    <strong className='word-break--all'>\n                        <FormattedMessage\n                            id='user.settings.tokens.token'\n                            defaultMessage='Access Token: '\n                        />\n                        {this.state.token.token}\n                    </strong>\n                    <div className='mt-2'>\n                        <button\n                            className='btn btn-sm btn-primary'\n                            onClick={this.closeCreateToken}\n                        >\n                            <FormattedMessage\n                                id='bot.create_token.close'\n                                defaultMessage='Close'\n                            />\n                        </button>\n                    </div>\n                </div>,\n            );\n        }\n\n        const imageURL = Utils.imageURLForUser(this.props.user.id, this.props.user.last_picture_update);\n\n        return (\n            <div className='backstage-list__item'>\n                <div className={'bot-list-img-container'}>\n                    <img\n                        className={'bot-list-img'}\n                        alt={'bot image'}\n                        src={imageURL}\n                    />\n                </div>\n                <div className='item-details'>\n                    <div className='item-details__row d-flex flex-column flex-md-row justify-content-between'>\n                        <strong className='item-details__name'>\n                            {displayName + ' (@' + username + ')'}\n                        </strong>\n                        {options}\n                    </div>\n                    <div className='bot-details__description'>\n                        <Markdown message={description}/>\n                    </div>\n                    <div className='light small'>\n                        <FormattedMessage\n                            id='bots.managed_by'\n                            defaultMessage='Managed by '\n                        />\n                        {ownerUsername}\n                    </div>\n                    <div className='bot-list is-empty'>\n                        {tokenList}\n                    </div>\n                </div>\n                <ConfirmModal\n                    title={\n                        <FormattedMessage\n                            id='bots.token.delete'\n                            defaultMessage='Delete Token'\n                        />\n                    }\n                    message={\n                        <FormattedMessage\n                            id='bots.token.confirm_text'\n                            defaultMessage='Are you sure you want to delete the token?'\n                        />\n                    }\n                    confirmButtonText={\n                        <FormattedMessage\n                            id='bots.token.confirm'\n                            defaultMessage='Delete'\n                        />\n                    }\n                    modalClass='integrations-backstage-modal'\n                    show={this.state.confirmingId !== ''}\n                    onConfirm={this.revokeTokenConfirmed}\n                    onCancel={this.closeConfirm}\n                />\n            </div>\n        );\n    }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {FormattedMessage} from 'react-intl';\nimport {Link} from 'react-router-dom';\n\nimport type {Bot as BotType} from '@mattermost/types/bots';\nimport type {Team} from '@mattermost/types/teams';\nimport type {UserProfile, UserAccessToken} from '@mattermost/types/users';\nimport type {RelationOneToOne} from '@mattermost/types/utilities';\n\nimport type {ActionResult} from 'mattermost-redux/types/actions';\n\nimport BackstageList from 'components/backstage/components/backstage_list';\nimport ExternalLink from 'components/external_link';\n\nimport Constants from 'utils/constants';\nimport * as Utils from 'utils/utils';\n\nimport Bot, {matchesFilter} from './bot';\n\ntype Props = {\n\n    /**\n    *  Map from botUserId to bot.\n    */\n    bots: Record<string, BotType>;\n\n    /**\n     * List of bot IDs managed by the app framework\n     */\n    appsBotIDs: string[];\n\n    /**\n     * Whether apps framework is enabled\n     */\n    appsEnabled: boolean;\n\n    /**\n    *  Map from botUserId to accessTokens.\n    */\n    accessTokens?: RelationOneToOne<UserProfile, Record<string, UserAccessToken>>;\n\n    /**\n    *  Map from botUserId to owner.\n    */\n    owners: Record<string, UserProfile>;\n\n    /**\n    *  Map from botUserId to user.\n    */\n    users: Record<string, UserProfile>;\n    createBots?: boolean;\n\n    actions: {\n\n        /**\n         * Ensure we have bot accounts\n         */\n        loadBots: (page?: number, perPage?: number) => Promise<ActionResult<BotType[]>>;\n\n        /**\n        * Load access tokens for bot accounts\n        */\n        getUserAccessTokensForUser: (userId: string, page?: number, perPage?: number) => void;\n\n        /**\n        * Access token managment\n        */\n        createUserAccessToken: (userId: string, description: string) => Promise<ActionResult<UserAccessToken>>;\n\n        revokeUserAccessToken: (tokenId: string) => Promise<ActionResult>;\n        enableUserAccessToken: (tokenId: string) => Promise<ActionResult>;\n        disableUserAccessToken: (tokenId: string) => Promise<ActionResult>;\n\n        /**\n        * Load owner of bot account\n        */\n        getUser: (userId: string) => void;\n\n        /**\n        * Disable a bot\n        */\n        disableBot: (userId: string) => Promise<ActionResult>;\n\n        /**\n        * Enable a bot\n        */\n        enableBot: (userId: string) => Promise<ActionResult>;\n\n        /**\n         * Load bot IDs managed by the apps\n         */\n        fetchAppsBotIDs: () => Promise<ActionResult>;\n    };\n\n    /**\n    *  Only used for routing since backstage is team based.\n    */\n    team: Team;\n}\n\ntype State = {\n    loading: boolean;\n}\n\nexport default class Bots extends React.PureComponent<Props, State> {\n    public constructor(props: Props) {\n        super(props);\n\n        this.state = {\n            loading: true,\n        };\n    }\n\n    public componentDidMount(): void {\n        this.props.actions.loadBots(\n            Constants.Integrations.START_PAGE_NUM,\n            Constants.Integrations.PAGE_SIZE,\n        ).then(\n            (result) => {\n                if (result.data) {\n                    const promises = [];\n\n                    for (const bot of result.data) {\n                        // We don't need to wait for this and we need to accept failure in the case where bot.owner_id is a plugin id\n                        this.props.actions.getUser(bot.owner_id);\n\n                        // We want to wait for these.\n                        promises.push(this.props.actions.getUser(bot.user_id));\n                        promises.push(this.props.actions.getUserAccessTokensForUser(bot.user_id));\n                    }\n\n                    Promise.all(promises).then(() => {\n                        this.setState({loading: false});\n                    });\n                }\n            },\n        );\n        if (this.props.appsEnabled) {\n            this.props.actions.fetchAppsBotIDs();\n        }\n    }\n\n    DisabledSection(props: {hasDisabled: boolean; disabledBots: JSX.Element[]; filter?: string}): JSX.Element | null {\n        if (!props.hasDisabled) {\n            return null;\n        }\n        const botsToDisplay = React.Children.map(props.disabledBots, (child) => {\n            return React.cloneElement(child, {filter: props.filter});\n        });\n        return (\n            <>\n                <div className='bot-disabled'>\n                    <FormattedMessage\n                        id='bots.disabled'\n                        defaultMessage='Disabled'\n                    />\n                </div>\n                <div className='bot-list__disabled'>\n                    {botsToDisplay}\n                </div>\n            </>\n        );\n    }\n\n    EnabledSection(props: {enabledBots: JSX.Element[]; filter?: string}): JSX.Element {\n        const botsToDisplay = React.Children.map(props.enabledBots, (child) => {\n            return React.cloneElement(child, {filter: props.filter});\n        });\n        return (\n            <div>\n                {botsToDisplay}\n            </div>\n        );\n    }\n\n    botToJSX = (bot: BotType): JSX.Element => {\n        return (\n            <Bot\n                key={bot.user_id}\n                bot={bot}\n                owner={this.props.owners[bot.user_id]}\n                user={this.props.users[bot.user_id]}\n                accessTokens={(this.props.accessTokens && this.props.accessTokens[bot.user_id]) || {}}\n                actions={this.props.actions}\n                team={this.props.team}\n                fromApp={this.props.appsBotIDs.includes(bot.user_id)}\n            />\n        );\n    };\n\n    bots = (filter?: string): [JSX.Element[], boolean] => {\n        const bots = Object.values(this.props.bots).sort((a, b) => a.username.localeCompare(b.username));\n        const match = (bot: BotType) => matchesFilter(bot, filter, this.props.owners[bot.user_id]);\n        const enabledBots = bots.filter((bot) => bot.delete_at === 0).filter(match).map(this.botToJSX);\n        const disabledBots = bots.filter((bot) => bot.delete_at > 0).filter(match).map(this.botToJSX);\n        const sections = [(\n            <div key='sections'>\n                <this.EnabledSection\n                    enabledBots={enabledBots}\n                />\n                <this.DisabledSection\n                    hasDisabled={disabledBots.length > 0}\n                    disabledBots={disabledBots}\n                />\n            </div>\n        )];\n\n        return [sections, enabledBots.length > 0 || disabledBots.length > 0];\n    };\n\n    public render(): JSX.Element {\n        return (\n            <BackstageList\n                header={\n                    <FormattedMessage\n                        id='bots.manage.header'\n                        defaultMessage='Bot Accounts'\n                    />\n                }\n                addText={this.props.createBots &&\n                    <FormattedMessage\n                        id='bots.manage.add'\n                        defaultMessage='Add Bot Account'\n                    />\n                }\n                addLink={'/' + this.props.team.name + '/integrations/bots/add'}\n                addButtonId='addBotAccount'\n                emptyText={\n                    <FormattedMessage\n                        id='bots.manage.empty'\n                        defaultMessage='No bot accounts found'\n                    />\n                }\n                emptyTextSearch={\n                    <FormattedMessage\n                        id='bots.emptySearch'\n                        defaultMessage='No bot accounts match <b>{searchTerm}</b>'\n                        values={{\n                            b: (chunks: string) => <b>{chunks}</b>,\n                        }}\n                    />\n                }\n                helpText={\n                    <>\n                        <FormattedMessage\n                            id='bots.manage.help1'\n                            defaultMessage='Use {botAccounts} to integrate with Mattermost through plugins or the API. Bot accounts are available to everyone on your server. '\n                            values={{\n                                botAccounts: (\n                                    <ExternalLink\n                                        href='https://mattermost.com/pl/default-bot-accounts'\n                                        location='bots'\n                                    >\n                                        <FormattedMessage\n                                            id='bots.manage.bot_accounts'\n                                            defaultMessage='Bot Accounts'\n                                        />\n                                    </ExternalLink>\n                                ),\n                            }}\n                        />\n                        <FormattedMessage\n                            id='bots.help2'\n                            defaultMessage={'Enable bot account creation in the <a>System Console</a>.'}\n                            values={{\n                                a: (chunks: string) => <Link to='/admin_console/integrations/bot_accounts'>{chunks}</Link>,\n                            }}\n                        />\n                    </>\n                }\n                searchPlaceholder={Utils.localizeMessage({id: 'bots.manage.search', defaultMessage: 'Search Bot Accounts'})}\n                loading={this.state.loading}\n            >\n                {this.bots}\n            </BackstageList>\n        );\n    }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\nimport {bindActionCreators} from 'redux';\nimport type {Dispatch} from 'redux';\n\nimport type {Bot as BotType} from '@mattermost/types/bots';\nimport type {GlobalState} from '@mattermost/types/store';\nimport type {UserProfile} from '@mattermost/types/users';\n\nimport {loadBots, disableBot, enableBot} from 'mattermost-redux/actions/bots';\nimport {getAppsBotIDs as fetchAppsBotIDs} from 'mattermost-redux/actions/integrations';\nimport {createUserAccessToken, revokeUserAccessToken, enableUserAccessToken, disableUserAccessToken, getUserAccessTokensForUser, getUser} from 'mattermost-redux/actions/users';\nimport {appsEnabled} from 'mattermost-redux/selectors/entities/apps';\nimport {getExternalBotAccounts} from 'mattermost-redux/selectors/entities/bots';\nimport {getConfig} from 'mattermost-redux/selectors/entities/general';\nimport {getAppsBotIDs} from 'mattermost-redux/selectors/entities/integrations';\nimport * as UserSelectors from 'mattermost-redux/selectors/entities/users';\n\nimport Bots from './bots';\n\nfunction mapStateToProps(state: GlobalState) {\n    const config = getConfig(state);\n    const createBots = config.EnableBotAccountCreation === 'true';\n    const bots = getExternalBotAccounts(state);\n    const botValues = Object.values(bots);\n    const owners = botValues.\n        reduce((result: Record<string, UserProfile>, bot: BotType) => {\n            result[bot.user_id] = UserSelectors.getUser(state, bot.owner_id);\n            return result;\n        }, {});\n    const users = botValues.\n        reduce((result: Record<string, UserProfile>, bot: BotType) => {\n            result[bot.user_id] = UserSelectors.getUser(state, bot.user_id);\n            return result;\n        }, {});\n\n    return {\n        createBots,\n        bots,\n        accessTokens: state.entities.admin.userAccessTokensByUser,\n        owners,\n        users,\n        appsBotIDs: getAppsBotIDs(state),\n        appsEnabled: appsEnabled(state),\n    };\n}\n\nfunction mapDispatchToProps(dispatch: Dispatch) {\n    return {\n        actions: bindActionCreators({\n            fetchAppsBotIDs,\n            loadBots,\n            getUserAccessTokensForUser,\n            createUserAccessToken,\n            revokeUserAccessToken,\n            enableUserAccessToken,\n            disableUserAccessToken,\n            getUser,\n            disableBot,\n            enableBot,\n        }, dispatch),\n    };\n}\n\nexport default connect(mapStateToProps, mapDispatchToProps)(Bots);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport type {ChangeEvent, FormEvent} from 'react';\nimport {FormattedMessage} from 'react-intl';\nimport {Link} from 'react-router-dom';\n\nimport type {Bot, BotPatch} from '@mattermost/types/bots';\nimport type {Team} from '@mattermost/types/teams';\nimport type {UserAccessToken, UserProfile} from '@mattermost/types/users';\n\nimport {General} from 'mattermost-redux/constants';\nimport type {ActionResult} from 'mattermost-redux/types/actions';\nimport * as UserUtils from 'mattermost-redux/utils/user_utils';\n\nimport BackstageHeader from 'components/backstage/components/backstage_header';\nimport ExternalLink from 'components/external_link';\nimport FormError from 'components/form_error';\nimport SpinnerButton from 'components/spinner_button';\nimport WithTooltip from 'components/with_tooltip';\n\nimport BotDefaultIcon from 'images/bot_default_icon.png';\nimport {getHistory} from 'utils/browser_history';\nimport {AcceptedProfileImageTypes, Constants, DeveloperLinks, ValidationErrors} from 'utils/constants';\nimport * as FileUtils from 'utils/file_utils';\nimport * as Utils from 'utils/utils';\n\nconst roleOptionSystemAdmin = 'System Admin';\nconst roleOptionMember = 'Member';\n\nexport type Props = {\n\n    /**\n     *  Only used for routing since backstage is team based.\n     */\n    team: Team;\n\n    /**\n     *  Bot to edit (if editing)\n     */\n    bot?: Bot;\n\n    /**\n     *  Bot user\n     */\n    user?: UserProfile;\n\n    /**\n     *  Roles of the bot to edit (if editing)\n     */\n    roles?: string;\n\n    /**\n     * Maximum upload file size (for bot account profile picture)\n     */\n    maxFileSize: number;\n\n    /**\n     * Editing user has the MANAGE_SYSTEM permission\n     */\n    editingUserHasManageSystem: boolean;\n\n    /**\n     * Bot to edit\n     */\n    actions: {\n\n        /**\n         * Creates a new bot account.\n         */\n        createBot: (bot: Partial<Bot>) => Promise<ActionResult<Bot>>;\n\n        /**\n         * Patches an existing bot account.\n         */\n        patchBot: (botUserId: string, botPatch: Partial<BotPatch>) => Promise<ActionResult<Bot>>;\n\n        /**\n         * Uploads a user profile image\n         */\n        uploadProfileImage: (userId: string, image: File | string) => Promise<ActionResult>;\n\n        /**\n         * Set profile image to default\n         */\n        setDefaultProfileImage: (userId: string) => Promise<ActionResult>;\n\n        /**\n         * For creating default access token\n         */\n        createUserAccessToken: (userId: string, description: string) => Promise<ActionResult<UserAccessToken>>;\n\n        /**\n         * For creating setting bot to system admin or special posting permissions\n         */\n        updateUserRoles: (userId: string, roles: string) => Promise<ActionResult>;\n    };\n};\n\nexport type State = {\n    username: string;\n    displayName: string | undefined;\n    description: string | undefined;\n    role: string;\n    postAll: boolean;\n    postChannels: boolean;\n    error: JSX.Element | string;\n    adding: boolean;\n    image: string;\n    orientationStyles: { transform: string; transformOrigin: string };\n    pictureFile: File | null | string;\n};\n\nexport default class AddBot extends React.PureComponent<Props, State> {\n    previewBlob: string | null = null;\n    constructor(props: Props) {\n        super(props);\n\n        this.state = {\n            error: '',\n            username: this.props.bot ? this.props.bot.username : '',\n            displayName: this.props.bot ? this.props.bot.display_name : '',\n            description: this.props.bot ? this.props.bot.description : '',\n            adding: false,\n            image: BotDefaultIcon,\n            role: UserUtils.isSystemAdmin(this.props.roles || '') ? roleOptionSystemAdmin : roleOptionMember,\n            postAll: this.props.bot ? UserUtils.hasPostAllRole(this.props.roles || '') : false,\n            postChannels: this.props.bot ? UserUtils.hasPostAllPublicRole(this.props.roles || '') : false,\n            orientationStyles: {transform: '', transformOrigin: ''},\n            pictureFile: null,\n        };\n    }\n\n    updateUsername = (e: ChangeEvent<HTMLInputElement>) => {\n        this.setState({\n            username: e.target.value,\n        });\n    };\n\n    updateDisplayName = (e: ChangeEvent<HTMLInputElement>) => {\n        this.setState({\n            displayName: e.target.value,\n        });\n    };\n\n    updateDescription = (e: ChangeEvent<HTMLInputElement>) => {\n        this.setState({\n            description: e.target.value,\n        });\n    };\n\n    updateRole = (e: ChangeEvent<HTMLSelectElement>) => {\n        this.setState({\n            role: e.target.value,\n        });\n    };\n\n    updatePostAll = (e: ChangeEvent<HTMLInputElement>) => {\n        this.setState({\n            postAll: e.target.checked,\n        });\n    };\n\n    updatePostChannels = (e: ChangeEvent<HTMLInputElement>) => {\n        this.setState({\n            postChannels: e.target.checked,\n        });\n    };\n\n    updatePicture = (e: ChangeEvent<HTMLInputElement>) => {\n        if (e.target.files && e.target.files[0]) {\n            const pictureFile = e.target.files[0];\n            this.previewBlob = URL.createObjectURL(pictureFile);\n\n            const reader = new FileReader();\n            reader.onload = (e2) => {\n                const orientation = FileUtils.getExifOrientation(e2.target?.result as ArrayBuffer);\n                const orientationStyles = FileUtils.getOrientationStyles(orientation);\n\n                this.setState({\n                    image: this.previewBlob || '',\n                    orientationStyles,\n                });\n            };\n            reader.readAsArrayBuffer(pictureFile);\n            e.target.value = '';\n            this.setState({pictureFile});\n        } else {\n            this.setState({pictureFile: null, image: ''});\n        }\n    };\n\n    setDefault = () => {\n        this.setState({pictureFile: 'default', image: BotDefaultIcon});\n    };\n\n    isFile(file: File | string): file is File {\n        return (file as File).size !== undefined;\n    }\n\n    updateRoles = async (data: Bot) => {\n        let roles = General.SYSTEM_USER_ROLE;\n\n        if (this.state.role === roleOptionSystemAdmin) {\n            roles += ' ' + General.SYSTEM_ADMIN_ROLE;\n        } else if (this.state.postAll) {\n            roles += ' ' + General.SYSTEM_POST_ALL_ROLE;\n        } else if (this.state.postChannels) {\n            roles += ' ' + General.SYSTEM_POST_ALL_PUBLIC_ROLE;\n        }\n\n        const rolesResult = await this.props.actions.updateUserRoles(data.user_id, roles);\n        if (rolesResult) {\n            return rolesResult.error;\n        }\n\n        return null;\n    };\n\n    handleSubmit = async (e: FormEvent<HTMLButtonElement | HTMLFormElement>) => {\n        e.preventDefault();\n\n        if (this.state.adding) {\n            return;\n        }\n\n        if (!this.state.username || this.state.username.length < 3) {\n            this.setState({\n                error: (\n                    <FormattedMessage\n                        id='bots.manage.add.invalid_username'\n                        defaultMessage='Usernames have to begin with a lowercase letter and be 3-22 characters long. You can use lowercase letters, numbers, periods, dashes, and underscores.'\n                    />\n                ),\n            });\n            return;\n        }\n\n        if (this.state.pictureFile && this.isFile(this.state.pictureFile)) {\n            if (!AcceptedProfileImageTypes.includes(this.state.pictureFile.type)) {\n                this.setState({\n                    error: (\n                        <FormattedMessage\n                            id='user.settings.general.validImage'\n                            defaultMessage='Only BMP, JPG or PNG images may be used for profile pictures'\n                        />\n                    ),\n                });\n                return;\n            } else if (this.state.pictureFile.size > this.props.maxFileSize) {\n                this.setState({\n                    error: (\n                        <FormattedMessage\n                            id='user.settings.general.imageTooLarge'\n                            defaultMessage='Unable to upload profile image. File is too large.'\n                        />\n                    ),\n                });\n                return;\n            }\n        }\n\n        this.setState({\n            adding: true,\n            error: '',\n        });\n\n        const bot = {\n            username: this.state.username.toLowerCase().trim(),\n            display_name: this.state.displayName,\n            description: this.state.description,\n        };\n\n        let data: Bot | undefined;\n        let error;\n        if (this.props.bot) {\n            const result = await this.props.actions.patchBot(this.props.bot.user_id, bot);\n            if (result) {\n                data = result.data;\n                error = result.error;\n            } else {\n                error = Utils.localizeMessage({id: 'bot.edit_failed', defaultMessage: 'Failed to edit bot'});\n            }\n\n            if (!error && data) {\n                if (this.state.pictureFile && this.state.pictureFile !== 'default') {\n                    const imageResult = await this.props.actions.uploadProfileImage(data.user_id, this.state.pictureFile);\n                    error = imageResult.error;\n                } else if (this.state.pictureFile && this.state.pictureFile === 'default') {\n                    await this.props.actions.setDefaultProfileImage(data.user_id);\n                }\n            }\n\n            if (!error && data) {\n                error = this.updateRoles(data);\n            }\n\n            if (data) {\n                getHistory().push(`/${this.props.team.name}/integrations/bots`);\n                return;\n            }\n        } else {\n            const usernameError = Utils.isValidBotUsername(bot.username);\n            if (usernameError) {\n                let errObj;\n                if (usernameError.id === ValidationErrors.INVALID_LAST_CHARACTER) {\n                    errObj = {\n                        adding: false,\n                        error: (\n                            <FormattedMessage\n                                id='bots.manage.add.invalid_last_char'\n                                defaultMessage='Bot usernames cannot have a period as the last character'\n                            />\n                        ),\n                    };\n                } else {\n                    errObj = {\n                        adding: false,\n                        error: (\n                            <FormattedMessage\n                                id='bots.manage.add.invalid_username'\n                                defaultMessage='Usernames have to begin with a lowercase letter and be 3-22 characters long. You can use lowercase letters, numbers, periods, dashes, and underscores.'\n                            />\n                        ),\n                    };\n                }\n                this.setState(errObj);\n                return;\n            }\n\n            const result = await this.props.actions.createBot(bot);\n            if (result) {\n                data = result.data;\n                error = result.error;\n            } else {\n                error = Utils.localizeMessage({id: 'bot.create_failed', defaultMessage: 'Failed to create bot'});\n            }\n\n            let token = '';\n            if (!error && data) {\n                if (this.state.pictureFile && this.state.pictureFile !== 'default') {\n                    await this.props.actions.uploadProfileImage(data.user_id, this.state.pictureFile);\n                } else {\n                    await this.props.actions.setDefaultProfileImage(data.user_id);\n                }\n                const tokenResult = await this.props.actions.createUserAccessToken(data.user_id,\n                    Utils.localizeMessage({id: 'bot.token.default.description', defaultMessage: 'Default Token'}),\n                );\n\n                // On error just skip the confirmation because we have a bot without a token.\n                if (!tokenResult || tokenResult.error) {\n                    getHistory().push(`/${this.props.team.name}/integrations/bots`);\n                    return;\n                }\n\n                token = tokenResult.data!.token!;\n            }\n\n            if (!error && data) {\n                error = this.updateRoles(data);\n            }\n\n            if (data) {\n                getHistory().push(`/${this.props.team.name}/integrations/confirm?type=bots&id=${data.user_id}&token=${token}`);\n                return;\n            }\n        }\n\n        this.setState({\n            adding: false,\n        });\n\n        if (error) {\n            this.setState({\n                error: error.message,\n            });\n        }\n    };\n\n    render() {\n        let subtitle = (\n            <FormattedMessage\n                id='bots.manage.add.add'\n                defaultMessage='Add'\n            />\n        );\n        let buttonText = (\n            <FormattedMessage\n                id='bots.manage.add.create'\n                defaultMessage='Create Bot Account'\n            />\n        );\n        let buttonActiveText = (\n            <FormattedMessage\n                id='bots.manage.add.creating'\n                defaultMessage='Creating...'\n            />\n        );\n\n        // If we are editing\n        if (this.props.bot) {\n            subtitle = (\n                <FormattedMessage\n                    id='bots.manage.edit'\n                    defaultMessage='Edit'\n                />\n            );\n            buttonText = (\n                <FormattedMessage\n                    id='bots.manage.edit.title'\n                    defaultMessage='Update'\n                />\n            );\n            buttonActiveText = (\n                <FormattedMessage\n                    id='bots.manage.edit.editing'\n                    defaultMessage='Updating...'\n                />\n            );\n        }\n\n        let imageURL = '';\n        let removeImageIcon: JSX.Element | null = (\n            <WithTooltip\n                title={\n                    <FormattedMessage\n                        id='bot.remove_profile_picture'\n                        defaultMessage='Remove Bot Icon'\n                    />\n                }\n            >\n                <a\n                    className={'bot-profile__remove'}\n                    onClick={this.setDefault}\n                >\n                    <span>{'×'}</span>\n                </a>\n            </WithTooltip>\n        );\n        let imageStyles;\n        if (this.props.bot && !this.state.pictureFile) {\n            if (this.props.user) {\n                imageURL = Utils.imageURLForUser(this.props.user.id, this.props.user.last_picture_update);\n            } else {\n                imageURL = Utils.imageURLForUser(this.props.bot.user_id);\n            }\n        } else {\n            imageURL = this.state.image;\n            imageStyles = this.state.orientationStyles;\n            if (this.state.image === BotDefaultIcon) {\n                removeImageIcon = null;\n            }\n        }\n\n        return (\n            <div className='backstage-content'>\n                <BackstageHeader>\n                    <Link to={`/${this.props.team.name}/integrations/bots`}>\n                        <FormattedMessage\n                            id='bots.manage.header'\n                            defaultMessage='Bot Accounts'\n                        />\n                    </Link>\n                    {subtitle}\n                </BackstageHeader>\n                <div className='backstage-form'>\n                    <form\n                        className='form-horizontal'\n                        onSubmit={this.handleSubmit}\n                    >\n                        <div className='form-group'>\n                            <label\n                                className='control-label col-sm-4'\n                                htmlFor='username'\n                            >\n                                <FormattedMessage\n                                    id='bots.add.username'\n                                    defaultMessage='Username'\n                                />\n                            </label>\n                            <div className='col-md-5 col-sm-8'>\n                                <input\n                                    id='username'\n                                    type='text'\n                                    maxLength={22}\n                                    className='form-control'\n                                    value={this.state.username}\n                                    onChange={this.updateUsername}\n                                />\n                                <div className='form__help'>\n                                    <FormattedMessage\n                                        id='bot.add.username.help'\n                                        defaultMessage='You can use lowercase letters, numbers, periods, dashes, and underscores.'\n                                    />\n                                </div>\n                            </div>\n                        </div>\n                        <div className='form-group'>\n                            <label\n                                className='control-label col-sm-4'\n                                htmlFor='boticon'\n                            >\n                                <FormattedMessage\n                                    id='bots.add.icon'\n                                    defaultMessage='Bot Icon'\n                                />\n                            </label>\n                            <div className='col-md-5 col-sm-8'>\n                                <div className={'bot-img-container'}>\n                                    <img\n                                        className={'bot-img'}\n                                        alt={'bot image'}\n                                        src={imageURL}\n                                        style={imageStyles}\n                                    />\n                                    {removeImageIcon}\n                                </div>\n                                <div\n                                    className='btn btn-primary btn-file'\n                                >\n                                    <FormattedMessage\n                                        id='bots.image.upload'\n                                        defaultMessage='Upload Image'\n                                    />\n                                    <input\n                                        className='btn-file__input'\n                                        accept={Constants.ACCEPT_STATIC_IMAGE}\n                                        type='file'\n                                        onChange={this.updatePicture}\n                                    />\n                                </div>\n                            </div>\n                        </div>\n                        <div className='form-group'>\n                            <label\n                                className='control-label col-sm-4'\n                                htmlFor='displayName'\n                            >\n                                <FormattedMessage\n                                    id='bots.add.displayName'\n                                    defaultMessage='Display Name'\n                                />\n                            </label>\n                            <div className='col-md-5 col-sm-8'>\n                                <input\n                                    id='displayName'\n                                    type='text'\n                                    maxLength={64}\n                                    className='form-control'\n                                    value={this.state.displayName}\n                                    onChange={this.updateDisplayName}\n                                />\n                                <div className='form__help'>\n                                    <FormattedMessage\n                                        id='bot.add.display_name.help'\n                                        defaultMessage={'(Optional) You can choose to display your bot\\'s full name rather than its username.'}\n                                    />\n                                </div>\n                            </div>\n                        </div>\n                        <div className='form-group'>\n                            <label\n                                className='control-label col-sm-4'\n                                htmlFor='description'\n                            >\n                                <FormattedMessage\n                                    id='bot.add.description'\n                                    defaultMessage='Description'\n                                />\n                            </label>\n                            <div className='col-md-5 col-sm-8'>\n                                <input\n                                    id='description'\n                                    type='text'\n                                    maxLength={1024}\n                                    className='form-control'\n                                    value={this.state.description}\n                                    onChange={this.updateDescription}\n                                />\n                                <div className='form__help'>\n                                    <FormattedMessage\n                                        id='bot.add.description.help'\n                                        defaultMessage='(Optional) Let others know what this bot does.'\n                                    />\n                                </div>\n                            </div>\n                        </div>\n                        <div className='form-group'>\n                            <label\n                                className='control-label col-sm-4'\n                                htmlFor='role'\n                            >\n                                <FormattedMessage\n                                    id='bot.add.role'\n                                    defaultMessage='Role'\n                                />\n                            </label>\n                            <div className='col-md-5 col-sm-8'>\n                                <select\n                                    className='form-control'\n                                    value={this.state.role}\n                                    disabled={!this.props.editingUserHasManageSystem}\n                                    onChange={this.updateRole}\n                                >\n                                    <option\n                                        value={roleOptionMember}\n                                    >\n                                        {Utils.localizeMessage({id: 'bot.add.role.member', defaultMessage: 'Member'})}\n                                    </option>\n                                    <option\n                                        value={roleOptionSystemAdmin}\n                                    >\n                                        {Utils.localizeMessage({id: 'bot.add.role.admin', defaultMessage: 'System Admin'})}\n                                    </option>\n                                </select>\n                                <div className='form__help'>\n                                    <FormattedMessage\n                                        id='bot.add.role.help'\n                                        defaultMessage='Choose what role the bot should have.'\n                                    />\n                                </div>\n                            </div>\n                        </div>\n                        <div className='row bot-profile__section'>\n                            <div className='col-md-5 col-sm-8 col-sm-offset-4'>\n                                <FormattedMessage\n                                    id='admin.manage_roles.botAdditionalRoles'\n                                    defaultMessage='Select additional permissions for the account. <link>Read more about roles and permissions</link>.'\n                                    values={{\n                                        link: (msg: React.ReactNode) => (\n                                            <ExternalLink\n                                                href={DeveloperLinks.PERSONAL_ACCESS_TOKENS}\n                                                location='add_bot'\n                                            >\n                                                {msg}\n                                            </ExternalLink>\n                                        ),\n                                    }}\n                                />\n                            </div>\n                        </div>\n                        <div className='form-group'>\n                            <label\n                                className='control-label col-sm-4'\n                                htmlFor='postAll'\n                            >\n                                <FormattedMessage\n                                    id='bot.add.post_all'\n                                    defaultMessage='post:all'\n                                />\n                            </label>\n                            <div className='col-md-5 col-sm-8 checkbox'>\n                                <div className='checkbox no-padding'>\n                                    <label htmlFor='postAll'>\n                                        <input\n                                            id='postAll'\n                                            type='checkbox'\n                                            checked={this.state.postAll || this.state.role === roleOptionSystemAdmin}\n                                            onChange={this.updatePostAll}\n                                            disabled={!this.props.editingUserHasManageSystem || this.state.role === roleOptionSystemAdmin}\n                                        />\n                                        <FormattedMessage\n                                            id='bot.add.post_all.enabled'\n                                            defaultMessage='Enabled'\n                                        />\n                                    </label>\n                                </div>\n                                <div className='form__help'>\n                                    <FormattedMessage\n                                        id='bot.add.post_all.help'\n                                        defaultMessage='Bot will have access to post to all Mattermost channels including direct messages.'\n                                    />\n                                </div>\n                            </div>\n                        </div>\n                        <div className='form-group'>\n                            <label\n                                className='control-label col-sm-4'\n                                htmlFor='postChannels'\n                            >\n                                <FormattedMessage\n                                    id='bot.add.post_channels'\n                                    defaultMessage='post:channels'\n                                />\n                            </label>\n                            <div className='col-md-5 col-sm-8 checkbox'>\n                                <div className='checkbox no-padding'>\n                                    <label htmlFor='postChannels'>\n                                        <input\n                                            id='postChannels'\n                                            type='checkbox'\n                                            checked={this.state.postChannels || this.state.role === roleOptionSystemAdmin || this.state.postAll}\n                                            onChange={this.updatePostChannels}\n                                            disabled={!this.props.editingUserHasManageSystem || this.state.role === roleOptionSystemAdmin || this.state.postAll}\n                                        />\n                                        <FormattedMessage\n                                            id='bot.add.post_channels.enabled'\n                                            defaultMessage='Enabled'\n                                        />\n                                    </label>\n                                </div>\n                                <div className='form__help'>\n                                    <FormattedMessage\n                                        id='bot.add.post_channels.help'\n                                        defaultMessage='Bot will have access to post to all Mattermost public channels.'\n                                    />\n                                </div>\n                            </div>\n                        </div>\n                        <div className='backstage-form__footer'>\n                            <FormError\n                                type='backstage'\n                                errors={[this.state.error]}\n                            />\n                            <Link\n                                className='btn btn-tertiary'\n                                to={`/${this.props.team.name}/integrations/bots`}\n                            >\n                                <FormattedMessage\n                                    id='bots.manage.add.cancel'\n                                    defaultMessage='Cancel'\n                                />\n                            </Link>\n                            <SpinnerButton\n                                className='btn btn-primary'\n                                type='submit'\n                                spinning={this.state.adding}\n                                spinningText={buttonActiveText}\n                                onClick={this.handleSubmit}\n                                id='saveBot'\n                            >\n                                {buttonText}\n                            </SpinnerButton>\n                        </div>\n                    </form>\n                </div>\n            </div>\n        );\n    }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\nimport type {RouteComponentProps} from 'react-router-dom';\nimport {bindActionCreators} from 'redux';\nimport type {Dispatch} from 'redux';\n\nimport {createBot, patchBot} from 'mattermost-redux/actions/bots';\nimport {updateUserRoles, uploadProfileImage, setDefaultProfileImage, createUserAccessToken} from 'mattermost-redux/actions/users';\nimport {Permissions} from 'mattermost-redux/constants';\nimport {getBotAccounts} from 'mattermost-redux/selectors/entities/bots';\nimport {getConfig} from 'mattermost-redux/selectors/entities/general';\nimport {haveISystemPermission} from 'mattermost-redux/selectors/entities/roles';\nimport {getUser} from 'mattermost-redux/selectors/entities/users';\n\nimport type {GlobalState} from 'types/store';\n\nimport AddBot from './add_bot';\n\ntype OwnProps = {\n\n    /**\n     * Search query for the bot\n     */\n    location: RouteComponentProps['location'];\n}\n\nfunction mapStateToProps(state: GlobalState, ownProps: OwnProps) {\n    const config = getConfig(state);\n    const botId = (new URLSearchParams(ownProps.location.search)).get('id');\n    const bots = getBotAccounts(state);\n    const bot = (bots && botId) ? bots[botId] : undefined;\n    const user = bot ? getUser(state, bot.user_id) : undefined;\n    const roles = user ? user.roles : undefined;\n    return {\n        maxFileSize: parseInt(config.MaxFileSize!, 10),\n        bot,\n        roles,\n        editingUserHasManageSystem: haveISystemPermission(state, {permission: Permissions.MANAGE_SYSTEM}),\n        user,\n    };\n}\n\nfunction mapDispatchToProps(dispatch: Dispatch) {\n    return {\n        actions: bindActionCreators({\n            createBot,\n            patchBot,\n            uploadProfileImage,\n            setDefaultProfileImage,\n            createUserAccessToken,\n            updateUserRoles,\n        }, dispatch),\n    };\n}\n\nexport default connect(mapStateToProps, mapDispatchToProps)(AddBot);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport type {IncomingWebhook, IncomingWebhooksWithCount, OutgoingWebhook, Command, OAuthApp, OutgoingOAuthConnection} from '@mattermost/types/integrations';\n\nimport * as IntegrationActions from 'mattermost-redux/actions/integrations';\nimport {getProfilesByIds} from 'mattermost-redux/actions/users';\nimport {appsEnabled} from 'mattermost-redux/selectors/entities/apps';\nimport {getUser} from 'mattermost-redux/selectors/entities/users';\n\nimport type {ActionFuncAsync} from 'types/store';\n\nconst DEFAULT_PAGE_SIZE = 100;\n\nexport function loadIncomingHooksAndProfilesForTeam(teamId: string, page = 0, perPage = DEFAULT_PAGE_SIZE, includeTotalCount = false): ActionFuncAsync<IncomingWebhook[] | IncomingWebhooksWithCount> {\n    return async (dispatch) => {\n        const {data} = await dispatch(IntegrationActions.getIncomingHooks(teamId, page, perPage, includeTotalCount));\n        if (data) {\n            const isWebhooksWithCount = IntegrationActions.isIncomingWebhooksWithCount(data);\n            const hooks = isWebhooksWithCount ? (data as IncomingWebhooksWithCount).incoming_webhooks : data;\n            dispatch(loadProfilesForIncomingHooks(hooks as IncomingWebhook[]));\n        }\n        return {data};\n    };\n}\n\nexport function loadProfilesForIncomingHooks(hooks: IncomingWebhook[]): ActionFuncAsync {\n    return async (dispatch, getState) => {\n        const state = getState();\n        const profilesToLoad: {[key: string]: boolean} = {};\n        for (let i = 0; i < hooks.length; i++) {\n            const hook = hooks[i];\n            if (!getUser(state, hook.user_id)) {\n                profilesToLoad[hook.user_id] = true;\n            }\n        }\n\n        const list = Object.keys(profilesToLoad);\n        if (list.length === 0) {\n            return {data: null};\n        }\n\n        dispatch(getProfilesByIds(list));\n        return {data: null};\n    };\n}\n\nexport function loadOutgoingHooksAndProfilesForTeam(teamId: string, page = 0, perPage = DEFAULT_PAGE_SIZE): ActionFuncAsync<OutgoingWebhook[]> {\n    return async (dispatch) => {\n        const {data} = await dispatch(IntegrationActions.getOutgoingHooks('', teamId, page, perPage));\n        if (data) {\n            dispatch(loadProfilesForOutgoingHooks(data));\n        }\n        return {data};\n    };\n}\n\nexport function loadProfilesForOutgoingHooks(hooks: OutgoingWebhook[]): ActionFuncAsync {\n    return async (dispatch, getState) => {\n        const state = getState();\n        const profilesToLoad: {[key: string]: boolean} = {};\n        for (let i = 0; i < hooks.length; i++) {\n            const hook = hooks[i];\n            if (!getUser(state, hook.creator_id)) {\n                profilesToLoad[hook.creator_id] = true;\n            }\n        }\n\n        const list = Object.keys(profilesToLoad);\n        if (list.length === 0) {\n            return {data: null};\n        }\n\n        dispatch(getProfilesByIds(list));\n        return {data: null};\n    };\n}\n\nexport function loadCommandsAndProfilesForTeam(teamId: string): ActionFuncAsync {\n    return async (dispatch) => {\n        const {data} = await dispatch(IntegrationActions.getCustomTeamCommands(teamId));\n        if (data) {\n            dispatch(loadProfilesForCommands(data));\n        }\n        return {data};\n    };\n}\n\nexport function loadProfilesForCommands(commands: Command[]): ActionFuncAsync {\n    return async (dispatch, getState) => {\n        const state = getState();\n        const profilesToLoad: {[key: string]: boolean} = {};\n        for (let i = 0; i < commands.length; i++) {\n            const command = commands[i];\n            if (!getUser(state, command.creator_id)) {\n                profilesToLoad[command.creator_id] = true;\n            }\n        }\n\n        const list = Object.keys(profilesToLoad);\n        if (list.length === 0) {\n            return {data: null};\n        }\n\n        dispatch(getProfilesByIds(list));\n        return {data: null};\n    };\n}\n\nexport function loadOAuthAppsAndProfiles(page = 0, perPage = DEFAULT_PAGE_SIZE): ActionFuncAsync {\n    return async (dispatch, getState) => {\n        if (appsEnabled(getState())) {\n            dispatch(IntegrationActions.getAppsOAuthAppIDs());\n        }\n        const {data} = await dispatch(IntegrationActions.getOAuthApps(page, perPage));\n        if (data) {\n            dispatch(loadProfilesForOAuthApps(data));\n        }\n        return {data: null};\n    };\n}\n\nexport function loadProfilesForOAuthApps(apps: OAuthApp[]): ActionFuncAsync {\n    return async (dispatch, getState) => {\n        const state = getState();\n        const profilesToLoad: {[key: string]: boolean} = {};\n        for (let i = 0; i < apps.length; i++) {\n            const app = apps[i];\n            if (!getUser(state, app.creator_id)) {\n                profilesToLoad[app.creator_id] = true;\n            }\n        }\n\n        const list = Object.keys(profilesToLoad);\n        if (list.length === 0) {\n            return {data: null};\n        }\n\n        dispatch(getProfilesByIds(list));\n        return {data: null};\n    };\n}\n\nexport function loadOutgoingOAuthConnectionsAndProfiles(teamId: string, page = 0, perPage = DEFAULT_PAGE_SIZE): ActionFuncAsync<null> {\n    return async (dispatch) => {\n        const {data} = await dispatch(IntegrationActions.getOutgoingOAuthConnections(teamId, page, perPage));\n        if (data) {\n            dispatch(loadProfilesForOutgoingOAuthConnections(data));\n        }\n        return {data: null};\n    };\n}\n\nexport function loadProfilesForOutgoingOAuthConnections(connections: OutgoingOAuthConnection[]): ActionFuncAsync<null> {\n    return async (dispatch, getState) => {\n        const state = getState();\n        const profilesToLoad: {[key: string]: boolean} = {};\n        for (let i = 0; i < connections.length; i++) {\n            const app = connections[i];\n            if (!getUser(state, app.creator_id)) {\n                profilesToLoad[app.creator_id] = true;\n            }\n        }\n\n        const list = Object.keys(profilesToLoad);\n        if (list.length === 0) {\n            return {data: null};\n        }\n\n        dispatch(getProfilesByIds(list));\n        return {data: null};\n    };\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport debounce from 'lodash/debounce';\nimport React, {useCallback, useEffect, useMemo, useRef, useState} from 'react';\nimport type {MessageDescriptor} from 'react-intl';\nimport {FormattedMessage} from 'react-intl';\nimport {useDispatch, useSelector} from 'react-redux';\n\nimport {OauthIcon, InformationOutlineIcon} from '@mattermost/compass-icons/components';\nimport type {OutgoingOAuthConnection} from '@mattermost/types/integrations';\n\nimport {\n    getOutgoingOAuthConnectionsForAudience as fetchOutgoingOAuthConnectionsForAudience,\n    getOutgoingOAuthConnections as fetchOutgoingOAuthConnections,\n} from 'mattermost-redux/actions/integrations';\nimport {getConfig} from 'mattermost-redux/selectors/entities/general';\nimport {getOutgoingOAuthConnections} from 'mattermost-redux/selectors/entities/integrations';\nimport {getCurrentTeamId} from 'mattermost-redux/selectors/entities/teams';\n\nimport LocalizedPlaceholderInput from 'components/localized_placeholder_input';\nimport LoadingSpinner from 'components/widgets/loading/loading_spinner';\n\ntype Props = {\n    value: string;\n    onChange: (e: React.ChangeEvent<HTMLInputElement>) => void;\n    placeholder: MessageDescriptor;\n}\n\nconst OAuthConnectionAudienceInput = (props: Props) => {\n    const mounted = useRef(false);\n    const [matchedConnection, setMatchingOAuthConnection] = useState<OutgoingOAuthConnection | null>(null);\n    const [loadingAudienceMatch, setLoadingAudienceMatch] = useState(false);\n\n    const oauthConnections = useSelector(getOutgoingOAuthConnections);\n    const oauthConnectionsEnabled = useSelector(getConfig).EnableOutgoingOAuthConnections === 'true';\n    const teamId = useSelector(getCurrentTeamId);\n\n    const dispatch = useDispatch();\n\n    const matchConnectionsOnInput = useCallback(async (inputValue: string) => {\n        const res = await dispatch(fetchOutgoingOAuthConnectionsForAudience(teamId, inputValue));\n        setLoadingAudienceMatch(false);\n\n        if (res.data && res.data.length) {\n            setMatchingOAuthConnection(res.data[0]);\n        } else {\n            setMatchingOAuthConnection(null);\n        }\n    }, [dispatch, teamId]);\n\n    const debouncedMatchConnections = useMemo(() => {\n        return debounce((inputValue: string) => matchConnectionsOnInput(inputValue), 1000);\n    }, [matchConnectionsOnInput]);\n\n    useEffect(() => {\n        if (mounted.current) {\n            return;\n        }\n        mounted.current = true;\n\n        if (oauthConnectionsEnabled) {\n            dispatch(fetchOutgoingOAuthConnections(teamId));\n            if (props.value) {\n                setLoadingAudienceMatch(true);\n                matchConnectionsOnInput(props.value);\n            }\n        }\n    }, [oauthConnectionsEnabled, props.value, teamId, matchConnectionsOnInput, dispatch, mounted]);\n\n    const onChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n        props.onChange(e);\n\n        if (oauthConnectionsEnabled) {\n            setLoadingAudienceMatch(true);\n            debouncedMatchConnections(e.target.value);\n        }\n    };\n\n    const connections = Object.values(oauthConnections);\n\n    const input = (\n        <LocalizedPlaceholderInput\n            autoComplete='off'\n            id='url'\n            maxLength={1024}\n            className='form-control'\n            value={props.value}\n            onChange={onChange}\n            placeholder={props.placeholder}\n        />\n    );\n\n    if (!connections.length) {\n        return input;\n    }\n\n    let oauthMessage: React.ReactNode;\n\n    if (loadingAudienceMatch) {\n        oauthMessage = (\n            <span>\n                <LoadingSpinner/>\n            </span>\n        );\n    } else if (matchedConnection) {\n        oauthMessage = (\n            <>\n                <span>\n                    <OauthIcon\n                        size={20}\n                    />\n                </span>\n                <span className='outgoing-oauth-audience-match-message'>\n                    <FormattedMessage\n                        id='add_outgoing_oauth_connection.connected'\n                        defaultMessage='Connected to \"{connectionName}\"'\n                        values={{\n                            connectionName: matchedConnection.name,\n                        }}\n                    />\n                </span>\n            </>\n        );\n    } else {\n        oauthMessage = (\n            <>\n                <span>\n                    <InformationOutlineIcon\n                        size={20}\n                    />\n                </span>\n                <span className='outgoing-oauth-audience-match-message'>\n                    <FormattedMessage\n                        id='add_outgoing_oauth_connection.not_connected'\n                        defaultMessage='Not linked to an OAuth connection'\n                    />\n                </span>\n            </>\n        );\n    }\n\n    return (\n        <>\n            {input}\n            <div className='outgoing-oauth-audience-match-message-container'>\n                {oauthMessage}\n            </div>\n        </>\n    );\n};\n\nexport default OAuthConnectionAudienceInput;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport type {ChangeEvent} from 'react';\nimport {defineMessage, FormattedMessage, type MessageDescriptor} from 'react-intl';\nimport {Link} from 'react-router-dom';\n\nimport type {Command} from '@mattermost/types/integrations';\nimport type {Team} from '@mattermost/types/teams';\n\nimport BackstageHeader from 'components/backstage/components/backstage_header';\nimport ExternalLink from 'components/external_link';\nimport FormError from 'components/form_error';\nimport LocalizedPlaceholderInput from 'components/localized_placeholder_input';\nimport SpinnerButton from 'components/spinner_button';\n\nimport {Constants, DeveloperLinks} from 'utils/constants';\nimport * as Utils from 'utils/utils';\n\nimport OAuthConnectionAudienceInput from './outgoing_oauth_connections/oauth_connection_audience_input';\n\nconst REQUEST_POST = 'P';\nconst REQUEST_GET = 'G';\n\ntype Props = {\n\n    /**\n    * The current team\n    */\n    team: Team;\n\n    /**\n    * The header text to render, has id and defaultMessage\n    */\n    header: MessageDescriptor | string;\n\n    /**\n    * The footer text to render, has id and defaultMessage\n    */\n    footer: MessageDescriptor | string;\n\n    /**\n    * The spinner loading text to render, has id and defaultMessage\n    */\n    loading: MessageDescriptor | string;\n\n    /**\n    * Any extra component/node to render\n    */\n    renderExtra?: JSX.Element;\n\n    /**\n    * The server error text after a failed action\n    */\n    serverError: string;\n\n    /**\n    * The Command used to set the initial state\n    */\n    initialCommand?: Partial<Command>;\n\n    /**\n    * The async function to run when the action button is pressed\n    */\n    action: (command: Command) => Promise<void>;\n}\n\ntype State = {\n    saving: boolean;\n    clientError: null | JSX.Element | string;\n    trigger: string;\n    displayName: string;\n    description: string;\n    url: string;\n    method: 'P' | 'G' | '';\n    username: string;\n    iconUrl: string;\n    autocomplete: boolean;\n    autocompleteHint: string;\n    autocompleteDescription: string;\n}\n\nexport default class AbstractCommand extends React.PureComponent<Props, State> {\n    constructor(props: Props) {\n        super(props);\n\n        this.state = this.getStateFromCommand(this.props.initialCommand || {});\n    }\n\n    getStateFromCommand = (command: Props['initialCommand']): State => {\n        return {\n            displayName: command?.display_name ?? '',\n            description: command?.description ?? '',\n            trigger: command?.trigger ?? '',\n            url: command?.url ?? '',\n            method: command?.method ?? REQUEST_POST,\n            username: command?.username ?? '',\n            iconUrl: command?.icon_url ?? '',\n            autocomplete: command?.auto_complete ?? false,\n            autocompleteHint: command?.auto_complete_hint ?? '',\n            autocompleteDescription: command?.auto_complete_desc ?? '',\n            saving: false,\n            clientError: null,\n        };\n    };\n\n    getBackstageHeader = () => {\n        if (typeof this.props.header === 'string') {\n            return <span>{this.props.header}</span>;\n        }\n\n        return (\n            <FormattedMessage\n                id={this.props.header.id}\n                defaultMessage={this.props.header.defaultMessage}\n            />\n        );\n    };\n\n    getBackstageFooter = () => {\n        if (typeof this.props.footer === 'string') {\n            return <span>{this.props.footer}</span>;\n        }\n\n        return (\n            <FormattedMessage\n                id={this.props.footer.id}\n                defaultMessage={this.props.footer.defaultMessage}\n            />\n        );\n    };\n\n    handleSubmit = (e: React.FormEvent) => {\n        e.preventDefault();\n\n        if (this.state.saving) {\n            return;\n        }\n\n        this.setState({\n            saving: true,\n            clientError: '',\n        });\n\n        let triggerWord = this.state.trigger.trim().toLowerCase();\n        if (triggerWord.indexOf('/') === 0) {\n            triggerWord = triggerWord.substr(1);\n        }\n\n        const command = {\n            display_name: this.state.displayName,\n            description: this.state.description,\n            trigger: triggerWord,\n            url: this.state.url.trim(),\n            method: this.state.method,\n            username: this.state.username,\n            icon_url: this.state.iconUrl,\n            auto_complete: this.state.autocomplete,\n            team_id: this.props.team.id,\n            auto_complete_desc: '',\n            auto_complete_hint: '',\n            token: '',\n            create_at: 0,\n            update_at: 0,\n            delete_at: 0,\n            id: '',\n            creator_id: '',\n        };\n\n        if (command.auto_complete) {\n            command.auto_complete_desc = this.state.autocompleteDescription ?? '';\n            command.auto_complete_hint = this.state.autocompleteHint ?? '';\n        }\n\n        if (!command.trigger) {\n            this.setState({\n                saving: false,\n                clientError: (\n                    <FormattedMessage\n                        id='add_command.triggerRequired'\n                        defaultMessage='A trigger word is required'\n                    />\n                ),\n            });\n\n            return;\n        }\n\n        if (command.trigger.indexOf('/') === 0) {\n            this.setState({\n                saving: false,\n                clientError: (\n                    <FormattedMessage\n                        id='add_command.triggerInvalidSlash'\n                        defaultMessage='A trigger word cannot begin with a /'\n                    />\n                ),\n            });\n\n            return;\n        }\n\n        if (command.trigger.indexOf(' ') !== -1) {\n            this.setState({\n                saving: false,\n                clientError: (\n                    <FormattedMessage\n                        id='add_command.triggerInvalidSpace'\n                        defaultMessage='A trigger word must not contain spaces'\n                    />\n                ),\n            });\n            return;\n        }\n\n        if (command.trigger.length < Constants.MIN_TRIGGER_LENGTH ||\n            command.trigger.length > Constants.MAX_TRIGGER_LENGTH) {\n            this.setState({\n                saving: false,\n                clientError: (\n                    <FormattedMessage\n                        id='add_command.triggerInvalidLength'\n                        defaultMessage='A trigger word must contain between {min} and {max} characters'\n                        values={{\n                            min: Constants.MIN_TRIGGER_LENGTH,\n                            max: Constants.MAX_TRIGGER_LENGTH,\n                        }}\n                    />\n                ),\n            });\n\n            return;\n        }\n\n        if (!command.url) {\n            this.setState({\n                saving: false,\n                clientError: (\n                    <FormattedMessage\n                        id='add_command.urlRequired'\n                        defaultMessage='A request URL is required'\n                    />\n                ),\n            });\n\n            return;\n        }\n\n        this.props.action(command).then(() => this.setState({saving: false}));\n    };\n\n    updateDisplayName = (e: ChangeEvent<HTMLInputElement>) => {\n        this.setState({\n            displayName: e.target.value,\n        });\n    };\n\n    updateDescription = (e: ChangeEvent<HTMLInputElement>) => {\n        this.setState({\n            description: e.target.value,\n        });\n    };\n\n    updateTrigger = (e: ChangeEvent<HTMLInputElement>) => {\n        this.setState({\n            trigger: e.target.value,\n        });\n    };\n\n    updateUrl = (e: ChangeEvent<HTMLInputElement>) => {\n        this.setState({\n            url: e.target.value,\n        });\n    };\n\n    updateMethod = (e: ChangeEvent<HTMLSelectElement>) => {\n        const methodValue = e.target.value;\n        if (methodValue === 'P' || methodValue === 'G' || methodValue === '') {\n            this.setState({\n                method: methodValue,\n            });\n        }\n    };\n\n    updateUsername = (e: ChangeEvent<HTMLInputElement>) => {\n        this.setState({\n            username: e.target.value,\n        });\n    };\n\n    updateIconUrl = (e: ChangeEvent<HTMLInputElement>) => {\n        this.setState({\n            iconUrl: e.target.value,\n        });\n    };\n\n    updateAutocomplete = (e: ChangeEvent<HTMLInputElement>) => {\n        this.setState({\n            autocomplete: e.target.checked,\n        });\n    };\n\n    updateAutocompleteHint = (e: ChangeEvent<HTMLInputElement>) => {\n        this.setState({\n            autocompleteHint: e.target.value,\n        });\n    };\n\n    updateAutocompleteDescription = (e: ChangeEvent<HTMLInputElement>) => {\n        this.setState({\n            autocompleteDescription: e.target.value,\n        });\n    };\n\n    render() {\n        let autocompleteHint = null;\n        let autocompleteDescription = null;\n\n        if (this.state.autocomplete) {\n            autocompleteHint = (\n                <div className='form-group'>\n                    <label\n                        className='control-label col-sm-4'\n                        htmlFor='autocompleteHint'\n                    >\n                        <FormattedMessage\n                            id='add_command.autocompleteHint'\n                            defaultMessage='Autocomplete Hint'\n                        />\n                    </label>\n                    <div className='col-md-5 col-sm-8'>\n                        <LocalizedPlaceholderInput\n                            id='autocompleteHint'\n                            type='text'\n                            maxLength={1024}\n                            className='form-control'\n                            value={this.state.autocompleteHint}\n                            onChange={this.updateAutocompleteHint}\n                            placeholder={defineMessage({\n                                id: 'add_command.autocompleteHint.placeholder',\n                                defaultMessage: 'Example: [Patient Name]',\n                            })}\n                        />\n                        <div className='form__help'>\n                            <FormattedMessage\n                                id='add_command.autocompleteHint.help'\n                                defaultMessage='(Optional) Specify the arguments associated with your slash command. These are displayed as help on the autocomplete list.'\n                            />\n                        </div>\n                    </div>\n                </div>\n            );\n\n            autocompleteDescription = (\n                <div className='form-group'>\n                    <label\n                        className='control-label col-sm-4'\n                        htmlFor='autocompleteDescription'\n                    >\n                        <FormattedMessage\n                            id='add_command.autocompleteDescription'\n                            defaultMessage='Autocomplete Description'\n                        />\n                    </label>\n                    <div className='col-md-5 col-sm-8'>\n                        <LocalizedPlaceholderInput\n                            id='description'\n                            type='text'\n                            maxLength={128}\n                            className='form-control'\n                            value={this.state.autocompleteDescription}\n                            onChange={this.updateAutocompleteDescription}\n                            placeholder={defineMessage({\n                                id: 'add_command.autocompleteDescription.placeholder',\n                                defaultMessage: 'Example: \"Returns search results for patient records\"',\n                            })}\n                        />\n                        <div className='form__help'>\n                            <FormattedMessage\n                                id='add_command.autocompleteDescription.help'\n                                defaultMessage='(Optional) Describe your slash command for the autocomplete list.'\n                            />\n                        </div>\n                    </div>\n                </div>\n            );\n        }\n\n        return (\n            <div className='backstage-content row'>\n                <BackstageHeader>\n                    <Link to={'/' + this.props.team.name + '/integrations/commands'}>\n                        <FormattedMessage\n                            id='installed_command.header'\n                            defaultMessage='Slash Commands'\n                        />\n                    </Link>\n                    {this.getBackstageHeader()}\n                </BackstageHeader>\n                <div className='backstage-form'>\n                    <form\n                        className='form-horizontal'\n                        onSubmit={this.handleSubmit}\n                    >\n                        <div className='form-group'>\n                            <label\n                                className='control-label col-sm-4'\n                                htmlFor='displayName'\n                            >\n                                <FormattedMessage\n                                    id='add_command.displayName'\n                                    defaultMessage='Title'\n                                />\n                            </label>\n                            <div className='col-md-5 col-sm-8'>\n                                <input\n                                    id='displayName'\n                                    type='text'\n                                    maxLength={64}\n                                    className='form-control'\n                                    value={this.state.displayName}\n                                    onChange={this.updateDisplayName}\n                                />\n                                <div className='form__help'>\n                                    <FormattedMessage\n                                        id='add_command.displayName.help'\n                                        defaultMessage='Specify a title, of up to 64 characters, for the slash command settings page.'\n                                    />\n                                </div>\n                            </div>\n                        </div>\n                        <div className='form-group'>\n                            <label\n                                className='control-label col-sm-4'\n                                htmlFor='description'\n                            >\n                                <FormattedMessage\n                                    id='add_command.description'\n                                    defaultMessage='Description'\n                                />\n                            </label>\n                            <div className='col-md-5 col-sm-8'>\n                                <input\n                                    id='description'\n                                    type='text'\n                                    maxLength={128}\n                                    className='form-control'\n                                    value={this.state.description}\n                                    onChange={this.updateDescription}\n                                />\n                                <div className='form__help'>\n                                    <FormattedMessage\n                                        id='add_command.description.help'\n                                        defaultMessage='Describe your slash command.'\n                                    />\n                                </div>\n                            </div>\n                        </div>\n                        <div className='form-group'>\n                            <label\n                                className='control-label col-sm-4'\n                                htmlFor='trigger'\n                            >\n                                <FormattedMessage\n                                    id='add_command.trigger'\n                                    defaultMessage='Command Trigger Word'\n                                />\n                            </label>\n                            <div className='col-md-5 col-sm-8'>\n                                <LocalizedPlaceholderInput\n                                    id='trigger'\n                                    type='text'\n                                    maxLength={Constants.MAX_TRIGGER_LENGTH}\n                                    className='form-control'\n                                    value={this.state.trigger}\n                                    onChange={this.updateTrigger}\n                                    placeholder={defineMessage({\n                                        id: 'add_command.trigger.placeholder',\n                                        defaultMessage: 'Command trigger e.g. \"hello\" not including the slash',\n                                    })}\n                                />\n                                <div className='form__help'>\n                                    <FormattedMessage\n                                        id='add_command.trigger.help'\n                                        defaultMessage='Specify a trigger word that is not a built-in command, does not contain spaces, and does not begin with the slash character.'\n                                    />\n                                </div>\n                                <div className='form__help'>\n                                    <FormattedMessage\n                                        id='add_command.trigger.helpExamples'\n                                        defaultMessage='Examples: client, employee, patient, weather'\n                                    />\n                                </div>\n                                <div className='form__help'>\n                                    <FormattedMessage\n                                        id='add_command.trigger.helpReserved'\n                                        defaultMessage='Reserved: {link}'\n                                        values={{\n                                            link: (\n                                                <ExternalLink\n                                                    href={DeveloperLinks.CUSTOM_SLASH_COMMANDS}\n                                                    location='abstract_command'\n                                                >\n                                                    <FormattedMessage\n                                                        id='add_command.trigger.helpReservedLinkText'\n                                                        defaultMessage='See built-in slash commands'\n                                                    />\n                                                </ExternalLink>\n                                            ),\n                                        }}\n                                    />\n                                </div>\n                            </div>\n                        </div>\n                        <div className='form-group'>\n                            <label\n                                className='control-label col-sm-4'\n                                htmlFor='url'\n                            >\n                                <FormattedMessage\n                                    id='add_command.url'\n                                    defaultMessage='Request URL'\n                                />\n                            </label>\n                            <div className='col-md-5 col-sm-8'>\n                                <OAuthConnectionAudienceInput\n                                    value={this.state.url}\n                                    onChange={this.updateUrl}\n                                    placeholder={defineMessage({\n                                        id: 'add_command.url.placeholder',\n                                        defaultMessage: 'Must start with http:// or https://',\n                                    })}\n                                />\n                                <div className='form__help'>\n                                    <FormattedMessage\n                                        id='add_command.url.help'\n                                        defaultMessage='Specify the callback URL to receive the HTTP POST or GET event request when the slash command is run.'\n                                    />\n                                </div>\n                                <div className='form__help'>\n                                    <FormattedMessage\n                                        id={'add_command.outgoing_oauth_connections.help_text'}\n                                        defaultMessage={'You can connect commands to <link>outgoing OAuth connections</link>.'}\n                                        values={{\n                                            link: (text: string) => (\n                                                <a href='https://mattermost.com/pl/outgoing-oauth-connections'>{text}</a>\n                                            ),\n                                        }}\n                                    />\n                                </div>\n                            </div>\n                        </div>\n                        <div className='form-group'>\n                            <label\n                                className='control-label col-sm-4'\n                                htmlFor='method'\n                            >\n                                <FormattedMessage\n                                    id='add_command.method'\n                                    defaultMessage='Request Method'\n                                />\n                            </label>\n                            <div className='col-md-5 col-sm-8'>\n                                <select\n                                    id='method'\n                                    className='form-control'\n                                    value={this.state.method}\n                                    onChange={this.updateMethod}\n                                >\n                                    <option value={REQUEST_POST}>\n                                        {Utils.localizeMessage({id: 'add_command.method.post', defaultMessage: 'POST'})}\n                                    </option>\n                                    <option value={REQUEST_GET}>\n                                        {Utils.localizeMessage({id: 'add_command.method.get', defaultMessage: 'GET'})}\n                                    </option>\n                                </select>\n                                <div className='form__help'>\n                                    <FormattedMessage\n                                        id='add_command.method.help'\n                                        defaultMessage='Specify the type of request, either POST or GET, sent to the endpoint that Mattermost hits to reach your application.'\n                                    />\n                                </div>\n                            </div>\n                        </div>\n                        <div className='form-group'>\n                            <label\n                                className='control-label col-sm-4'\n                                htmlFor='username'\n                            >\n                                <FormattedMessage\n                                    id='add_command.username'\n                                    defaultMessage='Response Username'\n                                />\n                            </label>\n                            <div className='col-md-5 col-sm-8'>\n                                <LocalizedPlaceholderInput\n                                    id='username'\n                                    type='text'\n                                    maxLength={64}\n                                    className='form-control'\n                                    value={this.state.username}\n                                    onChange={this.updateUsername}\n                                    placeholder={defineMessage({\n                                        id: 'add_command.username.placeholder',\n                                        defaultMessage: 'Username',\n                                    })}\n                                />\n                                <div className='form__help'>\n                                    <FormattedMessage\n                                        id='add_command.username.help'\n                                        defaultMessage='(Optional) Specify the name to use when posting responses for this slash command. Usernames can be up to 22 characters, and contain lowercase letters, numbers, and the symbols \\\"-\\\", \\\"_\\\", and \\\".\\\". If left blank, your Mattermost username is used.'\n                                    />\n                                </div>\n                            </div>\n                        </div>\n                        <div className='form-group'>\n                            <label\n                                className='control-label col-sm-4'\n                                htmlFor='iconUrl'\n                            >\n                                <FormattedMessage\n                                    id='add_command.iconUrl'\n                                    defaultMessage='Response Icon'\n                                />\n                            </label>\n                            <div className='col-md-5 col-sm-8'>\n                                <LocalizedPlaceholderInput\n                                    id='iconUrl'\n                                    type='text'\n                                    maxLength={1024}\n                                    className='form-control'\n                                    value={this.state.iconUrl}\n                                    onChange={this.updateIconUrl}\n                                    placeholder={defineMessage({\n                                        id: 'add_command.iconUrl.placeholder',\n                                        defaultMessage: 'https://www.example.com/myicon.png',\n                                    })}\n                                />\n                                <div className='form__help'>\n                                    <FormattedMessage\n                                        id='add_command.iconUrl.help'\n                                        defaultMessage='(Optional) Enter the URL of a .png or .jpg file to use as the icon when posting responses to this slash command. The file must be at least 128 pixels by 128 pixels. If left blank, your profile picture is used.'\n                                    />\n                                </div>\n                            </div>\n                        </div>\n                        <div className='form-group'>\n                            <label\n                                className='control-label col-sm-4'\n                                htmlFor='autocomplete'\n                            >\n                                <FormattedMessage\n                                    id='add_command.autocomplete'\n                                    defaultMessage='Autocomplete'\n                                />\n                            </label>\n                            <div className='col-md-5 col-sm-8 checkbox'>\n                                <input\n                                    id='autocomplete'\n                                    type='checkbox'\n                                    checked={this.state.autocomplete}\n                                    onChange={this.updateAutocomplete}\n                                />\n                                <div className='form__help'>\n                                    <FormattedMessage\n                                        id='add_command.autocomplete.help'\n                                        defaultMessage='(Optional) Show your slash command on the autocomplete list when someone types \"/\" in the input box.'\n                                    />\n                                </div>\n                            </div>\n                        </div>\n                        {autocompleteHint}\n                        {autocompleteDescription}\n                        <div className='backstage-form__footer'>\n                            <FormError\n                                type='backstage'\n                                errors={[this.props.serverError, this.state.clientError]}\n                            />\n                            <Link\n                                className='btn btn-tertiary'\n                                to={'/' + this.props.team.name + '/integrations/commands'}\n                            >\n                                <FormattedMessage\n                                    id='add_command.cancel'\n                                    defaultMessage='Cancel'\n                                />\n                            </Link>\n                            <SpinnerButton\n                                className='btn btn-primary'\n                                type='submit'\n                                spinning={this.state.saving}\n                                spinningText={this.props.loading}\n                                onClick={this.handleSubmit}\n                                id='saveCommand'\n                            >\n                                {this.getBackstageFooter()}\n                            </SpinnerButton>\n                            {this.props.renderExtra}\n                        </div>\n                    </form>\n                </div>\n            </div>\n        );\n    }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React, {useState} from 'react';\nimport {useIntl} from 'react-intl';\nimport type {MessageDescriptor} from 'react-intl';\nimport {useHistory} from 'react-router-dom';\n\nimport type {Command} from '@mattermost/types/integrations';\nimport type {Team} from '@mattermost/types/teams';\n\nimport type {ActionResult} from 'mattermost-redux/types/actions.js';\n\nimport AbstractCommand from '../abstract_command';\n\nexport type Props = {\n\n    /**\n    * The team data\n    */\n    team: Team;\n\n    actions: {\n\n        /**\n        * The function to call to add new command\n        */\n        addCommand: (command: Command) => Promise<ActionResult<Command>>;\n    };\n};\n\nconst AddCommand = ({team, actions}: Props) => {\n    const history = useHistory();\n    const {formatMessage} = useIntl();\n    const headerMessage = formatMessage({id: ('integrations.add'), defaultMessage: 'Add'}) as MessageDescriptor;\n    const footerMessage = formatMessage({id: ('add_command.save'), defaultMessage: 'Save'}) as MessageDescriptor;\n    const loadingMessage = formatMessage({id: ('add_command.saving'), defaultMessage: 'Saving...'}) as MessageDescriptor;\n    const [serverError, setServerError] = useState('');\n\n    const addCommand = async (command: Command) => {\n        setServerError('');\n\n        const {data, error} = await actions.addCommand(command);\n        if (data) {\n            history.push(`/${team.name}/integrations/commands/confirm?type=commands&id=${data.id}`);\n            return;\n        }\n\n        if (error) {\n            setServerError(error.message);\n        }\n    };\n\n    return (\n        <AbstractCommand\n            team={team}\n            header={headerMessage}\n            footer={footerMessage}\n            loading={loadingMessage}\n            action={addCommand}\n            serverError={serverError}\n        />\n    );\n};\n\nexport default AddCommand;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\nimport {bindActionCreators} from 'redux';\nimport type {Dispatch} from 'redux';\n\nimport {addCommand} from 'mattermost-redux/actions/integrations';\n\nimport AddCommand from './add_command';\n\nfunction mapDispatchToProps(dispatch: Dispatch) {\n    return {\n        actions: bindActionCreators({\n            addCommand,\n        }, dispatch),\n    };\n}\n\nexport default connect(null, mapDispatchToProps)(AddCommand);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React, {useCallback} from 'react';\nimport type {MessageDescriptor} from 'react-intl';\nimport {useIntl} from 'react-intl';\n\nimport WithTooltip from 'components/with_tooltip';\n\nimport {copyToClipboard} from 'utils/utils';\n\ntype Props = {\n    label: MessageDescriptor;\n    value: string;\n};\n\nconst CopyText = ({\n    label,\n    value,\n}: Props) => {\n    const intl = useIntl();\n\n    const copyText = useCallback((e: React.MouseEvent) => {\n        e.preventDefault();\n        copyToClipboard(value);\n    }, [value]);\n\n    if (!document.queryCommandSupported('copy')) {\n        return null;\n    }\n\n    return (\n        <WithTooltip title={label}>\n            <button\n                data-testid='copyText'\n                className='btn btn-link fa fa-copy ml-2'\n                aria-label={intl.formatMessage(label)}\n                onClick={copyText}\n            />\n        </WithTooltip>\n    );\n};\n\nexport default React.memo(CopyText);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React, {useEffect} from 'react';\nimport {defineMessages, FormattedMessage} from 'react-intl';\nimport {Link, useHistory} from 'react-router-dom';\n\nimport type {Bot} from '@mattermost/types/bots';\nimport type {Command, IncomingWebhook, OAuthApp, OutgoingOAuthConnection, OutgoingWebhook} from '@mattermost/types/integrations';\nimport type {Team} from '@mattermost/types/teams';\nimport type {IDMappedObjects} from '@mattermost/types/utilities';\n\nimport BackstageHeader from 'components/backstage/components/backstage_header';\nimport CopyText from 'components/copy_text';\nimport ExternalLink from 'components/external_link';\n\nimport {Constants, DeveloperLinks, ErrorPageTypes} from 'utils/constants';\nimport {getSiteURL} from 'utils/url';\n\ntype Props = {\n    team: Team;\n    location: {search: string};\n    commands: IDMappedObjects<Command>;\n    oauthApps: IDMappedObjects<OAuthApp>;\n    incomingHooks: IDMappedObjects<IncomingWebhook>;\n    outgoingHooks: IDMappedObjects<OutgoingWebhook>;\n    bots: Record<string, Bot>;\n    outgoingOAuthConnections: Record<string, OutgoingOAuthConnection>;\n}\n\nconst ConfirmIntegration = ({team, location, commands, oauthApps, incomingHooks, outgoingHooks, bots, outgoingOAuthConnections}: Props): JSX.Element | null => {\n    const history = useHistory();\n\n    const type = (new URLSearchParams(location.search)).get('type') || '';\n    const id = (new URLSearchParams(location.search)).get('id') || '';\n\n    useEffect(() => {\n        window.addEventListener('keypress', handleKeyPress);\n\n        return () => {\n            window.removeEventListener('keypress', handleKeyPress);\n        };\n    });\n\n    const handleKeyPress = (e: KeyboardEvent) => {\n        if (e.key === 'Enter') {\n            history.push('/' + team.name + '/integrations/' + type);\n        }\n    };\n\n    let headerText: JSX.Element;\n    let helpText: JSX.Element | JSX.Element[];\n    let tokenText: JSX.Element;\n\n    const command = commands[id];\n    const incomingHook = incomingHooks[id];\n    const outgoingHook = outgoingHooks[id];\n    const oauthApp = oauthApps[id];\n    const outgoingOAuthConnection = outgoingOAuthConnections[id];\n    const bot = bots[id];\n\n    if (type === Constants.Integrations.COMMAND && command) {\n        const commandToken = command.token;\n\n        headerText = (\n            <FormattedMessage\n                id='slash_commands.header'\n                defaultMessage='Slash Commands'\n            />\n        );\n        helpText = (\n            <p>\n                <FormattedMessage\n                    id='add_command.doneHelp'\n                    defaultMessage='Your slash command is set up. The following token will be sent in the outgoing payload. Please use it to verify the request came from your Mattermost team (details at <link>Slash Commands</link>).'\n                    values={{\n                        link: (msg: string) => (\n                            <ExternalLink\n                                href={DeveloperLinks.SETUP_CUSTOM_SLASH_COMMANDS}\n                                location='confirm_integration'\n                            >\n                                {msg}\n                            </ExternalLink>\n                        ),\n                    }}\n                />\n            </p>\n        );\n        tokenText = (\n            <p className='word-break--all'>\n                <FormattedMessage\n                    id='add_command.token'\n                    defaultMessage='<b>Token</b>: {token}'\n                    values={{\n                        token: commandToken,\n                        b: (chunks: string) => <b>{chunks}</b>,\n                    }}\n                />\n                <CopyText\n                    label={messages.copyToken}\n                    value={commandToken}\n                />\n            </p>\n        );\n    } else if (type === Constants.Integrations.INCOMING_WEBHOOK && incomingHook) {\n        const incomingHookToken = getSiteURL() + '/hooks/' + incomingHook.id;\n\n        headerText = (\n            <FormattedMessage\n                id={'incoming_webhooks.header'}\n                defaultMessage='Incoming Webhooks'\n            />\n        );\n        helpText = (\n            <p>\n                <FormattedMessage\n                    id='add_incoming_webhook.doneHelp'\n                    defaultMessage='Your incoming webhook is set up. Please send data to the following URL (details at <link>Incoming Webhooks</link>).'\n                    values={{\n                        link: (msg: string) => (\n                            <ExternalLink\n                                href={DeveloperLinks.SETUP_INCOMING_WEBHOOKS}\n                                location='confirm_integration'\n                            >\n                                {msg}\n                            </ExternalLink>\n                        ),\n                    }}\n                />\n            </p>\n        );\n        tokenText = (\n            <p className='word-break--all'>\n                <FormattedMessage\n                    id='add_incoming_webhook.url'\n                    defaultMessage='<b>URL</b>: {url}'\n                    values={{\n                        url: '`' + incomingHookToken + '`',\n                        b: (chunks: string) => <b>{chunks}</b>,\n                    }}\n                />\n                <CopyText\n                    label={messages.copyToken}\n                    value={incomingHookToken}\n                />\n            </p>\n        );\n    } else if (type === Constants.Integrations.OUTGOING_WEBHOOK && outgoingHook) {\n        const outgoingHookToken = outgoingHook.token;\n\n        headerText = (\n            <FormattedMessage\n                id={'add_outgoing_webhook.header'}\n                defaultMessage='Outgoing Webhooks'\n            />\n        );\n        helpText = (\n            <p>\n                <FormattedMessage\n                    id='add_outgoing_webhook.doneHelp'\n                    defaultMessage='Your outgoing webhook is set up. The following token will be sent in the outgoing payload. Please use it to verify that the request came from your Mattermost team (details at <link>Outgoing Webhooks</link>).'\n                    values={{\n                        link: (msg: string) => (\n                            <ExternalLink\n                                href={DeveloperLinks.SETUP_OUTGOING_WEBHOOKS}\n                                location='confirm_integration'\n                            >\n                                {msg}\n                            </ExternalLink>\n                        ),\n                    }}\n                />\n            </p>\n        );\n        tokenText = (\n            <p className='word-break--all'>\n                <FormattedMessage\n                    id='add_outgoing_webhook.token'\n                    defaultMessage='<b>Token</b>: {token}'\n                    values={{\n                        token: outgoingHookToken,\n                        b: (chunks: string) => <b>{chunks}</b>,\n                    }}\n                />\n                <CopyText\n                    label={messages.copyToken}\n                    value={outgoingHookToken}\n                />\n            </p>\n        );\n    } else if (type === Constants.Integrations.OAUTH_APP && oauthApp) {\n        const oauthAppToken = oauthApp.id;\n        const oauthAppSecret = oauthApp.client_secret;\n\n        headerText = (\n            <FormattedMessage\n                id={'installed_oauth2_apps.header'}\n                defaultMessage='OAuth 2.0 Applications'\n            />\n        );\n\n        helpText = [];\n        helpText.push(\n            <p key='add_oauth_app.doneHelp'>\n                <FormattedMessage\n                    id='add_oauth_app.doneHelp'\n                    defaultMessage='Your OAuth 2.0 application is set up. Please use the following Client ID and Client Secret when requesting authorization for your application (details at <link>oAuth 2 Applications</link>).'\n                    values={{\n                        link: (msg: string) => (\n                            <ExternalLink\n                                href={DeveloperLinks.SETUP_OAUTH2}\n                                location='confirm_integration'\n                            >\n                                {msg}\n                            </ExternalLink>\n                        ),\n                    }}\n                />\n            </p>,\n        );\n        helpText.push(\n            <p key='add_oauth_app.clientId'>\n                <FormattedMessage\n                    id='add_oauth_app.clientId'\n                    defaultMessage='<b>Client ID</b>: {id}'\n                    values={{\n                        id: oauthAppToken,\n                        b: (chunks: string) => <b>{chunks}</b>,\n                    }}\n                />\n                <CopyText\n                    label={messages.copyClientId}\n                    value={oauthAppToken}\n                />\n                <br/>\n                <FormattedMessage\n                    id='add_oauth_app.clientSecret'\n                    defaultMessage='<b>Client Secret</b>: {secret}'\n                    values={{\n                        secret: oauthAppSecret,\n                        b: (chunks: string) => <b>{chunks}</b>,\n                    }}\n                />\n                <CopyText\n                    label={messages.copyClientSecret}\n                    value={oauthAppSecret}\n                />\n            </p>,\n        );\n\n        helpText.push(\n            <p key='add_oauth_app.doneUrlHelp'>\n                <FormattedMessage\n                    id='add_oauth_app.doneUrlHelp'\n                    defaultMessage='Here are your authorized redirect URLs.'\n                />\n            </p>,\n        );\n\n        tokenText = (\n            <p className='word-break--all'>\n                <FormattedMessage\n                    id='add_oauth_app.url'\n                    defaultMessage='<b>URL(s)</b>: {url}'\n                    values={{\n                        url: oauthApp.callback_urls.join(', '),\n                        b: (chunks: string) => <b>{chunks}</b>,\n                    }}\n                />\n            </p>\n        );\n    } else if (type === Constants.Integrations.OUTGOING_OAUTH_CONNECTIONS && outgoingOAuthConnection) {\n        const clientId = outgoingOAuthConnection.client_id;\n        const clientSecret = outgoingOAuthConnection.client_secret;\n        const username = outgoingOAuthConnection.credentials_username;\n        const password = outgoingOAuthConnection.credentials_password;\n\n        headerText = (\n            <FormattedMessage\n                id='installed_outgoing_oauth_connections.header'\n                defaultMessage='Outgoing OAuth 2.0 Connections'\n            />\n        );\n\n        helpText = [];\n        helpText.push(\n            <p key='add_outgoing_oauth_connection.doneHelp'>\n                <FormattedMessage\n                    id='add_outgoing_oauth_connection.doneHelp'\n                    defaultMessage='Your Outgoing OAuth 2.0 Connection is set up. When a request is sent to one of the following Audience URLs, the Client ID and Client Secret will now be used to retrieve a token from the Token URL, before sending the integration request (details at <link>Outgoing OAuth 2.0 Connections</link>).'\n                    values={{\n                        link: (msg: string) => (\n                            <ExternalLink\n                                href={DeveloperLinks.SETUP_OAUTH2} // TODO: dev docs for outgoing oauth connections feature\n                                location='confirm_integration'\n                            >\n                                {msg}\n                            </ExternalLink>\n                        ),\n                    }}\n                />\n            </p>,\n        );\n        helpText.push(\n            <p key='add_outgoing_oauth_connection.clientId'>\n                <FormattedMessage\n                    id='add_outgoing_oauth_connection.clientId'\n                    defaultMessage='<b>Client ID</b>: {id}'\n                    values={{\n                        id: clientId,\n                        b: (chunks: string) => <b>{chunks}</b>,\n                    }}\n                />\n                <br/>\n                <FormattedMessage\n                    id='add_outgoing_oauth_connection.clientSecret'\n                    defaultMessage='<b>Client Secret</b>: \\*\\*\\*\\*\\*\\*\\*\\*'\n                    values={{\n                        secret: clientSecret,\n                        b: (chunks: string) => <b>{chunks}</b>,\n                    }}\n                />\n            </p>,\n        );\n\n        if (outgoingOAuthConnection.grant_type === 'password') {\n            helpText.push(\n                <p key='add_outgoing_oauth_connection.username'>\n                    <FormattedMessage\n                        id='add_outgoing_oauth_connection.username'\n                        defaultMessage='<b>Username</b>: {username}'\n                        values={{\n                            username,\n                            b: (chunks: string) => <b>{chunks}</b>,\n                        }}\n                    />\n                    <CopyText\n                        label={messages.copyUsername}\n                        value={username || ''}\n                    />\n                    <br/>\n                    <FormattedMessage\n                        id='add_outgoing_oauth_connection.password'\n                        defaultMessage='<b>Password</b>: {password}'\n                        values={{\n                            password,\n                            b: (chunks: string) => <b>{chunks}</b>,\n                        }}\n                    />\n                </p>,\n            );\n        }\n\n        tokenText = (\n            <>\n                <p className='word-break--all'>\n                    <FormattedMessage\n                        id='add_outgoing_oauth_connection.token_url'\n                        defaultMessage='<b>Token URL</b>: `{url}`'\n                        values={{\n                            url: outgoingOAuthConnection.oauth_token_url,\n                            b: (chunks: string) => <b>{chunks}</b>,\n                        }}\n                    />\n                </p>\n                <p className='word-break--all'>\n                    <FormattedMessage\n                        id='add_outgoing_oauth_connection.audience_urls'\n                        defaultMessage='<b>Audience URL(s)</b>: `{url}`'\n                        values={{\n                            url: outgoingOAuthConnection.audiences.join(', '),\n                            b: (chunks: string) => <b>{chunks}</b>,\n                        }}\n                    />\n                </p>\n            </>\n        );\n    } else if (type === Constants.Integrations.BOT && bot) {\n        const botToken = (new URLSearchParams(location.search)).get('token') || '';\n\n        headerText = (\n            <FormattedMessage\n                id='bots.manage.header'\n                defaultMessage='Bot Accounts'\n            />\n        );\n        helpText = (\n            <p>\n                <FormattedMessage\n                    id='bots.manage.created.text'\n                    defaultMessage='Your bot account **{botname}** has been created successfully. Please use the following access token to connect to the bot (see [documentation](https://mattermost.com/pl/default-bot-accounts) for further details).'\n                    values={{\n                        botname: bot.display_name || bot.username,\n                        b: (msg: string) => <b>{msg}</b>,\n                        link: (msg: string) => (\n                            <ExternalLink\n                                href='https://mattermost.com/pl/default-bot-accounts'\n                                location='confirm_integration'\n                            >\n                                {msg}\n                            </ExternalLink>\n                        ),\n                    }}\n                />\n            </p>\n        );\n        tokenText = (\n            <p className='word-break--all'>\n                <FormattedMessage\n                    id='add_outgoing_webhook.token'\n                    defaultMessage='<b>Token</b>: {token}'\n                    values={{\n                        token: botToken,\n                        b: (chunks: string) => <b>{chunks}</b>,\n                    }}\n                />\n                <CopyText\n                    label={messages.copyToken}\n                    value={botToken}\n                />\n                <br/>\n                <br/>\n                <FormattedMessage\n                    id='add_outgoing_webhook.token.message'\n                    defaultMessage='Make sure to add this bot account to teams and channels you want it to interact in. See <link>documentation</link> to learn more.'\n                    values={{\n                        link: (msg: string) => (\n                            <ExternalLink\n                                href='https://mattermost.com/pl/default-bot-accounts'\n                                location='confirm_integration'\n                            >\n                                {msg}\n                            </ExternalLink>\n                        ),\n                    }}\n                />\n            </p>\n        );\n    } else {\n        history.replace(`/error?type=${ErrorPageTypes.PAGE_NOT_FOUND}`);\n        return null;\n    }\n\n    return (\n        <div className='backstage-content row'>\n            <BackstageHeader>\n                <Link to={'/' + team.name + '/integrations/' + type}>\n                    {headerText}\n                </Link>\n                <FormattedMessage\n                    id='integrations.add'\n                    defaultMessage='Add'\n                />\n            </BackstageHeader>\n            <div className='backstage-form backstage-form__confirmation'>\n                <h4\n                    className='backstage-form__title'\n                    id='formTitle'\n                >\n                    <FormattedMessage\n                        id='integrations.successful'\n                        defaultMessage='Setup Successful'\n                    />\n                </h4>\n                {helpText}\n                {tokenText}\n                <div className='backstage-form__footer'>\n                    <Link\n                        className='btn btn-primary'\n                        type='submit'\n                        to={'/' + team.name + '/integrations/' + type}\n                        id='doneButton'\n                    >\n                        <FormattedMessage\n                            id='integrations.done'\n                            defaultMessage='Done'\n                        />\n                    </Link>\n                </div>\n            </div>\n        </div>\n    );\n};\n\nconst messages = defineMessages({\n    copyClientId: {\n        id: 'integrations.copy_client_id',\n        defaultMessage: 'Copy Client Id',\n    },\n    copyClientSecret: {\n        id: 'integrations.copy_client_secret',\n        defaultMessage: 'Copy Client Secret',\n    },\n    copyToken: {\n        id: 'integrations.copy_token',\n        defaultMessage: 'Copy Token',\n    },\n    copyUsername: {\n        id: 'integrations.copy_username',\n        defaultMessage: 'Copy Username',\n    },\n});\n\nexport default ConfirmIntegration;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\n\nimport {getBotAccounts} from 'mattermost-redux/selectors/entities/bots';\nimport {getCommands, getOAuthApps, getIncomingHooks, getOutgoingHooks, getOutgoingOAuthConnections} from 'mattermost-redux/selectors/entities/integrations';\n\nimport type {GlobalState} from 'types/store';\n\nimport ConfirmIntegration from './confirm_integration';\n\nfunction mapStateToProps(state: GlobalState) {\n    return {\n        commands: getCommands(state),\n        oauthApps: getOAuthApps(state),\n        incomingHooks: getIncomingHooks(state),\n        outgoingHooks: getOutgoingHooks(state),\n        bots: getBotAccounts(state),\n        outgoingOAuthConnections: getOutgoingOAuthConnections(state),\n    };\n}\n\nexport default connect(mapStateToProps)(ConfirmIntegration);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {FormattedMessage, defineMessages} from 'react-intl';\n\nimport type {Command} from '@mattermost/types/integrations';\nimport type {Team} from '@mattermost/types/teams';\nimport type {RelationOneToOne} from '@mattermost/types/utilities';\n\nimport type {ActionResult} from 'mattermost-redux/types/actions';\n\nimport ConfirmModal from 'components/confirm_modal';\nimport LoadingScreen from 'components/loading_screen';\n\nimport {getHistory} from 'utils/browser_history';\n\nimport AbstractCommand from '../abstract_command';\n\nconst messages = defineMessages({\n    footer: {\n        id: 'edit_command.update',\n        defaultMessage: 'Update',\n    },\n    header: {\n        id: 'integrations.edit',\n        defaultMessage: 'Edit',\n    },\n    loading: {\n        id: 'edit_command.updating',\n        defaultMessage: 'Updating...',\n    },\n});\n\ntype Props = {\n\n    /**\n    * The current team\n    */\n    team: Team;\n\n    /**\n    * The id of the command to edit\n    */\n    commandId: string | null;\n\n    /**\n    * Installed slash commands to display\n    */\n    commands: RelationOneToOne<Command, Command>;\n    actions: {\n\n        /**\n        * The function to call to fetch team commands\n        */\n        getCustomTeamCommands: (teamId: string) => Promise<ActionResult>;\n\n        /**\n        * The function to call to edit command\n        */\n        editCommand: (command: Command) => Promise<ActionResult>;\n    };\n\n    /**\n    * Whether or not commands are enabled.\n    */\n    enableCommands: boolean;\n}\n\ntype State = {\n    originalCommand: Command | null;\n    showConfirmModal: boolean;\n    serverError: string;\n}\n\nexport default class EditCommand extends React.PureComponent<Props, State> {\n    private newCommand?: Command;\n\n    public constructor(props: Props) {\n        super(props);\n        this.newCommand = undefined;\n\n        this.state = {\n            originalCommand: null,\n            showConfirmModal: false,\n            serverError: '',\n        };\n    }\n\n    public componentDidMount(): void {\n        if (this.props.enableCommands) {\n            this.props.actions.getCustomTeamCommands(this.props.team.id).then(\n                () => {\n                    this.setState({\n                        originalCommand: Object.values(this.props.commands).filter((command) => command.id === this.props.commandId)[0],\n                    });\n                },\n            );\n        }\n    }\n\n    public editCommand = async (command: Command): Promise<void> => {\n        this.newCommand = command;\n\n        if (this.state.originalCommand?.id) {\n            command.id = this.state.originalCommand.id;\n        }\n\n        if (this.state.originalCommand?.url !== this.newCommand.url ||\n            this.state.originalCommand?.trigger !== this.newCommand.trigger ||\n            this.state.originalCommand?.method !== this.newCommand.method) {\n            this.handleConfirmModal();\n        } else {\n            await this.submitCommand();\n        }\n    };\n\n    public handleConfirmModal = (): void => {\n        this.setState({showConfirmModal: true});\n    };\n\n    public confirmModalDismissed = (): void => {\n        this.setState({showConfirmModal: false});\n    };\n\n    public submitCommand = async (): Promise<void> => {\n        this.setState({serverError: ''});\n\n        const {data, error} = await this.props.actions.editCommand(this.newCommand!);\n\n        if (data) {\n            getHistory().push(`/${this.props.team.name}/integrations/commands`);\n            return;\n        }\n\n        this.setState({showConfirmModal: false});\n\n        if (error) {\n            this.setState({serverError: error.message});\n        }\n    };\n\n    public renderExtra = (): JSX.Element => {\n        const confirmButton = (\n            <FormattedMessage\n                id='update_command.update'\n                defaultMessage='Update'\n            />\n        );\n\n        const confirmTitle = (\n            <FormattedMessage\n                id='update_command.confirm'\n                defaultMessage='Edit Slash Command'\n            />\n        );\n\n        const confirmMessage = (\n            <FormattedMessage\n                id='update_command.question'\n                defaultMessage='Your changes may break the existing slash command. Are you sure you would like to update it?'\n            />\n        );\n\n        return (\n            <ConfirmModal\n                title={confirmTitle}\n                message={confirmMessage}\n                confirmButtonText={confirmButton}\n                modalClass='integrations-backstage-modal'\n                show={this.state.showConfirmModal}\n                onConfirm={this.submitCommand}\n                onCancel={this.confirmModalDismissed}\n            />\n        );\n    };\n\n    public render(): JSX.Element {\n        if (!this.state.originalCommand) {\n            return <LoadingScreen/>;\n        }\n\n        return (\n            <AbstractCommand\n                team={this.props.team}\n                header={messages.header}\n                footer={messages.footer}\n                loading={messages.loading}\n                renderExtra={this.renderExtra()}\n                action={this.editCommand}\n                serverError={this.state.serverError}\n                initialCommand={this.state.originalCommand}\n            />\n        );\n    }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\nimport {bindActionCreators} from 'redux';\nimport type {Dispatch} from 'redux';\n\nimport type {GlobalState} from '@mattermost/types/store';\n\nimport {editCommand, getCustomTeamCommands} from 'mattermost-redux/actions/integrations';\nimport {getConfig} from 'mattermost-redux/selectors/entities/general';\nimport {getCommands} from 'mattermost-redux/selectors/entities/integrations';\n\nimport EditCommand from './edit_command';\n\ntype Props = {\n    location: Location;\n}\n\nfunction mapStateToProps(state: GlobalState, ownProps: Props) {\n    const config = getConfig(state);\n    const commandId = (new URLSearchParams(ownProps.location.search)).get('id');\n    const enableCommands = config.EnableCommands === 'true';\n\n    return {\n        commandId,\n        commands: getCommands(state),\n        enableCommands,\n    };\n}\n\nfunction mapDispatchToProps(dispatch: Dispatch) {\n    return {\n        actions: bindActionCreators({\n            getCustomTeamCommands,\n            editCommand,\n        }, dispatch),\n    };\n}\n\nexport default connect(mapStateToProps, mapDispatchToProps)(EditCommand);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {defineMessage, FormattedMessage} from 'react-intl';\nimport {Link} from 'react-router-dom';\n\nimport type {Command} from '@mattermost/types/integrations';\nimport type {Team} from '@mattermost/types/teams';\nimport type {UserProfile} from '@mattermost/types/users';\n\nimport CopyText from 'components/copy_text';\n\nimport DeleteIntegrationLink from './delete_integration_link';\n\ntype Props = {\n\n    /**\n     * The team data\n     */\n    team: Team;\n\n    /**\n     * Installed slash command to display\n     */\n    command: Command;\n\n    /**\n     * The function to call when Regenerate Token link is clicked\n     */\n    onRegenToken: (command: Command) => void ;\n\n    /**\n     * The function to call when Delete link is clicked\n     */\n    onDelete: (command: Command) => void ;\n\n    /**\n     * Set to filter command, comes from BackstageList\n     */\n    filter?: string;\n\n    /**\n     * The creator user data\n     */\n    creator: UserProfile;\n\n    /**\n     * Set to show edit link\n     */\n    canChange: boolean;\n}\n\nexport function matchesFilter(command: Command, filter?: string) {\n    if (!filter) {\n        return true;\n    }\n\n    return command.display_name.toLowerCase().indexOf(filter) !== -1 ||\n        command.description.toLowerCase().indexOf(filter) !== -1 ||\n        command.trigger.toLowerCase().indexOf(filter) !== -1;\n}\n\nexport default class InstalledCommand extends React.PureComponent<Props> {\n    handleRegenToken = (e: React.MouseEvent) => {\n        e.preventDefault();\n\n        this.props.onRegenToken(this.props.command);\n    };\n\n    handleDelete = () => {\n        this.props.onDelete(this.props.command);\n    };\n\n    render() {\n        const command = this.props.command;\n        const filter = this.props.filter ? this.props.filter.toLowerCase() : '';\n\n        if (!matchesFilter(command, filter)) {\n            return null;\n        }\n\n        let name;\n\n        if (command.display_name) {\n            name = command.display_name;\n        } else {\n            name = (\n                <FormattedMessage\n                    id='installed_commands.unnamed_command'\n                    defaultMessage='Unnamed Slash Command'\n                />\n            );\n        }\n\n        let description = null;\n        if (command.description) {\n            description = (\n                <div className='item-details__row'>\n                    <span className='item-details__description'>\n                        {command.description}\n                    </span>\n                </div>\n            );\n        }\n\n        let trigger = '- /' + command.trigger;\n        if (command.auto_complete && command.auto_complete_hint) {\n            trigger += ' ' + command.auto_complete_hint;\n        }\n\n        let actions = null;\n        if (this.props.canChange) {\n            actions = (\n                <div className='item-actions'>\n                    <button\n                        className='style--none color--link'\n                        onClick={this.handleRegenToken}\n                    >\n                        <FormattedMessage\n                            id='installed_integrations.regenToken'\n                            defaultMessage='Regenerate Token'\n                        />\n                    </button>\n                    {' - '}\n                    <Link to={`/${this.props.team.name}/integrations/commands/edit?id=${command.id}`}>\n                        <FormattedMessage\n                            id='installed_integrations.edit'\n                            defaultMessage='Edit'\n                        />\n                    </Link>\n                    {' - '}\n                    <DeleteIntegrationLink\n                        modalMessage={\n                            <FormattedMessage\n                                id='installed_commands.delete.confirm'\n                                defaultMessage='This action permanently deletes the slash command and breaks any integrations using it. Are you sure you want to delete it?'\n                            />\n                        }\n                        onDelete={this.handleDelete}\n                    />\n                </div>\n            );\n        }\n\n        const commandToken = command.token;\n\n        return (\n            <div className='backstage-list__item'>\n                <div className='item-details'>\n                    <div className='item-details__row d-flex flex-column flex-md-row justify-content-between'>\n                        <div className='item-details__name'>\n                            <strong>\n                                {name}\n                            </strong>\n                        </div>\n                        <span className='item-details__trigger'>\n                            {trigger}\n                        </span>\n                        {actions}\n                    </div>\n                    {description}\n                    <div className='item-details__row'>\n                        <span className='item-details__token'>\n                            <FormattedMessage\n                                id='installed_integrations.token'\n                                defaultMessage='Token: {token}'\n                                values={{\n                                    token: commandToken,\n                                }}\n                            />\n                            <CopyText\n                                label={defineMessage({\n                                    id: 'integrations.copy_token',\n                                    defaultMessage: 'Copy Token',\n                                })}\n                                value={commandToken}\n                            />\n                        </span>\n                    </div>\n                    <div className='item-details__row'>\n                        <span className='item-details__creation'>\n                            <FormattedMessage\n                                id='installed_integrations.creation'\n                                defaultMessage='Created by {creator} on {createAt, date, full}'\n                                values={{\n                                    creator: this.props.creator.username,\n                                    createAt: command.create_at,\n                                }}\n                            />\n                        </span>\n                    </div>\n                </div>\n            </div>\n        );\n    }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {FormattedMessage} from 'react-intl';\n\nimport type {Command} from '@mattermost/types/integrations';\nimport type {Team} from '@mattermost/types/teams';\nimport type {UserProfile} from '@mattermost/types/users';\nimport type {RelationOneToOne} from '@mattermost/types/utilities';\n\nimport type {ActionResult} from 'mattermost-redux/types/actions';\n\nimport BackstageList from 'components/backstage/components/backstage_list';\nimport ExternalLink from 'components/external_link';\n\nimport {DeveloperLinks} from 'utils/constants';\nimport * as Utils from 'utils/utils';\n\nimport InstalledCommand, {matchesFilter} from '../installed_command';\n\ntype Props = {\n    team: Team;\n    user: UserProfile;\n    users: RelationOneToOne<UserProfile, UserProfile>;\n\n    // Installed slash commands to display\n    commands: Command[];\n    loading: boolean;\n\n    // Set to allow changes to installed slash commands\n    canManageOthersSlashCommands: boolean;\n    actions: {\n\n        // The function to call when Regenerate Token link is clicked\n        regenCommandToken: (id: string) => Promise<ActionResult>;\n\n        // The function to call when Delete link is clicked\n        deleteCommand: (id: string) => Promise<ActionResult>;\n    };\n}\n\nexport default class InstalledCommands extends React.PureComponent<Props> {\n    public regenCommandToken = (command: Command): void => {\n        this.props.actions.regenCommandToken(command.id);\n    };\n\n    public deleteCommand = (command: Command): void => {\n        this.props.actions.deleteCommand(command.id);\n    };\n\n    private commandCompare(a: Command, b: Command) {\n        let nameA = a.display_name;\n        if (!nameA) {\n            nameA = Utils.localizeMessage({id: 'installed_commands.unnamed_command', defaultMessage: 'Unnamed Slash Command'});\n        }\n\n        let nameB = b.display_name;\n        if (!nameB) {\n            nameB = Utils.localizeMessage({id: 'installed_commands.unnamed_command', defaultMessage: 'Unnamed Slash Command'});\n        }\n\n        return nameA.localeCompare(nameB);\n    }\n\n    public render(): JSX.Element {\n        const commands = (filter: string) => this.props.commands.\n            filter((command) => command.team_id === this.props.team.id).\n            filter((command) => matchesFilter(command, filter)).\n            sort(this.commandCompare).map((command) => {\n                const canChange = this.props.canManageOthersSlashCommands || this.props.user.id === command.creator_id;\n\n                return (\n                    <InstalledCommand\n                        key={command.id}\n                        team={this.props.team}\n                        command={command}\n                        onRegenToken={this.regenCommandToken}\n                        onDelete={this.deleteCommand}\n                        creator={this.props.users[command.creator_id] || {}}\n                        canChange={canChange}\n                    />\n                );\n            });\n\n        return (\n            <BackstageList\n                header={\n                    <FormattedMessage\n                        id='installed_commands.header'\n                        defaultMessage='Installed Slash Commands'\n                    />\n                }\n                addText={\n                    <FormattedMessage\n                        id='installed_commands.add'\n                        defaultMessage='Add Slash Command'\n                    />\n                }\n                addLink={'/' + this.props.team.name + '/integrations/commands/add'}\n                addButtonId='addSlashCommand'\n                emptyText={\n                    <FormattedMessage\n                        id='installed_commands.empty'\n                        defaultMessage='No slash commands found'\n                    />\n                }\n                emptyTextSearch={\n                    <FormattedMessage\n                        id='installed_commands.search.empty'\n                        defaultMessage='No slash commands match <b>{searchTerm}</b>'\n                        values={{\n                            b: (chunks: string) => <b>{chunks}</b>,\n                        }}\n                    />\n                }\n                helpText={\n                    <FormattedMessage\n                        id='installed_commands.help'\n                        defaultMessage='Use slash commands to connect external tools to Mattermost. {buildYourOwn} or visit the {appDirectory} to find self-hosted, third-party apps and integrations.'\n                        values={{\n                            buildYourOwn: (\n                                <ExternalLink\n                                    href={DeveloperLinks.SETUP_CUSTOM_SLASH_COMMANDS}\n                                    location='installed_commands'\n                                >\n                                    <FormattedMessage\n                                        id='installed_commands.help.buildYourOwn'\n                                        defaultMessage='Build Your Own'\n                                    />\n                                </ExternalLink>\n                            ),\n                            appDirectory: (\n                                <ExternalLink\n                                    href='https://mattermost.com/marketplace'\n                                    location='installed_commands'\n                                >\n                                    <FormattedMessage\n                                        id='installed_commands.help.appDirectory'\n                                        defaultMessage='App Directory'\n                                    />\n                                </ExternalLink>\n                            ),\n                        }}\n                    />\n                }\n                searchPlaceholder={Utils.localizeMessage({id: 'installed_commands.search', defaultMessage: 'Search Slash Commands'})}\n                loading={this.props.loading}\n            >\n                {(filter: string) => {\n                    const children = commands(filter);\n                    return [children, children.length > 0];\n                }}\n            </BackstageList>\n        );\n    }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\nimport {bindActionCreators} from 'redux';\nimport type {Dispatch} from 'redux';\n\nimport type {GlobalState} from '@mattermost/types/store';\n\nimport {deleteCommand, regenCommandToken} from 'mattermost-redux/actions/integrations';\nimport {Permissions} from 'mattermost-redux/constants';\nimport {haveITeamPermission} from 'mattermost-redux/selectors/entities/roles';\n\nimport InstalledCommands from './installed_commands';\n\ntype Props = {\n    team: {\n        id: string;\n    };\n}\n\nfunction mapStateToProps(state: GlobalState, ownProps: Props) {\n    const canManageOthersSlashCommands = haveITeamPermission(state, ownProps.team.id, Permissions.MANAGE_OTHERS_SLASH_COMMANDS);\n\n    return {\n        canManageOthersSlashCommands,\n    };\n}\n\nfunction mapDispatchToProps(dispatch: Dispatch) {\n    return {\n        actions: bindActionCreators({\n            regenCommandToken,\n            deleteCommand,\n        }, dispatch),\n    };\n}\n\nexport default connect(mapStateToProps, mapDispatchToProps)(InstalledCommands);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {Route, Switch, Redirect} from 'react-router-dom';\n\nimport type {Command} from '@mattermost/types/integrations';\nimport type {Team} from '@mattermost/types/teams';\nimport type {UserProfile} from '@mattermost/types/users';\nimport type {RelationOneToOne} from '@mattermost/types/utilities';\n\nimport type {ActionResult} from 'mattermost-redux/types/actions';\n\nimport AddCommand from 'components/integrations/add_command';\nimport ConfirmIntegration from 'components/integrations/confirm_integration';\nimport EditCommand from 'components/integrations/edit_command';\nimport InstalledCommands from 'components/integrations/installed_commands';\n\ninterface IProps {\n    component: any;\n    extraProps: {\n        loading: boolean;\n        commands: Command[];\n        users?: RelationOneToOne<UserProfile, UserProfile>;\n        team?: Team;\n        user?: UserProfile;\n    };\n    path: string;\n}\n\nconst CommandRoute = ({component: Component, extraProps, ...rest}: IProps) => (\n    <Route\n        {...rest}\n        render={(props) => (\n            <Component\n                {...extraProps}\n                {...props}\n            />\n        )}\n    />\n);\n\ntype Props = {\n\n    /**\n     * The team data needed to pass into child components\n     */\n    team?: Team;\n\n    /**\n     * The user data needed to pass into child components\n     */\n    user?: UserProfile;\n\n    /**\n     * The users collection\n     */\n    users?: RelationOneToOne<UserProfile, UserProfile>;\n\n    /**\n     * Installed slash commands to display\n     */\n    commands: Command[];\n\n    /**\n     * Object from react-router\n     */\n    match: {\n        url: string;\n    };\n\n    actions: {\n\n        /**\n         * The function to call to fetch team commands\n         */\n        loadCommandsAndProfilesForTeam: (teamId: string) => Promise<ActionResult>;\n    };\n\n    /**\n     * Whether or not commands are enabled.\n     */\n    enableCommands?: boolean;\n};\n\ntype State = {\n    loading: boolean;\n};\n\nexport default class CommandsContainer extends React.PureComponent<Props, State> {\n    constructor(props: Props) {\n        super(props);\n        this.state = {\n            loading: true,\n        };\n    }\n\n    componentDidMount() {\n        if (this.props.enableCommands) {\n            this.props.actions.loadCommandsAndProfilesForTeam(this.props.team?.id || '').then(\n                () => this.setState({loading: false}),\n            );\n        }\n    }\n\n    render() {\n        const extraProps = {\n            loading: this.state.loading,\n            commands: this.props.commands || [],\n            users: this.props.users,\n            team: this.props.team,\n            user: this.props.user,\n        };\n        return (\n            <div>\n                <Switch>\n                    <Route\n                        exact={true}\n                        path={`${this.props.match.url}/`}\n                        render={() => (<Redirect to={`${this.props.match.url}/installed`}/>)}\n                    />\n                    <CommandRoute\n                        extraProps={extraProps}\n                        path={`${this.props.match.url}/installed`}\n                        component={InstalledCommands}\n                    />\n                    <CommandRoute\n                        extraProps={extraProps}\n                        path={`${this.props.match.url}/add`}\n                        component={AddCommand}\n                    />\n                    <CommandRoute\n                        extraProps={extraProps}\n                        path={`${this.props.match.url}/edit`}\n                        component={EditCommand}\n                    />\n                    <CommandRoute\n                        extraProps={extraProps}\n                        path={`${this.props.match.url}/confirm`}\n                        component={ConfirmIntegration}\n                    />\n                </Switch>\n            </div>\n        );\n    }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\nimport {bindActionCreators} from 'redux';\nimport type {AnyAction, Dispatch} from 'redux';\n\nimport type {GlobalState} from '@mattermost/types/store';\n\nimport {getConfig} from 'mattermost-redux/selectors/entities/general';\nimport {getCommands} from 'mattermost-redux/selectors/entities/integrations';\nimport {getUsers} from 'mattermost-redux/selectors/entities/users';\n\nimport {loadCommandsAndProfilesForTeam} from 'actions/integration_actions';\n\nimport CommandsContainer from './commands_container';\n\nfunction mapStateToProps(state: GlobalState) {\n    const config = getConfig(state);\n    const enableCommands = config.EnableCommands === 'true';\n\n    return {\n        commands: Object.values(getCommands(state)),\n        users: getUsers(state),\n        enableCommands,\n    };\n}\n\nfunction mapDispatchToProps(dispatch: Dispatch<AnyAction>) {\n    return {\n        actions: bindActionCreators({\n            loadCommandsAndProfilesForTeam,\n        }, dispatch),\n    };\n}\n\nexport default connect(mapStateToProps, mapDispatchToProps)(CommandsContainer);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {defineMessages} from 'react-intl';\n\nimport type {IncomingWebhook} from '@mattermost/types/integrations';\nimport type {Team} from '@mattermost/types/teams';\n\nimport type {ActionResult} from 'mattermost-redux/types/actions';\n\nimport AbstractIncomingWebhook from 'components/integrations/abstract_incoming_webhook';\nimport LoadingScreen from 'components/loading_screen';\n\nimport {getHistory} from 'utils/browser_history';\n\nconst messages = defineMessages({\n    footer: {\n        id: 'update_incoming_webhook.update',\n        defaultMessage: 'Update',\n    },\n    header: {\n        id: 'integrations.edit',\n        defaultMessage: 'Edit',\n    },\n    loading: {\n        id: 'update_incoming_webhook.updating',\n        defaultMessage: 'Updating...',\n    },\n});\n\ntype Props = {\n\n    /**\n     * The current team\n     */\n    team: Team;\n\n    /**\n     * The incoming webhook to edit\n     */\n    hook?: IncomingWebhook;\n\n    /**\n     * The id of the incoming webhook to edit\n     */\n    hookId: string;\n\n    /**\n     * Whether or not incoming webhooks are enabled.\n     */\n    enableIncomingWebhooks: boolean;\n\n    /**\n     * Whether to allow configuration of the default post username.\n     */\n    enablePostUsernameOverride: boolean;\n\n    /**\n     * Whether to allow configuration of the default post icon.\n     */\n    enablePostIconOverride: boolean;\n\n    actions: {\n\n        /**\n         * The function to call to update an incoming webhook\n         */\n        updateIncomingHook: (hook: IncomingWebhook) => Promise<ActionResult>;\n\n        /**\n         * The function to call to get an incoming webhook\n         */\n        getIncomingHook: (hookId: string) => Promise<ActionResult>;\n    };\n};\n\ntype State = {\n    serverError: string;\n};\n\nexport default class EditIncomingWebhook extends React.PureComponent<Props, State> {\n    private newHook?: IncomingWebhook;\n\n    constructor(props: Props) {\n        super(props);\n\n        this.state = {\n            serverError: '',\n        };\n    }\n\n    componentDidMount() {\n        if (this.props.enableIncomingWebhooks) {\n            this.props.actions.getIncomingHook(this.props.hookId);\n        }\n    }\n\n    editIncomingHook = async (hook: IncomingWebhook) => {\n        this.newHook = hook;\n\n        if (this.props.hook?.id) {\n            hook.id = this.props.hook.id;\n        }\n\n        await this.submitHook();\n    };\n\n    submitHook = async () => {\n        this.setState({serverError: ''});\n\n        if (!this.newHook) {\n            return;\n        }\n\n        const result = await this.props.actions.updateIncomingHook(this.newHook);\n\n        if ('data' in result) {\n            getHistory().push(`/${this.props.team.name}/integrations/incoming_webhooks`);\n            return;\n        }\n\n        if ('error' in result) {\n            const {error} = result;\n            this.setState({serverError: error.message});\n        }\n    };\n\n    render() {\n        if (!this.props.hook) {\n            return <LoadingScreen/>;\n        }\n\n        return (\n            <AbstractIncomingWebhook\n                team={this.props.team}\n                header={messages.header}\n                footer={messages.footer}\n                loading={messages.loading}\n                enablePostUsernameOverride={this.props.enablePostUsernameOverride}\n                enablePostIconOverride={this.props.enablePostIconOverride}\n                action={this.editIncomingHook}\n                serverError={this.state.serverError}\n                initialHook={this.props.hook}\n            />\n        );\n    }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\nimport {bindActionCreators} from 'redux';\nimport type {Dispatch} from 'redux';\n\nimport type {GlobalState} from '@mattermost/types/store';\n\nimport {getIncomingHook, updateIncomingHook} from 'mattermost-redux/actions/integrations';\nimport {getConfig} from 'mattermost-redux/selectors/entities/general';\n\nimport EditIncomingWebhook from './edit_incoming_webhook';\n\ntype Props = {\n    location: Location;\n}\n\nfunction mapStateToProps(state: GlobalState, ownProps: Props) {\n    const config = getConfig(state);\n    const enableIncomingWebhooks = config.EnableIncomingWebhooks === 'true';\n    const enablePostUsernameOverride = config.EnablePostUsernameOverride === 'true';\n    const enablePostIconOverride = config.EnablePostIconOverride === 'true';\n    const hookId = (new URLSearchParams(ownProps.location.search)).get('id') || '';\n\n    return {\n        hookId,\n        hook: state.entities.integrations.incomingHooks[hookId],\n        enableIncomingWebhooks,\n        enablePostUsernameOverride,\n        enablePostIconOverride,\n    };\n}\n\nfunction mapDispatchToProps(dispatch: Dispatch) {\n    return {\n        actions: bindActionCreators({\n            updateIncomingHook,\n            getIncomingHook,\n        }, dispatch),\n    };\n}\n\nexport default connect(mapStateToProps, mapDispatchToProps)(EditIncomingWebhook);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {FormattedMessage} from 'react-intl';\n\nimport type {OAuthApp} from '@mattermost/types/integrations';\nimport type {Team} from '@mattermost/types/teams';\n\nimport type {ActionResult} from 'mattermost-redux/types/actions';\n\nimport ConfirmModal from 'components/confirm_modal';\nimport LoadingScreen from 'components/loading_screen';\n\nimport {getHistory} from 'utils/browser_history';\n\nimport AbstractOAuthApp from '../abstract_oauth_app';\n\nconst HEADER = {id: 'integrations.edit', defaultMessage: 'Edit'};\nconst FOOTER = {id: 'update_incoming_webhook.update', defaultMessage: 'Update'};\nconst LOADING = {id: 'update_incoming_webhook.updating', defaultMessage: 'Updating...'};\n\ntype Actions = {\n    getOAuthApp: (id: string) => void;\n    editOAuthApp: (app: OAuthApp) => Promise<ActionResult>;\n};\n\ntype Props = {\n    team: Team;\n    oauthAppId: string;\n    oauthApp: OAuthApp;\n    actions: Actions;\n    enableOAuthServiceProvider: boolean;\n};\n\ntype State = {\n    showConfirmModal: boolean;\n    serverError: string;\n};\n\nexport default class EditOAuthApp extends React.PureComponent<Props, State> {\n    newApp: OAuthApp;\n\n    constructor(props: Props) {\n        super(props);\n\n        this.state = {\n            showConfirmModal: false,\n            serverError: '',\n        };\n        this.newApp = this.props.oauthApp;\n    }\n\n    componentDidMount() {\n        if (this.props.enableOAuthServiceProvider) {\n            this.props.actions.getOAuthApp(this.props.oauthAppId);\n        }\n    }\n\n    editOAuthApp = async (app: OAuthApp) => {\n        this.newApp = app;\n\n        if (this.props.oauthApp.id) {\n            app.id = this.props.oauthApp.id;\n        }\n\n        const callbackUrlsSame = (this.props.oauthApp.callback_urls.length === app.callback_urls.length) &&\n            this.props.oauthApp.callback_urls.every((v, i) => v === app.callback_urls[i]);\n\n        if (callbackUrlsSame === false) {\n            this.handleConfirmModal();\n        } else {\n            await this.submitOAuthApp();\n        }\n    };\n\n    handleConfirmModal = () => {\n        this.setState({showConfirmModal: true});\n    };\n\n    confirmModalDismissed = () => {\n        this.setState({showConfirmModal: false});\n    };\n\n    submitOAuthApp = async () => {\n        this.setState({serverError: ''});\n\n        const res = await this.props.actions.editOAuthApp(this.newApp);\n\n        if ('data' in res && res.data) {\n            getHistory().push(`/${this.props.team.name}/integrations/oauth2-apps`);\n            return;\n        }\n\n        this.setState({showConfirmModal: false});\n\n        if ('error' in res) {\n            const {error: err} = res;\n            this.setState({serverError: err.message});\n        }\n    };\n\n    renderExtra = () => {\n        const confirmButton = (\n            <FormattedMessage\n                id='update_command.update'\n                defaultMessage='Update'\n            />\n        );\n\n        const confirmTitle = (\n            <FormattedMessage\n                id='update_oauth_app.confirm'\n                defaultMessage='Edit OAuth 2.0 application'\n            />\n        );\n\n        const confirmMessage = (\n            <FormattedMessage\n                id='update_oauth_app.question'\n                defaultMessage='Your changes may break the existing OAuth 2.0 application. Are you sure you would like to update it?'\n            />\n        );\n\n        return (\n            <ConfirmModal\n                title={confirmTitle}\n                message={confirmMessage}\n                confirmButtonText={confirmButton}\n                modalClass='integrations-backstage-modal'\n                show={this.state.showConfirmModal}\n                onConfirm={this.submitOAuthApp}\n                onCancel={this.confirmModalDismissed}\n            />\n        );\n    };\n\n    render() {\n        if (!this.props.oauthApp) {\n            return <LoadingScreen/>;\n        }\n\n        return (\n            <AbstractOAuthApp\n                team={this.props.team}\n                header={HEADER}\n                footer={FOOTER}\n                loading={LOADING}\n                renderExtra={this.renderExtra()}\n                action={this.editOAuthApp}\n                serverError={this.state.serverError}\n                initialApp={this.props.oauthApp}\n            />\n        );\n    }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\n// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\nimport {bindActionCreators} from 'redux';\nimport type {Dispatch} from 'redux';\n\nimport type {GlobalState} from '@mattermost/types/store';\n\nimport {getOAuthApp, editOAuthApp} from 'mattermost-redux/actions/integrations';\nimport {getConfig} from 'mattermost-redux/selectors/entities/general';\n\nimport EditOAuthApp from './edit_oauth_app';\n\ntype Props = {\n    location: Location;\n};\n\nfunction mapStateToProps(state: GlobalState, ownProps: Props) {\n    const config = getConfig(state);\n    const oauthAppId: string = (new URLSearchParams(ownProps.location.search)).get('id') || '';\n    const enableOAuthServiceProvider = config.EnableOAuthServiceProvider === 'true';\n\n    return {\n        oauthAppId,\n        oauthApp: state.entities.integrations.oauthApps[oauthAppId],\n        enableOAuthServiceProvider,\n    };\n}\n\nfunction mapDispatchToProps(dispatch: Dispatch) {\n    return {\n        actions: bindActionCreators({\n            getOAuthApp,\n            editOAuthApp,\n        }, dispatch),\n    };\n}\n\nexport default connect(mapStateToProps, mapDispatchToProps)(EditOAuthApp);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {FormattedMessage} from 'react-intl';\n\nimport type {OutgoingWebhook} from '@mattermost/types/integrations';\nimport type {Team} from '@mattermost/types/teams';\n\nimport type {ActionResult} from 'mattermost-redux/types/actions';\n\nimport ConfirmModal from 'components/confirm_modal';\nimport AbstractOutgoingWebhook from 'components/integrations/abstract_outgoing_webhook';\nimport LoadingScreen from 'components/loading_screen';\n\nimport {getHistory} from 'utils/browser_history';\n\nconst HEADER = {id: 'integrations.edit', defaultMessage: 'Edit'};\nconst FOOTER = {id: 'update_outgoing_webhook.update', defaultMessage: 'Update'};\nconst LOADING = {id: 'update_outgoing_webhook.updating', defaultMessage: 'Updating...'};\n\nexport interface Props {\n\n    /**\n     * The current team\n     */\n    team: Team;\n\n    /**\n     * The outgoing webhook to edit\n     */\n    hook?: OutgoingWebhook;\n\n    /**\n     * The id of the outgoing webhook to edit\n     */\n    hookId: string;\n    actions: {\n\n        /**\n         * The function to call to update an outgoing webhook\n         */\n        updateOutgoingHook: (hook: OutgoingWebhook) => Promise<ActionResult<OutgoingWebhook>>;\n\n        /**\n         * The function to call to get an outgoing webhook\n         */\n        getOutgoingHook: (hookId: string) => Promise<ActionResult<OutgoingWebhook>>;\n    };\n\n    /**\n     * Whether or not outgoing webhooks are enabled.\n     */\n    enableOutgoingWebhooks?: boolean;\n\n    /**\n     * Whether to allow configuration of the default post username.\n     */\n    enablePostUsernameOverride: boolean;\n\n    /**\n     * Whether to allow configuration of the default post icon.\n     */\n    enablePostIconOverride: boolean;\n}\n\ninterface State {\n    showConfirmModal: boolean;\n    serverError: string;\n}\n\nexport default class EditOutgoingWebhook extends React.PureComponent<Props, State> {\n    private newHook: OutgoingWebhook | undefined;\n\n    constructor(props: Props) {\n        super(props);\n        this.state = {\n            showConfirmModal: false,\n            serverError: '',\n        };\n    }\n\n    componentDidMount(): void {\n        if (this.props.enableOutgoingWebhooks) {\n            this.props.actions.getOutgoingHook(this.props.hookId);\n        }\n    }\n\n    editOutgoingHook = async (hook: OutgoingWebhook): Promise<void> => {\n        this.newHook = hook;\n\n        if (this.props.hook!.id) {\n            hook.id = this.props.hook!.id;\n        }\n\n        if (this.props.hook!.token) {\n            hook.token = this.props.hook!.token;\n        }\n\n        const triggerWordsSame = (this.props.hook!.trigger_words.length === hook!.trigger_words.length) &&\n            this.props.hook!.trigger_words.every((v, i) => v === hook.trigger_words[i]);\n\n        const callbackUrlsSame = (this.props.hook!.callback_urls.length === hook!.callback_urls.length) &&\n            this.props.hook!.callback_urls.every((v, i) => v === hook.callback_urls[i]);\n\n        if (this.props.hook!.content_type !== hook.content_type ||\n            !triggerWordsSame || !callbackUrlsSame) {\n            this.handleConfirmModal();\n        } else {\n            await this.submitHook();\n        }\n    };\n\n    handleConfirmModal = (): void => {\n        this.setState({showConfirmModal: true});\n    };\n\n    confirmModalDismissed = (): void => {\n        this.setState({showConfirmModal: false});\n    };\n\n    submitHook = async (): Promise<void> => {\n        this.setState({serverError: ''});\n\n        const {data, error} = await this.props.actions.updateOutgoingHook(this.newHook!);\n\n        if (data) {\n            getHistory().push(`/${this.props.team.name}/integrations/outgoing_webhooks`);\n            return;\n        }\n\n        this.setState({showConfirmModal: false});\n\n        if (error) {\n            this.setState({serverError: error.message});\n        }\n    };\n\n    renderExtra = (): JSX.Element => {\n        const confirmButton = (\n            <FormattedMessage\n                id='update_outgoing_webhook.update'\n                defaultMessage='Update'\n            />\n        );\n\n        const confirmTitle = (\n            <FormattedMessage\n                id='update_outgoing_webhook.confirm'\n                defaultMessage='Edit Outgoing Webhook'\n            />\n        );\n\n        const confirmMessage = (\n            <FormattedMessage\n                id='update_outgoing_webhook.question'\n                defaultMessage='Your changes may break the existing outgoing webhook. Are you sure you would like to update it?'\n            />\n        );\n\n        return (\n            <ConfirmModal\n                title={confirmTitle}\n                message={confirmMessage}\n                confirmButtonText={confirmButton}\n                modalClass='integrations-backstage-modal'\n                show={this.state.showConfirmModal}\n                onConfirm={this.submitHook}\n                onCancel={this.confirmModalDismissed}\n            />\n        );\n    };\n\n    render(): JSX.Element {\n        if (!this.props.hook) {\n            return <LoadingScreen/>;\n        }\n\n        return (\n            <AbstractOutgoingWebhook\n                team={this.props.team}\n                header={HEADER}\n                footer={FOOTER}\n                loading={LOADING}\n                renderExtra={this.renderExtra()}\n                action={this.editOutgoingHook}\n                serverError={this.state.serverError}\n                initialHook={this.props.hook}\n                enablePostUsernameOverride={this.props.enablePostUsernameOverride}\n                enablePostIconOverride={this.props.enablePostIconOverride}\n            />\n        );\n    }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\nimport {bindActionCreators} from 'redux';\nimport type {Dispatch} from 'redux';\n\nimport type {GlobalState} from '@mattermost/types/store';\n\nimport {getOutgoingHook, updateOutgoingHook} from 'mattermost-redux/actions/integrations';\nimport {getConfig} from 'mattermost-redux/selectors/entities/general';\n\nimport EditOutgoingWebhook from './edit_outgoing_webhook';\n\ntype OwnProps = {\n    location: {\n        search: string | string[][] | Record<string, string> | URLSearchParams | undefined;\n    };\n}\n\nfunction mapStateToProps(state: GlobalState, ownProps: OwnProps) {\n    const config = getConfig(state);\n    const hookId = (new URLSearchParams(ownProps.location.search)).get('id');\n    const enableOutgoingWebhooks = config.EnableOutgoingWebhooks === 'true';\n    const enablePostUsernameOverride = config.EnablePostUsernameOverride === 'true';\n    const enablePostIconOverride = config.EnablePostIconOverride === 'true';\n\n    return {\n        hookId: hookId!,\n        hook: state.entities.integrations.outgoingHooks[hookId!],\n        enableOutgoingWebhooks,\n        enablePostUsernameOverride,\n        enablePostIconOverride,\n    };\n}\n\nfunction mapDispatchToProps(dispatch: Dispatch) {\n    return {\n        actions: bindActionCreators({\n            updateOutgoingHook,\n            getOutgoingHook,\n        }, dispatch),\n    };\n}\n\nexport default connect(mapStateToProps, mapDispatchToProps)(EditOutgoingWebhook);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {defineMessage, FormattedMessage} from 'react-intl';\nimport {Link} from 'react-router-dom';\n\nimport type {Channel} from '@mattermost/types/channels';\nimport type {IncomingWebhook} from '@mattermost/types/integrations';\nimport type {Team} from '@mattermost/types/teams';\n\nimport CopyText from 'components/copy_text';\n\nimport {getSiteURL} from 'utils/url';\n\nimport DeleteIntegrationLink from './delete_integration_link';\n\nexport function matchesFilter(incomingWebhook: IncomingWebhook, channel: Channel, filter: string) {\n    if (!filter) {\n        return true;\n    }\n\n    if (incomingWebhook.display_name.toLowerCase().indexOf(filter) !== -1 ||\n        incomingWebhook.description.toLowerCase().indexOf(filter) !== -1) {\n        return true;\n    }\n\n    if (incomingWebhook.channel_id) {\n        if (channel && channel.name.toLowerCase().indexOf(filter) !== -1) {\n            return true;\n        }\n    }\n\n    return false;\n}\n\ntype Props = {\n\n    /**\n     * Data used for showing webhook details\n     */\n    incomingWebhook: IncomingWebhook;\n\n    /**\n     * Function to call when webhook delete button is pressed\n     */\n    onDelete: (incomingWebhook: IncomingWebhook) => void;\n\n    /**\n     * String used for filtering webhook item\n     */\n    filter?: string;\n\n    /**\n     * Data used for showing created by details\n     */\n    creator: {\n        username: string;\n    };\n\n    /**\n     *  Set to show available actions on webhook\n     */\n    canChange: boolean;\n\n    /**\n     *  Data used in routing of webhook for modifications\n     */\n    team: Team;\n\n    /**\n     *  Data used for filtering of webhook based on filter prop\n     */\n    channel: Channel;\n}\n\nexport default class InstalledIncomingWebhook extends React.PureComponent<Props> {\n    handleDelete = () => {\n        this.props.onDelete(this.props.incomingWebhook);\n    };\n\n    render() {\n        const incomingWebhook = this.props.incomingWebhook;\n        const channel = this.props.channel;\n        const filter = this.props.filter ? this.props.filter.toLowerCase() : '';\n\n        if (!matchesFilter(incomingWebhook, channel, filter)) {\n            return null;\n        }\n\n        let displayName;\n        if (incomingWebhook.display_name) {\n            displayName = incomingWebhook.display_name;\n        } else if (channel) {\n            displayName = channel.display_name;\n        } else {\n            displayName = (\n                <FormattedMessage\n                    id='installed_incoming_webhooks.unknown_channel'\n                    defaultMessage='A Private Webhook'\n                />\n            );\n        }\n\n        let description = null;\n        if (incomingWebhook.description) {\n            description = (\n                <div className='item-details__row'>\n                    <span className='item-details__description'>\n                        {incomingWebhook.description}\n                    </span>\n                </div>\n            );\n        }\n\n        let actions = null;\n        if (this.props.canChange) {\n            actions = (\n                <div className='item-actions'>\n                    <Link to={`/${this.props.team.name}/integrations/incoming_webhooks/edit?id=${incomingWebhook.id}`}>\n                        <FormattedMessage\n                            id='installed_integrations.edit'\n                            defaultMessage='Edit'\n                        />\n                    </Link>\n                    {' - '}\n                    <DeleteIntegrationLink\n                        modalMessage={\n                            <FormattedMessage\n                                id='installed_incoming_webhooks.delete.confirm'\n                                defaultMessage='This action permanently deletes the incoming webhook and breaks any integrations using it. Are you sure you want to delete it?'\n                            />\n                        }\n                        onDelete={this.handleDelete}\n                    />\n                </div>\n            );\n        }\n\n        const incomingWebhookId = getSiteURL() + '/hooks/' + incomingWebhook.id;\n\n        return (\n            <div className='backstage-list__item'>\n                <div className='item-details'>\n                    <div className='item-details__row d-flex flex-column flex-md-row justify-content-between'>\n                        <strong className='item-details__name'>\n                            {displayName}\n                        </strong>\n                        {actions}\n                    </div>\n                    {description}\n                    <div className='item-details__row'>\n                        <span className='item-details__url word-break--all'>\n                            <FormattedMessage\n                                id='installed_integrations.url'\n                                defaultMessage='URL: {url}'\n                                values={{\n                                    url: incomingWebhookId,\n                                }}\n                            />\n                            <span>\n                                <CopyText\n                                    label={defineMessage({\n                                        id: 'integrations.copy_url',\n                                        defaultMessage: 'Copy URL',\n                                    })}\n                                    value={incomingWebhookId}\n                                />\n                            </span>\n                        </span>\n                    </div>\n                    <div className='item-details__row'>\n                        <span className='item-details__creation'>\n                            <FormattedMessage\n                                id='installed_integrations.creation'\n                                defaultMessage='Created by {creator} on {createAt, date, full}'\n                                values={{\n                                    creator: this.props.creator.username,\n                                    createAt: incomingWebhook.create_at,\n                                }}\n                            />\n                        </span>\n                    </div>\n                </div>\n            </div>\n        );\n    }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {FormattedMessage} from 'react-intl';\n\nimport type {Channel} from '@mattermost/types/channels';\nimport type {IncomingWebhook, IncomingWebhooksWithCount} from '@mattermost/types/integrations';\nimport type {Team} from '@mattermost/types/teams';\nimport type {UserProfile} from '@mattermost/types/users';\nimport type {IDMappedObjects} from '@mattermost/types/utilities';\n\nimport type {ActionResult} from 'mattermost-redux/types/actions';\n\nimport BackstageList from 'components/backstage/components/backstage_list';\nimport ExternalLink from 'components/external_link';\nimport InstalledIncomingWebhook, {matchesFilter} from 'components/integrations/installed_incoming_webhook';\n\nimport {DeveloperLinks} from 'utils/constants';\nimport * as Utils from 'utils/utils';\n\nconst PAGE_SIZE = 200;\n\ntype Props = {\n    team: Team;\n    user: UserProfile;\n    incomingHooks: IncomingWebhook[];\n    incomingHooksTotalCount: number;\n    channels: IDMappedObjects<Channel>;\n    users: IDMappedObjects<UserProfile>;\n    canManageOthersWebhooks: boolean;\n    enableIncomingWebhooks: boolean;\n    actions: {\n        removeIncomingHook: (hookId: string) => Promise<ActionResult>;\n        loadIncomingHooksAndProfilesForTeam: (teamId: string, startPageNumber: number,\n            pageSize: number, includeTotalCount: boolean) => Promise<ActionResult<IncomingWebhook[] | IncomingWebhooksWithCount>>;\n    };\n}\n\ntype State = {\n    page: number;\n    loading: boolean;\n}\n\nexport default class InstalledIncomingWebhooks extends React.PureComponent<Props, State> {\n    constructor(props: Props) {\n        super(props);\n\n        this.state = {\n            page: 0,\n            loading: true,\n        };\n    }\n\n    componentDidMount() {\n        this.loadPage(0);\n    }\n\n    deleteIncomingWebhook = (incomingWebhook: IncomingWebhook) => {\n        this.props.actions.removeIncomingHook(incomingWebhook.id);\n    };\n\n    loadPage = async (pageToLoad: number) => {\n        if (this.props.enableIncomingWebhooks) {\n            this.setState({loading: true},\n                async () => {\n                    await this.props.actions.loadIncomingHooksAndProfilesForTeam(\n                        this.props.team.id,\n                        pageToLoad,\n                        PAGE_SIZE,\n                        true,\n                    );\n                    this.setState({page: pageToLoad, loading: false});\n                },\n            );\n        }\n    };\n\n    nextPage = () => {\n        this.loadPage(this.state.page + 1);\n    };\n\n    previousPage = () => {\n        this.loadPage(this.state.page - 1);\n    };\n\n    incomingWebhookCompare = (a: IncomingWebhook, b: IncomingWebhook) => {\n        let displayNameA = a.display_name;\n        if (!displayNameA) {\n            const channelA = this.props.channels[a.channel_id];\n            if (channelA) {\n                displayNameA = channelA.display_name;\n            } else {\n                displayNameA = Utils.localizeMessage({id: 'installed_incoming_webhooks.unknown_channel', defaultMessage: 'A Private Webhook'});\n            }\n        }\n\n        const displayNameB = b.display_name;\n        return displayNameA.localeCompare(displayNameB);\n    };\n\n    incomingWebhooks = (filter: string) => this.props.incomingHooks.\n        sort(this.incomingWebhookCompare).\n        filter((incomingWebhook: IncomingWebhook) => matchesFilter(incomingWebhook, this.props.channels[incomingWebhook.channel_id], filter)).\n        map((incomingWebhook: IncomingWebhook) => {\n            const canChange = this.props.canManageOthersWebhooks || this.props.user.id === incomingWebhook.user_id;\n            const channel = this.props.channels[incomingWebhook.channel_id];\n            return (\n                <InstalledIncomingWebhook\n                    key={incomingWebhook.id}\n                    incomingWebhook={incomingWebhook}\n                    onDelete={this.deleteIncomingWebhook}\n                    creator={this.props.users[incomingWebhook.user_id] || {}}\n                    canChange={canChange}\n                    team={this.props.team}\n                    channel={channel}\n                />\n            );\n        });\n\n    render() {\n        return (\n            <BackstageList\n                header={\n                    <FormattedMessage\n                        id='installed_incoming_webhooks.header'\n                        defaultMessage='Installed Incoming Webhooks'\n                    />\n                }\n                addText={\n                    <FormattedMessage\n                        id='installed_incoming_webhooks.add'\n                        defaultMessage='Add Incoming Webhook'\n                    />\n                }\n                addLink={'/' + this.props.team.name + '/integrations/incoming_webhooks/add'}\n                addButtonId='addIncomingWebhook'\n                emptyText={\n                    <FormattedMessage\n                        id='installed_incoming_webhooks.empty'\n                        defaultMessage='No incoming webhooks found'\n                    />\n                }\n                emptyTextSearch={\n                    <FormattedMessage\n                        id='installed_incoming_webhooks.emptySearch'\n                        defaultMessage='No incoming webhooks match {searchTerm}'\n                    />\n                }\n                helpText={\n                    <FormattedMessage\n                        id='installed_incoming_webhooks.help'\n                        defaultMessage='Use incoming webhooks to connect external tools to Mattermost. {buildYourOwn} or visit the {appDirectory} to find self-hosted, third-party apps and integrations.'\n                        values={{\n                            buildYourOwn: (\n                                <ExternalLink\n                                    location='installed_incoming_webhooks'\n                                    href={DeveloperLinks.SETUP_INCOMING_WEBHOOKS}\n                                >\n                                    <FormattedMessage\n                                        id='installed_incoming_webhooks.help.buildYourOwn'\n                                        defaultMessage='Build Your Own'\n                                    />\n                                </ExternalLink>\n                            ),\n                            appDirectory: (\n                                <ExternalLink\n                                    href='https://mattermost.com/marketplace'\n                                    location='installed_incoming_webhooks'\n                                >\n                                    <FormattedMessage\n                                        id='installed_incoming_webhooks.help.appDirectory'\n                                        defaultMessage='App Directory'\n                                    />\n                                </ExternalLink>\n                            ),\n                        }}\n                    />\n                }\n                searchPlaceholder={Utils.localizeMessage({id: 'installed_incoming_webhooks.search', defaultMessage: 'Search Incoming Webhooks'})}\n                loading={this.state.loading}\n                nextPage={this.nextPage}\n                previousPage={this.previousPage}\n                page={this.state.page}\n                pageSize={PAGE_SIZE}\n                total={this.props.incomingHooksTotalCount}\n            >\n                {(filter: string) => {\n                    const children = this.incomingWebhooks(filter);\n                    return [children, children.length > 0];\n                }}\n            </BackstageList>\n        );\n    }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\nimport {bindActionCreators} from 'redux';\nimport type {Dispatch} from 'redux';\n\nimport type {GlobalState} from '@mattermost/types/store';\n\nimport {removeIncomingHook} from 'mattermost-redux/actions/integrations';\nimport {Permissions} from 'mattermost-redux/constants';\nimport {getAllChannels} from 'mattermost-redux/selectors/entities/channels';\nimport {getConfig} from 'mattermost-redux/selectors/entities/general';\nimport {getFilteredIncomingHooks, getIncomingHooksTotalCount} from 'mattermost-redux/selectors/entities/integrations';\nimport {haveITeamPermission} from 'mattermost-redux/selectors/entities/roles';\nimport {getCurrentTeamId} from 'mattermost-redux/selectors/entities/teams';\nimport {getUsers} from 'mattermost-redux/selectors/entities/users';\n\nimport {loadIncomingHooksAndProfilesForTeam} from 'actions/integration_actions';\n\nimport InstalledIncomingWebhooks from './installed_incoming_webhooks';\n\nfunction mapStateToProps(state: GlobalState) {\n    const teamId = getCurrentTeamId(state);\n    const incomingHooks = getFilteredIncomingHooks(state);\n    const incomingHooksTotalCount = getIncomingHooksTotalCount(state);\n    const config = getConfig(state);\n    const canManageOthersWebhooks = haveITeamPermission(state, teamId, Permissions.MANAGE_OTHERS_INCOMING_WEBHOOKS);\n    const enableIncomingWebhooks = config.EnableIncomingWebhooks === 'true';\n\n    return {\n        incomingHooks,\n        incomingHooksTotalCount,\n        channels: getAllChannels(state),\n        users: getUsers(state),\n        canManageOthersWebhooks,\n        enableIncomingWebhooks,\n    };\n}\n\nfunction mapDispatchToProps(dispatch: Dispatch) {\n    return {\n        actions: bindActionCreators({\n            loadIncomingHooksAndProfilesForTeam,\n            removeIncomingHook,\n        }, dispatch),\n    };\n}\n\nexport default connect(mapStateToProps, mapDispatchToProps)(InstalledIncomingWebhooks);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {defineMessages, FormattedMessage} from 'react-intl';\nimport {Link} from 'react-router-dom';\n\nimport type {OAuthApp} from '@mattermost/types/integrations';\nimport type {Team} from '@mattermost/types/teams';\n\nimport CopyText from 'components/copy_text';\nimport FormError from 'components/form_error';\n\nimport DeleteIntegrationLink from '../delete_integration_link';\n\nconst FAKE_SECRET = '***************';\n\nexport function matchesFilter(oauthApp: OAuthApp, filter?: string | null): boolean {\n    if (!filter) {\n        return true;\n    }\n\n    return oauthApp.name.toLowerCase().includes(filter);\n}\n\nexport type InstalledOAuthAppProps = {\n\n    /**\n     * The team data\n     */\n    team?: Team;\n\n    /**\n     * The oauthApp data\n     */\n    oauthApp: OAuthApp;\n\n    /**\n     * Whether the oauth app is created by an App\n     */\n    fromApp: boolean;\n\n    creatorName: string;\n\n    /**\n     * The function to call when Regenerate Secret link is clicked\n     */\n    onRegenerateSecret: (oauthAppId: string) => Promise<{ error?: { message: string } }>;\n\n    /**\n     * The function to call when Delete link is clicked\n     */\n    onDelete: (oauthApp: OAuthApp) => void;\n\n    /**\n     * Set to filter OAuthApp\n     */\n    filter?: string | null;\n}\n\nexport type InstalleOAuthAppState = {\n    clientSecret: string;\n    error?: string | null;\n}\n\nexport default class InstalledOAuthApp extends React.PureComponent<InstalledOAuthAppProps, InstalleOAuthAppState> {\n    constructor(props: InstalledOAuthAppProps) {\n        super(props);\n\n        this.state = {\n            clientSecret: FAKE_SECRET,\n        };\n    }\n\n    handleShowClientSecret = (e?: React.MouseEvent): void => {\n        if (e && e.preventDefault) {\n            e.preventDefault();\n        }\n        this.setState({clientSecret: this.props.oauthApp.client_secret});\n    };\n\n    handleHideClientSecret = (e: React.MouseEvent): void => {\n        e.preventDefault();\n        this.setState({clientSecret: FAKE_SECRET});\n    };\n\n    handleRegenerate = (e: React.MouseEvent): void => {\n        e.preventDefault();\n        this.props.onRegenerateSecret(this.props.oauthApp.id).then(\n            ({error}) => {\n                if (error) {\n                    this.setState({error: error.message});\n                } else {\n                    this.setState({error: null});\n                    this.handleShowClientSecret();\n                }\n            },\n        );\n    };\n\n    handleDelete = (): void => {\n        this.props.onDelete(this.props.oauthApp);\n    };\n\n    render(): React.ReactNode {\n        const {oauthApp, creatorName} = this.props;\n        let error;\n\n        if (this.state.error) {\n            error = (\n                <FormError\n                    error={this.state.error}\n                />\n            );\n        }\n\n        if (!matchesFilter(oauthApp, this.props.filter)) {\n            return null;\n        }\n\n        let name;\n        if (oauthApp.name) {\n            name = oauthApp.name;\n        } else {\n            name = (\n                <FormattedMessage\n                    id='installed_integrations.unnamed_oauth_app'\n                    defaultMessage='Unnamed OAuth 2.0 Application'\n                />\n            );\n        }\n\n        let description;\n        if (oauthApp.description) {\n            description = (\n                <div className='item-details__row'>\n                    <span className='item-details__description'>\n                        {oauthApp.description}\n                    </span>\n                </div>\n            );\n        }\n\n        const urls = (\n            <div className='item-details__row'>\n                <span className='item-details__url word-break--all'>\n                    <FormattedMessage\n                        id='installed_integrations.callback_urls'\n                        defaultMessage='Callback URLs: {urls}'\n                        values={{\n                            urls: oauthApp.callback_urls.join(', '),\n                        }}\n                    />\n                </span>\n            </div>\n        );\n\n        let isTrusted;\n        if (oauthApp.is_trusted) {\n            isTrusted = (\n                <FormattedMessage\n                    id='installed_oauth_apps.trusted.yes'\n                    defaultMessage='Yes'\n                />\n            );\n        } else {\n            isTrusted = (\n                <FormattedMessage\n                    id='installed_oauth_apps.trusted.no'\n                    defaultMessage='No'\n                />\n            );\n        }\n\n        let showHide;\n        let clientSecret;\n        if (this.state.clientSecret === FAKE_SECRET) {\n            showHide = (\n                <button\n                    id='showSecretButton'\n                    className='style--none color--link'\n                    onClick={this.handleShowClientSecret}\n                >\n                    <FormattedMessage\n                        id='installed_integrations.showSecret'\n                        defaultMessage='Show Secret'\n                    />\n                </button>\n            );\n            clientSecret = (\n                <span className='item-details__token'>\n                    <FormattedMessage\n                        id='installed_integrations.client_secret'\n                        defaultMessage='Client Secret: '\n                    />\n                    <strong>{this.state.clientSecret}</strong>\n                </span>\n            );\n        } else {\n            showHide = (\n                <button\n                    id='hideSecretButton'\n                    className='style--none color--link'\n                    onClick={this.handleHideClientSecret}\n                >\n                    <FormattedMessage\n                        id='installed_integrations.hideSecret'\n                        defaultMessage='Hide Secret'\n                    />\n                </button>\n            );\n            clientSecret = (\n                <span className='item-details__token'>\n                    <FormattedMessage\n                        id='installed_integrations.client_secret'\n                        defaultMessage='Client Secret: '\n                    />\n                    <strong>{this.state.clientSecret}</strong>\n                    <CopyText\n                        label={messages.copyClientSecret}\n                        value={this.state.clientSecret}\n                    />\n                </span>\n            );\n        }\n\n        const regen = (\n            <button\n                id='regenerateSecretButton'\n                className='style--none color--link'\n                onClick={this.handleRegenerate}\n            >\n                <FormattedMessage\n                    id='installed_integrations.regenSecret'\n                    defaultMessage='Regenerate Secret'\n                />\n            </button>\n        );\n\n        let icon;\n        if (oauthApp.icon_url) {\n            icon = (\n                <div className='integration__icon integration-list__icon'>\n                    <img\n                        alt={'get app screenshot'}\n                        src={oauthApp.icon_url}\n                    />\n                </div>\n            );\n        }\n\n        let actions;\n        if (!this.props.fromApp) {\n            actions = (\n                <div className='item-actions'>\n                    {showHide}\n                    {' - '}\n                    {regen}\n                    {' - '}\n                    <Link to={`/${this.props.team?.name}/integrations/oauth2-apps/edit?id=${oauthApp.id}`}>\n                        <FormattedMessage\n                            id='installed_integrations.edit'\n                            defaultMessage='Edit'\n                        />\n                    </Link>\n                    {' - '}\n                    <DeleteIntegrationLink\n                        modalMessage={\n                            <FormattedMessage\n                                id='installed_oauth_apps.delete.confirm'\n                                defaultMessage='This action permanently deletes the OAuth 2.0 application and breaks any integrations using it. Are you sure you want to delete it?'\n                            />\n                        }\n                        onDelete={this.handleDelete}\n                    />\n                </div>\n            );\n        }\n\n        let appInfo = (\n            <div className='item-details__row'>\n                <span className='item-details__creation'>\n                    <FormattedMessage\n                        id='installed_integrations.fromApp'\n                        defaultMessage='Managed by Apps Framework'\n                    />\n                </span>\n            </div>\n        );\n        if (!this.props.fromApp) {\n            appInfo = (\n                <>\n                    <div className='item-details__row'>\n                        <span className='item-details__url word-break--all'>\n                            <FormattedMessage\n                                id='installed_oauth_apps.is_trusted'\n                                defaultMessage='Is Trusted: '\n                            />\n                            <strong>{isTrusted}</strong>\n                        </span>\n                    </div>\n                    <div className='item-details__row'>\n                        <span className='item-details__token'>\n                            <FormattedMessage\n                                id='installed_integrations.client_id'\n                                defaultMessage='Client ID: '\n                            />\n                            <strong>{oauthApp.id}</strong>\n                            <CopyText\n                                label={messages.copyClientId}\n                                value={oauthApp.id}\n                            />\n                        </span>\n                    </div>\n                    <div className='item-details__row'>\n                        {clientSecret}\n                    </div>\n                    {urls}\n                    <div className='item-details__row'>\n                        <span className='item-details__creation'>\n                            <FormattedMessage\n                                id='installed_integrations.creation'\n                                defaultMessage='Created by {creator} on {createAt, date, full}'\n                                values={{\n                                    creator: creatorName,\n                                    createAt: oauthApp.create_at,\n                                }}\n                            />\n                        </span>\n                    </div>\n                </>\n            );\n        }\n\n        return (\n            <div className='backstage-list__item'>\n                {icon}\n                <div className='item-details'>\n                    <div className='item-details__row d-flex flex-column flex-md-row justify-content-between'>\n                        <strong className='item-details__name'>\n                            {name}\n                        </strong>\n                        {actions}\n                    </div>\n                    {error}\n                    {description}\n                    {appInfo}\n                </div>\n            </div>\n        );\n    }\n}\n\nconst messages = defineMessages({\n    copyClientId: {\n        id: 'integrations.copy_client_id',\n        defaultMessage: 'Copy Client Id',\n    },\n    copyClientSecret: {\n        id: 'integrations.copy_client_secret',\n        defaultMessage: 'Copy Client Secret',\n    },\n});\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\n\nimport {getUser} from 'mattermost-redux/selectors/entities/users';\n\nimport {getDisplayNameByUser} from 'utils/utils';\n\nimport type {GlobalState} from 'types/store';\n\nimport InstalledOAuthApp from './installed_oauth_app';\nimport type {InstalledOAuthAppProps} from './installed_oauth_app';\n\nfunction mapStateToProps(state: GlobalState, ownProps: InstalledOAuthAppProps) {\n    const oauthApp = ownProps.oauthApp || {};\n    return {\n        creatorName: getDisplayNameByUser(state, getUser(state, oauthApp.creator_id)),\n    };\n}\n\nexport default connect(mapStateToProps)(InstalledOAuthApp);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {FormattedMessage} from 'react-intl';\n\nimport type {OAuthApp} from '@mattermost/types/integrations';\nimport type {Team} from '@mattermost/types/teams';\n\nimport type {ActionResult} from 'mattermost-redux/types/actions';\n\nimport BackstageList from 'components/backstage/components/backstage_list';\nimport ExternalLink from 'components/external_link';\n\nimport {DeveloperLinks} from 'utils/constants';\nimport {localizeMessage} from 'utils/utils';\n\nimport InstalledOAuthApp from '../installed_oauth_app';\nimport {matchesFilter} from '../installed_oauth_app/installed_oauth_app';\n\ntype Props = {\n\n    /**\n    * The team data\n    */\n    team?: Team;\n\n    /**\n    * The oauthApps data\n    */\n    oauthApps: {\n        [key: string]: OAuthApp;\n    };\n\n    /**\n     * List of IDs for apps managed by the App Framwork\n     */\n    appsOAuthAppIDs: string[];\n\n    /**\n    * Set if user can manage oath\n    */\n    canManageOauth: boolean;\n\n    /**\n    * Whether or not OAuth applications are enabled.\n    */\n    enableOAuthServiceProvider: boolean;\n\n    actions: ({\n\n        /**\n        * The function to call to fetch OAuth apps\n        */\n        loadOAuthAppsAndProfiles: (page?: number, perPage?: number) => Promise<ActionResult>;\n\n        /**\n        * The function to call when Regenerate Secret link is clicked\n        */\n        regenOAuthAppSecret: (appId: string) => Promise<ActionResult>;\n\n        /**\n        * The function to call when Delete link is clicked\n        */\n        deleteOAuthApp: (appId: string) => Promise<ActionResult>;\n    });\n};\n\ntype State = {\n    loading: boolean;\n};\n\nexport default class InstalledOAuthApps extends React.PureComponent<Props, State> {\n    constructor(props: Props) {\n        super(props);\n        this.state = {\n            loading: true,\n        };\n    }\n\n    componentDidMount(): void {\n        if (this.props.enableOAuthServiceProvider) {\n            this.props.actions.loadOAuthAppsAndProfiles().then(\n                () => this.setState({loading: false}),\n            );\n        }\n    }\n\n    deleteOAuthApp = (app: OAuthApp): void => {\n        if (app && app.id) {\n            this.props.actions.deleteOAuthApp(app.id);\n        }\n    };\n\n    oauthAppCompare(a: OAuthApp, b: OAuthApp): number {\n        let nameA = a.name.toString();\n        if (!nameA) {\n            nameA = localizeMessage({id: 'installed_integrations.unnamed_oauth_app', defaultMessage: 'Unnamed OAuth 2.0 Application'});\n        }\n\n        let nameB = b.name.toString();\n        if (!nameB) {\n            nameB = localizeMessage({id: 'installed_integrations.unnamed_oauth_app', defaultMessage: 'Unnamed OAuth 2.0 Application'});\n        }\n\n        return nameA.localeCompare(nameB);\n    }\n\n    oauthApps = (filter?: string) => Object.values(this.props.oauthApps).\n        filter((app) => matchesFilter(app, filter)).\n        sort(this.oauthAppCompare).\n        map((app) => {\n            return (\n                <InstalledOAuthApp\n                    key={app.id}\n                    oauthApp={app}\n                    onRegenerateSecret={this.props.actions.regenOAuthAppSecret}\n                    onDelete={this.deleteOAuthApp}\n                    team={this.props.team}\n                    creatorName=''\n                    fromApp={this.props.appsOAuthAppIDs.includes(app.id)}\n                />\n            );\n        });\n\n    render() {\n        if (!this.props.team) {\n            return null;\n        }\n        const integrationsEnabled = this.props.enableOAuthServiceProvider && this.props.canManageOauth;\n        let props;\n        if (integrationsEnabled) {\n            props = {\n                addLink: '/' + this.props.team.name + '/integrations/oauth2-apps/add',\n                addText: localizeMessage({id: 'installed_oauth_apps.add', defaultMessage: 'Add OAuth 2.0 Application'}),\n                addButtonId: 'addOauthApp',\n            };\n        }\n\n        return (\n            <BackstageList\n                header={\n                    <FormattedMessage\n                        id='installed_oauth2_apps.header'\n                        defaultMessage='OAuth 2.0 Applications'\n                    />\n                }\n                helpText={\n                    <FormattedMessage\n                        id='installed_oauth_apps.help'\n                        defaultMessage='Create {oauthApplications} to securely integrate bots and third-party apps with Mattermost. Visit the {appDirectory} to find available self-hosted apps.'\n                        values={{\n                            oauthApplications: (\n                                <ExternalLink\n                                    href={DeveloperLinks.SETUP_OAUTH2}\n                                    location='installed_oauth_apps'\n                                >\n                                    <FormattedMessage\n                                        id='installed_oauth_apps.help.oauthApplications'\n                                        defaultMessage='OAuth 2.0 applications'\n                                    />\n                                </ExternalLink>\n                            ),\n                            appDirectory: (\n                                <ExternalLink\n                                    href='https://mattermost.com/marketplace/'\n                                    location='installed_oauth_apps'\n                                >\n                                    <FormattedMessage\n                                        id='installed_oauth_apps.help.appDirectory'\n                                        defaultMessage='App Directory'\n                                    />\n                                </ExternalLink>\n                            ),\n                        }}\n                    />\n                }\n                emptyText={\n                    <FormattedMessage\n                        id='installed_oauth_apps.empty'\n                        defaultMessage='No OAuth 2.0 Applications found'\n                    />\n                }\n                emptyTextSearch={\n                    <FormattedMessage\n                        id='installed_oauth_apps.emptySearch'\n                        defaultMessage='No OAuth 2.0 Applications match {searchTerm}'\n                    />\n                }\n                searchPlaceholder={localizeMessage({id: 'installed_oauth_apps.search', defaultMessage: 'Search OAuth 2.0 Applications'})}\n                loading={this.state.loading}\n                {...props}\n            >\n                {(filter: string) => {\n                    const children = this.oauthApps(filter);\n                    return [children, children.length > 0];\n                }}\n            </BackstageList>\n        );\n    }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\nimport {bindActionCreators} from 'redux';\nimport type {Dispatch} from 'redux';\n\nimport type {GlobalState} from '@mattermost/types/store';\n\nimport {regenOAuthAppSecret, deleteOAuthApp} from 'mattermost-redux/actions/integrations';\nimport {Permissions} from 'mattermost-redux/constants';\nimport {getConfig} from 'mattermost-redux/selectors/entities/general';\nimport {getAppsOAuthAppIDs, getOAuthApps} from 'mattermost-redux/selectors/entities/integrations';\nimport {haveISystemPermission} from 'mattermost-redux/selectors/entities/roles';\nimport {getCurrentTeam} from 'mattermost-redux/selectors/entities/teams';\n\nimport {loadOAuthAppsAndProfiles} from 'actions/integration_actions';\n\nimport InstalledOAuthApps from './installed_oauth_apps';\n\nfunction mapStateToProps(state: GlobalState) {\n    const config = getConfig(state);\n    const enableOAuthServiceProvider = config.EnableOAuthServiceProvider === 'true';\n\n    return {\n        canManageOauth: haveISystemPermission(state, {permission: Permissions.MANAGE_OAUTH}),\n        oauthApps: getOAuthApps(state),\n        appsOAuthAppIDs: getAppsOAuthAppIDs(state),\n        enableOAuthServiceProvider,\n        team: getCurrentTeam(state),\n    };\n}\n\nfunction mapDispatchToProps(dispatch: Dispatch) {\n    return {\n        actions: bindActionCreators({\n            loadOAuthAppsAndProfiles,\n            regenOAuthAppSecret,\n            deleteOAuthApp,\n        }, dispatch),\n    };\n}\n\nexport default connect(mapStateToProps, mapDispatchToProps)(InstalledOAuthApps);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {defineMessage, FormattedMessage} from 'react-intl';\nimport {Link} from 'react-router-dom';\n\nimport type {Channel} from '@mattermost/types/channels';\nimport type {OutgoingWebhook} from '@mattermost/types/integrations';\nimport type {Team} from '@mattermost/types/teams';\nimport type {UserProfile} from '@mattermost/types/users';\n\nimport CopyText from 'components/copy_text';\n\nimport DeleteIntegrationLink from './delete_integration_link';\n\nexport function matchesFilter(outgoingWebhook: OutgoingWebhook, channel: Channel, filter: string) {\n    if (!filter) {\n        return true;\n    }\n\n    const {\n        display_name: displayName,\n        description,\n        trigger_words: triggerWords,\n    } = outgoingWebhook;\n\n    if (\n        (displayName && displayName.toLowerCase().indexOf(filter) !== -1) ||\n        (description && description.toLowerCase().indexOf(filter) !== -1)\n    ) {\n        return true;\n    }\n\n    if (triggerWords) {\n        for (const triggerWord of triggerWords) {\n            if (triggerWord.toLowerCase().indexOf(filter) !== -1) {\n                return true;\n            }\n        }\n    }\n\n    if (channel && channel.name) {\n        if (channel.name.toLowerCase().indexOf(filter) !== -1) {\n            return true;\n        }\n    }\n\n    return false;\n}\n\ntype Props = {\n    outgoingWebhook: OutgoingWebhook;\n    onRegenToken: (outgoingWebhook: OutgoingWebhook) => void;\n    onDelete: (outgoingWebhook: OutgoingWebhook) => void;\n    team: Team;\n    creator: UserProfile;\n    channel: Channel;\n    canChange: boolean;\n    filter?: string;\n}\n\nexport default class InstalledOutgoingWebhook extends React.PureComponent<Props> {\n    handleRegenToken = (e: React.MouseEvent<HTMLButtonElement, MouseEvent>) => {\n        e.preventDefault();\n\n        this.props.onRegenToken(this.props.outgoingWebhook);\n    };\n\n    handleDelete = () => {\n        this.props.onDelete(this.props.outgoingWebhook);\n    };\n\n    makeDisplayName(outgoingWebhook: OutgoingWebhook, channel: Channel) {\n        if (outgoingWebhook.display_name) {\n            return outgoingWebhook.display_name;\n        } else if (channel) {\n            return channel.display_name;\n        }\n        return (\n            <FormattedMessage\n                id='installed_outgoing_webhooks.unknown_channel'\n                defaultMessage='A Private Webhook'\n            />\n        );\n    }\n\n    render() {\n        const outgoingWebhook = this.props.outgoingWebhook;\n        const channel = this.props.channel;\n        const filter = this.props.filter ? this.props.filter.toLowerCase() : '';\n        const triggerWordsFull = 0;\n        const triggerWordsStartsWith = 1;\n\n        if (outgoingWebhook && !matchesFilter(outgoingWebhook, channel, filter)) {\n            return null;\n        }\n\n        const displayName = this.makeDisplayName(outgoingWebhook, channel);\n\n        let description = null;\n        if (outgoingWebhook.description) {\n            description = (\n                <div className='item-details__row'>\n                    <span className='item-details__description'>\n                        {outgoingWebhook.description}\n                    </span>\n                </div>\n            );\n        }\n\n        let triggerWords = null;\n        if (outgoingWebhook.trigger_words && outgoingWebhook.trigger_words.length > 0) {\n            triggerWords = (\n                <div className='item-details__row'>\n                    <span className='item-details__trigger-words'>\n                        <FormattedMessage\n                            id='installed_integrations.triggerWords'\n                            defaultMessage='Trigger Words: {triggerWords}'\n                            values={{\n                                triggerWords: outgoingWebhook.trigger_words.join(', '),\n                            }}\n                        />\n                    </span>\n                </div>\n            );\n        }\n\n        const urls = (\n            <div className='item-details__row'>\n                <span className='item-details__url word-break--all'>\n                    <FormattedMessage\n                        id='installed_integrations.callback_urls'\n                        defaultMessage='Callback URLs: {urls}'\n                        values={{\n                            urls: outgoingWebhook.callback_urls.join(', '),\n                        }}\n                    />\n                </span>\n            </div>\n        );\n\n        let triggerWhen;\n        if (outgoingWebhook.trigger_when === triggerWordsFull) {\n            triggerWhen = (\n                <FormattedMessage\n                    id='add_outgoing_webhook.triggerWordsTriggerWhenFullWord'\n                    defaultMessage='First word matches a trigger word exactly'\n                />\n            );\n        } else if (outgoingWebhook.trigger_when === triggerWordsStartsWith) {\n            triggerWhen = (\n                <FormattedMessage\n                    id='add_outgoing_webhook.triggerWordsTriggerWhenStartsWith'\n                    defaultMessage='First word starts with a trigger word'\n                />\n            );\n        }\n\n        let actions = null;\n        if (this.props.canChange) {\n            actions = (\n                <div className='item-actions'>\n                    <button\n                        className='style--none color--link'\n                        onClick={this.handleRegenToken}\n                    >\n                        <FormattedMessage\n                            id='installed_integrations.regenToken'\n                            defaultMessage='Regenerate Token'\n                        />\n                    </button>\n                    {' - '}\n                    <Link to={`/${this.props.team.name}/integrations/outgoing_webhooks/edit?id=${outgoingWebhook.id}`}>\n                        <FormattedMessage\n                            id='installed_integrations.edit'\n                            defaultMessage='Edit'\n                        />\n                    </Link>\n                    {' - '}\n                    <DeleteIntegrationLink\n                        modalMessage={\n                            <FormattedMessage\n                                id='installed_outgoing_webhooks.delete.confirm'\n                                defaultMessage='This action permanently deletes the outgoing webhook and breaks any integrations using it. Are you sure you want to delete it?'\n                            />\n                        }\n                        onDelete={this.handleDelete}\n                    />\n                </div>\n            );\n        }\n\n        return (\n            <div className='backstage-list__item'>\n                <div className='item-details'>\n                    <div className='item-details__row d-flex flex-column flex-md-row justify-content-between'>\n                        <strong className='item-details__name'>\n                            {displayName}\n                        </strong>\n                        {actions}\n                    </div>\n                    {description}\n                    <div className='item-details__row'>\n                        <span className='item-details__content_type'>\n                            <FormattedMessage\n                                id='installed_integrations.content_type'\n                                defaultMessage='Content-Type: {contentType}'\n                                values={{\n                                    contentType: outgoingWebhook.content_type || 'application/x-www-form-urlencoded',\n                                }}\n                            />\n                        </span>\n                    </div>\n                    {triggerWords}\n                    <div className='item-details__row'>\n                        <span className='item-details__trigger-when'>\n                            <FormattedMessage\n                                id='installed_integrations.triggerWhen'\n                                defaultMessage='Trigger When: {triggerWhen}'\n                                values={{\n                                    triggerWhen,\n                                }}\n                            />\n                        </span>\n                    </div>\n                    <div className='item-details__row'>\n                        <span className='item-details__token'>\n                            <FormattedMessage\n                                id='installed_integrations.token'\n                                defaultMessage='Token: {token}'\n                                values={{\n                                    token: outgoingWebhook.token,\n                                }}\n                            />\n                            <CopyText\n                                label={defineMessage({\n                                    id: 'integrations.copy_token',\n                                    defaultMessage: 'Copy Token',\n                                })}\n                                value={outgoingWebhook.token}\n                            />\n                        </span>\n                    </div>\n                    <div className='item-details__row'>\n                        <span className='item-details__creation'>\n                            <FormattedMessage\n                                id='installed_integrations.creation'\n                                defaultMessage='Created by {creator} on {createAt, date, full}'\n                                values={{\n                                    creator: this.props.creator.username,\n                                    createAt: outgoingWebhook.create_at,\n                                }}\n                            />\n                        </span>\n                    </div>\n                    {urls}\n                </div>\n            </div>\n        );\n    }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {FormattedMessage} from 'react-intl';\n\nimport type {Channel} from '@mattermost/types/channels';\nimport type {OutgoingWebhook} from '@mattermost/types/integrations';\nimport type {Team} from '@mattermost/types/teams';\nimport type {UserProfile} from '@mattermost/types/users';\nimport type {IDMappedObjects} from '@mattermost/types/utilities';\n\nimport type {ActionResult} from 'mattermost-redux/types/actions';\n\nimport BackstageList from 'components/backstage/components/backstage_list';\nimport ExternalLink from 'components/external_link';\nimport InstalledOutgoingWebhook, {matchesFilter} from 'components/integrations/installed_outgoing_webhook';\n\nimport {Constants, DeveloperLinks} from 'utils/constants';\nimport {localizeMessage} from 'utils/utils';\n\nexport type Props = {\n\n    /**\n    *  Data used in passing down as props for webhook modifications\n    */\n    team: Team;\n\n    /**\n    * Data used for checking if webhook is created by current user\n    */\n    user: UserProfile;\n\n    /**\n    *  Data used for checking modification privileges\n    */\n    canManageOthersWebhooks: boolean;\n\n    /**\n    * Data used in passing down as props for showing webhook details\n    */\n    outgoingWebhooks: OutgoingWebhook[];\n\n    /**\n    * Data used in sorting for displaying list and as props channel details\n    */\n    channels: IDMappedObjects<Channel>;\n\n    /**\n    *  Data used in passing down as props for webhook -created by label\n    */\n    users: IDMappedObjects<UserProfile>;\n\n    /**\n    *  Data used in passing as argument for loading webhooks\n    */\n    teamId: string;\n\n    actions: {\n\n        /**\n        * The function to call for removing outgoingWebhook\n        */\n        removeOutgoingHook: (hookId: string) => Promise<ActionResult>;\n\n        /**\n        * The function to call for outgoingWebhook List and for the status of api\n        */\n        loadOutgoingHooksAndProfilesForTeam: (teamId: string, page: number, perPage: number) => Promise<ActionResult>;\n\n        /**\n        * The function to call for regeneration of webhook token\n        */\n        regenOutgoingHookToken: (hookId: string) => Promise<ActionResult>;\n    };\n\n    /**\n    * Whether or not outgoing webhooks are enabled.\n    */\n    enableOutgoingWebhooks: boolean;\n}\n\ntype State = {\n    loading: boolean;\n};\n\nexport default class InstalledOutgoingWebhooks extends React.PureComponent<Props, State> {\n    constructor(props: Props) {\n        super(props);\n\n        this.state = {\n            loading: true,\n        };\n    }\n\n    componentDidMount() {\n        if (this.props.enableOutgoingWebhooks) {\n            this.props.actions.loadOutgoingHooksAndProfilesForTeam(\n                this.props.teamId,\n                Constants.Integrations.START_PAGE_NUM,\n                Constants.Integrations.PAGE_SIZE,\n            ).then(\n                () => this.setState({loading: false}),\n            );\n        }\n    }\n\n    regenOutgoingWebhookToken = (outgoingWebhook: OutgoingWebhook) => {\n        this.props.actions.regenOutgoingHookToken(outgoingWebhook.id);\n    };\n\n    removeOutgoingHook = (outgoingWebhook: OutgoingWebhook) => {\n        this.props.actions.removeOutgoingHook(outgoingWebhook.id);\n    };\n\n    outgoingWebhookCompare = (a: OutgoingWebhook, b: OutgoingWebhook) => {\n        let displayNameA = a.display_name;\n        if (!displayNameA) {\n            const channelA = this.props.channels[a.channel_id];\n            if (channelA) {\n                displayNameA = channelA.display_name;\n            } else {\n                displayNameA = localizeMessage({id: 'installed_outgoing_webhooks.unknown_channel', defaultMessage: 'A Private Webhook'});\n            }\n        }\n\n        let displayNameB = b.display_name;\n        if (!displayNameB) {\n            const channelB = this.props.channels[b.channel_id];\n            if (channelB) {\n                displayNameB = channelB.display_name;\n            } else {\n                displayNameB = localizeMessage({id: 'installed_outgoing_webhooks.unknown_channel', defaultMessage: 'A Private Webhook'});\n            }\n        }\n        return displayNameA.localeCompare(displayNameB);\n    };\n\n    outgoingWebhooks = (filter: string) => this.props.outgoingWebhooks.\n        sort(this.outgoingWebhookCompare).\n        filter((outgoingWebhook) => matchesFilter(outgoingWebhook, this.props.channels[outgoingWebhook.channel_id], filter)).\n        map((outgoingWebhook) => {\n            const canChange = this.props.canManageOthersWebhooks || this.props.user.id === outgoingWebhook.creator_id;\n            const channel = this.props.channels[outgoingWebhook.channel_id];\n            return (\n                <InstalledOutgoingWebhook\n                    key={outgoingWebhook.id}\n                    outgoingWebhook={outgoingWebhook}\n                    onRegenToken={this.regenOutgoingWebhookToken}\n                    onDelete={this.removeOutgoingHook}\n                    creator={this.props.users[outgoingWebhook.creator_id] || {}}\n                    canChange={canChange}\n                    team={this.props.team}\n                    channel={channel}\n                />\n            );\n        });\n\n    render() {\n        return (\n            <BackstageList\n                header={\n                    <FormattedMessage\n                        id='installed_outgoing_webhooks.header'\n                        defaultMessage='Installed Outgoing Webhooks'\n                    />\n                }\n                addText={\n                    <FormattedMessage\n                        id='installed_outgoing_webhooks.add'\n                        defaultMessage='Add Outgoing Webhook'\n                    />\n                }\n                addLink={\n                    '/' +\n                    this.props.team.name +\n                    '/integrations/outgoing_webhooks/add'\n                }\n                addButtonId='addOutgoingWebhook'\n                emptyText={\n                    <FormattedMessage\n                        id='installed_outgoing_webhooks.empty'\n                        defaultMessage='No outgoing webhooks found'\n                    />\n                }\n                emptyTextSearch={\n                    <FormattedMessage\n                        id='installed_outgoing_webhooks.search.empty'\n                        defaultMessage='No outgoing webhooks match <b>{searchTerm}</b>'\n                        values={{\n                            b: (chunks: string) => <b>{chunks}</b>,\n                        }}\n                    />\n                }\n                helpText={\n                    <FormattedMessage\n                        id='installed_outgoing_webhooks.help'\n                        defaultMessage='Use outgoing webhooks to connect external tools to Mattermost. {buildYourOwn} or visit the {appDirectory} to find self-hosted, third-party apps and integrations.'\n                        values={{\n                            buildYourOwn: (\n                                <ExternalLink\n                                    href={DeveloperLinks.SETUP_OUTGOING_WEBHOOKS}\n                                    location='installed_outgoing_webhooks'\n                                >\n                                    <FormattedMessage\n                                        id='installed_outgoing_webhooks.help.buildYourOwn'\n                                        defaultMessage='Build your own'\n                                    />\n                                </ExternalLink>\n                            ),\n                            appDirectory: (\n                                <ExternalLink\n                                    href='https://mattermost.com/marketplace'\n                                    location='installed_outgoing_webhooks'\n                                >\n                                    <FormattedMessage\n                                        id='installed_outgoing_webhooks.help.appDirectory'\n                                        defaultMessage='App Directory'\n                                    />\n                                </ExternalLink>\n                            ),\n                        }}\n                    />\n                }\n                searchPlaceholder={localizeMessage({\n                    id: 'installed_outgoing_webhooks.search',\n                    defaultMessage: 'Search Outgoing Webhooks',\n                })}\n                loading={this.state.loading}\n            >\n                {(filter: string) => {\n                    const children = this.outgoingWebhooks(filter);\n                    return [children, children.length > 0];\n                }}\n            </BackstageList>\n        );\n    }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\nimport {bindActionCreators} from 'redux';\nimport type {Dispatch} from 'redux';\n\nimport * as Actions from 'mattermost-redux/actions/integrations';\nimport {Permissions} from 'mattermost-redux/constants';\nimport {getAllChannels} from 'mattermost-redux/selectors/entities/channels';\nimport {getConfig} from 'mattermost-redux/selectors/entities/general';\nimport {getOutgoingHooks} from 'mattermost-redux/selectors/entities/integrations';\nimport {haveITeamPermission} from 'mattermost-redux/selectors/entities/roles';\nimport {getCurrentTeamId} from 'mattermost-redux/selectors/entities/teams';\nimport {getUsers} from 'mattermost-redux/selectors/entities/users';\n\nimport {loadOutgoingHooksAndProfilesForTeam} from 'actions/integration_actions';\n\nimport type {GlobalState} from 'types/store';\n\nimport InstalledOutgoingWebhook from './installed_outgoing_webhooks';\n\nfunction mapStateToProps(state: GlobalState) {\n    const config = getConfig(state);\n    const teamId = getCurrentTeamId(state);\n    const canManageOthersWebhooks = haveITeamPermission(state, teamId, Permissions.MANAGE_OTHERS_OUTGOING_WEBHOOKS);\n    const outgoingHooks = getOutgoingHooks(state);\n    const outgoingWebhooks = Object.keys(outgoingHooks).\n        map((key) => outgoingHooks[key]).\n        filter((outgoingWebhook) => outgoingWebhook.team_id === teamId);\n    const enableOutgoingWebhooks = config.EnableOutgoingWebhooks === 'true';\n\n    return {\n        outgoingWebhooks,\n        channels: getAllChannels(state),\n        users: getUsers(state),\n        teamId,\n        canManageOthersWebhooks,\n        enableOutgoingWebhooks,\n    };\n}\n\nfunction mapDispatchToProps(dispatch: Dispatch) {\n    return {\n        actions: bindActionCreators({\n            loadOutgoingHooksAndProfilesForTeam,\n            removeOutgoingHook: Actions.removeOutgoingHook,\n            regenOutgoingHookToken: Actions.regenOutgoingHookToken,\n        }, dispatch),\n    };\n}\n\nexport default connect(mapStateToProps, mapDispatchToProps)(InstalledOutgoingWebhook);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport type {ChangeEvent, FormEvent} from 'react';\nimport React, {useMemo, useState} from 'react';\nimport {FormattedMessage, useIntl} from 'react-intl';\nimport type {MessageDescriptor} from 'react-intl';\nimport {useDispatch} from 'react-redux';\nimport {Link} from 'react-router-dom';\n\nimport {AlertOutlineIcon, CheckCircleOutlineIcon} from '@mattermost/compass-icons/components';\nimport type {OutgoingOAuthConnection} from '@mattermost/types/integrations';\nimport type {Team} from '@mattermost/types/teams';\n\nimport {validateOutgoingOAuthConnection} from 'mattermost-redux/actions/integrations';\n\nimport BackstageHeader from 'components/backstage/components/backstage_header';\nimport ConfirmModal from 'components/confirm_modal';\nimport FormError from 'components/form_error';\nimport SpinnerButton from 'components/spinner_button';\nimport LoadingSpinner from 'components/widgets/loading/loading_spinner';\n\ntype Props = {\n    team: Team;\n    header: MessageDescriptor;\n    footer: MessageDescriptor;\n    loading: MessageDescriptor;\n    renderExtra?: JSX.Element;\n    serverError: string;\n\n    initialConnection?: OutgoingOAuthConnection;\n\n    submitAction: (connection: OutgoingOAuthConnection) => Promise<void>;\n}\n\ntype State = {\n    name: string;\n    oauthTokenUrl: string;\n    grantType: OutgoingOAuthConnection['grant_type'];\n    clientId: string;\n    clientSecret: string;\n    audienceUrls: string;\n};\n\nenum ValidationStatus {\n    INITIAL = 'initial',\n    DIRTY = 'dirty',\n    VALIDATING = 'validating',\n    VALIDATED = 'validated',\n    ERROR = 'error',\n}\n\nconst useOutgoingOAuthForm = (connection: OutgoingOAuthConnection): [State, (state: Partial<State>) => void] => {\n    const initialState: State = {\n        name: connection.name || '',\n        audienceUrls: connection.audiences ? connection.audiences.join('\\n') : '',\n        oauthTokenUrl: connection.oauth_token_url || '',\n        clientId: connection.client_id || '',\n        clientSecret: connection.client_secret || '',\n        grantType: 'client_credentials',\n    };\n\n    const [state, setState] = useState(initialState);\n\n    return useMemo(() => [state, (newState: Partial<State>) => {\n        setState((oldState) => ({...oldState, ...newState}));\n    }], [state]);\n};\n\nconst initialState: OutgoingOAuthConnection = {\n    id: '',\n    name: '',\n    creator_id: '',\n    create_at: 0,\n    update_at: 0,\n    client_id: '',\n    client_secret: '',\n    oauth_token_url: '',\n    grant_type: 'client_credentials',\n    audiences: [],\n};\n\nexport default function AbstractOutgoingOAuthConnection(props: Props) {\n    const [formState, setFormState] = useOutgoingOAuthForm(props.initialConnection || initialState);\n\n    const [storedError, setError] = useState<React.ReactNode>('');\n    const [validationError, setValidationError] = useState<string>('');\n\n    const [isSubmitting, setIsSubmitting] = useState(false);\n    const [validationStatus, setValidationStatus] = useState<ValidationStatus>(ValidationStatus.INITIAL);\n    const [isEditingSecret, setIsEditingSecret] = useState(false);\n\n    const [isValidationModalOpen, setIsValidationModalOpen] = useState(false);\n\n    const intl = useIntl();\n    const dispatch = useDispatch();\n\n    const isNewConnection = !props.initialConnection;\n\n    const parseForm = (requireAudienceUrl: boolean): OutgoingOAuthConnection | undefined => {\n        if (!formState.name) {\n            setIsSubmitting(false);\n            setError(\n                <FormattedMessage\n                    id='add_outgoing_oauth_connection.name.required'\n                    defaultMessage='Name for the OAuth connection is required.'\n                />,\n            );\n\n            return undefined;\n        }\n\n        if (!formState.clientId) {\n            setIsSubmitting(false);\n            setError(\n                <FormattedMessage\n                    id='add_outgoing_oauth_connection.client_id.required'\n                    defaultMessage='Client Id for the OAuth connection is required.'\n                />,\n            );\n\n            return undefined;\n        }\n\n        if ((isNewConnection || isEditingSecret) && !formState.clientSecret) {\n            setIsSubmitting(false);\n            setError(\n                <FormattedMessage\n                    id='add_outgoing_oauth_connection.client_secret.required'\n                    defaultMessage='Client Secret for the OAuth connection is required.'\n                />,\n            );\n\n            return undefined;\n        }\n\n        if (!formState.grantType) {\n            setIsSubmitting(false);\n            setError(\n                <FormattedMessage\n                    id='add_outgoing_oauth_connection.grant_type.required'\n                    defaultMessage='Grant Type for the OAuth connection is required.'\n                />,\n            );\n\n            return undefined;\n        }\n\n        if (!formState.oauthTokenUrl) {\n            setIsSubmitting(false);\n            setError(\n                <FormattedMessage\n                    id='add_outgoing_oauth_connection.oauth_token_url.required'\n                    defaultMessage='OAuth Token URL for the OAuth connection is required.'\n                />,\n            );\n\n            return undefined;\n        }\n\n        const audienceUrls = [];\n        for (let audienceUrl of formState.audienceUrls.split('\\n')) {\n            audienceUrl = audienceUrl.trim();\n\n            if (audienceUrl.length > 0) {\n                audienceUrls.push(audienceUrl);\n            }\n        }\n\n        if (requireAudienceUrl && audienceUrls.length === 0) {\n            setIsSubmitting(false);\n            setError(\n                <FormattedMessage\n                    id='add_outgoing_oauth_connection.audienceUrls.required'\n                    defaultMessage='One or more audience URLs are required.'\n                />,\n            );\n\n            return undefined;\n        }\n\n        const connection = {\n            name: formState.name,\n            audiences: audienceUrls,\n            client_id: formState.clientId,\n            client_secret: formState.clientSecret,\n            grant_type: formState.grantType,\n            oauth_token_url: formState.oauthTokenUrl,\n        } as OutgoingOAuthConnection;\n\n        return connection;\n    };\n\n    const showSkipValidateModal = () => {\n        setIsValidationModalOpen(true);\n    };\n\n    const hideSkipValidateModal = () => {\n        setIsValidationModalOpen(false);\n    };\n\n    const handleSubmitFromButton = (e: FormEvent) => {\n        e.preventDefault();\n        handleSubmit();\n    };\n\n    const handleSubmit = () => {\n        if (isSubmitting) {\n            return;\n        }\n\n        const connection = parseForm(true);\n        if (!connection) {\n            return;\n        }\n\n        setError('');\n\n        if (validationStatus !== ValidationStatus.VALIDATED && !(!isNewConnection && validationStatus === ValidationStatus.INITIAL)) {\n            if (!isValidationModalOpen) {\n                showSkipValidateModal();\n                return;\n            }\n        }\n\n        setIsSubmitting(true);\n\n        const res = props.submitAction(connection);\n        res.then(() => setIsSubmitting(false));\n    };\n\n    const handleValidate = async (e: FormEvent) => {\n        e.preventDefault();\n\n        if (validationStatus === ValidationStatus.VALIDATING) {\n            return;\n        }\n\n        setError('');\n        setValidationStatus(ValidationStatus.VALIDATING);\n\n        const connection = parseForm(false);\n        if (!connection) {\n            // Defer to the form validation error\n            setValidationStatus(ValidationStatus.INITIAL);\n            return;\n        }\n\n        if (props.initialConnection?.id) {\n            connection.id = props.initialConnection.id;\n        }\n\n        const {error} = await dispatch(validateOutgoingOAuthConnection(props.team.id, connection));\n\n        if (error) {\n            setValidationStatus(ValidationStatus.ERROR);\n            setValidationError(error.message);\n        } else {\n            setValidationStatus(ValidationStatus.VALIDATED);\n        }\n    };\n\n    const setUnvalidated = (e?: React.FormEvent) => {\n        e?.preventDefault();\n\n        if (validationStatus !== ValidationStatus.DIRTY) {\n            setValidationStatus(ValidationStatus.DIRTY);\n        }\n\n        if (validationError) {\n            setValidationError('');\n        }\n    };\n\n    const updateName = (e: ChangeEvent<HTMLInputElement>) => {\n        setFormState({\n            name: e.target.value,\n        });\n    };\n\n    const updateClientId = (e: ChangeEvent<HTMLInputElement>) => {\n        setUnvalidated();\n\n        setFormState({\n            clientId: e.target.value,\n        });\n    };\n\n    const updateClientSecret = (e: ChangeEvent<HTMLInputElement>) => {\n        setUnvalidated();\n\n        setFormState({\n            clientSecret: e.target.value,\n        });\n    };\n\n    const updateOAuthTokenURL = (e: ChangeEvent<HTMLInputElement>) => {\n        setUnvalidated();\n\n        setFormState({\n            oauthTokenUrl: e.target.value,\n        });\n    };\n\n    const updateAudienceUrls = (e: ChangeEvent<HTMLTextAreaElement>) => {\n        setFormState({\n            audienceUrls: e.target.value,\n        });\n    };\n\n    const startEditingClientSecret = () => {\n        setIsEditingSecret(true);\n    };\n\n    const headerToRender = props.header;\n    const footerToRender = props.footer;\n\n    let clientSecretSection = (\n        <input\n            id='client_secret'\n            type='text'\n            autoComplete='off'\n            className='form-control'\n            value={formState.clientSecret}\n            onChange={updateClientSecret}\n        />\n    );\n\n    if (!isNewConnection && !isEditingSecret) {\n        clientSecretSection = (\n            <>\n                <input\n                    id='client_secret'\n                    disabled={true}\n                    autoComplete='off'\n                    type='text'\n                    className='form-control disabled'\n                    value={'•'.repeat(40)}\n                />\n                <span\n                    onClick={startEditingClientSecret}\n                    className='outgoing-oauth-connections-edit-secret'\n                >\n                    <i className='icon icon-pencil-outline'/>\n                </span>\n            </>\n        );\n    }\n\n    return (\n        <div className='backstage-content'>\n            <BackstageHeader>\n                <Link to={`/${props.team.name}/integrations/outgoing-oauth2-connections`}>\n                    <FormattedMessage\n                        id='add_outgoing_oauth_connection.header'\n                        defaultMessage='Outgoing OAuth Connections'\n                    />\n                </Link>\n                <FormattedMessage\n                    id={headerToRender.id}\n                    defaultMessage={headerToRender.defaultMessage}\n                />\n            </BackstageHeader>\n            <div className='backstage-form'>\n                <form className='form-horizontal'>\n                    <div className='form-group'>\n                        <label\n                            className='control-label col-sm-4'\n                            htmlFor='name'\n                        >\n                            <FormattedMessage\n                                id='add_outgoing_oauth_connection.name.label'\n                                defaultMessage='Name'\n                            />\n                        </label>\n                        <div className='col-md-5 col-sm-8'>\n                            <input\n                                id='name'\n                                type='text'\n                                className='form-control'\n                                value={formState.name}\n                                onChange={updateName}\n                            />\n                            <div className='form__help'>\n                                <FormattedMessage\n                                    id='add_outgoing_oauth_connection.name.help'\n                                    defaultMessage='Specify the name for your OAuth connection.'\n                                />\n                            </div>\n                        </div>\n                    </div>\n                    <div className='form-group'>\n                        <label\n                            className='control-label col-sm-4'\n                            htmlFor='client_id'\n                        >\n                            <FormattedMessage\n                                id='add_outgoing_oauth_connection.client_id.label'\n                                defaultMessage='Client ID'\n                            />\n                        </label>\n                        <div className='col-md-5 col-sm-8'>\n                            <input\n                                id='client_id'\n                                type='text'\n                                autoComplete='off'\n                                className='form-control'\n                                value={formState.clientId}\n                                onChange={updateClientId}\n                            />\n                            <div className='form__help'>\n                                <FormattedMessage\n                                    id='add_outgoing_oauth_connection.client_id.help'\n                                    defaultMessage='Specify the Client ID for your OAuth connection.'\n                                />\n                            </div>\n                        </div>\n                    </div>\n                    <div className='form-group'>\n                        <label\n                            className='control-label col-sm-4'\n                            htmlFor='client_secret'\n                        >\n                            <FormattedMessage\n                                id='add_outgoing_oauth_connection.client_secret.label'\n                                defaultMessage='Client Secret'\n                            />\n                        </label>\n                        <div className='col-md-5 col-sm-8'>\n                            {clientSecretSection}\n                            <div className='form__help'>\n                                <FormattedMessage\n                                    id='add_outgoing_oauth_connection.client_secret.help'\n                                    defaultMessage='Specify the Client Secret for your OAuth connection.'\n                                />\n                            </div>\n                        </div>\n                    </div>\n                    <div className='form-group'>\n                        <label\n                            className='control-label col-sm-4'\n                            htmlFor='oauth_token_url'\n                        >\n                            <FormattedMessage\n                                id='add_outgoing_oauth_connection.oauth_token_url.label'\n                                defaultMessage='OAuth Token URL'\n                            />\n                        </label>\n                        <div className='col-md-5 col-sm-8'>\n                            <input\n                                id='token_url'\n                                type='text'\n                                className='form-control'\n                                value={formState.oauthTokenUrl}\n                                onChange={updateOAuthTokenURL}\n                            />\n                            <div className='form__help'>\n                                <FormattedMessage\n                                    id='add_outgoing_oauth_connection.oauth_token_url.help'\n                                    defaultMessage='Specify the OAuth Token URL for your OAuth connection.'\n                                />\n                            </div>\n                            <div className='outgoing-oauth-connection-validate-button-container'>\n                                <ValidateButton\n                                    onClick={handleValidate}\n                                    setUnvalidated={setUnvalidated}\n                                    status={validationStatus}\n                                />\n                            </div>\n                        </div>\n                    </div>\n                    <div className='form-group'>\n                        <label\n                            className='control-label col-sm-4'\n                            htmlFor='audienceUrls'\n                        >\n                            <FormattedMessage\n                                id='add_outgoing_oauth_connection.audienceUrls.label'\n                                defaultMessage='Audience URLs (One Per Line)'\n                            />\n                        </label>\n                        <div className='col-md-5 col-sm-8'>\n                            <textarea\n                                id='audienceUrls'\n                                rows={3}\n                                className='form-control'\n                                value={formState.audienceUrls}\n                                onChange={updateAudienceUrls}\n                            />\n                            <div className='form__help'>\n                                <FormattedMessage\n                                    id='add_outgoing_oauth_connection.audienceUrls.help'\n                                    defaultMessage='The URLs which will receive requests with the OAuth token, e.g. your custom slash command handler endpoint. Must be a valid URL and start with http:// or https://.'\n                                />\n                            </div>\n                        </div>\n                    </div>\n                    <div className='backstage-form__footer'>\n                        <FormError\n                            type='backstage'\n                            errors={[props.serverError, storedError]}\n                        />\n                        <Link\n                            className='btn btn-tertiary'\n                            to={`/${props.team.name}/integrations/outgoing-oauth2-connections`}\n                        >\n                            <FormattedMessage\n                                id='add_outgoing_oauth_connection.cancel'\n                                defaultMessage='Cancel'\n                            />\n                        </Link>\n                        <SpinnerButton\n                            className='btn btn-primary'\n                            type='submit'\n                            spinning={isSubmitting}\n                            spinningText={intl.formatMessage(props.loading)}\n                            onClick={handleSubmitFromButton}\n                            id='saveConnection'\n                        >\n                            <FormattedMessage\n                                id={footerToRender.id}\n                                defaultMessage={footerToRender.defaultMessage}\n                            />\n                        </SpinnerButton>\n                        {props.renderExtra}\n                    </div>\n                </form>\n            </div>\n            <div className='outgoing-oauth-connections-docs-link'>\n                <FormattedMessage\n                    id={'add_outgoing_oauth_connection.documentation_link'}\n                    defaultMessage={'Get help with <link>configuring outgoing OAuth connections</link>.'}\n                    values={{\n                        link: (text: string) => (\n                            <a href='https://mattermost.com/pl/outgoing-oauth-connections'>{text}</a>\n                        ),\n                    }}\n                />\n            </div>\n            <ConfirmModal\n                show={isValidationModalOpen}\n                message={intl.formatMessage({\n                    id: 'add_outgoing_oauth_connection.save_without_validation_warning',\n                    defaultMessage: 'This connection has not been validated, Do you want to save anyway?',\n                })}\n                title={intl.formatMessage({\n                    id: 'add_outgoing_oauth_connection.confirm_save',\n                    defaultMessage: 'Save Outgoing OAuth Connection',\n                })}\n                confirmButtonText={intl.formatMessage({\n                    id: 'add_outgoing_oauth_connection.save_anyway',\n                    defaultMessage: 'Save anyway',\n                })}\n                onExited={hideSkipValidateModal}\n                onCancel={hideSkipValidateModal}\n                onConfirm={handleSubmit}\n            />\n        </div>\n    );\n}\n\ntype ValidateButtonProps = {\n    status: ValidationStatus;\n    onClick: (e: FormEvent) => void;\n    setUnvalidated: (e: FormEvent) => void;\n}\n\nconst ValidateButton = ({status, onClick, setUnvalidated}: ValidateButtonProps) => {\n    if (status === ValidationStatus.ERROR) {\n        return (\n            <span\n                className='outgoing-oauth-connection-validation-message validation-error'\n            >\n                <AlertOutlineIcon size={20}/>\n                <FormattedMessage\n                    id={'add_outgoing_oauth_connection.validation_error'}\n                    defaultMessage={'Connection not validated. Please check the server logs for details or <link>try again</link>.'}\n                    values={{\n                        link: (text: string) => <a onClick={setUnvalidated}>{text}</a>,\n                    }}\n                />\n            </span>\n        );\n    }\n\n    if (status === ValidationStatus.VALIDATED) {\n        return (\n            <span\n                className='outgoing-oauth-connection-validation-message validation-success'\n            >\n                <CheckCircleOutlineIcon size={20}/>\n                <FormattedMessage\n                    id={'add_outgoing_oauth_connection.validated_connection'}\n                    defaultMessage={'Validated connection'}\n                />\n            </span>\n        );\n    }\n\n    if (status === ValidationStatus.VALIDATING) {\n        return (\n            <span\n                className='outgoing-oauth-connection-validation-message'\n            >\n                <LoadingSpinner\n                    text={(\n                        <FormattedMessage\n                            id={'add_outgoing_oauth_connection.validating'}\n                            defaultMessage={'Validating...'}\n                        />\n                    )}\n                />\n            </span>\n        );\n    }\n\n    const validateButton = (\n        <button\n            className='btn btn-tertiary btn-sm'\n            type='button'\n            onClick={onClick}\n            id='validateConnection'\n        >\n            <FormattedMessage\n                id={'add_outgoing_oauth_connection.validate'}\n                defaultMessage={'Validate Connection'}\n            />\n        </button>\n    );\n\n    return validateButton;\n};\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React, {useState} from 'react';\nimport {defineMessage} from 'react-intl';\nimport {useDispatch} from 'react-redux';\nimport {useHistory} from 'react-router-dom';\n\nimport type {OutgoingOAuthConnection} from '@mattermost/types/integrations';\nimport type {Team} from '@mattermost/types/teams';\n\nimport {addOutgoingOAuthConnection} from 'mattermost-redux/actions/integrations';\n\nimport AbstractOutgoingOAuthConnection from './abstract_outgoing_oauth_connection';\n\nconst HEADER = defineMessage({id: 'add_outgoing_oauth_connection.add', defaultMessage: 'Add'});\nconst FOOTER = defineMessage({id: 'add_outgoing_oauth_connection.save', defaultMessage: 'Save'});\nconst LOADING = defineMessage({id: 'add_outgoing_oauth_connection.saving', defaultMessage: 'Saving...'});\n\nexport type Props = {\n    team: Team;\n};\n\nconst AddOutgoingOAuthConnection = ({team}: Props): JSX.Element => {\n    const dispatch = useDispatch();\n\n    const history = useHistory();\n\n    const [serverError, setServerError] = useState('');\n\n    const submit = async (connection: OutgoingOAuthConnection) => {\n        setServerError('');\n\n        const {data, error} = (await dispatch(addOutgoingOAuthConnection(team.id, connection))) as unknown as {data: OutgoingOAuthConnection; error: Error};\n        if (data) {\n            history.push(`/${team.name}/integrations/confirm?type=outgoing-oauth2-connections&id=${data.id}`);\n            return;\n        }\n\n        if (error) {\n            setServerError(error.message);\n        }\n    };\n\n    return (\n        <AbstractOutgoingOAuthConnection\n            team={team}\n            header={HEADER}\n            footer={FOOTER}\n            loading={LOADING}\n            submitAction={submit}\n            serverError={serverError}\n        />\n    );\n};\n\nexport default AddOutgoingOAuthConnection;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React, {useEffect, useState} from 'react';\nimport {FormattedMessage, defineMessage} from 'react-intl';\nimport {useDispatch, useSelector} from 'react-redux';\n\nimport type {OutgoingOAuthConnection} from '@mattermost/types/integrations';\nimport type {Team} from '@mattermost/types/teams';\n\nimport {editOutgoingOAuthConnection, getOutgoingOAuthConnection} from 'mattermost-redux/actions/integrations';\nimport {getConfig} from 'mattermost-redux/selectors/entities/general';\nimport {getOutgoingOAuthConnections} from 'mattermost-redux/selectors/entities/integrations';\n\nimport ConfirmModal from 'components/confirm_modal';\nimport LoadingScreen from 'components/loading_screen';\n\nimport {getHistory} from 'utils/browser_history';\n\nimport AbstractOutgoingOAuthConnection from './abstract_outgoing_oauth_connection';\n\nconst HEADER = defineMessage({id: 'integrations.edit', defaultMessage: 'Edit'});\nconst FOOTER = defineMessage({id: 'edit_outgoing_oauth_connection.update', defaultMessage: 'Update'});\nconst LOADING = defineMessage({id: 'edit_outgoing_oauth_connection.updating', defaultMessage: 'Updating...'});\n\ntype Props = {\n    team: Team;\n    location: Location;\n};\n\nconst getConnectionIdFromSearch = (search: string): string => {\n    return (new URLSearchParams(search)).get('id') || '';\n};\n\nconst EditOutgoingOAuthConnection = (props: Props) => {\n    const connectionId = getConnectionIdFromSearch(props.location.search);\n    const connections = useSelector(getOutgoingOAuthConnections);\n    const existingConnection = connections[connectionId];\n\n    const [newConnection, setNewConnection] = useState(existingConnection);\n    const [showConfirmModal, setShowConfirmModal] = useState(false);\n    const [serverError, setServerError] = useState('');\n\n    const enableOAuthServiceProvider = useSelector(getConfig).EnableOAuthServiceProvider;\n\n    const dispatch = useDispatch();\n\n    useEffect(() => {\n        if (enableOAuthServiceProvider) {\n            dispatch(getOutgoingOAuthConnection(props.team.id, connectionId));\n        }\n    }, [connectionId, enableOAuthServiceProvider, props.team, dispatch]);\n\n    const handleInitialSubmit = async (connection: OutgoingOAuthConnection) => {\n        setNewConnection(connection);\n\n        if (existingConnection.id) {\n            connection.id = existingConnection.id;\n        }\n\n        const audienceUrlsSame = (existingConnection.audiences.length === connection.audiences.length) &&\n            existingConnection.audiences.every((v, i) => v === connection.audiences[i]);\n\n        if (audienceUrlsSame) {\n            await createOutgoingOAuthConnection(connection);\n        } else {\n            handleConfirmModal();\n        }\n    };\n\n    const handleConfirmModal = () => {\n        setShowConfirmModal(true);\n    };\n\n    const confirmModalDismissed = () => {\n        setShowConfirmModal(false);\n    };\n\n    const createOutgoingOAuthConnection = async (connection: OutgoingOAuthConnection) => {\n        setServerError('');\n\n        const res = await dispatch(editOutgoingOAuthConnection(props.team.id, connection));\n\n        if ('data' in res && res.data) {\n            getHistory().push(`/${props.team.name}/integrations/outgoing-oauth2-connections`);\n            return;\n        }\n\n        confirmModalDismissed();\n\n        if ('error' in res) {\n            const {error: err} = res as {error: Error};\n            setServerError(err.message);\n        }\n    };\n\n    const renderExtra = () => {\n        const confirmButton = (\n            <FormattedMessage\n                id='update_command.update'\n                defaultMessage='Update'\n            />\n        );\n\n        const confirmTitle = (\n            <FormattedMessage\n                id='update_outgoing_oauth_connection.confirm'\n                defaultMessage='Edit Outgoing OAuth Connection'\n            />\n        );\n\n        const confirmMessage = (\n            <FormattedMessage\n                id='update_outgoing_oauth_connection.question'\n                defaultMessage='Your changes may break any existing integrations using this connection. Are you sure you would like to update it?'\n            />\n        );\n\n        return (\n            <ConfirmModal\n                title={confirmTitle}\n                message={confirmMessage}\n                confirmButtonText={confirmButton}\n                modalClass='integrations-backstage-modal'\n                show={showConfirmModal}\n                onConfirm={() => createOutgoingOAuthConnection(newConnection)}\n                onCancel={confirmModalDismissed}\n            />\n        );\n    };\n\n    if (!existingConnection) {\n        return <LoadingScreen/>;\n    }\n\n    return (\n        <AbstractOutgoingOAuthConnection\n            team={props.team}\n            header={HEADER}\n            footer={FOOTER}\n            loading={LOADING}\n            renderExtra={renderExtra()}\n            submitAction={handleInitialSubmit}\n            serverError={serverError}\n            initialConnection={existingConnection}\n        />\n    );\n};\n\nexport default EditOutgoingOAuthConnection;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {FormattedMessage} from 'react-intl';\nimport {Link} from 'react-router-dom';\n\nimport type {OutgoingOAuthConnection} from '@mattermost/types/integrations';\nimport type {Team} from '@mattermost/types/teams';\n\nimport DeleteIntegrationLink from '../delete_integration_link';\n\nexport function matchesFilter(outgoingOAuthConnection: OutgoingOAuthConnection, filter?: string | null): boolean {\n    if (!filter) {\n        return true;\n    }\n\n    return outgoingOAuthConnection.name.toLowerCase().includes(filter);\n}\n\nexport type InstalledOutgoingOAuthConnectionProps = {\n    team: Partial<Team>;\n    outgoingOAuthConnection: OutgoingOAuthConnection;\n    creatorName: string;\n    filter?: string | null;\n\n    onDelete: (outgoingOAuthConnection: OutgoingOAuthConnection) => void;\n}\n\nexport type InstalledOutgoingOAuthConnectionState = {\n    clientSecret: string;\n    error?: string | null;\n}\n\nconst InstalledOutgoingOAuthConnection = (props: InstalledOutgoingOAuthConnectionProps) => {\n    const handleDelete = (): void => {\n        props.onDelete(props.outgoingOAuthConnection);\n    };\n\n    const {outgoingOAuthConnection, creatorName} = props;\n\n    if (!matchesFilter(outgoingOAuthConnection, props.filter)) {\n        return null;\n    }\n\n    let name;\n    if (outgoingOAuthConnection.name) {\n        name = outgoingOAuthConnection.name;\n    } else {\n        name = (\n            <FormattedMessage\n                id='installed_integrations.unnamed_outgoing_oauth_connection'\n                defaultMessage='Unnamed Outgoing OAuth Connection'\n            />\n        );\n    }\n\n    const urls = (\n        <>\n            <div className='item-details__row'>\n                <span className='item-details__url word-break--all'>\n                    <FormattedMessage\n                        id='installed_integrations.audience_urls'\n                        defaultMessage='Audience URLs: {urls}'\n                        values={{\n                            urls: outgoingOAuthConnection.audiences.join(', '),\n                        }}\n                    />\n                </span>\n            </div>\n            <div className='item-details__row'>\n                <span className='item-details__url word-break--all'>\n                    <FormattedMessage\n                        id='installed_integrations.token_url'\n                        defaultMessage='Token URL: {url}'\n                        values={{\n                            url: outgoingOAuthConnection.oauth_token_url,\n                        }}\n                    />\n                </span>\n            </div>\n        </>\n    );\n\n    const actions = (\n        <div className='item-actions'>\n            <Link to={`/${props.team.name}/integrations/outgoing-oauth2-connections/edit?id=${outgoingOAuthConnection.id}`}>\n                <FormattedMessage\n                    id='installed_integrations.edit'\n                    defaultMessage='Edit'\n                />\n            </Link>\n            {' - '}\n            <DeleteIntegrationLink\n                subtitleText={\n                    <FormattedMessage\n                        id='installed_outgoing_oauth_connections.delete.confirm'\n                        defaultMessage='Are you sure you want to delete {connectionName}?'\n                        values={{\n                            connectionName: (\n                                <strong>\n                                    {props.outgoingOAuthConnection.name}\n                                </strong>\n                            ),\n                        }}\n                    />\n                }\n                modalMessage={\n                    <FormattedMessage\n                        id='installed_outgoing_oauth_connections.delete.wanring'\n                        defaultMessage='Deleting this connection will break any integrations using it'\n                    />\n                }\n                onDelete={handleDelete}\n            />\n        </div>\n    );\n\n    const connectionInfo = (\n        <>\n            <div className='item-details__row'>\n                <span className='item-details__token'>\n                    <FormattedMessage\n                        id='installed_integrations.client_id'\n                        defaultMessage='Client ID: '\n                    />\n                    <strong>{outgoingOAuthConnection.client_id}</strong>\n                </span>\n            </div>\n            <div className='item-details__row'>\n                <span className='item-details__token'>\n                    <FormattedMessage\n                        id='installed_outgoing_oauth_connections.client_secret'\n                        defaultMessage='Client Secret: ********'\n                    />\n                </span>\n            </div>\n            {outgoingOAuthConnection.grant_type === 'password' && (\n                <>\n                    <div className='item-details__row'>\n                        <span className='item-details__token'>\n                            <FormattedMessage\n                                id='installed_outgoing_oauth_connections.username'\n                                defaultMessage='Username: '\n                            />\n                            <strong>{outgoingOAuthConnection.credentials_username}</strong>\n                        </span>\n                    </div>\n                    <div className='item-details__row'>\n                        <span className='item-details__token'>\n                            <FormattedMessage\n                                id='installed_outgoing_oauth_connections.password'\n                                defaultMessage='Password: ********'\n                            />\n                        </span>\n                    </div>\n                </>\n            )}\n\n            {urls}\n            <div className='item-details__row'>\n                <span className='item-details__creation'>\n                    <FormattedMessage\n                        id='installed_integrations.creation'\n                        defaultMessage='Created by {creator} on {createAt, date, full}'\n                        values={{\n                            creator: creatorName,\n                            createAt: outgoingOAuthConnection.create_at,\n                        }}\n                    />\n                </span>\n            </div>\n        </>\n    );\n\n    return (\n        <div className='backstage-list__item' >\n            <div className='item-details' >\n                <div className='item-details__row d-flex flex-column flex-md-row justify-content-between'>\n                    <strong className='item-details__name'>\n                        {name}\n                    </strong>\n                    {actions}\n                </div>\n                {connectionInfo}\n            </div>\n        </div >\n    );\n};\n\nexport default InstalledOutgoingOAuthConnection;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React, {useEffect, useState} from 'react';\nimport {FormattedMessage, useIntl} from 'react-intl';\nimport {useDispatch, useSelector} from 'react-redux';\n\nimport type {OutgoingOAuthConnection} from '@mattermost/types/integrations';\nimport type {Team} from '@mattermost/types/teams';\n\nimport {deleteOutgoingOAuthConnection} from 'mattermost-redux/actions/integrations';\nimport {Permissions} from 'mattermost-redux/constants';\nimport {getConfig} from 'mattermost-redux/selectors/entities/general';\nimport {getOutgoingOAuthConnections} from 'mattermost-redux/selectors/entities/integrations';\nimport {haveITeamPermission} from 'mattermost-redux/selectors/entities/roles';\n\nimport {loadOutgoingOAuthConnectionsAndProfiles} from 'actions/integration_actions';\n\nimport BackstageList from 'components/backstage/components/backstage_list';\nimport ExternalLink from 'components/external_link';\n\nimport {DeveloperLinks} from 'utils/constants';\n\nimport type {GlobalState} from 'types/store';\n\nimport InstalledOutgoingOAuthConnection, {matchesFilter} from './installed_outgoing_oauth_connection';\n\ntype Props = {\n    team: Team;\n};\n\nconst InstalledOutgoingOAuthConnections = (props: Props) => {\n    const [loading, setLoading] = useState(true);\n    const canManageOutgoingOAuthConnections = useSelector((state: GlobalState) => haveITeamPermission(state, props.team.id, Permissions.MANAGE_OUTGOING_OAUTH_CONNECTIONS));\n    const enableOutgoingOAuthConnections = (useSelector(getConfig).EnableOutgoingOAuthConnections === 'true');\n    const connections = useSelector(getOutgoingOAuthConnections);\n\n    const dispatch = useDispatch();\n    const intl = useIntl();\n\n    useEffect(() => {\n        if (canManageOutgoingOAuthConnections) {\n            (dispatch(loadOutgoingOAuthConnectionsAndProfiles(props.team.id)) as unknown as Promise<void>).then(\n                () => setLoading(false),\n            );\n        }\n    }, [canManageOutgoingOAuthConnections, props.team, dispatch]);\n\n    const deleteOutgoingOAuthConnectionLocal = (connection: OutgoingOAuthConnection): void => {\n        if (connection && connection.id) {\n            dispatch(deleteOutgoingOAuthConnection(connection.id));\n        }\n    };\n\n    const outgoingOauthConnectionCompare = (a: OutgoingOAuthConnection, b: OutgoingOAuthConnection): number => {\n        let nameA = a.name.toString();\n        if (!nameA) {\n            nameA = intl.formatMessage({id: 'installed_integrations.unnamed_outgoing_oauth_connection', defaultMessage: 'Unnamed Outgoing OAuth Connection'});\n        }\n\n        let nameB = b.name.toString();\n        if (!nameB) {\n            nameB = intl.formatMessage({id: 'installed_integrations.unnamed_outgoing_oauth_connection', defaultMessage: 'Unnamed Outgoing OAuth Connection'});\n        }\n\n        return nameA.localeCompare(nameB);\n    };\n\n    const outgoingOauthConnections = (filter?: string) => {\n        const values = Object.values(connections);\n        const filtered = values.filter((connection) => matchesFilter(connection, filter));\n        const sorted = filtered.sort(outgoingOauthConnectionCompare);\n        const mapped = sorted.map((connection) => {\n            return (\n                <InstalledOutgoingOAuthConnection\n                    key={connection.id}\n                    outgoingOAuthConnection={connection}\n                    onDelete={deleteOutgoingOAuthConnectionLocal}\n                    team={props.team}\n                    creatorName=''\n                />\n            );\n        });\n\n        return mapped;\n    };\n\n    const integrationsEnabled = enableOutgoingOAuthConnections && canManageOutgoingOAuthConnections;\n    let childProps;\n    if (integrationsEnabled) {\n        childProps = {\n            addLink: '/' + props.team.name + '/integrations/outgoing-oauth2-connections/add',\n            addText: intl.formatMessage({id: 'installed_outgoing_oauth_connections.add', defaultMessage: 'Add Outgoing OAuth Connection'}),\n            addButtonId: 'addOutgoingOauthConnection',\n        };\n    }\n\n    return (\n        <BackstageList\n            header={\n                <FormattedMessage\n                    id='installed_outgoing_oauth_connections.header'\n                    defaultMessage='Outgoing OAuth Connections'\n                />\n            }\n            helpText={\n                <FormattedMessage\n                    id='installed_outgoing_oauth_connections.help'\n                    defaultMessage='Create {outgoingOauthConnections} to securely integrate bots and third-party apps with Mattermost.'\n                    values={{\n                        outgoingOauthConnections: (\n                            <ExternalLink\n                                href={DeveloperLinks.SETUP_OAUTH2}\n                                location='installed_outgoing_oauth_connections'\n                            >\n                                <FormattedMessage\n                                    id='installed_outgoing_oauth_connections.help.outgoingOauthConnections'\n                                    defaultMessage='Outgoing OAuth Connections'\n                                />\n                            </ExternalLink>\n                        ),\n                    }}\n                />\n            }\n            emptyText={\n                <FormattedMessage\n                    id='installed_outgoing_oauth_connections.empty'\n                    defaultMessage='No Outgoing OAuth Connections found'\n                />\n            }\n            emptyTextSearch={\n                <FormattedMessage\n                    id='installed_outgoing_oauth_connections.emptySearch'\n                    defaultMessage='No Outgoing OAuth Connections match {searchTerm}'\n                />\n            }\n            searchPlaceholder={intl.formatMessage({id: 'installed_outgoing_oauth_connections.search', defaultMessage: 'Search Outgoing OAuth Connections'})}\n            loading={loading}\n            {...childProps}\n        >\n            {(filter: string) => {\n                const children = outgoingOauthConnections(filter);\n                return [children, children.length > 0];\n            }}\n        </BackstageList>\n    );\n};\n\nexport default InstalledOutgoingOAuthConnections;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport classNames from 'classnames';\nimport React from 'react';\nimport type {ReactNode} from 'react';\nimport {Route, NavLink} from 'react-router-dom';\n\ntype Props = {\n    name: string;\n    title: ReactNode;\n    icon: string;\n    parentLink?: string;\n    children?: ReactNode[];\n}\n\nconst BackstageCategory = ({name, title, icon, parentLink, children = []}: Props) => {\n    const link = parentLink + '/' + name;\n\n    return (\n        <li className='backstage-sidebar__category'>\n            <NavLink\n                to={link}\n                className='category-title'\n                activeClassName='category-title--active'\n            >\n                <i className={classNames('fa ', icon)}/>\n                <span className='category-title__text'>\n                    {title}\n                </span>\n            </NavLink>\n            {\n                children && children.length > 0 &&\n                    <Route\n                        path={link}\n                        render={() => (\n                            <ul className='sections'>\n                                {\n                                    React.Children.map(children, (child) => {\n                                        if (!child) {\n                                            return child;\n                                        }\n\n                                        return React.cloneElement(child as JSX.Element, {\n                                            parentLink: link,\n                                        });\n                                    })\n                                }\n                            </ul>\n                        )}\n                    />\n            }\n        </li>\n    );\n};\n\nexport default BackstageCategory;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport type {ReactNode} from 'react';\nimport {NavLink} from 'react-router-dom';\n\ntype Props = {\n    name: string;\n    title: ReactNode;\n    subsection?: boolean;\n    parentLink?: string;\n    children?: JSX.Element[];\n    id?: string;\n}\n\nconst BackstageSection = ({name, title, subsection = false, parentLink = '', children = [], id}: Props) => {\n    const link = parentLink + '/' + name;\n\n    let clonedChildren = null;\n    if (children.length > 0) {\n        clonedChildren = (\n            <ul className='subsections'>\n                {\n                    React.Children.map(children, (child) => {\n                        return React.cloneElement(child, {\n                            parentLink: link,\n                            subsection: true,\n                        });\n                    })\n                }\n            </ul>\n        );\n    }\n\n    const className = subsection ? 'subsection' : 'section';\n\n    return (\n        <li\n            className={className}\n            id={id}\n        >\n            <NavLink\n                className={`${className}-title`}\n                activeClassName={`${className}-title--active`}\n                to={link}\n            >\n                <span className={`${className}-title__text`}>\n                    {title}\n                </span>\n            </NavLink>\n            {clonedChildren}\n        </li>\n    );\n};\n\nexport default BackstageSection;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {FormattedMessage} from 'react-intl';\n\nimport type {Team} from '@mattermost/types/teams';\n\nimport {Permissions} from 'mattermost-redux/constants';\n\nimport SystemPermissionGate from 'components/permissions_gates/system_permission_gate';\nimport TeamPermissionGate from 'components/permissions_gates/team_permission_gate';\n\nimport BackstageCategory from './backstage_category';\nimport BackstageSection from './backstage_section';\n\ntype Props = {\n    team: Team;\n    enableCustomEmoji: boolean;\n    enableIncomingWebhooks: boolean;\n    enableOutgoingWebhooks: boolean;\n    enableCommands: boolean;\n    enableOAuthServiceProvider: boolean;\n    enableOutgoingOAuthConnections: boolean;\n    canCreateOrDeleteCustomEmoji: boolean;\n    canManageIntegrations: boolean;\n}\n\nexport default class BackstageSidebar extends React.PureComponent<Props> {\n    renderCustomEmoji() {\n        if (!this.props.enableCustomEmoji || !this.props.canCreateOrDeleteCustomEmoji) {\n            return null;\n        }\n\n        return (\n            <BackstageCategory\n                name='emoji'\n                parentLink={'/' + this.props.team.name}\n                icon='fa-smile-o'\n                title={\n                    <FormattedMessage\n                        id='backstage_sidebar.emoji'\n                        defaultMessage='Custom Emoji'\n                    />\n                }\n            />\n        );\n    }\n\n    renderIntegrations() {\n        if (!this.props.canManageIntegrations) {\n            return null;\n        }\n\n        let incomingWebhooks;\n        if (this.props.enableIncomingWebhooks) {\n            incomingWebhooks = (\n                <TeamPermissionGate\n                    permissions={[Permissions.MANAGE_INCOMING_WEBHOOKS]}\n                    teamId={this.props.team.id}\n                >\n                    <BackstageSection\n                        name='incoming_webhooks'\n                        parentLink={'/' + this.props.team.name + '/integrations'}\n                        title={(\n                            <FormattedMessage\n                                id='backstage_sidebar.integrations.incoming_webhooks'\n                                defaultMessage='Incoming Webhooks'\n                            />\n                        )}\n                        id='incomingWebhooks'\n                    />\n                </TeamPermissionGate>\n            );\n        }\n\n        let outgoingWebhooks: JSX.Element | null = null;\n        if (this.props.enableOutgoingWebhooks) {\n            outgoingWebhooks = (\n                <TeamPermissionGate\n                    permissions={[Permissions.MANAGE_OUTGOING_WEBHOOKS]}\n                    teamId={this.props.team.id}\n                >\n                    <BackstageSection\n                        name='outgoing_webhooks'\n                        parentLink={'/' + this.props.team.name + '/integrations'}\n                        title={(\n                            <FormattedMessage\n                                id='backstage_sidebar.integrations.outgoing_webhooks'\n                                defaultMessage='Outgoing Webhooks'\n                            />\n                        )}\n                        id='outgoingWebhooks'\n                    />\n                </TeamPermissionGate>\n            );\n        }\n\n        let commands: JSX.Element | null = null;\n        if (this.props.enableCommands) {\n            commands = (\n                <TeamPermissionGate\n                    permissions={[Permissions.MANAGE_SLASH_COMMANDS]}\n                    teamId={this.props.team.id}\n                >\n                    <BackstageSection\n                        name='commands'\n                        parentLink={'/' + this.props.team.name + '/integrations'}\n                        title={(\n                            <FormattedMessage\n                                id='backstage_sidebar.integrations.commands'\n                                defaultMessage='Slash Commands'\n                            />\n                        )}\n                        id='slashCommands'\n                    />\n                </TeamPermissionGate>\n            );\n        }\n\n        let oauthApps: JSX.Element | null = null;\n        if (this.props.enableOAuthServiceProvider) {\n            oauthApps = (\n                <SystemPermissionGate permissions={[Permissions.MANAGE_OAUTH]}>\n                    <BackstageSection\n                        name='oauth2-apps'\n                        parentLink={'/' + this.props.team.name + '/integrations'}\n                        title={\n                            <FormattedMessage\n                                id='backstage_sidebar.integrations.oauthApps'\n                                defaultMessage='OAuth 2.0 Applications'\n                            />\n                        }\n                        id='oauthApps'\n                    />\n                </SystemPermissionGate>\n            );\n        }\n\n        // Note that we allow managing bot accounts even if bot account creation is disabled: only\n        // a permissions check is required.\n        const botAccounts = (\n            <SystemPermissionGate permissions={['manage_bots', 'manage_others_bots']}>\n                <BackstageSection\n                    name='bots'\n                    parentLink={'/' + this.props.team.name + '/integrations'}\n                    title={\n                        <FormattedMessage\n                            id='backstage_sidebar.bots'\n                            defaultMessage='Bot Accounts'\n                        />\n                    }\n                    id='botAccounts'\n                />\n            </SystemPermissionGate>\n        );\n\n        let outgoingOAuthConnections: JSX.Element | null = null;\n        if (this.props.enableOutgoingOAuthConnections) {\n            outgoingOAuthConnections = (\n                <TeamPermissionGate\n                    permissions={[Permissions.MANAGE_OUTGOING_OAUTH_CONNECTIONS]}\n                    teamId={this.props.team.id}\n                >\n                    <BackstageSection\n                        name='outgoing-oauth2-connections'\n                        parentLink={'/' + this.props.team.name + '/integrations'}\n                        title={\n                            <FormattedMessage\n                                id='backstage_sidebar.integrations.outgoingOauthConnections'\n                                defaultMessage='Outgoing OAuth 2.0 Connections'\n                            />\n                        }\n                        id='outgoingOauthConnections'\n                    />\n                </TeamPermissionGate>\n            );\n        }\n\n        return (\n            <BackstageCategory\n                name='integrations'\n                icon='fa-link'\n                parentLink={'/' + this.props.team.name}\n                title={\n                    <FormattedMessage\n                        id='backstage_sidebar.integrations'\n                        defaultMessage='Integrations'\n                    />\n                }\n            >\n                {incomingWebhooks}\n                {outgoingWebhooks}\n                {commands}\n                {oauthApps}\n                {botAccounts}\n                {outgoingOAuthConnections}\n            </BackstageCategory>\n        );\n    }\n\n    render() {\n        return (\n            <div className='backstage-sidebar'>\n                <ul>\n                    {this.renderCustomEmoji()}\n                    {this.renderIntegrations()}\n                </ul>\n            </div>\n        );\n    }\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React, {useRef} from 'react';\nimport type {ComponentType} from 'react';\nimport {Route, Switch} from 'react-router-dom';\nimport type {match} from 'react-router-dom';\nimport {createGlobalStyle} from 'styled-components';\n\nimport type {Team} from '@mattermost/types/teams';\nimport type {UserProfile} from '@mattermost/types/users';\n\nimport Emoji from 'components/emoji';\nimport AddEmoji from 'components/emoji/add_emoji';\nimport Integrations from 'components/integrations';\nimport AddIncomingWehook from 'components/integrations/add_incoming_webhook';\nimport AddOauthApp from 'components/integrations/add_oauth_app';\nimport AddOutgoingWebhook from 'components/integrations/add_outgoing_webhook';\nimport Bots from 'components/integrations/bots';\nimport AddBot from 'components/integrations/bots/add_bot';\nimport CommandsContainer from 'components/integrations/commands_container';\nimport ConfirmIntegration from 'components/integrations/confirm_integration';\nimport EditIncomingWebhook from 'components/integrations/edit_incoming_webhook';\nimport EditOauthApp from 'components/integrations/edit_oauth_app';\nimport EditOutgoingWebhook from 'components/integrations/edit_outgoing_webhook';\nimport InstalledIncomingWebhooks from 'components/integrations/installed_incoming_webhooks';\nimport InstalledOauthApps from 'components/integrations/installed_oauth_apps';\nimport InstalledOutgoingWebhooks from 'components/integrations/installed_outgoing_webhooks';\nimport AddOutgoingOAuthConnection from 'components/integrations/outgoing_oauth_connections/add_outgoing_oauth_connection';\nimport EditOutgoingOAuthConnection from 'components/integrations/outgoing_oauth_connections/edit_outgoing_oauth_connection';\nimport InstalledOutgoingOAuthConnections from 'components/integrations/outgoing_oauth_connections/installed_outgoing_oauth_connections';\n\nimport Pluggable from 'plugins/pluggable';\n\nimport BackstageNavbar from './components/backstage_navbar';\nimport BackstageSidebar from './components/backstage_sidebar';\n\ntype ExtraProps = Pick<Props, 'user' | 'team'> & {scrollToTop: () => void}\n\ntype BackstageRouteProps = {\n    component: ComponentType<any>;\n    extraProps: ExtraProps;\n    path: string;\n    exact?: boolean;\n}\n\nconst BackstageRoute = ({component: Component, extraProps, ...rest}: BackstageRouteProps) => (\n    <Route\n        {...rest}\n        render={(props) => (\n            <Component\n                {...extraProps}\n                {...props}\n            />\n        )}\n    />\n);\n\ntype Props = {\n\n    /**\n     * Current user.\n     */\n    user: UserProfile;\n\n    /**\n     * Current team.\n     */\n    team?: Team;\n\n    /**\n     * Object from react-router\n     */\n    match: match<{url: string}>;\n\n    siteName?: string;\n    enableCustomEmoji: boolean;\n    enableIncomingWebhooks: boolean;\n    enableOutgoingWebhooks: boolean;\n    enableCommands: boolean;\n    enableOAuthServiceProvider: boolean;\n    enableOutgoingOAuthConnections: boolean;\n    canCreateOrDeleteCustomEmoji: boolean;\n    canManageIntegrations: boolean;\n}\n\nconst BackstageController = (props: Props) => {\n    const listRef = useRef<HTMLDivElement>(null);\n\n    const scrollToTop = () => {\n        if (listRef.current) {\n            listRef.current.scrollTop = 0;\n        }\n    };\n\n    if (!props.team || !props.user) {\n        return null;\n    }\n    const extraProps = {\n        team: props.team,\n        user: props.user,\n        scrollToTop,\n    };\n    return (\n        <>\n            <BackstageNavbar\n                team={props.team}\n                siteName={props.siteName}\n            />\n            <div\n                className='backstage-body'\n                ref={listRef}\n            >\n                <Pluggable pluggableName='Root'/>\n                <BackstageSidebar\n                    team={props.team}\n                    enableCustomEmoji={props.enableCustomEmoji}\n                    enableIncomingWebhooks={props.enableIncomingWebhooks}\n                    enableOutgoingWebhooks={props.enableOutgoingWebhooks}\n                    enableCommands={props.enableCommands}\n                    enableOAuthServiceProvider={props.enableOAuthServiceProvider}\n                    enableOutgoingOAuthConnections={props.enableOutgoingOAuthConnections}\n                    canCreateOrDeleteCustomEmoji={props.canCreateOrDeleteCustomEmoji}\n                    canManageIntegrations={props.canManageIntegrations}\n                />\n                <Switch>\n                    <BackstageRoute\n                        extraProps={extraProps}\n                        exact={true}\n                        path={'/:team/integrations'}\n                        component={Integrations}\n                    />\n                    <BackstageRoute\n                        extraProps={extraProps}\n                        exact={true}\n                        path={`${props.match.url}/incoming_webhooks`}\n                        component={InstalledIncomingWebhooks}\n                    />\n                    <BackstageRoute\n                        extraProps={extraProps}\n                        path={`${props.match.url}/incoming_webhooks/add`}\n                        component={AddIncomingWehook}\n                    />\n                    <BackstageRoute\n                        extraProps={extraProps}\n                        path={`${props.match.url}/incoming_webhooks/edit`}\n                        component={EditIncomingWebhook}\n                    />\n                    <BackstageRoute\n                        extraProps={extraProps}\n                        exact={true}\n                        path={`${props.match.url}/outgoing_webhooks`}\n                        component={InstalledOutgoingWebhooks}\n                    />\n                    <BackstageRoute\n                        extraProps={extraProps}\n                        path={`${props.match.url}/outgoing_webhooks/add`}\n                        component={AddOutgoingWebhook}\n                    />\n                    <BackstageRoute\n                        extraProps={extraProps}\n                        path={`${props.match.url}/outgoing_webhooks/edit`}\n                        component={EditOutgoingWebhook}\n                    />\n                    <BackstageRoute\n                        extraProps={extraProps}\n                        path={`${props.match.url}/commands`}\n                        component={CommandsContainer}\n                    />\n                    <BackstageRoute\n                        extraProps={extraProps}\n                        exact={true}\n                        path={`${props.match.url}/oauth2-apps`}\n                        component={InstalledOauthApps}\n                    />\n                    <BackstageRoute\n                        extraProps={extraProps}\n                        path={`${props.match.url}/oauth2-apps/add`}\n                        component={AddOauthApp}\n                    />\n                    <BackstageRoute\n                        extraProps={extraProps}\n                        path={`${props.match.url}/oauth2-apps/edit`}\n                        component={EditOauthApp}\n                    />\n                    <BackstageRoute\n                        extraProps={extraProps}\n                        exact={true}\n                        path={`${props.match.url}/outgoing-oauth2-connections`}\n                        component={InstalledOutgoingOAuthConnections}\n                    />\n                    <BackstageRoute\n                        extraProps={extraProps}\n                        exact={true}\n                        path={`${props.match.url}/outgoing-oauth2-connections/add`}\n                        component={AddOutgoingOAuthConnection}\n                    />\n                    <BackstageRoute\n                        extraProps={extraProps}\n                        exact={true}\n                        path={`${props.match.url}/outgoing-oauth2-connections/edit`}\n                        component={EditOutgoingOAuthConnection}\n                    />\n                    <BackstageRoute\n                        extraProps={extraProps}\n                        path={`${props.match.url}/confirm`}\n                        component={ConfirmIntegration}\n                    />\n                    <BackstageRoute\n                        extraProps={extraProps}\n                        exact={true}\n                        path={'/:team/emoji'}\n                        component={Emoji}\n                    />\n                    <BackstageRoute\n                        extraProps={extraProps}\n                        path={`${props.match.url}/add`}\n                        component={AddEmoji}\n                    />\n                    <BackstageRoute\n                        extraProps={extraProps}\n                        path={`${props.match.url}/bots/add`}\n                        component={AddBot}\n                    />\n                    <BackstageRoute\n                        extraProps={extraProps}\n                        path={`${props.match.url}/bots/edit`}\n                        component={AddBot}\n                    />\n                    <BackstageRoute\n                        extraProps={extraProps}\n                        path={`${props.match.url}/bots`}\n                        component={Bots}\n                    />\n                </Switch>\n            </div>\n            <BackstageGlobalStyle/>\n        </>\n    );\n};\n\nexport default BackstageController;\n\nconst BackstageGlobalStyle = createGlobalStyle`\n    #root {\n        > #global-header,\n        > .team-sidebar,\n        > .main-wrapper .sidebar--right,\n        > .app-bar {\n            display: none;\n        }\n    }\n`;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport {connect} from 'react-redux';\nimport {withRouter} from 'react-router-dom';\n\nimport {Permissions} from 'mattermost-redux/constants';\nimport {getConfig} from 'mattermost-redux/selectors/entities/general';\nimport {haveITeamPermission, haveISystemPermission} from 'mattermost-redux/selectors/entities/roles';\nimport {getMyTeams, getCurrentTeam} from 'mattermost-redux/selectors/entities/teams';\nimport {getCurrentUser} from 'mattermost-redux/selectors/entities/users';\n\nimport type {GlobalState} from 'types/store';\n\nimport BackstageController from './backstage_controller';\n\nfunction mapStateToProps(state: GlobalState) {\n    const user = getCurrentUser(state);\n    const team = getCurrentTeam(state);\n\n    const config = getConfig(state);\n\n    const siteName = config.SiteName;\n    const enableCustomEmoji = config.EnableCustomEmoji === 'true';\n    const enableIncomingWebhooks = config.EnableIncomingWebhooks === 'true';\n    const enableOutgoingWebhooks = config.EnableOutgoingWebhooks === 'true';\n    const enableCommands = config.EnableCommands === 'true';\n    const enableOAuthServiceProvider = config.EnableOAuthServiceProvider === 'true';\n    const enableOutgoingOAuthConnections = config.EnableOutgoingOAuthConnections === 'true';\n\n    let canCreateOrDeleteCustomEmoji = (haveISystemPermission(state, {permission: Permissions.CREATE_EMOJIS}) || haveISystemPermission(state, {permission: Permissions.DELETE_EMOJIS}));\n    if (!canCreateOrDeleteCustomEmoji) {\n        for (const t of getMyTeams(state)) {\n            if (haveITeamPermission(state, t.id, Permissions.CREATE_EMOJIS) || haveITeamPermission(state, t.id, Permissions.DELETE_EMOJIS)) {\n                canCreateOrDeleteCustomEmoji = true;\n                break;\n            }\n        }\n    }\n\n    const canManageTeamIntegrations = (haveITeamPermission(state, team?.id, Permissions.MANAGE_SLASH_COMMANDS) || haveITeamPermission(state, team?.id, Permissions.MANAGE_OAUTH) || haveITeamPermission(state, team?.id, Permissions.MANAGE_INCOMING_WEBHOOKS) || haveITeamPermission(state, team?.id, Permissions.MANAGE_OUTGOING_WEBHOOKS));\n    const canManageSystemBots = (haveISystemPermission(state, {permission: Permissions.MANAGE_BOTS}) || haveISystemPermission(state, {permission: Permissions.MANAGE_OTHERS_BOTS}));\n    const canManageIntegrations = canManageTeamIntegrations || canManageSystemBots;\n\n    return {\n        user,\n        team,\n        siteName,\n        enableCustomEmoji,\n        enableIncomingWebhooks,\n        enableOutgoingWebhooks,\n        enableCommands,\n        enableOAuthServiceProvider,\n        enableOutgoingOAuthConnections,\n        canCreateOrDeleteCustomEmoji,\n        canManageIntegrations,\n    };\n}\n\nexport default withRouter(connect(mapStateToProps)(BackstageController));\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\n\nconst TYPE_MODAL = 'modal';\nconst TYPE_BACKSTAGE = 'backstage';\n\n// accepts either a single error or an array of errors\ntype Props = {\n    type?: React.ReactNode;\n    error?: React.ReactNode;\n    textClassName?: string;\n    iconClassName?: string;\n    margin?: boolean;\n    errors?: React.ReactNode[];\n};\n\nconst EMPTY_ERROR_LIST: React.ReactNode[] = [];\n\nconst FormError: React.FC<Props> = ({\n    error = null,\n    errors = EMPTY_ERROR_LIST,\n    iconClassName,\n    margin,\n    textClassName,\n    type,\n}) => {\n    if (!error && errors.length === 0) {\n        return null;\n    }\n\n    // look for the first truthy error to display\n    let message = error;\n\n    if (!message) {\n        for (const err of errors) {\n            if (err) {\n                message = err;\n            }\n        }\n    }\n\n    if (!message) {\n        return null;\n    }\n\n    if (type === TYPE_MODAL) {\n        return (\n            <div className='form-group'>\n                <label className='col-sm-12 has-error'>{message}</label>\n            </div>\n        );\n    }\n\n    if (type === TYPE_BACKSTAGE) {\n        return (\n            <div className='pull-left has-error'>\n                <label className='control-label'>{message}</label>\n            </div>\n        );\n    }\n\n    if (margin) {\n        return (\n            <div className='form-group has-error'>\n                <label className='control-label'>{message}</label>\n            </div>\n        );\n    }\n\n    return (\n        <div className={`col-sm-12 ${textClassName || 'has-error'}`}>\n            <label className='control-label'>\n                <i\n                    className={`fa ${iconClassName || 'fa-exclamation-circle'}`}\n                />{' '}\n                {message}\n            </label>\n        </div>\n    );\n};\n\nexport default React.memo(FormError);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {useIntl, type MessageDescriptor} from 'react-intl';\n\ntype Props = {\n    placeholder: MessageDescriptor;\n} & Omit<React.InputHTMLAttributes<HTMLInputElement>, 'placeholder'>;\n\nconst LocalizedPlaceholderInput = React.forwardRef<HTMLInputElement, Props>(({placeholder, ...otherProps}, ref) => {\n    const intl = useIntl();\n\n    return (\n        <input\n            ref={ref}\n            placeholder={intl.formatMessage(placeholder)}\n            {...otherProps}\n        />\n    );\n});\n\nLocalizedPlaceholderInput.displayName = 'LocalizedPlaceholderInput';\n\nexport default LocalizedPlaceholderInput;\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport classNames from 'classnames';\nimport React from 'react';\nimport {useIntl} from 'react-intl';\n\ntype Props = {\n    additionalClassName?: string;\n}\n\nconst NextIcon = ({additionalClassName}: Props) => {\n    const {formatMessage} = useIntl();\n\n    return (\n        <i\n            className={classNames('icon icon-chevron-right', additionalClassName)}\n            title={formatMessage({\n                id: 'generic_icons.next',\n                defaultMessage: 'Next Icon',\n            })}\n        />\n    );\n};\n\nexport default React.memo(NextIcon);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport classNames from 'classnames';\nimport React from 'react';\nimport {useIntl} from 'react-intl';\n\ntype Props = {\n    additionalClassName?: string;\n}\n\nconst PreviousIcon = ({additionalClassName}: Props) => {\n    const {formatMessage} = useIntl();\n\n    return (\n        <i\n            className={classNames('icon icon-chevron-left', additionalClassName)}\n            title={formatMessage({id: 'generic_icons.previous', defaultMessage: 'Previous Icon'})}\n        />\n    );\n};\n\nexport default React.memo(PreviousIcon);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport React from 'react';\nimport {useIntl} from 'react-intl';\n\nexport default function SearchIcon() {\n    const {formatMessage} = useIntl();\n\n    return (\n        <i\n            className='fa fa-search'\n            title={formatMessage({id: 'generic_icons.search', defaultMessage: 'Search Icon'})}\n        />\n    );\n}\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport classNames from 'classnames';\nimport React from 'react';\nimport {useIntl} from 'react-intl';\n\ntype Props = {\n    additionalClassName?: string;\n}\n\nconst WarningIcon = ({additionalClassName}: Props) => {\n    const {formatMessage} = useIntl();\n    return (\n        <i\n            className={classNames('fa fa-warning', additionalClassName)}\n            title={formatMessage({id: 'generic_icons.warning', defaultMessage: 'Warning Icon'})}\n        />\n    );\n};\n\nexport default React.memo(WarningIcon);\n","// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.\n// See LICENSE.txt for license information.\n\nimport type {Bot} from '@mattermost/types/bots';\nimport type {GlobalState} from '@mattermost/types/store';\n\nimport {createSelector} from 'mattermost-redux/selectors/create_selector';\nimport {getUsers} from 'mattermost-redux/selectors/entities/common';\n\nexport const ExternalBotAccountNames: string[] = ['mattermost-advisor'];\n\nexport function getBotAccounts(state: GlobalState) {\n    return state.entities.bots.accounts;\n}\n\nexport const getExternalBotAccounts: (state: GlobalState) => Record<string, Bot> = createSelector(\n    'getExternalBotAccounts',\n    getBotAccounts,\n    getUsers,\n    (botAccounts, userProfiles) => {\n        const nextState: Record<string, Bot> = {};\n        Object.values(botAccounts).forEach((botAccount) => {\n            const botUser = userProfiles[botAccount.user_id];\n            if (botUser && !ExternalBotAccountNames.includes(botUser.username)) {\n                nextState[botAccount.user_id] = botAccount;\n            }\n        });\n\n        return nextState;\n    },\n);\n"],"names":["BackIcon","formatMessage","useIntl","React","className","title","id","defaultMessage","BackstageNavbar","_ref","team","siteName","teamExists","delete_at","Link","to","concat","name","FormattedMessage","values","propTypes","_pt","DeleteIntegrationLink","props","confirmButtonText","linkText","modalMessage","modalTitle","onDelete","openModal","onClick","useCallback","modalId","dialogProps","confirmButtonClass","modalClass","message","subtitleText","WarningIcon","additionalClassName","onConfirm","dialogType","ConfirmModalRedux","isRequired","mapDispatchToProps","connect","DeleteEmojiButton","DELETE_PERMISSION","Permissions","DELETE_EMOJIS","DELETE_OTHER_PERMISSION","DELETE_OTHERS_EMOJIS","EmojiListItem","actions","deleteCustomEmoji","emoji","creatorUsername","currentUserId","creatorDisplayName","emoticonStyle","useMemo","backgroundImage","Client4","getCustomEmojiImageUrl","handleDelete","displayName","deleteButton","creator_id","AnyTeamPermissionGate","permissions","style","emojiId","state","ownProps","entities","emojis","customEmoji","creator","getUser","getDisplayNameByUser","username","getCurrentUserId","currentTeam","getCurrentTeam","dispatch","bindActionCreators","EmojiList","constructor","super","_defineProperty","e","preventDefault","next","this","page","setState","nextLoading","getCustomEmojis","Emoji","SORT_BY_NAME","then","data","length","missingPages","scrollToTop","target","term","value","clearTimeout","searchTimeout","setTimeout","async","trim","searchEmojis","loading","searchCustomEmojis","map","em","index","indexOf","newSearchEmojis","splice","componentDidMount","EMOJI_PER_PAGE","_ref2","render","nextButton","previousButton","push","key","colSpan","LoadingScreen","emojiIds","forEach","deleteFromSearch","pageStart","pageEnd","slice","buttonContents","NextIcon","SaveButton","btnClass","extraClasses","nextPage","saving","disabled","savingMessage","previousPage","PreviousIcon","SearchIcon","LocalizedPlaceholderInput","type","placeholder","defineMessage","onChange","onSearchChange","search","flexGrow","flexShrink","getCustomEmojiIdsSortedByName","CREATE_EMOJIS_PERMISSIONS","CREATE_EMOJIS","ROLES","EmojiPage","teamDisplayName","teamName","currentTheme","intl","useEffect","updateTitle","loadRolesIfNeeded","Utils","document","display_name","general","config","SiteName","getTheme","children","childrenElements","child","AddEmoji","handleSubmit","emojiMap","user","image","error","toLowerCase","startsWith","endsWith","substring","test","hasSystemEmoji","has","size","response","createCustomEmoji","getHistory","responseError","genericError","files","imageUrl","reader","FileReader","onload","result","readAsDataURL","filename","preview","htmlFor","BackstageHeader","onSubmit","handleFormSubmit","maxLength","updateName","accept","Constants","ACCEPT_EMOJI_IMAGE","multiple","updateImage","FormError","SpinnerButton","spinning","spinningText","handleSaveButtonClick","getEmojiMap","IntegrationOption","description","link","alt","src","Integrations","arguments","currentSiteName","options","enableIncomingWebhooks","TeamPermissionGate","teamId","MANAGE_INCOMING_WEBHOOKS","IncomingWebhookIcon","enableOutgoingWebhooks","MANAGE_OUTGOING_WEBHOOKS","OutgoingWebhookIcon","enableCommands","MANAGE_SLASH_COMMANDS","SlashCommandIcon","enableOAuthServiceProvider","SystemPermissionGate","MANAGE_OAUTH","OAuthIcon","enableOutgoingOAuthConnections","MANAGE_OUTGOING_OAUTH_CONNECTIONS","OutgoingOAuthConnectionsIcon","BotAccountsIcon","appDirectory","ExternalLink","href","location","getConfig","EnableIncomingWebhooks","EnableOutgoingWebhooks","EnableCommands","EnableOAuthServiceProvider","EnableOutgoingOAuthConnections","ChannelSelect","channels","selectOpen","selectPrivate","selectDm","channel","channelName","OPEN_CHANNEL","PRIVATE_CHANNEL","DM_CHANNEL","memo","getMyChannelsSorted","createSelector","getMyChannels","getCurrentUserLocale","locale","filter","sort","sortChannelsByTypeAndDisplayName","bind","AbstractIncomingWebhook","PureComponent","hook","channelId","channel_id","channelLocked","channel_locked","iconURL","icon_url","serverError","clientError","_this$props$initialHo","_this$props$initialHo2","_this$props$initialHo3","_this$props$initialHo4","_this$props$initialHo5","_this$props$initialHo6","initialHook","create_at","update_at","team_id","user_id","action","checked","getStateFromHook","headerToRender","header","footerToRender","footer","updateDisplayName","updateDescription","updateChannelId","updateChannelLocked","enablePostUsernameOverride","updateUsername","enablePostIconOverride","updateIconURL","errors","messages","defineMessages","AddIncomingWebhook","setServerError","useState","addIncomingHook","createIncomingHook","EnablePostUsernameOverride","EnablePostIconOverride","r","t","i","Symbol","toPrimitive","call","TypeError","String","_toPrimitive","_toPropertyKey","Object","defineProperty","enumerable","configurable","writable","AbstractOAuthApp","app","homepage","callbackUrls","callback_urls","join","is_trusted","has_icon","Boolean","_this$icon_url$curren","current","callbackUrl","split","Image","imageLoaded","getStateFromApp","initialApp","renderExtra","icon","trusted","MANAGE_SYSTEM","updateTrusted","updateHomepage","ref","updateIconUrl","rows","updateCallbackUrls","AddOAuthApp","history","useHistory","addOAuthApp","AbstractOutgoingWebhook","triggerWords","trigger_words","contentType","content_type","triggerWhen","trigger_when","triggerWord","token","parseInt","contentTypeOption1","contentTypeOption2","updateContentType","updateTriggerWords","updateTriggerWhen","localizeMessage","DocLinks","TRUSTED_CONNECTION","AddOutgoingWebhook","createOutgoingHook","createBot","bot","bindClientFunc","clientFunc","onSuccess","BotTypes","RECEIVED_BOT_ACCOUNT","params","patchBot","botUserId","botPatch","loadBots","undefined","perPage","getBotsIncludeDeleted","RECEIVED_BOT_ACCOUNTS","disableBot","enableBot","getIncomingHooks","integrations","incomingHooks","getOutgoingHooks","outgoingHooks","getCommands","commands","getOAuthApps","oauthApps","getOutgoingOAuthConnections","outgoingOAuthConnections","getFilteredIncomingHooks","getCurrentTeamId","hooks","keys","incomingHook","getAppsOAuthAppIDs","appsEnabled","appsOAuthAppIDs","apps","ids","getAppsBotIDs","appsBotIDs","o","getAllCommands","systemCommands","_objectSpread","currentTeamId","command","auto_complete","a","b","localeCompare","remainingProps","setFilter","filterLowered","searchPlaceholder","childCount","hasChildren","emptyTextSearch","searchTerm","emptyText","addLink","addText","addButtonId","hasFilter","startCount","endCount","total","isFirstPage","isLastPage","getPaging","pageSize","childrenToDisplay","previousPageFn","nextPageFn","helpText","matchesFilter","owner","ownerUsername","Bot","enableUserAccessToken","disableUserAccessToken","confirmingId","revokeUserAccessToken","closeConfirm","creatingTokenState","assign","createUserAccessToken","fromApp","tokenList","accessTokens","activeLink","disabledText","disableClass","is_active","confirmRevokeToken","openCreateToken","handleCreateToken","autoFocus","handleUpdateDescription","closeCreateToken","imageURL","last_picture_update","Markdown","ConfirmModal","show","revokeTokenConfirmed","onCancel","Bots","owners","users","includes","bots","match","enabledBots","botToJSX","disabledBots","EnabledSection","DisabledSection","hasDisabled","START_PAGE_NUM","PAGE_SIZE","promises","owner_id","getUserAccessTokensForUser","Promise","all","fetchAppsBotIDs","botsToDisplay","BackstageList","createBots","chunks","botAccounts","EnableBotAccountCreation","getExternalBotAccounts","botValues","reduce","UserSelectors","admin","userAccessTokensByUser","roleOptionSystemAdmin","roleOptionMember","AddBot","role","postAll","postChannels","pictureFile","previewBlob","URL","createObjectURL","e2","_e2$target","orientation","FileUtils","orientationStyles","readAsArrayBuffer","BotDefaultIcon","roles","General","SYSTEM_USER_ROLE","SYSTEM_ADMIN_ROLE","SYSTEM_POST_ALL_ROLE","SYSTEM_POST_ALL_PUBLIC_ROLE","rolesResult","updateUserRoles","adding","isFile","AcceptedProfileImageTypes","maxFileSize","uploadProfileImage","setDefaultProfileImage","updateRoles","usernameError","errObj","ValidationErrors","INVALID_LAST_CHARACTER","tokenResult","UserUtils","transform","transformOrigin","file","subtitle","buttonText","buttonActiveText","imageStyles","removeImageIcon","WithTooltip","setDefault","ACCEPT_STATIC_IMAGE","updatePicture","editingUserHasManageSystem","updateRole","msg","DeveloperLinks","PERSONAL_ACCESS_TOKENS","updatePostAll","updatePostChannels","botId","URLSearchParams","get","getBotAccounts","MaxFileSize","haveISystemPermission","permission","DEFAULT_PAGE_SIZE","loadIncomingHooksAndProfilesForTeam","includeTotalCount","IntegrationActions","incoming_webhooks","getState","profilesToLoad","list","getProfilesByIds","loadOutgoingHooksAndProfilesForTeam","loadCommandsAndProfilesForTeam","loadOAuthAppsAndProfiles","loadProfilesForOAuthApps","OAuthConnectionAudienceInput","mounted","useRef","matchedConnection","setMatchingOAuthConnection","loadingAudienceMatch","setLoadingAudienceMatch","oauthConnections","useSelector","oauthConnectionsEnabled","useDispatch","matchConnectionsOnInput","res","fetchOutgoingOAuthConnectionsForAudience","inputValue","debouncedMatchConnections","debounce","fetchOutgoingOAuthConnections","connections","input","autoComplete","oauthMessage","LoadingSpinner","OauthIcon","connectionName","InformationOutlineIcon","AbstractCommand","_command$display_name","_command$description","_command$trigger","_command$url","_command$method","_command$username","_command$icon_url","_command$auto_complet","_command$auto_complet2","_command$auto_complet3","trigger","url","method","iconUrl","autocomplete","autocompleteHint","auto_complete_hint","autocompleteDescription","auto_complete_desc","substr","_this$state$autocompl","_this$state$autocompl2","MIN_TRIGGER_LENGTH","MAX_TRIGGER_LENGTH","min","max","methodValue","getStateFromCommand","initialCommand","updateAutocompleteHint","updateAutocompleteDescription","getBackstageHeader","updateTrigger","CUSTOM_SLASH_COMMANDS","updateUrl","text","updateMethod","updateAutocomplete","getBackstageFooter","AddCommand","headerMessage","footerMessage","loadingMessage","addCommand","CopyText","label","copyText","copyToClipboard","queryCommandSupported","ConfirmIntegration","window","addEventListener","handleKeyPress","removeEventListener","headerText","tokenText","outgoingHook","oauthApp","outgoingOAuthConnection","COMMAND","commandToken","SETUP_CUSTOM_SLASH_COMMANDS","copyToken","INCOMING_WEBHOOK","incomingHookToken","getSiteURL","SETUP_INCOMING_WEBHOOKS","OUTGOING_WEBHOOK","outgoingHookToken","SETUP_OUTGOING_WEBHOOKS","OAUTH_APP","oauthAppToken","oauthAppSecret","client_secret","SETUP_OAUTH2","copyClientId","secret","copyClientSecret","OUTGOING_OAUTH_CONNECTIONS","clientId","client_id","clientSecret","credentials_username","password","credentials_password","grant_type","copyUsername","oauth_token_url","audiences","BOT","replace","ErrorPageTypes","PAGE_NOT_FOUND","botToken","botname","EditCommand","_this$state$originalC","_this$state$originalC2","_this$state$originalC3","_this$state$originalC4","newCommand","originalCommand","handleConfirmModal","submitCommand","showConfirmModal","editCommand","confirmButton","confirmTitle","confirmMessage","confirmModalDismissed","getCustomTeamCommands","commandId","InstalledCommand","onRegenToken","canChange","handleRegenToken","createAt","InstalledCommands","regenCommandToken","deleteCommand","commandCompare","nameA","nameB","canManageOthersSlashCommands","buildYourOwn","haveITeamPermission","MANAGE_OTHERS_SLASH_COMMANDS","CommandRoute","component","Component","extraProps","rest","_objectWithoutProperties","_excluded","Route","path","CommandsContainer","_this$props$team","Switch","exact","Redirect","getUsers","EditIncomingWebhook","_this$props$hook","newHook","submitHook","updateIncomingHook","getIncomingHook","hookId","editIncomingHook","HEADER","FOOTER","LOADING","EditOAuthApp","newApp","every","v","submitOAuthApp","editOAuthApp","err","getOAuthApp","oauthAppId","EditOutgoingWebhook","triggerWordsSame","callbackUrlsSame","updateOutgoingHook","getOutgoingHook","editOutgoingHook","incomingWebhook","InstalledIncomingWebhook","incomingWebhookId","InstalledIncomingWebhooks","removeIncomingHook","pageToLoad","loadPage","displayNameA","channelA","displayNameB","incomingWebhookCompare","canManageOthersWebhooks","deleteIncomingWebhook","incomingHooksTotalCount","incomingWebhooks","getIncomingHooksTotalCount","MANAGE_OTHERS_INCOMING_WEBHOOKS","getAllChannels","FAKE_SECRET","InstalledOAuthApp","onRegenerateSecret","handleShowClientSecret","creatorName","urls","isTrusted","showHide","handleHideClientSecret","regen","handleRegenerate","appInfo","InstalledOAuthApps","deleteOAuthApp","oauthAppCompare","regenOAuthAppSecret","toString","canManageOauth","oauthApplications","outgoingWebhook","InstalledOutgoingWebhook","makeDisplayName","InstalledOutgoingWebhooks","regenOutgoingHookToken","removeOutgoingHook","channelB","outgoingWebhooks","outgoingWebhookCompare","regenOutgoingWebhookToken","MANAGE_OTHERS_OUTGOING_WEBHOOKS","Actions","ownKeys","getOwnPropertySymbols","getOwnPropertyDescriptor","apply","getOwnPropertyDescriptors","defineProperties","ValidationStatus","initialState","AbstractOutgoingOAuthConnection","formState","setFormState","connection","audienceUrls","oauthTokenUrl","grantType","newState","oldState","useOutgoingOAuthForm","initialConnection","storedError","setError","validationError","setValidationError","isSubmitting","setIsSubmitting","validationStatus","setValidationStatus","INITIAL","isEditingSecret","setIsEditingSecret","isValidationModalOpen","setIsValidationModalOpen","isNewConnection","parseForm","requireAudienceUrl","audienceUrl","hideSkipValidateModal","VALIDATED","submitAction","setUnvalidated","DIRTY","clientSecretSection","repeat","startEditingClientSecret","ValidateButton","_props$initialConnect","VALIDATING","validateOutgoingOAuthConnection","ERROR","status","onExited","AlertOutlineIcon","CheckCircleOutlineIcon","addOutgoingOAuthConnection","connectionId","existingConnection","newConnection","setNewConnection","setShowConfirmModal","getOutgoingOAuthConnection","createOutgoingOAuthConnection","editOutgoingOAuthConnection","InstalledOutgoingOAuthConnection","connectionInfo","setLoading","canManageOutgoingOAuthConnections","loadOutgoingOAuthConnectionsAndProfiles","deleteOutgoingOAuthConnectionLocal","deleteOutgoingOAuthConnection","outgoingOauthConnectionCompare","childProps","outgoingOauthConnections","parentLink","NavLink","activeClassName","classNames","subsection","clonedChildren","BackstageSidebar","renderCustomEmoji","enableCustomEmoji","canCreateOrDeleteCustomEmoji","BackstageCategory","renderIntegrations","canManageIntegrations","BackstageSection","BackstageRoute","BackstageGlobalStyle","createGlobalStyle","withRouter","getCurrentUser","EnableCustomEmoji","getMyTeams","canManageTeamIntegrations","canManageSystemBots","MANAGE_BOTS","MANAGE_OTHERS_BOTS","listRef","scrollTop","Pluggable","pluggableName","AddIncomingWehook","InstalledOauthApps","AddOauthApp","EditOauthApp","InstalledOutgoingOAuthConnections","AddOutgoingOAuthConnection","EditOutgoingOAuthConnection","EMPTY_ERROR_LIST","iconClassName","margin","textClassName","otherProps","ExternalBotAccountNames","accounts","userProfiles","nextState","botAccount","botUser"],"sourceRoot":""}

VaKeR 2022