{"mappings":";;;;;;;;;;;;;;;;AIAe;;aAEE,UAAU,IAAI;;;aACd,UAAU,IAAI;;IAE7B,OAAc,iBAAyB;QACrC,IAAI,QAAQ,IAAI,WAAW;QAC3B,OAAO,eAAe,CAAC;QACvB,OAAO,MAAM,IAAI,CAAC,OACf,GAAG,CAAC,CAAA,IAAK,EAAE,QAAQ,CAAC,IAAI,QAAQ,CAAC,GAAG,MACpC,IAAI,CAAC;IACV;IAEA,aAAoB,QAAQ,OAAe,EAAE,MAAc,EAAmB;QAC5E,IAAI,OAAO,OAAO,eAAe,CAAC,IAAI,WAAW;QACjD,IAAI,KAAK,OAAO,eAAe,CAAC,IAAI,WAAW;QAC/C,IAAI,MAAM,MAAM,IAAI,CAAC,SAAS,CAAC,QAAQ;QAEvC,IAAI,iBAAiB,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC;QACzC,IAAI,aAAa,MAAM,OAAO,MAAM,CAAC,OAAO,CAC1C;YACE,MAAM;gBACN;QACF,GACA,KACA;QAGF,IAAI,WAAW,IAAI,CAAC,aAAa,CAAC;YAAC;YAAM;YAAI,IAAI,WAAW;SAAY;QACxE,OAAO,IAAI,CAAC,YAAY,CAAC;IAC3B;IAEA,aAAoB,QAAQ,UAAkB,EAAE,MAAc,EAAmB;QAC/E,IAAI,OAAO,IAAI,CAAC,YAAY,CAAC;QAC7B,IAAI,OAAO,KAAK,KAAK,CAAC,GAAG;QACzB,IAAI,KAAK,KAAK,KAAK,CAAC,IAAI;QACxB,IAAI,aAAa,KAAK,KAAK,CAAC;QAE5B,IAAI,MAAM,MAAM,IAAI,CAAC,SAAS,CAAC,QAAQ;QAEvC,IAAI,YAAY,MAAM,OAAO,MAAM,CAAC,OAAO,CACzC;YACE,MAAM;gBACN;QACF,GACA,KACA;QAGF,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC;IAC7B;IAEA,aAAqB,UAAU,MAAc,EAAE,IAA6B,EAAsB;QAChG,IAAI,gBAAgB,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC;QACxC,IAAI,UAAU,MAAM,OAAO,MAAM,CAAC,SAAS,CACzC,OACA,eACA,UACA,OACA;YAAC;SAAY;QAGf,OAAO,OAAO,MAAM,CAAC,SAAS,CAC5B;YACE,MAAM;kBACN;YACA,YAAY;YACZ,MAAM;QACR,GACA,SACA;YACE,MAAM;YACN,QAAQ;QACV,GACA,OACA;YAAC;YAAW;SAAU;IAE1B;IAEA,OAAe,cAAc,OAAqB,EAAc;QAC9D,IAAI,cAAc,QAAQ,MAAM,CAAC,CAAC,KAAK,IAAM,MAAM,EAAE,MAAM,EAAE;QAC7D,IAAI,SAAS,IAAI,WAAW;QAC5B,IAAI,SAAS;QACb,KAAK,IAAI,KAAK,QAAS;YACrB,OAAO,GAAG,CAAC,GAAG;YACd,UAAU,EAAE,MAAM;QACpB;QACA,OAAO;IACT;IAEA,OAAe,aAAa,IAAgB,EAAU;QACpD,OAAO,KAAK,OAAO,YAAY,IAAI;IACrC;IAEA,OAAe,aAAa,GAAW,EAAc;QACnD,IAAI,SAAS,KAAK;QAClB,IAAI,MAAM,OAAO,MAAM;QACvB,IAAI,QAAQ,IAAI,WAAW;QAC3B,IAAK,IAAI,IAAI,GAAG,IAAI,KAAK,IACvB,KAAK,CAAC,EAAE,GAAG,OAAO,UAAU,CAAC;QAE/B,OAAO;IACT;AACF;;;ACvGO,IAAA,AAAK,mEAAA;IACV,gCAAgC;;;;;;IAOhC,qBAAqB;;;;;;;;;WARX;;AAmBL,MAAM,kDAAqB;IAEhC,YAAY,AAAgB,IAAY,EAAE,OAAe,CAAE;QACzD,KAAK,CAAC,eADoB,OAAA;QAE1B,IAAI,CAAC,IAAI,GAAG;IACd;AACF;;;AFpBe;IAYb,YAAY,AAAQ,GAAW,EAAE,AAAQ,MAAc,CAAE;aAArC,MAAA;aAAqB,SAAA;aATjC,UAAU,IAAI;aACd,WAAW,IAAI;aACf,SAAS;aAET,eAAe;IAKmC;IAElD,sBAA4B;QAClC,IAAI,CAAC,EAAE,GAAG,IAAI,CAAA,GAAA,6CAAQ,EAAE,IAAI,CAAC,GAAG;QAEhC,IAAI,CAAC,EAAE,CAAC,SAAS,GAAG,OAAO;YACzB,IAAI;YACJ,IAAI;gBACF,MAAM,MAAM,CAAA,GAAA,wCAAU,EAAE,OAAO,CAAC,MAAM,IAAI,EAAY,IAAI,CAAC,MAAM;YACnE,EAAE,OAAM;gBACN,uEAAuE;gBACvE,MAAM,MAAM,IAAI;YAClB;YACA,IAAI,CAAC,aAAa,CAAC;QACrB;QAEA,IAAI,CAAC,EAAE,CAAC,OAAO,GAAG;YAChB,IAAI,CAAC,aAAa;YAClB,KAAK,IAAI,GAAG,UAAE,MAAM,EAAE,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC,OAAO,GAC7C,OAAO,IAAI,CAAA,GAAA,yCAAW,EAAE,CAAA,GAAA,yCAAe,EAAE,gBAAgB,EAAE;YAE7D,IAAI,CAAC,OAAO,CAAC,KAAK;YAClB,IAAI,IAAI,CAAC,cAAc,EACrB,IAAI,CAAC,cAAc;QAEvB;QAEA,IAAI,CAAC,EAAE,CAAC,OAAO,GAAG;YAChB,IAAI,CAAC,EAAE,CAAC,KAAK;QACf;IACF;IAEA,MAAa,QAAQ,OAAe,EAAiB;QACnD,IAAI,CAAC,mBAAmB;QAExB,IAAI,IAAI,CAAC,EAAE,CAAC,UAAU,KAAK,CAAA,GAAA,6CAAQ,EAAE,IAAI,EACvC,MAAM,IAAI,QAAc,CAAC,SAAS;YAChC,MAAM,YAAY,WAAW;gBAC3B,IAAI,CAAC,EAAE,CAAC,MAAM,GAAG;gBACjB,IAAI,CAAC,EAAE,CAAC,OAAO,GAAG;gBAClB,IAAI,IAAI,CAAC,EAAE,CAAC,UAAU,KAAK,CAAA,GAAA,6CAAQ,EAAE,MAAM,EACzC,IAAI,CAAC,EAAE,CAAC,KAAK;gBAEf,OAAO,IAAI,CAAA,GAAA,yCAAW,EAAE,CAAA,GAAA,yCAAe,EAAE,cAAc,EAAE,CAAC,mBAAmB,CAAC;YAChF,GAAG;YAEH,MAAM,kBAAkB,IAAI,CAAC,EAAE,CAAC,OAAO;YAEvC,IAAI,CAAC,EAAE,CAAC,MAAM,GAAG;gBACf,aAAa;gBACb,IAAI,CAAC,EAAE,CAAC,OAAO,GAAG;gBAClB;YACF;YAEA,IAAI,CAAC,EAAE,CAAC,OAAO,GAAG;gBAChB,aAAa;gBACb,IAAI,CAAC,EAAE,CAAC,OAAO,GAAG;gBAClB,OAAO,IAAI,CAAA,GAAA,yCAAW,EAAE,CAAA,GAAA,yCAAe,EAAE,aAAa,EAAE;YAC1D;QACF;IAEJ;IAEO,aAAmB;QACxB,IAAI,CAAC,aAAa;QAClB,IAAI,IAAI,CAAC,EAAE,IAAI,IAAI,CAAC,EAAE,CAAC,UAAU,KAAK,CAAA,GAAA,6CAAQ,EAAE,IAAI,EAClD,IAAI,CAAC,EAAE,CAAC,KAAK;IAEjB;IAEO,QAAQ,OAAmB,EAAQ;QACxC,IAAI,CAAC,cAAc,GAAG;IACxB;IAEO,iBAAuB;QAC5B,IAAI,IAAI,CAAC,cAAc,EACrB;QAGF,IAAI,CAAC,cAAc,GAAG,YAAY;YAChC,IAAI,CAAC,IAAI,CAAC,KAAK,SAAS,CAAC;gBACvB,SAAS;gBACT,IAAI;gBACJ,QAAQ;YACV;QACF,GAAG,IAAI,CAAC,YAAY;IACtB;IAEQ,gBAAsB;QAC5B,IAAI,IAAI,CAAC,cAAc,EAAE;YACvB,cAAc,IAAI,CAAC,cAAc;YACjC,IAAI,CAAC,cAAc,GAAG;QACxB;IACF;IAEQ,KAAK,IAAY,EAAQ;QAC/B,IAAI,IAAI,CAAC,EAAE,CAAC,UAAU,KAAK,CAAA,GAAA,6CAAQ,EAAE,IAAI,EACvC,MAAM,IAAI,CAAA,GAAA,yCAAW,EAAE,CAAA,GAAA,yCAAe,EAAE,gBAAgB,EAAE;QAE5D,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC;IACf;IAEA,MAAa,QAAW,MAAc,EAAE,MAAqB,EAAE,OAAuB,EAAc;QAClG,IAAI,KAAK,AAAC,CAAA,IAAI,CAAC,MAAM,EAAC,EAAG,QAAQ;QACjC,IAAI,UAA0B;YAAE,SAAS;gBAAO;oBAAI;oBAAQ;QAAO;QACnE,IAAI,MAAM,KAAK,SAAS,CAAC;QACzB,IAAI,MAAM,SAAS,cAAc,QAAQ,MAAM,MAAM,CAAA,GAAA,wCAAU,EAAE,OAAO,CAAC,KAAK,IAAI,CAAC,MAAM;QACzF,IAAI,CAAC,IAAI,CAAC;QAEV,OAAO,IAAI,QAAQ,CAAC,SAAS;YAC3B,MAAM,UAAU;gBACd,aAAa;gBACb,QAAQ,MAAM,EAAE,oBAAoB,SAAS;gBAC7C,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC;YACtB;YAEA,MAAM,UAAU;gBACd;gBACA,OAAO,IAAI,CAAA,GAAA,yCAAW,EAAE,CAAA,GAAA,yCAAe,EAAE,gBAAgB,EAAE;YAC7D;YAEA,MAAM,YAAY,WAAW;gBAC3B;gBACA,OAAO,IAAI,CAAA,GAAA,yCAAW,EAAE,CAAA,GAAA,yCAAe,EAAE,cAAc,EAAE;YAC3D,GAAG,QAAQ,OAAO;YAElB,yCAAyC;YACzC,IAAI,SAAS,QAAQ,SAAS;gBAC5B;gBACA;YACF;YACA,QAAQ,MAAM,EAAE,iBAAiB,SAAS;YAE1C,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI;gBACnB,SAAS,CAAC;oBACR;oBACA,QAAQ;gBACV;gBACA,QAAQ,CAAC;oBACP;oBACA,OAAO;gBACT;YACF;QACF;IACF;IAEA,MAAM,OAAO,MAAc,EAAE,MAAqB,EAAiB;QACjE,IAAI,UAA+B;YAAE,SAAS;oBAAO;oBAAQ;QAAO;QACpE,IAAI,YAAY,MAAM,CAAA,GAAA,wCAAU,EAAE,OAAO,CAAC,KAAK,SAAS,CAAC,UAAU,IAAI,CAAC,MAAM;QAC9E,IAAI,CAAC,IAAI,CAAC;IACZ;IAEO,GAAG,MAAc,EAAE,OAAmB,EAAQ;QACnD,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,QAAQ;IAC5B;IAEO,IAAI,MAAc,EAAQ;QAC/B,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC;IACvB;IAEA,MAAc,cAAc,GAAW,EAAiB;QACtD,IAAI,MAAM,KAAK,KAAK,CAAC;QACrB,IAAI,IAAI,CAAC,iBAAiB,CAAC,MAAM;YAC/B,IAAI,KAAK,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,EAAE;YAChC,IAAI,IAAI;gBACN,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE;gBAC1B,IAAI,IAAI,KAAK,EACX,GAAG,MAAM,CAAC,IAAI,CAAA,GAAA,yCAAW,EAAE,IAAI,KAAK,CAAC,IAAI,EAAE,IAAI,KAAK,CAAC,OAAO;qBAE5D,GAAG,OAAO,CAAC,IAAI,MAAM;YAEzB;QACF,OAAO,IAAI,IAAI,CAAC,gBAAgB,CAAC,QAAQ,IAAI,CAAC,qBAAqB,CAAC,MAAM;YACxE,IAAI,UAAU,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,MAAM;YAC1C,IAAI,SAAS;gBACX,IAAI,UAAE,MAAM,SAAE,KAAK,EAAE,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,KAAK;gBACvD,IAAI,CAAC,IAAI,CAAC,gBAAgB,CAAC,MACzB,QAAQ,0CAA0C;gBAGpD,IAAI,CAAC,UAAU,CAAC,OACd,QAAQ;oBAAE,MAAM,CAAA,GAAA,yCAAe,EAAE,eAAe;oBAAE,SAAS;gBAA4C;gBAEzG,IAAI,WAA4B;oBAAE,SAAS;oBAAO,IAAI,IAAI,EAAE;4BAAE;2BAAQ;gBAAM;gBAC5E,IAAI,YAAY,MAAM,CAAA,GAAA,wCAAU,EAAE,OAAO,CAAC,KAAK,SAAS,CAAC,WAAW,IAAI,CAAC,MAAM;gBAC/E,IAAI,CAAC,IAAI,CAAC;YACZ;QACF;IACF;IAEA,MAAc,eAAe,GAAyC,EAAE,OAAmB,EAAuD;QAChJ,IAAI,QAAQ;QACZ,IAAI;YACF,IAAI,MAAM,OAAO,CAAC,IAAI,MAAM,GAC1B,SAAS,MAAM,WAAW,IAAI,MAAM;iBAC/B,IAAI,IAAI,MAAM,IAAI,OAAO,IAAI,MAAM,KAAK,UAC7C,SAAS,MAAM,QAAQ,IAAI,MAAM;iBAEjC,SAAS,MAAM,WAAW,yBAAyB;YAGrD,IAAI,IAAI,CAAC,kBAAkB,CAAC,SAAS;gBACnC,QAAQ;oBAAE,MAAM,OAAO,IAAI;oBAAE,SAAS,OAAO,OAAO;gBAAC;gBACrD,SAAS;YACX;QACF,EAAE,OAAO,KAAK;YACZ,IAAI,IAAI,CAAC,kBAAkB,CAAC,MAC1B,QAAQ;gBAAE,MAAM,IAAI,IAAI;gBAAE,SAAS,IAAI,OAAO;YAAC;iBAE/C,QAAQ;gBAAE,MAAM,CAAA,GAAA,yCAAe,EAAE,aAAa;gBAAE,SAAS,CAAC,gBAAgB,EAAE,eAAe,QAAQ,IAAI,OAAO,GAAG,IAAI;YAAC;QAE1H;QAEA,OAAO;oBAAE;mBAAQ;QAAM;IACzB;IAEQ,kBAAkB,GAAY,EAA0B;QAC9D,OACE,OAAO,QAAQ,YAAY,QAAQ,QACnC,aAAa,OAAO,IAAI,OAAO,KAAK,SACpC,QAAQ,OACP,CAAA,YAAY,OAAO,WAAW,GAAE;IAErC;IAEQ,iBAAiB,GAAY,EAAyB;QAC5D,OACE,OAAO,QAAQ,YAAY,QAAQ,QACnC,aAAa,OAAO,IAAI,OAAO,KAAK,SACpC,QAAQ,OACR,YAAY;IAEhB;IAEQ,sBAAsB,GAAY,EAA8B;QACtE,OACE,OAAO,QAAQ,YAAY,QAAQ,QACnC,aAAa,OAAO,IAAI,OAAO,KAAK,SACpC,YAAY,OACZ,CAAE,CAAA,QAAQ,GAAE;IAEhB;IAEQ,mBAAmB,IAAa,EAA4B;QAClE,OACE,OAAO,SAAS,YAAY,SAAS,QACrC,UAAU,QAAQ,OAAO,KAAK,IAAI,KAAK,YACvC,aAAa,QAAQ,OAAO,KAAK,OAAO,KAAK;IAEjD;AACF;;;ADxQe;IASb;;;;;;;GAOC,GACD,YAAY,OAAe,EAAE,QAAgB,EAAE,MAAc,EAAE,YAAY,EAAE,CAAE;QAC7E,IAAI,CAAC,OAAO,GAAG;QACf,IAAI,CAAC,QAAQ,GAAG;QAChB,IAAI,CAAC,MAAM,GAAG;QACd,IAAI,CAAC,SAAS,GAAG;QACjB,IAAI,CAAC,MAAM,GAAG,IAAI,CAAA,GAAA,wCAAc,EAAE,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,MAAM;IAC9D;IAEO,iBAAiC;QACtC,OAAO;YACL,SAAS,IAAI,CAAC,OAAO;YACrB,UAAU,IAAI,CAAC,QAAQ;YACvB,WAAW,IAAI,CAAC,SAAS;YACzB,QAAQ,IAAI,CAAC,MAAM;QACrB;IACF;IAEA;;;;;GAKC,GACD,MAAa,QAAQ,YAAY,KAAM,EAA4B;QACjE,OAAO,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC;IAC7B;IAEO,aAAmB;QACxB,IAAI,CAAC,MAAM,CAAC,UAAU;IACxB;IAEU,YAAkB;QAC1B,IAAI,CAAC,MAAM,CAAC,cAAc;IAC5B;IAEA;;;;;;;GAOC,GACD,MAAa,YAAe,MAAc,EAAE,MAAqB,EAAE,UAA0B;QAAE,SAAS;IAAO,CAAC,EAAc;QAC5H,OAAO,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,QAAQ,QAAQ;IAC7C;IAEA;;;;;GAKC,GACD,MAAa,iBAAiB,MAAc,EAAE,MAAqB,EAAiB;QAClF,MAAM,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,QAAQ;IACnC;IAEA;;;;;GAKC,GACD,AAAO,GAAG,MAAc,EAAE,OAAmB,EAAQ;QACnD,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,QAAQ;IACzB;IAEA;;;;GAIC,GACD,AAAO,IAAI,MAAc,EAAQ;QAC/B,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC;IAClB;IAEA;;;;GAIC,GACD,AAAO,iBAAiB,OAAmC,EAAQ;QACjE,IAAI,CAAC,EAAE,CAAC,kBAAkB;IAC5B;IAEA;;;;GAIC,GACD,AAAO,QAAQ,OAAmB,EAAQ;QACxC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC;IACtB;AACF;;;ADjGe,uDAA2B,CAAA,GAAA,wCAAW;IAEnD;;;;GAIC,GACD,YAAY,UAAkB,CAAE;QAC9B,IAAI,WAAE,OAAO,YAAE,QAAQ,UAAE,MAAM,aAAE,SAAS,EAAE,GAAG,yCAAa,eAAe,CAAC;QAC5E,KAAK,CAAC,SAAS,UAAU,QAAQ;IACnC;IAEA;;;;;;;GAOC,GACD,OAAe,gBAAgB,GAAW,EAAkB;QAC1D,IAAI,CAAC,IAAI,UAAU,CAAC,QAClB,MAAM,IAAI,MAAM;QAGlB,MAAM,UAAU,IAAI,SAAS,CAAC;QAC9B,MAAM,UAAU,QAAQ,OAAO,CAAC;QAChC,IAAI,UAAU,GACZ,MAAM,IAAI,MAAM;QAGlB,MAAM,UAAU,QAAQ,SAAS,CAAC,GAAG;QACrC,MAAM,YAAY,QAAQ,SAAS,CAAC,UAAU;QAE9C,MAAM,MAAM,IAAI,IAAI;QACpB,MAAM,YAAY,IAAI,YAAY,CAAC,GAAG,CAAC;QACvC,MAAM,SAAS,IAAI,YAAY,CAAC,GAAG,CAAC;QAEpC,IAAI,CAAC,aAAa,CAAC,QACjB,MAAM,IAAI,MAAM;QAGlB,OAAO;qBACL;YACA,UAAU,IAAI,MAAM,GAAG,IAAI,QAAQ;oBACnC;uBACA;QACF;IACF;IAEA;;;;;;GAMC,GACD,MAAsB,QAAQ,YAAY,KAAM,EAAqB;QACnE,IAAI;YACF,MAAM,KAAK,CAAC,QAAQ;YAEpB,IAAI,UAAU,MAAM,IAAI,CAAC,WAAW,CAAW,iBAAiB;gBAAC,IAAI,CAAC,SAAS;aAAC,EAAE;gBAAE,WAAW;gBAAO,SAAS;YAAU;YACzH,IAAI,CAAC,SACH,MAAM,IAAI,MAAM;YAGlB,IAAI,CAAC,SAAS;YACd,OAAO;QACT,EAAE,OAAO,GAAG;YACV,KAAK,CAAC;YACN,MAAM;QACR;IACF;IAEA;;;;;;;GAOC,GACD,MAAa,YAAY,aAAqB,EAAE,YAAY,KAAM,EAAoB;QACpF,iCAAiC;QACjC,IAAI,UAAU,MAAM,IAAI,CAAC,WAAW,CAAU,kBAAkB;YAAC,IAAI,CAAC,SAAS;SAAC,EAAE;YAAE,WAAW;YAAO,SAAS;QAAU;QACzH,IAAI,CAAC,SACH,MAAM,IAAI,MAAM;QAGlB,8BAA8B;QAC9B,MAAM,IAAI,CAAC,gBAAgB,CAAC,oBAAoB;YAAC;SAAc;QAE/D,OAAO;IACT;IAEA;;;;GAIC,GACD,AAAO,cAAc,OAAqE,EAAQ;QAChG,IAAI,CAAC,EAAE,CAAC,sBAAsB;IAChC;IAEA;;;;GAIC,GACD,AAAO,aAAa,OAAuC,EAAQ;QACjE,IAAI,CAAC,EAAE,CAAC,qBAAqB;IAC/B;IAEA;;;;GAIC,GACD,AAAO,WAAW,OAAqE,EAAQ;QAC7F,IAAI,CAAC,EAAE,CAAC,mBAAmB;IAC7B;IAEA;;;;GAIC,GACD,AAAO,kBAAkB,OAAwE,EAAQ;QACvG,IAAI,CAAC,EAAE,CAAC,0BAA0B;IACpC;IAEA;;;;GAIC,GACD,AAAO,kBAAkB,OAAwE,EAAQ;QACvG,IAAI,CAAC,EAAE,CAAC,0BAA0B;IACpC;IAEA;;;;GAIC,GACD,AAAO,gBAAgB,OAA2E,EAAQ;QACxG,IAAI,CAAC,EAAE,CAAC,wBAAwB;IAClC;AACF;;;;;AKvIe,uDAA6B,CAAA,GAAA,wCAAW;IAIrD;;;;;;GAMC,GACD,YAAY,QAAgB,EAAE,AAAQ,OAAiB,EAAE,UAAU,GAAG,CAAE;QACtE,KAAK,CAAC,SAAS,UAAU,CAAA,GAAA,wCAAU,EAAE,cAAc,UADf,UAAA;IAEtC;IAEA;;;;;;GAMC,GACD,MAAsB,QAAQ,YAAY,KAAM,EAAiB;QAC/D,IAAI;YACF,MAAM,KAAK,CAAC,QAAQ;YACpB,IAAI,YAAY,MAAM,IAAI,CAAC,WAAW,CAAC,oBAAoB;gBAAC,IAAI,CAAC,OAAO;aAAC,EAAE;gBAAE,WAAW;gBAAO,SAAS;YAAU;YAClH,IAAI,OAAO,cAAc,UACvB,MAAM,IAAI,MAAM;YAElB,IAAI,CAAC,SAAS,GAAG;YACjB,IAAI,CAAC,SAAS;QAChB,EAAE,OAAO,GAAG;YACV,KAAK,CAAC;YACN,MAAM;QACR;IACF;IAEA;;GAEC,GACD,AAAgB,aAAmB;QACjC,IAAI,CAAC,mBAAmB;QACxB,KAAK,CAAC;IACR;IAEA;;;;;;GAMC,GACD,AAAO,gBAAwB;QAC7B,OAAO,CAAC,GAAG,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC,EAAE,IAAI,CAAC,QAAQ,CAAC,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,CAAC,MAAM,EAAE;IAC9F;IAEA;;;;;;GAMC,GACD,MAAa,cAAc,YAAY,KAAM,EAAmB;QAC9D,IAAI,IAAI,CAAC,2BAA2B,EAClC,MAAM,IAAI,MAAM;QAGlB,IAAI,CAAC,2BAA2B,GAAG,IAAI;QACvC,IAAI,UAAE,MAAM,EAAE,GAAG,IAAI,CAAC,2BAA2B;QAEjD,OAAO,IAAI,QAAQ,CAAC,SAAS;YAC3B,IAAI,QAAQ,WAAW;gBACrB;gBACA,OAAO,IAAI,MAAM;YACnB,GAAG;YAEH,MAAM,UAAU,CAAC;gBACf;gBACA,QAAQ;YACV;YAEA,MAAM,UAAU;gBACd,aAAa;gBACb,IAAI,CAAC,GAAG,CAAC;gBACT,IAAI,CAAC,2BAA2B,GAAG;YACrC;YAEA,IAAI,CAAC,EAAE,CAAC,oBAAoB;YAE5B,OAAO,gBAAgB,CAAC,SAAS;gBAC/B;gBACA,OAAO,IAAI,MAAM;YACnB;QACF;IACF;IAEA;;GAEC,GACD,AAAO,sBAA4B;QACjC,IAAI,CAAC,2BAA2B,EAAE;IACpC;IAEA;;;;;;;;;GASC,GACD,MAAa,YAAY,OAAe,EAAE,OAAe,EAAE,YAAY,KAAM,EAAE,MAAoB,EAAmB;QACpH,IAAI,CAAC,IAAI,CAAC,SAAS,EACjB,MAAM,IAAI,MAAM;QAElB,OAAO,IAAI,CAAC,WAAW,CAAC,sBAAsB;qBAAE;qBAAS;QAAQ,GAAG;YAAE,SAAS;oBAAW;QAAO;IACnG;IAEA;;;;;;;GAOC,GACD,MAAa,WAAW,YAAY,KAAM,EAAE,MAAoB,EAAmB;QACjF,IAAI,CAAC,IAAI,CAAC,SAAS,EACjB,MAAM,IAAI,MAAM;QAElB,OAAO,IAAI,CAAC,WAAW,CAAC,qBAAqB,EAAE,EAAE;YAAE,SAAS;oBAAW;QAAO;IAChF;IAEA;;;;;;;;;GASC,GACD,MAAa,SAAS,OAAe,EAAE,KAAa,EAAE,YAAY,KAAM,EAAE,MAAoB,EAAoB;QAChH,IAAI,CAAC,IAAI,CAAC,SAAS,EACjB,MAAM,IAAI,MAAM;QAElB,OAAO,IAAI,CAAC,WAAW,CAAC,mBAAmB;qBAAE;mBAAS;QAAM,GAAG;YAAE,SAAS;oBAAW;QAAO;IAC9F;IAEA;;;;;;;;;;;;GAYC,GACD,MAAa,gBAAgB,OAAe,EAAE,GAAW,EAAE,MAAe,EAAE,OAAgB,EAAE,SAAmB,EAAE,YAAY,KAAM,EAAE,MAAoB,EAAmB;QAC5K,IAAI,CAAC,IAAI,CAAC,SAAS,EACjB,MAAM,IAAI,MAAM;QAElB,OAAO,IAAI,CAAC,WAAW,CAAC,0BAA0B;qBAAE;iBAAS;oBAAK;qBAAQ;uBAAS;QAAU,GAAG;YAAE,SAAS;oBAAW;QAAO;IAC/H;IAEA;;;;;;;;;;;GAWC,GACD,MAAa,gBAAgB,IAAY,EAAE,EAA0B,EAAE,UAAmB,EAAE,IAAa,EAAE,YAAY,KAAM,EAAE,MAAoB,EAAmB;QACpK,IAAI,CAAC,IAAI,CAAC,SAAS,EACjB,MAAM,IAAI,MAAM;QAElB,OAAO,IAAI,CAAC,WAAW,CAAC,0BAA0B;kBAAE;gBAAM;wBAAI;kBAAY;QAAK,GAAG;YAAE,SAAS;oBAAW;QAAO;IACjH;IAEA;;;;;;;;GAQC,GACD,MAAa,cAAc,OAAe,EAAE,YAAY,KAAM,EAAE,MAAoB,EAAoB;QACtG,IAAI,CAAC,IAAI,CAAC,SAAS,EACjB,MAAM,IAAI,MAAM;QAElB,OAAO,IAAI,CAAC,WAAW,CAAC,wBAAwB;qBAAE;QAAQ,GAAG;YAAE,SAAS;oBAAW;QAAO;IAC5F;AACF;;","sources":["src/index.ts","src/providers/dapp-provider.ts","src/providers/peer-provider.ts","src/clients/jsonrpc-ws-client.ts","src/utils/crypto-utils.ts","src/clients/jsonrpc-error.ts","src/providers/wallet-provider.ts"],"sourcesContent":["export { default as DAppProvider } from './providers/dapp-provider';\r\nexport { default as WalletProvider } from './providers/wallet-provider';\r\nexport { JsonRpcError, JsonRpcErrorCode } from './clients/jsonrpc-error';\r\n\r\nexport type * from './types';","import type { AddTokenRequest, DAppInfo, SendTransactionRequest, SessionDetails, SignMessageRequest, SignTransactionRequest, SwitchNetworkRequest } from \"../types\";\r\nimport PeerProvider from \"./peer-provider\";\r\n\r\n/**\r\n * A provider for wallet apps to connect with dApps.\r\n * \r\n * This class is used by a wallet to establish a session with a dApp using a pairing URI.\r\n * \r\n * @example\r\n * ```typescript\r\n * // Wallet-side implementation\r\n * const provider = new DAppProvider(\"wl:1@relay.net/...\");\r\n * const dAppInfo = await provider.connect();\r\n * console.log(\"Connected to dApp:\", dAppInfo.name);\r\n * ```\r\n */\r\nexport default class DAppProvider extends PeerProvider {\r\n\r\n  /**\r\n   * Creates an instance of DAppProvider.\r\n   * \r\n   * @param pairingURI - The dApp pairing URI, usually scanned from a QR code.\r\n   */\r\n  constructor(pairingURI: string) {\r\n    let { version, relayUrl, secret, sessionId } = DAppProvider.parsePairingURI(pairingURI);\r\n    super(version, relayUrl, secret, sessionId);\r\n  }\r\n\r\n  /**\r\n   * Parses a pairing URI to extract session details.\r\n   * \r\n   * @param uri - The pairing URI.\r\n   * @returns The session details.\r\n   * @throws If the URI is invalid.\r\n   * @internal\r\n   */\r\n  private static parsePairingURI(uri: string): SessionDetails {\r\n    if (!uri.startsWith(\"wl:\")) {\r\n      throw new Error(\"Invalid pairing uri prefix\");\r\n    }\r\n\r\n    const uriBody = uri.substring(3);\r\n    const atIndex = uriBody.indexOf('@');\r\n    if (atIndex < 0) {\r\n      throw new Error(\"Invalid pairing uri: missing version\");\r\n    }\r\n\r\n    const version = uriBody.substring(0, atIndex);\r\n    const relayPart = uriBody.substring(atIndex + 1);\r\n\r\n    const url = new URL(relayPart);\r\n    const sessionId = url.searchParams.get(\"session\");\r\n    const secret = url.searchParams.get(\"secret\");\r\n\r\n    if (!sessionId || !secret) {\r\n      throw new Error(\"Missing session or secret\");\r\n    }\r\n\r\n    return {\r\n      version,\r\n      relayUrl: url.origin + url.pathname,\r\n      secret,\r\n      sessionId,\r\n    };\r\n  }\r\n\r\n  /**\r\n   * Connects to the relay server and retrieves the dApp info from the wallet.\r\n   * \r\n   * @param timeoutMs - The connection timeout in milliseconds. Default 10_000ms\r\n   * @returns A promise that resolves with the dApp information.\r\n   * @throws If the connection fails or no app info is received.\r\n   */\r\n  public override async connect(timeoutMs = 10_000): Promise<DAppInfo> {\r\n    try {\r\n      await super.connect(timeoutMs);\r\n\r\n      let appInfo = await this.sendRequest<DAppInfo>(\"wl_getAppInfo\", [this.sessionId], { encrypted: false, timeout: timeoutMs });\r\n      if (!appInfo) {\r\n        throw new Error(\"No app info received\");\r\n      }\r\n\r\n      this.keepAlive();\r\n      return appInfo;\r\n    } catch (e) {\r\n      super.disconnect();\r\n      throw e;\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Notifies the dApp that the wallet has joined the session.\r\n   * \r\n   * @param walletAddress - The address of the wallet joining the session.\r\n   * @param timeoutMs - The request timeout in milliseconds. Default 10_000ms\r\n   * @returns A promise that resolves to true if the notification was sent successfully.\r\n   * @throws If the operation fails.\r\n   */\r\n  public async joinSession(walletAddress: string, timeoutMs = 10_000): Promise<boolean> {\r\n    // Notify the relay (unencrypted)\r\n    let success = await this.sendRequest<boolean>(\"wl_joinSession\", [this.sessionId], { encrypted: false, timeout: timeoutMs });\r\n    if (!success) {\r\n      throw new Error(\"Failed to join session\");\r\n    }\r\n\r\n    // Notify the dApp (encrypted)\r\n    await this.sendNotification(\"wl_sessionJoined\", [walletAddress]);\r\n\r\n    return success;\r\n  }\r\n\r\n  /**\r\n   * Registers a handler for the \"wallet_signMessage\" request from the dApp.\r\n   * \r\n   * @param handler - The function to handle the sign message request.\r\n   */\r\n  public onSignMessage(handler: (signMsgReq: SignMessageRequest) => Promise<string> | string): void {\r\n    this.on(\"wallet_signMessage\", handler);\r\n  }\r\n\r\n  /**\r\n   * Registers a handler for the \"wallet_getAccount\" request from the dApp.\r\n   * \r\n   * @param handler - The function to handle the get account request.\r\n   */\r\n  public onGetAccount(handler: () => Promise<string> | string): void {\r\n    this.on(\"wallet_getAccount\", handler);\r\n  }\r\n\r\n  /**\r\n   * Registers a handler for the \"wallet_addToken\" request from the dApp.\r\n   * \r\n   * @param handler - The function to handle the add token request.\r\n   */\r\n  public onAddToken(handler: (addTokenReq: AddTokenRequest) => Promise<boolean> | boolean): void {\r\n    this.on(\"wallet_addToken\", handler);\r\n  }\r\n\r\n  /**\r\n   * Registers a handler for the \"wallet_signTransaction\" request from the dApp.\r\n   * \r\n   * @param handler - The function to handle the sign transaction request.\r\n   */\r\n  public onSignTransaction(handler: (signTxReq: SignTransactionRequest) => Promise<string> | string): void {\r\n    this.on(\"wallet_signTransaction\", handler);\r\n  }\r\n\r\n  /**\r\n   * Registers a handler for the \"wallet_sendTransaction\" request from the dApp.\r\n   * \r\n   * @param handler - The function to handle the send transaction request.\r\n   */\r\n  public onSendTransaction(handler: (sendTxReq: SendTransactionRequest) => Promise<string> | string): void {\r\n    this.on(\"wallet_sendTransaction\", handler);\r\n  }\r\n\r\n  /**\r\n   * Registers a handler for the \"wallet_switchNetwork\" request from the dApp.\r\n   * \r\n   * @param handler - The function to handle the switch network request.\r\n   */\r\n  public onSwitchNetwork(handler: (switchNetReq: SwitchNetworkRequest) => Promise<boolean> | boolean): void {\r\n    this.on(\"wallet_switchNetwork\", handler);\r\n  }\r\n}","import JsonRpcWsClient from \"../clients/jsonrpc-ws-client\";\r\nimport type { DAppInfo, JsonRpcParams, RequestOptions, RpcHandler, SessionDetails } from \"../types\";\r\n\r\nexport default abstract class PeerProvider {\r\n\r\n  private client: JsonRpcWsClient;\r\n\r\n  protected relayUrl: string;\r\n  protected secret: string;\r\n  protected sessionId: string;\r\n  protected version: string;\r\n\r\n  /**\r\n   * Creates an instance of PeerProvider.\r\n   * \r\n   * @param version - The protocol version.\r\n   * @param relayUrl - The URL of the relay server.\r\n   * @param secret - The shared secret for encryption.\r\n   * @param sessionId - The session ID. Defaults to an empty string.\r\n   */\r\n  constructor(version: string, relayUrl: string, secret: string, sessionId = \"\") {\r\n    this.version = version;\r\n    this.relayUrl = relayUrl;\r\n    this.secret = secret;\r\n    this.sessionId = sessionId;\r\n    this.client = new JsonRpcWsClient(this.relayUrl, this.secret);\r\n  }\r\n\r\n  public getSessionInfo(): SessionDetails {\r\n    return {\r\n      version: this.version,\r\n      relayUrl: this.relayUrl,\r\n      sessionId: this.sessionId,\r\n      secret: this.secret\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Connects to the relay server.\r\n   * \r\n   * @param timeoutMs - The connection timeout in milliseconds. Default is 10,000ms.\r\n   * @returns A promise that resolves when the connection is established.\r\n   */\r\n  public async connect(timeoutMs = 10_000): Promise<void | DAppInfo> {\r\n    return this.client.connect(timeoutMs);\r\n  }\r\n\r\n  public disconnect(): void {\r\n    this.client.disconnect();\r\n  }\r\n\r\n  protected keepAlive(): void {\r\n    this.client.startKeepAlive();\r\n  }\r\n\r\n  /**\r\n   * Sends a JSON-RPC request to the peer.\r\n   * \r\n   * @param method - The RPC method name.\r\n   * @param params - The RPC method parameters.\r\n   * @param options - The request options, including timeout. Default timeout is 30,000ms.\r\n   * @returns A promise that resolves with the result of the RPC method.\r\n   */\r\n  public async sendRequest<T>(method: string, params: JsonRpcParams, options: RequestOptions = { timeout: 30_000 }): Promise<T> {\r\n    return this.client.request(method, params, options);\r\n  }\r\n\r\n  /**\r\n   * Sends a JSON-RPC notification to the peer.\r\n   * \r\n   * @param method - The RPC method name.\r\n   * @param params - The RPC method parameters.\r\n   */\r\n  public async sendNotification(method: string, params: JsonRpcParams): Promise<void> {\r\n    await this.client.notify(method, params);\r\n  }\r\n\r\n  /**\r\n   * Registers a handler for a specific RPC method.\r\n   * \r\n   * @param method - The RPC method name.\r\n   * @param handler - The function to handle the RPC request.\r\n   */\r\n  public on(method: string, handler: RpcHandler): void {\r\n    this.client.on(method, handler);\r\n  }\r\n\r\n  /**\r\n   * Removes a handler for a specific RPC method.\r\n   * \r\n   * @param method - The RPC method name.\r\n   */\r\n  public off(method: string): void {\r\n    this.client.off(method);\r\n  }\r\n\r\n  /**\r\n   * Registers a handler for when the peer disconnects from the session.\r\n   * \r\n   * @param handler - The function to handle the peer disconnection.\r\n   */\r\n  public onPeerDisconnect(handler: () => Promise<void> | void): void {\r\n    this.on('wl_sessionLeft', handler);\r\n  }\r\n\r\n  /**\r\n   * Registers a handler for when the WebSocket connection is closed.\r\n   * \r\n   * @param handler - The function to handle the connection close event.\r\n   */\r\n  public onClose(handler: () => void): void {\r\n    this.client.onClose(handler);\r\n  }\r\n}","import WebSocket from \"isomorphic-ws\";\r\nimport CryptoUtils from \"../utils/crypto-utils\";\r\nimport type { JsonRpcErrorData, JsonRpcNotification, JsonRpcParams, JsonRpcRequest, JsonRpcResponse, RequestOptions, RpcHandler } from \"../types\";\r\nimport { JsonRpcError, JsonRpcErrorCode } from \"./jsonrpc-error\";\r\n\r\nexport default class JsonRpcWsClient {\r\n\r\n  private ws!: WebSocket;\r\n  private pending = new Map<string, { resolve: (res: any) => void; reject: (err: JsonRpcError) => void }>();\r\n  private handlers = new Map<string, RpcHandler>();\r\n  private nextId = 1;\r\n\r\n  private pingInterval = 15000;\r\n  private pingIntervalId?: ReturnType<typeof setInterval>;\r\n\r\n  private onCloseHandler?: () => void;\r\n\r\n  constructor(private url: string, private secret: string) {}\r\n\r\n  private initializeWebSocket(): void {\r\n    this.ws = new WebSocket(this.url);\r\n\r\n    this.ws.onmessage = async (event) => {\r\n      let msg: string;\r\n      try {\r\n        msg = await CryptoUtils.decrypt(event.data as string, this.secret);\r\n      } catch {\r\n        // If decrypt fails, assume it's unencrypted JSON (i.e., relay message)\r\n        msg = event.data as string;\r\n      }\r\n      this.handleMessage(msg);\r\n    };\r\n\r\n    this.ws.onclose = () => {\r\n      this.stopKeepAlive();\r\n      for (let [, { reject }] of this.pending.entries()) {\r\n        reject(new JsonRpcError(JsonRpcErrorCode.ConnectionClosed, 'Connection closed.'));\r\n      }\r\n      this.pending.clear();\r\n      if (this.onCloseHandler) {\r\n        this.onCloseHandler();\r\n      }\r\n    };\r\n\r\n    this.ws.onerror = () => {\r\n      this.ws.close();\r\n    };\r\n  }\r\n\r\n  public async connect(timeout: number): Promise<void> {\r\n    this.initializeWebSocket();\r\n\r\n    if (this.ws.readyState !== WebSocket.OPEN) {\r\n      await new Promise<void>((resolve, reject) => {\r\n        const timeoutId = setTimeout(() => {\r\n          this.ws.onopen = null;\r\n          this.ws.onerror = null;\r\n          if (this.ws.readyState !== WebSocket.CLOSED) {\r\n            this.ws.close();\r\n          }\r\n          reject(new JsonRpcError(JsonRpcErrorCode.RequestTimeout, `Connection timeout.`));\r\n        }, timeout);\r\n\r\n        const originalOnError = this.ws.onerror;\r\n\r\n        this.ws.onopen = () => {\r\n          clearTimeout(timeoutId);\r\n          this.ws.onerror = originalOnError;\r\n          resolve();\r\n        };\r\n\r\n        this.ws.onerror = () => {\r\n          clearTimeout(timeoutId);\r\n          this.ws.onerror = originalOnError;\r\n          reject(new JsonRpcError(JsonRpcErrorCode.RequestFailed, 'Connection failed.'));\r\n        };\r\n      });\r\n    }\r\n  }\r\n\r\n  public disconnect(): void {\r\n    this.stopKeepAlive();\r\n    if (this.ws && this.ws.readyState === WebSocket.OPEN) {\r\n      this.ws.close();\r\n    }\r\n  }\r\n\r\n  public onClose(handler: () => void): void {\r\n    this.onCloseHandler = handler;\r\n  }\r\n\r\n  public startKeepAlive(): void {\r\n    if (this.pingIntervalId) {\r\n      return;\r\n    }\r\n  \r\n    this.pingIntervalId = setInterval(() => {\r\n      this.send(JSON.stringify({\r\n        jsonrpc: '2.0',\r\n        id: \"keepAlive\",\r\n        method: 'wl_ping'\r\n      }));\r\n    }, this.pingInterval);\r\n  }\r\n\r\n  private stopKeepAlive(): void {\r\n    if (this.pingIntervalId) {\r\n      clearInterval(this.pingIntervalId);\r\n      this.pingIntervalId = undefined;\r\n    }\r\n  }\r\n\r\n  private send(data: string): void {\r\n    if (this.ws.readyState !== WebSocket.OPEN) {\r\n      throw new JsonRpcError(JsonRpcErrorCode.ConnectionClosed, 'Connection closed.')\r\n    }\r\n    this.ws.send(data);\r\n  }\r\n\r\n  public async request<T>(method: string, params: JsonRpcParams, options: RequestOptions): Promise<T> {\r\n    let id = (this.nextId++).toString();\r\n    let payload: JsonRpcRequest = { jsonrpc: '2.0', id, method, params };\r\n    let raw = JSON.stringify(payload);\r\n    let msg = options?.encrypted === false ? raw : await CryptoUtils.encrypt(raw, this.secret);\r\n    this.send(msg);\r\n\r\n    return new Promise((resolve, reject) => {\r\n      const cleanUp = (): void => {\r\n        clearTimeout(timeoutId);\r\n        options.signal?.removeEventListener('abort', onAbort);\r\n        this.pending.delete(id);\r\n      };\r\n\r\n      const onAbort = (): void => {\r\n        cleanUp();\r\n        reject(new JsonRpcError(JsonRpcErrorCode.RequestCancelled, 'Request was cancelled.'));\r\n      };\r\n\r\n      const timeoutId = setTimeout(() => {\r\n        cleanUp();\r\n        reject(new JsonRpcError(JsonRpcErrorCode.RequestTimeout, 'Request timeout.'));\r\n      }, options.timeout);\r\n\r\n      // If already aborted, cancel immediately\r\n      if (options?.signal?.aborted) {\r\n        onAbort();\r\n        return;\r\n      }\r\n      options.signal?.addEventListener('abort', onAbort);\r\n\r\n      this.pending.set(id, {\r\n        resolve: (result: T) => {\r\n          cleanUp();\r\n          resolve(result);\r\n        },\r\n        reject: (err: JsonRpcError) => {\r\n          cleanUp();\r\n          reject(err);\r\n        }\r\n      });\r\n    });\r\n  }\r\n\r\n  async notify(method: string, params: JsonRpcParams): Promise<void> {\r\n    let payload: JsonRpcNotification = { jsonrpc: '2.0', method, params };\r\n    let encrypted = await CryptoUtils.encrypt(JSON.stringify(payload), this.secret);\r\n    this.send(encrypted);\r\n  }\r\n\r\n  public on(method: string, handler: RpcHandler): void {\r\n    this.handlers.set(method, handler);\r\n  }\r\n\r\n  public off(method: string): void {\r\n    this.handlers.delete(method);\r\n  }\r\n\r\n  private async handleMessage(raw: string): Promise<void> {\r\n    let msg = JSON.parse(raw);\r\n    if (this.isJsonRpcResponse(msg)) {\r\n      let cb = this.pending.get(msg.id);\r\n      if (cb) {\r\n        this.pending.delete(msg.id);\r\n        if (msg.error) {\r\n          cb.reject(new JsonRpcError(msg.error.code, msg.error.message));\r\n        } else {\r\n          cb.resolve(msg.result);\r\n        }\r\n      }\r\n    } else if (this.isJsonRpcRequest(msg) || this.isJsonRpcNotification(msg)) {\r\n      let handler = this.handlers.get(msg.method);\r\n      if (handler) {\r\n        let { result, error } = await this.processMessage(msg, handler);\r\n        if (!this.isJsonRpcRequest(msg)) {\r\n          return; // Notifications do not require a response\r\n        }\r\n\r\n        if (!result && !error) {\r\n          error = { code: JsonRpcErrorCode.InvalidResponse, message: \"Handler returned neither result nor error\" };\r\n        }\r\n        let response: JsonRpcResponse = { jsonrpc: '2.0', id: msg.id, result, error };\r\n        let encrypted = await CryptoUtils.encrypt(JSON.stringify(response), this.secret);\r\n        this.send(encrypted);\r\n      }\r\n    }\r\n  }\r\n\r\n  private async processMessage(msg: JsonRpcRequest | JsonRpcNotification, handler: RpcHandler): Promise<{ result?: any; error?: JsonRpcErrorData }> {\r\n    let result, error: JsonRpcErrorData | undefined;\r\n    try {\r\n      if (Array.isArray(msg.params)) {\r\n        result = await handler(...msg.params);\r\n      } else if (msg.params && typeof msg.params === 'object') {\r\n        result = await handler(msg.params);\r\n      } else {\r\n        result = await handler(); // handles undefined/null\r\n      }\r\n\r\n      if (this.isJsonRpcErrorData(result)) {\r\n        error = { code: result.code, message: result.message };\r\n        result = undefined;\r\n      }\r\n    } catch (err) {\r\n      if (this.isJsonRpcErrorData(err)) {\r\n        error = { code: err.code, message: err.message };\r\n      } else {\r\n        error = { code: JsonRpcErrorCode.RequestFailed, message: `Request failed. ${err instanceof Error ? err.message : ''}` };\r\n      }\r\n    }\r\n  \r\n    return { result, error };\r\n  }\r\n\r\n  private isJsonRpcResponse(msg: unknown): msg is JsonRpcResponse {\r\n    return (\r\n      typeof msg === 'object' && msg !== null &&\r\n      'jsonrpc' in msg && msg.jsonrpc === '2.0' &&\r\n      'id' in msg &&\r\n      ('result' in msg || 'error' in msg)\r\n    );\r\n  }\r\n\r\n  private isJsonRpcRequest(msg: unknown): msg is JsonRpcRequest {\r\n    return (\r\n      typeof msg === 'object' && msg !== null &&\r\n      'jsonrpc' in msg && msg.jsonrpc === '2.0' &&\r\n      'id' in msg &&\r\n      'method' in msg\r\n    );\r\n  }\r\n\r\n  private isJsonRpcNotification(msg: unknown): msg is JsonRpcNotification {\r\n    return (\r\n      typeof msg === 'object' && msg !== null &&\r\n      'jsonrpc' in msg && msg.jsonrpc === '2.0' &&\r\n      'method' in msg &&\r\n      !('id' in msg)\r\n    );\r\n  }\r\n\r\n  private isJsonRpcErrorData(data: unknown): data is JsonRpcErrorData {\r\n    return (\r\n      typeof data === 'object' && data !== null &&\r\n      'code' in data && typeof data.code === 'number' &&\r\n      'message' in data && typeof data.message === 'string'\r\n    );\r\n  }\r\n}","export default class CryptoUtils {\r\n\r\n  private static encoder = new TextEncoder();\r\n  private static decoder = new TextDecoder();\r\n\r\n  public static generateSecret(): string {\r\n    let array = new Uint8Array(16);\r\n    crypto.getRandomValues(array);\r\n    return Array.from(array)\r\n      .map(b => b.toString(16).padStart(2, '0'))\r\n      .join('');\r\n  }\r\n\r\n  public static async encrypt(message: string, secret: string): Promise<string> {\r\n    let salt = crypto.getRandomValues(new Uint8Array(16));\r\n    let iv = crypto.getRandomValues(new Uint8Array(12));\r\n    let key = await this.deriveKey(secret, salt);\r\n\r\n    let encodedMessage = this.encoder.encode(message);\r\n    let ciphertext = await crypto.subtle.encrypt(\r\n      {\r\n        name: 'AES-GCM',\r\n        iv,\r\n      },\r\n      key,\r\n      encodedMessage\r\n    );\r\n\r\n    let combined = this.concatBuffers([salt, iv, new Uint8Array(ciphertext)]);\r\n    return this.base64Encode(combined);\r\n  }\r\n\r\n  public static async decrypt(encMessage: string, secret: string): Promise<string> {\r\n    let data = this.base64Decode(encMessage);\r\n    let salt = data.slice(0, 16);\r\n    let iv = data.slice(16, 28);\r\n    let ciphertext = data.slice(28);\r\n\r\n    let key = await this.deriveKey(secret, salt);\r\n\r\n    let decrypted = await crypto.subtle.decrypt(\r\n      {\r\n        name: 'AES-GCM',\r\n        iv,\r\n      },\r\n      key,\r\n      ciphertext\r\n    );\r\n\r\n    return this.decoder.decode(decrypted);\r\n  }\r\n\r\n  private static async deriveKey(secret: string, salt: Uint8Array<ArrayBuffer>): Promise<CryptoKey> {\r\n    let encodedSecret = this.encoder.encode(secret);\r\n    let baseKey = await crypto.subtle.importKey(\r\n      'raw',\r\n      encodedSecret,\r\n      'PBKDF2',\r\n      false,\r\n      ['deriveKey']\r\n    );\r\n\r\n    return crypto.subtle.deriveKey(\r\n      {\r\n        name: 'PBKDF2',\r\n        salt,\r\n        iterations: 100_000,\r\n        hash: 'SHA-256',\r\n      },\r\n      baseKey,\r\n      {\r\n        name: 'AES-GCM',\r\n        length: 256,\r\n      },\r\n      false,\r\n      ['encrypt', 'decrypt']\r\n    );\r\n  }\r\n\r\n  private static concatBuffers(buffers: Uint8Array[]): Uint8Array {\r\n    let totalLength = buffers.reduce((sum, b) => sum + b.length, 0);\r\n    let result = new Uint8Array(totalLength);\r\n    let offset = 0;\r\n    for (let b of buffers) {\r\n      result.set(b, offset);\r\n      offset += b.length;\r\n    }\r\n    return result;\r\n  }\r\n\r\n  private static base64Encode(data: Uint8Array): string {\r\n    return btoa(String.fromCharCode(...data));\r\n  }\r\n\r\n  private static base64Decode(b64: string): Uint8Array {\r\n    let binary = atob(b64);\r\n    let len = binary.length;\r\n    let bytes = new Uint8Array(len);\r\n    for (let i = 0; i < len; i++) {\r\n      bytes[i] = binary.charCodeAt(i);\r\n    }\r\n    return bytes;\r\n  }\r\n}","export enum JsonRpcErrorCode {\r\n  // Standard JSON-RPC error codes\r\n  ParseError = -32700,\r\n  InvalidRequest = -32600,\r\n  MethodNotFound = -32601,\r\n  InvalidParams = -32602,\r\n  InternalError = -32603,\r\n\r\n  // Custom error codes\r\n  RequestFailed = -32000,\r\n  RequestCancelled = -32001,\r\n  RequestRejected = -32003,\r\n  SessionNotFound = -32004,\r\n  RequestTimeout = -32008,\r\n  SessionConflict = -32009,\r\n  ConnectionClosed = -32010,\r\n  InvalidResponse = -32052,\r\n}\r\n\r\nexport class JsonRpcError extends Error {\r\n\r\n  constructor(public readonly code: number, message: string) {\r\n    super(message);\r\n    this.name = \"JsonRpcError\";\r\n  }\r\n}","import type { DAppInfo, TransactionRecipient } from \"../types\";\r\nimport CryptoUtils from \"../utils/crypto-utils\";\r\nimport PeerProvider from \"./peer-provider\";\r\n\r\n/**\r\n * A provider for dApps to connect with wallet applications.\r\n * \r\n * This class is used by a dApp to create a session and interact with a wallet.\r\n * @example\r\n * ```typescript\r\n * // dApp-side implementation\r\n * const provider = new WalletProvider(\"wss://relay.example.com\", {\r\n *   name: \"My Awesome dApp\",\r\n *   description: \"This is a dApp.\",\r\n *   url: \"https://dapp.example.com\",\r\n *   icon: \"https://dapp.example.com/icon.png\"\r\n * });\r\n *\r\n * await provider.connect();\r\n * const uri = provider.getPairingURI();\r\n * // Display the URI as a QR code for the wallet to scan.\r\n *\r\n * const walletAddress = await provider.waitForWallet();\r\n * console.log(\"Wallet connected:\", walletAddress);\r\n *\r\n * const signedMessage = await provider.signMessage(walletAddress, \"Hello, Wallet!\");\r\n * console.log(\"Signed message:\", signedMessage);\r\n * ```\r\n */\r\nexport default class WalletProvider extends PeerProvider {\r\n\r\n  private walletWaiterAbortController?: AbortController;\r\n\r\n  /**\r\n   * Creates an instance of WalletProvider.\r\n   * \r\n   * @param relayUrl - The URL of the relay server.\r\n   * @param appInfo - Information about the dApp.\r\n   * @param version - The protocol version. Default is \"1\".\r\n   */\r\n  constructor(relayUrl: string, private appInfo: DAppInfo, version = \"1\") {\r\n    super(version, relayUrl, CryptoUtils.generateSecret());\r\n  }\r\n\r\n  /**\r\n   * Connects to the relay server and creates a new session.\r\n   * \r\n   * @param timeoutMs - The connection timeout in milliseconds. Default is 10,000ms.\r\n   * @returns A promise that resolves when the connection is established and the session is created.\r\n   * @throws If the connection or session creation fails.\r\n   */\r\n  public override async connect(timeoutMs = 10_000): Promise<void> {\r\n    try {\r\n      await super.connect(timeoutMs);\r\n      let sessionId = await this.sendRequest('wl_createSession', [this.appInfo], { encrypted: false, timeout: timeoutMs });\r\n      if (typeof sessionId !== 'string') {\r\n        throw new Error('Invalid session ID received from relay');\r\n      }\r\n      this.sessionId = sessionId;\r\n      this.keepAlive();\r\n    } catch (e) {\r\n      super.disconnect();\r\n      throw e;\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Disconnects from the relay server and cancels any pending wallet connection waits.\r\n   */\r\n  public override disconnect(): void {\r\n    this.cancelWaitForWallet();\r\n    super.disconnect();\r\n  }\r\n\r\n  /**\r\n   * Gets the pairing URI for the current session.\r\n   * \r\n   * This URI should be displayed as a QR code for the wallet to scan.\r\n   * \r\n   * @returns The pairing URI.\r\n   */\r\n  public getPairingURI(): string {\r\n    return `wl:${this.version}@${this.relayUrl}?session=${this.sessionId}&secret=${this.secret}`;\r\n  }\r\n\r\n  /**\r\n   * Waits for a wallet to join the session.\r\n   * \r\n   * @param timeoutMs - The timeout in milliseconds to wait for the wallet. Default is 30,000ms.\r\n   * @returns A promise that resolves with the wallet's address.\r\n   * @throws If the operation times out or is canceled.\r\n   */\r\n  public async waitForWallet(timeoutMs = 30_000): Promise<string> {\r\n    if (this.walletWaiterAbortController) {\r\n      throw new Error('Already waiting for wallet');\r\n    }\r\n\r\n    this.walletWaiterAbortController = new AbortController();\r\n    let { signal } = this.walletWaiterAbortController;\r\n\r\n    return new Promise((resolve, reject) => {\r\n      let timer = setTimeout(() => {\r\n        cleanup();\r\n        reject(new Error('Wallet connection timeout'));\r\n      }, timeoutMs);\r\n\r\n      const handler = (address: string): void => {\r\n        cleanup();\r\n        resolve(address);\r\n      };\r\n\r\n      const cleanup = (): void => {\r\n        clearTimeout(timer);\r\n        this.off('wl_sessionJoined');\r\n        this.walletWaiterAbortController = undefined;\r\n      };\r\n\r\n      this.on('wl_sessionJoined', handler);\r\n\r\n      signal.addEventListener('abort', () => {\r\n        cleanup();\r\n        reject(new Error('Wallet wait canceled'));\r\n      });\r\n    });\r\n  }\r\n\r\n  /**\r\n   * Cancels the wait for a wallet to connect.\r\n   */\r\n  public cancelWaitForWallet(): void {\r\n    this.walletWaiterAbortController?.abort();\r\n  }\r\n\r\n  /**\r\n   * Requests the connected wallet to sign a message.\r\n   * \r\n   * @param account - The account address to use for signing.\r\n   * @param message - The message to sign - as utf8 string hex representation.\r\n   * @param timeoutMs - The request timeout in milliseconds. Default is 30,000ms.\r\n   * @param signal - An AbortSignal to cancel the request.\r\n   * @returns A promise that resolves with the signed message.\r\n   * @throws If the wallet is not connected or the request fails.\r\n   */\r\n  public async signMessage(account: string, message: string, timeoutMs = 30_000, signal?: AbortSignal): Promise<string> {\r\n    if (!this.sessionId) {\r\n      throw new Error('Not connected to a wallet');\r\n    }\r\n    return this.sendRequest('wallet_signMessage', { account, message }, { timeout: timeoutMs, signal });\r\n  }\r\n\r\n  /**\r\n   * Requests the connected wallet's account address.\r\n   * \r\n   * @param timeoutMs - The request timeout in milliseconds. Default is 30,000ms.\r\n   * @param signal - An AbortSignal to cancel the request.\r\n   * @returns A promise that resolves with the account address.\r\n   * @throws If the wallet is not connected or the request fails.\r\n   */\r\n  public async getAccount(timeoutMs = 30_000, signal?: AbortSignal): Promise<string> {\r\n    if (!this.sessionId) {\r\n      throw new Error('Not connected to a wallet');\r\n    }\r\n    return this.sendRequest('wallet_getAccount', [], { timeout: timeoutMs, signal });\r\n  }\r\n\r\n  /**\r\n   * Requests the connected wallet to add a token to its tokens list.\r\n   * \r\n   * @param account - The account address.\r\n   * @param token - The token identifier to add.\r\n   * @param timeoutMs - The request timeout in milliseconds. Default is 30,000ms.\r\n   * @param signal - An AbortSignal to cancel the request.\r\n   * @returns A promise that resolves to true if the token was added successfully.\r\n   * @throws If the wallet is not connected or the request fails.\r\n   */\r\n  public async addToken(account: string, token: string, timeoutMs = 30_000, signal?: AbortSignal): Promise<boolean> {\r\n    if (!this.sessionId) {\r\n      throw new Error('Not connected to a wallet');\r\n    }\r\n    return this.sendRequest('wallet_addToken', { account, token }, { timeout: timeoutMs, signal });\r\n  }\r\n\r\n  /**\r\n   * Requests the connected wallet to sign a transaction.\r\n   * \r\n   * @param account - The account address to use for signing.\r\n   * @param hex - The transaction hex to sign.\r\n   * @param inputs - The number of inputs to sign. Sign all if undefined.\r\n   * @param outputs - The number of outputs to sign. Sign all if undefined.\r\n   * @param broadcast - Whether to broadcast the transaction after signing.\r\n   * @param timeoutMs - The request timeout in milliseconds. Default is 30,000ms.\r\n   * @param signal - An AbortSignal to cancel the request.\r\n   * @returns A promise that resolves with the signed transaction hex, or transaction ID if broadcast is `true`.\r\n   * @throws If the wallet is not connected or the request fails.\r\n   */\r\n  public async signTransaction(account: string, hex: string, inputs?: number, outputs?: number, broadcast?: boolean, timeoutMs = 30_000, signal?: AbortSignal): Promise<string> {\r\n    if (!this.sessionId) {\r\n      throw new Error('Not connected to a wallet');\r\n    }\r\n    return this.sendRequest('wallet_signTransaction', { account, hex, inputs, outputs, broadcast }, { timeout: timeoutMs, signal });\r\n  }\r\n\r\n  /**\r\n   * Requests the connected wallet to send a transaction.\r\n   * \r\n   * @param from - The sender's address.\r\n   * @param to - An array of recipients and amounts.\r\n   * @param feePerByte - The fee per byte for the transaction.\r\n   * @param data - Optional data to include in the transaction.\r\n   * @param timeoutMs - The request timeout in milliseconds. Default is 30,000ms.\r\n   * @param signal - An AbortSignal to cancel the request.\r\n   * @returns A promise that resolves with the transaction ID.\r\n   * @throws If the wallet is not connected or the request fails.\r\n   */\r\n  public async sendTransaction(from: string, to: TransactionRecipient[], feePerByte?: number, data?: string, timeoutMs = 30_000, signal?: AbortSignal): Promise<string> {\r\n    if (!this.sessionId) {\r\n      throw new Error('Not connected to a wallet');\r\n    }\r\n    return this.sendRequest('wallet_sendTransaction', { from, to, feePerByte, data }, { timeout: timeoutMs, signal });\r\n  }\r\n\r\n  /**\r\n   * Requests the connected wallet to switch to a different network.\r\n   * \r\n   * @param network - The network to switch to.\r\n   * @param timeoutMs - The request timeout in milliseconds. Default is 30,000ms.\r\n   * @param signal - An AbortSignal to cancel the request.\r\n   * @returns A promise that resolves to true if the network was switched successfully.\r\n   * @throws If the wallet is not connected or the request fails.\r\n   */\r\n  public async switchNetwork(network: string, timeoutMs = 30_000, signal?: AbortSignal): Promise<boolean> {\r\n    if (!this.sessionId) {\r\n      throw new Error('Not connected to a wallet');\r\n    }\r\n    return this.sendRequest('wallet_switchNetwork', { network }, { timeout: timeoutMs, signal });\r\n  }\r\n}"],"names":[],"version":3,"file":"index.cjs.map"}