{"version":3,"file":"9067_b239dfbbe95de013ed43.bundle.js","mappings":"sPAkEA,IAAIA,GAA0B,EAG1BC,EAAe,KA2CnB,SAASC,GAAW,MACZC,EAAK,QAAEC,EAAO,iBAAEC,EAAmB,KAAI,KAAEC,EAAO,KAAI,SAAEC,EAAQ,QAAEC,EAAO,SAAEC,EAAQ,MAAEC,EAAQ,UAAS,YACpGC,GAAc,EAAK,QAAEC,EAAO,YAAEC,EAAW,WAAEC,GAAa,EAAI,WAAEC,GAAa,EAAI,0BAAEC,GAA4B,EAAK,UAClHC,EAAY,OAAM,KAAEC,GAAO,EAAI,WAAEC,GAAa,IAErC,WAATT,GAAsBC,IAAaD,EAAQ,gBAC/CU,SAASC,eAAeX,IAAQY,SA3CpC,UAAmB,GAAEC,EAAE,QAAEX,EAAU,GAAE,YAAEC,EAAc,GAAE,WAAEE,GAAa,EAAI,WAAED,GAAa,EAAI,iBAAET,EAAmB,KAAI,UAAEY,EAAY,OAAM,KAAEC,GAAO,EAAI,WAAEC,GAAa,KAClK,QAAWF,EACP,qBAAqBC,EAAO,OAAS,MAAMN,UAAgBW,uBAAwBA,YAAaJ,EAAa,wBAA0B,oSAQtHJ,EACD,2HAC+CQ,2IAFjC,yEAM8BV,kCAE3CC,EACD,qLAGST,EACD,mCAAmCA,aADf,qCAJd,iEAatC,CAaImB,CAAU,CAAED,GAAIb,EAAOE,UAASC,cAAaC,WAAYA,IAAeH,EAAaI,aAAYV,mBAAkBY,YAAWC,OAAMC,eAEpI,IAAIM,EAASL,SAASC,eAAeX,GACjCgB,EAAeN,SAASO,cAAc,eACtCD,IACAD,EAAOG,MAAMC,QAAUC,SAASJ,EAAaE,MAAMC,QAAU,GAAGE,YAGpE,IAAIC,EAASP,EAAOE,cAAc,gBAC9BK,IAAQA,EAAOC,UAAY9B,GAAS,IACxCsB,EAAOE,cAAc,eAAeM,UAAY7B,GAAW,GAE3D,IAAI8B,EAAYT,EAAOE,cAAc,8BACjCpB,GAAU2B,EAAUC,iBAAiB,QAAS5B,GAC9CE,GACA,EAAE,IAAIC,KAAS0B,GAAG,kBAAmB3B,GAG7B,CAAC,KAAM,KAAM,cACf4B,SAAS/B,KAAO,QAAYmB,EAAOE,cAAc,iBAAkB,SAASrB,KAAQ,IAC9F,QAAYmB,EAAQ,gBAAiBd,GAErC,EAAEc,GAAQf,MAAM,CAAE4B,MAAM,EAAMC,YAAUvB,IAA6BL,IAAqB,WAGrFX,IACDA,GAA0B,EAC1BoB,SAASO,cAAc,QAAQQ,iBAAiB,WAAW,SAAUK,GAC7DpB,SAASO,cAAc,IAAIjB,WAAiB8B,EAAEC,SAAsB,IAAXD,EAAEE,QAC3DF,EAAEG,iBACFvB,SAASO,cAAc,IAAIjB,kBAAsBkC,cAAc,IAAIC,WAAW,QAAS,CAAEC,KAAMC,OAAQC,SAAS,EAAMC,YAAY,KAE1I,KAGJ,EAAE,IAAIvC,KAAS0B,GAAG,kBAAkBI,IAChC,GAAMU,QAAQV,EAAEW,OAAO,IAGvB3C,GACA,EAAE,IAAIE,KAAS0B,GAAG,iBAAkB5B,EAE5C,CAMA,SAAS4C,EAAa1C,EAAQ,YAC1B,EAAEA,GAAOA,MAAM,OACnB,CAMA,SAAS2C,EAAW3C,EAAQ,YACxB,EAAEA,GAAOA,MAAM,OACnB,CAEA,SAAS4C,IACL,KAAK,UAAS,OAEd,IAAIC,EAAc,EACjBC,EAAY,EAWb,EAAEpC,UAAUgB,GAAG,aAAc,qHAAqH,SAASqB,GACvJA,EAAMd,iBACNc,EAAMC,kBACNH,EAAcE,EAAME,eAAe,GAAGC,QAG1BC,KAAKC,QAAQ,UACnBC,UAAUC,IAAI,eACxB,IAEA,EAAE5C,UAAUgB,GAAG,WAAY,sCAAsC,SAASqB,GACtEA,EAAMC,kBACNF,EAAYC,EAAME,eAAe,GAAGC,QApBhCL,GAAeC,EAAYD,GAAe,IAC1CH,EAAY,wBAGhBG,EAAc,EACdC,EAAY,EAmBAK,KAAKC,QAAQ,UACnBC,UAAUzC,OAAO,eAC3B,IAEA,EAAEF,UAAUgB,GAAG,YAAa,sCAAsC,SAASI,GACvEA,EAAEkB,kBAEF,IAAIO,EAAQC,EAEZD,EAASzB,EAAE2B,QAAQ,GAAGC,QACtBF,EAAS1B,EAAE2B,QAAQ,GAAGP,QAKL,EAHDS,KAAKC,IAAI9B,EAAE2B,QAAQ,GAAGC,QAAUH,GAChCI,KAAKC,IAAI9B,EAAE2B,QAAQ,GAAGP,QAAUM,IAG5C1B,EAAEG,gBAEV,GACJ,CAEA,SAAS4B,IACLjB,IAEA,EAAElC,UAAUgB,GAAG,kBAAmB,sCAAsC,WACpE,EAAEyB,MAAMvC,QACZ,IAEA,EAAEF,UAAUgB,GAAG,kBAAmB,wBAAwB,WACtD,EAAEyB,MAAMC,QAAQ,oBAAoBU,SAAS,SACjD,IAEA,EAAEpD,UAAUgB,GAAG,gBAAiB,wBAAwB,WACpD,EAAEyB,MAAMC,QAAQ,oBAAoBW,YAAY,SACpD,IAEA,EAAErD,UAAUgB,GAAG,iBAAiB,MAC5B,QAAuB,KAAK,IAIhC,EAAEhB,UAAUgB,GAAG,mBAAmB,WAEzBhB,SAASO,cAAc,gBACxBP,SAASO,cAAc,oBAAoBL,SAG3CF,SAASO,cAAc,gBAEvBP,SAASsD,KAAKX,UAAUC,IAAI,aAEpC,GACJ,CAYA,SAASW,EAAUC,EAAKC,GACpB,IAAKD,EAAK,QAEVC,EAAUC,OAAOC,OAAO,CAAC,EAAG,CAAEC,KAAM,OAAQC,QAAQ,EAAMC,YAAY,EAAOvE,aAAa,GAASkE,IAEvFM,UACRN,EAAQI,QAAS,GAGrB,IAOIG,IAAiBhE,SAASO,cAAc,iBACxC0D,EAAO,8BARG,CACVC,KAAM,GACNC,OAAQ,eACRC,QAAS,eACTC,QAAS,aAIoCZ,EAAQG,OAAS,OAAOJ,UACzE,GAAIQ,EACKhE,SAASO,cAAc,kCACxB,QAAW,uBAAwB,0CAGlCkD,EAAQI,QAAWJ,EAAQM,UAAW/D,SAASO,cAAc,6BAC9DP,SAASsE,iBAAiB,4BAA4BC,SAAQnD,GAAKA,EAAElB,WAGrEuD,EAAQM,SACR,OAAY,+BAAgCE,IAG5C,QAAW,+BAAgCA,GAG/CO,aAAa3F,OAEZ,CAQD,GAPAC,EAAW,CACPC,MAAO0E,EAAQ1E,OAAS,aACxBC,QAAS,mCAAqCiF,EAAO,SACrD1E,YAAakE,EAAQlE,YACrBL,KAAMuE,EAAQvE,QAlDfuF,SAASC,SAASC,cAAcC,WAAW,YAAaH,SAASC,SAASC,cAAcC,WAAW,WAqDpF,CACd,IAAIzD,EAAW,IAAInB,SAASsE,iBAAiB,oBAAoBO,OAAO,GAAG,GACvE1D,IAAUA,EAASX,MAAMC,OAAS,OAC1C,CAEoB,WAAhBgD,EAAQG,OACR/E,EAAeiG,YAAW,WACtB9C,GACJ,GAAG,KAEX,CAEA,IAAMyB,EAAQI,SAAWJ,EAAQM,UAAaC,EAAc,CACxDhE,SAASO,cAAc,0BAA0BM,UAAY,sFAE7Db,SAASO,cAAc,yBAAyBM,UAAY4C,EAAQ1E,OAAS,cAE7E,QAAY,yBAA0B,UAAU,IAChD,QAAY,gCAAiC,UAAU,GAEvD,IAAIgG,EAAS/E,SAASO,cAAc,2BACpC,QAAYwE,EAAQ,aAActB,EAAQK,aAC1C,QAAYiB,EAAQ,eAAgC,WAAhBtB,EAAQG,OAC5C,QAAYmB,EAAQ,gBAAiC,YAAhBtB,EAAQG,KACjD,CAEIH,EAAQuB,UACRvB,EAAQuB,WAGRvB,EAAQwB,eACRjF,SAASO,cAAc,yBAAyBQ,iBAAiB,QAAS0C,EAAQwB,cAE1F,CASA,SAASC,EAAazB,GAWlB,OAFAA,EAAUC,OAAOC,OAAO,CAAC,EARV,CACXwB,OAAQ,KACRC,WAAY,SACZC,KAAM,cACNC,WAAW,EACXvG,MAAO,iBAG2B0E,GAE/B,IAAI8B,SAAQC,IACfjC,EACIE,EAAQ4B,KAAM,CACdtG,MAAO0E,EAAQ1E,MACf8E,QAAQ,EACRmB,SAAU,MACN,QAAY,gCAAiC,UAAU,GACvD,IAAIS,EAAe,+DAA+DhC,EAAQ6B,UAAY,QAAU,OAAO7B,EAAQ0B,kBAC3HO,EAAmB,sEAAsEjC,EAAQ2B,sBACjGO,GAAW,QAAuBF,GAAcG,WAChDC,GAAe,QAAuBH,GAAkBE,WAC/C5F,SAASO,cAAc,0BAC7BsD,OAAO8B,EAAUE,GACxBF,EAAS5E,iBAAiB,SAAS,IAAM0C,EAAQuB,SAAWvB,EAAQuB,UAAS,GAAM,IAAMQ,GAAQ,KAASA,GAAQ,KAClHK,EAAa9E,iBAAiB,SAAS,IAAM0C,EAAQuB,SAAWvB,EAAQuB,UAAS,GAAO,IAAMQ,GAAQ,KAAUA,GAAQ,KACpH/B,EAAQqC,cAAcrC,EAAQqC,cAAc,GAEtD,GAEV,CAEA,SAASC,KACL,QAAiB/F,SAAU,QAAS,aAAagG,IAC7C,IAAI7F,EAAK6F,EAAQC,QAAQC,SAAW,UAAS,WAE7CpH,EAAW,CACPE,QAASgB,SAASO,cAAcyF,EAAQC,QAAQE,gBAAgBtF,WAAamF,EAAQC,QAAQjH,QAC7FY,2BAA2B,EAC3BN,MAAOa,EACPpB,MAAOiH,EAAQC,QAAQlH,MACvBY,aAAcqG,EAAQC,QAAQlH,MAC9BG,KAAM8G,EAAQC,QAAQ/G,KACtBD,iBAAkB,KAClBM,aAAa,WAAuC,IAA5ByG,EAAQC,QAAQG,SACxC/G,SAAU,KACNW,SAASC,eAAeE,GAAID,QAAQ,GAE1C,GAEV,C,gJCnZA,IAAImG,GAAyB,EAEzBC,EAAmB,CACnB,0BACA,cACA,YACA,yBACA,yBAOJ,SAASC,EAAuBP,GAC5B,IAAIQ,EAAW,IAAIxG,SAASsE,iBAAiBgC,EAAiBG,KAAK,QAAQC,QAAOtF,GAAKA,GAAK4E,IAC5F,IAAK,IAAIW,KAAWH,EAChB,EAAEG,GAASA,QAAQ,OAE3B,CAEA,SAASC,KACL,QAAiB5G,SAAU,QAAS,0BAA0BgG,IAC1D,EAAE,iCAAiC1G,MAAM,QAEzC,IAAIuH,EAAW,EAAEb,GAAStD,QAAQ,YAC7BmE,EAASC,QACF,EAAED,EAASE,KAAK,cAAcf,SACpCW,QAAQ,OAAO,IAGzB,EAAE3G,UAAUgB,GAAG,oBAAoB,SAASI,GACxC,IACI4F,EAAQ,EAAE5F,EAAEW,QACZ8E,EAAW,EAAEG,EAAMD,KAAK,cAAcE,KACtCC,EAAUL,EAASM,KAAK,mBACxBC,EAAQP,EAASM,KAAK,iBAQ1B,GANA,GAAMrF,QAAQ+E,EAAS,IAEnBG,EAAMK,SAAS,oBACfR,EAASzD,SAAS,WAGlB4D,EAAMK,SAAS,uBAAwB,CACvC,IAAIC,EAAqBJ,EAAQjD,OAASiD,EAAUE,EAEpD,GAAI,EAAE,oBAAqBE,GAAoBR,OAAQ,OACvDQ,EAAmBvD,QAhBR,4IAiBf,CACJ,IAEAwD,IACA,EAAE,2BAA2BZ,QAAQ,CACjCa,UAAU,IAGd,EAAExH,UAAUgB,GAAG,mBAAmBI,IAC1BA,EAAEqG,eAAeC,cACjBnB,EAAuBnF,EAAEqG,cAAcC,eAElCtG,EAAEW,QACPwE,EAAuBnF,EAAEW,QAGzB/B,SAASO,cAAc,mBACvB,EAAE,kBAAkBoH,SAAS,QAGjC,IAAIC,EAAa,CAAC,yBACd,YACAA,EAAaA,EAAWC,OAAO,CAAC,cAAe,yBAA0B,2BAE7E,IAAIC,EAASF,EAAWnB,KAAK,MAE7B,GAAIrF,EAAEqG,eAAeC,eAAeK,QAAQD,IAAW1G,EAAEW,QAAQgG,QAAQD,GACrE,OAAO,CACX,IAGJ,EAAE9H,UAAUgB,GAAG,oBAAoB,KAC/BuF,EAAuB,KAAK,GAEpC,CAOA,SAASyB,EAAenI,EAAY,MAC3BA,IAAWA,EAAYG,UAC5B,IAAK,IAAIgG,KAAWnG,EAAUyE,iBAAiB,wCAC3C,EAAE0B,GAASW,QAAQ,CACf1C,MAAM,EACNgE,QAASjC,EAAQrD,UAAUuF,SAAS,SAAW,QAAU,QACzDC,UAAW,MACXnJ,QAASgH,EAAQjH,MACjByI,UAAU,EACVY,SAAU,wGAIlB,IAAI,UACK/B,IACDA,GAAyB,GAEzB,QAAiBrG,SAAU,QAAS,8DAA8DgG,IAC9F,IAAIqC,EAAgBrC,EAAQC,QAAQE,cAChCnH,EAAUqJ,EAAgBrI,SAASO,cAAc8H,GAAexH,UAAYmF,EAAQC,QAAQjH,QAC5FD,EAAQiH,EAAQjH,OAASiH,EAAQC,QAAQqC,cACzCzI,EAAYmG,EAAQC,QAAQpG,WAEhC,QAAW,CACPb,QAAS,QAAQA,UACjBD,QACAQ,aAAa,EACbC,QAAS,oBACTK,YACAP,MAAO0G,EAAQC,QAAQC,SACzB,UAOd,IAAK,IAAIF,KAAWnG,EAAUyE,iBAAiB,8DAA+D,CAC1G,GAAI,EAAE0B,GAASe,KAAK,cAAe,SACnC,IAAIkB,EAAUjC,EAAQC,QAAQgC,QAE1BtB,EAAU,EAAEX,GAASW,QAAQ,CAC7B3H,QAAS,WACL,IAAI+C,EAASU,KAAKwD,QAAQE,cAC1B,GAAIpE,EAAQ,CAER,OADW/B,SAASO,cAAcwB,GAAQlB,SAE9C,CAEA,OAAO4B,KAAKwD,QAAQjH,OACxB,EACAiF,MAAM,EACNuD,UAAU,IAGVS,GAAsB,SAAXA,GAEftB,EAAQ3F,GAAG,cAAc,WACrB,IAAIuH,EAAQ9F,KACZ,EAAEA,MAAMkE,QAAQ,QAChB,EAAE,YAAY3F,GAAG,cAAc,WAC3B,EAAEuH,GAAO5B,QAAQ,OACrB,GACJ,IAAG3F,GAAG,cAAc,WAChB,IAAIuH,EAAQ9F,KACZqC,YAAW,WACF,EAAE,kBAAkBgC,QACrB,EAAEyB,GAAO5B,QAAQ,OAEzB,GAAG,IACP,GACJ,CACJ,CAOA,SAASY,EAAc1H,EAAY,MAC/B,GAAKA,EAKL,GAAIA,aAAqB2I,aAAe3I,aAAqB4I,UAAY5I,aAAqB6I,iBAC1FV,EAAenI,OADnB,CAKyB,iBAAf,IACNA,EAAY,EAAEA,IAGlB,IAAK,IAAImG,KAAWnG,EAAU8I,UAAUjC,QAAOtF,GAAKA,aAAaoH,cAC7DR,EAAehC,EAPnB,MAPIgC,GAgBR,CAOA,SAASY,EAAeC,EAAQ7D,GAC5B,EAAE6D,GAAQ7H,GAAG,mBAAoBgE,EACrC,CAOA,SAAS8D,EAAkBD,GACvB,OAAO,EAAEA,GAAQ9B,KAAK,cAAcE,GACxC,CAEA,SAAS8B,EAAalJ,GAClB,IAAIiI,EAAS,CAAC,YAAa,aAAc,SAAU,cAAe,0BAC9D,WAASA,EAAOkB,KAAK,wBACzB,EAAE,UAAWnJ,GAAaG,UAAUiJ,IAAInB,EAAOrB,KAAK,OAAOyC,QAAQ,CAC/Df,UAAW,OACXgB,SAAU,SACVlF,MAAM,EACNgE,QAAS,WAGb,QAAiBjI,SAAU,YAAa,sCAAsC,SAASgG,GACnF,EAAEA,GAASiD,IAAInB,EAAOrB,KAAK,OAAOyC,QAAQ,CACtCf,UAAW,OACXgB,SAAU,SACVlF,MAAM,EACNgE,QAAS,UAGb,EAAEjC,GAASiC,QAAQ,YACvB,KAEA,QAAiBjI,SAAU,QAAS,WAAW,SAASgG,GACpD,EAAEA,GAASkD,QAAQ,OACvB,GACJ,C,iBC9NA,IACKE,EACHC,EACAC,EACAC,E,iBAoEF,SAvEKH,EAAQ,iEACXC,EAAW,uIACXC,EAAe,cACfC,EAAM,SAAUC,EAAKC,GAGpB,IAFAD,EAAME,OAAOF,GACbC,EAAMA,GAAO,EACND,EAAI1C,OAAS2C,GAAKD,EAAM,IAAMA,EACrC,OAAOA,CACR,EAGM,SAAUG,EAAMC,EAAMC,GAS5B,GAPwB,GAApBC,UAAUhD,QAAuD,mBAAxCpD,OAAOqG,UAAUpJ,SAASqJ,KAAKL,IAA+B,KAAKM,KAAKN,KACpGC,EAAOD,EACPA,OAAOO,GAIRP,EAAOA,EAAO,IAAIQ,KAAKR,GAAQ,IAAIQ,KAC/BC,MAAMT,GAAO,MAAMU,YAAY,gBAKX,SAHxBT,EAAOF,OAAOE,IAGL/E,MAAM,EAAG,KACjB+E,EAAOA,EAAK/E,MAAM,GAClBgF,GAAM,GAGP,IAAIS,EAAIT,EAAM,SAAW,MACxBU,EAAIZ,EAAKW,EAAI,UACbE,EAAIb,EAAKW,EAAI,aACbG,EAAId,EAAKW,EAAI,cACbI,EAAIf,EAAKW,EAAI,WACbK,EAAIhB,EAAKW,EAAI,WACbM,EAAIjB,EAAKW,EAAI,aACbO,EAAIlB,EAAKW,EAAI,kBACbQ,EAAIjB,EAAM,EAAIF,EAAKoB,oBACnBC,EAAQ,CACPT,EAAMA,EACNU,GAAM1B,EAAIgB,GACVC,EAAMA,EACNU,GAAM3B,EAAIiB,GACVW,GAAMzB,OAAOe,GAAG5F,MAAM,GACtBuG,KAAMX,EACNY,EAAMX,EAAI,IAAM,GAChBY,GAAM/B,EAAImB,EAAI,IAAM,IACpBA,EAAMA,EACNa,GAAMhC,EAAImB,GACVC,EAAMA,EAAI,EACVa,GAAMjC,EAAIoB,EAAI,GACdC,EAAMA,EACNa,GAAMlC,EAAIqB,GACVc,EAAMnC,EAAIsB,EAAG,GACbA,EAAMtB,EAAIsB,EAAI,GAAK5H,KAAK0I,MAAMd,EAAI,IAAMA,GACxCe,EAAMlB,EAAI,GAAK,IAAO,IACtBmB,GAAMnB,EAAI,GAAK,KAAO,KACtBoB,EAAMpB,EAAI,GAAK,IAAO,IACtBqB,GAAMrB,EAAI,GAAK,KAAO,KACtBsB,EAAMnC,EAAM,OAASH,OAAOC,GAAMsC,MAAM5C,IAAa,CAAC,KAAK6C,MAAMC,QAAQ7C,EAAc,IACvFwB,GAAOA,EAAI,EAAI,IAAM,KAAOvB,EAAmC,IAA/BtG,KAAKmJ,MAAMnJ,KAAKC,IAAI4H,GAAK,IAAY7H,KAAKC,IAAI4H,GAAK,GAAI,GACvFuB,EAAM,CAAC,KAAM,KAAM,KAAM,MAAM9B,EAAI,GAAK,EAAI,GAAKA,EAAI,IAAMA,EAAI,IAAM,IAAMA,EAAI,KAGjF,OAAOX,EAAKuC,QAAQ/C,GAAO,SAAUkD,GACpC,OAAOA,KAAMtB,EAAQA,EAAMsB,GAAMA,EAAGzH,MAAM,EAAGyH,EAAGxF,OAAS,EAC1D,GACD,E","sources":["webpack://tumarket/./js/global/dialog.js","webpack://tumarket/./js/global/popover.js","webpack://tumarket/./js/lib/dateformat/dateformat.js"],"sourcesContent":["import * as $ from \"jquery\";\nimport * as htmx from \"htmx.org\";\nimport \"bootstrap/js/dist/modal\";\nimport { addEventDelegate, appendHtml, htmlToDocumentFragment, prependHtml, toggleClass } from \"./dom\";\nimport { isMob } from \"./util\";\nimport { newUuid } from \"./uuid\";\nimport { closeAllPopoversExcept } from \"./popover\";\n\n/**\n * @typedef {object} Dialog\n * @property {string} [title]\n * @property {string} content\n * @property {string} [submitButtonText='OK']\n * @property {string} [size='lg']\n * @property {() => void} [onSubmit]\n * @property {() => void} [onShown]\n * @property {() => void} [onClosed]\n * @property {boolean} [pinToBottom=false]\n * @property {string} [classes]\n * @property {string} [bodyClasses]\n * @property {boolean} [showHeader=true]\n * @property {boolean} [showFooter=true]\n * @property {boolean} [canCloseByClickingOutside=false]\n * @property {string} [modal='asModal'] modal window selector\n * @property {string} [container]\n * @property {boolean} [fade=true]\n * @property {boolean} [noBackdrop=false]\n */\n\n/**\n * @typedef {object} AlertOptions\n * @property {string} [type]\n * @property {string} [size]\n * @property {boolean} [append]\n * @property {boolean} [prepend]\n * @property {string} [title]\n * @property {boolean} [fullscreen]\n * @property {() => void} [callback]\n * @property {() => void} [closeCallback]\n * @property {boolean} [pinToBottom]\n */\n\n/**\n * @typedef {object} ConfirmOptions\n * @property {string} [okText]\n * @property {string} [cancelText]\n * @property {string} [text]\n * @property {() => void} [showCallback]\n * @property {boolean} [autoClose]\n * @property {string} [title]\n * @property {(result: boolean, resolve: () => void) => void} [callback] второй аргумент нужен только чтобы корректно завершить promise после закрытия\n */\n\n/**\n * @typedef {object} ModalOptions\n * @property {string} [id]\n * @property {string} [classes='']\n * @property {string} [bodyClasses='']\n * @property {boolean} [showHeader=true]\n * @property {boolean} [showFooter=true]\n * @property {string} [submitButtonText='OK']\n * @property {string} [container='body']\n * @property {boolean} [fade=true]\n * @property {boolean} [noBackdrop=false]\n */\n\nlet dialogHotkeyInitialized = false;\n\n/** @type {NodeJS.Timeout} */\nlet alertTimeout = null;\n\n/**\n * \n * @param {ModalOptions} param0 \n */\nfunction initModal({ id, classes = '', bodyClasses = '', showHeader = true, showFooter = true, submitButtonText = 'OK', container = 'body', fade = true, noBackdrop = false }) {\n appendHtml(container,\n `
\n
\n
\n
\n
\n
\n
\n ${\n !showHeader ? '' :\n `
\n
\n \n
`\n }\n
\n ${\n !showFooter ? '' :\n ``\n }\n
\n
\n
`\n );\n}\n\n/**\n * \n * @param {Dialog} param0 \n */\nfunction showDialog({ \n title, content, submitButtonText = 'OK', size = 'lg', onSubmit, onShown, onClosed, modal = 'asModal', \n pinToBottom = false, classes, bodyClasses, showFooter = true, showHeader = true, canCloseByClickingOutside = false,\n container = 'body', fade = true, noBackdrop = false\n }) {\n if (modal == 'asModal' && pinToBottom) modal = \"bottom-modal\";\n document.getElementById(modal)?.remove();\n initModal({ id: modal, classes, bodyClasses, showFooter: showFooter && !pinToBottom, showHeader, submitButtonText, container, fade, noBackdrop });\n\n let $modal = document.getElementById(modal);\n let visibleModal = document.querySelector('.modal.show');\n if (visibleModal) {\n $modal.style.zIndex = (parseInt(visibleModal.style.zIndex) + 5).toString();\n }\n\n let $title = $modal.querySelector('.modal-title');\n if ($title) $title.innerHTML = title || '';\n $modal.querySelector('.modal-body').innerHTML = content || '';\n\n let submitBtn = $modal.querySelector('.modal-footer .btn-primary');\n if (onSubmit) submitBtn.addEventListener('click', onSubmit);\n if (onClosed) {\n $(`#${modal}`).on('hidden.bs.modal', onClosed);\n }\n\n let sizes = ['lg', 'xl', 'fullscreen'];\n if (sizes.includes(size)) toggleClass($modal.querySelector('.modal-dialog'), `modal-${size}`, true);\n toggleClass($modal, \"pin-to-bottom\", pinToBottom);\n\n $($modal).modal({ show: true, backdrop: canCloseByClickingOutside || pinToBottom ? true : 'static' });\n\n // Подключаем Ctrl + S к главной кнопке\n if (!dialogHotkeyInitialized) {\n dialogHotkeyInitialized = true;\n document.querySelector('body').addEventListener('keydown', function (e) {\n if (document.querySelector(`#${modal}.show`) && e.ctrlKey && e.which == 83) {\n e.preventDefault();\n document.querySelector(`#${modal} .btn-primary`).dispatchEvent(new MouseEvent(\"click\", { view: window, bubbles: true, cancelable: true }));\n }\n });\n }\n \n $(`#${modal}`).on('shown.bs.modal', e => {\n htmx?.process(e.target);\n });\n\n if (onShown) {\n $(`#${modal}`).on('shown.bs.modal', onShown);\n }\n}\n\n/**\n * \n * @param {string} modal \n */\nfunction closeDialog (modal = '#asModal') {\n $(modal).modal('hide');\n}\n\n/**\n * \n * @param {string} modal \n */\nfunction showModal (modal = '#asModal') {\n $(modal).modal('show');\n}\n\nfunction initSwipe() {\n if (!isMob()) return;\n\n let touchstartY = 0;\n\tlet touchendY = 0;\n\n function handleGesture() {\n if (touchstartY && touchendY - touchstartY >= 40) {\n closeDialog('.modal.pin-to-bottom');\n }\n\n touchstartY = 0;\n touchendY = 0;\n }\n\n $(document).on('touchstart', '.modal.pin-to-bottom .modal-handle, .modal.pin-to-bottom .modal-handle-custom, .modal.pin-to-bottom .modal-header', function(event) {\n event.preventDefault();\n event.stopPropagation();\n touchstartY = event.changedTouches[0].screenY;\n\n /** @type {HTMLElement} */\n let modal = this.closest('.modal');\n modal.classList.add('swipe-active')\n });\n \n $(document).on('touchend', '.modal.pin-to-bottom .modal-dialog', function(event) {\n event.stopPropagation();\n touchendY = event.changedTouches[0].screenY;\n handleGesture();\n\n /** @type {HTMLElement} */\n let modal = this.closest('.modal');\n modal.classList.remove('swipe-active')\n }); \n\n $(document).on('touchmove', '.modal.pin-to-bottom .modal-dialog', function(e) {\n e.stopPropagation();\n\n var xStart, yStart = 0;\n \n xStart = e.touches[0].screenX;\n yStart = e.touches[0].screenY;\n \n var xMovement = Math.abs(e.touches[0].screenX - xStart);\n var yMovement = Math.abs(e.touches[0].screenY - yStart);\n\n if ((xMovement * 3) > yMovement) {\n e.preventDefault();\n }\n });\n}\n\nfunction initDialogs() {\n initSwipe();\n\n $(document).on('hidden.bs.modal', '.modal.pin-to-bottom:not(.persist)', function(){\n $(this).remove();\n });\n\n $(document).on('hidden.bs.modal', '.modal.pin-to-bottom', function(){\n $(this).closest('.modal-container').addClass('d-none');\n });\n\n $(document).on('show.bs.modal', '.modal.pin-to-bottom', function(){\n $(this).closest('.modal-container').removeClass('d-none');\n });\n\n $(document).on('show.bs.modal', () => {\n closeAllPopoversExcept(null);\n });\n\n \n $(document).on('hidden.bs.modal', function(){\n //фикс для случая, когда быстро открывается-закрывается несколько диалогов и застревает темный фон\n if (!document.querySelector('.modal.show')) {\n document.querySelector('.modal-backdrop')?.remove();\n }\n\n if (document.querySelector('.modal.show')) {\n //если после закрытия модалки оказывается, что открылась другая модалка, то не удаляем .modal-open с body\n document.body.classList.add('modal-open');\n }\n });\n}\n\nfunction isCabinet() {\n return location.pathname.toLowerCase().startsWith('/admin') || location.pathname.toLowerCase().startsWith('/client')\n}\n\n/**\n * \n * @param {string} msg \n * @param {AlertOptions} options \n * @returns \n */\nfunction showAlert(msg, options) {\n if (!msg) return;\n\n options = Object.assign({}, { type: \"info\", append: true, fullscreen: false, pinToBottom: false }, options);\n\n if (options.prepend) {\n options.append = false;\n }\n\n let classes = {\n info: \"\",\n danger: \"tum-dark-red\",\n warning: \"tum-dark-red\",\n success: \"tum-green\"\n };\n\n let alreadyShown = !!document.querySelector(\"#asModal.show\");\n let html = `
${msg}
`;\n if (alreadyShown) {\n if (!document.querySelector(\"#asModal .tum-alerts-content\")) {\n appendHtml(\"#asModal .modal-body\", \"
\");\n }\n\n if (!options.append && !options.prepend && document.querySelector(\"#asModal .tum-alert-text\")) {\n document.querySelectorAll(\"#asModal .tum-alert-text\").forEach(e => e.remove());\n }\n\n if (options.prepend) {\n prependHtml(\"#asModal .tum-alerts-content\", html);\n }\n else {\n appendHtml(\"#asModal .tum-alerts-content\", html);\n }\n\n clearTimeout(alertTimeout);\n }\n else {\n showDialog({\n title: options.title || \"Информация\",\n content: \"
\" + html + \"
\",\n pinToBottom: options.pinToBottom,\n size: options.size\n });\n\n if (!isCabinet()) {\n let backdrop = [...document.querySelectorAll(\".modal-backdrop\")].slice(-1)[0];\n if (backdrop) backdrop.style.zIndex = '3000';\n }\n\n if (options.type == \"success\") {\n alertTimeout = setTimeout(function () {\n closeDialog();\n }, 2000);\n }\n }\n\n if ((!options.append && !options.prepend) || !alreadyShown) {\n document.querySelector(\"#asModal .modal-footer\").innerHTML = ``;\n\n document.querySelector(\"#asModal .modal-title\").innerHTML = options.title || \"Информация\";\n\n toggleClass(\"#asModal .modal-footer\", \"d-none\", false);\n toggleClass(\"#asModal [data-dismiss=modal]\", \"d-none\", false);\n\n let dialog = document.querySelector(\"#asModal .modal-dialog\");\n toggleClass(dialog, \"modal-full\", options.fullscreen);\n toggleClass(dialog, \"modal-danger\", options.type == \"danger2\");\n toggleClass(dialog, \"modal-success\", options.type == \"success2\");\n }\n\n if (options.callback) {\n options.callback();\n }\n\n if (options.closeCallback) {\n document.querySelector('#asModal .btn-default').addEventListener('click', options.closeCallback);\n }\n}\n\n/**\n * функция возвращает promise, но then будет работать только в случае, когда кнопки ок/отмена сразу закрывают модалки\n * если при клике на \"ок\" модалка может не закрыться сразу из-за какой-то валидации, то вместо then\n * надо использовать callback\n * @param {ConfirmOptions} options \n * @returns {Promise}\n */\nfunction confirmAsync(options) {\n let defaults = {\n okText: 'Ок',\n cancelText: 'Отмена',\n text: 'Продолжить?',\n autoClose: true,\n title: 'Подтверждение'\n };\n\n options = Object.assign({}, defaults, options);\n\n return new Promise(resolve => {\n showAlert(\n options.text, {\n title: options.title,\n append: false,\n callback: () => {\n toggleClass(\"#asModal [data-dismiss=modal]\", \"d-none\", true);\n let okButtonHtml = ``;\n let cancelButtonHtml = ``;\n let okButton = htmlToDocumentFragment(okButtonHtml).firstChild;\n let cancelButton = htmlToDocumentFragment(cancelButtonHtml).firstChild;\n let footer = document.querySelector(\"#asModal .modal-footer\");\n footer.append(okButton, cancelButton);\n okButton.addEventListener('click', () => options.callback ? options.callback(true, () => resolve(true)) : resolve(true));\n cancelButton.addEventListener('click', () => options.callback ? options.callback(false, () => resolve(false)) : resolve(false));\n if (options.showCallback) options.showCallback();\n }\n });\n });\n}\n\nfunction initTuModal(){\n addEventDelegate(document, 'click', '.tu-modal', element => {\n let id = element.dataset.modalId || `modal-${newUuid()}`;\n\n showDialog({\n content: document.querySelector(element.dataset.contenttarget)?.innerHTML || element.dataset.content,\n canCloseByClickingOutside: false,\n modal: id,\n title: element.dataset.title,\n showHeader: !!element.dataset.title,\n size: element.dataset.size,\n submitButtonText: null,\n pinToBottom: isMob() && element.dataset.mobModal != '',\n onClosed: () => {\n document.getElementById(id).remove();\n }\n });\n });\n}\n\nexport { showDialog, closeDialog, showModal, showAlert, confirmAsync, initDialogs, initTuModal };\n","import * as $ from \"jquery\";\nimport * as htmx from \"htmx.org\";\nimport \"bootstrap/js/dist/popover\";\nimport { addEventDelegate } from \"./dom\";\nimport { isMob } from \"./util\";\nimport { showDialog } from \"./dialog\";\n\nlet bottomModalInitialized = false;\n\nlet popoverSelectors = [\n '[data-toggle=\"popover\"]',\n '.tu-popover',\n '.poptitle',\n '.tum-unauthorized-hint',\n '.map-link-tum-popover'\n]\n\n/**\n * \n * @param {HTMLElement} element \n */\nfunction closeAllPopoversExcept(element) {\n let popovers = [...document.querySelectorAll(popoverSelectors.join(', '))].filter(e => e != element);\n for (let popover of popovers) {\n $(popover).popover('hide');\n }\n}\n\nfunction initPopovers(){\n addEventDelegate(document, 'click', '[data-dismiss=popover]', element => {\n $('.modal.show.opened-as-popover').modal('hide');\n\n var $popover = $(element).closest('.popover');\n if (!$popover.length) return;\n var $elem = $($popover.data('bs.popover').element);\n $elem.popover('hide');\n });\n\n $(document).on('shown.bs.popover', function(e){\n let closeBtn = '';\n let $elem = $(e.target);\n let $popover = $($elem.data('bs.popover').tip);\n let $header = $popover.find('.popover-header');\n let $body = $popover.find('.popover-body');\n \n htmx?.process($popover[0]);\n \n if ($elem.hasClass('popover-noArrow')) {\n $popover.addClass('noarrow');\n }\n\n if ($elem.hasClass('popover-addCloseBtn')) {\n let $closeBtnContainer = $header.html() ? $header : $body;\n\n if ($('.tu-popover-close', $closeBtnContainer).length) return;\n $closeBtnContainer.prepend(closeBtn);\n }\n });\n\n initTuPopover();\n $('[data-toggle=\"popover\"]').popover({\n sanitize: false\n });\n\n $(document).on('show.bs.popover', e => {\n if (e.currentTarget?.activeElement) {\n closeAllPopoversExcept(e.currentTarget.activeElement);\n }\n else if (e.target) {\n closeAllPopoversExcept(e.target);\n }\n\n if (document.querySelector('.dropdown.show')) {\n $('.dropdown.show').dropdown('hide');\n }\n\n let exceptions = ['.tum-readmore-toggle'];\n if (isMob()) {\n exceptions = exceptions.concat(['.tu-popover', '.tum-unauthorized-hint', '.map-link-tum-popover']);\n } \n let except = exceptions.join(', ');\n\n if (e.currentTarget?.activeElement?.matches(except) || e.target?.matches(except)) {\n return false;\n }\n });\n\n $(document).on('show.bs.dropdown', () => {\n closeAllPopoversExcept(null);\n });\n}\n\n/**\n * \n * @param {HTMLElement | Document | DocumentFragment} [container]\n * @returns \n */\nfunction _initTuPopover(container = null) {\n if (!container) container = document;\n for (let element of container.querySelectorAll('.poptitle:not([data-original-title])')) {\n $(element).popover({\n html: true,\n trigger: element.classList.contains('hover') ? 'hover' : 'click',\n placement: 'top',\n content: element.title,\n sanitize: false,\n template: '
'\n });\n }\n\n if (isMob()) {\n if (!bottomModalInitialized) {\n bottomModalInitialized = true;\n\n addEventDelegate(document, 'click', \".tum-unauthorized-hint, .map-link-tum-popover, .tu-popover\", element => {\n let contentTarget = element.dataset.contenttarget;\n let content = contentTarget ? document.querySelector(contentTarget).innerHTML : element.dataset.content;\n let title = element.title || element.dataset.originalTitle;\n let container = element.dataset.container;\n \n showDialog({\n content: `
${content}
`,\n title,\n pinToBottom: true,\n classes: \"opened-as-popover\",\n container,\n modal: element.dataset.modalId\n });\n });\n }\n\n return;\n }\n\n for (let element of container.querySelectorAll(\".tum-unauthorized-hint, .map-link-tum-popover, .tu-popover\")) {\n if ($(element).data('bs.popover')) continue;\n let trigger = element.dataset.trigger;\n\n let popover = $(element).popover({\n content: function(){\n let target = this.dataset.contenttarget;\n if (target) {\n let html = document.querySelector(target).innerHTML;\n return html;\n }\n\n return this.dataset.content;\n },\n html: true,\n sanitize: false\n });\n\n if (trigger && trigger != 'hover') continue;\n\n popover.on('mouseenter', function () {\n var _this = this;\n $(this).popover('show');\n $('.popover').on('mouseleave', function () {\n $(_this).popover('hide');\n });\n }).on('mouseleave', function () {\n var _this = this;\n setTimeout(function () {\n if (!$('.popover:hover').length) {\n $(_this).popover('hide');\n }\n }, 150);\n });\n }\n}\n\n/**\n * \n * @param {HTMLElement | Document | DocumentFragment | JQuery} [container]\n * @returns \n */\nfunction initTuPopover(container = null){\n if (!container) {\n _initTuPopover();\n return;\n }\n\n if (container instanceof HTMLElement || container instanceof Document || container instanceof DocumentFragment) {\n _initTuPopover(container);\n return;\n }\n\n if (typeof(container) == 'string') {\n container = $(container);\n }\n\n for (let element of container.toArray().filter(e => e instanceof HTMLElement)){\n _initTuPopover(element);\n }\n}\n\n/**\n * \n * @param {HTMLElement} button \n * @param {() => void} callback \n */\nfunction onPopoverShown(button, callback){\n $(button).on('shown.bs.popover', callback);\n}\n\n/**\n * \n * @param {HTMLElement} button \n * @returns {HTMLElement}\n */\nfunction getPopoverElement(button) {\n return $(button).data('bs.popover').tip;\n}\n\nfunction initTooltips(container){\n let except = ['.poptitle', '.notooltip', 'iframe', '.tu-popover', '[data-toggle=popover]'];\n if (isMob()) except.push('.tum-disableMobTitle');\n $('[title]', container || document).not(except.join(', ')).tooltip({\n placement: 'auto',\n boundary: 'window',\n html: true,\n trigger: 'hover'\n });\n\n addEventDelegate(document, 'mouseover', '[title]:not([data-original-title])', function(element){\n $(element).not(except.join(', ')).tooltip({\n placement: 'auto',\n boundary: 'window',\n html: true,\n trigger: 'hover'\n });\n\n $(element).trigger('mouseover');\n });\n\n addEventDelegate(document, 'click', '[title]', function(element){\n $(element).tooltip('hide');\n });\n}\n\nexport { initPopovers, initTuPopover, onPopoverShown, getPopoverElement, closeAllPopoversExcept, initTooltips };\n","/*\n * Date Format 1.2.3\n * (c) 2007-2009 Steven Levithan \n * MIT license\n *\n * Includes enhancements by Scott Trenda \n * and Kris Kowal \n *\n * Accepts a date, a mask, or a date and a mask.\n * Returns a formatted version of the given date.\n * The date defaults to the current date/time.\n * The mask defaults to dateFormat.masks.default.\n */\n\n/* forked from https://stevenlevithan.com/assets/misc/date.format.js */\n\nvar dateFormat = function () {\n\tvar\ttoken = /d{1,4}|m{1,4}|yy(?:yy)?|([HhMsTt])\\1?|[LloSZ]|\"[^\"]*\"|'[^']*'/g,\n\t\ttimezone = /\\b(?:[PMCEA][SDP]T|(?:Pacific|Mountain|Central|Eastern|Atlantic) (?:Standard|Daylight|Prevailing) Time|(?:GMT|UTC)(?:[-+]\\d{4})?)\\b/g,\n\t\ttimezoneClip = /[^-+\\dA-Z]/g,\n\t\tpad = function (val, len) {\n\t\t\tval = String(val);\n\t\t\tlen = len || 2;\n\t\t\twhile (val.length < len) val = \"0\" + val;\n\t\t\treturn val;\n\t\t};\n\n\t// Regexes and supporting functions are cached through closure\n\treturn function (date, mask, utc) {\n\t\t// You can't provide utc if you skip other args (use the \"UTC:\" mask prefix)\n\t\tif (arguments.length == 1 && Object.prototype.toString.call(date) == \"[object String]\" && !/\\d/.test(date)) {\n\t\t\tmask = date;\n\t\t\tdate = undefined;\n\t\t}\n\n\t\t// Passing date through Date applies Date.parse, if necessary\n\t\tdate = date ? new Date(date) : new Date;\n\t\tif (isNaN(date)) throw SyntaxError(\"invalid date\");\n\n\t\tmask = String(mask);\n\n\t\t// Allow setting the utc argument via the mask\n\t\tif (mask.slice(0, 4) == \"UTC:\") {\n\t\t\tmask = mask.slice(4);\n\t\t\tutc = true;\n\t\t}\n\n\t\tvar\t_ = utc ? \"getUTC\" : \"get\",\n\t\t\td = date[_ + \"Date\"](),\n\t\t\tm = date[_ + \"Minutes\"](),\n\t\t\ty = date[_ + \"FullYear\"](),\n\t\t\tH = date[_ + \"Hours\"](),\n\t\t\tM = date[_ + \"Month\"](),\n\t\t\ts = date[_ + \"Seconds\"](),\n\t\t\tL = date[_ + \"Milliseconds\"](),\n\t\t\to = utc ? 0 : date.getTimezoneOffset(),\n\t\t\tflags = {\n\t\t\t\td: d,\n\t\t\t\tdd: pad(d),\n\t\t\t\tm: m,\n\t\t\t\tmm: pad(m),\n\t\t\t\tyy: String(y).slice(2),\n\t\t\t\tyyyy: y,\n\t\t\t\th: H % 12 || 12,\n\t\t\t\thh: pad(H % 12 || 12),\n\t\t\t\tH: H,\n\t\t\t\tHH: pad(H),\n\t\t\t\tM: M + 1,\n\t\t\t\tMM: pad(M + 1),\n\t\t\t\ts: s,\n\t\t\t\tss: pad(s),\n\t\t\t\tl: pad(L, 3),\n\t\t\t\tL: pad(L > 99 ? Math.round(L / 10) : L),\n\t\t\t\tt: H < 12 ? \"a\" : \"p\",\n\t\t\t\ttt: H < 12 ? \"am\" : \"pm\",\n\t\t\t\tT: H < 12 ? \"A\" : \"P\",\n\t\t\t\tTT: H < 12 ? \"AM\" : \"PM\",\n\t\t\t\tZ: utc ? \"UTC\" : (String(date).match(timezone) || [\"\"]).pop().replace(timezoneClip, \"\"),\n\t\t\t\to: (o > 0 ? \"-\" : \"+\") + pad(Math.floor(Math.abs(o) / 60) * 100 + Math.abs(o) % 60, 4),\n\t\t\t\tS: [\"th\", \"st\", \"nd\", \"rd\"][d % 10 > 3 ? 0 : (d % 100 - d % 10 != 10) * d % 10]\n\t\t\t};\n\n\t\treturn mask.replace(token, function ($0) {\n\t\t\treturn $0 in flags ? flags[$0] : $0.slice(1, $0.length - 1);\n\t\t});\n\t};\n}();\n\nexport default dateFormat;"],"names":["dialogHotkeyInitialized","alertTimeout","showDialog","title","content","submitButtonText","size","onSubmit","onShown","onClosed","modal","pinToBottom","classes","bodyClasses","showFooter","showHeader","canCloseByClickingOutside","container","fade","noBackdrop","document","getElementById","remove","id","initModal","$modal","visibleModal","querySelector","style","zIndex","parseInt","toString","$title","innerHTML","submitBtn","addEventListener","on","includes","show","backdrop","e","ctrlKey","which","preventDefault","dispatchEvent","MouseEvent","view","window","bubbles","cancelable","process","target","closeDialog","showModal","initSwipe","touchstartY","touchendY","event","stopPropagation","changedTouches","screenY","this","closest","classList","add","xStart","yStart","touches","screenX","Math","abs","initDialogs","addClass","removeClass","body","showAlert","msg","options","Object","assign","type","append","fullscreen","prepend","alreadyShown","html","info","danger","warning","success","querySelectorAll","forEach","clearTimeout","location","pathname","toLowerCase","startsWith","slice","setTimeout","dialog","callback","closeCallback","confirmAsync","okText","cancelText","text","autoClose","Promise","resolve","okButtonHtml","cancelButtonHtml","okButton","firstChild","cancelButton","showCallback","initTuModal","element","dataset","modalId","contenttarget","mobModal","bottomModalInitialized","popoverSelectors","closeAllPopoversExcept","popovers","join","filter","popover","initPopovers","$popover","length","data","$elem","tip","$header","find","$body","hasClass","$closeBtnContainer","initTuPopover","sanitize","currentTarget","activeElement","dropdown","exceptions","concat","except","matches","_initTuPopover","trigger","contains","placement","template","contentTarget","originalTitle","_this","HTMLElement","Document","DocumentFragment","toArray","onPopoverShown","button","getPopoverElement","initTooltips","push","not","tooltip","boundary","token","timezone","timezoneClip","pad","val","len","String","date","mask","utc","arguments","prototype","call","test","undefined","Date","isNaN","SyntaxError","_","d","m","y","H","M","s","L","o","getTimezoneOffset","flags","dd","mm","yy","yyyy","h","hh","HH","MM","ss","l","round","t","tt","T","TT","Z","match","pop","replace","floor","S","$0"],"sourceRoot":""}