@datagrok/bio 2.13.6 → 2.13.7

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.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"449.js","mappings":"kBAAIA,ECAAC,E,+BCmBG,IAAIC,GACX,SAAWA,GACPA,EAA6B,UAAI,YACjCA,EAA6B,UAAI,WACpC,CAHD,CAGGA,IAAsBA,EAAoB,CAAC,IACvC,MAAMC,EAA6B,CACtC,CAACD,EAAkBE,WAzBvB,SAAkCC,GAC9B,MAAO,0DAEoBA,sKAK/B,EAkBI,CAACH,EAAkBI,WAhBvB,SAAkCD,GAC9B,MAAO,0DAEoBA,6HAK/B,GCsTO,IAAIE,GACX,SAAWA,GACPA,EAAwB,QAAI,UAC5BA,EAA0B,UAAI,YAC9BA,EAA0B,UAAI,YAC9BA,EAAyB,SAAI,WAC7BA,EAA2B,WAAI,cAC/BA,EAAiC,iBAAI,oBACrCA,EAA0C,0BAAI,4BAC9CA,EAAsB,MAAI,QAC1BA,EAAuB,OAAI,SAC3BA,EAA2B,WAAI,aAC/BA,EAA2B,WAAI,aAC/BA,EAAuB,OAAI,SAC9B,CAbD,CAaGA,IAAmBA,EAAiB,CAAC,IACjC,MAAMC,EAAkB,CAC3B,CAACD,EAAeE,SA1Ub,SAAuBC,EAAeC,GACzC,MAAO,iDACmCA,4DACAA,6RAQrBD,oLAOPA,QAElB,EAuTI,CAACH,EAAeH,WAzIb,SAAyBQ,EAAcC,GAC1C,MAAO,oDAEcD,yGAKzB,EAkII,CAACL,EAAeD,WAjIb,SAAyBM,EAAcC,GAC1C,MAAO,oDAEcD,qFAKzB,EA0HI,CAACL,EAAeO,UAlGb,SAAgCF,EAAcC,GACjD,MAAO,gFAGcD,0RAWAA,2JAMzB,EA8EI,CAACL,EAAeQ,YAjSb,SAA0BH,EAAcD,GAC3C,MAAO,iDACmCA,4DACAA,+jBAULC,EAAe,kwCA0CxD,EA2OI,CAACL,EAAeS,kBA1Ob,SAA+BJ,EAAcD,GAKhD,MAAO,qDACuCA,gEACAA,+lBASLC,EAAe,0PAIvBA,EAAe,8CACbA,EAAe,kEAEGD,wEACUA,ofAUjBA,+pEA0DlD,EA+II,CAACJ,EAAeU,2BA3Tb,SAAuCP,EAAeC,GAGzD,MAAO,iDACmCA,4DACAA,2RAOCA,4FAEtBD,2MAOPA,QAElB,EAqSI,CAACH,EAAeW,OA1Cb,SAA6BN,EAAcC,GAC9C,MAAO,gFAGcD,2PASAA,2JAKzB,EAyBI,CAACL,EAAeY,QA9Db,SAA8BP,EAAcC,GAC/C,MAAO,gFAGcD,sSASAA,4IAKzB,EA6CI,CAACL,EAAea,YAlFb,SAAkCR,EAAcC,GACnD,MAAO,gFAGcD,2PASAA,oIAKzB,EAiEI,CAACL,EAAec,YAjHb,SAA+BX,EAAeC,GAEjD,MAAO,mCACqBA,6DAGhC,EA4GI,CAACJ,EAAee,QAjIb,SAA8BZ,EAAeC,GAChD,MAAO,iDACmCA,4DACAA,yLAW9C,GAqHaY,EAA6B,CACtC,CAAChB,EAAeE,SAAWe,GAAiBC,KAAKC,KAAKF,EAAe,IACrE,CAACjB,EAAeH,WAAaoB,GAAiBC,KAAKC,KAAKF,EAAe,IACvE,CAACjB,EAAeD,WAAakB,GAAiBC,KAAKC,KAAKF,EAAe,IACvE,CAACjB,EAAeO,UAAYU,GAAiBC,KAAKC,KAAKF,EAAe,IACtE,CAACjB,EAAeW,OAASM,GAAiBC,KAAKC,KAAKF,EAAe,IACnE,CAACjB,EAAeY,QAAUK,GAAiBC,KAAKC,KAAKF,EAAe,IACpE,CAACjB,EAAea,YAAcI,GAAiBC,KAAKC,KAAKF,EAAe,IACxE,CAACjB,EAAeQ,YAAcS,GAAiBC,KAAKC,KAAKF,EAAeA,EAAe,IACvF,CAACjB,EAAeS,kBAAoBQ,GAAiBC,KAAKC,KAAKF,EAAeA,EAAe,IAC7F,CAACjB,EAAeU,2BAA6BO,GAAiBC,KAAKC,KAAKF,EAAe,IACvF,CAACjB,EAAec,YAAcM,GAAkB,EAChD,CAACpB,EAAee,QAAUK,GAAkBF,KAAKC,KAAKC,EAAgB,KAE7DC,EAAyB,CAClC,OAAuC,IAAIC,IAAI,CAACtB,EAAeE,QAASF,EAAeQ,WAAYR,EAAeS,iBAAkBT,EAAeU,0BAA2BV,EAAee,SAC7L,YAAiD,IAAIO,IAAI,CAACtB,EAAeE,QAASF,EAAeH,UAAWG,EAAeD,UAAWC,EAAeU,0BAA2BV,EAAeQ,WAAYR,EAAeS,iBAAkBT,EAAeO,SAAUP,EAAeY,OAAQZ,EAAeW,MAAOX,EAAea,WAAYb,EAAee,OAAQf,EAAec,aACnX,WAA+C,IAAIQ,IAAI,CAACtB,EAAeH,UAAWG,EAAeD,UAAWC,EAAee,OAAQf,EAAec,aAClJ,aAAmD,IAAIQ,IAAI,CAACtB,EAAeH,UAAWG,EAAeD,UAAWC,EAAec,aAC/H,OAAuC,IAAIQ,IAAI,CAACtB,EAAeH,UAAWG,EAAeD,UAAWC,EAAec,aACnH,SAA2C,IAAIQ,IAAI,CAACtB,EAAeO,SAAUP,EAAeY,OAAQZ,EAAeW,MAAOX,EAAea,cCzX7I,IAAIU,EAAwC,SAAUC,EAASC,EAAYC,EAAGC,GAE1E,OAAO,IAAKD,IAAMA,EAAIE,WAAU,SAAUC,EAASC,GAC/C,SAASC,EAAUC,GAAS,IAAMC,EAAKN,EAAUjC,KAAKsC,GAAS,CAAE,MAAOE,GAAKJ,EAAOI,EAAI,CAAE,CAC1F,SAASC,EAASH,GAAS,IAAMC,EAAKN,EAAiB,MAAEK,GAAS,CAAE,MAAOE,GAAKJ,EAAOI,EAAI,CAAE,CAC7F,SAASD,EAAKG,GAJlB,IAAeJ,EAIaI,EAAOC,KAAOR,EAAQO,EAAOJ,QAJ1CA,EAIyDI,EAAOJ,MAJhDA,aAAiBN,EAAIM,EAAQ,IAAIN,GAAE,SAAUG,GAAWA,EAAQG,EAAQ,KAIjBM,KAAKP,EAAWI,EAAW,CAC7GF,GAAMN,EAAYA,EAAUY,MAAMf,EAASC,GAAc,KAAK/B,OAClE,GACJ,EACA,IAAI8C,EAAa,KACbC,EAAY,KACT,SAASC,IACZ,OAAOnB,EAAUoB,UAAM,OAAQ,GAAQ,YACnC,IAAKH,IAGDA,QAAmBI,UAAUC,IAAIC,eAAe,CAAEC,gBAAiB,qBACjD,MAAdP,GACA,OAAO,KAEf,IAAIQ,GAAS,EAOb,GANIP,IACAA,EAAUQ,KAAKX,MAAK,KAChBU,GAAS,CAAI,UAEX,IAAIpB,SAASsB,GAAMC,WAAWD,EAAG,QAEtCT,GAAaO,EAAQ,CACtB,MAAMI,EAAqB,IACrBC,EAAgBb,EAAWc,OAC3BC,EAAmBF,EAAcG,cACjCC,EAAyBJ,EAAcK,4BAC7C,IAKI,OAJAjB,QAAkBD,EAAWmB,cAAc,CAAEC,eAAgB,CACrDJ,cAAetC,KAAK2C,IAAIN,EAAkBH,GAC1CM,4BAA6BxC,KAAK2C,IAAIJ,EAAwBL,MAE/DX,CACX,CACA,MAAOP,GAGH,OAFA4B,QAAQC,MAAM,+CAAgD7B,GAC9DO,QAAkBD,EAAWmB,gBACtBlB,CACX,CACJ,CACA,OAAOA,CACX,GACJ,CCpBO,SAASuB,EAA2BC,EAC3CC,EAAY,GACZC,EACAC,EACAC,EACAC,GAEI,OAlCkD9C,EAkCjCmB,KAlC0ClB,OAkCpC,EAlCmDE,EAkCnC,YACnC,MAAM4C,QAAe7B,IACrB,IAAK6B,EACD,OAAO,KACX,MAAMC,EAA2BC,OAAOC,OAAO1E,GAC/C,GAAImE,EAAgBQ,MAAMC,IAAYJ,EAAyBK,SAASD,KACpE,MAAM,IAAIE,MAAM,sCAAwCX,EAAgBY,KAAK,OAEjF,IADsCN,OAAOC,OAAO/E,GACjBkF,SAAST,GACxC,MAAM,IAAIU,MAAM,0CAA4CV,GAChE,MAAMY,EAAc,EAAId,EAExB,GAAII,EAAQW,SAAWhB,EAAUgB,QAC7BX,EAAQW,SAAWd,EAAgBc,QACnCX,EAAQW,SAAWZ,EAAQY,OAC3B,MAAM,IAAIH,MAAM,4EAGpB,GAAIb,EAAUU,MAAMO,GAASA,EAAKD,SAAWhB,EAAU,GAAGgB,SACtD,MAAM,IAAIH,MAAM,2CACpB,MAAMK,EAAelB,EAAUgB,OACzBG,EAAWnB,EAAU,GAAGgB,OACxBI,EAAcpB,EAAUqB,KAAI,CAACC,EAAOC,ICtD3C,SAA2BvB,EAAWwB,EAAiBzF,EAAeE,QAASE,EACtFkE,EAAU,CAAEoB,eAAgB,EAAKC,oBAAqB,KAClD,IAAIC,EAAIC,EACR,IAAIC,EAAY,KAChB,MAAMC,EACE9B,EAAUU,MAAMzC,GAAmB,iBAANA,KAC7B4D,EAAY,SACL7B,EAAUqB,KAAKC,GAAU,IAAIS,YAAYT,EAAMU,MAAM,IAAIX,KAAKY,GAAMA,EAAEC,WAAW,SAExFlC,EAAUU,MAAMzC,GAAmB,iBAANA,KAC7B4D,EAAY,SACL7B,EAAUqB,KAAKC,GAAU,IAAIa,aAAa,CAACb,OAE3B,iBAAhBtB,EAAU,IAAkBA,EAAUU,MAAMzC,GAAM,UAAWA,GAAK,YAAaA,KACtF4D,EAAY,WACL7B,EAAUqB,KAAKC,GAAUA,EAAMc,SAEtCpC,EAAUU,MAAMzC,GAAMA,aAAakE,gBACnCN,EAAY,eACL7B,GAEPA,EAAUU,MAAMzC,GAAMA,aAAa8D,eACnCF,EAAY,cACL7B,GAEPA,EAAUU,MAAMzC,GAAMA,aAAaoE,cACnCR,EAAY,aACL7B,QAFX,EAMJ,IAAK8B,IAAgBD,EACjB,MAAM,IAAIhB,MAAM,sEACpB,MAAMyB,EAAkBR,EAAY,aAAcO,WAAa,aAC3DP,EAAY,aAAcK,aAAe,eAAkD,cAEzFI,EAAa,IAAIR,YAAYD,EAAYT,KAAKmB,GAAQA,EAAIxB,UAChE,IAAK5D,EAAuByE,KAAezE,EAAuByE,GAAWY,IAAIjB,GAC7E,MAAM,IAAIX,MAAM,oBAAoBW,oCAAiDK,MACzF,MAAMa,EAAcH,EAAWI,QAAO,CAACC,EAAGC,IAAM5F,KAAK6F,IAAIF,EAAGC,IAAI,GAE1DE,EAAahG,EAA2ByE,GAAgBkB,GACxDM,EAA8C,eAApBV,EAAkED,WACzE,iBAApBC,EAAsEH,aAAeJ,YACpFkB,EAAkB,IAAID,EAAwBlB,EAAYd,OAAS0B,GAGzEZ,EAAYoB,SAAQ,CAACC,EAAK5B,KACtB0B,EAAgBG,IAAID,EAAK5B,EAAImB,EAAY,IAI7C,IAAIW,EAAqB,GACrBC,EAAe,EACfC,EAAe,eACfC,EAAiB,KACrB,GAAIhC,IAAmBzF,EAAeS,kBAAoBgF,IAAmBzF,EAAeU,0BAA2B,CACnH,IAAIgH,EAAkBpD,EAAQqD,eAAiBrD,EAAQsD,gBACnDnD,OAAOoD,KAAKvD,EAAQsD,iBAAiBhB,QAAO,CAACkB,EAAMC,IAAM7G,KAAK6F,IAAIe,EAAMC,EAAE5B,WAAW,KAAK,IAAM,EAEpG,IAAK7B,EAAQsD,kBAAoBtD,EAAQqD,cAAe,CACpD,IAAK,IAAInC,EAAI,EAAGA,EAAI0B,EAAgBjC,OAAQO,IACpC0B,EAAgB1B,GAAKkC,IACrBA,EAAkBR,EAAgB1B,IAE1ClB,EAAQqD,cACJ,IAAIK,MAAMN,EAAkB,GAAGO,KAAK,MAAM3C,KAAI,IAAM,IAAI0C,MAAMN,EAAkB,GAAGO,KAAK,KAC5F3D,EAAQsD,gBAAkB,CAAC,EAC3B,IAAK,IAAIpC,EAAI,EAAGA,EAAIlB,EAAQqD,cAAc1C,OAAQO,IAC9ClB,EAAQqD,cAAcnC,GAAGA,GAAK,EAC9BlB,EAAQsD,gBAAgBM,OAAOC,aAAa3C,IAAMA,CAE1D,CACA,MAAM4C,GAAwBV,EAAkB,IAAMA,EAAkB,GAClEW,EAA6B,IAAIL,MAAMN,EAAkB,GAAGO,KAAK,MAAM3C,KAAI,IAAM,IAAIc,aAAasB,EAAkB,KAE1H,IAAK,IAAIlC,EAAI,EAAGA,EAAIkC,EAAkB,EAAGlC,IACrC6C,EAA2B7C,GAAGA,GAAK,EACvC,MAAMoC,EAAkBtD,EAAQsD,gBAChC,IAAK,MAAMU,KAAO7D,OAAOoD,KAAKD,GAC1B,IAAK,MAAMW,KAAQ9D,OAAOoD,KAAKD,GACvBU,IAAQC,IAEZF,EAA2BC,EAAInC,WAAW,IAAIoC,EAAKpC,WAAW,IAC1D7B,EAAQqD,cAAcC,EAAgBU,IAAMV,EAAgBW,KAKxEhB,EAAe,EAAIa,EACnBZ,EAAe,eACfC,EAAiB,IAAIrB,aAAamB,GAClCE,EAAe,GAAuC,QAAjC7B,EAAKtB,EAAQoB,sBAAmC,IAAPE,EAAgBA,EAAK,EACnF6B,EAAe,GAA4C,QAAtC5B,EAAKvB,EAAQqB,2BAAwC,IAAPE,EAAgBA,EAAK,GACxF,IAAI2C,EAAS,EACb,IAAK,IAAIhD,EAAI,EAAGA,EAAI6C,EAA2BpD,OAAQO,IACnDiC,EAAeJ,IAAIgB,EAA2B7C,GAAIgD,GAClDA,GAAUH,EAA2B7C,GAAGP,OAE5CqC,EAAqB,+BACDlH,2CACKA,wCACHA,uBAAgCsH,EAAkB,OAAOA,EAAkB,IACrG,MACK,GAAIjC,IAAmBzF,EAAec,WAAY,CAEnD,IAAKwD,EAAQmE,OAAkC,iBAAlBnE,EAAQmE,OAAsBnE,EAAQmE,OAAS,EAAG,CAC3E,MAAM5E,EAAMqD,EAAgBN,QAAO,CAACC,EAAGC,IAAM5F,KAAK2C,IAAIgD,EAAGC,IAAII,EAAgB,IACvEH,EAAMG,EAAgBN,QAAO,CAACC,EAAGC,IAAM5F,KAAK6F,IAAIF,EAAGC,IAAII,EAAgB,IAC7E5C,EAAQmE,MAAQ1B,EAAMlD,CAC1B,CACIS,EAAQmE,OAAS,IACjBnE,EAAQmE,MAAQ,GACpBlB,EAAe,EACfC,EAAe,eACfC,EAAiB,IAAIrB,aAAa,CAAC9B,EAAQmE,QAC3CnB,EAAqB,sBACVlH,QACf,CACA,MAAMsI,EAAexB,aAA2BZ,WAAa,MAASY,aAA2Bd,aAAe,MAAQ,MAClHuC,EAAiB,OAAOvI,kBAA2BsI,MAAiB/B,OAAiBZ,EAAYd,UAEvG,MAAO,CACHiC,kBACA0B,gBAAiB1B,EAAgBjC,OACjC0B,cACAH,aACAQ,aACAS,iBACAF,eACAC,aAAcA,EACdF,qBACAxB,YACA4C,eACAC,iBACA1B,0BAER,CDlFmB4B,CAAkBtD,EAAOpB,EAAgBqB,GAAIA,EAAGlB,EAAQkB,MAEnE,GAAqB,IAAjBL,EACA,MAAM,IAAIL,MAAM,oEAEC,IAAjBK,IACAf,EAAsBzE,EAAkBI,WAE5C,IAAI+I,EAAezD,EACdC,KAAKyD,GAASA,EAAKzB,qBACnB0B,QAAQC,KAAWA,GAAgB,IAARA,IAC3BlE,KAAK,OAENmE,GAAa,EACZJ,GAAuC,IAAvBA,EAAaK,SAC9BD,GAAa,EACbJ,EAAe,kBAGnB,MAAMM,EAAW/D,EAAYC,KAAKyD,GAASA,EAAKJ,iBAAgBK,QAAQC,KAAWA,GAAgB,IAARA,IAAYlE,KAAK,OAEtGyB,EAAa,IAAIR,YAAYb,EAAeC,GAClDC,EAAY8B,SAAQ,CAAC4B,EAAMvD,KACvBgB,EAAWa,IAAI0B,EAAKvC,WAAYhB,EAAIJ,EAAS,IAIjD,MAAMiE,EAAe,IAEfC,EAA4B,IAC5BC,EAAqBlE,EAAYuB,QAAO,CAACC,EAAGC,IAAMD,EAAIC,EAAEE,YAAY,GACpEwC,EAAyBtI,KAAKC,KAAK,IAAOoI,GAG1CE,EAAgBvI,KAAKC,KAAKD,KAAKwI,KAAKxI,KAAKC,KAAKkI,OAC9CM,EAHoB,GAGEF,EACtBG,EAA8BxE,GAAYA,EAAW,GAAK,EAC1DyE,EAAuB3I,KAAKC,KAAKyI,EAA8BP,GAC/DS,EAASvF,EAAOwF,mBAAmB,CACrCC,MAAO,+BACPC,KAAM,oJAEkCJ,w0BAmBfzE,OAAcD,uEAEvBA,gDAEpBiE,mUAQAN,+WASAI,EAAa,uCAAyC,iKAGxBS,iUAM8BvE,2EACAA,+WASxCoE,kSASNxE,qOAOMI,waAatB8E,EAA0B/F,EAAiBkB,EAAYC,KAAKyD,GAASA,EAAKpC,cAAc3B,EAAaZ,iBAK7F+F,EAAW5F,EAAO6F,sBAAsB,CAC1CJ,MAAO,iCACPK,OAAQ,OACRC,QAAS,CACLR,SACAS,WAAY,sBAIdC,EAAc,IAAIxE,YAAYqD,GAC9BoB,EAAc,IAAIzE,YAAYqD,GAC9BqB,EAAY,IAAI1E,YAAYqD,GAC5BsB,EAAY,IAAI3E,YAAYqD,GAC5BuB,EAAY1J,KAAK2J,MAAMjB,EAA8BP,GAC3D,IAAIyB,EAAW,EACXC,EAAW,EACfjH,QAAQkH,KAAK,mBACb,IAAK,IAAIxF,EAAI,EAAGA,EAAI6D,EAAc7D,IAAK,CACnC,MAAMyF,EAAe5B,OAAN7D,EAAyBoE,EAA8B,GAAKpE,EAAI,GAAKoF,EAE9EM,EAAS9F,EAAW,EAAIlE,KAAK2J,MAAM3J,KAAKwI,MAAM,EAAIuB,EAAS,EAAI7F,GAAYA,EAAW,GAAK,GAAK,EAAI,IACpG+F,EAASF,EAAS7F,EAAW8F,EAAShK,KAAK2J,OAAOK,EAAS,IAAMA,EAAS,GAAK,GACrFV,EAAYhF,GAAKuF,EACjBN,EAAYjF,GAAKsF,EACjBJ,EAAUlF,GAAK2F,EACfR,EAAUnF,GAAK0F,EACfJ,EAAWI,EACXH,EAAWI,CAIf,CACArH,QAAQsH,QAAQ,mBAEhB,MAAMC,EAA0BhC,IAC5BjE,EAAWD,EACXA,EACAE,EAAYuB,QAAO,CAACC,EAAGC,IAAMD,EAAIC,EAAE8B,iBAAiB,GAElD0C,EAAuBjG,EAAYuB,QAAO,CAACC,EAAGC,IAAMD,EAAIC,EAAES,cAAc,GAExEgE,EAA8BjC,IAI9BkC,EAAwBH,EAA0BrF,YAAYyF,kBACpE,IAAIC,EAA8BF,EAClC,MAAMG,EAAoC,GAAxBH,EACA,IAAdG,IACAD,GAA+B,GAAKC,GACxC,MAAMC,EAAoBrH,EAAOsH,aAAa,CAC1C7B,MAAO,sBACP8B,KAAMJ,EACNK,MAAOC,eAAeC,QAClBD,eAAeE,SACfF,eAAeG,SACnBC,kBAAkB,IAEhBC,EAA+BT,EAAkBU,iBAEvD,IAAIC,EAAoB,EAEM,IAAIvG,YAAYqG,EAA8BE,EAAmBlD,GACzEhC,IAAImD,GAC1B+B,GAAqBlD,EAAerD,YAAYyF,kBAClB,IAAIzF,YAAYqG,EAA8BE,EAAmBlD,GACzEhC,IAAIoD,GAC1B8B,GAAqBlD,EAAerD,YAAYyF,kBACpB,IAAIzF,YAAYqG,EAA8BE,EAAmBlD,GACzEhC,IAAIqD,GACxB6B,GAAqBlD,EAAerD,YAAYyF,kBACpB,IAAIzF,YAAYqG,EAA8BE,EAAmBlD,GACzEhC,IAAIsD,GACxB4B,GAAqBlD,EAAerD,YAAYyF,kBAEzB,IAAIzF,YAAYqG,EAA8BE,EAAmB/F,EAAWvB,QACpFoC,IAAIb,GACnB+F,GAAqB/F,EAAWvB,OAASe,YAAYyF,kBAEjC,IAAIrF,aAAaiG,EAA8BE,EAAmBpH,GAC1EkC,IAAIhD,GAChBkI,GAAqBpH,EAAeiB,aAAaqF,kBAEjD,IAAK,MAAM1C,KAAQ1D,EAAa,CAC5B,MAAMmH,EAAmBzD,EAAK9B,wBACxB2D,EAAY7B,EAAKH,gBACN,IAAI4D,EAAiBH,EAA8BE,EAAmB3B,GAC9EvD,IAAI0B,EAAK7B,iBAClBqF,GAAqB3B,EAAY4B,EAAiBf,iBACtD,CAEAG,EAAkBa,QAGlB,MAAMC,EAAqBpB,EAAuBtF,YAAYyF,kBAC9D,IAAIkB,EAA2BD,EAC/B,MAAME,EAAyC,GAArBF,EACA,IAAtBE,IACAD,GAA4B,GAAKC,GACrCD,EAA2BzL,KAAK6F,IAAI4F,EAA0B,IAC9D,MAAMlF,EAAiBlD,EAAOsH,aAAa,CACvC7B,MAAO,mBACP8B,KAAMa,EACNZ,MAAOC,eAAeC,QAClBD,eAAeE,SACfF,eAAeG,SACnBC,kBAAkB,IAEhBS,EAA4BpF,EAAe6E,iBACjD,IAAIQ,EAAiB,EACrB,IAAK,MAAM/D,KAAQ1D,EACX0D,EAAKtB,gBAAkBsB,EAAKtB,eAAesF,WAAa,GAAKhE,EAAKxB,aAAe,IAE5D,IAD0B,gBAAtBwB,EAAKvB,aAAiExB,YAAcI,cACnEyG,EAA2BC,EAAgB/D,EAAKtB,eAAexC,QAC5FoC,IAAI0B,EAAKtB,gBACtBqF,GAAkB/D,EAAKtB,eAAesF,YAGvB,IAAnBD,GACkB,IAAI9G,YAAY6G,EAA2B,EAAG,GACtDxF,IAAI,CAAC,EAAG,EAAG,EAAG,IAE5BI,EAAegF,QAEf,MAAMO,GAlFsB,MAkFoBhH,YAAYyF,kBAC5D,IAAIwB,GAA0BD,GAC9B,MAAME,GAAuC,GAApBF,GACA,IAArBE,KACAD,IAA2B,GAAKC,IACpC,MAAMC,GAAgB5I,EAAOsH,aAAa,CACtC7B,MAAO,iBACP8B,KAAMmB,GACNlB,MAAOC,eAAeC,QAClBD,eAAeE,WAIjBkB,GAAY7I,EAAO8I,gBAAgB,CACrCrD,MAAO,qCACPK,OAAQF,EAASmD,mBAAmB,GACpCC,QAAS,CACL,CAAEC,QAAS,EAAGC,SAAU,CAAEC,OAAQ9B,IAClC,CAAE4B,QAAS,EAAGC,SAAU,CAAEC,OAAQjG,IAClC,CAAE+F,QAAS,EAAGC,SAAU,CAAEC,OAAQP,QAOpCQ,GAAmBpJ,EAAOsH,aAAa,CACzC7B,MAAO,qBACP8B,KAAMqB,GAAcrB,KACpBC,MAAOC,eAAe4B,SAAW5B,eAAeG,WAE9C0B,GAAW,GACXC,GAAW,GACXC,GAAkB,GAExB,IAAIC,IAAY,EAChB,MAAQA,IAAW,CAEf,MAAMC,EAAU1J,EAAO2J,qBAAqB,CACxClE,MAAO,qBAELmE,EAAOF,EAAQG,iBAAiB,CAClCpE,MAAO,0BAEXmE,EAAKE,YAAYlE,GACjBgE,EAAKG,aAAa,EAAGlB,IACrBe,EAAKI,mBAAmB9E,EAAeA,GACvC0E,EAAKK,MACLP,EAAQQ,mBAAmBtB,GAAe,EAAGQ,GAAkB,EAAGA,GAAiB7B,MAEnF,MAAM4C,EAAgBT,EAAQU,SAC9BpK,EAAOqK,MAAMC,OAAO,CAACH,UAEfnK,EAAOqK,MAAME,4BACbnB,GAAiBoB,SAASC,WAAWC,MAC3C,MAAMC,EAAwBvB,GAAiBrB,iBAE/C,IAAI6C,EAAe,EACnB,MAAMC,EAAW,IAAIpJ,YAAYkJ,EAAuBC,EAAc5D,GACtE4D,GAAgB5D,EAA8BvF,YAAYyF,kBAC1D,MAAM4D,EAAW,IAAIrJ,YAAYkJ,EAAuBC,EAAc5D,GACtE4D,GAAgB5D,EAA8BvF,YAAYyF,kBAC1D,MAAM6D,EAAmB,IAAIlJ,aAAa8I,EAAuBC,EAAc5D,GAC/E4D,GAAgB5D,EAA8BnF,aAAaqF,kBAC3D,MAAM8D,EAAe,IAAIvJ,YAAYkJ,EAAuBC,EAAc9F,GAC1E8F,GAAgB9F,EAAerD,YAAYyF,kBAE3CuC,GADoB,IAAIhI,YAAYkJ,EAAuBC,EAAc9F,GACjDmG,OAAOC,GAAY,IAANA,IACrC,MAAMC,EAAeH,EAAa3I,QAAO,CAACC,EAAGC,IAAMD,EAAIC,GAAG,GACpD6I,EAAY,IAAI3J,YAAY0J,GAC5BE,EAAY,IAAI5J,YAAY0J,GAC5BG,EAAoB,IAAIzJ,aAAasJ,GAC3C,IAAII,EAAiB,EACrB,IAAK,IAAIC,EAAO,EAAGA,EAAOR,EAAatK,OAAQ8K,IAAQ,CACnD,MAAMC,EAAQT,EAAaQ,GACb,IAAVC,IAEJL,EAAUtI,IAAI+H,EAASa,SAASF,EAAOzG,EAA2ByG,EAAOzG,EAA4B0G,GAAQF,GAC7GF,EAAUvI,IAAIgI,EAASY,SAASF,EAAOzG,EAA2ByG,EAAOzG,EAA4B0G,GAAQF,GAC7GD,EAAkBxI,IAAIiI,EAAiBW,SAASF,EAAOzG,EAA2ByG,EAAOzG,EAA4B0G,GAAQF,GAC7HA,GAAkBE,EACtB,CACAnC,GAASqC,KAAKP,GACd7B,GAASoC,KAAKN,GACd7B,GAAgBmC,KAAKL,GACrBlC,GAAiBlB,OACrB,CACA,MAAM0D,GAAYtC,GAASjH,QAAO,CAACC,EAAGC,IAAMD,EAAIC,EAAE7B,QAAQ,GACpDmL,GAAS,IAAIpK,YAAYmK,IACzBE,GAAS,IAAIrK,YAAYmK,IACzBG,GAAiB,IAAIlK,aAAa+J,IACxC,IAAII,GAAc,EAClB,IAAK,IAAI/K,EAAI,EAAGA,EAAIqI,GAAS5I,OAAQO,IACjC4K,GAAO/I,IAAIwG,GAASrI,GAAI+K,IACxBF,GAAOhJ,IAAIyG,GAAStI,GAAI+K,IACxBD,GAAejJ,IAAI0G,GAAgBvI,GAAI+K,IACvCA,IAAe1C,GAASrI,GAAGP,OAO/B,OAJA2G,EAAkB4E,UAClB/I,EAAe+I,UACfrD,GAAcqD,UACd7C,GAAiB6C,UACV,CAAEhL,EAAG4K,GAAQK,EAAGJ,GAAQK,SAAUJ,GAC7C,EAlaO,KAFgE5O,OAkCxC,KAhCbA,EAAIE,WAAU,SAAUC,EAASC,GAC/C,SAASC,EAAUC,GAAS,IAAMC,EAAKN,EAAUjC,KAAKsC,GAAS,CAAE,MAAOE,GAAKJ,EAAOI,EAAI,CAAE,CAC1F,SAASC,EAASH,GAAS,IAAMC,EAAKN,EAAiB,MAAEK,GAAS,CAAE,MAAOE,GAAKJ,EAAOI,EAAI,CAAE,CAC7F,SAASD,EAAKG,GAJlB,IAAeJ,EAIaI,EAAOC,KAAOR,EAAQO,EAAOJ,QAJ1CA,EAIyDI,EAAOJ,MAJhDA,aAAiBN,EAAIM,EAAQ,IAAIN,GAAE,SAAUG,GAAWA,EAAQG,EAAQ,KAIjBM,KAAKP,EAAWI,EAAW,CAC7GF,GAAMN,EAAYA,EAAUY,MAAMf,EAASC,GAAc,KAAK/B,OAClE,IAPwC,IAAU8B,EAASC,EAAYC,EAAGC,CAqa9E,CACA,SAASuI,EAA0B/F,EAAiBwM,EAAc3L,EAAa4L,GAoB3E,OAnBsBzM,EAAgBmB,KAAI,CAACV,EAAQY,IACxC,8BACYA,2EACSA,iDACAA,gDACDR,iBACvB/E,EAAgB2E,GAAQ+L,EAAanL,GAAIA,0BAIRT,KAAK,MASlB,KARG,qGAECZ,EAAgBc,qBAC1Cd,EAAgBmB,KAAI,CAACuL,EAAGrL,IAAM,aAAaA,sBAAsBA,uBAAsBT,KAAK,kBAC5FnF,EAA2BgR,GAAazM,EAAgBc,8BAKlE,C,mDE1bO,SAAS6L,EAAUC,EAASC,EAAcC,EAAYC,GACzD,MAAMnJ,EAAIgJ,EAAQ9L,OACZkM,EAAK,GACLC,EAAK,GACX,IAAK,IAAI5L,EAAI,EAAGA,EAAIuC,EAAGvC,IACnB,IAAK,IAAIiL,EAAIjL,EAAI,EAAGiL,EAAI1I,EAAG0I,IAAK,CAC5B,MAAM5J,EAAIkK,EAAQvL,GACZsB,EAAIiK,EAAQN,IACbO,EAAanK,KAAKC,IAAM,GAAK,IAC9BqK,EAAGjB,KAAK1K,GACR4L,EAAGlB,KAAKO,GAEhB,CAEJ,OCZG,SAAyBU,EAAIC,EAAIL,EAASG,GAC7C,MAAMG,EAAQ,IAAI,KAClB,IAAK,IAAI7L,EAAI,EAAGA,EAAIuL,EAAQ9L,OAAQO,IAChC6L,EAAMC,QAAQP,EAAQvL,GAAI,CAAE+L,EAAmB,IAAhBrQ,KAAKsQ,SAAgBC,EAAmB,IAAhBvQ,KAAKsQ,SAAgB1F,KAAM,IACtF,IAAK,IAAItG,EAAI,EAAGA,EAAI2L,EAAGlM,OAAQO,IAAK,CAChC,MAAMkM,EAAKP,EAAG3L,GACRmM,EAAKP,EAAG5L,GAGRoM,EAFQV,EAAWH,EAAQW,MACnBR,EAAWH,EAAQY,IACA,EAAI,EACrCN,EAAMQ,QAAQd,EAAQI,EAAG3L,IAAKuL,EAAQK,EAAG5L,IAAK,CAAEoM,UACpD,CACA,MAAME,EAAW,CACbC,WAAY,IAQZD,SAAU,IAAK,kBAA0BT,GAAQW,UAAU,IAE/D,kBAA0BX,GAC1B,WAAmBA,EAAOS,GAC1B,MAAMG,EAAU,IAAI7L,aAAa2K,EAAQ9L,QACnCiN,EAAU,IAAI9L,aAAa2K,EAAQ9L,QACzC,IAAK,IAAIO,EAAI,EAAGA,EAAIuL,EAAQ9L,OAAQO,IAAK,CACrC,MAAM2M,EAAOd,EAAMe,kBAAkBrB,EAAQvL,IAC7CyM,EAAQzM,GAAK2M,EAAKZ,EAClBW,EAAQ1M,GAAK2M,EAAKV,CACtB,CACA,IAAIY,EAAOJ,EAAQ,GACfK,EAAOJ,EAAQ,GACfK,EAAON,EAAQ,GACfO,EAAON,EAAQ,GACnB,IAAK,IAAI1M,EAAI,EAAGA,EAAIuL,EAAQ9L,OAAQO,IAChC6M,EAAOnR,KAAK2C,IAAIwO,EAAMJ,EAAQzM,IAC9B8M,EAAOpR,KAAK2C,IAAIyO,EAAMJ,EAAQ1M,IAC9B+M,EAAOrR,KAAK6F,IAAIwL,EAAMN,EAAQzM,IAC9BgN,EAAOtR,KAAK6F,IAAIyL,EAAMN,EAAQ1M,IAElC,IAAIiN,EAASF,EAAOF,EAChBK,EAASF,EAAOF,EACL,IAAXG,IACAA,EAAS,GACE,IAAXC,IACAA,EAAS,GACb,IAAK,IAAIlN,EAAI,EAAGA,EAAIuL,EAAQ9L,OAAQO,IAChCyM,EAAQzM,IAAMyM,EAAQzM,GAAK6M,GAAQI,EACnCP,EAAQ1M,IAAM0M,EAAQ1M,GAAK8M,GAAQI,EAEvC,MAAO,CAAEC,OAAQV,EAASW,OAAQV,EA8HtC,CDtKWW,CAAgB1B,EAAIC,EAAIL,EAASG,EAC5C,CECO,SAAS4B,EAAyBvO,EAAQwO,EAAiBC,EAASC,GACvE,OAlBkDzR,EAkBjCmB,KAlB0ClB,OAkBpC,EAlBmDE,EAkBnC,YACnC,MAAMuR,EAAgBD,EAGhBE,EAAmBjS,KAAKC,KAAK+R,EADLE,KAExBC,EAAenS,KAAKC,KAAKD,KAAKwI,KAAKyJ,IACnCG,EAJyB,GAIgBD,EACzCvJ,EAASvF,EAAOwF,mBAAmB,CACrCC,MAAO,oBACPC,KAAM,6XAQcqJ,sCACLL,+mBAqBb9I,EAAW5F,EAAO6F,sBAAsB,CAC1CJ,MAAO,2BACPK,OAAQ,OACRC,QAAS,CACLR,SACAS,WAAY,eAGdgJ,EAAsBhP,EAAOsH,aAAa,CAC5C7B,MAAO,4BACP8B,KAAMiH,EAAgBhG,WACtBhB,MAAOC,eAAeC,QAClBD,eAAeE,SACfF,eAAeG,SACnBC,kBAAkB,IAEtB,IAAIhG,aAAamN,EAAoBjH,kBAAkBjF,IAAI0L,GAC3DQ,EAAoB9G,QACpB,MAAM+G,EAAgBjP,EAAOsH,aAAa,CACtC7B,MAAO,sBACP8B,KAAMkH,EAAQjG,WACdhB,MAAOC,eAAeC,QAClBD,eAAeE,SACfF,eAAeG,SACnBC,kBAAkB,IAEtB,IAAIpG,YAAYwN,EAAclH,kBAAkBjF,IAAI2L,GACpDQ,EAAc/G,QACd,MAAMW,EAAY7I,EAAO8I,gBAAgB,CACrChD,OAAQF,EAASmD,mBAAmB,GACpCC,QAAS,CACL,CACIC,QAAS,EACTC,SAAU,CACNC,OAAQ6F,IAGhB,CACI/F,QAAS,EACTC,SAAU,CACNC,OAAQ8F,OAKlBC,EAAiBlP,EAAO2J,uBACxBwF,EAAcD,EAAerF,mBACnCsF,EAAYrF,YAAYlE,GACxBuJ,EAAYpF,aAAa,EAAGlB,GAC5BsG,EAAYnF,mBAAmB8E,EAAcA,GAC7CK,EAAYlF,MACZ,MAAMmF,EAAsBpP,EAAOsH,aAAa,CAC5C7B,MAAO,wBACP8B,KAAMiH,EAAgBhG,WACtBhB,MAAOC,eAAe4B,SAAW5B,eAAeG,WAEpDsH,EAAehF,mBAAmB8E,EAAqB,EAAGI,EAAqB,EAAGZ,EAAgBhG,YAClGxI,EAAOqK,MAAMC,OAAO,CAAC4E,EAAe9E,iBAC9BpK,EAAOqK,MAAME,4BACb6E,EAAoB5E,SAASC,WAAWC,MAC9C,MAAM2E,EAAc,IAAIxN,aAAauN,EAAoBrH,kBACzDyG,EAAgB1L,IAAIuM,GACpBD,EAAoBlH,QACpB8G,EAAoB/C,UACpBgD,EAAchD,UACdmD,EAAoBnD,SACxB,EAzHO,KAFgE9O,OAkBxC,KAhBbA,EAAIE,WAAU,SAAUC,EAASC,GAC/C,SAASC,EAAUC,GAAS,IAAMC,EAAKN,EAAUjC,KAAKsC,GAAS,CAAE,MAAOE,GAAKJ,EAAOI,EAAI,CAAE,CAC1F,SAASC,EAASH,GAAS,IAAMC,EAAKN,EAAiB,MAAEK,GAAS,CAAE,MAAOE,GAAKJ,EAAOI,EAAI,CAAE,CAC7F,SAASD,EAAKG,GAJlB,IAAeJ,EAIaI,EAAOC,KAAOR,EAAQO,EAAOJ,QAJ1CA,EAIyDI,EAAOJ,MAJhDA,aAAiBN,EAAIM,EAAQ,IAAIN,GAAE,SAAUG,GAAWA,EAAQG,EAAQ,KAIjBM,KAAKP,EAAWI,EAAW,CAC7GF,GAAMN,EAAYA,EAAUY,MAAMf,EAASC,GAAc,KAAK/B,OAClE,IAPwC,IAAU8B,EAASC,EAAYC,EAAGC,CA4H9E,CChHO,SAASkS,EAAQd,EAAiBe,EAAS,GAC9C,IAAK,IAAItO,EAAI,EAAGA,EAAIuN,EAAgB9N,OAAQO,IACxCuN,EAAgBvN,GAAKtE,KAAK6S,IAAIhB,EAAgBvN,GAAIsO,EAC1D,CAUO,SAASE,EAAezP,EAAQwO,EAAiBkB,EAAYjB,EAASkB,GACzE,OA1BkD1S,EA0BjCmB,KA1B0ClB,OA0BpC,EA1BmDE,EA0BnC,YACnC,MAAMuR,EAAgB,IAGhBC,EAAmBjS,KAAKC,KAAK+R,KAC7BG,EAAenS,KAAKC,KAAKD,KAAKwI,KAAKyJ,IACnCG,EAJyB,GAIgBD,EAIzCc,EAAqB,IAAI/N,aAAa2M,EAAgB9N,QACtD6E,EAASvF,EAAOwF,mBAAmB,CACrCC,MAAO,SACPC,KAAM,yEAEwB8I,EAAgB9N,gDACrBgP,EAAWhP,6CACd+N,EAAQ/N,gDACLgP,EAAWhP,geAWhBqO,yKAKEW,EAAWhP,oiCA2B/BkF,EAAW5F,EAAO6F,sBAAsB,CAC1CJ,MAAO,0BACPK,OAAQ,OACRC,QAAS,CACLR,OAAQA,EACRS,WAAY,YAIpB,IAAI6J,EAAkD,GADxBrB,EAAgB9N,OAASgP,EAAWhP,OAAS+N,EAAQ/N,OAASgP,EAAWhP,QAEvG,MAAM0G,EAAsC,GAA1ByI,EACA,IAAdzI,IACAyI,GAA2B,GAAKzI,GACpC,MAAM0I,EAAkB9P,EAAOsH,aAAa,CACxC7B,MAAO,oBACP8B,KAAMsI,EACNrI,MAAOC,eAAeC,QAClBD,eAAeE,SACfF,eAAeG,SACnBC,kBAAkB,IAEhBkI,EAAuBD,EAAgB/H,iBAE7C,IAAIlG,aAAakO,EAAsB,EAAGvB,EAAgB9N,QAAQoC,IAAI0L,GAEtE,IAAI/M,YAAYsO,EAA+C,EAAzBvB,EAAgB9N,OAAYgP,EAAWhP,QAAQoC,IAAI4M,GAEzF,IAAIjO,YAAYsO,EAAqE,GAA9CvB,EAAgB9N,OAASgP,EAAWhP,QAAa+N,EAAQ/N,QAAQoC,IAAI2L,GAE5G,MAAMuB,EApGd,SAAuBvB,GACnB,MAAMwB,EAAM,IAAIxO,YAAYgN,EAAQA,EAAQ/N,OAAS,IACrD,IAAK,IAAIO,EAAI,EAAGA,EAAIwN,EAAQ/N,OAAS,EAAGO,IACpC,IAAK,IAAIiL,EAAIuC,EAAQxN,GAAIiL,EAAIuC,EAAQxN,EAAI,GAAIiL,IACzC+D,EAAI/D,GAAKjL,EAEjB,OAAOgP,CACX,CA6F2BC,CAAczB,GACjC,IAAIhN,YAAYsO,EAAsF,GAA/DvB,EAAgB9N,OAASgP,EAAWhP,OAAS+N,EAAQ/N,QAAasP,EAAWtP,QAAQoC,IAAIkN,GAChIF,EAAgB5H,QAChB,MAAMiI,EAAcnQ,EAAOsH,aAAa,CACpC7B,MAAO,mBACP8B,KAAM,EACNC,MAAOC,eAAeC,QAClBD,eAAeE,SACfF,eAAeG,SACnBC,kBAAkB,IAEtB,IAAIpG,YAAY0O,EAAYpI,kBAAkBjF,IAAI,CAAC,IACnDqN,EAAYjI,QACZ,MAAMkI,EAAoBpQ,EAAOsH,aAAa,CAC1C7B,MAAO,sBACP8B,KAAMoH,KACNnH,MAAOC,eAAeC,QAClBD,eAAeE,SACfF,eAAeG,WAEjBiB,EAAY7I,EAAO8I,gBAAgB,CACrChD,OAAQF,EAASmD,mBAAmB,GACpCC,QAAS,CACL,CAAEC,QAAS,EAAGC,SAAU,CAAEC,OAAQ2G,IAClC,CAAE7G,QAAS,EAAGC,SAAU,CAAEC,OAAQiH,IAClC,CAAEnH,QAAS,EAAGC,SAAU,CAAEC,OAAQgH,OAGpCE,EAAiBrQ,EAAOsH,aAAa,CACvC7B,MAAO,mBACP8B,KAAM6I,EAAkB7I,KACxBC,MAAOC,eAAe4B,SAAW5B,eAAeG,WAEpD,IAAK,IAAI3G,EAAI,EAAGA,EAAItE,KAAKC,KAAK8S,EAAWhP,OAASiO,GAAgB1N,IAAK,CACnE,MAAMqP,EAAQrP,EAAI0N,EACZ4B,EAAY5T,KAAK2C,IAAIqP,EAAee,EAAWhP,OAAS4P,GAC9DtQ,EAAOqK,MAAMmG,YAAYL,EAAa,EAAG,IAAI1O,YAAY,CAAC6O,KAC1D,MAAM5G,EAAU1J,EAAO2J,qBAAqB,CACxClE,MAAO,mBAELmE,EAAOF,EAAQG,iBAAiB,CAClCpE,MAAO,wBAEXmE,EAAKE,YAAYlE,GACjBgE,EAAKG,aAAa,EAAGlB,GACrBe,EAAKI,mBAAmB8E,EAAcA,GACtClF,EAAKK,MACLP,EAAQQ,mBAAmBkG,EAAmB,EAAGC,EAAgB,EAAGA,EAAe9I,MACnFvH,EAAOqK,MAAMC,OAAO,CAACZ,EAAQU,iBAEvBpK,EAAOqK,MAAME,4BAEb8F,EAAe7F,SAASC,WAAWC,MACzC,MAAM+F,EAAW,IAAI5O,aAAawO,EAAetI,iBAAkB,EAAGwI,GAEtEX,EAAmB9M,IAAI2N,EAAUH,GAEjCD,EAAenI,OACnB,CAMA,OAJA4H,EAAgB7D,UAChBkE,EAAYlE,UACZmE,EAAkBnE,UAClBoE,EAAepE,UACR,CAAEyE,WAAYhB,EAAYiB,gBAAiBf,EAAoBgB,aAAcnC,EACxF,EAnLO,KAFgEtR,OA0BxC,KAxBbA,EAAIE,WAAU,SAAUC,EAASC,GAC/C,SAASC,EAAUC,GAAS,IAAMC,EAAKN,EAAUjC,KAAKsC,GAAS,CAAE,MAAOE,GAAKJ,EAAOI,EAAI,CAAE,CAC1F,SAASC,EAASH,GAAS,IAAMC,EAAKN,EAAiB,MAAEK,GAAS,CAAE,MAAOE,GAAKJ,EAAOI,EAAI,CAAE,CAC7F,SAASD,EAAKG,GAJlB,IAAeJ,EAIaI,EAAOC,KAAOR,EAAQO,EAAOJ,QAJ1CA,EAIyDI,EAAOJ,MAJhDA,aAAiBN,EAAIM,EAAQ,IAAIN,GAAE,SAAUG,GAAWA,EAAQG,EAAQ,KAIjBM,KAAKP,EAAWI,EAAW,CAC7GF,GAAMN,EAAYA,EAAUY,MAAMf,EAASC,GAAc,KAAK/B,OAClE,IAPwC,IAAU8B,EAASC,EAAYC,EAAGC,CAsL9E,CCpKO,SAASyT,EAA0BC,EAAcpC,GACpD,MAAMqC,EAlBH,SAAiCD,EAAcpC,GAClD,MAAMuB,EAAM,IAAIxO,YAAYiN,GAC5B,IAAK,IAAIzN,EAAI,EAAGA,EAAI6P,EAAa7P,EAAEP,OAAQO,IACvCgP,EAAIa,EAAa7P,EAAEA,MACnBgP,EAAIa,EAAa5E,EAAEjL,MAGvB,IAAK,IAAIA,EAAI,EAAGA,EAAIyN,EAAOzN,IACvBgP,EAAIhP,KACR,OAAOgP,CACX,CAQ2Be,CAAwBF,EAAcpC,GACvDuC,EC2CH,SAAsBC,GACzB,MAAMjB,EAAM,IAAIxO,YAAYyP,EAAGxQ,OAAS,GACxC,IAAIuD,EAAS,EACb,IAAK,IAAIhD,EAAI,EAAGA,EAAIiQ,EAAGxQ,OAAQO,IAC3BgP,EAAIhP,GAAKgD,EACTA,GAAUiN,EAAGjQ,GAGjB,OADAgP,EAAIiB,EAAGxQ,QAAUuD,EACVgM,CACX,CDpDuB,CAAac,GAC1BI,EAAgB,IAAI1P,YAAYiN,GAAOhL,KAAK,GAK5CgN,EAAa,IAAIjP,YAAoC,EAAxBqP,EAAa7P,EAAEP,OAAagO,GACzDiC,EAAkB,IAAI9O,aAAqC,EAAxBiP,EAAa7P,EAAEP,OAAagO,GAErE,IAAK,IAAIzN,EAAI,EAAGA,EAAIyN,EAAOzN,IACvByP,EAAWO,EAAWhQ,IAAMA,EAC5B0P,EAAgBM,EAAWhQ,IAAM,EAErC,IAAK,IAAIA,EAAI,EAAGA,EAAI6P,EAAa7P,EAAEP,OAAQO,IAAK,CAC5C,MAAMmQ,EAAMN,EAAa7P,EAAEA,GACrBoQ,EAAMP,EAAa5E,EAAEjL,GACrBqQ,EAAa,EAAIR,EAAa3E,SAASlL,GAC7CyP,EAAWO,EAAWG,GAAOD,EAAcC,IAAQC,EACnDV,EAAgBM,EAAWG,GAAOD,EAAcC,IAAQE,EACxDH,EAAcC,KACdV,EAAWO,EAAWI,GAAOF,EAAcE,IAAQD,EACnDT,EAAgBM,EAAWI,GAAOF,EAAcE,IAAQC,EACxDH,EAAcE,IAClB,CACA,MAAO,CAAEX,aAAYC,kBAAiBC,aAAcK,EACxD,CE5CiB/Q,OAAOqR,UAAUC,SCC3B,MAAMC,EAAoB,CAC7BC,aAAc,EACdC,cAAe,EACfC,cAAe,EACfC,WAAY,GAET,MAAMC,EACT,WAAAC,CAAYC,EAAO,CAAC,GAChB5T,KAAK6T,SAAW,IAAKR,KAAsBO,EAC/C,CACA,eAAME,CAAUpB,EAAcpC,GAG1B,MAAMyD,EAAuB/T,KAAKgU,aAAatB,GACzCuB,EAAiBjU,KAAKkU,eAAeH,EAAsBzD,GACjEtQ,KAAKmU,gBAAgBF,EAAeG,UACpC,IAAI/F,EAAe0F,EACnB,GAAI/T,KAAK6T,SAASN,cAAgB,EAAG,CACjCvT,KAAKqU,SAAShG,EAAciC,GAC5BtQ,KAAKsU,UAAUjG,GACf,IAAK,IAAIxL,EAAI,EAAGA,EAAI7C,KAAK6T,SAASN,cAAe1Q,IAC7CwL,EAAerO,KAAKuU,OAAOlG,EAAciC,GACzCtQ,KAAKsU,UAAUjG,GACfrO,KAAKkR,QAAQ7C,GACbrO,KAAKsU,UAAUjG,EAEvB,CACA,MAAM,SAAE+F,GAAapU,KAAKkU,eAAe7F,EAAciC,GACvDtQ,KAAKmU,gBAAgBC,GAErB,MAAMI,EAAaxU,KAAK0H,OAAOuM,EAAeG,SAAUL,EAAsBzD,EAAO8D,GACrF,MAAO,CAAEA,WAAUpE,OAAQwE,EAAWxE,OAAQC,OAAQuE,EAAWvE,OAAQzB,GAAIkE,EAAa7P,EAAG4L,GAAIiE,EAAa5E,EAClH,CACA,qBAAM2G,CAAgB/B,EAAcpC,GAChC,GAAoC,IAAhCtQ,KAAK6T,SAASN,cACd,OAAOvT,KAAK8T,UAAUpB,EAAcpC,GACxC,MAAMoE,QCxBP,SAA6BhC,EAAcpC,EAAOiD,EAAgB,EAAGC,EAAgB,GACxF,OAfkD3U,EAejCmB,KAf0ClB,OAepC,EAfmDE,EAenC,YACnC,MAAM4C,QAAe7B,IACrB,IAAK6B,EACD,MAAM,IAAIO,MAAM,uBAEpB,MAAMwS,EAAgBlC,EAA0BC,EAAcpC,SAExDH,EAAyBvO,EAAQ+S,EAAcpC,gBAAiBoC,EAAcnC,aAAclC,GAClG,IAAIuB,EAAM8C,EAEV,IAAK,IAAI9R,EAAI,EAAGA,EAAI0Q,EAAe1Q,IAAK,CAEpC,MAAM+R,QAAkBvD,EAAezP,EAAQiQ,EAAIU,gBAAiBV,EAAIS,WAAYT,EAAIW,oBAClFrC,EAAyBvO,EAAQgT,EAAUrC,gBAAiBqC,EAAUpC,aAAclC,GAE1FY,EAAQ0D,EAAUrC,gBAAiBiB,SAE7BrD,EAAyBvO,EAAQgT,EAAUrC,gBAAiBqC,EAAUpC,aAAclC,GAC1FuB,EAAM+C,CACV,CACA,OAAO/C,CACX,EAlCO,KAFgE9S,OAexC,KAbbA,EAAIE,WAAU,SAAUC,EAASC,GAC/C,SAASC,EAAUC,GAAS,IAAMC,EAAKN,EAAUjC,KAAKsC,GAAS,CAAE,MAAOE,GAAKJ,EAAOI,EAAI,CAAE,CAC1F,SAASC,EAASH,GAAS,IAAMC,EAAKN,EAAiB,MAAEK,GAAS,CAAE,MAAOE,GAAKJ,EAAOI,EAAI,CAAE,CAC7F,SAASD,EAAKG,GAJlB,IAAeJ,EAIaI,EAAOC,KAAOR,EAAQO,EAAOJ,QAJ1CA,EAIyDI,EAAOJ,MAJhDA,aAAiBN,EAAIM,EAAQ,IAAIN,GAAE,SAAUG,GAAWA,EAAQG,EAAQ,KAIjBM,KAAKP,EAAWI,EAAW,CAC7GF,GAAMN,EAAYA,EAAUY,MAAMf,EAASC,GAAc,KAAK/B,OAClE,IAPwC,IAAU8B,EAASC,EAAYC,EAAGC,CAqC9E,CDC6B6V,CAAoBnC,EAAcpC,EAAOtQ,KAAK6T,SAASN,cAAevT,KAAK6T,SAASL,eACnGO,EAAuB/T,KAAKgU,aAAatB,GACzCuB,EAAiBjU,KAAKkU,eAAeH,EAAsBzD,GACjEtQ,KAAKmU,gBAAgBF,EAAeG,UACpC,MAAM/F,EAAerO,KAAK8U,kBAAkBJ,EAAQpE,IAC9C,SAAE8D,GAAapU,KAAKkU,eAAe7F,EAAciC,GACvDtQ,KAAKmU,gBAAgBC,GACrB,MAAMI,EAAaxU,KAAK0H,OAAOuM,EAAeG,SAAUL,EAAsBzD,EAAO8D,GACrF,MAAO,CAAEA,WAAUpE,OAAQwE,EAAWxE,OAAQC,OAAQuE,EAAWvE,OAAQzB,GAAIkE,EAAa7P,EAAG4L,GAAIiE,EAAa5E,EAClH,CACA,eAAAqG,CAAgBC,GACZ,MAAMW,EAAiB,CAAC,EACxB,IAAK,MAAM3G,KAAWgG,EACbW,EAAe3G,KAChB2G,EAAe3G,GAAW,GAC9B2G,EAAe3G,KAEnB,MAAM4G,EAAgBlT,OAAOoD,KAAK6P,GAAgBpS,IAAIsS,QAAQC,MAAK,CAAChR,EAAGC,IAAM4Q,EAAe5Q,GAAK4Q,EAAe7Q,KAC1GiR,EAAa,CAAC,EACpBH,EAAcxQ,SAAQ,CAAC4Q,EAAYvS,IAAMsS,EAAWC,GAAcvS,EAAI,IACtE,IAAK,IAAIA,EAAI,EAAGA,EAAIuR,EAAS9R,OAAQO,IACjCuR,EAASvR,GAAKsS,EAAWf,EAASvR,GAC1C,CACA,iBAAAiS,CAAkBJ,EAAQpE,GACtB,MAAM+E,EAAQ9W,KAAK2J,MAAM3J,KAAK6F,IAAI7F,KAAK+W,MAAMhF,GAAQ,IAAM,EACrDiF,EAAW,EAAIhX,KAAK6S,IAAI,GAAIiE,GAC5BhH,EAAe,CAAC,EACtB,IAAK,IAAIxL,EAAI,EAAGA,EAAIyN,EAAOzN,IAAK,CAC5BwL,EAAaxL,GAAK,CAAC,EACnB,IAAK,IAAI2S,EAAId,EAAOlC,aAAa3P,GAAI2S,EAAId,EAAOlC,aAAa3P,EAAI,GAAI2S,IAAK,CACtE,MAAM1H,EAAI4G,EAAOpC,WAAWkD,GACxB1H,GAAKjL,GAAK6R,EAAOnC,gBAAgBiD,GAAKD,IAE1ClH,EAAaxL,GAAGiL,GAAK4G,EAAOnC,gBAAgBiD,GAChD,CACJ,CACA,OAAOnH,CACX,CAsKA,MAAA3G,CAAO0M,EAAU1B,EAAcpC,EAAO/B,GAClC,MAAMyB,EAAS,IAAIvM,aAAa6M,GAAOhL,KAAK,GACtC2K,EAAS,IAAIxM,aAAa6M,GAAOhL,KAAK,GACtC6P,EAAa,CAAC,EACpBf,EAAS5P,SAAQ,CAAC4J,EAASvL,KAClBsS,EAAW/G,KACZ+G,EAAW/G,GAAW,IAC1B+G,EAAW/G,GAASb,KAAK1K,EAAE,IAI/B,IAAI4S,EAAa,EACjB,MAAMC,EAAqB5T,OAAOoD,KAAKiQ,GACvCO,EAAmBR,MAAK,CAAChR,EAAGC,IAAMgR,EAAWhR,GAAG7B,OAAS6S,EAAWjR,GAAG5B,SACvE,IAAIqT,EAAS,EACTC,EAAU,EAEd,IAAK,MAAMC,KAAeH,EAAoB,CAC1C,MAAMtH,EAAU+G,EAAWU,GACrBrB,EAAarG,EAAUC,EAASsE,EAAc,EAAOnE,GACvDkH,IAAeE,IACfF,EAAa,EACbG,GANW,EAMaD,EACxBA,EAASpX,KAAK2C,IAAI3C,KAAKC,KAAc,EAATmX,GAAa,KAG7C,MAAMG,EAVS,EAUE,EAA4BH,EAV9B,EAUoDA,GAAU,EAAI,IAAM,GAEvF,IAAK,IAAI9S,EAAI,EAAGA,EAAI2R,EAAWxE,OAAO1N,OAAQO,IAC1CmN,EAAO5B,EAAQvL,IAbJ,EAaU2R,EAAWxE,OAAOnN,GAAkB8S,EAAS,IAAMG,EACxE7F,EAAO7B,EAAQvL,IAdJ,EAcU2R,EAAWvE,OAAOpN,GAAkB8S,EAAS,IAAMC,EAE5EH,GACJ,CACA,MAAO,CAAEzF,SAAQC,SACrB,CACA,aAAA8F,CAAc3B,EAAUvR,EAAGiL,GACvB,MAAMkI,EAAW5B,EAASvR,GACpBoT,EAAW7B,EAAStG,GAC1B,IAAK,IAAI0H,EAAI,EAAGA,EAAIpB,EAAS9R,OAAQkT,IAC7BpB,EAASoB,KAAOS,IAChB7B,EAASoB,GAAKQ,EAE1B,CACA,cAAA9B,CAAexB,EAAcpC,GACzB,IAAImF,EAAa,EACjB,MAAMjH,EAAK,GACLC,EAAK,GAEL8G,EAAWhX,KAAK6S,IAAI,IAAK,IACzBgD,EAAW,IAAI/O,MAAMiL,GAAOhL,MAAM,GACxC,IAAK,MAAMzC,KAAKf,OAAOoD,KAAKwN,GACxB,IAAK,MAAM5E,KAAKhM,OAAOoD,KAAKwN,EAAa7P,IACjC6P,EAAa7P,GAAGiL,GAAKyH,GACrB7C,EAAa7P,GAAGiL,KAAOmH,OAAOpS,IAAMoS,OAAOnH,GAAKmH,OAAOpS,KACvD2L,EAAGjB,KAAK0H,OAAOpS,IACf4L,EAAGlB,KAAK0H,OAAOnH,KACc,IAAzBsG,EAASa,OAAOpS,MAAuC,IAAzBuR,EAASa,OAAOnH,IAC1CsG,EAASa,OAAOpS,MAAQuR,EAASa,OAAOnH,KACxC9N,KAAK+V,cAAc3B,EAAUa,OAAOpS,GAAIoS,OAAOnH,KAErB,IAAzBsG,EAASa,OAAOpS,IACrBuR,EAASa,OAAOnH,IAAMsG,EAASa,OAAOpS,KAER,IAAzBuR,EAASa,OAAOnH,IACrBsG,EAASa,OAAOpS,IAAMuR,EAASa,OAAOnH,KAGtC2H,IACArB,EAASa,OAAOpS,IAAM4S,EACtBrB,EAASa,OAAOnH,IAAM2H,IAKtC,IAAK,IAAI5S,EAAI,EAAGA,EAAIuR,EAAS9R,OAAQO,KACZ,IAAjBuR,EAASvR,KACT4S,IACArB,EAASvR,GAAK4S,GAGtB,MAAO,CAAErB,WAAU5F,GAAI,IAAInL,YAAYmL,GAAKC,GAAI,IAAIpL,YAAYoL,GACpE,CAEA,iBAAAyH,CAAkBxB,EAAQpE,GACtB,IAAImF,EAAa,EACjB,MAAMjH,EAAK,GACLC,EAAK,GACL4G,EAAQ9W,KAAK2J,MAAM3J,KAAK6F,IAAI7F,KAAK+W,MAAMhF,GAAQ,IAAM,EACrDiF,EAAW,EAAIhX,KAAK6S,IAAI,GAAIiE,GAC5BjB,EAAW,IAAI/O,MAAMiL,GAAOhL,MAAM,GAClC6Q,EAAmB,IAAI9S,YAAYiN,EAAQ,GACjD,IAAI8F,EAAgB,EACpBD,EAAiB,GAAK,EACtB,IAAK,IAAItT,EAAI,EAAGA,EAAIyN,EAAOzN,IAAK,CAC5B,IAAK,IAAI2S,EAAId,EAAOlC,aAAa3P,GAAI2S,EAAId,EAAOlC,aAAa3P,EAAI,GAAI2S,IAAK,CACtE,MAAM1H,EAAI4G,EAAOpC,WAAWkD,GACxB1H,GAAKjL,GAAK6R,EAAOnC,gBAAgBiD,IAAMD,IAE3C/G,EAAGjB,KAAK1K,GACR4L,EAAGlB,KAAKO,GACRsI,KACqB,IAAjBhC,EAASvR,KAA8B,IAAjBuR,EAAStG,GAC3BsG,EAASvR,KAAOuR,EAAStG,IACzB9N,KAAK+V,cAAc3B,EAAUvR,EAAGiL,IAEd,IAAjBsG,EAASvR,GACduR,EAAStG,GAAKsG,EAASvR,IAED,IAAjBuR,EAAStG,GACdsG,EAASvR,GAAKuR,EAAStG,IAGvB2H,IACArB,EAASvR,GAAK4S,EACdrB,EAAStG,GAAK2H,GAEtB,CACAU,EAAiBtT,EAAI,GAAKuT,CAC9B,CACA,IAAK,IAAIvT,EAAI,EAAGA,EAAIuR,EAAS9R,OAAQO,KACZ,IAAjBuR,EAASvR,KACT4S,IACArB,EAASvR,GAAK4S,GAGtB,MAAO,CAAErB,WAAU5F,GAAI,IAAInL,YAAYmL,GAAKC,GAAI,IAAIpL,YAAYoL,GAAK0H,mBACzE,CACA,YAAAnC,CAAatB,GACT,MAAMrE,EAAe,CAAC,EACtB,IAAK,IAAIxL,EAAI,EAAGA,EAAI6P,EAAa7P,EAAEP,OAAQO,IAClCwL,EAAaqE,EAAa7P,EAAEA,MAC7BwL,EAAaqE,EAAa7P,EAAEA,IAAM,CAAC,GACvCwL,EAAaqE,EAAa7P,EAAEA,IAAI6P,EAAa5E,EAAEjL,IAAM,EAAI6P,EAAa3E,SAASlL,GAC1EwL,EAAaqE,EAAa5E,EAAEjL,MAC7BwL,EAAaqE,EAAa5E,EAAEjL,IAAM,CAAC,GACvCwL,EAAaqE,EAAa5E,EAAEjL,IAAI6P,EAAa7P,EAAEA,IAAM,EAAI6P,EAAa3E,SAASlL,GAEnF,OAAOwL,CACX,CACA,QAAAgG,CAAShG,EAAciC,GACnB,IAAK,IAAIzN,EAAI,EAAGA,EAAIyN,EAAOzN,IAClBwL,EAAaxL,KACdwL,EAAaxL,GAAK,CAAC,GACvBwL,EAAaxL,GAAGA,GAAK7C,KAAK6T,SAASJ,UAE3C,CACA,SAAAa,CAAUjG,GACN,IAAK,MAAMxL,KAAKf,OAAOoD,KAAKmJ,GAAe,CACvC,MAAM2E,EAAM3E,EAAaxL,GACzB,IAAIwT,EAAM,EACV,IAAK,MAAMvI,KAAKhM,OAAOoD,KAAK8N,GACxBqD,GAAOrD,EAAIlF,GACf,GAAY,IAARuI,EAEJ,IAAK,MAAMvI,KAAKhM,OAAOoD,KAAK8N,GACxB3E,EAAaxL,GAAGiL,IAAMuI,CAC9B,CACJ,CACA,MAAA9B,CAAOlG,EAAciC,GACjB,MAAMgG,EAAiB,CAAC,EA2BxB,IAAK,IAAIzT,EAAI,EAAGA,EAAIyN,EAAOzN,IACvB,GAAKwL,EAAaxL,GAAlB,CAGAyT,EAAezT,KAAOyT,EAAezT,GAAK,CAAC,GAC3C,IAAK,IAAIiL,EAAIjL,EAAGiL,EAAIwC,EAAOxC,IAAK,CAC5B,IAAKO,EAAaxL,KAAKiL,GACnB,SACJ,MAAMyI,EAAMvW,KAAKwW,eAAenI,EAAcxL,EAAGiL,GAC7CvP,KAAKkY,MAnCA,IAmCMF,GAAkB,IAC7BD,EAAezT,GAAGiL,GAAKyI,EAClBD,EAAexI,KAChBwI,EAAexI,GAAK,CAAC,GACzBwI,EAAexI,GAAGjL,GAAK0T,EAE/B,CAbY,CAehB,OAAOD,CACX,CAGA,OAAApF,CAAQ7C,GACJ,IAAK,MAAMxL,KAAKf,OAAOoD,KAAKmJ,GAAe,CACvC,MAAM2E,EAAM3E,EAAaxL,GACzB,IAAK,MAAMiL,KAAKhM,OAAOoD,KAAK8N,GACxB3E,EAAaxL,GAAGiL,GAAKvP,KAAK6S,IAAI/C,EAAaxL,GAAGiL,GAAI9N,KAAK6T,SAASL,cACxE,CACJ,CACA,cAAAgD,CAAenI,EAAcxL,EAAGiL,GAC5B,IAAIyI,EAAM,EACV,MAAMG,EAAiB5U,OAAOoD,KAAKmJ,EAAaxL,IAAM,CAAC,GACjD8T,EAAe7U,OAAOoD,KAAKmJ,EAAaP,IAAM,CAAC,GACrD,IAAK,MAAM0H,KAAKkB,EACRC,EAAazU,SAASsT,KACtBe,GAAOlI,EAAaxL,GAAG2S,GAAKnH,EAAaP,GAAG0H,IAEpD,OAAOe,CACX,EE9cJK,UAAYC,MAAOC,IACf,MAAM,KAAEC,EAAI,UAAExV,EAAS,QAAEG,EAAO,kBAAEsV,EAAiB,eAAEC,EAAc,YAAEC,EAAW,cAAE3D,EAAa,UAAE4D,EAAS,QAAEjG,GAAY4F,EAAMC,KAC9H5V,QAAQkH,KAAK,iBACb,IAAI+O,EAAS,KACb,GAAID,EACA,IACIC,QAAe/V,EAA2B0V,EAAMxV,EAAY,IAAK2V,EAAaF,EAAmBtV,EAASuV,EAC9G,CACA,MAAO1X,GACH4B,QAAQC,MAAM7B,EAClB,CAEC6X,IACGD,GACAhW,QAAQC,MAAM,+EAClBgW,QAAe,IAAI,KACdC,gBAAgBN,EAAMG,EAAa3V,EAAY,IAAK0V,EAAgBvV,EAASsV,IAEtF7V,QAAQsH,QAAQ,iBAEhB,MAAM6O,EAAU,IAAI5D,EAAiB,CAAEH,cAAeA,GAAiB,EAAGC,cAAetC,GAAW,IACpG/P,QAAQkH,KAAK,OACb,IAAIwJ,EAAM,KACV,GAAIsF,EACA,IACItF,QAAYyF,EAAQ7C,gBAAgB2C,EAAQL,EAAK,GAAGzU,OACxD,CACA,MAAO/C,GACH4B,QAAQC,MAAM,yDACdD,QAAQC,MAAM7B,EAClB,CAECsS,IACDA,QAAYyF,EAAQxD,UAAUsD,EAAQL,EAAK,GAAGzU,SAClDnB,QAAQsH,QAAQ,OAChB8O,YAAY,CAAE1F,OAAM,C,gECrCjB,MAAM2F,EAAS5I,GAAMA,QACrB,SAAS6I,EAAcC,EAAaC,EAASC,EAAKC,GACrD,GAAID,EAAMF,EAAYA,EAAYpV,OAAS,GACvC,OACJ,MAAMwV,EAAcJ,EAAYK,WAAWC,GAAMJ,EAAMI,IACvDN,EAAYO,MACZP,EAAYQ,OAAOJ,EAAa,EAAGF,GACnCD,EAAQM,MACRN,EAAQO,OAAOJ,EAAa,EAAGD,EACnC,C,WCNA1Q,EAAOgR,QAAU,CACfC,YAAY,EACZC,gCAAgC,EAChCC,aAAa,EACbC,oBAAqB,EACrBC,aAAc,EACdC,mBAAmB,EACnBC,QAAS,EACTC,SAAU,EACVC,mBAAmB,EACnBC,eAAgB,G,eCMlBV,EAAQW,OAAS,SAAUC,GACzBA,EAASA,GAAU,CAAC,EAEpB,IACElW,EACA2S,EACAwD,EAHEC,EAAU5T,MAAM8N,UAAU+F,MAAMC,KAAKC,WAAWF,MAAM,GAK1D,IAAKrW,EAAI,EAAGmW,EAAIC,EAAQ3W,OAAQO,EAAImW,EAAGnW,IACrC,GAAKoW,EAAQpW,GAEb,IAAK2S,KAAKyD,EAAQpW,GAAIkW,EAAOvD,GAAKyD,EAAQpW,GAAG2S,GAG/C,OAAOuD,CACT,EAQAZ,EAAQkB,iBAAmB,SAAUlK,GACnC,MAAI,eAAgBA,GAA2C,kBAAxBA,EAASiJ,WACvC,CAACkB,QAAS,iDAGjB,mCAAoCnK,GACe,kBAA5CA,EAASkJ,+BAET,CACLiB,QACE,qEAGF,gBAAiBnK,GAA4C,kBAAzBA,EAASmJ,YACxC,CAACgB,QAAS,kDAGjB,wBAAyBnK,GACe,iBAAjCA,EAASoJ,oBAET,CACLe,QAAS,2DAIX,iBAAkBnK,IACiB,iBAA1BA,EAASqJ,cAA6BrJ,EAASqJ,cAAgB,EAKxE,sBAAuBrJ,GACe,kBAA/BA,EAASsJ,kBAET,CAACa,QAAS,0DAGjB,YAAanK,IACiB,iBAArBA,EAASuJ,SAAwBvJ,EAASuJ,SAAW,EAK9D,aAAcvJ,KACiB,iBAAtBA,EAASwJ,UAAyBxJ,EAASwJ,UAAY,GAEzD,CAACW,QAAS,mDAGjB,sBAAuBnK,GACe,kBAA/BA,EAASyJ,kBAET,CAACU,QAAS,0DAGjB,mBAAoBnK,IAEiB,iBAA5BA,EAAS0J,gBAChB1J,EAAS0J,gBAAkB,EAKxB,KAFE,CAACS,QAAS,yDArBV,CAACA,QAAS,kDAZV,CAACA,QAAS,sDAoCrB,EASAnB,EAAQoB,kBAAoB,SAAU7K,EAAO8K,GAC3C,IAGI1L,EAHAuH,EAAQ3G,EAAM2G,MACdlM,EAAOuF,EAAMvF,KACb0O,EAAQ,CAAC,EAKT4B,EAAa,IAAIhW,aAlHb,GAkH0B4R,GAC9BqE,EAAa,IAAIjW,aAlHb,EAkH0B0F,GAyClC,OAtCA2E,EAAI,EACJY,EAAMiL,aAAY,SAAUnK,EAAMoK,GAEhC/B,EAAMrI,GAAQ1B,EAGd2L,EAAW3L,GAAK8L,EAAKhL,EACrB6K,EAAW3L,EAAI,GAAK8L,EAAK9K,EACzB2K,EAAW3L,EAAI,GAAK,EACpB2L,EAAW3L,EAAI,GAAK,EACpB2L,EAAW3L,EAAI,GAAK,EACpB2L,EAAW3L,EAAI,GAAK,EACpB2L,EAAW3L,EAAI,GAAK,EACpB2L,EAAW3L,EAAI,GAAK,EACpB2L,EAAW3L,EAAI,GAAK8L,EAAKzQ,MAAQ,EACjCsQ,EAAW3L,EAAI,GAAK8L,EAAKC,MAAQ,EAAI,EACrC/L,GAtIM,EAuIR,IAGAA,EAAI,EACJY,EAAMoL,aAAY,SAAUC,EAAMH,EAAMI,EAAQjB,EAAQkB,EAAIC,EAAIC,GAC9D,IAAIC,EAAKvC,EAAMmC,GACXK,EAAKxC,EAAMkB,GAEX9J,EAASuK,EAAcO,EAAMH,EAAMI,EAAQjB,EAAQkB,EAAIC,EAAIC,GAG/DV,EAAWW,EAAK,IAAMnL,EACtBwK,EAAWY,EAAK,IAAMpL,EAGtByK,EAAW5L,GAAKsM,EAChBV,EAAW5L,EAAI,GAAKuM,EACpBX,EAAW5L,EAAI,GAAKmB,EACpBnB,GAxJM,CAyJR,IAEO,CACLwM,MAAOb,EACPc,MAAOb,EAEX,EASAvB,EAAQqC,oBAAsB,SAAU9L,EAAO+K,EAAYgB,GACzD,IAAI5X,EAAI,EAER6L,EAAMgM,0BAAyB,SAAUlL,EAAMoK,GAM7C,OALAA,EAAKhL,EAAI6K,EAAW5W,GACpB+W,EAAK9K,EAAI2K,EAAW5W,EAAI,GAExBA,GAhLM,GAkLC4X,EAAgBA,EAAcjL,EAAMoK,GAAQA,CACrD,GACF,EAQAzB,EAAQwC,mBAAqB,SAAUjM,EAAO+K,GAC5C,IAAI5W,EAAI,EAER6L,EAAMiL,aAAY,SAAUnK,EAAMoK,GAChCH,EAAW5W,GAAK+W,EAAKhL,EACrB6K,EAAW5W,EAAI,GAAK+W,EAAK9K,EAEzBjM,GAnMM,EAoMR,GACF,EAUAsV,EAAQyC,qBAAuB,SAAUlM,EAAO+K,EAAYgB,GAI1D,IAHA,IAAIH,EAAQ5L,EAAM4L,QAChBO,EAAY,CAAC,EAENhY,EAAI,EAAGiL,EAAI,EAAGkL,EAAIS,EAAWnX,OAAQO,EAAImW,EAAGnW,GAnN7C,GAmNuD,CAC7D,GAAI4X,EAAe,CACjB,IAAIK,EAAUhZ,OAAOgX,OAAO,CAAC,EAAGpK,EAAMe,kBAAkB6K,EAAMxM,KAC9DgN,EAAQlM,EAAI6K,EAAW5W,GACvBiY,EAAQhM,EAAI2K,EAAW5W,EAAI,GAC3BiY,EAAUL,EAAcH,EAAMxM,GAAIgN,GAClCD,EAAUP,EAAMxM,IAAM,CACpBc,EAAGkM,EAAQlM,EACXE,EAAGgM,EAAQhM,EAEf,MACE+L,EAAUP,EAAMxM,IAAM,CACpBc,EAAG6K,EAAW5W,GACdiM,EAAG2K,EAAW5W,EAAI,IAItBiL,GACF,CAEA,OAAO+M,CACT,EAQA1C,EAAQ4C,aAAe,SAAsBC,GAC3C,IAAIC,EAAOC,OAAOC,KAAOD,OAAOE,UAC5B9T,EAAO0T,EAAG5H,WACViI,EAAYJ,EAAKK,gBACnB,IAAIC,KAAK,CAAC,IAAMjU,EAAO,iBAAkB,CAACkU,KAAM,qBAE9CC,EAAS,IAAIC,OAAOL,GAGxB,OAFAJ,EAAKU,gBAAgBN,GAEdI,CACT,C,iBC9PA,IAAIG,EAAU,EAAQ,MAClBC,EACF,WACEC,EAAU,EAAQ,MAClBC,EAAU,EAAQ,MAElBC,EAAmB,EAAQ,MAc/B,SAASC,EAA0BnD,EAAQpK,EAAOwN,GAChD,IAAKN,EAAQlN,GACX,MAAM,IAAIvM,MACR,sFAGkB,iBAAX+Z,IAAqBA,EAAS,CAAC9M,WAAY8M,IAEtD,IAAI9M,EAAa8M,EAAO9M,WAExB,GAA0B,iBAAfA,EACT,MAAM,IAAIjN,MACR,gEAGJ,GAAIiN,GAAc,EAChB,MAAM,IAAIjN,MACR,sFAGJ,IAAIqX,EAAgBqC,EAClB,kBAAmBK,EAASA,EAAO1C,cAAgB,UACnD2C,UAEE1B,EAC8B,mBAAzByB,EAAOzB,cAA+ByB,EAAOzB,cAAgB,KAGlEtL,EAAW4M,EAAQjD,OAAO,CAAC,EAAGkD,EAAkBE,EAAO/M,UACvDiN,EAAkBL,EAAQ1C,iBAAiBlK,GAE/C,GAAIiN,EACF,MAAM,IAAIja,MACR,kCAAoCia,EAAgB9C,SAIxD,IAEIzW,EAFAwZ,EAAWN,EAAQxC,kBAAkB7K,EAAO8K,GAKhD,IAAK3W,EAAI,EAAGA,EAAIuM,EAAYvM,IAC1BiZ,EAAQ3M,EAAUkN,EAAS/B,MAAO+B,EAAS9B,OAG7C,IAAIzB,EAKJ,OAAOiD,EAAQnB,qBAAqBlM,EAAO2N,EAAS/B,OAJlDyB,EAAQvB,oBAAoB9L,EAAO2N,EAAS/B,MAAOG,EAKvD,CAuBA,IAAI6B,EAAoBL,EAA0BM,KAAK,MAAM,GAC7DD,EAAkBxD,OAASmD,EAA0BM,KAAK,MAAM,GAChED,EAAkBE,cAjBlB,SAAuB9N,GACrB,IAAI2G,EAAyB,iBAAV3G,EAAqBA,EAAQA,EAAM2G,MAEtD,MAAO,CACLuD,kBAAmBvD,EAAQ,IAC3BoD,mBAAmB,EACnBC,QAAS,IACTF,aAAc,GACdG,SAAU,EAAIpa,KAAKke,IAAIpH,GAE3B,EASAlO,EAAOgR,QAAUmE,C,WC9FjB,IA8BII,EAAM,GAcVvV,EAAOgR,QAAU,SAAiBxW,EAAS8X,EAAYC,GAErD,IAAIV,EAAGzY,EAAG6E,EAAGuX,EAAIC,EAAIC,EAAItd,EAAGud,EAAGC,EAAGC,EAS9BC,EAAyBC,EAAaC,EAAOC,EAAOC,EAAKtP,EAAUoD,EAknBnEmM,EAAOC,EAAUC,EAAUC,EAAWC,EAAMC,EAznB5CtI,EAAQoE,EAAWnX,OACrB6G,EAAOuQ,EAAWpX,OAEhBgW,EAAc3W,EAAQ2W,YAEtBsF,EAAejc,EAAQkX,eAAiBlX,EAAQkX,eAIhDgF,EAAe,GAMnB,IAAKzY,EAAI,EAAGA,EAAIiQ,EAAOjQ,GAAKsX,EAC1BjD,EAAWrU,EA5DG,GA4DgBqU,EAAWrU,EA9D/B,GA+DVqU,EAAWrU,EA5DG,GA4DgBqU,EAAWrU,EA9D/B,GA+DVqU,EAAWrU,EAhED,GAgEgB,EAC1BqU,EAAWrU,EAhED,GAgEgB,EAI5B,GAAIzD,EAAQ0W,+BAAgC,CAE1C,IADA4E,EAA0B,EACrB7X,EAAI,EAAGA,EAAIiQ,EAAOjQ,GAAKsX,EAC1BO,GAA2BxD,EAAWrU,EApE5B,GAuEZ6X,GAA2B5H,EAAQqH,CACrC,CAKA,GAAI/a,EAAQiX,kBAAmB,CAE7B,IAIEkF,EACAC,EACAC,EANEtO,EAAOuO,IACTrO,GAAO,IACPD,EAAOsO,IACPpO,GAAO,IAMT,IAAKzK,EAAI,EAAGA,EAAIiQ,EAAOjQ,GAAKsX,EAC1BhN,EAAOnR,KAAK2C,IAAIwO,EAAM+J,EAAWrU,EA/F1B,IAgGPwK,EAAOrR,KAAK6F,IAAIwL,EAAM6J,EAAWrU,EAhG1B,IAiGPuK,EAAOpR,KAAK2C,IAAIyO,EAAM8J,EAAWrU,EAhG1B,IAiGPyK,EAAOtR,KAAK6F,IAAIyL,EAAM4J,EAAWrU,EAjG1B,IAqGT,IAAI8Y,EAAKtO,EAAOF,EACdyO,EAAKtO,EAAOF,EAsBd,IArBIuO,EAAKC,EAEPtO,GADAF,IAASuO,EAAKC,GAAM,GACND,EAGdtO,GADAF,IAASyO,EAAKD,GAAM,GACNC,EAIhBN,EAAa,IAAoB,EACjCA,EAAa,IAAwBnO,EAAOE,GAAQ,EACpDiO,EAAa,IAAwBlO,EAAOE,GAAQ,EACpDgO,EAAa,GAAmBtf,KAAK6F,IAAIwL,EAAOF,EAAMG,EAAOF,GAC7DkO,EAAa,IAA4B,EACzCA,EAAa,IAA2B,EACxCA,EAAa,GAAmB,EAChCA,EAAa,GAA4B,EACzCA,EAAa,GAA4B,EAGzC7E,EAAI,EACC5T,EAAI,EAAGA,EAAIiQ,EAAOjQ,GAAKsX,EAK1B,IAHAnc,EAAI,EACJyd,EAvGqB,IAyGR,CAIX,KAAIH,EAAatd,EAlHA,IAkH2B,GAA5C,CAgDE,GAAIsd,EAAatd,EAvKT,GAuK4B,EAAG,CAGrCsd,EAAatd,EA1KP,GA0K0B6E,EAChC,KACF,CAyIE,GAhIAyY,EAAatd,EAhLA,GAYf,EAoKyCyY,EACvC8D,EAAIe,EAAatd,EAnLX,GAmL8B,EAQpCsd,GAFAd,EAAIc,EAAatd,EAvLJ,IALP,IA8L2B,EACjCsd,EAAad,EA9LH,GA+LRc,EAAatd,EA/LL,GA+L4Buc,EACtCe,EAAad,EA/LH,GAgMRc,EAAatd,EAhML,GAgM4Buc,EACtCe,EAAad,EAhMP,GAgM0BD,EAChCe,EAAad,EAhMC,GAgM0BA,EAnL1C,EAoLEc,EAAad,EAhMA,IAgM2B,EACxCc,EAAad,EAhMP,GAgM0B,EAChCc,EAAad,EAhME,GAgM0B,EACzCc,EAAad,EAhME,GAgM0B,EAIzCc,GADAd,GA1LF,GAjBQ,IA4M2B,EACjCc,EAAad,EA5MH,GA6MRc,EAAatd,EA7ML,GA6M4Buc,EACtCe,EAAad,EA7MH,GA8MRc,EAAatd,EA9ML,GA8M4Buc,EACtCe,EAAad,EA9MP,GA8M0BD,EAChCe,EAAad,EA9MC,GA8M0BA,EAjM1C,EAkMEc,EAAad,EA9MA,IA8M2B,EACxCc,EAAad,EA9MP,GA8M0B,EAChCc,EAAad,EA9ME,GA8M0B,EACzCc,EAAad,EA9ME,GA8M0B,EAIzCc,GADAd,GAxMF,GAjBQ,IA0N2B,EACjCc,EAAad,EA1NH,GA2NRc,EAAatd,EA3NL,GA2N4Buc,EACtCe,EAAad,EA3NH,GA4NRc,EAAatd,EA5NL,GA4N4Buc,EACtCe,EAAad,EA5NP,GA4N0BD,EAChCe,EAAad,EA5NC,GA4N0BA,EA/M1C,EAgNEc,EAAad,EA5NA,IA4N2B,EACxCc,EAAad,EA5NP,GA4N0B,EAChCc,EAAad,EA5NE,GA4N0B,EACzCc,EAAad,EA5NE,GA4N0B,EAIzCc,GADAd,GAtNF,GAjBQ,IAwO2B,EACjCc,EAAad,EAxOH,GAyORc,EAAatd,EAzOL,GAyO4Buc,EACtCe,EAAad,EAzOH,GA0ORc,EAAatd,EA1OL,GA0O4Buc,EACtCe,EAAad,EA1OP,GA0O0BD,EAChCe,EAAad,EA1OC,GA2OZc,EAAatd,EA3OD,GA4Odsd,EAAad,EA3OA,IA2O2B,EACxCc,EAAad,EA3OP,GA2O0B,EAChCc,EAAad,EA3OE,GA2O0B,EACzCc,EAAad,EA3OE,GA2O0B,EAEzC/D,GAAK,EAgBD8E,EARFrE,EAAWoE,EAAatd,EA7PpB,GAfL,GA6QCsd,EAAatd,EA7PL,GAgQNkZ,EAAWoE,EAAatd,EAjQtB,GAdL,GAgRGsd,EAAatd,EAhQP,GAmQFsd,EAAatd,EAhQR,GAmQLsd,EAAatd,EAnQR,GAYf,EA2PMkZ,EAAWoE,EAAatd,EA5QtB,GAdL,GA2RGsd,EAAatd,EA3QP,GA8QFsd,EAAatd,EA3QR,GA2QkC6d,GAGvCP,EAAatd,EA9QR,GA8QkC6d,GAK/CP,EAAatd,EAlRP,GAmRJkZ,EAAWoE,EAAatd,EAzRpB,GATF,GAmSJsd,EAAatd,EAnRE,GAoRbkZ,EAAWoE,EAAatd,EA3RpB,GAfL,GA2SDsd,EAAatd,EApRE,GAqRbkZ,EAAWoE,EAAatd,EA7RpB,GAdL,GA6SDsd,EAAaC,EA/RP,GA+R0BD,EAAatd,EA/RvC,GAgSNsd,EAAatd,EAhSP,IAgS2B,EAqB7Bud,KAfAC,EAHAtE,EAAWrU,EAlTd,GAkT4ByY,EAAatd,EAlShC,GAmSJkZ,EAAWrU,EAlThB,GAkT8ByY,EAAatd,EAlSlC,GAoSDsd,EAAatd,EAjST,GAoSJsd,EAAatd,EApST,GAYf,EA2RQkZ,EAAWrU,EA1ThB,GA0T8ByY,EAAatd,EA1SlC,GA4SDsd,EAAatd,EAzST,GAySmC6d,GAGvCP,EAAatd,EA5ST,GA4SmC6d,IAIlC,CAGZ,GAAIJ,IAAuB,CACzBzd,EAAIud,EACJ,QACF,CAGEE,EApTW,EAqTX,KAEJ,CAIAH,EAAaE,EArUP,GAqU2B3Y,EACjC,KAEJ,CAtMM0Y,EAHArE,EAAWrU,EA9IZ,GA8I0ByY,EAAatd,EA9H9B,GA+HNkZ,EAAWrU,EA9Id,GA8I4ByY,EAAatd,EA9HhC,GAgIJsd,EAAatd,EA7HN,GAgIPsd,EAAatd,EAhIN,GAYf,EAuHMkZ,EAAWrU,EAtJd,GAsJ4ByY,EAAatd,EAtIhC,GAwIJsd,EAAatd,EArIN,GAqIgC6d,GAGvCP,EAAatd,EAxIN,GAwIgC6d,GAK/CP,EAAatd,EA3II,IA4Idsd,EAAatd,EA5IC,GA6Ibsd,EAAatd,EA9IT,GA+IJkZ,EAAWrU,EApKZ,GAoK0BqU,EAAWrU,EA9JlC,KA+JHyY,EAAatd,EAhJR,GAgJ2BkZ,EAAWrU,EA/JxC,IAiKNyY,EAAatd,EAhJI,IAiJdsd,EAAatd,EAjJC,GAkJbsd,EAAatd,EApJT,GAqJJkZ,EAAWrU,EAzKZ,GAyK0BqU,EAAWrU,EApKlC,KAqKHyY,EAAatd,EAtJR,GAsJ2BkZ,EAAWrU,EArKxC,IAuKNyY,EAAatd,EAxJL,IAwJyBkZ,EAAWrU,EAvKtC,GA0KN7E,EAAIud,CAwKR,CAEJ,CAMA,GAAInc,EAAQiX,mBAIV,IAHAsE,EAAcvb,EAAQ6W,aAGjBpT,EAAI,EAAGA,EAAIiQ,EAAOjQ,GAAKsX,EAI1B,IADAnc,EAAI,IAEF,GAAIsd,EAAatd,EArVA,IAqV2B,EAA5C,CAgBE,GAZAwN,EACExP,KAAK6S,IACHqI,EAAWrU,EA/WZ,GA+W0ByY,EAAatd,EAzVzB,GA0Vb,GAEFhC,KAAK6S,IACHqI,EAAWrU,EAlXZ,GAkX0ByY,EAAatd,EA5VzB,GA6Vb,GAKC,GAFLyc,EAAIa,EAAatd,EArWT,IAuWKyc,EAAKjP,EAAW6P,EAAc,CA6CzC,GA1CAT,EACE1D,EAAWrU,EA7XZ,GA6X0ByY,EAAatd,EAvWzB,GAwWf6c,EACE3D,EAAWrU,EA9XZ,GA8X0ByY,EAAatd,EAxWzB,IA0WK,IAAhB+X,EAEEvK,EAAW,GACboD,EACG+L,EACCzD,EAAWrU,EAhYf,GAiYIyY,EAAatd,EAlXf,GAmXAwN,EAEF0L,EAAWrU,EAxYb,IAwY6B+X,EAAQhM,EACnCsI,EAAWrU,EAxYb,IAwY6BgY,EAAQjM,GAC1BpD,EAAW,IACpBoD,GACI+L,EACAzD,EAAWrU,EAzYf,GA0YIyY,EAAatd,EA3Xf,GA4XAhC,KAAKwI,KAAKgH,GAEZ0L,EAAWrU,EAjZb,IAiZ6B+X,EAAQhM,EACnCsI,EAAWrU,EAjZb,IAiZ6BgY,EAAQjM,GAIjCpD,EAAW,IACboD,EACG+L,EACCzD,EAAWrU,EArZf,GAsZIyY,EAAatd,EAvYf,GAwYAwN,EAEF0L,EAAWrU,EA7Zb,IA6Z6B+X,EAAQhM,EACnCsI,EAAWrU,EA7Zb,IA6Z6BgY,EAAQjM,IAKvC5Q,EAAIsd,EAAatd,EAlZH,IAmZN,EAAG,MAEX,QACF,CAEEA,EAAIsd,EAAatd,EAvZJ,EA+cjB,MAHE,IA/CAsc,EAAKgB,EAAatd,EAlaV,KAoaE,GAAKsc,IAAOzX,IAIpB2I,GAHAoP,EAAQ1D,EAAWrU,EApblB,GAobgCqU,EAAWoD,EApb3C,IAubkBM,GAFnBC,EAAQ3D,EAAWrU,EApblB,GAobgCqU,EAAWoD,EApb3C,IAsbkCO,GAEf,IAAhB9E,EAEEvK,EAAW,GACboD,EACG+L,EACCzD,EAAWrU,EAxbf,GAybIqU,EAAWoD,EAzbf,GA0bE9O,EAEF0L,EAAWrU,EAhcb,IAgc6B+X,EAAQhM,EACnCsI,EAAWrU,EAhcb,IAgc6BgY,EAAQjM,GAC1BpD,EAAW,IACpBoD,GACI+L,EACAzD,EAAWrU,EAjcf,GAkcIqU,EAAWoD,EAlcf,GAmcEte,KAAKwI,KAAKgH,GAEZ0L,EAAWrU,EAzcb,IAyc6B+X,EAAQhM,EACnCsI,EAAWrU,EAzcb,IAyc6BgY,EAAQjM,GAIjCpD,EAAW,IACboD,EACG+L,EACCzD,EAAWrU,EA7cf,GA8cIqU,EAAWoD,EA9cf,GA+cE9O,EAEF0L,EAAWrU,EArdb,IAqd6B+X,EAAQhM,EACnCsI,EAAWrU,EArdb,IAqd6BgY,EAAQjM,KAMzC5Q,EAAIsd,EAAatd,EA3cD,IA6cR,EAAG,WAUjB,IAHA2c,EAAcvb,EAAQ6W,aAGjBmE,EAAK,EAAGA,EAAKtH,EAAOsH,GAAMD,EAC7B,IAAKE,EAAK,EAAGA,EAAKD,EAAIC,GAAMF,EAE1BS,EAAQ1D,EAAWkD,EA7ed,GA6e6BlD,EAAWmD,EA7exC,GA8eLQ,EAAQ3D,EAAWkD,EA7ed,GA6e6BlD,EAAWmD,EA7exC,IA+ee,IAAhBtE,GAEFvK,EACExP,KAAKwI,KAAKoW,EAAQA,EAAQC,EAAQA,GAClC3D,EAAWkD,EA5eP,GA6eJlD,EAAWmD,EA7eP,IA+eS,GACbzL,EACG+L,EACCzD,EAAWkD,EApfX,GAqfAlD,EAAWmD,EArfX,GAsfF7O,EACAA,EAGF0L,EAAWkD,EA9fT,IA8f0BQ,EAAQhM,EACpCsI,EAAWkD,EA9fT,IA8f0BS,EAAQjM,EAEpCsI,EAAWmD,EAjgBT,IAigB0BO,EAAQhM,EACpCsI,EAAWmD,EAjgBT,IAigB0BQ,EAAQjM,GAC3BpD,EAAW,IACpBoD,EACE,IACA+L,EACAzD,EAAWkD,EAngBT,GAogBFlD,EAAWmD,EApgBT,GAugBJnD,EAAWkD,EA3gBT,IA2gB0BQ,EAAQhM,EACpCsI,EAAWkD,EA3gBT,IA2gB0BS,EAAQjM,EAEpCsI,EAAWmD,EA9gBT,IA8gB0BO,EAAQhM,EACpCsI,EAAWmD,EA9gBT,IA8gB0BQ,EAAQjM,IAItCpD,EAAWxP,KAAKwI,KAAKoW,EAAQA,EAAQC,EAAQA,IAE9B,IACbjM,EACG+L,EACCzD,EAAWkD,EAphBX,GAqhBAlD,EAAWmD,EArhBX,GAshBF7O,EACAA,EAGF0L,EAAWkD,EA9hBT,IA8hB0BQ,EAAQhM,EACpCsI,EAAWkD,EA9hBT,IA8hB0BS,EAAQjM,EAEpCsI,EAAWmD,EAjiBT,IAiiB0BO,EAAQhM,EACpCsI,EAAWmD,EAjiBT,IAiiB0BQ,EAAQjM,GAW9C,IAFA4L,EAAIpb,EAAQ+W,QAAU/W,EAAQ6W,aAC9B0E,EAAcvb,EAAQ6W,aACjBpT,EAAI,EAAGA,EAAIiQ,EAAOjQ,GAAKsX,EAC1BvL,EAAS,EAGTgM,EAAQ1D,EAAWrU,EAnjBV,GAojBTgY,EAAQ3D,EAAWrU,EAnjBV,GAojBT2I,EAAWxP,KAAKwI,KAAKxI,KAAK6S,IAAI+L,EAAO,GAAK5e,KAAK6S,IAAIgM,EAAO,IAEtDzb,EAAQ8W,kBAEN1K,EAAW,IAAGoD,EAAS+L,EAAczD,EAAWrU,EAnjB1C,GAmjB2D2X,GAGjEhP,EAAW,IACboD,EAAU+L,EAAczD,EAAWrU,EAvjB3B,GAujB4C2X,EAAKhP,GAI7D0L,EAAWrU,EA/jBD,IA+jBiB+X,EAAQhM,EACnCsI,EAAWrU,EA/jBD,IA+jBiBgY,EAAQjM,EAUrC,IALA+L,EACE,GAAKvb,EAAQ0W,+BAAiC4E,EAA0B,GAIrE1d,EAAI,EAAGA,EAAI4J,EAAM5J,GA7iBd,EA8iBNod,EAAKjD,EAAWna,EAlkBF,GAmkBdqd,EAAKlD,EAAWna,EAlkBF,GAmkBdud,EAAIpD,EAAWna,EAlkBD,GAqkBd8d,EAAM9e,KAAK6S,IAAI0L,EAAGnb,EAAQ4W,qBAG1B4E,EAAQ1D,EAAWkD,EArlBV,GAqlByBlD,EAAWmD,EArlBpC,GAslBTQ,EAAQ3D,EAAWkD,EArlBV,GAqlByBlD,EAAWmD,EArlBpC,IAwlBW,IAAhBtE,GACFvK,EACExP,KAAKwI,KAAKoW,EAAQA,EAAQC,EAAQA,GAClC3D,EAAWkD,EAplBH,GAqlBRlD,EAAWmD,EArlBH,GAulBNjb,EAAQyW,WACNzW,EAAQ0W,+BAENtK,EAAW,IACboD,GACI+L,EAAcG,EAAM9e,KAAKke,IAAI,EAAI1O,GACnCA,EACA0L,EAAWkD,EAhmBT,IAomBF5O,EAAW,IACboD,GAAW+L,EAAcG,EAAM9e,KAAKke,IAAI,EAAI1O,GAAaA,GAIzDpM,EAAQ0W,+BAENtK,EAAW,IACboD,GAAW+L,EAAcG,EAAO5D,EAAWkD,EA5mBvC,IAgnBF5O,EAAW,IACboD,GAAU+L,EAAcG,KAK9BtP,EAAWxP,KAAKwI,KAAKxI,KAAK6S,IAAI+L,EAAO,GAAK5e,KAAK6S,IAAIgM,EAAO,IAEtDzb,EAAQyW,WACNzW,EAAQ0W,+BAENtK,EAAW,IACboD,GACI+L,EAAcG,EAAM9e,KAAKke,IAAI,EAAI1O,GACnCA,EACA0L,EAAWkD,EA/nBT,IAmoBF5O,EAAW,IACboD,GAAW+L,EAAcG,EAAM9e,KAAKke,IAAI,EAAI1O,GAAaA,GAGzDpM,EAAQ0W,gCAGVtK,EAAW,EACXoD,GAAW+L,EAAcG,EAAO5D,EAAWkD,EA3oBrC,KA+oBN5O,EAAW,EACXoD,GAAU+L,EAAcG,IAO1BtP,EAAW,IAEb0L,EAAWkD,EA7pBH,IA6pBoBQ,EAAQhM,EACpCsI,EAAWkD,EA7pBH,IA6pBoBS,EAAQjM,EAEpCsI,EAAWmD,EAhqBH,IAgqBoBO,EAAQhM,EACpCsI,EAAWmD,EAhqBH,IAgqBoBQ,EAAQjM,GASxC,IAAoB,IAAhBmH,EACF,IAAKlT,EAAI,EAAGA,EAAIiQ,EAAOjQ,GAAKsX,EACS,IAA/BjD,EAAWrU,EArqBJ,MAsqBTkY,EAAQ/e,KAAKwI,KACXxI,KAAK6S,IAAIqI,EAAWrU,EA9qBhB,GA8qB8B,GAChC7G,KAAK6S,IAAIqI,EAAWrU,EA9qBlB,GA8qBgC,KA/oB9B,KAmpBNqU,EAAWrU,EAnrBP,GAgCE,GAopBHqU,EAAWrU,EAprBV,GAorBsCkY,EAC1C7D,EAAWrU,EAprBP,GA+BE,GAspBHqU,EAAWrU,EArrBV,GAqrBsCkY,GAG5CC,EACE9D,EAAWrU,EAtrBL,GAurBN7G,KAAKwI,MACF0S,EAAWrU,EA1rBN,GA0rByBqU,EAAWrU,EA5rBxC,KA6rBCqU,EAAWrU,EA3rBR,GA2rB2BqU,EAAWrU,EA7rB1C,KA8rBCqU,EAAWrU,EA3rBR,GA2rB2BqU,EAAWrU,EA7rB1C,KA8rBGqU,EAAWrU,EA5rBV,GA4rB6BqU,EAAWrU,EA9rB5C,KAisBNoY,EACEjf,KAAKwI,MACF0S,EAAWrU,EAlsBN,GAksByBqU,EAAWrU,EApsBxC,KAqsBCqU,EAAWrU,EAnsBR,GAmsB2BqU,EAAWrU,EArsB1C,KAssBCqU,EAAWrU,EAnsBR,GAmsB2BqU,EAAWrU,EArsB1C,KAssBGqU,EAAWrU,EApsBV,GAosB6BqU,EAAWrU,EAtsB5C,KAusBA,EAENqY,EAAa,GAAMlf,KAAKke,IAAI,EAAIe,IAAc,EAAIjf,KAAKwI,KAAKwW,IAG5DG,EACEjE,EAAWrU,EAhtBR,GAitBHqU,EAAWrU,EA/sBP,IA+sBuBqY,EAAY9b,EAAQgX,UACjDc,EAAWrU,EAltBN,GAktBoBsY,EAEzBC,EACElE,EAAWrU,EAptBR,GAqtBHqU,EAAWrU,EAntBP,IAmtBuBqY,EAAY9b,EAAQgX,UACjDc,EAAWrU,EAttBN,GAstBoBuY,QAI7B,IAAKvY,EAAI,EAAGA,EAAIiQ,EAAOjQ,GAAKsX,EACS,IAA/BjD,EAAWrU,EAntBJ,KAotBTmY,EACE9D,EAAWrU,EAxtBL,GAytBN7G,KAAKwI,MACF0S,EAAWrU,EA5tBN,GA4tByBqU,EAAWrU,EA9tBxC,KA+tBCqU,EAAWrU,EA7tBR,GA6tB2BqU,EAAWrU,EA/tB1C,KAguBCqU,EAAWrU,EA7tBR,GA6tB2BqU,EAAWrU,EA/tB1C,KAguBGqU,EAAWrU,EA9tBV,GA8tB6BqU,EAAWrU,EAhuB5C,KAmuBNoY,EACEjf,KAAKwI,MACF0S,EAAWrU,EApuBN,GAouByBqU,EAAWrU,EAtuBxC,KAuuBCqU,EAAWrU,EAruBR,GAquB2BqU,EAAWrU,EAvuB1C,KAwuBCqU,EAAWrU,EAruBR,GAquB2BqU,EAAWrU,EAvuB1C,KAwuBGqU,EAAWrU,EAtuBV,GAsuB6BqU,EAAWrU,EAxuB5C,KAyuBA,EAENqY,EACGhE,EAAWrU,EAxuBC,GAwuBuB7G,KAAKke,IAAI,EAAIe,IAChD,EAAIjf,KAAKwI,KAAKwW,IAGjB9D,EAAWrU,EA5uBI,GA4uBoB7G,KAAK2C,IACtC,EACA3C,KAAKwI,KACF0W,GACElf,KAAK6S,IAAIqI,EAAWrU,EArvBrB,GAqvBmC,GACjC7G,KAAK6S,IAAIqI,EAAWrU,EArvBtB,GAqvBoC,KACnC,EAAI7G,KAAKwI,KAAKwW,MAKrBG,EACEjE,EAAWrU,EA/vBR,GAgwBHqU,EAAWrU,EA9vBP,IA8vBuBqY,EAAY9b,EAAQgX,UACjDc,EAAWrU,EAjwBN,GAiwBoBsY,EAEzBC,EACElE,EAAWrU,EAnwBR,GAowBHqU,EAAWrU,EAlwBP,IAkwBuBqY,EAAY9b,EAAQgX,UACjDc,EAAWrU,EArwBN,GAqwBoBuY,GAM/B,MAAO,CAAC,CACV,C,eClxBA,SAASU,EAAahf,GAEpB,MAAqB,iBAAVA,GAAsBif,MAAMjf,GAAe,EAE/CA,CACT,CA2HA8Y,EAAQ,GAAyB,SAAUoG,GACzC,OAxEF,SAA+BC,EAAgBC,GAC7C,IAAIC,EAAS,CAAC,EAEVC,EAAkB,SAAU3G,GAC9B,YAAiB,IAANA,EAA0ByG,EAE9BzG,CACT,EAE4B,mBAAjByG,IAA6BE,EAAkBF,GAE1D,IAAIG,EAAM,SAAUC,GAClB,OAAOF,EAAgBE,EAAWL,GACpC,EAEIM,EAAgB,WAClB,OAAOH,OAAgBI,EACzB,EAiDA,MA/C8B,iBAAnBP,GACTE,EAAOM,eAAiBJ,EACxBF,EAAOO,UAAY,SAAUvQ,EAAOqL,GAClC,OAAO6E,EAAIlQ,EAAMwQ,kBAAkBnF,GACrC,EACA2E,EAAOvC,UAAY,SAAUpC,EAAM8E,GACjC,OAAOD,EAAIC,EACb,EACAH,EAAOS,iBAAmBT,EAAOvC,UACjCuC,EAAOU,iBAAmBV,EAAOvC,WACE,mBAAnBqC,GAChBE,EAAOM,eAAiB,WACtB,MAAM,IAAI7c,MACR,oEAEJ,EACAuc,EAAOO,UAAY,SAAUvQ,EAAOqL,GAElC,IAAIsF,EAAc3Q,EAAM2Q,YAAYtF,GACpC,OAAO4E,EACLH,EACEzE,EACArL,EAAMwQ,kBAAkBnF,GACxBsF,EAAY,GACZA,EAAY,GACZ3Q,EAAMe,kBAAkB4P,EAAY,IACpC3Q,EAAMe,kBAAkB4P,EAAY,IACpC3Q,EAAM4Q,aAAavF,IAGzB,EACA2E,EAAOvC,UAAY,SAAU5c,EAAG2E,EAAG8Y,EAAGuC,EAAGtF,EAAIC,EAAIC,GAC/C,OAAOwE,EAAgBH,EAAejf,EAAG2E,EAAG8Y,EAAGuC,EAAGtF,EAAIC,EAAIC,GAC5D,EACAuE,EAAOS,iBAAmB,SAAU5f,EAAG2E,EAAG8Y,EAAGuC,GAC3C,OAAOZ,EAAgBH,EAAejf,EAAG2E,EAAG8Y,EAAGuC,GACjD,EACAb,EAAOU,iBAAmB,SAAU7f,EAAG2E,GACrC,OAAOya,EAAgBH,EAAejf,EAAG2E,GAC3C,IAEAwa,EAAOM,eAAiBF,EACxBJ,EAAOO,UAAYH,EACnBJ,EAAOvC,UAAY2C,EACnBJ,EAAOU,iBAAmBN,GAGrBJ,CACT,CAKSc,CAAsBjB,EAAMF,EACrC,C,WC1HAlX,EAAOgR,QAAU,SAAiB9Y,GAChC,OACY,OAAVA,GACiB,iBAAVA,GACmC,mBAAnCA,EAAMogB,0BACa,mBAAnBpgB,EAAMqgB,UACU,kBAAhBrgB,EAAMsgB,KAEjB,C,kBCtBoExY,EAAOgR,QAAuI,WAAY,aAAa,SAASoH,EAAEhgB,GAAG,OAAOggB,EAAE,mBAAmBK,QAAQ,iBAAiBA,OAAOC,SAAS,SAASN,GAAG,cAAcA,CAAC,EAAE,SAASA,GAAG,OAAOA,GAAG,mBAAmBK,QAAQL,EAAE5L,cAAciM,QAAQL,IAAIK,OAAOzM,UAAU,gBAAgBoM,CAAC,GAAIhgB,EAAE,CAAC,SAASA,EAAEggB,EAAEhgB,GAAGggB,EAAEpM,UAAUrR,OAAOge,OAAOvgB,EAAE4T,WAAWoM,EAAEpM,UAAUQ,YAAY4L,EAAEhf,EAAEgf,EAAEhgB,EAAE,CAAC,SAAS6F,EAAEma,GAAG,OAAOna,EAAEtD,OAAOie,eAAeje,OAAOke,eAAezD,OAAO,SAASgD,GAAG,OAAOA,EAAEU,WAAWne,OAAOke,eAAeT,EAAE,EAAEna,EAAEma,EAAE,CAAC,SAAShf,EAAEgf,EAAEhgB,GAAG,OAAOgB,EAAEuB,OAAOie,eAAeje,OAAOie,eAAexD,OAAO,SAASgD,EAAEhgB,GAAG,OAAOggB,EAAEU,UAAU1gB,EAAEggB,CAAC,EAAEhf,EAAEgf,EAAEhgB,EAAE,CAAgQ,SAAS2gB,EAAEX,EAAEhgB,EAAE6F,GAAG,OAAO8a,EAAxR,WAAa,GAAG,oBAAoBC,UAAUA,QAAQC,UAAU,OAAM,EAAG,GAAGD,QAAQC,UAAUC,KAAK,OAAM,EAAG,GAAG,mBAAmBC,MAAM,OAAM,EAAG,IAAI,OAAOC,QAAQpN,UAAUqN,QAAQrH,KAAKgH,QAAQC,UAAUG,QAAQ,IAAG,WAAa,MAAI,CAAE,CAAC,MAAMhB,GAAG,OAAM,CAAE,CAAC,CAA4B1c,GAAIsd,QAAQC,UAAU7D,OAAO,SAASgD,EAAEhgB,EAAE6F,GAAG,IAAIvC,EAAE,CAAC,MAAMA,EAAE0K,KAAK3N,MAAMiD,EAAEtD,GAAG,IAAI2gB,EAAE,IAAIO,SAASlE,KAAK3c,MAAM2f,EAAE1c,IAAI,OAAOuC,GAAG7E,EAAE2f,EAAE9a,EAAE+N,WAAW+M,CAAC,EAAEA,EAAEtgB,MAAM,KAAKwZ,UAAU,CAAC,SAASlV,EAAEqb,GAAG,IAAIhgB,EAAE,mBAAmBmhB,IAAI,IAAIA,SAAI,EAAO,OAAOxc,EAAE,SAASqb,GAAG,GAAG,OAAOA,IAAI1c,EAAE0c,GAAG,IAAIkB,SAASrN,SAAS+F,KAAKtW,GAAG8d,QAAQ,kBAAkB,OAAOpB,EAAE,IAAI1c,EAAE,GAAG,mBAAmB0c,EAAE,MAAM,IAAIqB,UAAU,sDAAsD,QAAG,IAASrhB,EAAE,CAAC,GAAGA,EAAEwE,IAAIwb,GAAG,OAAOhgB,EAAEqf,IAAIW,GAAGhgB,EAAEmF,IAAI6a,EAAErb,EAAE,CAAC,SAASA,IAAI,OAAOgc,EAAEX,EAAEnG,UAAUhU,EAAEpF,MAAM2T,YAAY,CAAC,OAAOzP,EAAEiP,UAAUrR,OAAOge,OAAOP,EAAEpM,UAAU,CAACQ,YAAY,CAACtU,MAAM6E,EAAE2c,YAAW,EAAGC,UAAS,EAAGC,cAAa,KAAMxgB,EAAE2D,EAAEqb,EAAE,EAAErb,EAAEqb,EAAE,CAAC,SAAShc,EAAEgc,GAAG,QAAG,IAASA,EAAE,MAAM,IAAIyB,eAAe,6DAA6D,OAAOzB,CAAC,CAAC,IAAIpF,EAAE,WAAW,IAAI,IAAIoF,EAAEnG,UAAU,GAAG7Z,EAAE,EAAE6F,EAAEgU,UAAU9W,OAAO/C,EAAE6F,EAAE7F,IAAI,GAAG6Z,UAAU7Z,GAAG,IAAI,IAAIgB,KAAK6Y,UAAU7Z,GAAGggB,EAAEhf,GAAG6Y,UAAU7Z,GAAGgB,GAAG,OAAOgf,CAAC,EAAE,SAASzS,EAAEyS,EAAEhgB,EAAE6F,EAAE7E,GAAG,IAAIsC,EAAE0c,EAAE0B,OAAOrC,IAAIrf,GAAG2gB,EAAE,KAAK,OAAOrd,EAAEqd,EAAE,UAAU3f,EAAEsC,EAAEqe,KAAKre,EAAEqe,IAAI9b,IAAIvC,EAAEse,YAAYte,EAAEse,WAAW/b,GAAG,aAAa7E,EAAEsC,EAAEqe,KAAKre,EAAEqe,IAAI9b,GAAGvC,EAAEse,YAAYte,EAAEse,WAAW/b,GAAG8a,CAAC,CAAC,SAASlD,EAAEzd,GAAG,MAAM,WAAWggB,EAAEhgB,IAAI,OAAOA,CAAC,CAAC,SAAS6hB,EAAE7B,GAAG,IAAIhgB,EAAE,IAAIA,KAAKggB,EAAE,OAAM,EAAG,OAAM,CAAE,CAAC,SAAS8B,EAAE9B,EAAEhgB,EAAE6F,GAAGtD,OAAOwf,eAAe/B,EAAEhgB,EAAE,CAACshB,YAAW,EAAGE,cAAa,EAAGD,UAAS,EAAGzhB,MAAM+F,GAAG,CAAC,SAASmc,EAAEhC,EAAEhgB,EAAE6F,GAAG,IAAI7E,EAAE,CAACsgB,YAAW,EAAGE,cAAa,GAAI,mBAAmB3b,EAAE7E,EAAEqe,IAAIxZ,GAAG7E,EAAElB,MAAM+F,EAAE7E,EAAEugB,UAAS,GAAIhf,OAAOwf,eAAe/B,EAAEhgB,EAAEgB,EAAE,CAAC,SAASyY,EAAEuG,GAAG,SAAQvC,EAAEuC,IAAMA,EAAEV,aAAaxZ,MAAMmc,QAAQjC,EAAEV,YAAY,CAAC,mBAAmB/c,OAAOgX,SAASqB,EAAErY,OAAOgX,QAAQ,IAAIiE,EAAEjO,EAAE,CAACqJ,QAAQ,CAAC,GAAG2E,EAAE,iBAAiBqD,QAAQA,QAAQ,KAAKnI,EAAE8E,GAAG,mBAAmBA,EAAEld,MAAMkd,EAAEld,MAAM,SAAS2f,EAAEhgB,EAAE6F,GAAG,OAAOqb,SAAStN,UAAUvT,MAAMuZ,KAAKoG,EAAEhgB,EAAE6F,EAAE,EAAE2X,EAAED,GAAG,mBAAmBA,EAAE2E,QAAQ3E,EAAE2E,QAAQ3f,OAAO4f,sBAAsB,SAASnC,GAAG,OAAOzd,OAAO6f,oBAAoBpC,GAAGqC,OAAO9f,OAAO4f,sBAAsBnC,GAAG,EAAE,SAASA,GAAG,OAAOzd,OAAO6f,oBAAoBpC,EAAE,EAAE,IAAIpb,EAAE8Q,OAAOqJ,OAAO,SAASiB,GAAG,OAAOA,GAAGA,CAAC,EAAE,SAASsC,IAAIA,EAAEC,KAAK3I,KAAKnZ,KAAK,CAAC8O,EAAEqJ,QAAQ0J,EAAE/S,EAAEqJ,QAAQ4J,KAAK,SAASxC,EAAEhgB,GAAG,OAAO,IAAIN,SAAQ,SAAUmG,EAAE7E,GAAG,SAASsC,EAAEuC,GAAGma,EAAEyC,eAAeziB,EAAE2gB,GAAG3f,EAAE6E,EAAE,CAAC,SAAS8a,IAAI,mBAAmBX,EAAEyC,gBAAgBzC,EAAEyC,eAAe,QAAQnf,GAAGuC,EAAE,GAAG8T,MAAMC,KAAKC,WAAW,CAAC6I,EAAE1C,EAAEhgB,EAAE2gB,EAAE,CAAC6B,MAAK,IAAK,UAAUxiB,GAAG,SAASggB,EAAEhgB,GAAK,mBAAmBggB,EAAE2C,IAAID,EAAE1C,EAAE,QAAQhgB,EAAU,CAACwiB,MAAK,GAAZ,CAAzD,CAA2DxC,EAAE1c,EAAa,GAAE,EAAEgf,EAAEM,aAAaN,EAAEA,EAAE1O,UAAUiP,aAAQ,EAAOP,EAAE1O,UAAUkP,aAAa,EAAER,EAAE1O,UAAUmP,mBAAc,EAAO,IAAI9M,EAAE,GAAG,SAAStH,EAAEqR,GAAG,GAAG,mBAAmBA,EAAE,MAAM,IAAIqB,UAAU,0EAA0ErB,EAAE,CAAC,SAASgD,EAAEhD,GAAG,YAAO,IAASA,EAAE+C,cAAcT,EAAEW,oBAAoBjD,EAAE+C,aAAa,CAAC,SAAS1T,EAAE2Q,EAAEhgB,EAAE6F,EAAE7E,GAAG,IAAIsC,EAAEqd,EAAEhc,EAAEX,EAAE,GAAG2K,EAAE9I,QAAG,KAAU8a,EAAEX,EAAE6C,UAAUlC,EAAEX,EAAE6C,QAAQtgB,OAAOge,OAAO,MAAMP,EAAE8C,aAAa,SAAI,IAASnC,EAAEuC,cAAclD,EAAEmD,KAAK,cAAcnjB,EAAE6F,EAAEud,SAASvd,EAAEud,SAASvd,GAAG8a,EAAEX,EAAE6C,SAASle,EAAEgc,EAAE3gB,SAAI,IAAS2E,EAAEA,EAAEgc,EAAE3gB,GAAG6F,IAAIma,EAAE8C,kBAAkB,GAAG,mBAAmBne,EAAEA,EAAEgc,EAAE3gB,GAAGgB,EAAE,CAAC6E,EAAElB,GAAG,CAACA,EAAEkB,GAAG7E,EAAE2D,EAAE0e,QAAQxd,GAAGlB,EAAEqJ,KAAKnI,IAAIvC,EAAE0f,EAAEhD,IAAI,GAAGrb,EAAE5B,OAAOO,IAAIqB,EAAE2e,OAAO,CAAC3e,EAAE2e,QAAO,EAAG,IAAI1I,EAAE,IAAIhY,MAAM,+CAA+C+B,EAAE5B,OAAO,IAAIiD,OAAOhG,GAAG,qEAAqE4a,EAAEoE,KAAK,8BAA8BpE,EAAE2I,QAAQvD,EAAEpF,EAAEqB,KAAKjc,EAAE4a,EAAE4I,MAAM7e,EAAE5B,OAAOiB,EAAE4W,EAAEhZ,SAASA,QAAQ6hB,MAAM7hB,QAAQ6hB,KAAKzf,EAAE,CAAC,OAAOgc,CAAC,CAAC,SAAS0D,IAAI,IAAIjjB,KAAKkjB,MAAM,OAAOljB,KAAK+Y,OAAOiJ,eAAehiB,KAAKwb,KAAKxb,KAAKmjB,QAAQnjB,KAAKkjB,OAAM,EAAG,IAAI9J,UAAU9W,OAAOtC,KAAK2iB,SAASxJ,KAAKnZ,KAAK+Y,QAAQ/Y,KAAK2iB,SAAS/iB,MAAMI,KAAK+Y,OAAOK,UAAU,CAAC,SAASgK,EAAE7D,EAAEhgB,EAAE6F,GAAG,IAAI7E,EAAE,CAAC2iB,OAAM,EAAGC,YAAO,EAAOpK,OAAOwG,EAAE/D,KAAKjc,EAAEojB,SAASvd,GAAGvC,EAAEogB,EAAE1G,KAAKhc,GAAG,OAAOsC,EAAE8f,SAASvd,EAAE7E,EAAE4iB,OAAOtgB,EAAEA,CAAC,CAAC,SAASwgB,EAAE9D,EAAEhgB,EAAE6F,GAAG,IAAI7E,EAAEgf,EAAE6C,QAAQ,QAAG,IAAS7hB,EAAE,MAAM,GAAG,IAAIsC,EAAEtC,EAAEhB,GAAG,YAAO,IAASsD,EAAE,GAAG,mBAAmBA,EAAEuC,EAAE,CAACvC,EAAE8f,UAAU9f,GAAG,CAACA,GAAGuC,EAAE,SAASma,GAAG,IAAI,IAAIhgB,EAAE,IAAI8F,MAAMka,EAAEjd,QAAQ8C,EAAE,EAAEA,EAAE7F,EAAE+C,SAAS8C,EAAE7F,EAAE6F,GAAGma,EAAEna,GAAGud,UAAUpD,EAAEna,GAAG,OAAO7F,CAAC,CAA9F,CAAgGsD,GAAGygB,EAAEzgB,EAAEA,EAAEP,OAAO,CAAC,SAASihB,EAAEhE,GAAG,IAAIhgB,EAAES,KAAKoiB,QAAQ,QAAG,IAAS7iB,EAAE,CAAC,IAAI6F,EAAE7F,EAAEggB,GAAG,GAAG,mBAAmBna,EAAE,OAAO,EAAE,QAAG,IAASA,EAAE,OAAOA,EAAE9C,MAAM,CAAC,OAAO,CAAC,CAAC,SAASghB,EAAE/D,EAAEhgB,GAAG,IAAI,IAAI6F,EAAE,IAAIC,MAAM9F,GAAGgB,EAAE,EAAEA,EAAEhB,IAAIgB,EAAE6E,EAAE7E,GAAGgf,EAAEhf,GAAG,OAAO6E,CAAC,CAAC,SAAS6c,EAAE1C,EAAEhgB,EAAE6F,EAAE7E,GAAG,GAAG,mBAAmBgf,EAAE2C,GAAG3hB,EAAEwhB,KAAKxC,EAAEwC,KAAKxiB,EAAE6F,GAAGma,EAAE2C,GAAG3iB,EAAE6F,OAAO,CAAC,GAAG,mBAAmBma,EAAEiE,iBAAiB,MAAM,IAAI5C,UAAU,6EAA6ErB,GAAGA,EAAEiE,iBAAiBjkB,GAAE,SAAUsD,EAAEqd,GAAG3f,EAAEwhB,MAAMxC,EAAEkE,oBAAoBlkB,EAAEsD,GAAGuC,EAAE8a,EAAG,GAAE,CAAC,CAAC,SAASwD,EAAEnE,GAAG,GAAG,mBAAmBA,EAAE,MAAM,IAAIpd,MAAM,+CAA+CnC,KAAKjD,KAAKwiB,CAAC,CAACzd,OAAOwf,eAAeO,EAAE,sBAAsB,CAAChB,YAAW,EAAGjC,IAAI,WAAW,OAAOpJ,CAAC,EAAE9Q,IAAI,SAAS6a,GAAG,GAAG,iBAAiBA,GAAGA,EAAE,GAAGpb,EAAEob,GAAG,MAAM,IAAIoE,WAAW,kGAAkGpE,EAAE,KAAK/J,EAAE+J,CAAC,IAAIsC,EAAEC,KAAK,gBAAW,IAAS9hB,KAAKoiB,SAASpiB,KAAKoiB,UAAUtgB,OAAOke,eAAehgB,MAAMoiB,UAAUpiB,KAAKoiB,QAAQtgB,OAAOge,OAAO,MAAM9f,KAAKqiB,aAAa,GAAGriB,KAAKsiB,cAActiB,KAAKsiB,oBAAe,CAAM,EAAET,EAAE1O,UAAUyQ,gBAAgB,SAASrE,GAAG,GAAG,iBAAiBA,GAAGA,EAAE,GAAGpb,EAAEob,GAAG,MAAM,IAAIoE,WAAW,gFAAgFpE,EAAE,KAAK,OAAOvf,KAAKsiB,cAAc/C,EAAEvf,IAAI,EAAE6hB,EAAE1O,UAAU0Q,gBAAgB,WAAW,OAAOtB,EAAEviB,KAAK,EAAE6hB,EAAE1O,UAAUuP,KAAK,SAASnD,GAAG,IAAI,IAAIhgB,EAAE,GAAG6F,EAAE,EAAEA,EAAEgU,UAAU9W,OAAO8C,IAAI7F,EAAEgO,KAAK6L,UAAUhU,IAAI,IAAI7E,EAAE,UAAUgf,EAAE1c,EAAE7C,KAAKoiB,QAAQ,QAAG,IAASvf,EAAEtC,EAAEA,QAAG,IAASsC,EAAEzB,WAAW,IAAIb,EAAE,OAAM,EAAG,GAAGA,EAAE,CAAC,IAAI2f,EAAE,GAAG3gB,EAAE+C,OAAO,IAAI4d,EAAE3gB,EAAE,IAAI2gB,aAAa/d,MAAM,MAAM+d,EAAE,IAAIhc,EAAE,IAAI/B,MAAM,oBAAoB+d,EAAE,KAAKA,EAAE5G,QAAQ,IAAI,KAAK,MAAMpV,EAAE4f,QAAQ5D,EAAEhc,CAAC,CAAC,IAAIX,EAAEV,EAAE0c,GAAG,QAAG,IAAShc,EAAE,OAAM,EAAG,GAAG,mBAAmBA,EAAEyU,EAAEzU,EAAEvD,KAAKT,OAAO,CAAC,IAAI4a,EAAE5W,EAAEjB,OAAOwK,EAAEwW,EAAE/f,EAAE4W,GAAG,IAAI/U,EAAE,EAAEA,EAAE+U,IAAI/U,EAAE4S,EAAElL,EAAE1H,GAAGpF,KAAKT,EAAE,CAAC,OAAM,CAAE,EAAEsiB,EAAE1O,UAAU4Q,YAAY,SAASxE,EAAEhgB,GAAG,OAAOqP,EAAE5O,KAAKuf,EAAEhgB,GAAE,EAAG,EAAEsiB,EAAE1O,UAAU+O,GAAGL,EAAE1O,UAAU4Q,YAAYlC,EAAE1O,UAAU6Q,gBAAgB,SAASzE,EAAEhgB,GAAG,OAAOqP,EAAE5O,KAAKuf,EAAEhgB,GAAE,EAAG,EAAEsiB,EAAE1O,UAAU4O,KAAK,SAASxC,EAAEhgB,GAAG,OAAO2O,EAAE3O,GAAGS,KAAKkiB,GAAG3C,EAAE6D,EAAEpjB,KAAKuf,EAAEhgB,IAAIS,IAAI,EAAE6hB,EAAE1O,UAAU8Q,oBAAoB,SAAS1E,EAAEhgB,GAAG,OAAO2O,EAAE3O,GAAGS,KAAKgkB,gBAAgBzE,EAAE6D,EAAEpjB,KAAKuf,EAAEhgB,IAAIS,IAAI,EAAE6hB,EAAE1O,UAAU6O,eAAe,SAASzC,EAAEhgB,GAAG,IAAI6F,EAAE7E,EAAEsC,EAAEqd,EAAEhc,EAAE,GAAGgK,EAAE3O,QAAG,KAAUgB,EAAEP,KAAKoiB,SAAS,OAAOpiB,KAAK,QAAG,KAAUoF,EAAE7E,EAAEgf,IAAI,OAAOvf,KAAK,GAAGoF,IAAI7F,GAAG6F,EAAEud,WAAWpjB,EAAE,KAAKS,KAAKqiB,aAAariB,KAAKoiB,QAAQtgB,OAAOge,OAAO,cAAcvf,EAAEgf,GAAGhf,EAAEyhB,gBAAgBhiB,KAAK0iB,KAAK,iBAAiBnD,EAAEna,EAAEud,UAAUpjB,SAAS,GAAG,mBAAmB6F,EAAE,CAAC,IAAIvC,GAAG,EAAEqd,EAAE9a,EAAE9C,OAAO,EAAE4d,GAAG,EAAEA,IAAI,GAAG9a,EAAE8a,KAAK3gB,GAAG6F,EAAE8a,GAAGyC,WAAWpjB,EAAE,CAAC2E,EAAEkB,EAAE8a,GAAGyC,SAAS9f,EAAEqd,EAAE,KAAK,CAAC,GAAGrd,EAAE,EAAE,OAAO7C,KAAK,IAAI6C,EAAEuC,EAAE8e,QAAQ,SAAS3E,EAAEhgB,GAAG,KAAKA,EAAE,EAAEggB,EAAEjd,OAAO/C,IAAIggB,EAAEhgB,GAAGggB,EAAEhgB,EAAE,GAAGggB,EAAEtH,KAAK,CAAvD,CAAyD7S,EAAEvC,GAAG,IAAIuC,EAAE9C,SAAS/B,EAAEgf,GAAGna,EAAE,SAAI,IAAS7E,EAAEyhB,gBAAgBhiB,KAAK0iB,KAAK,iBAAiBnD,EAAErb,GAAG3E,EAAE,CAAC,OAAOS,IAAI,EAAE6hB,EAAE1O,UAAUgR,IAAItC,EAAE1O,UAAU6O,eAAeH,EAAE1O,UAAUiR,mBAAmB,SAAS7E,GAAG,IAAIhgB,EAAE6F,EAAE7E,EAAE,QAAG,KAAU6E,EAAEpF,KAAKoiB,SAAS,OAAOpiB,KAAK,QAAG,IAASoF,EAAE4c,eAAe,OAAO,IAAI5I,UAAU9W,QAAQtC,KAAKoiB,QAAQtgB,OAAOge,OAAO,MAAM9f,KAAKqiB,aAAa,QAAG,IAASjd,EAAEma,KAAK,KAAKvf,KAAKqiB,aAAariB,KAAKoiB,QAAQtgB,OAAOge,OAAO,aAAa1a,EAAEma,IAAIvf,KAAK,GAAG,IAAIoZ,UAAU9W,OAAO,CAAC,IAAIO,EAAEqd,EAAEpe,OAAOoD,KAAKE,GAAG,IAAI7E,EAAE,EAAEA,EAAE2f,EAAE5d,SAAS/B,EAAE,oBAAoBsC,EAAEqd,EAAE3f,KAAKP,KAAKokB,mBAAmBvhB,GAAG,OAAO7C,KAAKokB,mBAAmB,kBAAkBpkB,KAAKoiB,QAAQtgB,OAAOge,OAAO,MAAM9f,KAAKqiB,aAAa,EAAEriB,IAAI,CAAC,GAAG,mBAAmBT,EAAE6F,EAAEma,IAAIvf,KAAKgiB,eAAezC,EAAEhgB,QAAQ,QAAG,IAASA,EAAE,IAAIgB,EAAEhB,EAAE+C,OAAO,EAAE/B,GAAG,EAAEA,IAAIP,KAAKgiB,eAAezC,EAAEhgB,EAAEgB,IAAI,OAAOP,IAAI,EAAE6hB,EAAE1O,UAAUkR,UAAU,SAAS9E,GAAG,OAAO8D,EAAErjB,KAAKuf,GAAE,EAAG,EAAEsC,EAAE1O,UAAUmR,aAAa,SAAS/E,GAAG,OAAO8D,EAAErjB,KAAKuf,GAAE,EAAG,EAAEsC,EAAE0C,cAAc,SAAShF,EAAEhgB,GAAG,MAAM,mBAAmBggB,EAAEgF,cAAchF,EAAEgF,cAAchlB,GAAGgkB,EAAEpK,KAAKoG,EAAEhgB,EAAE,EAAEsiB,EAAE1O,UAAUoR,cAAchB,EAAE1B,EAAE1O,UAAUqR,WAAW,WAAW,OAAOxkB,KAAKqiB,aAAa,EAAEtF,EAAE/c,KAAKoiB,SAAS,EAAE,EAAE,oBAAoBxC,SAAS8D,EAAEvQ,UAAUyM,OAAOC,UAAU,WAAW,OAAO7f,IAAI,GAAG0jB,EAAEe,GAAG,WAAW,IAAIlF,EAAEnG,UAAU7Z,EAAEggB,EAAEjd,OAAO8C,EAAE,EAAE,OAAO,IAAIse,GAAE,WAAY,OAAOte,GAAG7F,EAAE,CAACG,MAAK,GAAI,CAACA,MAAK,EAAGL,MAAMkgB,EAAEna,KAAM,GAAE,EAAEse,EAAEgB,MAAM,WAAW,OAAO,IAAIhB,GAAE,WAAY,MAAM,CAAChkB,MAAK,EAAI,GAAE,EAAEgkB,EAAEiB,aAAa,SAASpF,GAAG,IAAIhgB,EAAE,EAAE6F,EAAEma,EAAEjd,OAAO,OAAO,IAAIohB,GAAE,WAAY,OAAOnkB,GAAG6F,EAAE,CAAC1F,MAAK,GAAI,CAACA,MAAK,EAAGL,MAAMkgB,EAAEhgB,KAAM,GAAE,EAAEmkB,EAAElV,GAAG,SAAS+Q,GAAG,OAAOA,aAAamE,GAAG,iBAAiBnE,GAAG,OAAOA,GAAG,mBAAmBA,EAAExiB,IAAI,EAAE,IAAI6nB,EAAElB,EAAE5V,EAAE,CAAC,EAAEA,EAAE+W,qBAAqB,oBAAoBC,YAAYhX,EAAEiX,eAAe,oBAAoBnF,OAAO,IAAIoF,EAAEJ,EAAEK,EAAEnX,EAAEoX,EAAED,EAAEJ,qBAAqBM,EAAEF,EAAEF,eAAmBhmB,EAAE,SAASwgB,GAAG,IAAIhgB,EAAE,SAASggB,GAAG,MAAM,iBAAiBA,GAAGla,MAAMmc,QAAQjC,IAAI2F,GAAGJ,YAAYM,OAAO7F,GAAGyF,EAAEL,aAAapF,GAAG,iBAAiBA,GAAG,OAAOA,EAAE,KAAK4F,GAAG,mBAAmB5F,EAAEK,OAAOC,UAAUN,EAAEK,OAAOC,YAAY,mBAAmBN,EAAExiB,KAAKwiB,EAAE,IAAI,CAAnO,CAAqOA,GAAG,IAAIhgB,EAAE,MAAM,IAAI4C,MAAM,6DAA6D,OAAO5C,CAAC,EAAE8lB,EAAEtmB,EAAEumB,EAAE,SAAS/F,EAAEhgB,GAAG,IAAI,IAAI6F,EAAE7E,EAAE6Y,UAAU9W,OAAO,EAAE/C,EAAE,IAAIsD,EAAEtC,IAAI,IAAI,IAAI8E,MAAM9E,GAAG,GAAG2f,EAAE,EAAEhc,EAAEmhB,EAAE9F,KAAK,CAAC,GAAGW,IAAI3f,EAAE,OAAOsC,EAAE,IAAIuC,EAAElB,EAAEnH,QAAQ2C,KAAK,OAAOwgB,IAAI3gB,IAAIsD,EAAEP,OAAO4d,GAAGrd,EAAEA,EAAEqd,KAAK9a,EAAE/F,KAAK,CAAC,EAAEkmB,EAAE,SAAShG,GAAG,SAASna,EAAE7F,GAAG,IAAI6F,EAAE,OAAOA,EAAEma,EAAEpG,KAAKnZ,OAAOA,MAAMue,KAAK,aAAanZ,EAAEkU,QAAQ/Z,EAAE6F,CAAC,CAAC,OAAO7F,EAAE6F,EAAEma,GAAGna,CAAC,CAA5G,CAA8GlB,EAAE/B,QAAQqjB,EAAE,SAASjG,GAAG,SAASna,EAAE7F,GAAG,IAAIgB,EAAE,OAAOA,EAAEgf,EAAEpG,KAAKnZ,KAAKT,IAAIS,MAAMue,KAAK,6BAA6B,mBAAmBpc,MAAMsjB,mBAAmBtjB,MAAMsjB,kBAAkBliB,EAAEhD,GAAG6E,EAAE+N,UAAUQ,aAAapT,CAAC,CAAC,OAAOhB,EAAE6F,EAAEma,GAAGna,CAAC,CAApN,CAAsNmgB,GAAGG,EAAE,SAASnG,GAAG,SAASna,EAAE7F,GAAG,IAAIgB,EAAE,OAAOA,EAAEgf,EAAEpG,KAAKnZ,KAAKT,IAAIS,MAAMue,KAAK,qBAAqB,mBAAmBpc,MAAMsjB,mBAAmBtjB,MAAMsjB,kBAAkBliB,EAAEhD,GAAG6E,EAAE+N,UAAUQ,aAAapT,CAAC,CAAC,OAAOhB,EAAE6F,EAAEma,GAAGna,CAAC,CAA5M,CAA8MmgB,GAAGI,EAAE,SAASpG,GAAG,SAASna,EAAE7F,GAAG,IAAIgB,EAAE,OAAOA,EAAEgf,EAAEpG,KAAKnZ,KAAKT,IAAIS,MAAMue,KAAK,kBAAkB,mBAAmBpc,MAAMsjB,mBAAmBtjB,MAAMsjB,kBAAkBliB,EAAEhD,GAAG6E,EAAE+N,UAAUQ,aAAapT,CAAC,CAAC,OAAOhB,EAAE6F,EAAEma,GAAGna,CAAC,CAAzM,CAA2MmgB,GAAG,SAASK,EAAErG,EAAEhgB,GAAGS,KAAK2F,IAAI4Z,EAAEvf,KAAK6e,WAAWtf,EAAES,KAAK6lB,OAAO,CAAC,SAAS/H,EAAEyB,EAAEhgB,GAAGS,KAAK2F,IAAI4Z,EAAEvf,KAAK6e,WAAWtf,EAAES,KAAK6lB,OAAO,CAAC,SAASC,EAAEvG,EAAEhgB,GAAGS,KAAK2F,IAAI4Z,EAAEvf,KAAK6e,WAAWtf,EAAES,KAAK6lB,OAAO,CAAC,SAASE,EAAExG,EAAEhgB,EAAE6F,EAAE7E,EAAEsC,GAAG7C,KAAK2F,IAAIpG,EAAES,KAAK6e,WAAWhc,EAAE7C,KAAKmhB,WAAW5B,EAAEvf,KAAKga,OAAO5U,EAAEpF,KAAK+Y,OAAOxY,CAAC,CAAg6C,SAASylB,EAAEzG,EAAEhgB,EAAE6F,EAAE7E,EAAEsC,EAAEqd,EAAEhc,GAAG,IAAIX,EAAE4W,EAAErN,EAAEkQ,EAAE,GAAGzc,EAAE,GAAGA,EAAE,IAAI6E,EAAE,CAAC,KAAK7B,EAAEgc,EAAE0B,OAAOrC,IAAIre,IAAI,MAAM,IAAImlB,EAAE,SAAS9D,OAAOriB,EAAE,0BAA0BqiB,OAAOrhB,EAAE,yBAAyBuM,EAAEjK,EAAEma,EAAEkD,CAAC,MAAM,GAAG,IAAI9a,EAAE,CAAC,GAAGvC,EAAE,GAAGA,IAAIsX,EAAEoF,EAAE0G,OAAOrH,IAAI/b,IAAI,MAAM,IAAI6iB,EAAE,SAAS9D,OAAOriB,EAAE,0BAA0BqiB,OAAO/e,EAAE,yBAAyB,IAAIue,EAAEjH,EAAEH,OAAOrU,IAAI0b,EAAElH,EAAEpB,OAAOpT,IAAI,GAAGpF,IAAI6gB,EAAE7d,EAAE4W,EAAEpB,WAAW,CAAC,GAAGxY,IAAI8gB,EAAE,MAAM,IAAIqE,EAAE,SAAS9D,OAAOriB,EAAE,WAAWqiB,OAAOrhB,EAAE,mCAAmCqhB,OAAO/e,EAAE,YAAY+e,OAAOR,EAAE,MAAMQ,OAAOP,EAAE,OAAO9d,EAAE4W,EAAEH,MAAM,CAAClN,EAAEoT,EAAElD,EAAE9Y,CAAC,KAAK,CAAC,KAAKiW,EAAEoF,EAAE0G,OAAOrH,IAAIre,IAAI,MAAM,IAAImlB,EAAE,SAAS9D,OAAOriB,EAAE,0BAA0BqiB,OAAOrhB,EAAE,yBAAyBgD,EAAE,IAAI6B,EAAE+U,EAAEH,OAAOG,EAAEpB,OAAOjM,EAAEjK,EAAEma,EAAEkD,CAAC,CAAC,MAAM,CAAC3c,EAAEuJ,EAAEkQ,EAAE,CAA9lE4I,EAAEzS,UAAU0S,MAAM,WAAW7lB,KAAKkmB,SAAS,EAAElmB,KAAKmmB,UAAU,EAAEnmB,KAAKomB,iBAAiB,EAAEpmB,KAAKqmB,gBAAgB,EAAErmB,KAAKsmB,cAAc,EAAEtmB,KAAKumB,GAAG,CAAC,EAAEvmB,KAAKkhB,IAAI,CAAC,EAAElhB,KAAKmhB,WAAW,CAAC,CAAC,EAAErD,EAAE3K,UAAU0S,MAAM,WAAW7lB,KAAKkmB,SAAS,EAAElmB,KAAKmmB,UAAU,EAAEnmB,KAAKsmB,cAAc,EAAEtmB,KAAKumB,GAAG,CAAC,EAAEvmB,KAAKkhB,IAAI,CAAC,CAAC,EAAE4E,EAAE3S,UAAU0S,MAAM,WAAW7lB,KAAKomB,iBAAiB,EAAEpmB,KAAKqmB,gBAAgB,EAAErmB,KAAKmhB,WAAW,CAAC,CAAC,EAAE4E,EAAE5S,UAAUqT,OAAO,WAAW,IAAIjH,EAAE,MAAMhgB,EAAE,KAAKS,KAAKmhB,aAAa5B,EAAEhgB,EAAE,cAAc,IAAI6F,EAAEpF,KAAKga,OAAOrU,IAAIpF,EAAEP,KAAK+Y,OAAOpT,IAAI3F,KAAKga,OAAOuF,GAAGhf,GAAGP,KAAKA,KAAKmhB,YAAY/b,IAAI7E,IAAIP,KAAK+Y,OAAOxZ,GAAG6F,GAAGpF,KAAK,EAAE+lB,EAAE5S,UAAUsT,YAAY,WAAW,IAAIlH,EAAE,MAAMhgB,EAAE,KAAK6F,EAAEpF,KAAKga,OAAOrU,IAAIpF,EAAEP,KAAK+Y,OAAOpT,IAAI3F,KAAKmhB,aAAa5B,EAAEhgB,EAAE,cAAc,IAAIsD,EAAE7C,KAAKga,OAAOuF,GAAGW,EAAErd,EAAEtC,GAAG,QAAG,IAAS2f,EAAE,OAAOrd,EAAEtC,GAAGP,UAAUA,KAAKmhB,YAAY/b,IAAI7E,IAAIP,KAAK+Y,OAAOxZ,GAAG6F,GAAGpF,OAAOkgB,EAAEwG,SAAS1mB,KAAKA,KAAKjD,KAAKmjB,EAAErd,EAAEtC,GAAGP,KAAKA,KAAK+Y,OAAOxZ,GAAG6F,GAAGpF,IAAI,EAAE+lB,EAAE5S,UAAUwT,OAAO,WAAW,IAAIpH,EAAEvf,KAAKga,OAAOrU,IAAIpG,EAAES,KAAK+Y,OAAOpT,IAAIP,EAAE,MAAM7E,EAAE,KAAKP,KAAKmhB,aAAa/b,EAAE7E,EAAE,qBAAqBP,KAAKga,OAAO5U,GAAG7F,UAAUS,KAAK+Y,OAAOxY,GAAGgf,EAAE,EAAEwG,EAAE5S,UAAUyT,YAAY,WAAW,IAAIrH,EAAEvf,KAAKga,OAAOrU,IAAIpG,EAAES,KAAK+Y,OAAOpT,IAAIP,EAAE,MAAM7E,EAAE,KAAKP,KAAKmhB,aAAa/b,EAAE7E,EAAE,mBAAc,IAASP,KAAK0mB,cAAS,IAAS1mB,KAAKjD,aAAaiD,KAAKga,OAAO5U,GAAG7F,UAAUS,KAAK+Y,OAAOxY,GAAGgf,KAAKvf,KAAKjD,KAAK2pB,cAAS,EAAO1mB,KAAKga,OAAO5U,GAAG7F,GAAGS,KAAKjD,KAAKiD,KAAK+Y,OAAOxY,GAAGgf,GAAGvf,KAAKjD,OAAOiD,KAAK0mB,SAAS3pB,KAAKiD,KAAKjD,UAAK,IAASiD,KAAKjD,OAAOiD,KAAKjD,KAAK2pB,SAAS1mB,KAAK0mB,UAAU,EAAksB,IAAIG,EAAE,CAAC,CAACtI,KAAK,SAASgB,GAAG,MAAM,MAAMqC,OAAOrC,EAAE,YAAY,EAAEuH,SAAS,SAASvH,EAAEhgB,EAAE6F,GAAGma,EAAEpM,UAAU5T,GAAG,SAASggB,EAAEhf,EAAEsC,GAAG,IAAIqd,EAAE8F,EAAEhmB,KAAKT,EAAE6F,EAAEma,EAAEhf,EAAEsC,GAAGqB,EAAEgc,EAAE,GAAG3c,EAAE2c,EAAE,GAAG,OAAOhc,EAAE2a,WAAWtb,EAAE,CAAC,GAAG,CAACgb,KAAK,SAASgB,GAAG,MAAM,MAAMqC,OAAOrC,EAAE,aAAa,EAAEuH,SAAS,SAASvH,EAAEhgB,EAAE6F,GAAGma,EAAEpM,UAAU5T,GAAG,SAASggB,EAAEhf,GAAG,OAAOylB,EAAEhmB,KAAKT,EAAE6F,EAAEma,EAAEhf,GAAG,GAAGse,UAAU,CAAC,GAAG,CAACN,KAAK,SAASgB,GAAG,MAAM,MAAMqC,OAAOrC,EAAE,YAAY,EAAEuH,SAAS,SAASvH,EAAEhgB,EAAE6F,GAAGma,EAAEpM,UAAU5T,GAAG,SAASggB,EAAEhf,EAAEsC,GAAG,IAAIqd,EAAE8F,EAAEhmB,KAAKT,EAAE6F,EAAEma,EAAEhf,EAAEsC,GAAGqB,EAAEgc,EAAE,GAAG3c,EAAE2c,EAAE,GAAG,OAAOhc,EAAE2a,WAAWkI,eAAexjB,EAAE,CAAC,GAAG,CAACgb,KAAK,SAASgB,GAAG,MAAM,MAAMqC,OAAOrC,EAAE,YAAY,EAAEuH,SAAS,SAASvH,EAAEhgB,EAAE6F,GAAGma,EAAEpM,UAAU5T,GAAG,SAASggB,EAAEhf,EAAEsC,EAAEqd,GAAG,IAAIhc,EAAE8hB,EAAEhmB,KAAKT,EAAE6F,EAAEma,EAAEhf,EAAEsC,EAAEqd,GAAG3c,EAAEW,EAAE,GAAGiW,EAAEjW,EAAE,GAAG4I,EAAE5I,EAAE,GAAG,OAAOX,EAAEsb,WAAW1E,GAAGrN,EAAE9M,KAAK0iB,KAAK,wBAAwB,CAAC/c,IAAIpC,EAAEoC,IAAI6V,KAAK,MAAMqD,WAAWtb,EAAEsb,WAAWN,KAAKpE,IAAIna,IAAI,CAAC,GAAG,CAACue,KAAK,SAASgB,GAAG,MAAM,SAASqC,OAAOrC,EAAE,YAAY,EAAEuH,SAAS,SAASvH,EAAEhgB,EAAE6F,GAAGma,EAAEpM,UAAU5T,GAAG,SAASggB,EAAEhf,EAAEsC,EAAEqd,GAAG,IAAIhc,EAAE8hB,EAAEhmB,KAAKT,EAAE6F,EAAEma,EAAEhf,EAAEsC,EAAEqd,GAAG3c,EAAEW,EAAE,GAAGiW,EAAEjW,EAAE,GAAG4I,EAAE5I,EAAE,GAAG,GAAG,mBAAmB4I,EAAE,MAAM,IAAI0Y,EAAE,SAAS5D,OAAOriB,EAAE,oCAAoC,IAAIyd,EAAEzZ,EAAEsb,WAAWuC,EAAEtU,EAAEkQ,EAAE7C,IAAI,OAAO6C,EAAE7C,GAAGiH,EAAEphB,KAAK0iB,KAAK,wBAAwB,CAAC/c,IAAIpC,EAAEoC,IAAI6V,KAAK,MAAMqD,WAAWtb,EAAEsb,WAAWN,KAAKpE,IAAIna,IAAI,CAAC,GAAG,CAACue,KAAK,SAASgB,GAAG,MAAM,SAASqC,OAAOrC,EAAE,YAAY,EAAEuH,SAAS,SAASvH,EAAEhgB,EAAE6F,GAAGma,EAAEpM,UAAU5T,GAAG,SAASggB,EAAEhf,EAAEsC,GAAG,IAAIqd,EAAE8F,EAAEhmB,KAAKT,EAAE6F,EAAEma,EAAEhf,EAAEsC,GAAGqB,EAAEgc,EAAE,GAAG3c,EAAE2c,EAAE,GAAG,cAAchc,EAAE2a,WAAWtb,GAAGvD,KAAK0iB,KAAK,wBAAwB,CAAC/c,IAAIzB,EAAEyB,IAAI6V,KAAK,SAASqD,WAAW3a,EAAE2a,WAAWN,KAAKhb,IAAIvD,IAAI,CAAC,GAAG,CAACue,KAAK,SAASgB,GAAG,MAAM,UAAUqC,OAAOrC,EAAE,aAAa,EAAEuH,SAAS,SAASvH,EAAEhgB,EAAE6F,GAAGma,EAAEpM,UAAU5T,GAAG,SAASggB,EAAEhf,EAAEsC,GAAG,IAAIqd,EAAE8F,EAAEhmB,KAAKT,EAAE6F,EAAEma,EAAEhf,EAAEsC,GAAGqB,EAAEgc,EAAE,GAAG3c,EAAE2c,EAAE,GAAG,IAAIlD,EAAEzZ,GAAG,MAAM,IAAIiiB,EAAE,SAAS5D,OAAOriB,EAAE,kDAAkD,OAAO2E,EAAE2a,WAAWtb,EAAEvD,KAAK0iB,KAAK,wBAAwB,CAAC/c,IAAIzB,EAAEyB,IAAI6V,KAAK,UAAUqD,WAAW3a,EAAE2a,aAAa7e,IAAI,CAAC,GAAG,CAACue,KAAK,SAASgB,GAAG,MAAM,QAAQqC,OAAOrC,EAAE,aAAa,EAAEuH,SAAS,SAASvH,EAAEhgB,EAAE6F,GAAGma,EAAEpM,UAAU5T,GAAG,SAASggB,EAAEhf,EAAEsC,GAAG,IAAIqd,EAAE8F,EAAEhmB,KAAKT,EAAE6F,EAAEma,EAAEhf,EAAEsC,GAAGqB,EAAEgc,EAAE,GAAG3c,EAAE2c,EAAE,GAAG,IAAIlD,EAAEzZ,GAAG,MAAM,IAAIiiB,EAAE,SAAS5D,OAAOriB,EAAE,kDAAkD,OAAO4a,EAAEjW,EAAE2a,WAAWtb,GAAGvD,KAAK0iB,KAAK,wBAAwB,CAAC/c,IAAIzB,EAAEyB,IAAI6V,KAAK,QAAQqD,WAAW3a,EAAE2a,WAAW9H,KAAKxT,IAAIvD,IAAI,CAAC,GAAG,CAACue,KAAK,SAASgB,GAAG,MAAM,SAASqC,OAAOrC,EAAE,aAAa,EAAEuH,SAAS,SAASvH,EAAEhgB,EAAE6F,GAAGma,EAAEpM,UAAU5T,GAAG,SAASggB,EAAEhf,EAAEsC,GAAG,IAAIqd,EAAE8F,EAAEhmB,KAAKT,EAAE6F,EAAEma,EAAEhf,EAAEsC,GAAGqB,EAAEgc,EAAE,GAAG3c,EAAE2c,EAAE,GAAG,GAAG,mBAAmB3c,EAAE,MAAM,IAAIiiB,EAAE,SAAS5D,OAAOriB,EAAE,0CAA0C,OAAO2E,EAAE2a,WAAWtb,EAAEW,EAAE2a,YAAY7e,KAAK0iB,KAAK,wBAAwB,CAAC/c,IAAIzB,EAAEyB,IAAI6V,KAAK,SAASqD,WAAW3a,EAAE2a,aAAa7e,IAAI,CAAC,IAAQgnB,EAAE,CAAC,CAACzI,KAAK,SAASgB,GAAG,MAAM,MAAMqC,OAAOrC,EAAE,YAAY,EAAEuH,SAAS,SAASvH,EAAEhgB,EAAE6F,GAAGma,EAAEpM,UAAU5T,GAAG,SAASggB,EAAEhf,GAAG,IAAIsC,EAAE,GAAG,UAAU7C,KAAKwb,MAAM,UAAUpW,GAAGA,IAAIpF,KAAKwb,KAAK,MAAM,IAAImK,EAAE,SAAS/D,OAAOriB,EAAE,6CAA6CqiB,OAAO5hB,KAAKwb,KAAK,YAAY,GAAGpC,UAAU9W,OAAO,EAAE,CAAC,GAAGtC,KAAK2f,MAAM,MAAM,IAAIgG,EAAE,SAAS/D,OAAOriB,EAAE,0JAA0J,IAAI2gB,EAAE,GAAGX,EAAErb,EAAE,GAAG3D,EAAE,GAAGA,EAAE6Y,UAAU,KAAKvW,EAAEiK,EAAE9M,KAAKkgB,EAAEhc,EAAEkB,IAAI,MAAM,IAAIsgB,EAAE,SAAS9D,OAAOriB,EAAE,kDAAkDqiB,OAAO1B,EAAE,SAAS0B,OAAO1d,EAAE,OAAO,KAAK,CAAC,GAAG,UAAUkB,EAAE,MAAM,IAAIugB,EAAE,SAAS/D,OAAOriB,EAAE,+IAA+I,GAAGggB,EAAE,GAAGA,IAAI1c,EAAE7C,KAAKimB,OAAOrH,IAAIW,IAAI,MAAM,IAAImG,EAAE,SAAS9D,OAAOriB,EAAE,0BAA0BqiB,OAAOrC,EAAE,wBAAwB,CAAC,OAAO1c,EAAEgc,WAAWte,EAAE,CAAC,GAAG,CAACge,KAAK,SAASgB,GAAG,MAAM,MAAMqC,OAAOrC,EAAE,aAAa,EAAEuH,SAAS,SAASvH,EAAEhgB,EAAE6F,GAAGma,EAAEpM,UAAU5T,GAAG,SAASggB,GAAG,IAAIhf,EAAE,GAAG,UAAUP,KAAKwb,MAAM,UAAUpW,GAAGA,IAAIpF,KAAKwb,KAAK,MAAM,IAAImK,EAAE,SAAS/D,OAAOriB,EAAE,6CAA6CqiB,OAAO5hB,KAAKwb,KAAK,YAAY,GAAGpC,UAAU9W,OAAO,EAAE,CAAC,GAAGtC,KAAK2f,MAAM,MAAM,IAAIgG,EAAE,SAAS/D,OAAOriB,EAAE,0JAA0J,IAAIsD,EAAE,GAAG0c,EAAEW,EAAE,GAAG9G,UAAU,GAAG,KAAK7Y,EAAEuM,EAAE9M,KAAK6C,EAAEqd,EAAE9a,IAAI,MAAM,IAAIsgB,EAAE,SAAS9D,OAAOriB,EAAE,kDAAkDqiB,OAAO/e,EAAE,SAAS+e,OAAO1B,EAAE,OAAO,KAAK,CAAC,GAAG,UAAU9a,EAAE,MAAM,IAAIugB,EAAE,SAAS/D,OAAOriB,EAAE,+IAA+I,GAAGggB,EAAE,GAAGA,IAAIhf,EAAEP,KAAKimB,OAAOrH,IAAIW,IAAI,MAAM,IAAImG,EAAE,SAAS9D,OAAOriB,EAAE,0BAA0BqiB,OAAOrC,EAAE,wBAAwB,CAAC,OAAOhf,EAAEse,UAAU,CAAC,GAAG,CAACN,KAAK,SAASgB,GAAG,MAAM,MAAMqC,OAAOrC,EAAE,YAAY,EAAEuH,SAAS,SAASvH,EAAEhgB,EAAE6F,GAAGma,EAAEpM,UAAU5T,GAAG,SAASggB,EAAEhf,GAAG,IAAIsC,EAAE,GAAG,UAAU7C,KAAKwb,MAAM,UAAUpW,GAAGA,IAAIpF,KAAKwb,KAAK,MAAM,IAAImK,EAAE,SAAS/D,OAAOriB,EAAE,6CAA6CqiB,OAAO5hB,KAAKwb,KAAK,YAAY,GAAGpC,UAAU9W,OAAO,EAAE,CAAC,GAAGtC,KAAK2f,MAAM,MAAM,IAAIgG,EAAE,SAAS/D,OAAOriB,EAAE,0JAA0J,IAAI2gB,EAAE,GAAGX,EAAErb,EAAE,GAAG3D,EAAE,GAAGA,EAAE6Y,UAAU,KAAKvW,EAAEiK,EAAE9M,KAAKkgB,EAAEhc,EAAEkB,IAAI,MAAM,IAAIsgB,EAAE,SAAS9D,OAAOriB,EAAE,kDAAkDqiB,OAAO1B,EAAE,SAAS0B,OAAO1d,EAAE,OAAO,KAAK,CAAC,GAAG,UAAUkB,EAAE,MAAM,IAAIugB,EAAE,SAAS/D,OAAOriB,EAAE,+IAA+I,GAAGggB,EAAE,GAAGA,IAAI1c,EAAE7C,KAAKimB,OAAOrH,IAAIW,IAAI,MAAM,IAAImG,EAAE,SAAS9D,OAAOriB,EAAE,0BAA0BqiB,OAAOrC,EAAE,wBAAwB,CAAC,OAAO1c,EAAEgc,WAAWkI,eAAexmB,EAAE,CAAC,GAAG,CAACge,KAAK,SAASgB,GAAG,MAAM,MAAMqC,OAAOrC,EAAE,YAAY,EAAEuH,SAAS,SAASvH,EAAEhgB,EAAE6F,GAAGma,EAAEpM,UAAU5T,GAAG,SAASggB,EAAEhf,EAAEsC,GAAG,IAAIqd,EAAE,GAAG,UAAUlgB,KAAKwb,MAAM,UAAUpW,GAAGA,IAAIpF,KAAKwb,KAAK,MAAM,IAAImK,EAAE,SAAS/D,OAAOriB,EAAE,6CAA6CqiB,OAAO5hB,KAAKwb,KAAK,YAAY,GAAGpC,UAAU9W,OAAO,EAAE,CAAC,GAAGtC,KAAK2f,MAAM,MAAM,IAAIgG,EAAE,SAAS/D,OAAOriB,EAAE,0JAA0J,IAAI2E,EAAE,GAAGqb,EAAEhc,EAAE,GAAGhD,EAAE,GAAGA,EAAE6Y,UAAU,GAAGvW,EAAEuW,UAAU,KAAK8G,EAAEpT,EAAE9M,KAAKkE,EAAEX,EAAE6B,IAAI,MAAM,IAAIsgB,EAAE,SAAS9D,OAAOriB,EAAE,kDAAkDqiB,OAAO1d,EAAE,SAAS0d,OAAOre,EAAE,OAAO,KAAK,CAAC,GAAG,UAAU6B,EAAE,MAAM,IAAIugB,EAAE,SAAS/D,OAAOriB,EAAE,+IAA+I,GAAGggB,EAAE,GAAGA,IAAIW,EAAElgB,KAAKimB,OAAOrH,IAAIW,IAAI,MAAM,IAAImG,EAAE,SAAS9D,OAAOriB,EAAE,0BAA0BqiB,OAAOrC,EAAE,wBAAwB,CAAC,OAAOW,EAAErB,WAAWte,GAAGsC,EAAE7C,KAAK0iB,KAAK,wBAAwB,CAAC/c,IAAIua,EAAEva,IAAI6V,KAAK,MAAMqD,WAAWqB,EAAErB,WAAWN,KAAKhe,IAAIP,IAAI,CAAC,GAAG,CAACue,KAAK,SAASgB,GAAG,MAAM,SAASqC,OAAOrC,EAAE,YAAY,EAAEuH,SAAS,SAASvH,EAAEhgB,EAAE6F,GAAGma,EAAEpM,UAAU5T,GAAG,SAASggB,EAAEhf,EAAEsC,GAAG,IAAIqd,EAAE,GAAG,UAAUlgB,KAAKwb,MAAM,UAAUpW,GAAGA,IAAIpF,KAAKwb,KAAK,MAAM,IAAImK,EAAE,SAAS/D,OAAOriB,EAAE,6CAA6CqiB,OAAO5hB,KAAKwb,KAAK,YAAY,GAAGpC,UAAU9W,OAAO,EAAE,CAAC,GAAGtC,KAAK2f,MAAM,MAAM,IAAIgG,EAAE,SAAS/D,OAAOriB,EAAE,0JAA0J,IAAI2E,EAAE,GAAGqb,EAAEhc,EAAE,GAAGhD,EAAE,GAAGA,EAAE6Y,UAAU,GAAGvW,EAAEuW,UAAU,KAAK8G,EAAEpT,EAAE9M,KAAKkE,EAAEX,EAAE6B,IAAI,MAAM,IAAIsgB,EAAE,SAAS9D,OAAOriB,EAAE,kDAAkDqiB,OAAO1d,EAAE,SAAS0d,OAAOre,EAAE,OAAO,KAAK,CAAC,GAAG,UAAU6B,EAAE,MAAM,IAAIugB,EAAE,SAAS/D,OAAOriB,EAAE,+IAA+I,GAAGggB,EAAE,GAAGA,IAAIW,EAAElgB,KAAKimB,OAAOrH,IAAIW,IAAI,MAAM,IAAImG,EAAE,SAAS9D,OAAOriB,EAAE,0BAA0BqiB,OAAOrC,EAAE,wBAAwB,CAAC,GAAG,mBAAmB1c,EAAE,MAAM,IAAI2iB,EAAE,SAAS5D,OAAOriB,EAAE,oCAAoC,OAAO2gB,EAAErB,WAAWte,GAAGsC,EAAEqd,EAAErB,WAAWte,IAAIP,KAAK0iB,KAAK,wBAAwB,CAAC/c,IAAIua,EAAEva,IAAI6V,KAAK,MAAMqD,WAAWqB,EAAErB,WAAWN,KAAKhe,IAAIP,IAAI,CAAC,GAAG,CAACue,KAAK,SAASgB,GAAG,MAAM,SAASqC,OAAOrC,EAAE,YAAY,EAAEuH,SAAS,SAASvH,EAAEhgB,EAAE6F,GAAGma,EAAEpM,UAAU5T,GAAG,SAASggB,EAAEhf,GAAG,IAAIsC,EAAE,GAAG,UAAU7C,KAAKwb,MAAM,UAAUpW,GAAGA,IAAIpF,KAAKwb,KAAK,MAAM,IAAImK,EAAE,SAAS/D,OAAOriB,EAAE,6CAA6CqiB,OAAO5hB,KAAKwb,KAAK,YAAY,GAAGpC,UAAU9W,OAAO,EAAE,CAAC,GAAGtC,KAAK2f,MAAM,MAAM,IAAIgG,EAAE,SAAS/D,OAAOriB,EAAE,0JAA0J,IAAI2gB,EAAE,GAAGX,EAAErb,EAAE,GAAG3D,EAAE,GAAGA,EAAE6Y,UAAU,KAAKvW,EAAEiK,EAAE9M,KAAKkgB,EAAEhc,EAAEkB,IAAI,MAAM,IAAIsgB,EAAE,SAAS9D,OAAOriB,EAAE,kDAAkDqiB,OAAO1B,EAAE,SAAS0B,OAAO1d,EAAE,OAAO,KAAK,CAAC,GAAG,UAAUkB,EAAE,MAAM,IAAIugB,EAAE,SAAS/D,OAAOriB,EAAE,+IAA+I,GAAGggB,EAAE,GAAGA,IAAI1c,EAAE7C,KAAKimB,OAAOrH,IAAIW,IAAI,MAAM,IAAImG,EAAE,SAAS9D,OAAOriB,EAAE,0BAA0BqiB,OAAOrC,EAAE,wBAAwB,CAAC,cAAc1c,EAAEgc,WAAWte,GAAGP,KAAK0iB,KAAK,wBAAwB,CAAC/c,IAAI9C,EAAE8C,IAAI6V,KAAK,SAASqD,WAAWhc,EAAEgc,WAAWN,KAAKhe,IAAIP,IAAI,CAAC,GAAG,CAACue,KAAK,SAASgB,GAAG,MAAM,UAAUqC,OAAOrC,EAAE,aAAa,EAAEuH,SAAS,SAASvH,EAAEhgB,EAAE6F,GAAGma,EAAEpM,UAAU5T,GAAG,SAASggB,EAAEhf,GAAG,IAAIsC,EAAE,GAAG,UAAU7C,KAAKwb,MAAM,UAAUpW,GAAGA,IAAIpF,KAAKwb,KAAK,MAAM,IAAImK,EAAE,SAAS/D,OAAOriB,EAAE,6CAA6CqiB,OAAO5hB,KAAKwb,KAAK,YAAY,GAAGpC,UAAU9W,OAAO,EAAE,CAAC,GAAGtC,KAAK2f,MAAM,MAAM,IAAIgG,EAAE,SAAS/D,OAAOriB,EAAE,0JAA0J,IAAI2gB,EAAE,GAAGX,EAAErb,EAAE,GAAG3D,EAAE,GAAGA,EAAE6Y,UAAU,KAAKvW,EAAEiK,EAAE9M,KAAKkgB,EAAEhc,EAAEkB,IAAI,MAAM,IAAIsgB,EAAE,SAAS9D,OAAOriB,EAAE,kDAAkDqiB,OAAO1B,EAAE,SAAS0B,OAAO1d,EAAE,OAAO,KAAK,CAAC,GAAG,UAAUkB,EAAE,MAAM,IAAIugB,EAAE,SAAS/D,OAAOriB,EAAE,+IAA+I,GAAGggB,EAAE,GAAGA,IAAI1c,EAAE7C,KAAKimB,OAAOrH,IAAIW,IAAI,MAAM,IAAImG,EAAE,SAAS9D,OAAOriB,EAAE,0BAA0BqiB,OAAOrC,EAAE,wBAAwB,CAAC,IAAIvC,EAAEzc,GAAG,MAAM,IAAIilB,EAAE,SAAS5D,OAAOriB,EAAE,kDAAkD,OAAOsD,EAAEgc,WAAWte,EAAEP,KAAK0iB,KAAK,wBAAwB,CAAC/c,IAAI9C,EAAE8C,IAAI6V,KAAK,UAAUqD,WAAWhc,EAAEgc,aAAa7e,IAAI,CAAC,GAAG,CAACue,KAAK,SAASgB,GAAG,MAAM,QAAQqC,OAAOrC,EAAE,aAAa,EAAEuH,SAAS,SAASvH,EAAEhgB,EAAE6F,GAAGma,EAAEpM,UAAU5T,GAAG,SAASggB,EAAEhf,GAAG,IAAIsC,EAAE,GAAG,UAAU7C,KAAKwb,MAAM,UAAUpW,GAAGA,IAAIpF,KAAKwb,KAAK,MAAM,IAAImK,EAAE,SAAS/D,OAAOriB,EAAE,6CAA6CqiB,OAAO5hB,KAAKwb,KAAK,YAAY,GAAGpC,UAAU9W,OAAO,EAAE,CAAC,GAAGtC,KAAK2f,MAAM,MAAM,IAAIgG,EAAE,SAAS/D,OAAOriB,EAAE,0JAA0J,IAAI2gB,EAAE,GAAGX,EAAErb,EAAE,GAAG3D,EAAE,GAAGA,EAAE6Y,UAAU,KAAKvW,EAAEiK,EAAE9M,KAAKkgB,EAAEhc,EAAEkB,IAAI,MAAM,IAAIsgB,EAAE,SAAS9D,OAAOriB,EAAE,kDAAkDqiB,OAAO1B,EAAE,SAAS0B,OAAO1d,EAAE,OAAO,KAAK,CAAC,GAAG,UAAUkB,EAAE,MAAM,IAAIugB,EAAE,SAAS/D,OAAOriB,EAAE,+IAA+I,GAAGggB,EAAE,GAAGA,IAAI1c,EAAE7C,KAAKimB,OAAOrH,IAAIW,IAAI,MAAM,IAAImG,EAAE,SAAS9D,OAAOriB,EAAE,0BAA0BqiB,OAAOrC,EAAE,wBAAwB,CAAC,IAAIvC,EAAEzc,GAAG,MAAM,IAAIilB,EAAE,SAAS5D,OAAOriB,EAAE,kDAAkD,OAAO4a,EAAEtX,EAAEgc,WAAWte,GAAGP,KAAK0iB,KAAK,wBAAwB,CAAC/c,IAAI9C,EAAE8C,IAAI6V,KAAK,QAAQqD,WAAWhc,EAAEgc,WAAW9H,KAAKxW,IAAIP,IAAI,CAAC,GAAG,CAACue,KAAK,SAASgB,GAAG,MAAM,SAASqC,OAAOrC,EAAE,aAAa,EAAEuH,SAAS,SAASvH,EAAEhgB,EAAE6F,GAAGma,EAAEpM,UAAU5T,GAAG,SAASggB,EAAEhf,GAAG,IAAIsC,EAAE,GAAG,UAAU7C,KAAKwb,MAAM,UAAUpW,GAAGA,IAAIpF,KAAKwb,KAAK,MAAM,IAAImK,EAAE,SAAS/D,OAAOriB,EAAE,6CAA6CqiB,OAAO5hB,KAAKwb,KAAK,YAAY,GAAGpC,UAAU9W,OAAO,EAAE,CAAC,GAAGtC,KAAK2f,MAAM,MAAM,IAAIgG,EAAE,SAAS/D,OAAOriB,EAAE,0JAA0J,IAAI2gB,EAAE,GAAGX,EAAErb,EAAE,GAAG3D,EAAE,GAAGA,EAAE6Y,UAAU,KAAKvW,EAAEiK,EAAE9M,KAAKkgB,EAAEhc,EAAEkB,IAAI,MAAM,IAAIsgB,EAAE,SAAS9D,OAAOriB,EAAE,kDAAkDqiB,OAAO1B,EAAE,SAAS0B,OAAO1d,EAAE,OAAO,KAAK,CAAC,GAAG,UAAUkB,EAAE,MAAM,IAAIugB,EAAE,SAAS/D,OAAOriB,EAAE,+IAA+I,GAAGggB,EAAE,GAAGA,IAAI1c,EAAE7C,KAAKimB,OAAOrH,IAAIW,IAAI,MAAM,IAAImG,EAAE,SAAS9D,OAAOriB,EAAE,0BAA0BqiB,OAAOrC,EAAE,wBAAwB,CAAC,GAAG,mBAAmBhf,EAAE,MAAM,IAAIilB,EAAE,SAAS5D,OAAOriB,EAAE,0CAA0C,OAAOsD,EAAEgc,WAAWte,EAAEsC,EAAEgc,YAAY7e,KAAK0iB,KAAK,wBAAwB,CAAC/c,IAAI9C,EAAE8C,IAAI6V,KAAK,SAASqD,WAAWhc,EAAEgc,aAAa7e,IAAI,CAAC,IAAQinB,EAAErC,EAAEsC,EAAEnoB,EAAEooB,EAAG,WAAW,IAAI5H,EAAEnG,UAAU7Z,EAAE,KAAK6F,GAAG,EAAE,OAAO,IAAI6hB,GAAE,WAAY,IAAI,IAAI1mB,EAAE,OAAO,CAAC,GAAG,OAAOhB,EAAE,CAAC,KAAK6F,GAAGma,EAAEjd,OAAO,MAAM,CAAC5C,MAAK,GAAIH,EAAE2nB,EAAE3H,EAAEna,GAAG,CAAC,IAAG,KAAM7E,EAAEhB,EAAExC,QAAQ2C,KAAK,MAAMH,EAAE,IAAI,CAAC,OAAOgB,CAAE,GAAE,EAAE6mB,GAAG,CAAC,CAAC7I,KAAK,QAAQ/C,KAAK,SAAS,CAAC+C,KAAK,UAAU/C,KAAK,WAAW6L,UAAU,MAAM,CAAC9I,KAAK,WAAW/C,KAAK,WAAW6L,UAAU,OAAO,CAAC9I,KAAK,eAAe/C,KAAK,QAAQ6L,UAAU,MAAM,CAAC9I,KAAK,gBAAgB/C,KAAK,QAAQ6L,UAAU,OAAO,CAAC9I,KAAK,gBAAgB/C,KAAK,YAAY,CAAC+C,KAAK,kBAAkB/C,KAAK,eAAe,SAAS8L,GAAG/H,EAAEhgB,EAAE6F,EAAE7E,GAAG,IAAIsC,GAAE,EAAG,IAAI,IAAIqd,KAAK3gB,EAAE,GAAG2gB,IAAI3f,EAAE,CAAC,IAAI2D,EAAE3E,EAAE2gB,GAAG,GAAGrd,EAAEuC,EAAElB,EAAEyB,IAAIzB,EAAE2a,WAAW3a,EAAE8V,OAAOrU,IAAIzB,EAAE6U,OAAOpT,IAAIzB,EAAE8V,OAAO6E,WAAW3a,EAAE6U,OAAO8F,WAAW3a,EAAEid,YAAY5B,GAAG1c,EAAE,OAAOqB,EAAEyB,GAAG,CAAC,CAAC,SAAS4hB,GAAGhI,EAAEhgB,EAAE6F,EAAE7E,GAAG,IAAIsC,EAAEqd,EAAEhc,EAAEX,GAAE,EAAG,IAAI,IAAI4W,KAAK5a,EAAE,GAAG4a,IAAI5Z,EAAE,CAACsC,EAAEtD,EAAE4a,GAAG,EAAE,CAAC,GAAG+F,EAAErd,EAAEmX,OAAO9V,EAAErB,EAAEkW,OAAOxV,EAAE6B,EAAEvC,EAAE8C,IAAI9C,EAAEgc,WAAWqB,EAAEva,IAAIzB,EAAEyB,IAAIua,EAAErB,WAAW3a,EAAE2a,WAAWhc,EAAEse,YAAY5B,GAAGhc,EAAE,OAAOV,EAAE8C,IAAI9C,EAAEA,EAAE9F,IAAI,YAAO,IAAS8F,EAAE,CAAC,CAAC,SAAS2kB,GAAGjI,EAAEhgB,GAAG,IAAI6F,EAAE7E,EAAEuB,OAAOoD,KAAKqa,GAAG1c,EAAEtC,EAAE+B,OAAO4d,EAAE,EAAE,OAAO,IAAI0E,GAAE,WAAY,GAAG,GAAGxf,EAAEA,EAAEA,EAAErI,SAAS,CAAC,GAAGmjB,GAAGrd,EAAE,MAAM,CAACnD,MAAK,GAAI,IAAIwE,EAAE3D,EAAE2f,KAAK,GAAGhc,IAAI3E,EAAE,CAAC6F,OAAE,EAAO,QAAQ,CAACA,EAAEma,EAAErb,EAAE,SAASkB,GAAG,MAAM,CAAC1F,MAAK,EAAGL,MAAM,CAAC0a,KAAK3U,EAAEO,IAAIkZ,WAAWzZ,EAAEyZ,WAAW7E,OAAO5U,EAAE4U,OAAOrU,IAAIoT,OAAO3T,EAAE2T,OAAOpT,IAAI8hB,iBAAiBriB,EAAE4U,OAAO6E,WAAW6I,iBAAiBtiB,EAAE2T,OAAO8F,WAAWsC,WAAW/b,EAAE+b,YAAa,GAAE,CAAC,SAASwG,GAAGpI,EAAEhgB,EAAE6F,EAAE7E,GAAG,IAAIsC,EAAEtD,EAAE6F,GAAG,GAAGvC,EAAE,CAAC,IAAIqd,EAAErd,EAAEmX,OAAO9V,EAAErB,EAAEkW,OAAO,OAAOxY,EAAEsC,EAAE8C,IAAI9C,EAAEgc,WAAWqB,EAAEva,IAAIzB,EAAEyB,IAAIua,EAAErB,WAAW3a,EAAE2a,WAAWhc,EAAEse,aAAa5B,EAAE1c,EAAE8C,SAAI,CAAM,CAAC,CAAC,SAASiiB,GAAGrI,EAAEhgB,EAAE6F,EAAE7E,GAAG,IAAIsC,EAAEtD,EAAE6F,GAAG,GAAGvC,EAAE,CAAC,IAAIqd,GAAE,EAAG,EAAE,CAAC,GAAGA,EAAE3f,EAAEsC,EAAE8C,IAAI9C,EAAEgc,WAAWhc,EAAEmX,OAAOrU,IAAI9C,EAAEkW,OAAOpT,IAAI9C,EAAEmX,OAAO6E,WAAWhc,EAAEkW,OAAO8F,WAAWhc,EAAEse,YAAY5B,GAAGW,EAAE,OAAOrd,EAAE8C,IAAI9C,EAAEA,EAAE9F,IAAI,YAAO,IAAS8F,EAAE,CAAC,CAAC,SAASglB,GAAGtI,EAAEhgB,GAAG,IAAI6F,EAAEma,EAAEhgB,GAAG,YAAO,IAAS6F,EAAErI,KAAK,IAAI6nB,GAAE,WAAY,IAAIxf,EAAE,MAAM,CAAC1F,MAAK,GAAI,IAAI6f,EAAE,CAACxF,KAAK3U,EAAEO,IAAIkZ,WAAWzZ,EAAEyZ,WAAW7E,OAAO5U,EAAE4U,OAAOrU,IAAIoT,OAAO3T,EAAE2T,OAAOpT,IAAI8hB,iBAAiBriB,EAAE4U,OAAO6E,WAAW6I,iBAAiBtiB,EAAE2T,OAAO8F,WAAWsC,WAAW/b,EAAE+b,YAAY,OAAO/b,EAAEA,EAAErI,KAAK,CAAC2C,MAAK,EAAGL,MAAMkgB,EAAG,IAAGqF,EAAEH,GAAG,CAAC1K,KAAK3U,EAAEO,IAAIkZ,WAAWzZ,EAAEyZ,WAAW7E,OAAO5U,EAAE4U,OAAOrU,IAAIoT,OAAO3T,EAAE2T,OAAOpT,IAAI8hB,iBAAiBriB,EAAE4U,OAAO6E,WAAW6I,iBAAiBtiB,EAAE2T,OAAO8F,WAAWsC,WAAW/b,EAAE+b,YAAY,CAA0W,SAAS2G,GAAGvI,EAAEhgB,EAAE6F,EAAE7E,GAAG,GAAG,IAAIhB,EAAE4J,KAAK,IAAI,IAAItG,EAAEqd,EAAEhc,EAAE,UAAUkB,GAAGA,IAAI7F,EAAEic,KAAKjY,EAAE,eAAe6B,EAAE+U,GAAE,EAAGrN,EAAEvN,EAAE0mB,OAAOlkB,UAAS,KAAMc,EAAEiK,EAAE/P,QAAQ2C,MAAM,GAAGwgB,EAAErd,EAAExD,OAAO6E,GAAGgc,EAAEiB,aAAa5d,EAAE,CAAC,IAAIyZ,EAAEkD,EAAEkB,EAAEpE,EAAErX,IAAI0b,EAAErE,EAAE6B,WAAW0C,EAAEvE,EAAEhD,OAAOhB,EAAEgE,EAAEjE,OAAO,GAAGoB,EAAE5Z,EAAE6gB,EAAEC,EAAEE,EAAE5b,IAAIqT,EAAErT,IAAI4b,EAAE1C,WAAW7F,EAAE6F,WAAWqB,EAAEiB,YAAY5B,GAAGpF,EAAE,OAAOiH,CAAC,CAAC,CAA4a,SAAS2G,GAAGxI,EAAEhgB,EAAE6F,EAAE7E,EAAEsC,EAAEqd,GAAG,IAAIhc,EAAEX,EAAEhE,EAAEgoB,GAAGD,GAAG,GAAG,eAAeliB,EAAE,CAAC,GAAG,QAAQ7E,IAAI2D,EAAEX,EAAEgc,EAAE1c,EAAE0jB,GAAGrG,GAAGX,GAAGrb,GAAG,OAAOA,EAAE,GAAG,OAAO3D,IAAI2D,EAAEX,EAAEgc,EAAE1c,EAAEqe,IAAIhB,EAAE3f,OAAE,EAAOsC,EAAE8C,KAAK4Z,GAAGrb,GAAG,OAAOA,CAAC,CAAC,GAAG,aAAakB,IAAIlB,EAAEX,EAAEgc,EAAE1c,EAAEse,WAAWjB,GAAGX,GAAGrb,GAAG,OAAOA,CAAC,CAA2T,SAAS8jB,GAAGzI,EAAEhgB,EAAE6F,EAAE7E,EAAEsC,EAAEqd,EAAEhc,GAAG,IAAIX,EAAE4W,EAAE/U,EAAEwiB,GAAGD,GAAG,GAAG,eAAepoB,EAAE,CAAC,QAAG,IAASsD,EAAE0jB,IAAI,QAAQhmB,IAAIgD,EAAE4W,EAAEoF,EAAE1c,EAAE0jB,GAAGrG,EAAEhc,GAAGqb,GAAGhc,GAAG,OAAOA,EAAE,QAAG,IAASV,EAAEqe,KAAK,OAAO3gB,IAAIA,GAAGsC,EAAE8C,MAAMua,KAAK3c,EAAE4W,EAAEoF,EAAE1c,EAAEqe,IAAIhB,EAAEhc,GAAGqb,GAAGhc,GAAG,OAAOA,CAAC,CAAC,GAAG,aAAahE,QAAG,IAASsD,EAAEse,aAAa5d,EAAE4W,EAAEoF,EAAE1c,EAAEse,WAAWjB,EAAEhc,GAAGqb,GAAGhc,GAAG,OAAOA,CAAC,CAAkX,IAAI0kB,GAAG,CAAC,CAAC1J,KAAK,YAAY/C,KAAK,SAAS,CAAC+C,KAAK,cAAc/C,KAAK,WAAW6L,UAAU,MAAM,CAAC9I,KAAK,eAAe/C,KAAK,WAAW6L,UAAU,OAAO,CAAC9I,KAAK,mBAAmB/C,KAAK,QAAQ6L,UAAU,MAAM,CAAC9I,KAAK,oBAAoB/C,KAAK,QAAQ6L,UAAU,OAAO,CAAC9I,KAAK,oBAAoB/C,KAAK,YAAY,CAAC+C,KAAK,sBAAsB/C,KAAK,eAAe,SAAS0M,KAAKloB,KAAKojB,EAAE,KAAKpjB,KAAKwlB,EAAE,IAAI,CAAC,SAAS2C,GAAG5I,EAAEhgB,EAAE6F,EAAE7E,EAAEsC,GAAG,IAAI,IAAIqd,KAAK3f,EAAE,CAAC,IAAI2D,EAAE3D,EAAE2f,GAAG3c,EAAEW,EAAE8V,OAAOG,EAAEjW,EAAE6U,OAAOjM,EAAEvJ,IAAI6B,EAAE+U,EAAE5W,EAAE,IAAIhE,IAAIA,EAAEwE,IAAI+I,EAAEnH,KAAK,CAAC,IAAIqX,EAAEna,EAAEiK,EAAEnH,IAAImH,EAAE+R,YAAY,GAAGU,GAAGvC,EAAE,OAAOlQ,EAAEnH,GAAG,CAAC,CAAC,CAAC,SAASyiB,GAAG7I,EAAEhgB,EAAE6F,EAAE7E,EAAEsC,GAAG,GAAG,UAAUtD,EAAE,CAAC,GAAG,eAAeA,EAAE,OAAO4oB,GAAG5I,EAAE,KAAKhf,EAAEA,EAAE4gB,WAAWte,GAAG,GAAG,iBAAiBuC,EAAE,OAAO+iB,GAAG5I,EAAE,KAAKhf,EAAEA,EAAE6E,GAAGvC,EAAE,CAAC,IAAIqd,EAAEhc,EAAE,IAAIgkB,GAAG,GAAG,eAAe3oB,EAAE,CAAC,GAAG,QAAQ6F,EAAE,CAAC,GAAG8a,EAAEiI,GAAG5I,EAAE,KAAKhf,EAAEA,EAAEgmB,GAAG1jB,GAAG0c,GAAGW,EAAE,OAAOA,EAAEhc,EAAEmkB,KAAK9nB,EAAEgmB,GAAG,CAAC,GAAG,OAAOnhB,EAAE,CAAC,GAAG8a,EAAEiI,GAAG5I,EAAErb,EAAE3D,EAAEA,EAAE2gB,IAAIre,GAAG0c,GAAGW,EAAE,OAAOA,EAAEhc,EAAEmkB,KAAK9nB,EAAE2gB,IAAI,CAAC,CAAC,GAAG,aAAa3hB,IAAI2gB,EAAEiI,GAAG5I,EAAErb,EAAE3D,EAAEA,EAAE4gB,WAAWte,GAAG0c,GAAGW,GAAG,OAAOA,CAAC,CAAC,SAASoI,GAAG/I,EAAEhgB,EAAE6F,GAAG,IAAI7E,EAAEuB,OAAOoD,KAAKE,GAAGvC,EAAEtC,EAAE+B,OAAO4d,EAAE,EAAE,OAAO,IAAI0E,GAAE,WAAY,IAAI1gB,EAAE,KAAK,EAAE,CAAC,GAAGgc,GAAGrd,EAAE,OAAO0c,GAAGA,EAAE8I,KAAKjjB,GAAG,CAAC1F,MAAK,GAAI,IAAI6D,EAAE6B,EAAE7E,EAAE2f,MAAM/F,EAAE5W,EAAEyW,OAAOlN,EAAEvJ,EAAEwV,OAAO7U,EAAEiW,IAAI5a,EAAEuN,EAAEqN,EAAEoF,GAAGA,EAAExb,IAAIG,EAAEyB,OAAOzB,EAAE,KAAK,OAAO,OAAOA,GAAG,MAAM,CAACxE,MAAK,EAAGL,MAAM,CAACkpB,SAASrkB,EAAEyB,IAAIkZ,WAAW3a,EAAE2a,YAAa,GAAE,CAA2nC,SAAS2J,GAAGjJ,EAAEhgB,EAAE6F,EAAE7E,EAAEsC,GAAG,IAAI,IAAIqd,EAAEhc,EAAEX,EAAE4W,EAAErN,EAAEkQ,EAAEoE,EAAEC,EAAE9gB,EAAE0gB,OAAOlf,SAASwf,EAAEhhB,EAAEib,MAAK,KAAM0E,EAAEmB,EAAEtkB,QAAQ2C,MAAM,CAAC,IAAIsZ,GAAE,EAAG,GAAG9U,EAAEgc,EAAE7gB,MAAM,eAAekiB,EAAE,IAAIhe,KAAK4W,EAAEjW,EAAEgd,IAAI,CAACpU,EAAEqN,EAAE5W,GAAG,EAAE,CAAC,GAAGyZ,EAAElQ,EAAEiM,OAAOC,GAAE,EAAGoI,EAAEve,EAAEqB,EAAEyB,IAAIqX,EAAErX,IAAIzB,EAAE2a,WAAW7B,EAAE6B,WAAW/R,EAAEnH,IAAImH,EAAE+R,WAAW/R,EAAEqU,YAAY5B,GAAG6B,EAAE,OAAOtU,EAAEA,EAAEA,EAAE/P,IAAI,OAAO+P,EAAE,CAAC,GAAG,aAAayU,EAAE,IAAIhe,KAAK4W,EAAEjW,EAAEid,WAAW,KAAK5hB,GAAG2E,EAAEyB,IAAIpC,GAAG,CAACuJ,EAAEqN,EAAE5W,GAAG,EAAE,CAAC,IAAIyZ,EAAElQ,EAAEiM,QAAQpT,MAAMpC,IAAIyZ,EAAElQ,EAAEkN,QAAQhB,GAAE,EAAGoI,EAAEve,EAAEqB,EAAEyB,IAAIqX,EAAErX,IAAIzB,EAAE2a,WAAW7B,EAAE6B,WAAW/R,EAAEnH,IAAImH,EAAE+R,WAAW/R,EAAEqU,YAAY5B,GAAG6B,EAAE,OAAOtU,EAAEA,EAAEA,EAAE/P,IAAI,OAAO+P,EAAE,CAAC,GAAG1H,IAAI4T,IAAIoI,EAAEve,EAAEqB,EAAEyB,IAAI,KAAKzB,EAAE2a,WAAW,KAAK,KAAK,KAAK,MAAMU,GAAG6B,GAAG,OAAO,IAAI,CAAC,CAAC,SAASqH,GAAGlJ,GAAG,IAAIvC,EAAEuC,GAAG,MAAM,IAAIiG,EAAE,qHAAqH,KAAK,QAAQjG,GAAG,MAAM,IAAIiG,EAAE,qDAAqD,GAAG,eAAejG,KAAKvC,EAAEuC,EAAEV,aAAa,OAAOU,EAAEV,YAAY,MAAM,IAAI2G,EAAE,0FAA0F,CAAC,SAASkD,GAAGnJ,GAAG,IAAIvC,EAAEuC,GAAG,MAAM,IAAIiG,EAAE,mIAAmI,KAAK,WAAWjG,GAAG,MAAM,IAAIiG,EAAE,wDAAwD,KAAK,WAAWjG,GAAG,MAAM,IAAIiG,EAAE,wDAAwD,GAAG,eAAejG,KAAKvC,EAAEuC,EAAEV,aAAa,OAAOU,EAAEV,YAAY,MAAM,IAAI2G,EAAE,2FAA2F,GAAG,eAAejG,GAAG,kBAAkBA,EAAE4B,WAAW,MAAM,IAAIqE,EAAE,6FAA6F,CAAC0C,GAAG/U,UAAUkV,KAAK,SAAS9I,GAAG,OAAOvf,KAAKojB,EAAEpjB,KAAKojB,EAAE7D,EAAE,OAAOvf,KAAKwlB,IAAIxlB,KAAKwlB,EAAEjG,EAAE,EAAE2I,GAAG/U,UAAUpP,IAAI,SAASwb,GAAG,OAAO,OAAOvf,KAAKojB,GAAG7D,KAAKvf,KAAKojB,GAAG,OAAOpjB,KAAKwlB,GAAGjG,KAAKvf,KAAKwlB,CAAC,EAAE,IAAImD,GAAGC,IAAID,GAAG,IAAIpqB,KAAK2J,MAAM,IAAI3J,KAAKsQ,UAAU,WAAW,OAAO8Z,IAAI,GAAGE,GAAG,IAAIlqB,IAAI,CAAC,WAAW,aAAa,UAAUmqB,GAAG,IAAInqB,IAAI,CAAC,SAAS,UAAU,eAAe,kBAAkBoqB,GAAG,CAACC,gBAAe,EAAGrJ,OAAM,EAAGnE,KAAK,SAAS,SAASyN,GAAG1J,EAAEhgB,EAAE6F,GAAG,IAAI7E,EAAE,IAAIgf,EAAE2J,cAAc3pB,EAAE6F,GAAG,OAAOma,EAAE0B,OAAOvc,IAAInF,EAAEgB,GAAGgf,EAAEmD,KAAK,YAAY,CAAC/c,IAAIpG,EAAEsf,WAAWzZ,IAAI7E,CAAC,CAAC,SAAS4oB,GAAG5J,EAAEhgB,EAAE6F,EAAE7E,EAAEsC,EAAEqd,EAAEhc,EAAEX,GAAG,IAAIhD,GAAG,eAAegf,EAAE/D,KAAK,MAAM,IAAImK,EAAE,SAAS/D,OAAOriB,EAAE,+GAA+G,GAAGgB,GAAG,aAAagf,EAAE/D,KAAK,MAAM,IAAImK,EAAE,SAAS/D,OAAOriB,EAAE,6GAA6G,GAAGgE,IAAIyZ,EAAEzZ,GAAG,MAAM,IAAIiiB,EAAE,SAAS5D,OAAOriB,EAAE,uDAAuDqiB,OAAOre,EAAE,MAAM,GAAG2c,EAAE,GAAGA,EAAEhc,EAAE,GAAGA,EAAEX,EAAEA,GAAG,CAAC,GAAGgc,EAAEyJ,gBAAgB9I,IAAIhc,EAAE,MAAM,IAAIyhB,EAAE,SAAS/D,OAAOriB,EAAE,qCAAqCqiB,OAAO1B,EAAE,uGAAuG,IAAI/F,EAAEoF,EAAE0B,OAAOrC,IAAIsB,GAAGpT,EAAEyS,EAAE0B,OAAOrC,IAAI1a,GAAG,IAAIiW,EAAE,MAAM,IAAIuL,EAAE,SAAS9D,OAAOriB,EAAE,mBAAmBqiB,OAAO1B,EAAE,iBAAiB,IAAIpT,EAAE,MAAM,IAAI4Y,EAAE,SAAS9D,OAAOriB,EAAE,mBAAmBqiB,OAAO1d,EAAE,iBAAiB,IAAIkd,EAAE,CAACzb,IAAI,KAAKwb,WAAW5gB,EAAEyZ,OAAOkG,EAAEnH,OAAO7U,EAAE2a,WAAWtb,GAAG,GAAG6B,EAAEvC,EAAE0c,EAAE6J,yBAAyB,GAAGvmB,EAAE,GAAGA,EAAE0c,EAAE0G,OAAOliB,IAAIlB,GAAG,MAAM,IAAI8iB,EAAE,SAAS/D,OAAOriB,EAAE,WAAWqiB,OAAO/e,EAAE,wCAAwC,IAAI0c,EAAEI,QAAQpf,OAAE,IAAS4Z,EAAEgH,WAAWjd,QAAG,IAASiW,EAAE+G,IAAIhd,IAAI,MAAM,IAAIyhB,EAAE,SAAS/D,OAAOriB,EAAE,uBAAuBqiB,OAAO1B,EAAE,UAAU0B,OAAO1d,EAAE,kJAAkJ,IAAImd,EAAE,IAAI0E,EAAExlB,EAAEsC,EAAEsX,EAAErN,EAAEvJ,GAAGgc,EAAE0G,OAAOvhB,IAAI7B,EAAEwe,GAAG,IAAIE,EAAErB,IAAIhc,EAAE,OAAO3D,GAAG4Z,EAAEiM,mBAAmBtZ,EAAEsZ,mBAAmB7E,IAAIpH,EAAEkM,kBAAkB9G,EAAE8J,8BAA8BlP,EAAEgM,YAAYrZ,EAAEoZ,WAAW3E,IAAIpH,EAAEmM,gBAAgB/G,EAAE+J,2BAA2B/J,EAAEI,MAAM0B,EAAEoF,cAAcpF,EAAEmF,SAASjmB,EAAEgf,EAAEgK,kBAAkBhK,EAAEiK,gBAAgBpI,EAAEzb,IAAI9C,EAAE0c,EAAEmD,KAAK,YAAYtB,GAAGve,CAAC,CAAC,SAAS4mB,GAAGlK,EAAEhgB,EAAE6F,EAAE7E,EAAEsC,EAAEqd,EAAEhc,EAAEX,EAAEuJ,GAAG,IAAIvM,GAAG,eAAegf,EAAE/D,KAAK,MAAM,IAAImK,EAAE,SAAS/D,OAAOriB,EAAE,uIAAuI,GAAGgB,GAAG,aAAagf,EAAE/D,KAAK,MAAM,IAAImK,EAAE,SAAS/D,OAAOriB,EAAE,qIAAqI,GAAGgE,EAAE,GAAGuJ,GAAG,GAAG,mBAAmBvJ,EAAE,MAAM,IAAIiiB,EAAE,SAAS5D,OAAOriB,EAAE,8DAA8DqiB,OAAOre,EAAE,WAAW,IAAIyZ,EAAEzZ,GAAG,MAAM,IAAIiiB,EAAE,SAAS5D,OAAOriB,EAAE,uDAAuDqiB,OAAOre,EAAE,MAAM,IAAI6d,EAAE,GAAGlB,EAAE,GAAGA,EAAEhc,EAAE,GAAGA,EAAE4I,IAAIsU,EAAE7d,EAAEA,OAAE,IAASgc,EAAEyJ,gBAAgB9I,IAAIhc,EAAE,MAAM,IAAIyhB,EAAE,SAAS/D,OAAOriB,EAAE,qCAAqCqiB,OAAO1B,EAAE,uGAAuG,IAAImB,EAAEE,EAAEvI,EAAEuG,EAAE0B,OAAOrC,IAAIsB,GAAGnD,EAAEwC,EAAE0B,OAAOrC,IAAI1a,GAAG,IAAIkB,IAAIic,EAAE9B,EAAE0G,OAAOrH,IAAI/b,IAAI,CAAC,KAAKwe,EAAErH,OAAOrU,MAAMua,GAAGmB,EAAEtI,OAAOpT,MAAMzB,GAAG3D,GAAG8gB,EAAErH,OAAOrU,MAAMzB,GAAGmd,EAAEtI,OAAOpT,MAAMua,GAAG,MAAM,IAAIyF,EAAE,SAAS/D,OAAOriB,EAAE,2DAA2DqiB,OAAO/e,EAAE,iBAAiB+e,OAAO1B,EAAE,gBAAgB0B,OAAO1d,EAAE,mBAAmB0d,OAAOP,EAAErH,OAAOrU,IAAI,QAAQic,OAAOP,EAAEtI,OAAOpT,IAAI,QAAQ4b,EAAEF,CAAC,CAAC,GAAGE,GAAGhC,EAAEI,QAAQ3G,IAAIuI,EAAEhhB,EAAEyY,EAAEmI,WAAWjd,GAAG8U,EAAEkI,IAAIhd,IAAIqd,EAAE,CAAC,IAAIzS,EAAE,CAACyS,EAAE5b,KAAI,GAAG,GAAG,GAAI,GAAGmH,GAAGsU,GAAG7d,EAAE,OAAOuL,EAAE,GAAGhC,EAAE,CAAC,IAAIgQ,EAAEyE,EAAE1C,WAAW0C,EAAE1C,WAAWuC,EAAEtE,GAAGyC,EAAEmD,KAAK,wBAAwB,CAAClH,KAAK,UAAU7V,IAAI4b,EAAE5b,IAAIkZ,WAAW0C,EAAE1C,YAAY,MAAM1E,EAAEoH,EAAE1C,WAAWtb,GAAGgc,EAAEmD,KAAK,wBAAwB,CAAClH,KAAK,QAAQ7V,IAAI4b,EAAE5b,IAAIkZ,WAAW0C,EAAE1C,WAAW9H,KAAKxT,IAAI,OAAOuL,CAAC,CAACvL,EAAEA,GAAG,CAAC,EAAEuJ,GAAGsU,IAAI7d,EAAE6d,EAAE7d,IAAI,IAAIyU,EAAE,CAACrS,IAAI,KAAKwb,WAAW5gB,EAAEyZ,OAAOkG,EAAEnH,OAAO7U,EAAE2a,WAAWtb,GAAG,GAAG6B,EAAEvC,EAAE0c,EAAE6J,yBAAyB,GAAGvmB,EAAE,GAAGA,EAAE0c,EAAE0G,OAAOliB,IAAIlB,GAAG,MAAM,IAAI8iB,EAAE,SAAS/D,OAAOriB,EAAE,WAAWqiB,OAAO/e,EAAE,wCAAwC,IAAIsB,GAAE,EAAG0d,GAAE,EAAG7I,IAAIA,EAAEiQ,GAAG1J,EAAEW,EAAE,CAAC,GAAG/b,GAAE,EAAG+b,IAAIhc,IAAI6Y,EAAE/D,EAAE6I,GAAE,IAAK9E,IAAIA,EAAEkM,GAAG1J,EAAErb,EAAE,CAAC,GAAG2d,GAAE,GAAIR,EAAE,IAAI0E,EAAExlB,EAAEsC,EAAEmW,EAAE+D,EAAExZ,GAAGgc,EAAE0G,OAAOvhB,IAAI7B,EAAEwe,GAAG,IAAI7L,EAAE0K,IAAIhc,EAAE,OAAO3D,GAAGyY,EAAEoN,mBAAmBrJ,EAAEqJ,mBAAmB5Q,IAAIwD,EAAEqN,kBAAkB9G,EAAE8J,8BAA8BrQ,EAAEmN,YAAYpJ,EAAEmJ,WAAW1Q,IAAIwD,EAAEsN,gBAAgB/G,EAAE+J,2BAA2B/J,EAAEI,MAAM0B,EAAEoF,cAAcpF,EAAEmF,SAASjmB,EAAEgf,EAAEgK,kBAAkBhK,EAAEiK,gBAAgBxR,EAAErS,IAAI9C,EAAE0c,EAAEmD,KAAK,YAAY1K,GAAG,CAACnV,GAAE,EAAGsB,EAAE0d,EAAE,CAAC,SAAS6H,GAAGnK,EAAEhgB,GAAGggB,EAAE0G,OAAO0D,OAAOpqB,EAAEoG,KAAK,IAAIP,EAAE7F,EAAEya,OAAOzZ,EAAEhB,EAAEwZ,OAAOlW,EAAEtD,EAAEsf,WAAWqB,EAAE3gB,EAAE4hB,WAAWjd,EAAEkB,IAAI7E,EAAE2f,GAAG9a,EAAEghB,mBAAmB7lB,EAAE6lB,mBAAmBliB,IAAIkB,EAAEihB,kBAAkB9G,EAAE8J,8BAA8BjkB,EAAE+gB,YAAY5lB,EAAE2lB,WAAWhiB,IAAIkB,EAAEkhB,gBAAgB/G,EAAE+J,2BAA2B/J,EAAEI,MAAMpgB,EAAEqnB,cAAcrnB,EAAEonB,SAASzG,EAAEX,EAAEgK,kBAAkBhK,EAAEiK,gBAAgBjK,EAAEmD,KAAK,cAAc,CAAC/c,IAAIpG,EAAEoG,IAAIkZ,WAAWhc,EAAEmX,OAAO5U,EAAEO,IAAIoT,OAAOxY,EAAEoF,IAAIwb,WAAWjB,GAAG,CAAC,IAAI0J,GAAG,SAASxkB,GAAG,SAAS7E,EAAEgf,GAAG,IAAIhgB,EAAE,GAAGA,EAAE6F,EAAE+T,KAAKnZ,OAAOA,KAAK,kBAAkBuf,EAAEpF,EAAE,CAAC,EAAE4O,GAAGxJ,IAAII,MAAM,MAAM,IAAI6F,EAAE,4EAA4E5D,OAAOrC,EAAEI,MAAM,OAAO,IAAIkJ,GAAG9kB,IAAIwb,EAAE/D,MAAM,MAAM,IAAIgK,EAAE,6GAA6G5D,OAAOrC,EAAE/D,KAAK,OAAO,GAAG,kBAAkB+D,EAAEyJ,eAAe,MAAM,IAAIxD,EAAE,qFAAqF5D,OAAOrC,EAAEyJ,eAAe,OAAO,IAAIzoB,EAAE,UAAUgf,EAAE/D,KAAKoK,EAAE,aAAarG,EAAE/D,KAAKsC,EAAEgI,EAAEzE,EAAE9d,EAAEhE,GAAG,gBAAgBgB,GAAG,IAAIsC,EAAE,QAAQ+lB,KAAK,IAAI1I,EAAE,EAAE,OAAOmB,EAAE9d,EAAEhE,GAAG,cAAc,CAAC,GAAG8hB,EAAE9d,EAAEhE,GAAG,SAAS,IAAImhB,KAAKW,EAAE9d,EAAEhE,GAAG,SAAS,IAAImhB,KAAKW,EAAE9d,EAAEhE,GAAG,gBAAgB,GAAG8hB,EAAE9d,EAAEhE,GAAG,kBAAkB,GAAG8hB,EAAE9d,EAAEhE,GAAG,yBAAyB,GAAG8hB,EAAE9d,EAAEhE,GAAG,2BAA2B,GAAG8hB,EAAE9d,EAAEhE,GAAG,qBAAoB,WAAY,IAAIggB,EAAE,GAAGA,EAAE1c,EAAEqd,UAAU3gB,EAAE0mB,OAAOliB,IAAIwb,IAAI,OAAOA,CAAE,IAAG8B,EAAE9d,EAAEhE,GAAG,WAAWggB,GAAGuJ,GAAGtkB,SAAQ,SAAU+a,GAAG,OAAO8B,EAAE9d,EAAEhE,GAAGggB,EAAEhgB,EAAEggB,GAAI,IAAGgC,EAAEhe,EAAEhE,GAAG,SAAQ,WAAY,OAAOA,EAAE0hB,OAAO9X,IAAK,IAAGoY,EAAEhe,EAAEhE,GAAG,QAAO,WAAY,OAAOA,EAAE0mB,OAAO9c,IAAK,IAAGoY,EAAEhe,EAAEhE,GAAG,gBAAe,WAAY,OAAOA,EAAEiqB,aAAc,IAAGjI,EAAEhe,EAAEhE,GAAG,kBAAiB,WAAY,OAAOA,EAAEgqB,eAAgB,IAAGhI,EAAEhe,EAAEhE,GAAG,iBAAgB,WAAY,OAAOA,EAAE+pB,uBAAuB/pB,EAAE8pB,wBAAyB,IAAG9H,EAAEhe,EAAEhE,GAAG,yBAAwB,WAAY,OAAOA,EAAE+pB,sBAAuB,IAAG/H,EAAEhe,EAAEhE,GAAG,2BAA0B,WAAY,OAAOA,EAAE8pB,wBAAyB,IAAG9H,EAAEhe,EAAEhE,GAAG,QAAQA,EAAEsU,SAAS8L,OAAO4B,EAAEhe,EAAEhE,GAAG,OAAOA,EAAEsU,SAAS2H,MAAM+F,EAAEhe,EAAEhE,GAAG,iBAAiBA,EAAEsU,SAASmV,gBAAgBzH,EAAEhe,EAAEhE,GAAG,kBAAiB,WAAY,MAAM,YAAa,IAAGA,CAAC,CAACA,EAAEgB,EAAE6E,GAAG,IAAIvC,EAAEtC,EAAE4S,UAAU,OAAOtQ,EAAEgnB,uBAAuB,WAAW7pB,KAAKwpB,cAAc,EAAExpB,KAAKupB,gBAAgB,EAAEvpB,KAAKspB,uBAAuB,EAAEtpB,KAAKqpB,yBAAyB,CAAC,EAAExmB,EAAEinB,QAAQ,SAASvK,GAAG,OAAOvf,KAAKihB,OAAOld,IAAI,GAAGwb,EAAE,EAAE1c,EAAEknB,gBAAgB,SAASxK,EAAEhgB,GAAG,GAAG,eAAeS,KAAKwb,KAAK,OAAM,EAAG,GAAG,IAAIpC,UAAU9W,OAAO,CAAC,IAAI8C,EAAE,GAAGma,EAAEhf,EAAEP,KAAKimB,OAAOrH,IAAIxZ,GAAG,QAAQ7E,IAAIA,EAAE4gB,UAAU,CAAC,GAAG,IAAI/H,UAAU9W,OAAO,CAACid,EAAE,GAAGA,EAAEhgB,EAAE,GAAGA,EAAE,IAAIsD,EAAE7C,KAAKihB,OAAOrC,IAAIW,GAAG,QAAQ1c,GAAGA,EAAEqe,IAAI6F,eAAexnB,EAAE,CAAC,MAAM,IAAIimB,EAAE,yCAAyC5D,OAAOxI,UAAU9W,OAAO,wHAAwH,EAAEO,EAAEmnB,kBAAkB,SAASzK,EAAEhgB,GAAG,GAAG,aAAaS,KAAKwb,KAAK,OAAM,EAAG,GAAG,IAAIpC,UAAU9W,OAAO,CAAC,IAAI8C,EAAE,GAAGma,EAAEhf,EAAEP,KAAKimB,OAAOrH,IAAIxZ,GAAG,QAAQ7E,GAAGA,EAAE4gB,UAAU,CAAC,GAAG,IAAI/H,UAAU9W,OAAO,CAACid,EAAE,GAAGA,EAAEhgB,EAAE,GAAGA,EAAE,IAAIsD,EAAE7C,KAAKihB,OAAOrC,IAAIW,GAAG,QAAQ1c,GAAGA,EAAEse,WAAW4F,eAAexnB,EAAE,CAAC,MAAM,IAAIimB,EAAE,yCAAyC5D,OAAOxI,UAAU9W,OAAO,wHAAwH,EAAEO,EAAEonB,QAAQ,SAAS1K,EAAEhgB,GAAG,GAAG,IAAI6Z,UAAU9W,OAAO,CAAC,IAAI8C,EAAE,GAAGma,EAAE,OAAOvf,KAAKimB,OAAOliB,IAAIqB,EAAE,CAAC,GAAG,IAAIgU,UAAU9W,OAAO,CAACid,EAAE,GAAGA,EAAEhgB,EAAE,GAAGA,EAAE,IAAIgB,EAAEP,KAAKihB,OAAOrC,IAAIW,GAAG,QAAQhf,SAAI,IAASA,EAAE2gB,KAAK3gB,EAAE2gB,IAAI6F,eAAexnB,SAAI,IAASgB,EAAE4gB,YAAY5gB,EAAE4gB,WAAW4F,eAAexnB,GAAG,CAAC,MAAM,IAAIimB,EAAE,iCAAiC5D,OAAOxI,UAAU9W,OAAO,wHAAwH,EAAEO,EAAEqnB,aAAa,SAAS3K,EAAEhgB,GAAG,GAAG,eAAeS,KAAKwb,KAAK,CAAC,GAAG+D,EAAE,GAAGA,EAAEhgB,EAAE,GAAGA,EAAES,KAAK2f,MAAM,MAAM,IAAIgG,EAAE,4JAA4J,IAAIvgB,EAAEpF,KAAKihB,OAAOrC,IAAIW,GAAG,IAAIna,EAAE,MAAM,IAAIsgB,EAAE,2CAA2C9D,OAAOrC,EAAE,gCAAgC,IAAIvf,KAAKihB,OAAOld,IAAIxE,GAAG,MAAM,IAAImmB,EAAE,2CAA2C9D,OAAOriB,EAAE,gCAAgC,IAAIgB,EAAE6E,EAAE8b,KAAK9b,EAAE8b,IAAI3hB,SAAI,EAAO,OAAOgB,EAAEA,EAAEoF,SAAI,CAAM,CAAC,EAAE9C,EAAEsnB,eAAe,SAAS5K,EAAEhgB,GAAG,GAAG,aAAaS,KAAKwb,KAAK,CAAC,GAAG+D,EAAE,GAAGA,EAAEhgB,EAAE,GAAGA,EAAES,KAAK2f,MAAM,MAAM,IAAIgG,EAAE,gKAAgK,IAAIvgB,EAAEpF,KAAKihB,OAAOrC,IAAIW,GAAG,IAAIna,EAAE,MAAM,IAAIsgB,EAAE,6CAA6C9D,OAAOrC,EAAE,gCAAgC,IAAIvf,KAAKihB,OAAOld,IAAIxE,GAAG,MAAM,IAAImmB,EAAE,6CAA6C9D,OAAOriB,EAAE,gCAAgC,IAAIgB,EAAE6E,EAAE+b,YAAY/b,EAAE+b,WAAW5hB,SAAI,EAAO,OAAOgB,EAAEA,EAAEoF,SAAI,CAAM,CAAC,EAAE9C,EAAEkX,KAAK,SAASwF,EAAEhgB,GAAG,GAAGS,KAAK2f,MAAM,MAAM,IAAIgG,EAAE,4IAA4IpG,EAAE,GAAGA,EAAEhgB,EAAE,GAAGA,EAAE,IAAI6F,EAAEpF,KAAKihB,OAAOrC,IAAIW,GAAG,IAAIna,EAAE,MAAM,IAAIsgB,EAAE,mCAAmC9D,OAAOrC,EAAE,gCAAgC,IAAIvf,KAAKihB,OAAOld,IAAIxE,GAAG,MAAM,IAAImmB,EAAE,mCAAmC9D,OAAOriB,EAAE,gCAAgC,IAAIgB,EAAE6E,EAAE8b,KAAK9b,EAAE8b,IAAI3hB,IAAI6F,EAAE+b,YAAY/b,EAAE+b,WAAW5hB,SAAI,EAAO,GAAGgB,EAAE,OAAOA,EAAEoF,GAAG,EAAE9C,EAAEunB,qBAAqB,SAAS7K,EAAEhgB,GAAGggB,EAAE,GAAGA,EAAEhgB,EAAE,GAAGA,EAAE,IAAI6F,EAAEpF,KAAKihB,OAAOrC,IAAIW,GAAG,IAAIna,EAAE,MAAM,IAAIsgB,EAAE,mDAAmD9D,OAAOrC,EAAE,yBAAyB,MAAM,eAAevf,KAAKwb,OAAOjc,KAAK6F,EAAEmhB,IAAIhnB,KAAK6F,EAAE8b,IAAI,EAAEre,EAAEwnB,gBAAgB,SAAS9K,EAAEhgB,GAAGggB,EAAE,GAAGA,EAAEhgB,EAAE,GAAGA,EAAE,IAAI6F,EAAEpF,KAAKihB,OAAOrC,IAAIW,GAAG,IAAIna,EAAE,MAAM,IAAIsgB,EAAE,8CAA8C9D,OAAOrC,EAAE,yBAAyB,MAAM,eAAevf,KAAKwb,MAAMjc,KAAK6F,EAAE8b,GAAG,EAAEre,EAAEynB,eAAe,SAAS/K,EAAEhgB,GAAGggB,EAAE,GAAGA,EAAEhgB,EAAE,GAAGA,EAAE,IAAI6F,EAAEpF,KAAKihB,OAAOrC,IAAIW,GAAG,IAAIna,EAAE,MAAM,IAAIsgB,EAAE,6CAA6C9D,OAAOrC,EAAE,yBAAyB,MAAM,eAAevf,KAAKwb,MAAMjc,KAAK6F,EAAEmhB,EAAE,EAAE1jB,EAAE0nB,uBAAuB,SAAShL,EAAEhgB,GAAGggB,EAAE,GAAGA,EAAEhgB,EAAE,GAAGA,EAAE,IAAI6F,EAAEpF,KAAKihB,OAAOrC,IAAIW,GAAG,IAAIna,EAAE,MAAM,IAAIsgB,EAAE,qDAAqD9D,OAAOrC,EAAE,yBAAyB,MAAM,aAAavf,KAAKwb,MAAMjc,KAAK6F,EAAE+b,UAAU,EAAEte,EAAE2nB,aAAa,SAASjL,EAAEhgB,GAAGggB,EAAE,GAAGA,EAAEhgB,EAAE,GAAGA,EAAE,IAAI6F,EAAEpF,KAAKihB,OAAOrC,IAAIW,GAAG,IAAIna,EAAE,MAAM,IAAIsgB,EAAE,2CAA2C9D,OAAOrC,EAAE,yBAAyB,MAAM,eAAevf,KAAKwb,OAAOjc,KAAK6F,EAAEmhB,IAAIhnB,KAAK6F,EAAE8b,MAAM,aAAalhB,KAAKwb,MAAMjc,KAAK6F,EAAE+b,UAAU,EAAEte,EAAE4nB,oBAAoB,SAASlL,EAAEhgB,GAAGggB,EAAE,GAAGA,EAAEhgB,EAAE,GAAGA,EAAE,IAAI6F,EAAEpF,KAAKihB,OAAOrC,IAAIW,GAAG,IAAIna,EAAE,MAAM,IAAIsgB,EAAE,kDAAkD9D,OAAOrC,EAAE,yBAAyB,MAAM,eAAevf,KAAKwb,MAAMjc,KAAK6F,EAAEmhB,IAAI,aAAavmB,KAAKwb,MAAMjc,KAAK6F,EAAE+b,UAAU,EAAEte,EAAE6nB,qBAAqB,SAASnL,EAAEhgB,GAAGggB,EAAE,GAAGA,EAAEhgB,EAAE,GAAGA,EAAE,IAAI6F,EAAEpF,KAAKihB,OAAOrC,IAAIW,GAAG,IAAIna,EAAE,MAAM,IAAIsgB,EAAE,mDAAmD9D,OAAOrC,EAAE,yBAAyB,MAAM,eAAevf,KAAKwb,MAAMjc,KAAK6F,EAAE8b,KAAK,aAAalhB,KAAKwb,MAAMjc,KAAK6F,EAAE+b,UAAU,EAAEte,EAAEqjB,SAAS,SAAS3G,GAAGA,EAAE,GAAGA,EAAE,IAAIhgB,EAAES,KAAKihB,OAAOrC,IAAIW,GAAG,IAAIhgB,EAAE,MAAM,IAAImmB,EAAE,uCAAuC9D,OAAOrC,EAAE,yBAAyB,MAAM,eAAevf,KAAKwb,KAAK,EAAEjc,EAAE2mB,QAAQ,EAAErjB,EAAEsjB,UAAU,SAAS5G,GAAGA,EAAE,GAAGA,EAAE,IAAIhgB,EAAES,KAAKihB,OAAOrC,IAAIW,GAAG,IAAIhgB,EAAE,MAAM,IAAImmB,EAAE,wCAAwC9D,OAAOrC,EAAE,yBAAyB,MAAM,eAAevf,KAAKwb,KAAK,EAAEjc,EAAE4mB,SAAS,EAAEtjB,EAAE8nB,eAAe,SAASpL,GAAGA,EAAE,GAAGA,EAAE,IAAIhgB,EAAES,KAAKihB,OAAOrC,IAAIW,GAAG,IAAIhgB,EAAE,MAAM,IAAImmB,EAAE,6CAA6C9D,OAAOrC,EAAE,yBAAyB,MAAM,eAAevf,KAAKwb,KAAK,EAAEjc,EAAE2mB,SAAS3mB,EAAE4mB,SAAS,EAAEtjB,EAAEujB,iBAAiB,SAAS7G,GAAGA,EAAE,GAAGA,EAAE,IAAIhgB,EAAES,KAAKihB,OAAOrC,IAAIW,GAAG,IAAIhgB,EAAE,MAAM,IAAImmB,EAAE,+CAA+C9D,OAAOrC,EAAE,yBAAyB,MAAM,aAAavf,KAAKwb,KAAK,EAAEjc,EAAE6mB,gBAAgB,EAAEvjB,EAAE+nB,cAAc,SAASrL,GAAGA,EAAE,GAAGA,EAAE,IAAIhgB,EAAES,KAAKihB,OAAOrC,IAAIW,GAAG,IAAIhgB,EAAE,MAAM,IAAImmB,EAAE,4CAA4C9D,OAAOrC,EAAE,yBAAyB,IAAIna,EAAE,EAAE,MAAM,aAAapF,KAAKwb,OAAOpW,GAAG7F,EAAE6mB,kBAAkB,eAAepmB,KAAKwb,OAAOpW,GAAG7F,EAAE2mB,UAAU9gB,CAAC,EAAEvC,EAAEgoB,eAAe,SAAStL,GAAGA,EAAE,GAAGA,EAAE,IAAIhgB,EAAES,KAAKihB,OAAOrC,IAAIW,GAAG,IAAIhgB,EAAE,MAAM,IAAImmB,EAAE,6CAA6C9D,OAAOrC,EAAE,yBAAyB,IAAIna,EAAE,EAAE,MAAM,aAAapF,KAAKwb,OAAOpW,GAAG7F,EAAE6mB,kBAAkB,eAAepmB,KAAKwb,OAAOpW,GAAG7F,EAAE4mB,WAAW/gB,CAAC,EAAEvC,EAAEioB,OAAO,SAASvL,GAAGA,EAAE,GAAGA,EAAE,IAAIhgB,EAAES,KAAKihB,OAAOrC,IAAIW,GAAG,IAAIhgB,EAAE,MAAM,IAAImmB,EAAE,qCAAqC9D,OAAOrC,EAAE,yBAAyB,IAAIna,EAAE,EAAE,MAAM,aAAapF,KAAKwb,OAAOpW,GAAG7F,EAAE6mB,kBAAkB,eAAepmB,KAAKwb,OAAOpW,GAAG7F,EAAE2mB,SAAS3mB,EAAE4mB,WAAW/gB,CAAC,EAAEvC,EAAEkoB,yBAAyB,SAASxL,GAAGA,EAAE,GAAGA,EAAE,IAAIhgB,EAAES,KAAKihB,OAAOrC,IAAIW,GAAG,IAAIhgB,EAAE,MAAM,IAAImmB,EAAE,uDAAuD9D,OAAOrC,EAAE,yBAAyB,MAAM,eAAevf,KAAKwb,KAAK,EAAEjc,EAAE2mB,SAAS3mB,EAAE+mB,aAAa,EAAEzjB,EAAEmoB,0BAA0B,SAASzL,GAAGA,EAAE,GAAGA,EAAE,IAAIhgB,EAAES,KAAKihB,OAAOrC,IAAIW,GAAG,IAAIhgB,EAAE,MAAM,IAAImmB,EAAE,wDAAwD9D,OAAOrC,EAAE,yBAAyB,MAAM,eAAevf,KAAKwb,KAAK,EAAEjc,EAAE4mB,UAAU5mB,EAAE+mB,aAAa,EAAEzjB,EAAEooB,+BAA+B,SAAS1L,GAAGA,EAAE,GAAGA,EAAE,IAAIhgB,EAAES,KAAKihB,OAAOrC,IAAIW,GAAG,IAAIhgB,EAAE,MAAM,IAAImmB,EAAE,6DAA6D9D,OAAOrC,EAAE,yBAAyB,MAAM,eAAevf,KAAKwb,KAAK,EAAEjc,EAAE2mB,SAAS3mB,EAAE4mB,UAAU,EAAE5mB,EAAE+mB,aAAa,EAAEzjB,EAAEqoB,iCAAiC,SAAS3L,GAAGA,EAAE,GAAGA,EAAE,IAAIhgB,EAAES,KAAKihB,OAAOrC,IAAIW,GAAG,IAAIhgB,EAAE,MAAM,IAAImmB,EAAE,+DAA+D9D,OAAOrC,EAAE,yBAAyB,MAAM,aAAavf,KAAKwb,KAAK,EAAEjc,EAAE6mB,iBAAiB,EAAE7mB,EAAE8mB,eAAe,EAAExjB,EAAEsoB,8BAA8B,SAAS5L,GAAGA,EAAE,GAAGA,EAAE,IAAIhgB,EAAES,KAAKihB,OAAOrC,IAAIW,GAAG,IAAIhgB,EAAE,MAAM,IAAImmB,EAAE,4DAA4D9D,OAAOrC,EAAE,yBAAyB,IAAIna,EAAE,EAAE7E,EAAE,EAAE,MAAM,aAAaP,KAAKwb,OAAOpW,GAAG7F,EAAE6mB,iBAAiB7lB,GAAG,EAAEhB,EAAE8mB,iBAAiB,eAAermB,KAAKwb,OAAOpW,GAAG7F,EAAE2mB,SAAS3lB,GAAGhB,EAAE+mB,eAAelhB,EAAE7E,CAAC,EAAEsC,EAAEuoB,+BAA+B,SAAS7L,GAAGA,EAAE,GAAGA,EAAE,IAAIhgB,EAAES,KAAKihB,OAAOrC,IAAIW,GAAG,IAAIhgB,EAAE,MAAM,IAAImmB,EAAE,6DAA6D9D,OAAOrC,EAAE,yBAAyB,IAAIna,EAAE,EAAE7E,EAAE,EAAE,MAAM,aAAaP,KAAKwb,OAAOpW,GAAG7F,EAAE6mB,iBAAiB7lB,GAAG,EAAEhB,EAAE8mB,iBAAiB,eAAermB,KAAKwb,OAAOpW,GAAG7F,EAAE4mB,UAAU5lB,GAAGhB,EAAE+mB,eAAelhB,EAAE7E,CAAC,EAAEsC,EAAEwoB,uBAAuB,SAAS9L,GAAGA,EAAE,GAAGA,EAAE,IAAIhgB,EAAES,KAAKihB,OAAOrC,IAAIW,GAAG,IAAIhgB,EAAE,MAAM,IAAImmB,EAAE,qDAAqD9D,OAAOrC,EAAE,yBAAyB,IAAIna,EAAE,EAAE7E,EAAE,EAAE,MAAM,aAAaP,KAAKwb,OAAOpW,GAAG7F,EAAE6mB,iBAAiB7lB,GAAG,EAAEhB,EAAE8mB,iBAAiB,eAAermB,KAAKwb,OAAOpW,GAAG7F,EAAE2mB,SAAS3mB,EAAE4mB,UAAU5lB,GAAG,EAAEhB,EAAE+mB,eAAelhB,EAAE7E,CAAC,EAAEsC,EAAEmX,OAAO,SAASuF,GAAGA,EAAE,GAAGA,EAAE,IAAIhgB,EAAES,KAAKimB,OAAOrH,IAAIW,GAAG,IAAIhgB,EAAE,MAAM,IAAImmB,EAAE,qCAAqC9D,OAAOrC,EAAE,yBAAyB,OAAOhgB,EAAEya,OAAOrU,GAAG,EAAE9C,EAAEkW,OAAO,SAASwG,GAAGA,EAAE,GAAGA,EAAE,IAAIhgB,EAAES,KAAKimB,OAAOrH,IAAIW,GAAG,IAAIhgB,EAAE,MAAM,IAAImmB,EAAE,qCAAqC9D,OAAOrC,EAAE,yBAAyB,OAAOhgB,EAAEwZ,OAAOpT,GAAG,EAAE9C,EAAEwc,YAAY,SAASE,GAAGA,EAAE,GAAGA,EAAE,IAAIhgB,EAAES,KAAKimB,OAAOrH,IAAIW,GAAG,IAAIhgB,EAAE,MAAM,IAAImmB,EAAE,0CAA0C9D,OAAOrC,EAAE,yBAAyB,MAAM,CAAChgB,EAAEya,OAAOrU,IAAIpG,EAAEwZ,OAAOpT,IAAI,EAAE9C,EAAEyoB,SAAS,SAAS/L,EAAEhgB,GAAGggB,EAAE,GAAGA,EAAEhgB,EAAE,GAAGA,EAAE,IAAI6F,EAAEpF,KAAKimB,OAAOrH,IAAIrf,GAAG,IAAI6F,EAAE,MAAM,IAAIsgB,EAAE,uCAAuC9D,OAAOriB,EAAE,yBAAyB,IAAIgB,EAAE6E,EAAE4U,OAAOrU,IAAI9C,EAAEuC,EAAE2T,OAAOpT,IAAI,GAAG4Z,IAAIhf,EAAE,OAAOsC,EAAE,GAAG0c,IAAI1c,EAAE,OAAOtC,EAAE,MAAM,IAAImlB,EAAE,wBAAwB9D,OAAOrC,EAAE,mCAAmCqC,OAAOriB,EAAE,YAAYqiB,OAAOrhB,EAAE,MAAMqhB,OAAO/e,EAAE,MAAM,EAAEA,EAAE0oB,aAAa,SAAShM,EAAEhgB,GAAGggB,EAAE,GAAGA,EAAEhgB,EAAE,GAAGA,EAAE,IAAI6F,EAAEpF,KAAKimB,OAAOrH,IAAIW,GAAG,IAAIna,EAAE,MAAM,IAAIsgB,EAAE,2CAA2C9D,OAAOrC,EAAE,yBAAyB,OAAOna,EAAE4U,OAAOrU,MAAMpG,GAAG6F,EAAE2T,OAAOpT,MAAMpG,CAAC,EAAEsD,EAAEyc,aAAa,SAASC,GAAGA,EAAE,GAAGA,EAAE,IAAIhgB,EAAES,KAAKimB,OAAOrH,IAAIW,GAAG,IAAIhgB,EAAE,MAAM,IAAImmB,EAAE,2CAA2C9D,OAAOrC,EAAE,yBAAyB,OAAOhgB,EAAE4hB,UAAU,EAAEte,EAAE2oB,WAAW,SAASjM,GAAGA,EAAE,GAAGA,EAAE,IAAIhgB,EAAES,KAAKimB,OAAOrH,IAAIW,GAAG,IAAIhgB,EAAE,MAAM,IAAImmB,EAAE,yCAAyC9D,OAAOrC,EAAE,yBAAyB,OAAOhgB,EAAE4hB,UAAU,EAAEte,EAAE4oB,WAAW,SAASlM,GAAGA,EAAE,GAAGA,EAAE,IAAIhgB,EAAES,KAAKimB,OAAOrH,IAAIW,GAAG,IAAIhgB,EAAE,MAAM,IAAImmB,EAAE,yCAAyC9D,OAAOrC,EAAE,yBAAyB,OAAOhgB,EAAEya,SAASza,EAAEwZ,MAAM,EAAElW,EAAE8L,QAAQ,SAAS4Q,EAAEhgB,GAAG,IAAI6F,EAAE,SAASma,EAAEhgB,EAAE6F,GAAG,GAAGA,IAAI4X,EAAE5X,GAAG,MAAM,IAAIogB,EAAE,mEAAmE5D,OAAOxc,EAAE,MAAM,GAAG7F,EAAE,GAAGA,EAAE6F,EAAEA,GAAG,CAAC,EAAEma,EAAE0B,OAAOld,IAAIxE,GAAG,MAAM,IAAIomB,EAAE,uBAAuB/D,OAAOriB,EAAE,uCAAuC,IAAIgB,EAAE,IAAIgf,EAAE2J,cAAc3pB,EAAE6F,GAAG,OAAOma,EAAE0B,OAAOvc,IAAInF,EAAEgB,GAAGgf,EAAEmD,KAAK,YAAY,CAAC/c,IAAIpG,EAAEsf,WAAWzZ,IAAI7E,CAAC,CAAjV,CAAmVP,KAAKuf,EAAEhgB,GAAG,OAAO6F,EAAEO,GAAG,EAAE9C,EAAE6oB,UAAU,SAASnM,EAAEhgB,GAAG,GAAGA,IAAIyd,EAAEzd,GAAG,MAAM,IAAIimB,EAAE,qEAAqE5D,OAAOriB,EAAE,MAAMggB,EAAE,GAAGA,EAAEhgB,EAAEA,GAAG,CAAC,EAAE,IAAI6F,EAAEpF,KAAKihB,OAAOrC,IAAIW,GAAG,OAAOna,GAAG7F,IAAI4a,EAAE/U,EAAEyZ,WAAWtf,GAAGS,KAAK0iB,KAAK,wBAAwB,CAAClH,KAAK,QAAQ7V,IAAI4Z,EAAEV,WAAWzZ,EAAEyZ,WAAW9H,KAAKxX,KAAK,CAACggB,GAAE,KAAMna,EAAE,IAAIpF,KAAKkpB,cAAc3J,EAAEhgB,GAAGS,KAAKihB,OAAOvc,IAAI6a,EAAEna,GAAGpF,KAAK0iB,KAAK,YAAY,CAAC/c,IAAI4Z,EAAEV,WAAWtf,IAAI,CAACggB,GAAE,GAAI,EAAE1c,EAAE8oB,WAAW,SAASpM,EAAEhgB,GAAG,GAAGA,GAAG,mBAAmBA,EAAE,MAAM,IAAIimB,EAAE,6EAA6E5D,OAAOriB,EAAE,MAAMggB,EAAE,GAAGA,EAAE,IAAIna,EAAEpF,KAAKihB,OAAOrC,IAAIW,GAAG,GAAGna,EAAE,CAAC,GAAG7F,EAAE,CAAC,IAAIgB,EAAE6E,EAAEyZ,WAAWzZ,EAAEyZ,WAAWtf,EAAEgB,GAAGP,KAAK0iB,KAAK,wBAAwB,CAAClH,KAAK,UAAU7V,IAAI4Z,EAAEV,WAAWzZ,EAAEyZ,YAAY,CAAC,MAAM,CAACU,GAAE,EAAG,CAAC,IAAI1c,EAAEtD,EAAEA,EAAE,CAAC,GAAG,CAAC,EAAE,OAAO6F,EAAE,IAAIpF,KAAKkpB,cAAc3J,EAAE1c,GAAG7C,KAAKihB,OAAOvc,IAAI6a,EAAEna,GAAGpF,KAAK0iB,KAAK,YAAY,CAAC/c,IAAI4Z,EAAEV,WAAWhc,IAAI,CAAC0c,GAAE,EAAG,EAAE1c,EAAE6c,SAAS,SAASH,GAAGA,EAAE,GAAGA,EAAE,IAAIhgB,EAAE6F,EAAEpF,KAAKihB,OAAOrC,IAAIW,GAAG,IAAIna,EAAE,MAAM,IAAIsgB,EAAE,uCAAuC9D,OAAOrC,EAAE,yBAAyB,GAAG,eAAevf,KAAKwb,KAAK,CAAC,IAAI,IAAIjb,KAAK6E,EAAE8b,IAAI,CAAC3hB,EAAE6F,EAAE8b,IAAI3gB,GAAG,GAAGmpB,GAAG1pB,KAAKT,GAAGA,EAAEA,EAAExC,WAAWwC,EAAE,CAAC,IAAI,IAAIsD,KAAKuC,EAAEmhB,GAAG,CAAChnB,EAAE6F,EAAEmhB,GAAG1jB,GAAG,GAAG6mB,GAAG1pB,KAAKT,GAAGA,EAAEA,EAAExC,WAAWwC,EAAE,CAAC,CAAC,GAAG,aAAaS,KAAKwb,KAAK,IAAI,IAAI0E,KAAK9a,EAAE+b,WAAW,CAAC5hB,EAAE6F,EAAE+b,WAAWjB,GAAG,GAAGwJ,GAAG1pB,KAAKT,GAAGA,EAAEA,EAAExC,WAAWwC,EAAE,CAACS,KAAKihB,OAAO0I,OAAOpK,GAAGvf,KAAK0iB,KAAK,cAAc,CAAC/c,IAAI4Z,EAAEV,WAAWzZ,EAAEyZ,YAAY,EAAEhc,EAAE+oB,SAAS,SAASrM,GAAG,IAAIhgB,EAAE,GAAG6Z,UAAU9W,OAAO,EAAE,CAAC,IAAI8C,EAAE,GAAGgU,UAAU,GAAG7Y,EAAE,GAAG6Y,UAAU,GAAG,KAAK7Z,EAAEuN,EAAE9M,KAAKoF,EAAE7E,EAAEP,KAAKwb,OAAO,MAAM,IAAIkK,EAAE,uCAAuC9D,OAAOxc,EAAE,UAAUwc,OAAOrhB,EAAE,wBAAwB,MAAM,GAAGgf,EAAE,GAAGA,IAAIhgB,EAAES,KAAKimB,OAAOrH,IAAIW,IAAI,MAAM,IAAImG,EAAE,uCAAuC9D,OAAOrC,EAAE,yBAAyB,OAAOmK,GAAG1pB,KAAKT,GAAGS,IAAI,EAAE6C,EAAEgpB,iBAAiB,SAAStM,EAAEhgB,GAAG,GAAG6Z,UAAU9W,OAAO,EAAE,MAAM,IAAIqjB,EAAE,iLAAiL,GAAG3lB,KAAK2f,MAAM,MAAM,IAAIgG,EAAE,sLAAsL,IAAIvgB,EAAE0H,EAAE9M,KAAKuf,EAAE,GAAGA,EAAEhgB,EAAE,GAAGA,EAAE,YAAY,IAAI6F,EAAE,MAAM,IAAIsgB,EAAE,6CAA6C9D,OAAOrC,EAAE,UAAUqC,OAAOriB,EAAE,yBAAyB,OAAOmqB,GAAG1pB,KAAKoF,GAAGpF,IAAI,EAAE6C,EAAEipB,mBAAmB,SAASvM,EAAEhgB,GAAG,GAAG6Z,UAAU9W,OAAO,EAAE,MAAM,IAAIqjB,EAAE,2KAA2K,GAAG3lB,KAAK2f,MAAM,MAAM,IAAIgG,EAAE,wLAAwL,IAAIvgB,EAAE0H,EAAE9M,KAAKuf,EAAEhgB,EAAE,cAAc,IAAI6F,EAAE,MAAM,IAAIsgB,EAAE,+CAA+C9D,OAAOrC,EAAE,UAAUqC,OAAOriB,EAAE,yBAAyB,OAAOmqB,GAAG1pB,KAAKoF,GAAGpF,IAAI,EAAE6C,EAAEgjB,MAAM,WAAW7lB,KAAKimB,OAAOJ,QAAQ7lB,KAAKihB,OAAO4E,QAAQ7lB,KAAK6pB,yBAAyB7pB,KAAK0iB,KAAK,UAAU,EAAE7f,EAAEkpB,WAAW,WAAW,IAAI,IAAIxM,EAAEhgB,EAAES,KAAKihB,OAAOlf,UAAS,KAAMwd,EAAEhgB,EAAExC,QAAQ2C,MAAM6f,EAAElgB,MAAMwmB,QAAQ7lB,KAAKimB,OAAOJ,QAAQ7lB,KAAK6pB,yBAAyB7pB,KAAK0iB,KAAK,eAAe,EAAE7f,EAAEmpB,aAAa,SAASzM,GAAG,OAAOvf,KAAKisB,YAAY1M,EAAE,EAAE1c,EAAEqpB,cAAc,WAAW,OAAOlsB,KAAKisB,WAAW,EAAEppB,EAAEspB,aAAa,SAAS5M,GAAG,OAAOvf,KAAKisB,YAAYlF,eAAexH,EAAE,EAAE1c,EAAEupB,aAAa,SAAS7M,EAAEhgB,GAAG,OAAOS,KAAKisB,YAAY1M,GAAGhgB,EAAES,KAAK0iB,KAAK,oBAAoB,CAAClH,KAAK,MAAMqD,WAAW7e,KAAKisB,YAAY1N,KAAKgB,IAAIvf,IAAI,EAAE6C,EAAEwpB,gBAAgB,SAAS9M,EAAEhgB,GAAG,GAAG,mBAAmBA,EAAE,MAAM,IAAIimB,EAAE,wDAAwD,IAAIpgB,EAAEpF,KAAKisB,YAAY1M,GAAG,OAAOvf,KAAKisB,YAAY1M,GAAGhgB,EAAE6F,GAAGpF,KAAK0iB,KAAK,oBAAoB,CAAClH,KAAK,MAAMqD,WAAW7e,KAAKisB,YAAY1N,KAAKgB,IAAIvf,IAAI,EAAE6C,EAAEypB,gBAAgB,SAAS/M,GAAG,cAAcvf,KAAKisB,YAAY1M,GAAGvf,KAAK0iB,KAAK,oBAAoB,CAAClH,KAAK,SAASqD,WAAW7e,KAAKisB,YAAY1N,KAAKgB,IAAIvf,IAAI,EAAE6C,EAAE0pB,kBAAkB,SAAShN,GAAG,IAAIvC,EAAEuC,GAAG,MAAM,IAAIiG,EAAE,wEAAwE,OAAOxlB,KAAKisB,YAAY1M,EAAEvf,KAAK0iB,KAAK,oBAAoB,CAAClH,KAAK,UAAUqD,WAAW7e,KAAKisB,cAAcjsB,IAAI,EAAE6C,EAAE2pB,gBAAgB,SAASjN,GAAG,IAAIvC,EAAEuC,GAAG,MAAM,IAAIiG,EAAE,sEAAsE,OAAOrL,EAAEna,KAAKisB,YAAY1M,GAAGvf,KAAK0iB,KAAK,oBAAoB,CAAClH,KAAK,QAAQqD,WAAW7e,KAAKisB,YAAYlV,KAAKwI,IAAIvf,IAAI,EAAE6C,EAAE4pB,iBAAiB,SAASlN,GAAG,GAAG,mBAAmBA,EAAE,MAAM,IAAIiG,EAAE,+DAA+D,OAAOxlB,KAAKisB,YAAY1M,EAAEvf,KAAKisB,aAAajsB,KAAK0iB,KAAK,oBAAoB,CAAClH,KAAK,SAASqD,WAAW7e,KAAKisB,cAAcjsB,IAAI,EAAE6C,EAAE6X,yBAAyB,SAAS6E,EAAEhgB,GAAG,GAAG,mBAAmBggB,EAAE,MAAM,IAAIiG,EAAE,kEAAkE,GAAGjmB,IAAIyZ,EAAEzZ,GAAG,MAAM,IAAIimB,EAAE,0HAA0H,IAAI,IAAIpgB,EAAE7E,EAAEsC,EAAE7C,KAAKihB,OAAOlf,UAAS,KAAMqD,EAAEvC,EAAE9F,QAAQ2C,OAAOa,EAAE6E,EAAE/F,OAAOwf,WAAWU,EAAEhf,EAAEoF,IAAIpF,EAAEse,YAAY7e,KAAK0iB,KAAK,4BAA4B,CAACgK,MAAMntB,GAAG,MAAM,EAAEsD,EAAE8pB,yBAAyB,SAASpN,EAAEhgB,GAAG,GAAG,mBAAmBggB,EAAE,MAAM,IAAIiG,EAAE,kEAAkE,GAAGjmB,IAAIyZ,EAAEzZ,GAAG,MAAM,IAAIimB,EAAE,0HAA0H,IAAI,IAAIpgB,EAAE7E,EAAEsC,EAAEqd,EAAEhc,EAAElE,KAAKimB,OAAOlkB,UAAS,KAAMqD,EAAElB,EAAEnH,QAAQ2C,MAAMmD,GAAGtC,EAAE6E,EAAE/F,OAAO2a,OAAOkG,EAAE3f,EAAEwY,OAAOxY,EAAEse,WAAWU,EAAEhf,EAAEoF,IAAIpF,EAAEse,WAAWhc,EAAE8C,IAAIua,EAAEva,IAAI9C,EAAEgc,WAAWqB,EAAErB,WAAWte,EAAE4gB,YAAYnhB,KAAK0iB,KAAK,4BAA4B,CAACgK,MAAMntB,GAAG,MAAM,EAAEsD,EAAE+pB,sBAAsB,SAASrN,GAAG,GAAG,mBAAmBA,EAAE,MAAM,IAAIiG,EAAE,sDAAsDgD,IAAG,GAAG,GAAG,EAAGxoB,KAAKuf,EAAE,EAAE1c,EAAEgqB,iCAAiC,SAAStN,GAAG,GAAG,mBAAmBA,EAAE,MAAM,IAAIiG,EAAE,iEAAiEgD,IAAG,GAAG,GAAG,EAAGxoB,KAAKuf,EAAE,EAAE1c,EAAEiqB,gCAAgC,SAASvN,GAAG,GAAG,mBAAmBA,EAAE,MAAM,IAAIiG,EAAE,gEAAgEgD,IAAG,GAAG,GAAG,EAAGxoB,KAAKuf,EAAE,EAAE1c,EAAEkqB,2CAA2C,SAASxN,GAAG,GAAG,mBAAmBA,EAAE,MAAM,IAAIiG,EAAE,2EAA2EgD,IAAG,GAAG,GAAG,EAAGxoB,KAAKuf,EAAE,EAAE1c,EAAEyX,MAAM,WAAW,MAAM,mBAAmBjV,MAAM2nB,KAAK3nB,MAAM2nB,KAAKhtB,KAAKihB,OAAO/b,QAAQogB,EAAEtlB,KAAKihB,OAAO/b,OAAOlF,KAAKihB,OAAO9X,KAAK,EAAEtG,EAAE8W,YAAY,SAAS4F,GAAG,GAAG,mBAAmBA,EAAE,MAAM,IAAIiG,EAAE,4CAA4C,IAAI,IAAIjmB,EAAE6F,EAAE7E,EAAEP,KAAKihB,OAAOlf,UAAS,KAAMxC,EAAEgB,EAAExD,QAAQ2C,MAAM6f,GAAGna,EAAE7F,EAAEF,OAAOsG,IAAIP,EAAEyZ,WAAW,EAAEhc,EAAEoqB,SAAS,SAAS1N,GAAG,GAAG,mBAAmBA,EAAE,MAAM,IAAIiG,EAAE,yCAAyC,IAAI,IAAIjmB,EAAE6F,EAAE7E,EAAEP,KAAKihB,OAAOlf,UAAS,KAAMxC,EAAEgB,EAAExD,QAAQ2C,MAAM,GAAG6f,GAAGna,EAAE7F,EAAEF,OAAOsG,IAAIP,EAAEyZ,YAAY,OAAOzZ,EAAEO,GAAG,EAAE9C,EAAEqqB,SAAS,SAAS3N,GAAG,GAAG,mBAAmBA,EAAE,MAAM,IAAIiG,EAAE,wCAAwC,IAAI,IAAIjmB,EAAE6F,EAAE7E,EAAEP,KAAKihB,OAAOlf,SAASc,EAAE,IAAIwC,MAAMrF,KAAKqV,OAAO6K,EAAE,GAAE,KAAM3gB,EAAEgB,EAAExD,QAAQ2C,MAAM0F,EAAE7F,EAAEF,MAAMwD,EAAEqd,KAAKX,EAAEna,EAAEO,IAAIP,EAAEyZ,YAAY,OAAOhc,CAAC,EAAEA,EAAEsqB,SAAS,SAAS5N,GAAG,GAAG,mBAAmBA,EAAE,MAAM,IAAIiG,EAAE,yCAAyC,IAAI,IAAIjmB,EAAE6F,EAAE7E,EAAEP,KAAKihB,OAAOlf,UAAS,KAAMxC,EAAEgB,EAAExD,QAAQ2C,MAAM,GAAG6f,GAAGna,EAAE7F,EAAEF,OAAOsG,IAAIP,EAAEyZ,YAAY,OAAM,EAAG,OAAM,CAAE,EAAEhc,EAAEuqB,UAAU,SAAS7N,GAAG,GAAG,mBAAmBA,EAAE,MAAM,IAAIiG,EAAE,0CAA0C,IAAI,IAAIjmB,EAAE6F,EAAE7E,EAAEP,KAAKihB,OAAOlf,UAAS,KAAMxC,EAAEgB,EAAExD,QAAQ2C,MAAM,IAAI6f,GAAGna,EAAE7F,EAAEF,OAAOsG,IAAIP,EAAEyZ,YAAY,OAAM,EAAG,OAAM,CAAE,EAAEhc,EAAEwqB,YAAY,SAAS9N,GAAG,GAAG,mBAAmBA,EAAE,MAAM,IAAIiG,EAAE,4CAA4C,IAAI,IAAIjmB,EAAE6F,EAAE7E,EAAEP,KAAKihB,OAAOlf,SAASc,EAAE,IAAG,KAAMtD,EAAEgB,EAAExD,QAAQ2C,MAAM6f,GAAGna,EAAE7F,EAAEF,OAAOsG,IAAIP,EAAEyZ,aAAahc,EAAE0K,KAAKnI,EAAEO,KAAK,OAAO9C,CAAC,EAAEA,EAAEyqB,YAAY,SAAS/N,EAAEhgB,GAAG,GAAG,mBAAmBggB,EAAE,MAAM,IAAIiG,EAAE,4CAA4C,GAAGpM,UAAU9W,OAAO,EAAE,MAAM,IAAIkjB,EAAE,qNAAqN,IAAI,IAAIpgB,EAAE7E,EAAEsC,EAAEtD,EAAE2gB,EAAElgB,KAAKihB,OAAOlf,UAAS,KAAMqD,EAAE8a,EAAEnjB,QAAQ2C,MAAMmD,EAAE0c,EAAE1c,GAAGtC,EAAE6E,EAAE/F,OAAOsG,IAAIpF,EAAEse,YAAY,OAAOhc,CAAC,EAAEA,EAAE0qB,YAAY,WAAW,IAAIhO,EAAEvf,KAAKihB,OAAOlf,SAAS,OAAO,IAAI6iB,GAAE,WAAY,IAAIrlB,EAAEggB,EAAExiB,OAAO,GAAGwC,EAAEG,KAAK,OAAOH,EAAE,IAAI6F,EAAE7F,EAAEF,MAAM,MAAM,CAACA,MAAM,CAACmQ,KAAKpK,EAAEO,IAAIkZ,WAAWzZ,EAAEyZ,YAAYnf,MAAK,EAAI,GAAE,EAAEmD,EAAE2qB,OAAO,WAAW,IAAIjO,EAAEvf,KAAKT,EAAE,IAAI8F,MAAMrF,KAAKihB,OAAO9X,MAAM/D,EAAE,EAAEpF,KAAKihB,OAAOzc,SAAQ,SAAU+a,EAAEhf,GAAGhB,EAAE6F,KAAK,SAASma,EAAEhgB,GAAG,IAAI6F,EAAE,CAACO,IAAI4Z,GAAG,OAAO6B,EAAE7hB,EAAEsf,cAAczZ,EAAEyZ,WAAW1E,EAAE,CAAC,EAAE5a,EAAEsf,aAAazZ,CAAC,CAAvF,CAAyF7E,EAAEgf,EAAG,IAAG,IAAIhf,EAAE,IAAI8E,MAAMrF,KAAKimB,OAAO9c,MAAM,OAAO/D,EAAE,EAAEpF,KAAKimB,OAAOzhB,SAAQ,SAAUjF,EAAEsD,GAAGtC,EAAE6E,KAAK,SAASma,EAAEhgB,EAAE6F,GAAG,IAAI7E,EAAE,CAACoF,IAAIpG,EAAEya,OAAO5U,EAAE4U,OAAOrU,IAAIoT,OAAO3T,EAAE2T,OAAOpT,KAAK,OAAOyb,EAAEhc,EAAEyZ,cAActe,EAAEse,WAAW1E,EAAE,CAAC,EAAE/U,EAAEyZ,aAAa,UAAUU,GAAGna,EAAE+b,aAAa5gB,EAAE4gB,YAAW,GAAI5gB,CAAC,CAA9K,CAAgLgf,EAAE/D,KAAK3Y,EAAEtD,EAAG,IAAG,CAACoC,QAAQ,CAAC6Z,KAAKxb,KAAKwb,KAAKmE,MAAM3f,KAAK2f,MAAMqJ,eAAehpB,KAAKgpB,gBAAgBnK,WAAW7e,KAAKksB,gBAAgB5R,MAAM/a,EAAEgb,MAAMha,EAAE,EAAEsC,EAAE4qB,OAAO,SAASlO,GAAG,IAAIhgB,EAAE6F,EAAEvC,EAAEqd,EAAEhc,EAAEX,EAAEvD,KAAKma,EAAEf,UAAU9W,OAAO,QAAG,IAAS8W,UAAU,IAAIA,UAAU,GAAG,GAAGmG,aAAahf,EAAE,OAAOgf,EAAE5F,aAAY,SAAU4F,EAAEhgB,GAAG4a,EAAE5W,EAAEmoB,UAAUnM,EAAEhgB,GAAGgE,EAAEoL,QAAQ4Q,EAAEhgB,EAAG,IAAGggB,EAAEzF,aAAY,SAAUyF,EAAEhgB,EAAE6F,EAAE7E,EAAEsC,EAAEqd,EAAEhc,GAAGiW,EAAEjW,EAAEX,EAAEmqB,2BAA2BnO,EAAEna,EAAE7E,EAAEhB,GAAGgE,EAAEoqB,yBAAyBpO,EAAEna,EAAE7E,EAAEhB,GAAG2E,EAAEX,EAAEkc,yBAAyBF,EAAEna,EAAE7E,EAAEhB,GAAGgE,EAAEqqB,uBAAuBrO,EAAEna,EAAE7E,EAAEhB,EAAG,IAAGS,KAAK,IAAIgd,EAAEuC,GAAG,MAAM,IAAIiG,EAAE,qGAAqG,GAAGjG,EAAEV,WAAW,CAAC,IAAI7B,EAAEuC,EAAEV,YAAY,MAAM,IAAI2G,EAAE,+DAA+DrL,EAAEna,KAAKwsB,gBAAgBjN,EAAEV,YAAY7e,KAAKusB,kBAAkBhN,EAAEV,WAAW,CAAC,GAAGU,EAAEjF,MAAM,CAAC,GAAGzX,EAAE0c,EAAEjF,OAAOjV,MAAMmc,QAAQ3e,GAAG,MAAM,IAAI2iB,EAAE,oDAAoD,IAAIjmB,EAAE,EAAE6F,EAAEvC,EAAEP,OAAO/C,EAAE6F,EAAE7F,IAAI,CAACkpB,GAAGvI,EAAErd,EAAEtD,IAAI,IAAIuN,EAAEoT,EAAEkB,EAAEtU,EAAEnH,IAAI0b,EAAEvU,EAAE+R,WAAW1E,EAAEna,KAAK0rB,UAAUtK,EAAEC,GAAGrhB,KAAK2O,QAAQyS,EAAEC,EAAE,CAAC,CAAC,GAAG9B,EAAEhF,MAAM,CAAC,IAAIgH,GAAE,EAAG,GAAG,eAAevhB,KAAKwb,OAAO+F,GAAE,GAAI1e,EAAE0c,EAAEhF,OAAOlV,MAAMmc,QAAQ3e,GAAG,MAAM,IAAI2iB,EAAE,oDAAoD,IAAIjmB,EAAE,EAAE6F,EAAEvC,EAAEP,OAAO/C,EAAE6F,EAAE7F,IAAI,CAACmpB,GAAGxkB,EAAErB,EAAEtD,IAAI,IAAIyZ,EAAE9U,EAAE6Y,EAAE/D,EAAEgB,OAAOlL,EAAEkK,EAAED,OAAO+D,EAAE9D,EAAE6F,WAAW7G,EAAEgB,EAAEmI,WAAWhd,OAAE,IAAS6T,EAAEuJ,EAAEvJ,EAAE,QAAQ9T,GAAGiW,EAAEhW,EAAEnE,KAAK0tB,2BAA2B1tB,KAAK2tB,yBAAyBxpB,EAAEnE,KAAKyf,yBAAyBzf,KAAK4tB,wBAAwBzU,KAAKnZ,KAAKkE,EAAEyB,IAAIoX,EAAEjO,EAAEgO,IAAI3C,EAAEhW,EAAEnE,KAAK6tB,oBAAoB7tB,KAAK8tB,kBAAkB3pB,EAAEnE,KAAK+tB,kBAAkB/tB,KAAKguB,iBAAiB7U,KAAKnZ,KAAK+c,EAAEjO,EAAEgO,EAAE,CAAC,CAAC,OAAO9c,IAAI,EAAE6C,EAAEorB,SAAS,SAAS1O,GAAG,IAAIhgB,EAAE,IAAIgB,EAAE4Z,EAAE,CAAC,EAAEna,KAAK6T,SAAS0L,IAAI,OAAOhgB,EAAEgtB,kBAAkBpS,EAAE,CAAC,EAAEna,KAAKksB,kBAAkB3sB,CAAC,EAAEsD,EAAEqrB,UAAU,SAAS3O,GAAG,IAAIhgB,EAAES,KAAKiuB,SAAS1O,GAAG,OAAOvf,KAAKihB,OAAOzc,SAAQ,SAAU+a,EAAEna,GAAG,IAAI7E,EAAE4Z,EAAE,CAAC,EAAEoF,EAAEV,YAAYU,EAAE,IAAIhgB,EAAE2pB,cAAc9jB,EAAE7E,GAAGhB,EAAE0hB,OAAOvc,IAAIU,EAAEma,EAAG,IAAGhgB,CAAC,EAAEsD,EAAEsrB,KAAK,SAAS5O,GAAG,GAAG,iBAAiBA,EAAEA,GAAG,CAAC,GAAG/D,MAAM+D,EAAE/D,OAAOxb,KAAKwb,MAAM,UAAU+D,EAAE/D,KAAK,MAAM,IAAImK,EAAE,wDAAwD/D,OAAO5hB,KAAKwb,KAAK,eAAeoG,OAAOrC,EAAE/D,KAAK,0EAA0E,GAAG,kBAAkB+D,EAAEI,OAAOJ,EAAEI,QAAQ3f,KAAK2f,QAAO,IAAKJ,EAAEI,MAAM,MAAM,IAAIgG,EAAE,mKAAmK,GAAG,kBAAkBpG,EAAEyJ,gBAAgBzJ,EAAEyJ,iBAAiBhpB,KAAKgpB,iBAAgB,IAAKzJ,EAAEyJ,eAAe,MAAM,IAAIrD,EAAE,4KAA4K,IAAI,IAAIpmB,EAAE6F,EAAE7E,EAAEP,KAAKkuB,UAAU3O,GAAG1c,EAAE7C,KAAKimB,OAAOlkB,UAAS,KAAMxC,EAAEsD,EAAE9F,QAAQ2C,MAAMypB,GAAG5oB,EAAE,QAAO,GAAI6E,EAAE7F,EAAEF,OAAO8hB,WAAW/b,EAAEO,IAAIP,EAAE4U,OAAOrU,IAAIP,EAAE2T,OAAOpT,IAAIwU,EAAE,CAAC,EAAE/U,EAAEyZ,aAAa,OAAOte,CAAC,EAAEsC,EAAEurB,OAAO,WAAW,OAAOpuB,KAAKwtB,QAAQ,EAAE3qB,EAAEuQ,SAAS,WAAW,MAAM,gBAAgB,EAAEvQ,EAAEwrB,QAAQ,WAAW,IAAI9uB,EAAES,KAAKoF,EAAE,CAAC,EAAEpF,KAAKihB,OAAOzc,SAAQ,SAAU+a,EAAEhgB,GAAG6F,EAAE7F,GAAGggB,EAAEV,UAAW,IAAG,IAAIte,EAAE,CAAC,EAAEsC,EAAE,CAAC,EAAE7C,KAAKimB,OAAOzhB,SAAQ,SAAU+a,EAAEna,GAAG,IAAI8a,EAAEhc,EAAEqb,EAAE4B,WAAW,KAAK,KAAK5d,EAAE,GAAG4W,EAAEoF,EAAEvF,OAAOrU,IAAImH,EAAEyS,EAAExG,OAAOpT,IAAI4Z,EAAE4B,YAAYhH,EAAErN,IAAIoT,EAAE/F,EAAEA,EAAErN,EAAEA,EAAEoT,GAAG,IAAIlD,EAAE,IAAI4E,OAAOzH,EAAE,KAAKyH,OAAO1d,EAAE,KAAK0d,OAAO9U,EAAE,KAAK1H,EAAEkpB,WAAW,SAAS/uB,EAAEogB,aAAQ,IAAS9c,EAAEma,GAAGna,EAAEma,GAAG,EAAEna,EAAEma,KAAKzZ,GAAG,GAAGqe,OAAO/e,EAAEma,GAAG,OAAOzZ,GAAG,IAAIqe,OAAOxc,EAAE,OAAO7E,EAAEgD,GAAGyZ,GAAGuC,EAAEV,UAAW,IAAG,IAAIqB,EAAE,CAAC,EAAE,IAAI,IAAIhc,KAAKlE,KAAKA,KAAK+mB,eAAe7iB,KAAK4kB,GAAG/kB,IAAIG,IAAI,mBAAmBlE,KAAKkE,IAAI,WAAWqb,EAAErb,KAAKgc,EAAEhc,GAAGlE,KAAKkE,IAAI,OAAOgc,EAAErB,WAAW7e,KAAKisB,YAAY/L,EAAE5F,MAAMlV,EAAE8a,EAAE3F,MAAMha,EAAE8gB,EAAEnB,EAAE,cAAclgB,KAAK2T,aAAauM,CAAC,EAAE3f,CAAC,CAA7pwB,CAA+pwBuO,EAAEqJ,QAAQgK,cAAc,oBAAoBvC,SAASgK,GAAGzW,UAAUyM,OAAO2O,IAAI,+BAA+B3E,GAAGzW,UAAUkb,SAAS,CAAC,CAAC9P,KAAK,SAASgB,GAAG,MAAM,GAAGqC,OAAOrC,EAAE,OAAO,EAAEiP,aAAY,GAAI,CAACjQ,KAAK,SAASgB,GAAG,MAAM,GAAGqC,OAAOrC,EAAE,eAAe,EAAEiP,aAAY,EAAGhT,KAAK,YAAY,CAAC+C,KAAK,SAASgB,GAAG,MAAM,GAAGqC,OAAOrC,EAAE,iBAAiB,EAAEiP,aAAY,EAAGhT,KAAK,cAAc,CAAC+C,KAAK,SAASgB,GAAG,MAAM,GAAGqC,OAAOrC,EAAE,cAAc,GAAG,CAAChB,KAAK,SAASgB,GAAG,MAAM,GAAGqC,OAAOrC,EAAE,sBAAsB,EAAE/D,KAAK,YAAY,CAAC+C,KAAK,SAASgB,GAAG,MAAM,GAAGqC,OAAOrC,EAAE,wBAAwB,EAAE/D,KAAK,eAAehX,SAAQ,SAAU+a,GAAG,CAAC,MAAM,QAAQ,UAAU/a,SAAQ,SAAUjF,GAAG,IAAI6F,EAAEma,EAAEhB,KAAKhf,GAAGgB,EAAE,QAAQhB,EAAE4pB,GAAGM,GAAGlK,EAAEiP,YAAY5E,GAAGzW,UAAU/N,GAAG,SAASvC,EAAEqd,EAAEhc,GAAG,OAAO3D,EAAEP,KAAKoF,GAAE,EAAG,gBAAgBma,EAAE/D,MAAMxb,KAAKwb,MAAM,KAAK3Y,EAAEqd,EAAEhc,EAAE,WAAW3E,EAAE,EAAEqqB,GAAGzW,UAAU/N,GAAG,SAASvC,EAAEqd,EAAEhc,EAAEX,GAAG,OAAOhD,EAAEP,KAAKoF,GAAE,EAAG,gBAAgBma,EAAE/D,MAAMxb,KAAKwb,MAAM3Y,EAAEqd,EAAEhc,EAAEX,EAAE,WAAWhE,EAAE,CAAE,GAAG,IAAG,SAASggB,GAAGsH,EAAEriB,SAAQ,SAAUjF,GAAG,IAAI6F,EAAE7F,EAAEgf,KAAKhe,EAAEhB,EAAEunB,SAASvmB,EAAEgf,EAAEna,EAAE,QAAQ,GAAG7E,EAAEgf,EAAEna,EAAE,UAAU,GAAG7E,EAAEgf,EAAEna,EAAE,UAAU,GAAG7E,EAAEgf,EAAEna,EAAE,YAAY,EAAG,GAAE,CAA3I,CAA6IwkB,IAAI,SAASrK,GAAGyH,EAAExiB,SAAQ,SAAUjF,GAAG,IAAI6F,EAAE7F,EAAEgf,KAAKhe,EAAEhB,EAAEunB,SAASvmB,EAAEgf,EAAEna,EAAE,QAAQ,SAAS7E,EAAEgf,EAAEna,EAAE,gBAAgB,YAAY7E,EAAEgf,EAAEna,EAAE,kBAAkB,aAAc,GAAE,CAA9J,CAAgKwkB,IAAI,SAASrK,GAAG6H,GAAG5iB,SAAQ,SAAUjF,IAAI,SAASggB,EAAEhgB,GAAG,IAAI6F,EAAE7F,EAAEgf,KAAKhe,EAAEhB,EAAEic,KAAK3Y,EAAEtD,EAAE8nB,UAAU9H,EAAEpM,UAAU/N,GAAG,SAASma,EAAEhgB,GAAG,GAAG,UAAUgB,GAAG,UAAUP,KAAKwb,MAAMjb,IAAIP,KAAKwb,KAAK,MAAM,GAAG,IAAIpC,UAAU9W,OAAO,OAA9lpC,SAAYid,EAAEhgB,GAAG,GAAG,IAAIggB,EAAEpW,KAAK,MAAM,GAAG,GAAG,UAAU5J,GAAGA,IAAIggB,EAAE/D,KAAK,MAAM,mBAAmBnW,MAAM2nB,KAAK3nB,MAAM2nB,KAAKzN,EAAE0G,OAAO/gB,QAAQogB,EAAE/F,EAAE0G,OAAO/gB,OAAOqa,EAAE0G,OAAO9c,MAAM,IAAI,IAAI/D,EAAE7E,EAAEsC,EAAE,eAAetD,EAAEggB,EAAEkP,eAAelP,EAAEmP,aAAaxO,EAAE,IAAI7a,MAAMxC,GAAGqB,EAAE,eAAe3E,EAAEgE,EAAEgc,EAAE0G,OAAOlkB,SAASoY,EAAE,GAAE,KAAM/U,EAAE7B,EAAExG,QAAQ2C,OAAOa,EAAE6E,EAAE/F,OAAO8hB,aAAajd,IAAIgc,EAAE/F,KAAK5Z,EAAEoF,KAAK,OAAOua,CAAC,CAA6voCyO,CAAG3uB,KAAKO,GAAG,GAAG,IAAI6Y,UAAU9W,OAAO,CAACid,EAAE,GAAGA,EAAE,IAAIW,EAAElgB,KAAKihB,OAAOrC,IAAIW,GAAG,QAAG,IAASW,EAAE,MAAM,IAAIwF,EAAE,SAAS9D,OAAOxc,EAAE,0BAA0Bwc,OAAOrC,EAAE,yBAAyB,OAA5+mC,SAAYA,EAAEhgB,EAAE6F,EAAE7E,GAAG,IAAIsC,EAAE,GAAG,OAAOklB,IAAG,EAAGxI,EAAEhgB,EAAE6F,EAAE7E,GAAE,SAAUgf,GAAG1c,EAAE0K,KAAKgS,EAAG,IAAG1c,CAAC,CAAq6mC+rB,CAAG5uB,KAAK2f,MAAM,UAAUpf,EAAEP,KAAKwb,KAAKjb,EAAEsC,EAAEqd,EAAE,CAAC,GAAG,IAAI9G,UAAU9W,OAAO,CAACid,EAAE,GAAGA,EAAEhgB,EAAE,GAAGA,EAAE,IAAI2E,EAAElE,KAAKihB,OAAOrC,IAAIW,GAAG,IAAIrb,EAAE,MAAM,IAAIwhB,EAAE,SAAS9D,OAAOxc,EAAE,2BAA2Bwc,OAAOrC,EAAE,gCAAgC,IAAIvf,KAAKihB,OAAOld,IAAIxE,GAAG,MAAM,IAAImmB,EAAE,SAAS9D,OAAOxc,EAAE,2BAA2Bwc,OAAOriB,EAAE,gCAAgC,OAAxumC,SAAYggB,EAAEhgB,EAAE6F,EAAE7E,EAAEsC,GAAG,IAAIqd,EAAE,GAAG,OAAO8H,IAAG,EAAGzI,EAAEhgB,EAAE6F,EAAE7E,EAAEsC,GAAE,SAAU0c,GAAGW,EAAE3S,KAAKgS,EAAG,IAAGW,CAAC,CAA6pmC2O,CAAGtuB,EAAEP,KAAK2f,MAAM9c,EAAEqB,EAAE3E,EAAE,CAAC,MAAM,IAAIimB,EAAE,SAAS5D,OAAOxc,EAAE,sDAAsDwc,OAAOxI,UAAU9W,OAAO,MAAM,CAAC,CAAvzB,CAAyzBid,EAAEhgB,GAAG,SAASggB,EAAEhgB,GAAG,IAAI6F,EAAE7F,EAAEgf,KAAKhe,EAAEhB,EAAEic,KAAK3Y,EAAEtD,EAAE8nB,UAAUnH,EAAE,UAAU9a,EAAE,GAAG0pB,cAAc1pB,EAAE8T,MAAM,GAAG,GAAGqG,EAAEpM,UAAU+M,GAAG,SAASX,EAAEhgB,EAAE6F,GAAG,GAAG,UAAU7E,GAAG,UAAUP,KAAKwb,MAAMjb,IAAIP,KAAKwb,KAAK,CAAC,GAAG,IAAIpC,UAAU9W,OAAO,OAAOwlB,IAAG,EAAG9nB,KAAKO,EAAE6E,EAAEma,GAAG,GAAG,IAAInG,UAAU9W,OAAO,CAACid,EAAE,GAAGA,EAAEna,EAAE7F,EAAE,IAAI2E,EAAElE,KAAKihB,OAAOrC,IAAIW,GAAG,QAAG,IAASrb,EAAE,MAAM,IAAIwhB,EAAE,SAAS9D,OAAO1B,EAAE,0BAA0B0B,OAAOrC,EAAE,yBAAyB,OAAOwI,IAAG,EAAG/nB,KAAK2f,MAAM,UAAUpf,EAAEP,KAAKwb,KAAKjb,EAAEsC,EAAEqB,EAAEkB,EAAE,CAAC,GAAG,IAAIgU,UAAU9W,OAAO,CAACid,EAAE,GAAGA,EAAEhgB,EAAE,GAAGA,EAAE,IAAIgE,EAAEvD,KAAKihB,OAAOrC,IAAIW,GAAG,IAAIhc,EAAE,MAAM,IAAImiB,EAAE,SAAS9D,OAAO1B,EAAE,2BAA2B0B,OAAOrC,EAAE,gCAAgC,IAAIvf,KAAKihB,OAAOld,IAAIxE,GAAG,MAAM,IAAImmB,EAAE,SAAS9D,OAAO1B,EAAE,2BAA2B0B,OAAOriB,EAAE,gCAAgC,OAAOyoB,IAAG,EAAGznB,EAAEP,KAAK2f,MAAM9c,EAAEU,EAAEhE,EAAE6F,EAAE,CAAC,MAAM,IAAIogB,EAAE,SAAS5D,OAAO1B,EAAE,sDAAsD0B,OAAOxI,UAAU9W,OAAO,MAAM,CAAC,EAAE,IAAI4B,EAAE,MAAMkB,EAAE,GAAG0pB,cAAc1pB,EAAE8T,MAAM,GAAGqG,EAAEpM,UAAUjP,GAAG,WAAW,IAAIqb,EAAEhgB,EAAE8F,MAAM8N,UAAU+F,MAAMC,KAAKC,WAAWhU,EAAE7F,EAAE0Y,MAAM,GAAG,IAAI1Y,EAAE+C,OAAO,CAAC,IAAIO,EAAE,EAAE,aAAatC,IAAIsC,GAAG7C,KAAKyuB,gBAAgB,eAAeluB,IAAIsC,GAAG7C,KAAK0uB,cAAcnP,EAAE,IAAIla,MAAMxC,GAAG,IAAIqB,EAAE,EAAE3E,EAAEgO,MAAK,SAAUhO,EAAEgB,EAAEsC,EAAEqd,EAAE3c,EAAE4W,EAAErN,GAAGyS,EAAErb,KAAKkB,EAAE7F,EAAEgB,EAAEsC,EAAEqd,EAAE3c,EAAE4W,EAAErN,EAAG,GAAE,MAAMyS,EAAE,GAAGhgB,EAAEgO,MAAK,SAAUhO,EAAEgB,EAAEsC,EAAEqd,EAAEhc,EAAEX,EAAE4W,GAAGoF,EAAEhS,KAAKnI,EAAE7F,EAAEgB,EAAEsC,EAAEqd,EAAEhc,EAAEX,EAAE4W,GAAI,IAAG,OAAOna,KAAKkgB,GAAGtgB,MAAMI,KAAKT,GAAGggB,CAAC,EAAE,IAAIhc,EAAE,SAAS6B,EAAE,GAAG0pB,cAAc1pB,EAAE8T,MAAM,GAAGqG,EAAEpM,UAAU5P,GAAG,WAAW,IAAIgc,EAAEla,MAAM8N,UAAU+F,MAAMC,KAAKC,WAAW7Z,EAAEggB,EAAEtH,MAAM7S,EAAE,GAAG,OAAOma,EAAEhS,MAAK,SAAUgS,EAAEhf,EAAEsC,EAAEqd,EAAEhc,EAAEX,EAAE4W,GAAG5a,EAAEggB,EAAEhf,EAAEsC,EAAEqd,EAAEhc,EAAEX,EAAE4W,IAAI/U,EAAEmI,KAAKgS,EAAG,IAAGvf,KAAKkgB,GAAGtgB,MAAMI,KAAKuf,GAAGna,CAAC,EAAE,IAAI+U,EAAE,SAAS/U,EAAE,GAAG0pB,cAAc1pB,EAAE8T,MAAM,GAAGqG,EAAEpM,UAAUgH,GAAG,WAAW,IAAIoF,EAAEhgB,EAAE6F,EAAEC,MAAM8N,UAAU+F,MAAMC,KAAKC,WAAW,GAAGhU,EAAE9C,OAAO,GAAG8C,EAAE9C,OAAO,EAAE,MAAM,IAAIkjB,EAAE,SAAS5D,OAAOzH,EAAE,+DAA+DyH,OAAOxc,EAAE9C,OAAO,OAAO,GAAG,mBAAmB8C,EAAEA,EAAE9C,OAAO,IAAI,mBAAmB8C,EAAEA,EAAE9C,OAAO,GAAG,MAAM,IAAIkjB,EAAE,SAAS5D,OAAOzH,EAAE,qMAAqM,IAAI/U,EAAE9C,QAAQid,EAAEna,EAAE,GAAG7F,EAAE6F,EAAE,GAAGA,EAAE,IAAI,IAAIA,EAAE9C,QAAQid,EAAEna,EAAE,GAAG7F,EAAE6F,EAAE,GAAGA,EAAE,CAACA,EAAE,KAAK,IAAIA,EAAE9C,SAASid,EAAEna,EAAE,GAAG7F,EAAE6F,EAAE,GAAGA,EAAE,CAACA,EAAE,GAAGA,EAAE,KAAK,IAAI7E,EAAEhB,EAAE,OAAO6F,EAAEmI,MAAK,SAAUhO,EAAE6F,EAAEvC,EAAEqd,EAAEhc,EAAEX,EAAE4W,GAAG5Z,EAAEgf,EAAEhf,EAAEhB,EAAE6F,EAAEvC,EAAEqd,EAAEhc,EAAEX,EAAE4W,EAAG,IAAGna,KAAKkgB,GAAGtgB,MAAMI,KAAKoF,GAAG7E,CAAC,CAAC,CAAzvE,CAA2vEgf,EAAEhgB,GAAG,SAASggB,EAAEhgB,GAAG,IAAI6F,EAAE7F,EAAEgf,KAAKhe,EAAEhB,EAAEic,KAAK3Y,EAAEtD,EAAE8nB,UAAUnH,EAAE,OAAO9a,EAAE,GAAG0pB,cAAc1pB,EAAE8T,MAAM,GAAG,GAAGqG,EAAEpM,UAAU+M,GAAG,SAASX,EAAEhgB,EAAE6F,GAAG,GAAG,UAAU7E,GAAG,UAAUP,KAAKwb,MAAMjb,IAAIP,KAAKwb,KAAK,OAAM,EAAG,GAAG,IAAIpC,UAAU9W,OAAO,OAAOwlB,IAAG,EAAG9nB,KAAKO,EAAE6E,EAAEma,GAAG,GAAG,IAAInG,UAAU9W,OAAO,CAACid,EAAE,GAAGA,EAAEna,EAAE7F,EAAE,IAAI2E,EAAElE,KAAKihB,OAAOrC,IAAIW,GAAG,QAAG,IAASrb,EAAE,MAAM,IAAIwhB,EAAE,SAAS9D,OAAO1B,EAAE,0BAA0B0B,OAAOrC,EAAE,yBAAyB,OAAOwI,IAAG,EAAG/nB,KAAK2f,MAAM,UAAUpf,EAAEP,KAAKwb,KAAKjb,EAAEsC,EAAEqB,EAAEkB,EAAE,CAAC,GAAG,IAAIgU,UAAU9W,OAAO,CAACid,EAAE,GAAGA,EAAEhgB,EAAE,GAAGA,EAAE,IAAIgE,EAAEvD,KAAKihB,OAAOrC,IAAIW,GAAG,IAAIhc,EAAE,MAAM,IAAImiB,EAAE,SAAS9D,OAAO1B,EAAE,2BAA2B0B,OAAOrC,EAAE,gCAAgC,IAAIvf,KAAKihB,OAAOld,IAAIxE,GAAG,MAAM,IAAImmB,EAAE,SAAS9D,OAAO1B,EAAE,2BAA2B0B,OAAOriB,EAAE,gCAAgC,OAAOyoB,IAAG,EAAGznB,EAAEP,KAAK2f,MAAM9c,EAAEU,EAAEhE,EAAE6F,EAAE,CAAC,MAAM,IAAIogB,EAAE,SAAS5D,OAAO1B,EAAE,sDAAsD0B,OAAOxI,UAAU9W,OAAO,MAAM,EAAE,IAAI4B,EAAE,OAAOkB,EAAE,GAAG0pB,cAAc1pB,EAAE8T,MAAM,GAAG,GAAGqG,EAAEpM,UAAUjP,GAAG,WAAW,IAAIqb,EAAEla,MAAM8N,UAAU+F,MAAMC,KAAKC,WAAW7Z,EAAEggB,EAAEtH,MAAM,OAAOsH,EAAEhS,MAAK,SAAUgS,EAAEna,EAAE7E,EAAEsC,EAAEqd,EAAEhc,EAAEX,GAAG,OAAOhE,EAAEggB,EAAEna,EAAE7E,EAAEsC,EAAEqd,EAAEhc,EAAEX,EAAG,MAAKvD,KAAKkgB,GAAGtgB,MAAMI,KAAKuf,EAAE,EAAE,IAAIhc,EAAE,QAAQ6B,EAAE,GAAG0pB,cAAc1pB,EAAE8T,MAAM,GAAG,GAAGqG,EAAEpM,UAAU5P,GAAG,WAAW,IAAIgc,EAAEla,MAAM8N,UAAU+F,MAAMC,KAAKC,WAAW7Z,EAAEggB,EAAEtH,MAAM,OAAOsH,EAAEhS,MAAK,SAAUgS,EAAEna,EAAE7E,EAAEsC,EAAEqd,EAAEhc,EAAEX,GAAG,OAAOhE,EAAEggB,EAAEna,EAAE7E,EAAEsC,EAAEqd,EAAEhc,EAAEX,EAAG,KAAIvD,KAAKkgB,GAAGtgB,MAAMI,KAAKuf,EAAE,CAAC,CAA7yC,CAA+yCA,EAAEhgB,GAAG,SAASggB,EAAEhgB,GAAG,IAAI6F,EAAE7F,EAAEgf,KAAKhe,EAAEhB,EAAEic,KAAK3Y,EAAEtD,EAAE8nB,UAAUnH,EAAE9a,EAAE8T,MAAM,GAAG,GAAG,UAAUqG,EAAEpM,UAAU+M,GAAG,SAASX,EAAEhgB,GAAG,GAAG,UAAUgB,GAAG,UAAUP,KAAKwb,MAAMjb,IAAIP,KAAKwb,KAAK,OAAOoJ,EAAEF,QAAQ,IAAItL,UAAU9W,OAAO,OAAt1wC,SAAYid,EAAEhgB,GAAG,GAAG,IAAIggB,EAAEpW,KAAK,OAAOyb,EAAEF,QAAQ,IAAItf,EAAE,UAAU7F,GAAGA,IAAIggB,EAAE/D,KAAKjb,EAAE,eAAehB,EAAEsD,EAAE0c,EAAE0G,OAAOlkB,SAAS,OAAO,IAAI6iB,GAAE,WAAY,IAAI,IAAIrF,EAAEhgB,IAAI,CAAC,IAAIggB,EAAE1c,EAAE9F,QAAQ2C,KAAK,OAAO6f,EAAE,GAAGhgB,EAAEggB,EAAElgB,OAAO+F,GAAG7F,EAAE4hB,aAAa5gB,EAAE,KAAK,CAAC,MAAM,CAAClB,MAAM,CAAC0a,KAAKxa,EAAEoG,IAAIkZ,WAAWtf,EAAEsf,WAAW7E,OAAOza,EAAEya,OAAOrU,IAAIoT,OAAOxZ,EAAEwZ,OAAOpT,IAAI8hB,iBAAiBloB,EAAEya,OAAO6E,WAAW6I,iBAAiBnoB,EAAEwZ,OAAO8F,WAAWsC,WAAW5hB,EAAE4hB,YAAYzhB,MAAK,EAAI,GAAE,CAAm7vCqvB,CAAG/uB,KAAKO,GAAG,GAAG,IAAI6Y,UAAU9W,OAAO,CAACid,EAAE,GAAGA,EAAE,IAAIna,EAAEpF,KAAKihB,OAAOrC,IAAIW,GAAG,IAAIna,EAAE,MAAM,IAAIsgB,EAAE,SAAS9D,OAAO1B,EAAE,0BAA0B0B,OAAOrC,EAAE,yBAAyB,OAAzyvC,SAAYA,EAAEhgB,EAAE6F,GAAG,IAAI7E,EAAEqkB,EAAEF,QAAQ,MAAM,eAAenF,IAAI,QAAQhgB,QAAG,IAAS6F,EAAEmhB,KAAKhmB,EAAE4mB,EAAG5mB,EAAEinB,GAAGpiB,EAAEmhB,MAAM,OAAOhnB,QAAG,IAAS6F,EAAE8b,MAAM3gB,EAAE4mB,EAAG5mB,EAAEinB,GAAGpiB,EAAE8b,IAAI3hB,OAAE,EAAO6F,EAAEO,QAAQ,aAAa4Z,QAAG,IAASna,EAAE+b,aAAa5gB,EAAE4mB,EAAG5mB,EAAEinB,GAAGpiB,EAAE+b,cAAc5gB,CAAC,CAAskvCyuB,CAAGzuB,EAAEsC,EAAEuC,EAAE,CAAC,GAAG,IAAIgU,UAAU9W,OAAO,CAACid,EAAE,GAAGA,EAAEhgB,EAAE,GAAGA,EAAE,IAAI2E,EAAElE,KAAKihB,OAAOrC,IAAIW,GAAG,IAAIrb,EAAE,MAAM,IAAIwhB,EAAE,SAAS9D,OAAO1B,EAAE,2BAA2B0B,OAAOrC,EAAE,gCAAgC,IAAIvf,KAAKihB,OAAOld,IAAIxE,GAAG,MAAM,IAAImmB,EAAE,SAAS9D,OAAO1B,EAAE,2BAA2B0B,OAAOriB,EAAE,gCAAgC,OAAhgvC,SAAYggB,EAAEhgB,EAAE6F,EAAE7E,GAAG,IAAIsC,EAAE+hB,EAAEF,QAAQ,MAAM,eAAenF,SAAI,IAASna,EAAEmhB,IAAI,QAAQhnB,GAAGgB,KAAK6E,EAAEmhB,KAAK1jB,EAAEskB,EAAGtkB,EAAEglB,GAAGziB,EAAEmhB,GAAGhmB,UAAK,IAAS6E,EAAE8b,KAAK,OAAO3hB,GAAGgB,KAAK6E,EAAE8b,MAAM3hB,GAAG6F,EAAEO,MAAMpF,KAAKsC,EAAEskB,EAAGtkB,EAAEglB,GAAGziB,EAAE8b,IAAI3gB,MAAM,aAAagf,QAAG,IAASna,EAAE+b,YAAY5gB,KAAK6E,EAAE+b,aAAate,EAAEskB,EAAGtkB,EAAEglB,GAAGziB,EAAE+b,WAAW5gB,KAAKsC,CAAC,CAA0uuCosB,CAAG1uB,EAAEsC,EAAEqB,EAAE3E,EAAE,CAAC,MAAM,IAAIimB,EAAE,SAAS5D,OAAO1B,EAAE,sDAAsD0B,OAAOxI,UAAU9W,OAAO,MAAM,CAAC,CAAryB,CAAuyBid,EAAEhgB,EAAG,GAAE,CAArsK,CAAusKqqB,IAAI,SAASrK,GAAG0I,GAAGzjB,SAAQ,SAAUjF,IAApusC,SAAYggB,EAAEhgB,GAAG,IAAI6F,EAAE7F,EAAEgf,KAAKhe,EAAEhB,EAAEic,KAAK3Y,EAAEtD,EAAE8nB,UAAU9H,EAAEpM,UAAU/N,GAAG,SAASma,GAAG,GAAG,UAAUhf,GAAG,UAAUP,KAAKwb,MAAMjb,IAAIP,KAAKwb,KAAK,MAAM,GAAG+D,EAAE,GAAGA,EAAE,IAAIhgB,EAAES,KAAKihB,OAAOrC,IAAIW,GAAG,QAAG,IAAShgB,EAAE,MAAM,IAAImmB,EAAE,SAAS9D,OAAOxc,EAAE,0BAA0Bwc,OAAOrC,EAAE,yBAAyB,OAAO,SAASA,EAAEhgB,EAAE6F,GAAG,GAAG,UAAUma,EAAE,CAAC,GAAG,eAAeA,EAAE,OAAOzd,OAAOoD,KAAKE,EAAE+b,YAAY,GAAG,iBAAiB5hB,EAAE,OAAOuC,OAAOoD,KAAKE,EAAE7F,GAAG,CAAC,IAAIgB,EAAE,GAAG,OAAO6nB,IAAG,EAAG7I,EAAEhgB,EAAE6F,GAAE,SAAUma,GAAGhf,EAAEgN,KAAKgS,EAAG,IAAGhf,CAAC,CAA3L,CAA6L,UAAUA,EAAEP,KAAKwb,KAAKjb,EAAEsC,EAAEtD,EAAE,CAAC,EAAkvrC2vB,CAAG3P,EAAEhgB,GAAG,SAASggB,EAAEhgB,GAAG,IAAI6F,EAAE7F,EAAEgf,KAAKhe,EAAEhB,EAAEic,KAAK3Y,EAAEtD,EAAE8nB,UAAUnH,EAAE,UAAU9a,EAAE,GAAG0pB,cAAc1pB,EAAE8T,MAAM,GAAG,GAAGqG,EAAEpM,UAAU+M,GAAG,SAASX,EAAEhgB,GAAG,GAAG,UAAUgB,GAAG,UAAUP,KAAKwb,MAAMjb,IAAIP,KAAKwb,KAAK,CAAC+D,EAAE,GAAGA,EAAE,IAAIna,EAAEpF,KAAKihB,OAAOrC,IAAIW,GAAG,QAAG,IAASna,EAAE,MAAM,IAAIsgB,EAAE,SAAS9D,OAAO1B,EAAE,0BAA0B0B,OAAOrC,EAAE,yBAAyB6I,IAAG,EAAG,UAAU7nB,EAAEP,KAAKwb,KAAKjb,EAAEsC,EAAEuC,EAAE7F,EAAE,CAAC,EAAE,IAAI2E,EAAE,MAAMkB,EAAE,GAAG0pB,cAAc1pB,EAAE8T,MAAM,GAAGqG,EAAEpM,UAAUjP,GAAG,SAASqb,EAAEhgB,GAAG,IAAI6F,EAAE,GAAG,OAAOpF,KAAKkgB,GAAGX,GAAE,SAAUA,EAAEhf,GAAG6E,EAAEmI,KAAKhO,EAAEggB,EAAEhf,GAAI,IAAG6E,CAAC,EAAE,IAAI7B,EAAE,SAAS6B,EAAE,GAAG0pB,cAAc1pB,EAAE8T,MAAM,GAAGqG,EAAEpM,UAAU5P,GAAG,SAASgc,EAAEhgB,GAAG,IAAI6F,EAAE,GAAG,OAAOpF,KAAKkgB,GAAGX,GAAE,SAAUA,EAAEhf,GAAGhB,EAAEggB,EAAEhf,IAAI6E,EAAEmI,KAAKgS,EAAG,IAAGna,CAAC,EAAE,IAAI+U,EAAE,SAAS/U,EAAE,GAAG0pB,cAAc1pB,EAAE8T,MAAM,GAAGqG,EAAEpM,UAAUgH,GAAG,SAASoF,EAAEhgB,EAAE6F,GAAG,GAAGgU,UAAU9W,OAAO,EAAE,MAAM,IAAIkjB,EAAE,SAAS5D,OAAOzH,EAAE,qMAAqM,IAAI5Z,EAAE6E,EAAE,OAAOpF,KAAKkgB,GAAGX,GAAE,SAAUA,EAAEna,GAAG7E,EAAEhB,EAAEgB,EAAEgf,EAAEna,EAAG,IAAG7E,CAAC,CAAC,CAA5+B,CAA8+Bgf,EAAEhgB,GAAG,SAASggB,EAAEhgB,GAAG,IAAI6F,EAAE7F,EAAEgf,KAAKhe,EAAEhB,EAAEic,KAAK3Y,EAAEtD,EAAE8nB,UAAUnH,EAAE9a,EAAE,GAAG0pB,cAAc1pB,EAAE8T,MAAM,GAAG,GAAGhV,EAAE,OAAOgc,EAAEX,EAAEpM,UAAUjP,GAAG,SAASqb,EAAEhgB,GAAG,GAAG,UAAUgB,GAAG,UAAUP,KAAKwb,MAAMjb,IAAIP,KAAKwb,KAAK,CAAC+D,EAAE,GAAGA,EAAE,IAAIna,EAAEpF,KAAKihB,OAAOrC,IAAIW,GAAG,QAAG,IAASna,EAAE,MAAM,IAAIsgB,EAAE,SAAS9D,OAAO1d,EAAE,0BAA0B0d,OAAOrC,EAAE,yBAAyB,OAAO6I,IAAG,EAAG,UAAU7nB,EAAEP,KAAKwb,KAAKjb,EAAEsC,EAAEuC,EAAE7F,EAAE,CAAC,EAAE,IAAIgE,EAAE,OAAO2c,EAAEX,EAAEpM,UAAU5P,GAAG,SAASgc,EAAEhgB,GAAG,QAAQS,KAAKkE,GAAGqb,EAAEhgB,EAAE,EAAE,IAAI4a,EAAE,QAAQ+F,EAAEX,EAAEpM,UAAUgH,GAAG,SAASoF,EAAEhgB,GAAG,OAAOS,KAAKkE,GAAGqb,GAAE,SAAUA,EAAEna,GAAG,OAAO7F,EAAEggB,EAAEna,EAAG,GAAE,CAAC,CAAvgB,CAAygBma,EAAEhgB,GAAvvuC,SAAYggB,EAAEhgB,GAAG,IAAI6F,EAAE7F,EAAEgf,KAAKhe,EAAEhB,EAAEic,KAAK3Y,EAAEtD,EAAE8nB,UAAUnH,EAAE9a,EAAE8T,MAAM,GAAG,GAAG,UAAUqG,EAAEpM,UAAU+M,GAAG,SAASX,GAAG,GAAG,UAAUhf,GAAG,UAAUP,KAAKwb,MAAMjb,IAAIP,KAAKwb,KAAK,OAAOoJ,EAAEF,QAAQnF,EAAE,GAAGA,EAAE,IAAIhgB,EAAES,KAAKihB,OAAOrC,IAAIW,GAAG,QAAG,IAAShgB,EAAE,MAAM,IAAImmB,EAAE,SAAS9D,OAAO1B,EAAE,0BAA0B0B,OAAOrC,EAAE,yBAAyB,OAAO,SAASA,EAAEhgB,EAAE6F,GAAG,GAAG,UAAUma,EAAE,CAAC,GAAG,eAAeA,EAAE,OAAO+I,GAAG,KAAKljB,EAAEA,EAAE+b,YAAY,GAAG,iBAAiB5hB,EAAE,OAAO+oB,GAAG,KAAKljB,EAAEA,EAAE7F,GAAG,CAAC,IAAIgB,EAAEqkB,EAAEF,QAAQ7hB,EAAE,IAAIqlB,GAAG,MAAM,eAAe3I,IAAI,QAAQhgB,IAAIgB,EAAE4mB,EAAG5mB,EAAE+nB,GAAGzlB,EAAEuC,EAAEA,EAAEmhB,MAAM,OAAOhnB,IAAIgB,EAAE4mB,EAAG5mB,EAAE+nB,GAAGzlB,EAAEuC,EAAEA,EAAE8b,QAAQ,aAAa3B,IAAIhf,EAAE4mB,EAAG5mB,EAAE+nB,GAAGzlB,EAAEuC,EAAEA,EAAE+b,cAAc5gB,CAAC,CAAvS,CAAyS,UAAUA,EAAEP,KAAKwb,KAAKjb,EAAEsC,EAAEtD,EAAE,CAAC,CAAuntC4vB,CAAG5P,EAAEhgB,EAAG,GAAE,CAAvjD,CAAyjDqqB,IAAI,IAAIwF,GAAG,SAAS7P,GAAG,SAASna,EAAE7F,GAAG,IAAI6F,EAAE+U,EAAE,CAACqB,KAAK,YAAYjc,GAAG,GAAG,UAAU6F,IAAG,IAAKA,EAAEua,MAAM,MAAM,IAAI6F,EAAE,gGAAgG,GAAG,aAAapgB,EAAEoW,KAAK,MAAM,IAAIgK,EAAE,qCAAqCpgB,EAAEoW,KAAK,4BAA4B,OAAO+D,EAAEpG,KAAKnZ,KAAKoF,IAAIpF,IAAI,CAAC,OAAOT,EAAE6F,EAAEma,GAAGna,CAAC,CAAtV,CAAwVwkB,IAAIyF,GAAG,SAAS9P,GAAG,SAASna,EAAE7F,GAAG,IAAI6F,EAAE+U,EAAE,CAACqB,KAAK,cAAcjc,GAAG,GAAG,UAAU6F,IAAG,IAAKA,EAAEua,MAAM,MAAM,IAAI6F,EAAE,kGAAkG,GAAG,eAAepgB,EAAEoW,KAAK,MAAM,IAAIgK,EAAE,uCAAuCpgB,EAAEoW,KAAK,4BAA4B,OAAO+D,EAAEpG,KAAKnZ,KAAKoF,IAAIpF,IAAI,CAAC,OAAOT,EAAE6F,EAAEma,GAAGna,CAAC,CAA9V,CAAgWwkB,IAAI0F,GAAG,SAAS/P,GAAG,SAASna,EAAE7F,GAAG,IAAI6F,EAAE+U,EAAE,CAACwF,OAAM,GAAIpgB,GAAG,GAAG,UAAU6F,IAAG,IAAKA,EAAEua,MAAM,MAAM,IAAI6F,EAAE,8FAA8F,OAAOjG,EAAEpG,KAAKnZ,KAAKoF,IAAIpF,IAAI,CAAC,OAAOT,EAAE6F,EAAEma,GAAGna,CAAC,CAAlO,CAAoOwkB,IAAI2F,GAAG,SAAShQ,GAAG,SAASna,EAAE7F,GAAG,IAAI6F,EAAE+U,EAAE,CAACqB,KAAK,WAAWmE,OAAM,GAAIpgB,GAAG,GAAG,UAAU6F,IAAG,IAAKA,EAAEua,MAAM,MAAM,IAAI6F,EAAE,sGAAsG,GAAG,aAAapgB,EAAEoW,KAAK,MAAM,IAAIgK,EAAE,0CAA0CpgB,EAAEoW,KAAK,4BAA4B,OAAO+D,EAAEpG,KAAKnZ,KAAKoF,IAAIpF,IAAI,CAAC,OAAOT,EAAE6F,EAAEma,GAAGna,CAAC,CAA1W,CAA4WwkB,IAAI4F,GAAG,SAASjQ,GAAG,SAASna,EAAE7F,GAAG,IAAI6F,EAAE+U,EAAE,CAACqB,KAAK,aAAamE,OAAM,GAAIpgB,GAAG,GAAG,UAAU6F,IAAG,IAAKA,EAAEua,MAAM,MAAM,IAAI6F,EAAE,wGAAwG,GAAG,eAAepgB,EAAEoW,KAAK,MAAM,IAAIgK,EAAE,4CAA4CpgB,EAAEoW,KAAK,4BAA4B,OAAO+D,EAAEpG,KAAKnZ,KAAKoF,IAAIpF,IAAI,CAAC,OAAOT,EAAE6F,EAAEma,GAAGna,CAAC,CAAlX,CAAoXwkB,IAAI,SAAS6F,GAAGlQ,GAAGA,EAAEyN,KAAK,SAASztB,EAAE6F,GAAG,IAAI7E,EAAE4Z,EAAE,CAAC,EAAE5a,EAAEoC,QAAQyD,GAAGvC,EAAE,IAAI0c,EAAEhf,GAAG,OAAOsC,EAAE4qB,OAAOluB,GAAGsD,CAAC,CAAC,CAAC,OAAO4sB,GAAG7F,IAAI6F,GAAGL,IAAIK,GAAGJ,IAAII,GAAGH,IAAIG,GAAGF,IAAIE,GAAGD,IAAI5F,GAAG8F,MAAM9F,GAAGA,GAAG+F,cAAcP,GAAGxF,GAAGgG,gBAAgBP,GAAGzF,GAAGiG,WAAWP,GAAG1F,GAAGkG,mBAAmBP,GAAG3F,GAAGmG,qBAAqBP,GAAG5F,GAAGoG,2BAA2BxK,EAAEoE,GAAGqG,mBAAmBvK,EAAEkE,GAAGsG,gBAAgBvK,EAAEiE,EAAG,CAAv2wErqB,E,GCC/E4wB,EAA2B,CAAC,EAGhC,SAASC,EAAoBC,GAE5B,IAAIC,EAAeH,EAAyBE,GAC5C,QAAqBtR,IAAjBuR,EACH,OAAOA,EAAanY,QAGrB,IAAIhR,EAASgpB,EAAyBE,GAAY,CAGjDlY,QAAS,CAAC,GAOX,OAHAoY,EAAoBF,GAAUlX,KAAKhS,EAAOgR,QAAShR,EAAQA,EAAOgR,QAASiY,GAGpEjpB,EAAOgR,OACf,CAGAiY,EAAoBvO,EAAI0O,EAGxBH,EAAoBxhB,EAAI,KAGvB,IAAI4hB,EAAsBJ,EAAoBxL,OAAE7F,EAAW,CAAC,MAAM,IAAOqR,EAAoB,QAE7F,OADsBA,EAAoBxL,EAAE4L,EAClB,EzBjCvB1zB,EAAW,GACfszB,EAAoBxL,EAAI,CAACnlB,EAAQgxB,EAAUzV,EAAI0V,KAC9C,IAAGD,EAAH,CAMA,IAAIE,EAAe1S,IACnB,IAASpb,EAAI,EAAGA,EAAI/F,EAASwF,OAAQO,IAAK,CAGzC,IAFA,IAAK4tB,EAAUzV,EAAI0V,GAAY5zB,EAAS+F,GACpCzD,GAAY,EACP0O,EAAI,EAAGA,EAAI2iB,EAASnuB,OAAQwL,MACpB,EAAX4iB,GAAsBC,GAAgBD,IAAa5uB,OAAOoD,KAAKkrB,EAAoBxL,GAAG/X,OAAOlH,GAASyqB,EAAoBxL,EAAEjf,GAAK8qB,EAAS3iB,MAC9I2iB,EAASvY,OAAOpK,IAAK,IAErB1O,GAAY,EACTsxB,EAAWC,IAAcA,EAAeD,IAG7C,GAAGtxB,EAAW,CACbtC,EAASob,OAAOrV,IAAK,GACrB,IAAItC,EAAIya,SACE+D,IAANxe,IAAiBd,EAASc,EAC/B,CACD,CACA,OAAOd,CAnBP,CAJCixB,EAAWA,GAAY,EACvB,IAAI,IAAI7tB,EAAI/F,EAASwF,OAAQO,EAAI,GAAK/F,EAAS+F,EAAI,GAAG,GAAK6tB,EAAU7tB,IAAK/F,EAAS+F,GAAK/F,EAAS+F,EAAI,GACrG/F,EAAS+F,GAAK,CAAC4tB,EAAUzV,EAAI0V,EAqBjB,E0BzBdN,EAAoBhrB,EAAK+B,IACxB,IAAIuX,EAASvX,GAAUA,EAAOypB,WAC7B,IAAOzpB,EAAiB,QACxB,IAAM,EAEP,OADAipB,EAAoBtjB,EAAE4R,EAAQ,CAAExa,EAAGwa,IAC5BA,CAAM,ECLd0R,EAAoBtjB,EAAI,CAACqL,EAAS0Y,KACjC,IAAI,IAAIlrB,KAAOkrB,EACXT,EAAoBlQ,EAAE2Q,EAAYlrB,KAASyqB,EAAoBlQ,EAAE/H,EAASxS,IAC5E7D,OAAOwf,eAAenJ,EAASxS,EAAK,CAAEkb,YAAY,EAAMjC,IAAKiS,EAAWlrB,IAE1E,ECNDyqB,EAAoB7O,EAAI,CAAC,EAGzB6O,EAAoB7wB,EAAKuxB,GACjB7xB,QAAQ8xB,IAAIjvB,OAAOoD,KAAKkrB,EAAoB7O,GAAGtd,QAAO,CAAC+sB,EAAUrrB,KACvEyqB,EAAoB7O,EAAE5b,GAAKmrB,EAASE,GAC7BA,IACL,KCNJZ,EAAoBjW,EAAK2W,GAEZA,EAAU,MCHvBV,EAAoBrT,EAAI,WACvB,GAA0B,iBAAfkU,WAAyB,OAAOA,WAC3C,IACC,OAAOjxB,MAAQ,IAAIygB,SAAS,cAAb,EAChB,CAAE,MAAOlhB,GACR,GAAsB,iBAAX2b,OAAqB,OAAOA,MACxC,CACA,CAPuB,GCAxBkV,EAAoBlQ,EAAI,CAACgR,EAAKC,IAAUrvB,OAAOqR,UAAU4T,eAAe5N,KAAK+X,EAAKC,G,MCAlF,IAAIC,EACAhB,EAAoBrT,EAAEsU,gBAAeD,EAAYhB,EAAoBrT,EAAEuU,SAAW,IACtF,IAAIC,EAAWnB,EAAoBrT,EAAEwU,SACrC,IAAKH,GAAaG,IACbA,EAASC,gBACZJ,EAAYG,EAASC,cAAcC,MAC/BL,GAAW,CACf,IAAIM,EAAUH,EAASI,qBAAqB,UAC5C,GAAGD,EAAQpvB,OAEV,IADA,IAAIO,EAAI6uB,EAAQpvB,OAAS,EAClBO,GAAK,KAAOuuB,IAAc,aAAaQ,KAAKR,KAAaA,EAAYM,EAAQ7uB,KAAK4uB,GAE3F,CAID,IAAKL,EAAW,MAAM,IAAIjvB,MAAM,yDAChCivB,EAAYA,EAAUS,QAAQ,OAAQ,IAAIA,QAAQ,QAAS,IAAIA,QAAQ,YAAa,KACpFzB,EAAoB/O,EAAI+P,C,WClBxBhB,EAAoBjsB,EAAI2tB,KAAKR,SAAW,GAIxC,IAAIS,EAAkB,CACrB,IAAK,GAgBN3B,EAAoB7O,EAAE1e,EAAI,CAACiuB,EAASE,KAE/Be,EAAgBjB,IAElBO,cAAcjB,EAAoB/O,EAAI+O,EAAoBjW,EAAE2W,GAE9D,EAGD,IAAIkB,EAAqBF,KAAsB,gBAAIA,KAAsB,iBAAK,GAC1EG,EAA6BD,EAAmBzkB,KAAKgP,KAAKyV,GAC9DA,EAAmBzkB,KAvBCwJ,IACnB,IAAK0Z,EAAUyB,EAAaC,GAAWpb,EACvC,IAAI,IAAIsZ,KAAY6B,EAChB9B,EAAoBlQ,EAAEgS,EAAa7B,KACrCD,EAAoBvO,EAAEwO,GAAY6B,EAAY7B,IAIhD,IADG8B,GAASA,EAAQ/B,GACdK,EAASnuB,QACdyvB,EAAgBtB,EAASxY,OAAS,EACnCga,EAA2Blb,EAAK,C,KhCnB7Bha,EAAOqzB,EAAoBxhB,EAC/BwhB,EAAoBxhB,EAAI,IAChBwhB,EAAoB7wB,EAAE,KAAKI,KAAK5C,GiCDxC,IAAIyzB,EAAsBJ,EAAoBxhB,I","sources":["webpack://bio/webpack/runtime/chunk loaded","webpack://bio/webpack/runtime/startup chunk dependencies","webpack://bio/./node_modules/@datagrok-libraries/math/src/webGPU/multi-col-distances/webGPU-aggregation.js","webpack://bio/./node_modules/@datagrok-libraries/math/src/webGPU/multi-col-distances/webGPU-multicol-distances.js","webpack://bio/./node_modules/@datagrok-libraries/math/src/webGPU/getGPUDevice.js","webpack://bio/./node_modules/@datagrok-libraries/math/src/webGPU/sparse-matrix/webGPU-sparse-matrix.js","webpack://bio/./node_modules/@datagrok-libraries/math/src/webGPU/preprocessing/webGPU-process-info.js","webpack://bio/./node_modules/@datagrok-libraries/ml/src/MCL/bio-layout.js","webpack://bio/./node_modules/@datagrok-libraries/ml/src/MCL/webCola.js","webpack://bio/./node_modules/@datagrok-libraries/math/src/webGPU/MCL/colwise-normalize.js","webpack://bio/./node_modules/@datagrok-libraries/math/src/webGPU/MCL/inflate-expand.js","webpack://bio/./node_modules/@datagrok-libraries/math/src/webGPU/MCL/utils.js","webpack://bio/./node_modules/@datagrok-libraries/math/src/webGPU/umap/utils.js","webpack://bio/./node_modules/is-any-array/lib-esm/index.js","webpack://bio/./node_modules/@datagrok-libraries/ml/src/MCL/marcov-cluster.js","webpack://bio/./node_modules/@datagrok-libraries/math/src/webGPU/MCL/MCL-webGPU.js","webpack://bio/./node_modules/@datagrok-libraries/ml/src/MCL/mcl-worker.js","webpack://bio/./node_modules/@datagrok-libraries/ml/src/distance-matrix/utils.js","webpack://bio/./node_modules/graphology-layout-forceatlas2/defaults.js","webpack://bio/./node_modules/graphology-layout-forceatlas2/helpers.js","webpack://bio/./node_modules/graphology-layout-forceatlas2/index.js","webpack://bio/./node_modules/graphology-layout-forceatlas2/iterate.js","webpack://bio/./node_modules/graphology-utils/getters.js","webpack://bio/./node_modules/graphology-utils/is-graph.js","webpack://bio/./node_modules/graphology/dist/graphology.umd.min.js","webpack://bio/webpack/bootstrap","webpack://bio/webpack/runtime/compat get default export","webpack://bio/webpack/runtime/define property getters","webpack://bio/webpack/runtime/ensure chunk","webpack://bio/webpack/runtime/get javascript chunk filename","webpack://bio/webpack/runtime/global","webpack://bio/webpack/runtime/hasOwnProperty shorthand","webpack://bio/webpack/runtime/publicPath","webpack://bio/webpack/runtime/importScripts chunk loading","webpack://bio/webpack/startup"],"sourcesContent":["var deferred = [];\n__webpack_require__.O = (result, chunkIds, fn, priority) => {\n\tif(chunkIds) {\n\t\tpriority = priority || 0;\n\t\tfor(var i = deferred.length; i > 0 && deferred[i - 1][2] > priority; i--) deferred[i] = deferred[i - 1];\n\t\tdeferred[i] = [chunkIds, fn, priority];\n\t\treturn;\n\t}\n\tvar notFulfilled = Infinity;\n\tfor (var i = 0; i < deferred.length; i++) {\n\t\tvar [chunkIds, fn, priority] = deferred[i];\n\t\tvar fulfilled = true;\n\t\tfor (var j = 0; j < chunkIds.length; j++) {\n\t\t\tif ((priority & 1 === 0 || notFulfilled >= priority) && Object.keys(__webpack_require__.O).every((key) => (__webpack_require__.O[key](chunkIds[j])))) {\n\t\t\t\tchunkIds.splice(j--, 1);\n\t\t\t} else {\n\t\t\t\tfulfilled = false;\n\t\t\t\tif(priority < notFulfilled) notFulfilled = priority;\n\t\t\t}\n\t\t}\n\t\tif(fulfilled) {\n\t\t\tdeferred.splice(i--, 1)\n\t\t\tvar r = fn();\n\t\t\tif (r !== undefined) result = r;\n\t\t}\n\t}\n\treturn result;\n};","var next = __webpack_require__.x;\n__webpack_require__.x = () => {\n\treturn __webpack_require__.e(731).then(next);\n};","function euclideanAggregationWgsl(arraySize) {\n return `\n var sum = 0.0;\n for (var i = 0u; i < ${arraySize}; i = i + 1u) {\n sum = sum + distances[i] * distances[i] * computeInfo.weights[i] * computeInfo.weights[i];\n }\n return sqrt(sum);\n `;\n}\n;\nfunction manhattanAggregationWgsl(arraySize) {\n return `\n var sum = 0.0;\n for (var i = 0u; i < ${arraySize}; i = i + 1u) {\n sum = sum + abs(distances[i]) * computeInfo.weights[i];\n }\n return sum;\n `;\n}\nexport var WEBGSLAGGREGATION;\n(function (WEBGSLAGGREGATION) {\n WEBGSLAGGREGATION[\"EUCLIDEAN\"] = \"EUCLIDEAN\";\n WEBGSLAGGREGATION[\"MANHATTAN\"] = \"MANHATTAN\";\n})(WEBGSLAGGREGATION || (WEBGSLAGGREGATION = {}));\nexport const WEBGSLAGGREGATIONFUNCTIONS = {\n [WEBGSLAGGREGATION.EUCLIDEAN]: euclideanAggregationWgsl,\n [WEBGSLAGGREGATION.MANHATTAN]: manhattanAggregationWgsl\n};\n//# sourceMappingURL=webGPU-aggregation.js.map","/* eslint-disable max-len */\n// in all the functions below, the variables a and b are assumed to be arrays of uint32/f32\n//values which are infered from the code this chunk is injected into\n// also, we have access to computeInfo struct, which contains the following fields:\n// computeInfo.entrySizes: array of arrays of u32 containing the sizes of the entries\n// other fields are specific to the distance function should be injected from the main script that calls this function,\n// and should be available in the supplementaryInfo struct\n// like the similarity matrix for monomer chemical distance.\n// the getProcessInfo function should return correct buffer allocation mechanism for the supplementaryInfo,\n// for every entry list\n// the maxDistance variable is also assumed to be available in the\n// scope of the function, in case of knn it is the distance in the last postion of knn on this index,\n// in case of sparse matrix, it can be just the threshold for the distance.\n// hamming distance for sequnences of uint32 arrays of max length ${maxArraySize}\nexport function webGPUHamming(_maxArraySize, entryIndex) {\n return `\n let aLength: u32 = computeInfo.entrySizes[${entryIndex}][aIndex];\n let bLength: u32 = computeInfo.entrySizes[${entryIndex}][bIndex];\n let maxLength: u32 = max(aLength, bLength);\n let minLength: u32 = min(aLength, bLength);\n let sizeDiff: u32 = maxLength - minLength;\n \n let maxIntDistance = ceil(maxDistance * f32(maxLength)) - f32(sizeDiff);\n\n var diff: f32 = 0.0;\n for (var i = 0u; i < ${_maxArraySize}; i = i + 1u) {\n diff = diff + f32(a[i] != b[i]);\n if (diff > maxIntDistance) {\n return 1.0;\n }\n }\n diff += f32(sizeDiff);\n return diff / ${_maxArraySize};\n `;\n}\nexport function webGPUMonomerChemicalDistance(_maxArraySize, entryIndex) {\n // it is assumet that suppInfo struct contains correct matrix called similarityMatrix${entryIndex}, (similarityMatrix0, similarityMatrix1, etc)\n // this should be guaranteed by the getProcessInfo function.\n return `\n let aLength: u32 = computeInfo.entrySizes[${entryIndex}][aIndex];\n let bLength: u32 = computeInfo.entrySizes[${entryIndex}][bIndex];\n let maxLength: u32 = max(aLength, bLength);\n let minLength: u32 = min(aLength, bLength);\n let sizeDiff: u32 = maxLength - minLength;\n \n let maxIntDistance = ceil(maxDistance * f32(maxLength)) - f32(sizeDiff);\n\n let simMatrix = &(suppInfo.similarityMatrix${entryIndex}); // using pointers make things faster\n var diff: f32 = 0.0;\n for (var i = 0u; i < ${_maxArraySize}; i = i + 1u) {\n diff = diff + 1.0 - (*simMatrix)[u32(a[i])][u32(b[i])];\n if (diff > maxIntDistance) {\n return 1.0;\n }\n }\n diff += f32(sizeDiff);\n return diff / ${_maxArraySize};\n `;\n}\nexport function webGPULevenstein(maxArraySize, entryIndex) {\n return `\n let aLength: u32 = computeInfo.entrySizes[${entryIndex}][aIndex];\n let bLength: u32 = computeInfo.entrySizes[${entryIndex}][bIndex];\n let maxLength: u32 = max(aLength, bLength);\n let minLength: u32 = min(aLength, bLength);\n\n let maxIntDistance = ceil(maxDistance * f32(maxLength));\n\n // we will store two arrays as matrix and swap the working indices per pass.\n // this way we can reduce memory usage per computation to just O(aLength)\n // the grid will have aLength + 1 columns and bLength + 1 rows\n // this will be guaranteed by iteration, but the array sizes must be known at compile time, so we will use a fixed size of maxArraySize\n var dynamicPassMat: array<array<f32, ${maxArraySize + 1}u>, 2>; // initialize to 0\n \n var prevIndex: u32 = 0;\n var curIndex: u32 = 1; // we will swap these indices per pass\n\n // initialize the first row\n for (var i = 0u; i <= aLength; i = i + 1u) {\n dynamicPassMat[prevIndex][i] = f32(i);\n }\n\n // iterate over the rows\n for (var i = 1u; i <= bLength; i = i + 1u) {\n dynamicPassMat[curIndex][0] = f32(i);\n var minEntry: f32 = f32(maxLength);\n let prevRow = &dynamicPassMat[prevIndex];\n let curRow = &dynamicPassMat[curIndex];\n let bMon = u32(b[i - 1]);\n for (var j = 1u; j <= aLength; j = j + 1u) {\n var cost: f32 = f32(a[j - 1] != bMon);\n var res: f32 = min(\n min(\n (*prevRow)[j] + 1.0, // deletion\n (*curRow)[j - 1] + 1.0, // insertion\n ),\n (*prevRow)[j - 1] + cost // substitution\n );\n (*curRow)[j] = res;\n if (res < minEntry) {\n minEntry = res;\n }\n }\n // swap the indices\n let temp: u32 = prevIndex;\n prevIndex = curIndex;\n curIndex = temp;\n if (minEntry > maxIntDistance) {\n return 1.0;\n }\n }\n\n return dynamicPassMat[prevIndex][aLength] / f32(maxLength);\n `;\n}\nexport function webGPUNeedlemanWunsch(maxArraySize, entryIndex) {\n // version of the levenshtain where the cost of substitution is customizable\n // it is assumet that suppInfo struct contains correct matrix called similarityMatrix${entryIndex}, (similarityMatrix0, similarityMatrix1, etc)\n // and gapOpenPenalty, gapExtensionPenalty\n // this should be guaranteed by the getProcessInfo function.\n return `\n let aLength: u32 = computeInfo.entrySizes[${entryIndex}][aIndex];\n let bLength: u32 = computeInfo.entrySizes[${entryIndex}][bIndex];\n let maxLength: u32 = max(aLength, bLength);\n let minLength: u32 = min(aLength, bLength);\n \n let maxIntDistance = ceil(maxDistance * f32(maxLength));\n // we will store two arrays as matrix and swap the working indices per pass.\n // this way we can reduce memory usage per computation to just O(aLength)\n // the grid will have aLength + 1 columns and bLength + 1 rows\n // this will be guaranteed by iteration, but the array sizes must be known at compile time, so we will use a fixed size of maxArraySize\n var dynamicPassMat: array<array<f32, ${maxArraySize + 1}u>, 2>; // initialize to 0\n \n // we need to keep track of which operation led to the current cell\n // i.e. whether we came from the left, top or diagonal to assign gap open/gap extend penalty\n var verticalGaps: array<u32, ${maxArraySize + 1}u>;\n var horizontalGaps: array<u32, ${maxArraySize + 1}u>;\n\n let gapOpenPenalty: f32 = suppInfo.gapOpenPenalty${entryIndex};\n let gapExtensionPenalty: f32 = suppInfo.gapExtensionPenalty${entryIndex};\n var prevIndex: u32 = 0;\n var curIndex: u32 = 1; // we will swap these indices per pass\n // initialize the first row\n for (var i = 0u; i <= aLength; i = i + 1u) {\n dynamicPassMat[prevIndex][i] = gapExtensionPenalty + f32(i - 1) * gapExtensionPenalty; // accounting for the fact that left and right gaps are less costly\n dynamicPassMat[curIndex][i] = 0.0;\n }\n dynamicPassMat[0][0] = 0.0;\n\n let simMatrix = &suppInfo.similarityMatrix${entryIndex}; // using pointers make things faster\n // iterate over the rows\n for (var i = 1u; i <= bLength; i = i + 1u) {\n let prevRow = &dynamicPassMat[prevIndex];\n let curRow = &dynamicPassMat[curIndex];\n (*curRow)[0] = gapExtensionPenalty + f32(i - 1) * gapExtensionPenalty;\n var minEntry: f32 = f32(maxLength);\n let monB = u32(b[i - 1]);\n for (var j = 1u; j <= aLength; j = j + 1u) {\n let monA = u32(a[j - 1]);\n \n let cost: f32 = (*prevRow)[j - 1] + 1f - (*simMatrix)[monA][monB];\n var top = (*prevRow)[j]; // deletion\n if (verticalGaps[j] > 0 || i == 1 || i == bLength) {\n top = top + gapExtensionPenalty;\n } else {\n top = top + gapOpenPenalty;\n }\n var left = (*curRow)[j - 1]; // insertion\n if (horizontalGaps[j - 1] > 0 || j == 1 || j == aLength) {\n left = left + gapExtensionPenalty;\n } else {\n left = left + gapOpenPenalty;\n }\n var res: f32 = min(\n min(\n top, // deletion\n left, // insertion\n ),\n cost // substitution\n );\n (*curRow)[j] = res;\n if (res < minEntry) {\n minEntry = res;\n }\n // update the horizontal and vertical gaps\n if (res == cost) {\n verticalGaps[j] = 0;\n horizontalGaps[j] = 0;\n } else if (res == left) {\n verticalGaps[j] = 0;\n horizontalGaps[j] = 1;\n } else {\n verticalGaps[j] = 1;\n horizontalGaps[j] = 0;\n }\n }\n // swap the indices\n let temp: u32 = prevIndex;\n prevIndex = curIndex;\n curIndex = temp;\n if (minEntry > maxIntDistance) {\n return 1.0;\n }\n }\n return dynamicPassMat[prevIndex][aLength] / f32(minLength);\n\n `;\n}\nexport function webGPUEuclidean(maxArraySize, _entryIndex) {\n return `\n var dist: f32 = 0.0;\n for (var i = 0u; i < ${maxArraySize}; i = i + 1u) {\n dist = dist + f32(a[i] - b[i]) * f32(a[i] - b[i]);\n }\n return sqrt(dist);\n `;\n}\nexport function webGPUManhattan(maxArraySize, _entryIndex) {\n return `\n var dist: f32 = 0.0;\n for (var i = 0u; i < ${maxArraySize}; i = i + 1u) {\n dist = dist + abs(f32(a[i] - b[i]));\n }\n return dist;\n `;\n}\nexport function webGPUOneHotDistance(_maxArraySize, entryIndex) {\n return `\n let aLength: u32 = computeInfo.entrySizes[${entryIndex}][aIndex];\n let bLength: u32 = computeInfo.entrySizes[${entryIndex}][bIndex];\n if (aLength != bLength) {\n return 1.0;\n }\n for (var i = 0u; i < aLength; i = i + 1u) {\n if(a[i] != b[i]) {\n return 1.0;\n }\n }\n return 0.0;\n `;\n}\nexport function webGPUNumericDistance(_maxArraySize, entryIndex) {\n // we assume that range${entryIndex} is available in the supplementaryInfo struct\n return `\n let range = suppInfo.range${entryIndex};\n return f32(abs(f32(a[0]) - f32(b[0])) / range);\n `;\n}\n// tanimoto distance for uint32 arrays of length ${maxArraySize}\nexport function webGPUTanimotoBitArray(maxArraySize, _entryIndex) {\n return `\n var onBitsa: u32 = 0u;\n var onBitsb: u32 = 0u;\n for (var i = 0u; i < ${maxArraySize}u; i = i + 1u) {\n onBitsa = onBitsa + countOneBits(a[i]);\n onBitsb = onBitsb + countOneBits(b[i]);\n }\n\n if (onBitsa == 0u && onBitsb == 0u) {\n return 0.0;\n }\n\n let totalOnBits = onBitsa + onBitsb;\n var commonBits: u32 = 0u;\n for (var i = 0u; i < ${maxArraySize}u; i = i + 1u) {\n commonBits = commonBits + countOneBits(a[i] & b[i]);\n }\n\n return 1.0 - f32(commonBits) / f32(totalOnBits - commonBits);\n `;\n}\nexport function webGPUAsymmetricBitArray(maxArraySize, _entryIndex) {\n return `\n var onBitsa: u32 = 0u;\n var onBitsb: u32 = 0u;\n for (var i = 0u; i < ${maxArraySize}u; i = i + 1u) {\n onBitsa = onBitsa + countOneBits(a[i]);\n onBitsb = onBitsb + countOneBits(b[i]);\n }\n let min = min(onBitsa, onBitsb);\n if (min == 0u) {\n return 1.0;\n }\n var commonBits: u32 = 0u;\n for (var i = 0u; i < ${maxArraySize}u; i = i + 1u) {\n commonBits = commonBits + countOneBits(a[i] & b[i]);\n }\n return 1.0 - f32(commonBits) / f32(min);\n `;\n}\nexport function webGPUCosineBitArray(maxArraySize, _entryIndex) {\n return `\n var onBitsa: u32 = 0u;\n var onBitsb: u32 = 0u;\n for (var i = 0u; i < ${maxArraySize}u; i = i + 1u) {\n onBitsa = onBitsa + countOneBits(a[i]);\n onBitsb = onBitsb + countOneBits(b[i]);\n }\n let total = onBitsa * onBitsb; // p.s. here total is taken by multiplying\n if (total == 0u) {\n return 1.0;\n }\n var commonBits: u32 = 0u;\n for (var i = 0u; i < ${maxArraySize}u; i = i + 1u) {\n commonBits = commonBits + countOneBits(a[i] & b[i]);\n }\n return 1.0 - f32(commonBits) / sqrt(f32(total));\n `;\n}\nexport function webGPUSokalBitArray(maxArraySize, _entryIndex) {\n return `\n var onBitsa: u32 = 0u;\n var onBitsb: u32 = 0u;\n for (var i = 0u; i < ${maxArraySize}u; i = i + 1u) {\n onBitsa = onBitsa + countOneBits(a[i]);\n onBitsb = onBitsb + countOneBits(b[i]);\n }\n let total = onBitsa + onBitsb;\n if (total == 0u) {\n return 1.0;\n }\n var commonBits: u32 = 0u;\n for (var i = 0u; i < ${maxArraySize}u; i = i + 1u) {\n commonBits = commonBits + countOneBits(a[i] & b[i]);\n }\n return 1.0 - f32(commonBits) / f32(total * 2 - commonBits * 3);\n `;\n}\nexport var WEBGPUDISTANCE;\n(function (WEBGPUDISTANCE) {\n WEBGPUDISTANCE[\"HAMMING\"] = \"Hamming\";\n WEBGPUDISTANCE[\"EUCLIDEAN\"] = \"Euclidean\";\n WEBGPUDISTANCE[\"MANHATTAN\"] = \"Manhattan\";\n WEBGPUDISTANCE[\"TANIMOTO\"] = \"Tanimoto\";\n WEBGPUDISTANCE[\"LEVENSTEIN\"] = \"Levenshtein\";\n WEBGPUDISTANCE[\"NEEDLEMAN_WUNSCH\"] = \"Needlemann-Wunsch\";\n WEBGPUDISTANCE[\"MONOMER_CHEMICAL_DISTANCE\"] = \"Monomer chemical distance\";\n WEBGPUDISTANCE[\"SOKAL\"] = \"Sokal\";\n WEBGPUDISTANCE[\"COSINE\"] = \"Cosine\";\n WEBGPUDISTANCE[\"ASYMMETRIC\"] = \"Asymmetric\";\n WEBGPUDISTANCE[\"Difference\"] = \"Difference\";\n WEBGPUDISTANCE[\"OneHot\"] = \"One-Hot\";\n})(WEBGPUDISTANCE || (WEBGPUDISTANCE = {}));\nexport const webGPUFunctions = {\n [WEBGPUDISTANCE.HAMMING]: webGPUHamming,\n [WEBGPUDISTANCE.EUCLIDEAN]: webGPUEuclidean,\n [WEBGPUDISTANCE.MANHATTAN]: webGPUManhattan,\n [WEBGPUDISTANCE.TANIMOTO]: webGPUTanimotoBitArray,\n [WEBGPUDISTANCE.LEVENSTEIN]: webGPULevenstein,\n [WEBGPUDISTANCE.NEEDLEMAN_WUNSCH]: webGPUNeedlemanWunsch,\n [WEBGPUDISTANCE.MONOMER_CHEMICAL_DISTANCE]: webGPUMonomerChemicalDistance,\n [WEBGPUDISTANCE.SOKAL]: webGPUSokalBitArray,\n [WEBGPUDISTANCE.COSINE]: webGPUCosineBitArray,\n [WEBGPUDISTANCE.ASYMMETRIC]: webGPUAsymmetricBitArray,\n [WEBGPUDISTANCE.Difference]: webGPUNumericDistance,\n [WEBGPUDISTANCE.OneHot]: webGPUOneHotDistance\n};\nexport const distanceFunctionComplexity = {\n [WEBGPUDISTANCE.HAMMING]: (maxEntrySize) => Math.ceil(maxEntrySize / 30),\n [WEBGPUDISTANCE.EUCLIDEAN]: (maxEntrySize) => Math.ceil(maxEntrySize / 30),\n [WEBGPUDISTANCE.MANHATTAN]: (maxEntrySize) => Math.ceil(maxEntrySize / 30),\n [WEBGPUDISTANCE.TANIMOTO]: (maxEntrySize) => Math.ceil(maxEntrySize / 60),\n [WEBGPUDISTANCE.SOKAL]: (maxEntrySize) => Math.ceil(maxEntrySize / 60),\n [WEBGPUDISTANCE.COSINE]: (maxEntrySize) => Math.ceil(maxEntrySize / 60),\n [WEBGPUDISTANCE.ASYMMETRIC]: (maxEntrySize) => Math.ceil(maxEntrySize / 60),\n [WEBGPUDISTANCE.LEVENSTEIN]: (maxEntrySize) => Math.ceil(maxEntrySize * maxEntrySize / 60),\n [WEBGPUDISTANCE.NEEDLEMAN_WUNSCH]: (maxEntrySize) => Math.ceil(maxEntrySize * maxEntrySize / 60),\n [WEBGPUDISTANCE.MONOMER_CHEMICAL_DISTANCE]: (maxEntrySize) => Math.ceil(maxEntrySize / 25),\n [WEBGPUDISTANCE.Difference]: (_maxEntrySize) => 1,\n [WEBGPUDISTANCE.OneHot]: (_maxEntrySize) => Math.ceil(_maxEntrySize / 40),\n};\nexport const TypeSupportedDistances = {\n [\"STRING\" /* WGPUENTRYTYPE.STRING */]: new Set([WEBGPUDISTANCE.HAMMING, WEBGPUDISTANCE.LEVENSTEIN, WEBGPUDISTANCE.NEEDLEMAN_WUNSCH, WEBGPUDISTANCE.MONOMER_CHEMICAL_DISTANCE, WEBGPUDISTANCE.OneHot]),\n [\"UINT32ARRAY\" /* WGPUENTRYTYPE.UINT32ARRAY */]: new Set([WEBGPUDISTANCE.HAMMING, WEBGPUDISTANCE.EUCLIDEAN, WEBGPUDISTANCE.MANHATTAN, WEBGPUDISTANCE.MONOMER_CHEMICAL_DISTANCE, WEBGPUDISTANCE.LEVENSTEIN, WEBGPUDISTANCE.NEEDLEMAN_WUNSCH, WEBGPUDISTANCE.TANIMOTO, WEBGPUDISTANCE.COSINE, WEBGPUDISTANCE.SOKAL, WEBGPUDISTANCE.ASYMMETRIC, WEBGPUDISTANCE.OneHot, WEBGPUDISTANCE.Difference]),\n [\"INT32ARRAY\" /* WGPUENTRYTYPE.INT32ARRAY */]: new Set([WEBGPUDISTANCE.EUCLIDEAN, WEBGPUDISTANCE.MANHATTAN, WEBGPUDISTANCE.OneHot, WEBGPUDISTANCE.Difference]),\n [\"FLOAT32ARRAY\" /* WGPUENTRYTYPE.FLOAT32ARRAY */]: new Set([WEBGPUDISTANCE.EUCLIDEAN, WEBGPUDISTANCE.MANHATTAN, WEBGPUDISTANCE.Difference]),\n [\"NUMBER\" /* WGPUENTRYTYPE.NUMBER */]: new Set([WEBGPUDISTANCE.EUCLIDEAN, WEBGPUDISTANCE.MANHATTAN, WEBGPUDISTANCE.Difference]),\n [\"BITARRAY\" /* WGPUENTRYTYPE.BITARRAY */]: new Set([WEBGPUDISTANCE.TANIMOTO, WEBGPUDISTANCE.COSINE, WEBGPUDISTANCE.SOKAL, WEBGPUDISTANCE.ASYMMETRIC])\n};\n//# sourceMappingURL=webGPU-multicol-distances.js.map","var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n};\nlet gpuAdapter = null;\nlet gpuDevice = null;\nexport function getGPUDevice() {\n return __awaiter(this, void 0, void 0, function* () {\n if (!gpuAdapter) {\n //reason: only here we get the gpuAdapter\n // eslint-disable-next-line no-restricted-syntax\n gpuAdapter = yield navigator.gpu.requestAdapter({ powerPreference: 'high-performance' });\n if (gpuAdapter == null)\n return null;\n }\n let isLost = false;\n if (gpuDevice) {\n gpuDevice.lost.then(() => {\n isLost = true;\n });\n yield new Promise((r) => setTimeout(r, 10)); // wait to see if the device is lost\n }\n if (!gpuDevice || isLost) {\n const requiredBufferSize = 1000000000; // ~1000MB\n const adapterLimits = gpuAdapter.limits;\n const buffferSizeLimit = adapterLimits.maxBufferSize;\n const storageBufferSizeLimit = adapterLimits.maxStorageBufferBindingSize;\n try {\n gpuDevice = yield gpuAdapter.requestDevice({ requiredLimits: {\n maxBufferSize: Math.min(buffferSizeLimit, requiredBufferSize),\n maxStorageBufferBindingSize: Math.min(storageBufferSizeLimit, requiredBufferSize)\n } });\n return gpuDevice;\n }\n catch (e) {\n console.error('Failed to create device with required limits', e);\n gpuDevice = yield gpuAdapter.requestDevice();\n return gpuDevice;\n }\n }\n return gpuDevice;\n });\n}\nexport function getGPUAdapterDescription() {\n return __awaiter(this, void 0, void 0, function* () {\n if (!gpuAdapter) {\n // reason: only here we get the gpuAdapter\n // eslint-disable-next-line no-restricted-syntax\n gpuAdapter = yield navigator.gpu.requestAdapter();\n if (gpuAdapter == null)\n return null;\n }\n const info = yield gpuAdapter.requestAdapterInfo();\n if (!info)\n return null;\n const outString = replaceEmptyString(info.description, replaceEmptyString(info.vendor, 'No GPU description available'));\n return outString;\n });\n}\nfunction replaceEmptyString(str, replacement) {\n return !str || str == '' ? replacement : str;\n}\n//# sourceMappingURL=getGPUDevice.js.map","var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n};\nimport { WEBGSLAGGREGATION, WEBGSLAGGREGATIONFUNCTIONS, } from '../multi-col-distances/webGPU-aggregation';\nimport { WEBGPUDISTANCE, webGPUFunctions, } from '../multi-col-distances/webGPU-multicol-distances';\nimport { webGPUProcessInfo } from '../preprocessing/webGPU-process-info';\nimport { getGPUDevice } from '../getGPUDevice';\n/** generate sparse matrix based on list of lists of entries.\n * these entries are each encoded as Uint32Array or FLOAT32Array (depending on their type).\n * for example, sequences would be encoded as Uint32Array based on char code of the letter at each position.\n * [65, 66, 67, 68, 69] would be a sequence of 5 letters.\n * for chemical fingerprints, it would be a binary array of 0s and 1s,\n * represented as Uint32Array(_data property of DG bitarray).\n *\n * Be ware that size of entryList, distanceMetrics, weights and options must be the same.\n * if there are no options for entries i, pass an empty object.\n * for now options are needed for\n * needleman-wunsch and monomer chemical distances: see {@link BioDistanceFnOptions} as for how it should be passed\n * numeric distances (Difference): {range: number} where range is the range of the values in the column (max - min).\n * in both cases, if options are not provided, they will be calculated automatically.\n */\nexport function multiColWebGPUSparseMatrix(entryList, // list of lists of entries, for multiple columns\nthreshold = 0.8, // similarity threshold, be ware that if you use too small threshold, there might be memory overflow...\ndistanceMetrics, // distance metrics for each column\naggregationFunction, // aggregation function for the distances\nweights, // weights for each column\noptions // supplementary options for each column\n) {\n return __awaiter(this, void 0, void 0, function* () {\n const device = yield getGPUDevice();\n if (!device)\n return null; // if no device, return null, as we cannot do anything without it.\n const availableDistanceMetrics = Object.values(WEBGPUDISTANCE);\n if (distanceMetrics.some((metric) => !availableDistanceMetrics.includes(metric)))\n throw new Error('Invalid distance metrics provided: ' + distanceMetrics.join(', '));\n const availableAggregationFunctions = Object.values(WEBGSLAGGREGATION);\n if (!availableAggregationFunctions.includes(aggregationFunction))\n throw new Error('Invalid aggregation function provided: ' + aggregationFunction);\n const maxDistance = 1 - threshold; // maximum distance\n // first, check that all the supplementary options are provided and are the same length:\n if (options.length !== entryList.length ||\n options.length !== distanceMetrics.length ||\n options.length !== weights.length) {\n throw new Error('Options, weigths and distance functions must be provided for each column');\n }\n // check that all the entry lists are the same length\n if (entryList.some((list) => list.length !== entryList[0].length))\n throw new Error('All entry lists must be the same length');\n const numOfColumns = entryList.length; // number of columns\n const listSize = entryList[0].length; // size of each list (or column)\n const processInfo = entryList.map((entry, i) => {\n return webGPUProcessInfo(entry, distanceMetrics[i], i, options[i]);\n });\n if (numOfColumns === 0) {\n throw new Error('No columns provided. Please provide at least one column of data.');\n }\n if (numOfColumns === 1)\n aggregationFunction = WEBGSLAGGREGATION.MANHATTAN; // save a bit of time\n // combine all struct types into one to put into the suppInfo struct.\n let suppInfoWgsl = processInfo\n .map((info) => info.suppInfoStructWgsl)\n .filter((wgsl) => !!wgsl && wgsl != '')\n .join(',\\n');\n // structures in wgsl must have at least one member, so if we have no structures, we need to add a dummy one\n let needsDummy = false;\n if (!suppInfoWgsl || suppInfoWgsl.trim() == '') {\n needsDummy = true;\n suppInfoWgsl = '\\ndummy: f32\\n';\n }\n // combine all data wgsl struct code into one\n const dataWgsl = processInfo.map((info) => info.dataStructWgsl).filter((wgsl) => !!wgsl && wgsl != '').join(',\\n');\n // combine all array sizes into one array (easier for setting)\n const arraySizes = new Uint32Array(numOfColumns * listSize);\n processInfo.forEach((info, i) => {\n arraySizes.set(info.arraySizes, i * listSize);\n }); // array.flat is not as optimized as this\n // if we try to map large arrays directly from GPU, sometimes, device disconnects. so we need to do it in chunks, a good number\n // we found is 10000. So we will perform computations in chunks of 10000. meaning that we will dispatch 10000 threads at a time.\n const numOfThreads = 10000;\n // in this case we do not need to worry about complexity of the algorithm, as the 100 is low enaugh number, which is limited by memory usage.\n const sparseResultSizePerThread = 100; // number of iterations per thread (number of pair comparisons)\n const combinedComplexity = processInfo.reduce((a, b) => a + b.complexity, 0); // combined complexity of all the columns\n const maxIterationsPerThread = Math.ceil(6000 / combinedComplexity); // maximum number of iterations per thread\n const workGroupDivision = 10; // how many threads inside of one workgroup dimension (in this case 10 * 10 threads per workgroup)\n const threadsPerWorkgroup = workGroupDivision * workGroupDivision;\n const workgroupsDim = Math.ceil(Math.sqrt(Math.ceil(numOfThreads / threadsPerWorkgroup))); // how many workgroups per 2d dimension\n const globalThreadDimSize = workgroupsDim * workGroupDivision; // how many threads per 2d dimension\n const condensedDistanceMatrixSize = listSize * (listSize - 1) / 2; // size of the condensed distance matrix, this many comparisons will be made.\n const dmChunkSizePerThread = Math.ceil(condensedDistanceMatrixSize / numOfThreads); // how many comparisons per thread\n const module = device.createShaderModule({\n label: 'Sparse matrix compute shader',\n code: `\n // each thread will perform ${sparseResultSizePerThread} iterations at one time, comparing ${sparseResultSizePerThread} pairs of entries.\n // in total, each thread will perform at most ${dmChunkSizePerThread} comparisons.\n // first is the result struct, containing is, js, and distances. each array with length of ${sparseResultSizePerThread},\n // and also integer for how many pairs were found to be below threshold.\n struct SparseResult {\n i: array<array<u32, ${sparseResultSizePerThread}>, ${numOfThreads}>,\n j: array<array<u32, ${sparseResultSizePerThread}>, ${numOfThreads}>,\n distances: array<array<f32, ${sparseResultSizePerThread}>, ${numOfThreads}>,\n found: array<u32, ${numOfThreads}>,\n done: array<u32, ${numOfThreads}>\n }\n // struct for the data\n struct ComputeInfo {\n // start at cols and rows, and end at cols and rows for each thread, these will be calculated on cpu and passed to gpu.\n startAtCols: array<u32, ${numOfThreads}>,\n startAtRows: array<u32, ${numOfThreads}>,\n endAtCols: array<u32, ${numOfThreads}>,\n endAtRows: array<u32, ${numOfThreads}>,\n\n // the ACTUALLY sizes of each entry\n entrySizes: array<array<u32, ${listSize}>, ${numOfColumns}>,\n // the weights for each entry\n weights: array<f32, ${numOfColumns}>,\n // the data for each entry\n ${dataWgsl} // an example of the dataWgsl would be:\n //data0: array<array<u32,20>,100>,\n //data1: array<array<u32,20>,100>\n }\n\n // struct for the supplementary information\n struct SuppInfo {\n // struct containing all the supplementary info, like scoring matrix, alphabet indexes, range, etc.\n ${suppInfoWgsl}\n };\n\n @group(0) @binding(0) var<storage, read_write> computeInfo: ComputeInfo;\n @group(0) @binding(1) var<storage, read_write> suppInfo: SuppInfo;\n @group(0) @binding(2) var<storage, read_write> results: SparseResult;\n @compute @workgroup_size(${workGroupDivision}, ${workGroupDivision}) fn calcSparseMatrix(\n @builtin(global_invocation_id) id: vec3<u32>\n ) {\n ${needsDummy ? `let otherDummy = suppInfo.dummy * 2;` : ''} // just to make sure that the suppInfo is not optimized out\n let threadCol = id.x;\n let threadRow = id.y;\n let linearIndex = threadRow * ${globalThreadDimSize} + threadCol;\n if (linearIndex >= ${numOfThreads}) {\n return; // if we are out of bounds, return\n } \n var startAtCol: u32 = computeInfo.startAtCols[linearIndex];\n var startAtRow: u32 = computeInfo.startAtRows[linearIndex];\n let endAtCol: u32 = min(computeInfo.endAtCols[linearIndex], ${listSize}u);\n let endAtRow: u32 = min(computeInfo.endAtRows[linearIndex], ${listSize}u);\n let is = &results.i[linearIndex];\n let js = &results.j[linearIndex];\n let distances = &results.distances[linearIndex];\n results.found[linearIndex] = 0; // initialize the found counter\n var found: u32 = 0;\n if (results.done[linearIndex] > 0) {\n return; // if we are done, return\n }\n for (var i = 0; i < ${maxIterationsPerThread}; i++) {\n if (startAtCol >= endAtCol && startAtRow >= endAtRow) {\n results.done[linearIndex] = 1;\n break;\n }\n if (found >= ${sparseResultSizePerThread}) {\n break;\n }\n let dist = combinedDistance(startAtCol, startAtRow);\n if (dist <= ${maxDistance}) {\n (*is)[found] = startAtCol;\n (*js)[found] = startAtRow;\n (*distances)[found] = dist;\n found = found + 1;\n }\n startAtCol = startAtCol + 1;\n if (startAtCol >= ${listSize}u) {\n startAtRow += 1;\n startAtCol = startAtRow + 1;\n }\n }\n results.found[linearIndex] = found;\n // update the startAtCols and startAtRows\n computeInfo.startAtCols[linearIndex] = startAtCol;\n computeInfo.startAtRows[linearIndex] = startAtRow;\n\n }\n\n // this will generate the distance script for each distance metric and then combine them into one\n ${getCombinedDistanceScript(distanceMetrics, processInfo.map((info) => info.maxEntryLen), maxDistance, aggregationFunction)}\n\n\n `\n });\n const pipeline = device.createComputePipeline({\n label: 'sparse matrix compute pipeline',\n layout: 'auto',\n compute: {\n module,\n entryPoint: 'calcSparseMatrix',\n },\n });\n // generate startAtCols, startAtRows, endAtCols, endAtRows\n const startAtCols = new Uint32Array(numOfThreads);\n const startAtRows = new Uint32Array(numOfThreads);\n const endAtCols = new Uint32Array(numOfThreads);\n const endAtRows = new Uint32Array(numOfThreads);\n const chunkSize = Math.floor(condensedDistanceMatrixSize / numOfThreads); // size of the chunk per thread (in total)\n let startRow = 0;\n let startCol = 1;\n console.time('GPUthreadStarts');\n for (let i = 0; i < numOfThreads; i++) {\n const endIdx = i === numOfThreads - 1 ? condensedDistanceMatrixSize - 1 : (i + 1) * chunkSize;\n // fancy formulas to calculate the start and end indices for the condensed distance matrix for each thread start\n const endRow = listSize - 2 - Math.floor(Math.sqrt(-8 * endIdx + 4 * listSize * (listSize - 1) - 7) / 2 - 0.5);\n const endCol = endIdx - listSize * endRow + Math.floor((endRow + 1) * (endRow + 2) / 2);\n startAtCols[i] = startCol;\n startAtRows[i] = startRow;\n endAtCols[i] = endCol;\n endAtRows[i] = endRow;\n startRow = endRow;\n startCol = endCol;\n // const startRow = values[0].length - 2 - Math.floor(\n // Math.sqrt(-8 * startIdx + 4 * values[0].length * (values[0].length - 1) - 7) / 2 - 0.5);\n // const startCol = startIdx - values[0].length * startRow + Math.floor((startRow + 1) * (startRow + 2) / 2);\n }\n console.timeEnd('GPUthreadStarts');\n // size of the computeInfo buffer\n const computeInfoBuffer32Size = numOfThreads * 4 + // startAtCols, startAtRows, endAtCols, endAtRows\n listSize * numOfColumns + // entrySizes\n numOfColumns + // weights\n processInfo.reduce((a, b) => a + b.sourceArraySize, 0);\n // size of the suppInfo buffer\n const suppInfoBuffer32Size = processInfo.reduce((a, b) => a + b.suppInfoSize, 0);\n // size of the results buffer\n const sparseMatrixEachArray32Size = sparseResultSizePerThread * numOfThreads;\n const resultsBuffer32Size = 3 * sparseMatrixEachArray32Size + numOfThreads + numOfThreads; // i, j, distances, found, done\n // create a buffer on the GPU to hold computeInfo\n // beware that struct must be padded to 16 bytes, so we need to calculate the size of the struct in 32bit values\n const computeInfoBufferSize = computeInfoBuffer32Size * Uint32Array.BYTES_PER_ELEMENT;\n let paddedComputeInfoBufferSize = computeInfoBufferSize;\n const remainder = computeInfoBufferSize & 15; // check if the size is a multiple of 16\n if (remainder !== 0)\n paddedComputeInfoBufferSize += 16 - remainder; // pad the size accordingly\n const computeInfoBuffer = device.createBuffer({\n label: 'compute info buffer',\n size: paddedComputeInfoBufferSize,\n usage: GPUBufferUsage.STORAGE |\n GPUBufferUsage.COPY_SRC |\n GPUBufferUsage.COPY_DST,\n mappedAtCreation: true,\n });\n const mappedComputeInfoArrayBuffer = computeInfoBuffer.getMappedRange(); // get full buffer\n // dynamic offset for the computeInfo buffer\n let computeInfoOffSet = 0;\n // first write the startAtCols, startAtRows, endAtCols, endAtRows\n const startAtColsBufferView = new Uint32Array(mappedComputeInfoArrayBuffer, computeInfoOffSet, numOfThreads);\n startAtColsBufferView.set(startAtCols);\n computeInfoOffSet += numOfThreads * Uint32Array.BYTES_PER_ELEMENT; // array of 32bit values\n const startAtRowsBufferView = new Uint32Array(mappedComputeInfoArrayBuffer, computeInfoOffSet, numOfThreads);\n startAtRowsBufferView.set(startAtRows);\n computeInfoOffSet += numOfThreads * Uint32Array.BYTES_PER_ELEMENT; // array of 32bit values\n const endAtColsBufferView = new Uint32Array(mappedComputeInfoArrayBuffer, computeInfoOffSet, numOfThreads);\n endAtColsBufferView.set(endAtCols);\n computeInfoOffSet += numOfThreads * Uint32Array.BYTES_PER_ELEMENT; // array of 32bit values\n const endAtRowsBufferView = new Uint32Array(mappedComputeInfoArrayBuffer, computeInfoOffSet, numOfThreads);\n endAtRowsBufferView.set(endAtRows);\n computeInfoOffSet += numOfThreads * Uint32Array.BYTES_PER_ELEMENT; // array of 32bit values\n // then write the entrySizes\n const entrySizesView = new Uint32Array(mappedComputeInfoArrayBuffer, computeInfoOffSet, arraySizes.length);\n entrySizesView.set(arraySizes);\n computeInfoOffSet += arraySizes.length * Uint32Array.BYTES_PER_ELEMENT; // array of 32bit values\n // then write the weights\n const weightsView = new Float32Array(mappedComputeInfoArrayBuffer, computeInfoOffSet, numOfColumns);\n weightsView.set(weights);\n computeInfoOffSet += numOfColumns * Float32Array.BYTES_PER_ELEMENT;\n // finally, write the data itself\n for (const info of processInfo) {\n const ArrayConstructor = info.EncodedArrayConstructor;\n const chunkSize = info.sourceArraySize;\n const dataView = new ArrayConstructor(mappedComputeInfoArrayBuffer, computeInfoOffSet, chunkSize); //new ArrayConstructor(computeInfoBuffer.getMappedRange(computeInfoOffSet, chunkByteSize));\n dataView.set(info.flatSourceArray);\n computeInfoOffSet += chunkSize * ArrayConstructor.BYTES_PER_ELEMENT;\n }\n // we are done at this point.\n computeInfoBuffer.unmap();\n // create a buffer on the GPU to hold suppInfo\n // same here, we need to pad the size of the struct to 16 bytes\n const suppInfoBufferSize = suppInfoBuffer32Size * Uint32Array.BYTES_PER_ELEMENT;\n let paddedSuppInfoBufferSize = suppInfoBufferSize;\n const suppInfoRemainder = suppInfoBufferSize & 15; // check if the size is a multiple of 16\n if (suppInfoRemainder !== 0)\n paddedSuppInfoBufferSize += 16 - suppInfoRemainder; // pad the size accordingly\n paddedSuppInfoBufferSize = Math.max(paddedSuppInfoBufferSize, 16);\n const suppInfoBuffer = device.createBuffer({\n label: 'supp info buffer',\n size: paddedSuppInfoBufferSize,\n usage: GPUBufferUsage.STORAGE |\n GPUBufferUsage.COPY_SRC |\n GPUBufferUsage.COPY_DST,\n mappedAtCreation: true,\n });\n const mappedSuppInfoArrayBuffer = suppInfoBuffer.getMappedRange(); // get full buffer\n let suppInfoOffSet = 0;\n for (const info of processInfo) {\n if (info.suppInfoBuffer && info.suppInfoBuffer.byteLength > 0 && info.suppInfoSize > 0) {\n const ArrayConstructor = info.suppInfoType === \"UINT32ARRAY\" /* WGPUENTRYTYPE.UINT32ARRAY */ ? Uint32Array : Float32Array;\n const suppInfoView = new ArrayConstructor(mappedSuppInfoArrayBuffer, suppInfoOffSet, info.suppInfoBuffer.length); //new ArrayConstructor(suppInfoBuffer.getMappedRange(suppInfoOffSet, info.suppInfoBuffer.byteLength));\n suppInfoView.set(info.suppInfoBuffer);\n suppInfoOffSet += info.suppInfoBuffer.byteLength; // info.suppInfoBuffer.length * ArrayConstructor.BYTES_PER_ELEMENT;\n }\n }\n if (suppInfoOffSet === 0) {\n const dummyView = new Uint32Array(mappedSuppInfoArrayBuffer, 0, 4); //new Uint32Array(suppInfoBuffer.getMappedRange(0, 16));\n dummyView.set([1, 1, 1, 1]);\n }\n suppInfoBuffer.unmap();\n // create a buffer for the results\n const resultsBufferSize = resultsBuffer32Size * Uint32Array.BYTES_PER_ELEMENT;\n let paddedResultsBufferSize = resultsBufferSize;\n const resultsRemainder = resultsBufferSize & 15; // check if the size is a multiple of 16\n if (resultsRemainder !== 0)\n paddedResultsBufferSize += 16 - resultsRemainder; // pad the size accordingly\n const resultsBuffer = device.createBuffer({\n label: 'results buffer',\n size: paddedResultsBufferSize,\n usage: GPUBufferUsage.STORAGE |\n GPUBufferUsage.COPY_SRC\n });\n // Setup a bindGroup to tell the shader which\n // buffer to use for the computation\n const bindGroup = device.createBindGroup({\n label: 'bindGroup for sparse matrix buffer',\n layout: pipeline.getBindGroupLayout(0),\n entries: [\n { binding: 0, resource: { buffer: computeInfoBuffer } },\n { binding: 1, resource: { buffer: suppInfoBuffer } },\n { binding: 2, resource: { buffer: resultsBuffer } },\n ],\n });\n //const pairComparisonsPerPass = maxIterationsPerThread * numOfThreads;\n //const passes = Math.ceil(condensedDistanceMatrixSize / pairComparisonsPerPass);\n // we will distpatch this many passes to the GPU, and it will handle indexes all by itself.\n // we already copied the start/end information to it, so it will know where to start and end on each pass.\n const resultsOutBuffer = device.createBuffer({\n label: 'results out buffer',\n size: resultsBuffer.size,\n usage: GPUBufferUsage.MAP_READ | GPUBufferUsage.COPY_DST,\n });\n const resultIs = [];\n const resultJs = [];\n const resultDistances = [];\n //let combinedFound = 0;\n let isAllDone = false;\n while (!isAllDone) {\n // Encode commands to do the computation\n const encoder = device.createCommandEncoder({\n label: 'distance encoder',\n });\n const pass = encoder.beginComputePass({\n label: 'distance compute pass',\n });\n pass.setPipeline(pipeline);\n pass.setBindGroup(0, bindGroup);\n pass.dispatchWorkgroups(workgroupsDim, workgroupsDim);\n pass.end();\n encoder.copyBufferToBuffer(resultsBuffer, 0, resultsOutBuffer, 0, resultsOutBuffer.size);\n // Finish encoding and submit the commands\n const commandBuffer = encoder.finish();\n device.queue.submit([commandBuffer]);\n // Read the results\n yield device.queue.onSubmittedWorkDone();\n yield resultsOutBuffer.mapAsync(GPUMapMode.READ);\n const resultsOutArrayBuffer = resultsOutBuffer.getMappedRange();\n // read the results\n let resultOffset = 0;\n const resultsI = new Uint32Array(resultsOutArrayBuffer, resultOffset, sparseMatrixEachArray32Size);\n resultOffset += sparseMatrixEachArray32Size * Uint32Array.BYTES_PER_ELEMENT;\n const resultsJ = new Uint32Array(resultsOutArrayBuffer, resultOffset, sparseMatrixEachArray32Size);\n resultOffset += sparseMatrixEachArray32Size * Uint32Array.BYTES_PER_ELEMENT;\n const resultsDistances = new Float32Array(resultsOutArrayBuffer, resultOffset, sparseMatrixEachArray32Size);\n resultOffset += sparseMatrixEachArray32Size * Float32Array.BYTES_PER_ELEMENT;\n const resultsFound = new Uint32Array(resultsOutArrayBuffer, resultOffset, numOfThreads);\n resultOffset += numOfThreads * Uint32Array.BYTES_PER_ELEMENT;\n const resultsDone = new Uint32Array(resultsOutArrayBuffer, resultOffset, numOfThreads);\n isAllDone = resultsDone.every((d) => d === 1);\n const totalResults = resultsFound.reduce((a, b) => a + b, 0);\n const combinedI = new Uint32Array(totalResults);\n const combinedJ = new Uint32Array(totalResults);\n const combinedDistances = new Float32Array(totalResults);\n let combinedOffset = 0;\n for (let resI = 0; resI < resultsFound.length; resI++) {\n const found = resultsFound[resI];\n if (found === 0)\n continue;\n combinedI.set(resultsI.subarray(resI * sparseResultSizePerThread, resI * sparseResultSizePerThread + found), combinedOffset);\n combinedJ.set(resultsJ.subarray(resI * sparseResultSizePerThread, resI * sparseResultSizePerThread + found), combinedOffset);\n combinedDistances.set(resultsDistances.subarray(resI * sparseResultSizePerThread, resI * sparseResultSizePerThread + found), combinedOffset);\n combinedOffset += found;\n }\n resultIs.push(combinedI);\n resultJs.push(combinedJ);\n resultDistances.push(combinedDistances);\n resultsOutBuffer.unmap();\n }\n const totalSize = resultIs.reduce((a, b) => a + b.length, 0);\n const finalI = new Uint32Array(totalSize);\n const finalJ = new Uint32Array(totalSize);\n const finalDistances = new Float32Array(totalSize);\n let finalOffset = 0;\n for (let i = 0; i < resultIs.length; i++) {\n finalI.set(resultIs[i], finalOffset);\n finalJ.set(resultJs[i], finalOffset);\n finalDistances.set(resultDistances[i], finalOffset);\n finalOffset += resultIs[i].length;\n }\n // as rule mandates, destroy all buffers.\n computeInfoBuffer.destroy();\n suppInfoBuffer.destroy();\n resultsBuffer.destroy();\n resultsOutBuffer.destroy();\n return { i: finalI, j: finalJ, distance: finalDistances };\n });\n}\nfunction getCombinedDistanceScript(distanceMetrics, maxEntryLens, maxDistance, aggregation) {\n const distanceWgsls = distanceMetrics.map((metric, i) => {\n return `\n fn distanceScript${i}(aIndex: u32, bIndex: u32) -> f32 {\n let a = computeInfo.data${i}[aIndex];\n let b = computeInfo.data${i}[bIndex];\n let maxDistance: f32 = ${maxDistance};\n ${webGPUFunctions[metric](maxEntryLens[i], i)}\n }\n `;\n });\n const allDistanceScripts = distanceWgsls.join('\\n');\n const combineDistancesScript = `\n fn combinedDistance(aIndex: u32, bIndex: u32) -> f32 {\n var distances: array<f32, ${distanceMetrics.length}>;\n ${distanceMetrics.map((_, i) => `distances[${i}] = distanceScript${i}(aIndex, bIndex);`).join('\\n')}\n ${WEBGSLAGGREGATIONFUNCTIONS[aggregation](distanceMetrics.length)}\n }\n \n `;\n return allDistanceScripts + '\\n' + combineDistancesScript;\n}\n//# sourceMappingURL=webGPU-sparse-matrix.js.map","/* eslint-disable max-len */\nimport { distanceFunctionComplexity, TypeSupportedDistances, WEBGPUDISTANCE } from '../multi-col-distances/webGPU-multicol-distances';\nexport function webGPUProcessInfo(entryList, distanceMetric = WEBGPUDISTANCE.HAMMING, entryIndex, // index of the entries in the list of lists that we want to process\noptions = { gapOpenPenalty: 1.0, gapExtensionPenalty: 0.6 }) {\n var _a, _b;\n let entryType = null;\n const encodedList = (() => {\n if (entryList.some((e) => typeof e === 'string')) {\n entryType = \"STRING\" /* WGPUENTRYTYPE.STRING */;\n return entryList.map((entry) => new Uint32Array(entry.split('').map((c) => c.charCodeAt(0))));\n }\n if (entryList.some((e) => typeof e === 'number')) {\n entryType = \"NUMBER\" /* WGPUENTRYTYPE.NUMBER */;\n return entryList.map((entry) => new Float32Array([entry]));\n }\n if (typeof entryList[0] == 'object' && entryList.some((e) => '_data' in e && '_length' in e)) {\n entryType = \"BITARRAY\" /* WGPUENTRYTYPE.BITARRAY */;\n return entryList.map((entry) => entry._data);\n }\n if (entryList.some((e) => e instanceof Float32Array)) {\n entryType = \"FLOAT32ARRAY\" /* WGPUENTRYTYPE.FLOAT32ARRAY */;\n return entryList;\n }\n if (entryList.some((e) => e instanceof Uint32Array)) {\n entryType = \"UINT32ARRAY\" /* WGPUENTRYTYPE.UINT32ARRAY */;\n return entryList;\n }\n if (entryList.some((e) => e instanceof Int32Array)) {\n entryType = \"INT32ARRAY\" /* WGPUENTRYTYPE.INT32ARRAY */;\n return entryList;\n }\n //return entryList as Uint32Array[];\n })();\n if (!encodedList || !entryType)\n throw new Error('Invalid entry type, could not determine entry type from input list');\n const encodedListType = encodedList[0] instanceof Int32Array ? \"INT32ARRAY\" /* WGPUENTRYTYPE.INT32ARRAY */ :\n encodedList[0] instanceof Float32Array ? \"FLOAT32ARRAY\" /* WGPUENTRYTYPE.FLOAT32ARRAY */ : \"UINT32ARRAY\" /* WGPUENTRYTYPE.UINT32ARRAY */;\n // sizes of each entries might differ, so we need to keep track of that for some distance metrics, like hamming for example\n const arraySizes = new Uint32Array(encodedList.map((arr) => arr.length));\n if (!TypeSupportedDistances[entryType] || !TypeSupportedDistances[entryType].has(distanceMetric))\n throw new Error(`Distance metric '${distanceMetric}' not supported for entry type '${entryType}'`);\n const maxEntryLen = arraySizes.reduce((a, b) => Math.max(a, b), 0);\n // get the complexity of used algorithm\n const complexity = distanceFunctionComplexity[distanceMetric](maxEntryLen);\n const EncodedArrayConstructor = encodedListType === \"INT32ARRAY\" /* WGPUENTRYTYPE.INT32ARRAY */ ? Int32Array :\n (encodedListType === \"FLOAT32ARRAY\" /* WGPUENTRYTYPE.FLOAT32ARRAY */ ? Float32Array : Uint32Array);\n const flatSourceArray = new EncodedArrayConstructor(encodedList.length * maxEntryLen);\n // when setting, we need to set each array at a specific offset, which is controlled by maxArrayLen because each array might have different sizes.\n // this way we will get correct matrix representation in the compute shader\n encodedList.forEach((seq, i) => {\n flatSourceArray.set(seq, i * maxEntryLen);\n });\n // NB! all this before the line was generic, now we need to calculate some specific things for some specific distance metrics\n // initialize supp info line that will be included in the final shader;\n let suppInfoStructWgsl = ''; // the code that will be included in the struct of suppInfo\n let suppInfoSize = 0;\n let suppInfoType = \"FLOAT32ARRAY\" /* WGPUENTRYTYPE.FLOAT32ARRAY */;\n let suppInfoBuffer = null;\n if (distanceMetric === WEBGPUDISTANCE.NEEDLEMAN_WUNSCH || distanceMetric === WEBGPUDISTANCE.MONOMER_CHEMICAL_DISTANCE) {\n let maxMonomerIndex = options.scoringMatrix && options.alphabetIndexes ?\n Object.keys(options.alphabetIndexes).reduce((prev, n) => Math.max(prev, n.charCodeAt(0)), 0) : -1;\n // generate default similarity matrix if it is not provided\n if (!options.alphabetIndexes || !options.scoringMatrix) {\n for (let i = 0; i < flatSourceArray.length; i++) {\n if (flatSourceArray[i] > maxMonomerIndex)\n maxMonomerIndex = flatSourceArray[i];\n }\n options.scoringMatrix =\n new Array(maxMonomerIndex + 1).fill(null).map(() => new Array(maxMonomerIndex + 1).fill(0));\n options.alphabetIndexes = {};\n for (let i = 0; i < options.scoringMatrix.length; i++) {\n options.scoringMatrix[i][i] = 1;\n options.alphabetIndexes[String.fromCharCode(i)] = i;\n }\n }\n const similarityMatrixSize = (maxMonomerIndex + 1) * (maxMonomerIndex + 1);\n const transferedSimilarityMatrix = new Array(maxMonomerIndex + 1).fill(null).map(() => new Float32Array(maxMonomerIndex + 1));\n // set diagonal to 1\n for (let i = 0; i < maxMonomerIndex + 1; i++)\n transferedSimilarityMatrix[i][i] = 1;\n const alphabetIndexes = options.alphabetIndexes;\n for (const key of Object.keys(alphabetIndexes)) {\n for (const key2 of Object.keys(alphabetIndexes)) {\n if (key === key2)\n continue;\n transferedSimilarityMatrix[key.charCodeAt(0)][key2.charCodeAt(0)] =\n options.scoringMatrix[alphabetIndexes[key]][alphabetIndexes[key2]];\n }\n }\n // in memory layout, we will have 2 float32 s for gapOpen and gapExtension penalties, and then f32 array<array<f32>> for similarity matrix.\n // because of primitives, there will be no padding, so we can calculate the size directly\n suppInfoSize = 2 + similarityMatrixSize;\n suppInfoType = \"FLOAT32ARRAY\" /* WGPUENTRYTYPE.FLOAT32ARRAY */;\n suppInfoBuffer = new Float32Array(suppInfoSize);\n suppInfoBuffer[0] = (_a = options.gapOpenPenalty) !== null && _a !== void 0 ? _a : 1.0;\n suppInfoBuffer[1] = (_b = options.gapExtensionPenalty) !== null && _b !== void 0 ? _b : 0.6;\n let offset = 2;\n for (let i = 0; i < transferedSimilarityMatrix.length; i++) {\n suppInfoBuffer.set(transferedSimilarityMatrix[i], offset);\n offset += transferedSimilarityMatrix[i].length;\n }\n suppInfoStructWgsl = `\n gapOpenPenalty${entryIndex}: f32,\n gapExtensionPenalty${entryIndex}: f32,\n similarityMatrix${entryIndex}: array<array<f32, ${maxMonomerIndex + 1}>, ${maxMonomerIndex + 1}>`;\n }\n else if (distanceMetric === WEBGPUDISTANCE.Difference) {\n // for difference, we need range of values for normalization of the difference\n if (!options.range || typeof options.range !== 'number' || options.range <= 0) {\n const min = flatSourceArray.reduce((a, b) => Math.min(a, b), flatSourceArray[0]);\n const max = flatSourceArray.reduce((a, b) => Math.max(a, b), flatSourceArray[0]);\n options.range = max - min;\n }\n if (options.range <= 0)\n options.range = 1.0; // this means that all values are the same, and all distances will produce 0.\n suppInfoSize = 1;\n suppInfoType = \"FLOAT32ARRAY\" /* WGPUENTRYTYPE.FLOAT32ARRAY */;\n suppInfoBuffer = new Float32Array([options.range]);\n suppInfoStructWgsl = `\n range${entryIndex}: f32`;\n }\n const dataTypeWGSL = flatSourceArray instanceof Int32Array ? 'i32' : (flatSourceArray instanceof Float32Array ? 'f32' : 'u32');\n const dataStructWgsl = `data${entryIndex}: array<array<${dataTypeWGSL}, ${maxEntryLen}>, ${encodedList.length}>`;\n // for now, other distances do not require any additional information, so we can skip that\n return {\n flatSourceArray,\n sourceArraySize: flatSourceArray.length,\n maxEntryLen,\n arraySizes,\n complexity,\n suppInfoBuffer,\n suppInfoSize,\n suppInfoType: suppInfoType,\n suppInfoStructWgsl,\n entryType,\n dataTypeWGSL,\n dataStructWgsl,\n EncodedArrayConstructor\n };\n}\n//# sourceMappingURL=webGPU-process-info.js.map","import { getWebColaLayot } from './webCola';\nexport function bioLayout(cluster, sparseObject, _threshold, subCluster) {\n const n = cluster.length;\n const is = [];\n const js = [];\n for (let i = 0; i < n; i++) {\n for (let j = i + 1; j < n; j++) {\n const a = cluster[i];\n const b = cluster[j];\n if ((sparseObject[a]?.[b] ?? 0) > 0) {\n is.push(i);\n js.push(j);\n }\n }\n }\n return getWebColaLayot(is, js, cluster, subCluster);\n}\n// legacy\nfunction _getLayoutEmbeddings(is, js, cluster, subCluster) {\n // count number of unique clusters\n const clusterSet = new Map();\n let counter = 0;\n for (const c of cluster) {\n if (!clusterSet.has(subCluster[c]))\n clusterSet.set(subCluster[c], counter++);\n }\n const localConnectivity = {};\n const interConnectivity = {};\n // how many connections between clusters\n const interClusterConnectivity = {};\n for (let i = 0; i < is.length; i++) {\n if (subCluster[is[i]] === subCluster[js[i]]) {\n localConnectivity[is[i]] = (localConnectivity[is[i]] ?? 0) + 1;\n localConnectivity[js[i]] = (localConnectivity[js[i]] ?? 0) + 1;\n }\n else {\n interConnectivity[subCluster[is[i]]] = (interConnectivity[subCluster[is[i]]] ?? 0) + 1;\n interConnectivity[subCluster[js[i]]] = (interConnectivity[subCluster[js[i]]] ?? 0) + 1;\n interClusterConnectivity[subCluster[is[i]]] = interClusterConnectivity[subCluster[is[i]]] ?? {};\n interClusterConnectivity[subCluster[is[i]]][subCluster[js[i]]] = (interClusterConnectivity[subCluster[is[i]]][subCluster[js[i]]] ?? 0) + 1;\n interClusterConnectivity[subCluster[js[i]]] = interClusterConnectivity[subCluster[js[i]]] ?? {};\n interClusterConnectivity[subCluster[js[i]]][subCluster[is[i]]] = (interClusterConnectivity[subCluster[js[i]]][subCluster[is[i]]] ?? 0) + 1;\n }\n }\n const numSubClusters = clusterSet.size;\n // we need to start with embeddings such that different subclusters are separated\n // we will start with grid that can accommodate all subclusters on its perimeter\n // perimeter of the grid is 2 * numCols + 2 * numRows - 4\n // lets say we have square grid, then the perimeter is 4 * numCols - 4\n // so numCols = (perimeter + 4) / 4\n // const numCols = Math.ceil((numSubClusters + 4) / 4);\n // const numRows = numCols;\n const embedSize = 2;\n // const emptySpaceMultiplier = 2;\n const embedX = new Float32Array(cluster.length).fill(0).map((_, _i) => {\n // const clusterNum = clusterSet.get(subCluster[cluster[i]])!;\n // if (clusterNum < numCols)\n // return (clusterNum % numCols) * embedSize * emptySpaceMultiplier + Math.random() * embedSize;\n // if (clusterNum < numCols + (numRows - 2) * 2)\n // return ((clusterNum - numCols) % 2) * (numCols - 1) * embedSize * emptySpaceMultiplier + Math.random() * embedSize;\n // return ((clusterNum - numCols + (numRows - 2) * 2) % numCols) * embedSize * emptySpaceMultiplier + Math.random() * embedSize;\n return Math.random() * embedSize;\n });\n const embedY = new Float32Array(cluster.length).fill(0).map((_, _i) => {\n // const clusterNum = clusterSet.get(subCluster[cluster[i]])!;\n // if (clusterNum < numCols)\n // return Math.random() * embedSize;\n // if (clusterNum < numCols + (numRows - 2) * 2)\n // return Math.floor((clusterNum - numCols) / 2 + 1) * embedSize * emptySpaceMultiplier + Math.random() * embedSize;\n // return (numRows - 1) * embedSize * emptySpaceMultiplier + Math.random() * embedSize;\n return Math.random() * embedSize;\n });\n const iterations = 100;\n const xVelocities = new Float32Array(cluster.length).fill(0);\n const yVelocities = new Float32Array(cluster.length).fill(0);\n // loop 2 for subClusters\n for (let i = 0; i < iterations; i++) {\n const temperature = (1 - i / iterations);\n //xVelocities.fill(0);\n //yVelocities.fill(0);\n // loop one for inner cluster layout\n for (let idx = 0; idx < is.length; idx++) {\n const a = is[idx];\n const b = js[idx];\n if (subCluster[a] !== subCluster[b])\n continue;\n const diffX = embedX[a] - embedX[b];\n const diffY = embedY[a] - embedY[b];\n const dxa = diffX / localConnectivity[a];\n const dya = diffY / localConnectivity[a];\n const dxb = diffX / localConnectivity[b];\n const dyb = diffY / localConnectivity[b];\n const inverseForceXa = (0.2 - Math.abs(diffX)) / localConnectivity[a] * sign(diffX);\n const inverseForceYa = (0.2 - Math.abs(diffY)) / localConnectivity[a] * sign(diffY);\n const inverseForceXb = (0.2 - Math.abs(diffX)) / localConnectivity[b] * sign(diffX);\n const inverseForceYb = (0.2 - Math.abs(diffY)) / localConnectivity[b] * sign(diffY);\n if (Math.abs(diffX) > 0.01) {\n xVelocities[a] -= dxa;\n xVelocities[b] += dxb;\n }\n else {\n xVelocities[a] += inverseForceXa;\n xVelocities[b] -= inverseForceXb;\n }\n if (Math.abs(diffY) > 0.01) {\n yVelocities[a] -= dya;\n yVelocities[b] += dyb;\n }\n else {\n yVelocities[a] += inverseForceYa;\n yVelocities[b] -= inverseForceYb;\n }\n // yVelocities[a] -= dy;\n // yVelocities[b] += dy;\n }\n for (let idx = 0; idx < cluster.length; idx++) {\n xVelocities[idx] *= temperature;\n yVelocities[idx] *= temperature;\n embedX[idx] += xVelocities[idx];\n embedY[idx] += yVelocities[idx];\n }\n }\n // rescale each subClaster\n // first fit everything in [0, 1] to just retain the scales\n let minX = embedX[0];\n let minY = embedY[0];\n let maxX = embedX[0];\n let maxY = embedY[0];\n for (let idx = 1; idx < cluster.length; idx++) {\n minX = Math.min(minX, embedX[idx]);\n minY = Math.min(minY, embedY[idx]);\n maxX = Math.max(maxX, embedX[idx]);\n maxY = Math.max(maxY, embedY[idx]);\n }\n let rangeX = maxX - minX;\n let rangeY = maxY - minY;\n if (rangeX === 0)\n rangeX = maxX === 0 ? 1 : maxX;\n for (let idx = 0; idx < cluster.length; idx++)\n embedX[idx] = (embedX[idx] - minX) / rangeX;\n if (rangeY === 0)\n rangeY = maxY === 0 ? 1 : maxY;\n for (let idx = 0; idx < cluster.length; idx++)\n embedY[idx] = (embedY[idx] - minY) / rangeY;\n const minXs = new Float32Array(numSubClusters).fill(Number.MAX_VALUE);\n const minYs = new Float32Array(numSubClusters).fill(Number.MAX_VALUE);\n const maxXs = new Float32Array(numSubClusters).fill(Number.MIN_VALUE);\n const maxYs = new Float32Array(numSubClusters).fill(Number.MIN_VALUE);\n for (let idx = 0; idx < cluster.length; idx++) {\n const clusterNum = clusterSet.get(subCluster[cluster[idx]]);\n minXs[clusterNum] = Math.min(minXs[clusterNum], embedX[idx]);\n minYs[clusterNum] = Math.min(minYs[clusterNum], embedY[idx]);\n maxXs[clusterNum] = Math.max(maxXs[clusterNum], embedX[idx]);\n maxYs[clusterNum] = Math.max(maxYs[clusterNum], embedY[idx]);\n }\n const rangeXs = new Float32Array(numSubClusters).fill(0);\n const rangeYs = new Float32Array(numSubClusters).fill(0);\n for (let idx = 0; idx < numSubClusters; idx++) {\n rangeXs[idx] = maxXs[idx] - minXs[idx];\n rangeYs[idx] = maxYs[idx] - minYs[idx];\n rangeXs[idx] = rangeXs[idx] === 0 ? 1 : rangeXs[idx];\n rangeYs[idx] = rangeYs[idx] === 0 ? 1 : rangeYs[idx];\n }\n const centerXs = new Float32Array(numSubClusters).fill(0);\n const centerYs = new Float32Array(numSubClusters).fill(0);\n for (let idx = 0; idx < numSubClusters; idx++) {\n centerXs[idx] = (minXs[idx] + maxXs[idx]) / 2;\n centerYs[idx] = (minYs[idx] + maxYs[idx]) / 2;\n }\n // get cluster sizes\n const clusterSizes = new Float32Array(numSubClusters).fill(0);\n for (let idx = 0; idx < cluster.length; idx++) {\n const clusterNum = clusterSet.get(subCluster[cluster[idx]]);\n clusterSizes[clusterNum]++;\n }\n // normalize cluster sizes and take square root as the size is in area\n const maxClusterSizeSQ = Math.sqrt(clusterSizes.reduce((a, b) => Math.max(a, b), 0));\n for (let idx = 0; idx < numSubClusters; idx++)\n clusterSizes[idx] = Math.sqrt(clusterSizes[idx]) / maxClusterSizeSQ;\n // position each centroid based on interconnectivity\n xVelocities.fill(0);\n yVelocities.fill(0);\n for (let i = 0; i < iterations; i++) {\n const temperature = (1 - i / iterations);\n for (const clusterNum1 in interClusterConnectivity) {\n for (const clusterNum2 in interClusterConnectivity[clusterNum1]) {\n const a = clusterSet.get(clusterNum1);\n const b = clusterSet.get(clusterNum2);\n const diffX = centerXs[a] - centerXs[b];\n const diffY = centerYs[a] - centerYs[b];\n const dxa = diffX * interClusterConnectivity[clusterNum1][clusterNum2] / interConnectivity[clusterNum1];\n const dya = diffY * interClusterConnectivity[clusterNum1][clusterNum2] / interConnectivity[clusterNum1];\n const dxb = diffX * interClusterConnectivity[clusterNum1][clusterNum2] / interConnectivity[clusterNum2];\n const dyb = diffY * interClusterConnectivity[clusterNum1][clusterNum2] / interConnectivity[clusterNum2];\n xVelocities[a] -= dxa;\n xVelocities[b] += dxb;\n yVelocities[a] -= dya;\n yVelocities[b] += dyb;\n }\n for (let idx = 0; idx < numSubClusters; idx++) {\n xVelocities[idx] *= temperature;\n yVelocities[idx] *= temperature;\n centerXs[idx] += xVelocities[idx];\n centerYs[idx] += yVelocities[idx];\n }\n }\n }\n // normilize centroids\n // minX = centerXs[0];\n // minY = centerYs[0];\n // maxX = centerXs[0];\n // maxY = centerYs[0];\n // for (let idx = 1; idx < numSubClusters; idx++) {\n // minX = Math.min(minX, centerXs[idx]);\n // minY = Math.min(minY, centerYs[idx]);\n // maxX = Math.max(maxX, centerXs[idx]);\n // maxY = Math.max(maxY, centerYs[idx]);\n // }\n // rangeX = maxX - minX;\n // rangeY = maxY - minY;\n // if (rangeX === 0)\n // rangeX = maxX === 0 ? 1 : maxX;\n // for (let idx = 0; idx < numSubClusters; idx++)\n // centerXs[idx] = (centerXs[idx] - minX) / rangeX;\n // if (rangeY === 0)\n // rangeY = maxY === 0 ? 1 : maxY;\n // for (let idx = 0; idx < numSubClusters; idx++)\n // centerYs[idx] = (centerYs[idx] - minY) / rangeY;\n // inflate centroids\n inflateCentroids(centerXs, centerYs, clusterSizes);\n // map the points to the center of the cluster\n for (let idx = 0; idx < cluster.length; idx++) {\n const clusterNum = clusterSet.get(subCluster[cluster[idx]]);\n const size = clusterSizes[clusterNum];\n const centerX = centerXs[clusterNum];\n const centerY = centerYs[clusterNum];\n const clusterMidX = (minXs[clusterNum] + maxXs[clusterNum]) / 2;\n const clusterMidY = (minYs[clusterNum] + maxYs[clusterNum]) / 2;\n const dx = (embedX[idx] - clusterMidX) / rangeXs[clusterNum];\n const dy = (embedY[idx] - clusterMidY) / rangeYs[clusterNum];\n // make each cluster more circular\n const angle = Math.atan2(dy, dx);\n const dist = Math.sqrt(dx * dx + dy * dy);\n const maxDist = size / 2;\n embedX[idx] = centerX + Math.cos(angle) * Math.min(maxDist, dist);\n embedY[idx] = centerY + Math.sin(angle) * Math.min(maxDist, dist);\n // embedX[idx] = centerX + dx * size;\n // embedY[idx] = centerY + dy * size;\n }\n // put all points in each cluster in center\n // for (let idx = 0; idx < cluster.length; idx++) {\n // const clusterNum = clusterSet.get(subCluster[cluster[idx]])!;\n // embedX[idx] = centerXs[clusterNum];\n // embedY[idx] = centerYs[clusterNum];\n // }\n // normalize\n minX = embedX[0];\n minY = embedY[0];\n maxX = embedX[0];\n maxY = embedY[0];\n for (let idx = 1; idx < cluster.length; idx++) {\n minX = Math.min(minX, embedX[idx]);\n minY = Math.min(minY, embedY[idx]);\n maxX = Math.max(maxX, embedX[idx]);\n maxY = Math.max(maxY, embedY[idx]);\n }\n rangeX = maxX - minX;\n rangeY = maxY - minY;\n if (rangeX === 0)\n rangeX = maxX === 0 ? 1 : maxX;\n for (let idx = 0; idx < cluster.length; idx++)\n embedX[idx] = (embedX[idx] - minX) / rangeX;\n if (rangeY === 0)\n rangeY = maxY === 0 ? 1 : maxY;\n for (let idx = 0; idx < cluster.length; idx++)\n embedY[idx] = (embedY[idx] - minY) / rangeY;\n return { embedX, embedY };\n}\nfunction sign(x) {\n return x < 0 ? -1 : 1;\n}\n// this function will inflate the centroids of the clusters such that their size is proportional to the number of points in the cluster\n// sizes should be normalized to [0, 1]\nfunction inflateCentroids(centerXs, centerYs, clusterSizes) {\n const sortedIndexes = Array.from(clusterSizes.keys()).sort((a, b) => clusterSizes[b] - clusterSizes[a]);\n const numClusters = centerXs.length;\n for (let uidx = 0; uidx < numClusters; uidx++) {\n const idx = sortedIndexes[uidx];\n const size = clusterSizes[idx];\n const centerX = centerXs[idx];\n const centerY = centerYs[idx];\n for (let ui = 0; ui < numClusters; ui++) {\n const i = sortedIndexes[ui];\n const size2 = clusterSizes[i];\n const minDist = (size + size2);\n if (i === idx)\n continue;\n const dx = centerX - centerXs[i];\n const dy = centerY - centerYs[i];\n const dist = Math.sqrt(dx * dx + dy * dy);\n if (dist < minDist) {\n const diff = size / 2;\n const angle = Math.atan2(dy, dx);\n centerXs[i] -= diff * Math.cos(angle);\n centerYs[i] -= diff * Math.sin(angle);\n }\n }\n }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmlvLWxheW91dC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbImJpby1sYXlvdXQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUEsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLFdBQVcsQ0FBQztBQUUxQyxNQUFNLFVBQVUsU0FBUyxDQUFDLE9BQWlCLEVBQUUsWUFBZ0MsRUFDM0UsVUFBa0IsRUFBRSxVQUFvQjtJQUN4QyxNQUFNLENBQUMsR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDO0lBQ3pCLE1BQU0sRUFBRSxHQUFhLEVBQUUsQ0FBQztJQUN4QixNQUFNLEVBQUUsR0FBYSxFQUFFLENBQUM7SUFDeEIsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO1FBQzNCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7WUFDL0IsTUFBTSxDQUFDLEdBQUcsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3JCLE1BQU0sQ0FBQyxHQUFHLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNyQixJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7Z0JBQ3BDLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ1gsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNiLENBQUM7UUFDSCxDQUFDO0lBQ0gsQ0FBQztJQUVELE9BQU8sZUFBZSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsT0FBTyxFQUFFLFVBQVUsQ0FBQyxDQUFDO0FBQ3RELENBQUM7QUFFRCxTQUFTO0FBQ1QsU0FBUyxvQkFBb0IsQ0FBQyxFQUFZLEVBQUUsRUFBWSxFQUFFLE9BQWlCLEVBQUUsVUFBb0I7SUFDL0Ysa0NBQWtDO0lBQ2xDLE1BQU0sVUFBVSxHQUFHLElBQUksR0FBRyxFQUFrQixDQUFDO0lBQzdDLElBQUksT0FBTyxHQUFHLENBQUMsQ0FBQztJQUNoQixLQUFLLE1BQU0sQ0FBQyxJQUFJLE9BQU8sRUFBRSxDQUFDO1FBQ3hCLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNoQyxVQUFVLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsRUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUFDO0lBQzdDLENBQUM7SUFDRCxNQUFNLGlCQUFpQixHQUE0QixFQUFFLENBQUM7SUFDdEQsTUFBTSxpQkFBaUIsR0FBNEIsRUFBRSxDQUFDO0lBQ3RELHdDQUF3QztJQUN4QyxNQUFNLHdCQUF3QixHQUE4QyxFQUFFLENBQUM7SUFDL0UsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztRQUNuQyxJQUFJLFVBQVUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxVQUFVLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUM1QyxpQkFBaUIsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLGlCQUFpQixDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUMvRCxpQkFBaUIsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLGlCQUFpQixDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNqRSxDQUFDO2FBQU0sQ0FBQztZQUNOLGlCQUFpQixDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsaUJBQWlCLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ3ZGLGlCQUFpQixDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsaUJBQWlCLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ3ZGLHdCQUF3QixDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLHdCQUF3QixDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUNoRyx3QkFBd0IsQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLHdCQUF3QixDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUMzSSx3QkFBd0IsQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyx3QkFBd0IsQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDaEcsd0JBQXdCLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyx3QkFBd0IsQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFD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Y0FBYyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3pELE1BQU0sT0FBTyxHQUFHLElBQUksWUFBWSxDQUFDLGNBQWMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUN6RCxLQUFLLElBQUksR0FBRyxHQUFHLENBQUMsRUFBRSxHQUFHLEdBQUcsY0FBYyxFQUFFLEdBQUcsRUFBRSxFQUFFLENBQUM7UUFDOUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEtBQUssQ0FBQyxHQUFHLENBQUMsR0FBRyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDdkMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEtBQUssQ0FBQyxHQUFHLENBQUMsR0FBRyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDdkMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3JELE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUN2RCxDQUFDO0lBRUQsTUFBTSxRQUFRLEdBQUcsSUFBSSxZQUFZLENBQUMsY0FBYyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzFELE1BQU0sUUFBUSxHQUFHLElBQUksWUFBWSxDQUFDLGNBQWMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUMxRCxLQUFLLElBQUksR0FBRyxHQUFHLENBQUMsRUFBRSxHQUFHLEdBQUcsY0FBYyxFQUFFLEdBQUcsRUFBRSxFQUFFLENBQUM7UUFDOUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEtBQUss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SyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQztnQkFDakMsUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUN0QyxRQUFRLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDeEMsQ0FBQztRQUNILENBQUM7SUFDSCxDQUFDO0FBQ0gsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4gKi9cbmltcG9ydCB7U3BhcnNlTWF0cml4T2JqZWN0fSBmcm9tICcuL3R5cGVzJztcbmltcG9ydCB7Z2V0V2ViQ29sYUxheW90fSBmcm9tICcuL3dlYkNvbGEnO1xuXG5leHBvcnQgZnVuY3Rpb24gYmlvTGF5b3V0KGNsdXN0ZXI6IG51bWJlcltdLCBzcGFyc2VPYmplY3Q6IFNwYXJzZU1hdHJpeE9iamVjdCxcbiAgX3RocmVzaG9sZDogbnVtYmVyLCBzdWJDbHVzdGVyOiBudW1iZXJbXSkge1xuICBjb25zdCBuID0gY2x1c3Rlci5sZW5ndGg7XG4gIGNvbnN0IGlzOiBudW1iZXJbXSA9IFtdO1xuICBjb25zdCBqczogbnVtYmVyW10gPSBbXTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBuOyBpKyspIHtcbiAgICBmb3IgKGxldCBqID0gaSArIDE7IGogPCBuOyBqKyspIHtcbiAgICAgIGNvbnN0IGEgPSBjbHVzdGVyW2ldO1xuICAgICAgY29uc3QgYiA9IGNsdXN0ZXJbal07XG4gICAgICBpZiAoKHNwYXJzZU9iamVjdFthXT8uW2JdID8/IDApID4gMCkge1xuICAgICAgICBpcy5wdXNoKGkpO1xuICAgICAgICBqcy5wdXNoKGopO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBnZXRXZWJDb2xhTGF5b3QoaXMsIGpzLCBjbHVzdGVyLCBzdWJDbHVzdGVyKTtcbn1cblxuLy8gbGVnYWN5XG5mdW5jdGlvbiBfZ2V0TGF5b3V0RW1iZWRkaW5ncyhpczogbnVtYmVyW10sIGpzOiBudW1iZXJbXSwgY2x1c3RlcjogbnVtYmVyW10sIHN1YkNsdXN0ZXI6IG51bWJlcltdKSB7XG4gIC8vIGNvdW50IG51bWJlciBvZiB1bmlxdWUgY2x1c3RlcnNcbiAgY29uc3QgY2x1c3RlclNldCA9IG5ldyBNYXA8bnVtYmVyLCBudW1iZXI+KCk7XG4gIGxldCBjb3VudGVyID0gMDtcbiAgZm9yIChjb25zdCBjIG9mIGNsdXN0ZXIpIHtcbiAgICBpZiAoIWNsdXN0ZXJTZXQuaGFzKHN1YkNsdXN0ZXJbY10pKVxuICAgICAgY2x1c3RlclNldC5zZXQoc3ViQ2x1c3RlcltjXSwgY291bnRlcisrKTtcbiAgfVxuICBjb25zdCBsb2NhbENvbm5lY3Rpdml0eToge1trZXk6IG51bWJlcl06IG51bWJlcn0gPSB7fTtcbiAgY29uc3QgaW50ZXJDb25uZWN0aXZpdHk6IHtba2V5OiBudW1iZXJdOiBudW1iZXJ9ID0ge307XG4gIC8vIGhvdyBtYW55IGNvbm5lY3Rpb25zIGJldHdlZW4gY2x1c3RlcnNcbiAgY29uc3QgaW50ZXJDbHVzdGVyQ29ubmVjdGl2aXR5OiB7W2tleTogbnVtYmVyXToge1trZXkyOiBudW1iZXJdOiBudW1iZXJ9fSA9IHt9O1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGlzLmxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKHN1YkNsdXN0ZXJbaXNbaV1dID09PSBzdWJDbHVzdGVyW2pzW2ldXSkge1xuICAgICAgbG9jYWxDb25uZWN0aXZpdHlbaXNbaV1dID0gKGxvY2FsQ29ubmVjdGl2aXR5W2lzW2ldXSA/PyAwKSArIDE7XG4gICAgICBsb2NhbENvbm5lY3Rpdml0eVtqc1tpXV0gPSAobG9jYWxDb25uZWN0aXZpdHlbanNbaV1dID8/IDApICsgMTtcbiAgICB9IGVsc2Uge1xuICAgICAgaW50ZXJDb25uZWN0aXZpdHlbc3ViQ2x1c3Rlcltpc1tpXV1dID0gKGludGVyQ29ubmVjdGl2aXR5W3N1YkNsdXN0ZXJbaXNbaV1dXSA/PyAwKSArIDE7XG4gICAgICBpbnRlckNvbm5lY3Rpdml0eVtzdWJDbHVzdGVyW2pzW2ldXV0gPSAoaW50ZXJDb25uZWN0aXZpdHlbc3ViQ2x1c3Rlcltqc1tpXV1dID8/IDApICsgMTtcbiAgICAgIGludGVyQ2x1c3RlckNvbm5lY3Rpdml0eVtzdWJDbHVzdGVyW2lzW2ldXV0gPSBpbnRlckNsdXN0ZXJDb25uZWN0aXZpdHlbc3ViQ2x1c3Rlcltpc1tpXV1dID8/IHt9O1xuICAgICAgaW50ZXJDbHVzdGVyQ29ubmVjdGl2aXR5W3N1YkNsdXN0ZXJbaXNbaV1dXVtzdWJDbHVzdGVyW2pzW2ldXV0gPSAoaW50ZXJDbHVzdGVyQ29ubmVjdGl2aXR5W3N1YkNsdXN0ZXJbaXNbaV1dXVtzdWJDbHVzdGVyW2pzW2ldXV0gPz8gMCkgKyAxO1xuICAgICAgaW50ZXJDbHVzdGVyQ29ubmVjdGl2aXR5W3N1YkNsdXN0ZXJbanNbaV1dXSA9IGludGVyQ2x1c3RlckNvbm5lY3Rpdml0eVtzdWJDbHVzdGVyW2pzW2ldXV0gPz8ge307XG4gICAgICBpbnRlckNsdXN0ZXJDb25uZWN0aXZpdHlbc3ViQ2x1c3Rlcltqc1tpXV1dW3N1YkNsdXN0ZXJbaXNbaV1dXSA9IChpbnRlckNsdXN0ZXJDb25uZWN0aXZpdHlbc3ViQ2x1c3Rlcltqc1tpXV1dW3N1YkNsdXN0ZXJbaXNbaV1dXSA/PyAwKSArIDE7XG4gICAgfVxuICB9XG5cblxuICBjb25zdCBudW1TdWJDbHVzdGVycyA9IGNsdXN0ZXJTZXQuc2l6ZTtcbiAgLy8gd2UgbmVlZCB0byBzdGFydCB3aXRoIGVtYmVkZGluZ3Mgc3VjaCB0aGF0IGRpZmZlcmVudCBzdWJjbHVzdGVycyBhcmUgc2VwYXJhdGVkXG4gIC8vIHdlIHdpbGwgc3RhcnQgd2l0aCBncmlkIHRoYXQgY2FuIGFjY29tbW9kYXRlIGFsbCBzdWJjbHVzdGVycyBvbiBpdHMgcGVyaW1ldGVyXG4gIC8vIHBlcmltZXRlciBvZiB0aGUgZ3JpZCBpcyAyICogbnVtQ29scyArIDIgKiBudW1Sb3dzIC0gNFxuICAvLyBsZXRzIHNheSB3ZSBoYXZlIHNxdWFyZSBncmlkLCB0aGVuIHRoZSBwZXJpbWV0ZXIgaXMgNCAqIG51bUNvbHMgLSA0XG4gIC8vIHNvIG51bUNvbHMgPSAocGVyaW1ldGVyICsgNCkgLyA0XG5cbiAgLy8gY29uc3QgbnVtQ29scyA9IE1hdGguY2VpbCgobnVtU3ViQ2x1c3RlcnMgKyA0KSAvIDQpO1xuICAvLyBjb25zdCBudW1Sb3dzID0gbnVtQ29scztcbiAgY29uc3QgZW1iZWRTaXplID0gMjtcbiAgLy8gY29uc3QgZW1wdHlTcGFjZU11bHRpcGxpZXIgPSAyO1xuICBjb25zdCBlbWJlZFggPSBuZXcgRmxvYXQzMkFycmF5KGNsdXN0ZXIubGVuZ3RoKS5maWxsKDApLm1hcCgoXywgX2kpID0+IHtcbiAgICAvLyBjb25zdCBjbHVzdGVyTnVtID0gY2x1c3RlclNldC5nZXQoc3ViQ2x1c3RlcltjbHVzdGVyW2ldXSkhO1xuICAgIC8vIGlmIChjbHVzdGVyTnVtIDwgbnVtQ29scylcbiAgICAvLyAgIHJldHVybiAoY2x1c3Rlck51bSAlIG51bUNvbHMpICogZW1iZWRTaXplICogZW1wdHlTcGFjZU11bHRpcGxpZXIgKyBNYXRoLnJhbmRvbSgpICogZW1iZWRTaXplO1xuICAgIC8vIGlmIChjbHVzdGVyTnVtIDwgbnVtQ29scyArIChudW1Sb3dzIC0gMikgKiAyKVxuICAgIC8vICAgcmV0dXJuICgoY2x1c3Rlck51bSAtIG51bUNvbHMpICUgMikgKiAobnVtQ29scyAtIDEpICogZW1iZWRTaXplICogZW1wdHlTcGFjZU11bHRpcGxpZXIgKyBNYXRoLnJhbmRvbSgpICogZW1iZWRTaXplO1xuICAgIC8vIHJldHVybiAoKGNsdXN0ZXJOdW0gLSBudW1Db2xzICsgKG51bVJvd3MgLSAyKSAqIDIpICUgbnVtQ29scykgKiBlbWJlZFNpemUgKiBlbXB0eVNwYWNlTXVsdGlwbGllciArIE1hdGgucmFuZG9tKCkgKiBlbWJlZFNpemU7XG4gICAgcmV0dXJuIE1hdGgucmFuZG9tKCkgKiBlbWJlZFNpemU7XG4gIH0pO1xuICBjb25zdCBlbWJlZFkgPSBuZXcgRmxvYXQzMkFycmF5KGNsdXN0ZXIubGVuZ3RoKS5maWxsKDApLm1hcCgoXywgX2kpID0+IHtcbiAgICAvLyBjb25zdCBjbHVzdGVyTnVtID0gY2x1c3RlclNldC5nZXQoc3ViQ2x1c3RlcltjbHVzdGVyW2ldXSkhO1xuICAgIC8vIGlmIChjbHVzdGVyTnVtIDwgbnVtQ29scylcbiAgICAvLyAgIHJldHVybiBNYXRoLnJhbmRvbSgpICogZW1iZWRTaXplO1xuICAgIC8vIGlmIChjbHVzdGVyTnVtIDwgbnVtQ29scyArIChudW1Sb3dzIC0gMikgKiAyKVxuICAgIC8vICAgcmV0dXJuIE1hdGguZmxvb3IoKGNsdXN0ZXJOdW0gLSBudW1Db2xzKSAvIDIgKyAxKSAqIGVtYmVkU2l6ZSAqIGVtcHR5U3BhY2VNdWx0aXBsaWVyICsgTWF0aC5yYW5kb20oKSAqIGVtYmVkU2l6ZTtcbiAgICAvLyByZXR1cm4gKG51bVJvd3MgLSAxKSAqIGVtYmVkU2l6ZSAqIGVtcHR5U3BhY2VNdWx0aXBsaWVyICsgTWF0aC5yYW5kb20oKSAqIGVtYmVkU2l6ZTtcbiAgICByZXR1cm4gTWF0aC5yYW5kb20oKSAqIGVtYmVkU2l6ZTtcbiAgfSk7XG4gIGNvbnN0IGl0ZXJhdGlvbnMgPSAxMDA7XG4gIGNvbnN0IHhWZWxvY2l0aWVzID0gbmV3IEZsb2F0MzJBcnJheShjbHVzdGVyLmxlbmd0aCkuZmlsbCgwKTtcbiAgY29uc3QgeVZlbG9jaXRpZXMgPSBuZXcgRmxvYXQzMkFycmF5KGNsdXN0ZXIubGVuZ3RoKS5maWxsKDApO1xuICAvLyBsb29wIDIgZm9yIHN1YkNsdXN0ZXJzXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgaXRlcmF0aW9uczsgaSsrKSB7XG4gICAgY29uc3QgdGVtcGVyYXR1cmUgPSAoMSAtIGkgLyBpdGVyYXRpb25zKTtcbiAgICAvL3hWZWxvY2l0aWVzLmZpbGwoMCk7XG4gICAgLy95VmVsb2NpdGllcy5maWxsKDApO1xuICAgIC8vIGxvb3Agb25lIGZvciBpbm5lciBjbHVzdGVyIGxheW91dFxuICAgIGZvciAobGV0IGlkeCA9IDA7IGlkeCA8IGlzLmxlbmd0aDsgaWR4KyspIHtcbiAgICAgIGNvbnN0IGEgPSBpc1tpZHhdO1xuICAgICAgY29uc3QgYiA9IGpzW2lkeF07XG4gICAgICBpZiAoc3ViQ2x1c3RlclthXSAhPT0gc3ViQ2x1c3RlcltiXSlcbiAgICAgICAgY29udGludWU7XG4gICAgICBjb25zdCBkaWZmWCA9IGVtYmVkWFthXSAtIGVtYmVkWFtiXTtcbiAgICAgIGNvbnN0IGRpZmZZID0gZW1iZWRZW2FdIC0gZW1iZWRZW2JdO1xuICAgICAgY29uc3QgZHhhID0gZGlmZlggLyBsb2NhbENvbm5lY3Rpdml0eVthXTtcbiAgICAgIGNvbnN0IGR5YSA9IGRpZmZZIC8gbG9jYWxDb25uZWN0aXZpdHlbYV07XG4gICAgICBjb25zdCBkeGIgPSBkaWZmWCAvIGxvY2FsQ29ubmVjdGl2aXR5W2JdO1xuICAgICAgY29uc3QgZHliID0gZGlmZlkgLyBsb2NhbENvbm5lY3Rpdml0eVtiXTtcbiAgICAgIGNvbnN0IGludmVyc2VGb3JjZVhhID0gKDAuMiAtIE1hdGguYWJzKGRpZmZYKSkgLyBsb2NhbENvbm5lY3Rpdml0eVthXSAqIHNpZ24oZGlmZlgpO1xuICAgICAgY29uc3QgaW52ZXJzZUZvcmNlWWEgPSAoMC4yIC0gTWF0aC5hYnMoZGlmZlkpKSAvIGxvY2FsQ29ubmVjdGl2aXR5W2FdICogc2lnbihkaWZmWSk7XG4gICAgICBjb25zdCBpbnZlcnNlRm9yY2VYYiA9ICgwLjIgLSBNYXRoLmFicyhkaWZmWCkpIC8gbG9jYWxDb25uZWN0aXZpdHlbYl0gKiBzaWduKGRpZmZYKTtcbiAgICAgIGNvbnN0IGludmVyc2VGb3JjZVliID0gKDAuMiAtIE1hdGguYWJzKGRpZmZZKSkgLyBsb2NhbENvbm5lY3Rpdml0eVtiXSAqIHNpZ24oZGlmZlkpO1xuXG4gICAgICBpZiAoTWF0aC5hYnMoZGlmZlgpID4gMC4wMSkge1xuICAgICAgICB4VmVsb2NpdGllc1thXSAtPSBkeGE7XG4gICAgICAgIHhWZWxvY2l0aWVzW2JdICs9IGR4YjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHhWZWxvY2l0aWVzW2FdICs9IGludmVyc2VGb3JjZVhhO1xuICAgICAgICB4VmVsb2NpdGllc1tiXSAtPSBpbnZlcnNlRm9yY2VYYjtcbiAgICAgIH1cbiAgICAgIGlmIChNYXRoLmFicyhkaWZmWSkgPiAwLjAxKSB7XG4gICAgICAgIHlWZWxvY2l0aWVzW2FdIC09IGR5YTtcbiAgICAgICAgeVZlbG9jaXRpZXNbYl0gKz0gZHliO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgeVZlbG9jaXRpZXNbYV0gKz0gaW52ZXJzZUZvcmNlWWE7XG4gICAgICAgIHlWZWxvY2l0aWVzW2JdIC09IGludmVyc2VGb3JjZVliO1xuICAgICAgfVxuICAgICAgLy8geVZlbG9jaXRpZXNbYV0gLT0gZHk7XG4gICAgICAvLyB5VmVsb2NpdGllc1tiXSArPSBkeTtcbiAgICB9XG4gICAgZm9yIChsZXQgaWR4ID0gMDsgaWR4IDwgY2x1c3Rlci5sZW5ndGg7IGlkeCsrKSB7XG4gICAgICB4VmVsb2NpdGllc1tpZHhdICo9IHRlbXBlcmF0dXJlO1xuICAgICAgeVZlbG9jaXRpZXNbaWR4XSAqPSB0ZW1wZXJhdHVyZTtcblxuICAgICAgZW1iZWRYW2lkeF0gKz0geFZlbG9jaXRpZXNbaWR4XTtcbiAgICAgIGVtYmVkWVtpZHhdICs9IHlWZWxvY2l0aWVzW2lkeF07XG4gICAgfVxuICB9XG5cbiAgLy8gcmVzY2FsZSBlYWNoIHN1YkNsYXN0ZXJcblxuICAvLyBmaXJzdCBmaXQgZXZlcnl0aGluZyBpbiBbMCwgMV0gdG8ganVzdCByZXRhaW4gdGhlIHNjYWxlc1xuICBsZXQgbWluWCA9IGVtYmVkWFswXTtcbiAgbGV0IG1pblkgPSBlbWJlZFlbMF07XG4gIGxldCBtYXhYID0gZW1iZWRYWzBdO1xuICBsZXQgbWF4WSA9IGVtYmVkWVswXTtcbiAgZm9yIChsZXQgaWR4ID0gMTsgaWR4IDwgY2x1c3Rlci5sZW5ndGg7IGlkeCsrKSB7XG4gICAgbWluWCA9IE1hdGgubWluKG1pblgsIGVtYmVkWFtpZHhdKTtcbiAgICBtaW5ZID0gTWF0aC5taW4obWluWSwgZW1iZWRZW2lkeF0pO1xuICAgIG1heFggPSBNYXRoLm1heChtYXhYLCBlbWJlZFhbaWR4XSk7XG4gICAgbWF4WSA9IE1hdGgubWF4KG1heFksIGVtYmVkWVtpZHhdKTtcbiAgfVxuICBsZXQgcmFuZ2VYID0gbWF4WCAtIG1pblg7XG4gIGxldCByYW5nZVkgPSBtYXhZIC0gbWluWTtcbiAgaWYgKHJhbmdlWCA9PT0gMClcbiAgICByYW5nZVggPSBtYXhYID09PSAwID8gMSA6IG1heFg7XG4gIGZvciAobGV0IGlkeCA9IDA7IGlkeCA8IGNsdXN0ZXIubGVuZ3RoOyBpZHgrKylcbiAgICBlbWJlZFhbaWR4XSA9IChlbWJlZFhbaWR4XSAtIG1pblgpIC8gcmFuZ2VYO1xuICBpZiAocmFuZ2VZID09PSAwKVxuICAgIHJhbmdlWSA9IG1heFkgPT09IDAgPyAxIDogbWF4WTtcbiAgZm9yIChsZXQgaWR4ID0gMDsgaWR4IDwgY2x1c3Rlci5sZW5ndGg7IGlkeCsrKVxuICAgIGVtYmVkWVtpZHhdID0gKGVtYmVkWVtpZHhdIC0gbWluWSkgLyByYW5nZVk7XG5cblxuICBjb25zdCBtaW5YcyA9IG5ldyBGbG9hdDMyQXJyYXkobnVtU3ViQ2x1c3RlcnMpLmZpbGwoTnVtYmVyLk1BWF9WQUxVRSk7XG4gIGNvbnN0IG1pbllzID0gbmV3IEZsb2F0MzJBcnJheShudW1TdWJDbHVzdGVycykuZmlsbChOdW1iZXIuTUFYX1ZBTFVFKTtcbiAgY29uc3QgbWF4WHMgPSBuZXcgRmxvYXQzMkFycmF5KG51bVN1YkNsdXN0ZXJzKS5maWxsKE51bWJlci5NSU5fVkFMVUUpO1xuICBjb25zdCBtYXhZcyA9IG5ldyBGbG9hdDMyQXJyYXkobnVtU3ViQ2x1c3RlcnMpLmZpbGwoTnVtYmVyLk1JTl9WQUxVRSk7XG4gIGZvciAobGV0IGlkeCA9IDA7IGlkeCA8IGNsdXN0ZXIubGVuZ3RoOyBpZHgrKykge1xuICAgIGNvbnN0IGNsdXN0ZXJOdW0gPSBjbHVzdGVyU2V0LmdldChzdWJDbHVzdGVyW2NsdXN0ZXJbaWR4XV0pITtcbiAgICBtaW5Yc1tjbHVzdGVyTnVtXSA9IE1hdGgubWluKG1pblhzW2NsdXN0ZXJOdW1dLCBlbWJlZFhbaWR4XSk7XG4gICAgbWluWXNbY2x1c3Rlck51bV0gPSBNYXRoLm1pbihtaW5Zc1tjbHVzdGVyTnVtXSwgZW1iZWRZW2lkeF0pO1xuICAgIG1heFhzW2NsdXN0ZXJOdW1dID0gTWF0aC5tYXgobWF4WHNbY2x1c3Rlck51bV0sIGVtYmVkWFtpZHhdKTtcbiAgICBtYXhZc1tjbHVzdGVyTnVtXSA9IE1hdGgubWF4KG1heFlzW2NsdXN0ZXJOdW1dLCBlbWJlZFlbaWR4XSk7XG4gIH1cbiAgY29uc3QgcmFuZ2VYcyA9IG5ldyBGbG9hdDMyQXJyYXkobnVtU3ViQ2x1c3RlcnMpLmZpbGwoMCk7XG4gIGNvbnN0IHJhbmdlWXMgPSBuZXcgRmxvYXQzMkFycmF5KG51bVN1YkNsdXN0ZXJzKS5maWxsKDApO1xuICBmb3IgKGxldCBpZHggPSAwOyBpZHggPCBudW1TdWJDbHVzdGVyczsgaWR4KyspIHtcbiAgICByYW5nZVhzW2lkeF0gPSBtYXhYc1tpZHhdIC0gbWluWHNbaWR4XTtcbiAgICByYW5nZVlzW2lkeF0gPSBtYXhZc1tpZHhdIC0gbWluWXNbaWR4XTtcbiAgICByYW5nZVhzW2lkeF0gPSByYW5nZVhzW2lkeF0gPT09IDAgPyAxIDogcmFuZ2VYc1tpZHhdO1xuICAgIHJhbmdlWXNbaWR4XSA9IHJhbmdlWXNbaWR4XSA9PT0gMCA/IDEgOiByYW5nZVlzW2lkeF07XG4gIH1cblxuICBjb25zdCBjZW50ZXJYcyA9IG5ldyBGbG9hdDMyQXJyYXkobnVtU3ViQ2x1c3RlcnMpLmZpbGwoMCk7XG4gIGNvbnN0IGNlbnRlcllzID0gbmV3IEZsb2F0MzJBcnJheShudW1TdWJDbHVzdGVycykuZmlsbCgwKTtcbiAgZm9yIChsZXQgaWR4ID0gMDsgaWR4IDwgbnVtU3ViQ2x1c3RlcnM7IGlkeCsrKSB7XG4gICAgY2VudGVyWHNbaWR4XSA9IChtaW5Yc1tpZHhdICsgbWF4WHNbaWR4XSkgLyAyO1xuICAgIGNlbnRlcllzW2lkeF0gPSAobWluWXNbaWR4XSArIG1heFlzW2lkeF0pIC8gMjtcbiAgfVxuXG4gIC8vIGdldCBjbHVzdGVyIHNpemVzXG4gIGNvbnN0IGNsdXN0ZXJTaXplcyA9IG5ldyBGbG9hdDMyQXJyYXkobnVtU3ViQ2x1c3RlcnMpLmZpbGwoMCk7XG4gIGZvciAobGV0IGlkeCA9IDA7IGlkeCA8IGNsdXN0ZXIubGVuZ3RoOyBpZHgrKykge1xuICAgIGNvbnN0IGNsdXN0ZXJOdW0gPSBjbHVzdGVyU2V0LmdldChzdWJDbHVzdGVyW2NsdXN0ZXJbaWR4XV0pITtcbiAgICBjbHVzdGVyU2l6ZXNbY2x1c3Rlck51bV0rKztcbiAgfVxuXG4gIC8vIG5vcm1hbGl6ZSBjbHVzdGVyIHNpemVzIGFuZCB0YWtlIHNxdWFyZSByb290IGFzIHRoZSBzaXplIGlzIGluIGFyZWFcbiAgY29uc3QgbWF4Q2x1c3RlclNpemVTUSA9IE1hdGguc3FydChjbHVzdGVyU2l6ZXMucmVkdWNlKChhLCBiKSA9PiBNYXRoLm1heChhLCBiKSwgMCkpO1xuICBmb3IgKGxldCBpZHggPSAwOyBpZHggPCBudW1TdWJDbHVzdGVyczsgaWR4KyspXG4gICAgY2x1c3RlclNpemVzW2lkeF0gPSBNYXRoLnNxcnQoY2x1c3RlclNpemVzW2lkeF0pIC8gbWF4Q2x1c3RlclNpemVTUTtcblxuICAvLyBwb3NpdGlvbiBlYWNoIGNlbnRyb2lkIGJhc2VkIG9uIGludGVyY29ubmVjdGl2aXR5XG4gIHhWZWxvY2l0aWVzLmZpbGwoMCk7XG4gIHlWZWxvY2l0aWVzLmZpbGwoMCk7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgaXRlcmF0aW9uczsgaSsrKSB7XG4gICAgY29uc3QgdGVtcGVyYXR1cmUgPSAoMSAtIGkgLyBpdGVyYXRpb25zKTtcbiAgICBmb3IgKGNvbnN0IGNsdXN0ZXJOdW0xIGluIGludGVyQ2x1c3RlckNvbm5lY3Rpdml0eSkge1xuICAgICAgZm9yIChjb25zdCBjbHVzdGVyTnVtMiBpbiBpbnRlckNsdXN0ZXJDb25uZWN0aXZpdHlbY2x1c3Rlck51bTEgYXMgdW5rbm93biBhcyBudW1iZXJdKSB7XG4gICAgICAgIGNvbnN0IGEgPSBjbHVzdGVyU2V0LmdldChjbHVzdGVyTnVtMSBhcyB1bmtub3duIGFzIG51bWJlcikhO1xuICAgICAgICBjb25zdCBiID0gY2x1c3RlclNldC5nZXQoY2x1c3Rlck51bTIgYXMgdW5rbm93biBhcyBudW1iZXIpITtcbiAgICAgICAgY29uc3QgZGlmZlggPSBjZW50ZXJYc1thXSAtIGNlbnRlclhzW2JdO1xuICAgICAgICBjb25zdCBkaWZmWSA9IGNlbnRlcllzW2FdIC0gY2VudGVyWXNbYl07XG4gICAgICAgIGNvbnN0IGR4YSA9IGRpZmZYICogaW50ZXJDbHVzdGVyQ29ubmVjdGl2aXR5W2NsdXN0ZXJOdW0xXVtjbHVzdGVyTnVtMl0gLyBpbnRlckNvbm5lY3Rpdml0eVtjbHVzdGVyTnVtMV07XG4gICAgICAgIGNvbnN0IGR5YSA9IGRpZmZZICogaW50ZXJDbHVzdGVyQ29ubmVjdGl2aXR5W2NsdXN0ZXJOdW0xXVtjbHVzdGVyTnVtMl0gLyBpbnRlckNvbm5lY3Rpdml0eVtjbHVzdGVyTnVtMV07XG4gICAgICAgIGNvbnN0IGR4YiA9IGRpZmZYICogaW50ZXJDbHVzdGVyQ29ubmVjdGl2aXR5W2NsdXN0ZXJOdW0xXVtjbHVzdGVyTnVtMl0gLyBpbnRlckNvbm5lY3Rpdml0eVtjbHVzdGVyTnVtMl07XG4gICAgICAgIGNvbnN0IGR5YiA9IGRpZmZZICogaW50ZXJDbHVzdGVyQ29ubmVjdGl2aXR5W2NsdXN0ZXJOdW0xXVtjbHVzdGVyTnVtMl0gLyBpbnRlckNvbm5lY3Rpdml0eVtjbHVzdGVyTnVtMl07XG5cbiAgICAgICAgeFZlbG9jaXRpZXNbYV0gLT0gZHhhO1xuICAgICAgICB4VmVsb2NpdGllc1tiXSArPSBkeGI7XG4gICAgICAgIHlWZWxvY2l0aWVzW2FdIC09IGR5YTtcbiAgICAgICAgeVZlbG9jaXRpZXNbYl0gKz0gZHliO1xuICAgICAgfVxuXG4gICAgICBmb3IgKGxldCBpZHggPSAwOyBpZHggPCBudW1TdWJDbHVzdGVyczsgaWR4KyspIHtcbiAgICAgICAgeFZlbG9jaXRpZXNbaWR4XSAqPSB0ZW1wZXJhdHVyZTtcbiAgICAgICAgeVZlbG9jaXRpZXNbaWR4XSAqPSB0ZW1wZXJhdHVyZTtcblxuICAgICAgICBjZW50ZXJYc1tpZHhdICs9IHhWZWxvY2l0aWVzW2lkeF07XG4gICAgICAgIGNlbnRlcllzW2lkeF0gKz0geVZlbG9jaXRpZXNbaWR4XTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyBub3JtaWxpemUgY2VudHJvaWRzXG4gIC8vIG1pblggPSBjZW50ZXJYc1swXTtcbiAgLy8gbWluWSA9IGNlbnRlcllzWzBdO1xuICAvLyBtYXhYID0gY2VudGVyWHNbMF07XG4gIC8vIG1heFkgPSBjZW50ZXJZc1swXTtcblxuICAvLyBmb3IgKGxldCBpZHggPSAxOyBpZHggPCBudW1TdWJDbHVzdGVyczsgaWR4KyspIHtcbiAgLy8gICBtaW5YID0gTWF0aC5taW4obWluWCwgY2VudGVyWHNbaWR4XSk7XG4gIC8vICAgbWluWSA9IE1hdGgubWluKG1pblksIGNlbnRlcllzW2lkeF0pO1xuICAvLyAgIG1heFggPSBNYXRoLm1heChtYXhYLCBjZW50ZXJYc1tpZHhdKTtcbiAgLy8gICBtYXhZID0gTWF0aC5tYXgobWF4WSwgY2VudGVyWXNbaWR4XSk7XG4gIC8vIH1cblxuICAvLyByYW5nZVggPSBtYXhYIC0gbWluWDtcbiAgLy8gcmFuZ2VZID0gbWF4WSAtIG1pblk7XG4gIC8vIGlmIChyYW5nZVggPT09IDApXG4gIC8vICAgcmFuZ2VYID0gbWF4WCA9PT0gMCA/IDEgOiBtYXhYO1xuICAvLyBmb3IgKGxldCBpZHggPSAwOyBpZHggPCBudW1TdWJDbHVzdGVyczsgaWR4KyspXG4gIC8vICAgY2VudGVyWHNbaWR4XSA9IChjZW50ZXJYc1tpZHhdIC0gbWluWCkgLyByYW5nZVg7XG4gIC8vIGlmIChyYW5nZVkgPT09IDApXG4gIC8vICAgcmFuZ2VZID0gbWF4WSA9PT0gMCA/IDEgOiBtYXhZO1xuICAvLyBmb3IgKGxldCBpZHggPSAwOyBpZHggPCBudW1TdWJDbHVzdGVyczsgaWR4KyspXG4gIC8vICAgY2VudGVyWXNbaWR4XSA9IChjZW50ZXJZc1tpZHhdIC0gbWluWSkgLyByYW5nZVk7XG5cbiAgLy8gaW5mbGF0ZSBjZW50cm9pZHNcbiAgaW5mbGF0ZUNlbnRyb2lkcyhjZW50ZXJYcywgY2VudGVyWXMsIGNsdXN0ZXJTaXplcyk7XG5cbiAgLy8gbWFwIHRoZSBwb2ludHMgdG8gdGhlIGNlbnRlciBvZiB0aGUgY2x1c3RlclxuICBmb3IgKGxldCBpZHggPSAwOyBpZHggPCBjbHVzdGVyLmxlbmd0aDsgaWR4KyspIHtcbiAgICBjb25zdCBjbHVzdGVyTnVtID0gY2x1c3RlclNldC5nZXQoc3ViQ2x1c3RlcltjbHVzdGVyW2lkeF1dKSE7XG4gICAgY29uc3Qgc2l6ZSA9IGNsdXN0ZXJTaXplc1tjbHVzdGVyTnVtXTtcbiAgICBjb25zdCBjZW50ZXJYID0gY2VudGVyWHNbY2x1c3Rlck51bV07XG4gICAgY29uc3QgY2VudGVyWSA9IGNlbnRlcllzW2NsdXN0ZXJOdW1dO1xuICAgIGNvbnN0IGNsdXN0ZXJNaWRYID0gKG1pblhzW2NsdXN0ZXJOdW1dICsgbWF4WHNbY2x1c3Rlck51bV0pIC8gMjtcbiAgICBjb25zdCBjbHVzdGVyTWlkWSA9IChtaW5Zc1tjbHVzdGVyTnVtXSArIG1heFlzW2NsdXN0ZXJOdW1dKSAvIDI7XG4gICAgY29uc3QgZHggPSAoZW1iZWRYW2lkeF0gLSBjbHVzdGVyTWlkWCkgLyByYW5nZVhzW2NsdXN0ZXJOdW1dO1xuICAgIGNvbnN0IGR5ID0gKGVtYmVkWVtpZHhdIC0gY2x1c3Rlck1pZFkpIC8gcmFuZ2VZc1tjbHVzdGVyTnVtXTtcbiAgICAvLyBtYWtlIGVhY2ggY2x1c3RlciBtb3JlIGNpcmN1bGFyXG4gICAgY29uc3QgYW5nbGUgPSBNYXRoLmF0YW4yKGR5LCBkeCk7XG4gICAgY29uc3QgZGlzdCA9IE1hdGguc3FydChkeCAqIGR4ICsgZHkgKiBkeSk7XG4gICAgY29uc3QgbWF4RGlzdCA9IHNpemUgLyAyO1xuXG4gICAgZW1iZWRYW2lkeF0gPSBjZW50ZXJYICsgTWF0aC5jb3MoYW5nbGUpICogTWF0aC5taW4obWF4RGlzdCwgZGlzdCk7XG4gICAgZW1iZWRZW2lkeF0gPSBjZW50ZXJZICsgTWF0aC5zaW4oYW5nbGUpICogTWF0aC5taW4obWF4RGlzdCwgZGlzdCk7XG5cbiAgICAvLyAgICBlbWJlZFhbaWR4XSA9IGNlbnRlclggKyBkeCAqIHNpemU7XG4gICAgLy8gICAgZW1iZWRZW2lkeF0gPSBjZW50ZXJZICsgZHkgKiBzaXplO1xuICB9XG5cbiAgLy8gcHV0IGFsbCBwb2ludHMgaW4gZWFjaCBjbHVzdGVyIGluIGNlbnRlclxuICAvLyBmb3IgKGxldCBpZHggPSAwOyBpZHggPCBjbHVzdGVyLmxlbmd0aDsgaWR4KyspIHtcbiAgLy8gICBjb25zdCBjbHVzdGVyTnVtID0gY2x1c3RlclNldC5nZXQoc3ViQ2x1c3RlcltjbHVzdGVyW2lkeF1dKSE7XG4gIC8vICAgZW1iZWRYW2lkeF0gPSBjZW50ZXJYc1tjbHVzdGVyTnVtXTtcbiAgLy8gICBlbWJlZFlbaWR4XSA9IGNlbnRlcllzW2NsdXN0ZXJOdW1dO1xuICAvLyB9XG5cblxuICAvLyBub3JtYWxpemVcbiAgbWluWCA9IGVtYmVkWFswXTtcbiAgbWluWSA9IGVtYmVkWVswXTtcbiAgbWF4WCA9IGVtYmVkWFswXTtcbiAgbWF4WSA9IGVtYmVkWVswXTtcbiAgZm9yIChsZXQgaWR4ID0gMTsgaWR4IDwgY2x1c3Rlci5sZW5ndGg7IGlkeCsrKSB7XG4gICAgbWluWCA9IE1hdGgubWluKG1pblgsIGVtYmVkWFtpZHhdKTtcbiAgICBtaW5ZID0gTWF0aC5taW4obWluWSwgZW1iZWRZW2lkeF0pO1xuICAgIG1heFggPSBNYXRoLm1heChtYXhYLCBlbWJlZFhbaWR4XSk7XG4gICAgbWF4WSA9IE1hdGgubWF4KG1heFksIGVtYmVkWVtpZHhdKTtcbiAgfVxuICByYW5nZVggPSBtYXhYIC0gbWluWDtcbiAgcmFuZ2VZID0gbWF4WSAtIG1pblk7XG4gIGlmIChyYW5nZVggPT09IDApXG4gICAgcmFuZ2VYID0gbWF4WCA9PT0gMCA/IDEgOiBtYXhYO1xuICBmb3IgKGxldCBpZHggPSAwOyBpZHggPCBjbHVzdGVyLmxlbmd0aDsgaWR4KyspXG4gICAgZW1iZWRYW2lkeF0gPSAoZW1iZWRYW2lkeF0gLSBtaW5YKSAvIHJhbmdlWDtcbiAgaWYgKHJhbmdlWSA9PT0gMClcbiAgICByYW5nZVkgPSBtYXhZID09PSAwID8gMSA6IG1heFk7XG4gIGZvciAobGV0IGlkeCA9IDA7IGlkeCA8IGNsdXN0ZXIubGVuZ3RoOyBpZHgrKylcbiAgICBlbWJlZFlbaWR4XSA9IChlbWJlZFlbaWR4XSAtIG1pblkpIC8gcmFuZ2VZO1xuXG4gIHJldHVybiB7ZW1iZWRYLCBlbWJlZFl9O1xufVxuXG5mdW5jdGlvbiBzaWduKHg6IG51bWJlcikge1xuICByZXR1cm4geCA8IDAgPyAtMSA6IDE7XG59XG5cbi8vIHRoaXMgZnVuY3Rpb24gd2lsbCBpbmZsYXRlIHRoZSBjZW50cm9pZHMgb2YgdGhlIGNsdXN0ZXJzIHN1Y2ggdGhhdCB0aGVpciBzaXplIGlzIHByb3BvcnRpb25hbCB0byB0aGUgbnVtYmVyIG9mIHBvaW50cyBpbiB0aGUgY2x1c3RlclxuLy8gc2l6ZXMgc2hvdWxkIGJlIG5vcm1hbGl6ZWQgdG8gWzAsIDFdXG5mdW5jdGlvbiBpbmZsYXRlQ2VudHJvaWRzKGNlbnRlclhzOiBGbG9hdDMyQXJyYXksIGNlbnRlcllzOiBGbG9hdDMyQXJyYXksIGNsdXN0ZXJTaXplczogRmxvYXQzMkFycmF5KSB7XG4gIGNvbnN0IHNvcnRlZEluZGV4ZXMgPSBBcnJheS5mcm9tKGNsdXN0ZXJTaXplcy5rZXlzKCkpLnNvcnQoKGEsIGIpID0+IGNsdXN0ZXJTaXplc1tiXSAtIGNsdXN0ZXJTaXplc1thXSk7XG4gIGNvbnN0IG51bUNsdXN0ZXJzID0gY2VudGVyWHMubGVuZ3RoO1xuICBmb3IgKGxldCB1aWR4ID0gMDsgdWlkeCA8IG51bUNsdXN0ZXJzOyB1aWR4KyspIHtcbiAgICBjb25zdCBpZHggPSBzb3J0ZWRJbmRleGVzW3VpZHhdO1xuICAgIGNvbnN0IHNpemUgPSBjbHVzdGVyU2l6ZXNbaWR4XTtcbiAgICBjb25zdCBjZW50ZXJYID0gY2VudGVyWHNbaWR4XTtcbiAgICBjb25zdCBjZW50ZXJZID0gY2VudGVyWXNbaWR4XTtcbiAgICBmb3IgKGxldCB1aSA9IDA7IHVpIDwgbnVtQ2x1c3RlcnM7IHVpKyspIHtcbiAgICAgIGNvbnN0IGkgPSBzb3J0ZWRJbmRleGVzW3VpXTtcbiAgICAgIGNvbnN0IHNpemUyID0gY2x1c3RlclNpemVzW2ldO1xuICAgICAgY29uc3QgbWluRGlzdCA9IChzaXplICsgc2l6ZTIpO1xuICAgICAgaWYgKGkgPT09IGlkeClcbiAgICAgICAgY29udGludWU7XG4gICAgICBjb25zdCBkeCA9IGNlbnRlclggLSBjZW50ZXJYc1tpXTtcbiAgICAgIGNvbnN0IGR5ID0gY2VudGVyWSAtIGNlbnRlcllzW2ldO1xuICAgICAgY29uc3QgZGlzdCA9IE1hdGguc3FydChkeCAqIGR4ICsgZHkgKiBkeSk7XG4gICAgICBpZiAoZGlzdCA8IG1pbkRpc3QpIHtcbiAgICAgICAgY29uc3QgZGlmZiA9IHNpemUgLyAyO1xuICAgICAgICBjb25zdCBhbmdsZSA9IE1hdGguYXRhbjIoZHksIGR4KTtcbiAgICAgICAgY2VudGVyWHNbaV0gLT0gZGlmZiAqIE1hdGguY29zKGFuZ2xlKTtcbiAgICAgICAgY2VudGVyWXNbaV0gLT0gZGlmZiAqIE1hdGguc2luKGFuZ2xlKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbiJdfQ==","/* eslint-disable max-len */\nimport Graph from 'graphology';\nimport forceAtlas2 from 'graphology-layout-forceatlas2';\nexport function getWebColaLayot(is, js, cluster, subCluster) {\n const graph = new Graph();\n for (let i = 0; i < cluster.length; i++)\n graph.addNode(cluster[i], { x: Math.random() * 100, y: Math.random() * 100, size: 1 });\n for (let i = 0; i < is.length; i++) {\n const p1 = is[i];\n const p2 = js[i];\n const subC1 = subCluster[cluster[p1]];\n const subC2 = subCluster[cluster[p2]];\n const weight = subC1 === subC2 ? 2 : 1;\n graph.addEdge(cluster[is[i]], cluster[js[i]], { weight });\n }\n const settings = {\n iterations: 100,\n // edgeWeightInfluence: 1, // Influence of edge weights on the layout\n // scalingRatio: 1, // Scaling ratio to account for node sizes\n // //barnesHutOptimize: true,\n // //barnesHutTheta: 0.5,\n // adjustSizes: true,\n // weighted: true,\n // strongGravityMode: true,\n settings: { ...forceAtlas2.inferSettings(graph), weighted: true }\n };\n forceAtlas2.inferSettings(graph);\n forceAtlas2.assign(graph, settings);\n const embedX1 = new Float32Array(cluster.length);\n const embedY1 = new Float32Array(cluster.length);\n for (let i = 0; i < cluster.length; i++) {\n const node = graph.getNodeAttributes(cluster[i]);\n embedX1[i] = node.x;\n embedY1[i] = node.y;\n }\n let minX = embedX1[0];\n let minY = embedY1[0];\n let maxX = embedX1[0];\n let maxY = embedY1[0];\n for (let i = 1; i < cluster.length; i++) {\n minX = Math.min(minX, embedX1[i]);\n minY = Math.min(minY, embedY1[i]);\n maxX = Math.max(maxX, embedX1[i]);\n maxY = Math.max(maxY, embedY1[i]);\n }\n let scaleX = maxX - minX;\n let scaleY = maxY - minY;\n if (scaleX === 0)\n scaleX = 1;\n if (scaleY === 0)\n scaleY = 1;\n for (let i = 0; i < cluster.length; i++) {\n embedX1[i] = (embedX1[i] - minX) / scaleX;\n embedY1[i] = (embedY1[i] - minY) / scaleY;\n }\n return { embedX: embedX1, embedY: embedY1 };\n //\n // cluter array contains the indexes of points which are in this big superClueste\n // subCluster contains per index of point, to which subCluster it belongs\n // first, create centroid for each subCluster, and calculate its apparent size\n // const subClusterSizes = new Map<number, number>();\n // const interClusterLinks = new Map<number, Map<number, number>>();\n // let maxInterClusterLinks = 0;\n // for (let i = 0; i < is.length; i++) {\n // const c1 = subCluster[cluster[is[i]]];\n // const c2 = subCluster[cluster[js[i]]];\n // if (c1 === c2)\n // continue;\n // if (!interClusterLinks.has(c1))\n // interClusterLinks.set(c1, new Map<number, number>());\n // if (!interClusterLinks.has(c2))\n // interClusterLinks.set(c2, new Map<number, number>());\n // const links1 = interClusterLinks.get(c1)!;\n // const links2 = interClusterLinks.get(c2)!;\n // links1.set(c2, (links1.get(c2) ?? 0) + 1);\n // links2.set(c1, (links2.get(c1) ?? 0) + 1);\n // maxInterClusterLinks = Math.max(maxInterClusterLinks, links1.get(c2)!);\n // maxInterClusterLinks = Math.max(maxInterClusterLinks, links2.get(c1)!);\n // }\n // // calculate the size of each subCluster\n // for (let i = 0; i < cluster.length; i++) {\n // const p = cluster[i];\n // const c = subCluster[p];\n // if (!subClusterSizes.has(c))\n // subClusterSizes.set(c, 0);\n // subClusterSizes.set(c, subClusterSizes.get(c)! + 1);\n // }\n // // normilize interClusterLinks\n // interClusterLinks.forEach((links) => {\n // links.forEach((count, c) => {\n // links.set(c, count / maxInterClusterLinks);\n // });\n // });\n // // perform the layout on apperant centroids\n // // normilaze sizes according to square root of number of points in the cluster\n // const sqrtNumOfPoints = Math.sqrt(cluster.length);\n // const normilizedSizes = new Map<number, number>();\n // subClusterSizes.forEach((size, c) => {\n // normilizedSizes.set(c, Math.sqrt(size));\n // });\n // const maxSize = Array.from(subClusterSizes.values()).reduce((a, b) => Math.max(a, b));\n // const graph = new Graph();\n // const clusterNumbers = Array.from(subClusterSizes.keys());\n // const nodes = clusterNumbers\n // .map((c, i) => ({index: i, size: normilizedSizes.get(c), x: Math.random() * 10, y: Math.random() * 10}));\n // for (const node of nodes)\n // graph.addNode(node.index, {size: node.size, x: node.x, y: node.y});\n // for (let i = 0; i < clusterNumbers.length; i++) {\n // if (!interClusterLinks.has(clusterNumbers[i]))\n // continue;\n // for (let j = i+1; j < clusterNumbers.length; j++) {\n // if (!interClusterLinks.get(clusterNumbers[i])!.has(clusterNumbers[j]))\n // continue;\n // graph.addEdge(i, j, {weight: interClusterLinks.get(clusterNumbers[i])!.get(clusterNumbers[j])!});\n // // links.push({source: i, target: j, weight: interClusterLinks.get(clusterNumbers[i])!.get(clusterNumbers[j])!});\n // }\n // }\n // const scalingRatio = 10;\n // const settings = {\n // iterations: 100,\n // edgeWeightInfluence: 1, // Influence of edge weights on the layout\n // scalingRatio: scalingRatio, // Scaling ratio to account for node sizes\n // barnesHutOptimize: true,\n // barnesHutTheta: 0.5,\n // adjustSizes: true,\n // weighted: true\n // };\n // forceAtlas2.assign(graph, settings);\n // // const layout = new Layout()\n // // .size([layoutSize, layoutSize])\n // // .nodes(nodes)\n // // .links(links)\n // // .avoidOverlaps(true)\n // // .start(20);\n // // for (let i = 0; i < 50; i++) {\n // // //@ts-ignore\n // // layout.tick();\n // // }\n // const centerX = new Float32Array(nodes.length);\n // const centerY = new Float32Array(nodes.length);\n // for (let i = 0; i < nodes.length; i++) {\n // const node = graph.getNodeAttributes(i);\n // centerX[i] = node.x;\n // centerY[i] = node.y;\n // }\n // const embedX = new Float32Array(cluster.length);\n // const embedY = new Float32Array(cluster.length);\n // // create mapping between subCluster and its index in clusterNumbers\n // const subClusterIndex = new Map<number, number>();\n // clusterNumbers.forEach((c, i) => {\n // subClusterIndex.set(c, i);\n // });\n // for (let i = 0; i < cluster.length; i++) {\n // const c = subCluster[cluster[i]];\n // const index = subClusterIndex.get(c)!;\n // const size = normilizedSizes.get(c)!;\n // embedX[i] = centerX[index] + Math.sin(Math.random() * Math.PI * 2) * size / Math.SQRT2 * Math.random() / maxSize * scalingRatio;\n // embedY[i] = centerY[index] + Math.cos(Math.random() * Math.PI * 2) * size / Math.SQRT2 * Math.random() / maxSize * scalingRatio;\n // }\n // // normilize embeddings\n // let minX = embedX[0];\n // let minY = embedY[0];\n // let maxX = embedX[0];\n // let maxY = embedY[0];\n // for (let i = 1; i < cluster.length; i++) {\n // minX = Math.min(minX, embedX[i]);\n // minY = Math.min(minY, embedY[i]);\n // maxX = Math.max(maxX, embedX[i]);\n // maxY = Math.max(maxY, embedY[i]);\n // }\n // let scaleX = maxX - minX;\n // let scaleY = maxY - minY;\n // if (scaleX === 0)\n // scaleX = 1;\n // if (scaleY === 0)\n // scaleY = 1;\n // for (let i = 0; i < cluster.length; i++) {\n // embedX[i] = (embedX[i] - minX) / scaleX;\n // embedY[i] = (embedY[i] - minY) / scaleY;\n // }\n // return {embedX, embedY};\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2ViQ29sYS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIndlYkNvbGEudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsNEJBQTRCO0FBRTVCLE9BQU8sS0FBSyxNQUFNLFlBQVksQ0FBQztBQUMvQixPQUFPLFdBQVcsTUFBTSwrQkFBK0IsQ0FBQztBQUN4RCxNQUFNLFVBQVUsZUFBZSxDQUM3QixFQUFZLEVBQUUsRUFBWSxFQUFFLE9BQWlCLEVBQUUsVUFBb0I7SUFLbkUsTUFBTSxLQUFLLEdBQUcsSUFBSSxLQUFLLEVBQUUsQ0FBQztJQUMxQixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUU7UUFDckMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLE1BQU0sRUFBRSxHQUFHLEdBQUcsRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLE1BQU0sRUFBRSxHQUFHLEdBQUcsRUFBRSxJQUFJLEVBQUUsQ0FBQyxFQUFDLENBQUMsQ0FBQztJQUV2RixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO1FBQ25DLE1BQU0sRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNqQixNQUFNLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDakIsTUFBTSxLQUFLLEdBQUcsVUFBVSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ3RDLE1BQU0sS0FBSyxHQUFHLFVBQVUsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUN0QyxNQUFNLE1BQU0sR0FBRyxLQUFLLEtBQUssS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFD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b3J0IEdyYXBoIGZyb20gJ2dyYXBob2xvZ3knO1xuaW1wb3J0IGZvcmNlQXRsYXMyIGZyb20gJ2dyYXBob2xvZ3ktbGF5b3V0LWZvcmNlYXRsYXMyJztcbmV4cG9ydCBmdW5jdGlvbiBnZXRXZWJDb2xhTGF5b3QoXG4gIGlzOiBudW1iZXJbXSwganM6IG51bWJlcltdLCBjbHVzdGVyOiBudW1iZXJbXSwgc3ViQ2x1c3RlcjogbnVtYmVyW11cbik6IHtcbiAgICBlbWJlZFg6IEZsb2F0MzJBcnJheTtcbiAgICBlbWJlZFk6IEZsb2F0MzJBcnJheTtcbn0ge1xuICBjb25zdCBncmFwaCA9IG5ldyBHcmFwaCgpO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGNsdXN0ZXIubGVuZ3RoOyBpKyspXG4gICAgZ3JhcGguYWRkTm9kZShjbHVzdGVyW2ldLCB7eDogTWF0aC5yYW5kb20oKSAqIDEwMCwgeTogTWF0aC5yYW5kb20oKSAqIDEwMCwgc2l6ZTogMX0pO1xuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgaXMubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCBwMSA9IGlzW2ldO1xuICAgIGNvbnN0IHAyID0ganNbaV07XG4gICAgY29uc3Qgc3ViQzEgPSBzdWJDbHVzdGVyW2NsdXN0ZXJbcDFdXTtcbiAgICBjb25zdCBzdWJDMiA9IHN1YkNsdXN0ZXJbY2x1c3RlcltwMl1dO1xuICAgIGNvbnN0IHdlaWdodCA9IHN1YkMxID09PSBzdWJDMiA/IDIgOiAxO1xuICAgIGdyYXBoLmFkZEVkZ2UoY2x1c3Rlcltpc1tpXV0sIGNsdXN0ZXJbanNbaV1dLCB7d2VpZ2h0fSk7XG4gIH1cblxuICBjb25zdCBzZXR0aW5ncyA9IHtcbiAgICBpdGVyYXRpb25zOiAxMDAsXG4gICAgLy8gZWRnZVdlaWdodEluZmx1ZW5jZTogMSwgLy8gSW5mbHVlbmNlIG9mIGVkZ2Ugd2VpZ2h0cyBvbiB0aGUgbGF5b3V0XG4gICAgLy8gc2NhbGluZ1JhdGlvOiAxLCAvLyBTY2FsaW5nIHJhdGlvIHRvIGFjY291bnQgZm9yIG5vZGUgc2l6ZXNcbiAgICAvLyAvL2Jhcm5lc0h1dE9wdGltaXplOiB0cnVlLFxuICAgIC8vIC8vYmFybmVzSHV0VGhldGE6IDAuNSxcbiAgICAvLyBhZGp1c3RTaXplczogdHJ1ZSxcbiAgICAvLyB3ZWlnaHRlZDogdHJ1ZSxcbiAgICAvLyBzdHJvbmdHcmF2aXR5TW9kZTogdHJ1ZSxcbiAgICBzZXR0aW5nczogey4uLmZvcmNlQXRsYXMyLmluZmVyU2V0dGluZ3MoZ3JhcGgpLCB3ZWlnaHRlZDogdHJ1ZX1cbiAgfTtcbiAgZm9yY2VBdGxhczIuaW5mZXJTZXR0aW5ncyhncmFwaCk7XG4gIGZvcmNlQXRsYXMyLmFzc2lnbihncmFwaCwgc2V0dGluZ3MpO1xuXG4gIGNvbnN0IGVtYmVkWDEgPSBuZXcgRmxvYXQzMkFycmF5KGNsdXN0ZXIubGVuZ3RoKTtcbiAgY29uc3QgZW1iZWRZMSA9IG5ldyBGbG9hdDMyQXJyYXkoY2x1c3Rlci5sZW5ndGgpO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGNsdXN0ZXIubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCBub2RlID0gZ3JhcGguZ2V0Tm9kZUF0dHJpYnV0ZXMoY2x1c3RlcltpXSk7XG4gICAgZW1iZWRYMVtpXSA9IG5vZGUueDtcbiAgICBlbWJlZFkxW2ldID0gbm9kZS55O1xuICB9XG5cbiAgbGV0IG1pblggPSBlbWJlZFgxWzBdO1xuICBsZXQgbWluWSA9IGVtYmVkWTFbMF07XG4gIGxldCBtYXhYID0gZW1iZWRYMVswXTtcbiAgbGV0IG1heFkgPSBlbWJlZFkxWzBdO1xuICBmb3IgKGxldCBpID0gMTsgaSA8IGNsdXN0ZXIubGVuZ3RoOyBpKyspIHtcbiAgICBtaW5YID0gTWF0aC5taW4obWluWCwgZW1iZWRYMVtpXSk7XG4gICAgbWluWSA9IE1hdGgubWluKG1pblksIGVtYmVkWTFbaV0pO1xuICAgIG1heFggPSBNYXRoLm1heChtYXhYLCBlbWJlZFgxW2ldKTtcbiAgICBtYXhZID0gTWF0aC5tYXgobWF4WSwgZW1iZWRZMVtpXSk7XG4gIH1cbiAgbGV0IHNjYWxlWCA9IG1heFggLSBtaW5YO1xuICBsZXQgc2NhbGVZID0gbWF4WSAtIG1pblk7XG4gIGlmIChzY2FsZVggPT09IDApXG4gICAgc2NhbGVYID0gMTtcbiAgaWYgKHNjYWxlWSA9PT0gMClcbiAgICBzY2FsZVkgPSAxO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGNsdXN0ZXIubGVuZ3RoOyBpKyspIHtcbiAgICBlbWJlZFgxW2ldID0gKGVtYmVkWDFbaV0gLSBtaW5YKSAvIHNjYWxlWDtcbiAgICBlbWJlZFkxW2ldID0gKGVtYmVkWTFbaV0gLSBtaW5ZKSAvIHNjYWxlWTtcbiAgfVxuXG4gIHJldHVybiB7ZW1iZWRYOiBlbWJlZFgxLCBlbWJlZFk6IGVtYmVkWTF9O1xuXG4gIC8vXG5cbiAgLy8gY2x1dGVyIGFycmF5IGNvbnRhaW5zIHRoZSBpbmRleGVzIG9mIHBvaW50cyB3aGljaCBhcmUgaW4gdGhpcyBiaWcgc3VwZXJDbHVlc3RlXG4gIC8vIHN1YkNsdXN0ZXIgY29udGFpbnMgcGVyIGluZGV4IG9mIHBvaW50LCB0byB3aGljaCBzdWJDbHVzdGVyIGl0IGJlbG9uZ3NcblxuICAvLyBmaXJzdCwgY3JlYXRlIGNlbnRyb2lkIGZvciBlYWNoIHN1YkNsdXN0ZXIsIGFuZCBjYWxjdWxhdGUgaXRzIGFwcGFyZW50IHNpemVcbiAgLy8gICBjb25zdCBzdWJDbHVzdGVyU2l6ZXMgPSBuZXcgTWFwPG51bWJlciwgbnVtYmVyPigpO1xuICAvLyAgIGNvbnN0IGludGVyQ2x1c3RlckxpbmtzID0gbmV3IE1hcDxudW1iZXIsIE1hcDxudW1iZXIsIG51bWJlcj4+KCk7XG4gIC8vICAgbGV0IG1heEludGVyQ2x1c3RlckxpbmtzID0gMDtcbiAgLy8gICBmb3IgKGxldCBpID0gMDsgaSA8IGlzLmxlbmd0aDsgaSsrKSB7XG4gIC8vICAgICBjb25zdCBjMSA9IHN1YkNsdXN0ZXJbY2x1c3Rlcltpc1tpXV1dO1xuICAvLyAgICAgY29uc3QgYzIgPSBzdWJDbHVzdGVyW2NsdXN0ZXJbanNbaV1dXTtcbiAgLy8gICAgIGlmIChjMSA9PT0gYzIpXG4gIC8vICAgICAgIGNvbnRpbnVlO1xuICAvLyAgICAgaWYgKCFpbnRlckNsdXN0ZXJMaW5rcy5oYXMoYzEpKVxuICAvLyAgICAgICBpbnRlckNsdXN0ZXJMaW5rcy5zZXQoYzEsIG5ldyBNYXA8bnVtYmVyLCBudW1iZXI+KCkpO1xuICAvLyAgICAgaWYgKCFpbnRlckNsdXN0ZXJMaW5rcy5oYXMoYzIpKVxuICAvLyAgICAgICBpbnRlckNsdXN0ZXJMaW5rcy5zZXQoYzIsIG5ldyBNYXA8bnVtYmVyLCBudW1iZXI+KCkpO1xuICAvLyAgICAgY29uc3QgbGlua3MxID0gaW50ZXJDbHVzdGVyTGlua3MuZ2V0KGMxKSE7XG4gIC8vICAgICBjb25zdCBsaW5rczIgPSBpbnRlckNsdXN0ZXJMaW5rcy5nZXQoYzIpITtcbiAgLy8gICAgIGxpbmtzMS5zZXQoYzIsIChsaW5rczEuZ2V0KGMyKSA/PyAwKSArIDEpO1xuICAvLyAgICAgbGlua3MyLnNldChjMSwgKGxpbmtzMi5nZXQoYzEpID8/IDApICsgMSk7XG4gIC8vICAgICBtYXhJbnRlckNsdXN0ZXJMaW5rcyA9IE1hdGgubWF4KG1heEludGVyQ2x1c3RlckxpbmtzLCBsaW5rczEuZ2V0KGMyKSEpO1xuICAvLyAgICAgbWF4SW50ZXJDbHVzdGVyTGlua3MgPSBNYXRoLm1heChtYXhJbnRlckNsdXN0ZXJMaW5rcywgbGlua3MyLmdldChjMSkhKTtcbiAgLy8gICB9XG4gIC8vICAgLy8gY2FsY3VsYXRlIHRoZSBzaXplIG9mIGVhY2ggc3ViQ2x1c3RlclxuICAvLyAgIGZvciAobGV0IGkgPSAwOyBpIDwgY2x1c3Rlci5sZW5ndGg7IGkrKykge1xuICAvLyAgICAgY29uc3QgcCA9IGNsdXN0ZXJbaV07XG4gIC8vICAgICBjb25zdCBjID0gc3ViQ2x1c3RlcltwXTtcbiAgLy8gICAgIGlmICghc3ViQ2x1c3RlclNpemVzLmhhcyhjKSlcbiAgLy8gICAgICAgc3ViQ2x1c3RlclNpemVzLnNldChjLCAwKTtcbiAgLy8gICAgIHN1YkNsdXN0ZXJTaXplcy5zZXQoYywgc3ViQ2x1c3RlclNpemVzLmdldChjKSEgKyAxKTtcbiAgLy8gICB9XG5cbiAgLy8gICAvLyBub3JtaWxpemUgaW50ZXJDbHVzdGVyTGlua3NcbiAgLy8gICBpbnRlckNsdXN0ZXJMaW5rcy5mb3JFYWNoKChsaW5rcykgPT4ge1xuICAvLyAgICAgbGlua3MuZm9yRWFjaCgoY291bnQsIGMpID0+IHtcbiAgLy8gICAgICAgbGlua3Muc2V0KGMsIGNvdW50IC8gbWF4SW50ZXJDbHVzdGVyTGlua3MpO1xuICAvLyAgICAgfSk7XG4gIC8vICAgfSk7XG5cblxuICAvLyAgIC8vIHBlcmZvcm0gdGhlIGxheW91dCBvbiBhcHBlcmFudCBjZW50cm9pZHNcbiAgLy8gICAvLyBub3JtaWxhemUgc2l6ZXMgYWNjb3JkaW5nIHRvIHNxdWFyZSByb290IG9mIG51bWJlciBvZiBwb2ludHMgaW4gdGhlIGNsdXN0ZXJcbiAgLy8gICBjb25zdCBzcXJ0TnVtT2ZQb2ludHMgPSBNYXRoLnNxcnQoY2x1c3Rlci5sZW5ndGgpO1xuICAvLyAgIGNvbnN0IG5vcm1pbGl6ZWRTaXplcyA9IG5ldyBNYXA8bnVtYmVyLCBudW1iZXI+KCk7XG4gIC8vICAgc3ViQ2x1c3RlclNpemVzLmZvckVhY2goKHNpemUsIGMpID0+IHtcbiAgLy8gICAgIG5vcm1pbGl6ZWRTaXplcy5zZXQoYywgTWF0aC5zcXJ0KHNpemUpKTtcbiAgLy8gICB9KTtcblxuICAvLyAgIGNvbnN0IG1heFNpemUgPSBBcnJheS5mcm9tKHN1YkNsdXN0ZXJTaXplcy52YWx1ZXMoKSkucmVkdWNlKChhLCBiKSA9PiBNYXRoLm1heChhLCBiKSk7XG5cbiAgLy8gICBjb25zdCBncmFwaCA9IG5ldyBHcmFwaCgpO1xuICAvLyAgIGNvbnN0IGNsdXN0ZXJOdW1iZXJzID0gQXJyYXkuZnJvbShzdWJDbHVzdGVyU2l6ZXMua2V5cygpKTtcbiAgLy8gICBjb25zdCBub2RlcyA9IGNsdXN0ZXJOdW1iZXJzXG4gIC8vICAgICAubWFwKChjLCBpKSA9PiAoe2luZGV4OiBpLCBzaXplOiBub3JtaWxpemVkU2l6ZXMuZ2V0KGMpLCB4OiBNYXRoLnJhbmRvbSgpICogMTAsIHk6IE1hdGgucmFuZG9tKCkgKiAxMH0pKTtcblxuICAvLyAgIGZvciAoY29uc3Qgbm9kZSBvZiBub2RlcylcbiAgLy8gICAgIGdyYXBoLmFkZE5vZGUobm9kZS5pbmRleCwge3NpemU6IG5vZGUuc2l6ZSwgeDogbm9kZS54LCB5OiBub2RlLnl9KTtcblxuICAvLyAgIGZvciAobGV0IGkgPSAwOyBpIDwgY2x1c3Rlck51bWJlcnMubGVuZ3RoOyBpKyspIHtcbiAgLy8gICAgIGlmICghaW50ZXJDbHVzdGVyTGlua3MuaGFzKGNsdXN0ZXJOdW1iZXJzW2ldKSlcbiAgLy8gICAgICAgY29udGludWU7XG4gIC8vICAgICBmb3IgKGxldCBqID0gaSsxOyBqIDwgY2x1c3Rlck51bWJlcnMubGVuZ3RoOyBqKyspIHtcbiAgLy8gICAgICAgaWYgKCFpbnRlckNsdXN0ZXJMaW5rcy5nZXQoY2x1c3Rlck51bWJlcnNbaV0pIS5oYXMoY2x1c3Rlck51bWJlcnNbal0pKVxuICAvLyAgICAgICAgIGNvbnRpbnVlO1xuICAvLyAgICAgICBncmFwaC5hZGRFZGdlKGksIGosIHt3ZWlnaHQ6IGludGVyQ2x1c3RlckxpbmtzLmdldChjbHVzdGVyTnVtYmVyc1tpXSkhLmdldChjbHVzdGVyTnVtYmVyc1tqXSkhfSk7XG4gIC8vICAgICAvLyAgIGxpbmtzLnB1c2goe3NvdXJjZTogaSwgdGFyZ2V0OiBqLCB3ZWlnaHQ6IGludGVyQ2x1c3RlckxpbmtzLmdldChjbHVzdGVyTnVtYmVyc1tpXSkhLmdldChjbHVzdGVyTnVtYmVyc1tqXSkhfSk7XG4gIC8vICAgICB9XG4gIC8vICAgfVxuICAvLyAgIGNvbnN0IHNjYWxpbmdSYXRpbyA9IDEwO1xuICAvLyAgIGNvbnN0IHNldHRpbmdzID0ge1xuICAvLyAgICAgaXRlcmF0aW9uczogMTAwLFxuICAvLyAgICAgZWRnZVdlaWdodEluZmx1ZW5jZTogMSwgLy8gSW5mbHVlbmNlIG9mIGVkZ2Ugd2VpZ2h0cyBvbiB0aGUgbGF5b3V0XG4gIC8vICAgICBzY2FsaW5nUmF0aW86IHNjYWxpbmdSYXRpbywgLy8gU2NhbGluZyByYXRpbyB0byBhY2NvdW50IGZvciBub2RlIHNpemVzXG4gIC8vICAgICBiYXJuZXNIdXRPcHRpbWl6ZTogdHJ1ZSxcbiAgLy8gICAgIGJhcm5lc0h1dFRoZXRhOiAwLjUsXG4gIC8vICAgICBhZGp1c3RTaXplczogdHJ1ZSxcbiAgLy8gICAgIHdlaWdodGVkOiB0cnVlXG4gIC8vICAgfTtcblxuICAvLyAgIGZvcmNlQXRsYXMyLmFzc2lnbihncmFwaCwgc2V0dGluZ3MpO1xuXG4gIC8vICAgLy8gICBjb25zdCBsYXlvdXQgPSBuZXcgTGF5b3V0KClcbiAgLy8gICAvLyAgICAgLnNpemUoW2xheW91dFNpemUsIGxheW91dFNpemVdKVxuICAvLyAgIC8vICAgICAubm9kZXMobm9kZXMpXG4gIC8vICAgLy8gICAgIC5saW5rcyhsaW5rcylcbiAgLy8gICAvLyAgICAgLmF2b2lkT3ZlcmxhcHModHJ1ZSlcbiAgLy8gICAvLyAgICAgLnN0YXJ0KDIwKTtcblxuICAvLyAgIC8vICAgZm9yIChsZXQgaSA9IDA7IGkgPCA1MDsgaSsrKSB7XG4gIC8vICAgLy8gICAgIC8vQHRzLWlnbm9yZVxuICAvLyAgIC8vICAgICBsYXlvdXQudGljaygpO1xuICAvLyAgIC8vICAgfVxuXG4gIC8vICAgY29uc3QgY2VudGVyWCA9IG5ldyBGbG9hdDMyQXJyYXkobm9kZXMubGVuZ3RoKTtcbiAgLy8gICBjb25zdCBjZW50ZXJZID0gbmV3IEZsb2F0MzJBcnJheShub2Rlcy5sZW5ndGgpO1xuICAvLyAgIGZvciAobGV0IGkgPSAwOyBpIDwgbm9kZXMubGVuZ3RoOyBpKyspIHtcbiAgLy8gICAgIGNvbnN0IG5vZGUgPSBncmFwaC5nZXROb2RlQXR0cmlidXRlcyhpKTtcbiAgLy8gICAgIGNlbnRlclhbaV0gPSBub2RlLng7XG4gIC8vICAgICBjZW50ZXJZW2ldID0gbm9kZS55O1xuICAvLyAgIH1cbiAgLy8gICBjb25zdCBlbWJlZFggPSBuZXcgRmxvYXQzMkFycmF5KGNsdXN0ZXIubGVuZ3RoKTtcbiAgLy8gICBjb25zdCBlbWJlZFkgPSBuZXcgRmxvYXQzMkFycmF5KGNsdXN0ZXIubGVuZ3RoKTtcblxuICAvLyAgIC8vIGNyZWF0ZSBtYXBwaW5nIGJldHdlZW4gc3ViQ2x1c3RlciBhbmQgaXRzIGluZGV4IGluIGNsdXN0ZXJOdW1iZXJzXG4gIC8vICAgY29uc3Qgc3ViQ2x1c3RlckluZGV4ID0gbmV3IE1hcDxudW1iZXIsIG51bWJlcj4oKTtcbiAgLy8gICBjbHVzdGVyTnVtYmVycy5mb3JFYWNoKChjLCBpKSA9PiB7XG4gIC8vICAgICBzdWJDbHVzdGVySW5kZXguc2V0KGMsIGkpO1xuICAvLyAgIH0pO1xuXG4gIC8vICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjbHVzdGVyLmxlbmd0aDsgaSsrKSB7XG4gIC8vICAgICBjb25zdCBjID0gc3ViQ2x1c3RlcltjbHVzdGVyW2ldXTtcbiAgLy8gICAgIGNvbnN0IGluZGV4ID0gc3ViQ2x1c3RlckluZGV4LmdldChjKSE7XG4gIC8vICAgICBjb25zdCBzaXplID0gbm9ybWlsaXplZFNpemVzLmdldChjKSE7XG4gIC8vICAgICBlbWJlZFhbaV0gPSBjZW50ZXJYW2luZGV4XSArIE1hdGguc2luKE1hdGgucmFuZG9tKCkgKiBNYXRoLlBJICogMikgKiBzaXplIC8gTWF0aC5TUVJUMiAqIE1hdGgucmFuZG9tKCkgLyBtYXhTaXplICogc2NhbGluZ1JhdGlvO1xuICAvLyAgICAgZW1iZWRZW2ldID0gY2VudGVyWVtpbmRleF0gKyBNYXRoLmNvcyhNYXRoLnJhbmRvbSgpICogTWF0aC5QSSAqIDIpICogc2l6ZSAvIE1hdGguU1FSVDIgKiBNYXRoLnJhbmRvbSgpIC8gbWF4U2l6ZSAqIHNjYWxpbmdSYXRpbztcbiAgLy8gICB9XG5cbiAgLy8gICAvLyBub3JtaWxpemUgZW1iZWRkaW5nc1xuICAvLyAgIGxldCBtaW5YID0gZW1iZWRYWzBdO1xuICAvLyAgIGxldCBtaW5ZID0gZW1iZWRZWzBdO1xuICAvLyAgIGxldCBtYXhYID0gZW1iZWRYWzBdO1xuICAvLyAgIGxldCBtYXhZID0gZW1iZWRZWzBdO1xuICAvLyAgIGZvciAobGV0IGkgPSAxOyBpIDwgY2x1c3Rlci5sZW5ndGg7IGkrKykge1xuICAvLyAgICAgbWluWCA9IE1hdGgubWluKG1pblgsIGVtYmVkWFtpXSk7XG4gIC8vICAgICBtaW5ZID0gTWF0aC5taW4obWluWSwgZW1iZWRZW2ldKTtcbiAgLy8gICAgIG1heFggPSBNYXRoLm1heChtYXhYLCBlbWJlZFhbaV0pO1xuICAvLyAgICAgbWF4WSA9IE1hdGgubWF4KG1heFksIGVtYmVkWVtpXSk7XG4gIC8vICAgfVxuICAvLyAgIGxldCBzY2FsZVggPSBtYXhYIC0gbWluWDtcbiAgLy8gICBsZXQgc2NhbGVZID0gbWF4WSAtIG1pblk7XG4gIC8vICAgaWYgKHNjYWxlWCA9PT0gMClcbiAgLy8gICAgIHNjYWxlWCA9IDE7XG4gIC8vICAgaWYgKHNjYWxlWSA9PT0gMClcbiAgLy8gICAgIHNjYWxlWSA9IDE7XG4gIC8vICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjbHVzdGVyLmxlbmd0aDsgaSsrKSB7XG4gIC8vICAgICBlbWJlZFhbaV0gPSAoZW1iZWRYW2ldIC0gbWluWCkgLyBzY2FsZVg7XG4gIC8vICAgICBlbWJlZFlbaV0gPSAoZW1iZWRZW2ldIC0gbWluWSkgLyBzY2FsZVk7XG4gIC8vICAgfVxuXG5cbi8vICAgcmV0dXJuIHtlbWJlZFgsIGVtYmVkWX07XG59XG4iXX0=","var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n};\n/**\n * colwise normalize the knn similarities\n * BE WARE, modifies the input array in place\n * @param device\n * @param knnSimilarities\n * @param offsets\n * @param nRows\n */\nexport function sparseKNNNoralizeColwise(device, knnSimilarities, offsets, nRows) {\n return __awaiter(this, void 0, void 0, function* () {\n const neededThreads = nRows;\n const workGroupThreadsPerDim = 10;\n const totalWorkgroupThreads = workGroupThreadsPerDim * workGroupThreadsPerDim;\n const neededWorkGroups = Math.ceil(neededThreads / totalWorkgroupThreads);\n const workGroupDim = Math.ceil(Math.sqrt(neededWorkGroups));\n const threadsPerDim = workGroupThreadsPerDim * workGroupDim;\n const module = device.createShaderModule({\n label: 'colwise-normalize',\n code: `\n @group(0) @binding(0) var<storage, read_write> knnSimilarities : array<f32>;\n @group(0) @binding(1) var<storage, read> offsets : array<u32>;\n @compute @workgroup_size(${workGroupThreadsPerDim}, ${workGroupThreadsPerDim}) fn normalize(\n @builtin(global_invocation_id) id: vec3<u32>,\n ) {\n let row = id.x;\n let col = id.y;\n let index = row * ${threadsPerDim} + col;\n if (index >= ${nRows}) {\n return;\n }\n let offsetBegin = offsets[index];\n let offsetEnd = offsets[index + 1];\n var sum = 0.0;\n if (offsetEnd - offsetBegin == 0) {\n return;\n }\n for (var i = offsetBegin; i < offsetEnd; i = i + 1) {\n sum = sum + knnSimilarities[i];\n }\n if (sum > 0.0) {\n for (var i = offsetBegin; i < offsetEnd; i = i + 1) {\n knnSimilarities[i] = knnSimilarities[i] / sum;\n }\n }\n }\n \n `,\n });\n const pipeline = device.createComputePipeline({\n label: 'hamming compute pipeline',\n layout: 'auto',\n compute: {\n module,\n entryPoint: 'normalize',\n },\n });\n const simmilaritiesBuffer = device.createBuffer({\n label: 'simmilarities info buffer',\n size: knnSimilarities.byteLength,\n usage: GPUBufferUsage.STORAGE |\n GPUBufferUsage.COPY_SRC |\n GPUBufferUsage.COPY_DST,\n mappedAtCreation: true,\n });\n new Float32Array(simmilaritiesBuffer.getMappedRange()).set(knnSimilarities);\n simmilaritiesBuffer.unmap();\n const offsetsBuffer = device.createBuffer({\n label: 'offsets info buffer',\n size: offsets.byteLength,\n usage: GPUBufferUsage.STORAGE |\n GPUBufferUsage.COPY_SRC |\n GPUBufferUsage.COPY_DST,\n mappedAtCreation: true,\n });\n new Uint32Array(offsetsBuffer.getMappedRange()).set(offsets);\n offsetsBuffer.unmap();\n const bindGroup = device.createBindGroup({\n layout: pipeline.getBindGroupLayout(0),\n entries: [\n {\n binding: 0,\n resource: {\n buffer: simmilaritiesBuffer,\n },\n },\n {\n binding: 1,\n resource: {\n buffer: offsetsBuffer,\n },\n },\n ],\n });\n const commandEncoder = device.createCommandEncoder();\n const passEncoder = commandEncoder.beginComputePass();\n passEncoder.setPipeline(pipeline);\n passEncoder.setBindGroup(0, bindGroup);\n passEncoder.dispatchWorkgroups(workGroupDim, workGroupDim);\n passEncoder.end();\n const outSimilarityBuffer = device.createBuffer({\n label: 'out similarity buffer',\n size: knnSimilarities.byteLength,\n usage: GPUBufferUsage.MAP_READ | GPUBufferUsage.COPY_DST,\n });\n commandEncoder.copyBufferToBuffer(simmilaritiesBuffer, 0, outSimilarityBuffer, 0, knnSimilarities.byteLength);\n device.queue.submit([commandEncoder.finish()]);\n yield device.queue.onSubmittedWorkDone();\n yield outSimilarityBuffer.mapAsync(GPUMapMode.READ);\n const arrayBuffer = new Float32Array(outSimilarityBuffer.getMappedRange());\n knnSimilarities.set(arrayBuffer);\n outSimilarityBuffer.unmap();\n simmilaritiesBuffer.destroy();\n offsetsBuffer.destroy();\n outSimilarityBuffer.destroy();\n });\n}\n//# sourceMappingURL=colwise-normalize.js.map","var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n};\n/**\n * inflation operator in place\n */\nexport function inflate(knnSimilarities, factor = 2) {\n for (let i = 0; i < knnSimilarities.length; i++)\n knnSimilarities[i] = Math.pow(knnSimilarities[i], factor);\n}\nfunction getRowIndexes(offsets) {\n const res = new Uint32Array(offsets[offsets.length - 1]);\n for (let i = 0; i < offsets.length - 1; i++) {\n for (let j = offsets[i]; j < offsets[i + 1]; j++)\n res[j] = i;\n }\n return res;\n}\n// this implementation is not looking at already zeroed out values, and only looks at live cells.\nexport function expandNoRevive(device, knnSimilarities, knnIndexes, offsets, _nRows) {\n return __awaiter(this, void 0, void 0, function* () {\n const neededThreads = 90000;\n const workGroupThreadsPerDim = 10;\n const totalWorkgroupThreads = workGroupThreadsPerDim * workGroupThreadsPerDim;\n const neededWorkGroups = Math.ceil(neededThreads / totalWorkgroupThreads);\n const workGroupDim = Math.ceil(Math.sqrt(neededWorkGroups));\n const threadsPerDim = workGroupThreadsPerDim * workGroupDim;\n //const order = Math.floor(Math.max(Math.log(nRows), 2));\n // minimum value after expansion.\n const pruneValue = 0.000000001; //Math.pow(10, -order);\n const outKNNSimilarities = new Float32Array(knnSimilarities.length);\n const module = device.createShaderModule({\n label: 'expand',\n code: `\n struct SparseKNN {\n knnSimilarities: array<f32, ${knnSimilarities.length}>,\n knnIndexes: array<u32, ${knnIndexes.length}>,\n offsets: array<u32, ${offsets.length}>,\n rowIndexes: array<u32, ${knnIndexes.length}>,\n }\n\n @group(0) @binding(0) var<storage, read_write> sparseKNN: SparseKNN;\n @group(0) @binding(1) var<storage, read_write> resultSimBlock: array<f32, ${neededThreads}>;\n @group(0) @binding(2) var<storage, read_write> startAt: u32;\n @compute @workgroup_size(${workGroupThreadsPerDim}, ${workGroupThreadsPerDim}) fn expand(\n @builtin(global_invocation_id) id: vec3<u32>,\n ) {\n let col = id.x;\n let row = id.y;\n let index = row * ${threadsPerDim} + col;\n if (index >= ${neededThreads}) {\n return;\n }\n let workingIndex = index + startAt;\n if (workingIndex >= ${knnIndexes.length}) {\n return;\n }\n \n let rowIdx = sparseKNN.rowIndexes[workingIndex];\n let colIdx = sparseKNN.knnIndexes[workingIndex];\n let offsetBeginRow = sparseKNN.offsets[rowIdx];\n let offsetEndRow = sparseKNN.offsets[rowIdx + 1];\n let offsetBeginCol = sparseKNN.offsets[colIdx];\n let offsetEndCol = sparseKNN.offsets[colIdx + 1];\n var sum = 0.0;\n for (var i = offsetBeginRow; i < offsetEndRow; i = i + 1) {\n for(var j = offsetBeginCol; j < offsetEndCol; j = j + 1) {\n if (sparseKNN.knnIndexes[i] == sparseKNN.knnIndexes[j]) {\n sum = sum + sparseKNN.knnSimilarities[i] * sparseKNN.knnSimilarities[j];\n break;\n }\n }\n }\n if (sum > ${pruneValue}) {\n resultSimBlock[index] = sum;\n } else {\n resultSimBlock[index] = 0.0;\n }\n }\n `\n });\n const pipeline = device.createComputePipeline({\n label: 'expand compute pipeline',\n layout: 'auto',\n compute: {\n module: module,\n entryPoint: 'expand',\n },\n });\n const sparseKNNBuffer32Size = knnSimilarities.length + knnIndexes.length + offsets.length + knnIndexes.length;\n let sparseKNNBufferByteSize = sparseKNNBuffer32Size * 4;\n const remainder = sparseKNNBufferByteSize & 15;\n if (remainder !== 0)\n sparseKNNBufferByteSize += 16 - remainder;\n const sparseKNNBuffer = device.createBuffer({\n label: 'sparse knn buffer',\n size: sparseKNNBufferByteSize,\n usage: GPUBufferUsage.STORAGE |\n GPUBufferUsage.COPY_SRC |\n GPUBufferUsage.COPY_DST,\n mappedAtCreation: true,\n });\n const sparseKNNArrayBuffer = sparseKNNBuffer.getMappedRange();\n // set similarities\n new Float32Array(sparseKNNArrayBuffer, 0, knnSimilarities.length).set(knnSimilarities);\n // set indexes\n new Uint32Array(sparseKNNArrayBuffer, knnSimilarities.length * 4, knnIndexes.length).set(knnIndexes);\n // set offsets\n new Uint32Array(sparseKNNArrayBuffer, (knnSimilarities.length + knnIndexes.length) * 4, offsets.length).set(offsets);\n // set row indexes\n const rowIndexes = getRowIndexes(offsets);\n new Uint32Array(sparseKNNArrayBuffer, (knnSimilarities.length + knnIndexes.length + offsets.length) * 4, rowIndexes.length).set(rowIndexes);\n sparseKNNBuffer.unmap();\n const startBuffer = device.createBuffer({\n label: 'start end buffer',\n size: 4,\n usage: GPUBufferUsage.STORAGE |\n GPUBufferUsage.COPY_SRC |\n GPUBufferUsage.COPY_DST,\n mappedAtCreation: true,\n });\n new Uint32Array(startBuffer.getMappedRange()).set([0]);\n startBuffer.unmap();\n const resultBlockBuffer = device.createBuffer({\n label: 'result block buffer',\n size: neededThreads * 4,\n usage: GPUBufferUsage.STORAGE |\n GPUBufferUsage.COPY_SRC |\n GPUBufferUsage.COPY_DST,\n });\n const bindGroup = device.createBindGroup({\n layout: pipeline.getBindGroupLayout(0),\n entries: [\n { binding: 0, resource: { buffer: sparseKNNBuffer } },\n { binding: 1, resource: { buffer: resultBlockBuffer } },\n { binding: 2, resource: { buffer: startBuffer } },\n ],\n });\n const outBlockBuffer = device.createBuffer({\n label: 'out block buffer',\n size: resultBlockBuffer.size,\n usage: GPUBufferUsage.MAP_READ | GPUBufferUsage.COPY_DST\n });\n for (let i = 0; i < Math.ceil(knnIndexes.length / neededThreads); i++) {\n const start = i * neededThreads;\n const curLength = Math.min(neededThreads, knnIndexes.length - start);\n device.queue.writeBuffer(startBuffer, 0, new Uint32Array([start]));\n const encoder = device.createCommandEncoder({\n label: 'expand encoder',\n });\n const pass = encoder.beginComputePass({\n label: 'expand compute pass',\n });\n pass.setPipeline(pipeline);\n pass.setBindGroup(0, bindGroup);\n pass.dispatchWorkgroups(workGroupDim, workGroupDim);\n pass.end();\n encoder.copyBufferToBuffer(resultBlockBuffer, 0, outBlockBuffer, 0, outBlockBuffer.size);\n device.queue.submit([encoder.finish()]);\n //console.time('onSubmittedWorkDone');\n yield device.queue.onSubmittedWorkDone();\n //console.timeEnd('onSubmittedWorkDone');\n yield outBlockBuffer.mapAsync(GPUMapMode.READ);\n const outBlock = new Float32Array(outBlockBuffer.getMappedRange(), 0, curLength);\n //console.time('fillout');\n outKNNSimilarities.set(outBlock, start);\n //console.timeEnd('fillout');\n outBlockBuffer.unmap();\n }\n // destroy\n sparseKNNBuffer.destroy();\n startBuffer.destroy();\n resultBlockBuffer.destroy();\n outBlockBuffer.destroy();\n return { KNNIndexes: knnIndexes, KNNSimilarities: outKNNSimilarities, indexOffsets: offsets };\n });\n}\n//# sourceMappingURL=inflate-expand.js.map","import { toOffsetForm } from '../umap/utils';\nexport function countOccurancesAddLoops(sparseMatrix, nRows) {\n const res = new Uint32Array(nRows);\n for (let i = 0; i < sparseMatrix.i.length; i++) {\n res[sparseMatrix.i[i]]++;\n res[sparseMatrix.j[i]]++;\n }\n // add loops\n for (let i = 0; i < nRows; i++)\n res[i]++;\n return res;\n}\n/**\n * BE WARE, this function is ment for half sparse matrices only!!!\n * @param sparseMatrix\n * @param nRows\n * @returns\n */\nexport function toSparseKNNSimilarityForm(sparseMatrix, nRows) {\n const occurenceCount = countOccurancesAddLoops(sparseMatrix, nRows);\n const offsetForm = toOffsetForm(occurenceCount);\n const insertCounter = new Uint32Array(nRows).fill(1); // for counting how many things we inserted into the knn arrays.\n // we initialize these counters to one because first we insert the self loops\n // dont be confused by the name knn, k here is variable, its just the thing that in this form, we know that at index i\n // we have some k(variable) ammount of sparse neigbours\n // we know for a fact that sparse matrix will not contain any duplicates, we add nRows to account for self loops\n const KNNIndexes = new Uint32Array(sparseMatrix.i.length * 2 + nRows);\n const KNNSimilarities = new Float32Array(sparseMatrix.i.length * 2 + nRows);\n // insert self loops at the start of each offset\n for (let i = 0; i < nRows; i++) {\n KNNIndexes[offsetForm[i]] = i;\n KNNSimilarities[offsetForm[i]] = 1;\n }\n for (let i = 0; i < sparseMatrix.i.length; i++) {\n const row = sparseMatrix.i[i];\n const col = sparseMatrix.j[i];\n const similarity = 1 - sparseMatrix.distance[i];\n KNNIndexes[offsetForm[row] + insertCounter[row]] = col;\n KNNSimilarities[offsetForm[row] + insertCounter[row]] = similarity;\n insertCounter[row]++;\n KNNIndexes[offsetForm[col] + insertCounter[col]] = row;\n KNNSimilarities[offsetForm[col] + insertCounter[col]] = similarity;\n insertCounter[col]++;\n }\n return { KNNIndexes, KNNSimilarities, indexOffsets: offsetForm };\n}\nexport function knnToSparseForm(knnIndexes, knnSims) {\n const lengths = knnIndexes.map((x) => x.length);\n const totalLength = lengths.reduce((a, b) => a + b, 0);\n const offsets = toOffsetForm(lengths);\n const outIndexes = new Uint32Array(totalLength);\n const outSims = new Float32Array(totalLength);\n for (let i = 0; i < knnIndexes.length; i++) {\n outIndexes.set(knnIndexes[i], offsets[i]);\n outSims.set(knnSims[i], offsets[i]);\n }\n return { KNNIndexes: outIndexes, KNNSimilarities: outSims, indexOffsets: offsets };\n}\n//# sourceMappingURL=utils.js.map","var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n};\nimport { levenbergMarquardt } from 'ml-levenberg-marquardt';\nexport function linear(x1, x2, n) {\n const step = (x2 - x1) / (n - 1);\n return Array.from({ length: n }, (_, i) => x1 + step * i);\n}\n/**\n * Fit a, b params for the differentiable curve used in lower\n * dimensional fuzzy simplicial complex construction. We want the\n * smooth curve (from a pre-defined family with simple gradient) that\n * best matches an offset exponential decay.\n */\nexport function findABParams(spread, minDist) {\n const curve = ([a, b]) => (x) => {\n return 1.0 / (1.0 + a * Math.pow(x, (2 * b)));\n };\n const xv = linear(0, spread * 3, 300)\n .map((val) => (val < minDist ? 1.0 : val));\n const yv = new Array(xv.length).fill(0).map((val, index) => {\n const gte = xv[index] >= minDist;\n return gte ? Math.exp(-(xv[index] - minDist) / spread) : val;\n });\n const initialValues = [0.5, 0.5];\n const data = { x: xv, y: yv };\n // Default options for the algorithm (from github example)\n const options = {\n damping: 1.5,\n initialValues,\n gradientDifference: 10e-2,\n maxIterations: 100,\n errorTolerance: 10e-3,\n };\n // eslint-disable-next-line new-cap\n const { parameterValues } = levenbergMarquardt(data, curve, options);\n const [a, b] = parameterValues;\n return { a, b };\n}\n/**\n * heuristic for number of epochs of umap, differs from cpu version, because of the way gpu passes data\n * @param entryLen number of entries\n * @returns\n */\nexport function getNEpochs(entryLen) {\n //\n const length = entryLen;\n if (length <= 2500)\n return 1000;\n else if (length <= 5000)\n return 800;\n else if (length <= 7500)\n return 650;\n else\n return 400;\n}\n/** helper function that transforms array of sizes to offset form */\nexport function toOffsetForm(ar) {\n const res = new Uint32Array(ar.length + 1);\n let offset = 0;\n for (let i = 0; i < ar.length; i++) {\n res[i] = offset;\n offset += ar[i];\n }\n res[ar.length] = offset;\n return res;\n}\n/** multiplies flat representation of sparse knn info by scalar.\n * also no point of doing this on gpu, can be done on cpu pretty quickly.\n * if there will be need for it, it can be done on gpu as well very very easily.\n * @param values values array\n * @param scalar\n */\nexport function multiplyScalar(values, scalar) {\n for (let i = 0; i < values.length; i++)\n values[i] = values[i] * scalar;\n}\n/**\n * generate transpose of knn from the transposition info taken from sparse knn info\n * using this information avoids billions of array.push calls, is much cleaner, allows typed array use and is faster.\n * no point of doing this on gpu, can be done on cpu as we already have all the info needed.\n * @param knnIndexes\n * @param knnDistances\n * @param knnSparseInfo\n * @param knnSize\n * @returns\n */\nexport function transposeKNN(knnIndexes, knnDistances, knnSparseInfo, knnSize = 15) {\n return __awaiter(this, void 0, void 0, function* () {\n const numOfEntries = knnIndexes.length;\n const fullKnnEntrySize = knnSize * numOfEntries;\n const transposeSizes = knnSparseInfo.resultTransposeSizesArray;\n const transposeOffsets = toOffsetForm(transposeSizes);\n const offsetsCopy = new Uint32Array(transposeOffsets.length);\n offsetsCopy.set(transposeOffsets); // will be used for dynamic indexing\n const transposeKNNIndexes = new Int32Array(fullKnnEntrySize).fill(0);\n const transposeKNNDistances = new Float32Array(fullKnnEntrySize).fill(0);\n for (let i = 0; i < numOfEntries; i++) {\n for (let j = 0; j < knnSize; j++) {\n const otherIndex = knnIndexes[i][j];\n const otherIndexOffset = offsetsCopy[otherIndex];\n transposeKNNIndexes[otherIndexOffset] = i;\n transposeKNNDistances[otherIndexOffset] = knnDistances[i][j];\n offsetsCopy[otherIndex] += 1;\n }\n }\n return { transposeKNNIndexes, transposeKNNDistances, transposeOffsets };\n });\n}\n//# sourceMappingURL=utils.js.map","// eslint-disable-next-line @typescript-eslint/unbound-method\nconst toString = Object.prototype.toString;\n/**\n * Checks if an object is an instance of an Array (array or typed array, except those that contain bigint values).\n *\n * @param value - Object to check.\n * @returns True if the object is an array or a typed array.\n */\nexport function isAnyArray(value) {\n const tag = toString.call(value);\n return tag.endsWith('Array]') && !tag.includes('Big');\n}\n//# sourceMappingURL=index.js.map","import { bioLayout } from './bio-layout';\nimport { markovClusterWebGPU } from '@datagrok-libraries/math/src/webGPU/MCL/MCL-webGPU';\nexport const defaultMCLOptions = {\n expandFactor: 2,\n maxIterations: 5,\n inflateFactor: 2,\n multFactor: 1,\n};\nexport class MCLSparseReducer {\n constructor(opts = {}) {\n this._options = { ...defaultMCLOptions, ...opts };\n }\n async transform(sparseMatrix, nRows) {\n // testWorkerMultiply();\n // return new Int32Array(nRows);\n const originalSparseObject = this.toObjectForm(sparseMatrix);\n const sparseClusters = this.assignClusters(originalSparseObject, nRows);\n this.correctClusters(sparseClusters.clusters);\n let sparseObject = originalSparseObject;\n if (this._options.maxIterations > 0) {\n this.addLoops(sparseObject, nRows);\n this.normalize(sparseObject);\n for (let i = 0; i < this._options.maxIterations; i++) {\n sparseObject = this.expand(sparseObject, nRows);\n this.normalize(sparseObject);\n this.inflate(sparseObject);\n this.normalize(sparseObject);\n }\n }\n const { clusters } = this.assignClusters(sparseObject, nRows);\n this.correctClusters(clusters);\n //const embeddings = this.layoutInterConnect(clusters, nRows, sparseObject, sparseMatrix);\n const embeddings = this.layout(sparseClusters.clusters, originalSparseObject, nRows, clusters);\n return { clusters, embedX: embeddings.embedX, embedY: embeddings.embedY, is: sparseMatrix.i, js: sparseMatrix.j };\n }\n async transformWebGPU(sparseMatrix, nRows) {\n if (this._options.maxIterations === 0)\n return this.transform(sparseMatrix, nRows);\n const mclRes = await markovClusterWebGPU(sparseMatrix, nRows, this._options.maxIterations, this._options.inflateFactor);\n const originalSparseObject = this.toObjectForm(sparseMatrix);\n const sparseClusters = this.assignClusters(originalSparseObject, nRows);\n this.correctClusters(sparseClusters.clusters);\n const sparseObject = this.csrToSparseObject(mclRes, nRows);\n const { clusters } = this.assignClusters(sparseObject, nRows);\n this.correctClusters(clusters);\n const embeddings = this.layout(sparseClusters.clusters, originalSparseObject, nRows, clusters);\n return { clusters, embedX: embeddings.embedX, embedY: embeddings.embedY, is: sparseMatrix.i, js: sparseMatrix.j };\n }\n correctClusters(clusters) {\n const clusterSizeMap = {};\n for (const cluster of clusters) {\n if (!clusterSizeMap[cluster])\n clusterSizeMap[cluster] = 0;\n clusterSizeMap[cluster]++;\n }\n const sortedIndexes = Object.keys(clusterSizeMap).map(Number).sort((a, b) => clusterSizeMap[b] - clusterSizeMap[a]);\n const clusterMap = {};\n sortedIndexes.forEach((clusterIdx, i) => clusterMap[clusterIdx] = i + 1);\n for (let i = 0; i < clusters.length; i++)\n clusters[i] = clusterMap[clusters[i]];\n }\n csrToSparseObject(mclRes, nRows) {\n const order = Math.floor(Math.max(Math.log10(nRows), 2)) + 1;\n const minOrder = 1 / Math.pow(10, order);\n const sparseObject = {};\n for (let i = 0; i < nRows; i++) {\n sparseObject[i] = {};\n for (let k = mclRes.indexOffsets[i]; k < mclRes.indexOffsets[i + 1]; k++) {\n const j = mclRes.KNNIndexes[k];\n if (j <= i || mclRes.KNNSimilarities[k] < minOrder)\n continue;\n sparseObject[i][j] = mclRes.KNNSimilarities[k];\n }\n }\n return sparseObject;\n }\n // private layoutInterConnect(\n // clusters: number[], nRows: number, sparseMatrix: SparseMatrixObject, originalSparse: SparseMatrixResult\n // ) {\n // const embedX = new Float32Array(nRows).fill(0);\n // const embedY = new Float32Array(nRows).fill(0);\n // const clusterMap: {[_: number]: number[]} = {};\n // clusters.forEach((cluster, i) => {\n // if (!clusterMap[cluster])\n // clusterMap[cluster] = [];\n // clusterMap[cluster].push(i);\n // });\n // // first we layout the individual clusters\n // const sortedClusterNames = Object.keys(clusterMap);\n // sortedClusterNames.sort((a, b) => clusterMap[b as any].length - clusterMap[a as any].length);\n // const clusterEmbeddings: {[clusterNum: number]: {embedX: Float32Array, embedY: Float32Array}} = {};\n // for (const clusterName of sortedClusterNames) {\n // const cluster = clusterMap[clusterName as any]!;\n // // these embeddings will be in range 0-1\n // clusterEmbeddings[clusterName as any] = bioLayout(cluster, sparseMatrix, 0.001);\n // // lets say layout size is 10x10\n // // normilize the size of embeddings according to the size of the cluster\n // const clusterSize = Math.sqrt(cluster.length);\n // const embedX = clusterEmbeddings[clusterName as any].embedX;\n // const embedY = clusterEmbeddings[clusterName as any].embedY;\n // let minX = embedX[0];\n // let maxX = embedX[0];\n // let minY = embedY[0];\n // let maxY = embedY[0];\n // for (let i = 1; i < cluster.length; i++) {\n // minX = Math.min(minX, embedX[i]);\n // maxX = Math.max(maxX, embedX[i]);\n // minY = Math.min(minY, embedY[i]);\n // maxY = Math.max(maxY, embedY[i]);\n // }\n // const rangeX = maxX == minX ? 1 : maxX - minX;\n // const rangeY = maxY == minY ? 1: maxY - minY;\n // for (let i = 0; i < cluster.length; i++) {\n // embedX[i] = (embedX[i] - minX) / rangeX / 1.5 + 0.16;\n // embedY[i] = (embedY[i] - minY) / rangeY / 1.5 + 0.16;\n // }\n // }\n // // numbers of interCluster connections\n // const residualClusterConnections: {[clusterNum: number]: {[cluster2Num: number]: number}} = {};\n // const superClusters: {[_: number]: number} = {}; // maps original cluster number to super cluster number\n // let superClusterNum = 1;\n // // initialize superclusters to be the same as clusters\n // for (const clusterNum of Object.keys(clusterMap))\n // superClusters[Number(clusterNum)] = Number(clusterNum);\n // for (let con = 0; con < originalSparse.i.length; con ++) {\n // const i = originalSparse.i[con];\n // const j = originalSparse.j[con];\n // if (clusters[i] === clusters[j])\n // continue;\n // if (!residualClusterConnections[clusters[i]])\n // residualClusterConnections[clusters[i]] = {};\n // if (!residualClusterConnections[clusters[j]])\n // residualClusterConnections[clusters[j]] = {};\n // if (!residualClusterConnections[clusters[i]][clusters[j]])\n // residualClusterConnections[clusters[i]][clusters[j]] = 0;\n // if (!residualClusterConnections[clusters[j]][clusters[i]])\n // residualClusterConnections[clusters[j]][clusters[i]] = 0;\n // residualClusterConnections[clusters[i]][clusters[j]]++;\n // residualClusterConnections[clusters[j]][clusters[i]]++;\n // if (!superClusters[clusters[i]] && !superClusters[clusters[j]]) {\n // superClusters[clusters[i]] = superClusterNum;\n // superClusters[clusters[j]] = superClusterNum;\n // superClusterNum++;\n // } else if (superClusters[clusters[i]] && superClusters[clusters[j]]) {\n // const compVal = Number(superClusters[clusters[j]]);\n // for (const clusterNum of (Object.keys(superClusters) as unknown as number[])) {\n // if (Number(superClusters[clusterNum]) === compVal)\n // superClusters[clusterNum] = superClusters[clusters[i]];\n // }\n // superClusters[clusters[j]] = superClusters[clusters[i]];\n // } else {\n // const superCluster = superClusters[clusters[i]] ?? superClusters[clusters[j]];\n // superClusters[clusters[i]] = superCluster;\n // superClusters[clusters[j]] = superCluster;\n // }\n // }\n // // now we can get the reverse mapping of super clusters to clusters\n // const superClusterMap: {[_: number]: number[]} = {};\n // for (const clusterNum of Object.keys(superClusters)) {\n // const superClusterNum = superClusters[Number(clusterNum)];\n // if (!superClusterMap[superClusterNum])\n // superClusterMap[superClusterNum] = [];\n // superClusterMap[superClusterNum].push(Number(clusterNum));\n // }\n // // we need to have superClusters sorted by total size of points in them\n // const superClusterNums = Object.keys(superClusterMap).map(Number);\n // const superClusterSizes: {[supClustNum: number]: number} = {};\n // superClusterNums.forEach((superClusterNum) => {\n // let size = 0;\n // for (const clusterNum of superClusterMap[superClusterNum])\n // size += clusterMap[clusterNum].length;\n // superClusterSizes[superClusterNum] = size;\n // });\n // const sortedSuperClusterNums = superClusterNums.sort((a, b) => superClusterSizes[b] - superClusterSizes[a]);\n // // need to also sort clusters in each superCluster by size\n // for (const superClusterNum of sortedSuperClusterNums) {\n // const clusterNums = superClusterMap[superClusterNum];\n // clusterNums.sort((a, b) => clusterMap[b].length - clusterMap[a].length);\n // }\n // // now we need to layout superClusters\n // superClusterNum = 0;\n // let supPerRow = 3;\n // let supYOffset = 0;\n // const supLayoutSize = 15;\n // for (const superClusterName of sortedSuperClusterNums) {\n // // cs contains ids of clusters which are in this superCluster (superClusterName)\n // const cs = superClusterMap[superClusterName];\n // // space for 3 clusters in row(start with that), that actually fits 2 and rest is space between and arround\n // let perRow = 3;\n // let yOffset = 0;\n // let clusterNum = 0;\n // if (superClusterNum === Math.ceil(supPerRow / 1.5)) {\n // superClusterNum = 0;\n // supYOffset += supLayoutSize / supPerRow;\n // supPerRow = Math.ceil(supPerRow * 1.5);\n // }\n // const layoutSize = supLayoutSize / supPerRow;\n // const supOffsetX = ((superClusterNum % supPerRow + 0.25) * supLayoutSize / supPerRow) * 1.5;\n // let minX = Number.MAX_VALUE;\n // let maxX = Number.MIN_VALUE;\n // let minY = Number.MAX_VALUE;\n // let maxY = Number.MIN_VALUE;\n // for (const cn of cs) {\n // // cn is the id of subclaster\n // const clusterIs = clusterMap[cn];\n // // clusterIs contains indexes of points in this cluster\n // const embeddings = clusterEmbeddings[cn];\n // if (clusterNum === Math.ceil(perRow / 1.5)) {\n // clusterNum = 0;\n // yOffset += layoutSize / perRow;\n // perRow = Math.ceil(perRow * 1.5);\n // }\n // const offsetX = ((clusterNum % perRow) * layoutSize / perRow) * 1.5;\n // for (let i = 0; i < embeddings.embedX.length; i++) {\n // embedX[clusterIs[i]] = embeddings.embedX[i] * layoutSize / perRow + offsetX + supOffsetX;\n // embedY[clusterIs[i]] = embeddings.embedY[i] * layoutSize / perRow + yOffset + supYOffset;\n // minX = Math.min(minX, embedX[clusterIs[i]]);\n // maxX = Math.max(maxX, embedX[clusterIs[i]]);\n // minY = Math.min(minY, embedY[clusterIs[i]]);\n // maxY = Math.max(maxY, embedY[clusterIs[i]]);\n // }\n // clusterNum++;\n // }\n // // rescale all superclusters to their bounding box\n // const rangeX = maxX - minX == 0 ? 1 : maxX - minX;\n // const rangeY = maxY - minY == 0 ? 1 : maxY - minY;\n // const boundXMin = supOffsetX;\n // const boundYMin = supYOffset;\n // const boundXMax = supOffsetX + layoutSize;\n // const boundYMax = supYOffset + layoutSize;\n // for (const cn of cs) {\n // const clusterIs = clusterMap[cn];\n // for (let i = 0; i < clusterIs.length; i++) {\n // embedX[clusterIs[i]] = (embedX[clusterIs[i]] - minX) / rangeX / 1.2 * (boundXMax - boundXMin) + boundXMin;\n // embedY[clusterIs[i]] = (embedY[clusterIs[i]] - minY) / rangeY / 1.2 * (boundYMax - boundYMin) + boundYMin;\n // }\n // }\n // superClusterNum++;\n // }\n // return {embedX, embedY};\n // }\n layout(clusters, sparseMatrix, nRows, subCluster) {\n const embedX = new Float32Array(nRows).fill(0);\n const embedY = new Float32Array(nRows).fill(0);\n const clusterMap = {};\n clusters.forEach((cluster, i) => {\n if (!clusterMap[cluster])\n clusterMap[cluster] = [];\n clusterMap[cluster].push(i);\n });\n // const nClusters = Object.keys(clusterMap).length;\n // const perRow = Math.floor(Math.sqrt(nClusters));\n let clusterNum = 0;\n const sortedClusterNames = Object.keys(clusterMap);\n sortedClusterNames.sort((a, b) => clusterMap[b].length - clusterMap[a].length);\n let perRow = 1;\n let yOffset = 0;\n const layoutSize = 5;\n for (const clusterName of sortedClusterNames) {\n const cluster = clusterMap[clusterName];\n const embeddings = bioLayout(cluster, sparseMatrix, 0.001, subCluster);\n if (clusterNum === perRow) {\n clusterNum = 0;\n yOffset += layoutSize / perRow;\n perRow = Math.min(Math.ceil(perRow * 3), 45);\n }\n //const clustersPerRow = Math.ceil(perRow / 1.5);\n const offsetX = ((clusterNum) * layoutSize / perRow + layoutSize / perRow * (1 / 1.2 / 4));\n // const offsetY = Math.floor(clusterNum / perRow) * 2;\n for (let i = 0; i < embeddings.embedX.length; i++) {\n embedX[cluster[i]] = embeddings.embedX[i] * layoutSize / perRow / 1.2 + offsetX;\n embedY[cluster[i]] = embeddings.embedY[i] * layoutSize / perRow / 1.2 + yOffset;\n }\n clusterNum++;\n }\n return { embedX, embedY };\n }\n mergeClusters(clusters, i, j) {\n const iCluster = clusters[i];\n const jCluster = clusters[j];\n for (let k = 0; k < clusters.length; k++) {\n if (clusters[k] === jCluster)\n clusters[k] = iCluster;\n }\n }\n assignClusters(sparseMatrix, nRows) {\n let clusterNum = 0;\n const is = [];\n const js = [];\n //const order = Math.floor(Math.max(Math.log10(nRows), 2)) + 7;\n const minOrder = Math.pow(10, -14);\n const clusters = new Array(nRows).fill(-1);\n for (const i of Object.keys(sparseMatrix)) {\n for (const j of Object.keys(sparseMatrix[i])) {\n if (sparseMatrix[i][j] > minOrder &&\n sparseMatrix[i][j] !== Number(i) && Number(j) > Number(i)) {\n is.push(Number(i));\n js.push(Number(j));\n if (clusters[Number(i)] !== -1 && clusters[Number(j)] !== -1) {\n if (clusters[Number(i)] !== clusters[Number(j)])\n this.mergeClusters(clusters, Number(i), Number(j));\n }\n else if (clusters[Number(i)] !== -1) {\n clusters[Number(j)] = clusters[Number(i)];\n }\n else if (clusters[Number(j)] !== -1) {\n clusters[Number(i)] = clusters[Number(j)];\n }\n else {\n clusterNum++;\n clusters[Number(i)] = clusterNum;\n clusters[Number(j)] = clusterNum;\n }\n }\n }\n }\n for (let i = 0; i < clusters.length; i++) {\n if (clusters[i] === -1) {\n clusterNum++;\n clusters[i] = clusterNum;\n }\n }\n return { clusters, is: new Uint32Array(is), js: new Uint32Array(js) };\n }\n /** same as assign clusters but working on the level of CSR format returned from webGPU */\n assignClustersCSR(mclRes, nRows) {\n let clusterNum = 0;\n const is = [];\n const js = [];\n const order = Math.floor(Math.max(Math.log10(nRows), 2)) + 1;\n const minOrder = 1 / Math.pow(10, order);\n const clusters = new Array(nRows).fill(-1);\n const correctedOffsets = new Uint32Array(nRows + 1);\n let offsetCounter = 0;\n correctedOffsets[0] = 0;\n for (let i = 0; i < nRows; i++) {\n for (let k = mclRes.indexOffsets[i]; k < mclRes.indexOffsets[i + 1]; k++) {\n const j = mclRes.KNNIndexes[k];\n if (j <= i || mclRes.KNNSimilarities[k] <= minOrder)\n continue;\n is.push(i);\n js.push(j);\n offsetCounter++;\n if (clusters[i] !== -1 && clusters[j] !== -1) {\n if (clusters[i] !== clusters[j])\n this.mergeClusters(clusters, i, j);\n }\n else if (clusters[i] !== -1) {\n clusters[j] = clusters[i];\n }\n else if (clusters[j] !== -1) {\n clusters[i] = clusters[j];\n }\n else {\n clusterNum++;\n clusters[i] = clusterNum;\n clusters[j] = clusterNum;\n }\n }\n correctedOffsets[i + 1] = offsetCounter;\n }\n for (let i = 0; i < clusters.length; i++) {\n if (clusters[i] === -1) {\n clusterNum++;\n clusters[i] = clusterNum;\n }\n }\n return { clusters, is: new Uint32Array(is), js: new Uint32Array(js), correctedOffsets };\n }\n toObjectForm(sparseMatrix) {\n const sparseObject = {};\n for (let i = 0; i < sparseMatrix.i.length; i++) {\n if (!sparseObject[sparseMatrix.i[i]])\n sparseObject[sparseMatrix.i[i]] = {};\n sparseObject[sparseMatrix.i[i]][sparseMatrix.j[i]] = 1 - sparseMatrix.distance[i];\n if (!sparseObject[sparseMatrix.j[i]])\n sparseObject[sparseMatrix.j[i]] = {};\n sparseObject[sparseMatrix.j[i]][sparseMatrix.i[i]] = 1 - sparseMatrix.distance[i];\n }\n return sparseObject;\n }\n addLoops(sparseObject, nRows) {\n for (let i = 0; i < nRows; i++) {\n if (!sparseObject[i])\n sparseObject[i] = {};\n sparseObject[i][i] = this._options.multFactor;\n }\n }\n normalize(sparseObject) {\n for (const i of Object.keys(sparseObject)) {\n const row = sparseObject[i];\n let sum = 0;\n for (const j of Object.keys(row))\n sum += row[j];\n if (sum === 0)\n continue;\n for (const j of Object.keys(row))\n sparseObject[i][j] /= sum;\n }\n }\n expand(sparseObject, nRows) {\n const expandedObject = {};\n const minOrder = 1000000000;\n // if (nRows < 12000) {\n // // if rows are less than 12000, translate to matrix form and use the dense matrix multiplication\n // // this is faster than the sparse matrix multiplication\n // const denseMatrix = new Array(nRows).fill(0).map(() => new Float32Array(nRows).fill(0));\n // for (const i of Object.keys(sparseObject)) {\n // const row = sparseObject[i as any];\n // for (const j of Object.keys(row))\n // denseMatrix[i as any][j as any] = row[j as any];\n // }\n // // expansion step\n // for (let i = 0; i < nRows; i++) {\n // for (let j = i + 1; j < nRows; j++) {\n // let val = 0;\n // for (let k = 0; k < nRows; k++)\n // val += denseMatrix[i][k] * denseMatrix[j][k];\n // if (Math.round(val * minOrder) > 0) {\n // expandedObject[i] ??= {};\n // expandedObject[i][j] = val;\n // expandedObject[j] ??= {};\n // expandedObject[j][i] = val;\n // }\n // }\n // }\n // return sparseObject;\n // }\n for (let i = 0; i < nRows; i++) {\n if (!sparseObject[i])\n continue;\n // const row = sparseObject[i];\n expandedObject[i] ?? (expandedObject[i] = {});\n for (let j = i; j < nRows; j++) {\n if (!sparseObject[i]?.[j])\n continue;\n const val = this.getExpandValue(sparseObject, i, j); //pruning step\n if (Math.round(val * minOrder) > 0) {\n expandedObject[i][j] = val;\n if (!expandedObject[j])\n expandedObject[j] = {};\n expandedObject[j][i] = val;\n }\n }\n }\n return expandedObject;\n }\n // private prune(row: SparseMatrixObject[number]) {\n // }\n inflate(sparseObject) {\n for (const i of Object.keys(sparseObject)) {\n const row = sparseObject[i];\n for (const j of Object.keys(row))\n sparseObject[i][j] = Math.pow(sparseObject[i][j], this._options.inflateFactor);\n }\n }\n getExpandValue(sparseObject, i, j) {\n let val = 0;\n const currentIndexes = Object.keys(sparseObject[i] ?? {});\n const otherIndexes = Object.keys(sparseObject[j] ?? {});\n for (const k of currentIndexes) {\n if (otherIndexes.includes(k))\n val += sparseObject[i][k] * sparseObject[j][k];\n }\n return val;\n }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFyY292LWNsdXN0ZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJtYXJjb3YtY2x1c3Rlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQUMsU0FBUyxFQUFDLE1BQU0sY0FBYyxDQUFDO0FBR3ZDLE9BQU8sRUFBQyxtQkFBbUIsRUFBQyxNQUFNLG9EQUFvRCxDQUFDO0FBQ3ZGLE1BQU0sQ0FBQyxNQUFNLGlCQUFpQixHQUFlO0lBQzNDLFlBQVksRUFBRSxDQUFDO0lBQ2YsYUFBYSxFQUFFLENBQUM7SUFDaEIsYUFBYSxFQUFFLENBQUM7SUFDaEIsVUFBVSxFQUFFLENBQUM7Q0FDZCxDQUFDO0FBRUYsTUFBTSxPQUFPLGdCQUFnQjtJQUczQixZQUFZLE9BQTRCLEVBQUU7UUFDeEMsSUFBSSxDQUFDLFFBQVEsR0FBRyxFQUFDLEdBQUcsaUJBQWlCLEVBQUUsR0FBRyxJQUFJLEVBQUMsQ0FBQztJQUNsRCxDQUFDO0lBRU0sS0FBSyxDQUFDLFNBQVMsQ0FBQyxZQUFnQyxFQUFFLEtBQWE7UUFDcEUsd0JBQXdCO1FBQ3hCLGdDQUFnQztRQUNoQyxNQUFNLG9CQUFvQixHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDN0QsTUFBTSxjQUFjLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxvQkFBb0IsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUN4RSxJQUFJLENBQUMsZUFBZSxDQUFDLGNBQWMsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUM5QyxJQUFJLFlBQVksR0FBRyxvQkFBb0IsQ0FBQztRQUN4QyxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsYUFBYSxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQ3BDLElBQUksQ0FBQyxRQUFRLENBQUMsWUFBWSxFQUFFLEtBQUssQ0FBQyxDQUFDO1lBQ25DLElBQUksQ0FBQyxTQUFTLENBQUMsWUFBWSxDQUFDLENBQUM7WUFDN0IsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsYUFBYSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7Z0JBQ3JELFlBQVksR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLFlBQVksRUFBRSxLQUFLLENBQUMsQ0FBQztnQkFDaEQsSUFBSSxDQUFDLFNBQVMsQ0FBQyxZQUFZLENBQUMsQ0FBQztnQkFDN0IsSUFBSSxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUMsQ0FBQztnQkFDM0IsSUFBSSxDQUFDLFNBQVMsQ0FBQyxZQUFZLENBQUMsQ0FBQztZQUMvQixDQUFDO1FBQ0gsQ0FBQztRQUNELE1BQU0sRUFBQyxRQUFRLEVBQUMsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLFlBQVksRUFBRSxLQUFLLENBQUMsQ0FBQztRQUM1RCxJQUFJLENBQUMsZUFBZSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQy9CLDBGQUEwRjtRQUMxRixNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLGNBQWMsQ0FBQyxRQUFRLEVBQUUsb0JBQW9CLEVBQUUsS0FBSyxFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBQy9GLE9BQU8sRUFBQyxRQUFRLEVBQUUsTUFBTSxFQUFFLFVBQVUsQ0FBQyxNQUFNLEVBQUUsTUFBTSxFQUFFLFVBQVUsQ0FBQyxNQUFNLEVBQUUsRUFBRSxFQUFFLFlBQVksQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLFlBQVksQ0FBQyxDQUFDLEVBQUMsQ0FBQztJQUNsSCxDQUFDO0lBRU0sS0FBSyxDQUFDLGVBQWUsQ0FBQyxZQUFnQyxFQUFFLEtBQWE7UUFDMUUsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLGFBQWEsS0FBSyxDQUFDO1lBQ25DLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxZQUFZLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFFN0MsTUFBTSxNQUFNLEdBQUcsTUFBTSxtQkFBbUIsQ0FDdEMsWUFBWSxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLGFBQWEsRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLGFBQWEsQ0FDOUUsQ0FBQztRQUNGLE1BQU0sb0JBQW9CLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUM3RCxNQUFNLGNBQWMsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLG9CQUFvQixFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQ3hFLElBQUksQ0FBQyxlQUFlLENBQUMsY0FBYyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQzlDLE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxNQUFNLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDM0QsTUFBTSxFQUFDLFFBQVEsRUFBQyxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsWUFBWSxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQzVELElBQUksQ0FBQyxlQUFlLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDL0IsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxjQUFjLENBQUMsUUFBUSxFQUFFLG9CQUFvQixFQUFFLEtBQUssRUFBRSxRQUFRLENBQUMsQ0FBQztRQUMvRixPQUFPLEVBQUMsUUFBUSxFQUFFLE1BQU0sRUFBRSxVQUFVLENBQUMsTUFBTSxFQUFFLE1BQU0sRUFBRSxVQUFVLENBQUMsTUFBTSxFQUFFLEVBQUUsRUFBRSxZQUFZLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxZQUFZLENBQUMsQ0FBQyxFQUFDLENBQUM7SUFDbEgsQ0FBQztJQUVPLGVBQWUsQ0FBQyxRQUFrQjtRQUN4QyxNQUFNLGNBQWMsR0FBMEIsRUFBRSxDQUFDO1FBQ2pELEtBQUssTUFBTSxPQUFPLElBQUksUUFBUSxFQUFFLENBQUM7WUFDL0IsSUFBSSxDQUFDLGNBQWMsQ0FBQyxPQUFPLENBQUM7Z0JBQzFCLGNBQWMsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDOUIsY0FBYyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7UUFDNUIsQ0FBQztRQUNELE1BQU0sYUFBYSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsR0FBRyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNwSCxNQUFNLFVBQVUsR0FBMEIsRUFBRSxDQUFDO1FBQzdDLGFBQWEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQ3pFLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxRQUFRLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRTtZQUN0QyxRQUFRLENBQUMsQ0FBQyxDQUFDLEdBQUcsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzFDLENBQUM7SUFFTyxpQkFBaUIsQ0FBQyxNQUF1QixFQUFFLEtBQWE7UUFDOUQsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDN0QsTUFBTSxRQUFRLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQ3pDLE1BQU0sWUFBWSxHQUF1QixFQUFFLENBQUM7UUFDNUMsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEtBQUssRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO1lBQy9CLFlBQVksQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUM7WUFDckIsS0FBSyxJQUFJLENBQUMsR0FBRyxNQUFNLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxNQUFNLENBQUMsWUFBWSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO2dCQUN6RSxNQUFNLENBQUMsR0FBRyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUMvQixJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksTUFBTSxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsR0FBRyxRQUFRO29CQUNoRCxTQUFTO2dCQUNYLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ2pELENBQUM7UUFDSCxDQUFDO1FBQ0QsT0FBTyxZQUFZLENBQUM7SUFDdEIsQ0FBQztJQUVELDhCQUE4QjtJQUM5Qiw0R0FBNEc7SUFDNUcsTUFBTTtJQUNOLG9EQUFvRDtJQUNwRCxvREFBb0Q7SUFDcEQsb0RBQW9EO0lBQ3BELHVDQUF1QztJQUN2QyxnQ0FBZ0M7SUFDaEMsa0NBQWtDO0lBQ2xDLG1DQUFtQztJQUNuQyxRQUFRO0lBQ1IsK0NBQStDO0lBQy9DLHdEQUF3RDtJQUN4RCxrR0FBa0c7SUFDbEcsd0dBQXdHO0lBQ3hHLG9EQUFvRDtJQUNwRCx1REFBdUQ7SUFDdkQsK0NBQStDO0lBQy9DLHVGQUF1RjtJQUN2Rix1Q0FBdUM7SUFDdkMsK0VBQStFO0lBQy9FLHFEQUFxRDtJQUNyRCxtRUFBbUU7SUFDbkUsbUVBQW1FO0lBQ25FLDRCQUE0QjtJQUM1Qiw0QkFBNEI7SUFDNUIsNEJBQTRCO0lBQzVCLDRCQUE0QjtJQUM1QixpREFBaUQ7SUFDakQsMENBQTBDO0lBQzFDLDBDQUEwQztJQUMxQywwQ0FBMEM7SUFDMUMsMENBQTBDO0lBQzFDLFFBQVE7SUFDUixxREFBcUQ7SUFDckQsb0RBQW9EO0lBQ3BELGlEQUFpRDtJQUNqRCw4REFBOEQ7SUFDOUQsOERBQThEO0lBQzlELFFBQVE7SUFDUixNQUFNO0lBRU4sMkNBQTJDO0lBQzNDLG9HQUFvRztJQUNwRyw2R0FBNkc7SUFDN0csNkJBQTZCO0lBQzdCLDJEQUEyRDtJQUMzRCxzREFBc0Q7SUFDdEQsOERBQThEO0lBQzlELCtEQUErRDtJQUMvRCx1Q0FBdUM7SUFDdkMsdUNBQXVDO0lBQ3ZDLHVDQUF1QztJQUN2QyxrQkFBa0I7SUFDbEIsb0RBQW9EO0lBQ3BELHNEQUFzRDtJQUN0RCxvREFBb0Q7SUFDcEQsc0RBQXNEO0lBQ3RELGlFQUFpRTtJQUNqRSxrRUFBa0U7SUFDbEUsaUVBQWlFO0lBQ2pFLGtFQUFrRTtJQUNsRSw4REFBOEQ7SUFDOUQsOERBQThEO0lBQzlELHdFQUF3RTtJQUN4RSxzREFBc0Q7SUFDdEQsc0RBQXNEO0lBQ3RELDJCQUEyQjtJQUMzQiw2RUFBNkU7SUFDN0UsNERBQTREO0lBQzVELHdGQUF3RjtJQUN4Riw2REFBNkQ7SUFDN0Qsb0VBQW9FO0lBQ3BFLFVBQVU7SUFDVixpRUFBaUU7SUFDakUsZUFBZTtJQUNmLHVGQUF1RjtJQUN2RixtREFBbUQ7SUFDbkQsbURBQW1EO0lBQ25ELFFBQVE7SUFDUixNQUFNO0lBRU4sd0VBQXdFO0lBQ3hFLHlEQUF5RDtJQUN6RCwyREFBMkQ7SUFDM0QsaUVBQWlFO0lBQ2pFLDZDQUE2QztJQUM3QywrQ0FBK0M7SUFDL0MsaUVBQWlFO0lBQ2pFLE1BQU07SUFFTiw0RUFBNEU7SUFDNUUsdUVBQXVFO0lBQ3ZFLG1FQUFtRTtJQUNuRSxvREFBb0Q7SUFDcEQsb0JBQW9CO0lBQ3BCLGlFQUFpRTtJQUNqRSwrQ0FBK0M7SUFDL0MsaURBQWlEO0lBQ2pELFFBQVE7SUFDUixpSEFBaUg7SUFFakgsK0RBQStEO0lBQy9ELDREQUE0RDtJQUM1RCw0REFBNEQ7SUFDNUQsK0VBQStFO0lBQy9FLE1BQU07SUFFTiwyQ0FBMkM7SUFHM0MseUJBQXlCO0lBQ3pCLHVCQUF1QjtJQUN2Qix3QkFBd0I7SUFDeEIsOEJBQThCO0lBQzlCLDZEQUE2RDtJQUM3RCx1RkFBdUY7SUFDdkYsb0RBQW9EO0lBQ3BELGtIQUFrSDtJQUNsSCxzQkFBc0I7SUFFdEIsdUJBQXVCO0lBQ3ZCLDBCQUEwQjtJQUMxQiw0REFBNEQ7SUFDNUQsNkJBQTZCO0lBQzdCLGlEQUFpRDtJQUNqRCxnREFBZ0Q7SUFDaEQsUUFBUTtJQUNSLG9EQUFvRDtJQUNwRCxtR0FBbUc7SUFDbkcsbUNBQW1DO0lBQ25DLG1DQUFtQztJQUNuQyxtQ0FBbUM7SUFDbkMsbUNBQW1DO0lBQ25DLDZCQUE2QjtJQUM3QixzQ0FBc0M7SUFDdEMsMENBQTBDO0lBQzFDLGdFQUFnRTtJQUNoRSxrREFBa0Q7SUFDbEQsc0RBQXNEO0lBQ3RELDBCQUEwQjtJQUMxQiwwQ0FBMEM7SUFDMUMsNENBQTRDO0lBQzVDLFVBQVU7SUFDViw2RUFBNkU7SUFDN0UsNkRBQTZEO0lBQzdELG9HQUFvRztJQUNwRyxvR0FBb0c7SUFDcEcsdURBQXVEO0lBQ3ZELHVEQUF1RDtJQUN2RCx1REFBdUQ7SUFDdkQsdURBQXVEO0lBQ3ZELFVBQVU7SUFDVixzQkFBc0I7SUFDdEIsUUFBUTtJQUNSLHlEQUF5RDtJQUN6RCx5REFBeUQ7SUFDekQseURBQXlEO0lBQ3pELG9DQUFvQztJQUNwQyxvQ0FBb0M7SUFDcEMsaURBQWlEO0lBQ2pELGlEQUFpRDtJQUNqRCw2QkFBNkI7SUFDN0IsMENBQTBDO0lBQzFDLHFEQUFxRDtJQUNyRCxxSEFBcUg7SUFDckgscUhBQXFIO0lBQ3JILFVBQVU7SUFDVixRQUFRO0lBRVIseUJBQXlCO0lBQ3pCLE1BQU07SUFFTiw2QkFBNkI7SUFDN0IsSUFBSTtJQUVJLE1BQU0sQ0FBQyxRQUFrQixFQUFFLFlBQWdDLEVBQUUsS0FBYSxFQUFFLFVBQW9CO1FBQ3RHLE1BQU0sTUFBTSxHQUFHLElBQUksWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUMvQyxNQUFNLE1BQU0sR0FBRyxJQUFJLFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDL0MsTUFBTSxVQUFVLEdBQTRCLEVBQUUsQ0FBQztRQUMvQyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQzlCLElBQUksQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDO2dCQUN0QixVQUFVLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxDQUFDO1lBQzNCLFVBQVUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDOUIsQ0FBQyxDQUFDLENBQUM7UUFDSCxvREFBb0Q7UUFDcEQsbURBQW1EO1FBQ25ELElBQUksVUFBVSxHQUFHLENBQUMsQ0FBQztRQUNuQixNQUFNLGtCQUFrQixHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDbkQsa0JBQWtCLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsVUFBVSxDQUFDLENBQVEsQ0FBQyxDQUFDLE1BQU0sR0FBRyxVQUFVLENBQUMsQ0FBUSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDN0YsSUFBSSxNQUFNLEdBQUcsQ0FBQyxDQUFDO1FBRWYsSUFBSSxPQUFPLEdBQUcsQ0FBQyxDQUFDO1FBQ2hCLE1BQU0sVUFBVSxHQUFHLENBQUMsQ0FBQztRQUNyQixLQUFLLE1BQU0sV0FBVyxJQUFJLGtCQUFrQixFQUFFLENBQUM7WUFDN0MsTUFBTSxPQUFPLEdBQUcsVUFBVSxDQUFDLFdBQWtCLENBQUUsQ0FBQztZQUNoRCxNQUFNLFVBQVUsR0FBRyxTQUFTLENBQUMsT0FBTyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQUUsVUFBVSxDQUFDLENBQUM7WUFDdkUsSUFBSSxVQUFVLEtBQUssTUFBTSxFQUFFLENBQUM7Z0JBQzFCLFVBQVUsR0FBRyxDQUFDLENBQUM7Z0JBQ2YsT0FBTyxJQUFJLFVBQVUsR0FBRyxNQUFNLENBQUM7Z0JBQy9CLE1BQU0sR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBQy9DLENBQUM7WUFDRCxpREFBaUQ7WUFDakQsTUFBTSxPQUFPLEdBQUcsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxHQUFHLFVBQVUsR0FBRyxNQUFNLEdBQUcsVUFBVSxHQUFHLE1BQU0sR0FBRyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUMzRix1REFBdUQ7WUFFdkQsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFVBQVUsQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7Z0JBQ2xELE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLFVBQVUsR0FBRyxNQUFNLEdBQUcsR0FBRyxHQUFHLE9BQU8sQ0FBQztnQkFDaEYsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsVUFBVSxHQUFHLE1BQU0sR0FBRyxHQUFHLEdBQUcsT0FBTyxDQUFDO1lBQ2xGLENBQUM7WUFDRCxVQUFVLEVBQUUsQ0FBQztRQUNmLENBQUM7UUFDRCxPQUFPLEVBQUMsTUFBTSxFQUFFLE1BQU0sRUFBQyxDQUFDO0lBQzFCLENBQUM7SUFFTyxhQUFhLENBQUMsUUFBa0IsRUFBRSxDQUFTLEVBQUUsQ0FBUztRQUM1RCxNQUFNLFFBQVEsR0FBRyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDN0IsTUFBTSxRQUFRLEdBQUcsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzdCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxRQUFRLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7WUFDekMsSUFBSSxRQUFRLENBQUMsQ0FBQyxDQUFDLEtBQUssUUFBUTtnQkFDMUIsUUFBUSxDQUFDLENBQUMsQ0FBQyxHQUFHLFFBQVEsQ0FBQztRQUMzQixDQUFDO0lBQ0gsQ0FBQztJQUNNLGNBQWMsQ0FBQyxZQUFnQyxFQUFFLEtBQWE7UUFDbkUsSUFBSSxVQUFVLEdBQUcsQ0FBQyxDQUFDO1FBQ25CLE1BQU0sRUFBRSxHQUFhLEVBQUUsQ0FBQztRQUN4QixNQUFNLEVBQUUsR0FBYSxFQUFFLENBQUM7UUFDeEIsK0RBQStEO1FBQy9ELE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDbkMsTUFBTSxRQUFRLEdBQWEsSUFBSSxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDckQsS0FBSyxNQUFNLENBQUMsSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxFQUFFLENBQUM7WUFDMUMsS0FBSyxNQUFNLENBQUMsSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFRLENBQUMsQ0FBQyxFQUFFLENBQUM7Z0JBQ3BELElBQUksWUFBWSxDQUFDLENBQVEsQ0FBQyxDQUFDLENBQVEsQ0FBQyxHQUFHLFFBQVE7b0JBQzdDLFlBQVksQ0FBQyxDQUFRLENBQUMsQ0FBQyxDQUFRLENBQUMsS0FBSyxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO29CQUMxRSxFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO29CQUNuQixFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO29CQUNuQixJQUFJLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQzt3QkFDN0QsSUFBSSxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQzs0QkFDN0MsSUFBSSxDQUFDLGFBQWEsQ0FBQyxRQUFRLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO29CQUN2RCxDQUFDO3lCQUFNLElBQUksUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUM7d0JBQ3RDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7b0JBQzVDLENBQUM7eUJBQU0sSUFBSSxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQzt3QkFDdEMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztvQkFDNUMsQ0FBQzt5QkFBTSxDQUFDO3dCQUNOLFVBQVUsRUFBRSxDQUFDO3dCQUNiLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxVQUFVLENBQUM7d0JBQ2pDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxVQUFVLENBQUM7b0JBQ25DLENBQUM7Z0JBQ0gsQ0FBQztZQUNILENBQUM7UUFDSCxDQUFDO1FBQ0QsS0FBSyxJQUFJLENBQUMsR0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztZQUN2QyxJQUFJLFFBQVEsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDO2dCQUN2QixVQUFVLEVBQUcsQ0FBQztnQkFDZCxRQUFRLENBQUMsQ0FBQyxDQUFDLEdBQUcsVUFBVSxDQUFDO1lBQzNCLENBQUM7UUFDSCxDQUFDO1FBQ0QsT0FBTyxFQUFDLFFBQVEsRUFBRSxFQUFFLEVBQUUsSUFBSSxXQUFXLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLElBQUksV0FBVyxDQUFDLEVBQUUsQ0FBQyxFQUFDLENBQUM7SUFDdEUsQ0FBQztJQUVELDBGQUEwRjtJQUNsRixpQkFBaUIsQ0FBQyxNQUF1QixFQUFFLEtBQWE7UUFDOUQsSUFBSSxVQUFVLEdBQUcsQ0FBQyxDQUFDO1FBQ25CLE1BQU0sRUFBRSxHQUFhLEVBQUUsQ0FBQztRQUN4QixNQUFNLEVBQUUsR0FBYSxFQUFFLENBQUM7UUFDeEIsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDN0QsTUFBTSxRQUFRLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQ3pDLE1BQU0sUUFBUSxHQUFhLElBQUksS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3JELE1BQU0sZ0JBQWdCLEdBQUcsSUFBSSxXQUFXLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQ3BELElBQUksYUFBYSxHQUFHLENBQUMsQ0FBQztRQUN0QixnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDeEIsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEtBQUssRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO1lBQy9CLEtBQUssSUFBSSxDQUFDLEdBQUcsTUFBTSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsTUFBTSxDQUFDLFlBQVksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztnQkFDekUsTUFBTSxDQUFDLEdBQUcsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDL0IsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLE1BQU0sQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLElBQUksUUFBUTtvQkFDakQsU0FBUztnQkFDWCxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUNYLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ1gsYUFBYSxFQUFFLENBQUM7Z0JBQ2hCLElBQUksUUFBUSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLFFBQVEsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDO29CQUM3QyxJQUFJLFFBQVEsQ0FBQyxDQUFDLENBQUMsS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDO3dCQUM3QixJQUFJLENBQUMsYUFBYSxDQUFDLFFBQVEsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7Z0JBQ3ZDLENBQUM7cUJBQU0sSUFBSSxRQUFRLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQztvQkFDOUIsUUFBUSxDQUFDLENBQUMsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDNUIsQ0FBQztxQkFBTSxJQUFJLFFBQVEsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDO29CQUM5QixRQUFRLENBQUMsQ0FBQyxDQUFDLEdBQUcsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUM1QixDQUFDO3FCQUFNLENBQUM7b0JBQ04sVUFBVSxFQUFFLENBQUM7b0JBQ2IsUUFBUSxDQUFDLENBQUMsQ0FBQyxHQUFHLFVBQVUsQ0FBQztvQkFDekIsUUFBUSxDQUFDLENBQUMsQ0FBQyxHQUFHLFVBQVUsQ0FBQztnQkFDM0IsQ0FBQztZQUNILENBQUM7WUFDRCxnQkFBZ0IsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsYUFBYSxDQUFDO1FBQzFDLENBQUM7UUFDRCxLQUFLLElBQUksQ0FBQyxHQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsUUFBUSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO1lBQ3ZDLElBQUksUUFBUSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUM7Z0JBQ3ZCLFVBQVUsRUFBRyxDQUFDO2dCQUNkLFFBQVEsQ0FBQyxDQUFDLENBQUMsR0FBRyxVQUFVLENBQUM7WUFDM0IsQ0FBQztRQUNILENBQUM7UUFDRCxPQUFPLEVBQUMsUUFBUSxFQUFFLEVBQUUsRUFBRSxJQUFJLFdBQVcsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsSUFBSSxXQUFXLENBQUMsRUFBRSxDQUFDLEVBQUUsZ0JBQWdCLEVBQUMsQ0FBQztJQUN4RixDQUFDO0lBRU0sWUFBWSxDQUFDLFlBQWdDO1FBQ2xELE1BQU0sWUFBWSxHQUF5QyxFQUFFLENBQUM7UUFDOUQsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFlBQVksQ0FBQyxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7WUFDL0MsSUFBSSxDQUFDLFlBQVksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUNsQyxZQUFZLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQztZQUN2QyxZQUFZLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsWUFBWSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNsRixJQUFJLENBQUMsWUFBWSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ2xDLFlBQVksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDO1lBQ3ZDLFlBQVksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxZQUFZLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3BGLENBQUM7UUFDRCxPQUFPLFlBQVksQ0FBQztJQUN0QixDQUFDO0lBRU8sUUFBUSxDQUFDLFlBQWdDLEVBQUUsS0FBYTtRQUM5RCxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsS0FBSyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7WUFDL0IsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUM7Z0JBQ2xCLFlBQVksQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUM7WUFDdkIsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDO1FBQ2hELENBQUM7SUFDSCxDQUFDO0lBRU8sU0FBUyxDQUFDLFlBQWdDO1FBQ2hELEtBQUssTUFBTSxDQUFDLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsRUFBRSxDQUFDO1lBQzFDLE1BQU0sR0FBRyxHQUFHLFlBQVksQ0FBQyxDQUFRLENBQUMsQ0FBQztZQUNuQyxJQUFJLEdBQUcsR0FBRyxDQUFDLENBQUM7WUFDWixLQUFLLE1BQU0sQ0FBQyxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDO2dCQUM5QixHQUFHLElBQUksR0FBRyxDQUFDLENBQVEsQ0FBQyxDQUFDO1lBQ3ZCLElBQUksR0FBRyxLQUFLLENBQUM7Z0JBQUUsU0FBUztZQUN4QixLQUFLLE1BQU0sQ0FBQyxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDO2dCQUM5QixZQUFZLENBQUMsQ0FBUSxDQUFDLENBQUMsQ0FBUSxDQUFDLElBQUksR0FBRyxDQUFDO1FBQzVDLENBQUM7SUFDSCxDQUFDO0lBRU8sTUFBTSxDQUFDLFlBQWdDLEVBQUUsS0FBYTtRQUM1RCxNQUFNLGNBQWMsR0FBdUIsRUFBRSxDQUFDO1FBQzlDLE1BQU0sUUFBUSxHQUFHLFVBQVUsQ0FBQztRQUM1Qix1QkFBdUI7UUFDdkIscUdBQXFHO1FBQ3JHLDREQUE0RDtRQUM1RCw2RkFBNkY7UUFDN0YsaURBQWlEO1FBQ2pELDBDQUEwQztRQUMxQyx3Q0FBd0M7UUFDeEMseURBQXlEO1FBQ3pELE1BQU07UUFDTixzQkFBc0I7UUFDdEIsc0NBQXNDO1FBQ3RDLDRDQUE0QztRQUM1QyxxQkFBcUI7UUFDckIsd0NBQXdDO1FBQ3hDLHdEQUF3RDtRQUN4RCw4Q0FBOEM7UUFDOUMsb0NBQW9DO1FBQ3BDLHNDQUFzQztRQUN0QyxvQ0FBb0M7UUFDcEMsc0NBQXNDO1FBQ3RDLFVBQVU7UUFDVixRQUFRO1FBQ1IsTUFBTTtRQUVOLHlCQUF5QjtRQUN6QixJQUFJO1FBQ0osS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEtBQUssRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO1lBQy9CLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDO2dCQUNsQixTQUFTO1lBQ1gsK0JBQStCO1lBQy9CLGNBQWMsQ0FBQyxDQUFDLE1BQWhCLGNBQWMsQ0FBQyxDQUFDLElBQU0sRUFBRSxFQUFDO1lBQ3pCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxLQUFLLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztnQkFDL0IsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztvQkFDdkIsU0FBUztnQkFDWCxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLFlBQVksRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxjQUFjO2dCQUNuRSxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxHQUFHLFFBQVEsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO29CQUNuQyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO29CQUMzQixJQUFJLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQzt3QkFDcEIsY0FBYyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQztvQkFDekIsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztnQkFDN0IsQ0FBQztZQUNILENBQUM7UUFDSCxDQUFDO1FBQ0QsT0FBTyxjQUFjLENBQUM7SUFDeEIsQ0FBQztJQUVELG1EQUFtRDtJQUVuRCxJQUFJO0lBRUksT0FBTyxDQUFDLFlBQWdDO1FBQzlDLEtBQUssTUFBTSxDQUFDLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsRUFBRSxDQUFDO1lBQzFDLE1BQU0sR0FBRyxHQUFHLFlBQVksQ0FBQyxDQUFRLENBQUMsQ0FBQztZQUNuQyxLQUFLLE1BQU0sQ0FBQyxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDO2dCQUM5QixZQUFZLENBQUMsQ0FBUSxDQUFDLENBQUMsQ0FBUSxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxZQUFZLENBQUMsQ0FBUSxDQUFDLENBQUMsQ0FBUSxDQUFDLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUMvRyxDQUFDO0lBQ0gsQ0FBQztJQUVPLGNBQWMsQ0FBQyxZQUFnQyxFQUFFLENBQU0sRUFBRSxDQUFNO1FBQ3JFLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQztRQUNaLE1BQU0sY0FBYyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBQzFELE1BQU0sWUFBWSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBQ3hELEtBQUssTUFBTSxDQUFDLElBQUksY0FBYyxFQUFFLENBQUM7WUFDL0IsSUFBSSxZQUFZLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztnQkFDMUIsR0FBRyxJQUFJLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFRLENBQUMsR0FBRyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBUSxDQUFDLENBQUM7UUFDakUsQ0FBQztRQUNELE9BQU8sR0FBRyxDQUFDO0lBQ2IsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtTcGFyc2VNYXRyaXhSZXN1bHR9IGZyb20gJy4uL2Rpc3RhbmNlLW1hdHJpeC9zcGFyc2UtbWF0cml4LXNlcnZpY2UnO1xuaW1wb3J0IHtiaW9MYXlvdXR9IGZyb20gJy4vYmlvLWxheW91dCc7XG5pbXBvcnQge01DTE9wdGlvbnMsIFNwYXJzZU1hdHJpeE9iamVjdH0gZnJvbSAnLi90eXBlcyc7XG5pbXBvcnQge01DTE9wUmV0dXJuVHlwZX0gZnJvbSAnQGRhdGFncm9rLWxpYnJhcmllcy9tYXRoL3NyYy93ZWJHUFUvTUNML3R5cGVzJztcbmltcG9ydCB7bWFya292Q2x1c3RlcldlYkdQVX0gZnJvbSAnQGRhdGFncm9rLWxpYnJhcmllcy9tYXRoL3NyYy93ZWJHUFUvTUNML01DTC13ZWJHUFUnO1xuZXhwb3J0IGNvbnN0IGRlZmF1bHRNQ0xPcHRpb25zOiBNQ0xPcHRpb25zID0ge1xuICBleHBhbmRGYWN0b3I6IDIsXG4gIG1heEl0ZXJhdGlvbnM6IDUsXG4gIGluZmxhdGVGYWN0b3I6IDIsXG4gIG11bHRGYWN0b3I6IDEsXG59O1xuXG5leHBvcnQgY2xhc3MgTUNMU3BhcnNlUmVkdWNlciB7XG4gIHByaXZhdGUgX29wdGlvbnM6IE1DTE9wdGlvbnM7XG5cbiAgY29uc3RydWN0b3Iob3B0czogUGFydGlhbDxNQ0xPcHRpb25zPiA9IHt9KSB7XG4gICAgdGhpcy5fb3B0aW9ucyA9IHsuLi5kZWZhdWx0TUNMT3B0aW9ucywgLi4ub3B0c307XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgdHJhbnNmb3JtKHNwYXJzZU1hdHJpeDogU3BhcnNlTWF0cml4UmVzdWx0LCBuUm93czogbnVtYmVyKSB7XG4gICAgLy8gdGVzdFdvcmtlck11bHRpcGx5KCk7XG4gICAgLy8gcmV0dXJuIG5ldyBJbnQzMkFycmF5KG5Sb3dzKTtcbiAgICBjb25zdCBvcmlnaW5hbFNwYXJzZU9iamVjdCA9IHRoaXMudG9PYmplY3RGb3JtKHNwYXJzZU1hdHJpeCk7XG4gICAgY29uc3Qgc3BhcnNlQ2x1c3RlcnMgPSB0aGlzLmFzc2lnbkNsdXN0ZXJzKG9yaWdpbmFsU3BhcnNlT2JqZWN0LCBuUm93cyk7XG4gICAgdGhpcy5jb3JyZWN0Q2x1c3RlcnMoc3BhcnNlQ2x1c3RlcnMuY2x1c3RlcnMpO1xuICAgIGxldCBzcGFyc2VPYmplY3QgPSBvcmlnaW5hbFNwYXJzZU9iamVjdDtcbiAgICBpZiAodGhpcy5fb3B0aW9ucy5tYXhJdGVyYXRpb25zID4gMCkge1xuICAgICAgdGhpcy5hZGRMb29wcyhzcGFyc2VPYmplY3QsIG5Sb3dzKTtcbiAgICAgIHRoaXMubm9ybWFsaXplKHNwYXJzZU9iamVjdCk7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuX29wdGlvbnMubWF4SXRlcmF0aW9uczsgaSsrKSB7XG4gICAgICAgIHNwYXJzZU9iamVjdCA9IHRoaXMuZXhwYW5kKHNwYXJzZU9iamVjdCwgblJvd3MpO1xuICAgICAgICB0aGlzLm5vcm1hbGl6ZShzcGFyc2VPYmplY3QpO1xuICAgICAgICB0aGlzLmluZmxhdGUoc3BhcnNlT2JqZWN0KTtcbiAgICAgICAgdGhpcy5ub3JtYWxpemUoc3BhcnNlT2JqZWN0KTtcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3Qge2NsdXN0ZXJzfSA9IHRoaXMuYXNzaWduQ2x1c3RlcnMoc3BhcnNlT2JqZWN0LCBuUm93cyk7XG4gICAgdGhpcy5jb3JyZWN0Q2x1c3RlcnMoY2x1c3RlcnMpO1xuICAgIC8vY29uc3QgZW1iZWRkaW5ncyA9IHRoaXMubGF5b3V0SW50ZXJDb25uZWN0KGNsdXN0ZXJzLCBuUm93cywgc3BhcnNlT2JqZWN0LCBzcGFyc2VNYXRyaXgpO1xuICAgIGNvbnN0IGVtYmVkZGluZ3MgPSB0aGlzLmxheW91dChzcGFyc2VDbHVzdGVycy5jbHVzdGVycywgb3JpZ2luYWxTcGFyc2VPYmplY3QsIG5Sb3dzLCBjbHVzdGVycyk7XG4gICAgcmV0dXJuIHtjbHVzdGVycywgZW1iZWRYOiBlbWJlZGRpbmdzLmVtYmVkWCwgZW1iZWRZOiBlbWJlZGRpbmdzLmVtYmVkWSwgaXM6IHNwYXJzZU1hdHJpeC5pLCBqczogc3BhcnNlTWF0cml4Lmp9O1xuICB9XG5cbiAgcHVibGljIGFzeW5jIHRyYW5zZm9ybVdlYkdQVShzcGFyc2VNYXRyaXg6IFNwYXJzZU1hdHJpeFJlc3VsdCwgblJvd3M6IG51bWJlcikge1xuICAgIGlmICh0aGlzLl9vcHRpb25zLm1heEl0ZXJhdGlvbnMgPT09IDApXG4gICAgICByZXR1cm4gdGhpcy50cmFuc2Zvcm0oc3BhcnNlTWF0cml4LCBuUm93cyk7XG5cbiAgICBjb25zdCBtY2xSZXMgPSBhd2FpdCBtYXJrb3ZDbHVzdGVyV2ViR1BVKFxuICAgICAgc3BhcnNlTWF0cml4LCBuUm93cywgdGhpcy5fb3B0aW9ucy5tYXhJdGVyYXRpb25zLCB0aGlzLl9vcHRpb25zLmluZmxhdGVGYWN0b3JcbiAgICApO1xuICAgIGNvbnN0IG9yaWdpbmFsU3BhcnNlT2JqZWN0ID0gdGhpcy50b09iamVjdEZvcm0oc3BhcnNlTWF0cml4KTtcbiAgICBjb25zdCBzcGFyc2VDbHVzdGVycyA9IHRoaXMuYXNzaWduQ2x1c3RlcnMob3JpZ2luYWxTcGFyc2VPYmplY3QsIG5Sb3dzKTtcbiAgICB0aGlzLmNvcnJlY3RDbHVzdGVycyhzcGFyc2VDbHVzdGVycy5jbHVzdGVycyk7XG4gICAgY29uc3Qgc3BhcnNlT2JqZWN0ID0gdGhpcy5jc3JUb1NwYXJzZU9iamVjdChtY2xSZXMsIG5Sb3dzKTtcbiAgICBjb25zdCB7Y2x1c3RlcnN9ID0gdGhpcy5hc3NpZ25DbHVzdGVycyhzcGFyc2VPYmplY3QsIG5Sb3dzKTtcbiAgICB0aGlzLmNvcnJlY3RDbHVzdGVycyhjbHVzdGVycyk7XG4gICAgY29uc3QgZW1iZWRkaW5ncyA9IHRoaXMubGF5b3V0KHNwYXJzZUNsdXN0ZXJzLmNsdXN0ZXJzLCBvcmlnaW5hbFNwYXJzZU9iamVjdCwgblJvd3MsIGNsdXN0ZXJzKTtcbiAgICByZXR1cm4ge2NsdXN0ZXJzLCBlbWJlZFg6IGVtYmVkZGluZ3MuZW1iZWRYLCBlbWJlZFk6IGVtYmVkZGluZ3MuZW1iZWRZLCBpczogc3BhcnNlTWF0cml4LmksIGpzOiBzcGFyc2VNYXRyaXguan07XG4gIH1cblxuICBwcml2YXRlIGNvcnJlY3RDbHVzdGVycyhjbHVzdGVyczogbnVtYmVyW10pIHtcbiAgICBjb25zdCBjbHVzdGVyU2l6ZU1hcDoge1tfOiBudW1iZXJdOiBudW1iZXJ9ID0ge307XG4gICAgZm9yIChjb25zdCBjbHVzdGVyIG9mIGNsdXN0ZXJzKSB7XG4gICAgICBpZiAoIWNsdXN0ZXJTaXplTWFwW2NsdXN0ZXJdKVxuICAgICAgICBjbHVzdGVyU2l6ZU1hcFtjbHVzdGVyXSA9IDA7XG4gICAgICBjbHVzdGVyU2l6ZU1hcFtjbHVzdGVyXSsrO1xuICAgIH1cbiAgICBjb25zdCBzb3J0ZWRJbmRleGVzID0gT2JqZWN0LmtleXMoY2x1c3RlclNpemVNYXApLm1hcChOdW1iZXIpLnNvcnQoKGEsIGIpID0+IGNsdXN0ZXJTaXplTWFwW2JdIC0gY2x1c3RlclNpemVNYXBbYV0pO1xuICAgIGNvbnN0IGNsdXN0ZXJNYXA6IHtbXzogbnVtYmVyXTogbnVtYmVyfSA9IHt9O1xuICAgIHNvcnRlZEluZGV4ZXMuZm9yRWFjaCgoY2x1c3RlcklkeCwgaSkgPT4gY2x1c3Rlck1hcFtjbHVzdGVySWR4XSA9IGkgKyAxKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNsdXN0ZXJzLmxlbmd0aDsgaSsrKVxuICAgICAgY2x1c3RlcnNbaV0gPSBjbHVzdGVyTWFwW2NsdXN0ZXJzW2ldXTtcbiAgfVxuXG4gIHByaXZhdGUgY3NyVG9TcGFyc2VPYmplY3QobWNsUmVzOiBNQ0xPcFJldHVyblR5cGUsIG5Sb3dzOiBudW1iZXIpIHtcbiAgICBjb25zdCBvcmRlciA9IE1hdGguZmxvb3IoTWF0aC5tYXgoTWF0aC5sb2cxMChuUm93cyksIDIpKSArIDE7XG4gICAgY29uc3QgbWluT3JkZXIgPSAxIC8gTWF0aC5wb3coMTAsIG9yZGVyKTtcbiAgICBjb25zdCBzcGFyc2VPYmplY3Q6IFNwYXJzZU1hdHJpeE9iamVjdCA9IHt9O1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgblJvd3M7IGkrKykge1xuICAgICAgc3BhcnNlT2JqZWN0W2ldID0ge307XG4gICAgICBmb3IgKGxldCBrID0gbWNsUmVzLmluZGV4T2Zmc2V0c1tpXTsgayA8IG1jbFJlcy5pbmRleE9mZnNldHNbaSArIDFdOyBrKyspIHtcbiAgICAgICAgY29uc3QgaiA9IG1jbFJlcy5LTk5JbmRleGVzW2tdO1xuICAgICAgICBpZiAoaiA8PSBpIHx8IG1jbFJlcy5LTk5TaW1pbGFyaXRpZXNba10gPCBtaW5PcmRlcilcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgc3BhcnNlT2JqZWN0W2ldW2pdID0gbWNsUmVzLktOTlNpbWlsYXJpdGllc1trXTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHNwYXJzZU9iamVjdDtcbiAgfVxuXG4gIC8vIHByaXZhdGUgbGF5b3V0SW50ZXJDb25uZWN0KFxuICAvLyAgIGNsdXN0ZXJzOiBudW1iZXJbXSwgblJvd3M6IG51bWJlciwgc3BhcnNlTWF0cml4OiBTcGFyc2VNYXRyaXhPYmplY3QsIG9yaWdpbmFsU3BhcnNlOiBTcGFyc2VNYXRyaXhSZXN1bHRcbiAgLy8gKSB7XG4gIC8vICAgY29uc3QgZW1iZWRYID0gbmV3IEZsb2F0MzJBcnJheShuUm93cykuZmlsbCgwKTtcbiAgLy8gICBjb25zdCBlbWJlZFkgPSBuZXcgRmxvYXQzMkFycmF5KG5Sb3dzKS5maWxsKDApO1xuICAvLyAgIGNvbnN0IGNsdXN0ZXJNYXA6IHtbXzogbnVtYmVyXTogbnVtYmVyW119ID0ge307XG4gIC8vICAgY2x1c3RlcnMuZm9yRWFjaCgoY2x1c3RlciwgaSkgPT4ge1xuICAvLyAgICAgaWYgKCFjbHVzdGVyTWFwW2NsdXN0ZXJdKVxuICAvLyAgICAgICBjbHVzdGVyTWFwW2NsdXN0ZXJdID0gW107XG4gIC8vICAgICBjbHVzdGVyTWFwW2NsdXN0ZXJdLnB1c2goaSk7XG4gIC8vICAgfSk7XG4gIC8vICAgLy8gZmlyc3Qgd2UgbGF5b3V0IHRoZSBpbmRpdmlkdWFsIGNsdXN0ZXJzXG4gIC8vICAgY29uc3Qgc29ydGVkQ2x1c3Rlck5hbWVzID0gT2JqZWN0LmtleXMoY2x1c3Rlck1hcCk7XG4gIC8vICAgc29ydGVkQ2x1c3Rlck5hbWVzLnNvcnQoKGEsIGIpID0+IGNsdXN0ZXJNYXBbYiBhcyBhbnldLmxlbmd0aCAtIGNsdXN0ZXJNYXBbYSBhcyBhbnldLmxlbmd0aCk7XG4gIC8vICAgY29uc3QgY2x1c3RlckVtYmVkZGluZ3M6IHtbY2x1c3Rlck51bTogbnVtYmVyXToge2VtYmVkWDogRmxvYXQzMkFycmF5LCBlbWJlZFk6IEZsb2F0MzJBcnJheX19ID0ge307XG4gIC8vICAgZm9yIChjb25zdCBjbHVzdGVyTmFtZSBvZiBzb3J0ZWRDbHVzdGVyTmFtZXMpIHtcbiAgLy8gICAgIGNvbnN0IGNsdXN0ZXIgPSBjbHVzdGVyTWFwW2NsdXN0ZXJOYW1lIGFzIGFueV0hO1xuICAvLyAgICAgLy8gdGhlc2UgZW1iZWRkaW5ncyB3aWxsIGJlIGluIHJhbmdlIDAtMVxuICAvLyAgICAgY2x1c3RlckVtYmVkZGluZ3NbY2x1c3Rlck5hbWUgYXMgYW55XSA9IGJpb0xheW91dChjbHVzdGVyLCBzcGFyc2VNYXRyaXgsIDAuMDAxKTtcbiAgLy8gICAgIC8vIGxldHMgc2F5IGxheW91dCBzaXplIGlzIDEweDEwXG4gIC8vICAgICAvLyBub3JtaWxpemUgdGhlIHNpemUgb2YgZW1iZWRkaW5ncyBhY2NvcmRpbmcgdG8gdGhlIHNpemUgb2YgdGhlIGNsdXN0ZXJcbiAgLy8gICAgIGNvbnN0IGNsdXN0ZXJTaXplID0gTWF0aC5zcXJ0KGNsdXN0ZXIubGVuZ3RoKTtcbiAgLy8gICAgIGNvbnN0IGVtYmVkWCA9IGNsdXN0ZXJFbWJlZGRpbmdzW2NsdXN0ZXJOYW1lIGFzIGFueV0uZW1iZWRYO1xuICAvLyAgICAgY29uc3QgZW1iZWRZID0gY2x1c3RlckVtYmVkZGluZ3NbY2x1c3Rlck5hbWUgYXMgYW55XS5lbWJlZFk7XG4gIC8vICAgICBsZXQgbWluWCA9IGVtYmVkWFswXTtcbiAgLy8gICAgIGxldCBtYXhYID0gZW1iZWRYWzBdO1xuICAvLyAgICAgbGV0IG1pblkgPSBlbWJlZFlbMF07XG4gIC8vICAgICBsZXQgbWF4WSA9IGVtYmVkWVswXTtcbiAgLy8gICAgIGZvciAobGV0IGkgPSAxOyBpIDwgY2x1c3Rlci5sZW5ndGg7IGkrKykge1xuICAvLyAgICAgICBtaW5YID0gTWF0aC5taW4obWluWCwgZW1iZWRYW2ldKTtcbiAgLy8gICAgICAgbWF4WCA9IE1hdGgubWF4KG1heFgsIGVtYmVkWFtpXSk7XG4gIC8vICAgICAgIG1pblkgPSBNYXRoLm1pbihtaW5ZLCBlbWJlZFlbaV0pO1xuICAvLyAgICAgICBtYXhZID0gTWF0aC5tYXgobWF4WSwgZW1iZWRZW2ldKTtcbiAgLy8gICAgIH1cbiAgLy8gICAgIGNvbnN0IHJhbmdlWCA9IG1heFggPT0gbWluWCA/IDEgOiBtYXhYIC0gbWluWDtcbiAgLy8gICAgIGNvbnN0IHJhbmdlWSA9IG1heFkgPT0gbWluWSA/IDE6IG1heFkgLSBtaW5ZO1xuICAvLyAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjbHVzdGVyLmxlbmd0aDsgaSsrKSB7XG4gIC8vICAgICAgIGVtYmVkWFtpXSA9IChlbWJlZFhbaV0gLSBtaW5YKSAvIHJhbmdlWCAvIDEuNSArIDAuMTY7XG4gIC8vICAgICAgIGVtYmVkWVtpXSA9IChlbWJlZFlbaV0gLSBtaW5ZKSAvIHJhbmdlWSAvIDEuNSArIDAuMTY7XG4gIC8vICAgICB9XG4gIC8vICAgfVxuXG4gIC8vICAgLy8gbnVtYmVycyBvZiBpbnRlckNsdXN0ZXIgY29ubmVjdGlvbnNcbiAgLy8gICBjb25zdCByZXNpZHVhbENsdXN0ZXJDb25uZWN0aW9uczoge1tjbHVzdGVyTnVtOiBudW1iZXJdOiB7W2NsdXN0ZXIyTnVtOiBudW1iZXJdOiBudW1iZXJ9fSA9IHt9O1xuICAvLyAgIGNvbnN0IHN1cGVyQ2x1c3RlcnM6IHtbXzogbnVtYmVyXTogbnVtYmVyfSA9IHt9OyAvLyBtYXBzIG9yaWdpbmFsIGNsdXN0ZXIgbnVtYmVyIHRvIHN1cGVyIGNsdXN0ZXIgbnVtYmVyXG4gIC8vICAgbGV0IHN1cGVyQ2x1c3Rlck51bSA9IDE7XG4gIC8vICAgLy8gaW5pdGlhbGl6ZSBzdXBlcmNsdXN0ZXJzIHRvIGJlIHRoZSBzYW1lIGFzIGNsdXN0ZXJzXG4gIC8vICAgZm9yIChjb25zdCBjbHVzdGVyTnVtIG9mIE9iamVjdC5rZXlzKGNsdXN0ZXJNYXApKVxuICAvLyAgICAgc3VwZXJDbHVzdGVyc1tOdW1iZXIoY2x1c3Rlck51bSldID0gTnVtYmVyKGNsdXN0ZXJOdW0pO1xuICAvLyAgIGZvciAobGV0IGNvbiA9IDA7IGNvbiA8IG9yaWdpbmFsU3BhcnNlLmkubGVuZ3RoOyBjb24gKyspIHtcbiAgLy8gICAgIGNvbnN0IGkgPSBvcmlnaW5hbFNwYXJzZS5pW2Nvbl07XG4gIC8vICAgICBjb25zdCBqID0gb3JpZ2luYWxTcGFyc2Uualtjb25dO1xuICAvLyAgICAgaWYgKGNsdXN0ZXJzW2ldID09PSBjbHVzdGVyc1tqXSlcbiAgLy8gICAgICAgY29udGludWU7XG4gIC8vICAgICBpZiAoIXJlc2lkdWFsQ2x1c3RlckNvbm5lY3Rpb25zW2NsdXN0ZXJzW2ldXSlcbiAgLy8gICAgICAgcmVzaWR1YWxDbHVzdGVyQ29ubmVjdGlvbnNbY2x1c3RlcnNbaV1dID0ge307XG4gIC8vICAgICBpZiAoIXJlc2lkdWFsQ2x1c3RlckNvbm5lY3Rpb25zW2NsdXN0ZXJzW2pdXSlcbiAgLy8gICAgICAgcmVzaWR1YWxDbHVzdGVyQ29ubmVjdGlvbnNbY2x1c3RlcnNbal1dID0ge307XG4gIC8vICAgICBpZiAoIXJlc2lkdWFsQ2x1c3RlckNvbm5lY3Rpb25zW2NsdXN0ZXJzW2ldXVtjbHVzdGVyc1tqXV0pXG4gIC8vICAgICAgIHJlc2lkdWFsQ2x1c3RlckNvbm5lY3Rpb25zW2NsdXN0ZXJzW2ldXVtjbHVzdGVyc1tqXV0gPSAwO1xuICAvLyAgICAgaWYgKCFyZXNpZHVhbENsdXN0ZXJDb25uZWN0aW9uc1tjbHVzdGVyc1tqXV1bY2x1c3RlcnNbaV1dKVxuICAvLyAgICAgICByZXNpZHVhbENsdXN0ZXJDb25uZWN0aW9uc1tjbHVzdGVyc1tqXV1bY2x1c3RlcnNbaV1dID0gMDtcbiAgLy8gICAgIHJlc2lkdWFsQ2x1c3RlckNvbm5lY3Rpb25zW2NsdXN0ZXJzW2ldXVtjbHVzdGVyc1tqXV0rKztcbiAgLy8gICAgIHJlc2lkdWFsQ2x1c3RlckNvbm5lY3Rpb25zW2NsdXN0ZXJzW2pdXVtjbHVzdGVyc1tpXV0rKztcbiAgLy8gICAgIGlmICghc3VwZXJDbHVzdGVyc1tjbHVzdGVyc1tpXV0gJiYgIXN1cGVyQ2x1c3RlcnNbY2x1c3RlcnNbal1dKSB7XG4gIC8vICAgICAgIHN1cGVyQ2x1c3RlcnNbY2x1c3RlcnNbaV1dID0gc3VwZXJDbHVzdGVyTnVtO1xuICAvLyAgICAgICBzdXBlckNsdXN0ZXJzW2NsdXN0ZXJzW2pdXSA9IHN1cGVyQ2x1c3Rlck51bTtcbiAgLy8gICAgICAgc3VwZXJDbHVzdGVyTnVtKys7XG4gIC8vICAgICB9IGVsc2UgaWYgKHN1cGVyQ2x1c3RlcnNbY2x1c3RlcnNbaV1dICYmIHN1cGVyQ2x1c3RlcnNbY2x1c3RlcnNbal1dKSB7XG4gIC8vICAgICAgIGNvbnN0IGNvbXBWYWwgPSBOdW1iZXIoc3VwZXJDbHVzdGVyc1tjbHVzdGVyc1tqXV0pO1xuICAvLyAgICAgICBmb3IgKGNvbnN0IGNsdXN0ZXJOdW0gb2YgKE9iamVjdC5rZXlzKHN1cGVyQ2x1c3RlcnMpIGFzIHVua25vd24gYXMgbnVtYmVyW10pKSB7XG4gIC8vICAgICAgICAgaWYgKE51bWJlcihzdXBlckNsdXN0ZXJzW2NsdXN0ZXJOdW1dKSA9PT0gY29tcFZhbClcbiAgLy8gICAgICAgICAgIHN1cGVyQ2x1c3RlcnNbY2x1c3Rlck51bV0gPSBzdXBlckNsdXN0ZXJzW2NsdXN0ZXJzW2ldXTtcbiAgLy8gICAgICAgfVxuICAvLyAgICAgICBzdXBlckNsdXN0ZXJzW2NsdXN0ZXJzW2pdXSA9IHN1cGVyQ2x1c3RlcnNbY2x1c3RlcnNbaV1dO1xuICAvLyAgICAgfSBlbHNlIHtcbiAgLy8gICAgICAgY29uc3Qgc3VwZXJDbHVzdGVyID0gc3VwZXJDbHVzdGVyc1tjbHVzdGVyc1tpXV0gPz8gc3VwZXJDbHVzdGVyc1tjbHVzdGVyc1tqXV07XG4gIC8vICAgICAgIHN1cGVyQ2x1c3RlcnNbY2x1c3RlcnNbaV1dID0gc3VwZXJDbHVzdGVyO1xuICAvLyAgICAgICBzdXBlckNsdXN0ZXJzW2NsdXN0ZXJzW2pdXSA9IHN1cGVyQ2x1c3RlcjtcbiAgLy8gICAgIH1cbiAgLy8gICB9XG5cbiAgLy8gICAvLyBub3cgd2UgY2FuIGdldCB0aGUgcmV2ZXJzZSBtYXBwaW5nIG9mIHN1cGVyIGNsdXN0ZXJzIHRvIGNsdXN0ZXJzXG4gIC8vICAgY29uc3Qgc3VwZXJDbHVzdGVyTWFwOiB7W186IG51bWJlcl06IG51bWJlcltdfSA9IHt9O1xuICAvLyAgIGZvciAoY29uc3QgY2x1c3Rlck51bSBvZiBPYmplY3Qua2V5cyhzdXBlckNsdXN0ZXJzKSkge1xuICAvLyAgICAgY29uc3Qgc3VwZXJDbHVzdGVyTnVtID0gc3VwZXJDbHVzdGVyc1tOdW1iZXIoY2x1c3Rlck51bSldO1xuICAvLyAgICAgaWYgKCFzdXBlckNsdXN0ZXJNYXBbc3VwZXJDbHVzdGVyTnVtXSlcbiAgLy8gICAgICAgc3VwZXJDbHVzdGVyTWFwW3N1cGVyQ2x1c3Rlck51bV0gPSBbXTtcbiAgLy8gICAgIHN1cGVyQ2x1c3Rlck1hcFtzdXBlckNsdXN0ZXJOdW1dLnB1c2goTnVtYmVyKGNsdXN0ZXJOdW0pKTtcbiAgLy8gICB9XG5cbiAgLy8gICAvLyB3ZSBuZWVkIHRvIGhhdmUgc3VwZXJDbHVzdGVycyBzb3J0ZWQgYnkgdG90YWwgc2l6ZSBvZiBwb2ludHMgaW4gdGhlbVxuICAvLyAgIGNvbnN0IHN1cGVyQ2x1c3Rlck51bXMgPSBPYmplY3Qua2V5cyhzdXBlckNsdXN0ZXJNYXApLm1hcChOdW1iZXIpO1xuICAvLyAgIGNvbnN0IHN1cGVyQ2x1c3RlclNpemVzOiB7W3N1cENsdXN0TnVtOiBudW1iZXJdOiBudW1iZXJ9ID0ge307XG4gIC8vICAgc3VwZXJDbHVzdGVyTnVtcy5mb3JFYWNoKChzdXBlckNsdXN0ZXJOdW0pID0+IHtcbiAgLy8gICAgIGxldCBzaXplID0gMDtcbiAgLy8gICAgIGZvciAoY29uc3QgY2x1c3Rlck51bSBvZiBzdXBlckNsdXN0ZXJNYXBbc3VwZXJDbHVzdGVyTnVtXSlcbiAgLy8gICAgICAgc2l6ZSArPSBjbHVzdGVyTWFwW2NsdXN0ZXJOdW1dLmxlbmd0aDtcbiAgLy8gICAgIHN1cGVyQ2x1c3RlclNpemVzW3N1cGVyQ2x1c3Rlck51bV0gPSBzaXplO1xuICAvLyAgIH0pO1xuICAvLyAgIGNvbnN0IHNvcnRlZFN1cGVyQ2x1c3Rlck51bXMgPSBzdXBlckNsdXN0ZXJOdW1zLnNvcnQoKGEsIGIpID0+IHN1cGVyQ2x1c3RlclNpemVzW2JdIC0gc3VwZXJDbHVzdGVyU2l6ZXNbYV0pO1xuXG4gIC8vICAgLy8gbmVlZCB0byBhbHNvIHNvcnQgY2x1c3RlcnMgaW4gZWFjaCBzdXBlckNsdXN0ZXIgYnkgc2l6ZVxuICAvLyAgIGZvciAoY29uc3Qgc3VwZXJDbHVzdGVyTnVtIG9mIHNvcnRlZFN1cGVyQ2x1c3Rlck51bXMpIHtcbiAgLy8gICAgIGNvbnN0IGNsdXN0ZXJOdW1zID0gc3VwZXJDbHVzdGVyTWFwW3N1cGVyQ2x1c3Rlck51bV07XG4gIC8vICAgICBjbHVzdGVyTnVtcy5zb3J0KChhLCBiKSA9PiBjbHVzdGVyTWFwW2JdLmxlbmd0aCAtIGNsdXN0ZXJNYXBbYV0ubGVuZ3RoKTtcbiAgLy8gICB9XG5cbiAgLy8gICAvLyBub3cgd2UgbmVlZCB0byBsYXlvdXQgc3VwZXJDbHVzdGVyc1xuXG5cbiAgLy8gICBzdXBlckNsdXN0ZXJOdW0gPSAwO1xuICAvLyAgIGxldCBzdXBQZXJSb3cgPSAzO1xuICAvLyAgIGxldCBzdXBZT2Zmc2V0ID0gMDtcbiAgLy8gICBjb25zdCBzdXBMYXlvdXRTaXplID0gMTU7XG4gIC8vICAgZm9yIChjb25zdCBzdXBlckNsdXN0ZXJOYW1lIG9mIHNvcnRlZFN1cGVyQ2x1c3Rlck51bXMpIHtcbiAgLy8gICAgIC8vIGNzIGNvbnRhaW5zIGlkcyBvZiBjbHVzdGVycyB3aGljaCBhcmUgaW4gdGhpcyBzdXBlckNsdXN0ZXIgKHN1cGVyQ2x1c3Rlck5hbWUpXG4gIC8vICAgICBjb25zdCBjcyA9IHN1cGVyQ2x1c3Rlck1hcFtzdXBlckNsdXN0ZXJOYW1lXTtcbiAgLy8gICAgIC8vIHNwYWNlIGZvciAzIGNsdXN0ZXJzIGluIHJvdyhzdGFydCB3aXRoIHRoYXQpLCB0aGF0IGFjdHVhbGx5IGZpdHMgMiBhbmQgcmVzdCBpcyBzcGFjZSBiZXR3ZWVuIGFuZCBhcnJvdW5kXG4gIC8vICAgICBsZXQgcGVyUm93ID0gMztcblxuICAvLyAgICAgbGV0IHlPZmZzZXQgPSAwO1xuICAvLyAgICAgbGV0IGNsdXN0ZXJOdW0gPSAwO1xuICAvLyAgICAgaWYgKHN1cGVyQ2x1c3Rlck51bSA9PT0gTWF0aC5jZWlsKHN1cFBlclJvdyAvIDEuNSkpIHtcbiAgLy8gICAgICAgc3VwZXJDbHVzdGVyTnVtID0gMDtcbiAgLy8gICAgICAgc3VwWU9mZnNldCArPSBzdXBMYXlvdXRTaXplIC8gc3VwUGVyUm93O1xuICAvLyAgICAgICBzdXBQZXJSb3cgPSBNYXRoLmNlaWwoc3VwUGVyUm93ICogMS41KTtcbiAgLy8gICAgIH1cbiAgLy8gICAgIGNvbnN0IGxheW91dFNpemUgPSBzdXBMYXlvdXRTaXplIC8gc3VwUGVyUm93O1xuICAvLyAgICAgY29uc3Qgc3VwT2Zmc2V0WCA9ICgoc3VwZXJDbHVzdGVyTnVtICUgc3VwUGVyUm93ICsgMC4yNSkgKiBzdXBMYXlvdXRTaXplIC8gc3VwUGVyUm93KSAqIDEuNTtcbiAgLy8gICAgIGxldCBtaW5YID0gTnVtYmVyLk1BWF9WQUxVRTtcbiAgLy8gICAgIGxldCBtYXhYID0gTnVtYmVyLk1JTl9WQUxVRTtcbiAgLy8gICAgIGxldCBtaW5ZID0gTnVtYmVyLk1BWF9WQUxVRTtcbiAgLy8gICAgIGxldCBtYXhZID0gTnVtYmVyLk1JTl9WQUxVRTtcbiAgLy8gICAgIGZvciAoY29uc3QgY24gb2YgY3MpIHtcbiAgLy8gICAgICAgLy8gY24gaXMgdGhlIGlkIG9mIHN1YmNsYXN0ZXJcbiAgLy8gICAgICAgY29uc3QgY2x1c3RlcklzID0gY2x1c3Rlck1hcFtjbl07XG4gIC8vICAgICAgIC8vIGNsdXN0ZXJJcyBjb250YWlucyBpbmRleGVzIG9mIHBvaW50cyBpbiB0aGlzIGNsdXN0ZXJcbiAgLy8gICAgICAgY29uc3QgZW1iZWRkaW5ncyA9IGNsdXN0ZXJFbWJlZGRpbmdzW2NuXTtcbiAgLy8gICAgICAgaWYgKGNsdXN0ZXJOdW0gPT09IE1hdGguY2VpbChwZXJSb3cgLyAxLjUpKSB7XG4gIC8vICAgICAgICAgY2x1c3Rlck51bSA9IDA7XG4gIC8vICAgICAgICAgeU9mZnNldCArPSBsYXlvdXRTaXplIC8gcGVyUm93O1xuICAvLyAgICAgICAgIHBlclJvdyA9IE1hdGguY2VpbChwZXJSb3cgKiAxLjUpO1xuICAvLyAgICAgICB9XG4gIC8vICAgICAgIGNvbnN0IG9mZnNldFggPSAoKGNsdXN0ZXJOdW0gJSBwZXJSb3cpICogbGF5b3V0U2l6ZSAvIHBlclJvdykgKiAxLjU7XG4gIC8vICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZW1iZWRkaW5ncy5lbWJlZFgubGVuZ3RoOyBpKyspIHtcbiAgLy8gICAgICAgICBlbWJlZFhbY2x1c3RlcklzW2ldXSA9IGVtYmVkZGluZ3MuZW1iZWRYW2ldICogbGF5b3V0U2l6ZSAvIHBlclJvdyArIG9mZnNldFggKyBzdXBPZmZzZXRYO1xuICAvLyAgICAgICAgIGVtYmVkWVtjbHVzdGVySXNbaV1dID0gZW1iZWRkaW5ncy5lbWJlZFlbaV0gKiBsYXlvdXRTaXplIC8gcGVyUm93ICsgeU9mZnNldCArIHN1cFlPZmZzZXQ7XG4gIC8vICAgICAgICAgbWluWCA9IE1hdGgubWluKG1pblgsIGVtYmVkWFtjbHVzdGVySXNbaV1dKTtcbiAgLy8gICAgICAgICBtYXhYID0gTWF0aC5tYXgobWF4WCwgZW1iZWRYW2NsdXN0ZXJJc1tpXV0pO1xuICAvLyAgICAgICAgIG1pblkgPSBNYXRoLm1pbihtaW5ZLCBlbWJlZFlbY2x1c3RlcklzW2ldXSk7XG4gIC8vICAgICAgICAgbWF4WSA9IE1hdGgubWF4KG1heFksIGVtYmVkWVtjbHVzdGVySXNbaV1dKTtcbiAgLy8gICAgICAgfVxuICAvLyAgICAgICBjbHVzdGVyTnVtKys7XG4gIC8vICAgICB9XG4gIC8vICAgICAvLyByZXNjYWxlIGFsbCBzdXBlcmNsdXN0ZXJzIHRvIHRoZWlyIGJvdW5kaW5nIGJveFxuICAvLyAgICAgY29uc3QgcmFuZ2VYID0gbWF4WCAtIG1pblggPT0gMCA/IDEgOiBtYXhYIC0gbWluWDtcbiAgLy8gICAgIGNvbnN0IHJhbmdlWSA9IG1heFkgLSBtaW5ZID09IDAgPyAxIDogbWF4WSAtIG1pblk7XG4gIC8vICAgICBjb25zdCBib3VuZFhNaW4gPSBzdXBPZmZzZXRYO1xuICAvLyAgICAgY29uc3QgYm91bmRZTWluID0gc3VwWU9mZnNldDtcbiAgLy8gICAgIGNvbnN0IGJvdW5kWE1heCA9IHN1cE9mZnNldFggKyBsYXlvdXRTaXplO1xuICAvLyAgICAgY29uc3QgYm91bmRZTWF4ID0gc3VwWU9mZnNldCArIGxheW91dFNpemU7XG4gIC8vICAgICBmb3IgKGNvbnN0IGNuIG9mIGNzKSB7XG4gIC8vICAgICAgIGNvbnN0IGNsdXN0ZXJJcyA9IGNsdXN0ZXJNYXBbY25dO1xuICAvLyAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNsdXN0ZXJJcy5sZW5ndGg7IGkrKykge1xuICAvLyAgICAgICAgIGVtYmVkWFtjbHVzdGVySXNbaV1dID0gKGVtYmVkWFtjbHVzdGVySXNbaV1dIC0gbWluWCkgLyByYW5nZVggLyAxLjIgKiAoYm91bmRYTWF4IC0gYm91bmRYTWluKSArIGJvdW5kWE1pbjtcbiAgLy8gICAgICAgICBlbWJlZFlbY2x1c3RlcklzW2ldXSA9IChlbWJlZFlbY2x1c3RlcklzW2ldXSAtIG1pblkpIC8gcmFuZ2VZIC8gMS4yICogKGJvdW5kWU1heCAtIGJvdW5kWU1pbikgKyBib3VuZFlNaW47XG4gIC8vICAgICAgIH1cbiAgLy8gICAgIH1cblxuICAvLyAgICAgc3VwZXJDbHVzdGVyTnVtKys7XG4gIC8vICAgfVxuXG4gIC8vICAgcmV0dXJuIHtlbWJlZFgsIGVtYmVkWX07XG4gIC8vIH1cblxuICBwcml2YXRlIGxheW91dChjbHVzdGVyczogbnVtYmVyW10sIHNwYXJzZU1hdHJpeDogU3BhcnNlTWF0cml4T2JqZWN0LCBuUm93czogbnVtYmVyLCBzdWJDbHVzdGVyOiBudW1iZXJbXSkge1xuICAgIGNvbnN0IGVtYmVkWCA9IG5ldyBGbG9hdDMyQXJyYXkoblJvd3MpLmZpbGwoMCk7XG4gICAgY29uc3QgZW1iZWRZID0gbmV3IEZsb2F0MzJBcnJheShuUm93cykuZmlsbCgwKTtcbiAgICBjb25zdCBjbHVzdGVyTWFwOiB7W186IG51bWJlcl06IG51bWJlcltdfSA9IHt9O1xuICAgIGNsdXN0ZXJzLmZvckVhY2goKGNsdXN0ZXIsIGkpID0+IHtcbiAgICAgIGlmICghY2x1c3Rlck1hcFtjbHVzdGVyXSlcbiAgICAgICAgY2x1c3Rlck1hcFtjbHVzdGVyXSA9IFtdO1xuICAgICAgY2x1c3Rlck1hcFtjbHVzdGVyXS5wdXNoKGkpO1xuICAgIH0pO1xuICAgIC8vIGNvbnN0IG5DbHVzdGVycyA9IE9iamVjdC5rZXlzKGNsdXN0ZXJNYXApLmxlbmd0aDtcbiAgICAvLyBjb25zdCBwZXJSb3cgPSBNYXRoLmZsb29yKE1hdGguc3FydChuQ2x1c3RlcnMpKTtcbiAgICBsZXQgY2x1c3Rlck51bSA9IDA7XG4gICAgY29uc3Qgc29ydGVkQ2x1c3Rlck5hbWVzID0gT2JqZWN0LmtleXMoY2x1c3Rlck1hcCk7XG4gICAgc29ydGVkQ2x1c3Rlck5hbWVzLnNvcnQoKGEsIGIpID0+IGNsdXN0ZXJNYXBbYiBhcyBhbnldLmxlbmd0aCAtIGNsdXN0ZXJNYXBbYSBhcyBhbnldLmxlbmd0aCk7XG4gICAgbGV0IHBlclJvdyA9IDE7XG5cbiAgICBsZXQgeU9mZnNldCA9IDA7XG4gICAgY29uc3QgbGF5b3V0U2l6ZSA9IDU7XG4gICAgZm9yIChjb25zdCBjbHVzdGVyTmFtZSBvZiBzb3J0ZWRDbHVzdGVyTmFtZXMpIHtcbiAgICAgIGNvbnN0IGNsdXN0ZXIgPSBjbHVzdGVyTWFwW2NsdXN0ZXJOYW1lIGFzIGFueV0hO1xuICAgICAgY29uc3QgZW1iZWRkaW5ncyA9IGJpb0xheW91dChjbHVzdGVyLCBzcGFyc2VNYXRyaXgsIDAuMDAxLCBzdWJDbHVzdGVyKTtcbiAgICAgIGlmIChjbHVzdGVyTnVtID09PSBwZXJSb3cpIHtcbiAgICAgICAgY2x1c3Rlck51bSA9IDA7XG4gICAgICAgIHlPZmZzZXQgKz0gbGF5b3V0U2l6ZSAvIHBlclJvdztcbiAgICAgICAgcGVyUm93ID0gTWF0aC5taW4oTWF0aC5jZWlsKHBlclJvdyAqIDMpLCA0NSk7XG4gICAgICB9XG4gICAgICAvL2NvbnN0IGNsdXN0ZXJzUGVyUm93ID0gTWF0aC5jZWlsKHBlclJvdyAvIDEuNSk7XG4gICAgICBjb25zdCBvZmZzZXRYID0gKChjbHVzdGVyTnVtKSAqIGxheW91dFNpemUgLyBwZXJSb3cgKyBsYXlvdXRTaXplIC8gcGVyUm93ICogKDEgLyAxLjIgLyA0KSk7XG4gICAgICAvLyBjb25zdCBvZmZzZXRZID0gTWF0aC5mbG9vcihjbHVzdGVyTnVtIC8gcGVyUm93KSAqIDI7XG5cbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZW1iZWRkaW5ncy5lbWJlZFgubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgZW1iZWRYW2NsdXN0ZXJbaV1dID0gZW1iZWRkaW5ncy5lbWJlZFhbaV0gKiBsYXlvdXRTaXplIC8gcGVyUm93IC8gMS4yICsgb2Zmc2V0WDtcbiAgICAgICAgZW1iZWRZW2NsdXN0ZXJbaV1dID0gZW1iZWRkaW5ncy5lbWJlZFlbaV0gKiBsYXlvdXRTaXplIC8gcGVyUm93IC8gMS4yICsgeU9mZnNldDtcbiAgICAgIH1cbiAgICAgIGNsdXN0ZXJOdW0rKztcbiAgICB9XG4gICAgcmV0dXJuIHtlbWJlZFgsIGVtYmVkWX07XG4gIH1cblxuICBwcml2YXRlIG1lcmdlQ2x1c3RlcnMoY2x1c3RlcnM6IG51bWJlcltdLCBpOiBudW1iZXIsIGo6IG51bWJlcikge1xuICAgIGNvbnN0IGlDbHVzdGVyID0gY2x1c3RlcnNbaV07XG4gICAgY29uc3QgakNsdXN0ZXIgPSBjbHVzdGVyc1tqXTtcbiAgICBmb3IgKGxldCBrID0gMDsgayA8IGNsdXN0ZXJzLmxlbmd0aDsgaysrKSB7XG4gICAgICBpZiAoY2x1c3RlcnNba10gPT09IGpDbHVzdGVyKVxuICAgICAgICBjbHVzdGVyc1trXSA9IGlDbHVzdGVyO1xuICAgIH1cbiAgfVxuICBwdWJsaWMgYXNzaWduQ2x1c3RlcnMoc3BhcnNlTWF0cml4OiBTcGFyc2VNYXRyaXhPYmplY3QsIG5Sb3dzOiBudW1iZXIpIHtcbiAgICBsZXQgY2x1c3Rlck51bSA9IDA7XG4gICAgY29uc3QgaXM6IG51bWJlcltdID0gW107XG4gICAgY29uc3QganM6IG51bWJlcltdID0gW107XG4gICAgLy9jb25zdCBvcmRlciA9IE1hdGguZmxvb3IoTWF0aC5tYXgoTWF0aC5sb2cxMChuUm93cyksIDIpKSArIDc7XG4gICAgY29uc3QgbWluT3JkZXIgPSBNYXRoLnBvdygxMCwgLTE0KTtcbiAgICBjb25zdCBjbHVzdGVyczogbnVtYmVyW10gPSBuZXcgQXJyYXkoblJvd3MpLmZpbGwoLTEpO1xuICAgIGZvciAoY29uc3QgaSBvZiBPYmplY3Qua2V5cyhzcGFyc2VNYXRyaXgpKSB7XG4gICAgICBmb3IgKGNvbnN0IGogb2YgT2JqZWN0LmtleXMoc3BhcnNlTWF0cml4W2kgYXMgYW55XSkpIHtcbiAgICAgICAgaWYgKHNwYXJzZU1hdHJpeFtpIGFzIGFueV1baiBhcyBhbnldID4gbWluT3JkZXIgJiZcbiAgICAgICAgICBzcGFyc2VNYXRyaXhbaSBhcyBhbnldW2ogYXMgYW55XSAhPT0gTnVtYmVyKGkpICYmIE51bWJlcihqKSA+IE51bWJlcihpKSkge1xuICAgICAgICAgIGlzLnB1c2goTnVtYmVyKGkpKTtcbiAgICAgICAgICBqcy5wdXNoKE51bWJlcihqKSk7XG4gICAgICAgICAgaWYgKGNsdXN0ZXJzW051bWJlcihpKV0gIT09IC0xICYmIGNsdXN0ZXJzW051bWJlcihqKV0gIT09IC0xKSB7XG4gICAgICAgICAgICBpZiAoY2x1c3RlcnNbTnVtYmVyKGkpXSAhPT0gY2x1c3RlcnNbTnVtYmVyKGopXSlcbiAgICAgICAgICAgICAgdGhpcy5tZXJnZUNsdXN0ZXJzKGNsdXN0ZXJzLCBOdW1iZXIoaSksIE51bWJlcihqKSk7XG4gICAgICAgICAgfSBlbHNlIGlmIChjbHVzdGVyc1tOdW1iZXIoaSldICE9PSAtMSkge1xuICAgICAgICAgICAgY2x1c3RlcnNbTnVtYmVyKGopXSA9IGNsdXN0ZXJzW051bWJlcihpKV07XG4gICAgICAgICAgfSBlbHNlIGlmIChjbHVzdGVyc1tOdW1iZXIoaildICE9PSAtMSkge1xuICAgICAgICAgICAgY2x1c3RlcnNbTnVtYmVyKGkpXSA9IGNsdXN0ZXJzW051bWJlcihqKV07XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNsdXN0ZXJOdW0rKztcbiAgICAgICAgICAgIGNsdXN0ZXJzW051bWJlcihpKV0gPSBjbHVzdGVyTnVtO1xuICAgICAgICAgICAgY2x1c3RlcnNbTnVtYmVyKGopXSA9IGNsdXN0ZXJOdW07XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGZvciAobGV0IGk9MDsgaSA8IGNsdXN0ZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoY2x1c3RlcnNbaV0gPT09IC0xKSB7XG4gICAgICAgIGNsdXN0ZXJOdW0gKys7XG4gICAgICAgIGNsdXN0ZXJzW2ldID0gY2x1c3Rlck51bTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHtjbHVzdGVycywgaXM6IG5ldyBVaW50MzJBcnJheShpcyksIGpzOiBuZXcgVWludDMyQXJyYXkoanMpfTtcbiAgfVxuXG4gIC8qKiBzYW1lIGFzIGFzc2lnbiBjbHVzdGVycyBidXQgd29ya2luZyBvbiB0aGUgbGV2ZWwgb2YgQ1NSIGZvcm1hdCByZXR1cm5lZCBmcm9tIHdlYkdQVSAqL1xuICBwcml2YXRlIGFzc2lnbkNsdXN0ZXJzQ1NSKG1jbFJlczogTUNMT3BSZXR1cm5UeXBlLCBuUm93czogbnVtYmVyKSB7XG4gICAgbGV0IGNsdXN0ZXJOdW0gPSAwO1xuICAgIGNvbnN0IGlzOiBudW1iZXJbXSA9IFtdO1xuICAgIGNvbnN0IGpzOiBudW1iZXJbXSA9IFtdO1xuICAgIGNvbnN0IG9yZGVyID0gTWF0aC5mbG9vcihNYXRoLm1heChNYXRoLmxvZzEwKG5Sb3dzKSwgMikpICsgMTtcbiAgICBjb25zdCBtaW5PcmRlciA9IDEgLyBNYXRoLnBvdygxMCwgb3JkZXIpO1xuICAgIGNvbnN0IGNsdXN0ZXJzOiBudW1iZXJbXSA9IG5ldyBBcnJheShuUm93cykuZmlsbCgtMSk7XG4gICAgY29uc3QgY29ycmVjdGVkT2Zmc2V0cyA9IG5ldyBVaW50MzJBcnJheShuUm93cyArIDEpO1xuICAgIGxldCBvZmZzZXRDb3VudGVyID0gMDtcbiAgICBjb3JyZWN0ZWRPZmZzZXRzWzBdID0gMDtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5Sb3dzOyBpKyspIHtcbiAgICAgIGZvciAobGV0IGsgPSBtY2xSZXMuaW5kZXhPZmZzZXRzW2ldOyBrIDwgbWNsUmVzLmluZGV4T2Zmc2V0c1tpICsgMV07IGsrKykge1xuICAgICAgICBjb25zdCBqID0gbWNsUmVzLktOTkluZGV4ZXNba107XG4gICAgICAgIGlmIChqIDw9IGkgfHwgbWNsUmVzLktOTlNpbWlsYXJpdGllc1trXSA8PSBtaW5PcmRlcilcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgaXMucHVzaChpKTtcbiAgICAgICAganMucHVzaChqKTtcbiAgICAgICAgb2Zmc2V0Q291bnRlcisrO1xuICAgICAgICBpZiAoY2x1c3RlcnNbaV0gIT09IC0xICYmIGNsdXN0ZXJzW2pdICE9PSAtMSkge1xuICAgICAgICAgIGlmIChjbHVzdGVyc1tpXSAhPT0gY2x1c3RlcnNbal0pXG4gICAgICAgICAgICB0aGlzLm1lcmdlQ2x1c3RlcnMoY2x1c3RlcnMsIGksIGopO1xuICAgICAgICB9IGVsc2UgaWYgKGNsdXN0ZXJzW2ldICE9PSAtMSkge1xuICAgICAgICAgIGNsdXN0ZXJzW2pdID0gY2x1c3RlcnNbaV07XG4gICAgICAgIH0gZWxzZSBpZiAoY2x1c3RlcnNbal0gIT09IC0xKSB7XG4gICAgICAgICAgY2x1c3RlcnNbaV0gPSBjbHVzdGVyc1tqXTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjbHVzdGVyTnVtKys7XG4gICAgICAgICAgY2x1c3RlcnNbaV0gPSBjbHVzdGVyTnVtO1xuICAgICAgICAgIGNsdXN0ZXJzW2pdID0gY2x1c3Rlck51bTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgY29ycmVjdGVkT2Zmc2V0c1tpICsgMV0gPSBvZmZzZXRDb3VudGVyO1xuICAgIH1cbiAgICBmb3IgKGxldCBpPTA7IGkgPCBjbHVzdGVycy5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKGNsdXN0ZXJzW2ldID09PSAtMSkge1xuICAgICAgICBjbHVzdGVyTnVtICsrO1xuICAgICAgICBjbHVzdGVyc1tpXSA9IGNsdXN0ZXJOdW07XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB7Y2x1c3RlcnMsIGlzOiBuZXcgVWludDMyQXJyYXkoaXMpLCBqczogbmV3IFVpbnQzMkFycmF5KGpzKSwgY29ycmVjdGVkT2Zmc2V0c307XG4gIH1cblxuICBwdWJsaWMgdG9PYmplY3RGb3JtKHNwYXJzZU1hdHJpeDogU3BhcnNlTWF0cml4UmVzdWx0KTogU3BhcnNlTWF0cml4T2JqZWN0IHtcbiAgICBjb25zdCBzcGFyc2VPYmplY3Q6IHtbXzogbnVtYmVyXToge1tfOiBudW1iZXJdOiBudW1iZXJ9fSA9IHt9O1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc3BhcnNlTWF0cml4LmkubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmICghc3BhcnNlT2JqZWN0W3NwYXJzZU1hdHJpeC5pW2ldXSlcbiAgICAgICAgc3BhcnNlT2JqZWN0W3NwYXJzZU1hdHJpeC5pW2ldXSA9IHt9O1xuICAgICAgc3BhcnNlT2JqZWN0W3NwYXJzZU1hdHJpeC5pW2ldXVtzcGFyc2VNYXRyaXgualtpXV0gPSAxIC0gc3BhcnNlTWF0cml4LmRpc3RhbmNlW2ldO1xuICAgICAgaWYgKCFzcGFyc2VPYmplY3Rbc3BhcnNlTWF0cml4LmpbaV1dKVxuICAgICAgICBzcGFyc2VPYmplY3Rbc3BhcnNlTWF0cml4LmpbaV1dID0ge307XG4gICAgICBzcGFyc2VPYmplY3Rbc3BhcnNlTWF0cml4LmpbaV1dW3NwYXJzZU1hdHJpeC5pW2ldXSA9IDEgLSBzcGFyc2VNYXRyaXguZGlzdGFuY2VbaV07XG4gICAgfVxuICAgIHJldHVybiBzcGFyc2VPYmplY3Q7XG4gIH1cblxuICBwcml2YXRlIGFkZExvb3BzKHNwYXJzZU9iamVjdDogU3BhcnNlTWF0cml4T2JqZWN0LCBuUm93czogbnVtYmVyKSB7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBuUm93czsgaSsrKSB7XG4gICAgICBpZiAoIXNwYXJzZU9iamVjdFtpXSlcbiAgICAgICAgc3BhcnNlT2JqZWN0W2ldID0ge307XG4gICAgICBzcGFyc2VPYmplY3RbaV1baV0gPSB0aGlzLl9vcHRpb25zLm11bHRGYWN0b3I7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBub3JtYWxpemUoc3BhcnNlT2JqZWN0OiBTcGFyc2VNYXRyaXhPYmplY3QpIHtcbiAgICBmb3IgKGNvbnN0IGkgb2YgT2JqZWN0LmtleXMoc3BhcnNlT2JqZWN0KSkge1xuICAgICAgY29uc3Qgcm93ID0gc3BhcnNlT2JqZWN0W2kgYXMgYW55XTtcbiAgICAgIGxldCBzdW0gPSAwO1xuICAgICAgZm9yIChjb25zdCBqIG9mIE9iamVjdC5rZXlzKHJvdykpXG4gICAgICAgIHN1bSArPSByb3dbaiBhcyBhbnldO1xuICAgICAgaWYgKHN1bSA9PT0gMCkgY29udGludWU7XG4gICAgICBmb3IgKGNvbnN0IGogb2YgT2JqZWN0LmtleXMocm93KSlcbiAgICAgICAgc3BhcnNlT2JqZWN0W2kgYXMgYW55XVtqIGFzIGFueV0gLz0gc3VtO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZXhwYW5kKHNwYXJzZU9iamVjdDogU3BhcnNlTWF0cml4T2JqZWN0LCBuUm93czogbnVtYmVyKSB7XG4gICAgY29uc3QgZXhwYW5kZWRPYmplY3Q6IFNwYXJzZU1hdHJpeE9iamVjdCA9IHt9O1xuICAgIGNvbnN0IG1pbk9yZGVyID0gMTAwMDAwMDAwMDtcbiAgICAvLyBpZiAoblJvd3MgPCAxMjAwMCkge1xuICAgIC8vICAgLy8gaWYgcm93cyBhcmUgbGVzcyB0aGFuIDEyMDAwLCB0cmFuc2xhdGUgdG8gbWF0cml4IGZvcm0gYW5kIHVzZSB0aGUgZGVuc2UgbWF0cml4IG11bHRpcGxpY2F0aW9uXG4gICAgLy8gICAvLyB0aGlzIGlzIGZhc3RlciB0aGFuIHRoZSBzcGFyc2UgbWF0cml4IG11bHRpcGxpY2F0aW9uXG4gICAgLy8gICBjb25zdCBkZW5zZU1hdHJpeCA9IG5ldyBBcnJheShuUm93cykuZmlsbCgwKS5tYXAoKCkgPT4gbmV3IEZsb2F0MzJBcnJheShuUm93cykuZmlsbCgwKSk7XG4gICAgLy8gICBmb3IgKGNvbnN0IGkgb2YgT2JqZWN0LmtleXMoc3BhcnNlT2JqZWN0KSkge1xuICAgIC8vICAgICBjb25zdCByb3cgPSBzcGFyc2VPYmplY3RbaSBhcyBhbnldO1xuICAgIC8vICAgICBmb3IgKGNvbnN0IGogb2YgT2JqZWN0LmtleXMocm93KSlcbiAgICAvLyAgICAgICBkZW5zZU1hdHJpeFtpIGFzIGFueV1baiBhcyBhbnldID0gcm93W2ogYXMgYW55XTtcbiAgICAvLyAgIH1cbiAgICAvLyAgIC8vIGV4cGFuc2lvbiBzdGVwXG4gICAgLy8gICBmb3IgKGxldCBpID0gMDsgaSA8IG5Sb3dzOyBpKyspIHtcbiAgICAvLyAgICAgZm9yIChsZXQgaiA9IGkgKyAxOyBqIDwgblJvd3M7IGorKykge1xuICAgIC8vICAgICAgIGxldCB2YWwgPSAwO1xuICAgIC8vICAgICAgIGZvciAobGV0IGsgPSAwOyBrIDwgblJvd3M7IGsrKylcbiAgICAvLyAgICAgICAgIHZhbCArPSBkZW5zZU1hdHJpeFtpXVtrXSAqIGRlbnNlTWF0cml4W2pdW2tdO1xuICAgIC8vICAgICAgIGlmIChNYXRoLnJvdW5kKHZhbCAqIG1pbk9yZGVyKSA+IDApIHtcbiAgICAvLyAgICAgICAgIGV4cGFuZGVkT2JqZWN0W2ldID8/PSB7fTtcbiAgICAvLyAgICAgICAgIGV4cGFuZGVkT2JqZWN0W2ldW2pdID0gdmFsO1xuICAgIC8vICAgICAgICAgZXhwYW5kZWRPYmplY3Rbal0gPz89IHt9O1xuICAgIC8vICAgICAgICAgZXhwYW5kZWRPYmplY3Rbal1baV0gPSB2YWw7XG4gICAgLy8gICAgICAgfVxuICAgIC8vICAgICB9XG4gICAgLy8gICB9XG5cbiAgICAvLyAgIHJldHVybiBzcGFyc2VPYmplY3Q7XG4gICAgLy8gfVxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgblJvd3M7IGkrKykge1xuICAgICAgaWYgKCFzcGFyc2VPYmplY3RbaV0pXG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgLy8gY29uc3Qgcm93ID0gc3BhcnNlT2JqZWN0W2ldO1xuICAgICAgZXhwYW5kZWRPYmplY3RbaV0gPz89IHt9O1xuICAgICAgZm9yIChsZXQgaiA9IGk7IGogPCBuUm93czsgaisrKSB7XG4gICAgICAgIGlmICghc3BhcnNlT2JqZWN0W2ldPy5bal0pXG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIGNvbnN0IHZhbCA9IHRoaXMuZ2V0RXhwYW5kVmFsdWUoc3BhcnNlT2JqZWN0LCBpLCBqKTsgLy9wcnVuaW5nIHN0ZXBcbiAgICAgICAgaWYgKE1hdGgucm91bmQodmFsICogbWluT3JkZXIpID4gMCkge1xuICAgICAgICAgIGV4cGFuZGVkT2JqZWN0W2ldW2pdID0gdmFsO1xuICAgICAgICAgIGlmICghZXhwYW5kZWRPYmplY3Rbal0pXG4gICAgICAgICAgICBleHBhbmRlZE9iamVjdFtqXSA9IHt9O1xuICAgICAgICAgIGV4cGFuZGVkT2JqZWN0W2pdW2ldID0gdmFsO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBleHBhbmRlZE9iamVjdDtcbiAgfVxuXG4gIC8vIHByaXZhdGUgcHJ1bmUocm93OiBTcGFyc2VNYXRyaXhPYmplY3RbbnVtYmVyXSkge1xuXG4gIC8vIH1cblxuICBwcml2YXRlIGluZmxhdGUoc3BhcnNlT2JqZWN0OiBTcGFyc2VNYXRyaXhPYmplY3QpIHtcbiAgICBmb3IgKGNvbnN0IGkgb2YgT2JqZWN0LmtleXMoc3BhcnNlT2JqZWN0KSkge1xuICAgICAgY29uc3Qgcm93ID0gc3BhcnNlT2JqZWN0W2kgYXMgYW55XTtcbiAgICAgIGZvciAoY29uc3QgaiBvZiBPYmplY3Qua2V5cyhyb3cpKVxuICAgICAgICBzcGFyc2VPYmplY3RbaSBhcyBhbnldW2ogYXMgYW55XSA9IE1hdGgucG93KHNwYXJzZU9iamVjdFtpIGFzIGFueV1baiBhcyBhbnldLCB0aGlzLl9vcHRpb25zLmluZmxhdGVGYWN0b3IpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZ2V0RXhwYW5kVmFsdWUoc3BhcnNlT2JqZWN0OiBTcGFyc2VNYXRyaXhPYmplY3QsIGk6IGFueSwgajogYW55KSB7XG4gICAgbGV0IHZhbCA9IDA7XG4gICAgY29uc3QgY3VycmVudEluZGV4ZXMgPSBPYmplY3Qua2V5cyhzcGFyc2VPYmplY3RbaV0gPz8ge30pO1xuICAgIGNvbnN0IG90aGVySW5kZXhlcyA9IE9iamVjdC5rZXlzKHNwYXJzZU9iamVjdFtqXSA/PyB7fSk7XG4gICAgZm9yIChjb25zdCBrIG9mIGN1cnJlbnRJbmRleGVzKSB7XG4gICAgICBpZiAob3RoZXJJbmRleGVzLmluY2x1ZGVzKGspKVxuICAgICAgICB2YWwgKz0gc3BhcnNlT2JqZWN0W2ldW2sgYXMgYW55XSAqIHNwYXJzZU9iamVjdFtqXVtrIGFzIGFueV07XG4gICAgfVxuICAgIHJldHVybiB2YWw7XG4gIH1cbn1cblxuIl19","var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n};\n/* eslint-disable max-len */\nimport { getGPUDevice } from '../getGPUDevice';\nimport { sparseKNNNoralizeColwise } from './colwise-normalize';\nimport { expandNoRevive, inflate } from './inflate-expand';\nimport { toSparseKNNSimilarityForm } from './utils';\nexport function markovClusterWebGPU(sparseMatrix, nRows, maxIterations = 5, inflateFactor = 2) {\n return __awaiter(this, void 0, void 0, function* () {\n const device = yield getGPUDevice();\n if (!device)\n throw new Error('no gpu device found');\n // self loops are already added here\n const sparseKNNForm = toSparseKNNSimilarityForm(sparseMatrix, nRows);\n // first, we normilize the similarities\n yield sparseKNNNoralizeColwise(device, sparseKNNForm.KNNSimilarities, sparseKNNForm.indexOffsets, nRows);\n let res = sparseKNNForm;\n // then we expand the similarities\n for (let i = 0; i < maxIterations; i++) {\n //console.log(checkSorted(res.KNNIndexes, res.indexOffsets));\n const expandRes = yield expandNoRevive(device, res.KNNSimilarities, res.KNNIndexes, res.indexOffsets, nRows);\n yield sparseKNNNoralizeColwise(device, expandRes.KNNSimilarities, expandRes.indexOffsets, nRows);\n // then we inflate the similarities\n inflate(expandRes.KNNSimilarities, inflateFactor);\n // then we normilize the similarities again\n yield sparseKNNNoralizeColwise(device, expandRes.KNNSimilarities, expandRes.indexOffsets, nRows);\n res = expandRes;\n }\n return res;\n });\n}\n//# sourceMappingURL=MCL-webGPU.js.map","import { multiColWebGPUSparseMatrix } from '@datagrok-libraries/math/src/webGPU/sparse-matrix/webGPU-sparse-matrix';\nimport { SparseMatrixService } from '../distance-matrix/sparse-matrix-service';\nimport { MCLSparseReducer } from './marcov-cluster';\nonmessage = async (event) => {\n const { data, threshold, weights, aggregationMethod, distanceFnArgs, distanceFns, maxIterations, useWebGPU, inflate } = event.data;\n console.time('sparse matrix');\n let sparse = null;\n if (useWebGPU) {\n try {\n sparse = await multiColWebGPUSparseMatrix(data, threshold / 100, distanceFns, aggregationMethod, weights, distanceFnArgs);\n }\n catch (e) {\n console.error(e);\n }\n }\n if (!sparse) { // falsback to CPU\n if (useWebGPU)\n console.error('WEBGPU sparse matrix calculation failed, falling back to CPU implementation');\n sparse = await new SparseMatrixService()\n .calcMultiColumn(data, distanceFns, threshold / 100, distanceFnArgs, weights, aggregationMethod);\n }\n console.timeEnd('sparse matrix');\n //const res = await new MCLSparseReducer({maxIterations: maxIterations ?? 5}).transform(sparse, data[0].length);\n const reducer = new MCLSparseReducer({ maxIterations: maxIterations ?? 5, inflateFactor: inflate ?? 2 });\n console.time('MCL');\n let res = null;\n if (useWebGPU) {\n try {\n res = await reducer.transformWebGPU(sparse, data[0].length);\n }\n catch (e) {\n console.error('webGPU MCL failed, falling back to CPU implementation');\n console.error(e);\n }\n }\n if (!res)\n res = await reducer.transform(sparse, data[0].length);\n console.timeEnd('MCL');\n postMessage({ res });\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWNsLXdvcmtlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIm1jbC13b3JrZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLDBCQUEwQixFQUFDLE1BQU0sd0VBQXdFLENBQUM7QUFDbEgsT0FBTyxFQUFxQixtQkFBbUIsRUFBQyxNQUFNLDBDQUEwQyxDQUFDO0FBR2pHLE9BQU8sRUFBQyxnQkFBZ0IsRUFBQyxNQUFNLGtCQUFrQixDQUFDO0FBRWxELFNBQVMsR0FBRyxLQUFLLEVBQUUsS0FBSyxFQUFFLEVBQUU7SUFDMUIsTUFBTSxFQUFDLElBQUksRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLGlCQUFpQixFQUFFLGNBQWMsRUFBRSxXQUFXLEVBQUUsYUFBYSxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUMsR0FNL0csS0FBSyxDQUFDLElBQUksQ0FBQztJQUVmLE9BQU8sQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUM7SUFDOUIsSUFBSSxNQUFNLEdBQThCLElBQUksQ0FBQztJQUM3QyxJQUFJLFNBQVMsRUFBRSxDQUFDO1FBQ2QsSUFBSSxDQUFDO1lBQ0gsTUFBTSxHQUFHLE1BQU0sMEJBQTBCLENBQ3ZDLElBQUksRUFBRSxTQUFTLEdBQUcsR0FBRyxFQUFFLFdBQWtCLEVBQUUsaUJBQXdCLEVBQUUsT0FBTyxFQUFFLGNBQWMsQ0FBQyxDQUFDO1FBQ2xHLENBQUM7UUFBQyxPQUFPLENBQUMsRUFBRSxDQUFDO1lBQ1gsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNuQixDQUFDO0lBQ0gsQ0FBQztJQUNELElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLGtCQUFrQjtRQUMvQixJQUFJLFNBQVM7WUFDWCxPQUFPLENBQUMsS0FBSyxDQUFDLDZFQUE2RSxDQUFDLENBQUM7UUFFL0YsTUFBTSxHQUFHLE1BQU0sSUFBSSxtQkFBbUIsRUFBRTthQUNyQyxlQUFlLENBQUMsSUFBSSxFQUFFLFdBQVcsRUFBRSxTQUFTLEdBQUcsR0FBRyxFQUFFLGNBQWMsRUFBRSxPQUFPLEVBQUUsaUJBQWlCLENBQUMsQ0FBQztJQUNyRyxDQUFDO0lBQ0QsT0FBTyxDQUFDLE9BQU8sQ0FBQyxlQUFlLENBQUMsQ0FBQztJQUVqQyxnSEFBZ0g7SUFDaEgsTUFBTSxPQUFPLEdBQUcsSUFBSSxnQkFBZ0IsQ0FBQyxFQUFDLGFBQWEsRUFBRSxhQUFhLElBQUksQ0FBQyxFQUFFLGFBQWEsRUFBRSxPQUFPLElBQUksQ0FBQyxFQUFDLENBQUMsQ0FBQztJQUN2RyxPQUFPLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3BCLElBQUksR0FBRyxHQUFRLElBQUksQ0FBQztJQUNwQixJQUFJLFNBQVMsRUFBRSxDQUFDO1FBQ2QsSUFBSSxDQUFDO1lBQ0gsR0FBRyxHQUFHLE1BQU0sT0FBTyxDQUFDLGVBQWUsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQzlELENBQUM7UUFBQyxPQUFPLENBQUMsRUFBRSxDQUFDO1lBQ1gsT0FBTyxDQUFDLEtBQUssQ0FBQyx1REFBdUQsQ0FBQyxDQUFDO1lBQ3ZFLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDbkIsQ0FBQztJQUNILENBQUM7SUFDRCxJQUFJLENBQUMsR0FBRztRQUNOLEdBQUcsR0FBRyxNQUFNLE9BQU8sQ0FBQyxTQUFTLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUN4RCxPQUFPLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBRXZCLFdBQVcsQ0FBQyxFQUFDLEdBQUcsRUFBQyxDQUFDLENBQUM7QUFDckIsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHttdWx0aUNvbFdlYkdQVVNwYXJzZU1hdHJpeH0gZnJvbSAnQGRhdGFncm9rLWxpYnJhcmllcy9tYXRoL3NyYy93ZWJHUFUvc3BhcnNlLW1hdHJpeC93ZWJHUFUtc3BhcnNlLW1hdHJpeCc7XG5pbXBvcnQge1NwYXJzZU1hdHJpeFJlc3VsdCwgU3BhcnNlTWF0cml4U2VydmljZX0gZnJvbSAnLi4vZGlzdGFuY2UtbWF0cml4L3NwYXJzZS1tYXRyaXgtc2VydmljZSc7XG5pbXBvcnQge0Rpc3RhbmNlQWdncmVnYXRpb25NZXRob2R9IGZyb20gJy4uL2Rpc3RhbmNlLW1hdHJpeC90eXBlcyc7XG5pbXBvcnQge0tub3duTWV0cmljc30gZnJvbSAnLi4vdHlwZWQtbWV0cmljcyc7XG5pbXBvcnQge01DTFNwYXJzZVJlZHVjZXJ9IGZyb20gJy4vbWFyY292LWNsdXN0ZXInO1xuXG5vbm1lc3NhZ2UgPSBhc3luYyAoZXZlbnQpID0+IHtcbiAgY29uc3Qge2RhdGEsIHRocmVzaG9sZCwgd2VpZ2h0cywgYWdncmVnYXRpb25NZXRob2QsIGRpc3RhbmNlRm5BcmdzLCBkaXN0YW5jZUZucywgbWF4SXRlcmF0aW9ucywgdXNlV2ViR1BVLCBpbmZsYXRlfTpcbiAgIHtcbiAgICBkYXRhOiBhbnlbXVtdLCB0aHJlc2hvbGQ6IG51bWJlcixcbiAgICB3ZWlnaHRzOiBudW1iZXJbXSwgYWdncmVnYXRpb25NZXRob2Q6IERpc3RhbmNlQWdncmVnYXRpb25NZXRob2QsXG4gICAgZGlzdGFuY2VGbnM6IEtub3duTWV0cmljc1tdLCBkaXN0YW5jZUZuQXJnczogYW55W10sIG1heEl0ZXJhdGlvbnM6IG51bWJlcixcbiAgICB1c2VXZWJHUFU/OiBib29sZWFuLCBpbmZsYXRlPzogbnVtYmVyXG4gIH0gPSBldmVudC5kYXRhO1xuXG4gIGNvbnNvbGUudGltZSgnc3BhcnNlIG1hdHJpeCcpO1xuICBsZXQgc3BhcnNlOiBTcGFyc2VNYXRyaXhSZXN1bHQgfCBudWxsID0gbnVsbDtcbiAgaWYgKHVzZVdlYkdQVSkge1xuICAgIHRyeSB7XG4gICAgICBzcGFyc2UgPSBhd2FpdCBtdWx0aUNvbFdlYkdQVVNwYXJzZU1hdHJpeChcbiAgICAgICAgZGF0YSwgdGhyZXNob2xkIC8gMTAwLCBkaXN0YW5jZUZucyBhcyBhbnksIGFnZ3JlZ2F0aW9uTWV0aG9kIGFzIGFueSwgd2VpZ2h0cywgZGlzdGFuY2VGbkFyZ3MpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoZSk7XG4gICAgfVxuICB9XG4gIGlmICghc3BhcnNlKSB7IC8vIGZhbHNiYWNrIHRvIENQVVxuICAgIGlmICh1c2VXZWJHUFUpXG4gICAgICBjb25zb2xlLmVycm9yKCdXRUJHUFUgc3BhcnNlIG1hdHJpeCBjYWxjdWxhdGlvbiBmYWlsZWQsIGZhbGxpbmcgYmFjayB0byBDUFUgaW1wbGVtZW50YXRpb24nKTtcblxuICAgIHNwYXJzZSA9IGF3YWl0IG5ldyBTcGFyc2VNYXRyaXhTZXJ2aWNlKClcbiAgICAgIC5jYWxjTXVsdGlDb2x1bW4oZGF0YSwgZGlzdGFuY2VGbnMsIHRocmVzaG9sZCAvIDEwMCwgZGlzdGFuY2VGbkFyZ3MsIHdlaWdodHMsIGFnZ3JlZ2F0aW9uTWV0aG9kKTtcbiAgfVxuICBjb25zb2xlLnRpbWVFbmQoJ3NwYXJzZSBtYXRyaXgnKTtcblxuICAvL2NvbnN0IHJlcyA9IGF3YWl0IG5ldyBNQ0xTcGFyc2VSZWR1Y2VyKHttYXhJdGVyYXRpb25zOiBtYXhJdGVyYXRpb25zID8/IDV9KS50cmFuc2Zvcm0oc3BhcnNlLCBkYXRhWzBdLmxlbmd0aCk7XG4gIGNvbnN0IHJlZHVjZXIgPSBuZXcgTUNMU3BhcnNlUmVkdWNlcih7bWF4SXRlcmF0aW9uczogbWF4SXRlcmF0aW9ucyA/PyA1LCBpbmZsYXRlRmFjdG9yOiBpbmZsYXRlID8/IDJ9KTtcbiAgY29uc29sZS50aW1lKCdNQ0wnKTtcbiAgbGV0IHJlczogYW55ID0gbnVsbDtcbiAgaWYgKHVzZVdlYkdQVSkge1xuICAgIHRyeSB7XG4gICAgICByZXMgPSBhd2FpdCByZWR1Y2VyLnRyYW5zZm9ybVdlYkdQVShzcGFyc2UsIGRhdGFbMF0ubGVuZ3RoKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCd3ZWJHUFUgTUNMIGZhaWxlZCwgZmFsbGluZyBiYWNrIHRvIENQVSBpbXBsZW1lbnRhdGlvbicpO1xuICAgICAgY29uc29sZS5lcnJvcihlKTtcbiAgICB9XG4gIH1cbiAgaWYgKCFyZXMpXG4gICAgcmVzID0gYXdhaXQgcmVkdWNlci50cmFuc2Zvcm0oc3BhcnNlLCBkYXRhWzBdLmxlbmd0aCk7XG4gIGNvbnNvbGUudGltZUVuZCgnTUNMJyk7XG5cbiAgcG9zdE1lc3NhZ2Uoe3Jlc30pO1xufTtcbiJdfQ==","import { DistanceAggregationMethods } from './types';\nexport const isNil = (x) => x === null || x === undefined;\nexport function insertSmaller(distancesAr, indexes, num, index) {\n if (num > distancesAr[distancesAr.length - 1])\n return;\n const newPosition = distancesAr.findIndex((v) => num < v);\n distancesAr.pop();\n distancesAr.splice(newPosition, 0, num);\n indexes.pop();\n indexes.splice(newPosition, 0, index);\n}\nexport function insertLarger(distancesAr, indexes, num, index) {\n if (num < distancesAr[distancesAr.length - 1])\n return;\n const newPosition = distancesAr.findIndex((v) => num > v);\n distancesAr.pop();\n distancesAr.splice(newPosition, 0, num);\n indexes.pop();\n indexes.splice(newPosition, 0, index);\n}\nexport function getAggregationFunction(aggregationMethod, weights) {\n switch (aggregationMethod) {\n case DistanceAggregationMethods.MANHATTAN:\n return (vs) => vs.reduce((acc, val, idx) => acc + val * weights[idx], 0);\n default:\n return (vs) => {\n // euclidean\n const sum = vs.reduce((acc, val, idx) => acc + (val * weights[idx]) ** 2, 0);\n return Math.sqrt(sum);\n };\n }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJ1dGlscy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQTRCLDBCQUEwQixFQUFDLE1BQU0sU0FBUyxDQUFDO0FBRTlFLE1BQU0sQ0FBQyxNQUFNLEtBQUssR0FBRyxDQUFDLENBQU0sRUFBRSxFQUFFLENBQUMsQ0FBQyxLQUFLLElBQUksSUFBSSxDQUFDLEtBQUssU0FBUyxDQUFDO0FBRS9ELE1BQU0sVUFBVSxhQUFhLENBQUMsV0FBcUIsRUFBRSxPQUFpQixFQUFFLEdBQVcsRUFBRSxLQUFhO0lBQ2hHLElBQUksR0FBRyxHQUFHLFdBQVcsQ0FBQyxXQUFXLENBQUMsTUFBTSxHQUFDLENBQUMsQ0FBQztRQUN6QyxPQUFPO0lBRVQsTUFBTSxXQUFXLEdBQUcsV0FBVyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQzFELFdBQVcsQ0FBQyxHQUFHLEVBQUUsQ0FBQztJQUNsQixXQUFXLENBQUMsTUFBTSxDQUFDLFdBQVcsRUFBRSxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFDeEMsT0FBTyxDQUFDLEdBQUcsRUFBRSxDQUFDO0lBQ2QsT0FBTyxDQUFDLE1BQU0sQ0FBQyxXQUFXLEVBQUUsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDO0FBQ3hDLENBQUM7QUFFRCxNQUFNLFVBQVUsWUFBWSxDQUFDLFdBQXFCLEVBQUUsT0FBaUIsRUFBRSxHQUFXLEVBQUUsS0FBYTtJQUMvRixJQUFJLEdBQUcsR0FBRyxXQUFXLENBQUMsV0FBVyxDQUFDLE1BQU0sR0FBQyxDQUFDLENBQUM7UUFDekMsT0FBTztJQUVULE1BQU0sV0FBVyxHQUFHLFdBQVcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQztJQUMxRCxXQUFXLENBQUMsR0FBRyxFQUFFLENBQUM7SUFDbEIsV0FBVyxDQUFDLE1BQU0sQ0FBQyxXQUFXLEVBQUUsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0lBQ3hDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsQ0FBQztJQUNkLE9BQU8sQ0FBQyxNQUFNLENBQUMsV0FBVyxFQUFFLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQztBQUN4QyxDQUFDO0FBRUQsTUFBTSxVQUFVLHNCQUFzQixDQUNwQyxpQkFBNEMsRUFBRSxPQUFpQjtJQUUvRCxRQUFRLGlCQUFpQixFQUFFLENBQUM7UUFDMUIsS0FBSywwQkFBMEIsQ0FBQyxTQUFTO1lBQ3ZDLE9BQU8sQ0FBQyxFQUFZLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxFQUFFLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDckY7WUFDRSxPQUFPLENBQUMsRUFBWSxFQUFFLEVBQUU7Z0JBQ3RCLFlBQVk7Z0JBQ1osTUFBTSxHQUFHLEdBQUcsRUFBRSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO2dCQUM3RSxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDeEIsQ0FBQyxDQUFDO0lBQ04sQ0FBQztBQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0Rpc3RhbmNlQWdncmVnYXRpb25NZXRob2QsIERpc3RhbmNlQWdncmVnYXRpb25NZXRob2RzfSBmcm9tICcuL3R5cGVzJztcblxuZXhwb3J0IGNvbnN0IGlzTmlsID0gKHg6IGFueSkgPT4geCA9PT0gbnVsbCB8fCB4ID09PSB1bmRlZmluZWQ7XG5cbmV4cG9ydCBmdW5jdGlvbiBpbnNlcnRTbWFsbGVyKGRpc3RhbmNlc0FyOiBudW1iZXJbXSwgaW5kZXhlczogbnVtYmVyW10sIG51bTogbnVtYmVyLCBpbmRleDogbnVtYmVyKSB7XG4gIGlmIChudW0gPiBkaXN0YW5jZXNBcltkaXN0YW5jZXNBci5sZW5ndGgtMV0pXG4gICAgcmV0dXJuO1xuXG4gIGNvbnN0IG5ld1Bvc2l0aW9uID0gZGlzdGFuY2VzQXIuZmluZEluZGV4KCh2KSA9PiBudW0gPCB2KTtcbiAgZGlzdGFuY2VzQXIucG9wKCk7XG4gIGRpc3RhbmNlc0FyLnNwbGljZShuZXdQb3NpdGlvbiwgMCwgbnVtKTtcbiAgaW5kZXhlcy5wb3AoKTtcbiAgaW5kZXhlcy5zcGxpY2UobmV3UG9zaXRpb24sIDAsIGluZGV4KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGluc2VydExhcmdlcihkaXN0YW5jZXNBcjogbnVtYmVyW10sIGluZGV4ZXM6IG51bWJlcltdLCBudW06IG51bWJlciwgaW5kZXg6IG51bWJlcikge1xuICBpZiAobnVtIDwgZGlzdGFuY2VzQXJbZGlzdGFuY2VzQXIubGVuZ3RoLTFdKVxuICAgIHJldHVybjtcblxuICBjb25zdCBuZXdQb3NpdGlvbiA9IGRpc3RhbmNlc0FyLmZpbmRJbmRleCgodikgPT4gbnVtID4gdik7XG4gIGRpc3RhbmNlc0FyLnBvcCgpO1xuICBkaXN0YW5jZXNBci5zcGxpY2UobmV3UG9zaXRpb24sIDAsIG51bSk7XG4gIGluZGV4ZXMucG9wKCk7XG4gIGluZGV4ZXMuc3BsaWNlKG5ld1Bvc2l0aW9uLCAwLCBpbmRleCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRBZ2dyZWdhdGlvbkZ1bmN0aW9uKFxuICBhZ2dyZWdhdGlvbk1ldGhvZDogRGlzdGFuY2VBZ2dyZWdhdGlvbk1ldGhvZCwgd2VpZ2h0czogbnVtYmVyW11cbik6ICh2YWx1ZXM6IG51bWJlcltdKSA9PiBudW1iZXIge1xuICBzd2l0Y2ggKGFnZ3JlZ2F0aW9uTWV0aG9kKSB7XG4gICAgY2FzZSBEaXN0YW5jZUFnZ3JlZ2F0aW9uTWV0aG9kcy5NQU5IQVRUQU46XG4gICAgICByZXR1cm4gKHZzOiBudW1iZXJbXSkgPT4gdnMucmVkdWNlKChhY2MsIHZhbCwgaWR4KSA9PiBhY2MgKyB2YWwgKiB3ZWlnaHRzW2lkeF0sIDApO1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gKHZzOiBudW1iZXJbXSkgPT4ge1xuICAgICAgICAvLyBldWNsaWRlYW5cbiAgICAgICAgY29uc3Qgc3VtID0gdnMucmVkdWNlKChhY2MsIHZhbCwgaWR4KSA9PiBhY2MgKyAodmFsICogd2VpZ2h0c1tpZHhdKSAqKiAyLCAwKTtcbiAgICAgICAgcmV0dXJuIE1hdGguc3FydChzdW0pO1xuICAgICAgfTtcbiAgfVxufVxuIl19","/**\n * Graphology ForceAtlas2 Layout Default Settings\n * ===============================================\n */\nmodule.exports = {\n linLogMode: false,\n outboundAttractionDistribution: false,\n adjustSizes: false,\n edgeWeightInfluence: 1,\n scalingRatio: 1,\n strongGravityMode: false,\n gravity: 1,\n slowDown: 1,\n barnesHutOptimize: false,\n barnesHutTheta: 0.5\n};\n","/**\n * Graphology ForceAtlas2 Helpers\n * ===============================\n *\n * Miscellaneous helper functions.\n */\n\n/**\n * Constants.\n */\nvar PPN = 10;\nvar PPE = 3;\n\n/**\n * Very simple Object.assign-like function.\n *\n * @param {object} target - First object.\n * @param {object} [...objects] - Objects to merge.\n * @return {object}\n */\nexports.assign = function (target) {\n target = target || {};\n\n var objects = Array.prototype.slice.call(arguments).slice(1),\n i,\n k,\n l;\n\n for (i = 0, l = objects.length; i < l; i++) {\n if (!objects[i]) continue;\n\n for (k in objects[i]) target[k] = objects[i][k];\n }\n\n return target;\n};\n\n/**\n * Function used to validate the given settings.\n *\n * @param {object} settings - Settings to validate.\n * @return {object|null}\n */\nexports.validateSettings = function (settings) {\n if ('linLogMode' in settings && typeof settings.linLogMode !== 'boolean')\n return {message: 'the `linLogMode` setting should be a boolean.'};\n\n if (\n 'outboundAttractionDistribution' in settings &&\n typeof settings.outboundAttractionDistribution !== 'boolean'\n )\n return {\n message:\n 'the `outboundAttractionDistribution` setting should be a boolean.'\n };\n\n if ('adjustSizes' in settings && typeof settings.adjustSizes !== 'boolean')\n return {message: 'the `adjustSizes` setting should be a boolean.'};\n\n if (\n 'edgeWeightInfluence' in settings &&\n typeof settings.edgeWeightInfluence !== 'number'\n )\n return {\n message: 'the `edgeWeightInfluence` setting should be a number.'\n };\n\n if (\n 'scalingRatio' in settings &&\n !(typeof settings.scalingRatio === 'number' && settings.scalingRatio >= 0)\n )\n return {message: 'the `scalingRatio` setting should be a number >= 0.'};\n\n if (\n 'strongGravityMode' in settings &&\n typeof settings.strongGravityMode !== 'boolean'\n )\n return {message: 'the `strongGravityMode` setting should be a boolean.'};\n\n if (\n 'gravity' in settings &&\n !(typeof settings.gravity === 'number' && settings.gravity >= 0)\n )\n return {message: 'the `gravity` setting should be a number >= 0.'};\n\n if (\n 'slowDown' in settings &&\n !(typeof settings.slowDown === 'number' || settings.slowDown >= 0)\n )\n return {message: 'the `slowDown` setting should be a number >= 0.'};\n\n if (\n 'barnesHutOptimize' in settings &&\n typeof settings.barnesHutOptimize !== 'boolean'\n )\n return {message: 'the `barnesHutOptimize` setting should be a boolean.'};\n\n if (\n 'barnesHutTheta' in settings &&\n !(\n typeof settings.barnesHutTheta === 'number' &&\n settings.barnesHutTheta >= 0\n )\n )\n return {message: 'the `barnesHutTheta` setting should be a number >= 0.'};\n\n return null;\n};\n\n/**\n * Function generating a flat matrix for both nodes & edges of the given graph.\n *\n * @param {Graph} graph - Target graph.\n * @param {function} getEdgeWeight - Edge weight getter function.\n * @return {object} - Both matrices.\n */\nexports.graphToByteArrays = function (graph, getEdgeWeight) {\n var order = graph.order;\n var size = graph.size;\n var index = {};\n var j;\n\n // NOTE: float32 could lead to issues if edge array needs to index large\n // number of nodes.\n var NodeMatrix = new Float32Array(order * PPN);\n var EdgeMatrix = new Float32Array(size * PPE);\n\n // Iterate through nodes\n j = 0;\n graph.forEachNode(function (node, attr) {\n // Node index\n index[node] = j;\n\n // Populating byte array\n NodeMatrix[j] = attr.x;\n NodeMatrix[j + 1] = attr.y;\n NodeMatrix[j + 2] = 0; // dx\n NodeMatrix[j + 3] = 0; // dy\n NodeMatrix[j + 4] = 0; // old_dx\n NodeMatrix[j + 5] = 0; // old_dy\n NodeMatrix[j + 6] = 1; // mass\n NodeMatrix[j + 7] = 1; // convergence\n NodeMatrix[j + 8] = attr.size || 1;\n NodeMatrix[j + 9] = attr.fixed ? 1 : 0;\n j += PPN;\n });\n\n // Iterate through edges\n j = 0;\n graph.forEachEdge(function (edge, attr, source, target, sa, ta, u) {\n var sj = index[source];\n var tj = index[target];\n\n var weight = getEdgeWeight(edge, attr, source, target, sa, ta, u);\n\n // Incrementing mass to be a node's weighted degree\n NodeMatrix[sj + 6] += weight;\n NodeMatrix[tj + 6] += weight;\n\n // Populating byte array\n EdgeMatrix[j] = sj;\n EdgeMatrix[j + 1] = tj;\n EdgeMatrix[j + 2] = weight;\n j += PPE;\n });\n\n return {\n nodes: NodeMatrix,\n edges: EdgeMatrix\n };\n};\n\n/**\n * Function applying the layout back to the graph.\n *\n * @param {Graph} graph - Target graph.\n * @param {Float32Array} NodeMatrix - Node matrix.\n * @param {function|null} outputReducer - A node reducer.\n */\nexports.assignLayoutChanges = function (graph, NodeMatrix, outputReducer) {\n var i = 0;\n\n graph.updateEachNodeAttributes(function (node, attr) {\n attr.x = NodeMatrix[i];\n attr.y = NodeMatrix[i + 1];\n\n i += PPN;\n\n return outputReducer ? outputReducer(node, attr) : attr;\n });\n};\n\n/**\n * Function reading the positions (only) from the graph, to write them in the matrix.\n *\n * @param {Graph} graph - Target graph.\n * @param {Float32Array} NodeMatrix - Node matrix.\n */\nexports.readGraphPositions = function (graph, NodeMatrix) {\n var i = 0;\n\n graph.forEachNode(function (node, attr) {\n NodeMatrix[i] = attr.x;\n NodeMatrix[i + 1] = attr.y;\n\n i += PPN;\n });\n};\n\n/**\n * Function collecting the layout positions.\n *\n * @param {Graph} graph - Target graph.\n * @param {Float32Array} NodeMatrix - Node matrix.\n * @param {function|null} outputReducer - A nodes reducer.\n * @return {object} - Map to node positions.\n */\nexports.collectLayoutChanges = function (graph, NodeMatrix, outputReducer) {\n var nodes = graph.nodes(),\n positions = {};\n\n for (var i = 0, j = 0, l = NodeMatrix.length; i < l; i += PPN) {\n if (outputReducer) {\n var newAttr = Object.assign({}, graph.getNodeAttributes(nodes[j]));\n newAttr.x = NodeMatrix[i];\n newAttr.y = NodeMatrix[i + 1];\n newAttr = outputReducer(nodes[j], newAttr);\n positions[nodes[j]] = {\n x: newAttr.x,\n y: newAttr.y\n };\n } else {\n positions[nodes[j]] = {\n x: NodeMatrix[i],\n y: NodeMatrix[i + 1]\n };\n }\n\n j++;\n }\n\n return positions;\n};\n\n/**\n * Function returning a web worker from the given function.\n *\n * @param {function} fn - Function for the worker.\n * @return {DOMString}\n */\nexports.createWorker = function createWorker(fn) {\n var xURL = window.URL || window.webkitURL;\n var code = fn.toString();\n var objectUrl = xURL.createObjectURL(\n new Blob(['(' + code + ').call(this);'], {type: 'text/javascript'})\n );\n var worker = new Worker(objectUrl);\n xURL.revokeObjectURL(objectUrl);\n\n return worker;\n};\n","/**\n * Graphology ForceAtlas2 Layout\n * ==============================\n *\n * Library endpoint.\n */\nvar isGraph = require('graphology-utils/is-graph');\nvar createEdgeWeightGetter =\n require('graphology-utils/getters').createEdgeWeightGetter;\nvar iterate = require('./iterate.js');\nvar helpers = require('./helpers.js');\n\nvar DEFAULT_SETTINGS = require('./defaults.js');\n\n/**\n * Asbtract function used to run a certain number of iterations.\n *\n * @param {boolean} assign - Whether to assign positions.\n * @param {Graph} graph - Target graph.\n * @param {object|number} params - If number, params.iterations, else:\n * @param {function} getWeight - Edge weight getter function.\n * @param {number} iterations - Number of iterations.\n * @param {function|null} outputReducer - A node reducer\n * @param {object} [settings] - Settings.\n * @return {object|undefined}\n */\nfunction abstractSynchronousLayout(assign, graph, params) {\n if (!isGraph(graph))\n throw new Error(\n 'graphology-layout-forceatlas2: the given graph is not a valid graphology instance.'\n );\n\n if (typeof params === 'number') params = {iterations: params};\n\n var iterations = params.iterations;\n\n if (typeof iterations !== 'number')\n throw new Error(\n 'graphology-layout-forceatlas2: invalid number of iterations.'\n );\n\n if (iterations <= 0)\n throw new Error(\n 'graphology-layout-forceatlas2: you should provide a positive number of iterations.'\n );\n\n var getEdgeWeight = createEdgeWeightGetter(\n 'getEdgeWeight' in params ? params.getEdgeWeight : 'weight'\n ).fromEntry;\n\n var outputReducer =\n typeof params.outputReducer === 'function' ? params.outputReducer : null;\n\n // Validating settings\n var settings = helpers.assign({}, DEFAULT_SETTINGS, params.settings);\n var validationError = helpers.validateSettings(settings);\n\n if (validationError)\n throw new Error(\n 'graphology-layout-forceatlas2: ' + validationError.message\n );\n\n // Building matrices\n var matrices = helpers.graphToByteArrays(graph, getEdgeWeight);\n\n var i;\n\n // Iterating\n for (i = 0; i < iterations; i++)\n iterate(settings, matrices.nodes, matrices.edges);\n\n // Applying\n if (assign) {\n helpers.assignLayoutChanges(graph, matrices.nodes, outputReducer);\n return;\n }\n\n return helpers.collectLayoutChanges(graph, matrices.nodes);\n}\n\n/**\n * Function returning sane layout settings for the given graph.\n *\n * @param {Graph|number} graph - Target graph or graph order.\n * @return {object}\n */\nfunction inferSettings(graph) {\n var order = typeof graph === 'number' ? graph : graph.order;\n\n return {\n barnesHutOptimize: order > 2000,\n strongGravityMode: true,\n gravity: 0.05,\n scalingRatio: 10,\n slowDown: 1 + Math.log(order)\n };\n}\n\n/**\n * Exporting.\n */\nvar synchronousLayout = abstractSynchronousLayout.bind(null, false);\nsynchronousLayout.assign = abstractSynchronousLayout.bind(null, true);\nsynchronousLayout.inferSettings = inferSettings;\n\nmodule.exports = synchronousLayout;\n","/* eslint no-constant-condition: 0 */\n/**\n * Graphology ForceAtlas2 Iteration\n * =================================\n *\n * Function used to perform a single iteration of the algorithm.\n */\n\n/**\n * Matrices properties accessors.\n */\nvar NODE_X = 0;\nvar NODE_Y = 1;\nvar NODE_DX = 2;\nvar NODE_DY = 3;\nvar NODE_OLD_DX = 4;\nvar NODE_OLD_DY = 5;\nvar NODE_MASS = 6;\nvar NODE_CONVERGENCE = 7;\nvar NODE_SIZE = 8;\nvar NODE_FIXED = 9;\n\nvar EDGE_SOURCE = 0;\nvar EDGE_TARGET = 1;\nvar EDGE_WEIGHT = 2;\n\nvar REGION_NODE = 0;\nvar REGION_CENTER_X = 1;\nvar REGION_CENTER_Y = 2;\nvar REGION_SIZE = 3;\nvar REGION_NEXT_SIBLING = 4;\nvar REGION_FIRST_CHILD = 5;\nvar REGION_MASS = 6;\nvar REGION_MASS_CENTER_X = 7;\nvar REGION_MASS_CENTER_Y = 8;\n\nvar SUBDIVISION_ATTEMPTS = 3;\n\n/**\n * Constants.\n */\nvar PPN = 10;\nvar PPE = 3;\nvar PPR = 9;\n\nvar MAX_FORCE = 10;\n\n/**\n * Function used to perform a single interation of the algorithm.\n *\n * @param {object} options - Layout options.\n * @param {Float32Array} NodeMatrix - Node data.\n * @param {Float32Array} EdgeMatrix - Edge data.\n * @return {object} - Some metadata.\n */\nmodule.exports = function iterate(options, NodeMatrix, EdgeMatrix) {\n // Initializing variables\n var l, r, n, n1, n2, rn, e, w, g, s;\n\n var order = NodeMatrix.length,\n size = EdgeMatrix.length;\n\n var adjustSizes = options.adjustSizes;\n\n var thetaSquared = options.barnesHutTheta * options.barnesHutTheta;\n\n var outboundAttCompensation, coefficient, xDist, yDist, ewc, distance, factor;\n\n var RegionMatrix = [];\n\n // 1) Initializing layout data\n //-----------------------------\n\n // Resetting positions & computing max values\n for (n = 0; n < order; n += PPN) {\n NodeMatrix[n + NODE_OLD_DX] = NodeMatrix[n + NODE_DX];\n NodeMatrix[n + NODE_OLD_DY] = NodeMatrix[n + NODE_DY];\n NodeMatrix[n + NODE_DX] = 0;\n NodeMatrix[n + NODE_DY] = 0;\n }\n\n // If outbound attraction distribution, compensate\n if (options.outboundAttractionDistribution) {\n outboundAttCompensation = 0;\n for (n = 0; n < order; n += PPN) {\n outboundAttCompensation += NodeMatrix[n + NODE_MASS];\n }\n\n outboundAttCompensation /= order / PPN;\n }\n\n // 1.bis) Barnes-Hut computation\n //------------------------------\n\n if (options.barnesHutOptimize) {\n // Setting up\n var minX = Infinity,\n maxX = -Infinity,\n minY = Infinity,\n maxY = -Infinity,\n q,\n q2,\n subdivisionAttempts;\n\n // Computing min and max values\n for (n = 0; n < order; n += PPN) {\n minX = Math.min(minX, NodeMatrix[n + NODE_X]);\n maxX = Math.max(maxX, NodeMatrix[n + NODE_X]);\n minY = Math.min(minY, NodeMatrix[n + NODE_Y]);\n maxY = Math.max(maxY, NodeMatrix[n + NODE_Y]);\n }\n\n // squarify bounds, it's a quadtree\n var dx = maxX - minX,\n dy = maxY - minY;\n if (dx > dy) {\n minY -= (dx - dy) / 2;\n maxY = minY + dx;\n } else {\n minX -= (dy - dx) / 2;\n maxX = minX + dy;\n }\n\n // Build the Barnes Hut root region\n RegionMatrix[0 + REGION_NODE] = -1;\n RegionMatrix[0 + REGION_CENTER_X] = (minX + maxX) / 2;\n RegionMatrix[0 + REGION_CENTER_Y] = (minY + maxY) / 2;\n RegionMatrix[0 + REGION_SIZE] = Math.max(maxX - minX, maxY - minY);\n RegionMatrix[0 + REGION_NEXT_SIBLING] = -1;\n RegionMatrix[0 + REGION_FIRST_CHILD] = -1;\n RegionMatrix[0 + REGION_MASS] = 0;\n RegionMatrix[0 + REGION_MASS_CENTER_X] = 0;\n RegionMatrix[0 + REGION_MASS_CENTER_Y] = 0;\n\n // Add each node in the tree\n l = 1;\n for (n = 0; n < order; n += PPN) {\n // Current region, starting with root\n r = 0;\n subdivisionAttempts = SUBDIVISION_ATTEMPTS;\n\n while (true) {\n // Are there sub-regions?\n\n // We look at first child index\n if (RegionMatrix[r + REGION_FIRST_CHILD] >= 0) {\n // There are sub-regions\n\n // We just iterate to find a \"leaf\" of the tree\n // that is an empty region or a region with a single node\n // (see next case)\n\n // Find the quadrant of n\n if (NodeMatrix[n + NODE_X] < RegionMatrix[r + REGION_CENTER_X]) {\n if (NodeMatrix[n + NODE_Y] < RegionMatrix[r + REGION_CENTER_Y]) {\n // Top Left quarter\n q = RegionMatrix[r + REGION_FIRST_CHILD];\n } else {\n // Bottom Left quarter\n q = RegionMatrix[r + REGION_FIRST_CHILD] + PPR;\n }\n } else {\n if (NodeMatrix[n + NODE_Y] < RegionMatrix[r + REGION_CENTER_Y]) {\n // Top Right quarter\n q = RegionMatrix[r + REGION_FIRST_CHILD] + PPR * 2;\n } else {\n // Bottom Right quarter\n q = RegionMatrix[r + REGION_FIRST_CHILD] + PPR * 3;\n }\n }\n\n // Update center of mass and mass (we only do it for non-leave regions)\n RegionMatrix[r + REGION_MASS_CENTER_X] =\n (RegionMatrix[r + REGION_MASS_CENTER_X] *\n RegionMatrix[r + REGION_MASS] +\n NodeMatrix[n + NODE_X] * NodeMatrix[n + NODE_MASS]) /\n (RegionMatrix[r + REGION_MASS] + NodeMatrix[n + NODE_MASS]);\n\n RegionMatrix[r + REGION_MASS_CENTER_Y] =\n (RegionMatrix[r + REGION_MASS_CENTER_Y] *\n RegionMatrix[r + REGION_MASS] +\n NodeMatrix[n + NODE_Y] * NodeMatrix[n + NODE_MASS]) /\n (RegionMatrix[r + REGION_MASS] + NodeMatrix[n + NODE_MASS]);\n\n RegionMatrix[r + REGION_MASS] += NodeMatrix[n + NODE_MASS];\n\n // Iterate on the right quadrant\n r = q;\n continue;\n } else {\n // There are no sub-regions: we are in a \"leaf\"\n\n // Is there a node in this leave?\n if (RegionMatrix[r + REGION_NODE] < 0) {\n // There is no node in region:\n // we record node n and go on\n RegionMatrix[r + REGION_NODE] = n;\n break;\n } else {\n // There is a node in this region\n\n // We will need to create sub-regions, stick the two\n // nodes (the old one r[0] and the new one n) in two\n // subregions. If they fall in the same quadrant,\n // we will iterate.\n\n // Create sub-regions\n RegionMatrix[r + REGION_FIRST_CHILD] = l * PPR;\n w = RegionMatrix[r + REGION_SIZE] / 2; // new size (half)\n\n // NOTE: we use screen coordinates\n // from Top Left to Bottom Right\n\n // Top Left sub-region\n g = RegionMatrix[r + REGION_FIRST_CHILD];\n\n RegionMatrix[g + REGION_NODE] = -1;\n RegionMatrix[g + REGION_CENTER_X] =\n RegionMatrix[r + REGION_CENTER_X] - w;\n RegionMatrix[g + REGION_CENTER_Y] =\n RegionMatrix[r + REGION_CENTER_Y] - w;\n RegionMatrix[g + REGION_SIZE] = w;\n RegionMatrix[g + REGION_NEXT_SIBLING] = g + PPR;\n RegionMatrix[g + REGION_FIRST_CHILD] = -1;\n RegionMatrix[g + REGION_MASS] = 0;\n RegionMatrix[g + REGION_MASS_CENTER_X] = 0;\n RegionMatrix[g + REGION_MASS_CENTER_Y] = 0;\n\n // Bottom Left sub-region\n g += PPR;\n RegionMatrix[g + REGION_NODE] = -1;\n RegionMatrix[g + REGION_CENTER_X] =\n RegionMatrix[r + REGION_CENTER_X] - w;\n RegionMatrix[g + REGION_CENTER_Y] =\n RegionMatrix[r + REGION_CENTER_Y] + w;\n RegionMatrix[g + REGION_SIZE] = w;\n RegionMatrix[g + REGION_NEXT_SIBLING] = g + PPR;\n RegionMatrix[g + REGION_FIRST_CHILD] = -1;\n RegionMatrix[g + REGION_MASS] = 0;\n RegionMatrix[g + REGION_MASS_CENTER_X] = 0;\n RegionMatrix[g + REGION_MASS_CENTER_Y] = 0;\n\n // Top Right sub-region\n g += PPR;\n RegionMatrix[g + REGION_NODE] = -1;\n RegionMatrix[g + REGION_CENTER_X] =\n RegionMatrix[r + REGION_CENTER_X] + w;\n RegionMatrix[g + REGION_CENTER_Y] =\n RegionMatrix[r + REGION_CENTER_Y] - w;\n RegionMatrix[g + REGION_SIZE] = w;\n RegionMatrix[g + REGION_NEXT_SIBLING] = g + PPR;\n RegionMatrix[g + REGION_FIRST_CHILD] = -1;\n RegionMatrix[g + REGION_MASS] = 0;\n RegionMatrix[g + REGION_MASS_CENTER_X] = 0;\n RegionMatrix[g + REGION_MASS_CENTER_Y] = 0;\n\n // Bottom Right sub-region\n g += PPR;\n RegionMatrix[g + REGION_NODE] = -1;\n RegionMatrix[g + REGION_CENTER_X] =\n RegionMatrix[r + REGION_CENTER_X] + w;\n RegionMatrix[g + REGION_CENTER_Y] =\n RegionMatrix[r + REGION_CENTER_Y] + w;\n RegionMatrix[g + REGION_SIZE] = w;\n RegionMatrix[g + REGION_NEXT_SIBLING] =\n RegionMatrix[r + REGION_NEXT_SIBLING];\n RegionMatrix[g + REGION_FIRST_CHILD] = -1;\n RegionMatrix[g + REGION_MASS] = 0;\n RegionMatrix[g + REGION_MASS_CENTER_X] = 0;\n RegionMatrix[g + REGION_MASS_CENTER_Y] = 0;\n\n l += 4;\n\n // Now the goal is to find two different sub-regions\n // for the two nodes: the one previously recorded (r[0])\n // and the one we want to add (n)\n\n // Find the quadrant of the old node\n if (\n NodeMatrix[RegionMatrix[r + REGION_NODE] + NODE_X] <\n RegionMatrix[r + REGION_CENTER_X]\n ) {\n if (\n NodeMatrix[RegionMatrix[r + REGION_NODE] + NODE_Y] <\n RegionMatrix[r + REGION_CENTER_Y]\n ) {\n // Top Left quarter\n q = RegionMatrix[r + REGION_FIRST_CHILD];\n } else {\n // Bottom Left quarter\n q = RegionMatrix[r + REGION_FIRST_CHILD] + PPR;\n }\n } else {\n if (\n NodeMatrix[RegionMatrix[r + REGION_NODE] + NODE_Y] <\n RegionMatrix[r + REGION_CENTER_Y]\n ) {\n // Top Right quarter\n q = RegionMatrix[r + REGION_FIRST_CHILD] + PPR * 2;\n } else {\n // Bottom Right quarter\n q = RegionMatrix[r + REGION_FIRST_CHILD] + PPR * 3;\n }\n }\n\n // We remove r[0] from the region r, add its mass to r and record it in q\n RegionMatrix[r + REGION_MASS] =\n NodeMatrix[RegionMatrix[r + REGION_NODE] + NODE_MASS];\n RegionMatrix[r + REGION_MASS_CENTER_X] =\n NodeMatrix[RegionMatrix[r + REGION_NODE] + NODE_X];\n RegionMatrix[r + REGION_MASS_CENTER_Y] =\n NodeMatrix[RegionMatrix[r + REGION_NODE] + NODE_Y];\n\n RegionMatrix[q + REGION_NODE] = RegionMatrix[r + REGION_NODE];\n RegionMatrix[r + REGION_NODE] = -1;\n\n // Find the quadrant of n\n if (NodeMatrix[n + NODE_X] < RegionMatrix[r + REGION_CENTER_X]) {\n if (NodeMatrix[n + NODE_Y] < RegionMatrix[r + REGION_CENTER_Y]) {\n // Top Left quarter\n q2 = RegionMatrix[r + REGION_FIRST_CHILD];\n } else {\n // Bottom Left quarter\n q2 = RegionMatrix[r + REGION_FIRST_CHILD] + PPR;\n }\n } else {\n if (NodeMatrix[n + NODE_Y] < RegionMatrix[r + REGION_CENTER_Y]) {\n // Top Right quarter\n q2 = RegionMatrix[r + REGION_FIRST_CHILD] + PPR * 2;\n } else {\n // Bottom Right quarter\n q2 = RegionMatrix[r + REGION_FIRST_CHILD] + PPR * 3;\n }\n }\n\n if (q === q2) {\n // If both nodes are in the same quadrant,\n // we have to try it again on this quadrant\n if (subdivisionAttempts--) {\n r = q;\n continue; // while\n } else {\n // we are out of precision here, and we cannot subdivide anymore\n // but we have to break the loop anyway\n subdivisionAttempts = SUBDIVISION_ATTEMPTS;\n break; // while\n }\n }\n\n // If both quadrants are different, we record n\n // in its quadrant\n RegionMatrix[q2 + REGION_NODE] = n;\n break;\n }\n }\n }\n }\n }\n\n // 2) Repulsion\n //--------------\n // NOTES: adjustSizes = antiCollision & scalingRatio = coefficient\n\n if (options.barnesHutOptimize) {\n coefficient = options.scalingRatio;\n\n // Applying repulsion through regions\n for (n = 0; n < order; n += PPN) {\n // Computing leaf quad nodes iteration\n\n r = 0; // Starting with root region\n while (true) {\n if (RegionMatrix[r + REGION_FIRST_CHILD] >= 0) {\n // The region has sub-regions\n\n // We run the Barnes Hut test to see if we are at the right distance\n distance =\n Math.pow(\n NodeMatrix[n + NODE_X] - RegionMatrix[r + REGION_MASS_CENTER_X],\n 2\n ) +\n Math.pow(\n NodeMatrix[n + NODE_Y] - RegionMatrix[r + REGION_MASS_CENTER_Y],\n 2\n );\n\n s = RegionMatrix[r + REGION_SIZE];\n\n if ((4 * s * s) / distance < thetaSquared) {\n // We treat the region as a single body, and we repulse\n\n xDist =\n NodeMatrix[n + NODE_X] - RegionMatrix[r + REGION_MASS_CENTER_X];\n yDist =\n NodeMatrix[n + NODE_Y] - RegionMatrix[r + REGION_MASS_CENTER_Y];\n\n if (adjustSizes === true) {\n //-- Linear Anti-collision Repulsion\n if (distance > 0) {\n factor =\n (coefficient *\n NodeMatrix[n + NODE_MASS] *\n RegionMatrix[r + REGION_MASS]) /\n distance;\n\n NodeMatrix[n + NODE_DX] += xDist * factor;\n NodeMatrix[n + NODE_DY] += yDist * factor;\n } else if (distance < 0) {\n factor =\n (-coefficient *\n NodeMatrix[n + NODE_MASS] *\n RegionMatrix[r + REGION_MASS]) /\n Math.sqrt(distance);\n\n NodeMatrix[n + NODE_DX] += xDist * factor;\n NodeMatrix[n + NODE_DY] += yDist * factor;\n }\n } else {\n //-- Linear Repulsion\n if (distance > 0) {\n factor =\n (coefficient *\n NodeMatrix[n + NODE_MASS] *\n RegionMatrix[r + REGION_MASS]) /\n distance;\n\n NodeMatrix[n + NODE_DX] += xDist * factor;\n NodeMatrix[n + NODE_DY] += yDist * factor;\n }\n }\n\n // When this is done, we iterate. We have to look at the next sibling.\n r = RegionMatrix[r + REGION_NEXT_SIBLING];\n if (r < 0) break; // No next sibling: we have finished the tree\n\n continue;\n } else {\n // The region is too close and we have to look at sub-regions\n r = RegionMatrix[r + REGION_FIRST_CHILD];\n continue;\n }\n } else {\n // The region has no sub-region\n // If there is a node r[0] and it is not n, then repulse\n rn = RegionMatrix[r + REGION_NODE];\n\n if (rn >= 0 && rn !== n) {\n xDist = NodeMatrix[n + NODE_X] - NodeMatrix[rn + NODE_X];\n yDist = NodeMatrix[n + NODE_Y] - NodeMatrix[rn + NODE_Y];\n\n distance = xDist * xDist + yDist * yDist;\n\n if (adjustSizes === true) {\n //-- Linear Anti-collision Repulsion\n if (distance > 0) {\n factor =\n (coefficient *\n NodeMatrix[n + NODE_MASS] *\n NodeMatrix[rn + NODE_MASS]) /\n distance;\n\n NodeMatrix[n + NODE_DX] += xDist * factor;\n NodeMatrix[n + NODE_DY] += yDist * factor;\n } else if (distance < 0) {\n factor =\n (-coefficient *\n NodeMatrix[n + NODE_MASS] *\n NodeMatrix[rn + NODE_MASS]) /\n Math.sqrt(distance);\n\n NodeMatrix[n + NODE_DX] += xDist * factor;\n NodeMatrix[n + NODE_DY] += yDist * factor;\n }\n } else {\n //-- Linear Repulsion\n if (distance > 0) {\n factor =\n (coefficient *\n NodeMatrix[n + NODE_MASS] *\n NodeMatrix[rn + NODE_MASS]) /\n distance;\n\n NodeMatrix[n + NODE_DX] += xDist * factor;\n NodeMatrix[n + NODE_DY] += yDist * factor;\n }\n }\n }\n\n // When this is done, we iterate. We have to look at the next sibling.\n r = RegionMatrix[r + REGION_NEXT_SIBLING];\n\n if (r < 0) break; // No next sibling: we have finished the tree\n\n continue;\n }\n }\n }\n } else {\n coefficient = options.scalingRatio;\n\n // Square iteration\n for (n1 = 0; n1 < order; n1 += PPN) {\n for (n2 = 0; n2 < n1; n2 += PPN) {\n // Common to both methods\n xDist = NodeMatrix[n1 + NODE_X] - NodeMatrix[n2 + NODE_X];\n yDist = NodeMatrix[n1 + NODE_Y] - NodeMatrix[n2 + NODE_Y];\n\n if (adjustSizes === true) {\n //-- Anticollision Linear Repulsion\n distance =\n Math.sqrt(xDist * xDist + yDist * yDist) -\n NodeMatrix[n1 + NODE_SIZE] -\n NodeMatrix[n2 + NODE_SIZE];\n\n if (distance > 0) {\n factor =\n (coefficient *\n NodeMatrix[n1 + NODE_MASS] *\n NodeMatrix[n2 + NODE_MASS]) /\n distance /\n distance;\n\n // Updating nodes' dx and dy\n NodeMatrix[n1 + NODE_DX] += xDist * factor;\n NodeMatrix[n1 + NODE_DY] += yDist * factor;\n\n NodeMatrix[n2 + NODE_DX] -= xDist * factor;\n NodeMatrix[n2 + NODE_DY] -= yDist * factor;\n } else if (distance < 0) {\n factor =\n 100 *\n coefficient *\n NodeMatrix[n1 + NODE_MASS] *\n NodeMatrix[n2 + NODE_MASS];\n\n // Updating nodes' dx and dy\n NodeMatrix[n1 + NODE_DX] += xDist * factor;\n NodeMatrix[n1 + NODE_DY] += yDist * factor;\n\n NodeMatrix[n2 + NODE_DX] -= xDist * factor;\n NodeMatrix[n2 + NODE_DY] -= yDist * factor;\n }\n } else {\n //-- Linear Repulsion\n distance = Math.sqrt(xDist * xDist + yDist * yDist);\n\n if (distance > 0) {\n factor =\n (coefficient *\n NodeMatrix[n1 + NODE_MASS] *\n NodeMatrix[n2 + NODE_MASS]) /\n distance /\n distance;\n\n // Updating nodes' dx and dy\n NodeMatrix[n1 + NODE_DX] += xDist * factor;\n NodeMatrix[n1 + NODE_DY] += yDist * factor;\n\n NodeMatrix[n2 + NODE_DX] -= xDist * factor;\n NodeMatrix[n2 + NODE_DY] -= yDist * factor;\n }\n }\n }\n }\n }\n\n // 3) Gravity\n //------------\n g = options.gravity / options.scalingRatio;\n coefficient = options.scalingRatio;\n for (n = 0; n < order; n += PPN) {\n factor = 0;\n\n // Common to both methods\n xDist = NodeMatrix[n + NODE_X];\n yDist = NodeMatrix[n + NODE_Y];\n distance = Math.sqrt(Math.pow(xDist, 2) + Math.pow(yDist, 2));\n\n if (options.strongGravityMode) {\n //-- Strong gravity\n if (distance > 0) factor = coefficient * NodeMatrix[n + NODE_MASS] * g;\n } else {\n //-- Linear Anti-collision Repulsion n\n if (distance > 0)\n factor = (coefficient * NodeMatrix[n + NODE_MASS] * g) / distance;\n }\n\n // Updating node's dx and dy\n NodeMatrix[n + NODE_DX] -= xDist * factor;\n NodeMatrix[n + NODE_DY] -= yDist * factor;\n }\n\n // 4) Attraction\n //---------------\n coefficient =\n 1 * (options.outboundAttractionDistribution ? outboundAttCompensation : 1);\n\n // TODO: simplify distance\n // TODO: coefficient is always used as -c --> optimize?\n for (e = 0; e < size; e += PPE) {\n n1 = EdgeMatrix[e + EDGE_SOURCE];\n n2 = EdgeMatrix[e + EDGE_TARGET];\n w = EdgeMatrix[e + EDGE_WEIGHT];\n\n // Edge weight influence\n ewc = Math.pow(w, options.edgeWeightInfluence);\n\n // Common measures\n xDist = NodeMatrix[n1 + NODE_X] - NodeMatrix[n2 + NODE_X];\n yDist = NodeMatrix[n1 + NODE_Y] - NodeMatrix[n2 + NODE_Y];\n\n // Applying attraction to nodes\n if (adjustSizes === true) {\n distance =\n Math.sqrt(xDist * xDist + yDist * yDist) -\n NodeMatrix[n1 + NODE_SIZE] -\n NodeMatrix[n2 + NODE_SIZE];\n\n if (options.linLogMode) {\n if (options.outboundAttractionDistribution) {\n //-- LinLog Degree Distributed Anti-collision Attraction\n if (distance > 0) {\n factor =\n (-coefficient * ewc * Math.log(1 + distance)) /\n distance /\n NodeMatrix[n1 + NODE_MASS];\n }\n } else {\n //-- LinLog Anti-collision Attraction\n if (distance > 0) {\n factor = (-coefficient * ewc * Math.log(1 + distance)) / distance;\n }\n }\n } else {\n if (options.outboundAttractionDistribution) {\n //-- Linear Degree Distributed Anti-collision Attraction\n if (distance > 0) {\n factor = (-coefficient * ewc) / NodeMatrix[n1 + NODE_MASS];\n }\n } else {\n //-- Linear Anti-collision Attraction\n if (distance > 0) {\n factor = -coefficient * ewc;\n }\n }\n }\n } else {\n distance = Math.sqrt(Math.pow(xDist, 2) + Math.pow(yDist, 2));\n\n if (options.linLogMode) {\n if (options.outboundAttractionDistribution) {\n //-- LinLog Degree Distributed Attraction\n if (distance > 0) {\n factor =\n (-coefficient * ewc * Math.log(1 + distance)) /\n distance /\n NodeMatrix[n1 + NODE_MASS];\n }\n } else {\n //-- LinLog Attraction\n if (distance > 0)\n factor = (-coefficient * ewc * Math.log(1 + distance)) / distance;\n }\n } else {\n if (options.outboundAttractionDistribution) {\n //-- Linear Attraction Mass Distributed\n // NOTE: Distance is set to 1 to override next condition\n distance = 1;\n factor = (-coefficient * ewc) / NodeMatrix[n1 + NODE_MASS];\n } else {\n //-- Linear Attraction\n // NOTE: Distance is set to 1 to override next condition\n distance = 1;\n factor = -coefficient * ewc;\n }\n }\n }\n\n // Updating nodes' dx and dy\n // TODO: if condition or factor = 1?\n if (distance > 0) {\n // Updating nodes' dx and dy\n NodeMatrix[n1 + NODE_DX] += xDist * factor;\n NodeMatrix[n1 + NODE_DY] += yDist * factor;\n\n NodeMatrix[n2 + NODE_DX] -= xDist * factor;\n NodeMatrix[n2 + NODE_DY] -= yDist * factor;\n }\n }\n\n // 5) Apply Forces\n //-----------------\n var force, swinging, traction, nodespeed, newX, newY;\n\n // MATH: sqrt and square distances\n if (adjustSizes === true) {\n for (n = 0; n < order; n += PPN) {\n if (NodeMatrix[n + NODE_FIXED] !== 1) {\n force = Math.sqrt(\n Math.pow(NodeMatrix[n + NODE_DX], 2) +\n Math.pow(NodeMatrix[n + NODE_DY], 2)\n );\n\n if (force > MAX_FORCE) {\n NodeMatrix[n + NODE_DX] =\n (NodeMatrix[n + NODE_DX] * MAX_FORCE) / force;\n NodeMatrix[n + NODE_DY] =\n (NodeMatrix[n + NODE_DY] * MAX_FORCE) / force;\n }\n\n swinging =\n NodeMatrix[n + NODE_MASS] *\n Math.sqrt(\n (NodeMatrix[n + NODE_OLD_DX] - NodeMatrix[n + NODE_DX]) *\n (NodeMatrix[n + NODE_OLD_DX] - NodeMatrix[n + NODE_DX]) +\n (NodeMatrix[n + NODE_OLD_DY] - NodeMatrix[n + NODE_DY]) *\n (NodeMatrix[n + NODE_OLD_DY] - NodeMatrix[n + NODE_DY])\n );\n\n traction =\n Math.sqrt(\n (NodeMatrix[n + NODE_OLD_DX] + NodeMatrix[n + NODE_DX]) *\n (NodeMatrix[n + NODE_OLD_DX] + NodeMatrix[n + NODE_DX]) +\n (NodeMatrix[n + NODE_OLD_DY] + NodeMatrix[n + NODE_DY]) *\n (NodeMatrix[n + NODE_OLD_DY] + NodeMatrix[n + NODE_DY])\n ) / 2;\n\n nodespeed = (0.1 * Math.log(1 + traction)) / (1 + Math.sqrt(swinging));\n\n // Updating node's positon\n newX =\n NodeMatrix[n + NODE_X] +\n NodeMatrix[n + NODE_DX] * (nodespeed / options.slowDown);\n NodeMatrix[n + NODE_X] = newX;\n\n newY =\n NodeMatrix[n + NODE_Y] +\n NodeMatrix[n + NODE_DY] * (nodespeed / options.slowDown);\n NodeMatrix[n + NODE_Y] = newY;\n }\n }\n } else {\n for (n = 0; n < order; n += PPN) {\n if (NodeMatrix[n + NODE_FIXED] !== 1) {\n swinging =\n NodeMatrix[n + NODE_MASS] *\n Math.sqrt(\n (NodeMatrix[n + NODE_OLD_DX] - NodeMatrix[n + NODE_DX]) *\n (NodeMatrix[n + NODE_OLD_DX] - NodeMatrix[n + NODE_DX]) +\n (NodeMatrix[n + NODE_OLD_DY] - NodeMatrix[n + NODE_DY]) *\n (NodeMatrix[n + NODE_OLD_DY] - NodeMatrix[n + NODE_DY])\n );\n\n traction =\n Math.sqrt(\n (NodeMatrix[n + NODE_OLD_DX] + NodeMatrix[n + NODE_DX]) *\n (NodeMatrix[n + NODE_OLD_DX] + NodeMatrix[n + NODE_DX]) +\n (NodeMatrix[n + NODE_OLD_DY] + NodeMatrix[n + NODE_DY]) *\n (NodeMatrix[n + NODE_OLD_DY] + NodeMatrix[n + NODE_DY])\n ) / 2;\n\n nodespeed =\n (NodeMatrix[n + NODE_CONVERGENCE] * Math.log(1 + traction)) /\n (1 + Math.sqrt(swinging));\n\n // Updating node convergence\n NodeMatrix[n + NODE_CONVERGENCE] = Math.min(\n 1,\n Math.sqrt(\n (nodespeed *\n (Math.pow(NodeMatrix[n + NODE_DX], 2) +\n Math.pow(NodeMatrix[n + NODE_DY], 2))) /\n (1 + Math.sqrt(swinging))\n )\n );\n\n // Updating node's positon\n newX =\n NodeMatrix[n + NODE_X] +\n NodeMatrix[n + NODE_DX] * (nodespeed / options.slowDown);\n NodeMatrix[n + NODE_X] = newX;\n\n newY =\n NodeMatrix[n + NODE_Y] +\n NodeMatrix[n + NODE_DY] * (nodespeed / options.slowDown);\n NodeMatrix[n + NODE_Y] = newY;\n }\n }\n }\n\n // We return the information about the layout (no need to return the matrices)\n return {};\n};\n","/**\n * Graphology Weight Getter\n * =========================\n *\n * Function creating weight getters.\n */\nfunction coerceWeight(value) {\n // Ensuring target value is a correct number\n if (typeof value !== 'number' || isNaN(value)) return 1;\n\n return value;\n}\n\nfunction createNodeValueGetter(nameOrFunction, defaultValue) {\n var getter = {};\n\n var coerceToDefault = function (v) {\n if (typeof v === 'undefined') return defaultValue;\n\n return v;\n };\n\n if (typeof defaultValue === 'function') coerceToDefault = defaultValue;\n\n var get = function (attributes) {\n return coerceToDefault(attributes[nameOrFunction]);\n };\n\n var returnDefault = function () {\n return coerceToDefault(undefined);\n };\n\n if (typeof nameOrFunction === 'string') {\n getter.fromAttributes = get;\n getter.fromGraph = function (graph, node) {\n return get(graph.getNodeAttributes(node));\n };\n getter.fromEntry = function (node, attributes) {\n return get(attributes);\n };\n } else if (typeof nameOrFunction === 'function') {\n getter.fromAttributes = function () {\n throw new Error(\n 'graphology-utils/getters/createNodeValueGetter: irrelevant usage.'\n );\n };\n getter.fromGraph = function (graph, node) {\n return coerceToDefault(\n nameOrFunction(node, graph.getNodeAttributes(node))\n );\n };\n getter.fromEntry = function (node, attributes) {\n return coerceToDefault(nameOrFunction(node, attributes));\n };\n } else {\n getter.fromAttributes = returnDefault;\n getter.fromGraph = returnDefault;\n getter.fromEntry = returnDefault;\n }\n\n return getter;\n}\n\nfunction createEdgeValueGetter(nameOrFunction, defaultValue) {\n var getter = {};\n\n var coerceToDefault = function (v) {\n if (typeof v === 'undefined') return defaultValue;\n\n return v;\n };\n\n if (typeof defaultValue === 'function') coerceToDefault = defaultValue;\n\n var get = function (attributes) {\n return coerceToDefault(attributes[nameOrFunction]);\n };\n\n var returnDefault = function () {\n return coerceToDefault(undefined);\n };\n\n if (typeof nameOrFunction === 'string') {\n getter.fromAttributes = get;\n getter.fromGraph = function (graph, edge) {\n return get(graph.getEdgeAttributes(edge));\n };\n getter.fromEntry = function (edge, attributes) {\n return get(attributes);\n };\n getter.fromPartialEntry = getter.fromEntry;\n getter.fromMinimalEntry = getter.fromEntry;\n } else if (typeof nameOrFunction === 'function') {\n getter.fromAttributes = function () {\n throw new Error(\n 'graphology-utils/getters/createEdgeValueGetter: irrelevant usage.'\n );\n };\n getter.fromGraph = function (graph, edge) {\n // TODO: we can do better, check #310\n var extremities = graph.extremities(edge);\n return coerceToDefault(\n nameOrFunction(\n edge,\n graph.getEdgeAttributes(edge),\n extremities[0],\n extremities[1],\n graph.getNodeAttributes(extremities[0]),\n graph.getNodeAttributes(extremities[1]),\n graph.isUndirected(edge)\n )\n );\n };\n getter.fromEntry = function (e, a, s, t, sa, ta, u) {\n return coerceToDefault(nameOrFunction(e, a, s, t, sa, ta, u));\n };\n getter.fromPartialEntry = function (e, a, s, t) {\n return coerceToDefault(nameOrFunction(e, a, s, t));\n };\n getter.fromMinimalEntry = function (e, a) {\n return coerceToDefault(nameOrFunction(e, a));\n };\n } else {\n getter.fromAttributes = returnDefault;\n getter.fromGraph = returnDefault;\n getter.fromEntry = returnDefault;\n getter.fromMinimalEntry = returnDefault;\n }\n\n return getter;\n}\n\nexports.createNodeValueGetter = createNodeValueGetter;\nexports.createEdgeValueGetter = createEdgeValueGetter;\nexports.createEdgeWeightGetter = function (name) {\n return createEdgeValueGetter(name, coerceWeight);\n};\n","/**\n * Graphology isGraph\n * ===================\n *\n * Very simple function aiming at ensuring the given variable is a\n * graphology instance.\n */\n\n/**\n * Checking the value is a graphology instance.\n *\n * @param {any} value - Target value.\n * @return {boolean}\n */\nmodule.exports = function isGraph(value) {\n return (\n value !== null &&\n typeof value === 'object' &&\n typeof value.addUndirectedEdgeWithKey === 'function' &&\n typeof value.dropNode === 'function' &&\n typeof value.multi === 'boolean'\n );\n};\n","!function(t,e){\"object\"==typeof exports&&\"undefined\"!=typeof module?module.exports=e():\"function\"==typeof define&&define.amd?define(e):(t=\"undefined\"!=typeof globalThis?globalThis:t||self).graphology=e()}(this,(function(){\"use strict\";function t(e){return t=\"function\"==typeof Symbol&&\"symbol\"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&\"function\"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?\"symbol\":typeof t},t(e)}function e(t,e){t.prototype=Object.create(e.prototype),t.prototype.constructor=t,r(t,e)}function n(t){return n=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(t){return t.__proto__||Object.getPrototypeOf(t)},n(t)}function r(t,e){return r=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(t,e){return t.__proto__=e,t},r(t,e)}function i(){if(\"undefined\"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if(\"function\"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(t){return!1}}function o(t,e,n){return o=i()?Reflect.construct.bind():function(t,e,n){var i=[null];i.push.apply(i,e);var o=new(Function.bind.apply(t,i));return n&&r(o,n.prototype),o},o.apply(null,arguments)}function a(t){var e=\"function\"==typeof Map?new Map:void 0;return a=function(t){if(null===t||(i=t,-1===Function.toString.call(i).indexOf(\"[native code]\")))return t;var i;if(\"function\"!=typeof t)throw new TypeError(\"Super expression must either be null or a function\");if(void 0!==e){if(e.has(t))return e.get(t);e.set(t,a)}function a(){return o(t,arguments,n(this).constructor)}return a.prototype=Object.create(t.prototype,{constructor:{value:a,enumerable:!1,writable:!0,configurable:!0}}),r(a,t)},a(t)}function c(t){if(void 0===t)throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");return t}var u=function(){for(var t=arguments[0],e=1,n=arguments.length;e<n;e++)if(arguments[e])for(var r in arguments[e])t[r]=arguments[e][r];return t};function d(t,e,n,r){var i=t._nodes.get(e),o=null;return i?o=\"mixed\"===r?i.out&&i.out[n]||i.undirected&&i.undirected[n]:\"directed\"===r?i.out&&i.out[n]:i.undirected&&i.undirected[n]:o}function s(e){return\"object\"===t(e)&&null!==e}function h(t){var e;for(e in t)return!1;return!0}function p(t,e,n){Object.defineProperty(t,e,{enumerable:!1,configurable:!1,writable:!0,value:n})}function f(t,e,n){var r={enumerable:!0,configurable:!0};\"function\"==typeof n?r.get=n:(r.value=n,r.writable=!1),Object.defineProperty(t,e,r)}function l(t){return!!s(t)&&!(t.attributes&&!Array.isArray(t.attributes))}\"function\"==typeof Object.assign&&(u=Object.assign);var g,y={exports:{}},w=\"object\"==typeof Reflect?Reflect:null,v=w&&\"function\"==typeof w.apply?w.apply:function(t,e,n){return Function.prototype.apply.call(t,e,n)};g=w&&\"function\"==typeof w.ownKeys?w.ownKeys:Object.getOwnPropertySymbols?function(t){return Object.getOwnPropertyNames(t).concat(Object.getOwnPropertySymbols(t))}:function(t){return Object.getOwnPropertyNames(t)};var b=Number.isNaN||function(t){return t!=t};function m(){m.init.call(this)}y.exports=m,y.exports.once=function(t,e){return new Promise((function(n,r){function i(n){t.removeListener(e,o),r(n)}function o(){\"function\"==typeof t.removeListener&&t.removeListener(\"error\",i),n([].slice.call(arguments))}U(t,e,o,{once:!0}),\"error\"!==e&&function(t,e,n){\"function\"==typeof t.on&&U(t,\"error\",e,n)}(t,i,{once:!0})}))},m.EventEmitter=m,m.prototype._events=void 0,m.prototype._eventsCount=0,m.prototype._maxListeners=void 0;var k=10;function _(t){if(\"function\"!=typeof t)throw new TypeError('The \"listener\" argument must be of type Function. Received type '+typeof t)}function G(t){return void 0===t._maxListeners?m.defaultMaxListeners:t._maxListeners}function x(t,e,n,r){var i,o,a,c;if(_(n),void 0===(o=t._events)?(o=t._events=Object.create(null),t._eventsCount=0):(void 0!==o.newListener&&(t.emit(\"newListener\",e,n.listener?n.listener:n),o=t._events),a=o[e]),void 0===a)a=o[e]=n,++t._eventsCount;else if(\"function\"==typeof a?a=o[e]=r?[n,a]:[a,n]:r?a.unshift(n):a.push(n),(i=G(t))>0&&a.length>i&&!a.warned){a.warned=!0;var u=new Error(\"Possible EventEmitter memory leak detected. \"+a.length+\" \"+String(e)+\" listeners added. Use emitter.setMaxListeners() to increase limit\");u.name=\"MaxListenersExceededWarning\",u.emitter=t,u.type=e,u.count=a.length,c=u,console&&console.warn&&console.warn(c)}return t}function E(){if(!this.fired)return this.target.removeListener(this.type,this.wrapFn),this.fired=!0,0===arguments.length?this.listener.call(this.target):this.listener.apply(this.target,arguments)}function A(t,e,n){var r={fired:!1,wrapFn:void 0,target:t,type:e,listener:n},i=E.bind(r);return i.listener=n,r.wrapFn=i,i}function L(t,e,n){var r=t._events;if(void 0===r)return[];var i=r[e];return void 0===i?[]:\"function\"==typeof i?n?[i.listener||i]:[i]:n?function(t){for(var e=new Array(t.length),n=0;n<e.length;++n)e[n]=t[n].listener||t[n];return e}(i):D(i,i.length)}function S(t){var e=this._events;if(void 0!==e){var n=e[t];if(\"function\"==typeof n)return 1;if(void 0!==n)return n.length}return 0}function D(t,e){for(var n=new Array(e),r=0;r<e;++r)n[r]=t[r];return n}function U(t,e,n,r){if(\"function\"==typeof t.on)r.once?t.once(e,n):t.on(e,n);else{if(\"function\"!=typeof t.addEventListener)throw new TypeError('The \"emitter\" argument must be of type EventEmitter. Received type '+typeof t);t.addEventListener(e,(function i(o){r.once&&t.removeEventListener(e,i),n(o)}))}}function N(t){if(\"function\"!=typeof t)throw new Error(\"obliterator/iterator: expecting a function!\");this.next=t}Object.defineProperty(m,\"defaultMaxListeners\",{enumerable:!0,get:function(){return k},set:function(t){if(\"number\"!=typeof t||t<0||b(t))throw new RangeError('The value of \"defaultMaxListeners\" is out of range. It must be a non-negative number. Received '+t+\".\");k=t}}),m.init=function(){void 0!==this._events&&this._events!==Object.getPrototypeOf(this)._events||(this._events=Object.create(null),this._eventsCount=0),this._maxListeners=this._maxListeners||void 0},m.prototype.setMaxListeners=function(t){if(\"number\"!=typeof t||t<0||b(t))throw new RangeError('The value of \"n\" is out of range. It must be a non-negative number. Received '+t+\".\");return this._maxListeners=t,this},m.prototype.getMaxListeners=function(){return G(this)},m.prototype.emit=function(t){for(var e=[],n=1;n<arguments.length;n++)e.push(arguments[n]);var r=\"error\"===t,i=this._events;if(void 0!==i)r=r&&void 0===i.error;else if(!r)return!1;if(r){var o;if(e.length>0&&(o=e[0]),o instanceof Error)throw o;var a=new Error(\"Unhandled error.\"+(o?\" (\"+o.message+\")\":\"\"));throw a.context=o,a}var c=i[t];if(void 0===c)return!1;if(\"function\"==typeof c)v(c,this,e);else{var u=c.length,d=D(c,u);for(n=0;n<u;++n)v(d[n],this,e)}return!0},m.prototype.addListener=function(t,e){return x(this,t,e,!1)},m.prototype.on=m.prototype.addListener,m.prototype.prependListener=function(t,e){return x(this,t,e,!0)},m.prototype.once=function(t,e){return _(e),this.on(t,A(this,t,e)),this},m.prototype.prependOnceListener=function(t,e){return _(e),this.prependListener(t,A(this,t,e)),this},m.prototype.removeListener=function(t,e){var n,r,i,o,a;if(_(e),void 0===(r=this._events))return this;if(void 0===(n=r[t]))return this;if(n===e||n.listener===e)0==--this._eventsCount?this._events=Object.create(null):(delete r[t],r.removeListener&&this.emit(\"removeListener\",t,n.listener||e));else if(\"function\"!=typeof n){for(i=-1,o=n.length-1;o>=0;o--)if(n[o]===e||n[o].listener===e){a=n[o].listener,i=o;break}if(i<0)return this;0===i?n.shift():function(t,e){for(;e+1<t.length;e++)t[e]=t[e+1];t.pop()}(n,i),1===n.length&&(r[t]=n[0]),void 0!==r.removeListener&&this.emit(\"removeListener\",t,a||e)}return this},m.prototype.off=m.prototype.removeListener,m.prototype.removeAllListeners=function(t){var e,n,r;if(void 0===(n=this._events))return this;if(void 0===n.removeListener)return 0===arguments.length?(this._events=Object.create(null),this._eventsCount=0):void 0!==n[t]&&(0==--this._eventsCount?this._events=Object.create(null):delete n[t]),this;if(0===arguments.length){var i,o=Object.keys(n);for(r=0;r<o.length;++r)\"removeListener\"!==(i=o[r])&&this.removeAllListeners(i);return this.removeAllListeners(\"removeListener\"),this._events=Object.create(null),this._eventsCount=0,this}if(\"function\"==typeof(e=n[t]))this.removeListener(t,e);else if(void 0!==e)for(r=e.length-1;r>=0;r--)this.removeListener(t,e[r]);return this},m.prototype.listeners=function(t){return L(this,t,!0)},m.prototype.rawListeners=function(t){return L(this,t,!1)},m.listenerCount=function(t,e){return\"function\"==typeof t.listenerCount?t.listenerCount(e):S.call(t,e)},m.prototype.listenerCount=S,m.prototype.eventNames=function(){return this._eventsCount>0?g(this._events):[]},\"undefined\"!=typeof Symbol&&(N.prototype[Symbol.iterator]=function(){return this}),N.of=function(){var t=arguments,e=t.length,n=0;return new N((function(){return n>=e?{done:!0}:{done:!1,value:t[n++]}}))},N.empty=function(){return new N((function(){return{done:!0}}))},N.fromSequence=function(t){var e=0,n=t.length;return new N((function(){return e>=n?{done:!0}:{done:!1,value:t[e++]}}))},N.is=function(t){return t instanceof N||\"object\"==typeof t&&null!==t&&\"function\"==typeof t.next};var O=N,j={};j.ARRAY_BUFFER_SUPPORT=\"undefined\"!=typeof ArrayBuffer,j.SYMBOL_SUPPORT=\"undefined\"!=typeof Symbol;var C=O,M=j,z=M.ARRAY_BUFFER_SUPPORT,W=M.SYMBOL_SUPPORT;var P=function(t){var e=function(t){return\"string\"==typeof t||Array.isArray(t)||z&&ArrayBuffer.isView(t)?C.fromSequence(t):\"object\"!=typeof t||null===t?null:W&&\"function\"==typeof t[Symbol.iterator]?t[Symbol.iterator]():\"function\"==typeof t.next?t:null}(t);if(!e)throw new Error(\"obliterator: target is not iterable nor a valid iterator.\");return e},R=P,K=function(t,e){for(var n,r=arguments.length>1?e:1/0,i=r!==1/0?new Array(r):[],o=0,a=R(t);;){if(o===r)return i;if((n=a.next()).done)return o!==e&&(i.length=o),i;i[o++]=n.value}},T=function(t){function n(e){var n;return(n=t.call(this)||this).name=\"GraphError\",n.message=e,n}return e(n,t),n}(a(Error)),B=function(t){function n(e){var r;return(r=t.call(this,e)||this).name=\"InvalidArgumentsGraphError\",\"function\"==typeof Error.captureStackTrace&&Error.captureStackTrace(c(r),n.prototype.constructor),r}return e(n,t),n}(T),F=function(t){function n(e){var r;return(r=t.call(this,e)||this).name=\"NotFoundGraphError\",\"function\"==typeof Error.captureStackTrace&&Error.captureStackTrace(c(r),n.prototype.constructor),r}return e(n,t),n}(T),I=function(t){function n(e){var r;return(r=t.call(this,e)||this).name=\"UsageGraphError\",\"function\"==typeof Error.captureStackTrace&&Error.captureStackTrace(c(r),n.prototype.constructor),r}return e(n,t),n}(T);function Y(t,e){this.key=t,this.attributes=e,this.clear()}function q(t,e){this.key=t,this.attributes=e,this.clear()}function J(t,e){this.key=t,this.attributes=e,this.clear()}function V(t,e,n,r,i){this.key=e,this.attributes=i,this.undirected=t,this.source=n,this.target=r}Y.prototype.clear=function(){this.inDegree=0,this.outDegree=0,this.undirectedDegree=0,this.undirectedLoops=0,this.directedLoops=0,this.in={},this.out={},this.undirected={}},q.prototype.clear=function(){this.inDegree=0,this.outDegree=0,this.directedLoops=0,this.in={},this.out={}},J.prototype.clear=function(){this.undirectedDegree=0,this.undirectedLoops=0,this.undirected={}},V.prototype.attach=function(){var t=\"out\",e=\"in\";this.undirected&&(t=e=\"undirected\");var n=this.source.key,r=this.target.key;this.source[t][r]=this,this.undirected&&n===r||(this.target[e][n]=this)},V.prototype.attachMulti=function(){var t=\"out\",e=\"in\",n=this.source.key,r=this.target.key;this.undirected&&(t=e=\"undirected\");var i=this.source[t],o=i[r];if(void 0===o)return i[r]=this,void(this.undirected&&n===r||(this.target[e][n]=this));o.previous=this,this.next=o,i[r]=this,this.target[e][n]=this},V.prototype.detach=function(){var t=this.source.key,e=this.target.key,n=\"out\",r=\"in\";this.undirected&&(n=r=\"undirected\"),delete this.source[n][e],delete this.target[r][t]},V.prototype.detachMulti=function(){var t=this.source.key,e=this.target.key,n=\"out\",r=\"in\";this.undirected&&(n=r=\"undirected\"),void 0===this.previous?void 0===this.next?(delete this.source[n][e],delete this.target[r][t]):(this.next.previous=void 0,this.source[n][e]=this.next,this.target[r][t]=this.next):(this.previous.next=this.next,void 0!==this.next&&(this.next.previous=this.previous))};function H(t,e,n,r,i,o,a){var c,u,d,s;if(r=\"\"+r,0===n){if(!(c=t._nodes.get(r)))throw new F(\"Graph.\".concat(e,': could not find the \"').concat(r,'\" node in the graph.'));d=i,s=o}else if(3===n){if(i=\"\"+i,!(u=t._edges.get(i)))throw new F(\"Graph.\".concat(e,': could not find the \"').concat(i,'\" edge in the graph.'));var h=u.source.key,p=u.target.key;if(r===h)c=u.target;else{if(r!==p)throw new F(\"Graph.\".concat(e,': the \"').concat(r,'\" node is not attached to the \"').concat(i,'\" edge (').concat(h,\", \").concat(p,\").\"));c=u.source}d=o,s=a}else{if(!(u=t._edges.get(r)))throw new F(\"Graph.\".concat(e,': could not find the \"').concat(r,'\" edge in the graph.'));c=1===n?u.source:u.target,d=i,s=o}return[c,d,s]}var Q=[{name:function(t){return\"get\".concat(t,\"Attribute\")},attacher:function(t,e,n){t.prototype[e]=function(t,r,i){var o=H(this,e,n,t,r,i),a=o[0],c=o[1];return a.attributes[c]}}},{name:function(t){return\"get\".concat(t,\"Attributes\")},attacher:function(t,e,n){t.prototype[e]=function(t,r){return H(this,e,n,t,r)[0].attributes}}},{name:function(t){return\"has\".concat(t,\"Attribute\")},attacher:function(t,e,n){t.prototype[e]=function(t,r,i){var o=H(this,e,n,t,r,i),a=o[0],c=o[1];return a.attributes.hasOwnProperty(c)}}},{name:function(t){return\"set\".concat(t,\"Attribute\")},attacher:function(t,e,n){t.prototype[e]=function(t,r,i,o){var a=H(this,e,n,t,r,i,o),c=a[0],u=a[1],d=a[2];return c.attributes[u]=d,this.emit(\"nodeAttributesUpdated\",{key:c.key,type:\"set\",attributes:c.attributes,name:u}),this}}},{name:function(t){return\"update\".concat(t,\"Attribute\")},attacher:function(t,e,n){t.prototype[e]=function(t,r,i,o){var a=H(this,e,n,t,r,i,o),c=a[0],u=a[1],d=a[2];if(\"function\"!=typeof d)throw new B(\"Graph.\".concat(e,\": updater should be a function.\"));var s=c.attributes,h=d(s[u]);return s[u]=h,this.emit(\"nodeAttributesUpdated\",{key:c.key,type:\"set\",attributes:c.attributes,name:u}),this}}},{name:function(t){return\"remove\".concat(t,\"Attribute\")},attacher:function(t,e,n){t.prototype[e]=function(t,r,i){var o=H(this,e,n,t,r,i),a=o[0],c=o[1];return delete a.attributes[c],this.emit(\"nodeAttributesUpdated\",{key:a.key,type:\"remove\",attributes:a.attributes,name:c}),this}}},{name:function(t){return\"replace\".concat(t,\"Attributes\")},attacher:function(t,e,n){t.prototype[e]=function(t,r,i){var o=H(this,e,n,t,r,i),a=o[0],c=o[1];if(!s(c))throw new B(\"Graph.\".concat(e,\": provided attributes are not a plain object.\"));return a.attributes=c,this.emit(\"nodeAttributesUpdated\",{key:a.key,type:\"replace\",attributes:a.attributes}),this}}},{name:function(t){return\"merge\".concat(t,\"Attributes\")},attacher:function(t,e,n){t.prototype[e]=function(t,r,i){var o=H(this,e,n,t,r,i),a=o[0],c=o[1];if(!s(c))throw new B(\"Graph.\".concat(e,\": provided attributes are not a plain object.\"));return u(a.attributes,c),this.emit(\"nodeAttributesUpdated\",{key:a.key,type:\"merge\",attributes:a.attributes,data:c}),this}}},{name:function(t){return\"update\".concat(t,\"Attributes\")},attacher:function(t,e,n){t.prototype[e]=function(t,r,i){var o=H(this,e,n,t,r,i),a=o[0],c=o[1];if(\"function\"!=typeof c)throw new B(\"Graph.\".concat(e,\": provided updater is not a function.\"));return a.attributes=c(a.attributes),this.emit(\"nodeAttributesUpdated\",{key:a.key,type:\"update\",attributes:a.attributes}),this}}}];var X=[{name:function(t){return\"get\".concat(t,\"Attribute\")},attacher:function(t,e,n){t.prototype[e]=function(t,r){var i;if(\"mixed\"!==this.type&&\"mixed\"!==n&&n!==this.type)throw new I(\"Graph.\".concat(e,\": cannot find this type of edges in your \").concat(this.type,\" graph.\"));if(arguments.length>2){if(this.multi)throw new I(\"Graph.\".concat(e,\": cannot use a {source,target} combo when asking about an edge's attributes in a MultiGraph since we cannot infer the one you want information about.\"));var o=\"\"+t,a=\"\"+r;if(r=arguments[2],!(i=d(this,o,a,n)))throw new F(\"Graph.\".concat(e,': could not find an edge for the given path (\"').concat(o,'\" - \"').concat(a,'\").'))}else{if(\"mixed\"!==n)throw new I(\"Graph.\".concat(e,\": calling this method with only a key (vs. a source and target) does not make sense since an edge with this key could have the other type.\"));if(t=\"\"+t,!(i=this._edges.get(t)))throw new F(\"Graph.\".concat(e,': could not find the \"').concat(t,'\" edge in the graph.'))}return i.attributes[r]}}},{name:function(t){return\"get\".concat(t,\"Attributes\")},attacher:function(t,e,n){t.prototype[e]=function(t){var r;if(\"mixed\"!==this.type&&\"mixed\"!==n&&n!==this.type)throw new I(\"Graph.\".concat(e,\": cannot find this type of edges in your \").concat(this.type,\" graph.\"));if(arguments.length>1){if(this.multi)throw new I(\"Graph.\".concat(e,\": cannot use a {source,target} combo when asking about an edge's attributes in a MultiGraph since we cannot infer the one you want information about.\"));var i=\"\"+t,o=\"\"+arguments[1];if(!(r=d(this,i,o,n)))throw new F(\"Graph.\".concat(e,': could not find an edge for the given path (\"').concat(i,'\" - \"').concat(o,'\").'))}else{if(\"mixed\"!==n)throw new I(\"Graph.\".concat(e,\": calling this method with only a key (vs. a source and target) does not make sense since an edge with this key could have the other type.\"));if(t=\"\"+t,!(r=this._edges.get(t)))throw new F(\"Graph.\".concat(e,': could not find the \"').concat(t,'\" edge in the graph.'))}return r.attributes}}},{name:function(t){return\"has\".concat(t,\"Attribute\")},attacher:function(t,e,n){t.prototype[e]=function(t,r){var i;if(\"mixed\"!==this.type&&\"mixed\"!==n&&n!==this.type)throw new I(\"Graph.\".concat(e,\": cannot find this type of edges in your \").concat(this.type,\" graph.\"));if(arguments.length>2){if(this.multi)throw new I(\"Graph.\".concat(e,\": cannot use a {source,target} combo when asking about an edge's attributes in a MultiGraph since we cannot infer the one you want information about.\"));var o=\"\"+t,a=\"\"+r;if(r=arguments[2],!(i=d(this,o,a,n)))throw new F(\"Graph.\".concat(e,': could not find an edge for the given path (\"').concat(o,'\" - \"').concat(a,'\").'))}else{if(\"mixed\"!==n)throw new I(\"Graph.\".concat(e,\": calling this method with only a key (vs. a source and target) does not make sense since an edge with this key could have the other type.\"));if(t=\"\"+t,!(i=this._edges.get(t)))throw new F(\"Graph.\".concat(e,': could not find the \"').concat(t,'\" edge in the graph.'))}return i.attributes.hasOwnProperty(r)}}},{name:function(t){return\"set\".concat(t,\"Attribute\")},attacher:function(t,e,n){t.prototype[e]=function(t,r,i){var o;if(\"mixed\"!==this.type&&\"mixed\"!==n&&n!==this.type)throw new I(\"Graph.\".concat(e,\": cannot find this type of edges in your \").concat(this.type,\" graph.\"));if(arguments.length>3){if(this.multi)throw new I(\"Graph.\".concat(e,\": cannot use a {source,target} combo when asking about an edge's attributes in a MultiGraph since we cannot infer the one you want information about.\"));var a=\"\"+t,c=\"\"+r;if(r=arguments[2],i=arguments[3],!(o=d(this,a,c,n)))throw new F(\"Graph.\".concat(e,': could not find an edge for the given path (\"').concat(a,'\" - \"').concat(c,'\").'))}else{if(\"mixed\"!==n)throw new I(\"Graph.\".concat(e,\": calling this method with only a key (vs. a source and target) does not make sense since an edge with this key could have the other type.\"));if(t=\"\"+t,!(o=this._edges.get(t)))throw new F(\"Graph.\".concat(e,': could not find the \"').concat(t,'\" edge in the graph.'))}return o.attributes[r]=i,this.emit(\"edgeAttributesUpdated\",{key:o.key,type:\"set\",attributes:o.attributes,name:r}),this}}},{name:function(t){return\"update\".concat(t,\"Attribute\")},attacher:function(t,e,n){t.prototype[e]=function(t,r,i){var o;if(\"mixed\"!==this.type&&\"mixed\"!==n&&n!==this.type)throw new I(\"Graph.\".concat(e,\": cannot find this type of edges in your \").concat(this.type,\" graph.\"));if(arguments.length>3){if(this.multi)throw new I(\"Graph.\".concat(e,\": cannot use a {source,target} combo when asking about an edge's attributes in a MultiGraph since we cannot infer the one you want information about.\"));var a=\"\"+t,c=\"\"+r;if(r=arguments[2],i=arguments[3],!(o=d(this,a,c,n)))throw new F(\"Graph.\".concat(e,': could not find an edge for the given path (\"').concat(a,'\" - \"').concat(c,'\").'))}else{if(\"mixed\"!==n)throw new I(\"Graph.\".concat(e,\": calling this method with only a key (vs. a source and target) does not make sense since an edge with this key could have the other type.\"));if(t=\"\"+t,!(o=this._edges.get(t)))throw new F(\"Graph.\".concat(e,': could not find the \"').concat(t,'\" edge in the graph.'))}if(\"function\"!=typeof i)throw new B(\"Graph.\".concat(e,\": updater should be a function.\"));return o.attributes[r]=i(o.attributes[r]),this.emit(\"edgeAttributesUpdated\",{key:o.key,type:\"set\",attributes:o.attributes,name:r}),this}}},{name:function(t){return\"remove\".concat(t,\"Attribute\")},attacher:function(t,e,n){t.prototype[e]=function(t,r){var i;if(\"mixed\"!==this.type&&\"mixed\"!==n&&n!==this.type)throw new I(\"Graph.\".concat(e,\": cannot find this type of edges in your \").concat(this.type,\" graph.\"));if(arguments.length>2){if(this.multi)throw new I(\"Graph.\".concat(e,\": cannot use a {source,target} combo when asking about an edge's attributes in a MultiGraph since we cannot infer the one you want information about.\"));var o=\"\"+t,a=\"\"+r;if(r=arguments[2],!(i=d(this,o,a,n)))throw new F(\"Graph.\".concat(e,': could not find an edge for the given path (\"').concat(o,'\" - \"').concat(a,'\").'))}else{if(\"mixed\"!==n)throw new I(\"Graph.\".concat(e,\": calling this method with only a key (vs. a source and target) does not make sense since an edge with this key could have the other type.\"));if(t=\"\"+t,!(i=this._edges.get(t)))throw new F(\"Graph.\".concat(e,': could not find the \"').concat(t,'\" edge in the graph.'))}return delete i.attributes[r],this.emit(\"edgeAttributesUpdated\",{key:i.key,type:\"remove\",attributes:i.attributes,name:r}),this}}},{name:function(t){return\"replace\".concat(t,\"Attributes\")},attacher:function(t,e,n){t.prototype[e]=function(t,r){var i;if(\"mixed\"!==this.type&&\"mixed\"!==n&&n!==this.type)throw new I(\"Graph.\".concat(e,\": cannot find this type of edges in your \").concat(this.type,\" graph.\"));if(arguments.length>2){if(this.multi)throw new I(\"Graph.\".concat(e,\": cannot use a {source,target} combo when asking about an edge's attributes in a MultiGraph since we cannot infer the one you want information about.\"));var o=\"\"+t,a=\"\"+r;if(r=arguments[2],!(i=d(this,o,a,n)))throw new F(\"Graph.\".concat(e,': could not find an edge for the given path (\"').concat(o,'\" - \"').concat(a,'\").'))}else{if(\"mixed\"!==n)throw new I(\"Graph.\".concat(e,\": calling this method with only a key (vs. a source and target) does not make sense since an edge with this key could have the other type.\"));if(t=\"\"+t,!(i=this._edges.get(t)))throw new F(\"Graph.\".concat(e,': could not find the \"').concat(t,'\" edge in the graph.'))}if(!s(r))throw new B(\"Graph.\".concat(e,\": provided attributes are not a plain object.\"));return i.attributes=r,this.emit(\"edgeAttributesUpdated\",{key:i.key,type:\"replace\",attributes:i.attributes}),this}}},{name:function(t){return\"merge\".concat(t,\"Attributes\")},attacher:function(t,e,n){t.prototype[e]=function(t,r){var i;if(\"mixed\"!==this.type&&\"mixed\"!==n&&n!==this.type)throw new I(\"Graph.\".concat(e,\": cannot find this type of edges in your \").concat(this.type,\" graph.\"));if(arguments.length>2){if(this.multi)throw new I(\"Graph.\".concat(e,\": cannot use a {source,target} combo when asking about an edge's attributes in a MultiGraph since we cannot infer the one you want information about.\"));var o=\"\"+t,a=\"\"+r;if(r=arguments[2],!(i=d(this,o,a,n)))throw new F(\"Graph.\".concat(e,': could not find an edge for the given path (\"').concat(o,'\" - \"').concat(a,'\").'))}else{if(\"mixed\"!==n)throw new I(\"Graph.\".concat(e,\": calling this method with only a key (vs. a source and target) does not make sense since an edge with this key could have the other type.\"));if(t=\"\"+t,!(i=this._edges.get(t)))throw new F(\"Graph.\".concat(e,': could not find the \"').concat(t,'\" edge in the graph.'))}if(!s(r))throw new B(\"Graph.\".concat(e,\": provided attributes are not a plain object.\"));return u(i.attributes,r),this.emit(\"edgeAttributesUpdated\",{key:i.key,type:\"merge\",attributes:i.attributes,data:r}),this}}},{name:function(t){return\"update\".concat(t,\"Attributes\")},attacher:function(t,e,n){t.prototype[e]=function(t,r){var i;if(\"mixed\"!==this.type&&\"mixed\"!==n&&n!==this.type)throw new I(\"Graph.\".concat(e,\": cannot find this type of edges in your \").concat(this.type,\" graph.\"));if(arguments.length>2){if(this.multi)throw new I(\"Graph.\".concat(e,\": cannot use a {source,target} combo when asking about an edge's attributes in a MultiGraph since we cannot infer the one you want information about.\"));var o=\"\"+t,a=\"\"+r;if(r=arguments[2],!(i=d(this,o,a,n)))throw new F(\"Graph.\".concat(e,': could not find an edge for the given path (\"').concat(o,'\" - \"').concat(a,'\").'))}else{if(\"mixed\"!==n)throw new I(\"Graph.\".concat(e,\": calling this method with only a key (vs. a source and target) does not make sense since an edge with this key could have the other type.\"));if(t=\"\"+t,!(i=this._edges.get(t)))throw new F(\"Graph.\".concat(e,': could not find the \"').concat(t,'\" edge in the graph.'))}if(\"function\"!=typeof r)throw new B(\"Graph.\".concat(e,\": provided updater is not a function.\"));return i.attributes=r(i.attributes),this.emit(\"edgeAttributesUpdated\",{key:i.key,type:\"update\",attributes:i.attributes}),this}}}];var Z=O,$=P,tt=function(){var t=arguments,e=null,n=-1;return new Z((function(){for(var r=null;;){if(null===e){if(++n>=t.length)return{done:!0};e=$(t[n])}if(!0!==(r=e.next()).done)break;e=null}return r}))},et=[{name:\"edges\",type:\"mixed\"},{name:\"inEdges\",type:\"directed\",direction:\"in\"},{name:\"outEdges\",type:\"directed\",direction:\"out\"},{name:\"inboundEdges\",type:\"mixed\",direction:\"in\"},{name:\"outboundEdges\",type:\"mixed\",direction:\"out\"},{name:\"directedEdges\",type:\"directed\"},{name:\"undirectedEdges\",type:\"undirected\"}];function nt(t,e,n,r){var i=!1;for(var o in e)if(o!==r){var a=e[o];if(i=n(a.key,a.attributes,a.source.key,a.target.key,a.source.attributes,a.target.attributes,a.undirected),t&&i)return a.key}}function rt(t,e,n,r){var i,o,a,c=!1;for(var u in e)if(u!==r){i=e[u];do{if(o=i.source,a=i.target,c=n(i.key,i.attributes,o.key,a.key,o.attributes,a.attributes,i.undirected),t&&c)return i.key;i=i.next}while(void 0!==i)}}function it(t,e){var n,r=Object.keys(t),i=r.length,o=0;return new O((function(){do{if(n)n=n.next;else{if(o>=i)return{done:!0};var a=r[o++];if(a===e){n=void 0;continue}n=t[a]}}while(!n);return{done:!1,value:{edge:n.key,attributes:n.attributes,source:n.source.key,target:n.target.key,sourceAttributes:n.source.attributes,targetAttributes:n.target.attributes,undirected:n.undirected}}}))}function ot(t,e,n,r){var i=e[n];if(i){var o=i.source,a=i.target;return r(i.key,i.attributes,o.key,a.key,o.attributes,a.attributes,i.undirected)&&t?i.key:void 0}}function at(t,e,n,r){var i=e[n];if(i){var o=!1;do{if(o=r(i.key,i.attributes,i.source.key,i.target.key,i.source.attributes,i.target.attributes,i.undirected),t&&o)return i.key;i=i.next}while(void 0!==i)}}function ct(t,e){var n=t[e];return void 0!==n.next?new O((function(){if(!n)return{done:!0};var t={edge:n.key,attributes:n.attributes,source:n.source.key,target:n.target.key,sourceAttributes:n.source.attributes,targetAttributes:n.target.attributes,undirected:n.undirected};return n=n.next,{done:!1,value:t}})):O.of({edge:n.key,attributes:n.attributes,source:n.source.key,target:n.target.key,sourceAttributes:n.source.attributes,targetAttributes:n.target.attributes,undirected:n.undirected})}function ut(t,e){if(0===t.size)return[];if(\"mixed\"===e||e===t.type)return\"function\"==typeof Array.from?Array.from(t._edges.keys()):K(t._edges.keys(),t._edges.size);for(var n,r,i=\"undirected\"===e?t.undirectedSize:t.directedSize,o=new Array(i),a=\"undirected\"===e,c=t._edges.values(),u=0;!0!==(n=c.next()).done;)(r=n.value).undirected===a&&(o[u++]=r.key);return o}function dt(t,e,n,r){if(0!==e.size)for(var i,o,a=\"mixed\"!==n&&n!==e.type,c=\"undirected\"===n,u=!1,d=e._edges.values();!0!==(i=d.next()).done;)if(o=i.value,!a||o.undirected===c){var s=o,h=s.key,p=s.attributes,f=s.source,l=s.target;if(u=r(h,p,f.key,l.key,f.attributes,l.attributes,o.undirected),t&&u)return h}}function st(t,e){if(0===t.size)return O.empty();var n=\"mixed\"!==e&&e!==t.type,r=\"undirected\"===e,i=t._edges.values();return new O((function(){for(var t,e;;){if((t=i.next()).done)return t;if(e=t.value,!n||e.undirected===r)break}return{value:{edge:e.key,attributes:e.attributes,source:e.source.key,target:e.target.key,sourceAttributes:e.source.attributes,targetAttributes:e.target.attributes,undirected:e.undirected},done:!1}}))}function ht(t,e,n,r,i,o){var a,c=e?rt:nt;if(\"undirected\"!==n){if(\"out\"!==r&&(a=c(t,i.in,o),t&&a))return a;if(\"in\"!==r&&(a=c(t,i.out,o,r?void 0:i.key),t&&a))return a}if(\"directed\"!==n&&(a=c(t,i.undirected,o),t&&a))return a}function pt(t,e,n,r){var i=[];return ht(!1,t,e,n,r,(function(t){i.push(t)})),i}function ft(t,e,n){var r=O.empty();return\"undirected\"!==t&&(\"out\"!==e&&void 0!==n.in&&(r=tt(r,it(n.in))),\"in\"!==e&&void 0!==n.out&&(r=tt(r,it(n.out,e?void 0:n.key)))),\"directed\"!==t&&void 0!==n.undirected&&(r=tt(r,it(n.undirected))),r}function lt(t,e,n,r,i,o,a){var c,u=n?at:ot;if(\"undirected\"!==e){if(void 0!==i.in&&\"out\"!==r&&(c=u(t,i.in,o,a),t&&c))return c;if(void 0!==i.out&&\"in\"!==r&&(r||i.key!==o)&&(c=u(t,i.out,o,a),t&&c))return c}if(\"directed\"!==e&&void 0!==i.undirected&&(c=u(t,i.undirected,o,a),t&&c))return c}function gt(t,e,n,r,i){var o=[];return lt(!1,t,e,n,r,i,(function(t){o.push(t)})),o}function yt(t,e,n,r){var i=O.empty();return\"undirected\"!==t&&(void 0!==n.in&&\"out\"!==e&&r in n.in&&(i=tt(i,ct(n.in,r))),void 0!==n.out&&\"in\"!==e&&r in n.out&&(e||n.key!==r)&&(i=tt(i,ct(n.out,r)))),\"directed\"!==t&&void 0!==n.undirected&&r in n.undirected&&(i=tt(i,ct(n.undirected,r))),i}var wt=[{name:\"neighbors\",type:\"mixed\"},{name:\"inNeighbors\",type:\"directed\",direction:\"in\"},{name:\"outNeighbors\",type:\"directed\",direction:\"out\"},{name:\"inboundNeighbors\",type:\"mixed\",direction:\"in\"},{name:\"outboundNeighbors\",type:\"mixed\",direction:\"out\"},{name:\"directedNeighbors\",type:\"directed\"},{name:\"undirectedNeighbors\",type:\"undirected\"}];function vt(){this.A=null,this.B=null}function bt(t,e,n,r,i){for(var o in r){var a=r[o],c=a.source,u=a.target,d=c===n?u:c;if(!e||!e.has(d.key)){var s=i(d.key,d.attributes);if(t&&s)return d.key}}}function mt(t,e,n,r,i){if(\"mixed\"!==e){if(\"undirected\"===e)return bt(t,null,r,r.undirected,i);if(\"string\"==typeof n)return bt(t,null,r,r[n],i)}var o,a=new vt;if(\"undirected\"!==e){if(\"out\"!==n){if(o=bt(t,null,r,r.in,i),t&&o)return o;a.wrap(r.in)}if(\"in\"!==n){if(o=bt(t,a,r,r.out,i),t&&o)return o;a.wrap(r.out)}}if(\"directed\"!==e&&(o=bt(t,a,r,r.undirected,i),t&&o))return o}function kt(t,e,n){var r=Object.keys(n),i=r.length,o=0;return new O((function(){var a=null;do{if(o>=i)return t&&t.wrap(n),{done:!0};var c=n[r[o++]],u=c.source,d=c.target;a=u===e?d:u,t&&t.has(a.key)&&(a=null)}while(null===a);return{done:!1,value:{neighbor:a.key,attributes:a.attributes}}}))}function _t(t,e){var n=e.name,r=e.type,i=e.direction;t.prototype[n]=function(t){if(\"mixed\"!==r&&\"mixed\"!==this.type&&r!==this.type)return[];t=\"\"+t;var e=this._nodes.get(t);if(void 0===e)throw new F(\"Graph.\".concat(n,': could not find the \"').concat(t,'\" node in the graph.'));return function(t,e,n){if(\"mixed\"!==t){if(\"undirected\"===t)return Object.keys(n.undirected);if(\"string\"==typeof e)return Object.keys(n[e])}var r=[];return mt(!1,t,e,n,(function(t){r.push(t)})),r}(\"mixed\"===r?this.type:r,i,e)}}function Gt(t,e){var n=e.name,r=e.type,i=e.direction,o=n.slice(0,-1)+\"Entries\";t.prototype[o]=function(t){if(\"mixed\"!==r&&\"mixed\"!==this.type&&r!==this.type)return O.empty();t=\"\"+t;var e=this._nodes.get(t);if(void 0===e)throw new F(\"Graph.\".concat(o,': could not find the \"').concat(t,'\" node in the graph.'));return function(t,e,n){if(\"mixed\"!==t){if(\"undirected\"===t)return kt(null,n,n.undirected);if(\"string\"==typeof e)return kt(null,n,n[e])}var r=O.empty(),i=new vt;return\"undirected\"!==t&&(\"out\"!==e&&(r=tt(r,kt(i,n,n.in))),\"in\"!==e&&(r=tt(r,kt(i,n,n.out)))),\"directed\"!==t&&(r=tt(r,kt(i,n,n.undirected))),r}(\"mixed\"===r?this.type:r,i,e)}}function xt(t,e,n,r,i){for(var o,a,c,u,d,s,h,p=r._nodes.values(),f=r.type;!0!==(o=p.next()).done;){var l=!1;if(a=o.value,\"undirected\"!==f)for(c in u=a.out){d=u[c];do{if(s=d.target,l=!0,h=i(a.key,s.key,a.attributes,s.attributes,d.key,d.attributes,d.undirected),t&&h)return d;d=d.next}while(d)}if(\"directed\"!==f)for(c in u=a.undirected)if(!(e&&a.key>c)){d=u[c];do{if((s=d.target).key!==c&&(s=d.source),l=!0,h=i(a.key,s.key,a.attributes,s.attributes,d.key,d.attributes,d.undirected),t&&h)return d;d=d.next}while(d)}if(n&&!l&&(h=i(a.key,null,a.attributes,null,null,null,null),t&&h))return null}}function Et(t){if(!s(t))throw new B('Graph.import: invalid serialized node. A serialized node should be a plain object with at least a \"key\" property.');if(!(\"key\"in t))throw new B(\"Graph.import: serialized node is missing its key.\");if(\"attributes\"in t&&(!s(t.attributes)||null===t.attributes))throw new B(\"Graph.import: invalid attributes. Attributes should be a plain object, null or omitted.\")}function At(t){if(!s(t))throw new B('Graph.import: invalid serialized edge. A serialized edge should be a plain object with at least a \"source\" & \"target\" property.');if(!(\"source\"in t))throw new B(\"Graph.import: serialized edge is missing its source.\");if(!(\"target\"in t))throw new B(\"Graph.import: serialized edge is missing its target.\");if(\"attributes\"in t&&(!s(t.attributes)||null===t.attributes))throw new B(\"Graph.import: invalid attributes. Attributes should be a plain object, null or omitted.\");if(\"undirected\"in t&&\"boolean\"!=typeof t.undirected)throw new B(\"Graph.import: invalid undirectedness information. Undirected should be boolean or omitted.\")}vt.prototype.wrap=function(t){null===this.A?this.A=t:null===this.B&&(this.B=t)},vt.prototype.has=function(t){return null!==this.A&&t in this.A||null!==this.B&&t in this.B};var Lt,St=(Lt=255&Math.floor(256*Math.random()),function(){return Lt++}),Dt=new Set([\"directed\",\"undirected\",\"mixed\"]),Ut=new Set([\"domain\",\"_events\",\"_eventsCount\",\"_maxListeners\"]),Nt={allowSelfLoops:!0,multi:!1,type:\"mixed\"};function Ot(t,e,n){var r=new t.NodeDataClass(e,n);return t._nodes.set(e,r),t.emit(\"nodeAdded\",{key:e,attributes:n}),r}function jt(t,e,n,r,i,o,a,c){if(!r&&\"undirected\"===t.type)throw new I(\"Graph.\".concat(e,\": you cannot add a directed edge to an undirected graph. Use the #.addEdge or #.addUndirectedEdge instead.\"));if(r&&\"directed\"===t.type)throw new I(\"Graph.\".concat(e,\": you cannot add an undirected edge to a directed graph. Use the #.addEdge or #.addDirectedEdge instead.\"));if(c&&!s(c))throw new B(\"Graph.\".concat(e,': invalid attributes. Expecting an object but got \"').concat(c,'\"'));if(o=\"\"+o,a=\"\"+a,c=c||{},!t.allowSelfLoops&&o===a)throw new I(\"Graph.\".concat(e,': source & target are the same (\"').concat(o,\"\\\"), thus creating a loop explicitly forbidden by this graph 'allowSelfLoops' option set to false.\"));var u=t._nodes.get(o),d=t._nodes.get(a);if(!u)throw new F(\"Graph.\".concat(e,': source node \"').concat(o,'\" not found.'));if(!d)throw new F(\"Graph.\".concat(e,': target node \"').concat(a,'\" not found.'));var h={key:null,undirected:r,source:o,target:a,attributes:c};if(n)i=t._edgeKeyGenerator();else if(i=\"\"+i,t._edges.has(i))throw new I(\"Graph.\".concat(e,': the \"').concat(i,'\" edge already exists in the graph.'));if(!t.multi&&(r?void 0!==u.undirected[a]:void 0!==u.out[a]))throw new I(\"Graph.\".concat(e,': an edge linking \"').concat(o,'\" to \"').concat(a,\"\\\" already exists. If you really want to add multiple edges linking those nodes, you should create a multi graph by using the 'multi' option.\"));var p=new V(r,i,u,d,c);t._edges.set(i,p);var f=o===a;return r?(u.undirectedDegree++,d.undirectedDegree++,f&&(u.undirectedLoops++,t._undirectedSelfLoopCount++)):(u.outDegree++,d.inDegree++,f&&(u.directedLoops++,t._directedSelfLoopCount++)),t.multi?p.attachMulti():p.attach(),r?t._undirectedSize++:t._directedSize++,h.key=i,t.emit(\"edgeAdded\",h),i}function Ct(t,e,n,r,i,o,a,c,d){if(!r&&\"undirected\"===t.type)throw new I(\"Graph.\".concat(e,\": you cannot merge/update a directed edge to an undirected graph. Use the #.mergeEdge/#.updateEdge or #.addUndirectedEdge instead.\"));if(r&&\"directed\"===t.type)throw new I(\"Graph.\".concat(e,\": you cannot merge/update an undirected edge to a directed graph. Use the #.mergeEdge/#.updateEdge or #.addDirectedEdge instead.\"));if(c)if(d){if(\"function\"!=typeof c)throw new B(\"Graph.\".concat(e,': invalid updater function. Expecting a function but got \"').concat(c,'\"'))}else if(!s(c))throw new B(\"Graph.\".concat(e,': invalid attributes. Expecting an object but got \"').concat(c,'\"'));var h;if(o=\"\"+o,a=\"\"+a,d&&(h=c,c=void 0),!t.allowSelfLoops&&o===a)throw new I(\"Graph.\".concat(e,': source & target are the same (\"').concat(o,\"\\\"), thus creating a loop explicitly forbidden by this graph 'allowSelfLoops' option set to false.\"));var p,f,l=t._nodes.get(o),g=t._nodes.get(a);if(!n&&(p=t._edges.get(i))){if(!(p.source.key===o&&p.target.key===a||r&&p.source.key===a&&p.target.key===o))throw new I(\"Graph.\".concat(e,': inconsistency detected when attempting to merge the \"').concat(i,'\" edge with \"').concat(o,'\" source & \"').concat(a,'\" target vs. (\"').concat(p.source.key,'\", \"').concat(p.target.key,'\").'));f=p}if(f||t.multi||!l||(f=r?l.undirected[a]:l.out[a]),f){var y=[f.key,!1,!1,!1];if(d?!h:!c)return y;if(d){var w=f.attributes;f.attributes=h(w),t.emit(\"edgeAttributesUpdated\",{type:\"replace\",key:f.key,attributes:f.attributes})}else u(f.attributes,c),t.emit(\"edgeAttributesUpdated\",{type:\"merge\",key:f.key,attributes:f.attributes,data:c});return y}c=c||{},d&&h&&(c=h(c));var v={key:null,undirected:r,source:o,target:a,attributes:c};if(n)i=t._edgeKeyGenerator();else if(i=\"\"+i,t._edges.has(i))throw new I(\"Graph.\".concat(e,': the \"').concat(i,'\" edge already exists in the graph.'));var b=!1,m=!1;l||(l=Ot(t,o,{}),b=!0,o===a&&(g=l,m=!0)),g||(g=Ot(t,a,{}),m=!0),p=new V(r,i,l,g,c),t._edges.set(i,p);var k=o===a;return r?(l.undirectedDegree++,g.undirectedDegree++,k&&(l.undirectedLoops++,t._undirectedSelfLoopCount++)):(l.outDegree++,g.inDegree++,k&&(l.directedLoops++,t._directedSelfLoopCount++)),t.multi?p.attachMulti():p.attach(),r?t._undirectedSize++:t._directedSize++,v.key=i,t.emit(\"edgeAdded\",v),[i,!0,b,m]}function Mt(t,e){t._edges.delete(e.key);var n=e.source,r=e.target,i=e.attributes,o=e.undirected,a=n===r;o?(n.undirectedDegree--,r.undirectedDegree--,a&&(n.undirectedLoops--,t._undirectedSelfLoopCount--)):(n.outDegree--,r.inDegree--,a&&(n.directedLoops--,t._directedSelfLoopCount--)),t.multi?e.detachMulti():e.detach(),o?t._undirectedSize--:t._directedSize--,t.emit(\"edgeDropped\",{key:e.key,attributes:i,source:n.key,target:r.key,undirected:o})}var zt=function(n){function r(t){var e;if(e=n.call(this)||this,\"boolean\"!=typeof(t=u({},Nt,t)).multi)throw new B(\"Graph.constructor: invalid 'multi' option. Expecting a boolean but got \\\"\".concat(t.multi,'\".'));if(!Dt.has(t.type))throw new B('Graph.constructor: invalid \\'type\\' option. Should be one of \"mixed\", \"directed\" or \"undirected\" but got \"'.concat(t.type,'\".'));if(\"boolean\"!=typeof t.allowSelfLoops)throw new B(\"Graph.constructor: invalid 'allowSelfLoops' option. Expecting a boolean but got \\\"\".concat(t.allowSelfLoops,'\".'));var r=\"mixed\"===t.type?Y:\"directed\"===t.type?q:J;p(c(e),\"NodeDataClass\",r);var i=\"geid_\"+St()+\"_\",o=0;return p(c(e),\"_attributes\",{}),p(c(e),\"_nodes\",new Map),p(c(e),\"_edges\",new Map),p(c(e),\"_directedSize\",0),p(c(e),\"_undirectedSize\",0),p(c(e),\"_directedSelfLoopCount\",0),p(c(e),\"_undirectedSelfLoopCount\",0),p(c(e),\"_edgeKeyGenerator\",(function(){var t;do{t=i+o++}while(e._edges.has(t));return t})),p(c(e),\"_options\",t),Ut.forEach((function(t){return p(c(e),t,e[t])})),f(c(e),\"order\",(function(){return e._nodes.size})),f(c(e),\"size\",(function(){return e._edges.size})),f(c(e),\"directedSize\",(function(){return e._directedSize})),f(c(e),\"undirectedSize\",(function(){return e._undirectedSize})),f(c(e),\"selfLoopCount\",(function(){return e._directedSelfLoopCount+e._undirectedSelfLoopCount})),f(c(e),\"directedSelfLoopCount\",(function(){return e._directedSelfLoopCount})),f(c(e),\"undirectedSelfLoopCount\",(function(){return e._undirectedSelfLoopCount})),f(c(e),\"multi\",e._options.multi),f(c(e),\"type\",e._options.type),f(c(e),\"allowSelfLoops\",e._options.allowSelfLoops),f(c(e),\"implementation\",(function(){return\"graphology\"})),e}e(r,n);var i=r.prototype;return i._resetInstanceCounters=function(){this._directedSize=0,this._undirectedSize=0,this._directedSelfLoopCount=0,this._undirectedSelfLoopCount=0},i.hasNode=function(t){return this._nodes.has(\"\"+t)},i.hasDirectedEdge=function(t,e){if(\"undirected\"===this.type)return!1;if(1===arguments.length){var n=\"\"+t,r=this._edges.get(n);return!!r&&!r.undirected}if(2===arguments.length){t=\"\"+t,e=\"\"+e;var i=this._nodes.get(t);return!!i&&i.out.hasOwnProperty(e)}throw new B(\"Graph.hasDirectedEdge: invalid arity (\".concat(arguments.length,\", instead of 1 or 2). You can either ask for an edge id or for the existence of an edge between a source & a target.\"))},i.hasUndirectedEdge=function(t,e){if(\"directed\"===this.type)return!1;if(1===arguments.length){var n=\"\"+t,r=this._edges.get(n);return!!r&&r.undirected}if(2===arguments.length){t=\"\"+t,e=\"\"+e;var i=this._nodes.get(t);return!!i&&i.undirected.hasOwnProperty(e)}throw new B(\"Graph.hasDirectedEdge: invalid arity (\".concat(arguments.length,\", instead of 1 or 2). You can either ask for an edge id or for the existence of an edge between a source & a target.\"))},i.hasEdge=function(t,e){if(1===arguments.length){var n=\"\"+t;return this._edges.has(n)}if(2===arguments.length){t=\"\"+t,e=\"\"+e;var r=this._nodes.get(t);return!!r&&(void 0!==r.out&&r.out.hasOwnProperty(e)||void 0!==r.undirected&&r.undirected.hasOwnProperty(e))}throw new B(\"Graph.hasEdge: invalid arity (\".concat(arguments.length,\", instead of 1 or 2). You can either ask for an edge id or for the existence of an edge between a source & a target.\"))},i.directedEdge=function(t,e){if(\"undirected\"!==this.type){if(t=\"\"+t,e=\"\"+e,this.multi)throw new I(\"Graph.directedEdge: this method is irrelevant with multigraphs since there might be multiple edges between source & target. See #.directedEdges instead.\");var n=this._nodes.get(t);if(!n)throw new F('Graph.directedEdge: could not find the \"'.concat(t,'\" source node in the graph.'));if(!this._nodes.has(e))throw new F('Graph.directedEdge: could not find the \"'.concat(e,'\" target node in the graph.'));var r=n.out&&n.out[e]||void 0;return r?r.key:void 0}},i.undirectedEdge=function(t,e){if(\"directed\"!==this.type){if(t=\"\"+t,e=\"\"+e,this.multi)throw new I(\"Graph.undirectedEdge: this method is irrelevant with multigraphs since there might be multiple edges between source & target. See #.undirectedEdges instead.\");var n=this._nodes.get(t);if(!n)throw new F('Graph.undirectedEdge: could not find the \"'.concat(t,'\" source node in the graph.'));if(!this._nodes.has(e))throw new F('Graph.undirectedEdge: could not find the \"'.concat(e,'\" target node in the graph.'));var r=n.undirected&&n.undirected[e]||void 0;return r?r.key:void 0}},i.edge=function(t,e){if(this.multi)throw new I(\"Graph.edge: this method is irrelevant with multigraphs since there might be multiple edges between source & target. See #.edges instead.\");t=\"\"+t,e=\"\"+e;var n=this._nodes.get(t);if(!n)throw new F('Graph.edge: could not find the \"'.concat(t,'\" source node in the graph.'));if(!this._nodes.has(e))throw new F('Graph.edge: could not find the \"'.concat(e,'\" target node in the graph.'));var r=n.out&&n.out[e]||n.undirected&&n.undirected[e]||void 0;if(r)return r.key},i.areDirectedNeighbors=function(t,e){t=\"\"+t,e=\"\"+e;var n=this._nodes.get(t);if(!n)throw new F('Graph.areDirectedNeighbors: could not find the \"'.concat(t,'\" node in the graph.'));return\"undirected\"!==this.type&&(e in n.in||e in n.out)},i.areOutNeighbors=function(t,e){t=\"\"+t,e=\"\"+e;var n=this._nodes.get(t);if(!n)throw new F('Graph.areOutNeighbors: could not find the \"'.concat(t,'\" node in the graph.'));return\"undirected\"!==this.type&&e in n.out},i.areInNeighbors=function(t,e){t=\"\"+t,e=\"\"+e;var n=this._nodes.get(t);if(!n)throw new F('Graph.areInNeighbors: could not find the \"'.concat(t,'\" node in the graph.'));return\"undirected\"!==this.type&&e in n.in},i.areUndirectedNeighbors=function(t,e){t=\"\"+t,e=\"\"+e;var n=this._nodes.get(t);if(!n)throw new F('Graph.areUndirectedNeighbors: could not find the \"'.concat(t,'\" node in the graph.'));return\"directed\"!==this.type&&e in n.undirected},i.areNeighbors=function(t,e){t=\"\"+t,e=\"\"+e;var n=this._nodes.get(t);if(!n)throw new F('Graph.areNeighbors: could not find the \"'.concat(t,'\" node in the graph.'));return\"undirected\"!==this.type&&(e in n.in||e in n.out)||\"directed\"!==this.type&&e in n.undirected},i.areInboundNeighbors=function(t,e){t=\"\"+t,e=\"\"+e;var n=this._nodes.get(t);if(!n)throw new F('Graph.areInboundNeighbors: could not find the \"'.concat(t,'\" node in the graph.'));return\"undirected\"!==this.type&&e in n.in||\"directed\"!==this.type&&e in n.undirected},i.areOutboundNeighbors=function(t,e){t=\"\"+t,e=\"\"+e;var n=this._nodes.get(t);if(!n)throw new F('Graph.areOutboundNeighbors: could not find the \"'.concat(t,'\" node in the graph.'));return\"undirected\"!==this.type&&e in n.out||\"directed\"!==this.type&&e in n.undirected},i.inDegree=function(t){t=\"\"+t;var e=this._nodes.get(t);if(!e)throw new F('Graph.inDegree: could not find the \"'.concat(t,'\" node in the graph.'));return\"undirected\"===this.type?0:e.inDegree},i.outDegree=function(t){t=\"\"+t;var e=this._nodes.get(t);if(!e)throw new F('Graph.outDegree: could not find the \"'.concat(t,'\" node in the graph.'));return\"undirected\"===this.type?0:e.outDegree},i.directedDegree=function(t){t=\"\"+t;var e=this._nodes.get(t);if(!e)throw new F('Graph.directedDegree: could not find the \"'.concat(t,'\" node in the graph.'));return\"undirected\"===this.type?0:e.inDegree+e.outDegree},i.undirectedDegree=function(t){t=\"\"+t;var e=this._nodes.get(t);if(!e)throw new F('Graph.undirectedDegree: could not find the \"'.concat(t,'\" node in the graph.'));return\"directed\"===this.type?0:e.undirectedDegree},i.inboundDegree=function(t){t=\"\"+t;var e=this._nodes.get(t);if(!e)throw new F('Graph.inboundDegree: could not find the \"'.concat(t,'\" node in the graph.'));var n=0;return\"directed\"!==this.type&&(n+=e.undirectedDegree),\"undirected\"!==this.type&&(n+=e.inDegree),n},i.outboundDegree=function(t){t=\"\"+t;var e=this._nodes.get(t);if(!e)throw new F('Graph.outboundDegree: could not find the \"'.concat(t,'\" node in the graph.'));var n=0;return\"directed\"!==this.type&&(n+=e.undirectedDegree),\"undirected\"!==this.type&&(n+=e.outDegree),n},i.degree=function(t){t=\"\"+t;var e=this._nodes.get(t);if(!e)throw new F('Graph.degree: could not find the \"'.concat(t,'\" node in the graph.'));var n=0;return\"directed\"!==this.type&&(n+=e.undirectedDegree),\"undirected\"!==this.type&&(n+=e.inDegree+e.outDegree),n},i.inDegreeWithoutSelfLoops=function(t){t=\"\"+t;var e=this._nodes.get(t);if(!e)throw new F('Graph.inDegreeWithoutSelfLoops: could not find the \"'.concat(t,'\" node in the graph.'));return\"undirected\"===this.type?0:e.inDegree-e.directedLoops},i.outDegreeWithoutSelfLoops=function(t){t=\"\"+t;var e=this._nodes.get(t);if(!e)throw new F('Graph.outDegreeWithoutSelfLoops: could not find the \"'.concat(t,'\" node in the graph.'));return\"undirected\"===this.type?0:e.outDegree-e.directedLoops},i.directedDegreeWithoutSelfLoops=function(t){t=\"\"+t;var e=this._nodes.get(t);if(!e)throw new F('Graph.directedDegreeWithoutSelfLoops: could not find the \"'.concat(t,'\" node in the graph.'));return\"undirected\"===this.type?0:e.inDegree+e.outDegree-2*e.directedLoops},i.undirectedDegreeWithoutSelfLoops=function(t){t=\"\"+t;var e=this._nodes.get(t);if(!e)throw new F('Graph.undirectedDegreeWithoutSelfLoops: could not find the \"'.concat(t,'\" node in the graph.'));return\"directed\"===this.type?0:e.undirectedDegree-2*e.undirectedLoops},i.inboundDegreeWithoutSelfLoops=function(t){t=\"\"+t;var e=this._nodes.get(t);if(!e)throw new F('Graph.inboundDegreeWithoutSelfLoops: could not find the \"'.concat(t,'\" node in the graph.'));var n=0,r=0;return\"directed\"!==this.type&&(n+=e.undirectedDegree,r+=2*e.undirectedLoops),\"undirected\"!==this.type&&(n+=e.inDegree,r+=e.directedLoops),n-r},i.outboundDegreeWithoutSelfLoops=function(t){t=\"\"+t;var e=this._nodes.get(t);if(!e)throw new F('Graph.outboundDegreeWithoutSelfLoops: could not find the \"'.concat(t,'\" node in the graph.'));var n=0,r=0;return\"directed\"!==this.type&&(n+=e.undirectedDegree,r+=2*e.undirectedLoops),\"undirected\"!==this.type&&(n+=e.outDegree,r+=e.directedLoops),n-r},i.degreeWithoutSelfLoops=function(t){t=\"\"+t;var e=this._nodes.get(t);if(!e)throw new F('Graph.degreeWithoutSelfLoops: could not find the \"'.concat(t,'\" node in the graph.'));var n=0,r=0;return\"directed\"!==this.type&&(n+=e.undirectedDegree,r+=2*e.undirectedLoops),\"undirected\"!==this.type&&(n+=e.inDegree+e.outDegree,r+=2*e.directedLoops),n-r},i.source=function(t){t=\"\"+t;var e=this._edges.get(t);if(!e)throw new F('Graph.source: could not find the \"'.concat(t,'\" edge in the graph.'));return e.source.key},i.target=function(t){t=\"\"+t;var e=this._edges.get(t);if(!e)throw new F('Graph.target: could not find the \"'.concat(t,'\" edge in the graph.'));return e.target.key},i.extremities=function(t){t=\"\"+t;var e=this._edges.get(t);if(!e)throw new F('Graph.extremities: could not find the \"'.concat(t,'\" edge in the graph.'));return[e.source.key,e.target.key]},i.opposite=function(t,e){t=\"\"+t,e=\"\"+e;var n=this._edges.get(e);if(!n)throw new F('Graph.opposite: could not find the \"'.concat(e,'\" edge in the graph.'));var r=n.source.key,i=n.target.key;if(t===r)return i;if(t===i)return r;throw new F('Graph.opposite: the \"'.concat(t,'\" node is not attached to the \"').concat(e,'\" edge (').concat(r,\", \").concat(i,\").\"))},i.hasExtremity=function(t,e){t=\"\"+t,e=\"\"+e;var n=this._edges.get(t);if(!n)throw new F('Graph.hasExtremity: could not find the \"'.concat(t,'\" edge in the graph.'));return n.source.key===e||n.target.key===e},i.isUndirected=function(t){t=\"\"+t;var e=this._edges.get(t);if(!e)throw new F('Graph.isUndirected: could not find the \"'.concat(t,'\" edge in the graph.'));return e.undirected},i.isDirected=function(t){t=\"\"+t;var e=this._edges.get(t);if(!e)throw new F('Graph.isDirected: could not find the \"'.concat(t,'\" edge in the graph.'));return!e.undirected},i.isSelfLoop=function(t){t=\"\"+t;var e=this._edges.get(t);if(!e)throw new F('Graph.isSelfLoop: could not find the \"'.concat(t,'\" edge in the graph.'));return e.source===e.target},i.addNode=function(t,e){var n=function(t,e,n){if(n&&!s(n))throw new B('Graph.addNode: invalid attributes. Expecting an object but got \"'.concat(n,'\"'));if(e=\"\"+e,n=n||{},t._nodes.has(e))throw new I('Graph.addNode: the \"'.concat(e,'\" node already exist in the graph.'));var r=new t.NodeDataClass(e,n);return t._nodes.set(e,r),t.emit(\"nodeAdded\",{key:e,attributes:n}),r}(this,t,e);return n.key},i.mergeNode=function(t,e){if(e&&!s(e))throw new B('Graph.mergeNode: invalid attributes. Expecting an object but got \"'.concat(e,'\"'));t=\"\"+t,e=e||{};var n=this._nodes.get(t);return n?(e&&(u(n.attributes,e),this.emit(\"nodeAttributesUpdated\",{type:\"merge\",key:t,attributes:n.attributes,data:e})),[t,!1]):(n=new this.NodeDataClass(t,e),this._nodes.set(t,n),this.emit(\"nodeAdded\",{key:t,attributes:e}),[t,!0])},i.updateNode=function(t,e){if(e&&\"function\"!=typeof e)throw new B('Graph.updateNode: invalid updater function. Expecting a function but got \"'.concat(e,'\"'));t=\"\"+t;var n=this._nodes.get(t);if(n){if(e){var r=n.attributes;n.attributes=e(r),this.emit(\"nodeAttributesUpdated\",{type:\"replace\",key:t,attributes:n.attributes})}return[t,!1]}var i=e?e({}):{};return n=new this.NodeDataClass(t,i),this._nodes.set(t,n),this.emit(\"nodeAdded\",{key:t,attributes:i}),[t,!0]},i.dropNode=function(t){t=\"\"+t;var e,n=this._nodes.get(t);if(!n)throw new F('Graph.dropNode: could not find the \"'.concat(t,'\" node in the graph.'));if(\"undirected\"!==this.type){for(var r in n.out){e=n.out[r];do{Mt(this,e),e=e.next}while(e)}for(var i in n.in){e=n.in[i];do{Mt(this,e),e=e.next}while(e)}}if(\"directed\"!==this.type)for(var o in n.undirected){e=n.undirected[o];do{Mt(this,e),e=e.next}while(e)}this._nodes.delete(t),this.emit(\"nodeDropped\",{key:t,attributes:n.attributes})},i.dropEdge=function(t){var e;if(arguments.length>1){var n=\"\"+arguments[0],r=\"\"+arguments[1];if(!(e=d(this,n,r,this.type)))throw new F('Graph.dropEdge: could not find the \"'.concat(n,'\" -> \"').concat(r,'\" edge in the graph.'))}else if(t=\"\"+t,!(e=this._edges.get(t)))throw new F('Graph.dropEdge: could not find the \"'.concat(t,'\" edge in the graph.'));return Mt(this,e),this},i.dropDirectedEdge=function(t,e){if(arguments.length<2)throw new I(\"Graph.dropDirectedEdge: it does not make sense to try and drop a directed edge by key. What if the edge with this key is undirected? Use #.dropEdge for this purpose instead.\");if(this.multi)throw new I(\"Graph.dropDirectedEdge: cannot use a {source,target} combo when dropping an edge in a MultiGraph since we cannot infer the one you want to delete as there could be multiple ones.\");var n=d(this,t=\"\"+t,e=\"\"+e,\"directed\");if(!n)throw new F('Graph.dropDirectedEdge: could not find a \"'.concat(t,'\" -> \"').concat(e,'\" edge in the graph.'));return Mt(this,n),this},i.dropUndirectedEdge=function(t,e){if(arguments.length<2)throw new I(\"Graph.dropUndirectedEdge: it does not make sense to drop a directed edge by key. What if the edge with this key is undirected? Use #.dropEdge for this purpose instead.\");if(this.multi)throw new I(\"Graph.dropUndirectedEdge: cannot use a {source,target} combo when dropping an edge in a MultiGraph since we cannot infer the one you want to delete as there could be multiple ones.\");var n=d(this,t,e,\"undirected\");if(!n)throw new F('Graph.dropUndirectedEdge: could not find a \"'.concat(t,'\" -> \"').concat(e,'\" edge in the graph.'));return Mt(this,n),this},i.clear=function(){this._edges.clear(),this._nodes.clear(),this._resetInstanceCounters(),this.emit(\"cleared\")},i.clearEdges=function(){for(var t,e=this._nodes.values();!0!==(t=e.next()).done;)t.value.clear();this._edges.clear(),this._resetInstanceCounters(),this.emit(\"edgesCleared\")},i.getAttribute=function(t){return this._attributes[t]},i.getAttributes=function(){return this._attributes},i.hasAttribute=function(t){return this._attributes.hasOwnProperty(t)},i.setAttribute=function(t,e){return this._attributes[t]=e,this.emit(\"attributesUpdated\",{type:\"set\",attributes:this._attributes,name:t}),this},i.updateAttribute=function(t,e){if(\"function\"!=typeof e)throw new B(\"Graph.updateAttribute: updater should be a function.\");var n=this._attributes[t];return this._attributes[t]=e(n),this.emit(\"attributesUpdated\",{type:\"set\",attributes:this._attributes,name:t}),this},i.removeAttribute=function(t){return delete this._attributes[t],this.emit(\"attributesUpdated\",{type:\"remove\",attributes:this._attributes,name:t}),this},i.replaceAttributes=function(t){if(!s(t))throw new B(\"Graph.replaceAttributes: provided attributes are not a plain object.\");return this._attributes=t,this.emit(\"attributesUpdated\",{type:\"replace\",attributes:this._attributes}),this},i.mergeAttributes=function(t){if(!s(t))throw new B(\"Graph.mergeAttributes: provided attributes are not a plain object.\");return u(this._attributes,t),this.emit(\"attributesUpdated\",{type:\"merge\",attributes:this._attributes,data:t}),this},i.updateAttributes=function(t){if(\"function\"!=typeof t)throw new B(\"Graph.updateAttributes: provided updater is not a function.\");return this._attributes=t(this._attributes),this.emit(\"attributesUpdated\",{type:\"update\",attributes:this._attributes}),this},i.updateEachNodeAttributes=function(t,e){if(\"function\"!=typeof t)throw new B(\"Graph.updateEachNodeAttributes: expecting an updater function.\");if(e&&!l(e))throw new B(\"Graph.updateEachNodeAttributes: invalid hints. Expecting an object having the following shape: {attributes?: [string]}\");for(var n,r,i=this._nodes.values();!0!==(n=i.next()).done;)(r=n.value).attributes=t(r.key,r.attributes);this.emit(\"eachNodeAttributesUpdated\",{hints:e||null})},i.updateEachEdgeAttributes=function(t,e){if(\"function\"!=typeof t)throw new B(\"Graph.updateEachEdgeAttributes: expecting an updater function.\");if(e&&!l(e))throw new B(\"Graph.updateEachEdgeAttributes: invalid hints. Expecting an object having the following shape: {attributes?: [string]}\");for(var n,r,i,o,a=this._edges.values();!0!==(n=a.next()).done;)i=(r=n.value).source,o=r.target,r.attributes=t(r.key,r.attributes,i.key,o.key,i.attributes,o.attributes,r.undirected);this.emit(\"eachEdgeAttributesUpdated\",{hints:e||null})},i.forEachAdjacencyEntry=function(t){if(\"function\"!=typeof t)throw new B(\"Graph.forEachAdjacencyEntry: expecting a callback.\");xt(!1,!1,!1,this,t)},i.forEachAdjacencyEntryWithOrphans=function(t){if(\"function\"!=typeof t)throw new B(\"Graph.forEachAdjacencyEntryWithOrphans: expecting a callback.\");xt(!1,!1,!0,this,t)},i.forEachAssymetricAdjacencyEntry=function(t){if(\"function\"!=typeof t)throw new B(\"Graph.forEachAssymetricAdjacencyEntry: expecting a callback.\");xt(!1,!0,!1,this,t)},i.forEachAssymetricAdjacencyEntryWithOrphans=function(t){if(\"function\"!=typeof t)throw new B(\"Graph.forEachAssymetricAdjacencyEntryWithOrphans: expecting a callback.\");xt(!1,!0,!0,this,t)},i.nodes=function(){return\"function\"==typeof Array.from?Array.from(this._nodes.keys()):K(this._nodes.keys(),this._nodes.size)},i.forEachNode=function(t){if(\"function\"!=typeof t)throw new B(\"Graph.forEachNode: expecting a callback.\");for(var e,n,r=this._nodes.values();!0!==(e=r.next()).done;)t((n=e.value).key,n.attributes)},i.findNode=function(t){if(\"function\"!=typeof t)throw new B(\"Graph.findNode: expecting a callback.\");for(var e,n,r=this._nodes.values();!0!==(e=r.next()).done;)if(t((n=e.value).key,n.attributes))return n.key},i.mapNodes=function(t){if(\"function\"!=typeof t)throw new B(\"Graph.mapNode: expecting a callback.\");for(var e,n,r=this._nodes.values(),i=new Array(this.order),o=0;!0!==(e=r.next()).done;)n=e.value,i[o++]=t(n.key,n.attributes);return i},i.someNode=function(t){if(\"function\"!=typeof t)throw new B(\"Graph.someNode: expecting a callback.\");for(var e,n,r=this._nodes.values();!0!==(e=r.next()).done;)if(t((n=e.value).key,n.attributes))return!0;return!1},i.everyNode=function(t){if(\"function\"!=typeof t)throw new B(\"Graph.everyNode: expecting a callback.\");for(var e,n,r=this._nodes.values();!0!==(e=r.next()).done;)if(!t((n=e.value).key,n.attributes))return!1;return!0},i.filterNodes=function(t){if(\"function\"!=typeof t)throw new B(\"Graph.filterNodes: expecting a callback.\");for(var e,n,r=this._nodes.values(),i=[];!0!==(e=r.next()).done;)t((n=e.value).key,n.attributes)&&i.push(n.key);return i},i.reduceNodes=function(t,e){if(\"function\"!=typeof t)throw new B(\"Graph.reduceNodes: expecting a callback.\");if(arguments.length<2)throw new B(\"Graph.reduceNodes: missing initial value. You must provide it because the callback takes more than one argument and we cannot infer the initial value from the first iteration, as you could with a simple array.\");for(var n,r,i=e,o=this._nodes.values();!0!==(n=o.next()).done;)i=t(i,(r=n.value).key,r.attributes);return i},i.nodeEntries=function(){var t=this._nodes.values();return new O((function(){var e=t.next();if(e.done)return e;var n=e.value;return{value:{node:n.key,attributes:n.attributes},done:!1}}))},i.export=function(){var t=this,e=new Array(this._nodes.size),n=0;this._nodes.forEach((function(t,r){e[n++]=function(t,e){var n={key:t};return h(e.attributes)||(n.attributes=u({},e.attributes)),n}(r,t)}));var r=new Array(this._edges.size);return n=0,this._edges.forEach((function(e,i){r[n++]=function(t,e,n){var r={key:e,source:n.source.key,target:n.target.key};return h(n.attributes)||(r.attributes=u({},n.attributes)),\"mixed\"===t&&n.undirected&&(r.undirected=!0),r}(t.type,i,e)})),{options:{type:this.type,multi:this.multi,allowSelfLoops:this.allowSelfLoops},attributes:this.getAttributes(),nodes:e,edges:r}},i.import=function(t){var e,n,i,o,a,c=this,u=arguments.length>1&&void 0!==arguments[1]&&arguments[1];if(t instanceof r)return t.forEachNode((function(t,e){u?c.mergeNode(t,e):c.addNode(t,e)})),t.forEachEdge((function(t,e,n,r,i,o,a){u?a?c.mergeUndirectedEdgeWithKey(t,n,r,e):c.mergeDirectedEdgeWithKey(t,n,r,e):a?c.addUndirectedEdgeWithKey(t,n,r,e):c.addDirectedEdgeWithKey(t,n,r,e)})),this;if(!s(t))throw new B(\"Graph.import: invalid argument. Expecting a serialized graph or, alternatively, a Graph instance.\");if(t.attributes){if(!s(t.attributes))throw new B(\"Graph.import: invalid attributes. Expecting a plain object.\");u?this.mergeAttributes(t.attributes):this.replaceAttributes(t.attributes)}if(t.nodes){if(i=t.nodes,!Array.isArray(i))throw new B(\"Graph.import: invalid nodes. Expecting an array.\");for(e=0,n=i.length;e<n;e++){Et(o=i[e]);var d=o,h=d.key,p=d.attributes;u?this.mergeNode(h,p):this.addNode(h,p)}}if(t.edges){var f=!1;if(\"undirected\"===this.type&&(f=!0),i=t.edges,!Array.isArray(i))throw new B(\"Graph.import: invalid edges. Expecting an array.\");for(e=0,n=i.length;e<n;e++){At(a=i[e]);var l=a,g=l.source,y=l.target,w=l.attributes,v=l.undirected,b=void 0===v?f:v;\"key\"in a?(u?b?this.mergeUndirectedEdgeWithKey:this.mergeDirectedEdgeWithKey:b?this.addUndirectedEdgeWithKey:this.addDirectedEdgeWithKey).call(this,a.key,g,y,w):(u?b?this.mergeUndirectedEdge:this.mergeDirectedEdge:b?this.addUndirectedEdge:this.addDirectedEdge).call(this,g,y,w)}}return this},i.nullCopy=function(t){var e=new r(u({},this._options,t));return e.replaceAttributes(u({},this.getAttributes())),e},i.emptyCopy=function(t){var e=this.nullCopy(t);return this._nodes.forEach((function(t,n){var r=u({},t.attributes);t=new e.NodeDataClass(n,r),e._nodes.set(n,t)})),e},i.copy=function(t){if(\"string\"==typeof(t=t||{}).type&&t.type!==this.type&&\"mixed\"!==t.type)throw new I('Graph.copy: cannot create an incompatible copy from \"'.concat(this.type,'\" type to \"').concat(t.type,'\" because this would mean losing information about the current graph.'));if(\"boolean\"==typeof t.multi&&t.multi!==this.multi&&!0!==t.multi)throw new I(\"Graph.copy: cannot create an incompatible copy by downgrading a multi graph to a simple one because this would mean losing information about the current graph.\");if(\"boolean\"==typeof t.allowSelfLoops&&t.allowSelfLoops!==this.allowSelfLoops&&!0!==t.allowSelfLoops)throw new I(\"Graph.copy: cannot create an incompatible copy from a graph allowing self loops to one that does not because this would mean losing information about the current graph.\");for(var e,n,r=this.emptyCopy(t),i=this._edges.values();!0!==(e=i.next()).done;)jt(r,\"copy\",!1,(n=e.value).undirected,n.key,n.source.key,n.target.key,u({},n.attributes));return r},i.toJSON=function(){return this.export()},i.toString=function(){return\"[object Graph]\"},i.inspect=function(){var e=this,n={};this._nodes.forEach((function(t,e){n[e]=t.attributes}));var r={},i={};this._edges.forEach((function(t,n){var o,a=t.undirected?\"--\":\"->\",c=\"\",u=t.source.key,d=t.target.key;t.undirected&&u>d&&(o=u,u=d,d=o);var s=\"(\".concat(u,\")\").concat(a,\"(\").concat(d,\")\");n.startsWith(\"geid_\")?e.multi&&(void 0===i[s]?i[s]=0:i[s]++,c+=\"\".concat(i[s],\". \")):c+=\"[\".concat(n,\"]: \"),r[c+=s]=t.attributes}));var o={};for(var a in this)this.hasOwnProperty(a)&&!Ut.has(a)&&\"function\"!=typeof this[a]&&\"symbol\"!==t(a)&&(o[a]=this[a]);return o.attributes=this._attributes,o.nodes=n,o.edges=r,p(o,\"constructor\",this.constructor),o},r}(y.exports.EventEmitter);\"undefined\"!=typeof Symbol&&(zt.prototype[Symbol.for(\"nodejs.util.inspect.custom\")]=zt.prototype.inspect),[{name:function(t){return\"\".concat(t,\"Edge\")},generateKey:!0},{name:function(t){return\"\".concat(t,\"DirectedEdge\")},generateKey:!0,type:\"directed\"},{name:function(t){return\"\".concat(t,\"UndirectedEdge\")},generateKey:!0,type:\"undirected\"},{name:function(t){return\"\".concat(t,\"EdgeWithKey\")}},{name:function(t){return\"\".concat(t,\"DirectedEdgeWithKey\")},type:\"directed\"},{name:function(t){return\"\".concat(t,\"UndirectedEdgeWithKey\")},type:\"undirected\"}].forEach((function(t){[\"add\",\"merge\",\"update\"].forEach((function(e){var n=t.name(e),r=\"add\"===e?jt:Ct;t.generateKey?zt.prototype[n]=function(i,o,a){return r(this,n,!0,\"undirected\"===(t.type||this.type),null,i,o,a,\"update\"===e)}:zt.prototype[n]=function(i,o,a,c){return r(this,n,!1,\"undirected\"===(t.type||this.type),i,o,a,c,\"update\"===e)}}))})),function(t){Q.forEach((function(e){var n=e.name,r=e.attacher;r(t,n(\"Node\"),0),r(t,n(\"Source\"),1),r(t,n(\"Target\"),2),r(t,n(\"Opposite\"),3)}))}(zt),function(t){X.forEach((function(e){var n=e.name,r=e.attacher;r(t,n(\"Edge\"),\"mixed\"),r(t,n(\"DirectedEdge\"),\"directed\"),r(t,n(\"UndirectedEdge\"),\"undirected\")}))}(zt),function(t){et.forEach((function(e){!function(t,e){var n=e.name,r=e.type,i=e.direction;t.prototype[n]=function(t,e){if(\"mixed\"!==r&&\"mixed\"!==this.type&&r!==this.type)return[];if(!arguments.length)return ut(this,r);if(1===arguments.length){t=\"\"+t;var o=this._nodes.get(t);if(void 0===o)throw new F(\"Graph.\".concat(n,': could not find the \"').concat(t,'\" node in the graph.'));return pt(this.multi,\"mixed\"===r?this.type:r,i,o)}if(2===arguments.length){t=\"\"+t,e=\"\"+e;var a=this._nodes.get(t);if(!a)throw new F(\"Graph.\".concat(n,': could not find the \"').concat(t,'\" source node in the graph.'));if(!this._nodes.has(e))throw new F(\"Graph.\".concat(n,': could not find the \"').concat(e,'\" target node in the graph.'));return gt(r,this.multi,i,a,e)}throw new B(\"Graph.\".concat(n,\": too many arguments (expecting 0, 1 or 2 and got \").concat(arguments.length,\").\"))}}(t,e),function(t,e){var n=e.name,r=e.type,i=e.direction,o=\"forEach\"+n[0].toUpperCase()+n.slice(1,-1);t.prototype[o]=function(t,e,n){if(\"mixed\"===r||\"mixed\"===this.type||r===this.type){if(1===arguments.length)return dt(!1,this,r,n=t);if(2===arguments.length){t=\"\"+t,n=e;var a=this._nodes.get(t);if(void 0===a)throw new F(\"Graph.\".concat(o,': could not find the \"').concat(t,'\" node in the graph.'));return ht(!1,this.multi,\"mixed\"===r?this.type:r,i,a,n)}if(3===arguments.length){t=\"\"+t,e=\"\"+e;var c=this._nodes.get(t);if(!c)throw new F(\"Graph.\".concat(o,': could not find the \"').concat(t,'\" source node in the graph.'));if(!this._nodes.has(e))throw new F(\"Graph.\".concat(o,': could not find the \"').concat(e,'\" target node in the graph.'));return lt(!1,r,this.multi,i,c,e,n)}throw new B(\"Graph.\".concat(o,\": too many arguments (expecting 1, 2 or 3 and got \").concat(arguments.length,\").\"))}};var a=\"map\"+n[0].toUpperCase()+n.slice(1);t.prototype[a]=function(){var t,e=Array.prototype.slice.call(arguments),n=e.pop();if(0===e.length){var i=0;\"directed\"!==r&&(i+=this.undirectedSize),\"undirected\"!==r&&(i+=this.directedSize),t=new Array(i);var a=0;e.push((function(e,r,i,o,c,u,d){t[a++]=n(e,r,i,o,c,u,d)}))}else t=[],e.push((function(e,r,i,o,a,c,u){t.push(n(e,r,i,o,a,c,u))}));return this[o].apply(this,e),t};var c=\"filter\"+n[0].toUpperCase()+n.slice(1);t.prototype[c]=function(){var t=Array.prototype.slice.call(arguments),e=t.pop(),n=[];return t.push((function(t,r,i,o,a,c,u){e(t,r,i,o,a,c,u)&&n.push(t)})),this[o].apply(this,t),n};var u=\"reduce\"+n[0].toUpperCase()+n.slice(1);t.prototype[u]=function(){var t,e,n=Array.prototype.slice.call(arguments);if(n.length<2||n.length>4)throw new B(\"Graph.\".concat(u,\": invalid number of arguments (expecting 2, 3 or 4 and got \").concat(n.length,\").\"));if(\"function\"==typeof n[n.length-1]&&\"function\"!=typeof n[n.length-2])throw new B(\"Graph.\".concat(u,\": missing initial value. You must provide it because the callback takes more than one argument and we cannot infer the initial value from the first iteration, as you could with a simple array.\"));2===n.length?(t=n[0],e=n[1],n=[]):3===n.length?(t=n[1],e=n[2],n=[n[0]]):4===n.length&&(t=n[2],e=n[3],n=[n[0],n[1]]);var r=e;return n.push((function(e,n,i,o,a,c,u){r=t(r,e,n,i,o,a,c,u)})),this[o].apply(this,n),r}}(t,e),function(t,e){var n=e.name,r=e.type,i=e.direction,o=\"find\"+n[0].toUpperCase()+n.slice(1,-1);t.prototype[o]=function(t,e,n){if(\"mixed\"!==r&&\"mixed\"!==this.type&&r!==this.type)return!1;if(1===arguments.length)return dt(!0,this,r,n=t);if(2===arguments.length){t=\"\"+t,n=e;var a=this._nodes.get(t);if(void 0===a)throw new F(\"Graph.\".concat(o,': could not find the \"').concat(t,'\" node in the graph.'));return ht(!0,this.multi,\"mixed\"===r?this.type:r,i,a,n)}if(3===arguments.length){t=\"\"+t,e=\"\"+e;var c=this._nodes.get(t);if(!c)throw new F(\"Graph.\".concat(o,': could not find the \"').concat(t,'\" source node in the graph.'));if(!this._nodes.has(e))throw new F(\"Graph.\".concat(o,': could not find the \"').concat(e,'\" target node in the graph.'));return lt(!0,r,this.multi,i,c,e,n)}throw new B(\"Graph.\".concat(o,\": too many arguments (expecting 1, 2 or 3 and got \").concat(arguments.length,\").\"))};var a=\"some\"+n[0].toUpperCase()+n.slice(1,-1);t.prototype[a]=function(){var t=Array.prototype.slice.call(arguments),e=t.pop();return t.push((function(t,n,r,i,o,a,c){return e(t,n,r,i,o,a,c)})),!!this[o].apply(this,t)};var c=\"every\"+n[0].toUpperCase()+n.slice(1,-1);t.prototype[c]=function(){var t=Array.prototype.slice.call(arguments),e=t.pop();return t.push((function(t,n,r,i,o,a,c){return!e(t,n,r,i,o,a,c)})),!this[o].apply(this,t)}}(t,e),function(t,e){var n=e.name,r=e.type,i=e.direction,o=n.slice(0,-1)+\"Entries\";t.prototype[o]=function(t,e){if(\"mixed\"!==r&&\"mixed\"!==this.type&&r!==this.type)return O.empty();if(!arguments.length)return st(this,r);if(1===arguments.length){t=\"\"+t;var n=this._nodes.get(t);if(!n)throw new F(\"Graph.\".concat(o,': could not find the \"').concat(t,'\" node in the graph.'));return ft(r,i,n)}if(2===arguments.length){t=\"\"+t,e=\"\"+e;var a=this._nodes.get(t);if(!a)throw new F(\"Graph.\".concat(o,': could not find the \"').concat(t,'\" source node in the graph.'));if(!this._nodes.has(e))throw new F(\"Graph.\".concat(o,': could not find the \"').concat(e,'\" target node in the graph.'));return yt(r,i,a,e)}throw new B(\"Graph.\".concat(o,\": too many arguments (expecting 0, 1 or 2 and got \").concat(arguments.length,\").\"))}}(t,e)}))}(zt),function(t){wt.forEach((function(e){_t(t,e),function(t,e){var n=e.name,r=e.type,i=e.direction,o=\"forEach\"+n[0].toUpperCase()+n.slice(1,-1);t.prototype[o]=function(t,e){if(\"mixed\"===r||\"mixed\"===this.type||r===this.type){t=\"\"+t;var n=this._nodes.get(t);if(void 0===n)throw new F(\"Graph.\".concat(o,': could not find the \"').concat(t,'\" node in the graph.'));mt(!1,\"mixed\"===r?this.type:r,i,n,e)}};var a=\"map\"+n[0].toUpperCase()+n.slice(1);t.prototype[a]=function(t,e){var n=[];return this[o](t,(function(t,r){n.push(e(t,r))})),n};var c=\"filter\"+n[0].toUpperCase()+n.slice(1);t.prototype[c]=function(t,e){var n=[];return this[o](t,(function(t,r){e(t,r)&&n.push(t)})),n};var u=\"reduce\"+n[0].toUpperCase()+n.slice(1);t.prototype[u]=function(t,e,n){if(arguments.length<3)throw new B(\"Graph.\".concat(u,\": missing initial value. You must provide it because the callback takes more than one argument and we cannot infer the initial value from the first iteration, as you could with a simple array.\"));var r=n;return this[o](t,(function(t,n){r=e(r,t,n)})),r}}(t,e),function(t,e){var n=e.name,r=e.type,i=e.direction,o=n[0].toUpperCase()+n.slice(1,-1),a=\"find\"+o;t.prototype[a]=function(t,e){if(\"mixed\"===r||\"mixed\"===this.type||r===this.type){t=\"\"+t;var n=this._nodes.get(t);if(void 0===n)throw new F(\"Graph.\".concat(a,': could not find the \"').concat(t,'\" node in the graph.'));return mt(!0,\"mixed\"===r?this.type:r,i,n,e)}};var c=\"some\"+o;t.prototype[c]=function(t,e){return!!this[a](t,e)};var u=\"every\"+o;t.prototype[u]=function(t,e){return!this[a](t,(function(t,n){return!e(t,n)}))}}(t,e),Gt(t,e)}))}(zt);var Wt=function(t){function n(e){var n=u({type:\"directed\"},e);if(\"multi\"in n&&!1!==n.multi)throw new B(\"DirectedGraph.from: inconsistent indication that the graph should be multi in given options!\");if(\"directed\"!==n.type)throw new B('DirectedGraph.from: inconsistent \"'+n.type+'\" type in given options!');return t.call(this,n)||this}return e(n,t),n}(zt),Pt=function(t){function n(e){var n=u({type:\"undirected\"},e);if(\"multi\"in n&&!1!==n.multi)throw new B(\"UndirectedGraph.from: inconsistent indication that the graph should be multi in given options!\");if(\"undirected\"!==n.type)throw new B('UndirectedGraph.from: inconsistent \"'+n.type+'\" type in given options!');return t.call(this,n)||this}return e(n,t),n}(zt),Rt=function(t){function n(e){var n=u({multi:!0},e);if(\"multi\"in n&&!0!==n.multi)throw new B(\"MultiGraph.from: inconsistent indication that the graph should be simple in given options!\");return t.call(this,n)||this}return e(n,t),n}(zt),Kt=function(t){function n(e){var n=u({type:\"directed\",multi:!0},e);if(\"multi\"in n&&!0!==n.multi)throw new B(\"MultiDirectedGraph.from: inconsistent indication that the graph should be simple in given options!\");if(\"directed\"!==n.type)throw new B('MultiDirectedGraph.from: inconsistent \"'+n.type+'\" type in given options!');return t.call(this,n)||this}return e(n,t),n}(zt),Tt=function(t){function n(e){var n=u({type:\"undirected\",multi:!0},e);if(\"multi\"in n&&!0!==n.multi)throw new B(\"MultiUndirectedGraph.from: inconsistent indication that the graph should be simple in given options!\");if(\"undirected\"!==n.type)throw new B('MultiUndirectedGraph.from: inconsistent \"'+n.type+'\" type in given options!');return t.call(this,n)||this}return e(n,t),n}(zt);function Bt(t){t.from=function(e,n){var r=u({},e.options,n),i=new t(r);return i.import(e),i}}return Bt(zt),Bt(Wt),Bt(Pt),Bt(Rt),Bt(Kt),Bt(Tt),zt.Graph=zt,zt.DirectedGraph=Wt,zt.UndirectedGraph=Pt,zt.MultiGraph=Rt,zt.MultiDirectedGraph=Kt,zt.MultiUndirectedGraph=Tt,zt.InvalidArgumentsGraphError=B,zt.NotFoundGraphError=F,zt.UsageGraphError=I,zt}));\n//# sourceMappingURL=graphology.umd.min.js.map\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n// expose the modules object (__webpack_modules__)\n__webpack_require__.m = __webpack_modules__;\n\n// the startup function\n__webpack_require__.x = () => {\n\t// Load entry module and return exports\n\t// This entry module depends on other loaded chunks and execution need to be delayed\n\tvar __webpack_exports__ = __webpack_require__.O(undefined, [731], () => (__webpack_require__(8848)))\n\t__webpack_exports__ = __webpack_require__.O(__webpack_exports__);\n\treturn __webpack_exports__;\n};\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\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__.f = {};\n// This file contains only the entry chunk.\n// The chunk loading function for additional chunks\n__webpack_require__.e = (chunkId) => {\n\treturn Promise.all(Object.keys(__webpack_require__.f).reduce((promises, key) => {\n\t\t__webpack_require__.f[key](chunkId, promises);\n\t\treturn promises;\n\t}, []));\n};","// This function allow to reference async chunks and sibling chunks for the entrypoint\n__webpack_require__.u = (chunkId) => {\n\t// return url for filenames based on template\n\treturn \"\" + chunkId + \".js\";\n};","__webpack_require__.g = (function() {\n\tif (typeof globalThis === 'object') return globalThis;\n\ttry {\n\t\treturn this || new Function('return this')();\n\t} catch (e) {\n\t\tif (typeof window === 'object') return window;\n\t}\n})();","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","var scriptUrl;\nif (__webpack_require__.g.importScripts) scriptUrl = __webpack_require__.g.location + \"\";\nvar document = __webpack_require__.g.document;\nif (!scriptUrl && document) {\n\tif (document.currentScript)\n\t\tscriptUrl = document.currentScript.src;\n\tif (!scriptUrl) {\n\t\tvar scripts = document.getElementsByTagName(\"script\");\n\t\tif(scripts.length) {\n\t\t\tvar i = scripts.length - 1;\n\t\t\twhile (i > -1 && (!scriptUrl || !/^http(s?):/.test(scriptUrl))) scriptUrl = scripts[i--].src;\n\t\t}\n\t}\n}\n// When supporting browsers where an automatic publicPath is not supported you must specify an output.publicPath manually via configuration\n// or pass an empty string (\"\") and set the __webpack_public_path__ variable from your code to use your own logic.\nif (!scriptUrl) throw new Error(\"Automatic publicPath is not supported in this browser\");\nscriptUrl = scriptUrl.replace(/#.*$/, \"\").replace(/\\?.*$/, \"\").replace(/\\/[^\\/]+$/, \"/\");\n__webpack_require__.p = scriptUrl;","__webpack_require__.b = self.location + \"\";\n\n// object to store loaded chunks\n// \"1\" means \"already loaded\"\nvar installedChunks = {\n\t449: 1\n};\n\n// importScripts chunk loading\nvar installChunk = (data) => {\n\tvar [chunkIds, moreModules, runtime] = data;\n\tfor(var moduleId in moreModules) {\n\t\tif(__webpack_require__.o(moreModules, moduleId)) {\n\t\t\t__webpack_require__.m[moduleId] = moreModules[moduleId];\n\t\t}\n\t}\n\tif(runtime) runtime(__webpack_require__);\n\twhile(chunkIds.length)\n\t\tinstalledChunks[chunkIds.pop()] = 1;\n\tparentChunkLoadingFunction(data);\n};\n__webpack_require__.f.i = (chunkId, promises) => {\n\t// \"1\" is the signal for \"already loaded\"\n\tif(!installedChunks[chunkId]) {\n\t\tif(true) { // all chunks have JS\n\t\t\timportScripts(__webpack_require__.p + __webpack_require__.u(chunkId));\n\t\t}\n\t}\n};\n\nvar chunkLoadingGlobal = self[\"webpackChunkbio\"] = self[\"webpackChunkbio\"] || [];\nvar parentChunkLoadingFunction = chunkLoadingGlobal.push.bind(chunkLoadingGlobal);\nchunkLoadingGlobal.push = installChunk;\n\n// no HMR\n\n// no HMR manifest","// run startup\nvar __webpack_exports__ = __webpack_require__.x();\n"],"names":["deferred","next","WEBGSLAGGREGATION","WEBGSLAGGREGATIONFUNCTIONS","EUCLIDEAN","arraySize","MANHATTAN","WEBGPUDISTANCE","webGPUFunctions","HAMMING","_maxArraySize","entryIndex","maxArraySize","_entryIndex","TANIMOTO","LEVENSTEIN","NEEDLEMAN_WUNSCH","MONOMER_CHEMICAL_DISTANCE","SOKAL","COSINE","ASYMMETRIC","Difference","OneHot","distanceFunctionComplexity","maxEntrySize","Math","ceil","_maxEntrySize","TypeSupportedDistances","Set","__awaiter","thisArg","_arguments","P","generator","Promise","resolve","reject","fulfilled","value","step","e","rejected","result","done","then","apply","gpuAdapter","gpuDevice","getGPUDevice","this","navigator","gpu","requestAdapter","powerPreference","isLost","lost","r","setTimeout","requiredBufferSize","adapterLimits","limits","buffferSizeLimit","maxBufferSize","storageBufferSizeLimit","maxStorageBufferBindingSize","requestDevice","requiredLimits","min","console","error","multiColWebGPUSparseMatrix","entryList","threshold","distanceMetrics","aggregationFunction","weights","options","device","availableDistanceMetrics","Object","values","some","metric","includes","Error","join","maxDistance","length","list","numOfColumns","listSize","processInfo","map","entry","i","distanceMetric","gapOpenPenalty","gapExtensionPenalty","_a","_b","entryType","encodedList","Uint32Array","split","c","charCodeAt","Float32Array","_data","Int32Array","encodedListType","arraySizes","arr","has","maxEntryLen","reduce","a","b","max","complexity","EncodedArrayConstructor","flatSourceArray","forEach","seq","set","suppInfoStructWgsl","suppInfoSize","suppInfoType","suppInfoBuffer","maxMonomerIndex","scoringMatrix","alphabetIndexes","keys","prev","n","Array","fill","String","fromCharCode","similarityMatrixSize","transferedSimilarityMatrix","key","key2","offset","range","dataTypeWGSL","dataStructWgsl","sourceArraySize","webGPUProcessInfo","suppInfoWgsl","info","filter","wgsl","needsDummy","trim","dataWgsl","numOfThreads","sparseResultSizePerThread","combinedComplexity","maxIterationsPerThread","workgroupsDim","sqrt","globalThreadDimSize","condensedDistanceMatrixSize","dmChunkSizePerThread","module","createShaderModule","label","code","getCombinedDistanceScript","pipeline","createComputePipeline","layout","compute","entryPoint","startAtCols","startAtRows","endAtCols","endAtRows","chunkSize","floor","startRow","startCol","time","endIdx","endRow","endCol","timeEnd","computeInfoBuffer32Size","suppInfoBuffer32Size","sparseMatrixEachArray32Size","computeInfoBufferSize","BYTES_PER_ELEMENT","paddedComputeInfoBufferSize","remainder","computeInfoBuffer","createBuffer","size","usage","GPUBufferUsage","STORAGE","COPY_SRC","COPY_DST","mappedAtCreation","mappedComputeInfoArrayBuffer","getMappedRange","computeInfoOffSet","ArrayConstructor","unmap","suppInfoBufferSize","paddedSuppInfoBufferSize","suppInfoRemainder","mappedSuppInfoArrayBuffer","suppInfoOffSet","byteLength","resultsBufferSize","paddedResultsBufferSize","resultsRemainder","resultsBuffer","bindGroup","createBindGroup","getBindGroupLayout","entries","binding","resource","buffer","resultsOutBuffer","MAP_READ","resultIs","resultJs","resultDistances","isAllDone","encoder","createCommandEncoder","pass","beginComputePass","setPipeline","setBindGroup","dispatchWorkgroups","end","copyBufferToBuffer","commandBuffer","finish","queue","submit","onSubmittedWorkDone","mapAsync","GPUMapMode","READ","resultsOutArrayBuffer","resultOffset","resultsI","resultsJ","resultsDistances","resultsFound","every","d","totalResults","combinedI","combinedJ","combinedDistances","combinedOffset","resI","found","subarray","push","totalSize","finalI","finalJ","finalDistances","finalOffset","destroy","j","distance","maxEntryLens","aggregation","_","bioLayout","cluster","sparseObject","_threshold","subCluster","is","js","graph","addNode","x","random","y","p1","p2","weight","addEdge","settings","iterations","weighted","embedX1","embedY1","node","getNodeAttributes","minX","minY","maxX","maxY","scaleX","scaleY","embedX","embedY","getWebColaLayot","sparseKNNNoralizeColwise","knnSimilarities","offsets","nRows","neededThreads","neededWorkGroups","workGroupThreadsPerDim","workGroupDim","threadsPerDim","simmilaritiesBuffer","offsetsBuffer","commandEncoder","passEncoder","outSimilarityBuffer","arrayBuffer","inflate","factor","pow","expandNoRevive","knnIndexes","_nRows","outKNNSimilarities","sparseKNNBufferByteSize","sparseKNNBuffer","sparseKNNArrayBuffer","rowIndexes","res","getRowIndexes","startBuffer","resultBlockBuffer","outBlockBuffer","start","curLength","writeBuffer","outBlock","KNNIndexes","KNNSimilarities","indexOffsets","toSparseKNNSimilarityForm","sparseMatrix","occurenceCount","countOccurancesAddLoops","offsetForm","ar","insertCounter","row","col","similarity","prototype","toString","defaultMCLOptions","expandFactor","maxIterations","inflateFactor","multFactor","MCLSparseReducer","constructor","opts","_options","transform","originalSparseObject","toObjectForm","sparseClusters","assignClusters","correctClusters","clusters","addLoops","normalize","expand","embeddings","transformWebGPU","mclRes","sparseKNNForm","expandRes","markovClusterWebGPU","csrToSparseObject","clusterSizeMap","sortedIndexes","Number","sort","clusterMap","clusterIdx","order","log10","minOrder","k","clusterNum","sortedClusterNames","perRow","yOffset","clusterName","offsetX","mergeClusters","iCluster","jCluster","assignClustersCSR","correctedOffsets","offsetCounter","sum","expandedObject","val","getExpandValue","round","currentIndexes","otherIndexes","onmessage","async","event","data","aggregationMethod","distanceFnArgs","distanceFns","useWebGPU","sparse","calcMultiColumn","reducer","postMessage","isNil","insertSmaller","distancesAr","indexes","num","index","newPosition","findIndex","v","pop","splice","exports","linLogMode","outboundAttractionDistribution","adjustSizes","edgeWeightInfluence","scalingRatio","strongGravityMode","gravity","slowDown","barnesHutOptimize","barnesHutTheta","assign","target","l","objects","slice","call","arguments","validateSettings","message","graphToByteArrays","getEdgeWeight","NodeMatrix","EdgeMatrix","forEachNode","attr","fixed","forEachEdge","edge","source","sa","ta","u","sj","tj","nodes","edges","assignLayoutChanges","outputReducer","updateEachNodeAttributes","readGraphPositions","collectLayoutChanges","positions","newAttr","createWorker","fn","xURL","window","URL","webkitURL","objectUrl","createObjectURL","Blob","type","worker","Worker","revokeObjectURL","isGraph","createEdgeWeightGetter","iterate","helpers","DEFAULT_SETTINGS","abstractSynchronousLayout","params","fromEntry","validationError","matrices","synchronousLayout","bind","inferSettings","log","PPN","n1","n2","rn","w","g","s","outboundAttCompensation","coefficient","xDist","yDist","ewc","force","swinging","traction","nodespeed","newX","newY","thetaSquared","RegionMatrix","q","q2","subdivisionAttempts","Infinity","dx","dy","PPR","coerceWeight","isNaN","name","nameOrFunction","defaultValue","getter","coerceToDefault","get","attributes","returnDefault","undefined","fromAttributes","fromGraph","getEdgeAttributes","fromPartialEntry","fromMinimalEntry","extremities","isUndirected","t","createEdgeValueGetter","addUndirectedEdgeWithKey","dropNode","multi","Symbol","iterator","create","setPrototypeOf","getPrototypeOf","__proto__","o","Reflect","construct","sham","Proxy","Boolean","valueOf","Function","Map","indexOf","TypeError","enumerable","writable","configurable","ReferenceError","_nodes","out","undirected","h","p","defineProperty","f","isArray","ownKeys","getOwnPropertySymbols","getOwnPropertyNames","concat","m","init","once","removeListener","U","on","EventEmitter","_events","_eventsCount","_maxListeners","G","defaultMaxListeners","newListener","emit","listener","unshift","warned","emitter","count","warn","E","fired","wrapFn","A","L","D","S","addEventListener","removeEventListener","N","RangeError","setMaxListeners","getMaxListeners","context","addListener","prependListener","prependOnceListener","shift","off","removeAllListeners","listeners","rawListeners","listenerCount","eventNames","of","empty","fromSequence","O","ARRAY_BUFFER_SUPPORT","ArrayBuffer","SYMBOL_SUPPORT","C","M","z","W","isView","R","K","T","B","captureStackTrace","F","I","Y","clear","J","V","H","_edges","inDegree","outDegree","undirectedDegree","undirectedLoops","directedLoops","in","attach","attachMulti","previous","detach","detachMulti","Q","attacher","hasOwnProperty","X","Z","$","tt","et","direction","nt","rt","it","sourceAttributes","targetAttributes","ot","at","ct","dt","ht","lt","wt","vt","bt","mt","wrap","kt","neighbor","xt","Et","At","Lt","St","Dt","Ut","Nt","allowSelfLoops","Ot","NodeDataClass","jt","_edgeKeyGenerator","_undirectedSelfLoopCount","_directedSelfLoopCount","_undirectedSize","_directedSize","Ct","Mt","delete","zt","_resetInstanceCounters","hasNode","hasDirectedEdge","hasUndirectedEdge","hasEdge","directedEdge","undirectedEdge","areDirectedNeighbors","areOutNeighbors","areInNeighbors","areUndirectedNeighbors","areNeighbors","areInboundNeighbors","areOutboundNeighbors","directedDegree","inboundDegree","outboundDegree","degree","inDegreeWithoutSelfLoops","outDegreeWithoutSelfLoops","directedDegreeWithoutSelfLoops","undirectedDegreeWithoutSelfLoops","inboundDegreeWithoutSelfLoops","outboundDegreeWithoutSelfLoops","degreeWithoutSelfLoops","opposite","hasExtremity","isDirected","isSelfLoop","mergeNode","updateNode","dropEdge","dropDirectedEdge","dropUndirectedEdge","clearEdges","getAttribute","_attributes","getAttributes","hasAttribute","setAttribute","updateAttribute","removeAttribute","replaceAttributes","mergeAttributes","updateAttributes","hints","updateEachEdgeAttributes","forEachAdjacencyEntry","forEachAdjacencyEntryWithOrphans","forEachAssymetricAdjacencyEntry","forEachAssymetricAdjacencyEntryWithOrphans","from","findNode","mapNodes","someNode","everyNode","filterNodes","reduceNodes","nodeEntries","export","import","mergeUndirectedEdgeWithKey","mergeDirectedEdgeWithKey","addDirectedEdgeWithKey","mergeUndirectedEdge","mergeDirectedEdge","addUndirectedEdge","addDirectedEdge","nullCopy","emptyCopy","copy","toJSON","inspect","startsWith","for","generateKey","undirectedSize","directedSize","ut","pt","gt","toUpperCase","st","ft","yt","_t","Gt","Wt","Pt","Rt","Kt","Tt","Bt","Graph","DirectedGraph","UndirectedGraph","MultiGraph","MultiDirectedGraph","MultiUndirectedGraph","InvalidArgumentsGraphError","NotFoundGraphError","UsageGraphError","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","__webpack_modules__","__webpack_exports__","chunkIds","priority","notFulfilled","__esModule","definition","chunkId","all","promises","globalThis","obj","prop","scriptUrl","importScripts","location","document","currentScript","src","scripts","getElementsByTagName","test","replace","self","installedChunks","chunkLoadingGlobal","parentChunkLoadingFunction","moreModules","runtime"],"sourceRoot":""}