@elliemae/ssf-host 2.23.2 → 2.23.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"js/emuiSsfHost.a4526c5eda64df08190f.js","mappings":"CAAC,SAA0CA,EAAMC,EAAS,CACtD,OAAO,SAAY,UAAY,OAAO,QAAW,SACnD,OAAO,QAAUA,EAAQ,EAClB,OAAO,QAAW,YAAc,OAAO,IAC9C,OAAO,CAAC,EAAGA,CAAO,EACX,OAAO,SAAY,SAC1B,QAAQ,IAASA,EAAQ,GAEzBD,EAAK,IAASA,EAAK,KAAU,CAAC,EAAGA,EAAK,IAAO,KAAUC,EAAQ,EACjE,GAAG,WAAY,K,kBCRf,IAAIC,EAAsB,CAAC,ECA3BA,EAAoB,EAAI,CAACC,EAASC,IAAe,CAChD,QAAQC,KAAOD,EACXF,EAAoB,EAAEE,EAAYC,CAAG,GAAK,CAACH,EAAoB,EAAEC,EAASE,CAAG,GAC/E,OAAO,eAAeF,EAASE,EAAK,CAAE,WAAY,GAAM,IAAKD,EAAWC,CAAG,CAAE,CAAC,CAGjF,ECPAH,EAAoB,EAAI,CAACI,EAAKC,IAAU,OAAO,UAAU,eAAe,KAAKD,EAAKC,CAAI,ECCtFL,EAAoB,EAAKC,GAAY,CACjC,OAAO,OAAW,KAAe,OAAO,aAC1C,OAAO,eAAeA,EAAS,OAAO,YAAa,CAAE,MAAO,QAAS,CAAC,EAEvE,OAAO,eAAeA,EAAS,aAAc,CAAE,MAAO,EAAK,CAAC,CAC7D,E,qJCNA,MAAMK,CAAM,CAKV,KAIA,SAIA,GAKA,YAAYC,EAAO,CACjB,KAAM,CAAE,KAAAC,EAAM,SAAAC,CAAS,EAAIF,EAC3B,GAAI,CAACC,EAAM,MAAM,IAAI,MAAM,wBAAwB,EACnD,GAAI,CAACC,EAAU,MAAM,IAAI,MAAM,iCAAiC,EAChE,KAAK,SAAWA,EAChB,KAAK,KAAOD,EACZ,KAAK,GAAK,GAAG,KAAK,QAAQ,IAAI,KAAK,IAAI,GAAG,YAAY,CACxD,CACF,CACA,MAAME,CAAW,CAMf,OAAQ,OAAO,WAAW,EAAEN,EAAK,CAC/B,OAAO,OAAOA,GAAQ,UAAYA,IAAQ,MAAQ,YAAaA,GAAO,OAAOA,EAAI,SAAY,YAAcA,EAAI,QAAQ,IAAM,YAC/H,CAKAO,GAIA,SAIA,KAIA,GAKA,SAAU,CACR,MAAO,YACT,CAKA,YAAYJ,EAAO,CACjB,KAAM,CAAE,KAAAC,EAAM,SAAAC,EAAU,SAAAG,CAAS,EAAIL,EACrC,GAAI,CAACC,EAAM,MAAM,IAAI,MAAM,wBAAwB,EACnD,GAAI,CAACC,EAAU,MAAM,IAAI,MAAM,iCAAiC,EAChE,GAAI,CAACG,EAAU,MAAM,IAAI,MAAM,0BAA0B,EACzD,KAAK,SAAWH,EAChB,KAAK,KAAOD,EACZ,KAAKG,GAAYC,EACjB,KAAK,GAAK,GAAG,KAAK,QAAQ,IAAI,KAAK,IAAI,GAAG,YAAY,CACxD,CAMA,UAAaC,GAAa,KAAKF,GAAU,UAAU,CACjD,QAAS,KAAK,GACd,SAAAE,CACF,CAAC,EAKD,YAAeC,GAAU,CACvB,KAAKH,GAAU,YAAY,CACzB,QAAS,KAAK,GACd,MAAAG,CACF,CAAC,CACH,CACF,CACA,MAAMC,EAAWC,GAAUA,aAAiBV,EACtCW,GAAa,CAACR,EAAUS,IAAc,GAAGT,EAAS,YAAY,CAAC,IAAIS,EAAU,YAAY,CAAC,GC9F1FC,EAAW,WACXC,EAAmB,CAACJ,EAAOK,IAAW,OAAOL,IAAUG,GAAY,CAAC,CAACE,GAAU,CAACA,EAAO,WAAW,GAAG,EAC3G,MAAMC,CAAgB,CAIpBC,GAIAC,GAAc,SAMd,YAAYf,EAAUgB,EAAY,CAChC,KAAKF,GAAMd,EACX,KAAKe,GAAcC,GAAc,KAAKD,EACxC,CAIA,IAAI,IAAK,CACP,OAAO,KAAKD,EACd,CAIA,IAAI,YAAa,CACf,OAAO,KAAKC,EACd,CAMA,QAAU,IAAM,CACd,MAAME,EAAY,CAAC,EACbC,EAAS,CAAC,EAChB,cAAO,KAAK,IAAI,EAAE,QAASC,GAAa,CACtC,MAAMZ,EAAQ,KAAKY,CAAQ,EACvBb,EAAQC,CAAK,EACfW,EAAO,KAAKC,CAAQ,EACXR,EAAiBJ,EAAOY,CAAQ,GACzCF,EAAU,KAAKE,CAAQ,CAE3B,CAAC,EACM,CACL,SAAU,KAAKL,GACf,WAAY,KAAKC,GACjB,UAAAE,EACA,OAAAC,CACF,CACF,EAKA,SAAW,IAAM,CACjB,EAIA,QAAU,IAAM,CAChB,CACF,CCnEA,IAAIE,GAAgCC,IAClCA,EAAa,WAAgB,cAC7BA,EAAa,oBAAyB,uBACtCA,EAAa,sBAA2B,yBACxCA,EAAa,WAAgB,cAC7BA,EAAa,WAAgB,cAC7BA,EAAa,mBAAwB,sBACrCA,EAAa,YAAiB,eAC9BA,EAAa,UAAe,YAC5BA,EAAa,aAAkB,gBAC/BA,EAAa,UAAe,aAC5BA,EAAa,WAAgB,cAC7BA,EAAa,YAAiB,eAC9BA,EAAa,YAAiB,eAC9BA,EAAa,UAAe,aAC5BA,EAAa,aAAkB,gBACxBA,IACND,GAAe,CAAC,CAAC,ECZRE,GAAAA,IAIVA,EAAA,MAAQ,QAIRA,EAAA,MAAQ,QAREA,IAAAA,GAAA,IAgBAC,GAAAA,IACVA,EAAA,oCAAsC,0CACtCA,EAAA,eAAiB,kBACjBA,EAAA,WAAa,cACbA,EAAA,YAAc,eACdA,EAAA,qBAAuB,yBACvBA,EAAA,iBAAmB,qBACnBA,EAAA,YAAc,eACdA,EAAA,2BAA6B,iCAC7BA,EAAA,kBAAoB,qBACpBA,EAAA,gBAAkB,oBAClBA,EAAA,aAAe,gBACfA,EAAA,mCAAqC,0CACrCA,EAAA,mBAAqB,uBACrBA,EAAA,mCAAqC,0CAd3BA,IAAAA,GAAA,ICnBL,MAAMC,EAAaC,GAAgB,CACxC,GAAIA,IAAQ,cAAe,MAAO,IAClC,GAAI,CACF,KAAM,CAAE,OAAAC,CAAO,EAAI,IAAI,IAAID,CAAG,EAC9B,OAAOC,IAAW,QAAU,CAACA,EAASD,EAAMC,CAC9C,MAAY,CACV,KAAM,CAAE,OAAAA,CAAO,EAAI,IAAI,IAAID,EAAK,SAAS,OAAO,EAChD,OAAOC,CACT,CACF,EAEaC,EAAWC,GACtBA,EAAO,KAAK,GAAQ,EAAE,OAAQC,GAAMA,IAAM,MAAS,EAE9C,SAASC,EAAWvB,EAAsC,CAC/D,OAAO,OAAOA,GAAU,UAC1B,CC8CO,MAAMwB,CAAM,CAID,GAKA,MAKA,IAKA,aAKA,WAKA,OAKA,SAKA,OAKT,YAAc,GAKd,MAAQ,GAKR,aAKPC,GAKAC,GAMA,YAAYC,EAAqB,CAC/B,KAAM,CACJ,QAAAC,EACA,WAAAC,EAAa,KACb,MAAAC,EACA,IAAAZ,EACA,OAAAa,EACA,aAAAC,EAAe,CAAC,EAChB,SAAAC,EAAWlB,EAAS,MACpB,SAAAmB,EACA,aAAAC,CACF,EAAIR,EACJ,KAAK,GAAKC,EACV,KAAK,MAAQE,EACb,KAAK,IAAMZ,EACX,KAAK,OAASD,EAAUC,CAAG,EAC3B,KAAK,aAAec,EACpB,KAAK,WAAaH,EAClB,KAAK,OAASE,EACd,KAAK,SAAWE,EAChB,KAAK,aAAe,CAAC,EACrB,KAAKP,GAAgBS,EACrB,KAAKV,GAAYS,CACnB,CAKA,QAAU,IAAM,CACd,GAAI,KAAK,WAAanB,EAAS,OAAS,CAAC,KAAK,OAAO,OACnD,GAAI,CAEF,KAAK,OAAO,SACZ,KAAK,OAAO,MAAM,CACpB,MAAY,CACV,KAAKU,GAAU,KAAK,CAClB,UAAW,KAAK,OAChB,aAAc,KAAK,OACnB,YAAaZ,EAAY,UACzB,YAAa,CAAC,CAChB,CAAC,CACH,MAEA,KAAK,YAAY,SAAS,EAG5B,KAAKY,GAAU,aAAa,CAAE,OAAQ,KAAK,OAAQ,OAAQ,KAAK,MAAO,CAAC,CAC1E,EAMA,QAAU,KAAO,CACf,QAAS,KAAK,GACd,WAAY,KAAK,MACjB,SAAU,KAAK,GACjB,GAMA,UAAY,IACV,IAAI,QAAkBW,GAAY,CAChC,IAAIC,EAAiB,EACrB,MAAMC,EAAmB,EACzB,IAAIC,EACJ,MAAMC,EAAQ,IAAM,CAClB,cAAcD,CAAe,EAC7B,KAAKd,GAAU,SAAS,CACtB,YAAaZ,EAAY,aACzB,SAAU2B,CACZ,CAAC,EACDJ,EAAQ,EAAI,CACd,EACAG,EAAkB,YAAY,IAAM,CAC9BF,GAAkBC,GACpB,cAAcC,CAAe,EAC7B,KAAKd,GAAU,SAAS,CACtB,YAAaZ,EAAY,aACzB,SAAU2B,CACZ,CAAC,EACDJ,EAAQ,EAAK,IAEb,KAAKX,GAAU,KAAK,CAClB,UAAW,KAAK,OAChB,aAAc,KAAK,OACnB,YAAaZ,EAAY,UACzB,YAAa,CAAC,CAChB,CAAC,EACDwB,GAAkB,EAEtB,EAAG,GAAI,EACP,KAAKZ,GAAU,OAAO,CACpB,YAAaZ,EAAY,aACzB,SAAU2B,CACZ,CAAC,CACH,CAAC,EAKH,KAAO,IAAM,CAEX,KAAKf,GAAU,UAAU,CAAE,OAAQ,KAAK,OAAQ,OAAQ,KAAK,MAAO,CAAC,EAEjE,KAAK,WAAaV,EAAS,OAC7B,KAAK,UAAU,EAAE,MAAM,IAAM,CAAC,CAAC,CAEnC,EAOA,cAAgB,CAAC0B,EAAoBC,KACnC,KAAKhB,GACF,YACC,yBAAyBe,EAAM,OAAO,QAAQ,IAAIA,EAAM,SAAS,GACjE,CACE,MAAO,KAAK,GACZ,OAAQ,KAAK,GACf,CACF,EACC,MAAM,IAAM,CAAC,CAAC,EACV,KAAKhB,GACT,OAAO,CACN,UAAW,KAAK,OAChB,aAAc,KAAK,OACnB,YAAaZ,EAAY,YACzB,YAAa4B,EACb,kBAAmBC,CACrB,CAAC,EACA,QAAQ,IAAM,CACb,KAAKhB,GACF,UACC,yBAAyBe,EAAM,OAAO,QAAQ,IAAIA,EAAM,SAAS,GACjE,CACE,MAAO,KAAK,GACZ,OAAQ,KAAK,GACf,CACF,EACC,MAAM,IAAM,CAAC,CAAC,CACnB,CAAC,GAOL,KAAQlD,GAAwB,CAC9B,KAAKkC,GAAU,KAAK,CAClB,UAAW,KAAK,OAChB,aAAc,KAAK,OACnB,GAAGlC,CACL,CAAC,CACH,CACF,CCpSA,QAAe,CACb,WAFiB,OAAO,OAAW,KAAe,OAAO,YAAc,OAAO,WAAW,KAAK,MAAM,CAGtG,ECAA,IAAIoD,EACJ,MAAMC,EAAQ,IAAI,WAAW,EAAE,EAChB,SAASC,GAAM,CAE5B,GAAI,CAACF,IAEHA,EAAkB,OAAO,OAAW,KAAe,OAAO,iBAAmB,OAAO,gBAAgB,KAAK,MAAM,EAE3G,CAACA,GACH,MAAM,IAAI,MAAM,0GAA0G,EAI9H,OAAOA,EAAgBC,CAAK,CAC9B,C,MCXA,MAAME,EAAY,CAAC,EAEnB,QAASC,EAAI,EAAGA,EAAI,IAAK,EAAEA,EACzBD,EAAU,MAAMC,EAAI,KAAO,SAAS,EAAE,EAAE,MAAM,CAAC,CAAC,EAG3C,SAASC,EAAgBC,EAAKC,EAAS,EAAG,CAG/C,OAAOJ,EAAUG,EAAIC,EAAS,CAAC,CAAC,EAAIJ,EAAUG,EAAIC,EAAS,CAAC,CAAC,EAAIJ,EAAUG,EAAIC,EAAS,CAAC,CAAC,EAAIJ,EAAUG,EAAIC,EAAS,CAAC,CAAC,EAAI,IAAMJ,EAAUG,EAAIC,EAAS,CAAC,CAAC,EAAIJ,EAAUG,EAAIC,EAAS,CAAC,CAAC,EAAI,IAAMJ,EAAUG,EAAIC,EAAS,CAAC,CAAC,EAAIJ,EAAUG,EAAIC,EAAS,CAAC,CAAC,EAAI,IAAMJ,EAAUG,EAAIC,EAAS,CAAC,CAAC,EAAIJ,EAAUG,EAAIC,EAAS,CAAC,CAAC,EAAI,IAAMJ,EAAUG,EAAIC,EAAS,EAAE,CAAC,EAAIJ,EAAUG,EAAIC,EAAS,EAAE,CAAC,EAAIJ,EAAUG,EAAIC,EAAS,EAAE,CAAC,EAAIJ,EAAUG,EAAIC,EAAS,EAAE,CAAC,EAAIJ,EAAUG,EAAIC,EAAS,EAAE,CAAC,EAAIJ,EAAUG,EAAIC,EAAS,EAAE,CAAC,CACnf,CAEA,SAASC,GAAUF,EAAKC,EAAS,EAAG,CAClC,MAAME,EAAOJ,EAAgBC,EAAKC,CAAM,EAMxC,GAAI,CAACG,EAASD,CAAI,EAChB,MAAM,UAAU,6BAA6B,EAG/C,OAAOA,CACT,CAEA,SAAe,KC5Bf,SAASE,EAAGC,EAASC,EAAKN,EAAQ,CAChC,GAAI,EAAO,YAAc,CAACM,GAAO,CAACD,EAChC,OAAO,EAAO,WAAW,EAG3BA,EAAUA,GAAW,CAAC,EACtB,MAAME,EAAOF,EAAQ,SAAWA,EAAQ,KAAOV,GAAK,EAKpD,GAHAY,EAAK,CAAC,EAAIA,EAAK,CAAC,EAAI,GAAO,GAC3BA,EAAK,CAAC,EAAIA,EAAK,CAAC,EAAI,GAAO,IAEvBD,EAAK,CACPN,EAASA,GAAU,EAEnB,QAASH,EAAI,EAAGA,EAAI,GAAI,EAAEA,EACxBS,EAAIN,EAASH,CAAC,EAAIU,EAAKV,CAAC,EAG1B,OAAOS,CACT,CAEA,OAAOR,EAAgBS,CAAI,CAC7B,CAEA,QAAeH,EC3BTI,EAAiB,gBACjBC,EAAwB,yBACxBC,EAAyB,0BACzBC,EAAgB,CAAC,CACrB,YAAAC,EACA,YAAAC,EACA,UAAAC,EACA,UAAAC,EAAY,EACd,KAAO,CACL,UAAWD,IAAeC,EAAuB,KAAX,EAAO,GAC7C,OAAQP,EACR,KAAMI,EAEN,KAAMC,CACR,GACMG,GAAe3E,GAAU,CAC7B,KAAM,CAAE,UAAA4E,EAAW,aAAAC,EAAc,YAAAN,EAAa,YAAAC,CAAY,EAAIxE,EACxD8E,EAAMR,EAAc,CAAE,YAAAC,EAAa,YAAAC,CAAY,CAAC,EACtDI,EAAU,YAAYE,EAAKD,CAAY,CACzC,EACA,MAAME,CAAS,CACbC,GACAC,GAIAC,GAA6B,IAAI,IAIjCC,GAA+B,IAAI,IAInCC,GAAwB,KAIxBC,GAAqB,KAIrBC,GAAkC,IAAI,IAMtC,YAAYC,EAAQC,EAAe,CACjC,GAAI,CAACD,EAAQ,MAAM,IAAI,MAAM,oBAAoB,EACjD,GAAI,CAACC,EAAe,MAAM,IAAI,MAAM,2BAA2B,EAC/D,KAAKR,GAAiBQ,EACtB,KAAKP,GAAUM,CACjB,CAEAE,GAAoB,IAAM,CACxB,KAAKL,GAAwB,KAC7B,MAAMM,EAAK,KAAK,IAAI,EACdC,EAAgB,CAAC,EACvB,IAAIC,EAAiB,KAgBrB,GAfA,KAAKT,GAAa,QAAQ,CAACU,EAAWjG,IAAQ,CAC5C,KAAM,CAAE,UAAA6E,EAAW,WAAAqB,CAAW,EAAID,EAC9BC,GAAcA,GAAcJ,GAC9B,KAAKT,GAAQ,MACX,4CAA4CR,CAAS,KACvD,EACAkB,EAAc,KAAK/F,CAAG,EACtBiG,EAAU,QAAQ,MAAM,GACfC,IACTF,EAAiBA,IAAmB,KAAOE,EAAa,KAAK,IAAIF,EAAgBE,CAAU,EAE/F,CAAC,EACDH,EAAc,QAAS/F,GAAQ,CAC7B,KAAKuF,GAAa,OAAOvF,CAAG,CAC9B,CAAC,EACGgG,IAAmB,KAAM,CAC3B,MAAMG,EAAQ,KAAK,IAAIH,EAAiB,KAAK,IAAI,EAAG,CAAC,EACrD,KAAKI,GAAsBD,CAAK,CAClC,CACF,EAEAC,GAAyBC,GAAY,CAC/B,KAAKb,KAA0B,OACnC,KAAKA,GAAwB,OAAO,WAClC,KAAKK,GACLQ,CACF,EACF,EAEAC,GAAuB,IAAM,CACvB,KAAKd,KAA0B,OACjC,OAAO,aAAa,KAAKA,EAAqB,EAC9C,KAAKA,GAAwB,KAEjC,EAEAe,GAAkB1B,GAAc,CAC9B,MAAM2B,EAAI,KAAKjB,GAAa,IAAIV,CAAS,EACzC,YAAKQ,GAAQ,MAAM,sBAAsBR,CAAS,EAAE,EACpD,KAAKU,GAAa,OAAOV,CAAS,EAC3B2B,CACT,EAEAC,GAAoBC,GAAY,CAC9B,KAAM,CAAE,UAAA7B,CAAU,EAAI6B,EACtB,KAAKrB,GAAQ,MACX,+CAA+CR,CAAS,EAC1D,EACA,MAAMoB,EAAY,KAAKM,GAAe1B,CAAS,EAC/C,OAAKoB,GAMLA,EAAU,QAAQS,EAAQ,IAAI,EACvB,KANL,KAAKrB,GAAQ,MACX,8DAA8DR,CAAS,EACzE,EACO,GAIX,EAEA8B,GAAqBD,GAAY,CAC/B,KAAKrB,GAAQ,MACX,kDAAkDqB,EAAQ,SAAS,GACrE,EACA,MAAMT,EAAY,KAAKM,GAAeG,EAAQ,SAAS,EACvD,OAAKT,GAMLA,EAAU,OAAO,IAAI,MAAMS,EAAQ,IAAI,CAAC,EACjC,KANL,KAAKrB,GAAQ,KACX,6DAA6DqB,EAAQ,SAAS,GAChF,EACO,GAIX,EAEAE,GAAW,CAAC,CACV,UAAAC,EACA,aAAAC,EACA,QAAAJ,CACF,IAAM,CACJ,KAAKrB,GAAQ,MAAM,6BAA6BqB,EAAQ,IAAI,GAAG,EAC/D,MAAMK,EAAY,KAAKzB,GAAW,IAAIoB,EAAQ,IAAI,EAClD,OAAKK,GACLA,EAAU,QAASrG,GAAa,CAC9B,KAAK2E,GAAQ,MAAM,4BAA4B3E,EAAS,IAAI,EAAE,EAC9DA,EAAS,CACP,UAAAmG,EACA,aAAAC,EACA,UAAWJ,EAAQ,UACnB,KAAMA,EAAQ,KACd,KAAMA,EAAQ,IAChB,CAAC,CACH,CAAC,EACM,IAXgB,EAYzB,EAEAM,GAAmBN,GAAY,CAE7B,GADI,KAAKhB,GAAgB,OAAS,GAC9B,CAACgB,EAAQ,OAAQ,MAAO,GAC5B,MAAMO,EAAe,KAAKvB,GAAgB,IAAIgB,EAAQ,MAAM,EAE5D,MADI,CAACO,GACDP,GAAS,MAAM,SAAWnC,EAAuB,IACrD,KAAKc,GAAQ,MACX,uCAAuCqB,EAAQ,KAAK,IAAI,GAC1D,EACIA,EAAQ,KAAK,OAASlC,EACxB,KAAKiC,GAAiBC,EAAQ,IAAI,EAC3BA,EAAQ,KAAK,OAASjC,EAC7B,KAAKkC,GAAkBD,EAAQ,IAAI,EAEnC,KAAKE,GAAS,CACZ,UAAWF,EAAQ,OACnB,aAAcO,EACd,QAASP,EAAQ,IACnB,CAAC,EACI,GACT,EAKA,UAAatG,GAAU,CACrB,KAAM,CAAE,OAAA4B,EAAQ,OAAQkF,CAAQ,EAAI9G,EACpC,GAAI,CAAC4B,EAAQ,MAAM,IAAI,MAAM,oBAAoB,EACjD,GAAI,CAACkF,EAAS,MAAM,IAAI,MAAM,oBAAoB,EAClD,KAAKxB,GAAgB,IAAIwB,EAASlF,CAAM,CAC1C,EAKA,WAAcmF,GAAQ,CAChB,KAAK1B,IACP,KAAKA,GAAmB,oBACtB,UACA,KAAKuB,EACP,EAEFG,EAAI,iBAAiB,UAAW,KAAKH,EAAe,EACpD,KAAKvB,GAAqB0B,EAC1B,KAAK9B,GAAQ,MAAM,4BAA4B,KAAKD,EAAc,EAAE,CACtE,EAIA,MAAQ,IAAM,CACR,KAAKK,KACP,KAAKA,GAAmB,oBACtB,UACA,KAAKuB,EACP,EACA,KAAKvB,GAAqB,MAE5B,KAAKa,GAAqB,EAC1B,KAAKjB,GAAQ,MAAM,uBAAuB,KAAKD,EAAc,EAAE,CACjE,EAMA,OAAUhF,GAAU,CAClB,KAAM,CACJ,UAAA4E,EACA,aAAAC,EACA,YAAAN,EACA,YAAAC,EACA,kBAAAwC,CACF,EAAIhH,EACJ,OAAO,IAAI,QAAQ,CAAC6C,EAASoE,IAAW,CACtC,MAAMnC,EAAMR,EAAc,CAAE,YAAAC,EAAa,YAAAC,CAAY,CAAC,EACtD,KAAKW,GAAa,IAAIL,EAAI,UAAW,CACnC,UAAWA,EAAI,UACf,QAAAjC,EACA,OAAAoE,EACA,WAAYD,EAAoB,KAAK,IAAI,EAAIA,EAAoB,IACnE,CAAC,EACDpC,EAAU,YAAYE,EAAKD,CAAY,EACvC,KAAM,CAAE,UAAAJ,CAAU,EAAIK,EACtB,KAAKG,GAAQ,MACX,qCAAqCV,CAAW,eAAeE,GAAa,EAAE,EAChF,EACIuC,IACF,KAAK/B,GAAQ,MACX,2CAA2CR,GAAa,EAAE,OAAOuC,CAAiB,KACpF,EACA,KAAKhB,GAAsBgB,CAAiB,EAEhD,CAAC,CACH,EAKA,OAAUhH,GAAU,CAClB,KAAM,CAAE,YAAAuE,EAAa,SAAAjE,CAAS,EAAIN,EAC5BkH,EAAQ,KAAKhC,GAAW,IAAIX,CAAW,GAAK,CAAC,EACnD2C,EAAM,KAAK5G,CAAQ,EACnB,KAAK4E,GAAW,IAAIX,EAAa2C,CAAK,CACxC,EAKA,SAAYlH,GAAU,CACpB,KAAM,CAAE,YAAAuE,EAAa,SAAAjE,CAAS,EAAIN,EAC5BkH,EAAQ,KAAKhC,GAAW,IAAIX,CAAW,EAC7C,GAAI,CAAC2C,EAAO,OACZ,MAAMC,EAAQD,EAAM,QAAQ5G,CAAQ,EAChC6G,IAAU,IACZD,EAAM,OAAOC,EAAO,CAAC,CAEzB,EAKA,KAAQnH,GAAU,CAChB,KAAM,CAAE,UAAA4E,EAAW,aAAAC,EAAc,YAAAN,EAAa,YAAAC,CAAY,EAAIxE,EACxD8E,EAAMR,EAAc,CACxB,YAAAC,EACA,YAAAC,EACA,UAAW,EACb,CAAC,EACDI,EAAU,YAAYE,EAAKD,CAAY,EACvC,KAAKI,GAAQ,MAAM,mCAAmCV,CAAW,GAAG,CACtE,EAKA,aAAgBvE,GAAU,CACxB,KAAM,CAAE,OAAQ8G,CAAQ,EAAI9G,EACxB8G,GAAS,KAAKxB,GAAgB,OAAOwB,CAAO,CAClD,EAKA,QAAW9G,GAAU,CACnB,KAAM,CAAE,UAAA4E,EAAW,aAAAC,EAAc,UAAAJ,EAAW,SAAA2C,CAAS,EAAIpH,EACnD8E,EAAMR,EAAc,CACxB,YAAaF,EACb,YAAagD,EACb,UAAA3C,CACF,CAAC,EACDG,EAAU,YAAYE,EAAKD,CAAY,EACvC,KAAKI,GAAQ,MACX,qDAAqDR,CAAS,EAChE,CACF,EAKA,eAAkBzE,GAAU,CAC1B,KAAM,CAAE,UAAA4E,EAAW,aAAAC,EAAc,UAAAJ,EAAW,GAAA4C,CAAG,EAAIrH,EAC7CwE,EAAc6C,aAAc,MAAQA,EAAG,QAAUA,EACjDvC,EAAMR,EAAc,CACxB,YAAaD,EACb,YAAAG,EACA,UAAAC,CACF,CAAC,EACDG,EAAU,YAAYE,EAAKD,CAAY,EACvC,KAAKI,GAAQ,MACX,uDAAuDR,CAAS,EAClE,CACF,CACF,CCxUA,MAAM6C,EAAgB,SACtB,IAAIC,IAAoCC,IACtCA,EAAiB,KAAU,OAC3BA,EAAiB,QAAa,UACvBA,IACND,IAAmB,CAAC,CAAC,EACxB,MAAME,EAAuB,CAC3BC,GAAgBC,GAAOA,EAAG,KAAK,EAAE,YAAY,EAI7CC,GAAoC,IAAI,IAIxCC,GAAyC,IAAI,IAC7CC,GAA4BC,GAAW,CACrC,KAAM,CAAE,GAAAC,EAAI,QAAA3F,CAAQ,EAAI0F,EAClB7H,EAAW,KAAKwH,GAAaM,EAAG,EAAE,EAClCC,EAAW,KAAKJ,GAAuB,IAAIxF,CAAO,EACxD,GAAI,CAAC4F,EACH,KAAKJ,GAAuB,IAAIxF,EAAyB,IAAI,IAAI,CAAC,CAACnC,EAAU6H,CAAM,CAAC,CAAC,CAAC,MACjF,CACL,GAAIE,EAAS,IAAI/H,CAAQ,EACvB,MAAM,IAAI,MACR,oBAAoB8H,EAAG,EAAE,6BAA6B3F,CAAO,EAC/D,EACF4F,EAAS,IAAI/H,EAAU6H,CAAM,CAC/B,CACF,EACAG,GAAa,CAAC,CAAE,GAAAF,CAAG,IAAM,CACvB,GAAIA,EAAG,UAAY,OAAOA,EAAG,UAAa,WACxC,GAAI,CACFA,EAAG,SAAS,CACd,MAAQ,CACR,CAEJ,EASAG,GAA2B,CAAC,CAC1B,SAAAjI,EACA,QAAAmC,CACF,IAAM,CACJ,GAAInC,IAAaoH,GAAiB,CAACjF,EACjC,SAAW,CAAC,CAAE+F,CAAI,IAAK,KAAKP,GAAwB,CAClD,MAAMQ,EAAMD,EAAK,IAAIlI,CAAQ,EAC7B,GAAImI,EAAK,OAAOA,CAClB,CAEF,MAAMC,EAAMjG,EAAU,KAAKwF,GAAuB,IAAIxF,CAAO,EAAI,KACjE,OAAIiG,EACKA,EAAI,IAAIpI,CAAQ,GAAK,KAEvB,IACT,EACAqI,GAA8B,CAAC,CAC7B,SAAArI,EACA,QAAAmC,CACF,EAAI,CAAC,IAAM,CACT,GAAIA,EAAS,CACX,GAAI,CAACnC,EAAU,CACb,MAAMsI,EAAU,KAAKX,GAAuB,IAAIxF,CAAO,EACnDmG,GACFA,EAAQ,QAAQ,KAAKN,EAAU,EAEjC,KAAKL,GAAuB,OAAOxF,CAAO,EAC1C,MACF,CACA,MAAMoG,EAAY,KAAKZ,GAAuB,IAAIxF,CAAO,EACzD,GAAIoG,EAAW,CACb,MAAMC,EAASD,EAAU,IAAIvI,CAAQ,EACjCwI,GAAQ,KAAKR,GAAWQ,CAAM,EAClCD,EAAU,OAAOvI,CAAQ,CAC3B,CACF,MAAWA,GACT,KAAK2H,GAAuB,QAASY,GAAc,CACjD,MAAMC,EAASD,EAAU,IAAIvI,CAAQ,EACjCwI,GAAQ,KAAKR,GAAWQ,CAAM,EAClCD,EAAU,OAAOvI,CAAQ,CAC3B,CAAC,CAEL,EAOA,mBAAqB,CAAC8H,EAAID,IAAW,CACnC,KAAM,CAAE,QAAA1F,CAAQ,EAAI0F,GAAU,CAAC,EAC/B,GAAI,CAACC,GAAI,IAAM,CAACA,GAAI,QAClB,MAAM,IAAI,MAAM,4CAA4C,EAE9D,MAAM9H,EAAW,KAAKwH,GAAaM,EAAG,EAAE,EACxC,GAAI9H,IAAaoH,GAAiB,CAACjF,EACjC,MAAM,IAAI,MAAM,qDAAqD,EAEvE,GAAIA,EAAS,CACX,KAAKyF,GAAyB,CAAE,GAAAE,EAAI,GAAGD,EAAQ,QAAA1F,CAAQ,CAAC,EACxD,MACF,CACA,GAAI,KAAKuF,GAAkB,IAAI1H,CAAQ,EACrC,MAAM,IAAI,MAAM,oBAAoB8H,EAAG,EAAE,iBAAiB,EAC5D,KAAKJ,GAAkB,IAAI1H,EAAU,CAAE,GAAA8H,EAAI,GAAGD,CAAO,CAAC,CACxD,EAOA,UAAY,CAAC7H,EAAUyI,IAAU,CAC/B,MAAMhB,EAAK,KAAKD,GAAaxH,CAAQ,EACrC,IAAIwI,EAAS,KAAKP,GAAyB,CACzC,SAAUR,EACV,QAASgB,GAAO,EAClB,CAAC,EACDD,EAASA,GAAU,KAAKd,GAAkB,IAAID,CAAE,GAAK,KACrD,KAAM,CAAE,GAAAK,CAAG,EAAIU,GAAU,CAAC,EAC1B,OAAKV,GAAW,IAElB,EAOA,IAAM,CAAC9H,EAAUyI,IAAU,KAAK,UAAUzI,EAAUyI,CAAK,IAAM,KAM/D,qBAAwBtG,GAAY,CAClC,MAAMuG,EAAU,IAAI,IAAI,KAAKhB,GAAkB,KAAK,CAAC,EAC/CK,EAAW,KAAKJ,GAAuB,IAAIxF,CAAO,EACxD,GAAI4F,EACF,UAAWrI,KAAOqI,EAAS,KAAK,EAAGW,EAAQ,IAAIhJ,CAAG,EAEpD,OAAO,MAAM,KAAKgJ,CAAO,CAC3B,EAMA,sBAAwB,CAAC1I,EAAUmC,IAAY,CAC7C,MAAMsF,EAAK,KAAKD,GAAaxH,CAAQ,EACrC,GAAImC,EACF,KAAKkG,GAA4B,CAAE,SAAUZ,EAAI,QAAAtF,CAAQ,CAAC,MACrD,CACL,KAAKkG,GAA4B,CAAE,SAAUZ,CAAG,CAAC,EACjD,MAAMe,EAAS,KAAKd,GAAkB,IAAID,CAAE,EACxCe,GAAQ,KAAKR,GAAWQ,CAAM,EAClC,KAAKd,GAAkB,OAAOD,CAAE,CAClC,CACF,EAKA,0BAA6BtF,GAAY,CAClCA,EAIH,KAAKkG,GAA4B,CAAE,QAAAlG,CAAQ,CAAC,GAH5C,KAAKuF,GAAkB,QAAQ,KAAKM,EAAU,EAC9C,KAAKN,GAAkB,MAAM,EAIjC,CACF,CCjLA,MAAMiB,EAAqB,CAIzB,SAAW,QAIX,GAIA,WAMA,YAAY3I,EAAUgB,EAAY,CAChC,KAAK,GAAKhB,EACV,KAAK,WAAagB,CACpB,CACF,CACA,MAAM4H,EAA0BrI,GAE9BA,GAAO,aAAa,OAAS,SAC7BA,GAAO,aAAa,OAAS,wBAC7BA,GAAO,WAAa,QC2BTsI,EAAkB,CAC7BtH,EAAoB,aACpBA,EAAoB,YACpBA,EAAoB,YACpBA,EAAoB,WACpBA,EAAoB,eACpBA,EAAoB,eACtB,EAaO,MAAMuH,EAIb,CAKS,OAKP9G,GAKA8C,GAKAC,GAKA9C,GAKA8G,GAAU,IAAI,IAKdC,GAAkB,IAAI,IAKtBC,GAAe,IAAI,IAKnBC,GAA0B,IAAI,IAQ9BC,GAKAC,GAAuD,KAKvDC,GAA4D,KAK5DC,GAA6D,KAK7DC,GAAiE,KAOjE,YAAYC,EAAgBtH,EAAoB,CAG9C,GADA,KAAK,OAASsH,EACV,CAACtH,GAAQ,OAAQ,MAAM,IAAI,MAAM,oBAAoB,EACzD,GAAI,CAACA,GAAQ,aAAc,MAAM,IAAI,MAAM,8BAA8B,EAKzE,GAJA,KAAK6C,GAAU7C,EAAO,OACtB,KAAKD,GAAgBC,EAAO,aAC5B,KAAK4C,GAAiB,EAAO,EAC7B,KAAK9C,GAAY,IAAI6C,EAAS,KAAKE,GAAS,KAAKD,EAAc,EAE7D5C,GAAQ,oBACR,OAAOA,GAAQ,oBAAuB,WAEtC,MAAM,IAAI,MAAM,uCAAuC,EACzD,KAAKkH,GAAsBlH,GAAQ,oBAAsB,KACzD,KAAKoH,GAAyBpH,GAAQ,uBAAyB,KAC/D,KAAKqH,GAA2BrH,GAAQ,yBAA2B,KACnE,KAAKiH,GAAa,IAAI5B,GAEtB,KAAKvF,GAAU,WAAW,MAAM,EAChC,KAAKyH,GAAS,EAEd,OAAO,iBAAiB,eAAgB,KAAKC,EAAoB,EACjE,KAAK3E,GAAQ,MACX,gCAAgC,KAAK,MAAM,oBACzC,KAAKD,EACP,EACF,CACF,CAEA6E,GAAe,CAAC3G,EAAe4G,IAAkC,CAC/D,MAAMC,EAAU,CAAE,MAAA7G,EAAO,GAAG4G,CAAK,EACjC,KAAK3H,GAAc,YAAY4H,CAAO,EAAE,MAAO3D,GAAM,CACnD,KAAKnB,GAAQ,MACX,iCAAkCmB,EAAY,OAAO,EACvD,CACF,CAAC,CACH,EAEA4D,GAAe,CAAC/J,EAAc+D,IAA2B,CACvD,KAAK7B,GAAc,YAAYlC,EAAM+D,CAAO,EAAE,MAAOoC,GAAM,CACzD,KAAKnB,GAAQ,MACX,iCAAkCmB,EAAY,OAAO,EACvD,CACF,CAAC,CACH,EAEA6D,GAAa,CAACC,EAAelG,IAA2B,CACtD,KAAK7B,GAAc,UAAU+H,EAAOlG,CAAO,EAAE,MAAOoC,GAAM,CACxD,KAAKnB,GAAQ,MAAM,+BAAgCmB,EAAY,OAAO,EAAE,CAC1E,CAAC,CACH,EAEAwD,GAAuB,IAAM,CACV,MAAM,KAAK,KAAKX,GAAQ,OAAO,CAAC,EAC9C,OAAQN,GAAUA,EAAM,WAAanH,EAAS,KAAK,EACnD,IAAKmH,GAAUA,EAAM,EAAE,EACjB,QAAShB,GAAO,KAAK,YAAYA,CAAE,CAAC,CAC/C,EAOAwC,GAAsBC,GACpB,KAAKlB,GAAgB,IAAIkB,CAAW,EAOtCC,GAAmB1I,GAAgB,KAAKwH,GAAa,IAAIxH,CAAG,GAAK,KAOjE2I,GAAsB7J,GAEpB,OAAOA,GAAO,SAAY,WAE5B8J,GAAkB,CAACC,EAAc7B,IAC3B,KAAK2B,GAAmBE,CAAG,GAG1B,KAAKnB,GAAW,IACfmB,GAAK,GACL7B,CACF,GAEA,KAAKU,GAAW,mBACdmB,EACA7B,EAAQ,CAAE,QAASA,GAAO,EAAG,EAAI,CAAC,CACpC,EAEK,CAAE,KAAM,SAAU,OAAQ6B,EAAI,QAAQ,CAAE,GAE1C,CAAE,KAAM,QAAS,MAAOA,CAAI,EAGrCC,GAAoBpD,GACd,OAAOA,GAAO,SACTA,EAELA,aAAc,MACTA,EAAG,QAEL,uDAGTqD,GAAwB/B,GAAiB,CACnCA,EAAM,OACR,KAAKzG,GAAU,KAAK,CAClB,UAAWyG,EAAM,OACjB,aAAcA,EAAM,OACpB,YAAarH,EAAY,WACzB,YAAa,CACX,SAAU,KAAK2D,GAAQ,YAAY,EACnC,GAAG0D,EAAM,QAAQ,CACnB,CACF,CAAC,CAEL,EAEAgC,GAAU,CAA6B,CACrC,MAAAhC,EACA,IAAA9I,EACA,aAAA+K,EACA,eAAAC,CACF,IAKM,CACJ,MAAMC,EAAOjL,EAAI+K,CAAY,EAE7B,OAAK5I,EAAW8I,CAAI,GAcpB,KAAK7F,GAAQ,MACX,mCAAmCpF,EAAI,EAAE,IAAI,OAAO+K,CAAY,CAAC,IACnE,EACO,IAAI,QAAS/H,GAAY,CAC9B,OAAO,eAAeiI,EAAM,cAAe,CACzC,MAAO,CAAE,MAAAnC,CAAM,EACf,aAAc,GACd,WAAY,GACZ,SAAU,EACZ,CAAC,EAED9F,EAASiI,EAAyB,GAAGD,CAAc,CAAC,CACtD,CAAC,IAzBC,KAAK5F,GAAQ,KACX,mDACEpF,EAAI,UACN,KAAK,OAAO+K,CAAY,CAAC,EAC3B,EACO,QAAQ,OACb,IAAI,MACF,WAAWA,CAAY,oCAAoC/K,EAAI,EAAE,GACnE,CACF,EAiBJ,EAEAkL,GAA4B,CAAC,CAC3B,UAAAtE,EACA,aAAAC,EACA,UAAAjC,CACF,IAAmC,CAEjC,MAAMkE,EAAQ,KAAKwB,GAAmB1D,CAAS,EAC/C,GAAI,CAACkC,EAAO,CACV,KAAK1D,GAAQ,KACX,sDAAsDR,CAAS,EACjE,EACA,MACF,CAGA,GAAI,CAACkE,EAAM,YAAa,CACtB,KAAK1D,GAAQ,KACX,wDACF,EACA,KAAK/C,GAAU,eAAe,CAC5B,UAAWuE,EACX,aAAcC,EACd,UAAAjC,EACA,GAAI,wDACN,CAAC,EACD,MACF,CAEA,GAAI,CAACkE,EAAM,MAAO,CAEhBA,EAAM,MAAQ,GACd,MAAMqC,EAAYrC,EAAM,QAAQ,EAChC,KAAKsB,GAAW,iBAAkB,CAChC,MAAOe,EAAU,QACjB,OAAQA,EAAU,QACpB,CAAC,EAED,KAAKN,GAAqB/B,CAAK,EAE/B,KAAKW,KAAsBX,CAAK,EAChC,KAAK1D,GAAQ,MAAM,CACjB,QAAS,iBACT,GAAG+F,CACL,CAAC,CACH,CACF,EAGAC,GAAoB,CAAC,CACnB,UAAAxE,EACA,aAAAC,EACA,UAAAjC,EACA,KAAAyG,CACF,IAAmD,CAEjD,MAAMvC,EAAQ,KAAKwB,GAAmB1D,CAAS,EAC/C,GAAI,CAACkC,EAAO,CACV,KAAK1D,GAAQ,KACX,uDAAuDR,CAAS,EAClE,EACA,MACF,CACKkE,EAAM,cAETA,EAAM,YAAc,GACpBA,EAAM,aAAeuC,GAAQ,CAAC,EAC9B,KAAKjG,GAAQ,MAAM,CACjB,QAAS,uBACT,GAAG0D,EAAM,QAAQ,CACnB,CAAC,IAIC,CAACuC,GAAQ,CAACA,EAAK,UACjB,KAAKH,GAA0B,CAC7B,UAAAtE,EACA,aAAAC,EACA,UAAAjC,EACA,KAAM,GACN,KAAM,IACR,CAAC,CAEL,EAOA0G,GAAoB,MAAO,CAAE,UAAA1E,CAAU,IAAmC,CACxE,GAAIA,GAAW,OAAQ,CACrB,MAAMkC,EAAQ,KAAKyC,GAAW3E,CAAS,EACnCkC,GAAS,CAAE,MAAMA,EAAM,UAAU,GACnC,KAAK,YAAYlC,CAAS,CAE9B,CACF,EAGA4E,GAAqB,CAAC,CACpB,UAAA5E,EACA,aAAAC,EACA,UAAAjC,CACF,IAEO,CACL,KAAKQ,GAAQ,MACX,+CAA+CR,CAAS,EAC1D,EAGA,MAAMkE,EAAQ,KAAKwB,GAAmB1D,CAAS,EAC/C,GAAI,CAACkC,EACH,YAAK1D,GAAQ,KAAK,mDAAmD,EAC9D,GAIT,MAAM2D,EAAU,KAAKS,GAAW,qBAAqBV,EAAM,EAAE,EAE7D,YAAKzG,GAAU,QAAQ,CACrB,UAAWuE,EACX,aAAcC,EACd,UAAAjC,EACA,SAAUmE,CACZ,CAAC,EAED,KAAK3D,GAAQ,MAAM,CACjB,QAAS,qCACT,UAAAR,EACA,QAAAmE,EACA,GAAGD,EAAM,QAAQ,CACnB,CAAC,EACM,EACT,EAGA2C,GAAmB,CAAC,CAClB,UAAA7E,EACA,aAAAC,EACA,UAAAjC,EACA,KAAAyG,CACF,IAEO,CACL,KAAM,CAAE,SAAAhL,CAAS,EAAIgL,EACrB,KAAKjG,GAAQ,MACX,2CAA2C/E,CAAQ,iBAAiBuE,CAAS,EAC/E,EAGA,MAAMkE,EAAQ,KAAKwB,GAAmB1D,CAAS,EAC/C,GAAI,CAACkC,EACH,YAAK1D,GAAQ,KAAK,mDAAmD,EAC9D,GAIT,MAAMpF,EAAM,KAAK,mBAAmBK,EAAU,CAAE,MAAAyI,CAAM,CAAC,EACvD,OAAK9I,GAaL,KAAKqC,GAAU,QAAQ,CACrB,UAAWuE,EACX,aAAcC,EACd,UAAAjC,EACA,SAAU,KAAK8F,GAAgB1K,EAAK8I,CAAK,CAC3C,CAAC,EAED,KAAK1D,GAAQ,MAAM,CACjB,QAAS,4BACT,UAAAR,EACA,gBAAiBvE,EACjB,GAAGyI,EAAM,QAAQ,CACnB,CAAC,EACM,KAzBL,KAAK1D,GAAQ,KACX,kCAAkC/E,CAAQ,eAAeyI,EAAM,EAAE,EACnE,EACA,KAAKzG,GAAU,eAAe,CAC5B,UAAWuE,EACX,aAAcC,EACd,UAAAjC,EACA,GAAI,yBAAyBvE,CAAQ,oBACvC,CAAC,EACM,GAiBX,EAiBAqL,GAA6B,CAAC,CAC5B,UAAA9E,EACA,UAAAhC,EACA,KAAAyG,CACF,IAIO,CACL,KAAM,CAAE,QAAAM,EAAS,SAAAC,EAAU,MAAAlL,CAAM,EAAI2K,EACrC,KAAKjG,GAAQ,MACX,sDAAsDuG,CAAO,iBAAiB/G,CAAS,EACzF,EAEA,MAAMkE,EAAQ,KAAKwB,GAAmB1D,CAAS,EAC/C,GAAI,CAACkC,EAAO,CACV,KAAK1D,GAAQ,KACX,4DACF,EACA,MACF,CAEA,WAAW,IAAM,CACf,GAAI,CACF,KAAKuE,KAAyB,CAC5B,QAASb,EAAM,GACf,QAAA6C,EACA,SAAAC,EACA,MAAAlL,CACF,CAAC,CACH,OAASmL,EAAO,CACd,KAAKzG,GAAQ,KACX,qDAAqDuG,CAAO,KACzDE,EAAgB,OACnB,EACF,CACF,CACF,EAAG,CAAC,CACN,EAkBAC,GAA+B,CAAC,CAC9B,UAAAlF,EACA,UAAAhC,EACA,KAAAyG,CACF,IAAkE,CAChE,KAAM,CAAE,QAAAM,EAAS,MAAAjL,CAAM,EAAI2K,EAC3B,KAAKjG,GAAQ,MACX,wDAAwDuG,CAAO,iBAAiB/G,CAAS,EAC3F,EAEA,MAAMkE,EAAQ,KAAKwB,GAAmB1D,CAAS,EAC/C,GAAI,CAACkC,EAAO,CACV,KAAK1D,GAAQ,KACX,8DACF,EACA,MACF,CAEA,WAAW,IAAM,CACf,GAAI,CACF,KAAKwE,KAA2B,CAC9B,QAASd,EAAM,GACf,QAAA6C,EACA,MAAAjL,CACF,CAAC,CACH,OAASmL,EAAO,CACd,KAAKzG,GAAQ,KACX,uDAAuDuG,CAAO,KAC3DE,EAAgB,OACnB,EACF,CACF,CACF,EAAG,CAAC,CACN,EAGAE,GAAqB,CAAC,CACpB,UAAAnF,EACA,UAAAhC,EACA,KAAAyG,CACF,IAA+C,CAC7C,MAAMvC,EAAQ,KAAKwB,GAAmB1D,CAAS,EAC/C,GAAI,CAACkC,EAAO,CACV,KAAK1D,GAAQ,KACX,yDAAyDR,CAAS,EACpE,EACA,MACF,CACIkE,EAAM,aACRA,EAAM,WAAW,MAAM,OAAS,GAAGuC,EAAK,MAAM,MAEhD,KAAKjG,GAAQ,MACX,SAAS0D,EAAM,EAAE,eAAeuC,EAAK,KAAK,IAAIA,EAAK,MAAM,EAC3D,CACF,EAGAW,GAAsB,CAAC,CACrB,UAAApF,EACA,aAAAC,EACA,UAAAjC,EACA,KAAAyG,CACF,IAIO,CACL,KAAM,CAAE,SAAAhL,CAAS,EAAIgL,EAGfvC,EAAQ,KAAKwB,GAAmB1D,CAAS,EAC/C,GAAI,CAACkC,EACH,YAAK1D,GAAQ,KACX,8DACF,EAOO,GAGT,KAAKA,GAAQ,MACX,YAAY/E,CAAQ,IAAI,OAAOgL,EAAK,YAAY,CAAC,yBAC/CvC,EAAM,EACR,kBAAkBlE,CAAS,GAC7B,EAGA,MAAM5E,EAAM,KAAK,mBAAmBK,EAAU,CAAE,MAAAyI,CAAM,CAAC,EACvD,GAAI,CAAC9I,EACH,YAAKoF,GAAQ,KACX,gDAAgD/E,CAAQ,eAAeyI,EAAM,EAAE,EACjF,EACA,KAAKzG,GAAU,eAAe,CAC5B,UAAWuE,EACX,aAAcC,EACd,UAAAjC,EACA,GAAI,yBAAyBvE,CAAQ,oBACvC,CAAC,EACM,GAGT,MAAM8K,EAAYrC,EAAM,QAAQ,EAChC,YAAKqB,GAAa,uBAAuB9J,CAAQ,IAAIgL,EAAK,YAAY,GAAI,CACxE,MAAOF,EAAU,QACjB,OAAQA,EAAU,QACpB,CAAC,EAED,KAAKL,GAAQ,CACX,MAAAhC,EACA,IAAA9I,EACA,aAAcqL,EAAK,aACnB,eAAgBA,EAAK,cACvB,CAAC,EACE,KAAMV,GAAQ,CACb,KAAKtI,GAAU,QAAQ,CACrB,UAAWuE,EACX,aAAcC,EACd,UAAAjC,EACA,SAAU,KAAK8F,GAAgBC,EAAK7B,CAAK,CAC3C,CAAC,EACD,KAAK1D,GAAQ,MAAM,CACjB,QAAS,kDACT,UAAAR,EACA,gBAAiBvE,EACjB,gBAAiBgL,EAAK,aACtB,GAAGF,CACL,CAAC,CACH,CAAC,EACA,MAAO3D,GAAO,CACb,KAAKnF,GAAU,eAAe,CAC5B,UAAWuE,EACX,aAAckC,EAAM,OACpB,UAAAlE,EACA,GAAA4C,CACF,CAAC,EACD,KAAKpC,GAAQ,MAAM,CACjB,QAAS,oDACT,UAAAR,EACA,gBAAiBvE,EACjB,gBAAiBgL,EAAK,aACtB,GAAGF,CACL,CAAC,CACH,CAAC,EACA,QAAQ,IAAM,CACb,KAAKf,GACH,uBAAuB/J,CAAQ,IAAIgL,EAAK,YAAY,GACpD,CACE,MAAOF,EAAU,QACjB,OAAQA,EAAU,QACpB,CACF,CACF,CAAC,EACI,EACT,EAKAc,GAA+B,IAAM,CACnC,KAAK5J,GAAU,OAAO,CACpB,YAAaZ,EAAY,YACzB,SAAU,KAAKsK,EACjB,CAAC,CACH,EAKAjC,GAAW,IAAM,CACf,KAAKzH,GAAU,OAAO,CACpB,YAAaZ,EAAY,WACzB,SAAU,KAAK2J,EACjB,CAAC,EACD,KAAK/I,GAAU,OAAO,CACpB,YAAaZ,EAAY,mBACzB,SAAU,KAAKyJ,EACjB,CAAC,EACD,KAAK7I,GAAU,OAAO,CACpB,YAAaZ,EAAY,WAEzB,SAAU,KAAK6J,EACjB,CAAC,EACD,KAAKjJ,GAAU,OAAO,CACpB,YAAaZ,EAAY,YACzB,SAAU,KAAK+J,EACjB,CAAC,EACD,KAAKnJ,GAAU,OAAO,CACpB,YAAaZ,EAAY,UACzB,SAAU,KAAKgK,EACjB,CAAC,EACD,KAAKpJ,GAAU,OAAO,CACpB,YAAaZ,EAAY,aACzB,SAAU,KAAKuK,EACjB,CAAC,EACD,KAAK3J,GAAU,OAAO,CACpB,YAAaZ,EAAY,oBACzB,SAAU,KAAKiK,EACjB,CAAC,EACD,KAAKrJ,GAAU,OAAO,CACpB,YAAaZ,EAAY,sBACzB,SAAU,KAAKqK,EACjB,CAAC,CACH,EAOAI,GACEtL,GAGAA,aAAiBN,GAEjB,OAAOM,GAAO,WAAc,WAO9BuL,GAAgBhM,GAA8B,CAC5C,MAAM2I,EAAQ,IAAI1G,EAAM,CACtB,GAAGjC,EACH,SAAU,KAAKkC,GACf,aAAc,KAAKC,EACrB,CAAC,EAED,OAAAwG,EAAM,KAAK,EAEX,KAAKM,GAAQ,IAAIjJ,EAAM,QAAS2I,CAAK,EACrC,KAAKO,GAAgB,IAAIP,EAAM,OAAQA,CAAK,EAC5C,KAAKQ,GAAa,IAAIR,EAAM,IAAKA,CAAK,EAC/BA,CACT,EAOAyC,GAAca,GAA8D,CAC1E,GAAI,OAAOA,GAAyB,SAClC,OAAO,KAAKhD,GAAQ,IAAIgD,CAAoB,EAG9C,MAAMC,EAAW,KAAKhD,GAAgB,IAAI+C,CAA8B,EACxE,OAAIC,GAEG,MAAM,KAAK,KAAKjD,GAAQ,OAAO,CAAC,EAAE,KACtCxI,GAAUA,EAAM,aAAewL,CAClC,CACF,EAEAE,GAAsB,IAAM,CAEtB,KAAK5C,KACT,KAAKA,GAAqB,YAAY,IAAM,CAC1C,MAAM6C,EAA0B,CAAC,EACjC,KAAKnD,GAAQ,QAASN,GAAU,CAC1BA,EAAM,WAAanH,EAAS,OAASmH,EAAM,OAAO,QACpDyD,EAAe,KAAKzD,CAAK,CAE7B,CAAC,EACDyD,EAAe,QAASzD,GAAU,CAChC,KAAM,CAAE,GAAAhB,CAAG,EAAIgB,EACf,KAAK,YAAYhB,CAAE,EACD,KAAKyB,GAAwB,IAAIzB,CAAE,GAC1C,QAASrH,GAAa,CAE/B,QAAQ,QAAQA,EAAS,CAAE,GAAAqH,CAAG,CAAC,CAAC,EAAE,MAAM,IAAM,CAAC,CAAC,CAClD,CAAC,CACH,CAAC,CACH,EAAG,GAAI,EACT,EAEA0E,GAA6B,IAAM,CACjC,GAAI,CAAC,KAAK9C,GAAoB,OACZ,MAAM,KAAK,KAAKN,GAAQ,OAAO,CAAC,EAAE,KACjDN,GAAUA,EAAM,WAAanH,EAAS,KACzC,IAEE,cAAc,KAAK+H,EAAkB,EACrC,KAAKA,GAAqB,KAE9B,EAEA+C,GAEEtM,GAQI,CACJ,KAAM,CACJ,IAAA2B,EACA,MAAAY,EACA,oBAAAgK,EAAsB,CAAC,EACvB,aAAA9J,EACA,QAAAJ,EACA,OAAAmK,EACA,QAAAC,CACF,EAAIzM,EACE,CACJ,MAAA0M,EAAQ,IACR,OAAAC,EAAS,IACT,IAAAC,EAAM,IACN,KAAAC,EAAO,GACT,EAAIN,EACJ,IAAI5D,EAAQ,KAAK0B,GAAgB1I,CAAG,EACpC,GAAIgH,EAEGA,EAAM,OAAO,QAChBA,EAAM,KAAK,CACT,YAAarH,EAAY,WACzB,YAAa,CAAC,CAChB,CAAC,MAEE,CAEL,MAAMwL,EAAiB,OAAO,QAAQ,CAAE,MAAAJ,EAAO,OAAAC,EAAQ,IAAAC,EAAK,KAAAC,CAAK,CAAC,EAC/D,OAAO,CAAC,CAAC,CAAE9K,CAAC,IAAMA,CAAC,EACnB,IAAI,CAAC,CAACgL,EAAGhL,CAAC,IAAM,GAAGgL,CAAC,IAAIhL,CAAC,EAAE,EAC3B,KAAK,GAAG,EAELqI,EAAc,OAAO,KAAKzI,EAAKY,EAAO,UAAUuK,CAAc,EAAE,EACtE,GAAK1C,EAgBH,WAAW,IAAM,CACf,GAAI,CACFoC,IAASnK,CAAO,CAClB,OAASqJ,EAAO,CACd,KAAKzG,GAAQ,MACX,+CAA+C5C,CAAO,MACnDqJ,EAAgB,OACnB,EACF,CACF,CACF,EAAG,CAAC,MAxBJ,kBAAW,IAAM,CACf,GAAI,CACFe,IAAUpK,CAAO,CACnB,OAASqJ,EAAO,CACd,KAAKzG,GAAQ,MACX,gDAAgD5C,CAAO,MACpDqJ,EAAgB,OACnB,EACF,CACF,CACF,EAAG,CAAC,EACE,IAAI,MAAM,kDAAkD,EAgBpEtB,EAAY,OAAS,KACrBzB,EAAQ,KAAKqD,GAAa,CACxB,QAAA3J,EACA,OAAQ+H,EACR,MAAA7H,EACA,IAAAZ,EACA,aAAAc,EACA,SAAUjB,EAAS,KACrB,CAAC,EAED,KAAK2K,GAAoB,CAC3B,CACA,OAAOxD,CACT,EAEAqE,GAEEhN,GASI,CACJ,KAAM,CACJ,IAAA2B,EACA,MAAAY,EACA,cAAA0K,EACA,aAAAxK,EACA,QAAAJ,EACA,OAAAmK,EACA,QAAAC,EACA,QAAAzI,EAAU,CAAC,CACb,EAAIhE,EAEEkN,EAAwBD,EAAc,eAAiB,SACvD,CACJ,aAAAE,EAAe,GACf,eAAAC,EAAiB,GACjB,cAAAC,EAAgB,CAAC,EACjB,oBAAAC,EAAsB,CAAC,EACvB,MAAAC,EAAQ,GACR,iBAAAC,EAAmB,EACrB,EAAIxJ,EACJ,GAAI,CAACzB,EAAO,MAAM,IAAI,MAAM,mBAAmB,EAC3C4K,GAAc,KAAKrB,GAA6B,EAEpD,MAAM2B,EAAQP,EAAsB,cAAc,QAAQ,EAC1DO,EAAM,aAAa,KAAMpL,CAAO,EAEhC,MAAMqL,EAAc,IAAM,CAExB,WAAW,IAAM,CACf,GAAI,CACFlB,IAASnK,CAAO,CAClB,OAASqJ,EAAO,CACd,KAAKzG,GAAQ,MACX,+CAA+C5C,CAAO,MACnDqJ,EAAgB,OACnB,EACF,CACF,CACF,EAAG,CAAC,EACJ,KAAKzG,GAAQ,MAAM,mCAAmC5C,CAAO,GAAG,EAChEoL,EAAM,oBAAoB,OAAQC,CAAW,CAC/C,EACMC,EAAqB,IAAM,CAE/B,WAAW,IAAM,CACf,GAAI,CACFlB,IAAUpK,CAAO,CACnB,OAASqJ,EAAO,CACd,KAAKzG,GAAQ,MACX,gDAAgD5C,CAAO,MACpDqJ,EAAgB,OACnB,EACF,CACF,CACF,EAAG,CAAC,EACJ,KAAKzG,GAAQ,MAAM,wCAAwC5C,CAAO,GAAG,EACrEoL,EAAM,oBAAoB,QAASE,CAAkB,CACvD,EACAF,EAAM,iBAAiB,OAAQC,CAAW,EAC1CD,EAAM,iBAAiB,QAASE,CAAkB,EAClDF,EAAM,aACJ,QACA,+CAA+CF,CAAK,EACtD,EACKH,GACHK,EAAM,aACJ,UACAH,EAAoB,OAAS,EACzBA,EAAoB,KAAK,GAAG,EAC5B,CAAC,GAAGvE,EAAiB,GAAGsE,CAAa,EAAE,KAAK,GAAG,CACrD,EAEFI,EAAM,aAAa,QAASlL,CAAK,EACjCkL,EAAM,aAAa,MAAO9L,CAAG,EACzB6L,GAAkBC,EAAM,aAAa,QAASD,CAAgB,EAClEP,EAAc,YAAYQ,CAAK,EAE/B,MAAMG,EAAgBV,EAAsB,eAC1C7K,CACF,EACA,OAAO,KAAK2J,GAAa,CACvB,QAAA3J,EACA,WAAYuL,EACZ,OAAQA,EAAc,cACtB,MAAArL,EACA,IAAAZ,EACA,aAAAc,EACA,SAAUjB,EAAS,KACrB,CAAC,CACH,EAEAqM,GAAe,CACblM,EACAoG,IACG,CACH,IAAI+F,EAAc,GAClB,cAAO,KAAK/F,CAAM,EAAE,QAASgG,GAAe,CAC1CD,GAAe,IACZA,EAAY,OAAS,IAAM,IAAM,mBAAmBC,CAAU,CACjE,IAAI,mBAAmBhG,EAAOgG,CAAU,CAAC,CAAC,EAC5C,CAAC,EAGCpM,GACEmM,GAAoBnM,EAAI,QAAQ,GAAG,GAAK,EAAI,IAAM,KAAOmM,EAA3C,GAEpB,EAOA,mBAAqB,CACnB9F,EACAD,IACG,CAEH,GAAIe,EAAuBd,CAAE,EAAG,CAC9B,MAAMgG,EAAW,KAAK,qBAAqBhG,CAAE,EAC7C,KAAKqB,GAAW,mBAAmB2E,EAAUjG,CAAM,CACrD,MAEE,KAAKsB,GAAW,mBAAmBrB,EAAID,CAAM,CAEjD,EAQA,qBACEkG,GACyB,CACzB,GAAI,CAACA,EAAO,MAAM,IAAI,MAAM,mBAAmB,EAE/C,MAAMjG,EAAK,IAAIjH,EAAgBkN,EAAM,GAAIA,EAAM,UAAU,EAGzD,IAAIC,EAAsC,CAAC,EAI3C,cAAO,KAAKD,CAAK,EAAE,QAASE,GAAa,CACvC,MAAMC,EAAYH,EAAME,CAAuC,EAC/D,GAAI,KAAKpC,GAAcqC,CAAS,EAAG,CAEjC,MAAMlL,EAAQ,IAAInD,EAAiB,CACjC,KAAMqO,EAAU,MAAQD,EACxB,SAAUnG,EAAG,EACf,CAAC,EAQD,GANA,OAAO,eAAeA,EAAImG,EAAU,CAClC,MAAOjL,EACP,WAAY,EACd,CAAC,EAGIkL,aAA6BjO,EAAY,CAE5C,MAAMkO,EAAW,CAAC,CAChB,YAAAC,EACA,aAAAC,CACF,IAIE,KAAK,cAAc,CACjB,MAAArL,EAEA,YAAAoL,EAEA,aAAAC,CACF,CAAC,EAEGhO,EAAS6N,EAAoC,UACjDC,CACF,EACAH,EAAc,KAAK,IAAM,CACtBE,EAAoC,YAAY7N,CAAK,CACxD,CAAC,CACH,KAAO,CAGL,MAAMA,EAAS6N,EAAkB,YAC/B,CAACvO,EAAsBkI,EAAa/D,IAClC,KAAK,cAAc,CACjB,MAAAd,EAEA,YAAa6E,EAEb,aAAc/D,CAChB,CAAC,CACL,EACAkK,EAAc,KAAK,IAAM,CAEtBE,EAAkB,cAAc7N,CAAK,CACxC,CAAC,CACH,CACF,SAAWyB,EAAWoM,CAAS,IAE7B,OAAO,eAAepG,EAAImG,EAAU,CAClC,MAAO,SAAUK,IAAoB,CACnC,MAAMC,EAAS,MAAML,EAAU,GAAGI,CAAI,EACtC,OAAO1F,EAAuB2F,CAAM,EAChC,KAAK,qBAAqBA,CAAM,EAChCA,CACN,EACA,WAAY,EACd,CAAC,EAGGN,IAAa,WAAW,CAE1B,MAAMO,EAAc1G,EAAG,QACvB,OAAO,eAAeA,EAAImG,EAAU,CAClC,MAAO,KAGLnG,EAAG,SAAS,EACL0G,EAAY,MAAM1G,CAAE,GAE7B,WAAY,EACd,CAAC,CACH,CAEJ,CAAC,EAKDA,EAAG,SAAW,IAAM,CAClBkG,EAAc,QAASS,GAAU,CAC/BA,IAAQ,CACV,CAAC,EACDT,EAAgB,CAAC,CACnB,EAEOlG,CACT,EAKA,MAAQ,IAAM,CACR,KAAKuB,KACP,cAAc,KAAKA,EAAkB,EACrC,KAAKA,GAAqB,MAE5B,KAAKK,GAAqB,EAC1B,KAAK1H,GAAU,MAAM,EACrB,OAAO,oBAAoB,eAAgB,KAAK0H,EAAoB,EACpE,KAAK3E,GAAQ,MACX,2BAA2B,KAAK,MAAM,oBACpC,KAAKD,EACP,EACF,CACF,EAOA,cAAgB,MAKd+C,GACG,CACH,KAAM,CACJ,MAAO,CAAE,GAAAJ,EAAI,KAAA1H,CAAK,EAClB,YAAAqO,EACA,aAAAC,EAAe,CAAC,CAClB,EAAIxG,EACE,CACJ,aAAA6G,EAAe,KACf,QAAAzL,EAAU,KACV,OAAQ0L,EAAe,KACvB,QAAAxM,CACF,EAAIkM,EAEErO,EAAWyH,EAAG,MAAM,GAAG,EAAE,CAAC,EAE1BmH,EAAezM,GAAWwM,EAC1BE,EAAcD,EAAe,KAAK1D,GAAW0D,CAAY,EAAI,KAE7DE,EAAkBD,EACpB,KAAK,mBAAmB7O,EAAU,CAAE,MAAO6O,CAAY,CAAC,EACxD,KAAK,mBAAmB7O,CAAQ,EACpC,GAAI,CAAC8O,EACH,YAAK/J,GAAQ,KACX,6BAA6BhF,CAAI,sBAAsBC,CAAQ,EACjE,EACO,QAAQ,QAAQ,CAAC,CAAC,EAG3B,MAAM+O,EAAwB,CAE5B,OAAQD,EAAgB,QAAQ,EAChC,UAAW/O,EACX,YAAAqO,EACA,aAAAM,EACA,aAAc,CACZ,eAAgB,EAClB,CACF,EAEIzL,GAAW,CAAC,OAAO,MAAMA,CAAO,IAClC8L,EAAS,aAAe,CACtB,eAAgB,GAChB,QAAS,OAAO9L,CAAO,CACzB,GAIF,MAAM+L,EAAyC,CAAC,EAChD,IAAIC,EAAsB,GAE1B,MAAMC,EAAmBzG,GAAiB,CACxC,MAAMqC,EAAYrC,EAAM,QAAQ,EAC5BxF,GAAWwF,GAAO,cAAc,eAClCuG,EAAc,KAAKvG,EAAM,cAAcsG,EAAU9L,CAAO,CAAC,EACpDgM,IACH,KAAKnF,GACH,yBAAyBgF,EAAgB,EAAE,IAAI/O,CAAI,GACnD,CACE,MAAO,KAAK,OACZ,OAAQ,OAAO,SAAS,IAC1B,CACF,EACAkP,EAAsB,IAExB,KAAKlK,GAAQ,MAAM,CACjB,QAAS,yCACT,iBAAkB0C,EAClB,GAAGqD,CACL,CAAC,IAEDrC,EAAM,KAAK,CACT,YAAarH,EAAY,YACzB,YAAa2N,CACf,CAAC,EACD,KAAKhK,GAAQ,MAAM,CACjB,QAAS,mBACT,iBAAkB0C,EAClB,GAAGqD,CACL,CAAC,EAEL,EAEA,OAAI+D,EAEFK,EAAgBL,CAAW,EAE3B,KAAK9F,GAAQ,QAAQmG,CAAe,EAIrB,MAAM,QAAQ,IAAIF,CAAa,EAC7C,KAAMG,IACL,KAAKpK,GAAQ,MAAM,CACjB,QAAS,0BACT,iBAAkB0C,CACpB,CAAC,EAEM9F,EAAQwN,CAAM,EACtB,EACA,MAAOhI,GAAc,CACpB,WAAKpC,GAAQ,MAAM,CACjB,QAAS,yBACT,QAAS0C,EACT,UAAWN,CACb,CAAC,EACKA,CACR,CAAC,EACA,QAAQ,IAAM,CACT8H,GACF,KAAKlF,GACH,yBAAyB+E,EAAgB,EAAE,IAAI/O,CAAI,GACnD,CACE,MAAO,KAAK,OACZ,OAAQ,OAAO,SAAS,IAC1B,CACF,CACJ,CAAC,CAGL,EAMA,UAAY,IAAoB,MAAM,KAAK,KAAKgJ,GAAQ,OAAO,CAAC,EAQhE,mBAAqB,CACnB/I,EACA6H,IAEA,KAAKsB,GAAW,UAAUnJ,EAAU6H,GAAQ,KAAK,EAOnD,UACE/H,GACU,CACV,KAAM,CACJ,GAAIqC,EACJ,IAAAV,EACA,cAAAsL,EACA,MAAA1K,EACA,aAAAE,EAAe,CAAC,EAChB,OAAA+J,EACA,QAAAC,EACA,QAAAzI,EAAU,CAAC,CACb,EAAIhE,EACJ,GAAI,CAACqC,EAAS,MAAM,IAAI,MAAM,sCAAsC,EAEpE,IAAIiN,EAAajN,EACjB,GAAI,KAAK4G,GAAQ,IAAIqG,CAAU,EAAG,CAChC,IAAIC,EAAU,EACd,KAAO,KAAKtG,GAAQ,IAAI,GAAG5G,CAAO,IAAIkN,CAAO,EAAE,GAC7CA,GAAW,EAEbD,EAAa,GAAGjN,CAAO,IAAIkN,CAAO,EACpC,CACA,KAAM,CAAE,SAAA7M,EAAWlB,EAAS,MAAO,oBAAA+K,EAAsB,CAAC,CAAE,EAAIvI,EAE1DwL,EAAS,KAAK3B,GAAalM,EAAKc,CAAY,EAClD,IAAIkG,EAAsB,KAM1B,GAJA,KAAKqB,GAAa,iBAAkB,CAClC,MAAOsF,EACP,OAAQE,CACV,CAAC,EACG9M,IAAalB,EAAS,MACxBmH,EAAQ,KAAK2D,GAAgB,CAC3B,QAASgD,EACT,IAAKE,EACL,MAAAjN,EACA,aAAAE,EACA,oBAAA8J,EACA,OAAAC,EACA,QAAAC,CACF,CAAC,UACQ/J,IAAalB,EAAS,MAC/BmH,EAAQ,KAAKqE,GAAgB,CAC3B,QAASsC,EACT,IAAKE,EACL,MAAAjN,EACA,cAAA0K,EACA,aAAAxK,EACA,OAAA+J,EACA,QAAAC,EACA,QAAAzI,CACF,CAAC,MAED,OAAM,IAAI,MAAM,qBAAqBtB,CAAkB,EAAE,EAG3D,YAAKuC,GAAQ,MAAM,CACjB,QAAS,eACT,GAAG0D,EAAM,QAAQ,CACnB,CAAC,EACMA,CACT,EAMA,WACE3I,GACG,CACH,KAAM,CACJ,GAAA2H,EACA,IAAAhG,EACA,cAAAsL,EACA,MAAA1K,EACA,iBAAAkN,EAAmB,CAAC,EACpB,QAAAzL,EAAU,CAAC,CACb,EAAIhE,EAEJyP,EAAiB,QAAQ,CAAChN,EAAc0E,IAAU,CAChD,KAAK,UAAU,CACb,GAAI,GAAGQ,CAAE,IAAIR,CAAK,GAClB,IAAAxF,EACA,MAAAY,EACA,cAAA0K,EACA,aAAAxK,EACA,QAAAuB,CACF,CAAC,CACH,EAAG,IAAI,CACT,EAMA,0BAA6B3B,GAAqB,CAChD,KAAKgH,GAAW,0BAA0BhH,CAAO,CACnD,EAOA,sBAAwB,CACtBnC,EACAmC,IACG,CACH,KAAKgH,GAAW,sBAAsBnJ,EAAUmC,CAAO,CACzD,EAMA,YAAeqN,GAAqB,CAElC,KAAKzK,GAAQ,YAAYyK,CAAK,EAE9B,KAAKzG,GAAQ,QAAQ,KAAKyB,EAAoB,EAC9C,KAAKzF,GAAQ,MAAM,wCAAwC,CAC7D,EAOA,YAAegH,GAA8D,CAE3E,MAAMtD,EAAQ,KAAKyC,GAAWa,CAAoB,EAC9CtD,IAEFA,EAAM,QAAQ,EAEd,KAAKO,GAAgB,OAAOP,EAAM,MAAM,EACxC,KAAKQ,GAAa,OAAOR,EAAM,GAAG,EAClC,KAAKM,GAAQ,OAAON,EAAM,EAAE,EAC5B,KAAK1D,GAAQ,MAAM,CACjB,QAAS,6BACT,GAAG0D,EAAM,QAAQ,CACnB,CAAC,EAED,KAAK0D,GAA2B,EAEpC,EAQA,aAAgBrM,GAA2B,CACzC,KAAM,CAAE,GAAA2H,EAAI,mBAAAgI,CAAmB,EAAI3P,EAC7B2G,EAAY,KAAKyC,GAAwB,IAAIzB,CAAE,GAAK,CAAC,EAC3DhB,EAAU,KAAKgJ,CAAkB,EACjC,KAAKvG,GAAwB,IAAIzB,EAAIhB,CAAS,CAChD,CACF,C","sources":["webpack://ice.host/webpack/universalModuleDefinition","webpack://ice.host/webpack/bootstrap","webpack://ice.host/webpack/runtime/define property getters","webpack://ice.host/webpack/runtime/hasOwnProperty shorthand","webpack://ice.host/webpack/runtime/make namespace object","webpack://ice.host/../common/dist/esm/event.js","webpack://ice.host/../common/dist/esm/scriptingObject.js","webpack://ice.host/../common/dist/esm/messageType.js","webpack://ice.host/./lib/types.ts","webpack://ice.host/./lib/utils.ts","webpack://ice.host/./lib/guest.ts","webpack://ice.host/../../node_modules/.pnpm/uuid@9.0.1/node_modules/uuid/dist/esm-browser/native.js","webpack://ice.host/../../node_modules/.pnpm/uuid@9.0.1/node_modules/uuid/dist/esm-browser/rng.js","webpack://ice.host/../../node_modules/.pnpm/uuid@9.0.1/node_modules/uuid/dist/esm-browser/stringify.js","webpack://ice.host/../../node_modules/.pnpm/uuid@9.0.1/node_modules/uuid/dist/esm-browser/v4.js","webpack://ice.host/../common/dist/esm/remoting.js","webpack://ice.host/../common/dist/esm/scriptingObjectManager.js","webpack://ice.host/../common/dist/esm/proxy.js","webpack://ice.host/./lib/host.ts"],"sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"ice\"] = factory();\n\telse\n\t\troot[\"ice\"] = root[\"ice\"] || {}, root[\"ice\"][\"host\"] = factory();\n})(globalThis, () => {\nreturn ","// The require scope\nvar __webpack_require__ = {};\n\n","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","class Event {\n /* eslint-enable indent */\n /**\n * name of the event\n */\n name;\n /**\n * scripting object id that owns this event\n */\n objectId;\n /**\n * unique id of the event\n */\n id;\n /**\n * Create an event object\n * @param {EventParam} param - parameters for creating an event\n */\n constructor(param) {\n const { name, objectId } = param;\n if (!name) throw new Error(\"Event name is required\");\n if (!objectId) throw new Error(\"Scripting object id is required\");\n this.objectId = objectId;\n this.name = name;\n this.id = `${this.objectId}.${this.name}`.toLowerCase();\n }\n}\nclass ProxyEvent {\n /**\n * check if given object is an instance of ProxyEvent\n * @param obj object to be compared\n * @returns true if given object is an instance of ProxyEvent\n */\n static [Symbol.hasInstance](obj) {\n return typeof obj === \"object\" && obj !== null && \"getType\" in obj && typeof obj.getType === \"function\" && obj.getType() === \"ProxyEvent\";\n }\n /* eslint-enable indent */\n /**\n * module that owns this event management. SSF Guest or App Bridge host\n */\n #eventSrc;\n /**\n * unique id of scripting object\n */\n objectId;\n /**\n * name of the event\n */\n name;\n /**\n * unique id of the event\n */\n id;\n /**\n * get type of the object\n * @returns type of the object\n */\n getType() {\n return \"ProxyEvent\";\n }\n /**\n * Create a new instance of the Scripting Object Proxy Event\n * @param {ProxyEventParam} param - parameter for the constructor\n */\n constructor(param) {\n const { name, objectId, eventSrc } = param;\n if (!name) throw new Error(\"Event name is required\");\n if (!objectId) throw new Error(\"Scripting object id is required\");\n if (!eventSrc) throw new Error(\"Event source is required\");\n this.objectId = objectId;\n this.name = name;\n this.#eventSrc = eventSrc;\n this.id = `${this.objectId}.${this.name}`.toLowerCase();\n }\n /**\n * subscribe to an scripting object event\n * @param callback event listener\n * @returns subscription token\n */\n subscribe = (callback) => this.#eventSrc.subscribe({\n eventId: this.id,\n callback\n });\n /**\n * unsubscribe from an scripting object event\n * @param token subscription token\n */\n unsubscribe = (token) => {\n this.#eventSrc.unsubscribe({\n eventId: this.id,\n token\n });\n };\n}\nconst isEvent = (value) => value instanceof Event;\nconst getEventId = (objectId, eventName) => `${objectId.toLowerCase()}.${eventName.toLowerCase()}`;\nexport {\n Event,\n ProxyEvent,\n getEventId,\n isEvent\n};\n","import { isEvent } from \"./event.js\";\nconst FUNCTION = \"function\";\nconst isPublicFunction = (value, fnName) => typeof value === FUNCTION && !!fnName && !fnName.startsWith(\"_\");\nclass ScriptingObject {\n /**\n * unique id of the scripting object\n */\n #id;\n /**\n * type of the scripting object\n */\n #objectType = \"Object\";\n /**\n * Creates an instance of ScriptingObject.\n * @param objectId unique id of the scripting object\n * @param objectType type of the scripting object\n */\n constructor(objectId, objectType) {\n this.#id = objectId;\n this.#objectType = objectType || this.#objectType;\n }\n /**\n * get unique id of the scripting object\n */\n get id() {\n return this.#id;\n }\n /**\n * get type of the scripting object\n */\n get objectType() {\n return this.#objectType;\n }\n /**\n * transform the scripting object to a format suitable for transmitting over window.postMessage\n * @returns marshalled scripting object\n */\n // eslint-disable-next-line no-underscore-dangle\n _toJSON = () => {\n const functions = [];\n const events = [];\n Object.keys(this).forEach((property) => {\n const value = this[property];\n if (isEvent(value)) {\n events.push(property);\n } else if (isPublicFunction(value, property)) {\n functions.push(property);\n }\n });\n return {\n objectId: this.#id,\n objectType: this.#objectType,\n functions,\n events\n };\n };\n /**\n * dispose the scripting object\n */\n // eslint-disable-next-line no-underscore-dangle\n _dispose = () => {\n };\n /**\n * dispose the scripting object\n */\n dispose = () => {\n };\n}\nexport {\n ScriptingObject,\n isPublicFunction\n};\n","var MessageType = /* @__PURE__ */ ((MessageType2) => {\n MessageType2[\"GuestClose\"] = \"guest:close\";\n MessageType2[\"GuestEventSubscribe\"] = \"guest:eventSubscribe\";\n MessageType2[\"GuestEventUnsubscribe\"] = \"guest:eventUnsubscribe\";\n MessageType2[\"GuestFocus\"] = \"guest:focus\";\n MessageType2[\"GuestReady\"] = \"guest:ready\";\n MessageType2[\"GuestReadyComplete\"] = \"guest:readyComplete\";\n MessageType2[\"GuestResize\"] = \"guest:resize\";\n MessageType2[\"HandShake\"] = \"handshake\";\n MessageType2[\"HandShakeAck\"] = \"handshake:ack\";\n MessageType2[\"HostClose\"] = \"host:close\";\n MessageType2[\"HostConfig\"] = \"host:config\";\n MessageType2[\"ListObjects\"] = \"list:objects\";\n MessageType2[\"ObjectEvent\"] = \"object:event\";\n MessageType2[\"ObjectGet\"] = \"object:get\";\n MessageType2[\"ObjectInvoke\"] = \"object:invoke\";\n return MessageType2;\n})(MessageType || {});\nexport {\n MessageType\n};\n","import type {\n IScriptingObject,\n RemotingScriptingObject,\n} from '@elliemae/pui-scripting-object';\n\nexport enum OpenMode {\n /**\n * open as a popup window\n */\n Popup = 'popup',\n /**\n * open as an embedded iframe\n */\n Embed = 'embed',\n}\n\nexport type ValueOf<T> = T[keyof T];\n\n/**\n * allowed sandbox values for the guest application\n */\nexport enum IFrameSandboxValues {\n AllowDownloadsWithoutUserActivation = 'allow-downloads-without-user-activation',\n AllowDownloads = 'allow-downloads',\n AllowForms = 'allow-forms',\n AllowModals = 'allow-modals',\n AllowOrientationLock = 'allow-orientation-lock',\n AllowPointerLock = 'allow-pointer-lock',\n AllowPopups = 'allow-popups',\n AllowPopupsToEscapeSandbox = 'allow-popups-to-escape-sandbox',\n AllowPresentation = 'allow-presentation',\n AllowSameOrigin = 'allow-same-origin',\n AllowScripts = 'allow-scripts',\n AllowStorageAccessByUserActivation = 'allow-storage-access-by-user-activation',\n AllowTopNavigation = 'allow-top-navigation',\n AllowTopNavigationByUserActivation = 'allow-top-navigation-by-user-activation',\n}\n\nexport type GenericFunction = (...args: unknown[]) => unknown;\n\nexport type EventObject = {\n object: RemotingScriptingObject;\n eventName: string;\n eventParams: Record<string, unknown>;\n eventHandler: string | null;\n eventOptions: {\n allowsFeedback: boolean;\n timeout?: number;\n };\n};\n\n/**\n * features for the popup window\n */\nexport type WindowFeatures = {\n /**\n * width of the popup window\n */\n width?: number;\n /**\n * height of the popup window\n */\n height?: number;\n /**\n * top position of the popup window\n */\n top?: number;\n /**\n * left position of the popup window\n */\n left?: number;\n};\n\n/**\n * configuration options for rendering a guest application\n *\n */\nexport type GuestOptions = {\n /**\n * mode of opening the guest application, popup or embed\n * @default OpenMode.Embed\n */\n openMode?: OpenMode;\n /**\n * flag to disable sandboxing for iframe\n * @default false\n */\n disableSandbox?: boolean;\n /**\n * additional sandbox values for the iframe. These values will be added in addition to the default sandbox values.\n * @default [IFrameSandboxValues.AllowScripts, IFrameSandboxValues.AllowPopups, IFrameSandboxValues.AllowModals, IFrameSandboxValues.AllowForms, IFrameSandboxValues.AllowDownloads, IFrameSandboxValues.AllowSameOrigin ]\n */\n sandboxValues?: Array<IFrameSandboxValues>;\n /**\n * custom sandbox values for the iframe. These values will replace the default sandbox values entirely.\n */\n customSandboxValues?: Array<IFrameSandboxValues>;\n /**\n * resize the iframe to fit the content inside\n * @default true\n */\n fitToContent?: boolean;\n /**\n * css style for the iframe\n */\n style?: string;\n /**\n * features for the popup window\n * @default { width: 800, height: 600, top: 100, left: 100 }\n */\n popupWindowFeatures?: WindowFeatures;\n /**\n * permission policy for the guest iframe\n * check https://developer.mozilla.org/en-US/docs/Web/HTML/Reference/Elements/iframe#allow for more details\n * @example \"microphone 'self' https://example.com; geolocation 'none'\"\n */\n permissionPolicy?: string;\n};\n\n/**\n * collection of scripting objects\n */\nexport type ScriptingObjects = Record<string, IScriptingObject>;\n\n/**\n * parameters for attaching a guest\n */\nexport type AttachParam = {\n /**\n * unique id of the guest application\n */\n guestId: string;\n /**\n * url of the guest application\n */\n url: string;\n /**\n * page title for the guest application\n */\n title: string;\n /**\n * dom element to attach the guest application to\n */\n domElement?: HTMLIFrameElement;\n /**\n * window object of the guest application\n */\n window: Window;\n /**\n * open mode of the guest application\n */\n openMode: OpenMode;\n /**\n * additional parameters for the guest application\n */\n searchParams?: Record<string, string | number | boolean>;\n};\n","import { GenericFunction } from './types.js';\n\nexport const getOrigin = (url: string) => {\n if (url === 'about:blank') return '*';\n try {\n const { origin } = new URL(url);\n return origin === 'null' || !origin ? url : origin;\n } catch (e) {\n const { origin } = new URL(url, document.baseURI);\n return origin;\n }\n};\n\nexport const flatten = (source: unknown[]): unknown[] =>\n source.flat(Infinity).filter((v) => v !== undefined);\n\nexport function isFunction(value: any): value is GenericFunction {\n return typeof value === 'function';\n}\n","import { IAnalytics } from '@elliemae/pui-scripting-object';\nimport { Remoting, MessageType } from '@elliemae/microfe-common';\nimport { EventObject, OpenMode } from './types.js';\nimport { getOrigin } from './utils.js';\n\n/**\n * options for creating a guest application\n */\ntype GuestOption = {\n /**\n * unique id of the guest application\n */\n guestId: string;\n /**\n * page title of the guest application\n */\n title: string;\n /**\n * url of the guest application\n */\n url: string;\n /**\n * iframe element of the guest application\n */\n domElement?: HTMLIFrameElement;\n /**\n * window object of the guest application\n */\n window: Window;\n /**\n * open mode of the guest application\n */\n openMode: OpenMode;\n /**\n * individual query parameters of the guest application's url parameter string\n */\n searchParams?: Record<string, unknown>;\n /**\n * remoting object\n */\n remoting: Remoting;\n /**\n * analytics object\n */\n analyticsObj: IAnalytics;\n};\n\n/**\n * message to be sent\n */\nexport type MessageParam = {\n /**\n * type of the message\n */\n messageType: string;\n /**\n * body of the message\n */\n messageBody: unknown;\n};\n\n/**\n * Object repesenting guest application\n */\nexport class Guest {\n /**\n * unique id of the guest application\n */\n public readonly id: string;\n\n /**\n * page title of the guest application\n */\n public readonly title: string;\n\n /**\n * url of the guest application\n */\n public readonly url: string;\n\n /**\n * individual query parameters of the guest application's url parameter string\n */\n public readonly searchParams: Record<string, unknown>;\n\n /**\n * iframe element of the guest application\n */\n public readonly domElement: HTMLIFrameElement | null;\n\n /**\n * window object of the guest application\n */\n public readonly window: Window;\n\n /**\n * open mode of the guest application\n */\n public readonly openMode: OpenMode;\n\n /**\n * origin of the guest application\n */\n public readonly origin: string;\n\n /**\n * flag indicating if the guest application is initialized\n */\n public initialized = false;\n\n /**\n * flag indicating if the guest application is ready\n */\n public ready = false;\n\n /**\n * capabilities of the guest application\n */\n public capabilities: Record<string, unknown>;\n\n /**\n * remoting object\n */\n #remoting: Remoting;\n\n /**\n * analytics object\n */\n #analyticsObj: IAnalytics;\n\n /**\n * Create object representing guest application\n * @param {GuestOption} option - options for creating a guest application\n */\n constructor(option: GuestOption) {\n const {\n guestId,\n domElement = null,\n title,\n url,\n window,\n searchParams = {},\n openMode = OpenMode.Embed,\n remoting,\n analyticsObj,\n } = option;\n this.id = guestId;\n this.title = title;\n this.url = url;\n this.origin = getOrigin(url);\n this.searchParams = searchParams;\n this.domElement = domElement;\n this.window = window;\n this.openMode = openMode;\n this.capabilities = {};\n this.#analyticsObj = analyticsObj;\n this.#remoting = remoting;\n }\n\n /**\n * clean up resources\n */\n dispose = () => {\n if (this.openMode === OpenMode.Popup && !this.window.closed) {\n try {\n // eslint-disable-next-line @typescript-eslint/no-unused-expressions\n this.window.document;\n this.window.close();\n } catch (e) {\n this.#remoting.send({\n targetWin: this.window,\n targetOrigin: this.origin,\n messageType: MessageType.HostClose,\n messageBody: {},\n });\n }\n } else {\n this.domElement?.remove?.();\n }\n // remove guest window from allowed list\n this.#remoting.removeSender({ origin: this.origin, window: this.window });\n };\n\n /**\n * Get information about the guest application\n * @returns guest properties\n */\n getInfo = () => ({\n guestId: this.id,\n guestTitle: this.title,\n guestUrl: this.url,\n });\n\n /**\n * Handshake with the guest application in the popup window\n * @returns true if the guest popup window is open & connected\n */\n handShake = () =>\n new Promise<boolean>((resolve) => {\n let handShakeCount = 0;\n const handShakeRetries = 5;\n let handShakeHandle: ReturnType<typeof setInterval>;\n const onAck = () => {\n clearInterval(handShakeHandle);\n this.#remoting.unlisten({\n messageType: MessageType.HandShakeAck,\n callback: onAck,\n });\n resolve(true);\n };\n handShakeHandle = setInterval(() => {\n if (handShakeCount >= handShakeRetries) {\n clearInterval(handShakeHandle);\n this.#remoting.unlisten({\n messageType: MessageType.HandShakeAck,\n callback: onAck,\n });\n resolve(false);\n } else {\n this.#remoting.send({\n targetWin: this.window,\n targetOrigin: this.origin,\n messageType: MessageType.HandShake,\n messageBody: {},\n });\n handShakeCount += 1;\n }\n }, 1000);\n this.#remoting.listen({\n messageType: MessageType.HandShakeAck,\n callback: onAck,\n });\n });\n\n /**\n * initialize guest messaging\n */\n init = () => {\n // add guest window to the allowed list\n this.#remoting.addSender({ origin: this.origin, window: this.window });\n // for popup guests, we need to provide the guest with the host's window\n if (this.openMode === OpenMode.Popup) {\n this.handShake().catch(() => {});\n }\n };\n\n /**\n * invokes event callback on the guest application\n * @param {EventObject} event - event object\n * @param {number} timeout - timeout in milliseconds\n */\n dispatchEvent = (event: EventObject, timeout: number) => {\n this.#analyticsObj\n .startTiming(\n `ScriptingObject.Event.${event.object.objectId}.${event.eventName}`,\n {\n appId: this.id,\n appUrl: this.url,\n },\n )\n .catch(() => {});\n return this.#remoting\n .invoke({\n targetWin: this.window,\n targetOrigin: this.origin,\n messageType: MessageType.ObjectEvent,\n messageBody: event,\n responseTimeoutMs: timeout,\n })\n .finally(() => {\n this.#analyticsObj\n .endTiming(\n `ScriptingObject.Event.${event.object.objectId}.${event.eventName}`,\n {\n appId: this.id,\n appUrl: this.url,\n },\n )\n .catch(() => {});\n });\n };\n\n /**\n * Send a message without any form of response. fire and forget\n * @param {MessageParam} param - message to be sent\n */\n send = (param: MessageParam) => {\n this.#remoting.send({\n targetWin: this.window,\n targetOrigin: this.origin,\n ...param,\n });\n };\n}\n","const randomUUID = typeof crypto !== 'undefined' && crypto.randomUUID && crypto.randomUUID.bind(crypto);\nexport default {\n randomUUID\n};","// Unique ID creation requires a high quality random # generator. In the browser we therefore\n// require the crypto API and do not support built-in fallback to lower quality random number\n// generators (like Math.random()).\nlet getRandomValues;\nconst rnds8 = new Uint8Array(16);\nexport default function rng() {\n // lazy load so that environments that need to polyfill have a chance to do so\n if (!getRandomValues) {\n // getRandomValues needs to be invoked in a context where \"this\" is a Crypto implementation.\n getRandomValues = typeof crypto !== 'undefined' && crypto.getRandomValues && crypto.getRandomValues.bind(crypto);\n\n if (!getRandomValues) {\n throw new Error('crypto.getRandomValues() not supported. See https://github.com/uuidjs/uuid#getrandomvalues-not-supported');\n }\n }\n\n return getRandomValues(rnds8);\n}","import validate from './validate.js';\n/**\n * Convert array of 16 byte values to UUID string format of the form:\n * XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX\n */\n\nconst byteToHex = [];\n\nfor (let i = 0; i < 256; ++i) {\n byteToHex.push((i + 0x100).toString(16).slice(1));\n}\n\nexport function unsafeStringify(arr, offset = 0) {\n // Note: Be careful editing this code! It's been tuned for performance\n // and works in ways you may not expect. See https://github.com/uuidjs/uuid/pull/434\n return byteToHex[arr[offset + 0]] + byteToHex[arr[offset + 1]] + byteToHex[arr[offset + 2]] + byteToHex[arr[offset + 3]] + '-' + byteToHex[arr[offset + 4]] + byteToHex[arr[offset + 5]] + '-' + byteToHex[arr[offset + 6]] + byteToHex[arr[offset + 7]] + '-' + byteToHex[arr[offset + 8]] + byteToHex[arr[offset + 9]] + '-' + byteToHex[arr[offset + 10]] + byteToHex[arr[offset + 11]] + byteToHex[arr[offset + 12]] + byteToHex[arr[offset + 13]] + byteToHex[arr[offset + 14]] + byteToHex[arr[offset + 15]];\n}\n\nfunction stringify(arr, offset = 0) {\n const uuid = unsafeStringify(arr, offset); // Consistency check for valid UUID. If this throws, it's likely due to one\n // of the following:\n // - One or more input array values don't map to a hex octet (leading to\n // \"undefined\" in the uuid)\n // - Invalid input values for the RFC `version` or `variant` fields\n\n if (!validate(uuid)) {\n throw TypeError('Stringified UUID is invalid');\n }\n\n return uuid;\n}\n\nexport default stringify;","import native from './native.js';\nimport rng from './rng.js';\nimport { unsafeStringify } from './stringify.js';\n\nfunction v4(options, buf, offset) {\n if (native.randomUUID && !buf && !options) {\n return native.randomUUID();\n }\n\n options = options || {};\n const rnds = options.random || (options.rng || rng)(); // Per 4.4, set bits for version and `clock_seq_hi_and_reserved`\n\n rnds[6] = rnds[6] & 0x0f | 0x40;\n rnds[8] = rnds[8] & 0x3f | 0x80; // Copy bytes to buffer, if provided\n\n if (buf) {\n offset = offset || 0;\n\n for (let i = 0; i < 16; ++i) {\n buf[offset + i] = rnds[i];\n }\n\n return buf;\n }\n\n return unsafeStringify(rnds);\n}\n\nexport default v4;","import { v4 as uuidv4 } from \"uuid\";\nconst MESSAGE_SOURCE = \"elli:remoting\";\nconst RESPONSE_MESSAGE_TYPE = \"elli:remoting:response\";\nconst EXCEPTION_MESSAGE_TYPE = \"elli:remoting:exception\";\nconst createMessage = ({\n messageType,\n messageBody,\n requestId,\n onewayMsg = false\n}) => ({\n requestId: requestId ?? (!onewayMsg ? uuidv4() : null),\n source: MESSAGE_SOURCE,\n type: messageType,\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n body: messageBody\n});\nconst sendMessage = (param) => {\n const { targetWin, targetOrigin, messageType, messageBody } = param;\n const msg = createMessage({ messageType, messageBody });\n targetWin.postMessage(msg, targetOrigin);\n};\nclass Remoting {\n #correlationId;\n #logger;\n /**\n * set of listeners that are registered\n */\n #listeners = /* @__PURE__ */ new Map();\n /**\n * Represents the set of invocations that are waiting for a response\n */\n #invocations = /* @__PURE__ */ new Map();\n /**\n * The handle to the timeout monitor\n */\n #timeoutMonitorHandle = null;\n /**\n * The window that remoting was initialized on\n */\n #initializedWindow = null;\n /**\n * The set of windows that are allowed to send messages to this window\n */\n #allowedSenders = /* @__PURE__ */ new Map();\n /**\n * Create a new instance of the Remoting class\n * @param logger pui-diagnostic logger\n * @param correlationId unique id for the current session\n */\n constructor(logger, correlationId) {\n if (!logger) throw new Error(\"logger is required\");\n if (!correlationId) throw new Error(\"correlationId is required\");\n this.#correlationId = correlationId;\n this.#logger = logger;\n }\n // Evaluates the timeouts on any waiting invocations and schedules the next check\n #evaluateTimeouts = () => {\n this.#timeoutMonitorHandle = null;\n const ts = Date.now();\n const canceledItems = [];\n let nextCancelTime = null;\n this.#invocations.forEach((eventData, key) => {\n const { requestId, cancelTime } = eventData;\n if (cancelTime && cancelTime <= ts) {\n this.#logger.debug(\n `Detected response timeout for requestId: ${requestId}...`\n );\n canceledItems.push(key);\n eventData.resolve(void 0);\n } else if (cancelTime) {\n nextCancelTime = nextCancelTime === null ? cancelTime : Math.min(nextCancelTime, cancelTime);\n }\n });\n canceledItems.forEach((key) => {\n this.#invocations.delete(key);\n });\n if (nextCancelTime !== null) {\n const delay = Math.max(nextCancelTime - Date.now(), 0);\n this.#scheduleTimeoutCheck(delay);\n }\n };\n // Schedule a timeout check after a delay\n #scheduleTimeoutCheck = (delayMs) => {\n if (this.#timeoutMonitorHandle !== null) return;\n this.#timeoutMonitorHandle = window.setTimeout(\n this.#evaluateTimeouts,\n delayMs\n );\n };\n // Stops the timeout monitor\n #stopResponseMonitor = () => {\n if (this.#timeoutMonitorHandle !== null) {\n window.clearTimeout(this.#timeoutMonitorHandle);\n this.#timeoutMonitorHandle = null;\n }\n };\n // Pops an invocation from the incovation list\n #popInvocation = (requestId) => {\n const e = this.#invocations.get(requestId);\n this.#logger.debug(`serving requestId: ${requestId}`);\n this.#invocations.delete(requestId);\n return e;\n };\n // Handles a response to a prior cross-frame invocation\n #processResponse = (message) => {\n const { requestId } = message;\n this.#logger.debug(\n `Response received for invocation requestId: ${requestId}`\n );\n const eventData = this.#popInvocation(requestId);\n if (!eventData) {\n this.#logger.debug(\n `Received response to stale/invalid request with requestId: ${requestId}`\n );\n return false;\n }\n eventData.resolve(message.body);\n return true;\n };\n // Handles a response to a prior cross-frame invocation\n #processException = (message) => {\n this.#logger.debug(\n `Exception received for invocation (requestId = ${message.requestId})`\n );\n const eventData = this.#popInvocation(message.requestId);\n if (!eventData) {\n this.#logger.warn(\n `Received exception for stale/invalid request (requestId = ${message.requestId})`\n );\n return false;\n }\n eventData.reject(new Error(message.body));\n return true;\n };\n // Receives a message from another window and invokes any event handlers\n #receive = ({\n sourceWin,\n sourceOrigin,\n message\n }) => {\n this.#logger.debug(`Received message of type \"${message.type}\"`);\n const callbacks = this.#listeners.get(message.type);\n if (!callbacks) return false;\n callbacks.forEach((callback) => {\n this.#logger.debug(`Invoking message handler ${callback.name}`);\n callback({\n sourceWin,\n sourceOrigin,\n requestId: message.requestId,\n type: message.type,\n body: message.body\n });\n });\n return true;\n };\n // Processes a message received thru the window's message event\n #processMessage = (message) => {\n if (this.#allowedSenders.size === 0) return false;\n if (!message.source) return false;\n const senderOrigin = this.#allowedSenders.get(message.source);\n if (!senderOrigin) return false;\n if (message?.data?.source !== MESSAGE_SOURCE) return false;\n this.#logger.debug(\n `Remoting: Received message of type \"${message.data.type}\"`\n );\n if (message.data.type === RESPONSE_MESSAGE_TYPE)\n this.#processResponse(message.data);\n else if (message.data.type === EXCEPTION_MESSAGE_TYPE)\n this.#processException(message.data);\n else\n this.#receive({\n sourceWin: message.source,\n sourceOrigin: senderOrigin,\n message: message.data\n });\n return true;\n };\n /**\n * Adds window and its origin list of allowed senders\n * @param {AddSenderParam} param - The sender to add\n */\n addSender = (param) => {\n const { origin, window: window2 } = param;\n if (!origin) throw new Error(\"origin is required\");\n if (!window2) throw new Error(\"window is required\");\n this.#allowedSenders.set(window2, origin);\n };\n /**\n * Initializes the remoting service for a window\n * @param win The window to initialize remoting for\n */\n initialize = (win) => {\n if (this.#initializedWindow) {\n this.#initializedWindow.removeEventListener(\n \"message\",\n this.#processMessage\n );\n }\n win.addEventListener(\"message\", this.#processMessage);\n this.#initializedWindow = win;\n this.#logger.debug(`initialized remoting id: ${this.#correlationId}`);\n };\n /**\n * Closes the remoting service for a window\n */\n close = () => {\n if (this.#initializedWindow) {\n this.#initializedWindow.removeEventListener(\n \"message\",\n this.#processMessage\n );\n this.#initializedWindow = null;\n }\n this.#stopResponseMonitor();\n this.#logger.debug(`closed remoting id: ${this.#correlationId}`);\n };\n /**\n * Sends an invocation which generates a Promise to be used to get a response\n * @param {InvokeParam} param The parameters for the invocation\n * @returns promisifyed response\n */\n invoke = (param) => {\n const {\n targetWin,\n targetOrigin,\n messageType,\n messageBody,\n responseTimeoutMs\n } = param;\n return new Promise((resolve, reject) => {\n const msg = createMessage({ messageType, messageBody });\n this.#invocations.set(msg.requestId, {\n requestId: msg.requestId,\n resolve,\n reject,\n cancelTime: responseTimeoutMs ? Date.now() + responseTimeoutMs : null\n });\n targetWin.postMessage(msg, targetOrigin);\n const { requestId } = msg;\n this.#logger.debug(\n `Posted invocation message of type ${messageType} requestId: ${requestId || \"\"}`\n );\n if (responseTimeoutMs) {\n this.#logger.debug(\n `scheduling timeout check for requestId: ${requestId || \"\"} in ${responseTimeoutMs} ms`\n );\n this.#scheduleTimeoutCheck(responseTimeoutMs);\n }\n });\n };\n /**\n * Setup callback for a specific message type\n * @param {ListenParam<T>} param The parameters for the listener\n */\n listen = (param) => {\n const { messageType, callback } = param;\n const items = this.#listeners.get(messageType) || [];\n items.push(callback);\n this.#listeners.set(messageType, items);\n };\n /**\n * Remove a previously registered callback for a specific message type\n * @param {ListenParam<T>} param The parameters identifying the listener to remove\n */\n unlisten = (param) => {\n const { messageType, callback } = param;\n const items = this.#listeners.get(messageType);\n if (!items) return;\n const index = items.indexOf(callback);\n if (index !== -1) {\n items.splice(index, 1);\n }\n };\n /**\n * Send a message without any form of response. Fire and forget\n * @param {SendParam} param The parameters for the send\n */\n send = (param) => {\n const { targetWin, targetOrigin, messageType, messageBody } = param;\n const msg = createMessage({\n messageType,\n messageBody,\n onewayMsg: true\n });\n targetWin.postMessage(msg, targetOrigin);\n this.#logger.debug(`Posted one-way message of type \"${messageType}\"`);\n };\n /**\n * Removes a window from the list of allowed senders\n * @param {AddSenderParam} param - The sender to remove\n */\n removeSender = (param) => {\n const { window: window2 } = param;\n if (window2) this.#allowedSenders.delete(window2);\n };\n /**\n * Send a response message to a window\n * @param {RespondParam} param The parameters for the response\n */\n respond = (param) => {\n const { targetWin, targetOrigin, requestId, response } = param;\n const msg = createMessage({\n messageType: RESPONSE_MESSAGE_TYPE,\n messageBody: response,\n requestId\n });\n targetWin.postMessage(msg, targetOrigin);\n this.#logger.debug(\n `Response sent to caller for invocation requestId: ${requestId}`\n );\n };\n /**\n * Send an exception message to a window\n * @param {RaiseExceptionParam} param The parameters for the exception\n */\n raiseException = (param) => {\n const { targetWin, targetOrigin, requestId, ex } = param;\n const messageBody = ex instanceof Error ? ex.message : ex;\n const msg = createMessage({\n messageType: EXCEPTION_MESSAGE_TYPE,\n messageBody,\n requestId\n });\n targetWin.postMessage(msg, targetOrigin);\n this.#logger.debug(\n `Exception sent to caller for invocation. requestId: ${requestId}`\n );\n };\n}\nexport {\n Remoting,\n sendMessage\n};\n","const MODULE_OBJECT = \"module\";\nvar SecurityContext = /* @__PURE__ */ ((SecurityContext2) => {\n SecurityContext2[\"USER\"] = \"USER\";\n SecurityContext2[\"PARTNER\"] = \"PARTNER\";\n return SecurityContext2;\n})(SecurityContext || {});\nclass ScriptingObjectManager {\n #normalizeId = (id) => id.trim().toLowerCase();\n /**\n * collection of registered scripting objects\n */\n #scriptingObjects = /* @__PURE__ */ new Map();\n /**\n * collection of proxied scripting objects for each guest\n */\n #guestScriptingObjects = /* @__PURE__ */ new Map();\n #addGuestScriptingObject = (params) => {\n const { so, guestId } = params;\n const objectId = this.#normalizeId(so.id);\n const guestSOs = this.#guestScriptingObjects.get(guestId);\n if (!guestSOs) {\n this.#guestScriptingObjects.set(guestId, /* @__PURE__ */ new Map([[objectId, params]]));\n } else {\n if (guestSOs.has(objectId))\n throw new Error(\n `Scripting Object ${so.id} already exists for guest ${guestId}`\n );\n guestSOs.set(objectId, params);\n }\n };\n #disposeSO = ({ so }) => {\n if (so._dispose && typeof so._dispose === \"function\") {\n try {\n so._dispose();\n } catch {\n }\n }\n };\n /**\n * get scripting object for the given object id and guest id\n * this method is backward compatible with the V1 guest, where the guest id is not provided. It will return the scripting object for the first guest\n * @param root0\n * @param root0.objectId\n * @param root0.guestId\n * @returns scripting object for the given object id and guest id. null if not found\n */\n #getGuestScriptingObject = ({\n objectId,\n guestId\n }) => {\n if (objectId === MODULE_OBJECT && !guestId) {\n for (const [, mSOs] of this.#guestScriptingObjects) {\n const mSO = mSOs.get(objectId);\n if (mSO) return mSO;\n }\n }\n const SOs = guestId ? this.#guestScriptingObjects.get(guestId) : null;\n if (SOs) {\n return SOs.get(objectId) ?? null;\n }\n return null;\n };\n #removeGuestScriptingObject = ({\n objectId,\n guestId\n } = {}) => {\n if (guestId) {\n if (!objectId) {\n const sosInfo = this.#guestScriptingObjects.get(guestId);\n if (sosInfo) {\n sosInfo.forEach(this.#disposeSO);\n }\n this.#guestScriptingObjects.delete(guestId);\n return;\n }\n const moduleSOs = this.#guestScriptingObjects.get(guestId);\n if (moduleSOs) {\n const soInfo = moduleSOs.get(objectId);\n if (soInfo) this.#disposeSO(soInfo);\n moduleSOs.delete(objectId);\n }\n } else if (objectId) {\n this.#guestScriptingObjects.forEach((moduleSOs) => {\n const soInfo = moduleSOs.get(objectId);\n if (soInfo) this.#disposeSO(soInfo);\n moduleSOs.delete(objectId);\n });\n }\n };\n /**\n * registers scripting object to the host\n * @param so scripting object to register\n * @param {AddScriptingObjectParams<ValueOf<AppObjects>>}\n * @param params\n */\n addScriptingObject = (so, params) => {\n const { guestId } = params || {};\n if (!so?.id || !so?._toJSON) {\n throw new Error(\"Object is not derived from ScriptingObject\");\n }\n const objectId = this.#normalizeId(so.id);\n if (objectId === MODULE_OBJECT && !guestId) {\n throw new Error(`Guest id is required to add Module scripting object`);\n }\n if (guestId) {\n this.#addGuestScriptingObject({ so, ...params, guestId });\n return;\n }\n if (this.#scriptingObjects.has(objectId))\n throw new Error(`Scripting Object ${so.id} already exists`);\n this.#scriptingObjects.set(objectId, { so, ...params });\n };\n /**\n * Get reference to the scripting object proxy for a guest\n * @param {string} objectId scripting object id\n * @param {GuestContext} guest that is requesting the scripting object\n * @returns proxied scripting object reference\n */\n getObject = (objectId, guest) => {\n const id = this.#normalizeId(objectId);\n let soInfo = this.#getGuestScriptingObject({\n objectId: id,\n guestId: guest?.id\n });\n soInfo = soInfo ?? this.#scriptingObjects.get(id) ?? null;\n const { so } = soInfo || {};\n if (!so) return null;\n return so;\n };\n /**\n * Check if a scripting object exists\n * @param objectId unique id of the scripting object\n * @param guest\n * @returns true if the scripting object exists, false otherwise\n */\n has = (objectId, guest) => this.getObject(objectId, guest) !== null;\n /**\n * list name of scripting objects for the given guest\n * @param guestId unique id of the guest\n * @returns name of scripting objects for the given guest\n */\n listScriptingObjects = (guestId) => {\n const objects = new Set(this.#scriptingObjects.keys());\n const guestSOs = this.#guestScriptingObjects.get(guestId);\n if (guestSOs) {\n for (const key of guestSOs.keys()) objects.add(key);\n }\n return Array.from(objects);\n };\n /**\n * removes scripting object\n * @param objectId unique id of the scripting object\n * @param guestId unique id of the guest\n */\n removeScriptingObject = (objectId, guestId) => {\n const id = this.#normalizeId(objectId);\n if (guestId) {\n this.#removeGuestScriptingObject({ objectId: id, guestId });\n } else {\n this.#removeGuestScriptingObject({ objectId: id });\n const soInfo = this.#scriptingObjects.get(id);\n if (soInfo) this.#disposeSO(soInfo);\n this.#scriptingObjects.delete(id);\n }\n };\n /**\n * removes all scripting objects\n * @param guestId unique id of the guest\n */\n removeAllScriptingObjects = (guestId) => {\n if (!guestId) {\n this.#scriptingObjects.forEach(this.#disposeSO);\n this.#scriptingObjects.clear();\n } else {\n this.#removeGuestScriptingObject({ guestId });\n }\n };\n}\nexport {\n MODULE_OBJECT,\n ScriptingObjectManager,\n SecurityContext\n};\n","class ScriptingObjectProxy {\n /**\n * proxy type\n */\n __TYPE__ = \"Proxy\";\n /**\n * unique id of scripting object\n */\n id;\n /**\n * type of scripting object\n */\n objectType;\n /**\n * Creates a new instance of the Scripting Object Proxy\n * @param objectId unique id of scripting object\n * @param objectType type of scripting object\n */\n constructor(objectId, objectType) {\n this.id = objectId;\n this.objectType = objectType;\n }\n}\nconst isScriptingObjectProxy = (value) => (\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n value?.constructor?.name === \"Proxy\" || // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n value?.constructor?.name === \"ScriptingObjectProxy\" || // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access, no-underscore-dangle\n value?.__TYPE__ === \"Proxy\"\n);\nexport {\n ScriptingObjectProxy,\n isScriptingObjectProxy\n};\n","/* eslint-disable max-lines */\nimport { v4 as uuidv4 } from 'uuid';\nimport type {\n IScriptingObject,\n IScriptingObjectProxy,\n ScriptingObjectTypes,\n Events,\n IAnalytics,\n TimingOptions,\n} from '@elliemae/pui-scripting-object';\nimport {\n Remoting,\n ScriptingObject,\n MessageType,\n Event,\n ScriptingObjectManager,\n ProxyEvent,\n isScriptingObjectProxy,\n GuestContext,\n} from '@elliemae/microfe-common';\nimport type {\n ListenerCallbackParams,\n EventListeners,\n IScriptingObjectProxyEvent,\n AddScriptingObjectParams,\n GetObjectParams,\n DispatchEventParam,\n EventOptions,\n FilterCriteria,\n} from '@elliemae/microfe-common';\nimport { Logger, LogLevels } from '@elliemae/pui-diagnostics';\nimport {\n EventObject,\n GenericFunction,\n IFrameSandboxValues,\n GuestOptions,\n ValueOf,\n ScriptingObjects,\n AttachParam,\n OpenMode,\n WindowFeatures,\n} from './types.js';\nimport {\n ISSFHost,\n HostOption,\n LoadGuestParam,\n LoadGuestsParam,\n GuestCloseParam,\n GuestEventSubscribeCallback,\n GuestEventUnsubscribeCallback,\n} from './ihost.js';\nimport { Guest } from './guest.js';\nimport { flatten, isFunction } from './utils.js';\n\nexport const SANDBOX_DEFAULT = [\n IFrameSandboxValues.AllowScripts,\n IFrameSandboxValues.AllowPopups,\n IFrameSandboxValues.AllowModals,\n IFrameSandboxValues.AllowForms,\n IFrameSandboxValues.AllowDownloads,\n IFrameSandboxValues.AllowSameOrigin,\n];\n\ntype GuestWindowSize = {\n width: number;\n height: number;\n};\n\n/**\n * Host class for embedding guest application and enabling bi-directional communication using scripting objects methods and events\n * @typeParam AppObjects - scripting objects that are published by the host application\n * @typeParam AppEvents - events that are published by the host application\n */\n/* eslint-disable indent */\nexport class SSFHost<\n AppObjects extends ScriptingObjects = ScriptingObjectTypes,\n AppEvents extends EventListeners = Events,\n> implements ISSFHost<AppObjects, AppEvents>\n{\n /* eslint-enable indent */\n /**\n * unique identifier for the host\n */\n public hostId: string;\n\n /**\n * reference to the remoting object\n */\n #remoting: Remoting;\n\n /**\n * unique identifier for the host\n */\n #correlationId: string;\n\n /**\n * reference to the logger\n */\n #logger: Logger;\n\n /**\n * reference to the analytics object\n */\n #analyticsObj: IAnalytics;\n\n /**\n * list of guests\n */\n #guests = new Map<string, Guest>();\n\n /**\n * reverse lookup: window -> guest for O(1) message routing\n */\n #guestsByWindow = new Map<Window, Guest>();\n\n /**\n * reverse lookup: url -> guest for O(1) popup dedup\n */\n #guestsByUrl = new Map<string, Guest>();\n\n /**\n * list of callbacks for guest close.\n */\n #guestCloseCallbackList = new Map<\n string,\n (({ id }: { id: string }) => void | Promise<void>)[]\n >();\n\n /**\n * scripting object manager\n */\n #soManager: ScriptingObjectManager<AppObjects>;\n\n /**\n * callback for ready state\n */\n #readyStateCallback: null | ((guest: Guest) => void) = null;\n\n /**\n *\n */\n #popupGuestMonitor: ReturnType<typeof setInterval> | null = null;\n\n /**\n * callback for guest event subscription\n */\n #onGuestEventSubscribe: GuestEventSubscribeCallback | null = null;\n\n /**\n * callback for guest event unsubscription\n */\n #onGuestEventUnsubscribe: GuestEventUnsubscribeCallback | null = null;\n\n /**\n * Create a new host\n * @param hostId unique identifier for the host\n * @param {HostOption} option - options for the host\n */\n constructor(hostId: string, option: HostOption) {\n // Set the local variables\n this.hostId = hostId;\n if (!option?.logger) throw new Error('Logger is required');\n if (!option?.analyticsObj) throw new Error('Analytics object is required');\n this.#logger = option.logger;\n this.#analyticsObj = option.analyticsObj;\n this.#correlationId = uuidv4();\n this.#remoting = new Remoting(this.#logger, this.#correlationId);\n if (\n option?.readyStateCallback &&\n typeof option?.readyStateCallback !== 'function'\n )\n throw new Error('readyStateCallback must be a function');\n this.#readyStateCallback = option?.readyStateCallback || null;\n this.#onGuestEventSubscribe = option?.onGuestEventSubscribe || null;\n this.#onGuestEventUnsubscribe = option?.onGuestEventUnsubscribe || null;\n this.#soManager = new ScriptingObjectManager<AppObjects>();\n // Initialize the messenger\n this.#remoting.initialize(window);\n this.#connect();\n // close all popup guest when host window gets reloaded\n window.addEventListener('beforeunload', this.#closeAllPopupGuests);\n this.#logger.debug(\n `host is initialized. hostId: ${this.hostId}, correlationId: ${\n this.#correlationId\n }`,\n );\n }\n\n #sendBAEvent = (event: string, data: Record<string, unknown>) => {\n const baEvent = { event, ...data };\n this.#analyticsObj.sendBAEvent(baEvent).catch((e) => {\n this.#logger.debug(\n `Analytics sendBAEvent failed: ${(e as Error).message}`,\n );\n });\n };\n\n #startTiming = (name: string, options: TimingOptions) => {\n this.#analyticsObj.startTiming(name, options).catch((e) => {\n this.#logger.debug(\n `Analytics startTiming failed: ${(e as Error).message}`,\n );\n });\n };\n\n #endTiming = (start: string, options: TimingOptions) => {\n this.#analyticsObj.endTiming(start, options).catch((e) => {\n this.#logger.debug(`Analytics endTiming failed: ${(e as Error).message}`);\n });\n };\n\n #closeAllPopupGuests = () => {\n const popupIds = Array.from(this.#guests.values())\n .filter((guest) => guest.openMode === OpenMode.Popup)\n .map((guest) => guest.id);\n popupIds.forEach((id) => this.unloadGuest(id));\n };\n\n /**\n * get the reference to the guest application by its window\n * @param guestWindow reference to the guest window\n * @returns reference to the guest\n */\n #getGuestForWindow = (guestWindow: Window) =>\n this.#guestsByWindow.get(guestWindow);\n\n /**\n * get the reference to the guest application by its window\n * @param url url of the guest application\n * @returns reference to the guest\n */\n #getGuestForUrl = (url: string) => this.#guestsByUrl.get(url) ?? null;\n\n /**\n * check if a object is a scripting object\n * @param value javascript object\n * @returns true if the object is a scripting object\n */\n #isScriptingObject = (value: any): value is ValueOf<AppObjects> =>\n // eslint-disable-next-line no-underscore-dangle, @typescript-eslint/no-unsafe-member-access\n typeof value?._toJSON === 'function';\n\n #encodeResponse = (val: unknown, guest?: GuestContext) => {\n if (this.#isScriptingObject(val)) {\n // add scripting objects returned from scripting object methods\n if (\n !this.#soManager.has(\n val?.id as Extract<keyof AppObjects, string>,\n guest,\n )\n )\n this.#soManager.addScriptingObject(\n val,\n guest ? { guestId: guest?.id } : {},\n );\n // eslint-disable-next-line no-underscore-dangle\n return { type: 'object', object: val._toJSON() };\n }\n return { type: 'value', value: val };\n };\n\n #encodeException = (ex: string | Error) => {\n if (typeof ex === 'string') {\n return ex;\n }\n if (ex instanceof Error) {\n return ex.message;\n }\n return 'An unexpected error occurred in the host application';\n };\n\n #dispatchConfigEvent = (guest: Guest) => {\n if (guest.ready) {\n this.#remoting.send({\n targetWin: guest.window,\n targetOrigin: guest.origin,\n messageType: MessageType.HostConfig,\n messageBody: {\n logLevel: this.#logger.getLogLevel(),\n ...guest.getInfo(),\n },\n });\n }\n };\n\n #invoke = <T extends IScriptingObject>({\n guest,\n obj,\n functionName,\n functionParams,\n }: {\n guest: Guest;\n obj: T;\n functionName: keyof IScriptingObject;\n functionParams: unknown[];\n }) => {\n const func = obj[functionName];\n // Ensure the function exists\n if (!isFunction(func)) {\n this.#logger.warn(\n `Attempt to call invalid function on object type ${\n obj.objectType\n }: ${String(functionName)}`,\n );\n return Promise.reject(\n new Error(\n `Method '${functionName}' not found in Scripting Object '${obj.id}'`,\n ),\n );\n }\n\n // Invoke the object's function\n this.#logger.debug(\n `Invoking host implementation of ${obj.id}.${String(functionName)}()`,\n );\n return new Promise((resolve) => {\n Object.defineProperty(func, 'callContext', {\n value: { guest },\n configurable: true,\n enumerable: true,\n writable: true,\n });\n\n resolve((func as GenericFunction)(...functionParams));\n });\n };\n\n #handleGuestReadyComplete = ({\n sourceWin,\n sourceOrigin,\n requestId,\n }: ListenerCallbackParams<any>) => {\n // Verify the guest belongs to this host\n const guest = this.#getGuestForWindow(sourceWin);\n if (!guest) {\n this.#logger.warn(\n `Received ready event for unknown guest. requestId: ${requestId}`,\n );\n return;\n }\n\n // Ensure this guest is initialized\n if (!guest.initialized) {\n this.#logger.warn(\n 'Guest must be initialized before it is marked as ready',\n );\n this.#remoting.raiseException({\n targetWin: sourceWin,\n targetOrigin: sourceOrigin,\n requestId,\n ex: 'Guest must be initialized before it is marked as ready',\n });\n return;\n }\n\n if (!guest.ready) {\n // Set the ready state\n guest.ready = true;\n const guestInfo = guest.getInfo();\n this.#endTiming('SSF.Guest.Load', {\n appId: guestInfo.guestId,\n appUrl: guestInfo.guestUrl,\n });\n // Invoke the control function on the guest\n this.#dispatchConfigEvent(guest);\n // Invoke the registered callback, if any\n this.#readyStateCallback?.(guest);\n this.#logger.audit({\n message: `Guest is ready`,\n ...guestInfo,\n });\n }\n };\n\n // Initializes a guest when the guest is full loaded\n #handleGuestReady = ({\n sourceWin,\n sourceOrigin,\n requestId,\n body,\n }: ListenerCallbackParams<Record<string, any>>) => {\n // Verify the guest belongs to this host\n const guest = this.#getGuestForWindow(sourceWin);\n if (!guest) {\n this.#logger.warn(\n `Received ready event for unknown guest. requestid = ${requestId}`,\n );\n return;\n }\n if (!guest.initialized) {\n // Initialize the capabilities object\n guest.initialized = true;\n guest.capabilities = body || {};\n this.#logger.audit({\n message: `Guest is initialized`,\n ...guest.getInfo(),\n });\n }\n // If the guest has not indicated that it will provide explicit notification\n // when it's ready, we'll fire the ready event now\n if (!body || !body.onReady) {\n this.#handleGuestReadyComplete({\n sourceWin,\n sourceOrigin,\n requestId,\n type: '',\n body: null,\n });\n }\n };\n\n /**\n * cleanup the guest reference when it is closed\n * @param param0\n * @param param0.sourceWin\n */\n #handleGuestClose = async ({ sourceWin }: ListenerCallbackParams<any>) => {\n if (sourceWin?.window) {\n const guest = this.#findGuest(sourceWin);\n if (guest && !(await guest.handShake())) {\n this.unloadGuest(sourceWin);\n }\n }\n };\n\n // Handles list objects requests from the remote automation framework\n #handleListObjects = ({\n sourceWin,\n sourceOrigin,\n requestId,\n }: ListenerCallbackParams<{\n objects: keyof AppObjects;\n }>) => {\n this.#logger.debug(\n `Processing listObjects request. requestId = ${requestId}`,\n );\n\n // Get the guest from which the request came\n const guest = this.#getGuestForWindow(sourceWin);\n if (!guest) {\n this.#logger.warn('Rejected object request from unknown guest window');\n return false;\n }\n\n // Get the list of objects available for the guest\n const objects = this.#soManager.listScriptingObjects(guest.id);\n\n this.#remoting.respond({\n targetWin: sourceWin,\n targetOrigin: sourceOrigin,\n requestId,\n response: objects,\n });\n\n this.#logger.audit({\n message: `name of scripting objects returned`,\n requestId,\n objects,\n ...guest.getInfo(),\n });\n return true;\n };\n\n // Handles object get requests from the remote automation framework\n #handleObjectGet = ({\n sourceWin,\n sourceOrigin,\n requestId,\n body,\n }: ListenerCallbackParams<{\n objectId: Extract<keyof AppObjects, string>;\n }>) => {\n const { objectId } = body;\n this.#logger.debug(\n `Processing getObject request for object ${objectId}. requestId = ${requestId}`,\n );\n\n // Get the guest from which the request came\n const guest = this.#getGuestForWindow(sourceWin);\n if (!guest) {\n this.#logger.warn('Rejected object request from unknown guest window');\n return false;\n }\n\n // Get the object from the guest's host\n const obj = this.getScriptingObject(objectId, { guest });\n if (!obj) {\n this.#logger.warn(\n `unknown or unauthorized object ${objectId} from guest ${guest.id}`,\n );\n this.#remoting.raiseException({\n targetWin: sourceWin,\n targetOrigin: sourceOrigin,\n requestId,\n ex: `The requested object (${objectId}) is not available`,\n });\n return false;\n }\n\n this.#remoting.respond({\n targetWin: sourceWin,\n targetOrigin: sourceOrigin,\n requestId,\n response: this.#encodeResponse(obj, guest),\n });\n\n this.#logger.audit({\n message: `Scripting Object returned`,\n requestId,\n scriptingObject: objectId,\n ...guest.getInfo(),\n });\n return true;\n };\n\n /**\n * Handles a guest event subscription request.\n *\n * This method processes a request from a guest window to subscribe to a specific event.\n * It verifies the guest window, logs the request, and invokes the subscription callback asynchronously.\n * If the guest window is unknown, the request is rejected and a warning is logged.\n * @param params - The parameters for the event subscription request.\n * @param params.sourceWin - The window object from which the request originated.\n * @param params.requestId - The unique identifier for the request.\n * @param params.body - The body of the request containing event subscription details.\n * @param params.body.eventId - The identifier of the event to subscribe to.\n * @param params.body.criteria - Optional filter criteria for the event subscription.\n * @param params.body.token - The authentication token for the request.\n * @returns Returns `false` if the guest window is unknown; otherwise, no explicit return value.\n */\n #handleGuestEventSubscribe = ({\n sourceWin,\n requestId,\n body,\n }: ListenerCallbackParams<{\n eventId: string;\n criteria?: FilterCriteria;\n token: string;\n }>) => {\n const { eventId, criteria, token } = body;\n this.#logger.debug(\n `Processing guest event subscribe request for event ${eventId}. requestId = ${requestId}`,\n );\n // Get the guest from which the request came\n const guest = this.#getGuestForWindow(sourceWin);\n if (!guest) {\n this.#logger.warn(\n 'Rejected event subscribe request from unknown guest window',\n );\n return;\n }\n // invoke the callback\n setTimeout(() => {\n try {\n this.#onGuestEventSubscribe?.({\n guestId: guest.id,\n eventId,\n criteria,\n token,\n });\n } catch (error) {\n this.#logger.warn(\n `Error in onGuestEventSubscribe callback for event ${eventId}: ${\n (error as Error).message\n }`,\n );\n }\n }, 0);\n };\n\n /**\n * Handles a guest event unsubscribe request.\n *\n * This method processes an unsubscribe request from a guest window for a specific event.\n * It verifies the source window, retrieves the corresponding guest, and invokes the\n * `#onGuestEventUnsubscribe` callback asynchronously. If the source window is not recognized,\n * the request is rejected and a warning is logged.\n * @param params - The parameters for the unsubscribe request, including:\n * - `sourceWin`: The window from which the request originated.\n * - `requestId`: The unique identifier for the request.\n * - `body`: An object containing the `eventId` and `token` for the event to unsubscribe.\n * @param params.sourceWin\n * @param params.requestId\n * @param params.body\n * @returns `false` if the guest window is unknown; otherwise, no explicit return value.\n */\n #handleGuestEventUnsubscribe = ({\n sourceWin,\n requestId,\n body,\n }: ListenerCallbackParams<{ eventId: string; token: string }>) => {\n const { eventId, token } = body;\n this.#logger.debug(\n `Processing guest event unsubscribe request for event ${eventId}. requestId = ${requestId}`,\n );\n // Get the guest from which the request came\n const guest = this.#getGuestForWindow(sourceWin);\n if (!guest) {\n this.#logger.warn(\n 'Rejected event unsubscribe request from unknown guest window',\n );\n return;\n }\n // invoke the callback\n setTimeout(() => {\n try {\n this.#onGuestEventUnsubscribe?.({\n guestId: guest.id,\n eventId,\n token,\n });\n } catch (error) {\n this.#logger.warn(\n `Error in onGuestEventUnsubscribe callback for event ${eventId}: ${\n (error as Error).message\n }`,\n );\n }\n }, 0);\n };\n\n // handles guest resize event\n #handleGuestResize = ({\n sourceWin,\n requestId,\n body,\n }: ListenerCallbackParams<GuestWindowSize>) => {\n const guest = this.#getGuestForWindow(sourceWin);\n if (!guest) {\n this.#logger.warn(\n `Received resize event from unknown guest. requestid = ${requestId}`,\n );\n return;\n }\n if (guest.domElement) {\n guest.domElement.style.height = `${body.height}px`;\n }\n this.#logger.debug(\n `Guest ${guest.id} resized to ${body.width}x${body.height}`,\n );\n };\n\n // Handles object invoke requests from the remote automation framework\n #handleObjectInvoke = ({\n sourceWin,\n sourceOrigin,\n requestId,\n body,\n }: ListenerCallbackParams<{\n objectId: Extract<keyof AppObjects, string>;\n functionName: keyof IScriptingObject;\n functionParams: unknown[];\n }>) => {\n const { objectId } = body;\n\n // Get the guest from which the request came\n const guest = this.#getGuestForWindow(sourceWin);\n if (!guest) {\n this.#logger.warn(\n 'Rejected method invocation request from unknown guest window',\n );\n // this.#remoting.raiseException({\n // targetWin: sourceWin,\n // targetOrigin: sourceOrigin,\n // requestId,\n // ex: 'Specified window is not a known guest',\n // });\n return false;\n }\n\n this.#logger.debug(\n `Function ${objectId}.${String(body.functionName)}() called from guest \"${\n guest.id\n }\" (requestId = ${requestId})`,\n );\n\n // Get the object from the guest's host\n const obj = this.getScriptingObject(objectId, { guest });\n if (!obj) {\n this.#logger.warn(\n `Invocation of unknown or unauthorized object ${objectId} from guest ${guest.id}`,\n );\n this.#remoting.raiseException({\n targetWin: sourceWin,\n targetOrigin: sourceOrigin,\n requestId,\n ex: `The requested object (${objectId}) is not available`,\n });\n return false;\n }\n\n const guestInfo = guest.getInfo();\n this.#startTiming(`ScriptingObject.API.${objectId}.${body.functionName}`, {\n appId: guestInfo.guestId,\n appUrl: guestInfo.guestUrl,\n });\n // Invoke the function, which will always return a Promise\n this.#invoke({\n guest,\n obj,\n functionName: body.functionName,\n functionParams: body.functionParams,\n })\n .then((val) => {\n this.#remoting.respond({\n targetWin: sourceWin,\n targetOrigin: sourceOrigin,\n requestId,\n response: this.#encodeResponse(val, guest),\n });\n this.#logger.audit({\n message: `Value returned for Scripting Object method call`,\n requestId,\n scriptingObject: objectId,\n scriptingMethod: body.functionName,\n ...guestInfo,\n });\n })\n .catch((ex) => {\n this.#remoting.raiseException({\n targetWin: sourceWin,\n targetOrigin: guest.origin,\n requestId,\n ex: ex as Error,\n });\n this.#logger.audit({\n message: `Exception thrown for Scripting Object method call`,\n requestId,\n scriptingObject: objectId,\n scriptingMethod: body.functionName,\n ...guestInfo,\n });\n })\n .finally(() => {\n this.#endTiming(\n `ScriptingObject.API.${objectId}.${body.functionName}`,\n {\n appId: guestInfo.guestId,\n appUrl: guestInfo.guestUrl,\n },\n );\n });\n return true;\n };\n\n /**\n * subscribe to guest resize event\n */\n #subscribeToGuestResizeEvent = () => {\n this.#remoting.listen({\n messageType: MessageType.GuestResize,\n callback: this.#handleGuestResize,\n });\n };\n\n /**\n * start listening to the remoting messages\n */\n #connect = () => {\n this.#remoting.listen({\n messageType: MessageType.GuestReady,\n callback: this.#handleGuestReady,\n });\n this.#remoting.listen({\n messageType: MessageType.GuestReadyComplete,\n callback: this.#handleGuestReadyComplete,\n });\n this.#remoting.listen({\n messageType: MessageType.GuestClose,\n // eslint-disable-next-line @typescript-eslint/no-misused-promises\n callback: this.#handleGuestClose,\n });\n this.#remoting.listen({\n messageType: MessageType.ListObjects,\n callback: this.#handleListObjects,\n });\n this.#remoting.listen({\n messageType: MessageType.ObjectGet,\n callback: this.#handleObjectGet,\n });\n this.#remoting.listen({\n messageType: MessageType.ObjectInvoke,\n callback: this.#handleObjectInvoke,\n });\n this.#remoting.listen({\n messageType: MessageType.GuestEventSubscribe,\n callback: this.#handleGuestEventSubscribe,\n });\n this.#remoting.listen({\n messageType: MessageType.GuestEventUnsubscribe,\n callback: this.#handleGuestEventUnsubscribe,\n });\n };\n\n /**\n * check if the value is a proxy event\n * @param value\n * @returns\n */\n #isProxyEvent = (\n value: any,\n ): value is IScriptingObjectProxyEvent<AppEvents> =>\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n value instanceof ProxyEvent ||\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n typeof value?.subscribe === 'function'; // support v1 scripting objects\n\n /**\n * Register pre-rendered guest application to host\n * @param {AttachParam} param - parameters for attaching the guest\n * @returns reference to the guest object\n */\n #attachGuest = (param: AttachParam): Guest => {\n const guest = new Guest({\n ...param,\n remoting: this.#remoting,\n analyticsObj: this.#analyticsObj,\n });\n // Register the guest with host\n guest.init();\n // Add the guest to all lookup maps\n this.#guests.set(param.guestId, guest);\n this.#guestsByWindow.set(guest.window, guest);\n this.#guestsByUrl.set(guest.url, guest);\n return guest;\n };\n\n /**\n * find the guest object by its id, window or dom element\n * @param guestIdOrWindowOrEle id, window or dom element of the guest\n * @returns guest object\n */\n #findGuest = (guestIdOrWindowOrEle: string | Window | HTMLIFrameElement) => {\n if (typeof guestIdOrWindowOrEle === 'string') {\n return this.#guests.get(guestIdOrWindowOrEle);\n }\n // O(1) lookup by window reference\n const byWindow = this.#guestsByWindow.get(guestIdOrWindowOrEle as Window);\n if (byWindow) return byWindow;\n // fallback: scan for domElement match\n return Array.from(this.#guests.values()).find(\n (value) => value.domElement === guestIdOrWindowOrEle,\n );\n };\n\n #monitorPopupGuests = () => {\n // already monitoring\n if (this.#popupGuestMonitor) return;\n this.#popupGuestMonitor = setInterval(() => {\n const guestsToRemove: Guest[] = [];\n this.#guests.forEach((guest) => {\n if (guest.openMode === OpenMode.Popup && guest.window.closed) {\n guestsToRemove.push(guest);\n }\n });\n guestsToRemove.forEach((guest) => {\n const { id } = guest;\n this.unloadGuest(id);\n const callbacks = this.#guestCloseCallbackList.get(id);\n callbacks?.forEach((callback) => {\n // eslint-disable-next-line max-nested-callbacks\n Promise.resolve(callback({ id })).catch(() => {});\n });\n });\n }, 1000);\n };\n\n #stopMonitoringPopupGuests = () => {\n if (!this.#popupGuestMonitor) return;\n const hasPopups = Array.from(this.#guests.values()).some(\n (guest) => guest.openMode === OpenMode.Popup,\n );\n if (!hasPopups) {\n clearInterval(this.#popupGuestMonitor);\n this.#popupGuestMonitor = null;\n }\n };\n\n #openPopupGuest = <\n SearchParams extends Record<string, string | number | boolean>,\n >(param: {\n guestId: string;\n url: string;\n title: string;\n searchParams: SearchParams;\n popupWindowFeatures?: WindowFeatures;\n onLoad?: (guestId: string) => void;\n onError?: (guestId: string) => void;\n }) => {\n const {\n url,\n title,\n popupWindowFeatures = {},\n searchParams,\n guestId,\n onLoad,\n onError,\n } = param;\n const {\n width = 800,\n height = 600,\n top = 100,\n left = 100,\n } = popupWindowFeatures;\n let guest = this.#getGuestForUrl(url);\n if (guest) {\n // bring guest popup window to front\n if (!guest.window.closed) {\n guest.send({\n messageType: MessageType.GuestFocus,\n messageBody: {},\n });\n }\n } else {\n // construct window features as comma separated string\n const windowFeatures = Object.entries({ width, height, top, left })\n .filter(([, v]) => v)\n .map(([k, v]) => `${k}=${v}`)\n .join(',');\n // open new guest popup window\n const guestWindow = window.open(url, title, `popup, ${windowFeatures}`);\n if (!guestWindow) {\n // notify load failure to the caller\n setTimeout(() => {\n try {\n onError?.(guestId);\n } catch (error) {\n this.#logger.debug(\n `Error occurred in onError for guest with id '${guestId}': ${\n (error as Error).message\n }`,\n );\n }\n }, 0);\n throw new Error('Failed to open guest application in popup window');\n } else {\n // notify load complete to the caller\n setTimeout(() => {\n try {\n onLoad?.(guestId);\n } catch (error) {\n this.#logger.debug(\n `Error occurred in onLoad for guest with id '${guestId}': ${\n (error as Error).message\n }`,\n );\n }\n }, 0);\n }\n // nullify opener before attaching to prevent guest access to host window\n guestWindow.opener = null;\n guest = this.#attachGuest({\n guestId,\n window: guestWindow,\n title,\n url,\n searchParams,\n openMode: OpenMode.Popup,\n });\n // start polling for popup close only when popups exist\n this.#monitorPopupGuests();\n }\n return guest;\n };\n\n #openEmbedGuest = <\n SearchParams extends Record<string, string | number | boolean>,\n >(param: {\n guestId: string;\n url: string;\n title: string;\n searchParams: SearchParams;\n targetElement: HTMLElement;\n onLoad?: (guestId: string) => void;\n onError?: (guestId: string) => void;\n options?: GuestOptions;\n }) => {\n const {\n url,\n title,\n targetElement,\n searchParams,\n guestId,\n onLoad,\n onError,\n options = {} as GuestOptions,\n } = param;\n // create the iframe\n const targetElementDocument = targetElement.ownerDocument ?? document;\n const {\n fitToContent = false,\n disableSandbox = false,\n sandboxValues = [],\n customSandboxValues = [],\n style = '',\n permissionPolicy = '',\n } = options;\n if (!title) throw new Error('title is required');\n if (fitToContent) this.#subscribeToGuestResizeEvent();\n // create guest frame\n const frame = targetElementDocument.createElement('iframe');\n frame.setAttribute('id', guestId);\n // handle frame load and error events\n const onFrameLoad = () => {\n // notify load complete to the caller\n setTimeout(() => {\n try {\n onLoad?.(guestId);\n } catch (error) {\n this.#logger.debug(\n `Error occurred in onLoad for guest with id '${guestId}': ${\n (error as Error).message\n }`,\n );\n }\n }, 0);\n this.#logger.debug(`frame loaded for guest with id '${guestId}'`);\n frame.removeEventListener('load', onFrameLoad);\n };\n const onFrameLoadFailure = () => {\n // notify load failure to the caller\n setTimeout(() => {\n try {\n onError?.(guestId);\n } catch (error) {\n this.#logger.debug(\n `Error occurred in onError for guest with id '${guestId}': ${\n (error as Error).message\n }`,\n );\n }\n }, 0);\n this.#logger.error(`frame load failed for guest with id '${guestId}'`);\n frame.removeEventListener('error', onFrameLoadFailure);\n };\n frame.addEventListener('load', onFrameLoad);\n frame.addEventListener('error', onFrameLoadFailure);\n frame.setAttribute(\n 'style',\n `min-width: 100%; height: 100%; border: 0px; ${style}`,\n );\n if (!disableSandbox) {\n frame.setAttribute(\n 'sandbox',\n customSandboxValues.length > 0\n ? customSandboxValues.join(' ')\n : [...SANDBOX_DEFAULT, ...sandboxValues].join(' '),\n );\n }\n frame.setAttribute('title', title);\n frame.setAttribute('src', url);\n if (permissionPolicy) frame.setAttribute('allow', permissionPolicy);\n targetElement.appendChild(frame);\n // Find the window object and create the guest\n const guestFrameEle = targetElementDocument.getElementById(\n guestId,\n ) as HTMLIFrameElement;\n return this.#attachGuest({\n guestId,\n domElement: guestFrameEle,\n window: guestFrameEle.contentWindow as Window,\n title,\n url,\n searchParams,\n openMode: OpenMode.Embed,\n });\n };\n\n #getGuestUrl = <Params extends Record<string, string | number | boolean>>(\n url: string,\n params: Params,\n ) => {\n let querystring = '';\n Object.keys(params).forEach((queryParam) => {\n querystring += `${\n (querystring.length ? '&' : '') + encodeURIComponent(queryParam)\n }=${encodeURIComponent(params[queryParam])}`;\n });\n\n return (\n url +\n (!querystring ? '' : (url.indexOf('?') >= 0 ? '&' : '?') + querystring)\n );\n };\n\n /**\n * registers scripting object to the host\n * @param {ValueOf<AppObjects>} so scripting object to be registered\n * @param {AddScriptingObjectParams} params params to add scripting object\n */\n addScriptingObject = <SO extends ValueOf<AppObjects>>(\n so: SO,\n params?: AddScriptingObjectParams,\n ) => {\n // if scripting object is proxy then clone it\n if (isScriptingObjectProxy(so)) {\n const clonedSo = this.cloneScriptingObject(so);\n this.#soManager.addScriptingObject(clonedSo, params);\n } else {\n // if scripting object is not a proxy object, add it directly\n this.#soManager.addScriptingObject(so, params);\n }\n };\n\n /**\n * Clone parent host's scripting object for exposing to grand children\n * @param proxy - reference to the scripting object obtained through getObject method\n * @param guest - reference to the ssf guest\n * @returns cloned version of the scripting object\n */\n cloneScriptingObject = <ObjectId extends Extract<keyof AppObjects, string>>(\n proxy: IScriptingObjectProxy,\n ): AppObjects[ObjectId] => {\n if (!proxy) throw new Error('proxy is required');\n // Create a new, base ScriptingObject with V2 properties\n const so = new ScriptingObject(proxy.id, proxy.objectType);\n type UnsubscribeFn = () => void;\n // Store the tokens for unsubscription\n let unsubscribers: Array<UnsubscribeFn> = [];\n\n // Copy the functions and events over\n // let propName: keyof typeof proxy;\n Object.keys(proxy).forEach((propName) => {\n const propValue = proxy[propName as keyof IScriptingObjectProxy];\n if (this.#isProxyEvent(propValue)) {\n // v1 or v2 object event\n const event = new Event<AppEvents>({\n name: propValue.name || propName,\n objectId: so.id,\n });\n // Create the event on the object\n Object.defineProperty(so, propName, {\n value: event,\n enumerable: true,\n });\n\n // Subscribe to the event and pass the callback down\n if ((propValue as any) instanceof ProxyEvent) {\n // proxy was obtained from v2 guest\n const listener = ({\n eventParams,\n eventOptions,\n }: {\n eventParams: any;\n eventOptions?: any;\n }) =>\n this.dispatchEvent({\n event,\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n eventParams,\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n eventOptions,\n });\n\n const token = (propValue as unknown as ProxyEvent).subscribe(\n listener,\n );\n unsubscribers.push(() => {\n (propValue as unknown as ProxyEvent).unsubscribe(token);\n });\n } else {\n // proxy was obtained from v1 guest\n // eslint-disable-next-line @typescript-eslint/no-unsafe-call, @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-assignment\n const token = (propValue as any).subscribe?.(\n (obj: ScriptingObject, params: any, options: any) =>\n this.dispatchEvent({\n event,\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n eventParams: params,\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n eventOptions: options,\n }),\n );\n unsubscribers.push(() => {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-call, @typescript-eslint/no-unsafe-member-access\n (propValue as any).unsubscribe?.(token);\n });\n }\n } else if (isFunction(propValue)) {\n // Create a function that proxies the call to the proxy\n Object.defineProperty(so, propName, {\n value: async (...args: unknown[]) => {\n const retVal = await propValue(...args);\n return isScriptingObjectProxy(retVal)\n ? this.cloneScriptingObject(retVal)\n : retVal;\n },\n enumerable: true,\n });\n\n // Override the dispose function\n if (propName === 'dispose') {\n // eslint-disable-next-line @typescript-eslint/unbound-method\n const defaultImpl = so.dispose;\n Object.defineProperty(so, propName, {\n value: () => {\n // Dispose of the object in the proxy tier\n // eslint-disable-next-line no-underscore-dangle\n so._dispose();\n return defaultImpl.apply(so);\n },\n enumerable: true,\n });\n }\n }\n });\n\n // Override the dispose function// Add a destroy method to clean up the proxy by unsubscribing to the\n // proxied object's events and unpublishing the object\n // eslint-disable-next-line no-underscore-dangle\n so._dispose = () => {\n unsubscribers.forEach((unsub) => {\n unsub?.();\n });\n unsubscribers = [];\n };\n\n return so as unknown as AppObjects[ObjectId];\n };\n\n /**\n * dispose the resources used by the host application\n */\n close = () => {\n if (this.#popupGuestMonitor) {\n clearInterval(this.#popupGuestMonitor);\n this.#popupGuestMonitor = null;\n }\n this.#closeAllPopupGuests();\n this.#remoting.close();\n window.removeEventListener('beforeunload', this.#closeAllPopupGuests);\n this.#logger.debug(\n `host is closed. hostId: ${this.hostId}, correlationId: ${\n this.#correlationId\n }`,\n );\n };\n\n /**\n * dispatch event to guest application(s)\n * @param {EventDetail} params details of the event to be dispatched\n * @returns promise that resolves to an array with result from each guest application\n */\n dispatchEvent = async <\n EventId extends Extract<keyof AppEvents, string>,\n Params extends Parameters<AppEvents[EventId]>[0]['eventParams'],\n Options extends EventOptions,\n >(\n params: DispatchEventParam<EventId, Params, Options>,\n ) => {\n const {\n event: { id, name },\n eventParams,\n eventOptions = {} as Options,\n } = params;\n const {\n eventHandler = null,\n timeout = null,\n window: targetWindow = null,\n guestId,\n } = eventOptions;\n // Get the scripting object\n const objectId = id.split('.')[0] as Extract<keyof AppObjects, string>;\n // get the guest object to which the event should be dispatched to\n const guestIdorWnd = guestId || targetWindow;\n const targetGuest = guestIdorWnd ? this.#findGuest(guestIdorWnd) : null;\n // get scripting object\n const scriptingObject = targetGuest\n ? this.getScriptingObject(objectId, { guest: targetGuest })\n : this.getScriptingObject(objectId);\n if (!scriptingObject) {\n this.#logger.warn(\n `Attempt to dispatch event ${name} on unknown object ${objectId}`,\n );\n return Promise.resolve([]);\n }\n\n const eventObj: EventObject = {\n // eslint-disable-next-line no-underscore-dangle\n object: scriptingObject._toJSON(),\n eventName: name,\n eventParams,\n eventHandler,\n eventOptions: {\n allowsFeedback: false,\n },\n };\n\n if (timeout && !Number.isNaN(timeout)) {\n eventObj.eventOptions = {\n allowsFeedback: true,\n timeout: Number(timeout),\n };\n }\n\n // Invoke the event handler in target or all guests\n const guestPromises: Array<Promise<unknown>> = [];\n let timingMetricStarted = false;\n\n const dispatchToGuest = (guest: Guest) => {\n const guestInfo = guest.getInfo();\n if (timeout && guest?.capabilities?.eventFeedback) {\n guestPromises.push(guest.dispatchEvent(eventObj, timeout));\n if (!timingMetricStarted) {\n this.#startTiming(\n `ScriptingObject.Event.${scriptingObject.id}.${name}`,\n {\n appId: this.hostId,\n appUrl: window.location.href,\n },\n );\n timingMetricStarted = true;\n }\n this.#logger.audit({\n message: 'Event dispatched and awaiting feedback',\n scriptingEventId: id,\n ...guestInfo,\n });\n } else {\n guest.send({\n messageType: MessageType.ObjectEvent,\n messageBody: eventObj,\n });\n this.#logger.audit({\n message: 'Event dispatched',\n scriptingEventId: id,\n ...guestInfo,\n });\n }\n };\n\n if (targetGuest) {\n // targeted dispatch — skip iterating all guests\n dispatchToGuest(targetGuest);\n } else {\n this.#guests.forEach(dispatchToGuest);\n }\n\n // Return a promise that aggregates all of the guest promises\n const retValue = await Promise.all(guestPromises)\n .then((values) => {\n this.#logger.audit({\n message: 'Event feedback received',\n scriptingEventId: id,\n });\n // eslint-disable-next-line @typescript-eslint/no-unsafe-return\n return flatten(values);\n })\n .catch((ex: Error) => {\n this.#logger.error({\n message: 'Error processing event',\n eventId: id,\n exception: ex,\n });\n throw ex;\n })\n .finally(() => {\n if (timingMetricStarted)\n this.#endTiming(\n `ScriptingObject.Event.${scriptingObject.id}.${name}`,\n {\n appId: this.hostId,\n appUrl: window.location.href,\n },\n );\n });\n // eslint-disable-next-line @typescript-eslint/no-unsafe-return\n return retValue;\n };\n\n /**\n * get reference to all guest applications\n * @returns list of guest application references\n */\n getGuests = (): Array<Guest> => Array.from(this.#guests.values());\n\n /**\n * get the scripting object by id\n * @param objectId - id of the scripting object\n * @param params\n * @returns scripting object\n */\n getScriptingObject = <Id extends Extract<keyof AppObjects, string>>(\n objectId: Id,\n params?: GetObjectParams,\n ): AppObjects[Id] | null =>\n this.#soManager.getObject(objectId, params?.guest);\n\n /**\n * loads guest application inside sandboxed iframe\n * @param {LoadGuestParam} param - parameters for loading the guest application\n * @returns reference to the guest object\n */\n loadGuest = <SearchParams extends Record<string, string | number | boolean>>(\n param: LoadGuestParam<SearchParams>,\n ): Guest => {\n const {\n id: guestId,\n url,\n targetElement,\n title,\n searchParams = {} as SearchParams,\n onLoad,\n onError,\n options = {} as GuestOptions,\n } = param;\n if (!guestId) throw new Error('id for guest application is required');\n // Generate a unique instance ID when multiple instances of the same app are loaded\n let instanceId = guestId;\n if (this.#guests.has(instanceId)) {\n let counter = 1;\n while (this.#guests.has(`${guestId}-${counter}`)) {\n counter += 1;\n }\n instanceId = `${guestId}-${counter}`;\n }\n const { openMode = OpenMode.Embed, popupWindowFeatures = {} } = options;\n\n const srcUrl = this.#getGuestUrl(url, searchParams);\n let guest: Guest | null = null;\n\n this.#startTiming('SSF.Guest.Load', {\n appId: instanceId,\n appUrl: srcUrl,\n });\n if (openMode === OpenMode.Popup) {\n guest = this.#openPopupGuest({\n guestId: instanceId,\n url: srcUrl,\n title,\n searchParams,\n popupWindowFeatures,\n onLoad,\n onError,\n });\n } else if (openMode === OpenMode.Embed) {\n guest = this.#openEmbedGuest({\n guestId: instanceId,\n url: srcUrl,\n title,\n targetElement,\n searchParams,\n onLoad,\n onError,\n options,\n });\n } else {\n throw new Error(`Invalid openMode: ${openMode as string}`);\n }\n\n this.#logger.audit({\n message: 'Guest loaded',\n ...guest.getInfo(),\n });\n return guest;\n };\n\n /**\n * loads guest application inside sandboxed iframe with different params\n * @param {LoadGuestsParam} param - parameters for loading the guest application\n */\n loadGuests = <SearchParams extends Record<string, string | number | boolean>>(\n param: LoadGuestsParam<SearchParams>,\n ) => {\n const {\n id,\n url,\n targetElement,\n title,\n searchParamsList = [] as SearchParams[],\n options = {} as GuestOptions,\n } = param;\n // Render the plugins into sandboxed iframe elements\n searchParamsList.forEach((searchParams, index) => {\n this.loadGuest({\n id: `${id}-${index}`,\n url,\n title,\n targetElement,\n searchParams,\n options,\n });\n }, this);\n };\n\n /**\n * removes all scripting objects from host\n * @param guestId unique id of the guest application\n */\n removeAllScriptingObjects = (guestId?: string) => {\n this.#soManager.removeAllScriptingObjects(guestId);\n };\n\n /**\n * removes scripting object from the host\n * @param objectId unique id of the scripting object\n * @param guestId unique id of the guest application\n */\n removeScriptingObject = (\n objectId: Extract<keyof AppObjects, string>,\n guestId?: string,\n ) => {\n this.#soManager.removeScriptingObject(objectId, guestId);\n };\n\n /**\n * set the log level for the host application\n * @param level - log level\n */\n setLogLevel = (level: LogLevels) => {\n // Set the logging level at the host\n this.#logger.setLogLevel(level);\n // Notify all guests of the change\n this.#guests.forEach(this.#dispatchConfigEvent);\n this.#logger.debug('Dispatched config events to all guests');\n };\n\n /**\n * unloads guest application from host\n * @param guestIdOrWindowOrEle unique id of the guest application or window object or dom element of the guest application\n * @throws Error if guestId or Window reference is invalid\n */\n unloadGuest = (guestIdOrWindowOrEle: string | Window | HTMLIFrameElement) => {\n // Find the guest object\n const guest = this.#findGuest(guestIdOrWindowOrEle);\n if (guest) {\n // dispose the guest\n guest.dispose();\n // Remove from all lookup maps\n this.#guestsByWindow.delete(guest.window);\n this.#guestsByUrl.delete(guest.url);\n this.#guests.delete(guest.id);\n this.#logger.audit({\n message: `Guest is removed from host`,\n ...guest.getInfo(),\n });\n // stop polling if no popup guests remain\n this.#stopMonitoringPopupGuests();\n }\n };\n\n /**\n * monitors guest window close action and executes the callback from host.\n * @param callback host callback method\n * @param id unique id of the guest application\n * @param param\n */\n onGuestClose = (param: GuestCloseParam) => {\n const { id, guestCloseCallback } = param;\n const callbacks = this.#guestCloseCallbackList.get(id) || [];\n callbacks.push(guestCloseCallback);\n this.#guestCloseCallbackList.set(id, callbacks);\n };\n}\n"],"names":["root","factory","__webpack_require__","exports","definition","key","obj","prop","Event","param","name","objectId","ProxyEvent","#eventSrc","eventSrc","callback","token","isEvent","value","getEventId","eventName","FUNCTION","isPublicFunction","fnName","ScriptingObject","#id","#objectType","objectType","functions","events","property","MessageType","MessageType2","OpenMode","IFrameSandboxValues","getOrigin","url","origin","flatten","source","v","isFunction","Guest","#remoting","#analyticsObj","option","guestId","domElement","title","window","searchParams","openMode","remoting","analyticsObj","resolve","handShakeCount","handShakeRetries","handShakeHandle","onAck","event","timeout","getRandomValues","rnds8","rng","byteToHex","i","unsafeStringify","arr","offset","stringify","uuid","validate","v4","options","buf","rnds","MESSAGE_SOURCE","RESPONSE_MESSAGE_TYPE","EXCEPTION_MESSAGE_TYPE","createMessage","messageType","messageBody","requestId","onewayMsg","sendMessage","targetWin","targetOrigin","msg","Remoting","#correlationId","#logger","#listeners","#invocations","#timeoutMonitorHandle","#initializedWindow","#allowedSenders","logger","correlationId","#evaluateTimeouts","ts","canceledItems","nextCancelTime","eventData","cancelTime","delay","#scheduleTimeoutCheck","delayMs","#stopResponseMonitor","#popInvocation","e","#processResponse","message","#processException","#receive","sourceWin","sourceOrigin","callbacks","#processMessage","senderOrigin","window2","win","responseTimeoutMs","reject","items","index","response","ex","MODULE_OBJECT","SecurityContext","SecurityContext2","ScriptingObjectManager","#normalizeId","id","#scriptingObjects","#guestScriptingObjects","#addGuestScriptingObject","params","so","guestSOs","#disposeSO","#getGuestScriptingObject","mSOs","mSO","SOs","#removeGuestScriptingObject","sosInfo","moduleSOs","soInfo","guest","objects","ScriptingObjectProxy","isScriptingObjectProxy","SANDBOX_DEFAULT","SSFHost","#guests","#guestsByWindow","#guestsByUrl","#guestCloseCallbackList","#soManager","#readyStateCallback","#popupGuestMonitor","#onGuestEventSubscribe","#onGuestEventUnsubscribe","hostId","#connect","#closeAllPopupGuests","#sendBAEvent","data","baEvent","#startTiming","#endTiming","start","#getGuestForWindow","guestWindow","#getGuestForUrl","#isScriptingObject","#encodeResponse","val","#encodeException","#dispatchConfigEvent","#invoke","functionName","functionParams","func","#handleGuestReadyComplete","guestInfo","#handleGuestReady","body","#handleGuestClose","#findGuest","#handleListObjects","#handleObjectGet","#handleGuestEventSubscribe","eventId","criteria","error","#handleGuestEventUnsubscribe","#handleGuestResize","#handleObjectInvoke","#subscribeToGuestResizeEvent","#isProxyEvent","#attachGuest","guestIdOrWindowOrEle","byWindow","#monitorPopupGuests","guestsToRemove","#stopMonitoringPopupGuests","#openPopupGuest","popupWindowFeatures","onLoad","onError","width","height","top","left","windowFeatures","k","#openEmbedGuest","targetElement","targetElementDocument","fitToContent","disableSandbox","sandboxValues","customSandboxValues","style","permissionPolicy","frame","onFrameLoad","onFrameLoadFailure","guestFrameEle","#getGuestUrl","querystring","queryParam","clonedSo","proxy","unsubscribers","propName","propValue","listener","eventParams","eventOptions","args","retVal","defaultImpl","unsub","eventHandler","targetWindow","guestIdorWnd","targetGuest","scriptingObject","eventObj","guestPromises","timingMetricStarted","dispatchToGuest","values","instanceId","counter","srcUrl","searchParamsList","level","guestCloseCallback"],"sourceRoot":""}
1
+ {"version":3,"file":"js/emuiSsfHost.5855ec3cd0fa60013d84.js","mappings":"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","sources":["webpack://ice.host/webpack/universalModuleDefinition","webpack://ice.host/webpack/bootstrap","webpack://ice.host/webpack/runtime/define property getters","webpack://ice.host/webpack/runtime/hasOwnProperty shorthand","webpack://ice.host/webpack/runtime/make namespace object","webpack://ice.host/../common/dist/esm/event.js","webpack://ice.host/../common/dist/esm/scriptingObject.js","webpack://ice.host/../common/dist/esm/messageType.js","webpack://ice.host/./lib/types.ts","webpack://ice.host/./lib/utils.ts","webpack://ice.host/./lib/guest.ts","webpack://ice.host/../../node_modules/.pnpm/uuid@9.0.1/node_modules/uuid/dist/esm-browser/native.js","webpack://ice.host/../../node_modules/.pnpm/uuid@9.0.1/node_modules/uuid/dist/esm-browser/rng.js","webpack://ice.host/../../node_modules/.pnpm/uuid@9.0.1/node_modules/uuid/dist/esm-browser/stringify.js","webpack://ice.host/../../node_modules/.pnpm/uuid@9.0.1/node_modules/uuid/dist/esm-browser/v4.js","webpack://ice.host/../common/dist/esm/remoting.js","webpack://ice.host/../common/dist/esm/scriptingObjectManager.js","webpack://ice.host/../common/dist/esm/proxy.js","webpack://ice.host/./lib/host.ts"],"sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"ice\"] = factory();\n\telse\n\t\troot[\"ice\"] = root[\"ice\"] || {}, root[\"ice\"][\"host\"] = factory();\n})(globalThis, () => {\nreturn ","// The require scope\nvar __webpack_require__ = {};\n\n","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","class Event {\n /* eslint-enable indent */\n /**\n * name of the event\n */\n name;\n /**\n * scripting object id that owns this event\n */\n objectId;\n /**\n * unique id of the event\n */\n id;\n /**\n * Create an event object\n * @param {EventParam} param - parameters for creating an event\n */\n constructor(param) {\n const { name, objectId } = param;\n if (!name) throw new Error(\"Event name is required\");\n if (!objectId) throw new Error(\"Scripting object id is required\");\n this.objectId = objectId;\n this.name = name;\n this.id = `${this.objectId}.${this.name}`.toLowerCase();\n }\n}\nclass ProxyEvent {\n /**\n * check if given object is an instance of ProxyEvent\n * @param obj object to be compared\n * @returns true if given object is an instance of ProxyEvent\n */\n static [Symbol.hasInstance](obj) {\n return typeof obj === \"object\" && obj !== null && \"getType\" in obj && typeof obj.getType === \"function\" && obj.getType() === \"ProxyEvent\";\n }\n /* eslint-enable indent */\n /**\n * module that owns this event management. SSF Guest or App Bridge host\n */\n #eventSrc;\n /**\n * unique id of scripting object\n */\n objectId;\n /**\n * name of the event\n */\n name;\n /**\n * unique id of the event\n */\n id;\n /**\n * get type of the object\n * @returns type of the object\n */\n getType() {\n return \"ProxyEvent\";\n }\n /**\n * Create a new instance of the Scripting Object Proxy Event\n * @param {ProxyEventParam} param - parameter for the constructor\n */\n constructor(param) {\n const { name, objectId, eventSrc } = param;\n if (!name) throw new Error(\"Event name is required\");\n if (!objectId) throw new Error(\"Scripting object id is required\");\n if (!eventSrc) throw new Error(\"Event source is required\");\n this.objectId = objectId;\n this.name = name;\n this.#eventSrc = eventSrc;\n this.id = `${this.objectId}.${this.name}`.toLowerCase();\n }\n /**\n * subscribe to an scripting object event\n * @param callback event listener\n * @returns subscription token\n */\n subscribe = (callback) => this.#eventSrc.subscribe({\n eventId: this.id,\n callback\n });\n /**\n * unsubscribe from an scripting object event\n * @param token subscription token\n */\n unsubscribe = (token) => {\n this.#eventSrc.unsubscribe({\n eventId: this.id,\n token\n });\n };\n}\nconst isEvent = (value) => value instanceof Event;\nconst getEventId = (objectId, eventName) => `${objectId.toLowerCase()}.${eventName.toLowerCase()}`;\nexport {\n Event,\n ProxyEvent,\n getEventId,\n isEvent\n};\n","import { isEvent } from \"./event.js\";\nconst FUNCTION = \"function\";\nconst isPublicFunction = (value, fnName) => typeof value === FUNCTION && !!fnName && !fnName.startsWith(\"_\");\nclass ScriptingObject {\n /**\n * unique id of the scripting object\n */\n #id;\n /**\n * type of the scripting object\n */\n #objectType = \"Object\";\n /**\n * Creates an instance of ScriptingObject.\n * @param objectId unique id of the scripting object\n * @param objectType type of the scripting object\n */\n constructor(objectId, objectType) {\n this.#id = objectId;\n this.#objectType = objectType || this.#objectType;\n }\n /**\n * get unique id of the scripting object\n */\n get id() {\n return this.#id;\n }\n /**\n * get type of the scripting object\n */\n get objectType() {\n return this.#objectType;\n }\n /**\n * transform the scripting object to a format suitable for transmitting over window.postMessage\n * @returns marshalled scripting object\n */\n // eslint-disable-next-line no-underscore-dangle\n _toJSON = () => {\n const functions = [];\n const events = [];\n Object.keys(this).forEach((property) => {\n const value = this[property];\n if (isEvent(value)) {\n events.push(property);\n } else if (isPublicFunction(value, property)) {\n functions.push(property);\n }\n });\n return {\n objectId: this.#id,\n objectType: this.#objectType,\n functions,\n events\n };\n };\n /**\n * dispose the scripting object\n */\n // eslint-disable-next-line no-underscore-dangle\n _dispose = () => {\n };\n /**\n * dispose the scripting object\n */\n dispose = () => {\n };\n}\nexport {\n ScriptingObject,\n isPublicFunction\n};\n","var MessageType = /* @__PURE__ */ ((MessageType2) => {\n MessageType2[\"GuestClose\"] = \"guest:close\";\n MessageType2[\"GuestEventSubscribe\"] = \"guest:eventSubscribe\";\n MessageType2[\"GuestEventUnsubscribe\"] = \"guest:eventUnsubscribe\";\n MessageType2[\"GuestFocus\"] = \"guest:focus\";\n MessageType2[\"GuestReady\"] = \"guest:ready\";\n MessageType2[\"GuestReadyComplete\"] = \"guest:readyComplete\";\n MessageType2[\"GuestResize\"] = \"guest:resize\";\n MessageType2[\"HandShake\"] = \"handshake\";\n MessageType2[\"HandShakeAck\"] = \"handshake:ack\";\n MessageType2[\"HostClose\"] = \"host:close\";\n MessageType2[\"HostConfig\"] = \"host:config\";\n MessageType2[\"ListObjects\"] = \"list:objects\";\n MessageType2[\"ObjectEvent\"] = \"object:event\";\n MessageType2[\"ObjectGet\"] = \"object:get\";\n MessageType2[\"ObjectInvoke\"] = \"object:invoke\";\n return MessageType2;\n})(MessageType || {});\nexport {\n MessageType\n};\n","import type {\n IScriptingObject,\n RemotingScriptingObject,\n} from '@elliemae/pui-scripting-object';\n\nexport enum OpenMode {\n /**\n * open as a popup window\n */\n Popup = 'popup',\n /**\n * open as an embedded iframe\n */\n Embed = 'embed',\n}\n\nexport type ValueOf<T> = T[keyof T];\n\n/**\n * allowed sandbox values for the guest application\n */\nexport enum IFrameSandboxValues {\n AllowDownloadsWithoutUserActivation = 'allow-downloads-without-user-activation',\n AllowDownloads = 'allow-downloads',\n AllowForms = 'allow-forms',\n AllowModals = 'allow-modals',\n AllowOrientationLock = 'allow-orientation-lock',\n AllowPointerLock = 'allow-pointer-lock',\n AllowPopups = 'allow-popups',\n AllowPopupsToEscapeSandbox = 'allow-popups-to-escape-sandbox',\n AllowPresentation = 'allow-presentation',\n AllowSameOrigin = 'allow-same-origin',\n AllowScripts = 'allow-scripts',\n AllowStorageAccessByUserActivation = 'allow-storage-access-by-user-activation',\n AllowTopNavigation = 'allow-top-navigation',\n AllowTopNavigationByUserActivation = 'allow-top-navigation-by-user-activation',\n}\n\nexport type GenericFunction = (...args: unknown[]) => unknown;\n\nexport type EventObject = {\n object: RemotingScriptingObject;\n eventName: string;\n eventParams: Record<string, unknown>;\n eventHandler: string | null;\n eventOptions: {\n allowsFeedback: boolean;\n timeout?: number;\n };\n};\n\n/**\n * features for the popup window\n */\nexport type WindowFeatures = {\n /**\n * width of the popup window\n */\n width?: number;\n /**\n * height of the popup window\n */\n height?: number;\n /**\n * top position of the popup window\n */\n top?: number;\n /**\n * left position of the popup window\n */\n left?: number;\n};\n\n/**\n * configuration options for rendering a guest application\n *\n */\nexport type GuestOptions = {\n /**\n * mode of opening the guest application, popup or embed\n * @default OpenMode.Embed\n */\n openMode?: OpenMode;\n /**\n * flag to disable sandboxing for iframe\n * @default false\n */\n disableSandbox?: boolean;\n /**\n * additional sandbox values for the iframe. These values will be added in addition to the default sandbox values.\n * @default [IFrameSandboxValues.AllowScripts, IFrameSandboxValues.AllowPopups, IFrameSandboxValues.AllowModals, IFrameSandboxValues.AllowForms, IFrameSandboxValues.AllowDownloads, IFrameSandboxValues.AllowSameOrigin ]\n */\n sandboxValues?: Array<IFrameSandboxValues>;\n /**\n * custom sandbox values for the iframe. These values will replace the default sandbox values entirely.\n */\n customSandboxValues?: Array<IFrameSandboxValues>;\n /**\n * resize the iframe to fit the content inside\n * @default true\n */\n fitToContent?: boolean;\n /**\n * css style for the iframe\n */\n style?: string;\n /**\n * features for the popup window\n * @default { width: 800, height: 600, top: 100, left: 100 }\n */\n popupWindowFeatures?: WindowFeatures;\n /**\n * permission policy for the guest iframe\n * check https://developer.mozilla.org/en-US/docs/Web/HTML/Reference/Elements/iframe#allow for more details\n * @example \"microphone 'self' https://example.com; geolocation 'none'\"\n */\n permissionPolicy?: string;\n};\n\n/**\n * collection of scripting objects\n */\nexport type ScriptingObjects = Record<string, IScriptingObject>;\n\n/**\n * parameters for attaching a guest\n */\nexport type AttachParam = {\n /**\n * unique id of the guest application\n */\n guestId: string;\n /**\n * url of the guest application\n */\n url: string;\n /**\n * page title for the guest application\n */\n title: string;\n /**\n * dom element to attach the guest application to\n */\n domElement?: HTMLIFrameElement;\n /**\n * window object of the guest application\n */\n window: Window;\n /**\n * open mode of the guest application\n */\n openMode: OpenMode;\n /**\n * additional parameters for the guest application\n */\n searchParams?: Record<string, string | number | boolean>;\n};\n","import { GenericFunction } from './types.js';\n\nexport const getOrigin = (url: string) => {\n if (url === 'about:blank') return '*';\n try {\n const { origin } = new URL(url);\n return origin === 'null' || !origin ? url : origin;\n } catch (e) {\n const { origin } = new URL(url, document.baseURI);\n return origin;\n }\n};\n\nexport const flatten = (source: unknown[]): unknown[] =>\n source.flat(Infinity).filter((v) => v !== undefined);\n\nexport function isFunction(value: any): value is GenericFunction {\n return typeof value === 'function';\n}\n","import { IAnalytics } from '@elliemae/pui-scripting-object';\nimport { Remoting, MessageType } from '@elliemae/microfe-common';\nimport { EventObject, OpenMode } from './types.js';\nimport { getOrigin } from './utils.js';\n\n/**\n * options for creating a guest application\n */\ntype GuestOption = {\n /**\n * unique id of the guest application\n */\n guestId: string;\n /**\n * page title of the guest application\n */\n title: string;\n /**\n * url of the guest application\n */\n url: string;\n /**\n * iframe element of the guest application\n */\n domElement?: HTMLIFrameElement;\n /**\n * window object of the guest application\n */\n window: Window;\n /**\n * open mode of the guest application\n */\n openMode: OpenMode;\n /**\n * individual query parameters of the guest application's url parameter string\n */\n searchParams?: Record<string, unknown>;\n /**\n * remoting object\n */\n remoting: Remoting;\n /**\n * analytics object\n */\n analyticsObj: IAnalytics;\n};\n\n/**\n * message to be sent\n */\nexport type MessageParam = {\n /**\n * type of the message\n */\n messageType: string;\n /**\n * body of the message\n */\n messageBody: unknown;\n};\n\n/**\n * Object repesenting guest application\n */\nexport class Guest {\n /**\n * unique id of the guest application\n */\n public readonly id: string;\n\n /**\n * page title of the guest application\n */\n public readonly title: string;\n\n /**\n * url of the guest application\n */\n public readonly url: string;\n\n /**\n * individual query parameters of the guest application's url parameter string\n */\n public readonly searchParams: Record<string, unknown>;\n\n /**\n * iframe element of the guest application\n */\n public readonly domElement: HTMLIFrameElement | null;\n\n /**\n * window object of the guest application\n */\n public readonly window: Window;\n\n /**\n * open mode of the guest application\n */\n public readonly openMode: OpenMode;\n\n /**\n * origin of the guest application\n */\n public readonly origin: string;\n\n /**\n * flag indicating if the guest application is initialized\n */\n public initialized = false;\n\n /**\n * flag indicating if the guest application is ready\n */\n public ready = false;\n\n /**\n * capabilities of the guest application\n */\n public capabilities: Record<string, unknown>;\n\n /**\n * remoting object\n */\n #remoting: Remoting;\n\n /**\n * analytics object\n */\n #analyticsObj: IAnalytics;\n\n /**\n * Create object representing guest application\n * @param {GuestOption} option - options for creating a guest application\n */\n constructor(option: GuestOption) {\n const {\n guestId,\n domElement = null,\n title,\n url,\n window,\n searchParams = {},\n openMode = OpenMode.Embed,\n remoting,\n analyticsObj,\n } = option;\n this.id = guestId;\n this.title = title;\n this.url = url;\n this.origin = getOrigin(url);\n this.searchParams = searchParams;\n this.domElement = domElement;\n this.window = window;\n this.openMode = openMode;\n this.capabilities = {};\n this.#analyticsObj = analyticsObj;\n this.#remoting = remoting;\n }\n\n /**\n * clean up resources\n */\n dispose = () => {\n if (this.openMode === OpenMode.Popup && !this.window.closed) {\n try {\n // eslint-disable-next-line @typescript-eslint/no-unused-expressions\n this.window.document;\n this.window.close();\n } catch (e) {\n this.#remoting.send({\n targetWin: this.window,\n targetOrigin: this.origin,\n messageType: MessageType.HostClose,\n messageBody: {},\n });\n }\n } else {\n this.domElement?.remove?.();\n }\n // remove guest window from allowed list\n this.#remoting.removeSender({ origin: this.origin, window: this.window });\n };\n\n /**\n * Get information about the guest application\n * @returns guest properties\n */\n getInfo = () => ({\n guestId: this.id,\n guestTitle: this.title,\n guestUrl: this.url,\n });\n\n /**\n * Handshake with the guest application in the popup window\n * @returns true if the guest popup window is open & connected\n */\n handShake = () =>\n new Promise<boolean>((resolve) => {\n let handShakeCount = 0;\n const handShakeRetries = 5;\n let handShakeHandle: ReturnType<typeof setInterval>;\n const onAck = () => {\n clearInterval(handShakeHandle);\n this.#remoting.unlisten({\n messageType: MessageType.HandShakeAck,\n callback: onAck,\n });\n resolve(true);\n };\n handShakeHandle = setInterval(() => {\n if (handShakeCount >= handShakeRetries) {\n clearInterval(handShakeHandle);\n this.#remoting.unlisten({\n messageType: MessageType.HandShakeAck,\n callback: onAck,\n });\n resolve(false);\n } else {\n this.#remoting.send({\n targetWin: this.window,\n targetOrigin: this.origin,\n messageType: MessageType.HandShake,\n messageBody: {},\n });\n handShakeCount += 1;\n }\n }, 1000);\n this.#remoting.listen({\n messageType: MessageType.HandShakeAck,\n callback: onAck,\n });\n });\n\n /**\n * initialize guest messaging\n */\n init = () => {\n // add guest window to the allowed list\n this.#remoting.addSender({ origin: this.origin, window: this.window });\n // for popup guests, we need to provide the guest with the host's window\n if (this.openMode === OpenMode.Popup) {\n this.handShake().catch(() => {});\n }\n };\n\n /**\n * invokes event callback on the guest application\n * @param {EventObject} event - event object\n * @param {number} timeout - timeout in milliseconds\n */\n dispatchEvent = (event: EventObject, timeout: number) => {\n this.#analyticsObj\n .startTiming(\n `ScriptingObject.Event.${event.object.objectId}.${event.eventName}`,\n {\n appId: this.id,\n appUrl: this.url,\n },\n )\n .catch(() => {});\n return this.#remoting\n .invoke({\n targetWin: this.window,\n targetOrigin: this.origin,\n messageType: MessageType.ObjectEvent,\n messageBody: event,\n responseTimeoutMs: timeout,\n })\n .finally(() => {\n this.#analyticsObj\n .endTiming(\n `ScriptingObject.Event.${event.object.objectId}.${event.eventName}`,\n {\n appId: this.id,\n appUrl: this.url,\n },\n )\n .catch(() => {});\n });\n };\n\n /**\n * Send a message without any form of response. fire and forget\n * @param {MessageParam} param - message to be sent\n */\n send = (param: MessageParam) => {\n this.#remoting.send({\n targetWin: this.window,\n targetOrigin: this.origin,\n ...param,\n });\n };\n}\n","const randomUUID = typeof crypto !== 'undefined' && crypto.randomUUID && crypto.randomUUID.bind(crypto);\nexport default {\n randomUUID\n};","// Unique ID creation requires a high quality random # generator. In the browser we therefore\n// require the crypto API and do not support built-in fallback to lower quality random number\n// generators (like Math.random()).\nlet getRandomValues;\nconst rnds8 = new Uint8Array(16);\nexport default function rng() {\n // lazy load so that environments that need to polyfill have a chance to do so\n if (!getRandomValues) {\n // getRandomValues needs to be invoked in a context where \"this\" is a Crypto implementation.\n getRandomValues = typeof crypto !== 'undefined' && crypto.getRandomValues && crypto.getRandomValues.bind(crypto);\n\n if (!getRandomValues) {\n throw new Error('crypto.getRandomValues() not supported. See https://github.com/uuidjs/uuid#getrandomvalues-not-supported');\n }\n }\n\n return getRandomValues(rnds8);\n}","import validate from './validate.js';\n/**\n * Convert array of 16 byte values to UUID string format of the form:\n * XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX\n */\n\nconst byteToHex = [];\n\nfor (let i = 0; i < 256; ++i) {\n byteToHex.push((i + 0x100).toString(16).slice(1));\n}\n\nexport function unsafeStringify(arr, offset = 0) {\n // Note: Be careful editing this code! It's been tuned for performance\n // and works in ways you may not expect. See https://github.com/uuidjs/uuid/pull/434\n return byteToHex[arr[offset + 0]] + byteToHex[arr[offset + 1]] + byteToHex[arr[offset + 2]] + byteToHex[arr[offset + 3]] + '-' + byteToHex[arr[offset + 4]] + byteToHex[arr[offset + 5]] + '-' + byteToHex[arr[offset + 6]] + byteToHex[arr[offset + 7]] + '-' + byteToHex[arr[offset + 8]] + byteToHex[arr[offset + 9]] + '-' + byteToHex[arr[offset + 10]] + byteToHex[arr[offset + 11]] + byteToHex[arr[offset + 12]] + byteToHex[arr[offset + 13]] + byteToHex[arr[offset + 14]] + byteToHex[arr[offset + 15]];\n}\n\nfunction stringify(arr, offset = 0) {\n const uuid = unsafeStringify(arr, offset); // Consistency check for valid UUID. If this throws, it's likely due to one\n // of the following:\n // - One or more input array values don't map to a hex octet (leading to\n // \"undefined\" in the uuid)\n // - Invalid input values for the RFC `version` or `variant` fields\n\n if (!validate(uuid)) {\n throw TypeError('Stringified UUID is invalid');\n }\n\n return uuid;\n}\n\nexport default stringify;","import native from './native.js';\nimport rng from './rng.js';\nimport { unsafeStringify } from './stringify.js';\n\nfunction v4(options, buf, offset) {\n if (native.randomUUID && !buf && !options) {\n return native.randomUUID();\n }\n\n options = options || {};\n const rnds = options.random || (options.rng || rng)(); // Per 4.4, set bits for version and `clock_seq_hi_and_reserved`\n\n rnds[6] = rnds[6] & 0x0f | 0x40;\n rnds[8] = rnds[8] & 0x3f | 0x80; // Copy bytes to buffer, if provided\n\n if (buf) {\n offset = offset || 0;\n\n for (let i = 0; i < 16; ++i) {\n buf[offset + i] = rnds[i];\n }\n\n return buf;\n }\n\n return unsafeStringify(rnds);\n}\n\nexport default v4;","import { v4 as uuidv4 } from \"uuid\";\nconst MESSAGE_SOURCE = \"elli:remoting\";\nconst RESPONSE_MESSAGE_TYPE = \"elli:remoting:response\";\nconst EXCEPTION_MESSAGE_TYPE = \"elli:remoting:exception\";\nconst createMessage = ({\n messageType,\n messageBody,\n requestId,\n onewayMsg = false\n}) => ({\n requestId: requestId ?? (!onewayMsg ? uuidv4() : null),\n source: MESSAGE_SOURCE,\n type: messageType,\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n body: messageBody\n});\nconst sendMessage = (param) => {\n const { targetWin, targetOrigin, messageType, messageBody } = param;\n const msg = createMessage({ messageType, messageBody });\n targetWin.postMessage(msg, targetOrigin);\n};\nclass Remoting {\n #correlationId;\n #logger;\n /**\n * set of listeners that are registered\n */\n #listeners = /* @__PURE__ */ new Map();\n /**\n * Represents the set of invocations that are waiting for a response\n */\n #invocations = /* @__PURE__ */ new Map();\n /**\n * The handle to the timeout monitor\n */\n #timeoutMonitorHandle = null;\n /**\n * The window that remoting was initialized on\n */\n #initializedWindow = null;\n /**\n * The set of windows that are allowed to send messages to this window\n */\n #allowedSenders = /* @__PURE__ */ new Map();\n /**\n * Create a new instance of the Remoting class\n * @param logger pui-diagnostic logger\n * @param correlationId unique id for the current session\n */\n constructor(logger, correlationId) {\n if (!logger) throw new Error(\"logger is required\");\n if (!correlationId) throw new Error(\"correlationId is required\");\n this.#correlationId = correlationId;\n this.#logger = logger;\n }\n // Evaluates the timeouts on any waiting invocations and schedules the next check\n #evaluateTimeouts = () => {\n this.#timeoutMonitorHandle = null;\n const ts = Date.now();\n const canceledItems = [];\n let nextCancelTime = null;\n this.#invocations.forEach((eventData, key) => {\n const { requestId, cancelTime } = eventData;\n if (cancelTime && cancelTime <= ts) {\n this.#logger.debug(\n `Detected response timeout for requestId: ${requestId}...`\n );\n canceledItems.push(key);\n eventData.resolve(void 0);\n } else if (cancelTime) {\n nextCancelTime = nextCancelTime === null ? cancelTime : Math.min(nextCancelTime, cancelTime);\n }\n });\n canceledItems.forEach((key) => {\n this.#invocations.delete(key);\n });\n if (nextCancelTime !== null) {\n const delay = Math.max(nextCancelTime - Date.now(), 0);\n this.#scheduleTimeoutCheck(delay);\n }\n };\n // Schedule a timeout check after a delay\n #scheduleTimeoutCheck = (delayMs) => {\n if (this.#timeoutMonitorHandle !== null) return;\n this.#timeoutMonitorHandle = window.setTimeout(\n this.#evaluateTimeouts,\n delayMs\n );\n };\n // Stops the timeout monitor\n #stopResponseMonitor = () => {\n if (this.#timeoutMonitorHandle !== null) {\n window.clearTimeout(this.#timeoutMonitorHandle);\n this.#timeoutMonitorHandle = null;\n }\n };\n // Pops an invocation from the incovation list\n #popInvocation = (requestId) => {\n const e = this.#invocations.get(requestId);\n this.#logger.debug(`serving requestId: ${requestId}`);\n this.#invocations.delete(requestId);\n return e;\n };\n // Handles a response to a prior cross-frame invocation\n #processResponse = (message) => {\n const { requestId } = message;\n this.#logger.debug(\n `Response received for invocation requestId: ${requestId}`\n );\n const eventData = this.#popInvocation(requestId);\n if (!eventData) {\n this.#logger.debug(\n `Received response to stale/invalid request with requestId: ${requestId}`\n );\n return false;\n }\n eventData.resolve(message.body);\n return true;\n };\n // Handles a response to a prior cross-frame invocation\n #processException = (message) => {\n this.#logger.debug(\n `Exception received for invocation (requestId = ${message.requestId})`\n );\n const eventData = this.#popInvocation(message.requestId);\n if (!eventData) {\n this.#logger.warn(\n `Received exception for stale/invalid request (requestId = ${message.requestId})`\n );\n return false;\n }\n eventData.reject(new Error(message.body));\n return true;\n };\n // Receives a message from another window and invokes any event handlers\n #receive = ({\n sourceWin,\n sourceOrigin,\n message\n }) => {\n this.#logger.debug(`Received message of type \"${message.type}\"`);\n const callbacks = this.#listeners.get(message.type);\n if (!callbacks) return false;\n callbacks.forEach((callback) => {\n this.#logger.debug(`Invoking message handler ${callback.name}`);\n callback({\n sourceWin,\n sourceOrigin,\n requestId: message.requestId,\n type: message.type,\n body: message.body\n });\n });\n return true;\n };\n // Processes a message received thru the window's message event\n #processMessage = (message) => {\n if (this.#allowedSenders.size === 0) return false;\n if (!message.source) return false;\n const senderOrigin = this.#allowedSenders.get(message.source);\n if (!senderOrigin) return false;\n if (message?.data?.source !== MESSAGE_SOURCE) return false;\n this.#logger.debug(\n `Remoting: Received message of type \"${message.data.type}\"`\n );\n if (message.data.type === RESPONSE_MESSAGE_TYPE)\n this.#processResponse(message.data);\n else if (message.data.type === EXCEPTION_MESSAGE_TYPE)\n this.#processException(message.data);\n else\n this.#receive({\n sourceWin: message.source,\n sourceOrigin: senderOrigin,\n message: message.data\n });\n return true;\n };\n /**\n * Adds window and its origin list of allowed senders\n * @param {AddSenderParam} param - The sender to add\n */\n addSender = (param) => {\n const { origin, window: window2 } = param;\n if (!origin) throw new Error(\"origin is required\");\n if (!window2) throw new Error(\"window is required\");\n this.#allowedSenders.set(window2, origin);\n };\n /**\n * Initializes the remoting service for a window\n * @param win The window to initialize remoting for\n */\n initialize = (win) => {\n if (this.#initializedWindow) {\n this.#initializedWindow.removeEventListener(\n \"message\",\n this.#processMessage\n );\n }\n win.addEventListener(\"message\", this.#processMessage);\n this.#initializedWindow = win;\n this.#logger.debug(`initialized remoting id: ${this.#correlationId}`);\n };\n /**\n * Closes the remoting service for a window\n */\n close = () => {\n if (this.#initializedWindow) {\n this.#initializedWindow.removeEventListener(\n \"message\",\n this.#processMessage\n );\n this.#initializedWindow = null;\n }\n this.#stopResponseMonitor();\n this.#logger.debug(`closed remoting id: ${this.#correlationId}`);\n };\n /**\n * Sends an invocation which generates a Promise to be used to get a response\n * @param {InvokeParam} param The parameters for the invocation\n * @returns promisifyed response\n */\n invoke = (param) => {\n const {\n targetWin,\n targetOrigin,\n messageType,\n messageBody,\n responseTimeoutMs\n } = param;\n return new Promise((resolve, reject) => {\n const msg = createMessage({ messageType, messageBody });\n this.#invocations.set(msg.requestId, {\n requestId: msg.requestId,\n resolve,\n reject,\n cancelTime: responseTimeoutMs ? Date.now() + responseTimeoutMs : null\n });\n targetWin.postMessage(msg, targetOrigin);\n const { requestId } = msg;\n this.#logger.debug(\n `Posted invocation message of type ${messageType} requestId: ${requestId || \"\"}`\n );\n if (responseTimeoutMs) {\n this.#logger.debug(\n `scheduling timeout check for requestId: ${requestId || \"\"} in ${responseTimeoutMs} ms`\n );\n this.#scheduleTimeoutCheck(responseTimeoutMs);\n }\n });\n };\n /**\n * Setup callback for a specific message type\n * @param {ListenParam<T>} param The parameters for the listener\n */\n listen = (param) => {\n const { messageType, callback } = param;\n const items = this.#listeners.get(messageType) || [];\n items.push(callback);\n this.#listeners.set(messageType, items);\n };\n /**\n * Remove a previously registered callback for a specific message type\n * @param {ListenParam<T>} param The parameters identifying the listener to remove\n */\n unlisten = (param) => {\n const { messageType, callback } = param;\n const items = this.#listeners.get(messageType);\n if (!items) return;\n const index = items.indexOf(callback);\n if (index !== -1) {\n items.splice(index, 1);\n }\n };\n /**\n * Send a message without any form of response. Fire and forget\n * @param {SendParam} param The parameters for the send\n */\n send = (param) => {\n const { targetWin, targetOrigin, messageType, messageBody } = param;\n const msg = createMessage({\n messageType,\n messageBody,\n onewayMsg: true\n });\n targetWin.postMessage(msg, targetOrigin);\n this.#logger.debug(`Posted one-way message of type \"${messageType}\"`);\n };\n /**\n * Removes a window from the list of allowed senders\n * @param {AddSenderParam} param - The sender to remove\n */\n removeSender = (param) => {\n const { window: window2 } = param;\n if (window2) this.#allowedSenders.delete(window2);\n };\n /**\n * Send a response message to a window\n * @param {RespondParam} param The parameters for the response\n */\n respond = (param) => {\n const { targetWin, targetOrigin, requestId, response } = param;\n const msg = createMessage({\n messageType: RESPONSE_MESSAGE_TYPE,\n messageBody: response,\n requestId\n });\n targetWin.postMessage(msg, targetOrigin);\n this.#logger.debug(\n `Response sent to caller for invocation requestId: ${requestId}`\n );\n };\n /**\n * Send an exception message to a window\n * @param {RaiseExceptionParam} param The parameters for the exception\n */\n raiseException = (param) => {\n const { targetWin, targetOrigin, requestId, ex } = param;\n const messageBody = ex instanceof Error ? ex.message : ex;\n const msg = createMessage({\n messageType: EXCEPTION_MESSAGE_TYPE,\n messageBody,\n requestId\n });\n targetWin.postMessage(msg, targetOrigin);\n this.#logger.debug(\n `Exception sent to caller for invocation. requestId: ${requestId}`\n );\n };\n}\nexport {\n Remoting,\n sendMessage\n};\n","const MODULE_OBJECT = \"module\";\nvar SecurityContext = /* @__PURE__ */ ((SecurityContext2) => {\n SecurityContext2[\"USER\"] = \"USER\";\n SecurityContext2[\"PARTNER\"] = \"PARTNER\";\n return SecurityContext2;\n})(SecurityContext || {});\nclass ScriptingObjectManager {\n #normalizeId = (id) => id.trim().toLowerCase();\n /**\n * collection of registered scripting objects\n */\n #scriptingObjects = /* @__PURE__ */ new Map();\n /**\n * collection of proxied scripting objects for each guest\n */\n #guestScriptingObjects = /* @__PURE__ */ new Map();\n #addGuestScriptingObject = (params) => {\n const { so, guestId } = params;\n const objectId = this.#normalizeId(so.id);\n const guestSOs = this.#guestScriptingObjects.get(guestId);\n if (!guestSOs) {\n this.#guestScriptingObjects.set(guestId, /* @__PURE__ */ new Map([[objectId, params]]));\n } else {\n if (guestSOs.has(objectId))\n throw new Error(\n `Scripting Object ${so.id} already exists for guest ${guestId}`\n );\n guestSOs.set(objectId, params);\n }\n };\n #disposeSO = ({ so }) => {\n if (so._dispose && typeof so._dispose === \"function\") {\n try {\n so._dispose();\n } catch {\n }\n }\n };\n /**\n * get scripting object for the given object id and guest id\n * this method is backward compatible with the V1 guest, where the guest id is not provided. It will return the scripting object for the first guest\n * @param root0\n * @param root0.objectId\n * @param root0.guestId\n * @returns scripting object for the given object id and guest id. null if not found\n */\n #getGuestScriptingObject = ({\n objectId,\n guestId\n }) => {\n if (objectId === MODULE_OBJECT && !guestId) {\n for (const [, mSOs] of this.#guestScriptingObjects) {\n const mSO = mSOs.get(objectId);\n if (mSO) return mSO;\n }\n }\n const SOs = guestId ? this.#guestScriptingObjects.get(guestId) : null;\n if (SOs) {\n return SOs.get(objectId) ?? null;\n }\n return null;\n };\n #removeGuestScriptingObject = ({\n objectId,\n guestId\n } = {}) => {\n if (guestId) {\n if (!objectId) {\n const sosInfo = this.#guestScriptingObjects.get(guestId);\n if (sosInfo) {\n sosInfo.forEach(this.#disposeSO);\n }\n this.#guestScriptingObjects.delete(guestId);\n return;\n }\n const moduleSOs = this.#guestScriptingObjects.get(guestId);\n if (moduleSOs) {\n const soInfo = moduleSOs.get(objectId);\n if (soInfo) this.#disposeSO(soInfo);\n moduleSOs.delete(objectId);\n }\n } else if (objectId) {\n this.#guestScriptingObjects.forEach((moduleSOs) => {\n const soInfo = moduleSOs.get(objectId);\n if (soInfo) this.#disposeSO(soInfo);\n moduleSOs.delete(objectId);\n });\n }\n };\n /**\n * registers scripting object to the host\n * @param so scripting object to register\n * @param {AddScriptingObjectParams<ValueOf<AppObjects>>}\n * @param params\n */\n addScriptingObject = (so, params) => {\n const { guestId } = params || {};\n if (!so?.id || !so?._toJSON) {\n throw new Error(\"Object is not derived from ScriptingObject\");\n }\n const objectId = this.#normalizeId(so.id);\n if (objectId === MODULE_OBJECT && !guestId) {\n throw new Error(`Guest id is required to add Module scripting object`);\n }\n if (guestId) {\n this.#addGuestScriptingObject({ so, ...params, guestId });\n return;\n }\n if (this.#scriptingObjects.has(objectId))\n throw new Error(`Scripting Object ${so.id} already exists`);\n this.#scriptingObjects.set(objectId, { so, ...params });\n };\n /**\n * Get reference to the scripting object proxy for a guest\n * @param {string} objectId scripting object id\n * @param {GuestContext} guest that is requesting the scripting object\n * @returns proxied scripting object reference\n */\n getObject = (objectId, guest) => {\n const id = this.#normalizeId(objectId);\n let soInfo = this.#getGuestScriptingObject({\n objectId: id,\n guestId: guest?.id\n });\n soInfo = soInfo ?? this.#scriptingObjects.get(id) ?? null;\n const { so } = soInfo || {};\n if (!so) return null;\n return so;\n };\n /**\n * Check if a scripting object exists\n * @param objectId unique id of the scripting object\n * @param guest\n * @returns true if the scripting object exists, false otherwise\n */\n has = (objectId, guest) => this.getObject(objectId, guest) !== null;\n /**\n * list name of scripting objects for the given guest\n * @param guestId unique id of the guest\n * @returns name of scripting objects for the given guest\n */\n listScriptingObjects = (guestId) => {\n const objects = new Set(this.#scriptingObjects.keys());\n const guestSOs = this.#guestScriptingObjects.get(guestId);\n if (guestSOs) {\n for (const key of guestSOs.keys()) objects.add(key);\n }\n return Array.from(objects);\n };\n /**\n * removes scripting object\n * @param objectId unique id of the scripting object\n * @param guestId unique id of the guest\n */\n removeScriptingObject = (objectId, guestId) => {\n const id = this.#normalizeId(objectId);\n if (guestId) {\n this.#removeGuestScriptingObject({ objectId: id, guestId });\n } else {\n this.#removeGuestScriptingObject({ objectId: id });\n const soInfo = this.#scriptingObjects.get(id);\n if (soInfo) this.#disposeSO(soInfo);\n this.#scriptingObjects.delete(id);\n }\n };\n /**\n * removes all scripting objects\n * @param guestId unique id of the guest\n */\n removeAllScriptingObjects = (guestId) => {\n if (!guestId) {\n this.#scriptingObjects.forEach(this.#disposeSO);\n this.#scriptingObjects.clear();\n } else {\n this.#removeGuestScriptingObject({ guestId });\n }\n };\n}\nexport {\n MODULE_OBJECT,\n ScriptingObjectManager,\n SecurityContext\n};\n","class ScriptingObjectProxy {\n /**\n * proxy type\n */\n __TYPE__ = \"Proxy\";\n /**\n * unique id of scripting object\n */\n id;\n /**\n * type of scripting object\n */\n objectType;\n /**\n * Creates a new instance of the Scripting Object Proxy\n * @param objectId unique id of scripting object\n * @param objectType type of scripting object\n */\n constructor(objectId, objectType) {\n this.id = objectId;\n this.objectType = objectType;\n }\n}\nconst isScriptingObjectProxy = (value) => (\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n value?.constructor?.name === \"Proxy\" || // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n value?.constructor?.name === \"ScriptingObjectProxy\" || // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access, no-underscore-dangle\n value?.__TYPE__ === \"Proxy\"\n);\nexport {\n ScriptingObjectProxy,\n isScriptingObjectProxy\n};\n","/* eslint-disable max-lines */\nimport { v4 as uuidv4 } from 'uuid';\nimport type {\n IScriptingObject,\n IScriptingObjectProxy,\n ScriptingObjectTypes,\n Events,\n IAnalytics,\n TimingOptions,\n} from '@elliemae/pui-scripting-object';\nimport {\n Remoting,\n ScriptingObject,\n MessageType,\n Event,\n ScriptingObjectManager,\n ProxyEvent,\n isScriptingObjectProxy,\n GuestContext,\n} from '@elliemae/microfe-common';\nimport type {\n ListenerCallbackParams,\n EventListeners,\n IScriptingObjectProxyEvent,\n AddScriptingObjectParams,\n GetObjectParams,\n DispatchEventParam,\n EventOptions,\n FilterCriteria,\n} from '@elliemae/microfe-common';\nimport { Logger, LogLevels } from '@elliemae/pui-diagnostics';\nimport {\n EventObject,\n GenericFunction,\n IFrameSandboxValues,\n GuestOptions,\n ValueOf,\n ScriptingObjects,\n AttachParam,\n OpenMode,\n WindowFeatures,\n} from './types.js';\nimport {\n ISSFHost,\n HostOption,\n LoadGuestParam,\n LoadGuestsParam,\n GuestCloseParam,\n GuestEventSubscribeCallback,\n GuestEventUnsubscribeCallback,\n} from './ihost.js';\nimport { Guest } from './guest.js';\nimport { flatten, isFunction } from './utils.js';\n\nexport const SANDBOX_DEFAULT = [\n IFrameSandboxValues.AllowScripts,\n IFrameSandboxValues.AllowPopups,\n IFrameSandboxValues.AllowModals,\n IFrameSandboxValues.AllowForms,\n IFrameSandboxValues.AllowDownloads,\n IFrameSandboxValues.AllowSameOrigin,\n];\n\ntype GuestWindowSize = {\n width: number;\n height: number;\n};\n\n/**\n * Host class for embedding guest application and enabling bi-directional communication using scripting objects methods and events\n * @typeParam AppObjects - scripting objects that are published by the host application\n * @typeParam AppEvents - events that are published by the host application\n */\n/* eslint-disable indent */\nexport class SSFHost<\n AppObjects extends ScriptingObjects = ScriptingObjectTypes,\n AppEvents extends EventListeners = Events,\n> implements ISSFHost<AppObjects, AppEvents>\n{\n /* eslint-enable indent */\n /**\n * unique identifier for the host\n */\n public hostId: string;\n\n /**\n * reference to the remoting object\n */\n #remoting: Remoting;\n\n /**\n * unique identifier for the host\n */\n #correlationId: string;\n\n /**\n * reference to the logger\n */\n #logger: Logger;\n\n /**\n * reference to the analytics object\n */\n #analyticsObj: IAnalytics;\n\n /**\n * list of guests\n */\n #guests = new Map<string, Guest>();\n\n /**\n * reverse lookup: window -> guest for O(1) message routing\n */\n #guestsByWindow = new Map<Window, Guest>();\n\n /**\n * reverse lookup: url -> guest for O(1) popup dedup\n */\n #guestsByUrl = new Map<string, Guest>();\n\n /**\n * list of callbacks for guest close.\n */\n #guestCloseCallbackList = new Map<\n string,\n (({ id }: { id: string }) => void | Promise<void>)[]\n >();\n\n /**\n * scripting object manager\n */\n #soManager: ScriptingObjectManager<AppObjects>;\n\n /**\n * callback for ready state\n */\n #readyStateCallback: null | ((guest: Guest) => void) = null;\n\n /**\n *\n */\n #popupGuestMonitor: ReturnType<typeof setInterval> | null = null;\n\n /**\n * callback for guest event subscription\n */\n #onGuestEventSubscribe: GuestEventSubscribeCallback | null = null;\n\n /**\n * callback for guest event unsubscription\n */\n #onGuestEventUnsubscribe: GuestEventUnsubscribeCallback | null = null;\n\n /**\n * Create a new host\n * @param hostId unique identifier for the host\n * @param {HostOption} option - options for the host\n */\n constructor(hostId: string, option: HostOption) {\n // Set the local variables\n this.hostId = hostId;\n if (!option?.logger) throw new Error('Logger is required');\n if (!option?.analyticsObj) throw new Error('Analytics object is required');\n this.#logger = option.logger;\n this.#analyticsObj = option.analyticsObj;\n this.#correlationId = uuidv4();\n this.#remoting = new Remoting(this.#logger, this.#correlationId);\n if (\n option?.readyStateCallback &&\n typeof option?.readyStateCallback !== 'function'\n )\n throw new Error('readyStateCallback must be a function');\n this.#readyStateCallback = option?.readyStateCallback || null;\n this.#onGuestEventSubscribe = option?.onGuestEventSubscribe || null;\n this.#onGuestEventUnsubscribe = option?.onGuestEventUnsubscribe || null;\n this.#soManager = new ScriptingObjectManager<AppObjects>();\n // Initialize the messenger\n this.#remoting.initialize(window);\n this.#connect();\n // close all popup guest when host window gets reloaded\n window.addEventListener('beforeunload', this.#closeAllPopupGuests);\n this.#logger.debug(\n `host is initialized. hostId: ${this.hostId}, correlationId: ${\n this.#correlationId\n }`,\n );\n }\n\n #sendBAEvent = (event: string, data: Record<string, unknown>) => {\n const baEvent = { event, ...data };\n this.#analyticsObj.sendBAEvent(baEvent).catch((e) => {\n this.#logger.debug(\n `Analytics sendBAEvent failed: ${(e as Error).message}`,\n );\n });\n };\n\n #startTiming = (name: string, options: TimingOptions) => {\n this.#analyticsObj.startTiming(name, options).catch((e) => {\n this.#logger.debug(\n `Analytics startTiming failed: ${(e as Error).message}`,\n );\n });\n };\n\n #endTiming = (start: string, options: TimingOptions) => {\n this.#analyticsObj.endTiming(start, options).catch((e) => {\n this.#logger.debug(`Analytics endTiming failed: ${(e as Error).message}`);\n });\n };\n\n #closeAllPopupGuests = () => {\n const popupIds = Array.from(this.#guests.values())\n .filter((guest) => guest.openMode === OpenMode.Popup)\n .map((guest) => guest.id);\n popupIds.forEach((id) => this.unloadGuest(id));\n };\n\n /**\n * get the reference to the guest application by its window\n * @param guestWindow reference to the guest window\n * @returns reference to the guest\n */\n #getGuestForWindow = (guestWindow: Window) =>\n this.#guestsByWindow.get(guestWindow);\n\n /**\n * get the reference to the guest application by its window\n * @param url url of the guest application\n * @returns reference to the guest\n */\n #getGuestForUrl = (url: string) => this.#guestsByUrl.get(url) ?? null;\n\n /**\n * check if a object is a scripting object\n * @param value javascript object\n * @returns true if the object is a scripting object\n */\n #isScriptingObject = (value: any): value is ValueOf<AppObjects> =>\n // eslint-disable-next-line no-underscore-dangle, @typescript-eslint/no-unsafe-member-access\n typeof value?._toJSON === 'function';\n\n #encodeResponse = (val: unknown, guest?: GuestContext) => {\n if (this.#isScriptingObject(val)) {\n // add scripting objects returned from scripting object methods\n if (\n !this.#soManager.has(\n val?.id as Extract<keyof AppObjects, string>,\n guest,\n )\n )\n this.#soManager.addScriptingObject(\n val,\n guest ? { guestId: guest?.id } : {},\n );\n // eslint-disable-next-line no-underscore-dangle\n return { type: 'object', object: val._toJSON() };\n }\n return { type: 'value', value: val };\n };\n\n #encodeException = (ex: string | Error) => {\n if (typeof ex === 'string') {\n return ex;\n }\n if (ex instanceof Error) {\n return ex.message;\n }\n return 'An unexpected error occurred in the host application';\n };\n\n #dispatchConfigEvent = (guest: Guest) => {\n if (guest.ready) {\n this.#remoting.send({\n targetWin: guest.window,\n targetOrigin: guest.origin,\n messageType: MessageType.HostConfig,\n messageBody: {\n logLevel: this.#logger.getLogLevel(),\n ...guest.getInfo(),\n },\n });\n }\n };\n\n #invoke = <T extends IScriptingObject>({\n guest,\n obj,\n functionName,\n functionParams,\n }: {\n guest: Guest;\n obj: T;\n functionName: keyof IScriptingObject;\n functionParams: unknown[];\n }) => {\n const func = obj[functionName];\n // Ensure the function exists\n if (!isFunction(func)) {\n this.#logger.warn(\n `Attempt to call invalid function on object type ${\n obj.objectType\n }: ${String(functionName)}`,\n );\n return Promise.reject(\n new Error(\n `Method '${functionName}' not found in Scripting Object '${obj.id}'`,\n ),\n );\n }\n\n // Invoke the object's function\n this.#logger.debug(\n `Invoking host implementation of ${obj.id}.${String(functionName)}()`,\n );\n return new Promise((resolve) => {\n Object.defineProperty(func, 'callContext', {\n value: { guest },\n configurable: true,\n enumerable: true,\n writable: true,\n });\n\n resolve((func as GenericFunction)(...functionParams));\n });\n };\n\n #handleGuestReadyComplete = ({\n sourceWin,\n sourceOrigin,\n requestId,\n }: ListenerCallbackParams<any>) => {\n // Verify the guest belongs to this host\n const guest = this.#getGuestForWindow(sourceWin);\n if (!guest) {\n this.#logger.warn(\n `Received ready event for unknown guest. requestId: ${requestId}`,\n );\n return;\n }\n\n // Ensure this guest is initialized\n if (!guest.initialized) {\n this.#logger.warn(\n 'Guest must be initialized before it is marked as ready',\n );\n this.#remoting.raiseException({\n targetWin: sourceWin,\n targetOrigin: sourceOrigin,\n requestId,\n ex: 'Guest must be initialized before it is marked as ready',\n });\n return;\n }\n\n if (!guest.ready) {\n // Set the ready state\n guest.ready = true;\n const guestInfo = guest.getInfo();\n this.#endTiming('SSF.Guest.Load', {\n appId: guestInfo.guestId,\n appUrl: guestInfo.guestUrl,\n });\n // Invoke the control function on the guest\n this.#dispatchConfigEvent(guest);\n // Invoke the registered callback, if any\n this.#readyStateCallback?.(guest);\n this.#logger.audit({\n message: `Guest is ready`,\n ...guestInfo,\n });\n }\n };\n\n // Initializes a guest when the guest is full loaded\n #handleGuestReady = ({\n sourceWin,\n sourceOrigin,\n requestId,\n body,\n }: ListenerCallbackParams<Record<string, any>>) => {\n // Verify the guest belongs to this host\n const guest = this.#getGuestForWindow(sourceWin);\n if (!guest) {\n this.#logger.warn(\n `Received ready event for unknown guest. requestid = ${requestId}`,\n );\n return;\n }\n if (!guest.initialized) {\n // Initialize the capabilities object\n guest.initialized = true;\n guest.capabilities = body || {};\n this.#logger.audit({\n message: `Guest is initialized`,\n ...guest.getInfo(),\n });\n }\n // If the guest has not indicated that it will provide explicit notification\n // when it's ready, we'll fire the ready event now\n if (!body || !body.onReady) {\n this.#handleGuestReadyComplete({\n sourceWin,\n sourceOrigin,\n requestId,\n type: '',\n body: null,\n });\n }\n };\n\n /**\n * cleanup the guest reference when it is closed\n * @param param0\n * @param param0.sourceWin\n */\n #handleGuestClose = async ({ sourceWin }: ListenerCallbackParams<any>) => {\n if (sourceWin?.window) {\n const guest = this.#findGuest(sourceWin);\n if (guest && !(await guest.handShake())) {\n this.unloadGuest(sourceWin);\n }\n }\n };\n\n // Handles list objects requests from the remote automation framework\n #handleListObjects = ({\n sourceWin,\n sourceOrigin,\n requestId,\n }: ListenerCallbackParams<{\n objects: keyof AppObjects;\n }>) => {\n this.#logger.debug(\n `Processing listObjects request. requestId = ${requestId}`,\n );\n\n // Get the guest from which the request came\n const guest = this.#getGuestForWindow(sourceWin);\n if (!guest) {\n this.#logger.warn('Rejected object request from unknown guest window');\n return false;\n }\n\n // Get the list of objects available for the guest\n const objects = this.#soManager.listScriptingObjects(guest.id);\n\n this.#remoting.respond({\n targetWin: sourceWin,\n targetOrigin: sourceOrigin,\n requestId,\n response: objects,\n });\n\n this.#logger.debug({\n message: `name of scripting objects returned`,\n requestId,\n objects,\n ...guest.getInfo(),\n });\n return true;\n };\n\n // Handles object get requests from the remote automation framework\n #handleObjectGet = ({\n sourceWin,\n sourceOrigin,\n requestId,\n body,\n }: ListenerCallbackParams<{\n objectId: Extract<keyof AppObjects, string>;\n }>) => {\n const { objectId } = body;\n this.#logger.debug(\n `Processing getObject request for object ${objectId}. requestId = ${requestId}`,\n );\n\n // Get the guest from which the request came\n const guest = this.#getGuestForWindow(sourceWin);\n if (!guest) {\n this.#logger.warn('Rejected object request from unknown guest window');\n return false;\n }\n\n // Get the object from the guest's host\n const obj = this.getScriptingObject(objectId, { guest });\n if (!obj) {\n this.#logger.warn(\n `unknown or unauthorized object ${objectId} from guest ${guest.id}`,\n );\n this.#remoting.raiseException({\n targetWin: sourceWin,\n targetOrigin: sourceOrigin,\n requestId,\n ex: `The requested object (${objectId}) is not available`,\n });\n return false;\n }\n\n this.#remoting.respond({\n targetWin: sourceWin,\n targetOrigin: sourceOrigin,\n requestId,\n response: this.#encodeResponse(obj, guest),\n });\n\n this.#logger.debug({\n message: `Scripting Object returned`,\n requestId,\n scriptingObject: objectId,\n ...guest.getInfo(),\n });\n return true;\n };\n\n /**\n * Handles a guest event subscription request.\n *\n * This method processes a request from a guest window to subscribe to a specific event.\n * It verifies the guest window, logs the request, and invokes the subscription callback asynchronously.\n * If the guest window is unknown, the request is rejected and a warning is logged.\n * @param params - The parameters for the event subscription request.\n * @param params.sourceWin - The window object from which the request originated.\n * @param params.requestId - The unique identifier for the request.\n * @param params.body - The body of the request containing event subscription details.\n * @param params.body.eventId - The identifier of the event to subscribe to.\n * @param params.body.criteria - Optional filter criteria for the event subscription.\n * @param params.body.token - The authentication token for the request.\n * @returns Returns `false` if the guest window is unknown; otherwise, no explicit return value.\n */\n #handleGuestEventSubscribe = ({\n sourceWin,\n requestId,\n body,\n }: ListenerCallbackParams<{\n eventId: string;\n criteria?: FilterCriteria;\n token: string;\n }>) => {\n const { eventId, criteria, token } = body;\n this.#logger.debug(\n `Processing guest event subscribe request for event ${eventId}. requestId = ${requestId}`,\n );\n // Get the guest from which the request came\n const guest = this.#getGuestForWindow(sourceWin);\n if (!guest) {\n this.#logger.warn(\n 'Rejected event subscribe request from unknown guest window',\n );\n return;\n }\n // invoke the callback\n setTimeout(() => {\n try {\n this.#onGuestEventSubscribe?.({\n guestId: guest.id,\n eventId,\n criteria,\n token,\n });\n } catch (error) {\n this.#logger.warn(\n `Error in onGuestEventSubscribe callback for event ${eventId}: ${\n (error as Error).message\n }`,\n );\n }\n }, 0);\n };\n\n /**\n * Handles a guest event unsubscribe request.\n *\n * This method processes an unsubscribe request from a guest window for a specific event.\n * It verifies the source window, retrieves the corresponding guest, and invokes the\n * `#onGuestEventUnsubscribe` callback asynchronously. If the source window is not recognized,\n * the request is rejected and a warning is logged.\n * @param params - The parameters for the unsubscribe request, including:\n * - `sourceWin`: The window from which the request originated.\n * - `requestId`: The unique identifier for the request.\n * - `body`: An object containing the `eventId` and `token` for the event to unsubscribe.\n * @param params.sourceWin\n * @param params.requestId\n * @param params.body\n * @returns `false` if the guest window is unknown; otherwise, no explicit return value.\n */\n #handleGuestEventUnsubscribe = ({\n sourceWin,\n requestId,\n body,\n }: ListenerCallbackParams<{ eventId: string; token: string }>) => {\n const { eventId, token } = body;\n this.#logger.debug(\n `Processing guest event unsubscribe request for event ${eventId}. requestId = ${requestId}`,\n );\n // Get the guest from which the request came\n const guest = this.#getGuestForWindow(sourceWin);\n if (!guest) {\n this.#logger.warn(\n 'Rejected event unsubscribe request from unknown guest window',\n );\n return;\n }\n // invoke the callback\n setTimeout(() => {\n try {\n this.#onGuestEventUnsubscribe?.({\n guestId: guest.id,\n eventId,\n token,\n });\n } catch (error) {\n this.#logger.warn(\n `Error in onGuestEventUnsubscribe callback for event ${eventId}: ${\n (error as Error).message\n }`,\n );\n }\n }, 0);\n };\n\n // handles guest resize event\n #handleGuestResize = ({\n sourceWin,\n requestId,\n body,\n }: ListenerCallbackParams<GuestWindowSize>) => {\n const guest = this.#getGuestForWindow(sourceWin);\n if (!guest) {\n this.#logger.warn(\n `Received resize event from unknown guest. requestid = ${requestId}`,\n );\n return;\n }\n if (guest.domElement) {\n guest.domElement.style.height = `${body.height}px`;\n }\n this.#logger.debug(\n `Guest ${guest.id} resized to ${body.width}x${body.height}`,\n );\n };\n\n // Handles object invoke requests from the remote automation framework\n #handleObjectInvoke = ({\n sourceWin,\n sourceOrigin,\n requestId,\n body,\n }: ListenerCallbackParams<{\n objectId: Extract<keyof AppObjects, string>;\n functionName: keyof IScriptingObject;\n functionParams: unknown[];\n }>) => {\n const { objectId } = body;\n\n // Get the guest from which the request came\n const guest = this.#getGuestForWindow(sourceWin);\n if (!guest) {\n this.#logger.warn(\n 'Rejected method invocation request from unknown guest window',\n );\n // this.#remoting.raiseException({\n // targetWin: sourceWin,\n // targetOrigin: sourceOrigin,\n // requestId,\n // ex: 'Specified window is not a known guest',\n // });\n return false;\n }\n\n this.#logger.debug(\n `Function ${objectId}.${String(body.functionName)}() called from guest \"${\n guest.id\n }\" (requestId = ${requestId})`,\n );\n\n // Get the object from the guest's host\n const obj = this.getScriptingObject(objectId, { guest });\n if (!obj) {\n this.#logger.warn(\n `Invocation of unknown or unauthorized object ${objectId} from guest ${guest.id}`,\n );\n this.#remoting.raiseException({\n targetWin: sourceWin,\n targetOrigin: sourceOrigin,\n requestId,\n ex: `The requested object (${objectId}) is not available`,\n });\n return false;\n }\n\n const guestInfo = guest.getInfo();\n this.#startTiming(`ScriptingObject.API.${objectId}.${body.functionName}`, {\n appId: guestInfo.guestId,\n appUrl: guestInfo.guestUrl,\n });\n // Invoke the function, which will always return a Promise\n this.#invoke({\n guest,\n obj,\n functionName: body.functionName,\n functionParams: body.functionParams,\n })\n .then((val) => {\n this.#remoting.respond({\n targetWin: sourceWin,\n targetOrigin: sourceOrigin,\n requestId,\n response: this.#encodeResponse(val, guest),\n });\n this.#logger.debug({\n message: `Value returned for Scripting Object method call`,\n requestId,\n scriptingObject: objectId,\n scriptingMethod: body.functionName,\n ...guestInfo,\n });\n })\n .catch((ex) => {\n this.#remoting.raiseException({\n targetWin: sourceWin,\n targetOrigin: guest.origin,\n requestId,\n ex: ex as Error,\n });\n this.#logger.error({\n message: `Exception thrown for Scripting Object method call`,\n requestId,\n scriptingObject: objectId,\n scriptingMethod: body.functionName,\n ...guestInfo,\n });\n })\n .finally(() => {\n this.#endTiming(\n `ScriptingObject.API.${objectId}.${body.functionName}`,\n {\n appId: guestInfo.guestId,\n appUrl: guestInfo.guestUrl,\n },\n );\n });\n return true;\n };\n\n /**\n * subscribe to guest resize event\n */\n #subscribeToGuestResizeEvent = () => {\n this.#remoting.listen({\n messageType: MessageType.GuestResize,\n callback: this.#handleGuestResize,\n });\n };\n\n /**\n * start listening to the remoting messages\n */\n #connect = () => {\n this.#remoting.listen({\n messageType: MessageType.GuestReady,\n callback: this.#handleGuestReady,\n });\n this.#remoting.listen({\n messageType: MessageType.GuestReadyComplete,\n callback: this.#handleGuestReadyComplete,\n });\n this.#remoting.listen({\n messageType: MessageType.GuestClose,\n // eslint-disable-next-line @typescript-eslint/no-misused-promises\n callback: this.#handleGuestClose,\n });\n this.#remoting.listen({\n messageType: MessageType.ListObjects,\n callback: this.#handleListObjects,\n });\n this.#remoting.listen({\n messageType: MessageType.ObjectGet,\n callback: this.#handleObjectGet,\n });\n this.#remoting.listen({\n messageType: MessageType.ObjectInvoke,\n callback: this.#handleObjectInvoke,\n });\n this.#remoting.listen({\n messageType: MessageType.GuestEventSubscribe,\n callback: this.#handleGuestEventSubscribe,\n });\n this.#remoting.listen({\n messageType: MessageType.GuestEventUnsubscribe,\n callback: this.#handleGuestEventUnsubscribe,\n });\n };\n\n /**\n * check if the value is a proxy event\n * @param value\n * @returns\n */\n #isProxyEvent = (\n value: any,\n ): value is IScriptingObjectProxyEvent<AppEvents> =>\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n value instanceof ProxyEvent ||\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n typeof value?.subscribe === 'function'; // support v1 scripting objects\n\n /**\n * Register pre-rendered guest application to host\n * @param {AttachParam} param - parameters for attaching the guest\n * @returns reference to the guest object\n */\n #attachGuest = (param: AttachParam): Guest => {\n const guest = new Guest({\n ...param,\n remoting: this.#remoting,\n analyticsObj: this.#analyticsObj,\n });\n // Register the guest with host\n guest.init();\n // Add the guest to all lookup maps\n this.#guests.set(param.guestId, guest);\n this.#guestsByWindow.set(guest.window, guest);\n this.#guestsByUrl.set(guest.url, guest);\n return guest;\n };\n\n /**\n * find the guest object by its id, window or dom element\n * @param guestIdOrWindowOrEle id, window or dom element of the guest\n * @returns guest object\n */\n #findGuest = (guestIdOrWindowOrEle: string | Window | HTMLIFrameElement) => {\n if (typeof guestIdOrWindowOrEle === 'string') {\n return this.#guests.get(guestIdOrWindowOrEle);\n }\n // O(1) lookup by window reference\n const byWindow = this.#guestsByWindow.get(guestIdOrWindowOrEle as Window);\n if (byWindow) return byWindow;\n // fallback: scan for domElement match\n return Array.from(this.#guests.values()).find(\n (value) => value.domElement === guestIdOrWindowOrEle,\n );\n };\n\n #monitorPopupGuests = () => {\n // already monitoring\n if (this.#popupGuestMonitor) return;\n this.#popupGuestMonitor = setInterval(() => {\n const guestsToRemove: Guest[] = [];\n this.#guests.forEach((guest) => {\n if (guest.openMode === OpenMode.Popup && guest.window.closed) {\n guestsToRemove.push(guest);\n }\n });\n guestsToRemove.forEach((guest) => {\n const { id } = guest;\n this.unloadGuest(id);\n const callbacks = this.#guestCloseCallbackList.get(id);\n callbacks?.forEach((callback) => {\n // eslint-disable-next-line max-nested-callbacks\n Promise.resolve(callback({ id })).catch(() => {});\n });\n });\n }, 1000);\n };\n\n #stopMonitoringPopupGuests = () => {\n if (!this.#popupGuestMonitor) return;\n const hasPopups = Array.from(this.#guests.values()).some(\n (guest) => guest.openMode === OpenMode.Popup,\n );\n if (!hasPopups) {\n clearInterval(this.#popupGuestMonitor);\n this.#popupGuestMonitor = null;\n }\n };\n\n #openPopupGuest = <\n SearchParams extends Record<string, string | number | boolean>,\n >(param: {\n guestId: string;\n url: string;\n title: string;\n searchParams: SearchParams;\n popupWindowFeatures?: WindowFeatures;\n onLoad?: (guestId: string) => void;\n onError?: (guestId: string) => void;\n }) => {\n const {\n url,\n title,\n popupWindowFeatures = {},\n searchParams,\n guestId,\n onLoad,\n onError,\n } = param;\n const {\n width = 800,\n height = 600,\n top = 100,\n left = 100,\n } = popupWindowFeatures;\n let guest = this.#getGuestForUrl(url);\n if (guest) {\n // bring guest popup window to front\n if (!guest.window.closed) {\n guest.send({\n messageType: MessageType.GuestFocus,\n messageBody: {},\n });\n }\n } else {\n // construct window features as comma separated string\n const windowFeatures = Object.entries({ width, height, top, left })\n .filter(([, v]) => v)\n .map(([k, v]) => `${k}=${v}`)\n .join(',');\n // open new guest popup window\n const guestWindow = window.open(url, title, `popup, ${windowFeatures}`);\n if (!guestWindow) {\n // notify load failure to the caller\n setTimeout(() => {\n try {\n onError?.(guestId);\n } catch (error) {\n this.#logger.debug(\n `Error occurred in onError for guest with id '${guestId}': ${\n (error as Error).message\n }`,\n );\n }\n }, 0);\n throw new Error('Failed to open guest application in popup window');\n } else {\n // notify load complete to the caller\n setTimeout(() => {\n try {\n onLoad?.(guestId);\n } catch (error) {\n this.#logger.debug(\n `Error occurred in onLoad for guest with id '${guestId}': ${\n (error as Error).message\n }`,\n );\n }\n }, 0);\n }\n // nullify opener before attaching to prevent guest access to host window\n guestWindow.opener = null;\n guest = this.#attachGuest({\n guestId,\n window: guestWindow,\n title,\n url,\n searchParams,\n openMode: OpenMode.Popup,\n });\n // start polling for popup close only when popups exist\n this.#monitorPopupGuests();\n }\n return guest;\n };\n\n #openEmbedGuest = <\n SearchParams extends Record<string, string | number | boolean>,\n >(param: {\n guestId: string;\n url: string;\n title: string;\n searchParams: SearchParams;\n targetElement: HTMLElement;\n onLoad?: (guestId: string) => void;\n onError?: (guestId: string) => void;\n options?: GuestOptions;\n }) => {\n const {\n url,\n title,\n targetElement,\n searchParams,\n guestId,\n onLoad,\n onError,\n options = {} as GuestOptions,\n } = param;\n // create the iframe\n const targetElementDocument = targetElement.ownerDocument ?? document;\n const {\n fitToContent = false,\n disableSandbox = false,\n sandboxValues = [],\n customSandboxValues = [],\n style = '',\n permissionPolicy = '',\n } = options;\n if (!title) throw new Error('title is required');\n if (fitToContent) this.#subscribeToGuestResizeEvent();\n // create guest frame\n const frame = targetElementDocument.createElement('iframe');\n frame.setAttribute('id', guestId);\n // handle frame load and error events\n const onFrameLoad = () => {\n // notify load complete to the caller\n setTimeout(() => {\n try {\n onLoad?.(guestId);\n } catch (error) {\n this.#logger.debug(\n `Error occurred in onLoad for guest with id '${guestId}': ${\n (error as Error).message\n }`,\n );\n }\n }, 0);\n this.#logger.debug(`frame loaded for guest with id '${guestId}'`);\n frame.removeEventListener('load', onFrameLoad);\n };\n const onFrameLoadFailure = () => {\n // notify load failure to the caller\n setTimeout(() => {\n try {\n onError?.(guestId);\n } catch (error) {\n this.#logger.debug(\n `Error occurred in onError for guest with id '${guestId}': ${\n (error as Error).message\n }`,\n );\n }\n }, 0);\n this.#logger.error(`frame load failed for guest with id '${guestId}'`);\n frame.removeEventListener('error', onFrameLoadFailure);\n };\n frame.addEventListener('load', onFrameLoad);\n frame.addEventListener('error', onFrameLoadFailure);\n frame.setAttribute(\n 'style',\n `min-width: 100%; height: 100%; border: 0px; ${style}`,\n );\n if (!disableSandbox) {\n frame.setAttribute(\n 'sandbox',\n customSandboxValues.length > 0\n ? customSandboxValues.join(' ')\n : [...SANDBOX_DEFAULT, ...sandboxValues].join(' '),\n );\n }\n frame.setAttribute('title', title);\n frame.setAttribute('src', url);\n if (permissionPolicy) frame.setAttribute('allow', permissionPolicy);\n targetElement.appendChild(frame);\n // Find the window object and create the guest\n const guestFrameEle = targetElementDocument.getElementById(\n guestId,\n ) as HTMLIFrameElement;\n return this.#attachGuest({\n guestId,\n domElement: guestFrameEle,\n window: guestFrameEle.contentWindow as Window,\n title,\n url,\n searchParams,\n openMode: OpenMode.Embed,\n });\n };\n\n #getGuestUrl = <Params extends Record<string, string | number | boolean>>(\n url: string,\n params: Params,\n ) => {\n let querystring = '';\n Object.keys(params).forEach((queryParam) => {\n querystring += `${\n (querystring.length ? '&' : '') + encodeURIComponent(queryParam)\n }=${encodeURIComponent(params[queryParam])}`;\n });\n\n return (\n url +\n (!querystring ? '' : (url.indexOf('?') >= 0 ? '&' : '?') + querystring)\n );\n };\n\n /**\n * registers scripting object to the host\n * @param {ValueOf<AppObjects>} so scripting object to be registered\n * @param {AddScriptingObjectParams} params params to add scripting object\n */\n addScriptingObject = <SO extends ValueOf<AppObjects>>(\n so: SO,\n params?: AddScriptingObjectParams,\n ) => {\n // if scripting object is proxy then clone it\n if (isScriptingObjectProxy(so)) {\n const clonedSo = this.cloneScriptingObject(so);\n this.#soManager.addScriptingObject(clonedSo, params);\n } else {\n // if scripting object is not a proxy object, add it directly\n this.#soManager.addScriptingObject(so, params);\n }\n };\n\n /**\n * Clone parent host's scripting object for exposing to grand children\n * @param proxy - reference to the scripting object obtained through getObject method\n * @param guest - reference to the ssf guest\n * @returns cloned version of the scripting object\n */\n cloneScriptingObject = <ObjectId extends Extract<keyof AppObjects, string>>(\n proxy: IScriptingObjectProxy,\n ): AppObjects[ObjectId] => {\n if (!proxy) throw new Error('proxy is required');\n // Create a new, base ScriptingObject with V2 properties\n const so = new ScriptingObject(proxy.id, proxy.objectType);\n type UnsubscribeFn = () => void;\n // Store the tokens for unsubscription\n let unsubscribers: Array<UnsubscribeFn> = [];\n\n // Copy the functions and events over\n // let propName: keyof typeof proxy;\n Object.keys(proxy).forEach((propName) => {\n const propValue = proxy[propName as keyof IScriptingObjectProxy];\n if (this.#isProxyEvent(propValue)) {\n // v1 or v2 object event\n const event = new Event<AppEvents>({\n name: propValue.name || propName,\n objectId: so.id,\n });\n // Create the event on the object\n Object.defineProperty(so, propName, {\n value: event,\n enumerable: true,\n });\n\n // Subscribe to the event and pass the callback down\n if ((propValue as any) instanceof ProxyEvent) {\n // proxy was obtained from v2 guest\n const listener = ({\n eventParams,\n eventOptions,\n }: {\n eventParams: any;\n eventOptions?: any;\n }) =>\n this.dispatchEvent({\n event,\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n eventParams,\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n eventOptions,\n });\n\n const token = (propValue as unknown as ProxyEvent).subscribe(\n listener,\n );\n unsubscribers.push(() => {\n (propValue as unknown as ProxyEvent).unsubscribe(token);\n });\n } else {\n // proxy was obtained from v1 guest\n // eslint-disable-next-line @typescript-eslint/no-unsafe-call, @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-assignment\n const token = (propValue as any).subscribe?.(\n (obj: ScriptingObject, params: any, options: any) =>\n this.dispatchEvent({\n event,\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n eventParams: params,\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n eventOptions: options,\n }),\n );\n unsubscribers.push(() => {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-call, @typescript-eslint/no-unsafe-member-access\n (propValue as any).unsubscribe?.(token);\n });\n }\n } else if (isFunction(propValue)) {\n // Create a function that proxies the call to the proxy\n Object.defineProperty(so, propName, {\n value: async (...args: unknown[]) => {\n const retVal = await propValue(...args);\n return isScriptingObjectProxy(retVal)\n ? this.cloneScriptingObject(retVal)\n : retVal;\n },\n enumerable: true,\n });\n\n // Override the dispose function\n if (propName === 'dispose') {\n // eslint-disable-next-line @typescript-eslint/unbound-method\n const defaultImpl = so.dispose;\n Object.defineProperty(so, propName, {\n value: () => {\n // Dispose of the object in the proxy tier\n // eslint-disable-next-line no-underscore-dangle\n so._dispose();\n return defaultImpl.apply(so);\n },\n enumerable: true,\n });\n }\n }\n });\n\n // Override the dispose function// Add a destroy method to clean up the proxy by unsubscribing to the\n // proxied object's events and unpublishing the object\n // eslint-disable-next-line no-underscore-dangle\n so._dispose = () => {\n unsubscribers.forEach((unsub) => {\n unsub?.();\n });\n unsubscribers = [];\n };\n\n return so as unknown as AppObjects[ObjectId];\n };\n\n /**\n * dispose the resources used by the host application\n */\n close = () => {\n if (this.#popupGuestMonitor) {\n clearInterval(this.#popupGuestMonitor);\n this.#popupGuestMonitor = null;\n }\n this.#closeAllPopupGuests();\n this.#remoting.close();\n window.removeEventListener('beforeunload', this.#closeAllPopupGuests);\n this.#logger.debug(\n `host is closed. hostId: ${this.hostId}, correlationId: ${\n this.#correlationId\n }`,\n );\n };\n\n /**\n * dispatch event to guest application(s)\n * @param {EventDetail} params details of the event to be dispatched\n * @returns promise that resolves to an array with result from each guest application\n */\n dispatchEvent = async <\n EventId extends Extract<keyof AppEvents, string>,\n Params extends Parameters<AppEvents[EventId]>[0]['eventParams'],\n Options extends EventOptions,\n >(\n params: DispatchEventParam<EventId, Params, Options>,\n ) => {\n const {\n event: { id, name },\n eventParams,\n eventOptions = {} as Options,\n } = params;\n const {\n eventHandler = null,\n timeout = null,\n window: targetWindow = null,\n guestId,\n } = eventOptions;\n // Get the scripting object\n const objectId = id.split('.')[0] as Extract<keyof AppObjects, string>;\n // get the guest object to which the event should be dispatched to\n const guestIdorWnd = guestId || targetWindow;\n const targetGuest = guestIdorWnd ? this.#findGuest(guestIdorWnd) : null;\n // get scripting object\n const scriptingObject = targetGuest\n ? this.getScriptingObject(objectId, { guest: targetGuest })\n : this.getScriptingObject(objectId);\n if (!scriptingObject) {\n this.#logger.warn(\n `Attempt to dispatch event ${name} on unknown object ${objectId}`,\n );\n return Promise.resolve([]);\n }\n\n const eventObj: EventObject = {\n // eslint-disable-next-line no-underscore-dangle\n object: scriptingObject._toJSON(),\n eventName: name,\n eventParams,\n eventHandler,\n eventOptions: {\n allowsFeedback: false,\n },\n };\n\n if (timeout && !Number.isNaN(timeout)) {\n eventObj.eventOptions = {\n allowsFeedback: true,\n timeout: Number(timeout),\n };\n }\n\n // Invoke the event handler in target or all guests\n const guestPromises: Array<Promise<unknown>> = [];\n let timingMetricStarted = false;\n\n const dispatchToGuest = (guest: Guest) => {\n const guestInfo = guest.getInfo();\n if (timeout && guest?.capabilities?.eventFeedback) {\n guestPromises.push(guest.dispatchEvent(eventObj, timeout));\n if (!timingMetricStarted) {\n this.#startTiming(\n `ScriptingObject.Event.${scriptingObject.id}.${name}`,\n {\n appId: this.hostId,\n appUrl: window.location.href,\n },\n );\n timingMetricStarted = true;\n }\n this.#logger.debug({\n message: 'Event dispatched and awaiting feedback',\n scriptingEventId: id,\n ...guestInfo,\n });\n } else {\n guest.send({\n messageType: MessageType.ObjectEvent,\n messageBody: eventObj,\n });\n this.#logger.debug({\n message: 'Event dispatched',\n scriptingEventId: id,\n ...guestInfo,\n });\n }\n };\n\n if (targetGuest) {\n // targeted dispatch — skip iterating all guests\n dispatchToGuest(targetGuest);\n } else {\n this.#guests.forEach(dispatchToGuest);\n }\n\n // Return a promise that aggregates all of the guest promises\n const retValue = await Promise.all(guestPromises)\n .then((values) => {\n this.#logger.debug({\n message: 'Event feedback received',\n scriptingEventId: id,\n });\n // eslint-disable-next-line @typescript-eslint/no-unsafe-return\n return flatten(values);\n })\n .catch((ex: Error) => {\n this.#logger.error({\n message: 'Error processing event',\n eventId: id,\n exception: ex,\n });\n throw ex;\n })\n .finally(() => {\n if (timingMetricStarted)\n this.#endTiming(\n `ScriptingObject.Event.${scriptingObject.id}.${name}`,\n {\n appId: this.hostId,\n appUrl: window.location.href,\n },\n );\n });\n // eslint-disable-next-line @typescript-eslint/no-unsafe-return\n return retValue;\n };\n\n /**\n * get reference to all guest applications\n * @returns list of guest application references\n */\n getGuests = (): Array<Guest> => Array.from(this.#guests.values());\n\n /**\n * get the scripting object by id\n * @param objectId - id of the scripting object\n * @param params\n * @returns scripting object\n */\n getScriptingObject = <Id extends Extract<keyof AppObjects, string>>(\n objectId: Id,\n params?: GetObjectParams,\n ): AppObjects[Id] | null =>\n this.#soManager.getObject(objectId, params?.guest);\n\n /**\n * loads guest application inside sandboxed iframe\n * @param {LoadGuestParam} param - parameters for loading the guest application\n * @returns reference to the guest object\n */\n loadGuest = <SearchParams extends Record<string, string | number | boolean>>(\n param: LoadGuestParam<SearchParams>,\n ): Guest => {\n const {\n id: guestId,\n url,\n targetElement,\n title,\n searchParams = {} as SearchParams,\n onLoad,\n onError,\n options = {} as GuestOptions,\n } = param;\n if (!guestId) throw new Error('id for guest application is required');\n // Generate a unique instance ID when multiple instances of the same app are loaded\n let instanceId = guestId;\n if (this.#guests.has(instanceId)) {\n let counter = 1;\n while (this.#guests.has(`${guestId}-${counter}`)) {\n counter += 1;\n }\n instanceId = `${guestId}-${counter}`;\n }\n const { openMode = OpenMode.Embed, popupWindowFeatures = {} } = options;\n\n const srcUrl = this.#getGuestUrl(url, searchParams);\n let guest: Guest | null = null;\n\n this.#startTiming('SSF.Guest.Load', {\n appId: instanceId,\n appUrl: srcUrl,\n });\n if (openMode === OpenMode.Popup) {\n guest = this.#openPopupGuest({\n guestId: instanceId,\n url: srcUrl,\n title,\n searchParams,\n popupWindowFeatures,\n onLoad,\n onError,\n });\n } else if (openMode === OpenMode.Embed) {\n guest = this.#openEmbedGuest({\n guestId: instanceId,\n url: srcUrl,\n title,\n targetElement,\n searchParams,\n onLoad,\n onError,\n options,\n });\n } else {\n throw new Error(`Invalid openMode: ${openMode as string}`);\n }\n\n this.#logger.audit({\n message: 'Guest loaded',\n ...guest.getInfo(),\n });\n return guest;\n };\n\n /**\n * loads guest application inside sandboxed iframe with different params\n * @param {LoadGuestsParam} param - parameters for loading the guest application\n */\n loadGuests = <SearchParams extends Record<string, string | number | boolean>>(\n param: LoadGuestsParam<SearchParams>,\n ) => {\n const {\n id,\n url,\n targetElement,\n title,\n searchParamsList = [] as SearchParams[],\n options = {} as GuestOptions,\n } = param;\n // Render the plugins into sandboxed iframe elements\n searchParamsList.forEach((searchParams, index) => {\n this.loadGuest({\n id: `${id}-${index}`,\n url,\n title,\n targetElement,\n searchParams,\n options,\n });\n }, this);\n };\n\n /**\n * removes all scripting objects from host\n * @param guestId unique id of the guest application\n */\n removeAllScriptingObjects = (guestId?: string) => {\n this.#soManager.removeAllScriptingObjects(guestId);\n };\n\n /**\n * removes scripting object from the host\n * @param objectId unique id of the scripting object\n * @param guestId unique id of the guest application\n */\n removeScriptingObject = (\n objectId: Extract<keyof AppObjects, string>,\n guestId?: string,\n ) => {\n this.#soManager.removeScriptingObject(objectId, guestId);\n };\n\n /**\n * set the log level for the host application\n * @param level - log level\n */\n setLogLevel = (level: LogLevels) => {\n // Set the logging level at the host\n this.#logger.setLogLevel(level);\n // Notify all guests of the change\n this.#guests.forEach(this.#dispatchConfigEvent);\n this.#logger.debug('Dispatched config events to all guests');\n };\n\n /**\n * unloads guest application from host\n * @param guestIdOrWindowOrEle unique id of the guest application or window object or dom element of the guest application\n * @throws Error if guestId or Window reference is invalid\n */\n unloadGuest = (guestIdOrWindowOrEle: string | Window | HTMLIFrameElement) => {\n // Find the guest object\n const guest = this.#findGuest(guestIdOrWindowOrEle);\n if (guest) {\n // dispose the guest\n guest.dispose();\n // Remove from all lookup maps\n this.#guestsByWindow.delete(guest.window);\n this.#guestsByUrl.delete(guest.url);\n this.#guests.delete(guest.id);\n this.#logger.audit({\n message: `Guest is removed from host`,\n ...guest.getInfo(),\n });\n // stop polling if no popup guests remain\n this.#stopMonitoringPopupGuests();\n }\n };\n\n /**\n * monitors guest window close action and executes the callback from host.\n * @param callback host callback method\n * @param id unique id of the guest application\n * @param param\n */\n onGuestClose = (param: GuestCloseParam) => {\n const { id, guestCloseCallback } = param;\n const callbacks = this.#guestCloseCallbackList.get(id) || [];\n callbacks.push(guestCloseCallback);\n this.#guestCloseCallbackList.set(id, callbacks);\n };\n}\n"],"names":["root","factory","__webpack_require__","exports","definition","key","obj","prop","Event","param","name","objectId","ProxyEvent","#eventSrc","eventSrc","callback","token","isEvent","value","getEventId","eventName","FUNCTION","isPublicFunction","fnName","ScriptingObject","#id","#objectType","objectType","functions","events","property","MessageType","MessageType2","OpenMode","IFrameSandboxValues","getOrigin","url","origin","flatten","source","v","isFunction","Guest","#remoting","#analyticsObj","option","guestId","domElement","title","window","searchParams","openMode","remoting","analyticsObj","resolve","handShakeCount","handShakeRetries","handShakeHandle","onAck","event","timeout","getRandomValues","rnds8","rng","byteToHex","i","unsafeStringify","arr","offset","stringify","uuid","validate","v4","options","buf","rnds","MESSAGE_SOURCE","RESPONSE_MESSAGE_TYPE","EXCEPTION_MESSAGE_TYPE","createMessage","messageType","messageBody","requestId","onewayMsg","sendMessage","targetWin","targetOrigin","msg","Remoting","#correlationId","#logger","#listeners","#invocations","#timeoutMonitorHandle","#initializedWindow","#allowedSenders","logger","correlationId","#evaluateTimeouts","ts","canceledItems","nextCancelTime","eventData","cancelTime","delay","#scheduleTimeoutCheck","delayMs","#stopResponseMonitor","#popInvocation","e","#processResponse","message","#processException","#receive","sourceWin","sourceOrigin","callbacks","#processMessage","senderOrigin","window2","win","responseTimeoutMs","reject","items","index","response","ex","MODULE_OBJECT","SecurityContext","SecurityContext2","ScriptingObjectManager","#normalizeId","id","#scriptingObjects","#guestScriptingObjects","#addGuestScriptingObject","params","so","guestSOs","#disposeSO","#getGuestScriptingObject","mSOs","mSO","SOs","#removeGuestScriptingObject","sosInfo","moduleSOs","soInfo","guest","objects","ScriptingObjectProxy","isScriptingObjectProxy","SANDBOX_DEFAULT","SSFHost","#guests","#guestsByWindow","#guestsByUrl","#guestCloseCallbackList","#soManager","#readyStateCallback","#popupGuestMonitor","#onGuestEventSubscribe","#onGuestEventUnsubscribe","hostId","#connect","#closeAllPopupGuests","#sendBAEvent","data","baEvent","#startTiming","#endTiming","start","#getGuestForWindow","guestWindow","#getGuestForUrl","#isScriptingObject","#encodeResponse","val","#encodeException","#dispatchConfigEvent","#invoke","functionName","functionParams","func","#handleGuestReadyComplete","guestInfo","#handleGuestReady","body","#handleGuestClose","#findGuest","#handleListObjects","#handleObjectGet","#handleGuestEventSubscribe","eventId","criteria","error","#handleGuestEventUnsubscribe","#handleGuestResize","#handleObjectInvoke","#subscribeToGuestResizeEvent","#isProxyEvent","#attachGuest","guestIdOrWindowOrEle","byWindow","#monitorPopupGuests","guestsToRemove","#stopMonitoringPopupGuests","#openPopupGuest","popupWindowFeatures","onLoad","onError","width","height","top","left","windowFeatures","k","#openEmbedGuest","targetElement","targetElementDocument","fitToContent","disableSandbox","sandboxValues","customSandboxValues","style","permissionPolicy","frame","onFrameLoad","onFrameLoadFailure","guestFrameEle","#getGuestUrl","querystring","queryParam","clonedSo","proxy","unsubscribers","propName","propValue","listener","eventParams","eventOptions","args","retVal","defaultImpl","unsub","eventHandler","targetWindow","guestIdorWnd","targetGuest","scriptingObject","eventObj","guestPromises","timingMetricStarted","dispatchToGuest","values","instanceId","counter","srcUrl","searchParamsList","level","guestCloseCallback"],"sourceRoot":""}